首页 文章 精选 留言 我的

精选列表

搜索[智能扫码],共10000篇文章
优秀的个人博客,低调大师

硬核干货:一位菜鸟码农的架构师“封神”之路!

云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 几年前有人问我:你是怎么成为一名软件架构师的?我们就此探讨了必备技能、经验,以及储备相关知识所需的时间和精力。 除此之外,我也回顾了自己走过的路、使用或尝试过的技术,以及我从那些五花八门的工作中学到的东西。 架构师技术路线图 软件架构师是什么? 在进行深层次的探讨之前,我们先来看两个定义: 软件架构师是指那些制定高级设计决策,并确定技术标准(包括软件编程标准、工具和平台)的软件专家。这之中的首席专家就是总架构师。 软件架构是系统的基本组织构成,这种组织主要体现在其组件、组件之间的关系、组件与环境之间的关系,以及决定系统设计与演化的原则。 架构的“层级” 架构主要可以抽象成以下几个层级。不同层级所需的技能也不同。 尽管对层级的分类有很多种标准,但是我最喜欢把架构分成三个层级: 应用级:最低层级的架构。只关注单一的应用。层级低,但是很详细。这方面的交流一般是在一个开发团队内展开。 解决方案级:架构的中间层。关注一或多个满足业务需求的应用(也就是商业方案)。这之中有些设计是高层次的,但大部分还是低层次的设计。这种层级架构的交流就开始涉及多个团队了。 企业级:架构的最高层级。关注多个方案。这种架构的设计层次高且抽象,因此也需要方案级和应用级的架构师对此进行细化。这种层次的架构就需要多个组织进行沟通了。 有时候,架构师也被看做不同工作组之间的粘合剂。以下是三个例子: 横向:在业务部和开发人员或是不同的开发团队之间架起沟通的桥梁。 纵向:在管理者和开发人员之间架起桥梁。 技术:将不同的技术或应用整合在一起。 软件架构师的日常 要了解架构师的必备技能,我们得先知道架构师主要做什么。 我认为架构师最重要的活动包括: 定义和确定所需的开发技术与平台。 定义开发标准,如编程标准、工具、审核流程、测试方法等。 对确定和理解业务需求提供支持。 设计系统并根据需求做出决策。 对架构定义、设计和决策进行讨论记录。 检查并审核架构与代码,比如检查前期确定的模式与编程标准是否被正确实施。 与其他部门和架构师合作。 对开发人员的引导及咨询。 将高级设计细化,并转化为较低级的设计。 PS:架构设计是一项持续性的工作,尤其是在敏捷软件开发过程中。因此,我们会一遍又一遍地重复这些工作。 软件架构师必备技能 为了支撑上述工作需要很多重要的能力。就我个人的经验,每个软件架构师应该具备如下十项技能: 设计能力 决策能力 化繁为简能力 编码能力 文档架构能力 沟通能力 评估能力 平衡能力 指导、答疑能力 营销能力 设计能力 什么是好的设计?这可能是最重要和最具挑战性的问题。要把理论和实践区别开来。 根据我的经验,两者兼而有之是最有价值的。让我们从理论开始: ①了解基本的设计模式:设计模式是架构师设计开发可维护、可扩展系统的一项最重要工具。 通过设计模式你可以设计解决通用问题的可重用方案。由 John Vlissides,Ralph Johnson,Richard Helm,Erich Gamma 撰写的《设计模式:可重用面向对象软件的要素》一书,每个从事软件开发的人都有必要阅读一番。 尽管上述模式发布于 20 多年前,其仍然是现代软件架构的重要基础。例如,本书描述了模型-视图-控制器(MVC)模式,该模式应用于许多领域,也是一些新模式(如 MVVM)的基础。 ②深耕模式和反模式:如果你已经知道了所有的基本 GoF 模式,那么可以用更多的软件设计模式扩展你的知识或者深入你感兴趣的领域。 我最喜欢的应用程序集成相关的内容之一是 Gregor Hohpe 编写的《企业集成模式》一书。 本书适用于两个不同环境的应用程序需要交换数据时,无论是一些传统系统的旧式文件交换还是现代微服务体系结构。 ③了解质量测量:定义架构远不是终点。指引手册和编码标准的定义、应用和管理是有原因的,这么做是因为质量和非功能性需求。 你想拥有一个可维护、可靠、可适应、安全、可测试、可扩展、可用等的系统,而实现所有这些质量属性的一个方法就是应用好的架构工作。 你可以在维基百科上了解更多关于质量衡量的信息。理论很重要。如果你不想成为一名站在空中楼阁上的架构师,那么实践同样重要,甚至更重要。 ④尝试了解不同的技术栈:这是成为一个更好的架构师的一项重要工作。尝试新的技术栈并至上而下的学习他们。 不同的技术可以给你带来不同的设计理念和模式。对新技术的学习最好不要浮于表面,应该去多实践深入感受解决的痛点和其存在的问题。 架构师不仅需要涉猎广泛,在某些领域也要有深厚的知识。当然并不需要掌握所有的技术,你需要对你所在领域最核心的技术有扎实的了解。 你也可以尝试其他领域的技术,例如,如果你深入 SAP R/3,你就应该也去尝试一下 JavaScript,反正亦然。时刻保持好奇心并付诸实践。还可以去试一些你讨厌了很多年的技术。 ⑤分析和理解应用模式:看一下当前的任一比较流行的框架,例如 Angular。可以在实践中研究很多模式,例如“观察者模式”。 尝试了解它如何在框架中应用,为什么要这样做。如果真的很有时间且认真,可以更深入地了解代码并了解其实现方式. ⑥加入一些用户组,例如 Meetup。 决策能力 架构师需要能够做出决策并将项目或整个组织引导到正确的方向。 ①知道重点:不要把时间浪费在不重要的决定或者行为上。学会抓住重点。据我所知,目前还没有一本书讲这方面的内容。 个人评估某件事是否重要,通常考虑如下两点: 概念完整性:即使您决定以一种方式做到这一点,坚持下去,即使有时以其他方式更好地做到这一点也是如此。通常,这会让概念整体上更简单,简化可理解性并简化维护性。 一致性:例如,如果您定义并应用命名约定,它就无关于大小写,而是以相同的方式在任何地方应用它。 ②优先级:有些决定是非常关键的。如果不尽早决策,会产生很多冗余到后期不太能删除的方案,导致维护困难,甚至于导致开发人员无法继续开发,直到给出决策。 这种时候,往往给出坏的决定好于没有决定。当然,遇到这种情况时优先选择当前方案中的最优解。 这里我建议看看在敏捷软件开发中广泛使用的加权最短作业优先(WSJF)模型。尤其是时间关键性和风险降低是评估体系结构决策优先级的关键。 ③明确自己的职责:不要决策在你能力或者职责范围之外的事情。这是至关重要的,如果不考虑的话,它可能会严重破坏你架构师的地位。 为了避免这种情况,一定要与你的伙伴们明确你承担的责任及角色。如果架构师不止一个,那么你应该尊重当前的组织架构。 作为级别低的一方,最好是给出建议不是决策。此外,我建议始终和同伴一起评审关键决策。 ④评估多个选项:在决策时,一定要有一个以上的选择。在我参与的大多数案例中,有不止一个(好的)选择。 只有一个选择是不好的,两个方面:首先,似乎你没有做好你的工作,其次,它阻碍了做出正确的决定。 通过定义度量标准,可以基于事实而不是直觉(例如许可证成本或成熟度)比较选项。这通常会导致更好、更可持续的决策。 此外,向不同的利益相关者推销决策也更容易。此外,如果没有正确评估选项,则在讨论时可能会遗漏一些因素。 化繁为简能力 请记住 Occam 剃刀的解决问题的原则,它表示更喜欢简单。 我把这个原则解释为:如果你对这个问题有太多的假设要解决,那么你的解决方案可能是错误的,或者导致不必要的复杂解决方案。为了得到一个好的解决方案,应该减少(简化)假设。 ①方案规整:为了简化解决方案,从不同的位置角度评估它们通常有助于清理、规整解决方案。尝试通过自上而下和自下而上的思考来形成解决方案。 如果您有一个数据流或进程,那么首先考虑从左到右,再从右到左。可以提出一些问题,比如:在一个完美的世界里,你的解决方案会怎么样?或者:“X 公司/个人会怎么做? 其中 X 可能不是你的竞争对手,而是 BAT之一。这两个问题都迫使你减少 Occam 的 Razor 建议的假设。 ②退一步:经过激烈和长时间的讨论,得出的结果往往是高度复杂的草案。你永远不应该把这些看作是最终的结果。 退一步:再看一眼大局(抽象层面)。还是有意义的吗?然后在抽象的层次上再进行一次重构。 有时,停止讨论并在第二天继续讨论会有帮助。至少我的大脑需要一些时间来处理和想出更好、更优雅和更简单的解决方案。 ③分而治之:把问题分成小块来简化。然后独立解决。然后验证这些小块是否匹配在一起。退一步看一下这个的整体情况。 ④重构不是坏事:如果找不到更好的主意,从更复杂的解决方案开始完全可以。如果解决方案遇到麻烦,您可以稍后重新考虑解决方案并应用您的学习。 重构不是邪恶的,但是在开始重构之前,请记住要进行以下工作: 进行足够的自动化测试,以确保系统的正确功能。 从利益相关者得到的支持。要了解有关重构的更多信息,建议阅读《重构 改进现有代码的设计》,作者是 Martin Fowler。 编码能力 即使作为一个企业级架构师,最抽象的架构层次,你仍然应该知道开发人员每天都在做什么。 如果你不明白这是怎么做到的,你可能会面临两大问题: 开发者不会接受你的嘴炮。 不了解开发人员的实践需求和面临的困难。 ①有一个辅助项目:这样做的目的是尝试新技术和工具,以了解当今和未来的开发方式。 经验是观察,情感和假设的结合(Kurt Schneider 的“软件工程中的经验和知识管理”)。 阅读教程或一些利弊是好的。但这仅仅是“书籍知识”。仅当你自己尝试事物时,才能体验到情绪并建立关于事物好坏的假设。 而且,使用某项技术的时间越长,你的评估就会越准确。这将帮助您在日常工作中做出更好的决定。 当我开始编程时,我没有代码完成,只有一些实用程序库可以加快开发速度。显然,在这种背景下,我今天会做出错误的决定。 今天,我们拥有大量的编程语言,框架,工具,过程和实践。只有您对主要趋势有一定的经验和粗略的了解,才能参与对话并引导开发朝正确的方向发展。 ②找到合适的东西去尝试:您无法尝试所有内容。这根本是不可能的。您需要一种更有条理的方法。 我最近发现的一种来源是 ThoughtWorks 的 Technology Radar。他们将技术,工具,平台,语言和框架分为四类:采用,试用,评估和保留。 通过这种分类,更容易获得新事物的概述及其准备情况,以更好地评估下一步要探索的趋势: 采用:已经准备好提供企业级服务。 试用:能够在一个承担一定风险的项目中尝试。 评估:还需进一步评估其对业务的影响。 保留:谨慎处理。 文档架构能力 架构文档有时更重要,有时则不重要。重要的文档例如体系结构决策或代码指南。 在开始编码之前通常需要初始文档,并且需要不断改进。其他文档可以自动生成,因为代码也可以是文档,例如 UML 类图。 ①代码整洁:如果做对的话,代码是最好的文档。一个好的架构师应该能够区分好的代码和坏的代码。 罗伯特·C·马丁(Robert C. Martin)所著的《代码整洁之道》一书是了解更多关于好坏代码的宝贵资源。 ②尽可能生成文档:系统变化很快,很难更新文档。无论是关于 API 还是以 CMDBs(配置管理数据库)形式出现的系统环境:底层信息通常变化太快,无法手动更新相应的文档。 例如:对于 API,如果您是模型驱动的,则可以基于定义文件自动生成文档,或者直接从源代码生成文档。有很多工具存在,比如 Swagger 和 RAML 是一些不错的初始选择。 ③必要而精简:无论您需要记录什么文件(例如决策文件),都应尝试一次只关注一件事,并且仅包含关于这件事的必要信息。大量的文档很难阅读和理解。附加信息应存储在附录中。 特别是对于决策文件,讲一个有说服力的故事而不是仅仅发表大量论据,更为重要。此外,这为您和您的同事节省了很多时间,而后者需要阅读。 看看您过去做过的一些文档(源代码,模型,决策文件等),然后问自己以下问题:“是否包含所有必要的信息才能理解它?”,“确实需要哪些信息,并且可以省略吗?”和“文档中是否有红线?”。 了解有关架构框架的更多信息: 该点也可以应用于所有其他“技术”点。我把它放在这里,是因为 TOGAF 或 Zachmann 之类的框架正在提供“工具”。 这些工具在文档站点上感觉很沉重,尽管它们的附加值并不限于文档。在这样的框架中获得认证可以教会您更系统地解决体系结构。 沟通能力 根据我的观察,这是最被低估的技能之一。如果你在设计上很聪明,但不能传达你的想法,你的想法可能会影响较小,甚至无法成功。 ①学习如何传达你的想法:在会议上进行协作时,知道如何正确的沟通传达你的想法,将其同步到你的同行是至关重要的。 我发现《 UZMO-用笔思考》是提高我在这一领域技能的好资源。作为架构师,你通常不仅会参加会议,而且通常需要主持并主导会议。 ②大型的演讲:将你的想法呈现给小型或大型团体应该对您来说可行。如果对此感到不舒服,请开始向你最好的朋友介绍。 慢慢扩大小组。这是你只能通过离开自己的舒适区来学习的东西。请耐心等待,此过程可能需要一些时间。 ③找到合适的沟通方式:不同的利益相关者有不同的利益和观点。它们需要在各自的层面上用不同的方式单独解决。 在你交流之前,退后一步,检查你想分享的信息是否有正确的层次,关于抽象性、内容、目标、动机等。 例如:开发人员通常对解决方案的非常小的细节感兴趣,而经理则更喜欢知道哪个选项能节省最多的钱。 ④经常沟通:如果没有人知道,再香的架构也是毫无意义的。定期在每个组织级别上分发目标体系结构及其背后的思想。 安排与开发人员、架构师和管理人员的会议,向他们展示所需或定义的方式。 ⑤透明:定期交流只能部分缓解缺少的透明度。您需要使决策背后的原因透明化。 特别是,如果人们不参与决策过程,则很难理解和遵循其背后的决策和理由。 ⑥随时准备发表演讲:总有人有疑问,你想马上给出正确的答案。尽量把最重要的幻灯片放在一个统一的集合里,你可以展示和解释。它为你节省了很多时间,也给你自己带来了安全感。 评估能力 ①了解基本项目管理原则:作为架构师或首席开发人员,您经常被要求估算实现您的想法:多长时间、多少人、哪些技能等。 当然,如果你计划引入新的工具或框架,你需要对这些“管理”问题有一个答案。最初,你应该能够给出一个粗略的估计,如天,月或年。 别忘了,它不仅仅是关于实现,还有更多的因素要考虑,比如需求管理、测试和 Bugfix。 因此,您应该了解所使用的软件开发过程中的工作。通过过去的使用数据,你可以得到更好的评估,并从中得出你的预测。 如果你没有过去的数据,你也可以尝试一些方法,如巴里 W 鲍姆的 COCOMO。 如果你被分配在一个敏捷项目中,学习如何正确地进行评估和计划:Mike Cohn 的《敏捷评估和计划》一书提供了这个领域的一个坚实的概述。 ②评估“未知”架构:作为架构师,您还应该能够评估体系结构对于当前或未来上下文的适用性。 这不是一项简单的任务,但是您可以通过手头的一组问题来准备,这些问题对于每个架构都是常见的。 它不仅关乎体系结构,还关乎系统的管理方式,因为这也让您了解了系统的质量。 我建议总是准备好一些问题并准备好使用。一般问题的一些想法: 设计实践:架构遵循哪些模式?它们是否得到正确使用?设计是否遵循红线或是否存在不受控制的增长?是否有明确的结构和关注点的分离? 开发实践:制定并遵守规范指南?代码的版本是怎样的?部署实践? 质量保证:测试自动化覆盖范围?静态代码分析到位且效果良好?同行评议到位? 安全性:有哪些安全概念?内置安全?渗透测试或自动安全分析工具到位并定期使用? 平衡能力 ①质量是有代价的:早些时候我谈到了质量和非功能性需求。如果过度使用架构,将会增加成本,并可能降低开发速度。你需要平衡架构和功能需求。应避免过度设计。 ②解决矛盾目标:矛盾目标的典型例子是短期和长期目标。项目往往倾向于构建最简单的解决方案,而架构师考虑的是长期的远景。 通常,简单的解决方案不适合长期的解决方案,并且有可能在以后被丢弃(沉没成本)。 为了避免实施方向错误,需要考虑两件事: 开发人员和业务部门需要了解长期愿景及其好处,以便调整其解决方案。 负责预算的经理需要参与进来,以了解财务影响。不一定要把 100% 的长远眼光直接放在适当的位置,但开发出来的成本大体在预算范围内。 ③冲突管理:架构师往往是不同背景的多个群体之间的粘合剂。这可能会导致不同层次的沟通冲突。 为了找到一个平衡的解决方案,同时也反映长期的战略目标,架构师的角色往往是帮助克服冲突。 关于传播理论的起点是舒尔茨·冯·图恩的“四耳模型”。基于此模型,可以显示并推论很多。但是,该理论需要一些实践,在交流研讨会上应该有经验。 指导、答疑能力 在咨询和辅导方面,积极主动可能是最好的选择。如果有人问你,那就太晚了。架构重构是尽量要避免的。 你需要以某种方式预见未来几周、几个月甚至几年,并为下一步做好准备: ①有远见:如果你参与在一个项目中,无论是传统的瀑布式方法还是敏捷方法,你始终需要对要实现的中长期目标有一个愿景。 这不是一个详细的概念,而是针对每个人都可以落地的路线图。由于无法一次完成所有工作(这是一段旅程),因此我更喜欢使用成熟度模型。 它们给出了易于使用的清晰结构,并且每次都给出了当前的进度状态。对于不同的方面,我使用不同的模型,例如开发实践或持续交付。 成熟度模型中的每个级别都有明确的要求,这些要求遵循 SMART 准则,以便轻松衡量是否已达到要求。我发现一个很好的例子是持续交付。 ②建立实践社区(CoP):在一个共同兴趣小组之间交流经验和知识有助于分发思想和标准化方法。 例如,你可以每三个月左右将所有 JavaScript 开发人员和架构师聚集在一个房间中,讨论过去和当前的挑战以及如何解决它们或采用新的方法论和方法。架构师可以共享,讨论和调整其愿景,开发人员可以共享经验并向同行学习。 这样的交流不仅可以为企业带来极大的好处,而且对个人本身也非常有利,因为它有助于建立更强大的网络并传播思想。 还可以查看 SAFe 框架中的文章实践社区,该文章在敏捷环境中解释了 CoP 概念。 ③进行公开会议:误解或模棱两可的一个原因是缺乏沟通。在固定的时间段内,例如每周 30 分钟,与同事交流热门话题。 这次会议没有议程,一切都可以讨论。尽量当场解决小事。安排对更复杂主题的跟进。 云栖号:https://yqh.aliyun.com第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策! 原文发布时间:2020-02-08本文作者:Justin Miller本文来自:“51CTO技术栈公众号”,了解相关信息可以关注“51CTO技术栈”

