关于开发:谷歌云-最大限度地提高可靠性降低成本调整-Kubernetes-工作负载的大小

您晓得通过调整工作负载申请以更好地代表其理论应用状况能够节俭多少钱吗?如果您没有调整工作负载规模,则可能会为工作负载基本没有应用的资源领取过高的费用,甚至更糟,从而使工作负载面临因配置有余而导致可靠性问题的危险。 为了进步 Kubernetes 工作负载的可靠性,设置资源是最重要的事件。在本博客中,咱们将帮忙您理解Kubernetes 老本优化现状报告的重要发现! 依据咱们的钻研后果,工作负载调整是最重要的黄金信号。工作负载调整掂量的是开发人员正确应用为其应用程序申请的 CPU 和内存的能力。 规模调整具备挑战性 预测应用程序的资源需要可能十分艰难,而传统数据中心环境中的开发人员从来并不关怀这一点。在传统的数据中心环境中,通常会事后适度配置资源,以确保满足峰值需要和将来增长的需要,因而开发人员无需专一于精确预测资源需要,因为它们已被过剩容量所笼罩,而在云环境中,资源按需耗费。在效率和可靠性之间找到均衡通常感觉像是一种奥妙的均衡行为。 用于调整工作负载规模的工具 Cloud Monitoring 和 GKE UI 中提供了原生工具,您能够应用它们来调整 GKE 上运行的工作负载规模。 在控制台中调整大小 “工作负载老本优化”选项卡可通过显示已应用的资源与申请的资源来帮忙您辨认可优化的工作负载。 为了充分利用潜在的老本节俭,您能够深刻理解集群以查看工作负载级别的资源倡议。 仅查看部署对象的工作负载资源倡议: 在GKE 老本优化中抉择一个集群单击工作负载 > 老本优化抉择一个部署工作负载在工作负载的详细信息页面中,抉择操作 > 扩大 > 编辑资源申请通过云监控调整规模 Cloud Monitoring 提供内置的 VPA 规模倡议指标,您能够应用这些指标来监控工作负载的性能并确定调整工作负载规模的机会,而无需创立 VPA 对象。 要查看这些指标: 进入云监控 > 指标摸索控制台。在指标下拉列表中,抉择指标:内存倡议: Kubernetes Scale > autoscaler > Recommended per replica request bytesCPU举荐: Kubernetes Scale > autoscaler > Recommended per replica request cores大规模调整规模 如果您有趣味查看跨集群和我的项目的倡议,咱们创立了一份指南,您当初就能够应用它来帮忙您大规模调整 GKE 工作负载规模。 ...

August 18, 2023 · 1 min · jiezi

关于开发:SOFAStack-的一下五年

文|宋顺(GitHub ID:nobodyiam)SOFAStack 社区开源负责人蚂蚁团体高级技术专家 本文 3861 字 浏览 11 分钟  01回顾开源这五年回想起 2018 年 4 月 19 日 SOFAStack 首次开源,过后的官宣文章中就提到了咱们开源的初心: 冀望通过逐渐向社区开源 SOFA 中各个组件,从而一方面帮忙更多机构和合作伙伴实现金融分布式转型,帮忙大家更加疾速构建稳固的金融级云原生的架构,另一方面也是冀望 SOFA 在蚂蚁体系之外的更大场景上来利用,来进一步锻造改良这套体系,使其更加欠缺和巩固。 所以这几年咱们也是围绕着这个初心把 SOFAStack 体系的各个产品逐步开源,包含首批开源的 SOFABoot、SOFARPC、SOFAArk,以及起初的 SOFARegistry、SOFAJRaft、Seata 等。同时咱们也孵化了 MOSN 社区,开源了云原生网络代理 MOSN 以及利用运行时 Layotto。这些产品也是代表着 SOFAStack 在金融级云原生畛域的积淀和积攒,目前曾经在上百家企业中生根发芽。 图 1 - 产品开源工夫线 咱们再来看几个数字,在这 5 年中,咱们举办了 18 场 Meetup,发展了 32 场直播分享,目前在 GitHub 组织层面有 438 名贡献者以及 3W 的 Star。 图 2 - 开源 5 年的几个数字 除了在我的项目上播种了不少贡献者和 Star 外,咱们也逐步地对开源有了更为粗浅的意识。 以开源指标为例,咱们的初心是为了帮忙更多机构和合作伙伴实现金融分布式转型,咱们一开始最为关注的指标是用户数;但因开源的特殊性,咱们无奈间接获取理论的用户数,所以采纳了 GitHub 的 Star 作为掂量指标。 ...

June 25, 2023 · 2 min · jiezi

关于开发:可观测性最佳实践怎样让运维和开发协同保障系统稳定性

保障系统稳固运行,这是所有数字平台的根本要求,但谁是第一责任人?假如 10 年前提出此问,绝大部分答案会说是运维。但在明天,随着微服务和云原生的进一步遍及,很多状况是运维负责的 IaaS 和 PaaS 一切正常,但开发提供的程序漏洞百出,极不稳固,常常解体,这时谁该是第一责任人?可开发其实也有话说,既要放弃利用高频迭代,又要保障稳固不出错,这是两个反方向的工作,不可能同时实现。那就把这个问题再进一步,是保障系统稳定性重要,还是放弃高频迭代疾速上线重要?可能在不同的业务场景下,答案都不一样,但业务既要又要怎么办?在这个看似不可能实现的工作背后,运维和开发是否有可能严密协同,共担责任,找到零碎稳固和高频迭代的平衡点? 其实这齐全能够做到,首先要实现零碎全链路数据的可观测性。 可观测性对于生产环境的价值可观测性是指在零碎中收集和剖析数据以理解零碎的行为和状态的能力。可观测性并不是一个新生物,而是一种观点的翻新。绝对于传统的监控而言,可观测性是站在零碎的角度去摸索零碎应该如何失当地展示本人的状态,而监控则是站在局外人的角度去扫视零碎的运行状况。在生产环境中,可观测性能够帮忙运维人员理解零碎的运行状况,及时发现问题并进行解决。同时,可观测性也能够帮忙研发人员理解零碎的瓶颈和性能问题,进而进步零碎的可靠性和性能。因而,引入可观测性是实现生产环境运维和研发协同的一个重要步骤。 可观测性实现研发运维协同的实际构建业务的全面可观测性平台对于服务于生产环境的可观测性平台,必须具备残缺的业务可观测性能力。从理论的业务零碎登程,可能笼罩多种多样的客户端,例如 Web、小程序、Android、iOS 等。服务端反对多种语言,并尽量减少接入的门槛,对业务的影响降到最低。其次,对于中间件、零碎以及各种云服务的反对,都要做到全面笼罩。只有这样的可观测性平台能力具备生产环境下运维和研发协同应用的前提。 通过观测云实现的可观测性平台,具备残缺全面的可观测能力。无论业务采纳任何客户端、服务端、中间件或多种多样的云服务,或者是多云能力,观测云都具备十分好的扩大接入能力。理论革新接入对业务自身造成的影响也十分小。构建对立日志剖析平台在生产环境中,运维和开发人员都要依赖大量的日志来跟踪剖析零碎运行的状况,但实际上利用产生的日志,包含业务自身的日志、业务依赖中间件的日志、系统日志、平安日志等等,这些日志基本上都是散落在不同的日志平台上,当生产环境零碎呈现故障的时候,研发和运维须要在这些不同的日志零碎中提取有用的信息,这对于疾速排查故障,造成了十分大的麻烦。如果能把这些日志集中管理,并提供集中检索性能和关联剖析,不仅能够提供高诊断效率,同时对系统状况能有全面的理解,能够防止预先救火的被动。观测云提供全面的日志采集能力,通过配置日志采集,把日志数据对立上报到观测云,就能够对所采集的日志数据进行对立存储、查问、告警、剖析、导出等操作。对于开发和运维人员,从一个日志平台检索所有日志内容,不论是开发还是运维都可能疾速把握各个系统运行的状况。 构建分布式追踪能力分布式跟踪能力是一种用于跟踪分布式系统申请的办法。当零碎外部的服务和组件数量减少时,分布式跟踪能力变得越来越重要。通过一个 trace_id 串联前后端所有服务,分布式追踪能力可能疾速理解申请在零碎中的流向和工夫。此外,如果零碎的申请日志也可能包含申请 trace_id,您就可能具备残缺的分布式追踪能力。这样,运维人员能够疾速把握零碎间的依赖关系,开发人员也可能疾速识别系统瓶颈及性能问题。除了跟踪申请,分布式追踪能力还能够帮忙理解零碎中的谬误和异样。应用分布式追踪工具来监督申请的响应工夫、成功率、错误率等指标,以及零碎中的资源应用状况。这些指标能够帮忙运维和开发辨认潜在的性能问题,并提供优化零碎的线索。利用观测云,可实现残缺的从前端到后端,再到基础设施端的全链路可追踪能力,通过一个 trace_id 实现用户会话拜访、页面拜访、后端接口、后端申请日志,以及对应主机或容器监控的串联追踪能力。运维和研发利用全链路的可追踪能力,疾速识别系统问题并解决,最大水平进步零碎的稳定性。 构建异样跟踪能力在生产环境中,不论是运维还是研发,都须要实时跟踪零碎产生的异样。运维人员要及时发现零碎异样并进行解决,他们能够利用可观测性平台来实时跟踪零碎的健康状况,一旦出现异常,他们就须要立刻采取措施来解决问题。而研发人员也须要实时跟踪零碎异样,他们能够利用异样数据来进行问题剖析和性能优化。通过对异样数据的剖析,他们能够理解零碎的运行状况,找到问题的本源并进行优化,从而进步零碎的性能和可靠性。观测云具备零碎运行中的谬误追踪能力,并具备异样产生的残缺上下文,异样时的系统日志、主机状态、依赖服务的状态,十分不便运维和开发人员定位并解决异样问题。其次,通过谬误聚类能够理解零碎中有哪几类的异样,通过聚类能够疾速通晓零碎异样品种,把精力投入到最重要的问题上。 构建扁平化的基础设施监控平台在传统模式下,基础设施平台的问题都是由运维来保障。当零碎呈现故障时,运维人员会去排查基础设施相干的监控数据,排除基础设施问题后再把相干问题透传给研发人员。在生产环境下的故障定位解决时效要求十分高,而研发和运维对于基础设施监控数据的都有依赖,因而须要一种更加高效的形式来解决这个问题。利用可观测平台构建扁平化的基础设施监控平台,从零碎自身登程,将依赖的基础设施,如主机、容器、数据库等全副集中起来,不论是研发还是运维人员,都能第一工夫知悉基础设施的健康状况,从而对故障的真实情况疾速做出判断。通过观测云构建的基础设施监控平台,不光能收集这些基础设施平台的指标、日志等监控数据,而且具备将基础设施同零碎关联的能力,这种能力在简单的生产环境下十分有价值,研发人员能够从零碎利用登程查看依赖的基础设施监控数据,运维人员能够从基础设施登程,查看基础设施运行的零碎利用的监控数据。 总结在生产环境中引入可观测性对于确保零碎的稳定性、可靠性和性能至关重要。通过构建业务的全面可观测性平台、对立的日志剖析平台、分布式追踪能力、异样跟踪能力、扁平化的基础设施监控平台等办法,运维和研发团队能够更无效地协同工作,辨认和解决问题。应用这些办法,团队能够确保其零碎安稳运行,用户取得良好体验。 观测云更多资讯请关注观测云官网(guance.com),扫码小助手获取~

June 16, 2023 · 1 min · jiezi

关于开发:恭喜龙蜥社区开发者沙龙圆满落幕-年度优秀贡献者名单正式公布

3 月 17 日,龙蜥社区在北京胜利举办开发者沙龙,会上正式颁布「2022 龙蜥社区优良贡献者」榜单。 来自中科方德、龙芯中科、统信软件、浪潮信息、Intel、工业和信息化电子五所、中南大学、北京大学等企业、高校及研究所,超四十位开发者参加了此次沙龙,围绕“如何参加社区做奉献”、“社区如何给予足够激励”等话题开展热烈探讨。 (图/沙龙开发者现场合照) (图/沙龙开发者们现场探讨合照) 此前,由龙蜥社区特约参谋、学术代表、经营委员会、技术委员会等 12 位成员组成的评委团,通过了近一个月的迷信且谨严的评审,「2022 龙蜥社区优良贡献者」获奖者榜单正式颁布。现场,龙蜥社区理事长马涛、副理事长朱建忠,龙蜥社区技术委员会主席杨勇、副主席孟杰,龙蜥社区经营委员会主席陈绪博士等为获奖者进行颁奖,以下为颁奖环节现场快照: (图/“卓越贡献奖”获得者合照) (图/“代码之星”获得者合照) (图/“布道之星”获得者合照) (图/“最佳研发团队”获得者合照) (图/“最佳 SIG”获得者合照) (图/“最佳开源我的项目”获得者合照) (图/“产学研单干促成奖”获得者合照) 获奖名单详见下方海报: —— 完 ——

March 21, 2023 · 1 min · jiezi

关于开发:Terraform-新手村指南萌新必读

基础设施即代码(IaC)是指应用代码和软件开发技术来配置和治理基础设施的实际。IaC 背地的逻辑是尽量打消手动配置基础设施和资源的需要,比方服务器、负载平衡以及数据库等。因为基础设施是整个软件开发流程的一个组成部分,并且与利用交付更严密地分割在一起,因而让基础设施的更改更容易交付非常重要。  应用代码来定义和治理基础设施及其配置,能够让开发者采纳版本控制、测试和自动化部署等技术,这有助于防止各种利用问题产生,比方性能瓶颈、性能故障等。  Terraform 是一个被宽泛应用的开源 IaC 工具,用户能够以申明式的形式来治理基础设施。借助 Terraform, 用户能够应用简略的配置语言治理多个不同云厂商的云资源,比方 AWS、Azure、GCP等。  本文将会介绍 Terraform 的根底,包含架构、工作原理、工作流程及最佳实际等方面的内容。  Terraform 架构Terraform 是一款基于插件的工具,因而其有一个外围利用 Terraform,和上百个插件。外围利用提供了一个对立的层来治理 IaC 代码,并且它还会负责装置所需的插件,调用它们、治理状态等。另一方面,插件能够与基础设施平台和利用通信,如AWS、GCP、Grafana、Jenkins、GitLab等。其中一些插件由 Hashicorp 团队保护,另外的那些则是由第三方保护。每个人都能够编写并公布本人的插件,拜访下方网站能够获取插件库:https://registry.terraform.io/   Terraform 插件由两大次要类型:Provider 和 Provisioner。Provider 是通过 API 负责与理论基础设施或利用进行连贯,并创立、批改和删除对象和资源。Provisioner 是负责连贯曾经配置好的基础设施并对其进行更改。例如,你能够应用 AWS Provider 来配置一个 EC2 实例,并在配置实现后近程执行 Provisioner 来在实例上执行某些命令行。(须要留神的是,Provisioner 通常不是最佳实际)  Terraform 外围概念本节介绍一些 Terraform 中应用的外围概念/术语:  Variables:也被称为 input-variables(输出变量),它是 Terraform 模块应用的键值对,能够自定义。Provider:一种插件类型,与 API 服务进行交互并拜访相干资源。Module:它是一个蕴含 Terraform 模板的文件夹,所有的配置都能够在这里定义。State:它由 Terraform 治理的基础设施和相干配置的缓存信息组成。Resources:它指一个或多个基础设施对象(计算实例、虚构网络等)的块(block),这些对象用于配置和治理基础设施。Data Source:它是由 provider 实现的,以返回内部对象的信息到 Terraform。Output Values:这是 Terraform 模块的返回值,能够被其余配置应用。Plan:这是指其中一个阶段,在这一阶段中会决定须要创立、更新或销毁什么,以便从基础设施的 real/current 状态转移到冀望状态。Apply:这一阶段会利用基础设施的更改 real/current 状态,以推动到冀望状态。 Terraform 生命周期Terraform 的生命周期由init、plan、apply和 destroy,4个阶段形成。  Terraform init 初始化工作目录,其中包含所有的配置文件。Terraform plan 被用来创立执行打算以达到基础设施的冀望状态。为了达到预期状态,会对配置文件进行更改。Terraform apply 会对在 plan 阶段中定义的基础设施进行更改,从而使基础设施达到冀望状态。Terraform destroy 这一阶段用于删除所有的旧基础设施资源,这些资源在apply 阶段后被标记为污损(taint)。 Terraform 的工作原理Terraform 能够让用户通过配置文件定义和治理整个基础设施和版本控制。这次要由 Terraform 架构中的两个次要组件来实现这一指标:Core 和 Provider。  ...

March 8, 2023 · 1 min · jiezi

关于开发:以太坊开发框架Truffle基础使用介绍

Truffle Truffle简介 truffle unbox webpack一条命令因为要下载泛滥须要的模块,大略耗时10分钟左右,所以咱们先来理解一下Truffle。 Truffle是目前最风行的以太坊DApp开发框架,(依照官网说法)是一个世界级的开发环境和测试框架,也是所有应用了EVM的区块链的资产治理通道,它基于JavaScript,致力于让以太坊上的开发变得简略。 Truffle有以下性能: 内置的智能合约编译,链接,部署和二进制文件的治理。合约自动测试,不便疾速开发。脚本化的、可扩大的部署与公布框架。可部署到任意数量公网或私网的网络环境治理性能应用EthPM和NPM提供的包治理,应用ERC190规范。与合约间接通信的间接交互控制台(写完合约就能够命令行里验证了)。可配的构建流程,反对严密集成。在Truffle环境里反对执行内部的脚本。Truffle的客户端 咱们之后写的智能合约必须要部署到链上进行测试,所以truffle构建的DApp也必须抉择一条链来进行部署。咱们能够抉择部署到一些公共的测试链比方Rinkeby或者Ropsten上,毛病是部署和测试工夫比拟长,而且须要破费肯定的工夫赚取假代币避免out of gas。当然,对于DApp公布的正规流程,staging(模仿环境)还是应该用测试公链的。 还有一种形式就是部署到私链上,这在开发阶段是通常的抉择。Truffle官网举荐应用以下两种客户端: Ganachetruffle develop而truffle develop是truffle内置的客户端,跟命令行版本的Ganache根本相似。在truffle目录下bash输出: truffle develop即可开启客户端,和ganache一样,它也会给咱们主动生成10个账户。惟一要留神的是在truffle develop里执行truffle命令的时候须要省略后面的“truffle”,比方“truffle compile”只须要敲“compile”就能够了 装置Truffle 启动geth,而后咱们来装置truffle。truffle是一个dapp的开发框架,它能够使得dapp的构建和治理非常容易。 你能够像这样应用npm装置truffle:>npm install -g truffle而后咱们创立一个空目录,在上面创立truffle我的项目: mkdir simple_voting_by_truffle_dappcd simple_voting_by_truffle_dappnpm install -g webpacktruffle unbox webpacktruffle init: 在当前目录初始化一个新的truffle空我的项目(我的项目文件只有truffle-config.js 和truffle.js;contracts目录中只有Migrations.sol;migrations目录中只有1_initial_migration.js)。 truffle unbox: 间接下载一个truffle box,即一个事后构建好的truffle我的项目;unbox的过程绝对会长一点,实现之后应该看到这样的提醒: 这里的webpack就是一个基于webpack构建流程的官网我的项目框架(truffle box),更多truffle box参见: https://truffleframework.com/boxes 创立我的项目 初始化一个truffle我的项目时,它会创立运行一个残缺dapp所有必要的文件和目录。咱们间接下载webpack这个truffle box,它外面的目录也是相似的: lsREADME.md contracts node_modules test webpack.config.js truffle.js app migrations package.jsonls app/index.html javascripts stylesheetsls contracts/ConvertLib.sol MetaCoin.sol Migrations.solls migrations/1_initial_migration.js 2_deploy_contracts.jsapp/ - 你的利用文件运行的默认目录。这外面包含举荐的javascript文件和css款式文件目录,但你能够齐全决定如何应用这些目录。contract/ - Truffle默认的合约文件寄存目录。migrations/ - 部署脚本文件的寄存目录。test/ - 用来测试利用和合约的测试文件目录。truffle.js - Truffle的配置文件。truffle也会创立一个你能够疾速上手的示例利用,你能够释怀地删除我的项目上面contracts目录的ConvertLib.sol和MetaCoin.sol文件。 ...

December 23, 2022 · 3 min · jiezi

关于开发:一种可灰度的接口迁移方案

在疾速迭代的互联网背景下,零碎为了实现疾速上线,经常会抉择最快的开发模式,例如咱们常见的mvp版本迭代。大部分的业务零碎对于将来业务的倒退是不确定的,因而随着工夫的推移,往往会遇到各种各样的瓶颈,例如零碎性能、无奈适配业务逻辑等问题,这时可能就波及到零碎架构的降级。系统升级往往蕴含最根底的两个局部:接口迁徙重构和数据迁徙重构,在零碎架构降级的过程中,最重要的是须要保证系统稳定性,即用户不感知。因而文本的目标是提供一种可灰度、回滚的设计思路,实现稳固的架构降级。场景在咱们零碎迭代过程中,往往波及到重构、数据源切换、接口迁徙等场景,为了保障系统安稳上线,因而在接口迁徙过程中应该保障可回滚、可灰度。接口迁徙可能也波及到数据迁徙,两者的先后顺序应该不影响到零碎的稳定性。总结一下,接口迁徙的指标: 可灰度,即应用新老接口是可能管制的。可回滚,如应用新接口异样,可能疾速回滚到老接口。不入侵业务逻辑,不改变原来的业务逻辑代码,等迁徙结束后再整体下线,避免间接侵入批改造成不可逆的影响。老接口在零碎安稳运行后收口,即对老的数据源拜访、老的接口可能安稳下线迁徙计划本文次要为接口迁徙和数据迁徙提供了一种思路,在第3节里会有实际的外围代码实现。(代码只是提供思路,并不是可能间接运行的代码) 总体迁徙计划下图示意了接口迁徙的思路,参考了cglib的jdk的代理形式。假如你有一个待迁徙接口类(指标类),那么你须要从新写一个代理类作为迁徙后的接口。指标类和代理类的抉择通过开关去管制,开关波及到两个层面: 总开关:用于管制是否全量切换新接口,当接口迁徙稳固上线 且 数据迁徙结束(如有)灰度开关:能够设置一个灰度开关列表,用于管制你的那些接口/数据须要走代理接口针对不同的接口逻辑,代理接口实现逻辑会有差别,具体场景如下文所述。 单条数据查问针对单条数据,能够通过数据源来判断起源。基于可灰度和回滚的准则,指标类和代理类的路由规定如下: 优先判断总开关,如果总管制开关已关上,则阐明迁徙已实现并且验证校验结束,此时走代理接口,这样能够实现接口、数据的收口,达到咱们的迁徙指标。如果数据不存在于老数据表中,那么无论这条数据有没有存在于新表中,咱们都能够间接走代理接口,收拢新数据的接口逻辑。如果数据存在于老数据表中,然而不在灰度名单内,此时应用指标类(回滚时可这么操作),走原来的接口办法,即老逻辑,这是不会影响到零碎性能。如果数据存在于老数据表中,然而在灰度名单内,阐明这条数据曾经迁徙实现待验证,此时能够应用代理类(灰度时可这么操作)走新的接口逻辑。多条数据查问不同于单条数据的查问,咱们须要查问中新表、老表中所有符合条件的数据,多条数据查问波及到数据反复的问题(即数据会同时存在于老表和新表中),因而须要对数据进行去重,而后再合并返回后果。 数据更新因为在数据迁徙后到零碎灰度的过程中存在两头工夫,所以在数据更新时咱们应该通过双写来放弃新、老表数据的一致性。同时为了对接口和数据进行收口,咱们也要先判断总控开关是否开启,如果总开关曾经关上,则数据更新只须要更新新表即可。 数据插入对数据和接口收口,咱们须要对增量数据进行切换,因而间接应用代理类并将数据插入到新表中,管制老表的数据增量,在数据迁徙的时候只须要思考存量数据即可。 实际例如在批发场景中,每个门店都有惟一的身份标识门店id,那么咱们的灰度列表就能够寄存门店id列表,按门店维度进行灰度,来粒度化影响范畴。 代理散发逻辑散发逻辑是外围逻辑,数据的去重规定、接口/仓储层代理转发都是基于这套逻辑来管制: 先判断总开关,总开关开启阐明迁徙实现,此时全副通过代理类走新的接口逻辑和数据源。判断灰度开关,如果在灰度过程中蕴含了灰度的门店,那么就通过代理类走新的接口;否则走原接口的老逻辑,实现接口的切换。新数据转发到代理类,对新的逻辑和数据进行收口,避免增量数据的产生。批量查问接口须要转发到代理类,因为波及到对新、老数据进行去重、合并的过程。 /** * 是否开启代理 * * @param ctx 上下文 * @return 是:开启代理,否:不开启代理 */ public Boolean enableProxy(ProxyEnableContext ctx) { if (ctx == null) { return false; } // 判断总开关 if (总开关关上) { // 阐明数据迁徙实现,接口全副切换 return true; } if (单个门店操作) { if (存在老数据源) { // 判断是否在灰度名单,是则返回true;否则返回false; } else { // 新数据 return true; } } else { // 批量查问,须要走代理合并新、老数据源 return true; } }接口代理接口代理次要通过切面来拦挡,通过注解办法的形式来实现。代理注解如下 ...

August 17, 2022 · 3 min · jiezi

关于开发:九联科技开发板正式合入OpenHarmony主干

近日,九联科技Unionpi系列Unionpi Tiger(A311D)开发板,正式合入OpenAtom OpenHarmony(以下简称“OpenHarmony”)社区骨干。Unionpi Tiger开发板是一款基于A311D芯片,反对OpenHarmony规范零碎,面向超高清畛域的开发板。 A311D芯片有着弱小的CPU、GPU和神经网络减速子系统。反对4K视频编解码器引擎和一流的HDR图像处理,集成了所有规范音频/视频输出/输入接口。主零碎CPU基于大小核架构,集成四核ARM Cortex-A73 CPU集群和双核Cortex-A53集群,对立二级缓存,晋升零碎性能。每个 CPU 内核都蕴含独自的 NEON SIMD 协处理器,以进步软件媒体解决能力。还有反对 INT8 推理的神经网络加速器,实用于所有风行的深度学习框架,包含 TensorFlow 和 Caffe,反对 8bit/16bit 运算,运算性能高达 5.0T。 九联科技作为OpenHarmony共建单位之一,踊跃推动OpenHarmony芯片适配过程,冲破实现A311D芯片对OpenHarmony 3.1 Release 的适配,推出基于此芯片打造的OpenHarmony开发板——Unionpi Tiger,并顺利通过兼容性测评,合入OpenHarmony社区骨干。 Unionpi Tiger开发板,采纳双层结构,上上层别离为外围板、底板。外围板集成高速嵌入式存储器,具备32G的Flash和4G的RAM,同时集成有WIFI模块。底板包含RJ45以太网、USB、phone、HDMI、Micro USB、GPIO、I2C、I2S、Speaker、MIPI DIS、MIPI CSI、ADC、PWM、TTL、RS485、CAN BUS等接口,以及4G等选配模块。 将来,九联科技将继续深耕超高清视频行业,充分发挥本身劣势,踊跃推动OpenHarmony 生态倒退,为开源生态可继续倒退倾智献力,独特创立一个新时代的万物互联体系。 代码仓地址: https://gitee.com/openharmony...

July 15, 2022 · 1 min · jiezi

关于开发:软件定制开发对于企业来说有何好处

随着互联网的衰亡,企业对定制软件开发的需要一劳永逸,无论是外部的管理软件,还是内部的服务和营销软件,对企业来说都显得尤为重要。一个好用的软件能够让企业在治理上事倍功半,在营销上联合流动精准引流客户,晋升销量。因而,软件定制开发是很多企业不可或缺的环节。那么定制软件开发能给企业带来什么益处呢?深圳至佳科技领有多年的软件定制开发教训。上面具体解释一下,心愿对您有帮忙。软件定制开发五大益处介绍 1、合乎发展趋势,超过竞争对手 企业软件定制开发也是市场局势所迫。因为当初网络市场空间微小,很多竞争的公司都退出了网络销售和治理的行列,有了本人的市场。想要超过竞争对手,博得线上客户的青眼,必须要有一个好的软件。因而,企业必须软件定制开发,从本身需要和潜在客户的需要登程设计软件。 2、应用流程效率高 定制软件开发的应用效率会高于一般软件。原本一般的软件须要一些繁琐的程序,而定制的软件会因为集体需要而扭转,所以会更容易应用。同时,因为定制软件是按需定制开发的,除了简单的性能和程序之外,还有一个对立固定的指标,其性能会依据用户的需要进行调整,会比一般的通用软件更加简洁不便。所以能依据用户需要随时调整的软件效率天然会更高。 3、前期保护降级更不便 随着经济社会的不断进步,任何软件都须要依据企业本身治理的须要进行变更和定制。因为企业有本人的源代码,能够自行进行二次开发,进行定制治理简略不便。 4、模板有缺点,定制更久远 市面上有很多软件开发模板,但往往在细节上不能完满满足企业开发的需要。要么是界面性能不匹配,要么是功能设计太简单。所以,不如由企业本人开发一个量身定制的软件。所有性能都能满足公司本身需要,带来更好的体验。 5、反对个性化性能 局部企业心愿实现信息化治理。想让软件不仅能给顾客带来更晦涩的购物服务体验,还能交给员工在线操作,在线治理。如果抉择软件定制开发,齐全能够满足这种需要。深圳软件定制开发公司会依据企业的需求量身定制一款软件,充沛满足多样化的性能需要。这种软件能够大大提高公司的工作效率! 因为每一个定制软件的开发都要通过具体的系统分析,同时要依据不同企业的状况,制订出最适宜企业的计划。至佳科技作为业余的深圳软件定制开发公司,能够为宽广企业提供更业余、更优质的服务。如有相干问题,可征询至佳科技。

July 12, 2022 · 1 min · jiezi

关于开发:补齐短板开源IM项目OpenIM关于初始化登录好友接口文档介绍

OpenIM文档方面的建设始终远远落后于开发, 也常常被开发者诟病,在接下来一周的工夫里,咱们重点补齐文档,让开发者更轻松接入。因为app sdk底层都是go来实现,所以本文先写一个模板和框架,在接下来的工夫里,会有iOS、Android、Flutter、Uniapp、jssdk共事补充具体的细节,并更新到官网 初始化及登录初始化并登录胜利回调,是失常应用OpenIM 服务的前提 SDK形容[Login]登录,如果登录胜利,必须退出登录能力再次执行登录操作[Logout]退出登录[GetLoginStatus]获取登录状态, 101:登录胜利, 102:登陆中, 103:登录失败, 201:退出登录[GetLoginUser]获取以后登录用户UserID,此时用户登录状态未知[initSDK]初始化 SDK,整个生命周期执行一次,登录相干监听介绍如下:OpenIM和调用方利用监听回调机制,和调用方信息互通,把登录状态通过异步回调形式即时传递给调用方,确保信息及时传播而不阻塞其主线程。 监听阐明登录相干监听回调形容[OnConnecting]连贯中,在连贯后盾时(包含重连)回调[OnConnectSuccess]连贯胜利[OnConnectFailed]连贯失败,如果因网络连接失败会重连,其余状况不重连[OnKickedOffline]被踢下线,可能因为多端登录策略所致,或后盾管理员强制其退出登录[OnUserTokenExpired]检测token过期回调调用流程OpenIM调用流程分为如下几步: (1)初始化:在整个生命周期执行一次 (2)设置监听:包含群组监听,好友监听,用户监听,音讯及会话监听,这些监听会在其余章节中形容 (3)登录:登录回调胜利后再执行其余操作,否则可能呈现资源加载未实现的谬误 (4)收发音讯等操作; 好友治理相干接口OpenIM提供好友关系托管,比方好友申请,批准,以及好友获取等,OpenIM在客户端本地存储好友关系,并联合音讯告诉机制,按需调用后盾接口,确保本地和服务端数据统一。同时利用监听机制,把数据变动通过异步回调传播调用方。OpenIM在收发音讯时,默认不查看好友关系,您能够在配置文件中自行批改。OpenIM好友关系是双向关系,A增加B为好友后,则A在B的好友列表中,B也在A的好友列表中,A删除B,仅仅只是删除A的好友列表,而B的好友列表不受影响。同样,黑名单也相似。 SDK形容[GetDesignatedFriendsInfo]获取指定好友的信息[GetFriendList]获取所有的好友列表[SearchFriends]通过关键词搜寻好友[CheckFriend]查看是否好友关系[AddFriend]发动增加好友申请[SetFriendRemark]设置好友备注[DeleteFriend]删除好友(单向删除)[GetRecvFriendApplicationList]获取我收到的增加好友申请列表[GetSendFriendApplicationList]获取我发动的的增加好友申请列表[AcceptFriendApplication]批准好友申请[RefuseFriendApplication]回绝好友申请[SetFriendListener]设置好友、黑名单相干监听,用于UI层实时感知数据变动并刷新监听阐明好友监听器的作用:调用方设置好友监听,好友关系的变动会通过OpenIM音讯机制实时同步到须要感知的在线用户,包含用户的其余端,调用方依据回调事件做相干的数据处理。 比方用户B在Android端增加用户A为好友,用户A(所有在线的终端)收到B的好友申请,则A调用GetRecvFriendApplicationList获取收到的好友申请列表,刷新界面。同时,用户B在线其余的终端比方PC端也会收到告诉,B调用GetSendFriendApplicationList获取发动的好友申请列表,刷新B收回的好友申请列表。 当然也能够利用回调的参数信息,做增量解决,而不必获取全量的好友申请列表。 以用户B申请增加用户A为例 好友及黑名单监听形容[OnFriendApplicationAdded]好友申请列表减少,被动发起者和被动增加者会收到[OnFriendApplicationDeleted]好友申请列表删除,被动删除者会收到[OnFriendApplicationAccepted]好友申请被批准,被动发起者和被动增加者会收到[OnFriendApplicationRejected]好友申请被回绝,被动发起者和被动增加者会收到[OnFriendAdded]好友减少,用户好友减少时会收到[OnFriendDeleted]好友删除,用户好友缩小时会收到[OnFriendInfoChanged]好友信息扭转,用户好友信息(比方昵称等)扭转时会收到[OnBlackAdded]黑名单减少,用户黑名单减少时会收到[OnBlackDeleted]黑名单移除,用户黑名单缩小时会收到我的项目介绍OpenIM持续领跑开源IM畛域,在宽广开发者的反对下,目前github star冲破9k。在数据泄露、信息外泄、隐衷滥用的时代,IM私有化部署需要旺盛。其中,政企协同办公对IM需要猛增,随着信息化技术的迭代降级以及信创产业减速落地和实际,协同办公软件的发展潜力将进一步被开释。“平安可控“逐渐成为第一因素。对于社区交友畛域,暴露出的隐衷平安问题越来越多,私有化部署确保用户数据不泄露。 OpenIM从服务端到客户端SDK开源即时通讯(IM)整体解决方案,能够轻松代替第三方IM云服务,打造具备聊天、社交、办公性能的app。 github地址: https://github.com/OpenIMSDK/... 开发者核心:https://doc.rentsoft.cn/#/ OpenIM团队开创团队来自资深IM技术团队,咱们致力于用开源技术发明服务价值,打造轻量级、高可用的IM架构,开发者只需简略调用 SDK,即可在利用内构建多种即时通讯及实时音视频互动场景。OpenIM劣势:开源,平安,牢靠,低成本。对于信息安全器重的电子政务,企业协同办公,OpenIM都是十分好的抉择。 从公司成立之初就将“开源”作为外围策略来推动,开源充分体现了自在、平等、分享的互联网精力。 OpenIM邀请寰球技术极客参加技术优化,让开发者轻松集成,让每一个利用都具备IM性能,同时思考企业的接入老本、服务器资源以及最重要的数据安全性和私密性。

June 26, 2022 · 1 min · jiezi

关于开发:深圳开发商城小程序商城开发方式有哪些

小程序商城给商家和消费者带来了很大不便,推动了传统批发的转型降级,当初的商家如果想在强烈的同行竞争中立足,没有一个适合的线上平台很难生存,小程序商城无疑是比拟好的抉择,上面深圳至佳科技为大家介绍一下小程序商城开发方式有哪些? 小程序商城开发方式汇总: 1、应用第三方开发工具 当初很多小程序商城都是通过应用第三方开发工具进行开发,是比拟大众化的一种开发方式,比拟适宜中小一般商家的一种形式。这种形式的门槛比拟低,操作非常简单,根本没有任何难度可言,只需选好相应的行业模板,再通过增减版块,做一些图片上传、文案、板块调整、商品上传和分类的工作,快的话十几分钟就搞定了。即便商品较多,几个小时也就根本实现了,后续还能够随时批改。 2、基于成品软件二次开发 间接洽购第三方成品小程序商城进行开发,这种形式可能帮忙企业疾速失去一个品质成熟的小程序商城,兼顾企业老本和个性化需要,小程序商城开发商会提供源码给企业进行二次开发,企业能够依据需要开发理论相应的性能,几千块就能领有一个不错的小程序商城,也不须要破费太多费用去养一个开发部门,只须要领取小程序商城的市场价格,实现企业的个性化需要。 3、本人开发 本人开发是省钱的形式,个别须要懂得开发技术才可能本人开发,开发小程序商城能够省掉给开发人员的费用,通过这种形式就能够不花一分钱领有本人的小程序,然而本人开发,所有都要本人做,从市场调研、需要剖析、零碎布局、零碎开发、零碎测试、部署到上线,所有都须要本人亲自动手,对于开发的要求比拟高。它的劣势在于能够灵便控制系统性能,清晰明了零碎的各个局部,个性化需要更容易实现。 4、找外包团队定制 对小程序商城要求比拟高、资金、工夫都比拟短缺的企业就能够抉择定制开发这种形式,市面上有很多深圳小程序商城开发公司对于小程序商城开发专研,只须要企业和开发公司沟通好本人无关的需要即可,比拟省事省心,然而周期比拟长,从提交需要、产品定位、确定格调……到最初的开发、测试,少则将近一个月多则几个月,在价格方面比拟昂扬,从几万到十几万不等。这种形式不是特地适宜中小商家,比拟适宜大型企业。 以上就是对于小程序商城的开发方式,在进行小程序商城开发的时候,肯定要提前理解本人的理论需要,依据本人的需要来进行不同的开发方式的抉择。综合来看,不论是个体工商户还是中小企业,都能够应用第三方软件的开发方式进行小程序商城的开发,对于一些大企业来说因为他们的要求是十分高的,因而也能够抉择定制小程序商城的形式来进行开发。如果用户无意开发小程序商城,至佳科技能够帮助企业定制计划和预估费用。

May 31, 2022 · 1 min · jiezi

关于开发:如何开一场高效的迭代排期会-敏捷开发落地指南

简介:如何开一场高效的迭代排期会,高效落地麻利开发,先从这3个要害流动着手,通过本文你将理解到什么是麻利开发、什么是双周迭代、如何高效地发展排期会,以及如何在云效我的项目合作·Projex 中落地排期会相干事宜。 摘要:如何开一场高效的迭代排期会,高效落地麻利开发,先从这3个要害流动着手,通过本文你将理解到什么是麻利开发、什么是双周迭代、如何高效地发展排期会,以及如何在云效我的项目合作·Projex 中落地排期会相干事宜。 作为团队的负责人,你心愿将研发模式从瀑布式转为麻利,并进行继续改良,但却不晓得从哪里开始? 作为项目管理人员,你心愿负责建设迭代机制,并进行规模化的推广和度量,但却不晓得如何疾速建设机制? 作为产品经理,需要排期后,你心愿能不便地跟进需要停顿,及时发现问题,但却不晓得怎么跟进不便? 接下来,咱们将通过 3 篇文章,率领大家逐渐理解麻利开发的全过程及高效落地指南。 麻利开发之 Scrum 办法介绍 在麻利开发落地的过程中,通常采纳 Scrum 的形式,所以咱们以 Scrum 为例来介绍麻利开发的流程和场景(如上图),在这个过程中: 1. 首先产品经理会进行: ○ 需要的收集、调研和剖析,造成按优先级排序的产品待办列表; ○ 对高优先级的需要,进行具体设计和廓清; ○ 通过迭代排期会,造成按优先级排序的迭代待办列表; ○ 排期实现后,需要从产品经理侧流向技术同学侧。 2. 在需要廓清的状况下,研发团队来会: ○ 以 1~4 周的迭代周期进行继续开发和交付迭代待办列表中的内容 ○ 采纳每日站会来跟进打算和发现问题,并在迭代过程中继续或间歇性地交付可工作的软件。 与此同时,产品经理会在这个阶段,进行下一迭代的需要设计和廓清。 3. 迭代待办列表开发实现后,产品经理和研发团队一起进行迭代演示,交付可工作的软件。 4. 最初,通过迭代复盘会流动驱动团队继续改良。 在落地 Scrum 办法时,无论是阿里外部还是云效的企业客户,通常采纳双周迭代的运作机制,上面咱们以「双周迭代」为例进行介绍。 双周迭代的运作机制双周迭代时序图 上图是双周迭代的运作流程: ● 在 N-2 和 N-1 周,业务和产品会继续做需要的剖析和设计,会把要排入迭代的需要按优先级高下筹备好,包含需要的剖析、设计和廓清; ● 随后开发和测试同学在排期后的两周内( N 周和 N+1周),按优先级对需要进行开发、测试、验收和公布上线。注:排入迭代的需要在迭代排期前要已廓清分明,并明确验收规范。 ● 迭代排期在双周迭代中起着前后连接的作用,每两周进行一次,个别每次 1~2 小时。排期前,业务和产品同学须要筹备好待排期的需要,排期后,开发和测试同学须要依照打算对需要进行开发、验证和公布。 ● 迭代节奏和公布频率是要解耦的,迭代节奏能够是两周或一周,而公布频率能够是每两周一次、一周一次、或一周屡次等。有的企业或团队会依照每个迭代进行一次公布来落地,也有可能依照一个迭代进行屡次公布来落地。 至此,咱们了解了麻利开发的整体流程,及双周迭代的运作机制。能够看到在双周迭代的运作中,一个迭代中有 3 个十分重要的流动:迭代排期、迭代跟进和迭代复盘。本篇文章咱们先从「如何发展一场高效的迭代排期会」聊起。 如何发展一场高效的迭代排期会?想要发展一场高效的迭代排期会,须要相干同学做一些筹备工作,咱们将排期流动中的须要筹备的事项、指标等整顿在一起(如下表),供大家参考。 ...

April 27, 2022 · 1 min · jiezi

关于开发:全面解读OpenHarmony-31-Release版本夯实技术底座-打造繁荣生态

4月25日,OpenAtom OpenHarmony(以下简称“OpenHarmony”)技术日在深圳举办,对OpenHarmony 3.1 Release版本核心技术进行了深刻解读,同时分享了生态的最新进展。全新的OpenHarmony 3.1 Release版本,大幅优化加强了零碎根底能力,为开源生态蓬勃发展构建强有力的撑持,展示了OpenHarmony开源生态系统的弱小韧性。 OpenHarmony 3.1 Release版本首次反对简单规范带屏设施以及简单UI类利用开发,在内核层、零碎服务层、框架层以及开发资源&工具链方面,实现根底能力再降级,标记着OpenHarmony迈向新的转折阶段。 OpenHarmony版本继续迭代 生态产品初具规模 从1.0到3.1,短短不到两年的工夫,OpenHarmony版本零碎能力继续倒退,OpenHarmony 1.0 领有轻量级OS根底框架,OpenHarmony 2.0反对音视频和多内核能力,OpenHarmony 3.0 反对ArkUI框架及根本分布式能力,当初OpenHarmony 3.1领有了简单图形、平安、电话和分布式加强等全新个性。 零碎能力的继续迭代,助力OpenHarmony开发资源不断丰富,反对的利用和设施类型更加宽泛。零碎能力方面,OpenHarmony 3.1 Release版本已反对简单UI类利用开发,设施类型方面,新版本已反对简单规范带屏设施的开发。 截至目前,80款余软硬件产品正在通过兼容性测评,OpenHarmony生态产品初具规模。随着OpenHarmony 3.1 Release版本到来,置信OpenHarmony生态产品将会失去进一步拓展。 OpenHarmony零碎能力一直加强 分布式技术独具特色 面向全场景、全连贯、全智能时代,OpenHarmony具备“对立 OS,弹性部署”;“硬件互助,资源共享”;以及“一次开发,多端部署”三大个性。当初,OpenHarmony 3.1 Release在内核层、零碎服务层、框架层以及开发资源&工具链方面全面加强,带来分布式硬件互助能力、对象级数据管理能力、分布式平安框架等独具特色的性能。同时,新版本全新的UX设计语言,也赋予OpenHarmony带屏设施更加年老简洁的格调。 在内核层,新版本带来自适应内核调度机制,打造晦涩性能体验底座;丰盛HDI接口,为零碎提供更多的硬件拜访能力。零碎服务层方面,全新图形及窗口框架,能够提供晦涩的图形交互根底体验与动画体验;新增编解码、视频录制、媒体治理等能力,构建端到端的音视频数据处理平台。 分布式技术是OpenHarmony独具特色的性能,也是其构筑行业竞争力的关键所在。OpenHarmony 3.1 Release版本领有全新硬件资源池化架构,实现相机和屏幕的“超级终端”硬件互助能力,分布式相机反对远端相机的预览,拍照,可管制远端相机的缩放及拍照角度,分布式屏幕反对两台设施之间的屏幕镜像,扩大投射能力;新增分布式数据对象能力,继续欠缺多种数据类型的全局“一份”数据的开发体验;全新分布式平安框架也在继续欠缺,构建起更弱小的零碎完整性爱护、零碎隔离和访问控制平安根底平台,包含有分布式设施互信认证、分布式用户身份认证、跨设施数据安全、程序访问控制以及可信平安环境,此外,新版本采纳分级平安管控,进一步加强系统安全能力。 零碎底层能力加强,分布式技术打造差异化服务体验,OpenHarmony 3.1 Release版本零碎能力的全面降级,将为更多设施带来丰盛的性能体验,推动OpenHarmony利用和设施胜利落地。 开发者 OpenHarmony利用开发环境和设施开发工具继续降级 生态产业的凋敝,离不开每一位开发者的奉献。开发者是推动OpenHarmony开源生态倒退的基石,OpenHarmony 3.1 Release版本为宽广开发者带来更加高效的利用开发环境和设施开发工具。 全新的一站式OpenHarmony利用开发环境DevEco Studio 3.0 Beta3,反对低代码开发、Native开发,带来信息中心、全新构建工具Hvigor、双向极速组件预览、一键自动化调试签名等性能个性;便捷高效的OpenHarmony设施开发工具DevEco Device Tool 3.0 Release,为开发者提供一站式开发平台和一站式能力获取,赋能开发者高效实现设施开发。 欠缺开源底座能力 撑持千行百业OpenHarmony生态产品落地 ArkUI根技术、分布式根技术、内核根技术……为什么OpenHarmony始终在保持根技术的翻新?随同寰球数字经济高速倒退,数字化的需要超出预期,业界须要摸索新实践、新架构、重构技术底座,以撑持数字经济的可继续倒退。联接的密度乘以计算的精度,就是数字经济的强度。因而,根深能力叶茂。 随着数字经济的倒退,作为数字基础设施根技术的操作系统成为数字改革的要害力量。OpenHarmony作为泛智能终端数字底座,撑持千行百业的产业生态。截至目前,OpenHarmony曾经领有2000+社区贡献者、160万+社区用户,是目前国内最受企业及开发者欢送的开源我的项目之一。 将来,OpenHarmony将继续投入根技术创新,继续晋升性能、加强隐衷平安、扩大分布式能力、晋升开发效率,以反对大型分布式应用和全量零碎设施性能,从而无效撑持千行百业设施和利用落地。针对多行业共性需要,OpenHarmony社区会进行版本继续保护,帮忙行业软件发行版构筑先进生产力。OpenHarmony将持续欠缺开源底座能力,撑持开源生态蓬勃发展,更好的赋能千行百业的产业生态,为企业数字化转型做出更大的奉献。

April 26, 2022 · 1 min · jiezi

关于开发:阿里低代码引擎-LowCodeEngine-正式开源

低代码平台的开发始终须要较长时间的基础性开发工作,费时费力,咱们心愿通过开源低代码引擎让更多的垂直行业低代码更容易孵化,引入规范+SDK模式建设更多的心智打造。低代码引擎是什么? 低代码引擎是一款为低代码平台开发者提供的,具备弱小扩大能力的低代码研发框架。 低代码引擎由阿里巴巴前端委员会、钉钉宜搭联结出品。使用者只须要基于低代码引擎便能够疾速定制合乎本人业务需要的低代码平台。同时,低代码引擎还在规范低代码设计器的根底上提供了简略易用的定制扩大能力,可能满足业务独特的性能须要。 为什么咱们要开发低代码引擎?2019 年 7 月,在阿里巴巴前端委员会的技术资产盘点中,咱们发现,团体外部曾经有几十个具备低代码能力的平台在各业务中宽泛应用了,而这些平台底层是基于 3 至 4 套根底能力或 SDK 来实现的。而这些能力中很多都是能够复用的,比方下文提到的低代码引擎的几大外围能力:入料、编排、渲染、出码。这些能力的反复建设很消耗人力,而每一个 SDK 所投入的人力无限,不足以将其性能打磨精密,导致这些 SDK 大多数都处于低水平反复建设中。在思考解决方案的过程中,咱们意识到,不可能将所有的低代码平台收敛至一个,因而咱们决定将低代码能力下沉,将低代码技术体系拉通共建,制订了对立底层协定,基于规范打造出低代码平台的根底能力,并在此基础上提供定制化能力,最终造成了咱们低代码引擎。 低代码引擎有什么劣势?低代码引擎提供了低代码平台研发所需的根底技术能力,是一款面向前端研发人员的技术产品。如果有低代码产品的研发诉求,例如: 业务有独特的需要,市面上的低代码平台都不满足需要,须要打造一款新的低代码平台。须要将低代码平台的研发能力集成到已有零碎中。以上两种状况,如果应用低代码引擎,能够在 极短时间 内实现开发低代码设计器的开发,大大降低了低代码平台的研发难度和老本。而依据定制化水平的不同,工作量能够由传统的几十人/月压缩到几人/月。 为了撑持成千盈百个低代码平台,咱们将低代码技术分成了四层,通过分层架构来撑持低代码平台开发者进行业务上的定制和扩大。 底层协定标准化 咱们定义了《低代码引擎搭建协定标准》和《低代码引擎物料标准》作为低代码引擎的底层协定。 这两份协定定义了 3 方面的内容,别离是 术语、构造和行为 。 术语是咱们沟通的根底,概念相通,咱们能力高效沟通。咱们依据物料的颗粒度,定义了根底组件、区块、低代码组件、模板等术语,另外还包含低代码生产过程中一些模块名称,比方编辑器、画布、事件绑定、数据绑定、渲染、出码、设置器之类的术语。构造,包含页面形容的构造,如何定义页面组件树、数据源、生命周期、页面状态等等。行为,不同的业务场景,咱们对物料的配置、束缚、扩大各不相同,所以咱们在物料形容中有各种各样的钩子来反对自定制。正是基于以上几份协定,让下层的互通成为可能,让 “概念互通,物料互通,生态互通” 成为了可能。 弱小的扩大能力下图是低代码设计器的骨架构造,而设计器的扩大能力就是围绕以上的五大区域来进行的。能够通过插件、物料和设置器的扩大能力来对所需的区域进行定制。 低代码引擎孵化的低代码平台能够用以下的公式来了解: 低代码设计器 = 低代码引擎 + 设计器插件 n + 物料 n + 设置器 * n 上面三种典型的低代码设计器,就是在低代码引擎的根底上通过不同的插件、物料、设置器组合而成。 中后盾页面设计器小程序设计器流程设计器 当然还有更多定制化的低代码平台设计器这里因为篇幅就不一一列举了。其中中后盾页面设计器中,通过插件、设计器和物料定制的区域如下: 插件定制设计器定制的依赖之一就是设计器插件,咱们能够间接应用生态中流通的插件,也能够依据咱们本人的需要进行插件的开发。通过编写不同的插件同引擎外围模块进行交互,在满足多样化的性能的同时,同时也与低代码引擎解耦。 物料定制低代码平台中的物料也是非常重要的一个局部,咱们提供了三个方面的解决方案: 提供了一套根底的低代码物料,对于新低代码平台来说能够开箱即用。提供了将现有的源码组件转化为低代码组件的能力,之后即可在低代码引擎中应用。提供了低代码组件开发能力,包含低代码组件我的项目初始化、低代码组件调试、低代码组件配置等能力。设置器定制设置器是指在低代码设计器中设计一个组件时,咱们是须要对组件进行可视化配置的,而每一项配置都须要一个设置器,比方咱们的配置是一个文本,咱们须要的是文本设置器,咱们须要配置的是数字,咱们须要的就是数字设置器。 下图中的“按钮内容”和“图标尺寸”的配置就别离是文本设置器和下拉框设置器。 当规范的设置器无奈满足大家的个性化需要时,规范设置器也提供了定制扩大能力。开发者能够研发自定义的设置器并在组件中应用,使得组件能反对更个性化的配置能力。 配套生态开箱即用为了帮忙大家更低成本的研发低代码平台,除了低代码引擎,咱们还开源了配套生态(根底物料、根底插件、根底设置器、工具链),提供更多开箱即用的能力。更多的生态建设还在路上,敬请期待。 商业化产品验证钉钉宜搭是阿里巴巴自研的低代码利用开发平台,基于阿里云的云基础设施和钉钉的企业数字化操作系统,为每个组织提供低门槛、高效率的数字化业务利用生产新模式。在宜搭上生产的每个利用人造具备互联互通、数据驱动、平安可控的特点。 钉钉宜搭前端底层就是依赖于低代码引擎的能力进行研发的。除此之外,低代码引擎还撑持了阿里团体外部 100多个低代码平台的建设。置信之后会有更多的商业化产品应用低代码引擎。 为什么要开源?低代码平台的开发始终须要较长时间的基础性开发工作,费时费力,咱们心愿通过开源低代码引擎让更多的垂直行业低代码更容易孵化,引入规范+SDK模式建设更多的心智打造。通过社区中开发者的应用,能够减速低代码规范的造成,也能够帮忙咱们改良低代码引擎,丰盛低代码平台的场景,扩大创新能力。 通过领有低代码引擎,能够疾速的领有一款定制的低代码平台。在阿里外部曾经孵化了100种以上各种各样的低代码平台了。而明天,低代码引擎也迎来了本人的一个要害节点,于 2022.3.23 正式对外开源。快到咱们的官网进行围观吧。 点→官网地址点→github 如果对低代码引擎建设历程和思考有趣味,还能够查看之前的文章: 阿里低代码引擎和生态建设实战及思考 低代码引擎在团体外部曾经建设多年了,研发人员也经验了很多代,咱们冀望能把其中的技术细节、架构设计和技术思考出现给大家。咱们提供了 《低代码引擎技术白皮书》 ,心愿通过对低代码技术原理进行一个全面的介绍,让大家对低代码引擎有一个更加全面的意识。当然也心愿借此可能吸引到更多志趣相投的小伙伴通过开源社区进行共建,一起减速低代码行业疾速倒退。除此之外,咱们也心愿社区的小伙伴在理解低代码引擎之后, 能联合本人的教训或者低代码业务场景发现咱们的有余,提出改良倡议,咱们将感激不尽。 ...

March 29, 2022 · 1 min · jiezi

关于开发:网易会议开源之桌面端篇

 导读:随着线上会议越来越广泛,各企业在这种环境下也更加器重,冀望可能领有一套本人的会议零碎,不便开展工作和交换;网易云信在通信畛域研发深耕 24 年,基于此能力打造了一款成熟的会议零碎并将其开源,心愿奉献本人的一份力量,本文将介绍下其中的桌面端。  一、UI如何抉择对于桌面的利用,抉择的 UI 有很多,在不同的平台下都有成熟好用的框架,无论是出于疾速开发、性能、视觉效果都有多种抉择。 基于咱们的场景,须要反对 Windows 和 macOS 零碎,也就是要跨平台,跨平台计划也较多,Qt,Electron,Flutter 等都各有千秋;会议场景中的视频,作为根底外围,须要可能反对多路视频流的渲染,当然如果是高清视频会更好,因而性能也就是咱们思考中的重要一项。 为了更高的利用系统资源,心愿应用本地渲染,尽可能的应用硬件加速,进步渲染效率,联合其余因素咱们采纳 Qt 作为咱们的 UI 框架,Qt 作为老牌的跨平台 UI 框架,优缺点显而易见,抉择适宜的才是最好的。 二、桌面端(一)桌面端的框架框架整体如下图所示:   App:前端应用Qt搭建整个利用,包含注册登录,入会等一些性能,用户能够参考相干调用接口,齐全可能定制本人的App。SDK:会议组件的 UI SDK,包含会中的所有性能,也提供了对外的接口。IPC:作为 App 与 SDK 之间的桥梁,负责数据的通信。此模块是通过 Socket 联合异步工作队列实现接口的调用,其中 App 作为 Server 端创立 Server,拉起 SDK 的 UI 过程并传递端口号,而后监听 Client 链接,Client 应用端口来链接 Server,与之建设键连贯。下图是个大抵示意图。  App 和 SDK 采纳双过程的计划长处: 有更好的隔离,使得 SDK 更稳固。进步系统资源利用率,防止与 SDK 宿主过程资源抢占。(二)SDK   SDK 提供了对外的集成接口,也提供了会中的 UI 模块,用户能够基于此简略的接口,很容易实现集成。 UI 层:包含了会中的一些UI界面,比方视频视图展现,聊天展现,成员列表展现,直播,白板展现等。Service 层:依照业务对业务模块的封装。Control 层:对能力层模块的业务封装。Base 层:能力模块,根底模块。三、接入形式(一) 桌面端提供了丰盛的接入接口,如下所列 C++形式:提供了一套通用的C++接口,能够在Windows和macOS里通过原生的形式集成。Electron形式:提供基于JS的接口,具备和C++统一的接口,不便集成到Electron利用中。(二)SDK提供的接口能力依据会议的场景,提供了鉴权、账户、会中等服务,满足App端的能力。(三)SDK的长处组件化程高,接口简略稳固,可能简略快捷的接入。可定制化,UI可通过自定义的形式,集成到本人的零碎中。四、结语以上次要介绍了会议和组件的架构和一些业务,心愿可能帮忙用户理清架构和一些模块关系,理解外部实现和逻辑;当然在理论开发中,也会遇到一些关键技术点和局部模块的难点,咱们也有相应的解决方案,心愿在当前的篇幅中可能为您具体介绍。

March 18, 2022 · 1 min · jiezi

关于开发:2022年软件开发趋势远程工作已成主流

看看明年会产生什么。 2020 年 3 月,工作世界产生了天翻地覆的变动。到 2020 年 4 月,大概一半的公司报告称,因为新冠病毒,其 80% 以上的员工在家工作。大多数人再也没有回到办公室——近程工作将持续存在。被迫在网上生活,技术变得至关重要。 数字化转型当初是任何想要跟上步调的组织的根本要求。以前就很热门的技术工作者,当初更受追捧,以帮忙建设一个咱们都依赖技术进行最根本流动的世界。 2022年技术将如何反对近程工作Gartner 的一项考察显示,因为新冠病毒,69% 的董事会减速了数字化转型。这一趋势将持续存在,组织的重点是非接触式服务 (60.1%)、迁徙到云 (52.25%) 以及 DevOps 流动 (51.75%)。 依据数据,咱们预测了2022年的一些软件发展趋势: 1. 云将变得越来越重要云将在 2022 年及将来几年在技术中施展越来越重要的作用。能够迁徙到云端的所有货色都将迁徙到云端。 以公司新开发人员的入职为例。他们通常会破费几周的工夫来尝试让所有货色都在本地机器上运行。这十分耗时,不仅对于新员工来说,而且对于须要在此过程中提供帮忙的经验丰富的工程师来说也是如此。 到目前为止,大多数自动化构建、模仿环境和正在运行的生产应用程序曾经迁徙到云端。下一步是本地开发环境。 微软和亚马逊曾经开始着手这方面的工作,并且在 2021 年都公布了解决方案(微软的 GitHub Codespaces 和亚马逊的 AWS Cloud9),这些解决方案能够在几秒钟内提供可在浏览器上拜访的开发环境。 2. DevOps 将施展重要作用谷歌的 DORA 进行的钻研表明,“优良的执行工程组织实现其组织指标的可能性是个别组织的两倍,并在三年内实现了 50% 的高增长率”。 为了放慢管道并疾速交付新性能,团队须要确保他们的流程和工具尽可能好,打消阻碍和瓶颈。因而,DevOps 和实现继续交付的实际至关重要。 3. 人工智能辅助开发2021 年,咱们曾经见证了人工智能开始进入开发工具。GitHub Copilot、IBM AI for Code 和 Oracle 的新查询语言生成器是指向 AI 辅助开发方向的一些翻新。 2022 年,Forrester “预计简直所有开发工具中都会呈现 AI 机器人,为开发人员的工具箱增加自然语言和其余性能”。 4. 低代码平台的崛起2017 年,《福布斯》将低代码平台归类为“极具颠覆性”,而且这一趋势还在减速。Gartner 预测:“到 2022 年,低代码利用平台预计仍将是低代码开发技术市场的最大组成部分,比 2020 年增长近 30%,到 2021 年达到 58 亿美元”。并补充说“到 2024 年,低代码 利用开发将占利用开发流动的 65% 以上。” ...

March 4, 2022 · 1 min · jiezi

关于开发:网易智企发布易开源计划网易会议组件正式开源

 2021 年 11 月,工业和信息化部印发《“十四五”软件和信息技术服务业倒退布局》,将“凋敝国内开源生态”作为一项重要工作,开源被晋升至国家级别的策略高度。 其实,开源软件倒退至今已有几十年的历史,随同寰球数字化浪潮的衰亡,技术开源逐渐成为寰球软件产业翻新的重要模式之一。数据表明,寰球 97% 软件开发者和 99% 企业应用开源软件,开源已笼罩软件开发的全域场景。 网易智企旗下泛滥产品的倒退也得益于开源技术的红利,在这个过程中,网易智企也在不断加强本身核心技术的自研能力。 近日,网易智企公布”易+”开源打算,将网易智企局部技术进行开源,反哺行业翻新。网易智企旗下交融通信云服务专家网易云信打响头炮,正式开源网易会议组件,并将在第二季度开源低延时直播技术。 共创共享,天下“一家” 。“易+”开源打算心愿开发者站在网易智企的肩膀上,基于优质的源代码进行下层开发和迭代翻新,深耕需要场景打磨前沿产品,助力千行百业数字化转型。   本次开源的网易会议组件由网易云信团队自研,联合行业当先的实时音视频、即时通讯、白板、直播等技术,网易云信构建出一套稳固、高清、易用、平安的会议零碎。 蔓延寰球的新冠疫情减速了数字化转型倒退的过程,挪动化办公成为各行各业的刚需,而会议软件作为近程信息传播的重要工具,曾经是“基础设施”个别的存在。基于网易会议组件,开发者能够疾速地将音视频会议性能集成至现有利用中,一周即可开发出一个属于本人的 “ZOOM” 。 拜访形式Github:https://github.com/GrowthEase... Gitee:https://gitee.com/GrowthEase/... 挪动端可通过以下二维码拜访网易智企 Github 主页:   性能层面,网易会议组件能够满足大中小会议全场景需要,晋升合作效率。音视频性能卓越,反对一对一或多世间的语音/视频通话性能;会议合作能力丰盛,反对实时音讯、白板共享、屏幕共享等性能;治理能力全面,反对会议管制、会议邀请、视图切换等性能;多维度平安保障,入会明码、会议锁定、多重防护,全面保障会议平安。 网易会议组件架构 体验层面,网易会议组件代码可能让开发者降本增效,晋升开发体验。一套代码跨平台多端复用,进步开发者集成效率;功能丰富,灵便的自定义 UI 模板升高开发者开发成本;组件化产品设计,模块划分更正当;代码兼具高可读性和高稳定性,网易会议组件将优雅和丝滑写进代码里。 “软件定义世界,开源定义软件”。0 门槛试错、低成本翻新,开源模式对产品演进和行业倒退的重要性显而易见。目前,网易会议组件不仅能够利用于企业各类会议场景,还可广泛应用于娱乐 社交行 业、教育行业、金融行业、互联网医疗、工业物联网等畛域。 能够同声传译的会议室、能够在线编码的视频面试、专家近程多方视频会诊、近程管制工业器械......站在网易智企的肩膀上,更多翻新期待开掘,更多时代将被定义。 有任何问题或倡议欢送扫码增加小助手(左)/退出官网社群(右) “独行快,众行远”。始终以来,网易智企始终将技术生态建设放在重要地位,与开发者们一路同行。网易智企深知,凋谢、平等、合作、共享的开源模式是技术倒退、科技翻新的重要力量。将来,”易+”开源打算将持续施展智企技术劣势,打造开源开放平台,让更多行业体验到因技术带来的体验降级、场景翻新和效率改革。 直播举荐3 月 8 日 19:00 网易会议组件产品负责人郭科健 将在视频号与大家分享网易会议组件性能、劣势以及场景,同时针对疑难现场答疑 3月8日 19:00 视频号直播 不见不散

March 3, 2022 · 1 min · jiezi

关于开发:译文-一文看懂技术债

很多人搞不清楚技术债权、缺点和非功能性需要之间的区别: 缺点不能成为技术债权,因为技术债权并不意味着不满足性能或技术要求。 技术债权与蹩脚的设计、蹩脚的编码、不适合的设计模式、设计准则等无关,缺点则与产品不适宜、使用性能不佳等无关。 不满足非功能性需要=缺点,而技术债权与之不同~ 什么是技术债权?技术债权是沃德·坎宁安 (Ward Cunningham) 发明的一个比喻: 技术债权相似于金融债权,软件开发就像是“贷款”,技术债权是它的“利息”,“利息”是须要将来额定的工夫偿还的。 以下举例会更不便大家了解: 012007 年“我”从事保险产品的工作,团队应用的外围产品是用 AS400 编写的 WINS。 过后,“我”正在应用 asp.net 开发一个门户网站,因为后端是AS400,所以由另外一个团队编写中间件,本来应该编写中间件的团队负责开发,而咱们本应该应用这些服务来应用asp.net 编写前端。 开局很好,但随着工夫的推移,咱们落后于打算。 每次咱们须要更改时都会分割中间件团队进行更改,因为变动的需要太多,留给他们的反应时间也越来越短。 眼瞅着中间件团队的压力一天比一天大,前端团队开始试用绕过中间件团队,间接指向后端的流程治理办法,冀望可能缩小修复缺点带来的工夫损耗。 咱们修复了缺点,按时交付,所有此类更改的日志都被保留下来,以便中间件团队能够在日后更好的修复它们。可怜的是,“日后”从未来到—一直有新的变动呈现,技术债权也越积越多。 02同一个产品,生成策略的业务规定却又很多,XML被用来驱动这些规定,咱们应用的是一个规定引擎。有一种办法用于生成策略,它与规定引擎相连,且该办法最后只有一个参数。 随着开发的进行,本来的团队成员来到,新人退出,他们都在代码中增加了更多行,但出于对曾经工作的性能产生毁坏的放心,他们不对现有代码进行任何更改,也无奈找到更好的工具来解决这一问题。 其后果是可怕的,18 个月后,同一个办法有超过十个重载办法和远超过 10万行的代码…… 性能虽完满,代码却是一场劫难——没有人试图重构代码来做简化,新开发人员须要 2 到 3 周的工夫能力了解那里写的所有内容。 这里想做一点假如:若团队足够稳固、指导方针更优越、团队谋求技术的专一和极致性,那这所有不会产生…… 03团队在 2009 年应用 WPF、WCF 和 SQL Server 开发了一个 EMR 应用程序,在WPF 很新、可用的经验丰富的开发人员却不多的状况下,自然而然的,团队在学习开发它上消耗了太多的工夫。 只管团队内对 MVVM 设计模式仍旧不是很自信,但业务却心愿尽快地公布它。于是,在对MVVM没有太多理解的前提条件下,团队内开始构建它了。尽管后果是好的,但人们编写了不容易了解的代码,并增加了许多将代码变的简单的额定代码。 以上三个例子活泼的向咱们诠释了什么是技术债权不是缺点,以及它们产生的起因: 业务压力:企业关怀性能而不是代码品质并行开发:一个团队试图通过安顿更多人来满足最初期限不足技术技能和常识:在学习可承受的实际(例如 TDD、重构和紧急设计等)方面投入有余不足文档:许多人认为麻利意味着没有文档或不理解文档的价值不足所有权:将开发外包蹩脚的设计技能: 延聘教训较少的低成本工程师等这里又呈现一个问题: 什么是非功能性需要?非功能性需要是需要,非技术债权。 如果页面须要更多工夫来关上而产品经理对此有所埋怨,这示意产品经理在回绝欠缺该性能的需要,而非技术债权。 同样,如果零碎无奈解决负载或谬误音讯不明确,则存在性能缺失,而非技术债权。 以下这些都是功能性需要: 数据安全治理用户会话并爱护它拣货时段和非拣货时段的服务器负载治理页面加载工夫服务器响应工夫正确的日志治理政府合规等LigaAI 新一代智能研发合作平台 让 AI 为您的研发团队提供个性化、智能化的我的项目合作体验,化繁就简,帮忙开发者专一、高效的创作!本文作者:Naveen Kumar Singh

March 2, 2022 · 1 min · jiezi

关于开发:Instagram-CEO-苹果-iPad-不咋受欢迎不值得给开发个专属版本的-App

上周,Instagram 首席执行官 Adam Mosseri 在社交平台上发文称,他们始终没公布 iPad 版 Instagram 的起因,只是“因为 iPad 不怎么欢送”。该推文一经公布,引发不少热议。 作为备受年老用户青睐的社交媒体平台,Instagram 在在近几年的影响力也在继续晋升。但让不少用户“蛊惑”的一点,就是这款广受欢迎的社交 APP 竟然始终没有推出 iPad 版本。 所以,对于“Instagram 什么时候公布 iPad版本”的话题始终是用户关注的焦点之一,而且简直每年都有人问这个问题。 当然,始终被用户问这个问题,作为 Instagram CEO 的 Mosseri 天然备受“困扰”。 终于在 2 月 27 日,当出名科技博客作者 Marques Brownlee 在社交媒体上再次提出这个问题“The year is 2022 and there's still no proper Instagram app for iPad”,吐槽“都 2022 年了,iPad 上还没有适合的Instagram 应用程序”的时候,Instagram 的 CEO Mosseri 终于含糊其辞的做出了回应: “Yup, we get this one a lot. It's still just not a big enough group of people to be a priority. Hoping to get to it at some point, but right now we're very heads down on other things.” ...

March 2, 2022 · 1 min · jiezi

关于开发:开发人员的编程心理学

向开发人员提供倡议的编程心理学我之前写过,编程有两个受众:CPU 和你的编程搭档。 还有一些优良的文章,比方《面向苦难编程》 ,能够帮忙你在编程时调整指标——让它工作、让它丑陋、让它疾速,这是那篇文章的倡议。 “让它工作、让它丑陋、让它疾速”是绝妙的编程倡议,也是我从第一次读它开始就始终牢记在心的倡议。 编程倡议程序首先以 CPU 为指标——即“使其工作”。 1 正当的编程倡议而后倡议针对您的编程搭档,即必须保护或查看代码的人,让代码丑陋。 一旦您的代码胜利满足其计算要求,并满足与咱们一起共事的普通人可能了解的要求,那么,如有必要,咱们就能够聚精会神地不断完善它。事实上, 代码“丑陋”意味着有可能更容易找到改良的机会,因为在大多数状况下,使代码“丑陋”意味着更小的、独立的函数,从而使得更易优化。 我最近在网上和一位敌人聊天,他提出了一个问题,这也反映了我的经验:他的工作是集成一组代码,这些代码是在没有团队监督的状况下创立的。这些代码不足测试,并且是独立编写的,没有遵循与主我的项目雷同的编码标准。 这是一个艰巨的处境。集成这样的代码意味着要试图弄清切入点——这是测试的职责——但因为没通过测试,你不得不置信编码者实际上满足了需要,因为在现实情情景下,测试也要证实这一点。 你会怎么做?你会给什么编程倡议? 2 无抵触面对如我所言,我遇到过相似情景,尽管我抵赖还能够解决得更好,但同时我也认为本人曾经做得够好了。 人们不喜爱被面对,面对什么并不重要。迪特里希·邦霍费尔(Dietrich Bonhoeffer)有一个粗浅的洞察,即个体可能很愚蠢,但群体可能超级愚蠢——更蹩脚的是,冲突挑战,抵抗力会随着参加人数的减少而减少。(你能够很容易地扭转一个敌人的想法——然而扭转一群七个人的想法却难于上青天。) 所以我所做的就是把本人描绘成一个受到他们的代码库挑战的人。我没有评论理论代码或它们有多可怕:我让本人专一是于学习代码,因为我不了解它。 这个性能的测试在哪里?”我问道,只管我晓得没有测试。毕竟,我可能是错的……问测试在哪里是对他们的温和刺激,以便我能从他们那里有所播种。 这个问题给了他们很大的回旋余地。 3 强制自我检查他们能够指出测试在哪里的确满足了我的需要;兴许我只是没看到?(在这种状况下,不存在测试,我晓得,但这不是重点。我须要他们思考可能性。) 他们也能够本人察看到,兴许测试不存在,作为交接的要求,兴许他们能够写一个。 当您还没有设计用于测试的代码时,测试很艰难,但在您承受代码之前,这不是您的问题,这让他们有机会批改本人对代码的了解,而不用在意我对他们代码的认识。 当然,兴许你没有权限要求这样的测试。在这种状况下,您可能须要向利益相关者(负责交付代码的人)申请帮忙,并指出未测试代码的集成引入了可变的可靠性(即,它是不牢靠的,因为您不能假如它是牢靠的)。 与利益相关者就可靠性进行对话可能会让您有权回去进行构造和测试的对话。 4 编程倡议心理学再者说,这种对话齐全能够颠倒过去。如果他们编写了意大利面条式的代码并为此感到骄傲——谁不会呢?—您会简略地要求他们编写它,以便您的小脑袋能够像了解依据组织约定编写的代码一样容易地了解它。 “哇,那个243行的函数太厉害了,就是看不懂。你能通知我咱们如何将它合成并重构为具备更小的函数和组合吗? 而这个对“j”的援用,是一个索引吗?咱们能把它命名为它理论代表的货色吗?是窗口句柄吗? 请帮帮我,我真的不明确。” 这是根本的心理学原理。在某种程度上,这是一种操纵,但咱们每天和每次互动都以温和(心愿是凶恶)的形式操纵人们:当咱们与人打招呼时,咱们会微笑,以触发特定的内啡肽,咱们首先提到好消息(或者不是)发明有利于咱们想要的特定心态。为本人的目标应用人们的思维和感知形式并不奇怪,如果后果是侧面的,那么这样做也不是好事。 不要胆怯用心理学来帮忙你编程。这可能很难,因为有时它意味着你不能对那些可能真的须要大喊大叫的人大喊大叫——但大喊大叫往往会事与愿违,如果指标是富有成效,那么咱们须要思考如何发明咱们的工作环境,而不是通过按住他人来满足咱们的私欲。 注:本文译自:The psychology of offering programming advice to developers - Coffee Talk: Java, News, Stories and Opinions (theserverside.com)

January 25, 2022 · 1 min · jiezi

关于开发:龙蜥社区一周动态-110114

各位龙蜥社区的盆友们好,社区一周动静与大家准时见面,欢送继续关注公众号不迷路。当初, 让咱们一起来回顾下社区「1.10-1.14」都有哪些「上新」干货吧。 —— 完 —— 退出龙蜥社群退出微信群:增加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;退出钉钉群:扫描下方钉钉群二维码。欢送开发者/用户退出龙蜥社区(OpenAnolis)交换,独特推动龙蜥社区的倒退,一起打造一个沉闷的、衰弱的开源操作系统生态! 对于龙蜥社区龙蜥社区(OpenAnolis)是由企事业单位、高等院校、科研单位、非营利性组织、集体等在被迫、平等、开源、合作的根底上组成的非盈利性开源社区。龙蜥社区成立于 2020 年 9 月,旨在构建一个开源、中立、凋谢的Linux 上游发行版社区及翻新平台。 龙蜥社区成立的短期指标是开发龙蜥操作系统(Anolis OS)作为 CentOS 停服后的应答计划,构建一个兼容国内 Linux 支流厂商的社区发行版。中长期指标是摸索打造一个面向未来的操作系统,建设对立的开源操作系统生态,孵化翻新开源我的项目,凋敝开源生态。 目前,龙蜥OS 8.4已公布,反对 X86_64 、Arm64、LoongArch 架构,欠缺适配飞腾、海光、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密反对。 欢送下载: https://openanolis.cn/download 退出咱们,一起打造面向未来的开源操作系统! https://openanolis.cn

January 18, 2022 · 1 min · jiezi

关于开发:以开发之名一站式分发精准触达圈层

《偶像梦幻祭2》主策动Helen在游戏行业十多年了,作为一个“二次元爱好者”,她从初中开始就各种追番、买漫画杂志,对二次元游戏也很感兴趣,起初很侥幸参加了《偶像梦幻祭2》的策动。 《偶像梦幻祭2》是一款二次元女性向偶像养成音乐手游,通过精美的美术画面和丰盛的3D MV剧情给予玩家陪伴感和养成感。因为玩家群体偏差二次元,粘性强的同时圈层感也很强,如何散发和精准触达圈层是个不小的挑战。 “在游戏散发的前中后期,HUAWEI AppGallery Connect为咱们提供了丰盛的服务,让更多的玩家与咱们相遇。”Helen从游戏上线前、上线当周以及上线后三个阶段分享了游戏上线过程和获得的成绩。 “在《偶像梦幻祭2》首发前,驳回华为团队依据数据提出的倡议,预约Banner由之前的每月替换改为每周替换,向玩家传递更多的游戏角色信息,预约数峰值靠近3万,为首发用户积攒做了很好的铺垫。”Helen说。 在游戏首发当周,华为游戏核心“上分之路”栏目从游戏角色、画风、音乐、剧本故事等多个维度对《偶像梦幻祭2》进行了业余测评,同时配合同人条漫的连载,帮忙玩家更疾速理解游戏,最终让游戏首发期间的曝光达到了300万左右。 “在游戏上线后,因为游戏包体大小达1.7G,用户下载老本较高,所以咱们始终有一个争议:是小包下载后加载完整包,还是一次性下载完整包的转化率更高? ”Helen说,“所以咱们应用了HUAWEI AppGallery Connect的分阶段公布服务,将线上流量依照5:5的比例随机分流,比照两种下载方式的量级转化、留存和付费状况。后果小包IPM比完整包高28%,详情页转化率回升90%,付费7日LTV根本稳固,依据这个后果咱们全渠道地替换了小包。” 散发能力是实现游戏和利用增长的重要一环。HUAWEI AppGallery Connect在帮忙开发者打造优质的游戏体验,升高潜在危险,晋升散发成果的同时,也为开发者上架公布游戏和利用加强信念。从利用上架之前的筹备,利用上架后的流量积累,再到前期的高效经营,HUAWEI AppGallery Connect基于华为利用市场平台资源为游戏和利用提供了全方位的赋能。 “这两年女性向和二次元是两个很引人注目的市场,高质量作品不断涌现,玩家对游戏的规范也一直进步,须要用更优良的作品吸引玩家、留住玩家。在将来,咱们心愿携手HUAWEI AppGallery Connect创作出更多让玩家青睐的优良内容。”Helen说。

December 28, 2021 · 1 min · jiezi

关于开发:以开发之名深耕本土化内容带给用户更丰富的娱乐体验

《梦幻花园》是一款打消+建造交融玩法的三消游戏,由俄罗斯开发商Playrix制作,原生场景更偏差于欧洲的庄园设计,一些功能性修建也附带了浓重的东方色调。作为一款海内产品进入中国,将如何做“本土化”内容? “咱们心愿能为中国用户提供更优质的产品体验和正向的情绪价值,为此咱们在“本土化”方面做了较多的致力和投入。”《梦幻花园》游戏制作人尤泽煦说。 《梦幻花园》经营团队调研发现年轻人其实很喜爱理解传统文化内容,所以在本土化过程中,他们尝试退出了苏州园林、雪落长安、故宫文化等优质内容,推出一系列符合中国用户审美的花园皮肤。 同时充分发挥游戏设计巧思,如御花园新版本,把剧情包装成奥斯汀来中国游览,并且独自开拓了一块全新的建造区域,给予用户全新玩耍体验的同时,也可能感触到宫廷修建的深厚底蕴。 面对国内市场用户增长变缓的现状,老用户留存和促活成为要害。HUAWEI AppGallery Connect凋谢的全生命周期服务,帮忙开发者做精细化经营,晋升开发、经营以及散发效率。 “《梦幻花园》在正式上线御花园新版本时,首次应用了新版本‘预约’性能。帮忙咱们取得了近3个亿的品牌曝光量,触达外围用户群,包含历史注册用户,积攒潜在玩家。新版本公布后,预约用户的回流率达到85%以上,极大地促成了用户活跃度,晋升用户粘性。”创梦天地商务VP张迪说。 为了给用户提供更丰盛的游戏内容体验,《梦幻花园》还联合华为生态智能产品在内容上进行单干摸索,于往年6月推出了“华为商城智慧生活馆”装修流动,用户通过闯关取得装修票,能够在游戏内应用虚构的华为品牌智能设施装修本人的“华为商城智慧生活馆”,流动期间用户新增量环比增长50%。 在将来,创梦天地和华为还将在游戏深度联运、联结推广、IP等畛域发展更深刻的单干,并独特摸索云游戏、VR游戏等翻新利用场景,为用户带来全新的娱乐体验。 “《梦幻花园》不单是一款为用户提供产品体验和娱乐价值的游戏,更是一座陪伴用户的花园。《梦幻花园》愿携手华为始终守护着大家心中的那片花园。” 创梦天地联结创始人兼总裁高炼惇说。

December 21, 2021 · 1 min · jiezi

关于开发:分布式-DBLE-新特性之脱离分库分表的读写分离

作者:赵佳慧 爱可生产品团队成员,次要负责公司运维平台的更新迭代。平时喜爱多理解其余技术,一直晋升集体技能。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 一、性能介绍本篇内容次要围绕分库分表中间件 DBLE v3.20.10.0 版本的新个性 “不分库分表的读写拆散” 开展介绍。 在 v3.20.10.0 版本之前,DBLE 反对配置分库分表的前提下应用读写拆散性能。v3.20.10.0 版本开始,DBLE 反对配置单纯的读写拆散,即读写拆散性能能够和分库分表性能离开,独自应用读写拆散性能。在介绍新个性之前,咱们先来回顾分库分表下的读写拆散性能如何应用。 二、环境筹备验证分库分表下的读写拆散性能之前,首先筹备所需环境,根本信息如下: 服务器IP用处版本10.186.64.40部署DBLE服务3.20.10.010.186.64.23部署MySQL-M15.7.2510.186.64.31部署MySQL-S15.7.2510.186.64.34部署MySQL-S25.7.251、部署一主两从数据库组。 2、部署 DBLE 环境。 可参考 DBLE手 册中的 疾速开始 。 3、编辑 DBLE 配置文件,配置好后端数据库组。 4、开启 MySQL 的 general.log ,用于验证 SQL 语句的下发。 三、应用分库分表的读写拆散性能1、配置分库分表的读写拆散性能。 配置要点: 配置多个 dbInstance 为读操作提供负载平衡。rwSplitMode 配置不能为 0 。重要配置内容: user.xml <dble:user xmlns:dble="http://dble.cloud/" version="4.0"> <managerUser name="admin" password="1" maxCon="200"/> <shardingUser name="root" password="1" schemas="db1" maxCon="200" > </shardingUser> </dble:user>shardingUser:分库用户配置db.xml <dble:db xmlns:dble="http://dble.cloud/" version="4.0"> <dbGroup name="dbGroup1" rwSplitMode="1" delayThreshold="100"> <heartbeat>show slave status</heartbeat> <dbInstance name="M1" url="10.186.64.23:3306" user="root" password="1" maxCon="500" minCon="100" primary="true" readWeight="0" id="mysql1"> <property name="testOnCreate">true</property> </dbInstance> <dbInstance name="S1" url="10.186.64.31:3306" user="root" password="1" maxCon="500" minCon="100" disabled="false"> </dbInstance> <dbInstance name="S2" url="10.186.64.34:3306" user="root" password="1" maxCon="500" minCon="100" disabled="false"> </dbInstance> </dbGroup></dble:db>rwSplitMode:读操作的负载平衡模式(候选值0/1/2) 0:不做平衡,间接散发到主实例。1:读操作在所有从实例中平衡,当所有从实例均不可用时,下发语句会报错。在v3.20.10前是会发往主实例。2:读操作在所有实例中平衡。Sharding.xml <dble:sharding xmlns:dble="http://dble.cloud/" version="4.0"> <schema name="db1" sqlMaxLimit="-1"> <globalTable name="t1" shardingNode="dn1,dn2" sqlMaxLimit="-1"></globalTable> </schema> <shardingNode name="dn1" dbGroup="dbGroup1" database="db_1"/> <shardingNode name="dn2" dbGroup="dbGroup1" database="db_2"/></dble:sharding>2、应用 mysql client 登录 dble 客户端。 ...

September 15, 2021 · 2 min · jiezi

关于开发:云端开发在阿里的典型应用场景

简介:云端开发在阿里的典型利用场景,云端开发指开发者可基于云平台实现编码、测试、公布等研发流程。一个残缺的云端开发平台不仅是提供了一个云端的编码环境,还提供了一整套研发工具和配套设施,让开发者做到在云端即可实现应用程序的需要、编码、测试和运维的全生命周期治理。 本文作者:弗止,阿里云云效技术专家;辰颜,阿里云云效高级开发工程师本文源自:阿里云云效团队出品的《阿里巴巴DevOps实际指南》,返回:https://developer.aliyun.com/...,下载完整版电子书,理解阿里十年DevOps实践经验。 云端开发指开发者可基于云平台实现编码、测试、公布等研发流程。一个残缺的云端开发平台不仅是提供了一个云端的编码环境,还提供了一整套研发工具和配套设施,让开发者做到在云端即可实现应用程序的需要、编码、测试和运维的全生命周期治理。 传统的本地开发的问题如下图所示,在传统的开发模式中,企业研发人员通常在本地实现代码的编写和测试,而后把代码推送到远端服务器,通过一系列的构建和集,最终公布到生产环境,并继续利用线上的运维体系实现线上零碎的监控和运维;同时,企业也会采集局部研发过程中的要害数据,用来度量团队及集体的效力。 随着各种软硬件技术逐步更替,公司规模也越来越大,为了适应这种变动: • 公司须要一直为企业研发人员配备适合的本地研发工具(如:多核高内存的计算机设备、Mac 笔记本电脑),这些设施可能价值不菲,而且须要定期的更新换代;• 新退出的员工,在正式开始开发前,须要配置简单的本地开发环境,装置特定的软件及插件,并相熟我的项目的研发流程及各个线上零碎;局部我的项目因为网络配置等问题,可能第一工夫还无奈在本地启动,还会耽搁不少额定的配置及调试工夫;• 公司须要投入较多的资源,能力构建起匹配管理者需要的效力度量零碎和平安管控零碎,并且因为云端体系天生对开发者本地环境的弱管控性,成果只能差强人意; 阿里巴巴也不例外,随着近些年各项业务的飞速发展,人员的疾速裁减,如何解决倒退过程中带来的相似问题变得火烧眉毛。而云端研发作为一种新兴的技术模式,其独特的劣势恰好能够用来解决上述问题。 云端开发的典型利用案例案例 1:前端组件的开发在阿里外部,存在大量的基于 Node.js 构建的前端工程,这些前端工程广泛采纳模块化的组织形式,在开发过程中会随着需要迭代产生泛滥的模块(或组件)。同时,有些前端工程会邀请业务方参加共建,即由提出性能需要的团队在大的规范下自行开发组件,并公布上线,在平台中集成本人的场景。在这样的背景下,组件的开发会被高度的形象,大部分的步骤都能够由工具辅助实现(如下图中,业务开发人员只须要关注本人的业务逻辑即可),这样既晋升了研发效率,又晋升了组件的开发品质。 前端组件开发过程: 云端开发的开箱即用,恰好能够解决相似的问题。开发者关上浏览器就是一个配置好的环境,实现零配置上手;而环境配置能够由项目组的资深共事保护,配置好针对某个我的项目的零碎版本、程序运行时、SDK 和 IDE 插件汇合。相比应用本地的研发工具,云端开发能够实现: • 研发流程的产品化,从组件的新建到最终的公布零打碎敲,不必再在多个平台工具上来回跳转;• 屏蔽用户操作系统的差别,提供对立的研发环境,不必再解决 Windows/Mac 的差别,不必放心本地Node.js 的版本问题;• 所有环境都会预装好必要的开发提效工具,如:规约扫描和修复工具、预览调试工具、各环境公布工具等;• 充沛开释本地磁盘空间,不必放心磁盘被 node_modules 占满; 案例 2、代码平安管控与研发过程数字化度量在政务、金融以及局部高科技企业的研发场景中,对代码的平安管控要求极其严格。但近几年,公司外部源代码泄露的事件时有发生,有的被明码标价进行发售,标价数十万甚至上百万美元;有的间接被公开在网络上,任何人都能够拜访下载。一旦产生相似事件,将会间接或间接造成商业信息泄露及公司名誉受损。 当应用本地开发时,源码的传输环境、本地的长久化介质不可控,对于员工无意泄露源码的行为仿佛无可奈何。当应用云端开发时,所有都迎刃而解:开发者能够从代码库或需要间接关上网页开始云端开发,研发过程中代码不落本地磁盘,既能缩小传输危险,又防止了员工本地环境被植入木马、从而在不知情的状况下泄露源码的可能;同时,在云端开发环境中能够对用户的浏览、拷贝行为做不同水平的管控,联合告警和零碎主动拦挡,可无效升高源码泄露的危险。 在阿里外部,当波及到对保密性要求极高的我的项目,或者当企业内部成员参加对代码保密性有要求的我的项目时,咱们会举荐我的项目团队应用云端进行研发,从而无效避免源码的泄露。 此外,随着越来越多的企业进入到数字化转型阶段,管理者冀望能更加全面的看到企业员工的投入与产出,并且针对我的项目人员散布与研发过程效率做出更加及时的调整与改良。在过来,所有的数字化信息都依赖人工的反馈和统计,反馈的是否精确、统计过程中是否有纰漏都会间接影响管理层的判断。但如果把研发过程搬到云上,所有的研发过程数据就能生在云上、用在云上,想要借助数字化晋升研发效率变得更加容易。 在阿里外部,团队中常常会呈现一名正式员工率领多名企业内部成员实现我的项目的状况。在须要对企业内部成员的工作进行绩效评定时,传统的评定形式通常是参考需要实现数量、代码缺陷率等指标,但理论工作中需要有大有小、有难有易,齐全基于后果指标进行评定很难做到偏心公正,让优良的员工怀才不遇。借助云端开发,能够让所有研发过程中的数据也通明进去,如各需要的编码时长、长期版本公布次数、过程代码与最终无效代码的比例、单位工夫代码产出量等。通过联合研发过程数据,也能够让绩效评定更加通明公正。 总结云端开发具备灵便定制、开箱即用的特点,借助好这两个个性,就能够创新性的解决掉传统本地开发过程中的顽疾。除了上述两个案例外,咱们认为,以后适宜云端开发落地的场景还能够是: 1、云原生场景中的轻量代码开发,如 Serverless 场景,这类场景中研发人员只须要集中式的编写业务逻辑,大量的框架类代码已被默认暗藏,并且调试、部署形式有别于传统研发过程,更适宜云端开发的落地。2、各类垂直化的场景,这类场景通常须要有针对性的定制,与特定的线上零碎进行买通,只有能利用好云端开发灵便定制的个性,就无望实现开发阶段 10 倍效力的晋升。 目前,阿里巴巴外部的云端开发平台目前已通过阿里云云效对外输入,返回ide.aliyun.com,秒级体验云端编码、代码智能补全等黑科技。 阿里巴巴合伙人和业界多位大佬力荐、何勉、陈鑫等17位阿里资深技术专家联袂出品、阿里十年DevOps教训积淀总结、阿里巴巴DevOps落地实际一本通。 返回:https://developer.aliyun.com/...,下载完整版电子书。 云端开发在阿里的典型利用场景,云端开发指开发者可基于云平台实现编码、测试、公布等研发流程。一个残缺的云端开发平台不仅是提供了一个云端的编码环境,还提供了一整套研发工具和配套设施,让开发者做到在云端即可实现应用程序的需要、编码、测试和运维的全生命周期治理。

September 10, 2021 · 1 min · jiezi

关于开发:来啊来魔改啊人生重开模拟器一键托管上线

简介: 云开发平台将“人生重开模拟器”fork到了云开发的仓库了,用户只须要间接fork到本人的仓库当前就能够在云开发平台上进行疾速魔改和一键部署,绑定本人的域名就可能让小伙伴们一起来感触你的魔改创意哦。 人生无奈重来,游戏能够重开!人生重开模拟器莫名其妙就火了,这是款纯文字MUD游戏。玩家开局能够从10个各具特色的天才里选中3个,并为本人的4项属性(颜值、智力、体质、家境)调配点值就可能重开你的人生。你齐全无奈意料本人会有怎么样的经验,比方2岁吃不饱饭死了、政府要求5点放学、家庭艰难、吃不饱饭、进入监狱、一会有女朋友、一会交一个男朋友等等,这款游戏还有很多十分厉害的暗藏终局! 这个游戏的全貌就是全程点点点,如播放 PPT 个别从诞生到死亡,没有美术、没有音效、甚至没有广告。但它魔性的随机文本词条混搭着平平淡淡的日常,偶然还会存在奇奇怪怪的开展,让我一心想摸索一下人生的边界,重复重开,重复筛选天才、配置属性,总想体验不一样的人生,一不小心就轮回了几百次。一玩就上瘾,重开了快 300 次人生,也逃不过究竟平庸的命运,还是没有体验到开挂的人生。那来啊,来魔改啊,长生不老版、升仙版、音效版,你都能够领有。 云开发平台将原我的项目fork到了云开发的仓库了,用户只须要间接fork到本人的仓库当前就能够在云开发平台上进行疾速魔改和一键部署,绑定本人的域名就可能让小伙伴们一起来感触你的魔改创意哦。 人生重开模拟器的实现逻辑剖析这个游戏的repo里一共就不超过10个js文件,没有应用任何简单的库,只是用jQuery和css简略的拼了一个前端而已,惟一简单一点的中央是游戏逻辑解决。 首先,游戏数据,如天才和事件等,是寄存在data目录下:外面有游戏数据相干的xlsx与json文件,如每个年龄可能产生的事件、各个事件产生的条件、天才等等。作者还写了一个脚本文件utils/xlsxTransform.js用于将xlsx文件转化为json,不便读取。 钻研一下这个表格,咱们能够发现,人物的根底属性有这么几种: CHR(Charm): 颜值INT(Intelligence): 智力STR(Strong): 体质MNY(Money): 家境SPR(Spirit): 高兴LIF(Life): 生命事件的产生可能会带来颜值、智力、体质、家境的变动。 生命的变动只有“-1”。包含“你死了”和“飞升天界”两种状况。所以修仙胜利的敌人们不要太得意。你认为的位列仙班,没准就是被天道采摘成熟果实呢?“有某事件时能力被随机到”和“有某事件时肯定随机不到”造就了命运迥异的农村线、城市线、美籍华人线。天才(TLT, talent)对于事件的产生也有影响,如城间高楼必然出世在城市。产生事件后,可能会依据前置事件和人物属性走向不同的分支。例如“你受到了一位老师的猥亵”事件在人物 INT>7 时会走向“你报了警,老师被刑拘”反之则是“你逐步低沉,但不敢和其他人说。”其次游戏的次要代码都是在src目录下: 你能够先从 src/index.js 开始了解,这个文件就干了两件事: 读取方才提到的 data 下的 json 游戏数据,绑定为全局变量;绑定一个全局的 banner handler。初始化 app。import App from '../src/app.js'; window.json = async fileName => await (await fetch(../data/${fileName}.json)).json(); // Pssst, I've created a github package - https://github.com/brookesb91...window.hideBanners = (e) => { document .querySelectorAll(".banner.visible") .forEach((b) => b.classList.remove("visible"));}; const app = new App();app.initial();而后你能够顺着去读 src/app.js 的代码,外面就是次要的前端 jQuery 局部,负责生成视图并绑定函数,基本上大部分前端的逻辑都在这里。举个例子,上面这段代码: ...

September 10, 2021 · 1 min · jiezi

关于开发:基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP-Gateway-方案和思路

为什么做这个? 今年初接到一个我的项目工作,客户要求在本人的音视频平台零碎中集成webrtc性能(原零碎是基于SIP协定开发的,曾经稳固运行多年,有很多客户)。在比对了多家RTC产品的成果后,。他们对声网音视频DEMO成果后十分称心,指定要求用声网的SD-RTN传输网络,全面革新客户端软件。据客户实测,在某些国家和地区,同样网络环境下比微信要好很多,比方在东非和中国之间语音通话,提早很小、声音也更清晰。 话不多说,先列下客户要求和以后产品的问题:1、要求全面革新Android、IOS、Windows、MacOS、Web版5个平台的客户端软件,原来的客户端别离是基于Pjsip、Linphone、Sipjs开发的;2、要求在网络环境差的中央,也能满足清晰语音通话的要求(声网专为此而生);3、最小侵入性,尽量不扭转服务器端的零碎性能,实现客户无感降级;4、解决SIP协定常常碰到丢包、被过滤UDP等无奈呼叫,或者呼叫听不清的问题;5、解决SIP服务器常常被尝试攻打呼叫、歹意扫描注册攻打等行为,进步零碎稳定性;6、实现WebRTC协定和SIP协定的双向互通,既要兼容SIP呼叫,反对RTC客户端送呼叫到SIP Server,也要反对SIP Server呼入到客户端软件(在声网的音视频实时传输网传输)。. 其实刚接到需要的时候,大家一起探讨剖析过,感觉这种我的项目看着有不少估算,然而要做的是全平台的客户端,开发工作沉重,要思考的细节也比拟多,没准是个坑,能不能达到客户冀望难说,少数共事不倡议做。而后在领导和客户一起去happy一晚后,这活儿不晓得怎么就接了下来。老板理由很简略,这也不做那也不做,那咱们能够做什么?如果谁都能做,客户还会找咱们吗?那就干吧,马上口头,各种查资料,翻阅声网的技术开发文档,并征询声网的技术同学。2天后拿出初步计划。 零碎架构图解决思路:1、本人写信令模块,放弃灵活性,简略实现:开发TCP Server承当信令服务器;2、外围是开发一个SIP2WebRTC/WebRTC2SIP协定转换网关,保护一个状态机;3、开发音视频编解码处理器,解决声网语音和SIP语音编码互通;4、开发一个状态治理模块,SessionManger,以保护客户端的状态IP+端口;5、联合声网的音视频SDK,集成本人的信令模块,实现和WebRTC2SIP 模块通信;6、自定义常见的SIP呼叫信令,供各平台客户端保持一致。罕用的SIP 信令有:1注册、2呼叫、3接听、4挂断、5拒接、6勾销、7Hold、8DTMF、9用户未反映、10用户离线、11Transfer、12会议(我简略介绍后面的6个) 咱们暂且把这个零碎命名为 WebRTC2SIP Connector 或者SIP2WebRTC Connector吧。至于为什么这么叫,我也不晓得,可能叫XX Gateway的太多了,不这么叫显不出声网的SD-RTN有多牛X,我是他爹,想叫什么都能够。 理清思路后,咱们须要确认几个外围问题:1、以哪个平台的SDK为根底开发这个WebRTC2SIP Connector 外围模块?2、Agora SDK是否反对多并发呼叫?3、声网的语音编码格局和视频编码格局是什么?采样率多少?4、SIP客户测有没有什么具体的编码要求?客户可承受固定一个语音编码,我抉择PCMA 这里特别感谢一下声网,对咱们这种小众需要做出了疾速响应,也感激声网技术支持同学Nemo,专门来到公司交换了几个小时,并分享了一些技术信息。他倡议咱们:1、用Agora Windows SDK 或者 Linux SDK 开发协定转换模块;2、2个SDK都反对多并发呼叫;3、语音是pcm格局,视频是yuv格局;采样率是48khz 到这里心里有数了,简要文字描述下大略流程就是:1、各客户端SDK启动的时候,发动TCP连贯,登录TCP Server信令服务器, WebRTC2SIP转接模块初始化也发动TCP连贯登录TCP Server ,由TCP Server记录大家的UID,IP和端口等信息。2、呼叫的时候,申请一个房间号,并依据自定义信令格局发动calling 报文,TCP Server收到后,转发给转接模块WebRTC2SIP ,WebRTC2SIP收到后创立1个线程,解析报文,并启动声网的SDK,退出指定房间号,开始读取音频流程,同时启动线程,封装SIP规范报文,发动sip invite申请给电话服务器SIP Server; SIP Server收到呼叫申请就去呼叫被叫电话号码,并返回ring振铃信号;WebRTC2SIP收到振铃信号,封装自定义的振铃信息给客户端SDK,被叫接听后,WebRTC2SIP,启动Media Coder开始解析媒体流,并resample 后,写入到声网的房间外面。实现语音通话。形容个大略,置信能看明确。3、从SIP呼入到声网的SDK,大同小异,反过来。 这里要留神:1、每个终端都要自定义编号;2、每个呼叫都要退出声网的房间channel 实现音视频互通;3、因为编码不一样,所以须要resample 这个很重要,不要接通了没有声音,单方不匹配。4、WebRTC2SIP 模块要多线程形式解决,以实现并发呼叫;5、WebRTC2SIP 模块要保护一个残缺的状态机,给每个通话加惟一编号,不至于出错。 到当初咱们讲清楚了大略的解决方案和技术思路,看到这里,各位客官应该明确了,其实这个做起来没啥难度,至多当初看来是这样的。 基于声网的音视频SDK和FreeSWITCH开发WebRTC2SIP Gateway 报文设计 (二)上一篇咱们提到,罕用的SIP 信令有:1注册、2振铃、3呼叫、4接听、5挂断、6勾销有了这几个报文,电话的呼入和呼出就能够根本实现,其余拒接、DTMF等相似。如图所示: 约定:1、客户端和服务器端JSON格局交互;必传参数:msgtag 是音讯惟一标记,userid是谁触发的,appid 作为一个利用的标记。sign 签名加密 (看状况)2、服务器返回的报文必须包含msgtag \appid\errcode errcode=1 阐明有谬误 errmsg就会有值 ;如果errcode=0 阐明返回后果正确个别是返回的msgtag 是申请的msgtag+”_res”做为辨别3、roomID 是房间号对应声网的渠道号,每个通话报文必须包含roomID 用处是什么本人想。4、callType 是video audio 前者代表视频呼叫,后者代表语音呼叫5、direction 呼叫方向 in 呼入 (SIP Server 把呼叫送到声网的SDK)out 呼出(SDK把呼叫送到SIP Server)6、isSIP yes no 代表这通呼叫是外部呼叫(声网客户端实现) 还是SIP呼叫(走落地) ...

July 6, 2021 · 1 min · jiezi

关于开发:开发人员应该害怕低代码吗

低代码正风行LCDP(低代码开发平台)市场规模大,增长迅速。Forrester预测,到2022年,低代码开发平台市场将从2017年的38亿美元大幅增长增至212亿美元。Gartner预计,到2024年,65%的利用程序开发将波及某种模式的低代码利用程序开发。 驱动低代码风行的四个个性低代码有事后构建的模块通过一个预构建模块库,低代码平台容许开发人员轻松无缝地构建应用程序。这些模块也是可重新配置的,并能够依据操作须要进行更新。企业低代码平台通常还容许开发人员创立本人的定制模块,并将其作为可重用的公司资产在企业中共享。 低代码缩短了开发工夫低代码=更少的代码带来更快的开发工夫。开发人员应用低代码开发平台能够进步工作效率。然而,这并不一定意味着低代码开发人员会被投入到更多的开发我的项目中。相同,它还提供了一个选项,容许破费更多的工夫来收集需要、与利益相关者合作、迭代最终用户验收测试,并最终交付一个更容易被最终用户承受和青睐的产品。 低代码容许平滑合作业务用户和开发人员从不同的角度对待一个我的项目,但他们都奉献了价值,应该激励二者之间的单干。低代码开发平台通过提供业务用户能够解释和了解的可视化设计工具,能够促成开发人员和业务用户之间的合作。 例如,能够应用相似流程图的设计工具来设计业务流程。从业务用户的角度来看,流程图示意由人员或零碎执行的高级性能的逻辑流。从开发人员的角度来看,工作流中的每个节点可能代表一个事件,该事件将在将工作流转换到下一步之前触发蕴含某种逻辑模式的服务。同样的设计工具能够使业务用户了解设计是否适宜业务流程的需要,以及作为执行工作流自身的开发环境的开发人员的需要。 低代码在云端和本地都可运行许多低代码开发平台在云中作为基于SaaS的解决方案运行。基于云的解决方案能够很快地建设起来,并且简直不须要保护。然而,许多公司更喜爱或甚至可能规定一个外部选项,以便他们能够在本人的公共云提供商(如AWS、谷歌或Azure)上部署应用程序,或者在局域网的企业防火墙后部署应用程序。在抉择外部部署的背地可能有许多正当的平安、隐衷或技术相干的起因。 低代码会取代开发人员吗?低代码开发平台性能日益弱小。然而,它们的目标是让开发人员更有效率,而不是取代他们。理论状况是,低代码的设计是为了取代可反复的流程和性能。特定用例所特有的流程和性能依然须要一些手工编写的代码。低代码可能会让你做到99%的进度,但剩下的1%对于实现工作是最重要的,并且最终是你的我的项目或业务流程区别于其余我的项目或业务流程的中央。 应用低代码的开发平台,开发人员将破费更多的工夫来实现更高价值的工作,例如与相干方合作,了解业务需要,迭代用户验收测试,以产出交付非凡价值的解决方案。 开发团队如何最大化低代码工具?造就单干文化尽早确定业务用户如何参加低代码开发我的项目。例如,业务用户能够通过间接在低代码平台自身中设计业务流程来提供帮忙。因为业务用户和开发人员都应用雷同的设计环境,开发人员将可能疾速确定所提议的设计的问题,并就所提议的实现给出反馈或要求廓清。 民主化倒退低代码平台能够为开发人员在我的项目中调配的工作提供更大的灵活性。在某些状况下,前端开发人员可能成为全栈开发人员,反之亦然。 现实状况下,如果低代码平台也反对多语言开发,那么就能够在人才库上领有更大的灵活性,并基于这个人才库进行我的项目开发。 在低代码平台中寻找机会请记住,低代码工具的存在是为了帮忙开发人员。当一个平台被正当应用时,开发人员的工作效率就会进步,并且能够为其余重要的事件调配工夫,比方与相干方的合作。 平息恐怖到往年,低代码市场的市值将靠近150亿美元,而且短期内不会放缓。但这并不意味着开发人员应该胆怯低代码——远非如此。LCAD平台的建设有助于让他们的生存更轻松,并防止他们编写反复的、千篇一律的代码的麻烦。开发人员应该找到利用LCAD平台的办法,而不是放心这种毁坏。这对他们来说是一个很好的机会,来最大限度地缩短他们的开发工夫,并找到节省时间的办法来构建其余产品和应用程序。

May 31, 2021 · 1 min · jiezi

关于k8s:万字警告-k8s入门理应Pod先行

大家好,欢送来到小菜集体 solo 学堂。在这里,常识收费,不吝排汇!关注收费,不吝入手!死鬼~看完记得给我来个三连哦! 本文次要介绍 kubernetes中pod的应用 如有须要,能够参考 如有帮忙,不忘 点赞 ❥ 微信公众号已开启,小菜良记,没关注的同学们记得关注哦! 上篇文章咱们说到如何搭建 k8s 集群,不晓得看完的小伙伴有没有本人去尝试一下呢! 不要让贫困扼杀了你学 k8s 的趣味 这篇咱们本着虎头蛇尾的准则,持续带你搞明确 k8s 中的pod ,成为他人家的程序员~ 咱们老样子,先回顾下 k8s 中存在的几种组件: 那咱们还得理解一下 k8s 中几种常见的资源: Master: 集群管制节点,每个集群都至多须要一个 master 节点负责集群的管控Node: 工作负载节点,由 master 调配容器到这些 node 节点上,而后 node 节点上的docker 负责容器的运行Pod: kubernetes的最小管制单元,容器都是运行在 pod 中的,一个pod中能够有 1 个或多个容器Controller: 控制器,通过它来实现对 pod 的治理,比方启动 pod,进行 pod,伸缩 pod 的数量等等Service: pod 对外服务的对立入口,能够保护同一类的多个 podLabel: 标签,用于对 pod 进行分类,同一类的 pod 会领有雷同的标签NameSpace: 命名空间,用来隔离 pod 的运行环境这几个概念先初步有个理解即可,接下来便是对每个概念开展阐明的时候~那么,正片开始! Kubernetes一、资源管理在 kubernetes 中,所有的内容都形象为资源,用户须要通过操作资源来治理 kubernetes 对于对 资源管理 的了解,咱们须要理解以下几个概念: ...

April 25, 2021 · 6 min · jiezi

关于金融:代码回现-如何实现交易反欺诈

一、背景概述交易反欺诈是VoltDB实用场景之一,是典型的事件驱动的业务,外围是摄取高频的交易数据,并逐条对交易进行一系列简单的反欺诈规定校验,最终生成评判交易可疑度的分值,发送给上游业务零碎,触发交易拦挡动作。反欺诈规定中波及大量的通过剖析历史交易生成的指标项,在VoltDB中进行流式计算,可基于本地保留的丰盛的上下文数据对事件进行剖析决策,使实时计算凑近上下文数据,取得性能劣势。 二、实例回现上面咱们通过一个刷卡的利用,展现VoltDB是如何实现一个简略的反欺诈用例的。为了让示例代码更加简洁,又能突出VoltDB的性能,这里应用一个地铁刷卡的场景代替金融交易(如信用卡刷卡),以防止引入过多业余的金融业务知识。同时一个忙碌地铁零碎产生的交易吞吐量不可小觑,定义的反欺诈规定也更容易了解。能够通过这个链接来拜访具体的代码https://github.com/ssomagani/...在这个利用中,模仿如下几个场景: 多辆列车在地铁站点之间运行,生成列车进站事件。通过这个场景能够理解,如何将数据公布到VoltDB Topic中,以及如何生产Topic中的数据。公交卡充值操作。通过这个场景,能够理解,如何应用一个蕴含自定义业务规定的procedure来解决Topic中的数据,同时应用Stream对象将数据导出到Topic中,并通过视图对Stream中的数据流进行统计,生成实时的统计报表。视图会逐条统计Stream中的流数据,将处理结果保留到视图中,是VoltDB实现流式计算的形式之一。乘客刷卡乘车,生成高频交易数据。通过这个场景,能够理解,如何应用VoltDB数据库客户端api间接操作数据表(区别与将数据发送到Topic中),保留交易数据。如何通过VoltDB的java procedure定制反欺诈校验规定,并调用java procedure进行交易校验和反欺诈行为。让咱们来具体理解一下,在VoltDB中运行这个用例的过程。2.1筹备工作1. 启用VoltDB Topic性能VoltDB提供一个对立的配置文件,次要的个性都能够在其中进行定义,如:长久化、高可用、安全性等等,这里次要介绍与案例相干的VoltDB Topic性能。如下配置开启了Topic服务,并在服务器上开启端口9999,用于承受客户端发来的音讯。 <Topics enabled="true"> <properties> <property name="port">9999</property> <property name="group.initial.rebalance.delay.ms">0</property> <property name="retention.policy.threads">1</property> </properties> <profiles> <profile name="retain_compact"> <retention policy="compact" limit="2048" /> </profile> </profiles> </Topics>2.依据特定配置文件启动VoltDB3.创立Topic,Topic的用处前面的代码剖析中提到 CREATE Topic TRAINTOPIC execute procedure train_events.insert;CREATE TOPIC RECHARGE execute procedure RechargeCard;CREATE TOPIC using stream CARD_ALERT_EXPORT properties(topic.format=avro);create topic using stream FRAUD properties(topic.format=avro,consumer.keys=TRANS_ID);4.创立数据表在解决实时事件流时,能够充分利用底层的数据库引擎,充分利用本地关系型数据进行数据分析,失去反欺诈业务指标。在本例中将创立如下数据表和视图(省略具体DDL)5.初始化数据通过VoltDB的数据导入性能,从csv文件中初始化站点和列车 csvloader --file $PROJ_HOME/data/redline.csv --reportdir log stationscsvloader --file $PROJ_HOME/data/trains.csv --reportdir log trains2.2 代码剖析-列车运行在这个场景中,客户端模仿8辆列车在17个站点之间运行,产生进站事件并发送到Topic。因为设定的列车进出站工夫比拟短(微秒为单位),所以会产生高频事件流。在服务端,VoltDB实现:1.音讯接管2.生产音讯3.将列车进站事件记录到数据库中在客户端,通过java类TrainProducer生成多辆列车进站事件,并将事件发送到VoltDB Topic中。TrainProducer的执行命令如下: java metro.pub.TrainProducer localhost:9999 TRAINTOPIC 8TrainProducer类接管四个参数: .指定接管列车进站和离站事件的VoltDB服务器端口。这里假如在同一台机器上运行client代码和VoltDB,而后面在VoltDB配置文件中咱们曾经指定Topic的监听端口是9999。指定VoltDB broker指定数据发送的Topic名称。指定要模仿的列车数量。剖析一下TrainProducer的次要办法,main办法生成10个线程,每50毫秒执行一次publish()办法,将列车进出站工夫发送到Topic“TRAINTOPIC”中。 public static void main(String[] args) { ScheduledExecutorService EXECUTOR = Executors.newScheduledThreadPool(10); TrainProducer producer = new TrainProducer(args[0], args[1], Integer.parseInt(args[2])); System.out.println("Scheduling trains"); EXECUTOR.scheduleAtFixedRate ( () -> { producer.publish(producer.getNewEvents()); }, 1, 50, MILLISECONDS); }跟踪代码找到producer的定义,它其实就是原生的KafkaProducer,所以能够看到VoltDB Topic齐全兼容kafka api。而brokers即是main办法中的传参localhost:9999,因而下面producer.getNewEvents()办法生成的数据将被发送到VoltDB Topic中。 ...

April 14, 2021 · 8 min · jiezi

关于开发:RTThread学习笔记-5RTThread线程间同步学习过程总结

多线程之间同步是继多线程学习之后,须要重点把握的又一个重要内容。一个实时操作系统外面,如果只有多线程而没有线程间同步,各个线程都无序运行,那么必然会导致整个零碎的运行呈现各种问题。 正是因为一个较大的工作拆分为多个小工作,这些小工作是由多个线程去执行的,那么,这些小工作之间必然会存在着千头万绪的关系,小工作的运行更不能只管自扫门前雪,不论别人瓦上霜,因而,线程间同步是必须把握的内容。 对于多线程之间的同步,RT-Thread提供了比拟丰盛的文档作为参考,具体能够查看以下链接:https://www.rt-thread.org/doc... 本文尝试从以下几个方面总结一下RT-Thread线程间同步的学习过程什么是线程间同步,为什么须要线程同步? 上一篇文章RT-Thread学习笔记 -- (4)RT-Thread多线程学习过程总结外面提及到,音乐播放器通过多线程工作的时候,须要通过正当的调度形式,能力让各个线程协同工作。而这里所说的“正当的调度形式”,其中一种形式就是指多线程同步。 什么是线程间同步?艰深一点来说,线程间同步是指多个线程之间进行协商工作的形式。后面曾经说过,线程在工作的时候,尽管只分心在做一件事件,但线程在工作的时候,并不能只埋头苦干,而不顾其余线程的状态,因而必须要有一种形式,来告知其余线程对于本身的工作状态。 为什么须要线程同步?持续用音乐播放器来举例说明,依照前文的图例,如果不应用多线程播放音乐,会有什么结果呢?结果有可能是,音乐文件读取线程比歌词文件读取线程跑得慢,导致歌曲还没播放到那一步,而歌词反而先显示进去了,还有其余可能性,导致歌曲,歌词,MV三者播放的程序乱套了,不能同步显示。 如果要让音乐播放能失常工作,就须要在4个工作线程之间退出线程同步机制。比方歌词文件读取线程可能运行得比拟快,而音乐文件读取线程读取音乐比较慢,那么,这两个线程之间就须要进行同步,快的线程要略微等一下,等慢的线程发送一个同步音讯,这样两者能力一起欢快地持续运行。线程间同步的形式 针对RT-Thread实时操作系统,线程间同步次要有三种形式:信号量,互斥量,事件集。这三种线程同步机制各有优缺点,在理论开发工作外面,须要依据不同的利用场景进行辨别应用。 信号量是一种非常灵活的线程同步形式,通过信号量能够衍生出多种性能,比方,锁、线程同步、资源计数,前面讲述的互斥量也能够通过二值型信号量来实现。生存中的停车场利用场景,就是信号量的一种具体体现。 1.当停车场空的时候,停车场的管理员发现有很多空车位,此时会让里面的车陆续进入停车场取得停车位;2.当停车场的车位满的时候,管理员发现曾经没有空车位,将禁止里面的车进入停车场,车辆在外排队等待;3.当停车场内有车来到时,管理员发现有空的车位让出,容许里面的车进入停车场;待空车位填满后,又禁止内部车辆进入。 在这个场景外面,管理员就相当于信号量,管理员手中空车位的个数就是信号量的值(非正数,动态变化);停车位相当于公共资源(临界区),车辆相当于线程。车辆通过取得管理员的容许获得停车位,就相似于线程通过取得信号量拜访公共资源。 信号量是没有“所有权”这种概念的,也就是说,对于一个非二值型的信号量,多个线程能够对其进行获取/开释操作,也能够递归获取信号量,因而,对于非二值型信号量,在应用过程中可能会呈现线程优先级翻转和线程死锁的问题。 零碎内核提供以下信号量的API函数接口,如下图所示。 互斥量,顾名思义,就是一种互相排挤的信号量,是一种非凡模式的二值型信号量。这种状况就相似于一个停车位,当A汽车占据了停车位(获取到互斥量)的时候,其余汽车就不能获取该车位了,必须等A汽车来到该车位的时候,能力有机会抢夺该车位。 互斥量跟信号量不同的是,互斥量只有两种状态值,对于领有互斥量的线程,示意该线程曾经领有了该互斥量的所有权和控制权,该互斥量只能由该线程来进行开释,这样就能够解决线程递归获取互斥量呈现的死锁问题。 对于信号量中存在的优先级翻转问题,在互斥量外面不会呈现,这是因为互斥量外面实现了高优先级继承算法。优先级继承是通过在高优先级线程尝试获取共享资源而被挂起的期间内,将低优先级的线程的优先级晋升到高优先级线程的优先级别,从而解决优先级翻转引起的问题。 零碎内核提供以下互斥量的API函数接口,如下图所示。 事件集也是线程同步的一种机制,但与信号量或互斥锁不同,事件集是能够实现一对多或多对多同步的。也就是说,一个线程收回一个(或多个)事件,一个(或多个)期待该事件的线程在获取到该事件后,就能够取得运行的权限。 事件集是应用一个32位无符号整型的变量来示意的,每一个位示意一个事件,这些事件能够是“逻辑与”或“逻辑或”的关系。换句话说,就是能够让一个线程期待一个事件(逻辑或)达到就执行,或者让一个线程期待所有事件(逻辑与)达到才执行。 事件集在某些场合外面是能够代替信号量的。但事件集与信号量不同,事件集的事件在革除之前,是不能累计的,也就是说,一个线程发送了屡次同一事件,因为不能累计,也就相当于只发了一次该事件,直到该事件被革除。 零碎内核提供以下事件集的API函数接口,如下图所示。多线程同步的利用示例 多线程同步的利用示例,次要是为了验证信号量,互斥量,事件集的API接口函数,并且通过试验景象察看这三种线程同步形式的运行状况。 示例源码下载链接:https://github.com/embediot/r... 信号量示例次要演示了一个“生产者-消费者”的设计模式,生产者线程一直生产产品(数值加1)放入仓库(循环数组),消费者线程一直从仓库外面取出产品,仓库的读写操作都须要应用信号量的锁机制进行同步。 互斥量示例次要创立了三个动静线程,这三个动静线程一直抢夺这个互斥量的使用权,通过试验景象能够察看到,持有互斥锁的线程的优先级,会通过优先级继承算法,调整到期待线程优先级中的最高优先级。 事件集示例次要初始化了一个事件集和两个线程,一个线程发送事件,另一个线程期待事件。期待事件的线程,别离应用了“逻辑与”和“逻辑或”这两种事件接管形式。 具体示例的实现能够查看工程源码,在synchronize.h头文件中,关上相应的宏定义开关,从新编译工程并下载到开发板即可。线程间同步的注意事项 在进行多线程间同步的时候,对于信号量,互斥量,事件集这三种线程同步形式,有以下一些注意事项:1.中断与线程间的互斥,不能采纳信号量(锁)的形式,应该采纳开关中断的形式。 2.资源计数类型的利用场景,少数都是混合形式的线程间同步,因为单个的资源解决存在线程的多重拜访,因而须要对资源进行锁形式的互斥操作。 3.在应用信号量的时候,应该要留神优先级翻转的问题,合理安排工作的优先级。 4.不能递归获取信号量,否则有可能会造成“死锁”的状况。 5.线程不能长时间占用互斥量,在取得互斥量之后,不能再更改持有互斥量线程的优先级。 6.不能在中断服务程序外面应用互斥量。 7.事件集仅能用于线程同步,不能用于线程间传输数据。 8.事件集不会造成队列,在革除事件之前,发送屡次跟发送一次都是同样的成果。 原文链接/;https://club.rt-thread.org/as...

March 12, 2021 · 1 min · jiezi

关于开发:『力荐汇总』这些-VS-Code-快捷键太好用忍不住录了这34张gif动图

之前写过三篇文章,播种了极其不错的浏览量与转发量: 你真的会用 VS Code 的 Ctrl、Shift和Alt吗?高效易用的快捷键:多光标、跳转援用等轻松搞定VS Code 中的 Vim 操作 | 无需批改 VSC 默认快捷键 | 罕用组合与逻辑跳转援用、禅模式...VS Code 中 11 个快捷键/操作,让你的效率与舒适度翻倍!一方面,我的确将 VS Code 作为本人的主力编辑器:近程操作时用、写笔记时用、写代码(C++/Python/JavaScript)时也用,我曾经具备了些许心得与教训;另一方面,本人也很喜爱积攒或浏览相干材料(比方韩骏老师的《Visual Studio Code 权威指南》),并且在实际与学习中做成笔记(比方录制gif)。 本文将汇总我录制的 34 张 gif 动图,为读者敌人举荐并整顿『远离鼠标,晋升效率』的 VS Code 快捷操作。 本文纲要: 6 个 Ctrl+Shift+Alt 组合8 个你可能不晓得的重要操作3 个乏味又通用的小众插件5+ 的 vim + vscode 操作6 个 Ctrl+Shift+Alt 组合CtrlCtrl 管制屏幕的挪动与光标的挪动。 Ctrl 加上左右键,以单词为单位跳转。 Ctrl 加上高低键,小幅度滚动屏幕(滚动一行)。 ShiftShift 相当于「拖动鼠标」,与方向键联合选中文本。 有了 Shift ,不再用鼠标拖动。 AltAlt 较为非凡。 Alt 与高低键联合,英文叫做「copy line」,相当于拖着这一行高低挪动。 ...

March 5, 2021 · 3 min · jiezi

关于开发:DDD上吊绳驱动开发开发要想不被吊死该如何自救-IDCF

话题缘起明天在DevOps案例深度钻研探讨群里,群友们围绕一种开发模式开展了探讨:DDD(Deadline Driven Development),期限驱动开发,大家仿佛更违心将其翻译成“上吊绳驱动开发”。 这种开发模式是说在接到新的需要后,给开发者脖子上加一根绳子,这根绳子会随着工夫收紧,如果规定工夫内没有实现开发工作,开发者会被“吊死”。 好吓人,开发咋还有绳命危险了呢....麻麻,我要回家! 下图是中英文对照。 “咱们始终在实践中探寻更苦逼的软件开发办法,继续加班的同时也帮忙别人加班...” what!“帮忙别人加班”这是什么神仙操作,这位翻译同学你! 另外,群友针对价值观有补充解释: 预算内,挑战预算内算优良,带buffer预算内算实现;范畴内,实现要害需要算实现,实现所有需要算优良;预期内,打算工夫内实现为优,不影响业务理论应用工夫为实现。“DDD 上吊绳驱动开发”的劣势尽管称其为“上吊绳驱动开发”有一些戏谑的成分,但其中体现的是一种“倒排期”的开发方法,在项目管理中列出每一个开发工作必须要实现的工夫节点,不影响下一个工作或其余合作人员的工作进度,“倒排期”开发在很多开发团队中都有利用,其劣势就在于: 1、须要自上而下的指标拆解,将一个整体的指标拆解为具体可执行的工作工作,这很像OKR工作法中的工作拆解思路,这样的益处在于每个人都很清晰本人当下要做什么,实现之后对下一个环节有什么影响,以及咱们最终要做什么,工作指标就是达成这个可预期的工作后果,这会让开发过程更加靠谱和高效。 2、明确的工作实现工夫和工作内容,让每个人都有清晰的工作指标,在麻利工作法里,咱们通常会用看板的形式来跟进要害工作的进度,只管在工作过程中有些需要会产生变动,但大家放弃一个高频的沟通会进一步升高项目风险。 3、有了明确的死线,或者说上吊绳勒紧的工夫当前,大家会更加专一,更少去响应一些无关的或非重要不紧急的需要,这会让每一个执行人员专一于手中的工作,而不会有过多的想法导致整个我的项目进度变得拖沓。 如何做到“DDD上吊绳驱动开发”如果咱们要在团队中去执行上吊绳驱动开发的办法,也就是给每一个工作确定一个实现的死线,须要做好什么前提呢? 咱们认为会有3个关键点: 首先,依据指标和估算做清晰的工作拆解。这里蕴含3个步骤, 一是对最终目标有一个清晰的意识,团队内通过头脑风暴的模式达成共识;二是做好需要治理和排序,砍掉不必要的需要保留要害需要,同时对每个阶段须要实现的需要做梳理;三是确定需要实现的先后顺序,依据整体我的项目交付工夫倒推做各工作的工夫排序。一个我的项目通常会波及到多个主线,梳理分明每个线程间的协作关系和流程,同时应用麻利小组的工作形式和指标拆解思路来保障工作的清晰、精确以及合作上的高效。 其次,及时沟通我的项目过程中的问题,始终保持最小化可交付的理念去推动。在工作执行和推动的过程中,经常会产生一些意外状况影响我的项目进度,基层人员有可能会把这个事件想得特地简单,那么作为推进者就须要放弃沉着思考,时刻以最小化可交付和最小化试验验证的理念来推动工作,防止产生甚至去满足有效需要。 第三,工作安顿要分为抬头看和低头看2个阶段。抬头看阶段是一个新我的项目的初始期,这是一个摸着石头过河的阶段,通向对岸的路有很多,但你不晓得你抉择的那个上岸的点肯定会有石头让你踩,这个阶段要算清楚咱们有什么,咱们能做什么,尽快尝试去往前走一步。 到了下一个阶段就须要低头看,晓得了哪条路有石头能够踩当前,就要找到一个最佳的上岸地点,排兵布阵地走过来,达到目标。 第三点在拆解工作和做工作排序时,两个阶段都要快,但不能乱,否则可能导致我的项目过程中呈现很多无奈实现或者有效的工作,节约死线内的工夫。 总结驱动开发工作效率晋升的办法有很多,除了明天探讨的DDD(上吊绳驱动开发),还有PDD(屁股驱动开发),TDD(踢人驱动开发),TPDD(踢人屁股驱动开发)MDD(骂人驱动开发)BDD(哔哔驱动开发)...你认为哪一种驱动开发的形式更高效呢?去留言区写下你的认识吧~ 起源:IDCF社区

March 5, 2021 · 1 min · jiezi

关于开发:URP从原理到应用基础篇

1.1 前言Unity目前曾经反对了将近30个游戏平台,这就意味着内置渲染管线必须同时反对所有平台,平台之间的差异性导致内置管线越来越臃肿不堪。引擎每次对特定平台的管线批改都必须思考其余平台的兼容性(必定会用到各种if else条件,或者宏预编译判断),内置渲染管线无奈对开发者提供一些定制化批改接口,一般开发者无奈去学习渲染管线,导致大部分开发者对这块常识都很匮乏,不利于个人成长。 Unity自2018推出SRP(可编程渲染管线),从它诞生那一天起就被贴上了高性能、高拓展性、高定制化的标签,这是具备跨时代意义的。Unity在C++凋谢出更底层的渲染接口是SRP的根基,持续对外开出C#接口让使用者能够充沛定制,这里的使用者也包含引擎开发者,将代码从C++中剥离到PackageManager中不仅能够对引擎做一个瘦身,如果呈现Bug也不须要从新公布引擎,只须要从新公布URP的Package包即可。另外,挪动端和主机芯片从设计上就截然不同,强行把它们揉在一起用一套渲染管线,无奈充沛兼顾性能与成果。在SRP的加持下Unity推出了面向通用平台的URP渲染管线,和面向主机平台的HDRP高清渲染管线,进一步让开发者对管线进行充沛定制与优化。 1.2 SRP简介为了让指标平台充分发挥性能与成果,Unity自2018版本提供了SRP全称Scriptable Render Pipeline(可编程渲染管线),Unity将C++调用渲染API (如:OpenGL ES)的接口尽可能做到浅封装并且对外开放C#调用接口,这样就能够编写C#脚本来管制Unity渲染的每一帧。SRP并没有间接提供相似对接OpenGL ES的接口,所以并不能随心所欲,有些货色仍然是做不到的。 基于SRP技术,Unity开发了URP(通用渲染管线)和HDRP(高清渲染管线),这样在性能高端的PC主机上能够应用更好的渲染成果。将来在手机上也能够反对HDRP,HDRP上的好成果也能够自行移植到URP,渲染管线是跑在CPU上的而非GPU,GPU硬件也有一套本人的渲染管线,两者是不同的。这两年手游上也有基于GPU Driven的渲染管线裁减技术的案例,有趣味的敌人能够去互联网上找找。 HDRP的指标是为高端平台,如主机、PC平台提供震撼的视觉效果,高端的成果必然对硬件的算力有肯定要求,它同时反对前向渲染和提早渲染技术,内置了大量3A游戏的渲染成果体积光、体积雾、大气散射、光线追踪、次外表散射和SSAO等,所用到的技术包含Visual Effect Graph特效编辑器、Shader Graph可视化着色器编辑器、Timeline、Cinemachine以及Post Processing Stacks后处理,根本是包罗万象。HDRP将来也会反对挪动设施,挪动设施也分高端机和低端机,在高端机或VR上也能够应用HDRP的一些高端成果。 Unity官网的数字人异教徒 URP的指标平台并不齐全是挪动设施,而是所有平台。最开始被称为轻量渲染管线--Light Weight Render Pipeline,简称LWRP。很多开发者就会有误会,LWRP是不是就意味着性能更强劲,其实这个论断不完全正确,甚至使用不当有可能还不如内置渲染管线。 起初Unity将LWRP更名Universal Render Pipeline,简称URP。自Unity 2021版本后,内置渲染管线将不再进行保护,将应用URP齐全代替它。市场上的开发者要想齐全切换URP可能还得一段时间,比方Asset Store上的插件,大量渲染教程,这些大多都还是基于内置管线的。 URP游艇反抗 URP提供的渲染成果也没有HDRP多,比方体积光、体积雾、大气散射、光线追踪、次外表散射等目前都没有提供,在新版本URP中曾经提供了SSAO和Shadow Mask性能。而且HDRP提供了成果也能够自行移植到URP中来, URP从设计上摈弃了很多内置管线的缺点,这也导致了一些本来内置管线有的货色却在URP上实现不了,我置信随着版本的迭代,这些都不会是问题。最重要的是URP和HDRP的C#局部代码都是开源的,开发者也能够基于SRP实现一套独有的渲染管线,这样性能与成果就能够达到最佳均衡。 在正式进入学习之前咱们先来致敬一下Unity的首席图形渲染大佬Phli_lira(费利佩·里拉),他是URP和Shader Graph的作者,我在学习URP的过程中谷歌搜寻问题,每次都能看到他的具体答复,在论坛里他和大量开发者交换,解答了很多人心中的纳闷。 费利佩·里拉(图片来自领英) 大佬本人开源了一套本人基于URP的工程: https://github.com/phi-lira/UniversalShaderExamples 这个例子非常适合初学者学习,它并不像Unity内置的Lit.shader那样互相关联了一大堆文件看起来会十分吃力,而是从少到多一点点加的。都是从最根底基于URP的Shader拓展进去的,包含自发光、暗影、MatCap环境反射、屏幕空间UV、Lit PBR、车漆。 还要感激另外一位大佬,就是From Built-in URP这篇文章的作者,URP在文档中并没有具体阐明着色器在Built-in管线的函数如何1:1替换成URP管线的函数,这篇文章作者写得十分分明,在移植管线的时候帮了咱们大忙,不晓得为什么这篇文章目前网上曾经找不到了(知乎上能找到有人翻译的文章), 我过后在给组员讲URP的时候有保留过一份,刚好在这里也在分享一份离线的。 2020年11月我在北京UUG上分享了案例《SRP到URP从原理到利用》,惋惜过后没有录像,有趣味的小伙伴也能够返回UWA学堂查看下载相干PDF。 《URP从原理到利用——根底篇》全文可戳此浏览

February 26, 2021 · 1 min · jiezi

关于开发:能力识别模型

背景这些年始终在做对外的麻利开发培训,也就是针对其余企业的开发人员进行麻利全栈开发培训,通过造就之后冀望这些开发人员能疾速胜任工作。 然而因为大部分的培训最终产出物可能都是一些评估或者一个分数,它并不能很好的反馈一个人的能力状况,也不能帮忙培训者或者企业更好的辨认每个人的能力。 因而,通过屡次迭代,演绎总结出了一个针对开发岗的能力辨认模型,目标是可能帮忙培训者和企业更好的辨认他们的能力散布。 能力辨认模型是什么能力辨认模型是一个蕴含4种能力,32种形象行为的一个模型。 用于辨认开发岗的开发人员的各纬度能力散布。 4种能力别离是: 技术能力学习能力理解能力沟通能力每种能力对应了8种形象的相干行为,共32种行为。 上面就开展具体说一下。 技术能力顾名思义,技术能力就是指和开发技术相干的各种能力。 它蕴含的上面8种形象行为指的是他/她会在过程中应用到或者被察看到能体现这些行为的facts或事实。 1 - 验收思维 验收思维指的是做事件或者编码时能思考到如何验收。 比方写测试是一种验收,tasking时表明输出和输入是一种验收。 2 - 代码设计 代码设计指的是写代码的时候有代码设计。 比方应用设计模式,比方在Java外面应用stream API,比方有良好的OO设计,比方恪守了SOLID准则。 3 - 独立编码 独立编码指的是能独立编写代码。 比方独立实现Java编程,独立实现react编程,独立实现python编程等。 4 - 整洁代码 整洁代码指的是编写的代码满足clean code。 比方没有显著的坏滋味等。 5 - 实现工作 实现工作就是指的能按时合格实现工作。 比方按时合格实现编程练习,比方按时合格实现非技术的画图工作等。 6 - 解决问题 解决问题指的是能解决遇到的各种问题,包含技术问题,非技术问题等。 比方能应用debug修复遇到的bug,比方能通过看日志或者搜寻等解决遇到的技术问题。 7 - 利用资源 利用资源指的是能利用所有资源来实现工作。 比方向教练求助,向同学共事发问,上网搜寻,应用工具等都属于利用资源。 8 - 摸索新技术 摸索新技术指的是本人能摸索一些新的技术,包含框架,工具,算法等。 比方学习了某种新算法,钻研了某个新工具或者新框架,比方没接触过Jenkins但本人钻研了如何应用Jenkins,比方没写过python但学习python解决了某个问题。 学习能力顾名思义,学习能力就是通过一直学习来欠缺本身的能力。 它蕴含的上面8种形象行为指的是他/她会在过程中应用到或者被察看到能体现这些行为的facts或事实。 1 - 迭代思维 迭代思维指的是做任何事件都能小步快跑,迭代式的实现工作。 比方写代码的时候可能小步提交,比方做我的项目时能迭代开发。 2 - 遵循最佳实际 遵循最佳实际指的是做任何事件都能遵循最佳实际。 比方遵循重构的最佳实际,比方遵循code review的最佳实际,比方遵循TDD的最佳实际,比方遵循站会的最佳实际。 3 - 从别人身上学习 从别人身上学习指的是能学习别人的优良的技术、习惯和思维。 ...

February 26, 2021 · 1 min · jiezi

关于开发:公司的技术总监不写代码凭什么拿这么高工资

国外常常把技术团队负责人叫做 Engineering Managers,国内就形形色色,比方 CTO,技术总监,研发总监,技术经理,技术组长等等,差不多都是技术团队负责人的意思,只不过团队大小,各不相同。 有人问,技术团队的负责人很少写具体代码,为什么还很牛逼的样子,拿这么高工资? 因为程序员的外围能力是写代码的能力,而技术总监的外围能力是技术判断力。简略来讲,就是判断一个我的项目、一个零碎架构、某个技术方向,是否合乎企业以后现状,是否对企业的将来产生价值。 他们所做的技术判断,给公司带来十分高的价值。比方,阿里云创始人王坚博士,在所有人拥护的时候,他保持云计算是将来,帮忙阿里提前布局云计算,为阿里成长为万亿商业帝国,立下汗马功劳。这就是技术判断力,给企业带来的微小价值。 当技术团队倒退到30人左右,有了多条外围产品线、有了多个技术经理时,就须要一个技术总监了。 图源网络技术总监,作为领域专家,站在更高的层面思考技术如何建设壁垒,构建技术竞争力。逐渐开始建设公共技术平台,协调多条产品线在对立的技术平台上疾速迭代,让产品线跑得快、跑得稳。 技术总监,在畛域内有多年积淀,来自出名互联网企业,可能把技术团队带上一个新的台阶。技术总监,更多是做技术判断了,也有些技术型的技术总监依然会写些外围代码、做架构设计。 回到技术总监要不要写代码这个话题,其实也是须要看公司是什么样的背景、处于什么样的阶段、技术总监管理人员的规模来定,有3种状况须要写代码。 第一种,技术驱动型的技术总监须要写代码。很多互联网公司产品,齐全是依赖技术来构建的,公司的命根子都是技术,那么这个技术总监就肯定要参加到外围代码的编写中。 第二种,初创技术团队的技术总监须要写代码。简直所有的守业公司在刚开始的时候,就技术的须要水平是相当紧迫的,所以这个期间的技术总监,肯定要亲自参加其中,确保外围零碎性能不会呈现问题。总的来说,除非是大型技术团队,否则倡议总体还是须要参加到外围代码的梳理中,须要对系统的各个个性了然于胸,晓得零碎很可能呈现的问题点,在呈现问题的时候能够疾速定位解决。在架构设计、外围代码评审、代码优化层面来多做工作。因为如果技术总监齐全脱离代码编写工作,容易导致团队技术失控。

February 23, 2021 · 1 min · jiezi

关于开发:分布式-DBLE-网络模块源码解析三

作者:路路酷爱技术、乐于分享的技术人,目前次要从事数据库相干技术的钻研。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 前言在前两篇文章中,次要讲了网络 IO 的基础知识,以及 DBLE 网络模块的源码剖析,本篇作为 DBLE 网络模块源码解析的第三篇,也是最初一篇,次要对 DBLE 网络模块常识作个简略概括及总结。 DBLE 网络模块次要波及类图咱们先来看下网络模块波及到的次要类图: DBLE 网络模块波及到的次要类图如上图所示,它们的次要性能总结如下: NIOAcceptor:负责承受客户端连贯申请;NIOReactorPool:负责创立及获取 NIOReactor 对象;NIOReactor:次要通过外部类 RW 来解决连贯的读写事件,外部类 RW 中应用 Selector 实现 IO 多路复用,即可能解决多个连贯的读写事件;FrontendConnectionFactory:负责创立前端连贯;FrontendConnection:前端连贯类;SocketWR:负责单个连贯的读写操作。简略来讲,就是 NIOAcceptor 负责接管客户端连贯申请,而后创立前端连贯 FrontendConnection,NIOReactor 则负责监听前端连贯的读写事件,如果有读写事件产生,则交给 SocketWR 进行理论网络 IO 数据的读取,读取到数据后续天然就是进行解决了。整个网络 IO 读写流程大略如此。 DBLE 网络模块概括及总结对于中间件来讲,网络 IO 解决既是关键点,同时也是难点,高性能网络 IO 解决远比设想中的难。 DBLE 的网络 IO 模块是通过原生 JDK 纯手写的,抛开应用网络 IO 框架,更可能让咱们看到网络 IO 解决的实在的、底层的过程。当然并不是说网络 IO 框架不好,理解了网络 IO 的底层原理,再看任何网络 IO 框架,你都能知其所以然,这比你单纯的会用框架,必定是不一样的。 本系列文章总共有三篇,一篇原理介绍,一篇源码解析,最初一篇概括总结,通过本系列文章,心愿不光光帮忙大家理解到 DBLE 的网络解决逻辑,更可能帮忙大家理解更个别的网络 IO 常识,后者对大家的工作帮忙必定更大,最初心愿大家可能有所播种。 相干举荐:分布式 | DBLE 网络模块源码解析(一):网络 IO 基础知识 ...

February 23, 2021 · 1 min · jiezi

关于开发:对DevOps的九大误解你是否也中过招

【摘要】 只管大多数组织曾经胜利地部署了DevOps来实现必要的指标和目标,然而对于这种办法依然存在一些误会,本文将列举九大误会开展形容。DevOps是开发和运维的联合,有助于集成和自动化测试过程以及部署存储库,还提供了透明度以及灵活性。DevOps的指标如下: ●更快的上市工夫(TTM)。●缩小各种修复之间的前置工夫。●进步部署频率。●更快的复原工夫。●升高新版本的失败率。许多商业部门的领导者都晓得,进步营销速度是一种生存技能,而不仅仅是指标。管理人员,特地是IT行业的管理人员,曾经感触到了以更快的速度和更无效地执行流程以及做出更好的业务决策的压力。只管大多数组织曾经胜利地部署了DevOps来实现必要的指标和目标,然而对于这种办法依然存在一些误会。以下是对于误会的一些纠正: DevOps不是一套自动化工具 DevOps不是一套能够购买的自动化工具。对于如何部署和监督应用程序而言,这是一种不同的思考办法。合作、继续交付、继续测试和继续集成不是实现工具。相同,它们是须要在我的项目中采纳的实际。只管的确有很多工具,比方禅道、Git Hub和Docker,它们通常都有助于DevOps实际的实现,然而只有当团队成员晓得如何优化并将它们引入到工作办法中时,它们才是无效的。 并不是每个我的项目的程序都要扭转 为每一个新我的项目从新设计程序的概念与实现DevOps的理念南辕北辙。领有一个能够依据须要轻松批改并利用于各种我的项目的繁多过程集,为可预测性留出了空间。在这种办法中,每个人都相熟本人的工作角色以及他们须要如何操作流程。 DevOps实际在实质上须要具备适应性和灵活性,以便将它们实现到服务器配置、异样测试、部署周期和加强开发团队的实力中。这只有在通过反复来让团队彻底了解整个过程时才有可能实现。 不只实用于小型公司或初创公司 包含Netflix、NASA、亚马逊、谷歌、星巴克、领英、通用电气、塔吉特、爱彼迎、HubSpot、耐克等在内的当先组织都在实际DevOps。它是为每个人开发和应用的,并不限度行业和公司的规模。每个企业都心愿在其周期时间或上市工夫内进行所需的改良。DevOps能够帮忙企业定期进步上市工夫,而且收益微小。这就是为什么大多数公司都施行这种办法。一家电子学习机构Intellipaat的首席执行官示意,他的DevOps认证我的项目为从小型到不同规模的大型公司提供服务。 DevOps不是麻利的替代品 与大多数理念不同,DevOps并没有取代麻利,能够将其视为麻利的连续或麻利激活器。在DevOps的帮忙下,能够实现继续部署、继续集成和继续交付管道的继续交付。此外,它容许在每次迭代完结时计算潜在可交付的代码。因而,DevOps和麻利的合作提供了最佳后果和体验。 DevOps没有勾销IT运维 依据无运维(NoOps)的概念,IT行业将变得十分自动化,不须要任何外部团队来管理软件。此外,人们置信微服务会使DevOps操作过期。然而,无论服务变得如许自动化,运维总是须要的。只管这些运维的工作可能会有一些变动,但它们在DevOps中依然具备重要意义。 DevOps并非只为开源软件开发的 通常,DevOps是在应用LAMP(Linux、Apache、MySQL和PHP)堆栈以及各种开源工具(如Jenkins、Docker、Ansible、Git、Chef、ELK、Nexus、Sonar、Zentao、Nagios和Gerrit)的组织中实现的。然而,取得一个胜利的DevOps后果并不依赖于所应用的技术。许多组织应用COBOL、Microsoft.NET、大型机汇编代码、SAP以及嵌入式零碎。 它能够兼容ITIL ITIL代表信息技术基础设施图书馆。它由IT服务治理(ITSM)的具体实际组成,旨在使各种IT服务与各自的业务需要保持一致。DevOps与ITIL兼容,但各种ITIL流程都是齐全自动化的,以反对与DevOps相干的高部署频率和短交货工夫。这解决了与配置和公布治理过程相干的许多问题。 DevOps不等同于继续交付 只管软件的继续交付表明企业曾经实现了DevOps的重要组件,但它不是一种二元关系。这两项服务并不能齐全等同,它们必定是不一样的。DevOps的次要关注点应该是改良工作文化,保护基础设施和软件。此外,它还必须反对销售和市场部门。 DevOps不是来到云端就不能运行 大多数人把DevOps称为云。云为测试人员和开发人员提供了动静的基础设施资源,以疾速取得测试环境,而不是期待手动实现申请。然而,这并不意味着须要用于DevOps的云。如果领有高效的流程来获取能够在应用程序中部署和测试更改的资源,那么也能够采纳这种软件。 本文分享自华为云社区《对DevOps的九大误会,是时候纠正了!》,原文作者:陈琦聊测试。 点击关注,第一工夫理解华为云陈腐技术~

February 22, 2021 · 1 min · jiezi

关于开发:关于开发把时间都花在编码上还要写测试么的讨论-IDCF

前 言“如何保障在开发进度很缓和的状况下,开发人员投入足够的工夫写测试用例,而不是把工夫都花在编码上呢?” 这个问题是一位共事问的。 我一开始的反馈如同注释中某位小伙伴的答复一样“你怎么晓得是在编码,还是在写BUG?”。然而认真想想,这应该属于比拟广泛的问题,所以拿进去发在IDCF的群以及朋友圈。一时引发了泛滥探讨,看来这也是大家比拟关注的共性问题。 探讨很冷落,内容也都特地好,根本各类型各方面的观点也都比拟全了,简略整顿总结如下,咱们先看小伙伴们的探讨,而后再发表本人的认识。 这不是单点的问题,有必要急躁的把各方面的论点都看一下。同样的,每个单点的回复都不会残缺,也没必要针对个别论点纠缠。 自己就不做过多评论了,欢送大家留言进一步探讨~ 从开发测试分工动手(按开发做测试的水平排序) 开发进度很缓和,不把工夫用在代码上,还思考测试的工作,是不是不太好?开发把测试活儿干了,那测试干啥?写代码么?测试负责品质监查。为啥肯定要开发写测试用例呢?先人工自测下,后补doc不行么?不论进度是否缓和,开发都须要调试代码,都须要花工夫定位缺点,以及修复缺点,和验证缺点是否真的修复了。失当的单元测试,能够很大水平上改善以上的工夫。单元测试就是开发的一部分,排除进去算进度自身就是谬误的。开发先自测,写不完换测试。聪慧的孩子都会把编程的一部分工夫用来做单元测试。测试用例要看是什么测试用例吧,例如单元测试就是开发写的,其余则是由测试人员编写的。单元测试不是开发写谁写,让测试把开发代码看完了解了再写么?“据书上说,测试前移能极大缩短修复BUG工夫,要不咱试试?”TDD不是标准答案吗?结对编程,一个写性能,一个写测试。测试笼罩不到,CI挂掉,提不了PR。代码评审的时候必须提供对应的测试用例,否则代码不予合并到公布分支。没有测试用例,如何及时反馈代码的正确性?代码要的是数量,还是品质?如何保障开发人员投入足够的工夫写性能,而不是把工夫花在写BUG上呢?这样不可能做到高质量,这种问题,发问的人本人也很分明,不用搭理。以上倡议很多都与测试的实际相干,包含门禁等,不过执行的是否到位,放一张茹炳晟老师分享的资料供自检~ 从组织和流程动手产品生命周期阶段而定,如果晚期,或者产品自身生命周期就很短的,其实是不是不肯定要写那么多单测。开发能保障冒烟测试全通过,我感觉就OK;能够考核开发的一次性提测通过率。冒烟之后,就是提测,测试同学测出bug,开发修!如果Bug可控,其实ok;如果Bug太多,减少冒烟比例。如何在业务和工夫缓和的状况下,进行测试的安顿。要分两个维度来看,第一个是看产品的性质。如果产品自身是疾速迭代的例如2C端的,那么咱们就做疾速交付,能够通过灰度来做。换句话讲,让客户帮咱们做2C端的测试,就算有问题,对整个的影响和危险是可控范畴的;如果有问题,能够通过疾速上线新版本进行修复的。还有一种,是相似金融、航空航天、医疗等,对人的生命安全或金融平安有重大影响的,这种就不实用了,尽可能在研发环境里把问题找进去,要把资源和工夫做一个均衡。如果有危险,要在产品、测试、研发以及老板之间把这个危险裸露进去,发版的责任大家共担。工夫紧是伪命题,不信你看看大家每天仍旧有工夫聊微信、刷微博。所以问题的外围在于:开发人员为什么非要写测试用例?对他们有什么益处?不写有什么损失?大家有这样的痛点和诉求吗?如果不能解答这个问题,那就没必要写,即便以政治工作强压,只能让大家怨气加深,各种糊弄,当形式主义去实现。鸡贼点:或者能够在DevOps平台上减少一个相似门限提交的卡点,去尝试用工具扭转一下大家的行为作为尝试,看看成果再做决定。把怨气引到工具上,让工具唱红脸,人唱白脸,加以疏导,去摸索适宜的“平衡点”。如果存在甩锅,阐明动到一方的利益了,那么就要反诘施行方,你晓得大家的外围KPI是什么么?各方做此事的利益共同点在哪里?不然为什么大家“浪费时间”陪你玩?搞不定这个问题,最初实施者本人就会变成“人心所向”的瓶颈点。什么工具都打不通“部门墙”,唯有“人”!这个“人”要有足够的信息量,理解各角色、各部门的外围KPI,当然获取信息的路径能够多方面,比方在酒桌、闲聊、八卦等各种形式。用“信息差”发明“影响力”,谁信息多,谁有主导权,而后找大家“利益共同点”去疏导大家共识,让做这件事的每个人都能从中播种实打实的益处,如此能力跨角色或跨BU的把大家凝聚在一起。从需要和工夫动手把测试也写在需要外面。应该要解决需求方的焦虑,老板也有压力。如果工具、资源、流程不行那还好说,减少资源、改良工具和流程。作为执行方要管制老板的预期。如果不能delay的话,就减scope。凭什么啊!减需要啊!让开发进度别那么缓和。我始终感觉麻利就是用来治理一些过于贪婪的老板或甲方的好工具。双周迭代的话,开发编码工夫都紧凑,没工夫写用例,除非人员很短缺。进度缓和,又要有足够工夫写测试?自身两个就是相悖的,看写代码人的集体能力了。如果不能为开发团队争取来足够的工夫,又不违心砍性能,那就做完我的项目优先级最高,性能交付了再说。需要人员说:啊,都急着要产量了,还测什么~从零碎和绩效动手我司没有测试人员,在麻利的模式下BA能及时赶出下个冲刺的需要就很nice了,开发人员须要承当测试的工作,然而没写测试用例,会先对着需要验收规范写开发思路,而后开发本人冒烟后让BA进入测试,BA会小本本记录SIT阶段有多少bug,UAT阶段有多少bug,以及上线后是否呈现生产环境bug。考核的时候,以单个冲刺间开发人员的bug率进行交付品质打分。“打分是矮子里选高个儿么”?有一个红线SIT:多少个bug以内,UAT多少个bug以内。触碰红线的绩效就别想多好啦。被其他人测出千行代码的BUG数目,间接和开发的奖金成反比,有点邪恶~如果工夫线往前延长,计划多。如果只是基于以后工夫点,这个好难,放弃在测试用例上投过多工夫是一种抉择,只关注外围、频发业务。另外,尝试把测试引入救急,转变下原有形式。这样不是最佳计划,只是应急措施。拉长工夫线,把上线回滚危险和单位上线时长做个回归剖析,应该能够算进去花多少精力实现测试AI化。领会过单元测试的会被动去写,但也是笼罩局部要害办法;晋升覆盖率还是要靠绩效辅助。如果一个公司始终属于紧急状态。那这个公司预计也活不短暂了。向领导反馈,如果说现阶段软件品质要求不太高,反而交付工夫是最重要的状况下,能够暂且就义品质,前面再还债。如果测试用例是交付物中必须的,那会有人写,毕竟是上线必须的条件,加班也得写啊。往往就是因为可有可无,反正不写也不影响零碎上线,那必定先紧着上线要做的事件实现啊,其余等当前再做,而后上线后感觉反正都上完了,其余做不做都一样。就是纯正为了让开发写的话,不如就成心找他们麻烦,开发完代码之后鸡蛋挑骨头全算BUG,博弈一下很快预计就写了...这个开发写,实质上相似编写实现的定义。讲个故事,没过生产跳伞包的厂家合格率永远无奈到100%,起初每次跳伞都带上几个厂家生产人员,而后,后果大家都晓得了,合格率马上100%。架构足够优良,这测试代码的工夫就不会花太多。业务代码也是一样,花太多工夫写业务代码,阐明架构优化还不够。性能精简,构思好代码逻辑再入手。从能力和认知动手如果大家都认可写测试用例的价值,工夫缓和的时候,问题就变为如何高效写测试用例,否则是不是不宜在进度缓和的时候做强要求?不是不给写测试的工夫,而是不给学习测试的工夫。从后续发现的缺点看他们交给测试人员时的代码品质,怎么保证质量他们本人决定。个性团队外部小范畴沟通,应该还好,比拟真正的指标就在眼么前儿。另外,判断什么时候该写,该怎么写测试用例,这个能力自身的造就也很重要。有些时候感觉没用所以不违心写,其实是因为不会写胡写才没用。总 结这是一个系统性问题,任何单点的优化,都无奈解决全局的问题。 “如何保障在开发进度很缓和的状况下,开发人员投入足够的工夫写测试用例,而不是把工夫都花在编码上呢?” 的问题,提问者也未必是不提倡开发写测试用例,问题所处的背景须要进一步探讨,才有可能给出相干倡议。 “开发进度很缓和”:为什么会缓和?哪些时候不缓和?如何能够不缓和?“投入足够的工夫写测试用例”:目前投入多少工夫?都写哪些测试用例?你认为多少是正当的足够工夫?如果有足够的工夫,你感觉开发人员写哪些测试用例?为什么?“把工夫都花在编码上”:代码品质如何?如何掂量?呈现过哪些品质问题?回溯来看能够做哪些改良?其余相干的问题:零碎是什么类型?缺点目前如何散布的?上线呈现缺点如何修复?会有哪些影响?如此相干的问题之后,联合大伙的探讨,大略答案也就跃然纸上了。 你有什么话题特地想探讨的?留言给冬哥,2021年,咱们一起精进。 作者:IDCF社区 冬哥

January 26, 2021 · 1 min · jiezi

关于SegmentFault:2020年中国DevOps应用发展研究艾瑞咨询报告总结

2020年12月,艾瑞征询公布《DevOps利用倒退钻研》,对业内企业进行调研,梳理国内DevOps历史脉络、倒退现状及瞻望,内容涵盖DevOps理念解析及行业利用、中国DevOps市场倒退情况和中国DevOps利用倒退瞻望。 DevOps概述DevOps企业实际:因为DevOps的实际远不仅限于装置软件工具,其在企业外部的落地实际须要经验简单的转型过程。咱们认为DevOps的成功实践须要企业工程解耦化、流程协同化和治理颗粒化的扭转,要走过从资源整合到自助服务的五个步骤。在这个过程中,企业和团队须要更多地关注治理形式和文化适应性,引入业余机构的征询和培训服务可能无效缩小DevOps转型过程中的摩擦老本。DevOps市场现状:早在云计算诞生之前DevOps未然存在,长期以来DevOps实际应用的软件工具以收费的开源软件为主。尽管如此,一体化的DevOps平台正在成为寰球范畴内的DevOps发展趋势,国内企业通常采纳一体化平台+开源软件的形式构建本人的DevOps体系。2020年国内DevOps服务的市场规模达到27亿元,将来5年的CAGR将超过25%,市场发展前景良好。DevOps利用瞻望:DevOps面对的企业文化上的敏态转型以及其所应用的一直优化的开发/运维软件都决定了DevOps不会成为一种墨守成规的工具,云原生更是为DevOps大展身手提供了广大的平台。DevOps将会在自动化、数据化、一体化和智能化方向上一直自驱倒退,DevOps与人工智能、无服务器和安全工程的交融倒退将会为DevOps注入新的生机和可能性。 企业为什么要引入DevOps?1.IT人才市场供不应求 企业需寻求内生路径以增强IT部门运行效率2.开发和运维部门在工作指标上面临一致,难以无效沟通3.瀑布流式开发流程僵化,不利于效率的晋升,逐渐向麻利转型4.IT部门治理透明度低、难度大,IT业务的复杂性和专业性对领导层治理造成考验 DevOps理念和工具在哪些行业有所利用?1.传统行业:数字化转型捷径DevOps助力传统行业稳步走上云原生数字化之路2.科技行业:软件工程新纪元DevOps赋能科技行业迈入软件工程高效阶段 DevOps为企业带来的价值工作效率及产品质量失去进步,量化指标还有优化空间。 DevOps软件工具的现状市场规模:将来5年DevOps市场复合增长率将超过25% 随着互联网转型的深刻,目前各行业的头部企业根本都曾经开始了DevOps转型实际,并造成了良好的带头和示范作用,将来数年DevOps工具将持续向企业浸透,并保持稳定的市场规模的增长。预计2020年年底DevOps市场规模将达到27亿 元,5年之后这一市场将增长至83亿元,复合增长率将超过25%。值得注意的是,DevOps实际中所应用的大量软件工具为收费的开源软件,并不间接带来市场规模的增长,前述市场规模次要包含DevOps云平台(包含私有云和公有云)及多数免费软件产生的市场价值;其次,互联网和IT是在DevOps畛域投入最多的行业之一,然而互联网和IT企业在这一畛域经常是以“自产自用”的形式构建外部DevOps工作框架(如禅道项目管理软件配合自研的禅道ZTF及Zendata进行自动化测试、继续集成),从而在交易环节对DevOps市场的奉献远不及其理论应用规模。 一体化趋势:“一站式”能力是软件研发平台产品的广泛倒退方向;“云平台+开源软件”是最支流的DevOps构建办法;一体化DevOps市场拓展仍期待头部企业的示范作用。 成熟度状态:容器技术推动DevOps实际,大多数企业实际获得了功效;征询与培训服务在DevOps实际中的作用不可漠视;DevOps的进一步深入仰赖软件行业的全面生态交融。 倒退瞻望:DevOps——一直自驱与提高的IT文化:自动化、数据化、一体化、智能化是将来DevOps的倒退方向 Serverless + DevOps:以底层资源的智能托管整合DevOps的运维工作 无服务器架构外围是将服务器等底层资源的配置和保护工作最大水平地交由云服务商托管,使得使用者可能专一于无服务器利用的运行。对于软件开发者而言,这一架构给予了他们更加专一的工作环境,可能进一步提高工作效率、升高工作摩擦。同时,从软件生命周期来看,传统的软件运维分为对运行状态即业务流程的运维以及对底层基础设施的运维。Serverless的倒退有心愿将基础设施运维的累赘从用户手中分流,二者的联合无望给IT运维行业的格局带来粗浅的扭转,通过增强IT运维职能划分和主动响应来缩小IT部门的运维老本。 AI + DevOps:以动静优化的流程和规定赋能DevOps的麻利思维人工智能与运维工作的交融被称为“AIOps”,其外围是冲破现有的以固定脚本设置规定来对系统运行状况进行监控的传统模式,将机器学习算法引入运维规定的设置,从而对不同企业、不同软件的运行智能生成更有针对性的运维规定,进步问题辨认的精准度有有效性,进步运维服务的品质并升高其老本。而在开发端,人工智能的次要角色是通过充分利用大数据推导智能算法提供更加优化的部署、交付和测试计划,进一步缩小人工参加和手动进行的环境,进步准确性和效率性,国外已有公司如Lambdatest将人工智能算法融入到测试过程中,以进步测试效率、减速软件开发过程。Security + DevOps:以有机内生的平安办法保障DevOps的稳固高效 在软件开发实际当中,传统的平安流程往往因为跟不上频繁公布和更新的步调,从而成为制约DevOps流程提速的短板,或是间接被研发人员跳过以谋求麻利效率。DevSecOps的理念是将平安防护流程有机地融入传统的DevOps流程中,通过自动化、智能化的办法使其成为软件开发和运维中的内生局部,以对立的流程实现对平安防护的兼顾。在云原生时代,安全策略在寰球范畴内受到的器重越来越高,软件开发内生安全性将成为评估企业DevOps成熟度程度的重要指标。 数据起源:艾瑞征询《2020年中国DevOps利用倒退钻研——艾瑞云原生系列报告(二)》https://www.iresearch.com.cn/...

January 20, 2021 · 1 min · jiezi

关于开发:2020DevOps状态报告变更管理

如果你的公司还没有走向平台化,当初依然能够是很大的飞跃。您依然能够通过解决公司的变更治理流程来放慢软件交付。在本章中,咱们将钻研咱们在公司外部所学的变更管理模式。咱们将向您展现什么是无效的,什么是有效的,以及如何利用DevOps准则将变更治理转化为无效的、使能的流程。 在过来的十年里,咱们曾经看到DevOps的实际颠覆了软件公布团队的工作形式。以下是最显著的变动。 “问题自身并不会扭转,因为扭转始终在产生;问题是在变动来长期无奈应答。” Kent Beck《解析极限编程:拥抱变动》即便咱们看到交付团队胜利地转变了他们的思维和实际,但要在一个大型组织中扭转积重难返的构造和流程依然要艰难得多。变更治理就是最难扭转的过程之一。转向一种新的做事形式须要领导反对、组织纪律和跨组织各层的大量单干和合作。然而,在大多数大型组织中倒退起来的大型遗留环境并不容易被拆分和从新设计。它们通常由许多不同的团队保护,每个团队都领有技术堆栈的一部分。了解工作的团队通常不足批准本人所提变更的权限;相同,变更批准常常被调配给脱离实际工作、理解不够深切的委员会。所有这些层面的存在是因为大型遗留环境是组织的次要业务所在。因而,任何变动都会让人感觉有危险,而且有大量的流程和官僚作风,让人感觉是在爱护企业的平安。可怜的是,所有这些过程都妨碍了组织的倒退。他们根本无法疾速公布软件——无论是面向内部客户还是外部客户——以满足业务需要。同时,那些使他们的变更治理更无效的竞争对手可能疾速而重复地公布,使他们排在后面。 DevOps演进和变更治理有效性咱们想看看变更治理的有效性是否与DevOps的倒退相干。为了掂量改革治理的有效性,咱们从以下三个维度察看: 施行成功率。咱们察看了变更失败率和部署频率。现实状况下,企业应该可能更频繁地进行改革,从失败中迅速复原,并从中吸取教训。效率程度。咱们想晓得扭转的效率有多高治理过程基于以下内容:•不到两周的强制期待期•更改只需一次批准•更改被正确实现,不须要撤销•由具备适当技能的人批准,从而做出正确评估•记录更改所需的工夫很少绩效情绪。作为对每个受访者所在组织的主观评估的代理,咱们制订了该指标。咱们询问受访者他们公司的变更管理程序是否:•升高危险•缩小与服务事件相干的停机工夫•提供对组织有用的信息•确保与适当的利益相关者共享常识和信息•放慢业务需要的变动速度•依据评估的变更危险等级,提供适当级别的审查和批准这三个维度——施行成功率,效率程度和绩效情绪——形成咱们的变更治理有效性的度量。 咱们发现随着组织倒退他们的DevOps实际,变更治理的有效性减少了。尽管差别不是很大,但在统计上的体现是显著的。 变更治理的办法为了考察改革治理,咱们向受访者询问了他们在工作场合的一些不同做法。这些能够分为两个局部:变更审批流程和变更实现的自动化水平。可分为四种群体:运维成熟。高水平的过程和自动化。工程驱动。高度重视自动化。以治理为核心。高度重视人工审批,而不器重自动化。长期型。不器重过程和自动化。 是什么驱动着改革治理的有效性?当从总体上看改革治理的有效性时,会发现工程驱动的公司具备最高程度的变更治理有效性,长期型公司因不足流程而成功率居于第二,剩下的两组重大依赖正统的认可,在有效性上得分不高。 咱们的数据揭示了一些对于影响变更治理的有效性和效率: 正统的批准会升高效率;自动化使团队对变更治理充满信心;授予权限会带来更高的效率。

January 13, 2021 · 1 min · jiezi

关于开发:用了这个评估优化LiteOS镜像利器我有点飘

摘要:本文会给大家介绍下LiteOS Studio的镜像剖析工具,这可是一个评估、优化镜像文件RAM、ROM占用大小的利器。大家都晓得嵌入式开发板因为受老本限度,芯片的RAM、Flash等硬件资源无限,比方有些低成本的开发板只有内置的64KB ROM、20KB RAM。在丰盛性能个性编程时,一些看似有害的扭转,都可能导致编译出的镜像收缩,超出开发板的资源限度。对于硬件资源绝对拮据的开发板,正当的镜像大小布局,也会晋升性能。本文会给大家介绍下LiteOS Studio的镜像剖析工具,这可是个评估、优化镜像文件RAM、ROM占用大小的利器。 开发环境筹备后期的系列文章,咱们把握了如何装置LiteOS Studio,如何新建STM32F769IDISCOVERY和Qemu realview-pbx-a9工程。这次咱们以STM32F429IGTx开发板为例,创立工程的形式是一样的,开发板抉择STM32F429IGTx即可。镜像剖析个性对任何LiteOS工程都是实用的,咱们只是以该开发板为例。工程创立结束后,执行编译,输入如下: 终端控制台输入显示编译胜利了,可执行文件Huawei_LiteOS.elf对应的text段为74774 bytes,data段大小1444 bytes,bss段13080 bytes,dec示意后面三段大小的共计,为89268bytes。这些text、data、bss数据代表什么?有什么意义?咱们持续,后文中会具体解释。 LiteOS 镜像剖析个性点击LiteOS Studio工具栏的调测工具Debug Tools按钮,关上调试工具,抉择镜像剖析,这就是本文要给大家介绍的LiteOS Studio的镜像剖析工具。填写可执行文件门路、Map文件门路等,如图: 点击确定按钮,会主动关上镜像剖析窗口。蕴含内存区域、详细信息、文件大小、模块大小等4个选项卡。咱们顺次演示如何应用。 内存区域内存区域页面评估剖析LiteOS开发板工程对内存的细分应用状况。对于STM32F429IGTx开发板,显示的内存区域region蕴含FLASH、RAM、CCMRAM,展现的信息蕴含每个内存区域的名称、起始内存地址、总大小、闲暇大小、已用大小,应用比例。在这个内存区域页面,除了数值展现剖析,还提供饼图能够宏观的评估每个区域的应用、残余状况。如下图所示,FLASH总大小 1024Kb,RAM总大小192Kb,对FLASH、RAM的使用率较低,刚刚超7%。对于CCMRAM更是没有应用,CCM(Core Coupled Memory)是给STM32F4内核专用的全速64KB RAM。 详细信息持续点击详细信息选项卡关上镜像剖析详细信息页面,该页面展现每个内存区域蕴含的内存段section,内存段蕴含的符号symbol的详细信息。 比方FLASH上面蕴含.isr_vector、.text、.rodata等内存段, 内存段又蕴含调配在该段的程序符号。每一行展现的信息蕴含运行地址VMA(Virtual Memory Address)、装载地址LMA(Load Memory Address)、内存段/符号的大小。其中,LMA示意程序装载的内存地址;VMA示意程序运行时的内存地址。嵌入式零碎中RAM内存空间无限,个别把程序放在FLASH中,LMA地址为Flash中的地址,等到程序运行时,再载入到RAM中的运行地址VMA。内存段.data、.vector_ram就属于这种状况,VMA、LMA地址不一样,并且在FLASH、RAM均呈现。 在应用详情页面,反对排序和搜寻过滤,反对程序符号疾速跳转到源代码行。咱们能够很直观的评估每个内存段、程序符号的应用大小状况,能够疾速定位到潜在可优化的资源耗费小户。如图: 从镜像剖析图表中,能够看出text、data段寄存在Flash存储,data、bss段数据寄存在RAM存储。那么,链接器linker是怎么晓得如何把各个段的符号数据寄存在ROM、RAM的?这就要靠链接脚本。 链接脚本和Text、Data、BSS Section段链接脚本蕴含一些规定来束缚链接器如何把函数、变量放到ROM或RAM,STM32F429IGTx工程的链接脚本地位在targetsCloud_STM32F429IGTx_FIREliteos.ld。咱们分栏同时展现镜像剖析页面和链接脚本,如下图,能够看出镜像剖析页面展现的内存段应用状况和链接脚本中所定义的是统一的,开发板的内存应用状况在LiteOS Studio 镜像剖析页面失去十分直观的展现。 内存段.ccmram在链接脚本中没有定义,已应用大小的也为0 byte。对于内存段.data、.vector_ram,链接脚本中应用关键字 RAM AT> FLASH,来示意装载地址、理论运行地址别离在FLASH、RAM。 链接脚本片段1如下,定义了中断解决向量.isr_vector、程序.text寄存在Flash存储,应用的关键字为>FLASH,其中FLASH在上文的MEMORY{......}中定义。 / The startup code goes first into FLASH / .isr_vector : { . = ALIGN(4);KEEP(*(.isr_vector)) /* Startup code */ . = ALIGN(4);} >FLASH / The program code and other data goes into FLASH / .text : { ...

December 23, 2020 · 3 min · jiezi

关于开发:分布式-DBLE-网络模块源码解析二

作者:路路酷爱技术、乐于分享的技术人,目前次要从事数据库相干技术的钻研。本文起源:原创投稿*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。前言在上一篇文章中,我讲了网络IO的基础知识,本篇文章将从源码角度具体解说DBLE的网络模块,包含DBLE是如何解决MySQL包的,多路复用在DBLE中是如何实现的,以及申请的异步化解决相干逻辑。 DBLE是如何解决MySQL包的?咱们将以客户端连贯DBLE为例,从源码角度解说DBLE的相干解决流程。 客户端与DBLE建设连贯的流程如下图所示(因为DBLE实现了MySQL协定,所以与客户端连贯MySQL的流程一样): 次要包含以下四个步骤: 1、 客户端发动connect连贯; 2、服务端发送握手包; 3、客户端回复握手包; 4、服务端返回OK包,示意连贯建设实现,进入命令阶段。 咱们间接看源码: 1、DBLE解决客户端connect DBLE解决客户端connect的代码在NIOAcceptor#run办法中: public void run() { //这里的selector即IO多路复用选择器,一个selector能够解决多个客户端连贯申请 final Selector tSelector = this.selector; for (; ; ) { try { tSelector.select(1000L); Set<SelectionKey> keys = tSelector.selectedKeys(); try { for (SelectionKey key : keys) { if (key.isValid() && key.isAcceptable()) { //当连贯无效且可承受时,解决客户端连贯 accept(); } else { key.cancel(); } } } catch (final Throwable e) { LOGGER.warn("caught Throwable err: ", e); } finally { keys.clear(); } } catch (Exception e) { LOGGER.info(getName(), e); } } }能够看出上述办法调用了accept来承受客户端发动的TCP连贯,持续看该类的accept办法: ...

December 21, 2020 · 3 min · jiezi

关于开发:分布式-DBLE-网络模块源码解析一网络-IO-基础知识

作者:路路酷爱技术、乐于分享的技术人,目前次要从事数据库相干技术的钻研。本文起源:原创投稿*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。前言对于计算机学科来说,计算机网络相干常识的重要性显而易见。平时咱们框架用的多了,对于底层网络 IO 的解决关注的并不算多(如果不让你用 Spring,你还能写出个 Web 接口吗?),但对于中间件以及框架的开发者来说,网络 IO 的解决却是最须要关注的中央。 DBLE 的网络模块没有用任何框架,齐全是通过原生 JDK 纯手写的。研读 DBLE 网络模块的源码,可能让你对网络 IO 的解决有更进一步的了解。为什么连贯 DBLE 可能像连贯 MySQL 一样?为什么 DBLE 的性能可能如此高?心愿通过本系列文章,可能帮忙大家对DBLE的网络模块有更深刻的理解,更进一步,心愿可能帮忙大家对高性能网络 IO 有更深刻的理解。 本篇作为 《DBLE 网络模块源码解析》的第一篇,次要讲讲网络 IO 的基础知识。 一、TCP/IP 协定栈TCP/IP 协定在肯定水平上参考了 OSI 的体系结构。OSI 模型共有七层,从下到上别离是物理层、数据链路层、网络层、运输层、会话层、表示层和应用层。然而这显然是有些简单的,所以在 TCP/IP 协定中,它们被简化为了四个档次,从下到上顺次是链路层、网络层、传输层和应用层。 不同层之间的数据封装如下图所示: 从上图能够看出上一层的协定数据都是作为下一层协定的音讯体来传输的。所以协定从上到下,是一层一层封装的构造。 二、MySQL 协定MySQL 协定在 TCP/IP 协定栈中是处于应用层这一层。从而可能晓得 MySQL 协定数据是作为 TCP 协定中的音讯体局部来传输的。 因为 TCP 为面向流的协定,没有界线,会存在粘包拆包问题,须要在应用层解决。常见的解决办法有: 音讯定长,例如每个报文的大小为固定长度 100 字节,如果不够,空位补空格;在包尾减少回车换行符进行宰割,例如 FTP 协定;将音讯分为音讯头和音讯体,音讯头中蕴含示意音讯总长度(或者音讯体长度)的字段;更简单的应用层协定。MySQL 协定是通过音讯定长和在音讯头中蕴含音讯体长度字段的办法来解决 TCP 粘包问题的。如下图所示: https://dev.mysql.com/doc/dev... 连贯 DBLE 既然能像连贯 MySQL 一样,那 DBLE 肯定要可能解决 MySQL 的数据包,如何解决这些数据包在代码里都有体现,我将在网络模块源码解析里具体解说 DBLE 对于 MySQL 数据包的解决。 ...

December 15, 2020 · 1 min · jiezi

关于开发:EMAS-移动-DevOps-解决方案-Mobile-DevOps

阿里云 云原生利用研发平台EMAS 彭钊(州牧) 简介: DevOps这一优良的软件交付理念在服务端曾经有很多相干的实际,那么是否也能够利用到挪动端进行交付呢?基于挪动端和服务端场景的差别,挪动DevOps跟服务端DevOps又有哪些不同和挑战?本文分享阿里云云原生利用研发平台EMAS在建设云原生Mobile DevOps过程中的思考、遇到的挑战以及解法,解密其设计架构和技术细节。一、Mobile DevOps 介绍什么是挪动 DevOps1)大家所熟知的DevOps在2020年这个工夫节点上,DevOps曾经不再是什么陈腐概念,置信大家或多或少都有些本人的了解,但当要咱们去精确形容什么是DevOps时,如同又很难讲的分明。实际上DevOps至今业界也没有能够让大家统一认可的定义,之所以很难被精确定义,是因为DevOps其实是一种理念甚至是一组理念的汇合,很难被具象化。“DevOps”这个词自身从字面能够了解为软件从Dev(Development,开发)到Ops(Operations,经营)的全生命周期,但DevOps的精确定义到底是什么?在泛滥的DevOps定义中,集体认为Azure DevOps的定义[1]较为准确和具体: DevOps 是开发 (Dev) 和经营 (Ops) 的复合词,它将人、流程和技术联合起来,一直地为客户提供价值。DevOps 对团队意味着什么?DevOps 使以前孤立的角色(开发、IT 经营、品质工程和平安)能够协调和合作,以生产更好、更牢靠的产品。通过采纳 DevOps 文化、做法和工具,团队可能更好地响应客户需要,加强对所构建应用程序的信念,更快地实现业务指标。 这个定义里有几个要害信息总结一下:① 人、流程、技术的联合② DevOps使让以前孤立的角色能够协调和合作③ DevOps是一种理念,既要建立文化,也要有自动化工具的反对④ 目标是更快的生产更好、更牢靠的产品 2)从DevOps到挪动DevOps对于DevOps大家平时探讨比拟多的其实是服务端DevOps,既然DevOps是一种优良的软件交付理念,为什么不把DevOps也利用到挪动端交付呢?这也就是咱们明天要介绍的挪动DevOps。因为挪动端和服务端场景的差别,挪动DevOps跟服务端DevOps会有很大的不同。次要体现在以下几个方面: 挪动端利用自动化构建更为简单• 构建环境碎片化Android、iOS两个平台须要基于不同的操作系统和构建工具链搭建构建环境,即使是同一平台构建工具链也存在版本碎片化景象,比方Android构建依赖的Android SDK、Gradle须要多个版本同时反对,iOS构建依赖的Xcode、Ruby版本须要多个版本同时反对 • 挪动端构建波及到证书托管等数据安全问题• iOS构建依赖的Mac设施为机房非标设施Mac设施不属于规范服务器无奈部署在规范机房,通常须要自建Mac机房,对于可运维性和稳定性也是一个挑战。 自动化构建是DevOps中必不可少的能力,这就要求挪动DevOps通过技术手段很好的解决上述客户端自动化构建、一键出包的问题。挪动端碎片化重大,利用交付兼容性是微小的挑战不同于服务端部署环境的一致性,挪动端利用运行环境碎片化十分重大,兼容性测试笼罩难度远大于服务端。挪动端碎片化景象以Android零碎尤为重大,次要体现在以下几个方面: • 手机机型碎片化Android市场有泛滥的手机厂商和茫茫多的机型,不同厂商都会对系统做底层“优化”,实践上任何笼罩不到的机型测试都可能会面临兼容性问题,下图是2020.10月份最新的百度统计流量研究院[2]的Android Top机型散布,Top 10的机型市场占用率都有余15%,可见机型碎片化之重大 • 操作系统版本碎片化操作系统的差别对利用运行的影响更为间接,零碎大版本升级导致利用不兼容的状况不足为奇,每次操作系统大版本公布都是对利用兼容性的一次考验;在思考兼容新零碎的同时,还不能放弃老零碎的用户。下图是2020.10月份最新的百度流量研究院的Android版本散布数据,能够看到曾经公布一年多的Android 10.0,市场占用率还有余50%,2年以前的操作系统仍然占支流 因为端设施的碎片化问题,就须要挪动DevOps具备挪动测试能力,自动化实现大量的真机兼容性测试。挪动端利用公布更新周期长利用新版本可能公布2周更新比例都不会超过50%,不像服务端能够在很短的工夫内实现所有服务器的软件公布。公布周期长意味着犯错老本更高,一个有Bug的版本收回去,可能须要很长的工夫能力通过更新降级消化完。 这就须要挪动DevOps一方面具备欠缺的灰度公布机制,防止将有问题的利用一次性公布到用户侧;另一方面一旦有Bug的版本曾经收回,须要挪动DevOps具备热修复能力,能够通过增量补丁包的公布形式更轻量、疾速的修复Bug。挪动利用运行在海量挪动端设施不像服务端服务运行在特定的集群内,能够对立管控和运维,挪动利用的运行环境在用户的手机上,而且对于手淘这类超级App来讲是亿级海量设施。 这就须要挪动监控类产品通过大数据技术来实现挪动端运维监控,甚至须要近程日志性能来拉取指定设施上的谬误日志来定位排查谬误。基于以上几点,并参考DevOps对软件交付生命周期的定义,总结挪动DevOps利用生命周期及各阶段能力要求如下: 什么是Mobile DevOps1)Mobile DevOps 是EMAS挪动DevOps理念的具象化实现首先介绍一下EMAS(Enterprise Mobile Application Studio),EMAS是来自阿里云的国内当先云原生利用研发平台(挪动App、H5利用、小程序、Web利用等),基于宽泛的云原生技术(Backend as a Service、Serverless、DevOps、低代码等),致力于为企业、开发者提供一站式的利用研发治理服务,涵盖开发、测试、运维、经营等利用全生命周期。更多对于EMAS的介绍详见阿里云官网EMAS详情页。Mobile DevOps是EMAS挪动DevOps理念的具象化产品输入,是EMAS的中轴型产品,它联动EMAS所有产品独特实现上述挪动DevOps理念。Mobile DevOps将EMAS本来孤立在利用各个生命周期的产品像上图一样实现了联动和残缺闭环,实现了EMAS从挪动中间件平台向挪动研发平台的降级。Mobile DevOps联合以下EMAS产品独特造成EMAS的挪动DevOps:研发域:Mobile DevOps测试域:挪动测试公布域:Mobile DevOps运维域:挪动监控,挪动热修复经营域:挪动推送,移动用户反馈 2)Mobile DevOps的历史Mobile DevOps是团体外部挪动研发平台的商业化输入版本,最早于2017年由阿里云和手淘团队一起研发出输入第一版专有云输入版本,2020年04月上线第一个公共云版本。上面这张图是Mobile DevOps的发展史,能够说Mobile DevOps的发展史其实就是阿里团体挪动研发技术发展史,是阿里巴巴近十年挪动技术、工程研发理念积淀。 3)Mobile DevOps的现状专有云已初具规模Mobile DevOps专有云次要面向大客户,尤其是正在做数字化转型的大客户,这部分客户对平安有很高的要求,根本只能承受专有云部署的模式,同时也违心为晋升研发效力投入老本。2018年Mobile DevOps以专有云场景正式落地输入,目前曾经为多个行业数十家大客户发明价值,赋能企业研发流程数字化转型。公共云收费公测中绝对于专有云,Mobile DevOps公共云更多的是面向中小微企业,这部分客户对研发效力晋升有诉求,然而又对价格敏感,公共云是很好的承接模式;同时阿里团体外部有些对外输入的业务(例如专属钉钉)无奈基于团体外部研发平台去做挪动DevOps的,Mobile DevOps公共云也是很好的抉择。Mobile DevOps公共云自2020.07开始正式对外收费公测,目前已服务以及泛滥中小微客户,以及阿里团体外部专属钉钉、政务钉钉、唱鸭等客户。 ...

November 27, 2020 · 2 min · jiezi

关于开发:用友低代码开发平台YonBuilder为您加速

随着云计算、人工智能、物联网、大数据、5G等新一代技术的疾速倒退,越来越多的企业心愿借助技术的力量减速数智化转型,期许通过更加麻利和弱小的利用零碎推动企业的商业翻新速度。但传统软件开发周期长、开发成本大、开发环境要求低等问题,与企业“麻利翻新”的需要成为一对主要矛盾,时代呐喊利用构建更为便捷的低代码开发平台的呈现。 保持“用创想和技术推动社会和商业提高”的用友,正是在如此背景下,基于商业翻新平台YonBIP,推出了低代码开发平台YonBuilder,将积淀了32年的技术能力赋能产业,为企业商业翻新注入弱小能源。 颠覆传统开发,YonBuilder让人人都是开发者 如果说抖音突破了视频制作技术的门槛,让人人都是生存的“导演”,那么YonBuilder就像是企业服务畛域的抖音,突破了传统软件的开发模式,让人人都是“开发者”,这背地其实是YonBuilder这一全新“开发利器”,赋予了利用构建极大的便捷性。于开发者而言, YonBuilder既反对一般开发者无代码可视化构建APP、小程序、H5等利用,一般业务人员,只有懂业务逻辑也能搭建利用,从肯定水平上解决了企业“程序员不懂业务,业务员不懂编程”的难堪问题;也反对业余开发者低代码开发各类大型利用、企业因时代倒退所须要的个性化利用、以及海量业务场景的长尾利用,让开发者聚焦外围编程逻辑,升高开发难度,晋升开发效率。 于企业而言,YonBuilder能够帮忙企业以更快更简略的形式实现自主利用开发,还能够与用友提供的规范服务进行无缝对接,也能够为服务企业的搭档提供开发平台,一起为用友的客户服务,搭档在YonBuilder上开发的利用与用友自身的规范利用一样,用户应用起来无任何差异化感知。 从开发小白到技术大牛,YonBuilder认证体系成就职业新高度 数字经济时代,无论是急需转型的企业,还是急需提效的开发者,无论是急需业务冲破的业务人员,亦或是急需晋升职场竞争力的集体,把握低代码开发技能,都将赋予咱们更多的竞争力。 为让更多人全面把握并利用低代码开发平台YonBuilder,用友推出了欠缺的YonBuilder认证体系,面对不同开发根底人群,提供不同的认证等级。微认证,是面向社会人士、在校大学生、业务人员等无开发教训人群的根底认证,通过学习课程、入手实际等,全面理解并纯熟利用YonBuilder平台,通过考试,即可颁发微认证证书,成为YonBuilder利用达人。 业余认证,是面向有开发根底的业余开发者的免费认证,通过YonBuilder平台构建利用,开发成绩经由业余认证团队审核评定,依据评定后果给与开发人员“开发者”“开发专家”“开发MVP”相应等级名称与证书,通过认证,即可收费学习相应等级的高价值专业课程,开发成绩还将有机会获商业变现反对、商业孵化与投融资搀扶,让“商业创新者”身份实至名归。 YonBuilder微认证启动,限量300名收费 在用友YonBuilder对外公布后,引发了媒体圈、开发者社区、科创企业的诸多热议,越来越多的人也对YonBuilder产生了浓厚兴趣,心愿学习把握YonBuilder平台,成就更多可能。 用友不负众望,推出YonBuilder微认证限量300名收费流动,无论您是在校大学生、企业员工、亦或是业务骨干、企业领导,都能够在“摩天”官网(www.imotian.com)注册,疾速进行微认证,同时,开发领导、体系化课程学习、案例详解、试用体验、社区互动等专属服务,也将助您拿下证书,成为YonBuilder利用达人。种一棵树最好的工夫是10年前,其次是当初。 IDC调研报告显示,将来5年,全行业将会创立5亿个新应用程序,比过来40年的总和还多,低代码开发平台将成为构建将来应用程序的弱小工具,低代码开发新时代未然降临! 乘时代东风,做新时的代商业创新者,从把握低代码开发技能开始,从应用低代码开发平台构建大型简单利用开始。将来,用友将与企业、开发者、集体,共风雨,筑生态,一起在推动商业翻新的改革中乘风破浪!

November 18, 2020 · 1 min · jiezi

关于开发:LR软件开发平台快速建立企业协同办公解决方案

往年疫情肆虐的状况下,很多公司开始借助互联网进行企业的管理工作,诸如在线办公室和疾速温度测量等数字利用逐渐成为常态,以期通过数字化办公转型来缩小疫情的影响。 互联网的退出,使传统的生产和生存形式正在调整,如无人驾驶、智能工厂、智能批发、近程医疗和智能教育无处不在,数字化时代未然降临。新兴利用层出不穷,看得见的是对咱们生存的扭转,看不见的是对IT基础架构的重塑。 以后,企业在数字化转型过程中往往面临三大难题:效率、弹性、老本。效率和老本总是鱼和熊掌不可兼得,随着数据一直增大,企业零碎往往越来越难以承载企业的倒退。 如果想跟上企业的倒退步调,就要求IT基础架构可能灵便弹性扩大,满足将来业务倒退的须要,当新技术产生时,可能在零碎中疾速利用并发明价值。 对于力软企业开发平台,它能够帮忙企业在较短的工夫内实现“随时随地,高效,平安”的办公服务信息建设,并为企业建设一套跨平台协同办公零碎。 力软(LR)企业开发平台是一套智能化可扩大组件式软件系统我的项目平台,应用了以后支流的利用开发技术(.net/java双版本),框架内置工作流、向导式智能开发组件、即时通讯组件、APP开发组件、微信组件、通用权限等一系列组件,以及可扩大的零碎机制,开发人员通过一系列简略配置就能够疾速构建OA、ERP、CRM、BI、BPM、APP、小程序等泛滥高质量的信息系统,可无效晋升企业效率,节俭企业老本。 详情参阅:learun.cn. 为更加明确的理解平台理论效用,这里截取工作流模块性能以作参考。 1.流程设计 2.流程工作 3.流程委托 4.流程监控 5.签章治理 更多功能,请参阅“力软”平台.

October 30, 2020 · 1 min · jiezi

关于开发:API进阶之路研发需求突增3倍测试团队集体闹离职

摘要:最近研发的需求量涨了3倍,开发团队拼命赶进度,可苦了测试团队。本认为从一线研发转治理后会安闲一些,然而没想到,我还要充当救火队员的角色。 到了第四季度,各业务部门都在憋着劲儿冲业绩,毕竟这跟年终奖可是非亲非故的事儿。业务部门冲业绩,带动着研发的需要一直减少,这个部门说想要提前上线,那个部门说要长期加个需要,研发只能说咱们得按排期来,这句话平时可能好使,可一旦需要和业绩相干,那研发就要火力全开,排期什么的就得靠边站了。 最近研发的需求量涨了3倍,开发团队拼命赶进度,却苦了测试团队。本来测试团队就人少压力大,当初需要涨了,测试人员却没减少,测试主管带着几个共事找到老板,说再这样上来真是干不了了。 没有测试可还行?这可急坏了老板,长期招人也来不及。他喊我过来磋商,看有没有方法解决。老板的意思是心愿我可能去带一带测试团队,给大家缓解下压力。然而吧,加上我一个人也解决不了什么问题呀,这可怎么办? 通过剖析,咱们发现测试的压力来自2个方面:一方面是要上线的我的项目集中暴发;另一方面是开发在赶进度,交付品质有所升高,再加上微服务架构下我的项目单元变多,测试的工作量也成倍增长。得想个办法从根本上解决这些问题。 推敲了一个早晨,我给老板提交了一份计划:把原先写的测试用例注册到华为云一站式云端测试平台——云测(CloudTest)上,应用云测API进行测试用例治理、接口测试等,进步测试效率,保障我的项目高质量领取。 应用华为云云测API也比拟容易,具体步骤如下。 一、TestHub服务操作TestHub服务操作包含:新测试类型服务注册到云测、用户获取本人以后曾经注册的服务。 1、确定调用API鉴权时应用的Token,获取响应Header参数中X-Subject-Token对应的值。 2、确定Testhub服务名称及用户服务域名并注册。 接口相干信息:URL格局-POST /v1/services 申请示例:发送一条POST申请。 POST: https://{endpoint}/v1/services { "service_name" : "这是一个测试类型名称", "server_host" : "https://xxx.xxx.xxx"}响应示例 { "service_name" : "这是一个测试类型名称", "service_id" : 13}3、确定Testhub服务已被注册胜利。 接口相干信息:URL格局- GET /v1/services 申请示例:发送一条GET申请。 GET:https://{endpoint}/v1/services 响应示例:获取到返回的注册信息即证实用户已注册胜利。 { "services" : [ { "id" : 13, "name" : "这是一个测试类型名称" } ]}二、用例操作用例操作包含:创立测试用例、更新测试用例、获取测试用例详情、批量执行用例接口、批量更新测试用例后果。 1、确定调用API鉴权时应用的Token,获取响应Header参数中X-Subject-Token对应的值。 2、创立新的测试用例。 接口相干信息:URL格局-POST /v1/projects/{project_id}/testcases 申请示例:发送一条POST申请。 POST: https://{endpoint}/v1/projects/{project_id}/testcases { "name" : "testcaseXXX", "service_id" : 13, "rank_id" : "2", "testcase_number" : "1234", "extend_info" : { "description" : "这是一条形容信息", "preparation" : "这是一条前置条件xxxxxx", "steps" : [ { "expect_result" : "<ol class="ordered"><li class="ordered"><span>后果一</span></li><li class="ordered"><span>后果二</span></li></ol><p><br /></p>", "test_step" : "<p>步骤一</p>" } ], "label_list" : [ "标签一", "标签二" ], "module_id" : "b66aab5469cc4ab39b0dda8e644a42a4", "test_version_id" : "8.1.2", "fix_version_id" : "8.2.0.1", "assigned_id" : "b66aab5469cc4ab39b0dda8e644a42a4", "issue_id" : "b66aab5469cc4ab39b0dda8e644a42a4" }}响应示例 ...

October 23, 2020 · 2 min · jiezi

关于开发:为什么企业需要CRM系统CRM的作用及其重要性分析

客户管理系统(CRM)是企业外围应用软件之一,对于进步企业业绩起着至关重要的作用,当初很多企业都在客户倒退方面投入大量的资金,以求取得更好的回报。 对于CRM CRM是一个客户数据中心,在CRM中,你能够解决公司各部门与客户相干的各种细节,包含跟踪和治理每个与你的品牌、网站或产品有过互动的潜在客户和客户的旅程。这种模式实用于多种行业的业务场景:技术、业务服务、批发、银行、制作、安保、通信和媒体等。 CRM为何重要 CRM零碎之所以重要,是因为它收集、解决和治理所有与客户相干的信息。CRM零碎通过客户流动和潜在客户信息,帮忙企业找到新客户,造成成交,帮忙企业与客户之间建设牢固的关系并更快、更好地开展业务。 CRM零碎首先通过跨多个起源和渠道收集客户的网站,电子邮件,电话,微信,QQ等数据;再通过相干数据进行的剖析和跟进,让业务人员更好的理解客户状况,并通过无效信息造成成交;最初通过成交,记录订单,合同,计算提成等相干后续治理。有的CRM零碎还能够促成二次成交,代理商分销,业务员提成实时调配等。市场营销和销售团队成为一个有凝聚力的个体,是企业倒退的重要一环,CRM的作用就是帮忙企业实现这一指标的解决方案: 1.条理化和简单化 当企业进入高速增长阶段,一些有价值的客户很容易被忽视。连贯CRM零碎,销售、市场营销和服务人员就不必花大量精力搜寻电子邮件、试图与其余共事分割,进而疾速找到特定潜在客户状态相干的最新精确信息。 例如,CRM能够揭示你与潜在客户的预约——防止反复预约,让你凭着有条理的形式轻松减少联系人和潜在客户的数量。CRM还揭示销售代表在买家旅程的关键环节上跟踪潜在客户,将他们造就成客户。 此外,随着公司的倒退,你可能会减少销售代表的数量,他们将会与潜在客户和代表进行沟通。CRM有利于创立和放弃销售代表(无论他们在哪个部门)与所有潜在客户和客户之间统一的沟通形式和格调。 2.解决客户间接服务团队所面临的挑战 现在,咱们有大量在线接触潜在客户并与之建设友好关系的机会,比方借助社交媒体、网站等等。这对业务很有益处,但所有这些接触点可能让你很难跟踪和监控公司与潜在客户之间的沟通。 CRM解决方案曾经演变成应答客户间接服务团队和代表所面临的挑战——它们与其余各种各样的服务和渠道相结合。通过这些服务和渠道,潜在客户和客户参加到你们的业务中来。这让销售代表可能与潜在客户和客户进行无效地沟通,不会错过任何环节,因为所有的沟通都能够在零碎外部进行治理。 此外,CRM反对实现跨团队合作——使得市场营销和销售等部门可能共享资源以及与联系人沟通的细节,防止重复性工作。 3.通过创立工作流来节省时间 优良的CRM零碎反对市场营销和销售方面的致力,以及所有与客户单干相干的外部流程——又被称为工作流。也就是说,CRM为你主动操作、实现和组织特定的工作,进而反对简单和一直变动的工作流程。CRM零碎通过更无效地利用工夫、打消许多单调乏味的工作,使得团队专一工作,并放弃同步。 4.实现日常工作自动化 CRM将其余日常工作自动化,减速消耗工夫的工作的过程,而这类工作通常是销售、服务和市场营销团队成员须要实现的。 CRM中常见的自动化工作包含输出数据、设置集体电子邮件程序、记录所有客户沟通以及自动化客户服务工作。这种自动化类型反对销售代表回到上次来到联系人的状态,同时反对轻松治理他们与所有潜在客户和客户的关系。 简化报告和剖析流程 有了CRM,报告和剖析流程和渠道变得简略。CRM的报告性能能够让你深刻理解销售和市场营销的流程,更好地优化你在所有团队中的工作。这种剖析类型反对你为潜在客户和客户发明难忘的体验。 CRM应蕴含报告概览并具备可定制性,你能够报告贯通销售、市场营销或服务机构的任何指标。你可在任何工夫提取这些具体报告,间接与须要审阅它们的团队成员共享。 CRM将企业的客户关系治理数字化、可视化、自动化,为企业实现标准化、规范化的销售行为提供了最简洁便当的渠道。 无论你只是想要一个核心地位来组织和治理所有与客户相干的信息,还是想让外部沟通更容易,亦或是想要更快地将更多潜在客户转化为客户,或者想要改善你与客户的关系,CRM这样的管理软件可能提供帮忙。 Windy.

September 16, 2020 · 1 min · jiezi

关于开发:够开放吗来和一群开发者搞事情

近日,易观官网上线“开发者专题”,正式面向开发者展现和分享易观技术研发能力与交换社区。围绕着这家致力于开源赋能的技术公司,以及背地上百位不露姓名的代码英雄们,咱们明天一起来理解下他们的征途。 端午假期,老代参加了一堂《对于开源 license 许可与专利洞见》的在线谈判,作为一枚积极支持开源的技术开发者,除了投身日常工作外,平时延时上班,在周末得闲暇,老代也将中年的余热激情献给了 Apache 国内开源社区。 这也是小朱姐入职易观的一周年整,作为专职的产品经营,小朱姐负责的易观方舟 Argo,正在帮忙越来越多的中小企业,实现零老本部署上数字化用户经营平台。在微群里,在社区留言本,围绕着部署施行、埋点设置,长相娟秀的小朱姐东倒西歪地答复发问,着实就是个技术老爷们。 当初,小朱姐和“中年代”所在组织易观,曾经和数据打了20年的交道。从数据分析、数据产品到数据平台,易观开始积攒起丰盛的数字资产以及技术知识产权,开发推出了企业智能用户经营平台易观方舟(蕴含智能剖析、智能画像、智能经营)、互联网竞争剖析工具-易观千帆等。当然,围绕在这些产品和技术的背地,是越来越多服务底层技术的代码英雄们,咱们叫他们老代、叫她小朱。 迄今为止,易观已推出包含易观方舟智能用户经营组件在内的数据经营平台及解决方案,同时还上线了免费版用户行为剖析产品、开源了多种 SDK源码、为国内顶尖开源组织 Apache 奉献了调度工具-海豚调度 (DolphinScheduler )。 01 解放开发者,赋能企业数字化 数据开发者在工作中,可能常常会遇到数据获取难、实时性难满足、数据需要变动多,还有埋点治理乱、可视化成果差等一些列问题,从而无奈真正晋升大数据技术。 去年3月,易观推出了易观方舟 Argo,作为国内第一款收费可私有化部署的用户行为剖析工具,Argo 反对全端数据采集、自定义多维度剖析,推出行业首家智能埋点治理,Argo的背地是易观自主知识产权的秒算引擎提供实时用户剖析反对。此外,Argo 还具备更多凋谢的链接能力。 完结北京疫情隔离的老江再次回到工作岗位,作为 Argo 晚期开创成员,老江谈到,“Argo 可能帮忙开发者从日常繁琐的 SQL 工作中解放出来,让他们专一在工具优化和数仓建设上,帮忙企业大幅晋升工作效率、节约开发成本,而无需思考经费问题,在数字化经营的路上疾速跑起来。” 就像对待本人的孩子,尽管还有不完满,但在老江眼里, Argo 在成长, Argo 也是最棒的。迄今为止, Argo 社区已汇集数千名数据爱好者,大家一起探讨工具部署和应用,目前用户已涵盖新批发、教育、电商、社区、医药和金融等多个行业。 02 开源多种源码,节俭开发工夫 “通过开源 SDK,咱们心愿赋能给对用户行为感兴趣的工程师们,帮忙大家疾速、精确、无误地采集用户行为数据。”易观 CTO 郭炜说到。 数据采集是企业进行数据分析的根底,具备基石的意义。为满足不同企业需要,易观凋谢了客户端、服务端多种 SDK,同时反对代码埋点、可视化埋点、全埋点不同埋点形式,满足不同场景需要。工程师能够依据业务需要对开源代码进行调整,帮忙大家节俭大量根底代码开发工夫。易观方舟 SDK支 持全端用户买通,目前已反对采集超过22种数字用户触点,包含 Android、 iOS、 H5以及各类平台小程序等。 易观开源 SDK 反对商业我的项目使用,已有包含华润、方正、当当、九阳、CSDN 等近一百家用户应用。同时,易观装备了专门的 SDK 开源社区,汇集了泛滥前端及SDK工程师,可能及时响应社区问题:“一个滑动的布局如 NestedScrollView 嵌套一个 RecycleView,如何监听到 RecycleView 中每个 item 是否露出呢?” 几分钟后,烈火工程师间接收回代码示例,单方切磋数轮后,问题失去解决。偶然在老江、老代和小朱姐射程范畴内的问题,他们也会随时回应。作为社区负责人,小朱姐期待更多小伙伴们能提交问题、共建文档,大家独特建设本人的社区。 03 海豚调度,选好调度早回家 调度选得好,上班回家早。这句技术共事的笑梗,当初曾经成为“海豚调度”官网盖章的广告语。 ...

September 9, 2020 · 1 min · jiezi

关于开发:云开发校园合伙人招募令阿里实习生直通面试名额等你来PICK

简介: 长假漫漫,宅家宅到压力山大。云开发平台喊你出道啦!首批云开发校园大使将面向所有对Serverless和云开发感兴趣的在校大学生进行招募。变质是青春必修课,别再犹豫,不负青春,乘风破浪。成为校园KOL,C位出道,率领Serverless云开发校园爱好者玩转云开发。一飞冲天吧,少年!10个阿里实习生直通面试名额、1000件阿里云飞天代码T-shirt、1000张代金券等通关处分等你来PICK,当初报名即领优酷VIP会员卡! 参加福利: **10个阿里实习生直通面试名额 1000份阿里云代码T-shirt 1000张代金券通关处分** …… 等你来PICK,当初报名即领优酷VIP会员卡。 什么是云开发校园合伙人 校园合伙人是阿里云云开发平台面向在校大学生招募的精英团队,首批云开发校园合伙人,将面向所有对Serverless云开发感兴趣的在校大学生进行招募。并以“大咖授课+我的项目实际”的模式率领营员全面理解Serverless畛域和云开发的前沿常识。 成为云开发校园合伙人是什么体验 • 云开发校园合伙人专属证书; • 云开发平台官网集体形象展现; • 校内流动资源资助; • 阿里云开发者流动收费参加; • 与阿里云技术大咖深层次沟通交流; • 有机会领有实习生绿通资格; …… 有收益有播种,怎么算都划算! 加入发明营3步即可C位出道 第一步:云开发训练(8.3-8.11):Serverless Web开发从入门到精通 云开发学习环节,采纳大咖直播教学和自主学习形式联合,随到随学,并由技术大咖线上答疑。学习内容包含云开发协同、云函数、云数据库、多媒体托管、前后端一体化框架等Serverless Web开发必备常识。 通关处分:间断7天实现打卡的学员,取得阿里云代码T-shirt。 第二步:云开发实战(8.12-8.19):建站翻新我的项目实战 云开发实战环节,此阶段内学员基于云开发平台独立实现Web开发并提交创新作品,大神带练手把手教你Serverless Web开发技巧,通过实际真正把握这门新技能。 通关处分:实现我的项目提交处分50元资源代金券。 第三步:云开发校园合伙人C位出道(8.19-8.26):我的项目展现 联合本人开发的Web利用,写一篇介绍利用开发的背景、思考和过程的文章公布在阿里云开发者社区,综合我的项目的浏览量、投票状况及评委评分进行排名。 通关处分 :排名前50的学员取得云开发校园合伙人荣誉和证书,排名前10的学员取得实习生直通面试资格 加入云开发发明营播种不个别 • 一段干货超多的学习经验; • 每天半个小时,钉群学习,随到随学; • 每天阿里云云开发技术专家定时答疑; • 作业打卡坚固学习内容,与同学沟通交流; • 学习+实战+竞技全方位活用Serverless云开发技能; • 10个直通阿里实习生面试名额。 期待这样的你退出咱们 • 全日制在校大学生 • 业余年级不限 • 对推广Serverless感兴趣 • 对云开发有激情 • 爱分享 优良的人总是相互吸引,退出咱们,让咱们一起变得更加优良吧!! 报名通道 ...

July 23, 2020 · 1 min · jiezi

Choerodon猪齿鱼实践之开发应用服务

当有多个开发人员参加我的项目时,通过Git进行分支和Tag治理,将软件的版本控制以及分支治理贯通于整个软件产品的生命周期,能无效的防止代码抵触,进步开发效率。Choerodon 代码仓库就是基于 Git 进行代码版本治理。本文介绍了 Choerodon 猪齿鱼中开发应用服务的办法,包含创立分支、克隆、推拉代码、合并分支等。 开发应用服务在Choerodon中开发应用服务之前,首先需确认已在Choerodon我的项目下创立应用服务,并配置了 Git,包含下载安装、设置等。 第一步:创立分支Choerodon应用 GitLab 进行分支治理,默认分支为 master。目前反对六种常见的分支类型: master:主分支,用于版本继续公布;feature:个性分支,用于日常开发时切出分支进行单功能开发;bugfix:故障修补分支,通常用于修复故障;release:公布分支,实用于产品公布、产品迭代;hotfix:热修分支,用于产品公布后修复缺点;custom:自定义分支,用户能够自定义须要的分支类型。注:bugfix旨在与麻利的问题类型(故障)响应,用于标识此分支的工作是修复某个故障这里咱们以 Feature 分支为例,在Choerodon中进行分支创立。 在 代码治理 -> 分支 界面,抉择应用服务猪齿鱼Todo服务;点击创立分支,如果没有issue可抉择,则先创立问题, 抉择对应的issue;分支起源抉择master,填写issue号,如feature-1,点击创立,即可创立一个分支; 例如, 问题名称: choerodon-dev-1 猪齿鱼疾速入门文档分支起源: master分支类型: feature分支名称: feature-choerodon-dev-1![image](https://minio.choerodon.com.cn/knowledgebase-service/0/ecbb8aa99d4a41e5be5c7d8d9cead9b3@blob.png)创立完分支之后,您就能够进行后续的本地开发。Choerodon 采纳 githubflow作为咱们的分支管理策略的主体。并在此基础上,参考了一些其余策略,对开发者的开发分支做了肯定水平上的细分。更多相干信息参考分支治理。 第二步:拉取代码仓库在代码仓库 菜单,找到猪齿鱼Todo服务的仓库地址,复制仓库地址;本地通过git 命令拉取生成的我的项目代码;切换到对应分支进行本地开发。 $ git clone `仓库地址`$ cd ./choerodon-todo-servie$ git checkout feature-choerodon-dev-1克隆代码时候,会让输出用户名,明码。用户名为平台用户名,明码为用户新建后收到的站内信中的Gitlab仓库明码,若遗记明码,能够到个人信息页面重置GitLab仓库明码。 第三步:本地开发将代码克隆到本地后,就能够在本地进行开发。 通过Choerodon 提供的MicroService 应用服务模板,会生成一个极简略的spring boot 应用服务。模板自身生成的应用服务能够间接运行在平台上,如需拓展更多功能,可具体参考后端开发手册。第四步:提交代码当本地做了相干批改之后,须要将本地仓库的代码提交到近程分支上。提交的用户名明码同克隆代码库的一样。 $ git add .$ git commit -m "[ADD] init todo-service"$ git push origin feature-choerodon-dev-1提交时须要遵循Choerodon 的标准: [IMP] 晋升改善正在开发或者曾经实现的性能[FIX] 修改BUG[REF] 重构一个性能,对性能重写[ADD] 增加实现新性能[REM] 删除不须要的文件第五步:代码集成当代码提交到服务器之后,能够在页面查看继续集成。 在代码治理 -> 继续集成 页面,抉择应用服务猪齿鱼Todo服务;点击阶段跳转到Gitlab 查看 CI 执行状况。 第六步:合并分支当 CI 执行通过当前,能够将feature分支合并到master分支上。 在代码治理 -> 合并申请 页面,抉择应用服务猪齿鱼Todo服务;点击创立合并申请,跳转到Gitlab;别离抉择源分支为feature-choerodon-dev-1 ,指标分支为master,并提交合并申请。期待ci流水线通过后,点击合并分支。当master分支的ci流水线 通过当前,在应用服务 -> 点击应用服务 猪齿鱼Todo服务 ,便能在”服务版本“Tab页中看到猪齿鱼Todo服务 生成的版本。此处的版本会用于后续的部署操作。若想理解更多Choerodon猪齿鱼版本相干的内容,可参考《Choerodon猪齿鱼实际之继续交付中的分支治理与版本控制》。 ...

July 15, 2020 · 1 min · jiezi

架构师是如何练成的

前言在盘点2019年全年平台各技术岗位薪资数据时发现,架构师是全年面邀薪资中仅次于CTO的岗 位,同时,将架构师作为期望求职岗位的候选人数,仅次于Java工程师、前端工程师,以及移动端工程师。 因此,今天会把从事多年的架构经验和大家做分享,我觉得很有必要,会比纯技术的分享更有意义。 今天我将以自己的亲身经历,与大家分享技术领导者成长过程中的几大常见难题,以及一名合格的架构 师应具备的素质。 技术路线or管理路线该如何抉择?经历了3-5年的一个技术人很常见的问题就来了:我是坚持走技术路线呢,还是走管理岗位?这个问题其实并没有标准答案。 每个人的喜好不同,对自己的规划也不同。 但我觉得不论走技术路线还是管理路线,首先技术能力是不可或缺的。 技术人,如果自己的技术都不过关,很难领导好一个团队。最基础的,面临一个技术问题的排期,如果 你技术不过关,恐怕也很难保证收到的排期是合理的、符合预期的。(毕竟谁也不会真心服一个能力比自己低的人) 其次是带队能力,技术专家并不只关注技术。技术是为业务服务的,一味地讲技术深度,做出来的东西 有时候并不符合业务的需要。所以,技术专家的存在,一是带领大家对技术做攻关,二是确保业务需求 架构设计更合理。当然,管理方向和技术方向对个人的要求还是有区别的。 管理方向更多的是带领团队完成某件事,利用 好人;例如按照公司的战略方向,制定团队的作战方法。技术专家则更多关注的是技术如何更好地服务 业务,利用自身的技术能力,赋能业务、赋能团队。 所以一定要根据自身的实际情况及个人规划,选择自己未来要走的路。 架构师与程序员区别?对于任何一个软件开发人员来说,架构师都是一个令人向往的角色。 其实架构师和程序员的界限并不是很大,比如现在仍然在每天写代码。成长首先来自于自身的学习,而阅读成熟项目的代码会使人受益匪浅,其次就是来自于所从事领域的经验,要了解分布式系统的特点,在做项目时,要能够关注性能、扩展性、可靠性、可用性等指标。 架构师其实就是一个漫长的积累过程(打野),从准备期到动荡期我们都是不停的探索,学习.大部分的高级架构师的年龄都是在35岁左右,这个阶段就是程序员的黄金期。 合格的架构师该有怎样的素质?1、懂业务 没有业务,架构也就无从谈起。合理的架构也一定是随着业务的发展逐步进化的。 大部分初创公司人员简单,业务简单且变化较快,这个时候,单体应用比较合适。因为单体应用有更高 的开发效率,能够快速试错。但业务量上涨之后,公司的规模一般也会变大,人员增多,组织部门开始划分。 这时就要开始服务化, 降低系统间的耦合,职责更加清晰,每个部门对自己所负责的服务负责。随着业务量的持续上涨,就要进行更细的划分,这时可能就要使用微服务。微服务越来越多,就要去解 决服务治理,服务发现等一系列问题。 所以说,好的架构师一定是为业务设计架构。 2、技术前瞻性 架构师一定要站在业务和技术的更前端,考虑业务的发展对架构的影响,以最小的变动,支撑业务的发展。 拿某电商的订单服务来说,早期,单体应用没有订单服务,整个业务都是一个大的数据库。当业务量上 来后,有了订单服务,订单表从大库拆分,仅仅进行了拆表操作,没有进行拆库,导致后期订单库成为 了业务瓶颈,再次进行拆库耗费了很多的人力物力。 如果主导这次拆分的是一个合格的架构师,应该从一开始就要考虑到目前的技术选型是否符合业务的长期发展需求,选择一个更加合适的架构。 3、沟通协作能力 好的架构师能将自己的设计通俗易懂的讲给小伙伴,不仅要做到传道还要授业解惑。 同时,在日常工作 中,能够将自己的选型及设计清楚地传达下去,合理分工,还能交代清楚为什么这样做,这样做的好处 是什么。让每个人都清楚自己的职责,更好地完成工作内容。 好的架构师能够关注业务重点,及时解决 小伙伴们碰到的技术问题,给予支持,帮助整个团队一起提升。 4、持续学习的心态 新的技术层出不穷,持续不断地学习是技术人必备的通用素质,但架构师尤甚。新的技术能否帮助业务发展,我们现有的技术体系是否有需要借鉴的地方,都是架构师要持续学习的。 除了技术,业务方向也 是架构师需要学习的点,架构师要有广阔的视野,才能在后续的业务中有好的架构设计。 架构师如何加强技能修养?程序员要往一名架构师发展,需要进一步加强技能的修养。 对于互联网公司来言,最重要的技能是对网 络和分布式系统的理解,比较麻烦的是分布式系统,需要结合很多实际的项目和方案来理解。 因为同一个技术,在不同的项目经验后,绝对不是不同的理解。 首先架构师的技术宽度必须很广,技术深度在某一个领域是专家。 必须要有这几个要素:思考问题的角度尽量站的高一点,再高一点,从分解公司战略层面开始入手做架构设计 对业务的深刻理解,才能做好业务架构 理论学习&技术实践,什么时候都不能丢掉,这是技术架构的基础,重要性不赘述 同行业交流 时时对新技术保持敏感。 架构师自我培养?要成为一名合格的架构师仅仅通过理论学习是不行的,我自己理想中的架构师要求很高,不仅有丰富的 编码经验,而且还要熟悉硬件性能优化、内核调试、网络故障排查、系统安全、分布式系统,还有了解国内外技术的新趋势和特点,最重要的是还要善于与人沟通,敢于排除不同意见,敢于承担责任,了解团队内工程师的特点,善于将他们组成一个整体。 技术方面: 从最基础的开发做起 逐步提高解决高难度技术的能力 不断重构代码、不断优化代码,每次重构都是一次思考 业务方面: 从理解现有业务做起 从成为小领域业务专家,扩展到更多领域的业务专家 在每次重构底层代码时,更在不断思考业务架构重构与优化,做到以上,大约是个高级序员或准架构师水平。 做到以上,大约是个高级程序员或准架构师水平。 ...

June 20, 2020 · 1 min · jiezi

如何开始编码

首发于我的博客网站(prajna.top) 欢迎大家前去交流,有pdf版本。 本文主要是从应用的角度出发,分别阐述操作系统接口,计算机语言,文件系统等背后的一些知识,规范,原理,设计思想,应用法门,让初学者对编码有一个整体的,全局的认识,有一个物理的视角,找到自己的起点。 前言写这篇文章主要是基于自己大学的经历,当时抱着一腔热血去学计算机编程,可是当把c/c++语言,数据结构,操作系统,计算机组成原理等课程都学完后,却发现自己似乎什么也不会,只会printf打印一些字符串。那段时间真的好苦恼,特别想做软件,却不知从何开始,也不知道该如何去使力,蹉跎了好久,浪费了大量的时间。 造成这种现象的主要原因,一是自己缺少那种天赋,二是教学过于侧重基础和理论,每门课程只涉及到一个局部,没有一门课程把这些串起来。我不了解语言的基础库,除了printf后,其它API都不会用;也不了解具体的操作系统平台的API;虽然学了TCP/IP,socket的具体使用却又不清楚; 至于像fat,ext等磁盘文件系统的格式,那就更遥远了;我甚至还不清楚计算机语言和编译工具的关系;更要命的是,我还不知道自己不知道这些。说白了就是理论同应用脱节,虽然大学也安排了课程设计,实验和实习,但都只是走了过场,也没有人来指点一下,该看些什么书籍。大学读完,就知道拖拉几个控件做一个窗口,连接一下数据库。 windows + VC屏蔽了太多的技术细节,可惜大学期间接触的偏偏就是它,对用户这个是好事越傻瓜越好,可是对计算机的学生就要了命了。自从我转投到linux开源世界后,终于才发现了什么是自由,什么是编程。当阅读linux源码碰到不理解的地方,可以直接修改源码加上打印,分析kernel流程。对比着minix的源码来学习操作系统结构原理,那些概念就变成实实在在的数据结构和算法,动手写一个minix的驱动,微内核和宏内核区别就一目了然了。强烈建议,想学习编程的同学都去拥抱开源世界,然后,再回到自己感兴趣的或工作相关的领域。 计算机语言说白了就是工具,关键还是你要做什么,这样就涉及到了应用,以及专业背景知识。如想做驱动编程,离不开对操作系统驱动架构的了解;想做一个磁盘分区合并,那需要了解文件系统的格式;做个播放器吧,那对视频文件格式,编码格式,编解码API的了解必不可少。 随着你对软件系统了解的深入,会发现其实一切都是协议。 http 是一套web 通讯的协议;计算机语言是开发工具提供的协议; 操作系统是内核空间与应用空间的协议..., 这些协议被各种规范约束--并形成了各种技术。 所以,每种技术的背后都一套协议,规则和思想。了解这些才能算真正了解了相关技术。 在这篇文章里面,我以GNU/Linux作为平台,从应用的角度出发来把相关的课程来串一串提供一个“物理视图”,让初学者有个全局的认识,能够有一个方向和切入角度,至少知道该找些什么资料来看。 操作系统接口它是内核对应用空间提供的一套协议,主要包括: ABI可执行文件的结构。系统调用(system call)。sysfs 文件系统接口(linux kernel)。ELF是编译, 链接生成的,执行的时候,由ld 解析,加载在到内存,最后控制权交给程序入口代码,程序开始执行。因此,它提供了2类视图:链接视图和执行视图。 从链接视图上看,ELF由众多的 Section组成,编译器先把源码编译成.o文件,主要是提取函数,全局变量等生成符号表,把它们填充到相应的 Section里面去。 在这个阶段,所有的符号都是没法定位到地址的。 Link的时候,对.o文件进行合并,对各个文件内的符号进行重定位,安排它们的地址,如下图所示, link完成后,g_u8 和 g_flag2都有地址了。 对于动态链接的函数,在link阶段没法安排地址,需要放到 dynsym Section里面去,在 ld的时候,来进行定位 -- 这就是所谓的 "函数重定位"。linux系统提供了可执行程序readelf来解析 ELF文件格式,我们可以使用它来了解一下ELF文件的一些通用的Section。 bss 是没有指定初始化值的数据, 有些编译器会默认全部初始化为0。data 全局变量初始化。text 代码。init 程序初始化运行的代码。fini 程序结束运行的代码。symtab 符号表, 它是源码编译生成的产物,可以为代码运行,调试提供信息。 属于辅助性质,不参与 load 和运行, 可以用 strip来删除掉。'offset Align' 是各个Section在ELF文件内的偏移地址,我们以二进制的方式打开ELF文件,根据偏移地址,就可以查看相应Section的二进制内容。 从下图中可以看到 .interp的内容是 "/lib64/ld-linux-x86-64.so.2", 上面这些就是编译,链接生成ELF文件的过程:编译器以源文件作为输入,先提取各个文件的全局变量和函数,生成符号表,再把它们链接到一起,链接的时候对各个符号进行定位,分配地址。对于动态链接库的函数,则推迟到'加载'程序到内存的时候进行定位。编译链接后,代码和数据分散到了相应的section里面,程序加载的时候,需要把Section 合并成Secgment,然后,以Secgement为单位加载到内存页面里面去,我们来看一下Segment的结构。 ELF有9种Segment,其中比较核心的是 -- ...

November 5, 2019 · 2 min · jiezi

为-Macbook-Pro-选择外接键盘

作者: LeanCloud 毅然 蝶式键盘歇菜后,我不得不把它送到天才吧去维修。天才吧的工作人员表示,当前 MBP 在换键盘时不能换成老式键盘,也不能换成明年即将推出的非蝶式新款键盘,只能在保修的四年内重复着「使用 - 坏掉 - 维修 - 使用 - 坏掉 」这样的循环,所以建议明年以旧换新买新的 MBP。在心里面花式吐槽之后,考虑到每次去修不仅要来回折腾,还要各种倒换备份,再等待一个星期,实在是太麻烦了,于是我决定把本子上的原装键盘镶金镀银贴膜后供起来,为自己挑选一款外接键盘。 买什么样的 先确定目标:买「能用就行」的键盘。「能用就行」的标准是: 按键反馈准确。结实,不要动不动就坏。接下来要做的努力是花最少的钱买键盘。依靠着公司众多热爱机械键盘的工程师小哥哥,想想能够捡到一个其他高手不再使用的键盘,简直美滋滋。江博士拿出了他已经不再使用的 Matias Tactile Pro ,据说是已经绝版的 Alps 轴。期盼了几天到手以后: 尺寸虽然有点大,不过作为一个娇小的妹子用着一定很有范儿,也满足了我之前的两个需求。但是,这个激情四射的清脆的声音是怎么回事?我偶尔敲敲代码,大部分时间在写需求和其他同事 撕 x 讨论问题。讨论问题的时候讲究一个心平气和,这急促的哗啦哗啦的声音让我的心情不由得也飞扬了起来。 此时我已经发现要找一个合适的键盘并不简单,按照实际情况,重新调整了目标。 按键反馈准确。结实,不要动不动就坏。键盘声音要小,没有声音最好。越便宜越好。看到网络上大家会分析手感,由于我个人对手感不看中(怎样也累不死),所以手感不在考虑范围之内。 收集并感受键盘 我发现除了机械键盘外,还有大家讨论不那么热烈的薄膜键盘,以及奢华贵族专用的静电容键盘。由于到处搜集资料外加实体感受太过麻烦,我决定相信公司小伙伴的眼光,主要通过感受同事的键盘来决定自己购买的键盘。于是有了下面这些键盘(按价格从高到底排列): HHKB 静电容键盘。某宝 2000 元左右。微软人体工程学键盘。某宝 800 元左右。苹果老/新妙控键盘(小)。苹果官网 710 元。Nano 75 红轴。14 年时某宝 500 元左右ErgoDone 分体式键盘,茶轴。某宝买材料焊接约 500 元左右。雷柏 v500 。某宝 100 元左右。DELL KB216 有线商务键盘。某东某宝 40 元左右。 (仅集合了北京办公室的典型键盘,不包括昆山) 下面挨个采访一下这些键盘的所有者。 HHKB 静电容键盘,键盘有一点声音。所有者江宏,热爱敲代码的 CEO: ...

October 16, 2019 · 1 min · jiezi

为什么程序员熬夜加班项目还是会延期

首先这和你熬夜加班没有半毛线关系,千万别自己感动自己. 但凡是互联网项目,出现延期是常有的事情. 项目延期之后,一般流程是领导开会,大家讨论,新一任背锅侠,然后下一次还是老样子. 项目评审 项目初期,评审是最重要的一个环节. 这个需求能不能做,那个需求要怎么改,最后给到手的任务预估一个开发时间. 初入开发的小白,最好有同事帮衬点,做不到的需求千万别接,不然整个项目都要卡壳. 需求改不改关系不大,有的实现方式很简单,查一查资料就能快速上手,有的实现很复杂,没有谁会给你几天时间开发一个无关紧要的功能,不如直接砍掉,或者换一种简单的,免得费心费力还不讨好. 最难的就是估算开发时间,哪怕是一个有多年经验的老鸟,也不敢说估算的很准,不准确就意味着可能延期,没有奖金还扣绩效. 所以尽可能的多估算一点时间,因为老总和领导并不太在意你的开发难易程度,他们只要结果顺利,其他的自行想办法. 有时候,感觉评审就像是讨价还价的菜市场,刚刚手撕产品,又得单挑Boss,实在是弄得心力交瘁. 这个时候你别来提时间管理,老板是看市场行情,不是看工作卖力. 指定要在某个节日上线,假如留给你的时间只有一个月,实际项目开发要二个月以上. 评审的时候,你按最低最低的时间甚至预计自己加班后的最低时间估算,要二个月,中间不生病,不请假等等. 老板总会觉得这个模块不值得你估算的这个时间,这边砍几天,那边砍几天,非要砍砍才满意. 若是砍不到节前一个月的时间,口头上会临时加派人手,实际上每个项目都会有临时需求,别的都差人,哪来的给你用. 改需求 刚刚评审完敲定了项目流程开发时间,出了会议室还没有回到座位,新的需求就来了. 本来时间就一半当成两半花,结果左一个新需求,右一个新需求,三天一个大需求,一天几个小需求,搞得好像需求不需要时间似的. 没办法,产品,Boss一家亲,小小员工没有拒绝的权利. 如果说Boss定的时间,你加班,熬夜,周末也不休息,努力赶一赶工期,只要和预期差别不是很大,一般没什么问题,最多就是没有加班费,身体快挂了一样的累. 那产品需求就是枪林弹雨,不定时的炸弹,任你再多的时间都直接被打成筛子,一个炸弹就让整个项目可能挂掉重来,这种事情并不是没有过. 要知道,改代码往往比新功能开发至少多花费几倍以上的时间,越改越多bug,看似一个芝麻小的需求,很可能就需要推倒整个模块. 人人都是产品经理,可试问,有几个产品懂技术? 那种app识别手机壳颜色的操作不在文章讨论范围...... 开发联调 时间可以预估,需求可以砍掉,但是人才是最不稳定的因素. 产品/UI和前端,前端和后端,前后端和测试,就拿前端来说,几乎和每个环节都要打交道. 一个项目由不同的人开发不同的模块,开发过程中需要不断的沟通和协调,才能顺利进行下去. 谁先谁后,或者同步进行,都有规律可循,一旦中间环节掉链子,空有大把的时间也只能卡壳. 正式开发的时候大家时间都很紧张,能够愿意腾出时间沟通,算是性格比较好,技术品过得去的. 最常见的问题是 API改了字段或者增删了接口,既没有及时通知别人,也不修改文档,让别人莫名其妙的排查,最终定位到他的时候,才懒洋洋的说知道了.测试包一直等待打包,确实是人忙不过来,还要一个一个手动打包,或者有时候忘了,等过一段时间问起,才想起来,又或者其他的,优先级问题记得有一次,测试在禅道上提出一个bug,没有截图,说明也很极简,并不能很好的表达出问题所在.(注:自己刚入公司) 这边尝试复现,定位问题和排查,因为流程复杂,操作一遍需要一定长的时间,最后去问测试的时候,对方直接扔来一句"你不会自己去看啊". 流程里就规定要注明机型,场景,尽量有截图,视频,总有人不按规定,这个bug定位只有他手上的测试机机型才有这个现象,而他知道却没说明. 要明白,主动过去不是意味着求帮助,而是花费自己的时间尝试去和对方友好沟通,去之前就完整的排查了一遍,要是文案详细,也没必要找测试. 类似于这种人,工作不负责,沟通不友好,说不定还是个老油条,对上面客气,上面不动他,对新人和同事不友好,你不喜欢他也对他没什么影响,活还是要继续干. 所以这种人,建议直接拉入黑名单,公事公办,之后的bug,但凡不明确的一律踢回去. 虽然公司会议上和项目群里一直说后台API要自测,测试反馈要详细,其他怎样怎样,可长期还是老样子,这其实和一个公司的团队氛围,管理能力,息息相关. 人在职场,除了本职能力以外,最重要的就是沟通能力,自己的沟通能力要强,可别人愿不愿意配合就是另外一回事了. 技术问题 一个bug卡半天的也不是没有. 个人的技术能力也决定了开发效率,只能说技术可以自我提升,但是上面的种种非人力可以干扰. 其次加班的效率并不高,常常三个小时不抵白天的半个小时,而且一般都是解决一些临时需求和伪需求. 技术本身说难也不难,说简单也不简单,区别在于花多少时间学,用什么方法学,有没有兴趣之类. 技术是一个软实力,无法可视化,无法短时间提升,也是一个综合能力,不一定和本职技术有关. 开发效率往往可以从一些软件,插件,硬件,工具,方法和技巧上来做提升,短时间几倍十几倍的提升. 如何提升工作效率,是一个开发人员长时间要去思考的问题,尤其是经常加班的前提下.

October 4, 2019 · 1 min · jiezi

为什么推荐程序员录制课程

程序员的副业有很多种,唯独视频课程当下最为推荐. 从几年前写博客以来,一直主张的是技术分享和思维方式,个人成长始终是核心. 但是"恰饭"和成长并不冲突,两者互成因果,正向循环反馈,也是如写作一样,几乎零成本,意义巨大. 谈趋势 时势造英雄,很多时候成功不过是自己的一点基础恰好命中时代的需要,运气和努力都很关键. 博客时代已经落幕了十几年,现在还在坚持写的少之又少,短文字更加适合快节奏的社会步伐,所以有了微博. 娱乐至死的年代,有人热衷为明星打call,爱好花边新闻,有人想要深度思考,不想被人喂养投食,有人想要一夜暴富,功成名就,于是自媒体大行其道. 当浅薄的资讯已经无法满足人们之后,当整个信息环境已经稳固定型之后,资本需要新的渠道和新的收益的时候,知识付费应运而生. 学习打卡,社群人脉,读书健身,一切看起来自我成长的内驱力都被赋予了各式各样的理由,大部分人交了"智商税",少数人破蛹成蝶. 现如今短视频当道,流量经济全部往视频倾斜,各大巨头纷纷布局,反观公众号等自媒体,早已是明日黄花. 写作从博客到短文字再到自媒体,无非是换了一个又一个形式,本质上好的内容依旧是一切的基础,只是不太适合当下. 视频作为另一种载体,能够搭上知识付费尾巴和短视频顺风车的,对于程序员而言,录制视频课程,无疑是最佳选择. 谈成本 无论是程序员的个人品牌还是开发人员的副业刚需,反复提及的来来回回都是那么几个. 从时间成本和精力成本简单到困难的顺序来看,写作>录课>演讲>开发程序>出书. 近段时期算是尝试了其中一些 在视频平台录制了一些视频在网易云课堂上架了免费课程在google play等发布app在公众号运营自媒体,开始构思出书的整体框架和内容发现和当初一开始就选择个人独立博客一样,打造了一个信息孤岛,一个平台闭环,没什么流量和反馈,甚至键盘侠都没有几个. 比起写作而言,录制视频不会有内容枯竭的现象,很多人写作一开始很多可以写,写着写着就发现能写的都写完了,除非不断的输入大量的内容,不然就没有什么存货了,并且写作最不被推荐的就是写流水文,没有思想的内容是没有灵魂的. 但是视频不一样,视频本就是记录和展现,尤其是编程视频,无论是运行过程中的错误提示,还是解决问题的方法,或者是安装和下载的步骤,都是越还原越好,当然,如何设计课程,剪辑视频,PPT演示都是有很多技巧可言的. 谈规划 又到了程序员中年危机论的时候. 人到中年,程序员就应当考虑转管理或者自行创业了. 技术并不总是去写代码,创业也不止于软件产品. 在程序员职业路径中,有一种特殊的职业,叫做讲师,通俗点说就是培训班. 由于大学并没有设立编程开发相关的课程,K12也几乎是是一片空白,想要转行互联网,培训班是大多数人的选择. 又如同,学音乐的不见得举办演唱会,学画画的不见得办画展,学瑜伽的不见得就要做出点什么. 很多学习类的知识,除了应用于做事以外,有时候的用途就是学了去教,至于别人是继续教还是做什么,就不在考虑范围了. 课程是一个极其垂直类的产品,谈学习谈成长愿意为之付费和主动学习的少之又少,这种道理都懂却依然过不好这一生的事物,也没有人爱看了. 但是技术是一个硬需求,有就是有,少了一个标点符号都不能通过的那种,技术迭代,不断需要新的课程,职业也在一直演变. 从个人成长来讲,录制课程有助于记录自己的实时操作,整理自己的所学所为,以可视化的角度展现和分享给别人. 从职业规划来讲,中年转行讲师,或者将来演讲培训,都需要锻炼自己的口才和思维,录制视频是一个很好的起点. 从副业刚需来看,目前短视频经济,在线教育还没有如同软件一样需要软著和公司资质,把个人限制的全方位无死角,而付费课程恰巧能打通支付渠道,同时和写作一样也是复利的一种,并且更加具备专业性. 如果写作注重沟通的话,那么视频课程表现的更加专业,对提升行业影响力和求职也是不错的选择. 谈坚持试一试又不会错,也不会损失什么. 录制课程的成功或者失败,总会让你进步. 以上的所有内容仅为个人思考,具体的还是要看自己的时间和目标等因素. 自己录制了一些课程,有所付出,也有所收获. 有一门在网易云课堂的课程<<react native 从创建到发布>>就是体会到了热门的流量效果,没有推广也一直有学员,反而一些冷门的课程,再怎么推广也很少有人看. 写作,还是会继续坚持,它促使我不断的思考,输出倒逼输入,不断学习.从内而外成长. 录课,还是会继续尝试,看的到逐渐的进步,更为垂直的专业有助于职业学习和发展.

October 1, 2019 · 1 min · jiezi

程序员请创建你的第一个产品

作为一名技术开发人员,拥有创造产品的能力,是我们得天独厚的优势. 现在的互联网企业,就是把一些新的概念和想法,构造成应用,提供服务和数据等来获得收益. 程序员可以开发自己的产品,除了没有公司强大的财力背景,其他的地方并没有什么区别,依然可以打造一个小而完整的生态链. 核心资源 常常一直在思考,什么才是一个程序员最核心的资源? 它既是你的资产,也是能力的证明,可以打包带走,也可以分享给他人. 我们可以开发软件应用,也可以录制视频教程和出版书籍等信息产品. 教程和书籍能够扩大我们的影响力,带来一定的收入,可它们不足以构建一个企业. 线上教育类型的企业到是符合,但是这远不是一个单兵作战能够胜任的. 而软件才是大多数互联网公司的基础和核心,对于程序员的意义也同样如此. 最小化应用 软件开发应该秉着快速创建,小步迭代,持续优化的原则. 快速创建一个最小化应用,先开发核心功能,再逐步扩展. 这个应用可以没有登录,没有支付,没有分享,没有其他附加属性,只有我们最初的想法和创意. 最小化应用有以下好处: 用极短的时间创建并发布一个,快速触达用户,甚至快到只需要十几分钟或者几个小时.获取产品使用数据和用户建议及反馈,数据分析有助于了解市场,用户的反馈是持续扩展的前提.产品矩阵和占位,互联网应用千千万,相似的太多,好的创意都已经被别人实现了,谁先谁就可能赢.举个栗子我的第一款产品是一个chrome扩展,名称叫做click nice 当时在查找html模板资源的时候,看到了鼠标指针图标的推荐,觉得很是好看. 然后在替换鼠标指针的时候,发现不仅要在电脑系统设置中修改光标文件,而且修改之后所有的地方鼠标指针都变成同一样式,可我只需要在浏览网页时替换光标即可,并且支持随意更换,省去繁琐的设置过程. 这个时候,就产生了自己制作chrome扩展的想法,花费了大概一天时间,完成了第一个应用. 后来,为了使用番茄工作法写了小程序番茄钟,为了学习React,写了App简易计算器,为了查看照片元信息,写了网站Exif元信息,为了记录属于自己的私有笔记,写了云笔记,学习python,开发了桌面应用微信机器人等,还有一些其他应用就不一一列举了. 有些已经失效不再维护,有些正在自己使用,有的尝试分享或者商业化. 服务集成 我有一个好点子,就差一个程序员了. 程序员也仅仅只需要一个好的创意就足够开发一个优秀的产品. 产品知识简单学习即可,设计有现成的第三方UI框架,测试可以自己复测,后端可以使用serverLess云服务. 你能想到的一切,都有第三方提供服务,只需要一定的费用,也可以部分外包. 总而言之,能用框架的用框架,能用服务的用服务,尽可能负责核心功能的开发和维护,弱化对其他环节的依赖. 这能保证我们的应用在初期快速而相对完整. 当产品第一版发布,就可以开始扩展和优化,完善到一定程度时,就可以尝试使用自己的技术重构,减少对第三方的依赖. 作为一个练手产品,我们更多的是注重技术的学习和熟练运用,作为一个商业产品,我们应该注重的是实际功能和市场价值. 所以作为一个独立开发者,要根据具体情况分析产品的开发过程,依据时间和财力等因素选择适合自己的一套方案. 持续开发 还是一句经常提到的话,程序员不要陷入技术思维,也要具备商业思维和其他能力. 我们学习技术是为了更好的生活,不是为了学而学,学习就是为了使用,不论是工作还是其他. 开发一个产品就是除了工作以外,学习技术发挥作用的真正载体,这个过程可能持续几天甚至好几年. 一般情况下,三个月为一个产品的完整开发周期,当产品基本完成后,剩下的就是日常维护和新功能的添加等. 独立开发也分为产品开发周期,到后期维护阶段,时代发展太快,用户需求也一直在变. 持续开发能使我们的技术和能力一直顺应市场和变化,和完成一个足够优秀的自己的产品. 一些问题 市场上有很多符合我们需求的产品,为什么还要开发一款类似的应用呢? 从个人角度上讲,原因有很多,最主要的是软件对数据和隐私的收集,谁也不希望用个计算器,手电筒等工具型应用等,都把自己的老底给扒个干净. 本质上免费和付费的服务都是或多或少出售了用户的隐私和数据,你没得选. 从用户体验上讲,不喜欢无处不在的广告,不喜欢设计的操作流程,或者功能不足以满足等,谁也不想广告一直粘着你的眼睛. 从开发角度来讲,我们可以设计的更好看,功能更完善,甚至比对方便宜或者免费,不受对方限制,拥有更多的自定义的权利. 创建产品可以学习开发技术,可以解决某些痛点,可以将其商业化,可以成为独属于自己的核心资源.

October 1, 2019 · 1 min · jiezi

Nervos-强力招募区块链开发工程师

继《Nervos 与火币联手打造金融公链》新闻发布后,我们马不停蹄开启了新一轮人才招募计划。区块链开发工程师们、以及有志于投入和钻研区块链开发的,请瞄过来!加入我们,一起开启区块链工程实践的黄金时代! 什么是区块链开发十年间,区块链从 1.0 发展到了 3.0,从点对点的电子现金到智能合约再到扩容解决方案的实践,区块链技术的不断进步让我们相信一个更加美好的新时代已经来临。 区块链技术设计密码学、经济学、共识算法、P2P 网络、数据存储等多领域。作为一种革命性技术和新的发展领域,区块链为开发者和技术爱好者创造了新的就业机会。 区块链开发主要分为两个主要模块:核心区块链开发和区块链软件开发。核心区块链开发人员主要负责开发区块链系统的架构,如何设计协议,共识协议的设计以及与区块链技术相关的其他高级决策和开发。而区块链软件开发人员使用 Core Blockchain 开发人员设计的架构和协议来构建在区块链技术上运行的去中心化应用程序。 关于 Nervos NetworkNervos Network 是由 Nervos 基金会成立,通过一层公有链协议 Nervos CKB 保证网络的安全性与去中⼼化,二层协议提供具有可扩展性的交易和计算服务,以及多个应用层协议衔接商业场景。 2018 年 7 月 Nervos 完成 2800 万美元的融资;2018 年 11 月,Nervos CKB 代码开源;2019 年 5 月,CKB 测试网正式上线。 Nervos 的工程师们Talk is cheap,show me the code。Nervos 的开发团队是一群热爱开源的 Hacker,他们希望用最简单的代码解决问题,但简单并非容易。20 多位开发者在 400 多个日夜、5 次封闭开发,将 Nervos CKB 测试网呈现。 开发团队有着深厚的区块链技术研发和开源精神 首席架构师谢晗剑(Jan)曾是以太坊(Ethereum)核心研究团队唯一中方成员,与 Vitalik 一起从事以太坊的早期 PoS 协议和 Sharding 方案的研究,实现了以太坊 PoS 的早期原型。他设计与开发了世界上第一个开源数字货币交易所 Peatio 以及世界上第一个使用微服务架构的开源企业区块链内核 CITA。 ...

July 12, 2019 · 1 min · jiezi

开发生涯的一些微小思考

主要是我的上司(HZF)分享给我们的,觉得不错,就记下来。 技能:主要是沟通,英语,项目经验和写作技能。 对于一个程序员来说,技能不光是写代码,写更好的代码,做成一个项目,大多数的项目更多依赖于交流,然后再是功能实现,而大或精的项目在实现方面需要更多时间,如果有非常好的设计和文档,同样会减少交流的时间。但这种情况太理想化了,实际中更多的是技术参与技术评审和产品设计,而在项目开发阶段,继续修正一些细节逻辑。一些复杂的功能应该从一开始就告知技术负责人,来让他一开始对项目难点和进度有所考量。沟通水平甚至是项目开发中最重要的一部分,所以我们经常见到一些没啥技术但会说话办事的人当领导,而不是只有技术但沟通水平差劲的人当领导。 英语,如果你英语好,会不会Google都无所谓,你会发现网络世界真的太广阔了,而在技术开发中,会英语也会接触到更多的资料和知识库,遇到一些报错甚至可以提高解决问题的效率。项目经验不光是自己技能的展现,更多的应该是带来更多思考,加上在项目运行中遇到的实际问题,这些在后续的开发中是很宝贵的经验财富,假设新起一个项目,借助以往的项目经验,可以在产品设计阶段就优化一些东西,开发中更能少走很多弯路,这就是项目经验的价值所在。写作技能和语言表达水平,逻辑能力正相关,语言表达更多的是展示在日常沟通中,写作比较倾向于表现在技术分享和博客类文章中,完整的逻辑能力可以应用于各种场景,用思维分析解决问题,发散联想到问题上下游相关的信息,不会在修改一个问题的生活,带来其他的问题。这种逻辑思维能力会伴随人终生,不管以后从事什么工作,做什么业务,甚至创业,一个优秀的分析问题的能力绝对是宝贵的技能。 工作:主要是对工作保持敬畏,尽心尽力,不断学习,适应公司和个人的发展。 对工作保持敬畏大概是,老板开公司+提供工作岗位+按月发工资,这对于老板来说是承担着全部风险,老板与员工是雇佣关系,在合同规定的条款内,作为员工应对工作恪尽职守,尽心尽力去做好这些事情。我们不用去承担公司破产了家庭也会破产这种风险,对于员工来说,只做好分内的事情,是风险极小,收益很高的事情,甚至不需要花费更多精力去考虑全局的情况。此外可以在工作之外的业余时间,多为公司着想一些,老板如果混得不错,他的圈子价值也很重要,猜他会怎样对待为公司很着想的员工,总是有无限可能的。 不断学习,这个是很基础的职业态度,但坚持下来需要很强的自制力,类似有些关于底层原理,基础的东西,特别难以学进去,而且也不会很快用到,而坚持学习更是艰难,这些在短期内看不到学习的成果,也不能快速变现,但对于自己不断学习更多技能,甚至一个新的语言,基础知识是重中之重,对此可以每阶段学习的内容可以记个笔记,甚至写个博客文章。假如公司的业务在不断的发展,也会对每个人的技能有新的要求,只有不断的学习才可以达到这个目标,而技能的提升对于公司的发展也是相辅相成。 随便说点,还有一句觉得不错的话是:be tough, in a soft way. 保持严苛,以一种温和的方式。这个可以代入自己的理解,个人理解是:在团队中以温和的方式来严格要求成员,严谨高效完成任务,要求每个人成长,对于自身来说,不论多少,每天都要有一些进步,罗马不是一天建成的,而我们也不会一天就成长为大佬。努力,会有一天成为大佬的。

July 10, 2019 · 1 min · jiezi

1入坑程序开发需要哪些装备

本文是《程序猿叨叨叨》系列文章中的其中一篇,想要了解更多相关的文章,欢迎猛戳蓝字前往阅读。作为刚入行或即将准备入行的小伙伴们来说,程序开发、上手写代码一定是你们急切想要尝试的事情吧!但是先别急,工欲善其事必先利其器,想要强化自己,有一套合适的装备是必不可少的,接下来我们来看看如何挑选我们的装备。 笔记本先来看看咖啡君的笔记本:2011年初产的二手MacBook Pro (MC724CH/A) 这台本本,是咖啡君省吃俭用、勒紧裤腰带好几个月,才从某不知名二手苹果柜台买来的。 本本配置如下: CPU型号Intel 酷睿i7-2620MCPU主频 2.7GHz内存 8GB DDR3硬盘 128G SSD固态硬盘 && 500G普通硬盘屏幕尺寸 13.3英寸显卡类型 核芯显卡上述是我们购买笔记本需要关注的重点参数,下面咖啡君将根据用途推荐相应的配置。 喜欢玩游戏的童鞋们: MacBook不适合玩大中型端游,下面为windows参数CPU型号:i5四代以上或i7三代以上CPU主频:2.3GHz以上内存:8G DDR3或8G DDR3d硬盘:普通硬盘300G以上,SSD固态硬盘更佳屏幕尺寸:13英寸以上显卡:独显为佳,推荐`英伟达`显卡;如今AMD集显也不赖不玩游戏的童鞋们: CPU型号:i5三代以上或i7二代以上CPU主频:1.6GHz以上内存:8G DDR3或8G DDR3d硬盘:普通硬盘300G以上,SSD固态硬盘更佳屏幕尺寸:13英寸以上显卡:能显示画面就行这里强调一下: 强烈建议童鞋们将自己的内存搞到8G,因为到后期开发,我们会同时用到很多开发软件,浏览器开启N多个网页,这是非常吃内存的,所以8G内存是标配。根据方向选电脑,如果有意愿将来开发游戏的小伙伴们,推荐购买高配MacBook或战神、外星人、微型GTX系列等游戏本;如果是普通的网页开发、移动端开发、后台开发等,推荐购买中低端MacBook或非低端入门级的Windows系统的笔记本即可,参数可参考上面。屏幕越大越好。相信正式入门的猿猿们都被屏幕上开发IDE、开发文档、浏览器之间的切换困扰过,因为屏幕太小,切换起来太麻烦。扩展显示器上一节我们说过屏幕太小的困扰,所以为了方便开发,有条件的小伙伴们可以给自己配一个扩展显示屏。 扩展屏的配置很简单,用到设备如下: > 某某牌子显示屏一只> 电源线一条> 视频传输线一根(VGA、HDMI等)> 对应的转接口一枚(根据自己的情况来) 扩展屏价格在200~2000大洋不等,对于刚入坑的小伙伴,建议价格在500大洋差不多就可以了,一味地追求高配置,反而让自己无法集中注意力来提升技术。 下面推荐两款比较不错的可旋转显示屏: 【戴尔U2414H】 【iiyama】 更多显示屏信息请查看知乎。 机械键盘入了坑的小伙伴们大部分都有这样的痛感,键盘是码农们打开计算机世界大门的钥匙,很多高级码农(我们称之为极客)将键盘奉为自己的第二生命,拥有一款称心如意的好键盘是很多极客的渴望。如果说电脑是猿猿们的黄金圣衣,那么机械键盘就是码农们的屠龙宝刀,一款好的机械键盘足以让极客们使用十年!!这里我们聊聊机械键盘。 首先来扫盲一下,机械键盘根据按键轴的不同分为九种: 名称压力声音适用于设计商黑轴大响游戏Cherry红轴一般响写代码Cherry茶轴一般很响写代码Cherry青轴一般响写代码Cherry白轴很大响停产Cherry奶轴不明不明停产Cherry绿轴不明不明停产Cherry灰轴不明不明停产Cherry黄轴较大响游戏雷柏(国产) 现在市面上比较常见的四种轴分别为:黑轴、红轴、茶轴、青轴。 接下来,推荐咖啡君使用过的两款机械键盘: 【Cherry-G80-3000 3494】 咖啡军入坑半年之际在套宝上购入此款黑轴键盘,使用了此键盘后,腰不酸了,腿不痛了,连敲代码都有精神了,从此薄膜键盘成过客。 【Leopold FC660M】 上一任Cherry键盘虽然经典,但其身材过于霸气,适用于家庭装,因此本猿另外选购了此款FC660M。其键排紧凑,充分节约了空间,同时加重的地盘提升了分量感,价格在可接受范围,适合经济稍稍宽裕的猿猿们。 这里强调一下:对于刚刚入坑的小伙伴们来说,机械键盘并不是必需品,与其说它是码农们敲代码的利器,不如说它是一些有条件极客们的收藏癖,咖啡军提到机械键盘并不是鼓励所有小伙伴们都去购买,而是一种从认识层面的推广,希望各们量力而行。 鼠标键鼠键鼠,有了键盘,再来一个鼠标也是可以考虑的。为什么是可以考虑的而不是很有必要呢?这个就因人而异了,咖啡君就独爱Mac电脑的触控板,为什么不是用鼠标呢?原因如下: 1. 线太长,如果不是用来上吊,拿来拿去还是有点不方便的2. 什么?你说你用蓝牙鼠标。嗯!端着电脑上面再放上一个鼠标,一没拿稳,就等着鼠标在地上啪啪啪——地摔了3. 因为用的是Mac电脑-_-||当然,如果有偏爱鼠标的小伙伴,这里对于挑选鼠标,给各位简单说一下: 1. 无声或小声为佳。等入了坑,当半夜一两点钟你深睡时,室友们在LOL的屏幕前狂点鼠标啪啪啪,你就知道无声鼠标的好处了。2. 鼠标按键压力轻松为佳。咖啡君之前花80大洋入手一只形状独特的触摸滚动鼠标,拿到手后发现按键特别硬(压力大,费力),当时就后悔了。3. 无线或有线根据自己喜好来。4. 不要买山寨苹果鼠标!不要买山寨苹果鼠标!不要买山寨苹果鼠标!U盘说到U盘,咖啡君从心里感到无力,从入坑三年前花30大洋向同桌买了一个金士顿512M的U盘到目前为止,丢掉的U盘不计其数,也只能用囤货来保持U盘的命脉延续。 U盘虽体积不大,且一般情况下用到的频率也没有键盘鼠标的频率高,但经常是盘到用时方恨少,装系统、拷贝代码文件、考前材料打印、简历打印,一旦到了这个时候,身边没有U盘的小伙伴们可要急坏了。因此,随身携带一个U盘对于各位们来说是十分有必要的。 ...

June 18, 2019 · 1 min · jiezi

优秀工程师必备的一项技能你解锁了吗

阿里妹导读:很多程序员在工作一段时间后会遇到迷茫期,虽有技术傍身,也难免会产生焦虑,反复思考怎样才能快速成长。关于如何提高自己的思考力,运用思考的力量推动能力提升,以此实现技术成长,阿里巴巴盒马产品技术部的岩动总结了一套思考方法,分享给每个正在成长的程序员。(本篇文章较长,阅读时间约30分钟,建议收藏后,找一个合适的时间慢慢品读哦)引言我们来看一下几类在程序员成长、发展的常见问题,如果你或多或少存在一些,那么恭喜你,这篇文章值得你仔细往下看了: 你自认为付出了跟别人同样的努力,但是你的成长确实更慢一些,比如学得比别人慢,排查问题比别人慢,出方案老是有漏洞等等;你觉得你只是在疲于应付需求,自己做的事情完全没有技术含量(很多人觉得自己做的业务开发就是没有技术含量,但我认为每个领域都有自己的技术含量,只是你有没有get到);你发现总是在犯同样的错误,或者做的事情不断地在同一个水平循环;每次要晋升的时候,你发现根本讲不出来(很多人会认为是表达能力问题,但是我认为不是);当你换到一个新的领域,你发现自己的经验好像用不上;你一直很难搞懂老鸟说的“认知升级”到底是什么概念?不同级别的技术思维能力到底有什么差别?为什么晋升的是他,而不是我?在这篇文章里,我会告诉大家一些技术成长的误区,我先点出来: 只要把事情搞定了,成长是自然而然的事情——可能过段时间,你发现之前犯过的错误,后来一个都没有避免;我只要努力,996甚至007,我就能够成长得比别人快——可能你发现你干得最多,但是并没有拿到最好的结果;我尽力了,还是比别人慢,应该是我智商确实差一些——恭喜你,其实大家的智商并不会有太大差别;别人表现好,或者晋升了,只不过是比我表达能力更强而已——我可以负责任地告诉你,这并不是仅仅是表达能力的问题。先抛一个非常重要的结论:“思考力”是程序员需要具备的一种至关重要的素质。掌握了思考力,你就掌握了在互联网领域,这种高度“智力密集型”行业成长的钥匙。上面这几个成长的问题和误区,跟没有掌握思考力有着非常重要的关系,而且我发现所有发展比较顺畅的同学,他们的思考和学习能力是非常强悍的。 我个人在工作中,一直有意或者无意地锻炼自己和团队同学的思考力,包括哪些是对我们最重要的思考力,如何去训练思考力,有一些心得,希望能够分享给大家。 关于思考力思考力是一门很深的学问,包括认知科学,心理学、教育学、逻辑学,如果要系统化学习,是需要看很多书的,我推荐以下几本: 1.《金字塔原理:思考、表达和解决问题的逻辑》-[美] 芭芭拉·明托,这本书系统阐述了思考、表达和解决问题的逻辑,也是麦肯锡的思维能力基础,算是一本比较标准的思考力教材; 2.《麦肯锡教我的思考武器》- [日] 安宅和人,作者根据自己在麦肯锡公司工作时积累的丰富经验以及脑神经学的专业背景,设计出一套极具逻辑性的问题解决思维模式; 3.《思维的本质》-[美]约翰·杜威 ,这本书是美国著名教育家约翰·杜威的代表作,阐述了思维训练的基础理论和实践; 本文并不是探讨思考力的深层理论,而是分享我们从日常的技术学习和项目过程中沉淀下来的思考力,以及如何培养这些思考力,这些思考力几乎我们每天都可以用到,只要你有一定体感,你一定会感同身受。 有哪些对程序员最重要的思考力原理性思维:找出知识背后的原理 有的人会说,为什么要思考原理,而不是直接掌握知识就可以了?我只需要会用就行了啊。 我们先来举一些技术方案设计的案例: 为什么订单创单要先create,然后enable?这其实是一种采用二阶段提交解决分布式事务的思路,只是从一般的事务框架延展到交易领域; 业务系统中为什么要使用消息?因为消息使用的是观察者模式,观察者模式的好处是可以实现多个消费事务与触发事务的解耦; 为什么业务系统中会使用DTS来做补偿?这本质上是一种最终一致性BASE理论解决分布式事务的一种思路; 为什么更新数据的时候一定要在sql中加上版本比对或者状态比对?这本质上是一种借助DB实现的乐观锁机制。 进一步,你会发现再大到系统架构和顶层设计的案例: 比如阿里系的技术框架NBF、TMF、早期的webx,各类框架设计理念,逃不脱设计模式,比如开闭原则,模板方法、责任链、工厂模式、开闭原则;不管是底层中间件,错综复杂的业务系统,在设计的时候永远无法离开核心的业务建模,比如实体与实体关系的构建;在分析这类系统的设计思想时,你会发现最好的工具就是UML!实际上除了软件领域的原理,还有商业设计的原理,比如案例: 所有的售中退款前必须要先取消履约,所有的履约过程中发生缺货都需要退款,为什么?因为交易的基本原则是:“钱货平衡”,钱和货的变更必须是最终同步的(允许短期的不平衡),你掌握了钱货平衡的基本原理,交易中的很多复杂的流程设计就很好理解了;在设计财务系统、库存系统时候,业务流程、业务逻辑可能非常复杂,导致你晕头转向,这时候“有借必有贷,借贷必相等”的财务平衡性原理就发挥作用了,你只要知道这个原理,很快就能看懂各类财务流程、库存流转流程,以及各类数据对账逻辑;在我的领域“高可用线下收银系统”进行线下系统容灾的时候,有各种容灾方案的设计,会员容灾、商品容灾、交易容灾、支付容灾……不同的容灾手段看起来让你眼花缭乱,但是他们有没有共同遵循的原则呢?有,这就是“让消费者最快速度完成交易,但保持最后追溯的能力”。你只要get到这个基本原理,设计各类容灾策略就会得心应手了。 此外,我们的工作流程、管理手段,同样也蕴含着深层的原理,非常有意思,大家可以抽空仔细推敲一下,比如: 为什么团队机制要透明?沟通要透明?为什么要有owner意识,都是在工作,owner意识会有什么不同呢?为什么管理者不能管得太细,也不能放羊?到底哪些该管,哪些不该管?所以,掌握了知识背后的原理,带来的好处是: 软件系统的复杂度越来越高,我们所面对的场景越来越多,掌握原理实际上可以大幅度降低我们对于知识的记忆量,知识量是爆炸的,但是原理绝对是可控的!原理性的东西比直接的知识有更强的复用度!记住最核心的原理,当你面对新的场景时,你会惊喜地发现,你的理解速度大大加快!这个点大家应该有体会,比如可能之前我们都学习过dubbo等底层的RPC通信框架的基本原理,但是你如果仅了解了他的基本用法,你会发现对你现在做业务系统没有什么帮助!但是,当你了解的是dubbo如何寻址,如何做容灾,如何做扩展,你再去做业务系统,发现设计原理是一样的,并没有本质区别!这样你之前研究中间件的设计思想就可以快速用到业务系统上面。另外探求原理的过程,本身很有乐趣!这是一个非常有价值的思维训练过程,不断对系统设计思想、业务设计思想、做事情的工作方式,追寻背后的原理,并找到他们之间的共性,在我看来非常有乐趣,一段时间训练以后,你会发现你看透本质的能力越来越强!好,那么我们程序员的工作中,究竟有哪些与原理性知识是需要我们掌握的呢?按我们团队的实战经验来看: java,linux,数据结构和算法,数据库,网络通信与分布式计算的原理,这几类是比较重要的基础知识,我们在做方案设计、编码、问题排查中会运用得很多;设计模式,UML这个是对系统架构设计必要要掌握的知识,当你经历了很多大规模的软件系统设计,回到根本上,你会发现逃不出这一块的理论和工具;领域性的基本原则,比如我们上面提到的“钱货平衡”,“财务平衡公式”,“线下收银让消费者最快速度走人”,这种逻辑需要大家get到这些领域性的设计原理,甚至自己去总结出这种原理;关于管理学,人际沟通,心理学的一些基本原理,大家可以按照自己的实际需求去看一下。如何在工作中学习和运用这些原理,我觉得有一个最佳实践: 首先,对你可能用到的领域知识,建立一个基本的概念。看书,看文章,找行业资深的人去聊,都可以得到。注意,这里需要有一个基本的概念就可以,这样你在有可能touch到这些原理的时候,你会有意识,也不至于花很多时间;在实践中,有个意识是“多问一下为什么”,并一直“刨根问底”,最终肯定能够追查到背后的最终原理;这里面还要注意思考一下,为什么在这个地方会运用这个原理,也就是找到“场景”和“原理”的关联关系,这样你的理解会更加深刻;了解了原理以后,在实践中运用一下,这样你对这个原理的理解就会非常深刻,并且你知道如何去运用这原理;如果这是一个非常重要的原理,建议大家如有余力去结合经典的书籍系统化学习。 结构化思维:构建自己的知识树 知识树要解决的问题,我们看一些场景: 为什么我知道很多东西,但是当场景来的时候老是会记不起来使用;完成一个方案你只能想到一些点状的手段,还有其他方案被漏掉了;讲一件事情的时候逻辑非常混乱,前后没有逻辑性关联。但是很有可能你的知识都是知道的,为什么会出现这种悲剧? 这个就跟大脑中的知识结构有关,这是知识学习中“索引”没有建立,也就是说,你的知识只有点,没有线!大家想一想,把东西乱七八糟地丢在房间中,到用的时候没有查找的线索和路径,怎么找得到呢? 来看一下我们工作场景的结构化的典型案例,大家体会一下: 项目中测试MM提了一个bug,我总结出来的比较标准的问题定位步骤: 确认刚才是否有过代码变更和部署,因为有比较高的概率是刚才变更的代码又搞坏了……追踪链路日志看链路是否有异常;通过RPC的控制台调用看接口输入输出是否符合预期;追踪关键方法的入参和出参,看是否有问题;定位到方法细节后,推理逻辑是否有问题;如果无法通过推理,那就最后一招,回放异常流量debug,这样肯定能够找到原因。某个链路耗时比较长,需要进行性能优化,我的分析步骤是: 通过实际流量制造一个耗时较高的trace;进行trace分析,看清楚耗时最多的原因,然后按优先级进行排序;针对对原因找解决方案,可能的方案有:减少数据访问次数或者计算量,常见手段是增加cache:线程内的invokeCache;分布式缓存tair;页面缓存……增强处理速度,比如多线程加速;减少循环调用次数,比如请求合并后再分发;减少数据处理范围,比如减少查询内容,异步加载分页;逻辑简化,比如逻辑进行优化,或者非核心逻辑异步化等;……4.改掉以后,回放同样的case,看性能消耗是否满足预期,不满足预期继续优化; 如何熟悉一个新系统,我的步骤是: 要一个测试账号,把相关功能走一遍,这样能非常快地了解一个系统的功能;看关键的核心表结构,这样可以快速了解系统的领域模型;根据功能步骤找到系统对外的接口列表,了解系统的L0业务流程;下载系统工程,熟悉整个工程结构和模块职责;以一个最重要的流程为入手点,阅读代码,看清楚核心的执行逻辑,可以变看边画时序图;制造一个debug场景,以debug方式走一遍流程,这样可以实际加深一下对系统的理解;做一个小需求,掌握相关的流程和权限; 下单这里来了一个新的需求,出一个技术方案的步骤: 看清楚之前的需求,把这个需求所在的场景和链路大致阅读一遍,搞懂;找到需求的变化点;分析变更的方案,涉及的内容可能会有:数据结构会不会变,如何变; 交互协议会不会变,如何变,交互协议分为:端和组件要不要变;和下游接口要不要变; 执行逻辑会不会变,如何变,执行逻辑变更的细化考虑点:是否变更域服务;是否变更流程编排;是否变更主干逻辑;是否变更扩展点是否变更扩展点的内部逻辑,变更内部逻辑的时候,又可以进一步拆解: a.重构原有的方法,覆盖之前的逻辑,那就需要进行回归;b.通过逻辑路由到新的方法,这里需要增加路由逻辑;4\. 稳定性方案;5\. 发布方案;可以看到,面对任何一个场景,不管多大多小,我们所需要掌握的知识或者技能都可以构建成一个树结构,同类之间是顺序关系,上下之间是父子关系(或者粗细颗粒度)。 当这个树在大脑中构建起来以后,你会发现你做什么事情都是有一个明确的分析和执行逻辑,不太可能产生遗漏和混乱! 那么如何训练出自己的知识树呢?我给一些比较有效的实践方案: 一定要总结出自己的知识树,而不要盲从书本上的或者别人的,为什么呢?一是因为人的思维速度和习惯、技能有一定差异,不一定每个人都是一样的;二是如果没有内化别人的知识成为自己的知识,这棵树不太能够很熟练地运用;习惯性总结,做完任何一个事情,都习惯性地回顾一下,往自己的树上面挂新东西,这个是构建知识树的必备手段,这个总结不需要花很多时间,比如做完事情后花个几分钟回顾一下就可以,但是需要坚持;推荐一个很常见的工具:xmind,把自己的树记录下来;训练自己的思维习惯和做事方式变得结构化,当你做事情的时候,习惯性用树的方式推进,强迫自己按照这个方式来。 扩展性思维:举一反三,拓展思维 扩展性思维的核心目标是提升我们思维的广度,也就是让我们的知识树变得更加开阔; 我在工作中总结出来的扩展性思维的两个关键的扩展方向: (1)举一反三:解决同类型的N个问题 举一反三的好处是:“我们能否用同样的知识和手段去解决类似的相关联的几个类似问题”,先举一些案例: 当发现某个系统的jvm参数配置存在一个错误配置,不是仅仅修复这个系统的jvm配置,而是把负责的几个系统都检查一下是否需要统一修改;系统中存在某个bug导致产生了脏数据,不是直接订正已发现的脏数据,而是根据特征拉取出所有的脏数据,进行一次性处理;这种思维方式的特征是举一反三,触类旁通,相当于产生批处理的效果,可以大大提升解决问题的效率,避免重复处理。 (2)寻求更多的可能性:拓展解决问题的不同手段 拓展思维常见的手段是:是否能够换更多的理解方式,或者更多的解法,举一些案例: 产生故障的时候,快速止血除了回滚以外,还有哪些方案?如果故障处理经验丰富的人一定知道,除了回滚,其实还有系统降级,运营活动降级等多种方案;除了写更加健壮的代码,还有哪些手段都可以提升系统的容错性?还有数据监控,单据闭环等多种手段;当解决问题的手段更多了,思维就开阔了。 抓重点思维:提升效率,方便记忆和传递 当我们发现知识树构建起来以后,怎么样使得记忆和使用的效率变高?而且对外传递的时候更加容易让人理解?抓重点思维要解决的场景是: 如果每件事情都按照知识树方式做,效率可能不会特别高,有更快的办法么?在对外沟通表达的时候,要表达核心思想,否则别人会很难理解你的表达内容;比如大家再晋升答辩、项目汇报的时候一定会有体会。解决这两类困惑,核心思路是要抓住重点和脉络。 但是抓住重点和知识结构化之间并不矛盾,而且我认为是有先后次序的,一定要先建立知识结构化,然后才能从里面筛选出重点,否则知识的体系是不完整的。 那么筛选重点的思路有哪些呢? (1)归纳法 采用归纳法,把细节隐藏掉,呈现知识的脉络,这是一种非常好的思路;尤其是大家在准备晋升ppt时,ppt的每一页都需要归纳一个核心观点,不是全是细节,这个非常重要!并且训练归纳的能力,本身就是对知识理解深刻程度的一种反映; (2)优先级法 ...

June 14, 2019 · 1 min · jiezi

以太坊中文文档翻译账号

本文原文链接点击这里获取Etherscan API 中文文档(完整版)完整内容排版更好,推荐读者前往阅读。 账号(Account)账号及地址相关的 API,接口的参数说明请参考Etherscan API 约定, 文档中不单独说明。 获取单个账号余额 译者注: 英文 `balance` 有人翻译为`金额`,译者习惯称为`余额`。 账号和地址大部分也是指一个意思。接口: /api?module=account&action=balance&address=0x&tag=latest&apikey=YourApiKeyToken返回: { status: "1", message: "OK", result: "40807178566070000000000"}说明: 余额的单位都是最小单位wei, 更多单位换算可阅读:以太单位换算 请求样例URL,点击可在浏览器查看效果。 获取多个账号余额接口: /api?module=account&action=balancemulti&address=0xabc,0x63..,0x198..&tag=latest&apikey=YourApiKeyToken使用,来分割地址,一次请求最多20个账号。 返回: {status: "1",message: "OK",result: [{account: "0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a",balance: "40807178566070000000000"},{account: "0x63a9975ba31b0b9626b34300f7f627147df1f526",balance: "332567136222827062478"}]}请求样例URL 获取地址(普通)交易列表接口: /api?module=account&action=txlist&address=&apikey=YourApiKeyToken可选参数:startblock 、endblock、sort 返回: { "status": "1", "message": "OK", "result": [{ "blockNumber": "47884", "timeStamp": "1438947953", "hash": "0xad1c27dd8d0329dbc400021d7477b34ac41e84365bd54b45a4019a15deb10c0d", "nonce": "0", "blockHash": "0xf2988b9870e092f2898662ccdbc06e0e320a08139e9c6be98d0ce372f8611f22", "transactionIndex": "0", "from": "0xddbd2b932c763ba5b1b7ae3b362eac3e8d40121a", "to": "0x2910543af39aba0cd09dbb2d50200b3e800a63d2", "value": "5000000000000000000", "gas": "23000", "gasPrice": "400000000000", "isError": "0", "txreceipt_status": "", "input": "0x454e34354139455138", "contractAddress": "", "cumulativeGasUsed": "21612", "gasUsed": "21612", "confirmations": "7525550" }]}说明: ...

May 26, 2019 · 1 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

使用Python开始Web-Scraping

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:15min 在本文中,我们将学习以编程方式执行操作以自动检索和处理信息。Python  requests模块使得执行这些操作变得非常容易。本文知识点: 下载网页解析HTML抓取网络访问受密码保护的页面加快网络抓取速度下载网页下载网页的基本功能包括GET针对URL 发出HTTP 请求。这是任何Web浏览器的基本操作。我们将在此配方中看到如何获取获取网页的简单请求。 安装  requests模块: $ echo "requests==2.18.3" >> requirements.txt$ source .venv/bin/activate(.venv) $ pip install -r requirements.txt如何下载网页导入requests模块:>>> import requests请求URL,这需要一两秒钟:>>> url = 'http://www.columbia.edu/~fdc/sample.html'>>> response = requests.get(url)检查返回的对象状态代码:>>> response.status_code200检查结果的内容:>>> response.text'\n\n\n...FULL BODY...\n'检查正在进行的和返回的标题:>>> response.request.headers{'User-Agent': 'python-requests/2.18.4', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}>>> response.headers{'Date': 'Fri, 25 May 2018 21:51:47 GMT', 'Server': 'Apache', 'Last-Modified': 'Thu, 22 Apr 2004 15:52:25 GMT', 'Accept-Ranges': 'bytes', 'Vary': 'Accept-Encoding,User-Agent', 'Content-Encoding': 'gzip', 'Content-Length': '8664', 'Keep-Alive': 'timeout=15, max=85', 'Connection': 'Keep-Alive', 'Content-Type': 'text/html', 'Set-Cookie': 'BIGipServer~CUIT~www.columbia.edu-80-pool=1764244352.20480.0000; expires=Sat, 26-May-2018 03:51:47 GMT; path=/; Httponly'}操作requests非常简单; GET在这种情况下,通过URL 执行操作。这将返回result可以分析的对象。主要元素是status_code身体内容,可以表示为text。 ...

May 15, 2019 · 3 min · jiezi

Python数据分析实用程序

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:13min 本文包含以下部分: 数据分析,数据科学,大数据Python的数据分析简史dautil的高级概述IPython笔记本实用程序下载数据绘制实用程序揭开Docker的神秘面纱数据分析,数据科学,大数据您可能已经看到维恩图将数据科学描述为数学/统计学,计算机科学和领域专业知识的交集。数据分析是永恒的,并且在数据科学和计算机科学之前存在。您可以使用笔和纸进行数据分析,并在更现代的时候使用袖珍计算器进行数据分析。 数据分析涉及许多方面,例如做出决策或提出新的假设和问题。围绕数据科学和大数据的炒作,状态和经济回报让我想起了数据仓库和商业智能成为流行语的时间。商业智能和数据仓库的最终目标是构建管理仪表板。这涉及很多政治和组织方面,但在技术方面,主要是关于数据库。另一方面,数据科学不是以数据库为中心的,而是在很大程度上依赖于机器学习。机器学习由于数据量较大,技术已成为必要。数据增长是由世界人口的增长和社交媒体和移动设备等新技术的兴起引起的。实际上,数据增长可能是我们可以确定的唯一趋势。构建仪表板和应用机器学习之间的区别与搜索引擎的演变方式类似。 搜索引擎最初只不过是手工创建的组织良好的链接集合。最终,自动化方法获胜。由于将及时创建更多数据(而不是销毁),我们可以预期自动数据分析会增加。 Python的数据分析简史1989年:Guido van Rossum在荷兰的CWI实施了第一个Python版本,作为圣诞节爱好项目。1995年:Jim Hugunin创建了NumPy的前身Numeric。1999年:Pearu Peterson将f2py描述为Fortran和Python之间的桥梁。2000:Python 2.0发布。2001:SciPy库发布。此外,还创建了Numarray,一个竞争的数字库。费尔南多佩雷斯发布了IPython,这是一个下午的黑客攻击。NLTK作为一个研究项目发布。2002年:John Hunter创建了matplotlib库。2005年:NumPy由Travis Oliphant发布。最初,NumPy是Numeric扩展,其功能受到Numarray的启发。2006:NumPy 1.0发布。SQLAlchemy的第一个版本发布了。2007年:scikit-learn项目由David Cournapeau发起为Google Summer of Code项目。Cython是从Pyrex分叉的。Cython后来被大量用于熊猫和scikit-学习以提高性能。2008年:Wes McKinney开始研究Pandas。Python 3.0发布了。2011:IPython 0.12版本引入了IPython笔记本。Packt发布了NumPy 1.5初学者指南。2012年:Packt发布了NumPy Cookbook。2013:Packt发布NumPy初学者指南 - 第二版。2014年:Fernando Perez宣布Project Jupyter,旨在打造一款与语言无关的笔记本电脑。Packt发布了学习NumPy数组和Python数据分析。2015:Packt发布NumPy初学者指南 - 第三版和NumPy Cookbook - 第二版。dautil的高级概述dautil模块总结在下表中: 模描述LOCdautil.collect包含与集合相关的实用程序331dautil.conf包含配置实用程序48dautil.data包含用于下载和加载数据的实用程序468dautil.db包含与数据库相关的实用程序98dautil.log_api包含日志实用程序204dautil.nb包含IPython / Jupyter笔记本小部件和实用程序609dautil.options配置与数据分析相关的多个库的动态选项71dautil.perf包含与性能相关的实用程序162dautil.plotting包含绘图实用程序382dautil.report包含报告实用程序232dautil.stats包含统计函数和实用程序366dautil.ts包含时间序列和日期的实用程序217dautil.web包含用于Web挖掘和HTML处理的实用程序47IPython笔记本实用程序IPython笔记本已成为数据分析的标准工具。该dautil.nb有几个互动IPython的小部件,以帮助乳胶渲染,matplotlib属性的设置,和绘图。Ivan定义了一个Context类,它表示小部件的配置设置。这些设置存储在当前工作目录中名为dautil.json的漂亮打印的JSON文件中。这可以扩展,甚至可以使用数据库后端。以下是一个示例dautil.json的编辑摘录(因此它不占用大量空间): { ... "calculating_moments": { "figure.figsize": [ 10.4, 7.7 ], "font.size": 11.2 }, "calculating_moments.latex": [ 1, 2, 3, 4, 5, 6, 7 ], "launching_futures": { "figure.figsize": [ 11.5, 8.5 ] }, "launching_futures.labels": [ [ {}, { "legend": "loc=best", "title": "Distribution of Means" } ], [ { "legend": "loc=best", "title": "Distribution of Standard Deviation" }, { "legend": "loc=best", "title": "Distribution of Skewness" } ] ],...} Context对象可以使用字符串构建 - Ivan建议使用笔记本的名称,但任何唯一标识符都可以。该dautil.nb.LatexRenderer还使用了Context类。它是一个实用程序类,可帮助您在IPython / Jupyter笔记本中编号和渲染Latex方程式,例如,如下所示: ...

May 14, 2019 · 2 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

使用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

使用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

Python中的单元测试

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:11min 基本单元测试在我们开始讨论新的概念和功能之前,让我们来看看如何使用unittest来表达我们已经学到的想法。这样,我们就能有一些坚实的基础来建立我们的新理解。 采取行动的时间-用unittest测试PID我们将访问PID类(或至少访问PID类的测试)。我们将编写测试,以便它们在unittest框架内运行。 我们将使用unittest框架实现测试。 创建一个名为新文件test_pid.py在同一目录pid.py。请注意,这是一个.py文件:unittest测试是纯 python源代码,而不是包含源代码的纯文本。这意味着从纪录片的角度来看,测试的用处不大,但可以交换其他好处。将以下代码插入到新创建的test_pid.py中from unittest import TestCase, mainfrom mocker import Mockerimport pidclass test_pid_constructor(TestCase): def test_without_when(self): mocker = Mocker() mock_time = mocker.replace('time.time') mock_time() mocker.result(1.0) mocker.replay() controller = pid.PID(P=0.5, I=0.5, D=0.5, setpoint=0, initial=12) mocker.restore() mocker.verify() self.assertEqual(controller.gains, (0.5, 0.5, 0.5)) self.assertAlmostEqual(controller.setpoint[0], 0.0) self.assertEqual(len(controller.setpoint), 1) self.assertAlmostEqual(controller.previous_time, 1.0) self.assertAlmostEqual(controller.previous_error, -12.0) self.assertAlmostEqual(controller.integrated_error, 0) def test_with_when(self): controller = pid.PID(P=0.5, I=0.5, D=0.5, setpoint=1, initial=12, when=43) self.assertEqual(controller.gains, (0.5, 0.5, 0.5)) self.assertAlmostEqual(controller.setpoint[0], 1.0) self.assertEqual(len(controller.setpoint), 1) self.assertAlmostEqual(controller.previous_time, 43.0) self.assertAlmostEqual(controller.previous_error, -11.0) self.assertAlmostEqual(controller.integrated_error, 0)class test_calculate_response(TestCase): def test_without_when(self): mocker = Mocker() mock_time = mocker.replace('time.time') mock_time() mocker.result(1.0) mock_time() mocker.result(2.0) mock_time() mocker.result(3.0) mock_time() mocker.result(4.0) mock_time() mocker.result(5.0) mocker.replay() controller = pid.PID(P=0.5, I=0.5, D=0.5, setpoint=0, initial=12) self.assertEqual(controller.calculate_response(6), -3) self.assertEqual(controller.calculate_response(3), -4.5) self.assertEqual(controller.calculate_response(-1.5), -0.75) self.assertEqual(controller.calculate_response(‑2.25), ‑1.125) mocker.restore() mocker.verify() def test_with_when(self): controller = pid.PID(P=0.5, I=0.5, D=0.5, setpoint=0, initial=12, when=1) self.assertEqual(controller.calculate_response(6, 2), -3) self.assertEqual(controller.calculate_response(3, 3), -4.5) self.assertEqual(controller.calculate_response(‑1.5, 4), ‑0.75) self.assertEqual(controller.calculate_response(‑2.25, 5), ‑1.125)if __name__ == '__main__': main()键入以下命令运行测试:$ python test_pid.py ...

May 10, 2019 · 2 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

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

关于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

学习Java必读的10本书籍

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:9min在学习编程语言时,几乎每个人都会选择在线培训,但是,不得不说书籍也是你学习的重要部分,因为它们可以提供最深入的知识,且通常由权威人士撰写。如果您正在学习Java编程,本文对相关书籍的介绍将为你提供有效的参考。每当程序员开始学习Java编程语言时,他们将会遇到以下问题:我应该参考哪本书来学习Java?初学者学习Java的最佳书籍是什么?你能推荐我一些学习Java的好书吗?这就说明了Java书籍对程序员,尤其是初学者的重要性。尽管关于Java学习很多的免费资源,如教程,在线课程,技巧,博客和代码示例,但Java书籍更值得我们选择,因为:· 书籍是由该领域权威的技术人员编写· 对知识点进行详细说明且利用大量项目案例对该领域知识进行阐述这些书是当今最好的书籍,对初学者,中级和高级Java程序员同样有用。无论您是Java新手还是有一定经验的Java编程工程师,您将通过这些书籍学到很多新东西。不同级别的程序员有其对应的书籍。对于初学者来说,《深入浅出Java 》是仍然上手的最好的书,以及有经验的Java开发人员更适合《Effective Java》(有效的Java)。学习Java编程的10本最佳书籍这些书涵盖了各个领域,包括核心Java基础知识,Java集合框架,多线程和并发,JVM内部和性能调优,设计模式等。1.《Head First Java》许多人会认为这是过时的书,但说实话,《Head First Java》对于新手的程序员来说是很有效的。《Head First Java》涵盖了有关类,对象,线程,集合和语言功能的基本Java编程知识,如泛型,枚举,变量参数或自动装箱,还有一些关于Swing,网络和Java IO的高级部分,这使它们成为Java初学者的完整包。如果你从头开始,这应该是你看的第一本Java书。2.《Head First Design Patterns》关于继承和组合的第一章,简直太棒了,通过引入问题然后解决方案来促进改进实践。本书还包含有用的项目符号,练习和内存映射,可帮助您快速了解设计模式。如果您想学习核心Java设计模式和面向对象的设计原则,这是您应该查看的第一本Java书。3.《Effective Java》对于精通Java编程或经验丰富的程序员来说,《Effective Java》是不二之选。对于那些希望通过编程最佳实践分享他们的技能的程序员来说,他们渴望倾听对Java开发工具包(JDK)做出贡献的人。本书包含一系列Java编程最佳实践,包括静态工厂,序列化,等号和哈希码,以及泛型,枚举,变量和反射。这本Java编程书用与以往不同的方式涵盖了Java的几乎所有方面。4.《Java Concurrency in Practice》《Java Concurrency in Practice》是Joshua Bloch,Doug Lea和团队的另一个经典。这是关于并发和多线程的最佳Java书籍 - 核心Java开发人员必读之一。优势:1)本书非常详细,并捕获了多线程和并发的细节2)本书不是关注核心Java类,而是关注并发问题和问题,如死锁,饥饿,线程安全,竞争条件以及使用Java并发类解决它们的现有方法。3)没有废话的例子,本书中的例子清晰,简洁,智能。4)擅长解释错误及错误的原因以及如何解决简而言之,这是学习Java中并发和多线程的最佳书籍之一。从初学者的角度来看,内容肯定是先进的,但这无疑是一本有经验的Java程序员必须阅读的书。5.《Java Generics and Collections》来自O’Reilly的Naftalin和Philip Wadler撰写的Java Generics and Collections是另一本关于Java的好书,它有关于泛型和集合的内容,是Java语言的核心领域。对一个有经验的程序员有很强的Java收集和泛型知识方面很有帮助。它解释了每个集合界面,如Set,List,Map,Queue及其实现,比较它们在不同情况下的表现,每一章的对比图可以告诉你什么时候使用特定的Java集合类,比如ArrayList,HashMap或LinkedHashMap。6.《Java Performance》Binu John这是另一本讲授JVM内部,垃圾收集,JVM调优,分析的好书。等,我强烈建议每位高级Java开发人员阅读本书。随着逐渐的走向,我们从初学者水平开始到中级水平,现在是高级水平。Java性能是关于性能监视、分析和用于Java性能监视的工具。这不是一本通常的编程书。相反,它提供了有关JVM,垃圾收集,Java堆监视和分析应用程序的详细信息。初学者和中级程序员都可以从本书中受益,但在阅读之前,有一些Java经验是最好。到目前为止,这是关于性能监控的最佳Java书籍。如果你更注重性能,Java中有几本新书,涵盖JDK 1.7。有关Java性能的最新书籍,如Java Performance,Scott Oaks的The Definitive Guide,在购买本书之前肯定值得一试。如果您需要一些解决内存和CPU问题的指导,我建议您也看看Richard Warburton的《Understanding and Solving Java Memory Problems》7.《Java Puzzlers》这本书讲述的是Java编程语言中的极端案例和误区。Java比C ++更安全,JVM可以很好地解决程序员容易出错的内存分配和释放问题。但是,Java仍然有一些极端的案例,即使是有经验的Java程序员也会感到惊讶。这本Java书籍列举了这些Java误区,并对它们进行了更详细的解释。如果你喜欢谜题,这是一本很好的Java书籍,你甚至可以在核心Java面试中用这些知识来检查他们的Java知识。8.《Head First Object-Oriented Analysis and Design》另一篇关于Head-First系列Java编程和设计原理的好书。首先是面向对象的分析和设计可以与《Head First Design Patterns》一起阅读。这本书集中于面向对象的设计原则,比如喜欢组合,接口编程等。从本书中获得的知识适用于许多面向对象的编程语言,并且总体上将提高您对代码和OOP设计原则的理解。9.《Thinking in Java》由Bruce Eckel编写,他也是《Thinking in C ++》的作者,并用他独特的风格来教授Java概念。许多人会同意这是最好的Java书籍之一,其优点是智能化示例。这是Java中的完整书籍之一,也可以作为参考。如果你不喜欢Head-First教学风格,但是你需要一本简单Java风格的初学者书籍,这本书是一个不错的选择。它比较详细,成熟且经常更新。10.《Java SE 8 for the Really Impatient》这是学习Java 8 的最佳书籍之一。如果您想在短时间内了解有关Java 8的所有重要事项,那么这本书是最佳选择。本书解释了lambda表达式,Streams,功能接口,方法引用,新的Java Date Time API以及其他一些小的增强功能,如加入字符串,可重复的注释等。以上为推荐的10本学习Java的书籍,如果你有更好的书籍,欢迎在下方留言进行推荐,同时也可以收藏本文以便后期作为参考或转发给更多的小伙伴! ...

April 18, 2019 · 1 min · jiezi

他,将终结“996”

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码在我们身边也不乏在半夜十二点,依然在加班熬夜送外卖的小哥;在深夜打包快递的微商;天微亮,就已忙碌着为做准备的早餐店……与他们不同的是,“社畜”是日本用于形容上班族的贬义词,指在公司很顺从地工作,被公司当作牲畜一样压榨的员工。如今成为了一个在中国也比较常见的网络流行语,类似我们所说的“房奴”、“卡奴”。2019年3月27日,一个名为“996ICU上传开。这是一些不满于互联网公司996模式的程序员发起的“996.ICU”的开源项目:工作996,生病ICU(重症监护病房)。这种幽默的背后俨然是社畜的无奈与自嘲。争论未休,愈演愈烈程序员们揭露“996ICU”互联网公司,本意是抵制互联网公司的996工作制度的声讨,现随着媒体、企业、大佬、员工的跟风,已将矛盾转移,使其变成了“不应强制加班”“反对强制加班”“反对没有回报的无偿加班”。距此事已经过去20余天,但“996”的话题在各大网站上仍持续发热,连日来,“996”工作制引发的热议也引起了马云、刘强东、李国庆大咖先后发表了自己对996的看法,有人持反对也有人表赞同。4月12日,阿里巴巴官方公众号发布了11日董事长马云在阿里巴巴内部交流活动上对于996的观点,马云说:能做996是巨大的福气。“今天中国BAT这些公司能够996,我认为是我们这些人修来的福报。” 在4月11日传出的内部交流会发言中,马云这句话已成金句。可能你连996的资格都没有。刘强东称,京东永远不会强制员工995或者996,但是每一个京东人都必须具备拼搏精神。刘强东举例自己曾经创业时期的艰辛,虽然现在达不到那时候的状态,但他表示,以自己现在的体质,做到周一到周六,早8点工作到晚11点,周日工作8个小时,每个月休假两天,每年也会休一次长假(811648),没有问题。“我享受拼搏的快感!我要找到一帮愿意为理想而一起拼的兄弟们!并让他们的日子过得愈来愈好!”年轻的时候不996,老了你就没机会了。当当创始人李国庆、OPPO副总裁沈义人等直接站到了反对阵营。4月12日,李国庆在微博中直言:“一批老板倡导996……我坚决反对。”“为提高国际竞争力和企业竞争力,我赞成撸起袖子加油干,那是实干、巧干、苦干,不是低效率的耗时间。”他强调,优秀的企业是结果导向,效率导向。管理者提高决策科学性和效率比员工加班更有价值。不同岗位有不同的工作强度。“如程序员,长时间认真写8小时程序,回家基本倒头就睡,和业务层面靠开会耗11小时完全不是一个工作强度。”对此新华社刊发辛识平文章《奋斗应提倡,996当退场》称,我们崇尚的奋斗,是让劳动者实现有尊严地体面劳动、全面发展的奋斗,是基于人们对事业的责任感和对未来的信心的奋斗。如果不能切实保障员工利益,如果无视员工意愿和身心健康,甚至让员工辛辛苦苦连个加班费都拿不到,一些企业强制推行的“996工作制”就是在透支健康、透支未来,这恰恰是对奋斗者的伤害,也是对奋斗精神的误读。当然,持反对方的也少不了律师,企业的确享有安排员工加班的经营自主权,但这一权利的行使需受到法律法规的严格限制。河北询诺律师事务所律师张伟对北京商报记者称,如果是综合工时制度和不定时工时制度符合一定条件就不违法,如果是996成为标准工时制度就违法。公司规定所有员工的正常工作时间为9:30-21:00,每周工作6天,显然是违法行为。“社畜”怎么看待996?“996本来没有什么,加班本就是家常便饭的事情,大家只是不想被‘绑架式’认为996是常态,不加班、不996就是懒惰、浪费生命。”当北京商报记者问起一位在西二旗的一家互联网公司上班的员工,996为何突然“火”了时,上述员工如此回答。他表示,在这轮讨论没有成为公开话题时,996上班制度是一个公开的秘密,无论是出于自愿还是不想耽误团队进度,只要工作没有完成就会留下来加班,早上9点、10点上班,直到凌晨2点、3点下班是常事,甚至还会在公司准备行军床,睡醒了就直接上班。“但我们不想让公司认为996、乃至彻夜加班是件应该的事情,不加班就是懒惰、不勤奋的一群人,如果这样付出就变得没有价值。”上述员工称。大多正在经历996的员工吐槽完仍旧坚定地表示,还是会加班的,现在互联网公司的裁员声一波高过一波,如果这时候因为工作拖后腿被裁员可不好找工作,毕竟自己现在的工资收入比较可观。996到底由谁说了算?从2018开始,提到互联网企业,大家对其贴上的标签更多是裁员、优化、降薪、轮岗……引得人人自危,被爆出的“996.ICU”无疑是员工用来宣泄、表达焦虑不安的一种行为。什么是强制的加班,什么又是合理的加班?更多的员工表示可以接受加班是因为对公司的认同,对领导的尊重,以及对项目和团队的负责。对于996的无偿加班,更多“社畜”表示加班费应是合理得来的,而不是企业的“施舍”。关于996的工作制度,应当根据实际情况决定是否接受,如果你的家庭、生活、身体情况不允许,或是因为996的加班制度给你带来了困扰,那么你应该考虑如何做一个明确的选择,同样的,任何人不应该将996与你的勤奋努力进行道德捆绑。你,将终结“996”!如何终结996?正是因为生活的压力、经济的负担让你不能坦然对996说不,甚至在面试时,HR会明确表示:“这个岗位会加班,你可以吗?”此时,你仍会毫不犹豫的接受这个职位。如何摆脱这种现状?八个字:技能提升,经济独立让你的知识和专业技能在工作之余给你带来收益。举个栗子:传统的知识变现主要有作家写书等,通过版税和专利授权费用来获得收入。前些年付费网络文学的出现、近几年付费问答、知识付费产品的井喷式爆发,可谓是给知识产权收入扩宽了道路。直播课程、录播视频、文档课程等,一旦有用户付费购买,作者本人在床上睡觉的时候,就有了“睡后收入”。即便不工作也不会影响到你的收入状况,这是获得财务自由和提前退休的必要前提,但是并不代表不劳而获,其实,在获得这种“被动收入”之前,往往需要经过长时间的劳动和积累。首先应提升自己的技能,在技能提升的同时培养自己的个人品牌运营意识,将所具备的知识技能,通过建立自媒体输出文章,或者分自己的观点,逐渐就会形成自己的个人品牌,这个时候再去做知识变现就会水到渠成。提升自己的技能是树立个人品牌的重要前提,在获得“睡后收入”的同时,也会有猎头因你的口碑影响力为你介绍高薪岗位,你也有了更多主动的选择机会。访问 愿码(ChainDesk.CN)获取更多学习资料

April 17, 2019 · 1 min · jiezi

PostgreSQL安全性:快速查看身份验证最佳实践

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:11minPostgreSQL中的身份验证身份验证回答了问题:谁是用户?PostgreSQL支持一些 身份验证方法,包括以下内容:· Trust认证:任何可以连接到服务器的人都有权使用访问pg_hba.conf配置文件中指定的数据库/数据库。通常用于允许在单个用户计算机上使用Unix域套接字进行连接以访问数据库。此方法也可以与TCP / IP一起使用,但很少允许从本地主机以外的任何IP地址进行连接。 · Ident认证:这通过从ident服务器获取客户端的操作系统用户名然后使用它来访问数据库服务器来工作。这个方法建议用于客户端计算机受系统管理员严格控制的封闭网络。· Peer认证:这类似于身份,但客户端操作系统用户名是从内核获得的。· GSSAPI认证:GSSAPI是RFC2743中定义的行业标准。它提供自动身份验证(单点登录)。· LDAP认证: LDAP服务器仅用于验证用户名/密码对。· 密码认证:有以下三种方法o SCRAM-SHA-256:PostgreSQL 10中引入的最强的身份验证方法。此方法可防止对不受信任的连接进行密码嗅探。默认密码验证方法是MD5使用此功能,配置参数 password_encryption应更改为 scram-sha-256o MD5:MD5具有已知的限制,例如:预先计算的查找表以破解密码哈希。此外,MD5只有40亿个独特的哈希值。最后,MD5计算速度非常快,因此暴力密码猜测不需要大量的CPU资源。对于新应用程序,建议仅使用scram-sha-256。此外,PostgreSQL提供了从scram-sha-256迁移的方法。o Password:建议不要使用此密码,因为密码以明文格式发送到服务器。 要了解身份验证,您需要具有以下信息:· 身份验证通过pg_hba.conf文件控制,其中hba代表基于主机的身份验证。· 最好了解PostgreSQL发行版附带的默认初始身份验证设置· pg_hba.conf文件通常位于数据目录中,但也可以在postgresql.conf配置文件中指定。更改身份验证时,您需要发送一个SIGHUP信号,这是通过基于PostgreSQL平台的几种方法完成的。注意,发送信号的用户应该是超级用户、Postgres或Linux发行版上的根系统用户;同样,这取决于平台。以下是重新加载PostgreSQL配置的几种方法的示例:psql -U postgres -c “SELECT pg_reload_conf();“sudo service postgresql reloadsudo /etc/init.d/postgresql reloadsudo Kill -HUP sudo systemctl reload postgresql-11.service· 该订单的 pg_hba.conf记录或条目是非常重要的。将会话连接pg_hba.conf逐个与记录进行比较, 直到它被拒绝或到达配置文件的末尾。· 最后,检查PostgreSQL日志文件以确定配置重新加载后是否存在错误是非常重要的。PostgreSQL pg_hba.conf与postgresql.conf一样,pg_hba.conf文件由一组记录组成,可以使用哈希符号注释行,并且忽略空格。pg_hba.conf文件记录的结构如下:host_type database user [IP-address| address] [IP-mask] auth-method [auth-options]host_type查询的部分可以是以下内容:· Local:在 Linux系统中使用,允许用户使用Unix域套接字连接访问PostgreSQL。· Host:这是为了允许来自其他主机的连接,基于地址或IP地址,使用带有和不带SSL加密的TCP / IP。· Hostssl:这与主机类似,但应使用SSL加密连接。· Hostnossl:这也与主机类似,但不应加密连接。查询的数据库部分是用户想要连接的数据库的名称。为了提高灵活性,您还可以使用以逗号分隔的列表来指定多个数据库,或者可以all用来指示用户可以访问数据库集群中的所有数据库。此外,可以使用相同的用户和相同的角色值来指示数据库名称与用户名相同,或者用户是与数据库同名的角色的成员。查询的用户部分指定数据库用户的名称; 同样,all值与所有用户匹配。IP地址,地址和IP子网掩码用于标识用户所在的主机尝试连接。可以使用无类别域间路由(CIDR)或点十进制表示法指定IP地址。最后,密码验证方法可以信任,MD5,拒绝等。以下是配置PostgreSQL身份验证的一些典型示例:· 示例1:PostgreSQL集群上的任何用户都可以使用Unix域套接字访问任何数据库,如以下数据库表所示:#TYPE DATABASE USER ADDRESS METHODLocal all all trust· 示例2:PostgreSQL集群上的任何用户都可以使用本地环回IP地址访问任何数据库,如以下数据库表所示:#TYPE DATABASE USER ADDRESS METHODHost all all 127.0.0.1/32 trusthost all all ::1/128 trust· 示例3:192.168.0.53拒绝来自IP地址的所有连接 ,来自192.168.0.1/24范围的连接被接受,如下数据库表所示:#TYPE DATABASE USER ADDRESS METHODHost all all 192.168.0.53/32 rejectHost all all 192.168.0.1/24 trustPostgreSQL提供了一种非常方便的方法来查看pg_hba.conf文件中定义的规则,方法是提供一个名为pg_hba_file_rules的视图,如下所示:postgres=# SELECT row_to_json(pg_hba_file_rules, true) FROM pg_hba_file_rules limit 1; row_to_json ————————- {“line_number”:84, + “type”:“local”, + “database”:[“all”], + “user_name”:[“all”], + “address”:null, + “netmask”:null, + “auth_method”:“trust”,+ “options”:null, + “error”:null}(1 row)侦听地址该listen_addresses 选项定义于postgresql.conf。PostgreSQL listen_addresses连接设置用于标识服务器应从客户端应用程序侦听的IP地址列表。这些listen_addresses是以逗号分隔的主机名或IP地址列表。更改这个值需要重启服务器。此外,还应注意以下几点:· 默认值为localhost,它限制从网络到PostgreSQL集群的直接连接。· 给出一个空列表意味着服务器应该只接受Unix套接字连接· 该值*表示全部对于新加入PostgreSQL的开发人员来说,忘记更改侦听地址是一个常见的错误。如果开发人员忘记更改,并尝试使用网络中的TCP/IP连接到PostgreSQL,则会出现以下错误:Connection refused Is the server running on host and accepting TCP/IP connections on port 5432?认证最佳实践身份验证最佳实践取决于整个基础架构设置,应用程序的性质,用户的特征,数据敏感性等。例如,以下设置对于初创公司很常见:数据库应用程序(包括数据库服务器)托管在同一台计算机上,并且仅由公司内部用户从一个物理位置使用。通常,数据库服务器使用防火墙与世界隔离;在这种情况下,您可以使用SCRAM-SHA-256身份验证方法并限制IP地址,以便数据库服务器接受特定范围或集合内的连接。请注意,重要的是不要使用超级用户或数据库所有者帐户连接到数据库,因为如果此帐户被黑客入侵,则整个数据库集群将被暴露。如果是应用服务器 - 业务逻辑 - 和数据库服务器不在同一台机器上,您可以使用强大的身份验证方法,例如LDAP和Kerberos。但是,对于数据库服务器和应用程序位于同一台计算机上的小型应用程序,SCRAM-SHA-256身份验证方法以及将侦听地址限制为localhost可能就足够了。要对应用程序进行身份验证,建议仅使用一个用户,并尝试使用连接池软件减少允许的最大连接数,以便更好地调整PostgreSQL资源。在应用业务逻辑时可能需要另一级别的安全性来区分不同的登录用户。对于真实用户,更需要LDAP或Kerberos身份验证。此外,如果从外部世界访问数据库服务器,则使用SSL证书加密会话以避免数据包嗅探很有用。您还应该记住保护信任所有localhost连接的数据库服务器,因为访问localhost的任何人都可以访问数据库服务器。角色系统和代理身份验证通常,在设计应用程序时,登录角色用于配置数据库连接和连接工具。需要实现另一级安全性以确保使用该应用程序的用户被授权执行某项任务。该逻辑通常在应用程序业务逻辑中实现。在使用事务块中的SET SESSION AUTHORIZATION 语句或SET ROLE命令建立或重用连接后,通过将身份验证委派给另一个角色,数据库的角色系统也可用于部分实现此逻辑,如下所示:postgres=# SELECT session_user, current_user; session_user | current_user ————–+————– postgres | postgres(1 row)postgres=# SET SESSION AUTHORIZATION test_user;SETpostgres=> SELECT session_user, current_user; session_user | current_user ————–+————– test_user | test_user(1 row)设置角色需要角色成员资格,而设置会话授权需要超级用户权限。允许应用程序作为超级用户进行连接是危险的,因为可以分别使用reset role和reset session命令重置set session authorization和set role命令,从而允许应用程序获得超级用户权限。为了了解如何使用PostgreSQL角色系统来实现身份验证和授权,我们将使用角色系统和汽车门户应用程序。在汽车门户应用程序中,可以将多组用户分类为web-app-user、public-user、registered-user、seller-user和admin-user。web应用程序用户用于配置业务逻辑连接工具;公共用户、注册用户和卖家用户用于区分用户。公共用户组只能访问公共信息,如广告,但不能作为注册用户添加评级,也不能创建广告,因为卖家用户。管理员用户是管理应用程序所有内容的超级角色,例如过滤垃圾邮件和删除不遵守网站策略的用户。当汽车门户网站应用程序连接到数据库时,将使用Web用户。之后,car_portal将根据用户类调用set role命令。这种身份验证方法称为代理身份验证。以下示例演示了如何使用角色系统来实现代理身份验证。第一步是创建角色并分配角色成员身份和权限,如下所示:CREATE ROLE web_app_user LOGIN NOINHERIT;CREATE ROLE public_user NOLOGIN;GRANT SELECT ON car_portal_app.advertisement_picture, car_portal_app.advertisement_rating , car_portal_app.advertisement TO public_user;GRANT public_user TO web_app_user;GRANT USAGE ON SCHEMA car_portal_app TO web_app_user, public_user;该NOINHERIT选项web_app_user 不允许用户继承角色成员资格的权限;但是,web_app_user可以将角色更改为公共用户,如以下示例所示:$ psql car_portal -U web_app_usercar_portal=> SELECT * FROM car_portal_app.advertisement;ERROR: permission denied for relation advertisementcar_portal=> SET ROLE public_user;SETcar_portal=> SELECT * FROM car_portal_app.advertisement; advertisement_id | advertisement_date | car_id | seller_account_id ——————+——————–+——–+——————-(0 rows)car_portal=> SELECT session_user, current_user; session_user | current_user ————–+————– web_app_user | public_user(1 row) ...

April 16, 2019 · 2 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

构建可扩展的PostgreSQL解决方案

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:11min可伸缩性是指软件系统随着使用它的业务增长而增长的能力。 PostgreSQL提供了一些功能,可以帮助您构建可扩展的解决方案,但严格来说, PostgreSQL本身是不可扩展的。它可以有效地利用单台机器的以下资源:它使用多个CPU内核通过并行查询功能更快地执行单个查询如果配置正确,它可以使用所有可用内存进行缓存数据库的大小不受限制; 创建多个表空间时,PostgreSQL可以使用多个硬盘; 通过分区,可以同时访问硬盘,从而加快数据处理速度但是,当涉及将数据库解决方案扩展到多台计算机时,它可能非常有问题,因为标准PostgreSQL服务器只能在单个计算机上运行。在本文中,我们将介绍PostgreSQL中不同的扩展方案及其实现。系统可扩展性的要求意味着现在支持业务的系统也应该能够以与其增长相同的服务质量来支持相同的业务。假设一个数据库可以存储1 GB的数据,并且每秒有效地处理100个查询。如果随着业务的发展,处理的数据量会增长100倍?它能够每秒支持10,000个查询并处理100 GB的数据吗?也许不是现在,不是在同一个装置中。但是,可以扩展可扩展的解决方案,以便能够在需要时立即处理负载。在需要获得更好性能的场景中,设置更多服务器以处理额外负载并从主服务器将相同数据复制到它们是很常见的。在需要高可用性的情况下,这也是将数据连续复制到备用服务器的典型解决方案,以便在主服务器崩溃时它可以接管。可扩展的PostgreSQL解决方案复制可用于许多扩展方案。其主要目的是在系统出现故障时创建和维护备份数据库。对于物理复制尤其如此。但是,复制也可用于提高基于PostgreSQL的解决方案的性能。有时,第三方工具可用于实现复杂的扩展方案。扩展以进行大量查询想象一下,有一个系统应该处理大量的读取请求。例如,可能有一个应用程序实现支持网站上的自动完成功能的HTTP API端点。每次用户在Web表单中输入字符时,系统都会在数据库中搜索名称以用户输入的字符串开头的对象。由于用户数量众多,查询数量可能非常大,并且还因为每个用户会话都处理了多个请求。为了处理大量请求,数据库应该能够使用多个CPU核心。如果同时请求的数量非常大,则处理它们所需的核心数量可能大于单个机器可能具有的核心数量。这同样适用于应该同时处理多个重度查询的系统。您不需要大量查询,但是当查询本身很大时,使用尽可能多的CPU将提供性能优势,尤其是在使用并行查询时。在这种情况下,一个数据库无法处理负载,可以设置多个数据库,设置从一个主数据库到所有数据库的复制,使每个数据库作为热备用,然后让应用程序查询不同的数据库不同的要求。应用程序本身可以是智能的,每次都可以查询不同的数据库,但这需要应用程序的数据访问组件的特殊实现,如下所示:另一个选择是使用一个名为Pgpool-II的工具,它可以作为几个PostgreSQL数据库前面的负载均衡器。该工具公开了一个SQL接口,应用程序可以连接到那里,就好像它是一个真正的PostgreSQL服务器。然后Pgpool-II会将查询重定向到当时执行最少查询的数据库; 换句话说,它将执行负载平衡:另一种选择是将应用程序与数据库一起扩展,以便应用程序的一个实例将连接到数据库的一个实例。在这种情况下,应用程序的用户应该连接到许多实例中的一个。这可以通过HTTP负载平衡来实现:数据分片当问题不是并发查询的数量,而是数据库的大小和单个查询的速度时,可以实现不同的方法。可以将数据分成多个服务器,这些服务器将并行查询,然后将查询结果合并到这些数据库之外。这称为数据分片。PostgreSQL提供了一种基于表分区实现分片的方法,其中分区位于不同的服务器上,而另一个分区(主服务器)将它们用作外部表。在主服务器上定义的父表上执行查询时,具体取决于WHERE子句和分区的定义,PostgreSQL可以识别哪些分区包含所请求的数据,并且只查询这些分区。根据查询,有时可以在远程服务器上执行联接,分组和聚合。PostgreSQL可以并行查询不同的分区,这将有效地利用多台机器的资源。完成所有这些后,可以在应用程序连接到单个数据库时构建解决方案,该数据库将根据要查询的数据在不同的数据库服务器上物理执行查询。也可以在使用PostgreSQL的应用程序中构建分片算法。简而言之,应用程序可能会知道哪些数据位于哪个数据库中,只在那里写入,并且只能从那里读取数据。这会给应用程序增加很多复杂性。另一种选择是使用市场上可用的基于PostgreSQL的分片解决方案或开源解决方案。它们有各自的优点和缺点,但常见的问题是它们基于PostgreSQL的早期版本,并且不使用最新的功能(有时会提供自己的功能)。最受欢迎的分片解决方案之一是Postgres-XL,它使用运行PostgreSQL的多个服务器实现无共享架构。该系统有几个组成部分:· 多个数据节点:存储数据· 单个全局事务监视器(GTM):管理集群,提供全局事务一致性· 多个协调器节点:支持用户连接,构建查询执行计划,并与GTM和数据节点交互Postgres-XL实现与PostgreSQL相同的API,因此应用程序不需要以任何特殊方式处理服务器。它符合ACID,这意味着它支持事务和完整性约束。该COPY命令也受支持。使用Postgres-XL的主要好处如下:它可以扩展以通过添加更多数据节点来支持更多读取操作它可以扩展以通过添加更多协调器节点来支持更多写入操作Postgres-XL的当前版本(在撰写本文时)基于PostgreSQL 10,它相对较新Postgres-XL的主要缺点是它不提供开箱即用的任何高可用性功能。当更多服务器添加到群集时,任何服务器失败的可能性都会增加。这就是为什么你应该注意备份或实现数据节点本身的复制。Postgres-XL是开源的,但可以获得商业支持。值得一提的另一个解决方案是Greenplum。它被定位为大规模并行处理数据库的实现,专门为数据仓库而设计。它有以下组件:· 主节点:管理用户连接,构建查询执行计划,管理事务· 数据节点:存储数据并执行查询Greenplum还实现了PostgreSQL API,应用程序可以连接到Greenplum数据库而无需任何更改。它支持事务,但对完整性约束的支持是有限的。该COPY命令受支持。Greenplum的主要好处如下:它可以扩展以通过添加更多数据节点来支持更多读取操作。它支持面向列的表组织,这对于数据仓库解决方案非常有用。支持数据压缩。开箱即用支持高可用性功能。可以(并且建议)添加辅助主服务器,以便在主服务器崩溃时接管。还可以向数据节点添加镜像以防止数据丢失。缺点如下:它不能扩展以支持更多的写入操作。一切都通过单个主节点,添加更多数据节点不会使写入更快。但是,可以直接从数据节点导入文件中的数据。它的核心使用PostgreSQL 8.4。Greenplum在PostgreSQL基础代码中添加了许多改进和新功能,但它仍然基于一个非常旧的版本; 但是,该系统正在积极开发中。Greenplum不支持外键,并且对唯一约束的支持是有限的。Greenplum有商业和开源版本。扩展许多连接与可伸缩性相关的另一个用例是当数据库连接的数量很大时。但是,当在具有大量微服务的环境中使用单个数据库并且每个数据库都有自己的连接池时,即使它们不执行太多查询,也可能在数据库中打开数百甚至数千个连接。每个连接都消耗服务器资源,只是处理大量连接的要求已经成为问题,甚至不执行任何查询。如果应用程序仅在需要查询数据库并在之后关闭它们时才使用连接池和打开连接,则可能会出现另一个问题。建立数据库连接需要时间 - 而不是太多,但是当操作数量很大时,总开销将是巨大的。有一个名为PgBouncer的工具可以实现连接池功能。它可以接受来自许多应用程序的连接,就像它是PostgreSQL服务器一样,然后打开有限数量的数据库连接。它将为多个应用程序的连接重用相同的数据库连接。建立从应用程序到PgBouncer的连接的过程比连接到真实数据库要快得多,因为PgBouncer不需要初始化会话的数据库后端进程。PgBouncer可以创建多个连接池,它们可以在以下三种模式之一中工作:· 会话模式:与PostgreSQL服务器的连接用于与PgBouncer的客户端连接的生命周期。这种设置可用于加速应用程序端的连接过程。这是默认模式。· 事务模式:与PostgreSQL的连接用于客户端执行的单个事务。当仅同时执行少量翻译时,这可用于减少PostgreSQL端的连接数。· 语句模式:数据库连接用于单个语句。然后将它返回到池中,并为下一个语句使用不同的连接。此模式类似于交易模式,但更具侵略性。请注意,使用语句模式时,无法进行多语句事务。可以设置不同的池以在不同模式下工作。可以让PgBouncer连接到多个PostgreSQL服务器,从而起到反向代理的作用。可以使用PgBouncer的方式如下图所示:PgBouncer建立了与数据库的多个连接。当应用程序连接到PgBouncer并启动事务时,PgBouncer会为该应用程序分配现有数据库连接,将所有SQL命令转发到数据库,然后将结果传回。交易完成后,PgBouncer将断开连接,但不关闭它们。如果另一个应用程序启动事务,则可以使用相同的数据库连接。这样的设置需要配置PgBouncer以在事务模式下工作。PostgreSQL提供了几种实现复制的方法,这种方法可以维护来自另一个服务器或服务器上的数据库的数据副本。这可以用作备份或备用解决方案,以便在主服务器崩溃时接管。通过使负载可以分布在多个数据库服务器上,复制还可用于提高软件系统的性能。

April 15, 2019 · 1 min · jiezi

如何通过Python创建Twitter应用程序和API接口

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:9min本文说明了如何运用Python API使用Twitter库连接到Twitter帐户。具体来说,此API允许用户提取与特定Twitter帐户相关的大量数据,以及通过 Python 管理 Twitter 的帖子(例如一次发布多个推文)。 即使你是 Python 的初学者, 使用 Twitter Python 依赖包在分析方面也非常有用。例如,虽然Web开发人员可能更倾向于使用PHP等语言来连接API,但Python可以更灵活地分析数据的趋势和统计数据。因此,数据科学家和其他分析师会发现Python更适合这个目的。我们将从Python连接到Twitter API的一些基本步骤开始,然后查看如何流式传输所需的数据。需要注意的是,虽然Twitter库(以及其他Python库,如Tweepy和Twython)可以使用数据执行大量不同的任务,但我们将专注于本文中的一些更基本(和有用)的查询,解决以下问题:使用适当的凭据将Python连接到Twitter API下载与特定帐户关联的推文下载帐户的所有关注和关注用户的列表一次发布多条推文在Twitter上自定义搜索特定术语的实例。1.将Python连接到Twitter API本教程使用iPython作为Python接口连接到Twitter。为了连接到API,我们需要获取Consumer Key,Consumer Secret和Access Token Secret。要获得这些,您需要在apps.twitter.com上登录您的帐户。到那里后,系统会提示您创建一个应用程序:创建应用程序后,您将在Keys and Access Tokens部分下找到相关的密钥和令牌。首先,我们在终端中安装python-twitter库,如下所示:pip install python twitter完成后,我们导入Twitter库并输入凭据,如下所示:import twitterapi = twitter.Api(consumer_key=‘your_consumer_key’, consumer_secret=‘your_consumer_secret’, access_token_key=‘your_access_token_key’, access_token_secret=‘your_access_token_secret’)print(api.VerifyCredentials())输入正确的凭证后,与API的连接即告完成,我们现在可以通过Python平台控制我们的Twitter帐户!2.下载用户时间线现在我们已经将Python连接到Twitter API,我们可以继续开始远程使用不同的Twitter功能。例如,如果我们希望下载推文的用户时间线,我们使用如下方法(并指定相应帐户的屏幕名称),然后使用该功能显示结果:statuses = api.GetUserTimeline(screen_name=‘Michael Grogan’)print([s.text for s in statuses])一旦我们输入了上述内容,我们就会在Python界面中看到相应的时间轴:3.下载以下和以下联系人Twitter库还使我们能够下载特定用户正在关注的帐户列表,以及作为该特定用户的关注者的帐户。为此,我们使用前者,后者使用:users = api.GetFriends()print([u.name for u in users])followers = api.GetFollowers()print([f.name for f in followers])请注意,我们还可以设置我们希望获取的用户数的上限。例如,如果我们希望为任何特定帐户获取100个关注者,我们可以通过向total_count函数添加变量来实现,如下所示:followers = api.GetFollowers(total_count=100)print([f.name for f in followers])4.发布多个推文使用Twitter API的一个巧妙之处是能够一次发布多条推文。例如,我们可以使用该命令同时发布以下两条推文(同样,使用该功能进行确认)。一旦我们转到相关的Twitter帐户,我们就会看到这两条推文都已发布:status = api.PostUpdate(‘How to calculate the Variance Inflation Factor in R: http://www.michaeljgrogan.com/ordinary-least-squares-an-analysis-of-stock-returns/ #rstats #datascience #programming’)print(status.text)status = api.PostUpdate(’#BigData Scientists Earn 10X to 15X More Money Compared to Engineers, CAs http://bit.ly/1NoAgto #datascience’)print(status.text)5.搜索推文Twitter库中包含的getsearch()函数是一个特别强大的工具。此功能允许我们在Twitter上搜索特定术语。请注意,这适用于已输入特定术语的所有用户,而不仅仅是我们在Python中提供凭据的帐户。例如,让我们在Python中搜索术语“bigdata”。我们设置的参数是自2016年11月21日起包含该术语的推文,我们选择限制流式传输的推文数量为10:api.GetSearch(term=‘bigdata’, since=2016-11-21, count=10)请注意,我们可以通过各种方式自定义GetSearch()函数,具体取决于我们希望如何提取数据。例如,如果没有指定日期,这将花费更长的时间来流式传输,我们也可以选择在2016年11月21日之前收集包含术语“bigdata”的推文,如下所示:api.GetSearch(term=‘bigdata’, until=2016-11-21, count=10)值得注意的是,此函数在我们在until变量下指定的日期之前下载最多7天的数据。此外,我们不仅限于仅通过术语搜索GetSearch。例如,假设我们希望通过地理位置搜索推文 - 特别是自11月18日以来在纽约时代广场1英里范围内发送的推文(请注意,距离可以使用mi或km分别以英里或公里格式化):api.GetSearch(geocode=“40.758896,-73.985130,1mi”, since=2016-11-18)运行该函数后,我们看到Python返回以下推文(当然,还有什么更好的地方可以找到Donald Trump!):GetSearch()如何使用这些数据?如前所述,Python对流式社交网络数据极具吸引力的一个特殊原因是能够对我们收集的信息进行深入的数据分析。例如,我们已经看到了如何使用位置搜索推文GetSearch。随着机器学习在分析社交媒体趋势的数据科学家中风靡一时,在这一领域变得非常流行的一种特殊技术是网络分析。这种技术实际上可以显示分散的数据(或节点)以形成紧密的网络,通常某些节点被证明是一个焦点。例如,假设我们要分析全球十个不同地点的1000条最受欢迎的推文。在随机的某一天,尽管我们看到网络中不同推文之间存在一些相关性,但我们可能仍会发现伦敦推文上的主题标签与纽约推文的主题标签差别很大。然而,在美国大选之夜或英国退欧这样的重大世界事件中,当Twitter对这一特定主题发展趋势时,发现网络往往更加紧密,因此,在这种情况下,情感分析的机会更多。一个场景,例如,很明显谁将赢得总统职位,或英国投票退出欧盟。人们通常会看到网络以不同的方式聚集,这取决于趋势推文,因为可以获得更多的实时信息。这只是Python的优势之一。虽然使用API连接到Twitter(可以在许多编程语言中完成)是一回事,但是能够使用分析以有意义的方式对数据进行排序是另一回事。可以通过Python使用机器学习技术来分析来自社交网络的流数据并从该数据进行有意义的预测。结论模块文档提供了可用于Python下载,过滤和操作数据的不同功能的非常详细的描述。最后,虽然我们还研究了使用API直接发布到Twitter的方法,但上述技术在分析趋势时尤其有用,例如标签流行度,按位置搜索术语的频率等等。在这方面,通过Python与Twitter交互对于那些希望对收集的信息实施数据分析技术的人特别有用。当然,与Twitter的API交互可以使用多种语言完成,具体取决于您的最终目标。如果目标是Web开发或设计,那么PHP或Ruby可能是您最好的选择。但是,如果您的目标是使用从Twitter获得的数据进行有意义的分析,那么Python就是不二之选。 ...

April 15, 2019 · 1 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

学习如何在PostgreSQL中管理安全性

学习如何在PostgreSQL中管理安全性来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:17min在处理安全性时,记住这些级别以便以有组织的方式处理与安全相关的问题。· 绑定地址:listen_addresses在文件中 postgresql.conf· 基于主机的访问控制:pg_hba.conf文件· 实例级权限:用户,角色,数据库创建,登录和复制· 数据库级权限:连接,创建模式等· 架构级权限:使用架构并在架构内创建对象· 表级权限:选择,插入,更新等· 列级权限:允许或限制对列的访问· 行级安全性:限制对行的访问为了读取值, PostgreSQL必须确保我们在每个级别都有足够的权限。整个权限链必须是正确的。在本文中,您将学习处理SSL,列级安全性和配置默认权限等的过程。了解绑定地址和连接配置PostgreSQL服务器时,需要做的第一件事就是定义远程访问。默认情况下,PostgreSQL不接受远程连接。重要的是由于PostgreSQL不能监听端口,所以导致它接收不到连接。如果我们尝试连接,错误消息实际上将来自操作系统。假设有一个使用默认配置的数据库服务器192.168.0.123,将发生以下情况:iMac:~ hs$ telnet 192.168.0.123 5432 Trying 192.168.0.123… telnet: connect to address 192.168.0.123: Connection refused telnet: Unable to connect to remote hostTelnet尝试在端口上创建连接,5432并立即被远程框拒绝。从外面看,看起来PostgreSQL根本就没有运行。成功连接的关键可以在postgresql.conf文件中找到:# - Connection Settings - # shop_addresses =‘localhost’ # 要监听的IP地址; # 逗号分隔的地址列表; # defaults为’localhost’; 使用’*‘表示所有# (更改需要重启)该listen_addresses设置将告诉PostgreSQL要监听的地址。从技术上讲,这些地址是绑定地址。这究竟意味着什么?假设我们的机器中有四个IP地址。我们这些IP地址只监听其中的三个。PostgreSQL只考虑这三个IP的请求,而不考虑第四个。如果我们放入 *,PostgreSQL会监听分配给您机器的每个IP。但是,有更多与连接管理相关的设置对于理解非常重要。它们如下:#port = 5432 # (change requires restart) max_connections = 100 # (change requires restart) # Note: Increasing max_connections costs ~400 bytes of # shared memory per # connection slot, plus lock space # (see max_locks_per_transaction). #superuser_reserved_connections = 3 # (change requires restart) #unix_socket_directories = ‘/tmp’ # comma-separated list of directories # (change requires restart) #unix_socket_group = ’’ # (change requires restart) #unix_socket_permissions = 0777 # begin with 0 to use octal notation # (change requires restart)首先,PostgreSQL侦听单个TCP端口,默认值为5432。请记住,PostgreSQL只会侦听单个端口。每当有请求进入时,postmaster将创建一个新进程来处理连接。默认情况下,最多允许100个普通连接。最重要的是,为超级用户保留了三个额外的连接。这意味着我们可以拥有97个连接加上三个超级用户或100个超级用户连接。处理SSLPostgreSQL允许我们加密服务器和客户端之间的传输。加密非常有用,特别是如果我们进行远距离通信。SSL提供了一种简单而安全的方式来确保没有人能够收听您的通信。在本节中,我们将学习如何设置SSL。首先要做的是在服务器启动时将ssl参数设置on为postgresql.conf文件。在下一步中,我们可以将SSL证书放入$PGDATA目录中。如果我们不希望证书位于其他目录中,请更改以下参数:#ssl_cert_file = ‘server.crt’ # (change requires restart) #ssl_key_file = ‘server.key’ # (change requires restart) #ssl_ca_file = ’’ # (change requires restart) #ssl_crl_file = ’’ # (change requires restart)如果我们要使用自签名证书,请执行以下步骤:openssl req -new -text -out server.req回答OpenSSL提出的问题。确保我们输入本地主机名作为通用名称。我们可以将密码留空。此调用将生成一个受密码保护的密钥; 它不会接受长度少于四个字符的密码短语。要删除密码(如果要自动启动服务器,则必须如此),请运行以下命令:openssl rsa -in privkey.pem -out server.keyrm privkey.pem输入旧密码以解锁现有密钥。现在,执行此操作将证书转换为自签名证书,并将密钥和证书复制到服务器将查找的位置:openssl req -x509 -in server.req -text -key server.key -out server.crt执行此操作后,请确保文件具有正确的权限集:chmod og-rwx server.key一旦将适当的规则放入pg_hba.conf文件中,我们就可以使用SSL连接到您的服务器。要验证我们确实使用SSL,请考虑签出该pg_stat_ssl功能。它将告诉我们每个连接以及它是否使用SSL,它将提供有关加密的一些重要信息:test=# \d pg_stat_sslView “pg_catalog.pg_stat_ssl"Column | Type | Modifiers ————-+———-+———– pid | integer | ssl | boolean | version | text | cipher | text | bits | integer | compression | boolean |clientdn | text |如果ssl进程的字段包含true; PostgreSQL做了我们期望它做的事情:postgres=# select * from pg_stat_ssl; -[ RECORD 1 ] —————————- pid | 20075ssl | t version | TLSv1.2cipher | ECDHE-RSA-AES256-GCM-SHA384 bits | 256compression | f clientdn |处理实例级安全性到目前为止,我们已经配置了绑定地址,我们告诉PostgreSQL使用哪种IP范围进行身份验证。到目前为止,配置纯粹与网络相关。在下一步中,我们可以将注意力转移到实例级别的权限。最重要的是要知道PostgreSQL中的用户存在于实例级别。如果我们创建一个用户,它不仅在一个数据库中可见; 它可以被所有数据库看到。用户可能只具有访问单个数据库的权限,但基本上用户是在实例级别创建的。对于那些刚接触PostgreSQL的人来说,还有一件事要记住:用户和角色是一回事。CREATE ROLE和CREATE USER子句有不同的默认值(字面上,唯一的区别是LOGIN默认情况下角色没有得到属性),但在一天结束时,用户和角色是相同的。因此,CREATE ROLE和CREATE USER子句支持完全相同的语法:test=# \h CREATE USERCommand: CREATE USERDescription: define a new database roleSyntax:CREATE USER name [ [ WITH ] option [ … ] ]where option can be:SUPERUSER | NOSUPERUSER| CREATEDB | NOCREATEDB| CREATEROLE | NOCREATEROLE| INHERIT | NOINHERIT| LOGIN | NOLOGIN| REPLICATION | NOREPLICATION| BYPASSRLS | NOBYPASSRLS| CONNECTION LIMIT connlimit| [ ENCRYPTED ] PASSWORD ‘password’| VALID UNTIL ’timestamp’| IN ROLE role_name [, …]| IN GROUP role_name [, …]| ROLE role_name [, …]| ADMIN role_name [, …]| USER role_name [, …]| SYSID uid让我们逐个讨论这些语法元素。我们首先看到的是用户可以是超级用户或普通用户。如果某人被标记为a SUPERUSER ,则不再有普通用户必须面对的任何限制。A SUPERUSER 可以根据需要删除对象(数据库等)。下一个重要的事情是它在实例级别上获取创建新数据库的权限。规则是这样的:创建者总是自动成为对象的所有者(除非另有说明,否则可以使用该CREATE DATABASE子句)。美丽的是,对象所有者也可以再次丢弃一个对象。下一个重要的是INHERIT/ NOINHERITclause。如果INHERIT设置了子句(这是默认值),则用户可以继承其他用户的权限。使用继承权限允许我们使用角色,这是抽象权限的好方法。例如,我们可以创建角色bookkeeper并使许多其他角色继承bookkeeper。我们的想法是bookkeeper,即使我们有很多人从事会计工作,我们也只需要告诉PostgreSQL一次允许做什么。该LOGIN/ NOLOGIN子句定义一个角色是否可以登录到该实例。在理论介绍之后,是时候实际创建用户并看看在实际示例中如何使用事物:test=# CREATE ROLE bookkeeper NOLOGIN; CREATE ROLE test=# CREATE ROLE joe LOGIN; CREATE ROLE test=# GRANT bookkeeper TO joe; GRANT ROLE这里做的第一件事bookkeeper是创建一个名为的角色。请注意,我们不希望人们以身份登录bookkeeper,因此角色标记为NOLOGIN。另请注意,NOLOGIN如果使用该CREATE ROLE子句,则为默认值。如果您更喜欢该CREATE USER子句,则默认设置为LOGIN。然后,joe创建角色并标记为LOGIN。最后,将bookkeeper角色分配给joe角色,以便他可以执行bookkeeper实际允许的所有操作。一旦用户到位,我们可以测试到目前为止我们拥有的内容:[hs@zenbook ~]$ psql test -U bookkeeper psql: FATAL: role “bookkeeper” is not permitted to log in正如所料,该bookkeeper角色不允许登录系统。如果joe角色尝试登录会发生什么? [hs@zenbook ~]$ psql test -U joe … test=>这实际上将按预期工作。但请注意,命令提示符已更改。这只是PostgreSQL向您显示您未以超级用户身份登录的一种方式。创建用户后,可能需要对其进行修改。我们可能想要改变的一件事是密码。在PostgreSQL中,允许用户更改自己的密码。下面是它的工作原理:test=> ALTER ROLE joe PASSWORD ‘abc’; ALTER ROLE test=> SELECT current_user; current_user ————– joe (1 row)该ALTER ROLE条款(或ALTER USER)将允许我们改变它可以创建用户时设置大多数设置。但是,管理用户还有很多。在许多情况下,我们希望为用户分配特殊参数。该ALTER USER条款为我们提供了这样做的方法:ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter { TO | = } { value | DEFAULT } ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] SET configuration_parameter FROM CURRENT ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET configuration_parameter ALTER ROLE { role_specification | ALL } [ IN DATABASE database_name ] RESET ALL语法非常简单,非常简单。为了描述为什么这非常有用,我添加了一个真实的例子。让我们假设Joe碰巧住在毛里求斯岛上。当他登录时,即使他的数据库服务器位于欧洲,他也希望自己在他自己的时区:test=> ALTER ROLE joe SET TimeZone = ‘UTC-4’; ALTER ROLE test=> SELECT now(); now ——————————- 2017-01-09 20:36:48.571584+01 (1 row) test=> q [hs@zenbook ~]$ psql test -U joe … test=> SELECT now(); now ——————————- 2017-01-09 23:36:53.357845+04 (1 row)该ALTER ROLE子句将修改用户。一旦joe重新连接,就会为他设置时区。时区不会立即更改。您应该重新连接或使用SET … TO DEFAULT子句。这里重要的是这对于某些内存参数也是可能的,例如work_mem等等。数据库级别的安全性在实例级别配置用户之后,可以深入挖掘并查看在数据库级别可以执行的操作。出现的第一个主要问题是:我们明确允许Joe登录数据库实例,但是谁或什么允许Joe实际连接到其中一个数据库?也许我们不希望Joe访问系统中的所有数据库。限制对某些数据库的访问正是我们在此级别上可以实现的目标。对于数据库,可以使用GRANT子句设置以下权限:GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, …] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, …] TO role_specification [, …] [ WITH GRANT OPTION ] 数据库级别有两个主要权限值得密切关注:· CREATE:这允许某人在数据库中创建模式。请注意,CREATE子句不允许创建表; 它是关于模式的。在PostgreSQL中,表位于模式中,因此您必须首先进入模式级别才能创建表。· CONNECT:这允许有人连接到数据库。现在的问题是:没有人明确CONNECT为joe角色分配权限,那么这些权限实际上来自何处?答案是:有一个叫做的东西public,类似于Unix世界。如果世界被允许做某事,那么joe,谁是一般公众的一部分。最重要的是,public它不是一个角色,它可以被删除和重命名。我们可以简单地将其视为系统中每个人的等价物。因此,为了确保不是每个人都可以随时连接到任何数据库,CONNECT可能必须从公众中撤销。为此,我们可以以超级用户身份进行连接并解决问题:[hs@zenbook ~]$ psql test -U postgres … test=# REVOKE ALL ON DATABASE test FROM public; REVOKE test=# \q [hs@zenbook ~]$ psql test -U joe psql: FATAL: permission denied for database “test” DETAIL: User does not have CONNECT privilege.我们可以看到,该joe角色不再允许连接。此时,只有超级用户才能进行测试。通常,postgres 即使在创建其他数据库之前,最好还是从数据库中撤消权限。这个概念背后的想法是,这些权限将不再存在于所有新创建的数据库中。如果某人需要访问某个数据库,则必须明确授予权限。权利不再自动存在。如果我们想允许joe角色连接到测试数据库,请以超级用户身份尝试以下行:[hs@zenbook ~]$ psql test -U postgres … test=# GRANT CONNECT ON DATABASE test TO bookkeeper; GRANT test=# \q [hs@zenbook ~]$ psql test -U joe … test=>基本上,这里有两种选择:· 我们可以joe直接允许角色,以便只有joe角色才能连接。· 或者,我们可以为该bookkeeper角色授予权限。请记住,joe角色将继承角色的所有权限bookkeeper,因此,如果我们希望所有会计师都能够连接到数据库,则为角色分配权限bookkeeper似乎是一个有吸引力的想法。如果我们为该bookkeeper角色授予权限,则它没有风险,因为该角色不允许首先登录到该实例,因此它纯粹作为权限来源。处理列级安全性在某些情况下,并不是每个人都可以看到所有数据。想象一下银行,有些人可能会看到有关银行帐户的全部信息,而其他人可能仅限于数据的一部分。在现实世界的情况下,可能不允许某人阅读余额栏,或者有人可能看不到人民贷款的利率。另一个例子是,人们可以看到人们的个人资料,但不能看到他们的照片或其他私人信息。现在的问题是:如何使用列级安全性?为了证明这一点,我们将向属于该joe角色的现有表添加一列:test=> ALTER TABLE t_useful ADD COLUMN name text; ALTER TABLE该表现在由两列组成。该示例的目标是确保用户只能看到其中一列:test=> \d t_useful Table “public.t_useful” Column | Type | Modifiers ——–+———+———– id | integer | name | text |作为超级用户,让我们创建一个用户并让它访问包含我们表的模式:test=# CREATE ROLE paul LOGIN; CREATE ROLE test=# GRANT CONNECT ON DATABASE test TO paul; GRANT test=# GRANT USAGE ON SCHEMA public TO paul; GRANTCONNECT被撤销了public。因此,明确授予绝对是必要的,以确保我们甚至可以到达桌面。该SELECT权限可以赋予paul角色:test=# GRANT SELECT (id) ON t_useful TO paul; GRANT 基本上,这已经足够了。已经可以以用户身份连接到数据库paul并阅读该列:[hs@zenbook ~]$ psql test -U paul … test=> SELECT id FROM t_useful; id —- (0 rows)如果我们使用列级权限,请记住一件重要的事情,我们应该停止使用SELECT *,因为它不再起作用了:test=> SELECT * FROM t_useful; ERROR: permission denied for relation t_useful仍然意味着所有列,但由于无法访问所有列,事情将立即出错。配置默认权限到目前为止,已经配置了很多东西。如果将新表添加到系统会发生什么?逐个处理这些表并设置适当的权限可能会非常痛苦和风险。如果这些事情会自动发生,那不是很好吗?这正是该ALTER DEFAULT PRIVILEGES条款的作用。这个想法是为用户提供一个选项,让PostgreSQL在对象出现后立即自动设置所需的权限。有人不能再忘记设置这些权利了。以下清单显示了语法规范的第一部分:postgres=# \h ALTER DEFAULT PRIVILEGESCommand: ALTER DEFAULT PRIVILEGESDescription: define default access privilegesSyntax:ALTER DEFAULT PRIVILEGES [ FOR { ROLE | USER } target_role [, …] ] [ IN SCHEMA schema_name [, …] ] abbreviated_grant_or_revokewhere abbreviated_grant_or_revoke is one of:GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }[, …] | ALL [ PRIVILEGES ] }ON TABLESTO { [ GROUP ] role_name | PUBLIC } [, …] [ WITH GRANT OPTION ]…基本上,语法与GRANT子句类似,因此使用起来简单直观。为了向我们展示它的工作原理,我编写了一个简单的例子。我们的想法是,如果joe角色创建了一个表,该paul角色将自动使用它:test=# ALTER DEFAULT PRIVILEGES FOR ROLE joe IN SCHEMA public GRANT ALL ON TABLES TO paul; ALTER DEFAULT PRIVILEGES让我们joe现在作为角色连接并创建一个表:[hs@zenbook ~]$ psql test -U joe … test=> CREATE TABLE t_user (id serial, name text, passwd text); CREATE TABLE作为paul角色连接将证明该表已分配给适当的权限集:[hs@zenbook ~]$ psql test -U paul … test=> SELECT * FROM t_user; id | name | passwd —-+——+——– (0 row ...

April 11, 2019 · 4 min · jiezi

如何通过Telnet和SSH远程监控主机

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:13min在本文中,你将学习如何在配置了Telnet和SSH的服务器上执行基本配置。我们将首先使用Telnet模块,之后我们将使用首选方法实现相同的配置:使用Python中的不同模块进行SSH,了解如何telnetlib,subprocess,fabric,Netmiko,和paramiko模块的工作。telnetlib()模块在本节中,我们将了解Telnet协议,然后我们将通过远程服务器上的telnetlib模块执行Telnet操作。Telnet是一种允许用户与远程服务器通信的网络协议。它主要由网络管理员用于远程访问和管理设备。要访问设备,请使用终端中远程服务器的IP地址或主机名运行Telnet命令。Telnet在默认端口号上使用TCP 23。要使用Telnet,请确保它已安装在你的系统上。如果没有,请运行以下命令进行安装:$ sudo apt-get install telnetd要使用简单的终端运行Telnet,您只需输入以下命令:$ telnet ip_address_of_your_remote_serverPython具有telnetlib通过Python脚本执行Telnet功能的模块。在telnet远程设备或路由器之前,请确保它们已正确配置,如果没有,则可以使用路由器终端中的以下命令进行基本配置:configure terminalenable password ‘set_Your_password_to_access_router’username ‘set_username’ password ‘set_password_for_remote_access’line vty 0 4 login local transport input all interface f0/0 ip add ‘set_ip_address_to_the_router’ ‘put_subnet_mask’no shut end show ip interface brief现在,让我们看一下Telnet远程设备的示例。为此,创建一个telnet_example.py脚本并在其中编写以下内容:import telnetlibimport getpassimport sysHOST_IP = “your host ip address"host_user = input(“Enter your telnet username: “)password = getpass.getpass()t = telnetlib.Telnet(HOST_IP)t.read_until(b"Username:")t.write(host_user.encode(“ascii”) + b”\n”)if password:t.read_until(b"Password:")t.write(password.encode(“ascii”) + b”\n")t.write(b"enable\n")t.write(b"enter_remote_device_password\n") #password of your remote devicet.write(b"conf t\n")t.write(b"int loop 1\n")t.write(b"ip add 10.1.1.1 255.255.255.255\n")t.write(b"int loop 2\n")t.write(b"ip add 20.2.2.2 255.255.255.255\n")t.write(b"end\n")t.write(b"exit\n")print(t.read_all().decode(“ascii”) )运行脚本,获得如下输出:student@ubuntu:$ python3 telnet_example.pyOutput:Enter your telnet username: studentPassword:server>enablePassword:server#conf tEnter configuration commands, one per line. End with CNTL/Z.server(config)#int loop 1server(config-if)#ip add 10.1.1.1 255.255.255.255server(config-if)#int loop 23server(config-if)#ip add 20.2.2.2 255.255.255.255server(config-if)#endserver#exit在前面的示例中,我们使用该telnetlib模块访问和配置了Cisco路由器。在此脚本中,首先,我们从用户那里获取用户名和密码,以初始化与远程设备的Telnet连接。建立连接后,我们在远程设备上进行了进一步配置。远程登录后,我们将能够访问远程服务器或设备。但是这个Telnet协议有一个非常重要的缺点,即所有数据,包括用户名和密码,都是以文本方式通过网络发送的,这可能会带来安全风险。因此,如今Telnet很少被使用,并且被称为Secure Shell的非常安全的协议所取代,称为SSH。通过在终端中运行以下命令来安装SSH:$ sudo apt install ssh此外,在用户想要通信的远程服务器上,必须安装并运行SSH服务器。SSH使用TCP协议,22默认使用端口号。您可以ssh通过终端运行 命令,如下所示:$ ssh host_name@host_ip_address现在来学习使用Python中的不同模块来执行SSH,例如subprocess,fabric,Netmiko和Paramiko。现在,我们将逐一看到这些模块。subprocess.Popen()模块此模块的底层的进程创建与管理由 Popen 类处理。它提供了很大的灵活性,因此开发者能够处理未被便利函数覆盖的不常见用例。子程序执行将在新进程中完成。要在Unix / Linux上执行子程序,该类将使用该 os.execvp()函数。要在Windows中执行子程序,该类将使用CreateProcess()函数。现在,让我们看一些有用的参数subprocess.Popen():class subprocess.Popen(args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=False, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0)让我们看看每个论点:· args: 它可以是一系列程序参数或单个字符串。如果args是序列,则执行args中的第一项。如果args是一个字符串,它建议将args作为序列传递。· shell:shell参数默认设置为False,它指定是否使用shell执行程序。如果是shell True,则建议将args作为字符串传递。在 Linux中,如果shell=True,shell默认为/bin/sh。如果args是字符串,则字符串指定要通过shell执行的命令。· bufsize:如果bufsize是0(默认情况下是0),则表示无缓冲,如果bufsize是1,则表示行缓冲。如果bufsize是任何其他正值,请使用给定大小的缓冲区。如果bufsize是任何其他负值,则表示完全缓冲。· executable:它指定要执行的替换程序。· stdin,, stdout和stderr:这些参数分别定义标准输入,标准输出和标准错误。· preexec_fn: 这被设置为可调用对象,将在子进程中执行子进程之前调用。· close_fds: 在Linux中,如果close_fds是真的,所有的文件描述符,除了0,1和2执行子进程之前,将被关闭。在Windows中,如果close_fds是,true那么子进程将继承没有句柄。· env: 如果值不是None,则映射将为新进程定义环境变量。· universal_newlines: 如果该值True则stdout和stderr将被打开,在新行模式下的文本文件。现在,我们将看到一个例子subprocess.Popen()。为此,创建一个 ssh_using_sub.py 脚本并在其中写入以下内容:import subprocessimport sysHOST=“your host username@host ip"COMMAND= “ls"ssh_obj = subprocess.Popen([“ssh”, “%s” % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE)result = ssh_obj.stdout.readlines()if result == []:err = ssh_obj.stderr.readlines()print(sys.stderr, “ERROR: %s” % err)else:print(result)运行脚本,您将获得如下输出:student@ubuntu:$ python3 ssh_using_sub.pyOutput :student@192.168.0.106’s password:[b’Desktop\n’, b’Documents\n’, b’Downloads\n’, b’examples.desktop\n’, b’Music\n’, b’Pictures\n’, b’Public\n’, b’sample.py\n’, b’spark\n’, b’spark-2.3.1-bin-hadoop2.7\n’, b’spark-2.3.1-bin-hadoop2.7.tgz\n’, b’ssh\n’, b’Templates\n’, b’test_folder\n’, b’test.txt\n’, b’Untitled1.ipynb\n’, b’Untitled.ipynb\n’, b’Videos\n’, b’work\n’]在前面的示例中,首先,我们导入了子进程模块,然后我们定义了要建立SSH连接的主机地址。之后,我们给出了一个通过远程设备执行的简单命令。完成所有这些后,我们将此信息放在 subprocess.Popen()函数中。此函数执行该函数内定义的参数以创建与远程设备的连接。建立SSH连接后,执行我们定义的命令并提供结果。然后我们在终端上打印SSH的结果,如输出中所示。SSH使用Fabric模块Fabric是一个Python库,也是一个使用SSH的命令行工具。它用于通过网络进行系统管理和应用程序部署。我们也可以通过SSH执行shell命令。要使用结构模块,首先必须使用以下命令安装它:$ pip3 install fabric3现在,我们将看到一个例子。创建一个 fabfile.py脚本并在其中写入以下内容:from fabric.api import *env.hosts=[“host_name@host_ip”]env.password=‘your password’def dir(): run(‘mkdir fabric’) print(‘Directory named fabric has been created on your host network’)def diskspace(): run(‘df’)运行脚本,您将获得如下输出:student@ubuntu:$ fab dirOutput:[student@192.168.0.106] Executing task ‘dir’[student@192.168.0.106] run: mkdir fabric Done.Disconnecting from 192.168.0.106… done.在前面的示例中,首先,我们导入了fabric.api模块,然后设置主机名和密码以与主机网络连接。之后,我们设置了一个不同的任务来执行SSH。因此,为了执行我们的程序而不是Python3 fabfile.py,我们使用了fabutility(fab dir),之后我们声明所需的任务应该从我们的执行fabfile.py。在我们的例子中,我们执行了dir任务,该任务’fabric’在远程网络上创建了一个名称目录。您可以在Python文件中添加特定任务。它可以使用fab结构模块的实用程序执行。SSH使用Paramiko库Paramiko是一个实现SSHv2协议的库,用于与远程设备的安全连接。Paramiko是一个围绕SSH的纯Python界面。在使用Paramiko之前,请确保已在系统上正确安装。如果未安装,可以通过在终端中运行以下命令来安装它:$ sudo pip3 install paramiko现在,我们将看到一个使用示例paramiko。对于此paramiko连接,我们使用的是Cisco设备。Paramiko支持基于密码和基于密钥对的身份验证,以实现与服务器的安全连接。在我们的脚本中,我们使用基于密码的身份验证,这意味着我们检查密码,如果可用,则使用普通用户名/密码身份验证尝试进行身份验证。在我们要对你的远程设备或多层路由器进行SSH连接之前,请确保它们已正确配置,如果没有,可以在多层路由器终端中使用以下命令进行基本配置:configure tip domain-name cciepython.comcrypto key generate rsaHow many bits in the modulus [512]: 1024interface range f0/0 - 1switchport mode accessswitchport access vlan 1no shutint vlan 1ip add ‘set_ip_address_to_the_router’ ‘put_subnet_mask’no shutexitenable password ‘set_Your_password_to_access_router’username ‘set_username’ password ‘set_password_for_remote_access’username ‘username’ privilege 15line vty 0 4login localtransport input allend现在,创建一个pmiko.py脚本并在其中编写以下内容:import paramikoimport timeip_address = “host_ip_address"usr = “host_username"pwd = “host_password"c = paramiko.SSHClient()c.set_missing_host_key_policy(paramiko.AutoAddPolicy())c.connect(hostname=ip_address,username=usr,password=pwd)print(“SSH connection is successfully established with “, ip_address)rc = c.invoke_shell()for n in range (2,6):print(“Creating VLAN " + str(n))rc.send(“vlan database\n”)rc.send(“vlan " + str(n) + “\n”)rc.send(“exit\n”)time.sleep(0.5)time.sleep(1)output = rc.recv(65535)print(output)c.close运行脚本,您将获得如下输出:student@ubuntu:$ python3 pmiko.pyOutput:SSH connection is successfuly established with 192.168.0.70Creating VLAN 2Creating VLAN 3Creating VLAN 4Creating VLAN 5在前面的示例中,首先,我们导入了paramiko模块,然后我们定义了连接远程设备所需的SSH凭据。提供凭证后,我们创建一个实例’c’的paramiko.SSHclient(),它是用于与远程设备建立连接和执行命令或操作主客户端。创建SSHClient对象允许我们使用该.connect()函数建立远程连接。然后,我们设置策略paramiko连接,因为默认情况下, paramiko.SSHclient将SSH策略设置为拒绝策略状态。这会导致策略在没有任何验证的情况下拒绝任何SSH连接。在我们的脚本中,我们忽略了SSH连接丢失的可能性 AutoAddPolicy()在不提示的情况下自动添加服务器主机密钥的功能。我们可以将此策略用于测试目的,但出于安全目的,这在生产环境中不是一个好的选择。建立SSH连接后,你可以在设备上执行所需的任何配置或操作。在这里,我们在远程设备上创建了一些虚拟LAN。创建VLAN后,我们只关闭了连接。SSH使用Netmiko库在本节中,我们将了解Netmiko。Netmiko库是Paramiko的高级版本。这是一个multi_vendor基于Paramiko 的图书馆。Netmiko简化了与网络设备的SSH连接,并对设备进行了特殊操作。在对远程设备或多层路由器进行SSH连接之前,请确保它们已正确配置,如果没有,则可以通过Paramiko部分中提到的命令进行基本配置。现在,让我们看一个例子。创建一个 nmiko.py脚本并在其中编写以下代码:from netmiko import ConnectHandlerremote_device={‘device_type’: ‘cisco_ios’,‘ip’: ‘your remote_device ip address’,‘username’: ‘username’,‘password’: ‘password’,}remote_connection = ConnectHandler(**remote_device)#net_connect.find_prompt()for n in range (2,6):print(“Creating VLAN " + str(n))commands = [’exit’,‘vlan database’,‘vlan ’ + str(n), ’exit’]output = remote_connection.send_config_set(commands)print(output)command = remote_connection.send_command(‘show vlan-switch brief’)print(command)运行脚本,您将获得如下输出:student@ubuntu:~$ python3 nmiko.pyOutput:Creating VLAN 2config termEnter configuration commands, one per line. End with CNTL/Z.server(config)#exitserver #vlan databaseserver (vlan)#vlan 2VLAN 2 modified:server (vlan)#exitAPPLY completed.Exiting….server #……..switch#Creating VLAN 5config termEnter configuration commands, one per line. End with CNTL/Z.server (config)#exitserver #vlan databaseserver (vlan)#vlan 5VLAN 5 modified:server (vlan)#exitAPPLY completed.Exiting….VLAN Name Status Ports—- ——————————– ——— ——————————-1 default active Fa0/0, Fa0/1, Fa0/2, Fa0/3, Fa0/4, Fa0/5, Fa0/6, Fa0/7, Fa0/8, Fa0/9, Fa0/10, Fa0/11, Fa0/12, Fa0/13, Fa0/14, Fa0/152 VLAN0002 active 3 VLAN0003 active 4 VLAN0004 active 5 VLAN0005 active 1002 fddi-default active 1003 token-ring-default active 1004 fddinet-default active 1005 trnet-default active在前面的示例中,我们使用Netmiko库来执行SSH,而不是Paramiko。在这个脚本中,首先,我们ConnectHandler从Netmiko库导入,我们通过传入设备字典来建立与远程网络设备的SSH连接。在我们的例子中,那个词典是remote_device。建立连接后,我们执行配置命令以使用该send_config_set()功能创建多个虚拟LAN 。当我们使用这种类型.send_config_set()的函数来传递远程设备上的命令时,它会自动将我们的设备设置为配置模式。发送配置命令后,我们还传递了一个简单的命令来获取有关已配置设备的信息。 ...

April 11, 2019 · 3 min · jiezi

创建聊天机器人以协助网络操作

创建聊天机器人以协助网络操作来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:11min在本文中,我们将了解如何利用聊天机器人来协助网络操作。随着我们向智能化运营迈进,另一个需要关注的领域是移动性。有一个脚本可以执行配置,修复甚至故障排除,但它仍然需要存在来监视,启动甚至执行这些程序或脚本。诺基亚的MIKA是操作人员可以用来进行网络故障排除和修复的聊天机器人的一个很好的例子。根据诺基亚的博客,MIKA根据此单个网络的实际情况响应警报优先级信息,并将当前情况与此网络及其他网络过去事件的整个服务历史进行比较,以确定当前网络的最佳解决方案。让我们创建一个聊天机器人来协助网络运营。对于这个用例,我们将使用广泛使用的聊天应用程序Slack。参考Splunk的智能数据分析功能,我们会看到一些用户聊天与聊天机器人的交互,以获得对环境的一些了解。当我们部署了我们的Web框架时,我们将利用相同的框架与Slack聊天机器人进行交互,而后者又将与Splunk进行交互。它还可以直接与网络设备交互,因此我们可以启动一些复杂的聊天,例如在需要时从Slack重启路由器。这最终为工程师提供了移动性,他可以从任何地方(甚至是手机)处理任务,而不必绑定到某个位置或办公室。要创建聊天机器人,以下是基本步骤:在Slack上创建一个工作区(或帐户):在工作区中创建一个应用程序(在我们的例子中,我们创建了一个名为的应用程序mybot):以下是有关应用程序的基本信息(应用程序ID和客户端ID可以与唯一标识此应用程序的其他信息一起使用):为此应用程序添加bot功能:添加事件订阅并映射到将要发布消息的外部API。事件订阅是指某人在聊天中键入对聊天机器人的引用,然后将使用此聊天机器人与聊天中键入的数据调用哪个API:在这里,关键的一步是,一旦我们输入接受聊天消息的URL,就需要从Slack验证特定的URL。验证涉及API端点将相同的响应作为从Slack发送到该端点的字符串或JSON发回。如果我们收到相同的响应,Slack确认端点是可信的并将其标记为已验证。这是一次性过程,API URL中的任何更改都将导致重复此步骤。以下是Ops API框架中的 Python代码,它响应此特定查询:import falconimport jsondef on_get(self,req,resp): # Handles GET request resp.status=falcon.HTTP_200 # Default status resp.body=json.dumps({“Server is Up!”})def on_post(self,req,resp): # Handles POST Request print(“In post”) data=req.bounded_stream.read() try: # Authenticating end point to Slack data=json.loads(data)[“challenge”] # Default status resp.status=falcon.HTTP_200 # Send challenge string back as response resp.body=data except: # URL already verified resp.status=falcon.HTTP_200 resp.body=““这将验证,如果从Slack发送质询,它将回复相同的质询值,确认它是Slack通道发送聊天数据的正确端点。将此应用程序(或聊天机器人)安装到任何渠道(这类似于在群聊中添加用户):响应特定聊天消息的核心API框架代码执行以下操作:· 确认发送给Slack的任何帖子都会200在三秒内响应。如果没有这样做,Slack报告说: endpoint not reachable。· 确保从聊天机器人(不是来自任何真实用户)发送的任何消息再次不作为回复发回。这可以创建一个循环,因为从聊天机器人发送的消息将被视为Slack聊天中的新消息,并且它将再次发送到URL。这最终会使聊天无法使用,从而导致聊天中出现重复的消息。· 使用将被发送回Slack的令牌对响应进行身份验证,以确保来自Slack的响应来自经过身份验证的源。代码如下:import falconimport jsonimport requestsimport base64from splunkquery import runfrom splunk_alexa import alexafrom channel import channel_connect,set_dataclass Bot_BECJ82A3V(): def on_get(self,req,resp): # Handles GET request resp.status=falcon.HTTP_200 # Default status resp.body=json.dumps({“Server is Up!”}) def on_post(self,req,resp): # Handles POST Request print(“In post”) data=req.bounded_stream.read() try: bot_id=json.loads(data)[“event”][“bot_id”] if bot_id==“BECJ82A3V”: print(“Ignore message from same bot”) resp.status=falcon.HTTP_200 resp.body=”” return except: print(“Life goes on. . .”) try: # Authenticating end point to Slack data=json.loads(data)[“challenge”] # Default status resp.status=falcon.HTTP_200 # Send challenge string back as response resp.body=data except: # URL already verified resp.status=falcon.HTTP_200 resp.body="" print(data) data=json.loads(data) #Get the channel and data information channel=data[“event”][“channel”] text=data[“event”][“text”] # Authenticate Agent to access Slack endpoint token=“xoxp-xxxxxx” # Set parameters print(type(data)) print(text) set_data(channel,token,resp) # Process request and connect to slack channel channel_connect(text) return# falcon.API instance , callable from gunicornapp= falcon.API()# instantiate helloWorld classBot3V=Bot_BECJ82A3V()# map URL to helloWorld classapp.add_route("/slack",Bot3V)执行频道交互响应:此代码负责在聊天频道中解释使用chat-bot执行的特定聊天。此外,这将通过回复,特定用户或通道ID以及对Slack API的身份验证令牌进行响应,这确保了消息或回复Slack聊天的消息显示在特定频道上,从它发起的位置。作为示例,我们将使用聊天来加密或解密特定值。例如,如果我们写encrypt username[:]password,它将返回带有base64值的加密字符串。类似地,如果我们写,聊天机器人将在解密编码的字符串后返回。decrypt代码如下:import jsonimport requestsimport base64from splunk_alexa import alexachannl=““token=““resp=““def set_data(Channel,Token,Response): global channl,token,resp channl=Channel token=Token resp=Responsedef send_data(text):global channl,token,resprint(channl)resp = requests.post(“https://slack.com/api/chat.postMessage",data='{"channel":"'+channl+'","text":"'+text+'"}',headers={"Content-type": “application/json”,“Authorization”: “Bearer “+token},verify=False)def channel_connect(text):global channl,token,resptry: print(text)arg=text.split(’ ‘)print(str(arg))path=arg[0].lower()print(path in [“decode”,“encode”])if path in [“decode”,“encode”]:print(“deecode api”)else:result=alexa(arg,resp)text=““try:for i in result:print(i)print(str(i.values()))for j in i.values():print(j)text=text+’ ‘+j#print(j)if text==”” or text==None:text=“None"send_data(text)returnexcept:text=“None"send_data(text)returndecode=arg[1]except:print(“Please enter a string to decode”)text=” argument cannot be empty"send_data(text)returndeencode(arg,text)def deencode(arg,text):global channl,token,respdecode=arg[1]if arg[1]==’–help’:#print(“Sinput”)text=“encode/decode “send_data(text)returnif arg[0].lower()==“encode”:encoded=base64.b64encode(str.encode(decode))if ‘[:]’ in decode:text=“Encoded string: “+encoded.decode(‘utf-8’)send_data(text)returnelse:text=“sample string format username[:]password"send_data(text)returntry:creds=base64.b64decode(decode)creds=creds.decode(“utf-8”)except:print(“problem while decoding String”)text=“Error decoding the string. Check your encoded string.“send_data(text)returnif ‘[:]’ in str(creds):print(”[:] substring exists in the decoded base64 credentials”)# split based on the first match of “[:]“credentials = str(creds).split(’[:]’,1)username = str(credentials[0])password = str(credentials[1])status = ‘success’else:text=“encoded string is not in standard format, use username[:]password"send_data(text)print(“the encoded base64 is not in standard format username[:]password”)username = “Invalid"password = “Invalid"status = ‘failed’temp_dict = {}temp_dict[‘output’] = {‘username’:username,‘password’:password}temp_dict[‘status’] = statustemp_dict[‘identifier’] = ““temp_dict[’type’] = “"#result.append(temp_dict)print(temp_dict)text=” “+username+” “+passwordsend_data(text)print(resp.text)print(resp.status_code)return此代码查询Splunk实例以查找与聊天机器人的特定聊天。聊天会要求任何Loopback45当前关闭的管理界面()。另外,在聊天中,用户可以询问管理接口所在的所有路由器up。此英语响应将转换为Splunk查询,并根据Splunk的响应将状态返回到Slack聊天。让我们看看执行动作来响应结果的代码,对Slack聊天:from splunkquery import rundef alexa(data,resp): try: string=data.split(’ ‘) except: string=data search=’ ‘.join(string[0:-1]) param=string[-1] print(“param”+param) match_dict={0:“routers management interface”,1:“routers management loopback”} for no in range(2): print(match_dict[no].split(’ ‘)) print(search.split(’ ‘)) test=list(map(lambda x:x in search.split(’ ‘),match_dict[no].split(’ ‘))) print(test) print(no) if False in test: pass else: if no in [0,1]: if param.lower()==“up”: query=“search%20index%3D%22main%22%20earliest%3D0%20%7C%20dedup%20interface_name%2Crouter_name%20%7C%20where%20interface_name%3D%22Loopback45%22%20%20and%20interface_status%3D%22up%22%20%7C%20table%20router_name” elif param.lower()==“down”: query=“search%20index%3D%22main%22%20earliest%3D0%20%7C%20dedup%20interface_name%2Crouter_name%20%7C%20where%20interface_name%3D%22Loopback45%22%20%20and%20interface_status%21%3D%22up%22%20%7C%20table%20router_name” else: return “None” result=run(query,resp) return result以下Splunk查询获取状态:· 对于UP接口:查询如下:index=“main” earliest=0 | dedup interface_name,router_name | where interface_name=“Loopback45” and interface_status=“up” | table router_name· 对于DOWN接口(除了以外的任何状态):查询如下:index=“main” earliest=0 | dedup interface_name,router_name | where interface_name=“Loopback45” and interface_status!=“up” | table router_name让我们看看聊天机器人聊天的最终结果以及根据聊天记录发回的响应。编码/解码示例如下:正如我们在这里看到的,我们发送了一条encode abhishek[:]password123 消息聊天。此聊天作为POST请求发送到API,后者又将其加密到base64并使用添加的单词作为回复。在下一个聊天中,我们使用decode选项传递相同的字符串。这会通过解码来自API函数的信息进行响应,并使用用户名和密码回复Slack聊天。Encoded string: abhishekpassword123让我们看一下Splunk查询聊天的示例:在此查询中,我们已关闭 Loopback45 接口rtr1。在我们通过Python脚本计划发现这些接口的过程中 ,数据现在位于Splunk中。当查询哪个管理接口(Loopback45)关闭时,它将回复rtr1。松弛的聊天,On which routers the management interface is down会将此传递给API,在收到此有效负载后,它将运行Splunk查询以获取统计信息。返回值(在本例中为rtr1)将作为聊天中的响应返回。类似地,中,反向查询On which routers the management interface is up,将查询的Splunk和最终共享回响应rtr2,rtr3和rtr4(因为所有这些路由器接口是UP)。可以扩展此聊天用例,以确保使用简单聊天可以进行完整的端到端故障排除。可以使用各种后端功能构建大量案例,从问题的基本识别到复杂任务,例如基于已识别情况的补救。 ...

April 10, 2019 · 3 min · jiezi

如何在React Native应用程序中保持动画以60 FPS运行

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:4min任何高质量移动应用程序的一个重要方面是用户界面的流动性。动画用于提供丰富的用户体验,任何jank或抖动都会对此产生负面影响。动画可能会用于各种交互,从视图之间的转换,到对用户在组件上的触摸交互作出反应。高质量动画的第二个最重要的因素是确保它们不会阻止 JavaScript线程。为了使动画保持流畅而不中断UI交互,渲染循环必须在16.67 ms内渲染每个帧,以便可以实现60 FPS。在本文中,我们将介绍几种在React Native移动应用程序中提高动画性能的技术 。这些技术将防止 JavaScript执行中断主线程。对于这篇文章,我们假设你有一个React Native应用程序,它定义了一些动画。怎么做首先,在React Native中调试动画性能时,我们需要启用性能监视器。为此,请显示开发菜单(从模拟器中摇动设备或cmd + D),然后点击显示Perf监视器。iOS中的输出类似于以下屏幕截图:Android中的输出类似于以下屏幕截图:如果您要为组件的过渡(opacity)或尺寸(width,height)设置动画,请确保使用LayoutAnimation。如果要LayoutAnimation在 Android上使用,则需要在应用程序启动时添加以下代码: UIManager.setLayoutAnimationEnabledExperimental && UIManager.setLayoutAnimationEnabledExperimental(true)。如果您需要对动画进行有限控制,建议您使用AnimatedReact Native附带的库。此库允许您将所有动画工作卸载到本机UI线程上。为此,我们必须将useNativeDriver属性添加到我们的Animated调用中。我们来看一个示例Animated示例并将其卸载到本机线程:componentWillMount() { this.setState({ fadeAnimimation: new Animated.Value(0) }); }componentDidMount() { Animated.timing(this.state.fadeAnimimation, { toValue: 1, useNativeDriver: true }).start(); }如果您无法将动画工作卸载到本机线程上,则仍然可以提供顺畅体验的解决方案。我们可以InteractionManager在动画完成后使用它来执行任务:componentWillMount() { this.setState({ isAnimationDone: false }); } componentWillUpdate() { LayoutAnimation.easeInAndOut(); }componentDidMount() { InteractionManager.runAfterInteractions(() => { this.setState({ isAnimationDone: true }); }) }render() { if (!this.state.isAnimationDone) { return this.renderPlaceholder(); } return this.renderMainScene(); }最后,如果您仍然遇到性能不佳的问题,则必须重新考虑动画策略或将效果不佳的视图实现为目标平台上的自定义UI视图组件。您必须使用iOS和/或Android SDK 本地实现视图和动画 。这个怎么运作本文中的提示着重于防止JavaScript线程锁定的简单目标。我们的JavaScript线程开始丢帧(锁定)的那一刻,我们失去了与我们的应用程序交互的能力,即使它只是一小段时间。这可能看起来无关紧要,但精明的用户会立即感受到这种效果。本文中提示的重点是将动画卸载到GPU上。当动画在主线程(由GPU渲染的本机层)上运行时,用户可以自由地与应用交互,而不会出现口吃,悬挂,抖动或抖动。其他这里有一个useNativeDriver可用的快速参考:功能iOS版Android的style,value,propertys√√decay √timing√√spring √add√√multiply√√modulo√ diffClamp√√interpoloate√√event √division√√transform√√ ...

April 9, 2019 · 1 min · jiezi

Qt在不同平台上的安装

Qt在不同平台上的安装来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:9minQt为移动和嵌入式设备提供了不同的外观,用户期望不同的演示风格。这是在框架内控制的,因此开发人员可以专注于开发单个应用程序。Qt框架在两个独立的发行版中发布,一个是商业版,一个是开源版(称为双重许可版)。通过这种方式,他们可以免费支持开源兼容的应用程序,同时为封闭源商业项目提供不受限制的使用。在2000年之前(2.2版本发布),免费分发的源代码已经获得了各种许可证,一些团体认为这些许可证与常见的开源计划不兼容。对于2.2版本,它被改为GPL许可,这解决了对该集团对真正的开源自由的承诺的任何担忧。2007年,Qt 4.5发布,他们将LGPL作为选择,为喜欢更宽松许可的开发人员提供选择。开始使用therecipe / qt为了开始我们对Qt的探索和对Go的绑定,我们将构建一个简单的hello world 应用程序。为了能够这样做,我们首先需要安装therecipe / qt,这取决于我们必须首先设置的各种先决条件。与Go-GTK一样,我们将依赖本机库,这需要我们设置CGo功能并安装适合当前平台的Qt库。准备CGoQt Go绑定需要CGo的存在才能使用本机库。在完整的开发系统上,可能已经建立了这个系统。安装QtQt网站提供各种安装方法,包括任何拥有Qt帐户(可以免费注册)的人都可以使用的定制在线安装程序。通常,Qt安装附带Qt Creator(项目IDE),GUI设计器,其他工具和示例。访问上一个站点将自动检测您的系统并建议最合适的下载(这通常是最佳选择)。请注意,Qt安装可能非常大。如果硬盘驱动器上没有至少40 GB的空间,则需要在安装前留出一点空间。一些操作系统提供Qt库和工具作为其包管理器的一部分,它通常提供更轻量级的安装,它将自动保持最新。在多个平台上安装Qt苹果系统在Apple macOS上,安装的最佳方法是使用Qt下载站点上提供的安装程序。下载macOS安装程序。下载后,打开包并在里面运行程序; 这将安装选定的编译器,工具和支持应用程序。如果在安装过程中遇到任何错误,第一步是检查Xcode安装是否完整且是最新的。视窗在Windows上安装比我们看到的其他一些工具包更简单,因为Qt安装程序有一个mingw捆绑包来设置大多数编译要求(尽管仍然建议为绑定阶段设置自己的编译器)下一个。要安装它,请转到前面列出的下载页面并访问Windows安装程序。运行下载的可执行文件,然后按照屏幕上的说明进 建议安装到默认位置。完成后,您就可以设置绑定了。Linux使用Qt网站上的在线安装程序是最简单的方法,虽然可以通过系统的包管理器进行安装(如果你想尝试包管理器方法,那么首先阅读Qt文档)。在大多数平台上,Qt下载网站将正确检测平台并提供简单的运行安装程序。下载文件后,您应该使其可执行,然后运行它:这将像在macOS上一样启动安装程序,从这里,按照屏幕上的说明操作并完成安装。许可证/ Qt帐户当涉及到登录屏幕时,如果您有,请输入您的Qt帐户详细信息。如果您有资格获得他们的开源许可证(GPL或LGPL),您可以跳过此步骤,确保电子邮件和密码字段为空。安装qt(绑定)要使用qt(Go Qt绑定),我们需要下载项目及其依赖项,然后运行安装脚本来配置和编译库。如果使用Windows,建议使用MSYS2终端。如果您将Qt下载安装到默认位置以外的任何位置,请确保将QT_DIR环境变量设置为您选择的位置。首先,应该使用go工具,运行go get和安装库及其依赖项go get。下载完成后,我们需要运行qtsetupqt项目中包含的工具; 所以,在cmd/qtsetup文件夹中,执行go run main.go。使用Linux终端:此过程完成后,绑定应该可以使用了。如果您遇到错误,那可能是因为Qt工具未正确安装或位置已自定义且您忘记设置QT_DIR环境变量。建立要使用Go构建我们的第一个qt应用程序,让我们创建另一个Hello World 应用程序。与前面的示例一样,我们将在单个应用程序窗口中使用简单的垂直框布局。以下代码应足以加载您的第一个应用程序:package mainimport (“os"“github.com/therecipe/qt/widgets”)func main() {app := widgets.NewQApplication(len(os.Args), os.Args)window := widgets.NewQMainWindow(nil, 0)window.SetWindowTitle(“Hello World”)widget := widgets.NewQWidget(window, 0)widget.SetLayout(widgets.NewQVBoxLayout())window.SetCentralWidget(widget)label := widgets.NewQLabel2(“Hello World!”, window, 0)widget.Layout().AddWidget(label)button := widgets.NewQPushButton2(“Quit”, window)button.ConnectClicked(func(bool) {app.QuitDefault()})widget.Layout().AddWidget(button)window.Show()widgets.QApplication_Exec()}让我们从这段代码片段中注意一些细节。每个窗口小部件构造函数都采用(通常)两个参数,每个参数都是父窗口小部件和flags参数。传入的其他类型通常会在这些值之前添加,并在函数名称中包含附加参数的注释。例如, widgets.NewQLabel2(title, parent, flags)相当于widgets.NewQLabel(parent, flags).SetTitle(title)。此外,您将看到布局应用于新的widgets.QWidget直通SetLayout(layout),并通过设置为窗口内容window.SetCentralWidget(widget)。要加载显示并运行应用程序,我们调用window.Show()然后widgets.QApplication_Exec()。此文件以通常的方式构建 go build hello.go:由于Qt框架的大小,构建的文件非常大。在针对特定分发进行包装时,这将显着降低。运行构建阶段的输出是一个二进制文件,可以在命令行上或通过双击文件管理器在当前计算机上执行。另外,您可以直接执行它 - 无论go run hello.go哪种方式,您应该看到一个简单的窗口,如下所示:在此阶段,二进制文件可以在具有安装Qt的相同体系结构的计算机上执行。对象模型和事件处理Qt框架是使用C++语言编写的 ,并且以前用C++编码的人很熟悉它的大部分架构。值得注意的是,Go不是一种完整的面向对象语言,因此不能直接匹配这些功能。特别是,我们应该看一下继承,因为它对Qt对象模型很重要。继承Qt API是一个完全面向对象的模型,它大量使用了继承模型。虽然Go并不真正支持传统方式的面向对象继承,但它的组合方法非常强大,并且在其位置上运行良好。结果意味着您可能不会注意到差异!内存管理正如您在前面的示例中已经注意到的,每个窗口小部件都希望将父窗口传递给构造函数。这使得Qt框架能够在移除窗口小部件树时处理整理和释放内存。QObject(这是所有Qt API的基础对象)跟踪其子对象,因此,在删除时,也可以删除其子对象。这使得复杂窗口小部件层次结构的创建和删除更容易正确处理。要使用此功能,您应该始终记住将父对象传递给窗口小部件的构造函数(以函数开头的Go函数New…),尽管传递nil可能看起来像是在工作。信号和插槽Qt类似于GTK +,这是一个事件驱动的框架,广泛使用信号来处理事件管理和数据通信。在Qt中,这个概念分为信号和插槽; 信号是事件发生时产生的信号,信号是接收信号的信号。设置插槽以接收信号的动作称为连接,这导致在调用其连接信号时调用插槽功能。在Qt中,这些是类型化事件,意味着每个信号都有一个与之关联的类型参数列表。定义信号时,此类型已设置,并且任何希望连接到信号的插槽都需要具有相同的类型。s.ConnectMySignal( func(msg string) { log.Println(“Signalled message”, msg) })信号和插槽是Qt Designer生成的高级用户界面,是处理多线程应用程序的推荐方法。信号可以从后台线程触发,并且用户接口代码可以将该信号连接到其自己的插槽,实质上是监听信号。当信号触发时,任何相关数据(信号参数)将从一个线程传递到另一个线程,因此可以在GUI更新中安全使用。由于Qt是对Qt API的轻量级绑定,因此特定于Go的文档很少,但您可以在Qt的博客文章中找到有关Qt设计和官方文档中提供的所有类的更多信息。 ...

April 8, 2019 · 1 min · jiezi

Brett Lantz在R中使用C5.0算法实现决策树

Brett Lantz在R中使用C5.0算法实现决策树来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:9min决策树学习者是强大的分类器,它利用树结构来模拟特征和潜在结果之间的关系。这种结构之所以得名,是因为它反映了文字树在宽阔的树干上开始的方式,并且当它向上延伸时分裂成更窄的树枝。以同样的方式,决策树分类器使用分支决策的结构,其将示例引导到最终预测的类值。决策树有很多实现,但最著名的是C5.0算法。该算法由计算机科学家J. Ross Quinlan开发,作为其先前算法C4.5的改进版本(C4.5本身是对其迭代二分法3(ID3)算法的改进)。虽然Quinlan向商业客户销售C5.0,但该算法的单线程版本的源代码已公开,因此已被纳入诸如R等程序中。C5.0决策树算法C5.0算法已经成为生成决策树的行业标准,因为它可以直接开箱即用地解决大多数类型的问题。与其他高级机器学习模型相比 ,C5.0构建的决策树通常表现得差不多但更容易理解和部署。此外,如下表所示,算法的弱点相对较小,可以在很大程度上避免。优势一种通用分类器,可以很好地解决许多类型的问题。高度自动化的学习过程,可以处理数字或名义特征,以及缺少数据。不包括不重要的功能。可以在小型和大型数据集上使用。在没有数学背景的情况下可以解释的模型中的结果(对于相对较小的树)。比其他复杂模型更有效。弱点决策树模型通常偏向于具有大量级别的特征的分裂。很容易过度装配或不适合模型。由于依赖于轴并行分割,可能无法对某些关系建模。训练数据的微小变化可能导致决策逻辑发生很大变化。大树很难解释,他们做出的决定似乎违反直觉。为了简单起见,我们早期的决策树示例忽略了机器如何采用分而治之策略所涉及的数学问题。让我们更详细地探讨这一点,以研究这种启发式方法在实践中如何运作。选择最佳分割决策树将面临的第一个挑战是确定要拆分的特征。在前面的示例中,我们寻找一种分割数据的方法,使得生成的分区包含主要包含单个类的示例。示例子集仅包含单个类的程度称为纯度,而仅由单个类组成的任何子集称为纯。可以使用各种纯度测量来识别最佳决策树分裂候选者。C5.0使用熵,这是一种借鉴信息理论的概念,用于量化一组类值中的随机性或无序性。具有高熵的集合非常多样化,并且提供关于可能也属于集合的其他项目的很少信息,因为没有明显的共性。决策树希望找到减少熵的分裂,最终增加组内的同质性。通常,熵以比特来度量。如果只有两个可能的类,则熵值的范围可以从0到1.对于n个类,熵范围从0到log 2 (n)。在每种情况下,最小值表示样本是完全同质的,而最大值表示数据尽可能多样化,并且没有组具有甚至小的多个。在数学概念中,熵被指定为:在该公式中,对于给定的数据段(S),术语c指的是类级别的数量,并且p i 指的是落入级别级别i的值的比例。例如,假设我们有两个类的数据分区:红色(60%)和白色(40%)。我们可以将熵计算为:> -0.60 * log2(0.60) - 0.40 * log2(0.40)[1] 0.9709506我们可以想象所有可能的两级安排的熵。如果我们知道一个类中的例子的比例是x,那么另一个类中的比例是(1-x)。使用curve()函数,我们可以绘制x的所有可能值的熵:> curve(-x * log2(x) - (1 - x) * log2(1 - x), col = “red”, xlab = “x”, ylab = “Entropy”, lwd = 4)如下图:如在x = 0.50处的熵峰值所示,50-50分裂导致最大熵。随着一个类越来越主导另一个类,熵减少到零。为了使用熵来确定要分割的最佳特征,该算法计算由于对每个可能特征的分割而导致的同质性变化,该度量被称为信息增益。特征F的信息增益被计算为分割(S 1)之前的片段中的熵与分割(S 2)产生的分区之间的差异:一个复杂的问题是,在拆分之后,数据被分成多个分区。因此,计算熵(S 2 )的函数需要考虑所有分区的总熵。它通过根据落入该分区的所有记录的比例对每个分区的熵进行加权来实现此目的。这可以在公式中说明如下:简单来说,由分割产生的总熵是n个分区中的每一个的熵的总和,其由落入分区(w i)中的示例的比例加权。信息增益越高,在对该特征进行拆分后创建同类组的功能就越好。如果信息增益为零,则不会减少用于分割此特征的熵。另一方面,最大信息增益等于分割之前的熵。这意味着拆分后的熵为零,这意味着拆分产生完全同质的组。以前的公式假设名义特征,但决策树也使用信息增益来分割数字特征。为此,通常的做法是测试将值划分为大于或小于阈值的组的各种拆分。这会将数字特征缩减为两级分类功能,以便像往常一样计算信息增益。为分割选择产生最大信息增益的数字切割点。注意:尽管它被C5.0使用,但信息增益并不是可用于构建决策树的唯一分裂标准。其他常用标准是基尼指数,卡方统计量和增益比。修剪决策树如前所述,决策树可以继续无限增长,选择拆分功能并划分为更小和更小的分区,直到每个示例完全分类或算法耗尽要分离的功能。但是,如果树长得过大,那么它做出的许多决定将过于具体,模型将过度拟合到训练数据中。修剪决策树的过程涉及减小其大小,以便更好地概括为看不见的数据。该问题的一个解决方案是在树达到一定数量的决策时或当决策节点仅包含少量示例时阻止树增长。这称为提前停止或预先确定决策树。由于树避免做不必要的工作,这是一个吸引人的策略。然而,这种方法的一个缺点是,无法知道树是否会错过细微但重要的模式,如果它变得更大,它将会学到它。另一种称为后修剪的方法涉及种植有意过大的树并修剪叶节点以将树的大小减小到更合适的水平。这通常是比预执行更有效的方法,因为在不首先增加决策树的情况下确定决策树的最佳深度是相当困难的。稍后修剪树允许算法确定发现了所有重要的数据结构。C5.0算法的一个好处是,它是关于修剪的看法 - 它使用相当合理的默认值自动处理许多决策。它的总体策略是对树进行后修剪。它首先会生成一个超级训练数据的大树。之后,删除对分类错误影响很小的节点和分支。在某些情况下,整个分支在树上向上移动或由更简单的决策取代。这些移植分支的过程分别称为子树提升和子树替换。在过度拟合和欠拟合之间取得适当的平衡是一件艺术,但如果模型准确性至关重要,那么可能需要花一些时间使用各种修剪选项来查看它是否能提高测试数据集的性能。总而言之,决策树由于其高准确性和用简单语言制定统计模型的能力而被广泛使用。在这里,我们研究了一种非常流行且易于配置的决策树算法C5.0。与其他决策树实现相比,C5.0算法的主要优势在于可以非常轻松地调整训练选项。

April 8, 2019 · 1 min · jiezi

使用自动编码器检测信用卡欺诈

使用自动编码器检测信用卡欺诈来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时间:11min自动编码器是重要的生成模型类型之一,具有一些有趣的特性,可以用于检测信用卡欺诈等应用。在本文中,我们将使用Autoencoders来检测信用卡欺诈。我们将使用一个新的数据集,其中包含具有匿名功能的实际信用卡交易记录。数据集不适用于很多特征工程。我们将不得不依靠端到端的学习方法来构建一个好的欺诈检测器。从数据集加载数据像往常一样,我们首先加载数据。时间特征显示了交易的绝对时间,这使得在这里处理起来有点困难。所以我们将放弃它。df = pd.read_csv(’../input/creditcard.csv’)df = df.drop(‘Time’,axis=1)我们将事务的X数据与事务的分类分开,并提取作为pandas数据帧基础的numpy数组。X = df.drop(‘Class’,axis=1).valuesy = df[‘Class’].values功能缩放现在我们需要扩展功能。特征缩放使我们的模型更容易学习数据的良好表示。对于特征缩放,我们将所有特征缩放为介于0和1之间。这可确保数据集中没有非常高或非常低的值。但要注意,这种方法容易受到影响结果的异常值的影响。对于每列,我们首先减去最小值,以使新的最小值变为零。然后我们除以最大值,使新的最大值变为1。通过指定axis = 0,我们执行缩放列。X -= X.min(axis=0)X /= X.max(axis=0)最后,我们分割了我们的数据:from sklearn.model_selection import train_test_splitX_train, X_test, y_train,y_test = train_test_split(X,y,test_size=0.1)我们的编码器输入现在有29个尺寸,我们压缩到12个尺寸,然后再恢复原始的29维输出。from keras.models import Modelfrom keras.layers import Input, Dense您会注意到我们最终使用的是sigmoid激活函数。这是唯一可能的,因为我们将数据缩放为0到1之间的值。我们还使用编码层的tanh激活。这只是一种在实验中运行良好的样式选择,并确保编码值在-1和1之间。您可以根据需要使用不同的激活功能。如果您正在处理图像或更深层次的网络,则重新激活通常是一个不错的选择。如果您正在使用比我们在这里更浅的网络,那么tanh激活通常很有效。data_in = Input(shape=(29,))encoded = Dense(12,activation=‘tanh’)(data_in)decoded = Dense(29,activation=‘sigmoid’)(encoded)autoencoder = Model(data_in,decoded)我们使用均方误差损失。这首先是一个不寻常的选择,使用sigmoid激活和均方误差丢失,但它是有道理的。大多数人认为乙状结肠激活必须与交叉熵损失一起使用。但是交叉熵损失会使值为零或一,并且在这种情况下适用于分类任务。但在我们的信用卡示例中,大多数值约为0.5。均值误差在处理目标不是二进制的值时更好,但在频谱上更好。autoencoder.compile(optimizer=‘adam’,loss=‘mean_squared_error’)训练后,自动编码器收敛到低损耗。autoencoder.fit(X_train, X_train, epochs = 20, batch_size=128,validation_data=(X_test,X_test))重建损失很低,但我们怎么知道我们的自动编码器是否运行良好?再次,检查。人类非常善于视觉判断事物,但不善于判断抽象数字。我们将首先进行一些预测,其中我们通过自动编码器运行测试集的子集。pred = autoencoder.predict(X_test[0:10])然后我们可以绘制单个样本。下面的代码生成一个重叠的条形图,将原始交易数据与重建的交易数据进行比较。import matplotlib.pyplot as pltimport numpy as npwidth = 0.8prediction = pred[9]true_value = X_test[9]indices = np.arange(len(prediction))fig = plt.figure(figsize=(10,7))plt.bar(indices, prediction, width=width, color=‘b’, label=‘Predicted Value’)plt.bar([i+0.25width for i in indices], true_value, width=0.5width, color=‘r’, alpha=0.5, label=‘True Value’)plt.xticks(indices+width/2., [‘V{}’.format(i) for i in range(len(prediction))] )plt.legend()plt.show()用t-SNE可视化潜在空间我们现在有一个神经网络,它接受信用卡交易并输出看起来或多或少相同的信用卡交易。但这当然不是我们构建自动编码器的原因。自动编码器的主要优点是我们现在可以将事务编码为较低维度的表示,该表示捕获事务的主要元素。要创建编码器模型,我们所要做的就是定义一个新的Keras模型,它从输入映射到编码状态:encoder = Model(data_in,encoded)请注意,您无需再次训练此模型。这些层保留了我们之前训练过的自动编码器的权重。为了编码我们的数据,我们现在使用编码器模型:enc = encoder.predict(X_test)但是,我们如何知道这些编码是否包含有关欺诈的任何有意义的信息?再一次,视觉表现是关键。虽然我们的编码尺寸低于输入数据,但它们仍然具有十二个维度。人类不可能考虑12维空间,因此我们需要在较低维度的空间中绘制我们的编码,同时仍然保留我们关心的特征。在我们的例子中,我们关心的特征是接近度。我们希望在二维图中,在12维空间中彼此接近的点彼此接近。更确切地说,我们关心邻域,我们希望在高维空间中彼此最接近的点在低维空间中也彼此最接近。保留邻居是相关的,因为我们想要找到欺诈集群。如果我们发现欺诈性交易在我们的高维编码中形成一个集群,我们可以使用一个简单的检查来判断一个新的交易是否属于欺诈集群,以便将交易标记为欺诈。将高维数据投影到低维图中同时保留邻域的流行方法称为t分布随机邻域嵌入或t-SNE。简而言之,t-SNE旨在忠实地表示在所有点的随机样本中两个点是邻居的概率。也就是说,它试图找到数据的低维表示,其中随机样本中的点具有与高维数据中相同的最接近邻居的概率。t-SNE算法遵循以下步骤:计算所有点之间的高斯相似度。这是通过计算点之间的欧几里德(空间)距离然后计算该距离处的高斯曲线的值来完成的,参见图形。来自该点的所有点的高斯相似度可以计算为:’ sigma ‘是高斯分布的方差?我们将在稍后讨论如何确定这种差异。注意,由于点i和j之间的相似性通过所有其他点之间的距离之和(表示为k)来缩放,因此i,j,pi|j之间的相似性可以与j和i之间的相似性不同,pj|i 。因此,我们平均两个相似点以获得我们继续工作的最终相似性,其中n是数据点的数量。随机地将数据点定位在较低维空间中。计算较低维空间中所有点之间的t-相似度。就像训练神经网络一样,我们将通过遵循损失函数的梯度来优化较低维空间中的数据点的位置。在这种情况下,损失函数是较高和较低维空间中相似性之间的Kullback-Leibler(KL)差异。我们将在变分自动编码器部分详细介绍KL分歧。现在,只需将其视为衡量两种分布之间差异的方法。损失函数相对于 较低维空间中的数据点i的位置yi的导数是:使用梯度下降调整较低维空间中的数据点。高维数据中靠近的移动点靠近在一起,并且移动点彼此远离更远。您会将此识别为具有动量的梯度下降形式,因为先前的渐变已合并到位置更新中。使用的t分布总是具有一个自由度。一个自由度的选择导致更简单的公式以及一些不错的数值属性,从而导致更快的计算和更有用的图表。具有困惑超参数的用户可以影响高斯分布的标准偏差。困惑可以解释为我们期望得到的邻居的数量。低茫然值强调局部邻近,而大茫然值强调全局茫然值。在数学上,困惑可以计算为:其中Pi是数据集中所有数据点位置的概率分布,H(Pi)是此分布的Shannon熵,计算公式如下:虽然该公式的细节与使用t-SNE不是非常相关,但重要的是要知道t-SNE执行对标准偏差’ sigma ‘的值的搜索,以便它找到其上的熵的全局分布Pi。我们的数据是我们所希望的困惑。换句话说,您需要手动指定困惑,但这种困惑对数据集的意义也取决于数据集。t-SNE的发明者Van Maarten和Hinton报告说,该算法对于5到50之间的困惑选择相对稳健。大多数库中的默认值是30,这对于大多数数据集来说是一个很好的值。如果你发现你的可视化效果不理想,那么调整困惑度值可能是你想要做的第一件事。对于所涉及的所有数学,使用t-SNE非常简单。scikit-learn有一个方便的t-SNE 实现,我们可以像scikit中的任何算法一样使用它。我们首先导入TSNE类。然后我们创建一个新的TSNE实例。我们定义我们想要训练5000个时期,使用30的默认困惑和200的默认学习率。我们还指定我们希望在训练过程中输出。然后我们只需调用fit_transform,它将我们的12维编码转换为二维投影。from sklearn.manifold import TSNEtsne = TSNE(verbose=1,n_iter=5000)res = tsne.fit_transform(enc)作为警告,t-SNE非常慢,因为它需要计算所有点之间的距离。默认情况下,sklearn使用称为Barnes Hut近似的更快版本的t-SNE,它不是那么精确但已经快得多。有一个更快的python实现t-SNE,可以用来代替sklearn的实现。然而,它没有得到很好的记录,并且具有较少的功能。我们可以将t-SNE结果绘制为散点图。例如,我们将通过颜色区分欺诈与非欺诈,欺诈以红色绘制,非欺诈以蓝色绘制。由于t-SNE的实际值无关紧要,我们将隐藏轴。fig = plt.figure(figsize=(10,7))scatter =plt.scatter(res[:,0],res[:,1],c=y_test, cmap=‘coolwarm’, s=0.6)scatter.axes.get_xaxis().set_visible(False)scatter.axes.get_yaxis().set_visible(False)为了便于定位,包含大多数欺诈的群集标有圆圈。您可以看到欺诈与其他交易完全分开。显然,我们的自动编码器已经找到了一种方法,可以在不给出标签的情况下将欺诈与真实交易区分开来。这是一种无监督学习的形式。事实上,普通自动编码器执行PCA的近似,这对于无监督学习很有用。在图表中,您可以看到一些明显与其他交易分开但不是欺诈的集群。使用自动编码器和无监督学习,可以以我们之前没有考虑过的方式分离和分组我们的数据。 ...

April 4, 2019 · 1 min · jiezi

【腾讯分享】游戏图像异常检测AI实践

AI技术在图像检测和识别上虽然已经取得了很多突破,但是在游戏图像异常的AI检测中,由于受到非真实场景、缺乏大量学习样本等多样化因素的制约,使得游戏图像异常的AI检测面临着巨大难度。本期内容,腾讯Turing Lab副总监张力柯将分享游戏图像异常AI检测的实践经验。问题简述AI技术在图像上有很多的突破,但是对于游戏图像的异常检测依然存在很多难点。因为游戏不是真实的场景,它不像无人车或者人脸识别,有大量真实的场景和数据集,游戏图像异常检测缺乏大量可供训练的数据集。其次游戏图像异常的原因和现象都是多样化的。游戏图像产生异常,可能是硬件、游戏引擎、美术资源、业务代码等多种原因导致的;游戏图像异常的表现也是多种多样,如黑屏/白屏、色块色条、贴图错误、开发遗留信息、像素错误等。早期尝试及难点分析腾讯从2016年就开始着手花屏等游戏图像异常问题的研究。最开始采用传统的图像分析方法,比如,色块、几何特征等。后来尝试过简单的机器学习,但效果不是特别好。效果不好主要有以下三个难点问题:算法方案腾讯从2017年开始尝试使用深度学习方案,用CNN和GMM两种方法,取得了一定效果。游戏场景是多变的,因此需要对每个场景建立模型,这个是比较困难的。我们首先用GMM生成异常图像,这个听起来高大上,但效果并不好。因为很多游戏异常画面是有先验知识的,不至于用深度学习来分辨。第二个是场景分类,在2018年年初我们采用了手工分类的方法,从粗粒度分类到精细分类,最后取得了较好的效果。以上为我们的算法整体框架。用户上传视频后使用算法进行画面分类,把画面分成登录画面、战斗画面等,然后生成异常样本。因为我们要求上传的游戏视频是正常的,不包含任何异常画面。我们用算法来生成异常画面,等负样本和正样本数据比例达到3:7或者4:6,才能进行正常的深度学习。自动场景划分怎么实现?首先对上传的视频进行帧提取,然后进行图像特征的提取。我们用的方法是提取局部特征,再进行图像全局描述。深度学习需要有足够的训练集去标注,然后需要长时间的训练。如果对每一个游戏都要做这个工作,这个工作量就太大了。通过这个方法,可以达到较好的效果,我们通过聚类,将图片分成不同的局部,自动切分成不同的场景,尽量达到足够的效果。这是工程实践与服务实践、学术方法与工程思路很好的平衡。大家可能会想深度学习可不可以避免人工设计,但是有多少AI就有多少人工,深度学习的负面作用就是需要标记很多东西,需要做好取舍。划分了场景以后生成异常图片,常见的就是图片错位、色块、雪花等。异常样本归纳起来就比较好做了,因为生成的图片叠加,色块、大小、颜色都可以自己控制。然后开始对图片进行二分,用CNN的模型。CNN的模型比较常见,没有什么太多可以说的。我们在输入的时候是把图片做成80×45这样的小图片,是为了增加处理速度。在腾讯几个主流游戏上,AI异常图片识别的准确率达可以到99%,这是实验数据,在正式的实际业务应用中,我们会发现效果没有这么好。主要是因为游戏版本变化很大,经常存在画面的调整,而使用者无法每天都训练新的模型。、工程部署工程部署采用了比较常见的方式,下面是我们工程部署的整体框架。我们分成线下训练、线上模拟两部分。它通过消息队列,传到不同的工作组。这是一整套的算法方案,从抽取帧,到聚类,再到CNN模型的训练。工程的应用和算法研究的不同。算法研究主要讲究数据并行和模型并行,很少提任务并行。我们采用的思路是任务并行。因为我们的目的是并发处理不同的训练任务,不在于每个任务多快,而在于可以一起处理。我们的思路跟机器学习加速的思路是不一样的。在部署的时候,我们开始使用用模型直接调用,发现存在高并发的问题。后来我们采用TensorFlow分布式部署,将前面的模型转换到TensorFlow,发现效果不错。但是TensorFlow会对服务器的内存造成很大的压力,我们对场景建立模型,准确度越高,场景就越多,系统内存压力就越大。在工程部署时有哪些那点问题呢?第一个是模型管理,因为腾讯的游戏数量繁多,游戏细分场景也很多,只靠TensorFlowServing是不够的,还需要自己封装。其次就是模型内存占用的问题,因为单一模型占用内存就可以达到上百M,游戏所有识别模型的数量可以达到数十甚至上百个,内存压力会很大。第三就是模型更新的问题,是自动更新还是重启服务,自己开发的话会有问题。TensorFlow在最新的版本里提供了模型更新的功能,这个问题也解决了。TensorFlowServing如何部署?Stateless service可以作为集群部署,然后使用Haproxy进行识别请求分发。期初,我们考虑过一个服务器服务多个游戏来节约内存,但是这样容易把逻辑搞混,而且我们无法知道游戏后面的模型会不会增加。因为有的游戏随着游戏的不断运行,它可能会增加不同的关卡、玩法和不同的场景,它的模型会慢慢的变大。这时再动态修改配置就会很麻烦。后来我们进行了简化,每个TensorFlowServing就读一个游戏的模型,这些模型可能是几十个、上百个。总体思路是一个服务器对应一个游戏。这是部署之后的负载能力,我们平时通常保持100到200 TF Serving Pod ,平时测试也是并发100到200部手机。瓶颈不在于服务器的问题,在于带宽,因为我们是做图片识别,传进来的是100个不同分辨率的手机,有时候传输的是原图,对带宽的要求是比较高的。我们使用的是Kubernetes based,它可以很方便的将我们的负载能力扩展到上千。总结前面分享了我们目前的一些实践方案和成就,主要讲的是异常画面如何通过AI去检测识别。后面我们想实现的功能是从画面异常到功能异常的AI检测。比如,你在游戏里面开枪发现子弹可以穿墙击中敌人,或者说你放了个大招,但是特效没有出来,如何去判断这个功能的异常?在游戏开发的过程中,很容易发现这些问题。怎么识别这些问题,需要跟游戏的特性和游戏的策划更深入的了解。此外,对于未知画面的识别,比如弹窗或者是外部的运营画面弹出,这也是我们要探索的方向。现在全球都没有一个完整的游戏画面用来做机器学习的数据集。以后我们累积更多数据集时,我们可以把这些数据集开源出来,跟大家一起进行研究,做到游戏方面虚拟世界的Engine,做到游戏世界广泛的图象识别。

April 3, 2019 · 1 min · jiezi

CSS3开发文档

站点:前端开发文档原文:CSS选择器原文:CSS继承属性原文:CSS3核心模块原文:CSS盒子模型原文:CSS背景图像原文:CSS清除浮动原文:CSS定位CSS选择器并集:对选择器进行分组,被分组的选择器可以分享相同的声明。用逗号将需要分组的选择器开分。h1,h2,h3,h4,h5,h6{}交集:两种属性同属一个元素p.name{}、p#id{}、.name1.name2{}后代(派生):根据元素在位置上的关系定义样式,使用空格隔开,后代选择器尽量不要超过3个,不必把每个层级都列出,只需要写关键点即可li strong {}子代:只能选择作为某元素的子元素,只选择子代,往后孙子一代不选择h1 > strong {}兄弟和相邻兄弟:选择紧接在另一元素后的,并且二者有相同父元素h1 + p {}属性:对带有指定属性的HTML元素设置样式,权重为10属性选择器:为带有title属性的所有元素设置样式,[title] {}属性和值选择器:为title=“name"的所有元素设置样式,[title=name] {}设置表单的样式:input[type=“text”] {}伪类::active:被激活的元素:focus:有键盘输入焦点的元素:hover:鼠标悬停:link:未被访问的链接:visited:已被访问的链接:first-child:元素的第一个子元素:lang:带有指定lang属性的元素权重:div(1)class/类选择器(10)id(100)结构选择器(新增伪类(面试题)):not:排除:nth-child(n):第几个元素 从1开始设置:nth-child(2n):偶数元素 从0开始设置:nth-child(2n+1):奇数元素:nth-of-type(n):某个元素下同类型的第几个元素:nth-last-child:倒数第几个元素:first-child->:nth-child(1)::fisrt-of-type:第一个同级兄弟元素:last-of-type:最后一个同级兄弟元素:nth-of-type(n):第几个同级兄弟元素:last-child:最后一个子元素:only-child:仅有一个子元素:only-of-type:只有一个同类型的子元素:empty:空内容:checked:被选中 主要用在input表单元素属性选择器E[attr=val]:E[attr|=val]:只能等于val 或只能以val-开头E[attr*=val]:包含val字符串E[attr~=val]:属性值有多个,其中一个是valE[attr^=val]:以val开头E[attr$=val]:以val结尾目标伪类选择器:target():用来匹配URL指向的目标元素(存在URL指向该匹配元素时,样式效果才会生效)伪元素::first-line:匹配首行文本,只能用于块级元素:first-letter:匹配首字符:before/:after:DOM元素前后插入额外的内容遇到伪元素before/after就要加上content=‘‘display: block;:独占一行display: inline-block;:不独占一行CSS继承属性无继承性的属性display:规定元素应该生成的框的类型文本属性:vertical-align:垂直文本对齐text-decoration:添加文本装饰text-shadow:文本阴影效果white-space:空白符的处理unicode-bidi:设置文本的方向盒子模型的属性:width、heightmargin、margin-top/right/bottom/leftborder、border-top/right/bottom/leftborder-style、border-top/right/bottom/left-styleborder-width、border-top/right/bottom/left-widthborder-color、border-top/right/bottom/left-colorpadding、padding-top/right/bottom/left背景属性:backgroundbackground-colorbackground-imagebackground-repeatbackground-positionbackground-attachment定位属性:floatclearpositiontop/right/bottom/leftmin-width/min-height、max-width/max-heightoverflowclipz-index生成内容属性:contentcounter-resetcounter-increment轮廓样式属性:outline-styleoutline-widthcounter-coloroutline有继承性的属性字体系列属性font:组合字体font-family:字体系列font-weight:字体粗细font-size:字体尺寸font-style:字体风格font-variant:小写字母转换为大写,字体尺寸更小font-stretch:对当前font-family进行伸缩变形。所有主流浏览器不支持。font-size-adjust:为某个元素规定一个aspect值,保持首选字体的x-height文本系列属性text-indent:文本缩进text-align:文本水平对齐line-height:行高word-spacing:字间距letter-spacing:字符间距text-transform:控制文本大小写direction:文本书写方向color:文本颜色元素可见性:visibility表格布局属性caption-sideborder-collapseborder-spacingempty-cellstable-layout列表布局属性list-style-typelist-style-imagelist-style-positionlist-style生成内容属性:quotes光标属性:cursor页面样式属性pagepage-break-insidewindowsorphansCSS3核心模块过渡动画transition:过渡动画transition-property:过渡属性 all[attr]transition-duration:过渡时间transition-delay:延迟时间transition-timing-function:运行类型ease:(逐渐变慢)默认值linear:匀速ease-in:加速ease-out:减速cubic-bezier:贝塞尔曲线过渡动画效果思考步骤:找到过渡属性找到过渡属性起始值和结束值在合适的位置上增加transition属性2D变换transform:变形属性rotate():旋转函数deg:度数transform-origin:旋转的基点skew():倾斜函数skewX()skewY()scale():缩放函数 默认值是1scaleX()scaleY()translate():位移函数translateX()translateY()animation-声明关键帧关键帧——@keyframes类似于flash定义动画在每个阶段的样式,即帧动画关键帧的时间单位数字:0%、25%、100%等(设置某个时间段内任意时间点的样式)字符:from(0%)、to(100%):格式@keyframes:动画名称{动画状态}animation-调用动画必要属性animation-name:动画名称(关键帧名称)animation-duration:动画执行时间可选属性:animation-timing-functionlinear:匀速ease:缓冲ease-in:由慢到快ease-out:由快到慢ease-in-out:由慢到快再到慢ease-bezier(num,num,num,num):特定的贝塞尔曲线类型,4个数值需在[0,1]区间内animation-delay:动画延迟animation-iteration-count:重复次数animation-direction:动画运行的方向 normal|reverse|alternate|alternate-reverseanimation-play-state:动画状态 running|pausedanimation-fill-mode:动画结束后的状态 none|forwards|backwards|both3D变换transform-style: flat|preserve-3d:3D空间展示perspective:景深效果transform: persective(800px):直接作用在子元素上transform:新增函数translate3d(tx, ty, tz):translateX() translateY() translateZ()rotate3d(rx, ry, rz, a):rotateX() rotateY() rotateZ()scale3d(sx, sy, sz):sacleX() sacleY() sacleZ()圆角 border-radiusborder-radius:1-4个数字/1-4个数字水平半径/垂直半径四个数字方向分别是左上 右上 右下 左下没有/则水平半径和垂直半径一样border-radius: 10px/5px;border-radius: 60px 40px 30px 30px/30px 20px 10px 5px例子:圆 椭圆 半圆 扇形线性渐变 linear-gradientlinear-gradient:([<起点>||<角度>,]?<点>,<点>…)只能用在背景上颜色是沿着一条直线轴变化参数起点:开始渐变方向角度:开始渐变角度点:渐变点的颜色和位置重复线性渐变径向渐变 radial-gradientradial-gradient从“一点”向多个方向颜色渐变shape形状:ellipse、circle或设置水平半径,垂直半径size:渐变的大小,即渐变停止位置:closet-side:最左边farthest-side:最远边closet-corner:最近角farthest-corner:最远角(默认值)position:关键词|数值|百分比重复的径向渐变背景background-originpadding-box:从padding区域显示border-box:从border区域显示content-box:从content区域显示background-clippadding-box:从padding区域向外裁剪border- box:从border区域向外裁剪content-box:从content区域向外裁剪text:文本裁剪background-size100% 100%:百分比10px 10px:数值contain:按原始比例收缩,背景图显示完整,但不一定铺满整个容器cover:按原比例收缩,背景图可能显示不完整,但铺满整个容器background-attachment背景图片是滚动/固定 fixed(固定的) 默认是滚动的盒子阴影box-shadow:h v blur spread color inset;h:水平方向偏移v:垂直方向偏移blur:模糊半径spread:扩展半径color:颜色inset:内阴影,默认是外阴影文本阴影text-shadow:x y blur colorx轴偏移 y轴偏移 模糊度 颜色多层阴影制作文字立体效果,设置多种颜色,中间以逗号隔开文字添加边框text-stroke:2px blue通过设定1px的透明边框,可以让文字变得平滑颜色设成透明能够创建镂空字体滤镜-webkit-filter:normal;:正常-webkit-filter:grayscale(1);:灰度,取值范围0-1-webkit-filter:brightness(0);:亮度,取值范围0-1-webkit-filter:invert(1);:反色,取值范围0-1,0为原图,1为彻底反色-webkit-filter:sepia(0.5);:叠加褐色,取值范围0-1-webkit-filter:hue-rotate(30deg);:色相(按照色相环旋转,顺时针方向)(红-橙-黄-黄绿-绿-蓝绿-蓝-蓝紫-紫-紫红-红)此处为叠加黄色滤镜-webkit-filter:saturate(4);:饱和度,取值范围0-,0为无饱和度,1为原图,值越高,饱和度越大-webkit-filter:contrast(2);:对比度,取值范围0-,0为无对比度(灰色),1为原图,值越高对比度越大-webkit-filter:opacity(0.8);:透明度,取值范围0-1,0为全透明,1为原图遮罩mask-image:mask-position:mask-repeat:CSS盒子模型border边框三角形箭头:正方形的任意相邻两条边,然后旋转一定的角度,得到我们需要的任意方向的箭头border、border-width、border-style、border-color三角形:border的3个属性:border-width/border-style/border-color,宽度和高度都为0,三角形箭头方向设定颜色,其余方向颜色设为透明transparentmargin边距margin边距重叠: 取大值,不是两者相加之和。margin-top的传递:大盒嵌套小盒,小盒加margin-top值,传递到大盒,导致整体下移。解决margin的兼容性问题:float: left;overflow: hidden;padding-top: 0/1px;border-top: 1px solid transparent;CSS背景图像background背景主要属性:background-color:背景颜色,简写background不能继承,默认是transparentinherit 指定背景颜色,从父元素继承background-image:背景图片url:图片URL地址node:默认值 背景上未放置图片inherit:指定背景图片从父元素继承一个元素可以引入多张背景图片;指定要使用的一个或多个背景图片,默认情况下,background-image放置在元素的左上角,并重复垂直和水平方向属性不能继承background-repeat:背景重复默认重复background-image的垂直和水平方向repeat 默认repeat-x 只有水平位置重复repear-y 只有垂直位置重复no-repeat 不重复inherit 从父元素继承background-position:背景定位设置背景图片的起始位置x、y 水平位置,垂直位置。左上角是0。单位(px,关键字,百分数)关键字成对出现left right top bottom center,仅指定一个关键字,其他值将会是center只设定x轴方向,默认y轴为centerinherit 从父元素继承background-attachment:背景关联设置背景图片固定或随页面的其余部分滚动scroll 默认fixed 固定inherit 从父元素继承background-size:背景图像的尺寸大小<length> 长度值指定图像大小。不允许负值<percentage> 百分比指定图像大小。不允许负值auto 图像的真实大小cover 将背景图像等比例缩放到完全覆盖容器,有可能超出容器contain 等比例所放到宽/高与容器的宽/高相等,背景图像始终被包含在容器内background-origin:设置背景图像的参考原点(位置)padding-box:从padding区域(含padding)开始显示背景border-box:从border区域(含border)开始显示背景content-box:从content区域开始显示背景background-clip:设置对象的背景图像向外裁剪的区域padding-box:从padding区域(不含padding)开始向外裁剪背景border-box:从border区域(不含border)开始向外裁剪背景content-box:从content区域开始向外裁剪背景text:从前景内容的形状(比如文字)作为裁剪区向外裁剪,实现使用背景作为填充色之类的遮罩效果。雪碧图:background-position: x yCSS清除浮动overflow: hiddenoverflow溢出隐藏清除浮动解决margin-top的传递问题(面试题):单行文本出现省略号(4个必备条件,缺一不可)width 宽度(不写宽度,默认继承父元素宽度)overflow: hidden;(溢出隐藏)white-space: nowrap;text-overflow: ellipsis;文字隐藏的方式,以省略号的方式隐藏多行文本出现省略号(必备条件,主要应用在移动端)display: -webkit-box; 弹性盒模型-webkit-box-orient: vertical;规定元素的排列方式:垂直排列-webkit-line-clamp: 2;:文字的行数(自定义)overflow: hidden;溢出隐藏多个元素在一行显示的方法display: inline;display: inline-block;float: left/right;display: inline-block;元素的特点盒子横向排列verticle-align属性会影响inline-block元素,值可能会设为top需要设置每一列的宽度如果HTML源码中元素间有空格,列与列之间会产生空隙解决方法:如果元素添加了dispay: inline-block;,父元素增加一个属性font-size: 0;,同时在元素本身增加font-size属性进行覆盖display:inline-block;在IE6/7下不兼容的解决方法增加display: inline; zoom: 1;属性IE7下块元素兼容display: inline-block;写法?直接让块元素设置为内联对象(设置属性 display: inline;),然后触发块元素的layout(如:zoom: 1;等)。兼容各浏览器的代码如下:div {display: inline-block; *display: inline; *zoom: 1;}float浮动float元素的特点在一行显示设置属性值为left时,浮动元素依次从父级盒子的左侧向右排列自动具有块级元素的属性,不需要添加display: block;脱离文档流子元素不会继承浮动属性浮动元素下面的元素不能识别浮动元素的高度和位置,占据浮动元素的位置所有的元素都可以使用浮动属性文档流和脱离文档流文档流:元素排版布局过程中,元素自动从左往右,从上往下的流式排列。每个非浮动元素块级元素独占一行,浮动元素按规则浮在行的一端。当前行容量满则另起一行浮动。内联元素不会独占一行几乎所有元素(包括块级、内敛和列表元素)均可生成子行,用于摆放子元素标准文档流等级:分为两个等级,块级元素和行内元素脱离文档流:文档流内的正常元素识别不到这个元素(脱离文档流的元素相当于平行漂浮于文档流之上)float元素产生的影响父元素设置背景颜色background-color不起作用父元素设置内边距属性padding不会被撑开父元素设置边框属性border不会被撑开清除浮动float清除浮动的方法给浮动元素的父级元素添加固定的高度height(不推荐)给浮动元素的父级元素添加溢出隐藏属性overflow: hidden;;给最后一个浮动元素后面添加一个块级元素,这个块级元素带有clear: both;属性clear清除浮动元素对文档流内元素的影响(可以让文档流内的元素识别到浮动元素的高度)left清除float为left的影响right清除float为right的影响both清除float所有的影响inherit从父级元素上继承该属性值clearfix清除浮动(固定代码)利用伪元素:after清除浮动必备条件,缺一不可display: block;确保元素是一个块级元素clear: both;不允许左右两边有浮动对象content: ‘’;伪元素:brfore/:after自带的属性,如果不写,伪元素不起作用写全的样式属性;不是必备条件height: 0; 防止在低版本浏览器中默认height: 1px;的情况,用height: 0;去覆盖font-size: 0; 字体大小overflow: hidden; 溢出隐藏visibility: hidden; 让所有可见性的元素隐藏overflow: hidden;和visibility: hidden;有什么区别?(面试题):如何让一个元素消失?opacity: 0;[0-1] 透明度display: none; 隐藏widht/height/line-height + overflow:宽/高/行高 + 溢出隐藏visibility: hidden;让所有可见性的元素隐藏clear: both;的特点元素需要是块级元素元素不能带有浮动属性元素必须放在最后一个浮动元素的后面CSS定位相对定位-position: relative;没有脱离文档流参照物是元素本身位置当top和bottom同时有值的情况下,top值生效,支持负值当left和right同时有值的情况下,left值生效,支持负值任何元素都可以设置相对定位属性相对定位元素位移发生改变,但元素原来的位置还会被占用,其他元素还是正常识别这个元素原来的位置绝对定位-position: absolute;脱离文档流可以设置参照物,参照物必须是其父级元素(直系父级),如果没有直接父级会一直往上查找直到找到最外层的根元素为止;有宽度和高度的情况下,top和bottom同时有值,top生效;left和right同时有值,left生效。没有宽度和高度的情况下,top和bottom同时设置值的情况下,会将这个盒子拉大,上下值都起作用,左右同理。可以设置层级关系z-index属性,必须要和定位元素(绝对,相对,固定)同时使用,才会起作用。一个元素定位在另一个元素上或者两个元素叠加的情况,都可以使用定位(绝对定位)绝对定位一定要设置相对参照物固定定位-position: fixed;脱离文档流参照物是浏览器的可视窗口任何元素都可以设置固定定位可设置top/bottom/left/right四个方位可通过z-index改变层级z-index属性的特点默认是书写顺序在后的定位元素覆盖顺序在前的定位元素可以使用z-index属性修改定位元素的层级关系所有定位元素的z-index默认值都一样z-index值是数字没有单位,支持负数一般都是同级元素进行层级的比较当参照物是相对定位或绝对定位的时候,父级元素之间没有z-index值,子元素的z-index值进行比较 ...

March 20, 2019 · 1 min · jiezi

Nervos 双周报第 5 期:CKB 经济模型提案如约而至

3 月9 日凌晨 Nervos 联合创始人及研究员 Kevin Wang 在 GitHub 上提交了 CKB 经济模型提案《Crypto-Economics for the Nervos Common Knowledge Base》,期待很久的经济模型终于提案了!就在公众号发布这条消息的第一时间,社区伙伴 stwith 在 Nervos Talk 发起话题讨论《Nervos CKB 经济模型提案正式发布 来谈谈你的看法吧》,5 个小时后,一位名叫 Eraser 的伙伴发出了一篇解读文章:《 Nervos CKB经济体系真的很有趣 》。Nervos CKB 经济模型从提案到今天,我们的 talk 论坛和活动答疑群的讨论此起彼伏,我们听到了很多有意思想法。希望未来我们能够和大家一起去完善提案内容,与 Nervos 共同成长。Nervos CKB 经济模型提案之外,我们还有好多进展要告诉大家:Nervos 社区动态美国社区Nervos 架构师 Jan 参加了「MIT Bitcoin Club」Meetup,之后我们会将本场活动内容整理成文稿分享给大家。在纽约和波士顿举办的「Nervos Deep Dive」, Jan 和 Kevin 分别向大家讲解《CKB-The Layer 1 Blockchain》和《Crypto-Economics for the Nervos Common Knowledge Base》。张韧的论文被顶级安全会议 IEEE S&P 接收!这是安全顶会上第一篇来自中国大陆区块链团队的论文,来自 Nervos 研究员张韧发表的《Lay Down the Common Metrics: Evaluating Proof-of-Work Consensus Protocols’ Security》。具体论文内容及更多了解,可点击:https://talk.nervos.org/t/ner…韩国社区线上 AMA2 月 28 日晚 8 点,Nervos 首席宣传员 Daniel 在 Nervos 韩国社区进行了在线 AMA,韩国社区伙伴们竟然连续提出了 30 多个问题,包括 Nervos Network 的分层设计架构的特点和实现方式,Nervos 的项目目标,治理思路,对多种语言的兼容性和 DApp 的友好性,以及对生态建设所做的努力和未来规划等等。感谢韩国小伙伴的热情,期待后续更多更深入的交流。韩国社区小伙伴已整理出 AMA 内容:“레이어 아키텍처의 적합한 플랫폼” — AMA 하이라이트 │Daniel Lv, COO from NERVOS Foundation(널보스 파운데이션)社区受邀参加活动Nervos 社区运营 Ryan 在金色财经主办的「以太坊生态」沙龙活动上,针对以太坊状态问题和公链经济模型设计做了主题分享Nervos 社区运营 Henry& Ryan 出席一块链习主办的《区块链技术公开课 100 讲》线上课程,分别就《从以太坊状态问题看底层公链经济体系设计》和《找寻可以长久运转的加密经济模型之路》的话题做了分享2019 Dev Meetup No.12019 年的第一场 Dev Meetup 上,Nervos 社区运营 Henry & Ryan 就加密经济模型做了结构分析, AMA 环节参与者提出的问题都非常棒。我们已将内容收录整理,请查收:https://mp.weixin.qq.com/s/vc…Fork It 更新《一起来聊一聊 ETC 51% 攻击》,这一期已经发布很久,我们终于整理出文字稿供大家方便阅读,边讲故事边带大家了解 PoW 区块链的安全性。《张韧全面解析 MimbleWimble》,之前就提到过这是一期内容很硬核,这篇文章经过多次校对和讨论,终于定稿!Peter 老师的周四分享程序员中的专业区块链讲解员 Peter 老师每周四晚的千聊直播分享,最近一期内容是《比特币白皮书图解》的第三部分内容:深入 POW 共识机制的底层,聊聊工作量证明在共识投票中扮演的角色,以及 POW 共识抗攻击能力的数学推理过程。感兴趣的伙伴可以关注直播间「Crypto Camp」回听。Nervos CKB 开发动态 Nervos CKB 经济模型提案发布CKB v0.7.0 已冻结为了更好的文档支持,此版本将配置文件格式切换为 TOMLCKB 将统一使用blake2b作为哈希算法P2P 和 CFB 的集成已准备就绪工具链方面的进展实现追踪和 RPC 网络模式Blake2b 替换 SHA3JavaScript SDK 发布 v0.0.1-alpha.3更多更详细的更新,可以查看: Nervos CKB Development Update #6Nervos 的粉丝们近期好玩的推荐Nervos 周边计划正在进行中…….我们从李童小哥哥最新设计的 10 余款 T 恤中甄选出了 5 款 ,也欢迎大家来投票给你喜欢的设计款:https://talk.nervos.org/t/201…平时关注论文比较多的伙伴,推荐一篇科普贴《如何评价区块链论文》Nervos 活动预告3 月 14 日,「 Taipei Nervos CKB Dev Meetup」 ,Nervos 架构师 Jan 和 CKB-VM 开发者肖雪洁分别分享《CKB -The Layer 1 Blockchain》和《Re-design a New Blockchain VM from scratch CKB-VM》3 月 16 日,「Taipei Nervos Meetup」,Nervos 架构师 Jan、Neuron 钱包架构师 Ash 和 Nervos 首席宣传员 Daniel 的分享主题分别为:《CKB - The Layer 1 Blockchain 》、《下一代加密货币钱包》、《加密经济模型解构与未来方向》。感谢台北社区的全力支持,再推一篇台北小伙伴的文章:https://www.blocktempo.com/ne… ,如果你在台北请联系我们面基!3 月 16 日在旧金山, Nervos 白皮书解读活动将继续进行「White Paper Book Club - Blockchain project mapping」关注我们Nervos 官网: https://www.nervos.org Nervos 论坛: https://talk.nervos.org Community blogs: https://medium.com/nervosnetwork Twitter: https://twitter.com/nervosnetwork Reddit: https://www.reddit.com/r/NervosNetwork Telegram: http://t.me/nervosnetwork Github: https://github.com/nervosnetwork 这是 Nervos 双周报的第 5 期,感谢阅读!如有任何建议或者想法,欢迎讨论哦!原文来自 Nervos talk 论坛:https://talk.nervos.org/t/ner… ...

March 14, 2019 · 2 min · jiezi

七款酷炫的 Mac 屏保

Ankur Biswas 原作,授权 LeanCloud 翻译。分享我最喜欢的一些 MacBook 屏保,让电脑看起来美美哒~Padbury ClockWord ClockSimple ClockGrid ClockFliqloFractal ClockWord Clock如果喜欢这些屏保,可以和小伙伴分享!留言告诉我,哪个屏保是你的最爱?LeanCloud,领先的 BaaS 提供商,为移动开发提供强有力的后端支持。更多内容点击 www.leancloud.cn

March 13, 2019 · 1 min · jiezi

华为云DevCloud为虚拟仿真插上互联网的翅膀

华为云DevCloud为虚拟仿真插上互联网的翅膀两三年前,虚拟仿真或者说VR,火得一塌糊涂,火得不真实。又在无人察觉中,平静地落下帷幕,这个行业开始回归本质。原本专业性极强的领域,以游戏为突破口、以眼镜头盔为炫技点,吸引大众关注的同时,也限制了大众对这个行业的了解。一些虚拟仿真行业精英开始反思,并探寻出路,平行云CEO李岩就是其中一员。这名虚拟仿真行业老兵,从硕士到博士,一直从事虚拟仿真研发,投身创业之前,他曾是一名海军中校,为了登上更高山顶,他选择清零重新出发。 理想最终促使李岩跳出自己的舒适圈,汇聚了“虚拟仿真+多媒体+云计算”的复合型团队,于2016年11月成立了“平行云科技(北京)有限公司”(以下简称平行云),一举向“虚拟仿真互联网应用云服务”亮剑。 与华为云的结缘 享受高效安全企业云服务 基于不同客户的需求,平行云已形成服务模式、部署方式和产品形态多样化的轻量级云仿真/云VR解决方案,一套Windows系统的应用,无需修改即可实现跨平台和跨终端的访问。 “训课在线”是由平行云基于华为云产品打造的在线实践学习云平台,是随时随地开放的云上实训室,为客户提供虚拟仿真上云的PaaS和SaaS服务。“训课在线”可以将虚拟仿真实验室资源搬到“云上”,帮助用户实现跨平台跨终端的交互学习。另有适用场景更为广泛的轻量级云仿真平台云雀已正式发布,极大的拓展了虚拟仿真/VR的应用场景和想象空间。 作为国内较早使用GPU加速云从事研发工作的团队,平行云使用过AWS、阿里云等云资源提供商的服务,最后选择了华为云DevCloud,除了华为云稳定的服务更是因为华为云贴心,高效的企业服务。这对于平行云这样的创业团队显得尤为重要。 平行云互联网应用软件在研发过程中存在诸多痛点: 互联网产品需要快速迭代:原来采用瀑布开发模式产品要经历需求、设计、编码、测试等一系列过程才能最终整体上线。开发周期长,无法满足快速迭代的需求; 研发环境维护成本高:研发过程需要使用诸如项目管理、配置管理、缺陷追踪、代码仓库及自动化构建发布等众多的工具链,对于创业公司来说运维难度大,成本高; 多地区团队协作困难:系统构建在公司内网,团队成员异地协同及管理者出差异地访问、掌握进度都十分困难,多地专线成本过高。 华为云DevCloud为平行云提供了一站式DevOps的解决方案、稳定的服务和优质高效的技术团队,助力平行云解决研发痛点。 降低运维成本:华为云DevCloud的各种服务替代了之前的项目开发使用的工具链,运维成本节约70%; 提高开发效率:华为云DevCloud清晰的需求管理,准确的代码检查和自动化编译构建都大大的提高了项目的开发效率; 提高部署效率:华为云DevCloud简单的部署流程,强大的部署功能,支持Shell,ansible多种部署方式,多台服务器并行部署,使部署效率较之前的手动部署提高40%; 缩短交付周期:华为云DevCloud拥有计划配置的代码检查,编译构建和部署功能使开发人员不再需要手动管理这些流程,并且配有流水线功能,一键触发产品交付流程,使交付周期缩短45%。作为华为云仿真方向解决方案的合作伙伴,平行云与清华大学、北京航空航天大学、海军大连舰艇学院、大连海事大学、山东交通学院等多家院校、企事业单位达成合作。通过华为云的资源和平行云的解决方案、汇聚的虚拟仿真行业近百家内容开发和运营企业,共同构建虚拟仿真云生态!想了解更多DevCloud信息,欢迎访问华为云学院https://edu.huaweicloud.com/

March 1, 2019 · 1 min · jiezi

【技术性】Software engineering知识

持续更新。【to be filled】

February 18, 2019 · 1 min · jiezi

深耕品质,腾讯WeTest《2018中国移动游戏质量白皮书》正式发布

本文由云+社区发表作者:腾讯WeTest原文链接:https://wetest.qq.com/lab/view/437.html对于游戏行业的不少人来说,2018年是一个多事之秋。放眼大局,游戏玩家中,70%用户已有3年以上的互联网经验,玩家们对游戏审美迅速提高。而相较2017年,游戏工委&伽马数据《2018年中国游戏产业报告显示》,中国游戏市场实际收入同比增长率,从23%下降至5.3%,这说明国内游戏行业增量已经转为了深耕存量的阶段。正如腾讯WeTest总经理方亮所言,游戏厂商依靠上游用户圈地的运动已经走到了尽头。但在险象环生的同时,2018年也更是充满变化与机遇的一年。2019年1月7日,腾讯WeTest《2018中国移动游戏质量白皮书》(以下简称“白皮书”)正式发布,现已于腾讯WeTest官方网站开放下载。通过腾讯大数据及其他第三方平台数据,白皮书着重从市场硬件、兼容、客户端性能、服务器性能、安全、玩家口碑、小游戏等玩家体验最敏感的质量视角进行数据采集与深入分析,客观地反应出了2018年中国移动游戏研发市场的现状与变化。图1.png【图1】《2018中国移动游戏质量白皮书》正式发布风险与机遇并存,风起云涌的2018从游戏品类出发观察,2018年间,已有不少产品在精品化与多元化上深挖起来。角色扮演类、动作类、策略类游戏仍占苹果应用商店的60%的份额。其中,角色扮演类游戏与动作类游戏的比重持续下降,但策略类游戏则依旧占比17%,风华正盛。这些头部游戏品类已进入以品质为导向的存量阶段,一并呈现出精品化、细分化、多元化的态势。图2.png【图2】App Store 游戏畅销榜Top1000游戏类型分布同时,移动游戏市场上也呈现出更为丰富的多元化特征,“战术竞技类”等涵盖多元化玩法的游戏开始登上主流舞台。而更为垂直的细分领域已衍生至14种,其中模拟游戏、家庭游戏、桌面游戏开始初露头角。另一方面,玩法轻便、即点即玩的小游戏也开始展露更多的能量。与此同时,2018年间,移动硬件设备的迭代更加速了。图3.png【图3】Android TOP100硬件配置占比统计屏幕方面,虽然16:9的设备仍是主流。此外,“刘海屏”“全面屏”等异形屏设备的覆盖人群更占据市场7%左右。这些来自用户需求与技术发展的变化,同样也为游戏开发者在游戏兼容性、客户端、服务器、安全性等一系列适配上提出了更高的要求。市场需求发展加上外部硬件的变化为游戏开发者们带来新的机遇,而想要在资源有限的情况下,于项目立项的阶段取胜,就要准确把握用户瞬息万变的审美需求。唯有掌握了曾在2018年发生的问题,拥抱变化,才能在2019年扭转乾坤。TOP 100 机型游戏综合性能数据公布,客户端问题玩家最为敏感腾讯WeTest企鹅风讯平台对抽样游戏在2018年产生的舆情调查显示,登录、卡顿、掉线问题最受玩家关注。从游戏分布来看,登录问题主要集中于动作类、策略类游戏;而卡顿问题则是动作类、角色扮演类游戏的高发问题。图4.png【图4】玩家舆情报警数量分布(客户端问题包括:登录、闪退、更新、下载、安装、启动、硬件和兼容问题)因此,针对腾讯大数据统计出的TOP 100 Android机型以及 TOP iOS机型,腾讯WeTest甄选了战术竞技、体育竞技、ARPG等游戏,一并综合生成性能评分,方便开发者在研发期间,选择性能调优阶段的参考机型。图5.png图6.png【图5】【图6】Android、iOS两大阵营主流设备性能表现首度公开腾讯手游性能大数据,战术竞技游戏服务器痛点同步揭露在2018年,根据苹果应用商店游戏畅销榜可知,多头寡头效应依然明显。而对于这些极具竞争力的产品标杆,开发者们无法详细掌握相关数据,因此更无法找到优化方向。为了助推手游行业标准建立,协助行业性能优化提升,腾讯WeTest首次公开腾讯游戏真实性能数据,战术竞技、MMORPG、体育竞技等主流品类游戏均囊括其中。图7.png【图7】腾讯Android手游性能大数据图8.png【图8】腾讯iOS手游性能大数据同时,由于站在2018年风口上的战术竞技游戏,通常采用UE4引擎机制,战斗服会承担大量同步、物理、逻辑等计算,因此对游戏的服务器性能带来众多挑战。白皮书中,全面剖析了来自服务器的技术性难点,值得开发者重点关注。图9.jpg【图9】战术竞技游戏服务器的痛点兼容性问题不容忽视,显示异常问题需要关注基于腾讯WeTest平台测试对Android产品大数据统计,平均每次测试能够发现游戏产品拥有10.1个兼容性问题,其中,显示异常、Crash问题占比超过70%。此外,功能问题亦占比14%。图10.png【图10】Android游戏兼容性问题类型分布随着Android机型内存升高,相较2017年,APK crash、安装失败等致命问题显著降低。但高配机型中异形屏的出现,导致UI异常问题频发。图11.png【图11】不同Android内存、系统机型兼容性问题分布情况同时,2018年中,Android 9 Pie面向全球发布,新的流量池正在被挖掘与重视。随着系统版本的升高与开发者的逐渐适应,Crash问题正逐步减少,但Android 8 的显示异常问题比重仍最高,需要重点关注。另一方面, iOS系统平均每次测试能够发现3-4个问题。其中,显示异常占比高达56%,需要开发者重点关注。而从iOS 10开始,安装失败与无响应问题迅速减少,基本为零。图12.png【图12】iOS游戏兼容性问题类型分布安全问题间不容发,强交互手游需重点关注外挂漏洞在移动APP中,游戏一直是安全漏洞的重灾区。腾讯WeTest对产品研发期与运营期手游安全情况进行比较,发现了最新问题:其一,强交互游戏依然是外挂漏洞的“温床”;其二,研发期游戏漏洞如果没有解决,会在运营期衍生多个外挂变种,严重影响手游平衡性;其三,动作射击类游戏由于其“强交互”特质,成为了外网外挂的“宠儿”。图13.png【图13】手游研发期与运营期间,平均单款手游安全问题占比而数据显示,最为致命的外挂问题下,“刷道具”为手游研发期最多的安全漏洞,定制外挂与通用修改器,则是手游运营期外网常见作弊方式。此外,在手游研发期存在的致命安全漏洞问题,将由于高收益在运营期会明显扩张,占比从研发期的34%上升至运营期的50%,因此开发者在手游研发期就要防微杜渐、未雨绸缪。图14.png【图14】手游研发期间,具体外挂安全问题占比全面分析小游戏测试难点,功能与适配是主流问题2018年,是小游戏爆发的元年,亦是小游戏精品化、重度化的一年。从小游戏的上线产品的比例来看,角色扮演类占据26%,休闲益智类占据24%,而在2018年下半年开始,一些策略战棋类的重度游戏类型开始出现在小游戏中,重度游戏在小游戏市场中,并非没有机会。而从产品本身观察,小游戏目前正在向精品化轻度化发展。图15.png【图15】2018年小游戏类型分布情况而相较手游通用测试模块,小游戏有着相对独立的测试内容。依托于腾讯旗下小游戏研发经验以及案例,白皮书显示,功能问题与适配问题占据小游戏测试问题主流,同时性能问题亦占据16%不容忽视。图16.png【图16】小游戏测试问题分布情况针对小游戏性能情况统计,有6%-7%的用户因游戏加载时间过长从而流失,小游戏用户流失情况与加载时长形成正比。因此,针对小游戏的加载时间,腾讯游戏根据不同机型档次,设立了加载时间上线标准。图17.png【图17】小游戏加载时间上线标准而在小游戏所面临的适配问题中,67%的问题来自显示异常,异形屏带来的UI适配问题非常明显,亟需开发者关注。 图18.png【图18】小游戏适配问题类型分布展望未来,腾讯WeTest与您同行在未来的2019年里,无论是游戏产品,亦或是互联网下的其他行业产品,统一、批量生产的简单模式定会被逐步迭代。正如WeTest总经理方亮先生所言,取胜关键必然是品质与创意,因此开发者更要做好严格的品质把控,务必珍惜来之不易的流量。在此之下,奔跑的不仅是开发者们,腾讯WeTest作为第三方平台也将与时俱进,超越品质,点亮游戏。作为一站式品质开放平台,腾讯WeTest一直致力于推动优质内容顺利产出,帮助开发者解决难题,在测试效率与质量上产生1+1>2的效果。在过去的一年间,腾讯WeTest对旗下兼容、性能、安全、舆情等服务进行了全方位品质升级,并持续输出云游戏、AI自动化测试、基于AI的同步控制系统、性能大数据分析、舆情大数据分析、舆情预警等前沿技术。而在未来,腾讯WeTest将从游戏出发,逐步将前沿的技术和服务辐射向金融、电商、视频等更多行业,助力更多精品的诞生。此文已由腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

February 14, 2019 · 1 min · jiezi

Nervos 双周报#2 :祝福满满,期许满满新一年!(最后有彩蛋哦)

Jan,29,2019亲爱的 Nervos 粉丝们:中国的农历新年马上就要到来,这段时间,我们收到了来自区块链行业内朋友们的新年礼物和祝福,这也让我们感受到了浓浓的年味和浓浓的热情。最近这两周,我们拜访了很多区块链行业的大佬们,和他们一起探讨 Nervos CKB 经济模型的问题。2018 年,我们做了很多准备,2019 年,对于 Nervos 来说会是真正落地的一年,需要接受来自真实市场的检验。针对区块链技术推出的中文播客《Fork It》第三期更新啦,Nervos 与 Alacris 宣布正式建立合作关系,共同推进 Layer 2 解决方案的发展,CKB 团队去了成都做封闭开发……更多动态,都在这里!Nervos 社区动态Fork It 3终于更新啦!本期是Daniel、Terry、Kevin 三位大佬一起畅聊 ETC 51%攻击,画风幽默,内容全面。Nervos 与 Alacris 正式建立合作关系Nervos 与 Alacris 宣布正式建立合作关系,共同推进 Layer 2 解决方案的发展,为降低区块链应用开发的复杂性,使区块链和分布式技术的广泛地使用成为可能。秘猿科技首席产品官王博(Cipher)受邀参加《独立的大脑—区块链能做什么?》,就《稳定币商业应用简析》做了主要分享。另附上次受邀参加 Ethfans 线下活动文章:《洞见 | 王博:链上治理的缘起、设计与优缺点》Nervos 与 Peter 老师正式推出千聊课堂啦!程序员中的专业区块链讲解员 Peter 老师每周四晚的千聊直播分享,最近两周带来了《万众瞩目的 Grin 是如何走到今天的》和《赛博空间独立课程》2期分享,感兴趣的伙伴可以关注直播间回听:Crypto CampNervosfans & Nervosfans club每晚 8 点,Nervosfans 爱好者社区群主乐乐和小美加会和大家一起分享区块链专业知识。近两周主要从区块链投资、链上治理、估值理论等方面学习了解区块链,推荐两篇文章,「PoS 区块链公式算法中的同步和时序假设」,「可验证随机函数 VRF 之 Algorand 算法」社区在聊什么说到经济模型,免不了拿比特币做参考,小伙伴们问比特币的 SoV 模式会朝怎样的方向发展,大家各述观点且开放思考:https://www.reddit.com/r/Bitc… 你怎么看,加入讨论吧Nervos CKB 开发动态1月19日,我们的 CKB 开发团队去了美食之都成都闭关,据 Terry 票圈得知小伙伴们到了第三天就已经开始缺席两个了,原因是他们真正地体会了「成都是一个来了就离不开的城市」,因为拉肚子……不要慌,我们的开发进度还是没有落下的。CKB 白皮书发布一年后的重大更新: Jan 对近期讨论和发展的最新结果进行了补充,同时删除了过时的内容CKB v0.5.0 版本已被冻结,此版本已将Rust升级到1.31.1团队正在讨论并制定支持 Layer 2 的 Cell 脚本的几个重要功能,将很快发布为RFCVM JIT 的开发:VM重构辅助JIT架构,更多详细内容,请点击查看:Nervos CKB Development Update #3 (进一步完善中)Nervos 的粉丝们近期好玩的推荐最近 Nervos 的好朋友邱飞旸同学在 NPC 源计划发表了他随机数专题的第一篇《区块链上的随机性(一)概述与构造》,这是之前他在我们 Nervos 在杭州每周三的 Dev Meetup 分享《面对灭霸”比心攻击”的终极武器》文字版本,内容非常硬核。Nervos 活动预告1 月 31 日,Scaling Bitcoin meetup 即将到来,Nervos 研究员张韧 和伦敦国王学院的助教教授 Patrick 一起聊聊「共识优化和 Layer 2」1 月 31 日,Nervos 团队 Toya 出席 CoinList Building Blocks II - Building your Crypto Community 与大家探讨生态社区建设关注我们Nervos 官网:https://www.nervos.orgNervos 论坛:https://talk.nervos.orgCommunity blogs: https://medium.com/nervosnetworkTwitter: https://twitter.com/nervosnet...Reddit: https://www.reddit.com/r/Nerv...Telegram: http://t.me/nervosnetworkGithub: https://github.com/nervosnetwor这是 Nervos 双周报的第 2 期,如有任何建议或者想法,欢迎大家来下方讨论留言哦!最后,携我司设计师李童小哥哥再次祝大家新年快乐~快来认领自己喜欢的小动图吧: ...

January 29, 2019 · 1 min · jiezi

必看!互联网开发模式的经验之谈

本文由云+社区发表,作者:韩伟互联网开发的核心问题当我1999年进入互联网行业工作的时候,华为刚刚通过了著名的CMM认证。当时作为一个小程序员,非常向往业界经典的软件开发模式。因为看上去,如果企业实行了CMM,我们程序员就不用再天天为了老板一个拍脑袋的主意而加班开发了,各种各样的奇葩需求和无理变更,也会烟消云散。但是,在接下来的十几年,几乎没有那个互联网公司再去通过CMM认证。是否CMM这种软件开发模式,就根本不适合互联网行业呢?这是一直以来我都在思考的问题。反而是跟随着互联网企业的一步步长大,我无意识的体验了很多现在流行概念的早期实践:敏捷、重构、持续集成、DevOps,这些实践一开始都非常的幼稚粗糙,但是却真正的伴随着互联网业务的逐步成长。所以,在讨论互联网服务的开发模式时,我认为必须要先搞清楚互联网服务开发的核心问题是什么。本质:服务,而不是产品软件到底是“服务”还是“产品”,这个话题一直都非常具有争议。作为程序开发者,实际上是非常希望软件能够是一个产品,因为软件的后续维护和修改,往往是“导致”项目失败的最常见原因。然而事与愿违的是,在互联网企业中,打多数的软件项目,表现出来的是典型的“服务”特征:没有明确的需求合同。这导致了没有办法为软件设计固定的开发方案,也难以确定长期目标。没有预付款和客户验收。互联网服务用户来了就用,爽了就给钱,不爽了就走,连沟通的机会都不会有。甚至连明显的销售环节都没有。很多互联网公司只有市场推广部门,而没有所谓“销售”部门,因为推广就几乎等于销售,在推广的同事,就必须把销售的事情一起做了。因此,在互联网行业中,软件开发更多的是以一种服务的形式存在。这种特征,在对需求的分析管理;开发技术的选择;集成与测试;运营和客服四个方面,都导致了不同于“产品”型软件的巨大差异:对于一项服务来说,需求是持续变化的,你可以找到一些通用的模式,但是必须保持变化。开发效率是第一重要的,因为市场竞争中,应对需求变化快的单位将获得更多的客户。由于服务必须保持长期的稳定可用,又要具备快速的更新部署能力,所以系统集成的效率和质量要求非常高。所幸的是系统运行的环境大多数都是在可控制的空间里(比如开发公司自己的机房内)。服务是公司和客户的一种持续沟通和交互的过程,并非一个单向的发售行为,所以互联网服务需要更多细致的运营和维护的工具,否则难以做到迅速而细致的满足海量的互联网用户的需求。小米的MIUI开发节奏管理:手段.vs.工具在各种项目管理的课程里面,陈述了大量针对人去工作的方法。各种会议、报告、表格、评估、测量多不胜数,然而软件项目进度的控制,依然是一个难度堪比登月的事情。——对于很多项目经理来说,程序员们基本是一个黑盒子,他们自己都不知道一个事情需要多长时间干完,就更别提别人怎么去预估和控制。这里最大的问题,我觉得是:我们往往总是想着怎样“控制”住软件项目的进度,而忽视了如何减少不利于项目进度的因数。实际上影响软件开发进度的主要因数,一般有一下几个:程序员的能力水平。有一些项目其中的技术,是程序员完全没接触过的类型,这里包含了学习、调试的时间。开发过程中的各种修改变更。由于对可行性、需求确认等方面的因数,开发往往会走“回头路”。有些项目做到一般会发现技术上不可行,需要修改需求;而另外一些项目是在项目做到一半甚至快完成的时候,需求方发现需要修改产品设计,因为在产品可体验之前,完全无法想象到最后会是现在的样子。各种和开发无关的过程中的事务。这里包括开会、写报告、沟通、等待开发电脑编译、处理开发服务器故障、各种开发环境和测试环境的问题处理等等……这些事情往往都看起来不是非常“有技术含量”,但是实际上会严重影响开发进度。因为开发工作需要一个稳定、专心的工作环境,频频的被各种事务打断,会让程序员反复的花费时间去“进入”工作状态——面对成千上万行程序代码,要找到之前写到哪个部分,其实不是那么简单。针对上面说的几个问题,很多都可以通过应用更好的开发工具来解决。比如一些新的需求类型,我们可以求助于互联网上丰富的开源软件和开源库;面对需求变更,我们可以使用设计模式、单元测试等工具;开发中的事务问题,更是可以有大量业界先进工具可用:SVN,Git,Jira,Project,IDE,Chef,Docker……与其我们拿着鞭子抽打程序员,还不如给程序员更好的开发工具,这样对于项目进度的推动,其实更有好处。资产:代码.vs.流程互联网公司是由人组成的,人是会流动的,有一些小型的公司,往往会因为一两个核心员工的离职,造成整个系统的代码无法看懂,无法修改,从而最后导致公司完蛋。这种糟糕的情况,不止一次的出现过。然而,如果我们能有一套完善的开发流程,或者是习惯,以及配合良好的开发环境,加上有一定质量的代码,是完全能做到把项目代码,在不同程序员之间顺利交接的。可惜我们很多公司管理者,并不重视程序员用什么工具开发软件,也不知道如何去提高代码的可读性,所以造成我们的项目特别害怕人员变动。如果我们把人员变动看成是一个必然会发生的事情,那么我们就会更重视整个代码的开发环境和开发过程,从一开始就把开发规范确定下来,规定使用什么环境,应用何种工具,并且坚持执行,同时在实践过程中不断的改进。只有这样有预备的去做,最后才会保留的住公司真正的资产。一家互联网公司,我们在评估其开发资产的时候,并不应看他“拥有”多少行代码,因为这些代码是无法直接卖钱的。而互联网公司的开发速度,以及这个速度背后的能力才是最重要的。敏捷开发的意义和实践敏捷开发是我们现在最常见的一个“开发模式”,然而很多时候,我们看到“敏捷”两个字,似乎就是让程序员多加点班,或者忽略一些过程加快把代码弄出来,而真正理解“敏捷”含义的并不多。实际上,敏捷并不会加快单位代码的开发速度!敏捷最主要的目标,是应对需求不明确和需求变更,而这两者正式互联网服务中最常见的情况。需求变更的原因在互联网服务中,由于没有直接的“客户”下单要求,所以很多需求,都是由公司内部的人“代表”的,最典型的就是我们的“老板”们了。正式因为没有明确的“下订单”的过程,所以很多传统的需求分析变得没法做了,因为不管是老板还是产品经理,都是面对着成千上万的客户去猜测他们的需求,如果他们自己能代表客户还好,如果猜错了,项目的代码肯定要修改。很多互联网公司都非常重视“数据”,原因就是这些“数据”往往代表了用户对产品的看法,而这些看法成了互联网产品设计的唯一客观标准。然而这些数据本身,会包含了大量复杂性,由于统计方式、产品形态、季节时间等等,都会产生偏差。我们的项目需求,往往就是在这些偏差中确定。这就难免产生需求的变更了。互联网的客户个体多,服务内容丰富,功能变化快,是互联网项目中需求变更很多的主要原因。因此这也让敏捷开发,成为互联网项目开发中最重要的方法。——敏捷强调的是用原型来验证需求,在互联网服务里就是,尽快推出服务,通过数据来验证想法。如果我们能越频繁的修正原型,就能越快的接近真正的需求,也就是说,如果我们的互联网服务能越快的修正各种问题,同时越快的推出新的版本,就能让用户越牢固的“黏在”这个服务上。架构设计实体化:单元测试敏捷开发讲究要快速的修改代码,我们往往会发现,代码修改的越频繁,BUG越多,这似乎是一个无法解决的矛盾。然而,在敏捷开发方法论中,有一个重要的措施,就是用来防止这种修改造成的BUG增加的。这就是——单元测试。 单元测试本质上,充当着自动的QA人员的角色,如果我们把所有的设计和需求,都先按单元测试的形式“固化”编写下来,那么我们在修改代码后,就能快速的、自动的、反复的去验证我们的代码有没有问题。如果这些测试足够全面和详细,那么我们是不会担心代码修改导致大量的BUG的,因为单元测试会自动帮我们支出问题所在。一旦我们知道了问题,修正起来反而变成是最简单的事情了。假如一个项目的代码丢失了,但全面的单元测试都还在,那么要重建这个项目并不困难,因为所有的需求,都被蕴含在这些测试代码中,程序员们几乎不需要去重新啃文档,谈需求,他们只要把代码弄成能通过单元测试就好了。这种需求的“代表物”不但是程序员开发的概念和目标,而且还可以自动的帮程序员去验证他们的实现。所以,如果你要使用敏捷开发,要尝试频繁修改原型,就一定要使用TDD(测试驱动开发),特别是高度重视单元测试的作用。统一软件设计思路的重要性曾几何时,我们认为,使用什么语言开发,用结构化编程,还是面向对象编程……这些一般人难以深入理解的事情,都是程序员这伙顽固的家伙的怪癖,基本属于私人喜好的范畴。外人既不应该深入干预,也没办法去影响,因为如果你不识好歹去在这些事情上冒犯程序员,他们随时可能一言不合就辞职。既然我们只需要可以运行的代码,我们为什么冒风险去激怒程序员呢?然而,在互联网服务的开发过程中,代码本身并不是某一个固定的、静态的东西,它需要不断的与时俱进,需要跟随这业务的发展而变化,同时也会从某一个程序员手里,流向整个开发团队。在这种情况下,软件开发习惯、代码的风格、程序的设计思路,就变成一个非常重要的事情了。代码交流:面向对象确实现在还存在大量的讨论,说“面向对象不是万能的”。说得对,但是,世界上有什么东西是万能的呢?我只能说,在需求变更非常快的情况下,面向对象思想,是现在我们能选择的最好工具了。在“数据结构+算法=程序”的时代,软件主要是以计算任务为主,电脑是为了代替人脑进行超乎想像的运算任务而存在。而在互联网时代,软件主要的任务已经变成了处理这个真实世界的信息了。信息的存储、交换的任务,已经远远超过了“计算”的任务数量。虽然我们知道,所谓的信息处理,最底层还是依赖大量的“计算”,然而,我们的程序员们,早已不再需要编写大量“计算”的代码,我们面临的挑战,是如何用代码准确而快速的表达这个世界。面向对象思想包括分析、设计、编码三个部分(OOA/OOD/OOP)。这些思想看起来繁文缛节,似乎非常啰嗦。然而,其核心思想却非常简单:从表达过程,转向表达对象。人类的思维中,对象、或物体,是一个个具备自己的信息特征的个体,而行为和过程,往往是依附于这些个体的。比如鸟会飞、账号会锁定、汽车会死火等等。所以如果我们的代码,是以表达对象,把信息和行为统一起来,是最接近于我们的认识规律的。在互联网开发领域,由于网络无处不在,涉及到的领域异常广泛,如果我们没有一个能把代码世界和现实世界联系的纽带,我们的项目将非常难以理解。——难以理解的项目,就难以变化,从而就失去了互联网最显著的特征。所以我认为,面向对象的思想,是每一个互联网开发人员都应该理解的,并且应该是面对大部分业务时,首先考虑选择的。代码架构与重构我见过无数的代码架构图,里面画满了进程和服务器的拓扑,各种线条上标注了通讯协议,编码格式,还有各种流程图和协作图,然而,这些架构设计,无一例外的对于需求变更毫无帮助。因为它们描述的是一种现状,甚至连现状都不是,只是一种猜测,一种关于现状的猜测。随着项目代码的不断变化,代码数量和关系都会膨胀,这种进程、通讯级别的结构,除了越来越复杂以外,根本对于指导项目如何应对各种“代码腐化”毫无用处。因此我们想到了流行的“重构”,然而,如果我们只是重构进程的关系,通信的层次,那些错综复杂的代码调用关系一样存在。各种回调、事件、耦合还是让代码无法理解。我们只是在试图把混乱塞到一些瓶子里面,并没有解决混乱本身。所以,我们需要的另外一个思想武器:代码结构。只有我们从另外一个角度,另外一个视图去观察代码,才能把握代码之间耦合的情况。正如建筑里的平面图和立面图,都是不可或缺的。所以我们应该高度重视“代码架构”,也就是描述代码之间的关系的架构,而不是进程之间的关系的架构。在关注代码互相调用、耦合的关系上,我们能把混乱复杂的代码关系理清,整理出一个便于理解,便于修改的代码外观。这些工作看起来完全是针对开发人员的,但是实际上,这些工作是能提高整个开发效率的。它能让代码从难以修改,变得容易修改,从而得以支持快速的业务需求变化,这是对业务、对产品最重要的支持能力。持续集成的意义和实践不管是敏捷开发的快速迭代,还是重构系统,我们都将频繁的编译代码、部署、测试,也就是所谓的集成。如果我们的系统集成效率太低,那么快速的迭代可能变成慢速的迭代,重构系统的频率也会大大降低。有一些项目,每一次集成,都要最少经历两三个小时,如果不顺利的话,搞一个通宵都未必能完成。“发版本”是很多程序员和运维管理人员的常见加班原因。对于这个问题,很多小型公司开始的时候,并没有给与足够的重视,认为这些事情不过是程序员或者运维的本分工作之一,也是最日常的工作。真正得到出问题了,才发现重要性。在任何一个互联网应用业务中,我们都会需要“发版”:出新功能、修改BUG、启动运营活动、甚至是机房搬迁。所有的这些,如果没有一套合适的工具来保障,每次发版都会是一场噩梦。所以持续集成(CI),很自然的成为互联网企业中最流行的、研究最广泛的技术之一。所有资产纳入版本管理持续集成的所有东西,都应该来源于版本管理系统(SVN/Git)。除此之外,软件资产不应该存放在任何其他地方。版本管理系统应该是开发团队的保险箱和金库,除了代码以外,所有的数据文件,配置,脚本,文档,都应该放入这个保险库。由于版本管理系统可以追溯到任何一个是时间点,这可以让故障恢复,问题回溯有良好的支持。关于源代码使用版本管理系统,已经有很长历史了。但是互联网服务中,除了代码,还有很多其他的资源,比如图片、数据、脚本等等。除了产品项目外,我们的很多额外系统,比如运维工具、产品文档等等,都是需要妥善保管的,这些也都应该存放到版本管理系统中。一般现在的版本管理系统,都有“分支”的功能,简单来说就是类似于“拷贝”了一份新的资源出来,在这之上的修改,可以由我们选择合并到其他分支或者放弃。所以SVN的常用方案,是启动三个类型的分支:trunk/branch/tag,专门针对“测试”、“开发”、“运营”。如果我们按预定的分支模型来设计版本管理系统的使用,那么我们的持续集成就可以很细致的选择集成哪一个版本的内容。而在Git里面,每个使用者,都可以拥有自己的资源库,这对于开发测试可以更加的灵活,但是对于使用者的要求更高一些:在不同的资源库合并的过程中,需要更好的版本管理策略。持续集成系统可以自己拥有一个或者多个Git资源库,这样他们可以完全脱离版本管理服务器来独立运行。自动化部署我们曾经无数次的登录服务器,无数次的拷贝文件,无数次的修改配置,无数次的导入数据到数据库,无数次的……如果我们对这些重复,而且容易出错的工作熟视无睹,我们将永远的被这些本该机器去做的事情困住。 自动化部署,是整个持续集成工作中最重要的步骤。当我们每次发版都要很仔细的修改很多文件的时候,我们是无法避免在某次倒霉的事故后被挨批的。只有我们能把部署工作,也用我们的开发能力去解决,编写自动部署工具之后,我们才真正的能提升部署这个事情到一个新的台阶————我们终于可不再担心发版。和自动化测试一样,自动部署脚本,也是把一系列的技术需求,从纸面文档+人手处理,改成用代码实体化,并且可积累改善的方法。自动化部署工具在开源界也非常热门,比如jekins,还有chef等等,都是为了解决部署问题而发明的软件工具。也许对于你来说,自己用bash开发一套脚本才是合乎你的品味,但是不管怎样,一定要有这样的工具。就算要花费较长的开发时间,调动项目开发的程序员,一起来认真的开发一段时间自动部署功能,都是非常值得的。因为从今以后,你就可以拥有一个自己的部署系统,这个系统不但可以积累你的运营部署经验,还能加入很多错误、故障的自动检查,让你不再需要导出找“永远不出错的”运维人员。自动化部署系统中,最核心的部分就是配置管理。拥有一个对现有环境资源集中管理的数据仓库是非常重要的。如果每个你的脚本可以识别自己所在的环境,以主动的方式去“申请”自己的配置文件和安装任务,是非常好的一个模式。因为从一个节点主动去分发程序,比不上多个节点向中心集群请求部署任务,来的更容易稳定。因为在节点上的部署代理程序,能更准确的知道自己环境的情况,也可以做本地的测试。自动化集成测试前面曾经说过,敏捷开发非常依赖于自动化的单元测试。实际上持续集成,也非常依赖于自动化的集成测试。集成测试可以把自动化部署的结果进行检验,避免手工进行反复验证。如果只有自动化部署,而没有自动化测试,那么集成工作,其实还是非常浪费人力的。更重要的是,我们在每次“发版本”之后,总会担心新的修改,导致一些旧的功能失效。这种问题实际上是很常见的,如果无法自动化的做这种回归性的测试,那么我们每次发版还是要忍受漫长的测试工作进度。 自动化集成测试也有很多开源的工具可供选择,特别是基于B/S模式开发的WEB程序,但如果是手机APP的项目,或者客户端C/S程序(比如网络游戏),对于这类服务器系统的集成测试,往往需要我们自己根据业务来编写测试程序。对于服务器系统来说,一般我们针对其通信协议编写测试程序即可,而对于客户端系统,如果是GUI系统的,我们还可以根据GUI的内部调度命令(安卓就有这样的套件)来测试,但如果是类似游戏这类业务,就只能用图形识别技术了。在持续集成的流程中,集成测试往往是最后一步的检验关口。如果集成测试失败,应该给所有关注集成的人员发送警报(实际上,如果成功也应该报告)。现在企业往往会用邮件、IM、微信、短信或者别的一些东西接收这种消息。DevOps的意义和实践在互联网企业初始的阶段,运维工作往往是服务器端开发人员兼任的。当我在承担这种既是开发又是运维的工作时,往往非常羡慕那些“开发、运维分离”的公司。因为作为开发人员,没有三班倒的值班备份人力,往往是7X24小时的待命状态,工作压力非常大。然而,当我自己参与到一些真正开发、运维分离的项目的时候,却发现,项目运营事故中,最少有70%的事故,是由运维的原因造成的。除了常见的硬件、网络故障,操作系统配置出错,日志清理出问题,部署配置搞错,进程不小心杀掉等等都出现过。看来服务器端开发和运维还真是难解难分,而DevOps的思想,就是为了努力解决这种矛盾。我们不应该再把开发和运维对立起来,而应该认识到,运维是开发的一种延续,运维的需求也是服务器端系统的功能需求;运维是开发的目地,便利的、通用的运维工具,本身是能提高开发效率的一种专业产品。运维与开发的一体性:运维、运营、QA可以把DevOps看作开发(软件工程)、技术运营和质量保障(QA)三者的交集一个互联网软件的上线运营,往往是由开发人员编写出来,然后经过QA人员测试,最后放在运营环境里进行运营。这个过程并非是单向的过程,基于前文说的,互联网服务都是在反复修改迭代中完善的,所以项目本身,一定是由多个版本,反复在开发、QA、运维之间循环交接。举例来说,一个网络游戏,在第一次开发出来后,都会经过比较仔细的QA测试,然后通过运维人员进行上线部署,最后由运营推广人员进行宣传,同时也要配合这些宣传开启游戏内部的一些功能,客服人员也会在开始运营后参与进来,除了提供客户咨询外,抓作弊玩家和封帐号也会持续进行。而作为开发人员的游戏策划,立刻会关注游戏系统的各种统计数据,以期在下一个版本中改善游戏设计。这个过程,可以看到在产品开发出来之后,整个团队几乎都还是需要以各种方式“使用”此服务器端系统的。所以我们在开发互联网服务的时候,不能仅仅面向互联网上的一般用户,同时也需要考虑整个开发团队的使用需求。现代的互联网软件系统往往都带有服务器端部分。而这些服务器程序需要7X24运行,因此产生了两类非常明显的需求:运维需求:这类需求往往表现为非功能性需求,它要求服务器程序能够适应大规模用户访问和持续稳定运行。运营需求:这里需求通常是功能性需求,因为产品上线后,产品和运营、客服、测试人员,还需要持续不断的使用这个系统,和互联网的海量用户进行互动。运营:客服、活动在互联网服务中,运营是一个非常重要的环节。客户除了直接使用互联网软件的功能外,背后其实往往还有大量的从业人员在通过这个软件提供服务。其中最常见的就是客服服务。客服往往最需要的是查询功能————能够查到系统中特定用户的使用数据,从而协助客户解决问题。客服的另外一个主要工作,是封帐号和封IP。现在互联网黑色产业链非常庞大,互联网企业保护自己的手段其实不多,而客服是其中一个重要的环节,避免黑色产业侵袭自己的利益,就需要互联网服务系统有人工干预其数据的能力。运营互联网服务另外一个常见的行为就是“活动”,也就是开放一些限时的服务。就和超市一样,互联网服务也要定时或不定时的加入或关闭一些特别的服务。这些工作非常细致和琐碎,需要服务器系统能够提供人工参与或者机器定时启动的一些功能。在《魔兽世界》这个网游中,大部分的活动都是自动的和定时的,可以从游戏里的一个日历功能查到。而在国产的互联网产品中,的很多是临时加入,需要人工维护的,如“双十一购物节”这种。这些对于服务器系统的版本更新,功能修改,都提出了更高的要求。因此一般我们在设计互联网服务系统的时候,就应该一开始就把运营需求,也作为版本目标纳入开发计划中。一些比较好的团队,会抽象和总结同类互联网项目(比如游戏、电商类型)在客服、运营活动上的共性,形成一套标准的服务规范以及实现这个规范的接口。由互联网服务开发团队去实现这些规范的接口,提供功能上的支持,而另外一个运营开发小组,则负责根据这个接口,开发供运营团队人员使用的界面、内部管理系统等。比如游戏的运营规范会要求游戏提供查询角色区服、帐号的名字、等级等数据,提供接口在游戏中发布任务;电商系统的运营规范会要求网店提供本店销售排行查询、优惠券折扣接口等等。运维:部署(虚拟机)、监控、统计作为非功能性的需求来说,部署需求是第一位的。频繁的部署是互联网服务快速演变的基础能力。另外,互联网用户的增加(和消退)也是非常迅速的,这导致了我们可能需要快速的进行服务器扩容,或者缩容。这种情况都需要涉及到部署。所以我们在开发服务器系统的时候,部署需求是第一个需要考虑。加上如果我们希望实行持续集成,那么就更加需要重视部署的能力。作为服务器端系统,如果被设计成带有非常复杂的进程种类和进程通讯关系的话,要做好部署就会变得更加复杂。加上可能部署的环境还不统一,可能出现的问题就更复杂了。所以现在有大量的技术尝试改善这个方面。首先被大家广泛接受的是虚拟机技术,也就是所谓云服务器(IAAS),这种技术能让你无需直接操作硬件,不用扛机器到机房来进行部署,是一种巨大的进步。而后现在我们有了Docker这种基于Linux容器技术的工具,这可以把服务器操作系统层的差异环境,都统一成一个个image文件,部署的时候只要运行image文件即可。但是这些依然无法简化错综复杂的服务器进程关系,所以现在有了各种“队列服务”技术,比如Kafka,RabbitMQ, ActiveMQ等等,这些队列服务把进程间通讯简化成专门的服务,减少了部署的复杂性。而ZooKeeper的广泛使用,让我们在多进程间协调和监控有了更多的手段。在具体部署工具方面,Chef这一类软件做了各种有益的尝试,这些都是能让我们优化部署需求功能的工具。互联网服务的24X7持续服务能力,实际上会收到各种挑战,除了版本发布可能导致的问题外,在大量机器硬件里面,硬件故障率是一个固定的比例。网络抖动,机房线路故障也常常会出现。更容易出现的是异常的用户访问波动:一大波用户汹涌而来,但是也有可能是DDOS攻击。不管怎样,你都需要随时掌握服务器系统的工作状态。这时你就需要一个监控系统,但如果产品上线才发现要做,那往往已经很迟了。因为一个系统是否有问题,并不是简单的从内存、CPU、网卡流量就能看出端倪的,我们往往需要在服务开发之初,就定义好各种需要监控的指标,传统常见的指标有:每秒主循环的次数、每秒处理业务包的次数、服务器中缓存的会话数等等……一些做的好的系统,还会有很多业务层面的监控指标,比如某个特定服务的处理效率、处理成功率等等。既然一个系统有大量的监控指标,就涉及如何生成和管理这些数据的问题。传统的做法是在系统中“埋入”这些监控程序,系统一边运行一边统计这些指标,然后定时生成日志或者通过网络上报给某个监控系统。但是这种做法的缺点是:如果你需要更多的指标,或者修改指标的统计方法,你就被迫要修改代码,重启服务,这样会影响正在运行的服务。现在另外一个做法是,由系统把运行的原始信息记录成日志,然后把日志集中上报到一个监控系统中,这个监控系统一般都带有分布式的文件存储系统和分布式计算统计能力。在搜集到大量实时日志的同时,这个系统根据预设的指标统计方法,不停的进行日志统计,一旦发现统计结果有问题,就会报警。而这种统计由于是在大数据处理能力的平台上生成的,所以往往发现问题的时间差能缩小到分钟级甚至秒级。这种做法由于搜集的是原始日志记录,所以就可以灵活的在系统运行时定制很多统计和报警的策略,但完全不会增加服务系统的压力,也不需要修改服务系统的代码。最后说说统计,任何一个互联网系统,都是在用户的使用中不断优化的,这个优化的依据,最重要的客观依据,就是统计数据。而统计数据,一般由两部分构成:用户的行为数据。比如登录行为,就可以给系统留下用户的IP、登录时间、登出时间等数据;购买行为,就可以留下购买商品,购买价格,购买时间这些数据。根据用户的行为的关联,统计出来的数据。比如根据登录行为,我们可以统计出用户的在线时长,用户重复登录的次数,用户重复登录的间隔,还有什么次日存留、七天存留等等……;根据购买行为,我们更是可以整理出用户的购买商品倾向,ARPU值,甚至同类用户的购买共性,这些也是所谓大数据做商品统计的主要方向。根据上面的分析,我们可以发现,实际上统计系统也是应该分两个部分设计,一个是尽量记录用户行为的基础数据,第二个是以复杂多变的统计条件,去挖掘这些用户行为数据中包含的规律。对于第一部分,一个可以存放海量日志数据的分布式存储系统非常重要;对于第二部分,分布式的统计运算系统是必不可少的。对于这个体系,Google的Hadoop提供了业界的示范。但是如果你愿意,也可以使用这个思路自己来建设自己的统计系统,也许你的数据量无需要用到Hadoop那么复杂。总结互联网开发模式,是针对于互联网本质上是一个“服务”而发展起来的。因为是“服务”而不是产品,所以应对快速变化的能力是最高的技术标准。我们倾向采用更适合表达需求的软件开发技术、自动化程度更高的开发工具,来提高我们的开发效率,而不是靠单纯的“激励主观能动性”来做管理。因此我们在基于自动化测试、自动化部署等持续集成工具的平台上,使用重视原型迭代的方法来开发项目,在反复以原型确认需求,以及适应需求变化的过程中,逐步的完善整个开发生产线。并且把开发和运营视为一个整体,在服务的运营过程中,不断的完善互联网服务的运营工具,让开发和运营在同一个生命周期里生长。此文已由作者授权腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号

January 10, 2019 · 1 min · jiezi

做开发十年,我总结出了这些开发经验

本文由云+社区发表在一线做了十年的开发,经历了网易、百度、腾讯研究院、MIG 等几个地方,陆续做过 3D 游戏、2D 页游、浏览器、移动端翻译 app 等。积累了一些感悟。必然有依然幼稚的地方,就当抛砖引玉,聊为笑谈。一、对于团队而言,流程太重要了行军打仗,你需要一个向导;如果没有向导,你需要一个地图;如果没有地图,至少要学习李广,找一匹识途的老马;如果你连老马也没有,那最好可以三个臭皮匠好好讨论,力图胜过一个诸葛亮;如果三个臭皮匠连好好讨论也做不到,那就是典型的乌合之众了,最好写代码前,点上三炷香,斟上一杯浊酒,先拜拜菩萨,再拜拜谷歌。我个人属于性格温和的(程序员大多性格不错),但确实见过少数强势的人,说很多强势的话。在技术上一言而决,一听到任何反对就上升到私人恩怨。这样的风格,到底是刚愎自用,还是胸有成竹,就需要仔细判断了。为什么说流程重要呢?实际上,如果团队上有孙悟空存在,去西天取经,大概也不需要什么流程,只要方向就可以了。 但作为普通的战士,应该先虑败。找人算命时,应该先听听不好的地方,好的地方就不用听了,总归是好的,不好的地方一定要听,这样才能规避。这就是我的态度:先悲观一点,划清底线,考虑在这个底线上你该怎么做?这是我做开发的一个习惯,但这个习惯肯定不适用于买房。怎么划清底线呢?就是假想团队中没有孙悟空了,光靠你唐玄奘、猪八戒和沙和尚,应该怎么去取经。这个月走什么地方,遇到山怎么走,遇到河怎么过,遇到路上有妖怪劫道,谁去抵挡。遇到路上有少女要搭救,怎么办?这就是流程,是原则。我经历过一个流程很混乱的阶段。都是很多年前的事情了,可以拿出来说说,不涉及单个人。2011年在百度浏览器团队时遇到几件让人影响深刻的事情。 有一次开会,产品拿出 Google 某个产品的 DEMO,里面有一段很酷炫 3D 效果,要求开发加上,只给2天时间,大家目瞪口呆。后续的开发为了赶节奏,导致非常多的 bug ,又为了修改 bug ,leader 将所有的 bug 按照人员平均分配,导致不同模块间的同学相互修改……实在难以想象。好比让做花卷的厨子,去修改西湖醋鱼的味道。最初的现象是:bug下降的慢,延伸 bug 反而增加,每个人都累的半死,代码风格极其杂乱,为了赶工导致的临时方案层出不穷;到了中期:人员离职越来也多,代码难以维护,新加的需求与之前的临时方案冲突。到了后期:想做一些修复,想调整架构,又要保证正常运行,其难度好比在一架飞行的飞机上拆换零件。然后我也急忙离职了……实在看不到成功的可能性。后来到了腾讯的团队,感觉流程就规范多了。需求和 bug 有 Tapd 跟踪,产品发布按照节奏,需求提出前会和开发反复讨论可行性,有专门的质量跟踪,有专门的用户反馈,每天知道要做什么,也知道明天要做什么。有产品需求,也有开发需求!这个非常重要。很多团队,都是只有产品需求,开发好像牛一样,耕完地就不管了?流程其实没那么复杂,就是各司其责+节奏。我们都是“哆瑞咪发梭拉西多”中的一员,各自有各自的责任,然后组合在一起,按照一个节奏跑起来。把该做的事情与该跑的节奏定好。二、不要炫技,老老实实写代码网上有一个段子,说有人要用JS实现一个简单的功能,然后朋友给他推荐了几十个库。真的有必要吗?具体情况具体分析。居家过日子,你只需要一套普通的工具就可以了;如果你是修车的,你需要一套修车的工具;如果你是光头强,你需要一台伐木机。 吃饭用筷子,用刀叉,都可以,但不要用杀猪刀,不要用丈八长矛!,当然也不能用牙签。用什么工具,用什么库,问问过来人,多在KM上搜索一下。举个例子:android 上加密,用 SQLChpher就可以了,微信也在用,你当然可以学习;数据库 ORM 思想,用 KM 上推荐的 GreenDAO 就可以了;PC 上 3D 引擎,用OGRE就可以了;小型游戏 DEMO,用 Irrlicht 足够;写 WebGL,用 ThreeJS 足够。首先想想:一些大库 hold 的住吗,后续发展如何?这些库对安装包的体积影响有多大?有没有调研过同样的产品在用什么?想清楚了再决定用什么,最好是跟随成功项目的脚步。三、架构上实用+适用很喜欢曾国藩的一句话:结硬寨、打呆仗。一字长蛇阵、八门金锁阵,哪个好?iOS 都是单个进程,微信 Android 版本3.5以前是单进程,3.5以后有独立的网络进程; PC 浏览器的进程架构更加复杂,UI 进程、内核进程、Render 进程,而且还有根据页面多少的进程调节模型。这些设计都很好,各有各的道理,都适用于当前的产品。所以我的观点是:首先分析当前产品的规模、性质,然后再设计架构。在当前阶段达到:开发效率+架构的平衡;并向后展望3个月,或者半年左右,看看架构能不能适应。我做腾讯翻译君时,曾反复犹豫要不要模仿微信加入独立的网络进程。后来逆向了有排在第一二位的竞品,最终采用了现在的主功能单进程模型。产品规模、人员规模、功能阶段,具体问题具体分析。四、既要有攻城之力,也要有熬战之气——BUG产品开发完成后,必然有 bug 。其实开发人员在工作过程中,是有一定的直觉或者心理预判的,即:某个功能模块的质量如何。 这里面的质量包括:可维护性、扩展性、算法渲染效率,还有就是bug与崩溃率。功能开发完成后,就要开始守城了。bug,一部分产生是由于架构带来的,例如比较复杂的架构,会导致复杂的实现细节;但还有很大部分bug,其实是基于如下三个原因产生的:1 . 对于某个api的不了解,或者对于某个平台,或者 SDK 版本的不了解。 举例而言:android里面非主线程,是不能直接处理UI相关的事情的;JAVA 的内存释放也不是绝对的,相互指向是无法释放的;函数个数是有DEX问题制约的———————这些bug的产生,也是开发人员摸索学习的过程,经历过一次就不会再犯了。这是学习广度与熟练度的问题;2 . 还有一些bug,是由于粗心大意导致的。例如空指针的问题,野指针的问题。在 C 的开发中,野指针的问题,GDI 句柄的释放问题,这些都是严谨的代码需要避免的; 而又一些工具,或者方法是可以规避这些问题的,例如 android中 的利用@ Nullable 和@ NonNull 加强空指针检测等方法;3 . 还有一些bug,是由于“使用情况各异导致的”。例如:偶现在某个模块crash。这里的本质还是因为逻辑的异常边界没有处理好。例如 android 上的 OOM 问题,还有 PC 上 UI 焦点导致的对象释放问题。这些异常情况,一部分靠测试发现,一部分靠用户反馈,还有一部分就靠自己的异常处理。例如Android中的try catch机制,其实就是遇到异常了,你能纠正错误的机会。五、自审每过一段时间,都要站在高空俯视自己,问问:到底是在承担过去,还是在改变未来。如果之前程序代码质量不好,后面修改问题的时间就会比较多。到了开发的中期,得多问问自己,你在不停的改正以前的错误,还是在做新的东西。 如果修改错误的时间多一点,那就要注意自己的代码质量了!六、注释我很喜欢写注释。有大牛说:代码就是最好的注释。 可惜我还没有达到那个程度。所以,我会把注释写的非常清楚。其一:为了自己以后维护的方便; 其二:为了其他人接手的方便。这是我在翻译君项目中写注释的方式。1:对于很复杂的逻辑,务必用12345的顺序依次写清楚;2 :对于函数中的某个参数,需要解释为什么要设置这个参数,尤其是公用工具类里面的函数—说清楚参数的背景含义,可以让其他调用者理解的更加清晰。我一般不用英文写。虽然这样看起来格调很低,但胜在大家都能轻松的看懂。写代码不能太傲娇,写注释也不要太傲娇,目的是让你的搭档或者接手者,更轻松的理解,让她/他少加班。七、代码结构代码结构要清晰。有按照功能划分的,有按照 UI 结构划分的。还有公用工具类,有数据管理,有主逻辑控制。不管用哪种思想,有序的代码结构,可以让每个人感觉很干净。好比日本的收纳整理技巧让很多小资推崇,无非就是干净、整洁、便于管理。而且,还有一个重要的好处:代码结构表现出来的其实是——程序的一个模块逻辑思想——让大家工作在不同的区域。八、代码风格代码风格统一!好比一家人,有叫 Tom 的,有叫安东尼的,还有叫流川枫、石破天、圣杰夫拉斯基,无所适从。理论上,看一个函数,就能从名称上区分哪些是成员变量,哪些是局部变量,哪些是全局静态值。除了命名统一外,还有一行代码最大的宽度,函数的连续调用长度等,头文件的包含风格,也最好有一个约定。类的出现时间,创建人名,最好也加上,看起来没用,但到了追踪问题时,就能看出时间线的好处。九、安全与逆向这是针对Android说的,还有PC插件也需要考虑。Android 上首先要防止被别人逆向,我成功逆向并重新打包过有第一位和第二位的竞品。这似乎有点不可思议,但确实做到了。加固+混淆+代码判断,最好都有。安全上,可以看金刚扫描的漏洞,逐一修改就行。公司很多工具很好用的!十、开发效率开发效率可以用这些方式提升:1 . 构建公用工具类,方便大家使用2 . 使用开源的一些包,例如 ORM 思想的数据库等3 . 可以很快的找到问题。开发中,找 bug 的时间,往往是很多的。我用的方法有3个: 使用 try catch; 拦截所有 crash 到我指定的地方;超多的 Log,Log 有统一的控制开关。4 . 借力:数据上报用灯塔,崩溃上报用 bugly,公司 KM 上很多经验,拿过来用。十一、安装包体积1 . TINY 压缩图片2 . 删除无效的资源文件十二、UI渲染效率UI 是用户的第一感觉;UI 快并稳定,第一感觉就不会差太多;管理好内存,基本管理好了一半 crash;管理好 UI,等于管理了人机交互感受。UI 上的开发是:渲染效率与渲染效果的平衡。很匆忙的写的,必然有很幼稚的地方,欢迎斧正。此文已由作者授权腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号 ...

January 4, 2019 · 1 min · jiezi

Flutter Exception降到万分之几的秘密

flutter exception闲鱼技术团队于2018年上半年率先引入了Flutter技术实现客户端开发,到目前为止成功改造并上线了复杂的商品详情和发布业务。随着flutter比重越来越多,我们开始大力治理flutter的exception,起初很长一段时间内闲鱼内flutter的exception率一直在千分之几左右。经过我们的整理和解决,解决了90%以上的flutter exception。我们对exception进行了归类,大头主要分为两大类,这两大类堆栈数量很多,占到整体90%左右:1.第一大类的堆栈都指向了setstate#0 State.setState (package:flutter/src/widgets/framework.dart:1141)#1 _DetailCommentWidgetState.replyInput.<anonymous closure>.<anonymous closure> (package:fwn_idlefish/biz/item_detail/fx_detail_comment.dart:479)#2 FXMtopReq.sendReq.<anonymous closure> (package:fwn_idlefish/common_lib/network/src/mtop_req.dart:32)#3 NetService.requestWithModel.<anonymous closure> (package:fwn_idlefish/common_lib/network/src/net_service.dart:58)#4 _rootRunUnary (dart:async/zone.dart:1132)#5 _CustomZone.runUnary (dart:async/zone.dart:1029)#6 _FutureListener.handleValue (dart:async/future_impl.dart:129)2.第二大类堆栈都与buildContext直接或者间接相关#0 Navigator.of (package:flutter/src/widgets/navigator.dart:1270)#1 Navigator.pop (package:flutter/src/widgets/navigator.dart:1166)#2 UploadProgressDialog.hide (package:fwn_idlefish/biz/publish/upload_progress_dialog.dart:35)#3 PublishSubmitReducer.doPost.<anonymous closure> (package:fwn_idlefish/biz/publish/reducers/publish_submit_reducer.dart:418)<asynchronous suspension>#4 FXMtopReq.sendReq.<anonymous closure> (package:fwn_idlefish/common_lib/network/src/mtop_req.dart:32)#5 NetService.requestWithModel.<anonymous closure> (package:fwn_idlefish/common_lib/network/src/net_service.dart:58)#6 _rootRunUnary (dart:async/zone.dart:1132)#7 _CustomZone.runUnary (dart:async/zone.dart:1029)第一类明显与element和sate的生命周期有关。第二类与buildContext有关。buildContext是什么?下面是一段state中获取buildContext的实现Element get _currentElement => _registry[this];BuildContext get currentContext => _currentElement;很明显buildContext其实就是element实例。buildContext是一个接口,element是buildContext的具体实现。所以上面的exception都指向了flutter element和state的生命周期2.flutter 生命周期1.state生命周期2. element 与state生命周期element是由widget createElement所创建。state的生命周期状态由element调用触发。最核心的是在new elment的时候element的state的双向绑定正式建立。在umount的时候element和state的双向绑定断开。3. activity生命周期与state关系flutter提供WidgetsBindingObserver给开发者来监听AppLifecycleState。AppLifecycleState有4中状态1.resumed界面可见,比如应用从后台到前台2.inactive页面退到后台或者弹出dialog等情况下这种状态下接收不到很任何用户输入,但是还会有drawframe的回调3.paused应用挂起,比如退到后台。进入这种状态代表不在有任何drawframe的回调4.suspendingios中没用,puased之后进入的状态,进入这种状态代表不在有任何drawframe的回调看下android生命周期和appLifecycleState、state关系创建2.按home键退到后台3.从后台回到前台4.back键退出当前页面(route pop)5.back键退出应用3.常见的exception例子1.在工程开发中,我们最容易忽略了state的dispose状态。看一段例子:这个例子可能会在某些情况下excetion。在state dispose后,element会和state断开相互引用,如果在这个时候开发者去拿element的位置信息或者调用setstate 刷新布局时就会报异常。最常见的是在一些timer、animate、网络请求等异步逻辑后调用setstate导致的excetion。安全的做法是在调用setstate前判断一下state是否是mounted状态。如下:2.buildcontext使用错误看一段错误使用buildcontext例子上面的错误在于在跨堆栈使用了buildcontext。由于outcontext的生命周期与buttomcontext不一致,在弹出bottomsheet的时候outcontext可以已经处于umount或者deactivite。上面例子正确的做法是使用bottomcontext获取focusScopeNode。我们在跨堆栈传递参数(如bottomsheet、dialog、alert、processdialog等)场景时特别要注意buildcontext的使用。最后不过瘾?如果你还想了解更多关于flutter开发更多有趣的实战经验,就来关注微信公众号 “闲鱼技术”。参考https://github.com/flutter/flutterhttps://flutter.io/docs本文作者:闲鱼技术-虚白阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 27, 2018 · 1 min · jiezi

mac 上下载文件后很响,vscode 导致 coder helper CPU100% 解决方案

原因当我们新复制一个文件,或者下载一个包后,vscode就会全局搜索文件,做映射方便开发的时候方便跳转。在一定程度上很烦人的,cpu% 导致笔记本很响, 可以动态的添加规则来减少这个困扰。点击设置:找到watcher exclude如果还想使用这个工具,请设置自己的大文件规则。如果不想,直接暴力 下面规则????/

December 1, 2018 · 1 min · jiezi