优秀的个人博客,低调大师

零代码一分钟创建 HTTP 服务(入门)

一、背景 如果你想快速搭建一个 HTTP 服务来测试,以往可能需要用 Java/Node.js 等语言写个脚本部署到服务器上,但现在你多了一种完全无需写代码方案:阿里云逻辑编排。 借助逻辑编排,不要一行代码不到一分钟就可以实现 HTTP 服务。 二、实现 2.1 创建编排实例 首先进入逻辑编排控制台 https://lc.console.aliyun.com/flow,点击 “创建编排实例”: 2.2 图形化设计 创建成功后,会有个弹窗提示是否使用模板,默认不使用,我们也不需要使用,点击“确定” 直接进入到实例的图形化设计界面。 我们先不管这么多概念,直接操作。 2.2.1 接收 HTTP 请求 点击 “当收到 HTTP 请求时”,会进入下图的界面: 可以看到有几个属性: HTTP Endpointe:就是 HTTP 服务的 URL,保存后会自动生成。而我们自己编程实现 HTTP 服务,则需要我们自己绑定域名到部署代码的服务器上; Method:就是通过 GET 或 POST 方法来请求该 HTTP 服务 请求正文 JSON Schema:非必填项,先不管它 现在我们就使用默认配置,继续往下。 2.2.2 设置 “HTTP 响应” 前面的操作,就相当于创建了 HTTP 服务器,能够接收 HTTP 请求。接下来就需要设置 HTTP 响应了。 跟着下面的动图点几下鼠标,在 “响应” 页面设置 Body 为你想返回的值, 这里是 hello world。 设置完成后点击右上角的 “保存”,保存后我们的 HTTP 服务就创建好了。这个时候再点击 “当收到 HTTP 请求时”,展开后就能看到我们的 HTTP 服务的地址了。 2.2.3 运行 接下来就可以使用我们创建的 HTTP 服务了。复制 HTTP Ednpoint,粘贴到浏览器中访问,就可以看到正确返回了 hello world: 另外,我们可以点击右上角的 “运行” 按钮来模拟访问刚创建的 HTTP 服务: 2.2.4 日志 我们还可以在看到该 HTTP 服务的所有访问日志,看到访问的时间和耗时等信息: 三、总结 通过上述实践,可以发现使用逻辑编排创建 HTTP 服务真的非常简单迅速,完全用不到一分钟。 当然,你可能会说,我的需求可没那么简单,我想要传入复杂的参数,还想要根据参数动态返回数据,逻辑编排能实现吗? 完全没问题!如何实现且听下回分解。 附 逻辑编排正在公测中,欢迎大家体验。如有任何问题,可以直接在钉钉群和我们联系。 逻辑编排 https://www.aliyun.com/product/logiccomposer 逻辑编排钉钉群号:21995282

优秀的个人博客,低调大师

零代码一分钟创建 HTTP 服务(一)

一、背景 如果你想快速搭建一个 HTTP 服务来测试,以往可能需要用 Java/Node.js 等语言写个脚本部署到服务器上,但现在你多了一种完全无需写代码方案:阿里云逻辑编排。 借助逻辑编排,不要一行代码不到一分钟就可以实现 HTTP 服务。 二、实现 2.1 创建编排实例 首先进入逻辑编排控制台 https://lc.console.aliyun.com/flow,点击 “创建编排实例”: 2.2 图形化设计 创建成功后,会有个弹窗提示是否使用模板,默认不使用,我们也不需要使用,点击“确定” 直接进入到实例的图形化设计界面。 我们先不管这么多概念,直接操作。 2.2.1 接收 HTTP 请求 点击 “当收到 HTTP 请求时”,会进入下图的界面: 可以看到有几个属性: HTTP Endpointe:就是 HTTP 服务的 URL,保存后会自动生成。而我们自己编程实现 HTTP 服务,则需要我们自己绑定域名到部署代码的服务器上; Method:就是通过 GET 或 POST 方法来请求该 HTTP 服务 请求正文 JSON Schema:非必填项,先不管它 现在我们就使用默认配置,继续往下。 2.2.2 设置 “HTTP 响应” 前面的操作,就相当于创建了 HTTP 服务器,能够接收 HTTP 请求。接下来就需要设置 HTTP 响应了。 跟着下面的动图点几下鼠标,在 “响应” 页面设置 Body 为你想返回的值, 这里是 hello world。 设置完成后点击右上角的 “保存”,保存后我们的 HTTP 服务就创建好了。这个时候再点击 “当收到 HTTP 请求时”,展开后就能看到我们的 HTTP 服务的地址了。 2.2.3 运行 接下来就可以使用我们创建的 HTTP 服务了。复制 HTTP Ednpoint,粘贴到浏览器中访问,就可以看到正确返回了 hello world: 另外,我们可以点击右上角的 “运行” 按钮来模拟访问刚创建的 HTTP 服务: 2.2.4 日志 我们还可以在看到该 HTTP 服务的所有访问日志,看到访问的时间和耗时等信息: 三、总结 通过上述实践,可以发现使用逻辑编排创建 HTTP 服务真的非常简单迅速,完全用不到一分钟。 当然,你可能会说,我的需求可没那么简单,我想要传入复杂的参数,还想要根据参数动态返回数据,逻辑编排能实现吗? 完全没问题!如何实现且听下回分解。 附 逻辑编排正在公测中,欢迎大家体验。如有任何问题,可以直接在钉钉群和我们联系。 逻辑编排 https://www.aliyun.com/product/logiccomposer 逻辑编排钉钉群号:21995282

优秀的个人博客,低调大师

码云推荐 | 微信读书开源的跨平台 UI 开发框架 QMUI

QMUI 是腾讯微信读书开发团队开源的一套致力于提高项目 UI 开发效率的跨平台解决方案,项目有iOS、Android 与 Web 三端支持。 QMUI Web QMUI Web 是一个专注 Web UI 开发,帮助开发者快速实现特定的一整套设计的框架。框架主要由一个强大的 SASS 方法合集与内置的工作流构成。通过 QMUI Web,开发者可以很轻松地提高 Web UI 开发的效率,同时保持了项目的高可维护性与稳健。如果你需要方便地控制项目的整体样式,或者需要应对频繁的界面变动,那么 QMUI Web 框架将会是你最好的解决方案。 它具有以下特性: 基础配置与组件。通过内置的公共组件和对应的 SASS 配置表,你只需修改简单的配置即可快速实现所需样式的组件。 SASS 增强支持。包含 70 个 SASS mixin/function/extend,涉及布局、外观、动画、设备适配、数值计算以及 SASS 原生能力增强等多个方面,可以大幅提升开发效率。 完善的内置工作流。内置的工作流拥有从初始化项目到变更文件的各种自动化处理,包含了模板引擎,雪碧图处理,图片集中管理与自动压缩,静态资源合并、压缩与变更以及冗余文件清理等功能。 扩展组件。除了内置的公共组件外,还通过扩展的方式提供了常用的扩展组件,如等高左右双栏,文件上传按钮,树状选择菜单。 QMUI Android​​​​​​​ QMUI Android 的设计目的是用于辅助快速搭建一个具备基本设计还原效果的 Android 项目,同时利用自身提供的丰富控件及兼容处理,让开发者能专注于业务需求而无需耗费精力在基础代码的设计上。不管是新项目的创建,或是已有项目的维护,均可使开发效率和项目质量得到大幅度提升。 特性包括: 全局 UI 配置。只需要修改一份配置表就可以调整 App 的全局样式,包括组件颜色、导航栏、对话框、列表等。一处修改,全局生效。 丰富的 UI 控件。提供丰富常用的 UI 控件,例如 BottomSheet、Tab、圆角 ImageView、下拉刷新等,使用方便灵活,并且支持自定义控件的样式。 高效的工具方法。提供高效的工具方法,包括设备信息、屏幕信息、键盘管理、状态栏管理等,可以解决各种常见场景并大幅度提升开发效率。 QMUI iOS QMUI iOS 与 QMUI Android 出发点一致,都是辅助开发者完成移动 UI 开发。除了拥有前边提到的 QMUI Android 功能特性外,它还支持UIKit 拓展及版本兼容:拓展多个 UIKit 的组件,提供更加丰富的特性和功能,提高开发效率;解决不同 iOS 版本常见的兼容性问题。 项目详情可以查看主页: https://gitee.com/QMUI

优秀的个人博客,低调大师

码云 GVP 项目 SequoiaDB 完成 C 轮数千万美元融资

业界领先的金融级分布式数据库公司,巨杉数据库近日宣布完成由嘉实投资领投的C轮融资。本轮的领投方为嘉实投资,启明创投与DCM作为早期投资方跟投。 SequoiaDB巨杉数据库成立6年来一直坚持技术驱动产品,专注打造金融级分布式数据库,成为中国首次入选Gartner数据库报告的数据库厂商。目前,巨杉数据库付费企业级客户与社区用户总数超过1000家,并已在超过50家500强级别的银行、保险、证券等大型金融机构核心生产业务上线。 本轮投资方,嘉实投资管理公司CEO 仇小川表示:“巨杉数据库与阿里云成为首次入选Gartner数据库报告的中国数据库厂商,巨杉数据库的技术领先性、金融级稳定性、安全性以及产品市场成熟度再次得到了行业的高度认可。我们相信巨杉数据库的核心技术、创新能力与团队的高效执行力,将使其成为中国最具发展潜力的科技企业之一。” 巨杉数据库的B轮投资方,DCM合伙人曾振宇表示:“数据库产品是很难一两年内‘一蹴而就’的,巨杉数据库在6年的时间里,坚持从零开始打造分布式数据库内核引擎,得到了业界和市场的一致认可。我们也希望巨杉数据库未来能继续回馈技术社区,搭建开源技术生态,共同促进我国开源与基础软件技术的发展。” 巨杉数据库的A轮投资方,启明创投合伙人叶冠泰认为:“大型商业银行客户是企业级软件的试金石,巨杉的金融级数据库产品已经在技术要求最严苛、市场需求最大的银行业得到广泛认可和大规模使用,这体现了数据库产品的最高标准。我们十分看好巨杉未来的市场前景。” 巨杉数据库的天使投资方,CSDN与极客帮创始人蒋涛表示:“巨杉数据库采用和AWS Aurora同样的计算-存储分离架构,这是分布式云数据库当前的主流架构。 同时,我们与Gartner共同认为,巨杉数据库的Multimodel多模数据引擎,是云数据库趋势下分布式数据库发展的主流方向。” 巨杉数据库联合创始人王涛表示:“巨杉数据库产品已经实现分布式交易型数据库、分布式对象存储平台、超高性能分布式数据库以及云数据库四大维度全覆盖。巨杉数据库进入 ‘3.0时代’以来,进一步增强金融级分布式OLTP场景的支持,通过适应云数据库的架构,实现了MySQL/PostgreSQL的完整语法与协议兼容。” 此次融资,巨杉将持续投入核心研发与技术创新,立足于金融行业覆盖其他垂直领域市场,拓展更多企业级应用场景,加速国际化步伐,将巨杉数据库打造成为世界级的分布式数据库产品。

优秀的个人博客,低调大师

Android第七期 - 二维码扫描与生成图

首先是MainActivity.java部分: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 package com.qrcode; import com.google.zxing.WriterException; import com.zxing.activity.CaptureActivity; import com.zxing.encoding.EncodingHandler; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity{ private TextViewresultTextView; private EditTextqrStrEditText; private ImageViewqrImgImageView; @Override public void onCreate(BundlesavedInstanceState){ super .onCreate(savedInstanceState); setContentView(R.layout.main); resultTextView=(TextView) this .findViewById(R.id.tv_scan_result); qrStrEditText=(EditText) this .findViewById(R.id.et_qr_string); qrImgImageView=(ImageView) this .findViewById(R.id.iv_qr_image); ButtonscanBarCodeButton=(Button) this .findViewById(R.id.btn_scan_barcode); scanBarCodeButton.setOnClickListener( new OnClickListener(){ @Override public void onClick(Viewv){ IntentopenCameraIntent= new Intent(MainActivity. this ,CaptureActivity. class ); startActivityForResult(openCameraIntent, 0 ); } }); ButtongenerateQRCodeButton=(Button) this .findViewById(R.id.btn_add_qrcode); generateQRCodeButton.setOnClickListener( new OnClickListener(){ @Override public void onClick(Viewv){ try { StringcontentString=qrStrEditText.getText().toString(); if (!contentString.equals( "" )){ BitmapqrCodeBitmap=EncodingHandler.createQRCode(contentString, 350 ); qrImgImageView.setImageBitmap(qrCodeBitmap); } else { Toast.makeText(MainActivity. this , "Textcannotbeempty" ,Toast.LENGTH_SHORT).show(); } } catch (WriterExceptione){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }); } @Override protected void onActivityResult( int requestCode, int resultCode,Intentdata){ super .onActivityResult(requestCode,resultCode,data); if (resultCode==RESULT_OK){ Bundlebundle=data.getExtras(); StringscanResult=bundle.getString( "result" ); resultTextView.setText(scanResult); } } } 下面就是构成拍摄页面的部分由于很多都是继承的代码,这里我就不粘贴了,给大家一个图看一下,下面放出整理后的代码。 最后别忘了给权限部分: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <? xml version = "1.0" encoding = "utf-8" ?> < manifest xmlns:android = "http://schemas.android.com/apk/res/android" package = "com.qrcode" android:versionCode = "1" android:versionName = "1.0" > < uses-sdk android:minSdkVersion = "7" /> < uses-permission android:name = "android.permission.VIBRATE" /> <!--震动权限--> < uses-permission android:name = "android.permission.CAMERA" /> < uses-feature android:name = "android.hardware.camera" /> <!--使用照相机权限--> < uses-feature android:name = "android.hardware.camera.autofocus" /> <!--自动聚焦权限--> < application android:icon = "@drawable/icon" android:label = "@string/app_name" > < activity android:name = ".MainActivity" android:label = "@string/app_name" > < intent-filter > < action android:name = "android.intent.action.MAIN" /> < category android:name = "android.intent.category.LAUNCHER" /> </ intent-filter > </ activity > <!--隐藏键盘--> <!--全屏--> < activity android:configChanges = "orientation|keyboardHidden" android:name = "com.zxing.activity.CaptureActivity" android:screenOrientation = "portrait" android:theme = "@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode = "stateAlwaysHidden" > </ activity > </ application > </ manifest > 效果图: 附件:http://down.51cto.com/data/2364587 本文转自 吴雨声 51CTO博客,原文链接:http://blog.51cto.com/liangxiao/1432467,如需转载请自行联系原作者

优秀的个人博客,低调大师

短信验证码未必可靠

匆匆忙忙,11月又过去了。这个月里,我们经历了轰动全球的“麦芽地事件”,看到酷派手机云端安全的隐患,当然还有更多…… 一、麦芽地事件暴露Mac、iOS安全缺陷 月初曝光、延续了半月、最终以站长被抓的“麦芽地事件”,现在已无人提及,不过它的影响还在继续。 现在复盘来看,这件事情其实很简单。作为一家Mac应用分享网站,麦芽地却涉及制造木马并捆绑到正常应用。用户在麦芽地下载应用安装后,木马就会感染电脑。不过木马的最终对象不是Mac,而是连上Mac的iOS设备,它会后台启动并盗取iOS的各类参数信息并安装应用,如果这台iOS已经越狱,木马还能盗取更多信息。 漏洞曝光几天内,苹果更新企业证书信息封堵了感染途径。但大家很容易看出,如果用户还在第三方网站下载安装应用,安全性上始终存疑。换句话说,如果你硬要用第三方来源安装应用,那么得多上心了,目前

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册