关于插件:极光笔记-大语言模型插件

在人工智能畛域,大语言模型(LLMs)是依据预训练数据集进行”学习“,获取能够拟合后果的参数,尽管随着参数的减少,模型的性能也会随之加强。但无论业余畛域的小模型,还是当下最火、成果最好的大模型,都有一个独特的劣势:无奈精确/正确地答复出训练数据集以外(区别于验证集和测试集的新增数据,如实时新闻、未公开的企业信息等)的后果,进而假造答案进行回复,即大模型幻觉问题。 为了解决上述问题,同时防止微调/从新训练带来的老本,LLMs插件应运而生。通过LLMs弱小的内容生成能力和上下文理解能力,联合插件提供的数据以及特定性能,不仅拓宽了LLMs的应用领域,还减少了LLMs生成后果的可信度,更好地服务于使用者。 1 插件插件是一种软件组件,它能够被增加到一个次要的应用程序或零碎中,以扩大其性能或提供额定的个性。插件通常被设计成可独立装置和卸载,并且能够与主应用程序进行交互。插件的性能取决于所利用的畛域和具体的应用程序,在AIGC疾速倒退的明天,大语言模型插件异军突起,扭转了插件存在的状态,这也是本篇文章重点的钻研对象。联合以后大语言模型插件的倒退,插件分类如下: 1.1 传统插件传统插件(Plug-in,又称addin、add-in、addon或add-on,又译外挂)是一种遵循肯定标准的利用程序接口编写进去的程序。其只能运行在程序规定的零碎平台下(可能同时反对多个平台),而不能脱离指定的平台独自运行,即插件的运行依赖于宿主软件,无差别地启用或禁用插件性能。传统插件可分为浏览器插件和客户端软件插件,传统插件的存在状态如下图所示。 1.2 大语言模型插件大语言模型插件是随着大语言模型倒退而诞生的全新插件。 大语言模型插件的外围是Web API,独立于大语言模型,插件开发过程不受大语言模型的束缚,同时没有开发语言的限度,更加通用,只有Web API遵循RESTful相干规定即可。只是在为大语言模型配置插件时遵循配置规定,如原生ChatGPT插件配置遵循OpenAPI格局以及增加相干形容。大语言模型与插件是绝对独立的两个局部,大语言模型与插件关系示意如下图所示。大语言模型是插件的选择器,按需应用插件性能,即只有当用户提供的问题或数据满足插件调用条件时,才会调用插件,不是无差别地应用插件性能,大语言模型插件的工作流程如下图所示。 2 ChatGPT插件目前最弱小的商用大语言模型莫过于OpenAI的大语言模型ChatGPT-3.5/4.0,均反对插件性能(前面对立应用ChatGPT),并且对反对开发者凋谢了插件开发入口,开发者能够基于本身需要开发Web API作为ChatGPT插件。然而,ChatGPT创立插件的过程比拟繁琐,上面以GPTBots插件创立过程作为比照,两者插件创立过程如下图所示(左:ChatGPT创立插件;右:GPTBots创立插件)。 3 GPTBots插件咱们不一样!GPTBots插件利用的技术路线不同于ChatGPT,GPTBots插件交融了ChatGPT插件创立标准(通用的OpenAPI标准)和函数调用性能,这样做有如下劣势: 开发者只需专一于本身性能接口开发,无需开发额定的接口插件配置遵循OpenAPI标准,开发者能够间接复用面向ChatGPT Web 的插件,一键公布插件至GPTBotsGPTBots插件主动兼容市面上支流已反对插件能力的LLM,开发者无需再去适配每个LLM3.1 创立插件通过下面插件创立过程比照,咱们晓得,应用GPTBots插件只需四步:开发插件接口、新建插件、配置插件鉴权、增加合乎OpenAPI标准的接口配置,其余的交给GPTBots。(1)开发插件接口这里与ChatGPT原生形式雷同,须要开发者自行开发插件接口,然而,在GPTBots中不须要开发者另行开发插件清单接口、插件接口配置信息接口、插件Logo接口,只须要开发者专一于插件性能接口开发。(2)新建插件GPTBots新建插件入口如下图。(3)配置插件鉴权GPTBots插件提供三种鉴权形式,即不鉴权(None)、Basic鉴权和Bearer鉴权,配置过程如下图。(4)增加合乎OpenAPI标准的接口配置实现上述筹备工作,最初为插件配置接口规定,即开发者的性能接口,GPTBots采纳的接口规定遵循OpenAPI标准,配置阐明如下图。实现插件创立后,能够在“我的插件”中看到已创立胜利的插件,同时,GPTBots提供了插件一键公布性能,行将插件公布到插件市场,供其余开发者应用。综上,GPTBots插件最大水平简化了用户创立和应用插件的流程,极大升高了插件应用门槛。 3.2 插件利用GPTBots不仅创立插件流程非常简单、对开发者十分敌对,应用起来也十分棘手。应用插件前,咱们须要为Bot增加插件。以高德天气插件为例,为“天气小精灵”Bot增加插件过程如下:当咱们为“天气小精灵”Bot增加天气插件和搜寻插件后,当问题中呈现天气和实时信息相干问题时,插件会被动承当内容生产的责任,实测成果如下: 3.3 插件市场GPTBots官网为宽广开发者和用户提供了泛滥实用的插件,如PDF生成插件、天气插件和搜寻插件等等,GPTBots局部插件如下: 4 思考与瞻望插件在理论业务利用中,因为LLM每次调用token是有下限的,而插件也不可避免的占用token,这样就导致无奈在一次申请调用中提供多个插件备用。或者一个插件协定如果过于简单,可能导致间接调用失败。 GPTBots平台为了更好解决此类问题,推出了Flow性能。开发者能够在不同的步骤编排多个LLM参加业务解决,每个LLM 能够最多增加3 个插件,这样就很好的解决了插件应用限度的问题,同时通过缩小申请上下文内容长度让LLM更加专一,从而晋升插件调用成功率。 LLMs插件区别于传统插件,它独立、灵便、自在、功能强大,大语言模型插件的外围是Web API,因而大语言模型插件齐全拥抱互联网,同时,没有开发语言“歧视”,无论开发者的语言栈是Python、Java、Go、PHP等,只有能够开发HTTP协定接口,遵循RESTful规定,就能够构建大语言模型插件,置信将来大语言模型插件品种会越来越丰盛,性能越来越弱小。绝对于ChatGPT繁琐的插件创立流程,GPTBots平台简化了插件创立流程,简略、易用、好用,进步插件开发者效率,升高开发者学习老本,将来肯定会有越来越多的开发者抉择GPTBots平台。

September 20, 2023 · 1 min · jiezi

关于插件:华为云classroom赋能面向高校学生的Toolkit系列实践培训

Clasrroom培训课程系列ToolKit的专题培训 Clasrroom蕴含试验系列Toolkit语音合成试验 Toolkit系列培训课程简介什么是Toolkit?Huawei Cloud Toolkit中文名是华为云开发者插件,是基于华为云现有能力的一系列插件汇合,简略来说就是把华为云的能力带到每个开发者的桌面,使开发者在IDE通过插件的能力连贯华为云。华为云开发者系列插件是收费的,同时反对当下的多个IDE平台:包含IntelliJ系列、VSCode、以及华为自研CodeArts IDE。 IntelliJ IDEA等平台装置筹备:下载并装置JDK1.8或更高版本。下载并装置IntelliJ IDEA 2020.2或更高版本。 须知:IntellIj平台同时撑持包含Goland、Pycharm等在内的IDE,若在其它相干IDE上开发,请下载配置好对应语言的编译器或者解释器。这里以IDEA为例介绍IntelliJ平台插件的装置流程,其余IntelliJ系列的IDE请参考IDEA。 开始装置: 您能够在间接在IDE插件市场或者间接在JetBrains插件市场下载离线包装置。 IDE装置 在IntelliJ IDEA顶部菜单栏中抉择File > Settings,在Settings对话框的左侧导航栏中单击Plugins。Plugins区域单击Marketplace,在搜寻栏中输出Huawei Cloud API。Search Results区域会呈现Huawei Cloud API,单击Install,实现后重启IDE。 离线包装置: 进入插件市场搜寻Huawei Cloud API,进入插件详情页,在Versions页签下抉择想要版本的API插件,点击Download下载离线的插件压缩包保留到本地。。在IntelliJ IDEA顶部菜单栏中抉择File > Settings,在Settings对话框的左侧导航栏中单击Plugins。在Plugins区域单击 ,再单击Install Plugin from Disk...。在Choose Plugin File对话框中抉择离线安装包(不必解压),并依照IntelliJ IDEA装置页面的提醒,实现后续装置步骤。 阐明:若以后您想要装置插件的IntelliJ IDE曾经在桌面关上,则进入插件市场搜寻Huawei Cloud API,进入插件详情页,在右上角会辨认到本地曾经关上的IDE,点击相应按钮,在弹出的IDE窗口中点击ok,则IDE后盾会开始装置相应版本的API插件。 装置验证:在IntelliJ系列平台上装置插件胜利后在左侧的导航栏中能够看到Huawei Cloud Toolkit图标,点击后面板会呈现Huawei Cloud API的字样,则阐明装置胜利。 API列表 欢迎您应用Classroom失去更多技术晋升https://classroom.devcloud.huaweicloud.com/joinclass/685e2e94... 体验插件的魅力华为云devkit已上线:https://developer.huaweicloud.com/develop/toolkit.html

September 12, 2023 · 1 min · jiezi

关于插件:版本升级-6天1个人兼容CECIDE

OpenSCA插件上新啦~Jetbrains IDE插件全新降级,很多敌人提了需要的VSCode咱也反对上啦~当然,CEC-IDE也是兼容的(手动狗头)。 OpenSCA-VSCode-plugin v1.0.0插件概述OpenSCA VSCode插件能够检测以后我的项目中的开源危险,并在可视化界面中展现后果。(反对1.80.0及以上版本) 应用阐明获取插件在适配的VSCode中通过插件市场装置OpenSCA插件。 执行检测通过Setting对插件进行配置,反对近程/本地数据源,可选获取最新版本cli或应用本地已有cli。 如应用云破绽库服务,反对疾速受权或手动输出token。 实现配置后点击Run执行检测。检测后果反对以JSON报告格局输入。 OpenSCA-intellij-pliugin v1.0.3更新内容疾速受权可配置近程/本地数据源适配不同版本OpenSCA-cli反对检测后果筛选及报告导出PS:OpenSCA插件以后反对 2020.3 - 2023.2 全系 IDE更新阐明疾速受权优化了与云破绽库服务的连贯配置计划;以后版本点击Quick Authentication间接跳转至OpenSCA官网受权页面,点击进行受权后即可主动填充Url、Token。 可选近程/本地数据源反对按需自主抉择及配置近程数据源(可选OpenSCA项目组提供的云破绽库:https://opensca.xmirror.cn)或本地数据源(本地破绽库)。 适配不同版本OpenSCA-cli反对间接应用最新版本cli或已有cli,可通过插件界面下载、更新、切换cli工具。 反对检测后果筛选及报告导出IDEA界面新增目录开展、收起按钮;还能够通过按钮依据组件危险等级筛选对应组件。 一键导出JSON后果报告。 以上就是本次更新的残缺内容啦~ 共建开源我的项目感激每一位开源社区成员对OpenSCA的反对和奉献。OpenSCA的代码会在GitHub和Gitee继续迭代,欢送Star和Fork,也欢送向咱们提交ISSUE和PR,参加咱们的开源平安共建打算,与社区成员独特建设充斥可能性的开源解决方案。

September 4, 2023 · 1 min · jiezi

关于插件:提升网页阅读体验的三款优秀大纲插件2023

浏览长篇文章或简单网页时,清晰的纲要构造能够帮忙咱们更好地了解和组织信息。在这篇博客中,我将向大家举荐三款优良的网页纲要插件,帮忙您晋升浏览效率和体验。 Flash OutlineFlash Switcher 是一个专一于进步浏览器应用效率和体验的综合插件,其最新的智能纲要性能专门为进步网页浏览体验而设计,对于长篇文章或简单网页,它能够智能提取题目和构造,生成纲要,疾速预览和导航,帮忙咱们更好地了解和组织信息。 除了功能强大,UI也很简洁敌对,暗黑模式既酷炫,也很实用的,能够很好的和文章主体辨别开来。 OutlinerOutliner 通过提取页面中的所有题目来生成目录。 互联网上的许多页面没有设计良好的页内导航器。Outliner 能够为您提供帮忙。 HTML5 Outliner此扩大应用 HTML5 纲要算法来创立目录。还应该实用于具备结构化题目的 HTML4(以及更旧的?)页面。目录是可点击的,并在跳转后尝试突出显示有问题的题目/局部。 对于常常应用在线 HTML5 纲要工具的人来说,该扩大应该很有用。 这三款优良的网页纲要插件都为咱们提供了更好的浏览体验和信息组织能力。无论是通过主动生成纲要、提取题目和构造,还是通过创立工作区来整顿网页,它们都能够帮忙咱们更高效地浏览和了解网页内容。依据集体需要抉择适宜本人的插件,将为您带来更加愉悦和高效的网页浏览体验。

July 1, 2023 · 1 min · jiezi

关于插件:支持导入-Eolink-插件别小看这个开源-API-管理工具了

Postcat 有多达 30 款反对数据迁徙、主题、API 平安等方面的插件。 导入 Eolink 插件。应用导入性能有多个入口,你能够在 API 分组处点击加号导入 API: 也能够换种形式,在首页里导入Eolink 如果你日常会用到 api 管理工具的话,无妨看看我目前参加的这个开源我的项目,Postcat 开源的 API 管理工具,纯国产,收费的,主打插件生态,适宜中小团队以及集体开发者应用,有 API 相干的外围性能。 目前在 Github 上 3.7 k star,如果你感觉这个我的项目还不错的话,无妨点个 Star 反对一下~ Github: https://github.com/Postcatlab/postcat Postcat 外围性能:API 文档治理:可视化 API 设计,生成 API 文档API 测试:主动生成测试参数,主动生成测试用例,可视化数据编辑插件拓展:泛滥插件扩大产品性能,打造属于你和团队的 API 开发平台Mock:依据文档主动生成 Mock,或创立自定义 Mock 满足简单场景团队合作:既能实现 API 分享也能能够创立云空间独特合作

May 26, 2023 · 1 min · jiezi

关于插件:什么是插件

插件是一种可定制的程序,它能够为浏览器或应用程序减少新的性能,但在应用插件时也须要留神一些细节。上面是值得注意的10个关键点:简洁是王道:尽管插件能够提供各种有用的性能,然而过多的插件会升高浏览器或应用程序的性能和响应速度。因而,在装置插件时要思考本人是否真正须要这个插件,并且只抉择必须的性能。及时更新插件:大多数插件都须要常常更新以确保它们的最新版本与浏览器或应用程序兼容,同时修复可能存在的破绽和谬误。因而,您应该常常查看插件并确保其更新到了最新版本。删除未应用的插件:未应用的插件只会占用贵重的系统资源。因而,如果不再须要某个插件,请及时将其删除以开释内存和空间。插件应该服务于特定目标:每个插件都应该被设计来实现特定的指标。因而,在抉择和装置插件之前,请先确定您所需的性能,以便无效解决问题。防止重叠插件:屡次装置雷同或相似的插件会导致不必要的浏览器或应用程序累赘,因而请尽量避免装置性能重叠的插件。应用可信插件:只抉择您信赖的起源,并确保插件是由受信赖的供应商开发的。这样能够最大限度地缩小恶意软件或病毒的危险,并爱护您的个人信息和隐衷。求教信赖的人:如果您不确定某个插件是否平安或牢靠,请询问您信赖的人。他们可能能够为您提供无益的倡议并指出最佳的插件抉择。思考编写本人的插件性能:对于某些性能,您无需装置特定的插件,而是能够通过简略地编写脚本或应用小型工具来实现它们。确认插件是否导致网站复工:如果某个网站不起作用或无响应,请查看您是否已装置与该网站相干的插件。可能须要删除某些插件能力使网站失常运行。应用必备插件:即便是经验丰富的用户也应该装置一些必备的插件,例如广告拦截器、反间谍软件、明码管理器和杀毒软件等

April 26, 2023 · 1 min · jiezi

关于插件:OpenSumi-CLI-正式发布插件文档上新内容一览

在 OpenSumi 中,咱们提供了一个弱小的插件生态系统,在兼容 VS Code 插件 API 的同时,咱们也有着本人的 OpenSumi API 用于进一步拓展 IDE 界面及能力。 ▲插件能力实现结构图 开发 VS Code 插件 在插件开发中,你能够遵循 VS Code 的开发模式,在 VS Code 内实现你的插件开发后,将实现的插件产物引入到基于 OpenSumi 搭建的 IDE 中应用,具体可参考 VS Code 插件文档 Extension Guides。 上面是一些罕用的示例及文档: eclipse-theia/vscode-builtin-extensions —— 基于 VS Code 版本打包其内置插件的工程项目microsoft/vscode-extension-samples —— VS Code 官网的插件 API 示例仓库Extension Guides —— VS Code 插件开发向导文档Your First Extension —— 疾速开始插件开发Web Extensions —— 在 OpenSumi 中也反对了这类插件,在纯前端环境有着非常重要的作用开发 OpenSumi 插件 OpenSumi 中存在着一部分仅能运行在基于 OpenSumi 开发的 IDE 之中,提供的能力包含但不限于: 通过 React 技术栈进行视图的拓展定制Toolbar 定制Electron Webview 治理布局能力全视图的自定义渲染一个残缺的 OpenSumi 插件目录构造如下: ...

April 24, 2023 · 2 min · jiezi

关于插件:Chrome高效插件推荐

Chrome浏览器是目前世界上最受欢迎的浏览器之一,而Chrome的高效插件也是许多人的关注焦点。这篇文章将介绍一些能够帮忙您在办公和学习中提高效率的Chrome插件。 Smart Toc 智能目录显示任何网站的目录,使浏览和浏览长篇文章、文档和在线书籍更加容易。 Flash Switcher 闪电切换器【指标】:Keep And Search Everything Import In A Second , Just Like A Brain 像大脑(神经元)一样,几秒内实现保留(记忆)和搜寻所有重要的信息(链接/地址)。【以补救碎片记忆的易失性】 Flash Switcher 是一个专一于进步浏览器操作效率、体验的工具,聚焦最罕用的多选项卡 Tab 切换、千级甚至万级书签检索、以及海量的搜寻历史,践行【当初有用的,未来大概率有用的】理念,实现任意数量 Tab、书签、历史的常数级、沉迷式操作,晋升效率,节俭海量的毛细工夫。 Grammarly 语法助手作为一款语法查看工具,Grammarly能够在您在写作时帮忙您找出拼写错误和语法问题。它不仅能够查看英语语言,而且还能够查看您的中文语法。无论是在学习中还是在工作中,这款插件都能够帮忙您疾速精确地进行写作。 总结总的来说,Chrome浏览器是一款十分弱小的工具,而这些高效插件能够帮忙您在办公和学习中提高效率。无论您须要改善写作、整顿标签页、放弃专一还是限度工夫,这些插件都能够帮忙您更好地实现工作。

April 17, 2023 · 1 min · jiezi

关于插件:可插拔组件设计机制SPI

作者:京东物流 孔祥东1.SPI 是什么?SPI 的全称是Service Provider Interface,即提供服务接口;是一种服务发现机制,SPI 的实质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类。这样能够在运行时,动静为接口替换实现类。正因而个性,咱们能够很容易的通过 SPI 机制为咱们的程序提供拓展性能。 如下图: 零碎设计的各个形象,往往有很多不同的实现计划,在面对象设计里,个别举荐模块之间基于接口编程,模块之间不对实现硬编码,一旦代码波及具体的实现类,就违反了可插拔的准则。Java SPI 就是提供这样的一个机制,为某一个接口寻找服务的实现,有点相似IOC 的思维,把拆卸的控制权移到程序之外,在模块化波及外面这个各尤为重要。与其说SPI 是java 提供的一种服务发现机制,倒不如说是一种解耦思维。 2.应用场景?数据库驱动加载接口实现类的加载;如:JDBC 加载Mysql,Oracle...日志门面接口实现类加载,如:SLF4J 对log4j、logback 的反对Spring中大量应用了SPI,特地是spring-boot 中自动化配置的实现Dubbo 也是大量应用SPI 的形式实现框架的扩大,它是对原生的SPI 做了封装,容许用户扩大实现Filter 接口。3.应用介绍要应用 Java SPI,须要遵循以下约定: 当服务提供者提供了接口的一种具体实现后,须要在JAR 包的META-INF/services 目录下创立一个以“接口全限度定名”为命名的文件,内容为实现类的全限定名;接口实现类所在的JAR放在主程序的classpath 下,也就是引入依赖。主程序通过java.util.ServiceLoder 动静加载实现模块,它会通过扫描META-INF/services 目录下的文件找到实现类的全限定名,把类加载值JVM,并实例化它;SPI 的实现类必须携带一个不带参数的构造方法。示例: spi-interface 模块定义 定义一组接口:public interface MyDriver spi-jd-driver spi-ali-driver 实现为:public class JdDriver implements MyDriver public class AliDriver implements MyDriver 在 src/main/resources/ 下建设 /META-INF/services 目录, 新增一个以接口命名的文件 (org.MyDriver 文件) 内容是要利用的实现类别离 com.jd.JdDriver和com.ali.AliDriver spi-core 个别都是平台提供的外围包,蕴含加载应用实现类的策略等等,咱们这边就简略实现一下逻辑:a.没有找到具体实现抛出异样 b.如果发现多个实现,别离打印 public void invoker(){ ServiceLoader<MyDriver> serviceLoader = ServiceLoader.load(MyDriver.class); Iterator<MyDriver> drivers = serviceLoader.iterator(); boolean isNotFound = true; while (drivers.hasNext()){ isNotFound = false; drivers.next().load(); } if(isNotFound){ throw new RuntimeException("一个驱动实现类都不存在"); }}spi-test ...

March 14, 2023 · 2 min · jiezi

关于插件:Eolink-神技之四IDEA-工具插件ApiKit自动全代码注释

Eolink 神技之一:基于数据库智能生成 API 文档 Eolink 神技之二:API 全生命周期治理 Eolink 神技之三:钉钉、企业微信、蓝信、飞书等工具API对接 前言咱们在开发过程中会有很多小伙伴一起来做合作开发,然而会呈现一个问题,就是每个人的正文习惯都不雷同,那么,咱们在后续理解程序的时候就很麻烦,Eolink 提供的这个性能就十分棒,能够间接主动全代码正文,咱们只须要填写大量的关键字即可。十分的不便高效,并且对立了正文标准。在本博客中,我会先演示主动全代码正文,之后会依据咱们正文的内容一键式上传到咱们的 Eolink 进行批量测试。 一、主动全代码正文Eolink 提供了【idea】的【Eolink ApiKit】插件,此插件能够疾速的将类与函数均增加一个规范的 Eolink 正文办法。 正文示例: 这里为了测试不便,我写了一些间接返回的测试接口。 1/**2 * @eo.name UpdateById3 * @eo.url /api/UpdateById4 * @eo.method put5 * @eo.request-type formdata6 * @param id7 * @param introduce8 * @return Object9 */@PutMapping("/api/UpdateById")public Object UpdateById(String id,String introduce) {10 try {11 return new SUCCESS("批改"+id+"胜利", UUID.randomUUID());12 } catch (Exception e) {13 return new ERROR("批改"+id+"失败", UUID.randomUUID());14 }15} 1、测试环境测试语言:Java 零碎环境:win10 开发环境:IntelliJ IDEA 2021.3.2(反对 2020-2022 年版本) ...

February 9, 2023 · 6 min · jiezi

关于插件:插件功机制能让-开源-API-管理工具使用简单么

API 管理工具,根本的性能是文档和测试,但如果 API 管理工具也能装置插件,任何你想要的 API 治理相干的其余性能都能够通过装置插件来满足,是不是就很酷呢? 插件机制是 Eoapi 的主打性能,意在让用户依据本身的痛点,自在拓展、订制本人须要的性能。不同的插件服务于不同的性能,很可能显示在不同的区域,也对应不同的 UI 和交互。 装置装置 Eoapi 客户端后,点击相应图标进入插件广场页面,在插件列表中寻找或搜寻想要的插件,能够看到插件卡片上会显示以后处于未装置或已装置的状态。 点击进入插件详情,点击【装置】按钮,稍后即可主动实现装置。 在详情页能够看插件展的详细信息,包含开发者、版本号和具体的性能介绍,点击【装置】按钮,即可实现装置。 配置请查阅官网文档 卸载进入插件广场,切换到【已装置】的插件列表,抉择想要卸载的插件,点击进入详情后,能够看到【卸载】按钮,点击后即可卸载。 卸载后将无奈持续应用插件性能 Eoapi 的插件零碎有两点益处: 能够只抉择本人须要的性能,随时插拔; 在遇到不满足现有需要的场景下,能够抉择本人入手开发插件 和其余只做开源产品的我的项目不一样,咱们在开源这款产品前之前,曾经在商业产品中排汇了大量用户如何应用 API 工具的实际场景,所以官网也会在每年依照肯定的频率公布官网插件,将商业产品上的积淀奉献到开源产品。 对于 EoapiEoapi 是一个开源的 API 管理工具,除了最罕用的文档和测试性能,一些新的性能也在一直地被增加进来。当然,如果你感觉它还不够满足你的需要,你有什么好的想法,无妨去 Github 上提个 issue, 我的项目开发人员都会及时回复的。 该我的项目也有残缺的开发文档,如果你有什么技术问题,也能够去交换, PM 也会及时回复。 github 地址:https://github.com/eolinker/e... Demo 地址: www.eoapi.io/?utm_source=sf&utm_campaign=xh&utm_content=chajian

December 29, 2022 · 1 min · jiezi

关于插件:COS-加码福利COS-用户实践有奖征文等你来投稿

COS用户实际征文活动炽热进行中,本次征集主题为:如何在生态场景下应用 COS? 优质文章将有机会被编入腾讯云官网文档库,供宽广用户学习参考。更有多重好礼等你来拿,速来围观投稿吧! 投稿阐明:1、投稿内容必须保障内容原创性,实际过程实在、内容代码化,一经发现侵权行为,勾销流动参加资格。 2、文章要求公布在腾讯云开发者社区。 3、投稿内容字数不少于400字,要求文字顺通、图片清晰、代码标准。 4、投稿内容一经采纳,将会被纳入官网产品文档,腾讯云领有使用权,可对文稿进行编辑和分享。 5、流动最终解释权归腾讯云所有。 6、情谊附上:最佳实际写作指南,供参考~ 参加形式:1、扫码退出流动交换群 2、扫描下方二维码 或者点击“点击链接”进行投稿 (挪动端如果无奈长按扫码,倡议先保留本地再扫描) 重要阐明:1、审核通过被驳回的文章作者,将在下月初进行获奖名单颁布和处分发放,届时会有站内信和短信告诉。 2、对于继续输入高质量内容的作者,每年度末还有年度奉献大礼包送上。 腾讯云积分发放对象为:已实现实名认证的腾讯云用户(协作者、子账号、国内账号除外),详情可查考积分商城具体规、腾讯云文档积分规定。 3、代金券发放对象为:已实现实名认证的腾讯云用户(协作者、子账号、国内账号除外)。 4、周边礼物发放对象为:已实现实名认证的腾讯云用户。 特地申明: 腾讯云有权依据本身经营安顿,自主决定和调整本流动的具体规定,具体流动规定以流动页颁布规定为准。相干规定一经颁布即产生效劳,您该当予以恪守。 扫码发现更多惊喜!

August 3, 2022 · 1 min · jiezi

关于插件:obsidian插件无法加载的解决办法

说起来obsidian,它是一款十分完满的科研笔记软件,同时也是基于Markdown语法编辑的本地常识管理软件,并且开发者承诺Obsidian对于集体使用者永恒收费。 如果你是一名对笔记有着谋求或者是一名为周报制作头疼的职场人,对这款软件感兴趣,却不晓得怎么动手或者如何去做思维导图,能够给我私信或者评论,我会在当前的工夫里写新的博客对这个工具具体介绍。 本篇博客,咱们只提obisisian插件无奈装置的问题。obsidian默认是不容许装置第三方插件因而,首先须要在设置中敞开平安模式,实现这一步,那么祝贺你,你能够装置插件了。在第三方插件中搜寻咱们想要的插件,比方我想要一款mindmap相干的插件,咱们输出关键词mind,就有了想要的后果,装置实现后即可。 当然,如果所有这么顺利,我也不会写这个博客,在网络环境下,可能会因为某些起因导致装置过程或者装置之后有可能遇到启动不了的问题,例如这样呈现这个问题之后,作为一名急躁的,咱们应该排查,咱们找到相干文件夹,通常是在这个目录 C:\Users\19456\Documents\Obsidian Vault\.obsidian\plugins咱们找到插件文件,外面只有一个解释文件,关上文件,发现提醒的失败信息,于是我寻找形容文件中的脚本,并未找到 返回插件作者的官网从新下载,并比照,发现main文件失落(很显著,下载过程可能被打断了,然而笔记软件并未辨认出) https://github.com/lynchjames/obsidian-mind-map/releases/tag/1.1.0咱们将官网文件笼罩原文件夹,插件顺利启动了(留神察看右上角提示信息,且启动时长为0ms) 当然,为了更加稳固,能够返回gitee装置,有一位国内的作者搬运了相干插件资源 https://gitee.com/whghcyx/obsidian-plugin/tree/master今晚的分享就到这里,心愿我的分享能够帮忙到正好遇到这个问题的敌人。

August 1, 2022 · 1 min · jiezi

关于插件:fcpx插件Luts调色文件加载工具-LUT-Utility

Luts调色文件加载工具可能疾速的搞定画面的调色步骤,让你的画面看起来更像电影胶片色调,大部分前期软件都能够应用LUT,就是说你能够很不便的将LUT引入你的前期流程中。通过应用LUT能够迅速达到很好的胶片质感和色调,在此基础上稍作调整就能出现很赞的色调格调! 下载:https://www.macz.com/cj/172.h...

July 25, 2022 · 1 min · jiezi

关于插件:红巨人调色降噪插件Red-Giant-Magic-Bullet-Suite

Red Giant Magic Bullet Suite是一款弱小的红伟人调色降噪插件,能够在编辑时间轴上为您提供使您的素材看起来很棒的所需所有。通过弱小的色调调整均衡您的镜头。而后,超过色调校对,准确模仿镜头滤镜和胶片库存,为您制作出和好莱坞一样的成果,为电影制作人提供业余的色调校对。 下载:https://www.macz.com/mac/1446...

July 21, 2022 · 1 min · jiezi

关于插件:ai创意插件合集Astute-Graphics支持Ai-2021

Astute Graphics是一款弱小的ai创意插件,蕴含了泛滥实用的辅助插件,能够帮忙用户显著晋升AI软件的应用效率,让用户可能更加轻松地实现设计工作。 共蕴含了15款插件 01 Autosaviour Pro 主动定时保留工程 02 ColliderScribe 图形对齐定位 03 DynamicSketch 动静手绘插件 04 InkScribe 门路管制 05 MirrorMe 对称镜像 06 Phantasm 色彩管制 07 Stylism 图形成果实时预览管制 08 SubScribe Designer 门路绘图插件 09 Texturino 笔刷贴图材质纹理插件 10 VectorScribe 门路优化管制 11 WidthScribe 手绘描边管制 12DirectPrefs 角度管制插件 13 InkQuest 打印输出设置插件 14 Rasterino 图形裁剪编辑 15 Stipplism 圆点图形填充 下载:https://www.macz.com/mac/6252...

July 21, 2022 · 1 min · jiezi

关于插件:PS插件卡通人物漫画风格一键生成插件Cartoon-Maker

通人物漫画格调一键生成插件Cartoon Maker 无需非凡的Photoshop或绘图技能即可创立卡通和漫画。应用简略,只需关上您的照片,而后单击创立卡通即可,还能够点击编辑卡通脸预设来改善卡通成果。非常适合社交媒体。这款ps插件应用神经网络进行人脸检测,并智能优化图像参数和细节解决以获得最佳卡通成果。 下载:https://www.macz.com/cj/11330...

July 19, 2022 · 1 min · jiezi

关于插件:C4D插件阿诺德Arnold渲染器-R2026版本合集

阿诺德渲染器是目前电影工业中最风行的渲染器之一,多种Shader材质,OSL shader,VR摄像机,灯光等其余性能,大幅度晋升采样和VDB渲染速度,新增多个着色器,更加简略易用;无需繁琐操作。新版勾销对R22的反对,外围为Arnold 7.0.0.x。 下载:https://www.macz.com/cj/12702...

July 19, 2022 · 1 min · jiezi

关于插件:FCPX插件37种油管网红棱镜光效分屏色彩分离转场视觉特效工具包BadAss-FX-4

BadAss FX 4领有37种油管网红大神棱镜光效分屏色调拆散转场视觉特效工具包,如棱镜折射,光效,分屏,转场等其余特效。 装置形式:BadAss FX 4下载实现后,双击主动装置到fcpx软件中,在题目字幕,转场和成果中,可看到装置好的BadAss FX 4 下载:https://www.macz.com/cj/15302...

July 19, 2022 · 1 min · jiezi

关于插件:ps-Raw增效工具Camera-Raw-14中文版

Camera Raw是Photoshop和其余 Creative Suite应用程序的有用插件,能够拜访由各种业余和中档数码相机生成的“原始”图像格式。通过  Camera Raw,您能够对来自各种不同相机的原始图像进行加强,以及将图像导入至各个应用程序。 下载:https://www.macz.com/cj/29.ht...

July 19, 2022 · 1 min · jiezi

关于插件:AE插件Red-Giant-Trapcode-Suite红巨星粒子插件

Trapcode Suite将3D粒子系统的弱小性能间接带入After Effects。应用粒子发射器来创立火,水,烟,雪和其余有机视觉效果,或应用不朽的粒子网格和3D模式创立技术奇观和用户界面。将多个粒子系统组合到一个对立的3D空间中,以取得视觉上令人惊叹 借助GPU减速性能,Trapcode插件可帮忙您疾速取得丑陋的成果。 有史以来第一次,应用新的Dynamic Fluids?物理引擎运行真切的流体模仿,或模仿在空气中挪动并从外表反弹的粒子。 3D物体和外表 创立流动的外表,山区地形,无尽的隧道和形象的形态。应用门路和动作生成精美简单的几何形态,色带和挤压。无论您是创立动静图形还是视觉效果,都是无穷无尽的。 灯光和光辉 为您的静止设计带来光明和生命。模仿有机,3D相机感知体积照明。应用蒙版和门路增加能够使您的徽标和文字活泼的亮条纹,并增加星光闪动以突出您作品中的亮点。 声音和动作 应用音频生成驱动动画和成果的关键帧。缩放,旋转并挪动到节奏,或应用鼓点击创立粒子成果。复制和偏移层及其静止轻松。Trapcode Suite使您能够轻松自动化简单动画。 6.工具 Red Giant Trapcode Suite是一套用于3D动画和视觉效果的11种工具。 • TRAPCODE特地(新) 创立有机3D粒子成果,简单的动静图形元素等。在弱小的Designer中直观地构建粒子成果。Trapcode非凡性能是GPU减速的,包含用于模仿空气,流体动力学等的物理个性。特地应用After Effects 3D相机和灯光,并容许您将3D模型和OBJ序列用作发射器。 • TRAPCODE表格(新) 应用Trapcode Form创立不朽的粒子网格和3D粒子对象。在弱小的Designer中直观地构建成果。将粒子对象溶解在流体中或创立简单的分形动画。应用3D模型和动画OBJ序列创立令人惊叹的MoGraph。用声音驱动动画并遣散文本和徽标。Form应用After Effects 3D相机和灯光,并且是GPU减速的。 • TRAPCODE MIR(新) 应用Trapcode Mir在After Effects中创立3D对象,分形曲面,地形和线框。为静止图形设计流动外表和形象形态或导入3D OBJ模型。复制并分形扭曲Mir曲面和OBJ,并将它们显示为多边形或顶点。Mir在GPU上运行,可与After Effects的3D相机和灯光配合应用。 • TRAPCODE SHINE 应用Trapcode Shine创立超快的3D光线成果。为您的文字,mograph或镜头设计体积光线。用深度模仿洁净的光线或分形烟雾。Shine是After Effects 3D相机感知。 • TRAPCODE 3D STROKE 应用Trapcode 3D Stroke从蒙版创立有机3D形态和线条。标识,文本和门路都有本人的生命。3D笔划预设形态为您提供终点。准确管制形态,色彩,循环等。 • TRAPCODE STARGLOW 应用Trapcode Starglow为动画图形和文本创立风格化的闪光和发光。应用49个预设为您的高光增加Glimmer,以帮忙您入门。Starglow齐全可定制且易于应用。 • TRAPCODE声音键 带有Trapcode声音键的After Effects中的即时音频驱动静止图形。可视化您的音频以获取动静图形,并应用任何音频来驱动动画和成果。应用声音键,您能够隔离音频带以进行齐全管制。 • TRAPCODE TAO 应用Trapcode Tao创立沿门路动画的3D几何图形。应用Tao,您能够从蒙版,门路和动作生成几何形态。Tao应用After Effects的3D相机和灯光。 • TRAPCODE LUX 应用Trapcode Lux,能够看到After Effects灯光。创立3D体积点和聚光灯,并为3D Comps增加戏剧性和真实感。Lux可齐全自定义并可辨认相机。 ...

July 9, 2022 · 1 min · jiezi

关于插件:尽快卸载这两款恶意浏览器插件已有近-50-万用户安装

自 Firefox 在 2002 年诞生以来,就以轻便、疾速、简略与高扩充性的特点广受用户的青睐。 Firefox 有着丰盛的附加组件,包含反跟踪软件、广告拦截器、主题和实用程序等,用户能够通过削减额定的性能或款式实现 Firefox 的个性化定制。 然而,跟 Chrome 插件一样,Firefox 中的这些附加组件在为用户带来不便的同时,也带来了肯定的危险。 在本周,Mozilla 平安博客发表:在 Firefox 团队发现存在歹意行为后,其已决定封杀某些被滥用的附加组件。 布告中尽管提到了两款特定的附加组件(“Bypas” 和 “Bypass XM”),但并没有具体地阐明它们都干了什么。 不过能够必定的是,大概有 45.5 万名用户都受到了潜在影响。 Mozilla 称,这次被封禁的附加组件不仅篡改了浏览器的更新性能,并且让近百万用户都无奈下载更新、获取屏蔽列表或更新近程配置内容。 此外,Malwarebytes Labs 平安博客也显示,此款零碎附加组件的创作者声称,这些附加组件的目标就是为了绕过某些网站付费的限度。 其实,早在往年 6 月,就曾经有人发现了这两款名为 “Bypass” 和 “Bypass XM” 的附件组件在滥用 Firefox 浏览器的代理 API,而且还应用这些 API 来治理浏览器如何连贯到互联网。 当然,当初这些歹意的附加组件都已被阻止。另外,Firefox 团队在补救过程中应用了代理 API 来创立和部署修复程序时,还长期暂停了新附加组件开发人员提交的批准。 从 V.91.1 开始, Firefox 曾经施行了间接连贯以用于更新目标和浏览器收回的其余 “重要申请” 的回退机制,无论代理配置是否导致了连贯问题,都能够进行下载。 10 月初,Mozilla 公布了 Firefox 93 版。最新版本领有新的选项卡卸载性能、阻止来自 HTTPS 网页的 HTTP 下载的能力以及对 3DES 加密的默认反对的完结。 ...

May 31, 2022 · 1 min · jiezi

关于插件:前端开发必备Chrome插件推荐

Web Serve for Chrome通过浏览器间接起一个动态服务,文件夹就能够在浏览器中通过http://127.0.0.1:8887进行拜访,默认是首页是index.html。高级用法:能够调整对应的端口号,设置CORS头,反对HTTPS等。 运行后果: OneTabOneTab能够把以后关上的所有标签以链接的形式收纳到一个标签中,能够在上班关电脑之前把已关上的标签做收纳,下次关上电脑再进行复原,也能够治理本人没来得及看的文章。 FE Helper强烈推荐 一款弱小的插件零碎,根本能够满足日常开发需要,内置了多种插件能够按需下载也能够自定义插件。 目前反对:JSON丑化工具,JSON比对工具,信息编码转换,生成二维码/解码,图片转Base64,代码丑化工具,JS正则表达式,繁难Postman,网页截屏工具,页面取色工具,Excel转JSON,我的便签笔记,工夫(戳)转换,随机明码生成,Markdown工具,进制转换工具,色彩转换工具,Crontab工具,网页油猴工具,便捷思维导图,网页栅格标尺,代码压缩工具,网页性能检测 Copy All Urls能够复制以后浏览器中关上的所有标签,反对自定义格局,比方能够设置复制为MarkDown的链接格局。 Edit this cookie导入、导出、编辑cookies,反对导出httpOnly、secure为true的字段。能够用来在不同浏览器同步登录态,导入的cookie能够间接在puppetter中应用。

April 6, 2022 · 1 min · jiezi

关于插件:Mybatis源码插件的使用和原理

前言Mybatis中的插件又叫做拦截器,通过插件能够在Mybatis某个行为执行时进行拦挡并扭转这个行为。通常,Mybatis的插件能够作用于Mybatis中的四大接口,别离为Executor,ParameterHandler,ResultSetHandler和StatementHandler,归纳如下表所示。 可作用接口可作用办法拦截器用处Executorupdate(),query(),flushStatements(),commit(),rollback(),getTransaction(),close(),isClosed()拦挡执行器中的办法ParameterHandlergetParameterObject(),setParameters()拦挡对参数的解决ResultSetHandlerhandleResultSets(),handleOutputParameters()拦挡对后果集的解决StatementHandlerprepare(),parameterize(),batch(),update(),query()拦挡SQL构建的解决本篇文章将对插件怎么用和插件的执行原理进行剖析。 注释一. 插件的应用插件的应用比较简单,在Mybatis配置文件中将插件配置好,Mybatis会主动将插件的性能植入到插件对应的四大接口中。本大节将以一个例子,对自定义插件,插件的配置和插件的执行成果进行阐明。 首先创立两张表,语句如下所示。 CREATE TABLE bookstore( id INT(11) PRIMARY KEY AUTO_INCREMENT, bs_name VARCHAR(255) NOT NULL);CREATE TABLE book( id INT(11) PRIMARY KEY AUTO_INCREMENT, b_name VARCHAR(255) NOT NULL, b_price FLOAT NOT NULL, bs_id INT(11) NOT NULL, FOREIGN KEY book(bs_id) REFERENCES bookstore(id))往表中插入若干数据,如下所示。 INSERT INTO bookstore (bs_name) VALUES ("XinHua");INSERT INTO bookstore (bs_name) VALUES ("SanYou");INSERT INTO book (b_name, b_price, bs_id) VALUES ("Math", 20.5, 1);INSERT INTO book (b_name, b_price, bs_id) VALUES ("English", 21.5, 1);INSERT INTO book (b_name, b_price, bs_id) VALUES ("Water Margin", 30.5, 2)当初开始搭建测试工程(非Springboot整合工程),新建一个Maven我的项目,引入依赖如下所示。 ...

December 15, 2021 · 4 min · jiezi

关于插件:Chrome插件实现鼠标点击烟花特效

Chrome浏览器插件实现页面鼠标点击烟花成果写在后面成果如上图,鼠标点击之后页面会从底部发射一道烟花,在鼠标点击处绽开开来。 筹备工作1.理解浏览器插件制作方法chrome扩大:manifest.json文件相干字段 2.实现计划在网页上动静插入一个canvas元素,通过canvas来制作并展现烟花成果粒子,联合鼠标的点击事件,来触发烟花射线发射。 3.入手撸代码minifest.json简略地将必须的参数配置残缺 { "name": "烟花点击特效", "version": "1.0.0", "manifest_version": 2, "description": "烟花点击特效", "browser_action": { "default_title": "查看", "default_icon": "1.jpg" }, "content_scripts": [ { "matches": ["<all_urls>"], "js": ["firework.js"] } ], "permissions" : ["tabs", "activeTab"] //向浏览器申请的权限}firework.jslet body = document.getElementsByTagName('body')[0];let myCanvas = document.createElement('canvas');myCanvas.id = 'canvas';myCanvas.style.position = 'fixed';myCanvas.style.left = '0';myCanvas.style.top = '0';body.before(myCanvas);//before插入能够将canvas插入到body后面body.style.opacity = 0.9;// body.appendChild(myCanvas);//requestAnimFrame 封装,能够兼容所有浏览器window.requestAnimFrame=(function(){ return window.requestAnimationFrame|| window.webkitRequestAnimationFrame|| window.mozRequestAnimationFrame|| function(callback){ window.setTimeout(callback,1000/60) } })(); var canvas=document.getElementById("canvas"), // Canvas.getContext(contextID)返回一个用于在画布上绘图的环境; // 目前非法参数contextID只有"2d",即二维绘图 ctx=canvas.getContext("2d"), // 获取电脑可视区域宽高 cw=window.innerWidth,ch=window.innerHeight, fireworks=[],//寄存烟花数组 particles=[],//寄存绽开粒子数组 hue=180,//设置色彩范畴 limiterTotal=5,//点击绽开速度 limiterTick=0,//点击计时器 timerTotal=40,//主动绽开速度 timerTick=0,//主动计时器 mousedown=false, mx,my; // 设置画布宽高 canvas.width=cw;canvas.height=ch; // 随机函数 function random(min,max){ return Math.random()*(max-min)+min } // 计算两点间隔 function calculateDistance(p1x,p1y,p2x,p2y){ var xDistance=p1x-p2x,yDistance=p1y-p2y;return Math.sqrt(Math.pow(xDistance,2)+Math.pow(yDistance,2)) } // 定义烟花对象 function Firework(sx,sy,tx,ty){ this.x=sx; this.y=sy; this.sx=sx; this.sy=sy; this.tx=tx; this.ty=ty; this.distanceToTarget=calculateDistance(sx,sy,tx,ty); //静止间隔 this.distanceTraveled=0; //生成的静止轨迹 this.coordinates=[]; this.coordinateCount=3; while(this.coordinateCount--){ this.coordinates.push([this.x,this.y]) } this.angle=Math.atan2(ty-sy,tx-sx); this.speed=2; this.acceleration=1.05; this.brightness=random(50,70);//烟花的亮度 this.targetRadius=1//烟花圈的半径 } //更新烟花地位 Firework.prototype.update=function(index){ this.coordinates.pop(); this.coordinates.unshift([this.x,this.y]); if(this.targetRadius<8){ this.targetRadius+=0.3 }else{ this.targetRadius=1 } this.speed*=this.acceleration; var vx=Math.cos(this.angle)*this.speed, vy=Math.sin(this.angle)*this.speed; this.distanceTraveled=calculateDistance(this.sx,this.sy,this.x+vx,this.y+vy); //如果烟花运行间隔大于或等于初始地位到指标地位之间的间隔,生成新烟花并移除以后烟花,否则更新烟花地位 if(this.distanceTraveled>=this.distanceToTarget){ //烟花绽放 createParticles(this.tx,this.ty); //销毁烟花点 fireworks.splice(index,1) }else{ this.x+=vx;this.y+=vy } }; // 烟花射线发射 Firework.prototype.draw=function(){ // 从新开始新门路,把之前的门路都清空掉 ctx.beginPath(); //先保留一个坐标 ctx.moveTo(this.coordinates[this.coordinates.length-1][0],this.coordinates[this.coordinates.length-1][1]); //从moveTo提供的坐标绘制到指定坐标 ctx.lineTo(this.x,this.y); //设置线条款式 ctx.strokeStyle="hsl("+hue+", 100%, "+this.brightness+"%)"; //通过此函数将以上绘制的图形绘制到画布上 ctx.stroke(); ctx.beginPath(); //画出鼠标点击时的圆圈 //arc(圆心的x坐标,圆心的y坐标,圆的半径,起始角(以弧度计,即l圆心的3点钟地位是0度),完结角,规定应该是顺时针还是逆时针画图(可选)) ctx.arc(this.tx,this.ty,this.targetRadius,0,Math.PI*2); //描边绘制 ctx.stroke() }; //烟花绽放办法 function Particle(x,y){ this.x=x;this.y=y;this.coordinates=[]; this.coordinateCount=5; while(this.coordinateCount--){ this.coordinates.push([this.x,this.y]) } // 往各个角度绽开 this.angle=random(0,Math.PI*2); this.speed=random(1,10); this.friction=0.95; this.gravity=1; this.hue=random(hue-20,hue+20); this.brightness=random(50,80); this.alpha=1; this.decay=random(0.015,0.03);//粒子隐没工夫(透明度减少速度) } Particle.prototype.update=function(index){ this.coordinates.pop(); this.coordinates.unshift([this.x,this.y]); //粒子静止 this.speed*=this.friction; this.x+=Math.cos(this.angle)*this.speed; this.y+=Math.sin(this.angle)*this.speed+this.gravity; this.alpha-=this.decay;//透明度减少 if(this.alpha<=this.decay){ particles.splice(index,1)//销毁烟花绽放粒子 } }; // 烟花绽放 Particle.prototype.draw=function(){ ctx.beginPath(); ctx.moveTo(this.coordinates[this.coordinates.length-1][0],this.coordinates[this.coordinates.length-1][1]); ctx.lineTo(this.x,this.y); //烟花的色彩 ctx.strokeStyle="hsla("+this.hue+", 100%, "+this.brightness+"%, "+this.alpha+")"; ctx.stroke() }; // 创立粒子 function createParticles(x,y){ //烟花绽放粒子数量 var particleCount=200; while(particleCount--){ particles.push(new Particle(x,y)) } } function loop(){ // 让浏览器循环调用指定的函数来更新动画。 requestAnimFrame(loop); hue+=0.5; ctx.globalCompositeOperation="destination-out"; ctx.fillStyle="rgba(0, 0, 0, 0.5)"; ctx.fillRect(0,0,cw,ch); ctx.globalCompositeOperation="lighter"; var i=fireworks.length; while(i--){ fireworks[i].draw(); fireworks[i].update(i) } var i=particles.length; while(i--){ particles[i].draw(); particles[i].update(i) } // 随机主动抉择地位 if(timerTick>=timerTotal){ //鼠标没有点击的状况 if(!mousedown){ // fireworks.push(new Firework(cw/2,ch,random(0,cw),random(0,ch/2))); timerTick=0 } }else{ timerTick++ } // 鼠标点击地位 if(limiterTick>=limiterTotal){ if(mousedown){ fireworks.push(new Firework(cw/2,ch,mx,my)); limiterTick=0 } }else{ limiterTick++ } } body.addEventListener("mousemove",function(e){ mx=e.pageX-body.offsetLeft - window.scrollX;//鼠标点击坐标 - body偏移量 - 窗口滚动间隔 my=e.pageY-body.offsetTop - window.scrollY;//鼠标点击坐标 - body偏移量 - 窗口滚动间隔 }); body.addEventListener("mousedown",function(e){ // e.preventDefault(); mousedown=true }); body.addEventListener("mouseup",function(e){ // e.preventDefault(); mousedown=false }); window.onload=loop;更多插件浏览器网页背景换肤插件浏览器桌面挂件动画插件B站视频评论屏蔽插件 ...

August 31, 2021 · 2 min · jiezi

关于插件:关于chrome浏览器的几款json插件推荐

jsonviewjson-handlejson formatteryformaterWEB前端助手(FeHelper)

May 18, 2021 · 1 min · jiezi

关于插件:oh-my-zsh插件安装详细教程及常用插件

Oh My Zsh官网 https://ohmyz.sh/Oh My Zsh简略来讲就是一款能让你更加不便的应用命令行的工具,它能够帮忙咱们高亮语法,主动联想命令,晋升工作效率,能够说是程序员必备工具。 一. 装置Oh My Zsh间接输出以下命令即可装置 $ sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"此时关上咱们的终端,会发现色彩变了,阐明装置胜利,或者应用 ' zsh --version'命令查看版本,确认是否装置胜利 二. Oh My Zsh配置主题,插件等相干配置都在~/.zshrc这个文件中,输出 $ vim ~/.zshrc 能够间接在终端关上~/.zshrc 文件并编辑,以配置插件,主题等。也能够间接找到该文件关上编辑 批改主题 批改 ZSH_THEM 为 random可使每次关上都是一个随机的主题 其余主题:https://github.com/ohmyzsh/oh... 应用如下命令更新配置 source ~/.zshrc 配置插件 还是 ~/.zshrc 文件,两头靠下有plugins这句话,这里能够看到咱们目前启用的插件,在外面输出已装置的插件名,插件之间用空格距离 三.罕用插件及装置1. git无需配置,默认已开启, ~/.zshrc 文件文件中plugins=(git) 使咱们能够不便的应用git命令的缩写 常见缩写: gp='git push' gm='git merge' gl='git pull' 查看所有git命令缩写 cat ~/.oh-my-zsh/plugins/git/git.plugin.zsh 2. Z无需cd, 不便的实现目录间疾速跳转 z是oh-my-zsh默认就装好的,会记录输出过的路径名,z+某个目录间接跳转到该目录 间接应用 z 路径名 即可 示例: 3. zsh-syntax-highlighting高亮语法,如图,输出正确语法会显示绿色,谬误的会显示红色,使得咱们无需运行该命令即可晓得此命令语法是否正确 ...

April 20, 2021 · 1 min · jiezi

关于IDEA:Toolkit-大更新UI-更美观用起来更方便

前言前段时间有小伙伴在群里聊天,说到 Toolkit 下载量到 4.9k 了。就忽然想起来,很久没有更新这个插件。 PS:我是用它申请了 License,个别时候应用 Json 格式化性能。趁着周末,更新了下版本,上面介绍间接介绍更新后的版本。 性能介绍UI 界面这次批改最大的就是 UI 界面,根本参考 Doc View 的 UI,全面进行革新,同时对代码也进行的肯定水平上的重构。 同时减少快捷键 Control + Shift + T 间接唤起操作面板的性能。 UI 界面调整,以标签页的模式间接展现性能,方便使用。 Json Format保留原有性能: 代码格式化;压缩为一行;移除文本中的转移符(\);快捷生成实体类字段。新增性能: 快捷复制;原生查找。动图演示: 快捷键关上 Json 格式化 压缩 Json 字符串为一行 查找字段因为间接应用的原生 Editor 当做面板,所以是反对 ⌘ + F 间接局内搜寻的。 生成字段 到这里对于 Json 工具的介绍根本就完结了,这也是我在开发过胜利常常用到的几个性能。当然快捷复制、移除转移符这些性能就须要小伙伴本人钻研了。 Copy As Json当在 Java 类中的时候,能够在右键菜单找到 Copy As Json 这个选项,顾名思义,就是将以后实体类转为 Json 字符串。 如果小伙伴仅仅想应用 Copy As Json 性能,能够在插件商城搜寻,有一个插件仅反对将实体复制为 Json。也有一个留神的中央, 如果 Control + Shift + T 唤起 Toolkit 面板的中央是 Java 实体,这时候 Toolkit 面包会多一个标签页—— Entity Json,能够间接查看以后实体对应的 Json 字符串。 ...

April 18, 2021 · 1 min · jiezi

关于前端:数栈技术干货从0到1实现谷歌插件开发探索及应用

本文整顿自:技术干货丨谷歌插件开发摸索及其利用 数栈是云原生—站式数据中台PaaS,咱们在github和gitee上有一个乏味的开源我的项目:FlinkX,记得给咱们点个star!star!star! gitee开源我的项目:https://gitee.com/dtstack_dev... github开源我的项目:https://github.com/DTStack/fl... FlinkX是一个基于Flink的批流对立的数据同步工具,既能够采集动态的数据,比方MySQL,HDFS等,也能够采集实时变动的数据,比方MySQL binlog,Kafka等,是全域、异构、批流一体的数据同步引擎,大家如果有趣味,欢送来github社区找咱们玩~ 一、前言 笔者之前始终想理解一些对于谷歌插件的相干常识,心愿通过谷歌插件能够更好的意识到谷歌的调试工具,同时也想着能够应用谷歌插件去写一些小工具,既学习了新的货色,又有肯定的趣味性。恰逢近段时间须要分享,因而花了两周工夫学习和理解谷歌插件相干常识,本篇文章就将笔者在学习过程中的一些思考分享给大家。当然,因为工夫的起因,如果笔者对于这一块的意识有不对的中央,欢送批评指正~二、什么是谷歌插件 上面先介绍一下谷歌插件的次要组成部分,因为目前谷歌插件应用比拟广泛的版本为 2.0 版本,因而本文都是基于 2.0 版本进行应用阐明,3.0 版本相较于 2.0 版本更为简便,感兴趣的同学能够点击文章开端处的链接理解更多相干常识。 (一)配置文件 谷歌插件的外围文件就是配置文件--manifest.json(清单)文件。其中,manifest.json 文件最根本的 Api 如下: { "name": "chrome extension","version": "1.0.0","manifest_version": 2,"description": "A litlle chrome extension demo"} [点击并拖拽以挪动] 次要是蕴含所写谷歌插件的名称、版本以及相干形容,其中 manifest_version 示意清单文件版本。manifest.json 作为谷歌插件的外围局部,笔者认为该文件对插件来说就相当于一个入口配置文件,开发人员只须要在这个文件通过配置相应的 js,调用谷歌浏览器提供的 Api,就能实现达到欠缺这个插件的目标。 1、根本应用Api 在清单文件中有 许多的Api,笔者就不一一列举了,上面为大家介绍几个笔者认为比拟重要的 Api,通过以下几个 Api 的介绍,心愿能够使读者对于谷歌插件的开发过程有一个大略的意识。 1)browser_action { ..."browser_action": { "default_icon": { "16": "images/get_started16.png", "32": "images/get_started32.png" }, "default_title": "谷歌划词翻译", "default_popup": "popup.html"},...} [点击并拖拽以挪动] browser_action可设置浏览器右上角的图标及名称。default_popup 可配置点击图标后会呈现的一个小窗口,这里能够做一些临时性的操作 2)permissions { ..."permissions": [ "activeTab", "storage", "tabs", "contextMenus" ],...} ...

April 14, 2021 · 3 min · jiezi

关于javascript:JS的封装JS插件的封装

JS中类的概念类,实际上就是一个function,同时也是这个类的构造方法,new创立该类的实例,new出的对象有属性有办法。办法也是一种非凡的对象。 类的办法在构造方法中初始化实例的办法(就是在构造方法中间接编写办法,并new实例化)是不举荐的,耗费内存(每次实例化的时候都是反复的内容,多占用一些内存,既不环保,也不足效率)。所有实例是共有的,创立多个实例不会产生新的function,举荐在类的prototype中定义实例的办法,prototype中的办法会被所有实例专用。 1. 仿照jQuery封装类匿名函数 (function () { //})();var Id = function (i) { this.id = document.getElementById(i);};window.$ = function (i) { return new Id(i);};console.log($('main'));function Cat(name, color) { this.name = name; this.color = color;}var cat1 = new Cat('大毛', '黄色');var cat2 = new Cat('二毛', '彩色');Cat.prototype.a = 'aaa';Cat.prototype.type = '猫科动物';Cat.prototype.eat = function () { alert('吃老鼠');};cat1.eat();cat2.eat();console.log(cat1.name);console.log(cat2.color);// cat1和cat2会主动含有一个constructor属性,指向它们的构造函数。console.log(cat1.constructor == Cat);console.log(cat2.constructor == Cat);// Javascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系。console.log(cat1 instanceof Cat);try { console.log(a instanceof Cat);} catch (e) { console.log(e);}所谓"构造函数",其实就是一个一般函数,然而外部应用了this变量。对构造函数应用new运算符,就能生成实例,并且this变量会绑定在实例对象上。Javascript规定,每一个构造函数都有一个prototype属性,指向另一个对象。这个对象的所有属性和办法,都会被构造函数的实例继承。 prototype模式的验证办法1. isPrototypeOf() 判断某个prototype对象和某个实例之间的关系2. hasOwnProperty() 判断一个属性是本地属性还是继承自prototype对象的属性3. in 判断是否在某个对象里 ...

April 14, 2021 · 1 min · jiezi

关于idea:idea提升开发效率的几款插件

1. .ignore插件间接在idea的插件商店搜寻,下载完之后,右击我的项目创立一个.gitignore文件,如果你应用git去做版本控制的话,这个插件能够帮忙你在提交代码时疏忽那些文件我疏忽以下文件 2.Alibaba Java Coding Guidelines这个插件能够帮忙你扫描代码中的敏感信息,右击我的项目点击编码规约扫描。 3.MyBatisCodeHelperPro如果你应用mybatis作为orm框架来实现日常开发,那么选他就对了,具体配置教程:https://gejun123456.github.io...

April 9, 2021 · 1 min · jiezi

关于插件:EasyCode插件使用详解

简介什么是EasyCode?EasyCode是idea的一个插件,能够采纳图形化的形式对数据的表生成entity,controller,service,dao,mapper……无需任何编码,简略而弱小。 1.idea装置EasyCode插件首先点击 File->Settings->Plugins,而后搜寻 EasyCode,点击装置: 2.在springboot中应用EasyCode,首先确保yml文件有数据库和mybatis的配置。spring: datasource: url: jdbc:mysql://localhost/jtdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true username: root password: root driver-class-name: com.mysql.cj.jdbc.Driverserver: servlet: context-path: / port: 9001mybatis: mapper-locations: classpath:mapper/*.xml3.增加数据源 接下来配置数据库连贯信息,如果没有检测到适合的数据库 Driver,点击左下角主动下载,填好数据库信息之后点击Test Connection之后如图下则示意连贯胜利,保留退出即可: 如果链接胜利,按图中所示,会有连贯对应数据库的所有表,连贯胜利后,点击 OK。默认状况下没有展现连贯下的数据库,须要手动开展,如下: 4.生成文件首先选中要controller、service、mapper、xml、po对应的表,而后右键单击,抉择 EasyCode->Generate,如下: 点击之后,如果有数据库类型没有对应的 Java 类型,就会有提醒: 如果单击NO,会把没有辨认的类型映射为Java中的Object,能够生成之后去批改类型,也能够配置间接批改,所以咱们最好依据它的疏导点击上图的yes,去增加映射关系: 增加完后,点击ok,再次点击步骤4中的操作,生成文件,~~~~点击之后会呈现以下界面: 图中的红框都为我的项目的启动类所在包如果我的项目是多模块我的项目,能够先抉择代码生成的 Module,而后设置代码生成的 package,最初从上面勾选要生成的代码模版,点击 OK ,之后一路next,生成的java文件如下: 启动我的项目进行测试 启动我的项目失败,提醒我没有找到长久层的bean,原来easycode帮咱们生成代码的时候,没有帮咱们在长久层加上@Repository(申明长久层,交由spring容器治理),这时候咱们在启动类加上MapperScan(“这里为长久层包门路”),再去长久层加上@Repository注解,再次启动,拜访测试 备注:easycode插件大大的进步了日常的开发效率,然而同时也生成了咱们一些不必要的代码,但它真正的劣势还是在于,不必咱们一个一个去创立类、对应数据库的字段,这也缩小了咱们的误错性,所以还是一款很好的插件。

April 6, 2021 · 1 min · jiezi

关于IDEA:IDEA-文档插件-DocView-版本更新支持编辑文档注释

前言IDEA 文档插件 Doc View 又更新了新版本,本次更新版本如下: 反对在办法右键菜单抉择 Doc Editor 间接编辑文档 编辑接口文档名称编辑接口形容编辑字段是否必填编辑字段正文阐明点击确定, 会回写到源文件的正文中反对在 Entity 中通过邮件菜单抉择Doc Editor 编辑字段信息 编辑字段是否必填编辑字段正文阐明点击确定, 会回写到源文件的正文中反对将 Entity 复制为 Json 字符串复制 Json 字符串时, 反对 Entity 中蕴含对象的转换从 Doc View 预览界面间接跳转到编辑界面是不是看着挺多的,上面,咱们就理解下具体都是什么吧! Doc Editor在办法右键菜单 弹起操作面板,可编辑参数如下: 接口名称:默认取办法名,当有正文且正文 tag 为 @docName 时,会取 @docName 对应的名称;接口形容:取正文的形容内容;申请/返回参数:申请返回参数的是否必填、形容。上面应用动图演示: 在实体类右键菜单在实体类中右键菜单,其实相当于办法中的申请/返回参数那一部分。 操作面板操作如下: 是否必填:将应用正文 tag @required 作为是否必填的标识。当然也反对 javax.validation.constraints 的局部注解;形容信息:形容内容为正文内容,批改后会回写到正文中;复制为 Json 字符串,反对多级嵌套。 如果上述内容点击 Copy as Json 会将实体转换为 Json 字符串复制到剪贴板。 间接从预览界面跳转当关上 Doc View 文档界面时,左下角能够通过编辑按钮跳转到 Doc Editor 界面。 ...

April 6, 2021 · 1 min · jiezi

关于插件:VSCode同步扩展插件的3种方法

VSCode是许多前端开发小伙伴们的必备开发利器,然而装置了编辑器还是不够的,毕竟编辑器不像webstorm那样集成了许多性能的IDE,所以就须要在vscode上装置许多晋升开发效率的扩大插件,然而在换另一台电脑(零碎)开发的时候须要重新安装扩大和集体设置,特地头疼。 那么如何在新的电脑上通过简略的设置就能获取之前装置的所有扩大,我总结了3个办法: 1.vscode自带的设置同步性能 此办法最简略,关上vscode中的首选项-设置-点击设置右上角的‘关上设置同步’-抉择GitHub登陆-而后从github跳转回vscode-全选须要保留的设置就胜利了。下次在新电脑上只需用同样的办法在vscode中登陆GitHub就能主动下载之前的扩大了。 此性能应该是vscode最近推出的新性能。在没有自带同步之前,都是应用以下办法。 2.应用Settings Sync扩大实现插件同步1.装置Settings Sync插件2.此办法须要登陆github获取gist id来进行,在不应用迷信上网的状况下是难以关上教程里说的gist网站(亲测基本打不开),同时此办法绝对比拟麻烦,此办法有许多教程。 3.笼罩extensions文件夹此办法就是保留vscode的extensions文件夹中的扩大插件\Users\{username}\.vscode\extensions 能够压缩extensions文件而后上传到云盘中,在新电脑上笼罩原有的vscode的extensions文件夹。

April 3, 2021 · 1 min · jiezi

关于VS:vscode中docker插件无法连接

vscode中docker插件无奈连贯报错Failed to connect. Is Docker runningError: connect EACCES /var/run/docker.sock 起因剖析起因是docker应用unix socket进行通信,然而unix socket属于root用户,然而普通用户须要应用sudo能力开启root权限,然而一般的操作并没有root权限。 解决方案应用root用户登录,然而安全性没有保障普通用户减少到docker组中 sudo groupadd docker #增加docker用户组sudo gpasswd -a $USER docker #将以后用户增加至docker用户组newgrp docker #更新docker用户组增加后从新登录vscode,用户从新连贯后docker插件会失常运行。 测试能够运行docker ps命令,如果有失常的输入,则失常。

March 14, 2021 · 1 min · jiezi

关于插件:Jenkins-无法安装插件

在jenkins 设置页面发现jenkins有更新了,于是手欠的点了下降级,之后 jenkins 降级到2.282 ,发现大量插件不实用,而且已有工作编辑页面ssh 某个组件呈现问题,必须更新jenkins 的插件,问题就此开始了,节约了我4小时的工夫来折腾他……,呵呵,此处通知咱们没事儿不要瞎更新!! 遇到问题jenkins 插件无奈更新,报错 Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target大略剖析了下,应该是java 发送ssl 申请时候证书问题,开始百度 没有用的解决方案一——https批改为http对我不起作用,兴许对你有用 起源:jenkins ssl证书报错问题解决看了下这个解决方案,大略是将Update门路中的https换成http,尝试了下,高级页面点击【立刻获取】,然而插件下载时候还是 https 申请,并没有解决问题,突发奇想的把json文件下载下来,而后将外面的https 全副换成http ,后果还是不行,会报文件sha1 验证不正确。 没有用的解决方案二——将证书导入到java环境中起源1:Jenkins装置后,装置插件失败。报错SunCertPathBuilderException起源2:解决 sun.security.provider.certpath.SunCertPathBuilderException这个计划还是很靠谱的,导入后在高级页面点击【立刻获取】,不会报错,然而插件下载时候还是会报一样的谬误,不晓得哪里问题…… 终于有用的计划三——装置Skip Certificate Check plugin起源: 修复SunCertPathBuilderException Jenkins插件下载谬误步骤: 下载插件Skip Certificate Check plugin的安装文件在插件治理→高级→上传插件 进行装置装置实现后重启jenkins点击下载其余插件胜利太感人终于胜利了,配一张胜利截图吧!!!奈何解决问题时候没有截图报错习惯,不然就能提供更多信息了

March 8, 2021 · 1 min · jiezi

关于插件:IDEA-常用插件与配置

1.罕用插件IdeaVim截止至 2021.03.07 日,插件最初更新工夫:2021.03.04 IdeaVim 是 IDEA VIM 插件,让 IDEA 应用 VIM 的操作模式。 插件地址:https://plugins.jetbrains.com/plugin/164-ideavim装置实现后,大部分快捷键都被 IdeaVim 接管,包含罕用的 Ctrl + A 与 Ctrl + S 等,因而须要配置哪些快捷键应用 IDEA 性能,哪些快捷键应用 VIM 性能。 关上 Vim Emulation,大部分罕用快捷键 Handler 配置为 IDE 即可。 Free Mybatis plugin截止至 2021.03.07 日,插件最初更新工夫:2020.11.24 Free Mybatis plugin 插件,让咱们在进行 Mybatis 开发时,不便通过 mapper 接口间接跳转到对应的 xml 定义的办法处。 插件次要性能: 生成 mapper.xml 文件疾速从代码跳转到 mapper 及从 mapper 返回代码Mybatis 主动不全与语法错误提醒集成 Mybatis generator gui 界面依据数据库注解,生成 swagger model 注解插件地址:https://plugins.jetbrains.com/plugin/8321-free-mybatis-plugin Alibaba Java Coding Guidelines截止至 2021.03.07 日,插件最初更新工夫:2020.08.23 ...

March 7, 2021 · 1 min · jiezi

关于插件:confluence宏插件开发03Hello-World宏开发

通过后面的两篇文单的介绍,咱们曾经实现了开发环境的筹备和根本工程的创立。在这个根底上咱们来写一个HelloWorld 宏。 HelloWorld宏开发步骤一,用Idea关上工程应用Idea的时候有一个注意事项,就是要批改maven的 setting.xml文件。因为confluence应用的本人的服务器maven.atlassian.com来下载maven依赖。 点击Idea左上角的File菜单关上Settings...找到 Build, Execution, Deployment, 点开 Build Tools, 抉择 Maven批改 User settings file的配置,点击左边的 override, 就能够写入值了。 能够通过 atlas-version命令来查看SDK的装置目录,咱们应用SDK目录下的 apache-maven-3.5.4\conf\setting.xml 配置文件在Idea里更新maven的配置,查看是否maven依赖都能失常加载。第一次加载maven依赖的时候会比拟耗时间。步骤二,批改配置文件关上 src\main\resources\atlassian-plugin.xml 文件在 </web-resource>前面退出,以下代码:<xhtml-macro name="helloworld" class="com.example.Helloworld" key='helloworld-macro'> <description key="helloworld.macro.desc"/> <category name="formatting"/> <parameters/> </xhtml-macro>留神,xhtml-macro 和 web-resource 是同级节点。关上 src\main\resources\myConfluenceMacro.properties 文件,退出helloworld.macro.desc 配置项helloworld.macro.desc=Hello World步骤三,插入Java代码创立Helloworld类,写入以下代码package com.example;import com.atlassian.confluence.content.render.xhtml.ConversionContext;import com.atlassian.confluence.macro.Macro;import com.atlassian.confluence.macro.MacroExecutionException;import java.util.Map;public class Helloworld implements Macro { @Override public String execute(Map<String, String> map, String s, ConversionContext conversionContext) throws MacroExecutionException { return "<h1>Hello World</h1>"; } @Override public BodyType getBodyType() { return BodyType.NONE; } @Override public OutputType getOutputType() { return OutputType.BLOCK; }}步骤四,编译及成果查看在命令行里运行 atlas-mvn package 命令,从新打包atlas-mvn package打包胜利后,会输入相似以下的信息:[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 11.916 s[INFO] Finished at: 2021-03-01T18:20:54+08:00[INFO] ------------------------------------------------------------------------切换到原来运行atlas-run的命令行窗口,你能够看到 相似以下的日志输入:[INFO] [talledLocalContainer] 2021-03-01 18:21:00,379 INFO [QuickReload - Plugin Installer] [atlassian.plugin.manager.DefaultPluginManager] updatePlugin Updating plugin 'com.example.myConfluenceMacro-tests' from version '1.0.0-SNAPSHOT' to version '1.0.0-SNAPSHOT'[INFO] [talledLocalContainer] 2021-03-01 18:21:00,379 INFO [QuickReload - Plugin Installer] [atlassian.plugin.manager.DefaultPluginManager] broadcastPluginDisabling Disabling com.example.myConfluenceMacro-tests[INFO] [talledLocalContainer] 2021-03-01 18:21:01,629 INFO [QuickReload - Plugin Installer] [plugins.quickreload.install.PluginInstallerMechanic] installPluginImmediately[INFO] [talledLocalContainer] ^[INFO] [talledLocalContainer] |[INFO] [talledLocalContainer] |[INFO] [talledLocalContainer] |[INFO] [talledLocalContainer] |[INFO] [talledLocalContainer] |[INFO] [talledLocalContainer][INFO] [talledLocalContainer] If you can type on a Dvorak keyboard can you automatically speak Esperanto and program in Lisp?[INFO] [talledLocalContainer][INFO] [talledLocalContainer] Quick Reload Finished (2979 ms) - 'myConfluenceMacro-1.0.0-SNAPSHOT-tests.jar'在浏览器里创立一个页面,插入一个宏,在抉择宏的弹窗里,你就能够看到 Helloworld这个宏了。 ...

March 2, 2021 · 1 min · jiezi

关于插件:confluence宏插件开发02创建一个插件工程

前提阐明你须要先装置好confluence开发用的SDK,请参考 confluence宏插件开发01-搭建开发环境HelloWorld插件工程步骤一,创立工程Confluence SDK提供了atlas-create-confluence-plugin 命令,来创立一个插件的工程。 关上一个命令行窗口,切换到你想要创立工程的目录执行 atlas-create-confluence-plugin 命令,填写必要的参数,你会看到相似以下的输入:Define value for groupId: : com.exampleDefine value for artifactId: : myConfluenceMacroDefine value for version: 1.0.0-SNAPSHOT: :Define value for package: com.example: :Use OSGi Java Config: (Y/N/y/n) N: :Confirm properties configuration:groupId: com.exampleartifactId: myConfluenceMacroversion: 1.0.0-SNAPSHOTpackage: com.exampleuse OSGi Java Config: N Y: :填写结束后,工具会主动下载依赖的文件,须要保障网络是通的。下载创立结束后,你会看到相似这样的输入:[INFO] Project created from Archetype in dir: C:\work\demo\confluence-demo\myConfluenceMacro[INFO] ------------------------------------------------------------------------[INFO] BUILD SUCCESS[INFO] ------------------------------------------------------------------------[INFO] Total time: 07:15 min[INFO] Finished at: 2021-03-01T12:40:43+08:00[INFO] ------------------------------------------------------------------------当初你能够关上 myConfluenceMacro 文件夹,查看刚刚创立好的文件了。步骤二,运行工程确保命令行目录在 myConfluenceMacro 目录下,执行 atlas-run 命令,这个命令是把 一个本地的 confluence开发环境运行起来,第一次运行的时候会须要好长一段时间,须要下载大量的依赖,这个时候你能够先去干点别的,但请保证系统不会主动进入睡眠状态。cd myConfluenceMacroatlas-run如果你看到命令行里的输入 慢下来了,你能够试着用浏览器拜访 http://localhost:1990/confluence ,关上网页后应用 默认的用户名admin,明码admin登录。步骤三,确认插件已装置浏览器里 点击右上角的小齿轮,点击下拉菜单里的“治理利用”关上的界面里搜寻 myConfluenceMacro 插件,下拉的分类里抉择 零碎,如下图: ...

March 2, 2021 · 1 min · jiezi

关于插件:confluence宏插件开发01搭建开发环境

最近在钻研Confluence宏的开发,记录和整顿一下开发过程中遇到的问题。 前提阐明你须要把握根本的java常识。Conflunce是用Java开发的wiki, 所以如果你想开发Confluence插件,根本的java语法还是要把握的Windows装置步骤一,查看JAVA_HOME环境变量如果你还没装置jdk,须要先装置JDK 1.8或更新的版本。如果你曾经装置好了jdk,并且配置好了JAVA_HOME,请间接到步骤二顺次关上 win10 开始菜单》windows零碎》控制面板》零碎和平安 》零碎》高级零碎设置》环境变量增加零碎变量JAVA_HOME,对应的值是你的JDK装置的目录,比方:C:\Program Files\Java\jdk1.8.0步骤二,下载及装置SDK下载最新版本的SDK双击关上下载好的SDK安装文件追随装置界面一步步装置步骤三,查看装置后果关上windows的命令行工具。输出以下命令 atlas-version如果装置胜利,你会看到相似以下的返回后果: ATLAS Version: 8.2.6ATLAS Home: C:\Applications\Atlassian\atlassian-plugin-sdk-8.2.6ATLAS Scripts: C:\Applications\Atlassian\atlassian-plugin-sdk-8.2.6\binATLAS Maven Home: C:\Applications\Atlassian\atlassian-plugin-sdk-8.2.6\apache-maven-3.5.4AMPS Version: 8.1.0--------Executing: "C:\Applications\Atlassian\atlassian-plugin-sdk-8.2.6\apache-maven-3.5.4\bin\mvn.cmd" --version -gs C:\Applications\Atlassian\atlassian-plugin-sdk-8.2.6\apache-maven-3.5.4/conf/settings.xmlApache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)Maven home: C:\Applications\Atlassian\atlassian-plugin-sdk-8.2.6\apache-maven-3.5.4\bin\..Java version: 1.8.0_91, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0\jreDefault locale: zh_CN, platform encoding: GBKOS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"参考资料https://developer.atlassian.c...

March 1, 2021 · 1 min · jiezi

关于插件:在浏览器端组织-JS-代码的魔法工具精选-VS-Code-插件2021-考虑的-10-种最佳-IDE-软件-思否技术周刊

值班编辑:袁钰涵 IDE —— 可称为管理工具的工具箱,用于程序开发环境的应用程序,个别包含代码编辑器、编译器、调试器和图形用户界面工具,人们常说:没有最佳的 IDE,只有最适宜你的 IDE,今日给大家整顿一个与 IDE 应用相干的工具合集,心愿对您有帮忙~ 抉择一个IDE齐全取决于您正在开发的程序类型,抉择的编程语言以及所应用的硬件类型。1、集成多种地理信息编码服务的神器GeoPy 是一款提供了不同天文编码服务实现的 Python 库,可让开发者应用第三方天文编码服务和其余数据源,轻松地在寰球范畴内定位坐标。 在日常开发工作中,对于地理信息编码性能,咱们能够找到许多不同的第三方服务,比方 OpenStreetMap Nominatim,Google Geocoding API 等,但在对接不同的服务时,须要依照各自的开发文档做很多定制且冗余的工作。 设想一下,如果有一个开源且收费的库,能够同时集成多种地理信息编码服务,是不是十分的简洁?geopy 就是这么一款神器。 geopy 是一款收费开源的库,在单个包中为许多不同天文编码服务提供了实现,从而防止了间接对接不同天文编码服务的 API,简化了代码的逻辑。 如图,geopy 相当于一个代理,让咱们不便地对接第三方天文编码 API。须要留神的是不同的服务有不同的应用条款、配额、定价、天文数据等等,所以在应用过程中具体天文编码服务无奈实现某些查问,或在计算机与天文编码服务间呈现的任何网络问题,和 geopy 都是无关的。 开源地址https://github.com/geopy/geopy2、间接在浏览器端组织 JS 代码的魔法工具Browserify 是一个开源的 JavaScript 工具,它能够让你像在 node 中那样,在浏览器中也能够应用 require('module') 来加载模块。换句话说,它能够让服务端的 CommonJs 的模块运行在浏览器端。 开源地址:https://github.com/browserify/browserify3、精选高频 VS Code插件,让你多陪陪npy!1.TODO Highlight 高亮显示你的 TODO、FIXME,反对自定义关键字和外观,能够起到良好的提醒作用。 2.Vetur + Prettier + ESLint 解决抵触后配合应用完满格式化代码,能交给机器做的肯定要学会偷懒。 3.Highlight Matching Tag 实时高亮匹配标签,不必在 HTML 中目迷五色的找标签了。 4.javascript console utils 疾速生成 console.log() ,调试利器,妈妈再也不必放心你的指关节。 5.Code Runner ...

February 28, 2021 · 2 min · jiezi

关于插件:JetBrains-ideolog-日志高亮插件配置

该插件能够在JetBrains公司的少数ide中应用如pycharm idea 等,举个例子在Python中有很多第三方库能够实现日志控制台的高亮输入,然而写入文件的日志却无奈高亮此插件就是为了解决该问题 应用办法: 点击preference --> plugings --> 搜寻 ideogo --> 点击 install即可 如果日志没有失常高亮显示留神: 须要把握正则表达式根本用法+浏览配置办法 配置办法:从0.3.0 版本起 该插件反对自定义日志格局 如果日志不能高亮显示请先降级该插件至最新版本 须要设置两个Java正则表达式和一个工夫格局 1. Message pattern:应该包含工夫,严重性,类别和音讯的捕捉组 如果自定义的日志格局中没有这些,能够疏忽 如果 有其余的例如线程ID也能够将其概括为捕捉组 2. Message start pattern:匹配日志信息开始的头部,即每行日志的开 留神: 须要结尾增加 “ ^” 以保障多行都正确的匹配 3. Time format:须要填入工夫格局以 保障失常高亮显示 4. Apply message pattern to all message lines:如果日志格局固定疏忽该选项 ,可进步多行日志高亮解决的性能 5. Hightlight Patterns:当匹配到之前的 capture groups (捕捉组) 后进行高亮显示 其中款式能够设定 Highlight line-应用配置的款式突出显示整个音讯 一行都高亮Highlight field”-突出显示匹配产生的细分(捕捉组) 捕捉组内容高亮Highlight match-以后不起作用。仅突出显示匹配的文本 匹配的文本高亮例子:高亮后的效果图: 日志信息很简略: 2020-10-19 20:08:54 | SUCCESS | 胜利2020-10-19 20:08:54 | ERROR | 谬误2020-10-19 20:08:54 | DEBUG | 查看 工夫 | 日志类别 | 日志信息 ...

February 4, 2021 · 1 min · jiezi

关于SegmentFault:透过现象看本质Java类动态加载和热替换

摘要:本文次要介绍类加载器、自定义类加载器及类的加载和卸载等内容,并举例介绍了Java类的热替换。最近,遇到了两个和Java类的加载和卸载相干的问题: 1) 是一道对于Java的判断题:一个类被首次加载后,会长期留驻JVM,直到JVM退出。这个说法,是不是正确的? 2) 在开发的一个集成平台中,须要集成相似接口的多种工具,并且工具可能会有新增,同时在不同的环境部署会有裁剪(例如对外提供服务的利用,不能提供特定的洽购的工具),如何能力更好地实现? 针对下面的第2点,咱们采纳Java插件化开发实现。下面的两个问题,都和Java的类加载和热替换机制无关。 1. Java的类加载器和双亲委派模型1.1 Java类加载器 类加载器,顾名思义,就是用来实现类的加载操作。每个类加载器都有一个独立的类名称空间,就是说每个由该类加载器加载的类,都在本人的类名称空间,如果要比拟两个类是否“相等”,首先这两个类必须在雷同的类命名空间,即由雷同的类加载器加载(即对于任何一个类,都必须由该类自身和加载它的类加载器一起确定其在JVM中的唯一性),不是同一个类加载器加载的类,不会相等。 在Java中,次要有如下的类加载器: 图1.1 Java类加载器 上面,简略介绍下面这几品种加载器: 启动类加载器(Bootstrap Class Loader):这个类应用C++开发(所有的类加载器中,惟一应用C++开发的类加载器),用来加载<JAVA_HOME>/lib目录中jar和tools.jar或者应用 -Xbootclasspath 参数指定的类。扩大类加载器(Extension Class Loader):定义为misc.Launcher$ExtClassLoader,用来加载<JAVA_HOME>/lib/ext目录或者应用java.ext.dir指定的类。应用程序类加载器(Application Class Loader):定义为misc.Launcher$AppClassLoader,用来加载用户类门路上面(classpath)上面所有的类,个别状况下,该类是应用程序默认的类加载器。用户自定义类加载器(User Class Loader):用户自定义类加载器,个别没有必要,前面咱们会专门来一部分介绍该类型的类加载器。1.2 双亲委派模型 双亲委派模型,是从 Java1.2 开始引入的一品种加载器模式,在Java中,类的加载操作通过java.lang.ClassLoader中的loadClass()办法实现,咱们首先看看该办法的实现(间接从Java源码中捞进去的): 咱们联合下面的正文,来解释下双亲委派模型的内容: 1) 接管到一个类加载申请后,首先判断该类是否有加载,如果曾经加载,则间接返回; 2) 如果尚未加载,首先获取父类加载器,如果能够获取父类加载器,则调用父类的loadClass()办法来加载该类,如果无奈获取父类加载器,则调用启动器加载器来加载该类; 3) 判断该类是否被父类加载器或者启动类加载器加载,如果曾经加载实现则返回,如果未胜利加载,则本人尝试来加载该类。 下面的形容,阐明了loadClass()办法的实现,咱们进一步对下面的步骤进行解释: 因为类加载器首先调父类加载器来进行加载,从loadClass()办法的实现,咱们晓得父类加载器会尝试调本人的父类加载器,直到启动类加载器,所以,任何一个类的加载,都会最终委托到启动类加载器来首先加载;在后面有进行介绍,启动类加载器、扩大类加载器、应用程序类加载器,都有本人加载的类的范畴,例如启动类加载器只加载JDK外围库,因而并不是父类加载器就能够都加载胜利,父类加载器无奈加载(个别如下面代码,抛出来ClassNotFoundException),此时会由本人加载。最初啰嗦一下,再进行一下总结: 双亲委派模型:如果一个类加载器收到类加载申请,会首先把加载申请委派给父类加载器实现,每个档次的类加载器都是这样,最终所有的加载申请都传动到最根的启动类加载器来实现,如果父类加载器无奈实现该加载申请(即本人加载的范畴内找不到该类),子类加载器才会尝试本人加载。 这样的双亲委派模型有个益处:就是所有的类都尽可能由顶层的类加载器加载,保障了加载的类的唯一性,如果每个类都随机由不同的类加载器加载,则类的实现关系无奈保障,对于保障Java程序的稳固运行意义重大。 2. Java的类动静加载和卸载2.1 Java类的卸载 在Java中,每个类都有相应的Class Loader,同样的,每个实例对象也会有相应的类,当满足如下三个条件时,JVM就会卸载这个类: 1) 该类所有实例对象不可达 2) 该类的Class对象不可达 3) 该类的Class Loader不可达 那么,下面示例对象、Class对象和类的Class Loader间接是什么关系呢? 在类加载器的外部实现中,用一个Java汇合来寄存所加载类的援用。而一个Class对象总是会援用它的类加载器,调用Class对象的getClassLoader()办法,就能取得它的类加载器。所以,Class实例和加载它的加载器之间为双向援用关系。 一个类的实例总是援用代表这个类的Class对象。在Object类中定义了getClass()办法,这个办法返回代表对象所属类的Class对象的援用。此外,所有的Java类都有一个动态属性class,它援用代表这个类的Class对象。 Java虚拟机自带的类加载器(后面介绍的三品种加载器)在JVM运行过程中,会始终存在,而这些类加载器则会始终援用它们所加载的类的Class对象,因而这些Class对象始终是可涉及的。因而,由Java虚拟机自带的类加载器所加载的类,在虚拟机的生命周期中,始终不会被卸载。 那么,咱们是不是就齐全不能在Java程序运行过程中,动静批改咱们应用的类了吗?答案是否定的!依据下面的剖析,通过Java虚拟机自带的类加载器加载的类无奈卸载,咱们能够自定义类加载器来加载Java程序,通过自定义类加载器加载的Java类,是能够被卸载的。 2.2 自定义类加载器 后面介绍到,类加载的双亲委派模型,是举荐模型,在loadClass中实现的,并不是必须应用的模型。咱们能够通过自定义类加载器,间接加载咱们须要的Java类,而不委托给父类加载器。 图2.1 自定义类加载器 如上图所示,咱们有自定义的类加载器MyClassLoader,用来加载类MyClass,则在JVM中,会存在下面三类援用(上图疏忽这三种类型对象对其余的对象的援用)。如果咱们将右边的三个援用变量,均设置为null,那么此时,曾经加载的MyClass将会被卸载。 2.3 动静卸载存在的问题 ...

January 20, 2021 · 1 min · jiezi

关于插件:干货丨时序数据库DolphinDB插件开发教程

DolphinDB反对动静加载内部插件,以扩大零碎性能。插件用C++编写,须要编译成".so"或".dll"共享库文件。本文着重介绍开发插件的办法和注意事项,并具体介绍以下几个具体场景的插件开发流程: 如何开发反对工夫序列数据处理的插件函数如何开发用于解决分布式SQL的聚合函数如何开发反对新的分布式算法的插件函数如何开发反对流数据处理的插件函数如何开发反对内部数据源的插件函数1. 如何开发插件1.1 基本概念DolphinDB的插件实现了能在脚本中调用的函数。一个插件函数可能是运算符函数(Operator function),也可能是零碎函数(System function),它们的区别在于,前者承受的参数个数小于等于2,而后者的函数能够承受任意个参数,并反对会话的拜访操作。 开发一个运算符函数,须要编写一个原型为ConstantSP (const ConstantSP& a, const ConstantSP& b)的C++函数。当函数参数个数为2时,a和b别离为插件函数的第一和第二个参数;当参数个数为1时,b是一个占位符,没有理论用处;当没有参数时,a和b均为占位符。 开发一个零碎函数,须要编写一个原型为ConstantSP (Heap* heap, vector<ConstantSP>& args)的C++函数。用户在DolphinDB中调用插件函数时传入的参数,都按程序保留在C++的向量args中。heap参数不须要用户传入。 函数原型中的ConstantSP能够示意绝大多数DolphinDB对象(标量、向量、矩阵、表,等等)。其余罕用的派生自它的变量类型有VectorSP(向量)、TableSP(表)等。 1.2 创立变量创立标量,能够间接用new语句创立头文件ScalarImp.h中申明的类型对象,并将它赋值给一个ConstantSP。ConstantSP是一个通过封装的智能指针,会在变量的援用计数为0时主动开释内存,因而,用户不须要手动delete曾经创立的变量: ConstantSP i = new Int(1); // 相当于1iConstantSP d = new Date(2019, 3, 14); // 相当于2019.03.14ConstantSP s = new String("DolphinDB"); // 相当于"DolphinDB"ConstantSP voidConstant = new Void(); // 创立一个void类型变量,罕用于示意空的函数参数头文件Util.h申明了一系列函数,用于疾速创立某个类型和格局的变量: VectorSP v = Util::createVector(DT_INT, 10); // 创立一个初始长度为10的int类型向量v->setInt(0, 60); // 相当于v[0] = 60VectorSP t = Util::createVector(DT_ANY, 0); // 创立一个初始长度为0的any类型向量(元组)t->append(new Int(3)); // 相当于t.append!(3)t->get(0)->setInt(4); // 相当于t[0] = 4// 这里不能用t->setInt(0, 4),因为t是一个元组,setInt(0, 4)只对int类型的向量无效ConstantSP seq = Util::createIndexVector(5, 10); // 相当于5..14int seq0 = seq->getInt(0); // 相当于seq[0]ConstantSP mat = Util::createDoubleMatrix(5, 10);// 创立一个10行5列的double类型矩阵mat->setColumn(3, seq); // 相当于mat[3] = seq1.3 异样解决和参数校验1.3.1 异样解决 ...

January 15, 2021 · 8 min · jiezi

3分钟教你学会使用路线规划小程序插件

以下内容转载自微信开放社区腾讯位置服务官方文章《3分钟教你学会使用路线规划小程序插件》作者:腾讯位置服务链接: https://developers.weixin.qq....来源:微信开放社区著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。路线规划小程序插件是腾讯位置服务开发的一款为用户规划驾车、公交、步行路线方案的插件。开发者可以直接在小程序内使用这个插件,从而为自己的用户提供多种出行方案选择。 路线规划插件的功能路线规划插件能为用户规划驾车出行路线(如下图1所示),并且当行车起点和行车终点之间可以规划出多个方案时会展示多个方案及方案耗时。这些不同方案体现了不同的策略,例如根据实时路况时间最短、红绿灯数较少、少收费等策略。 同时驾车路线在地图中会通过不同路线的颜色直观反映道路的拥堵情况,例如红色路线表示那段道路拥堵,这就能够让用户提前规避拥堵路段。 路线规划插件也能为用户规划步行出行路线(如下图2所示),不仅显示了步行路线距离和耗时信息,还显示了用户步行过程中,走过的天桥、人行横道数量,更人性化的显示了步行消耗了多少卡路里。 路线规划插件还能为用户规划公交出行路线(如下图所示),提供多种公交和地铁出行方案,并且用户可以根据自己的实际情况进行方案排序,例如时间短优先排序、少步行优先排序、少换乘优先排序。出行方案上也会有时间短这样的标志信息说明方案特点。 路线规划插件的应用场景路线规划插件应用场景非常丰富,可以直接接入到餐饮、电影等各种类型的小程序中,让消费者在小程序中就能获得到达门店的路线规划方案,方便去门店消费。 设想一个场景,小王周末想要吃一顿大餐,于是打开了某家餐厅小程序,当小王决定去这家餐厅时,不需要再打开地图软件去规划出行路线,通过我们的路线规划插件,在这家餐厅的小程序中就能直接规划小王目前的位置到餐厅的出行路线。小王可以选择开车去餐厅,如果今天车牌号限行,那么小王也可以选择公共交通出行,如果到餐厅的距离很近,那么小王可以选择步行方式到达餐厅。 小程序只需要使用路线规划插件就能拥有这些全面精准规划路线能力。看了这些功能,是不是想马上体验呢?别急!接下来就介绍路线规划插件的使用方法。 路线规划插件的使用方法 1、申请路线规划插件在微信公众平台中, “微信小程序官方后台-设置-第三方设置-插件管理” 里点击 “添加插件”(如下图所示),搜索 “腾讯位置服务路线规划” ,选择添加插件,小程序开发者就可以在小程序内使用该插件了。 2、申请key调用路线规划插件需要申请腾讯位置服务的服务账号,key是开发者的唯一标识,申请key请点击这里。申请key的具体步骤如下: 2.1 填写申请信息 2.2 创建key成功 2.3 授权小程序appid开通微信小程序服务:控制台 -> key管理 -> 设置(使用该功能的key)-> 勾选“微信小程序” -> 填写“授权 APP ID” ->保存。 2.4 勾选“WebService API”及“白名单”微信小程序插件需要使用WebService API的部分服务,所以使用该功能的key需要具备相应的权限。 如果开发者之前是腾讯位置服务的用户并申请过key,则可以跳过上面2.1、2.2的步骤,直接进行2.3、2.4步骤的设置。 3、在小程序中引入路线规划插件只需要在小程序的app.json文件做如下配置就可以在小程序中引入路线规划插件: // app.json{ "plugins": { "routePlan": { "version": "1.0.0", "provider": "wx50b5593e81dd937a" } }, "permission": { "scope.userLocation": { "desc": "你的位置信息将用于小程序定位" } }}4、在小程序中调用路线规划插件在小程序中调用路线规划插件也非常简单: let plugin = requirePlugin('routePlan');let key = ''; //使用在腾讯位置服务申请的keylet referer = ''; //调用插件的小程序的名称let startPoint = JSON.stringify({ //起点 'name': '中国技术交易大厦', 'latitude': 39.984154, 'longitude': 116.30749});let endPoint = JSON.stringify({ //终点 'name': '北京西站', 'latitude': 39.894806, 'longitude': 116.321592});wx.navigateTo({ url: 'plugin://routePlan/route-plan?key=' + key + '&referer=' + referer + '&endPoint=' + endPoint});如以上示例代码所示,只需要传4个参数,就能为小程序用户提供驾车、公交、步行路线规划信息了。这4个参数含义如下: ...

October 15, 2019 · 1 min · jiezi

Pinbox跨平台书签管理工具

日常上网,总会遇到需要收藏的网站,一般我们会用浏览器自带的书签工具来收藏,但是当书签量过多的时候就不容易管理,并且各个浏览器之间也不能互通,而Pinbox很好的解决了这些问题。 Pinbox 主打功能是收藏和收藏管理,但是围绕着收藏又做了很多特别方便的辅助功能,比如可以给某个收藏添加快捷键,可以编辑收藏的标题和描述,还有会抓取网页的缩略图。 Pinbox 不仅仅可以收藏网页,还可以收藏图片和文字。 一个网站怎么能吸引用户,第一个关键就是要界面好看,Pinbox 的界面可以说是非常有品质的,干净简约但又不失单调,整个网页给人一种轻盈素雅的感觉。 收藏使用三种方式展示 卡片模式 列表模式 和 极简模式 收藏可以通过拖拽卡片的方式轻松的移动到左侧任何收藏集里或者回收站里 也可以通过多选批量操作,支持按住 Shift 键快速选中卡片 文本收藏支持 Markdown格式,代码可以高亮显示,很适合收藏代码片段 点击右上角的加号可以添加网页或文字或者图片地址,也可以导入本地书签 最近 Pinbox 上线了主题色和暗黑模式,可以自由的选择自己喜欢的颜色作为主题色 提供了6 种主题颜色可以任意选择,支持暗黑模式和跟随系统功能 跟随系统在这里说一下,如果用的是Chrome系浏览器,选择了跟随系统,Pinbox 就会随着系统的模式而改变,也就是说当系统设置为夜晚模式,Pinbox 会自动跟随为暗黑模式,系统设置为白天,Pinbox 会自动设置为亮色,很好的提高了用户体验。 暗黑模式下的 Pinbox 现在 Pinbox 还很小众,用的人也不多,但是它出色的设计和完美的功能可以说是一款品质很高的产品了,能看出它背后团队的认真和用心,是真的想要做好产品,希望 Pinbox 能越做越好,保持初心,加油!

October 15, 2019 · 1 min · jiezi

页面CPU和内存占用监控可视化Chrome插件Graph-Process

写这个插件的原因是最近要对比一下页面的 cpu 和内存占用的性能,本来是想找看看有没有什么软件能够去可视化一下当前标签页的cpu和内存占用,但是发现却找不到这种软件,mac 上有个活动监视器,但是当你开很多标签页的话并不很好的监听当前标签页的 cpu 和内存占用,能看到谷歌浏览器的 rendered 进程,但是谷歌浏览器的 rendered 进程很多你并不知道是哪个,而且也没有可视化进行查看平均的 cpu 和内存占用,后来看到谷歌浏览器有个任务管理器可以查看当前标签页的 cpu 占用和内存占用,于是想到有没有人已经写了这种插件,但是遗憾的是并没有,后面仔细搜索了谷歌浏览器插件开发文档确定想要的功能能实现,于是这个插件就诞生了????效果图 主要功能对当前标签页点击插件图标,会开始对当前的标签页也就是页面的CPU和内存进行监控,并生成对应的变化折线图和平均值和表格,平均值如果超过一定范围会有颜色变化。 有人可能会问页面开启扩展后会对当前页面统计造成影响,其实是不会的,谷歌扩展是独立的进程,不会对当前的页面的 cpu 和内存占用造成影响。 安装插件注意,由于使用了谷歌浏览器的实验特性,因此插件需要运行在谷歌浏览器开发者版,由于使用了谷歌浏览器的实验特性,因此插件需要运行在谷歌浏览器开发者版,由于使用了谷歌浏览器的实验特性,因此插件需要运行在谷歌浏览器开发者版,重要的事情说三遍,可以在这里下载开发版谷歌浏览器开发者版插件地址:https://chrome.google.com/web...

October 15, 2019 · 1 min · jiezi

VScode-插件开发一絮叨

为什么要研究插件每次换电脑,或者 vscode 故障,需要重新下载的时候 我xx:<font color=red>各种插件安装一遍,各种全局代码段写一遍</font> 还有主题,用谁的都不舒服,就那么两个颜色,我就想动一下,所以,我还是自己研究吧! 安装脚手架初始化各种插件项目,需要用到脚手架 $ npm install -g yo generator-codeVScode 插件开发(一)絮叨VScode 插件开发(二)package.json详解VScode 插件开发(三)主题VScode 插件开发(四)代码段VScode 插件开发(五)插件包VScode 插件开发(六)打包发布

September 19, 2019 · 1 min · jiezi

VScode-插件开发二packagejson详解

{ // 插件的名字,应全部小写,不能有空格 "name": "vscode-plugin-demo", // 插件的友好显示名称,用于显示在应用市场,支持中文 "displayName": "VSCode插件demo", // 描述 "description": "VSCode插件demo集锦", // 关键字,用于应用市场搜索 "keywords": ["vscode", "plugin", "demo"], // 版本号 "version": "1.0.0", // 发布者,如果要发布到应用市场的话,这个名字必须与发布者一致 "publisher": "sxei", // 表示插件最低支持的vscode版本 "engines": { "vscode": "^1.27.0" }, // 插件应用市场分类,可选值: [Programming Languages, Snippets, Linters, Themes, Debuggers, Formatters, Keymaps, SCM Providers, Other, Extension Packs, Language Packs] "categories": [ "Other" ], // 插件图标,至少128x128像素 "icon": "images/icon.png", // 扩展的激活事件数组,可以被哪些事件激活扩展,后文有详细介绍 "activationEvents": [ "onCommand:extension.sayHello" ], // 插件的主入口 "main": "./src/extension", // 贡献点,整个插件最重要最多的配置项 "contributes": { // 插件配置项 "configuration": { "type": "object", // 配置项标题,会显示在vscode的设置页 "title": "vscode-plugin-demo", "properties": { // 这里我随便写了2个设置,配置你的昵称 "vscodePluginDemo.yourName": { "type": "string", "default": "guest", "description": "你的名字" }, // 是否在启动时显示提示 "vscodePluginDemo.showTip": { "type": "boolean", "default": true, "description": "是否在每次启动时显示欢迎提示!" } } }, // 命令 "commands": [ { "command": "extension.sayHello", "title": "Hello World" } ], // 快捷键绑定 "keybindings": [ { "command": "extension.sayHello", "key": "ctrl+f10", "mac": "cmd+f10", "when": "editorTextFocus" } ], // 菜单 "menus": { // 编辑器右键菜单 "editor/context": [ { // 表示只有编辑器具有焦点时才会在菜单中出现 "when": "editorFocus", "command": "extension.sayHello", // navigation是一个永远置顶的分组,后面的@6是人工进行组内排序 "group": "navigation@6" }, { "when": "editorFocus", "command": "extension.demo.getCurrentFilePath", "group": "navigation@5" }, { // 只有编辑器具有焦点,并且打开的是JS文件才会出现 "when": "editorFocus && resourceLangId == javascript", "command": "extension.demo.testMenuShow", "group": "z_commands" }, { "command": "extension.demo.openWebview", "group": "navigation" } ], // 编辑器右上角图标,不配置图片就显示文字 "editor/title": [ { "when": "editorFocus && resourceLangId == javascript", "command": "extension.demo.testMenuShow", "group": "navigation" } ], // 编辑器标题右键菜单 "editor/title/context": [ { "when": "resourceLangId == javascript", "command": "extension.demo.testMenuShow", "group": "navigation" } ], // 资源管理器右键菜单 "explorer/context": [ { "command": "extension.demo.getCurrentFilePath", "group": "navigation" }, { "command": "extension.demo.openWebview", "group": "navigation" } ] }, // 代码片段 "snippets": [ { "language": "javascript", "path": "./snippets/javascript.json" }, { "language": "html", "path": "./snippets/html.json" } ], // 自定义新的activitybar图标,也就是左侧侧边栏大的图标 "viewsContainers": { "activitybar": [ { "id": "beautifulGirl", "title": "美女", "icon": "images/beautifulGirl.svg" } ] }, // 自定义侧边栏内view的实现 "views": { // 和 viewsContainers 的id对应 "beautifulGirl": [ { "id": "beautifulGirl1", "name": "国内美女" }, { "id": "beautifulGirl2", "name": "国外美女" }, { "id": "beautifulGirl3", "name": "人妖" } ] }, // 图标主题 "iconThemes": [ { "id": "testIconTheme", "label": "测试图标主题", "path": "./theme/icon-theme.json" } ] }, // 同 npm scripts "scripts": { "postinstall": "node ./node_modules/vscode/bin/install", "test": "node ./node_modules/vscode/bin/test" }, // 开发依赖 "devDependencies": { "typescript": "^2.6.1", "vscode": "^1.1.6", "eslint": "^4.11.0", "@types/node": "^7.0.43", "@types/mocha": "^2.2.42" }, // 后面这几个应该不用介绍了 "license": "SEE LICENSE IN LICENSE.txt", "bugs": { "url": "https://github.com/sxei/vscode-plugin-demo/issues" }, "repository": { "type": "git", "url": "https://github.com/sxei/vscode-plugin-demo" }, // 主页 "homepage": "https://github.com/sxei/vscode-plugin-demo/blob/master/README.md"}这个介绍是摘抄过来的 ...

September 19, 2019 · 2 min · jiezi

VScode-插件开发三主题

咱们上回书说道,安装完基础环境,我们要来玩自己的主题了 1. 创建一个主题项目$ yo code选中 New Color Theme 接下来照图中所选,完成项目创建(简单英语不做解释) 打开项目如图 2. 配置文件2.1 themes这个文件夹包含主题配置文件,可以新建两个,一个暗色主题,一个亮色主题 如图所示 { "name": "test theme", // 姓名 "type": "dark", // 类型(暗色还是亮色) "colors": { // 配置外框主题,导航栏,文件栏,等 "editor.background": "#263238", "editor.foreground": "#eeffff", "activityBarBadge.background": "#007acc", "sideBarTitle.foreground": "#bbbbbb" }, "tokenColors": [ // 配置代码的颜色 { "name": "Comment", // 随便起名,自己知道什么意思就好 "scope": [ // 这个颜色要应用于哪种类型的代码上 "comment", "punctuation.definition.comment" ], "settings": { // 配置颜色,斜体,粗体等 "fontStyle": "italic", "foreground": "#546E7A" } } ]}以上就是一个主题的配置,这篇文章就说完了~~~ ...

September 19, 2019 · 1 min · jiezi

Kubernetes事件离线工具kubeeventer正式开源

前言监控是保障系统稳定性的重要组成部分,在Kubernetes开源生态中,资源类的监控工具与组件百花齐放。除了社区自己孵化的metrics-server,还有从CNCF毕业的Prometheus等等,开发者可选的方案有很多。但是,只有资源类的监控是远远不够的,因为资源监控存在如下两个主要的缺欠: 监控的实时性与准确性不足大部分资源监控都是基于推或者拉的模式进行数据离线,因此通常数据是每隔一段时间采集一次,如果在时间间隔内出现一些毛刺或者异常,而在下一个采集点到达时恢复,大部分的采集系统会吞掉这个异常。而针对毛刺的场景,阶段的采集会自动削峰,从而造成准确性的降低。 监控的场景覆盖范围不足部分监控场景是无法通过资源表述的,比如Pod的启动停止,是无法简单的用资源的利用率来计量的,因为当资源为0的时候,我们是不能区分这个状态产生的真实原因。 基于上述两个问题,Kubernetes是怎么解决的呢? 事件监控-监控的新维度Kubernetes作为云原生的平台实现,从架构设计上将接口与实现做到了完整的解耦和插拔,以状态机为整体的设计原则,通过设定期望状态、执行状态转换、检查并补偿状态的方式将资源的生命周期进行接管。 状态之间的转换会产生相应的转换事件,在Kubernetes中,事件分为两种,一种是Warning事件,表示产生这个事件的状态转换是在非预期的状态之间产生的;另外一种是Normal事件,表示期望到达的状态,和目前达到的状态是一致的。我们用一个Pod的生命周期进行举例,当创建一个Pod的时候,首先Pod会进入Pending的状态,等待镜像的拉取,当镜像录取完毕并通过健康检查的时候,Pod的状态就变为Running。此时会生成Normal的事件。而如果在运行中,由于OOM或者其他原因造成Pod宕掉,进入Failed的状态,而这种状态是非预期的,那么此时会在Kubernetes中产生Warning的事件。那么针对这种场景而言,如果我们能够通过监控事件的产生就可以非常及时的查看到一些容易被资源监控忽略的问题。 一个标准的Kubernetes事件有如下几个重要的属性,通过这些属性可以更好地诊断和告警问题。 Namespace:产生事件的对象所在的命名空间。Kind:绑定事件的对象的类型,例如:Node、Pod、Namespace、Componenet等等。Timestamp:事件产生的时间等等。Reason:产生这个事件的原因。Message: 事件的具体描述。其他信息通过事件的机制,我们可以丰富Kuernetes在监控方面的维度和准确性,弥补其他监控方案的缺欠。 kube-eventer v1.0.0的发布与开源针对Kubernetes的事件监控场景,Kuernetes社区在Heapter中提供了简单的事件离线能力,后来随着Heapster的废弃,相关的能力也一起被归档了。为了弥补事件监控场景的缺失,阿里云容器服务发布并开源了kubernetes事件离线工具kube-eventer。支持离线kubernetes事件到钉钉机器人、SLS日志服务、Kafka开源消息队列、InfluxDB时序数据库等等。 在本次正式发布的v1.0.0的版本中,作了如下功能的增强。 钉钉插件支持Namespace、Kind的过滤支持与NPD插件的集成与部署优化SLS插件的数据离线性能修复InfluxDB插件启动参数失效的问题修复Dockerfile的安全漏洞以及其他共11项功能修复典型场景分析: 使用钉钉进行事件告警使用SLS进行事件告警结合NPD进行异常检测与事件告警,此外使用容器服务的开发者可以直接用应用目录中的Helm Chart进行部署。项目开源地址:https://github.com/AliyunContainerService/kube-eventer 本文作者:莫源阅读原文 本文为云栖社区原创内容,未经允许不得转载。

July 15, 2019 · 1 min · jiezi

Aliyun-Serverless-VSCode-Extension-上架并开源

Aliyun Serverless VSCode ExtensionAliyun Serverless VSCode Extension 是阿里云 Serverless 产品 函数计算 Function Compute 的 VSCode 插件,该插件是结合了函数计算 Fun 工具以及函数计算 SDK ,为用户提供 VSCode 图形化开发调试函数计算以及操作函数计算资源的工具。 通过该插件,您可以: 快速地在本地初始化项目、创建函数运行、调试本地函数(调试功能目前支持 nodejs、python、php)拉取云端的服务函数列表,执行云端函数部署服务函数至云端,并更新相关配置前置需求如果您期望使用 Aliyun Serverless VSCode Extension 的所有功能,那么您需要确保系统中有以下组件: VSCode:在 Visual Studio Code 官网 中可以下载安装函数计算 Fun 工具以及 Docker:可以在 aliyun/fun 中根据教程安装配置 Fun 以及 Docker安装插件打开 VSCode 并进入插件市场。在插件市场中搜索 “Aliyun Serverless”,查看详情并安装。重启 VSCode,左侧边栏中会展示已安装的 Aliyun Serverless VSCode Extension 插件。快速入门绑定阿里云账户打开左侧 Aliyun Serverless VSCode Extension,单击绑定阿里云账户的按钮。 依次输入阿里云 Account ID,阿里云 Access Key ID,阿里云 Access Key Secret。 绑定完成后,可以看到所绑定的阿里云账户的云端服务与函数列表。 您可以通过切换区域 Region 来查看不同区域的服务与函数。单击云端资源面板的切换区域按钮或 VSCode 下方的区域信息。 ...

July 12, 2019 · 1 min · jiezi

阿里资深技术专家的10年感悟

阿里妹导读:阿里有许多土话,比如“方法总比困难多”、“不淘汰自己就会被别人淘汰”、“你感觉不舒服的时候,就是成长的时候”。每一句都在激励我们向前。生活总不缺困难和磨练,痛苦的时候,只有转变思维,才能蜕变。今天,阿里巴巴资深技术专家无相分享他在阿里这10年来的几点感悟。今天很残酷,明天更残酷,后天很美好,熬过明天晚上,才能看到后天的太阳。 2019年的上半年,我密集地写了 tbbpm idea 插件,终于比较圆满地解决 idea 插件的开发问题。经过这件事,内心有股强烈的冲动,促使我写下这些年面对痛苦时,我的一些解决问题的方法和感悟。 1. 一个人走得快,一群人走得远“一个人走得快,一群人走得远”,这句话是阿里的土话。没有这些年的编程经历,不会深刻地感受这句话背后逻辑与力量。一个人持续做一件工作量较大且较长期的事情时,对心力的考验是很大的。当多人协同时,心力压力能够得到很大的缓解。 Knowledge is commonly socially constructed, through collaborative efforts toward shared objectives or by dialogues and challenges brought about by differences in persons' perspectives.Salomon 《The Costs and Benefits of Pair Programming》这篇论文的研究表明:结对编程能够改进设计质量,减少代码缺陷(代码行数减少,测试通过率更高),减少员工离职风险,提升软件技能。团队解决问题的速度变快,同时更加愿意坐到一起工作。 2. 当你不舒服,难受或陷于困境时,应该停下来思考在写 tbbpm idea 插件时,我花了三年(准确来说是3个春节)才写成,idea 的设计插件在业界无参考标准,不能很好地快速进行。记得在 eclipse tbbpm 插件时,因有业界源码参考,用了两个通宵原型就做出来了。Tbbpm 是一个闲暇时间的产物,只能利用春节这样的大长假才能开发。我希望自己能够在极短的时间内完成,然而,第一个春节与第二个春节都没有成功。在第三个春节时,关键的拖拽依然没有很好的搞定,心力已经接近憔悴。屡次失败之后,我不得不开始反思,是不是我做这件事的方式错了?是不是我的欲望已经超越了我当前的能力。 于是,那时候我停下手头的工作,冷静的地思考了2天。 这里举个当时的例子,idea 插件绘制表单的困境:因为用 swing 的方式来构建流程时,使用很多原生的库、GUI、JformBuilder,觉得画一个表单很困难, 尽管有些产品商已经用了,依然非常难用。静下来思考后,通过 google,找到了 miglayout 这个库,问题才得以解决。 困境是个人成长的最好机会,放弃、逃避、拒绝思考,就意味着放弃成长。如果遇到困境不自知,不解决,则会出现昨日所不知不能者,今日仍是不知不能;去年所不知不能者,今年仍是不知不能。 同时,最近有很多同学向我反馈,遇到困境时,通过个人的努力依然不能突破。这种情况下,可以尝试另外一条路,像《能力陷阱》这本书所说的一样,可以引入外部的力量。 3. 学习能力与思维模式是一个人的核心竞争力没有自学能力的人没有未来。李笑来 3.1 首先承认自己的不足 ...

July 11, 2019 · 1 min · jiezi

Alibaba-Cloud-Toolkit-一键部署插件使用入门

一、前言Cloud Toolkit官方介绍文档:https://www.aliyun.com/produc...Cloud Toolkit 是针对 IDE 平台为开发者提供的一款插件,帮助开发者更高效地开发、测试、诊断并部署应用。通过插件,您可以将本地应用一键部署到云端(ECS、EDAS、容器服务 Kubernetes 等)和任意服务器;并且它还内嵌了 Arthas 程序诊断、 Terminal Shell 终端和 MySQL 执行器等工具 【注】本文介绍的是在idea中使用Alibaba Cloud Toolkit插件部署springboot项目到阿里云服务器上的案例demo 阿里云服务器基本环境:jdk1.8以上 -> 项目运行所需 其它环境请根据项目情况自行安装哦~二、idea安装插件Alibaba Cloud Toolkit 三、配置1、配置Accounts安装完之后idea -> Settings 左边栏便会出现Alibaba Cloud Toolkit工具栏,如下图 我们需要配置Accounts,这里可以参考官方给出的教程: http://toolkit.aliyun.com/ecl... 阿里云获取AccessKey详情地址 -> https://usercenter.console.al... 2、配置SSH Profile这里可以有两种方式,根据自己情况选择 四、部署运行项目右击选择如下图中所示 或idea上方Tools工具栏中选择这里大家也可以看到Cloud Toolkit功能很强大,没事大家可以多点点看,前方一片绿洲等待着你们,哈哈配置运行信息: 温馨小提示: 远程服务上的脚本是原本写好的,在idea中只是配置脚本运行的路径关于脚本如何编写,可以参考官方给出的demo:https://yq.aliyun.com/article...配置完之后就是run运行了~浏览器输入地址查看运行成功! 五、查看实时日志可参考官方Cloud Toolkit 常见问题:https://yq.aliyun.com/article...运行完后很多时候我们需要在控制台实时查看日志信息,所以还需要配置如下信息: # 实时查看日志命令tail -f 日志路径 注:我的日志文件是放在了 /IT_zhengqing/code/test 路径下点击apply之后,然后关闭弹出框,再次单击 图中圈圈部分便可查看日志信息了 六、总结Alibaba Cloud Toolkit 一键部署插件使用起来相对比较简单,很多地方idea中都已经给出提示配置链接,都不需要我们再百度查找资料,直接看官方提供的资料即可,功能也很强大,喜欢的同学可以多点点看其它的一些功能哦

July 5, 2019 · 1 min · jiezi

基于Tablestore-Tunnel的数据复制实战

前言数据复制主要指通过互联的网络在多台机器上保存相同数据的副本,通过数据复制方案,人们通常希望达到以下目的:1)使数据在地理位置上更接近用户,进而降低访问延迟;2)当部分组件出现故障时,系统依旧可以继续工作,提高可用性;3)扩展至多台机器以同时提供数据访问服务,从而提升读吞吐量。如果复制的数据一成不变,那么数据复制就非常容易,只需要将数据复制到每个节点,一次性即可搞定,面对持续更改的数据如何正确而有效的完成数据复制是一个不小的挑战。 使用DataX进行Tablestore数据复制表格存储(Tablestore)是阿里云自研的NoSQL多模型数据库,提供海量结构化数据存储以及快速的查询和分析服务,表格存储的分布式存储和强大的索引引擎能够提供PB级存储、千万TPS以及毫秒级延迟的服务能力。DataX是阿里巴巴集团内被广泛使用的离线数据同步工具,DataX本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的Reader插件,以及向目标端写入数据的Writer插件。通过使用DataX可以完成Tablestore表的数据复制,如下图所示,otsreader插件实现了从Tablestore读取数据,并可以通过用户指定抽取数据范围可方便的实现数据增量抽取的需求,otsstreamreader插件实现了Tablestore的增量数据导出,而otswriter插件则实现了向Tablestore中写入数据。通过在DataX中配置Tablestore相关的Reader和Writer插件,即可以完成Tablestore的表数据复制。 使用通道服务进行Tablestore数据复制通道服务(Tunnel Service)是基于表格存储数据接口之上的全增量一体化服务。通道服务为您提供了增量、全量、增量加全量三种类型的分布式数据实时消费通道。通过为数据表建立数据通道,可以简单地实现对表中历史存量和新增数据的消费处理。 借助于全增量一体的通道服务,我们可以轻松构建高效、弹性的数据复制解决方案。本文将逐步介绍如何结合通道服务进行Tablestore的数据复制,完整代码开源在github上的 tablestore-examples中。本次的实战将基于通道服务的Java SDK来完成,推荐先阅读下通道服务的相关文档,包括快速开始等。 1. 配置抽取配置抽取其实对应的是数据同步所具备的功能,在本次实战中,我们将完成指定时间点之前的表数据同步,指定的时间点可以是现在或者未来的某个时刻。具体的配置如下所示,ots-reader中记录的是源表的相关配置,ots-writer中记录的是目的表的相关配置。 { "ots-reader": { "endpoint": "https://zhuoran-high.cn-hangzhou.ots.aliyuncs.com", "instanceName": "zhuoran-high", "tableName": "testSrcTable", "accessId": "", "accessKey": "", "tunnelName": "testTunnel", "endTime": "2019-06-19 17:00:00" }, "ots-writer": { "endpoint": "https://zhuoran-search.cn-hangzhou.ots.aliyuncs.com", "instanceName": "zhuoran-search", "tableName": "testDstTable", "accessId": "", "accessKey": "", "batchWriteCount": 100 }}ots-reader中各参数的说明如下: endpoint: Tablestore服务的Endpoint地址,例如https://zhuoran-high.cn-hangzhou.ots.aliyuncs.com。在进行数据复制前,请检查下连通性(可以使用curl命令)。instanceName: Tablestore的实例名。tableName: Tablestore的表名。accessId: 访问Tablestore的云账号accessId。accessKey: 访问Tablestore的云账号accessKey。tunnelName: Tablestore的通道名,配置endTime: 数据同步的截止时间点,对应到Java里SimpleFormat的格式为:yyyy-MM-dd HH:mm:ss 。ots-writer中各参数的说明如下(略去相同的参数): batchWriteCount: Tablestore单次批量写入的条数,最大值为200。注:未来会开放更多的功能配置,比如指定时间范围的数据复制等。2. 编写主逻辑数据复制的主逻辑主要分为以下4步,在第一次运行时,会完整的进行所有步骤,而在程序重启或者断点续传场景时,只需要进行第3步和第4步。 1.创建复制目的表 通过使用DesribeTable接口,我们可以获取到源表的Schema,借此可以创建出目的表,值得注意的是需要把目的表的有效版本偏差设成一个足够大的值(默认为86400秒),因为服务端在处理写请求时会对属性列的版本号进行检查,写入的版本号需要在一个范围内才能写入成功,对于源表中的历史存量数据而言,时间戳往往是比较小的,会被服务端过滤掉,最终导致同步数据的丢失。sourceClient = new SyncClient(config.getReadConf().getEndpoint(), config.getReadConf().getAccessId(), config.getReadConf().getAccessKey(), config.getReadConf().getInstanceName());destClient = new SyncClient(config.getWriteConf().getEndpoint(), config.getWriteConf().getAccessId(), config.getWriteConf().getAccessKey(), config.getWriteConf().getInstanceName());if (destClient.listTable().getTableNames().contains(config.getWriteConf().getTableName())) { System.out.println("Table is already exist: " + config.getWriteConf().getTableName());} else { DescribeTableResponse describeTableResponse = sourceClient.describeTable( new DescribeTableRequest(config.getReadConf().getTableName())); describeTableResponse.getTableMeta().setTableName(config.getWriteConf().getTableName()); describeTableResponse.getTableOptions().setMaxTimeDeviation(Long.MAX_VALUE / 1000000); CreateTableRequest createTableRequest = new CreateTableRequest(describeTableResponse.getTableMeta(), describeTableResponse.getTableOptions(), new ReservedThroughput(describeTableResponse.getReservedThroughputDetails().getCapacityUnit())); destClient.createTable(createTableRequest); System.out.println("Create table success: " + config.getWriteConf().getTableName());}2.在源表上创建通道 ...

July 1, 2019 · 2 min · jiezi

借助-Cloud-Toolkit-快速创建-Dubbo-工程

Cloud Toolkit 是一个 IDE 插件,帮助开发者更高效地开发、测试、诊断并部署应用。在最新版的插件中,提供了快速创建 Dubbo 工程的功能,下面就来快速体验下吧。 Dubbo 采用全 Spring 配置方式,透明化接入应用,对应用没有任何 API 侵入,只需用 Spring 加载 Dubbo 的配置即可,Dubbo 基于 Spring 的 Schema 扩展 进行加载。如果不想使用 Spring 配置,可以通过 API 的方式 进行调用。 功能预览 功能入口打开 IntelliJ IDEA,进入菜单:File - New - Project... 第一步:选择 JAVA SDK 版本 第二步:填写应用基本信息 包括选择 Dubbo 版本、Spring Boot 版本等。 第三步:确定创建 如下图所示,就完成了一个完整的 Dubbo 工程的创建了,此工程的结构和Apache Dubbo 官方样例工程完全一致。参考 Apache Dubbo 官方样例工程:https://dubbo.apache.org/zh-cn/docs/user/quick-start.html 立即点击下载 官网 https://toolkit.aliyun.com 亮点1:本地应用一键部署 Deploy to ECS开发者本地编写的应用程序,在图形化界面上进行配置,即可持续便利的部署到云端的 ECS 服务器上;在 Eclipse 中完成编码后,无须在 Maven 、Git 以及其他运维脚本和工具的之间切换,借助 Cloud Toolkit for Eclipse 插件,在 IDE 的图形界面上选择一个或若干个 ECS 实例,即可将应用程序部署至 ECS 指定目录Deploy to EDAS针对阿里云 EDAS 产品的开发者,我们也在插件上打通了本地应用程序和云端部署,在 Eclipse 中完成编码后,将 IDE 内的项目工程,关联上 EDAS 的应用,即可实现快速部署。Deploy to CS Kubernetes针对阿里云 容器服务 Kubernetes 产品的开发者,我们也在插件上打通了本地应用程序和云端Kubernetes部署,在 Eclipse 中完成编码后,将 IDE 内的项目工程,关联上 容器服务 Kubernetes 的部署,即可实现快速部署。亮点2:内置终端 Terminal ...

June 20, 2019 · 1 min · jiezi

chrome插件开发-github仓库star趋势图

1. 前言这天,在逛github(就是划水)的时候,突然想看看某个仓库的star走势,但是在star列表中翻了半天愣是没找到相应的功能。于是乎,谷歌一搜,发现有个叫Star History的谷歌插件,然而竟然要收费。。。 于是,又接着搜索,发现了这个仓库。好巧的是,这个仓库就是那个插件的源码。稍微瞅了下源码,感觉我也能行? 由于之前就想学学怎么写chrome插件,本着学习的态度和好奇心驱使(都是划水,没有什么不同),于是也做了一个可以查看仓库Star趋势的插件。效果如下: 2. 准备工作2.1 chrome插件简单入门由于也是第一次写Chrome插件,作为小白,就先搜搜大家都是怎么写chrome插件的吧。果然,一搜一大堆。。。不过,最终还是选择了官方文档,毕竟是第一手资料,虽然是英文,但写得还算通俗易懂,阅读起来没啥问题。 这里推荐看Getting Started,非常友好,一步步教你完成一个最简单的修改网页背景颜色的Chrome插件。跟着教程完成之后你就会发现,原来Chrome插件就像完成一个web项目一样。 manifest.json是项目的配置文件(类似于package.json),插件所需要的一些能力(例如Storage)就在这个文件中声明。剩下的工作,无非就是根据Chrome插件提供的API实现你想要的功能即可。 我们来看下要创建的项目目录和manifest.json配置文件: ├── README.md├── dist│   └── bundle.js├── images│   ├── trending128.png│   ├── trending16.png│   ├── trending32.png│   └── trending48.png├── manifest.json├── package.json├── src│   └── injected.js└── webpack.config.js{ "name": "Github-Star-Trend", "version": "1.0", "manifest_version": 2, "description": "Generates a star trend graph for a github repository", "icons": { "16": "images/trending16.png", "32": "images/trending32.png", "48": "images/trending48.png", "128": "images/trending128.png" }, "content_scripts": [ { "matches": ["https://github.com/*"], "js": ["dist/bundle.js"] } ]}这里需要解释一点,根据最一开始我们看到的效果图,可以发现我们正在浏览的页面上多了一个Star Trend按钮。所以我们要完成的插件需要能够往页面注入一个按钮,而这正是通过manifest.json中的content_scripts字段实现的。它允许我们往matches字段匹配的网页中注入js字段中的脚本文件。 ...

June 17, 2019 · 3 min · jiezi

vue-省市区三级联动插件vdistpicker

十分便捷的三级联动插件 官网:https://www.awesomes.cn/repo/... 步骤1:下载 npm install v-distpicker --saveOr yarn add v-distpicker --save 步骤2:使用与引入① 在main.js中注册全局组件 import Distpicker from 'v-distpicker'Vue.component('v-distpicker', Distpicker)② 在.vue文件中使用组件(你需要用到三级联动的.vue页面的js里) import VDistpicker from 'v-distpicker' export default { components: { VDistpicker }}③ 如何使用组件<v-distpicker></v-distpicker>(在该.vue文件的html部分写) <template> <div> <v-distpicker province="广东省" city="广州市" area="海珠区"></v-distpicker> </div></template>移动端Mobile <v-distpicker type="mobile"></v-distpicker>步骤3:如何获取他们的数据 ① 给html部分一个点击事件 <v-distpicker @selected='selected'></v-distpicker>② 在vue配置方法里边用点击事件获取data: selected(data){ this.province = data.province.value this.city = data.city.value}

June 10, 2019 · 1 min · jiezi

如何通过Gitalk评论插件5分钟为你的博客快速集成评论功能

欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 《Java 核心知识整理&面试.pdf》资源链接!!个人网站: https://www.exception.site/essay/how-to-install-gitalk-on-your-blog 小哈之前有给大家分享如何给自己的个站快速集成聊天室功能,新关注的小伙伴可参考:《黑科技!仅需 3 行代码,就能将 Gitter 集成到个人网站中,实现一个 IM 即时通讯聊天室功能?》 集成完了聊天室,是不是感觉还少了什么?今天给大家分享一下,如何通过 Gitalk 快速集成评论功能。 目录一、什么是 Gitalk二、Gitalk 特性三、为什么要使用 Gitalk四、Gitalk 安装五、为你的个站集成 Gitalk六、你可能会碰到的坑七、最终效果一、什么是 GitalkGitalk 的官方网站地址是: https://gitalk.github.io 小哈截图的时候,Star 数已经达到 2000+ 了,那它到底是个什么玩意呢?来自官方的解释: Gitalk 是一个基于 GitHub Issue 和 Preact 开发的评论插件。二、Gitalk 特性使用 GitHub 登录支持多语言 [en, zh-CN, zh-TW, es-ES, fr, ru]支持个人或组织无干扰模式(设置 distractionFreeMode 为 true 开启)快捷键提交评论 (cmd|ctrl + enter)三、为什么要使用 Gitalk其实国内也有很多易于集成的评论插件,如多说、友言等。国外呢,用的比较多的就是 Dispus 了。这其中小哈使用过的有多说和 Dispus。 先说说 Dispus, 由于服务器架设在国外,访问速度首先是个问题,第二个就是注册了,界面全英文,对一些小白想要快速集成评论功能的,也是相当不友好的;另外,Dispus 仅支持国外一些社交账号登录,如 Fackbook, Google, Twritter 等,我想你的个人博客一定还是国内用户访问多些,选它的话,需要思量一下了。 ...

May 26, 2019 · 2 min · jiezi

吐血分享谷歌浏览器插件

在如今的浏览器市场份额中,谷歌浏览器一家独大,霸占了将近百分之六十的份额。谷歌浏览器的流行程度可见一斑,我平时用的最多的浏览器就是它了。 干净清爽是它给我的最直观的印象,访问速度快则可能是让大多数人选择的原因了。 不仅如此,大量的谷歌浏览器插件丰富了浏览器的功能,使得它更加的贴心。你可以根据自己的需求下载相应的插件,让自己的使用体验加倍提升! 今天给大家分享几个比较常用的谷歌浏览器插件。其实最近发现QQ浏览器也是支持谷歌浏览器的crx类型的扩展程序的,使用起来也很不错,安装方法类似。大家可以根据自己的需求来选择。 1.Anything to QRCode 这个插件可以将浏览器页面的文本、网页地址、图片地址、链接等等转换成二维码,同时还支持解析页面上的二维码,非常的方便好用! 2.Awesome Screenshot 这是一个截图的插件,支持多种功能,还可以录屏,支持截图之后的编辑,完全是在线的 ps! 3.LastPass 这是一个密码管理器,你可能会经常遇到登录一个网站时需要密码,你有可能会忘记了账号密码,或者懒得去输入。这个插件可以帮助你保管你的账号密码,让你一次输入之后,再也不用输入密码就能实现登录! 4.Momentum 打开一个浏览器新标签页的时候,我们总是会看到一个空白的画面,这样难免有点枯燥。这个插件可以在你新打开标签页的时候生成一张优美的背景图片,比如我今天生成的的图片是这样的: 5.OneTab 当你打开多个浏览器标签页的时候,是非常浪费内存的,同时也不方便寻找。OneTab 插件可以把你打开的标签页合成到一个页面,你可以根据需求打开相应的页面,非常的方便和直观,并且非常节省内存! 6.TamperMonkey 中文名叫做油猴脚本,是一个神器!你可以下载相应的脚本,然后可以破解视频会员,全网音乐一键下载,广告清理等等。 7.Tunnello_VPN fq 工具,每天提供 200M 免费流量,只不过速度一般,基本的搜索还是可以的。也可以花钱买旗舰版,不限量,速度很不错,价格也不贵! 8.广告终结者 网页上面一些乱七八糟的广告、弹窗有时候看着真的很烦,这个插件是实打实的广告终结者!安装之后浏览器页面干净清爽! 最后三个是开发者可能会经常使用到的插件: 9.JsonView 这是开发者经常使用到的一个插件,有时候可能会遇到浏览器上的 json 数据格式混乱的情况,这个插件可以解析 json,生成可视化视图,方便查看数据。 10.FeHelper 这是一个在线助手,提供的功能非常丰富,例如 Json 格式化,Json 美化,代码美化,二维码生成等等,堪称神器! 11.Restlet Client 这是一个接口测试工具,类似于 Postman,只不过是插件形式的,更省空间,功能和 Postman 类似,强烈推荐使用! 以上全部插件领取方式: 在我的公众号【roseduan】后台回复 谷歌 或者 插件 即可打包带走!谢谢你的关注支持!

May 14, 2019 · 1 min · jiezi

码上用它开始Flutter混合开发——FlutterBoost

开源地址: https://github.com/alibaba/fl…为什么需要混合方案具有一定规模的App通常有一套成熟通用的基础库,尤其是阿里系App,一般需要依赖很多体系内的基础库。那么使用Flutter重新从头开发App的成本和风险都较高。所以在Native App进行渐进式迁移是Flutter技术在现有Native App进行应用的稳健型方式。闲鱼在实践中沉淀出一套自己的混合技术方案。在此过程中,我们跟Google Flutter团队进行着密切的沟通,听取了官方的一些建议,同时也针对我们业务具体情况进行方案的选型以及具体的实现。官方提出的混合方案基本原理Flutter技术链主要由C++实现的Flutter Engine和Dart实现的Framework组成(其配套的编译和构建工具我们这里不参与讨论)。Flutter Engine负责线程管理,Dart VM状态管理和Dart代码加载等工作。而Dart代码所实现的Framework则是业务接触到的主要API,诸如Widget等概念就是在Dart层面Framework内容。一个进程里面最多只会初始化一个Dart VM。然而一个进程可以有多个Flutter Engine,多个Engine实例共享同一个Dart VM。我们来看具体实现,在iOS上面每初始化一个FlutterViewController就会有一个引擎随之初始化,也就意味着会有新的线程(理论上线程可以复用)去跑Dart代码。Android类似的Activity也会有类似的效果。如果你启动多个引擎实例,注意此时Dart VM依然是共享的,只是不同Engine实例加载的代码跑在各自独立的Isolate。官方建议引擎深度共享在混合方案方面,我们跟Google讨论了可能的一些方案。Flutter官方给出的建议是从长期来看,我们应该支持在同一个引擎支持多窗口绘制的能力,至少在逻辑上做到FlutterViewController是共享同一个引擎的资源的。换句话说,我们希望所有绘制窗口共享同一个主Isolate。但官方给出的长期建议目前来说没有很好的支持。多引擎模式我们在混合方案中解决的主要问题是如何去处理交替出现的Flutter和Native页面。Google工程师给出了一个Keep It Simple的方案:对于连续的Flutter页面(Widget)只需要在当前FlutterViewController打开即可,对于间隔的Flutter页面我们初始化新的引擎。例如,我们进行下面一组导航操作:Flutter Page1 -> Flutter Page2 -> Native Page1 -> Flutter Page3 我们只需要在Flutter Page1和Flutter Page3创建不同的Flutter实例即可。这个方案的好处就是简单易懂,逻辑清晰,但是也有潜在的问题。如果一个Native页面一个Flutter页面一直交替进行的话,Flutter Engine的数量会线性增加,而Flutter Engine本身是一个比较重的对象。多引擎模式的问题冗余的资源问题.多引擎模式下每个引擎之间的Isolate是相互独立的。在逻辑上这并没有什么坏处,但是引擎底层其实是维护了图片缓存等比较消耗内存的对象。想象一下,每个引擎都维护自己一份图片缓存,内存压力将会非常大。插件注册的问题。插件依赖Messenger去传递消息,而目前Messenger是由FlutterViewController(Activity)去实现的。如果你有多个FlutterViewController,插件的注册和通信将会变得混乱难以维护,消息的传递的源头和目标也变得不可控。Flutter Widget和Native的页面差异化问题。Flutter的页面是Widget,Native的页面是VC。逻辑上来说我们希望消除Flutter页面与Naitve页面的差异,否则在进行页面埋点和其它一些统一操作的时候都会遇到额外的复杂度。增加页面之间通信的复杂度。如果所有Dart代码都运行在同一个引擎实例,它们共享一个Isolate,可以用统一的编程框架进行Widget之间的通信,多引擎实例也让这件事情更加复杂。因此,综合多方面考虑,我们没有采用多引擎混合方案。现状与思考前面我们提到多引擎存在一些实际问题,所以闲鱼目前采用的混合方案是共享同一个引擎的方案。这个方案基于这样一个事实:任何时候我们最多只能看到一个页面,当然有些特定的场景你可以看到多个ViewController,但是这些特殊场景我们这里不讨论。我们可以这样简单去理解这个方案:我们把共享的Flutter View当成一个画布,然后用一个Native的容器作为逻辑的页面。每次在打开一个容器的时候我们通过通信机制通知Flutter View绘制成当前的逻辑页面,然后将Flutter View放到当前容器里面。老方案在Dart侧维护了一个Navigator栈的结构。栈数据结构特点就是每次只能从栈顶去操作页面,每一次在查找逻辑页面的时候如果发现页面不在栈顶那么需要往回Pop。这样中途Pop掉的页面状态就丢失了。这个方案无法支持同时存在多个平级逻辑页面的情况,因为你在页面切换的时候必须从栈顶去操作,无法再保持状态的同时进行平级切换。举个例子:有两个页面A,B,当前B在栈顶。切换到A需要把B从栈顶Pop出去,此时B的状态丢失,如果想切回B,我们只能重新打开B之前页面的状态无法维持住。这也是老方案最大的一个局限。如在pop的过程当中,可能会把Flutter 官方的Dialog进行误杀。这也是一个问题。而且基于栈的操作我们依赖对Flutter框架的一个属性修改,这让这个方案具有了侵入性的特点。这也是我们需要解决的一个问题。具体细节,大家可以参考老方案开源项目地址:https://github.com/alibaba-flutter/hybrid_stack_manager新一代混合技术方案 FlutterBoost重构计划在闲鱼推进Flutter化过程当中,更加复杂的页面场景逐渐暴露了老方案的局限性和一些问题。所以我们启动了代号FlutterBoost(向C++ Boost致敬)的新混合技术方案。这次新的混合方案我们的主要目标有:可复用通用型混合方案支持更加复杂的混合模式。比如支持主页Tab这种情况无侵入性方案:不再依赖修改Flutter的方案支持通用页面生命周期统一明确的设计概念跟老方案类似,新的方案还是采用共享引擎的模式实现。主要思路是由Native容器Container通过消息驱动Flutter页面容器Container,从而达到Native Container与Flutter Container的同步目的。我们希望做到Flutter渲染的内容是由Naitve容器去驱动的。简单的理解,我们想做到把Flutter容器做成浏览器的感觉。填写一个页面地址,然后由容器去管理页面的绘制。在Native侧我们只需要关心如果初始化容器,然后设置容器对应的页面标志即可。主要概念Native层概念Container:Native容器,平台Controller,Activity,ViewControllerContainer Manager:容器的管理者Adaptor:Flutter是适配层Messaging:基于Channel的消息通信Dart层概念Container:Flutter用来容纳Widget的容器,具体实现为Navigator的派生类-Container Manager:Flutter容器的管理,提供show,remove等ApiCoordinator: 协调器,接受Messaging消息,负责调用Container Manager的状态管理。Messaging:基于Channel的消息通信关于页面的理解在Native和Flutter表示页面的对象和概念是不一致的。在Native,我们对于页面的概念一般是ViewController,Activity。而对于Flutter我们对于页面的概念是Widget。我们希望可统一页面的概念,或者说弱化抽象掉Flutter本身的Widget对应的页面概念。换句话说,当一个Native的页面容器存在的时候,FlutteBoost保证一定会有一个Widget作为容器的内容。所以我们在理解和进行路由操作的时候都应该以Native的容器为准,Flutter Widget依赖于Native页面容器的状态。那么在FlutterBoost的概念里说到页面的时候,我们指的是Native容器和它所附属的Widget。所有页面路由操作,打开或者关闭页面,实际上都是对Native页面容器的直接操作。无论路由请求来自何方,最终都会转发给Native去实现路由操作。这也是接入FlutterBoost的时候需要实现Platform协议的原因。另一方面,我们无法控制业务代码通过Flutter本身的Navigator去push新的Widget。对于业务不通过FlutterBoost而直接使用Navigator操作Widget的情况,包括Dialog这种非全屏Widget,我们建议是业务自己负责管理其状态。这种类型Widget不属于FlutterBoost所定义的页面概念。理解这里的页面概念,对于理解和使用FlutterBoost至关重要。与老方案主要差别前面我们提到老方案在Dart层维护单个Navigator栈结构用于Widget的切换。而新的方案则是在Dart侧引入了Container的概念,不再用栈的结构去维护现有的页面,而是通过扁平化key-value映射的形式去维护当前所有的页面,每个页面拥有一个唯一的id。这种结构很自然的支持了页面的查找和切换,不再受制于栈顶操作的问题,之前的一些由于pop导致的问题迎刃而解。同时也不再需要依赖修改Flutter源码的形式去进行实现,除去了实现的侵入性。那这是如何做到的呢?多Navigator的实现Flutter在底层提供了让你自定义Navigator的接口,我们自己实现了一个管理多个Navigator的对象。当前最多只会有一个可见的Flutter Navigator,这个Navigator所包含的页面也就是我们当前可见容器所对应的页面。Native容器与Flutter容器(Navigator)是一一对应的,生命周期也是同步的。当一个Native容器被创建的时候,Flutter的一个容器也被创建,它们通过相同的id关联起来。当Native的容器被销毁的时候,Flutter的容器也被销毁。Flutter容器的状态是跟随Native容器,这也就是我们说的Native驱动。由Manager统一管理切换当前在屏幕上展示的容器。我们用一个简单的例子描述一个新页面创建的过程:创建Native容器(iOS ViewController,Android Activity or Fragment)。Native容器通过消息机制通知Flutter Coordinator新的容器被创建。Flutter Container Manager进而得到通知,负责创建出对应的Flutter容器,并且在其中装载对应的Widget页面。当Native容器展示到屏幕上时,容器发消息给Flutter Coordinator通知要展示页面的id.Flutter Container Manager找到对应id的Flutter Container并将其设置为前台可见容器。这就是一个新页面创建的主要逻辑,销毁和进入后台等操作也类似有Native容器事件去进行驱动。总结目前FlutterBoost已经在生产环境支撑着在闲鱼客户端中所有的基于Flutter开发业务,为更加负复杂的混合场景提供了支持。同时也解决了一些历史遗留问题。我们在项目启动之初就希望FlutterBoost能够解决Native App混合模式接入Flutter这个通用问题。所以我们把它做成了一个可复用的Flutter插件,希望吸引更多感兴趣的朋友参与到Flutter社区的建设。我们的方案可能不是最好的,这个方案距离完美还有很大的距离,我们希望通过多分享交流以推动Flutter技术社区的发展与建设。我们更希望看到社区能够涌现出更加优秀的组件和方案。在有限篇幅中,我们分享了闲鱼在Flutter混合技术方案中积累的经验和代码。欢迎兴趣的同学能够积极与我们一起交流学习。扩展补充性能相关在两个Flutter页面进行切换的时候,因为我们只有一个Flutter View所以需要对上一个页面进行截图保存,如果Flutter页面多截图会占用大量内存。这里我们采用文件内存二级缓存策略,在内存中最多只保存2-3个截图,其余的写入文件按需加载。这样我们可以在保证用户体验的同时在内存方面也保持一个较为稳定的水平。页面渲染性能方面,Flutter的AOT优势展露无遗。在页面快速切换的时候,Flutter能够很灵敏的相应页面的切换,在逻辑上创造出一种Flutter多个页面的感觉。Release 1.0支持项目开始的时候我们基于闲鱼目前使用的Flutter版本进行开发,而后进行了Release 1.0兼容升级测试目前没有发现问题。接入只要是集成了Flutter的项目都可以用官方依赖的方式非常方便的以插件形式引入FlutterBoost,只需要对工程进行少量代码接入即可完成接入。详细接入文档,请参阅GitHub主页官方项目文档。现已开源目前,新一代混合栈已经在闲鱼全面应用。我们非常乐意将沉淀的技术回馈给社区。欢迎大家一起贡献,一起交流,携手共建Flutter社区。项目开源地址:https://github.com/alibaba/flutter_boost本文作者:闲鱼技术-福居阅读原文本文为云栖社区原创内容,未经允许不得转载。

April 17, 2019 · 1 min · jiezi

更效率、更优雅 | 阿里巴巴开发者工具不完全盘点

从人工到自动化,从重复到创新,技术演进的历程中,伴随着开发者工具类产品的发展。阿里巴巴将自身在各类业务场景下的技术积淀,通过开源、云上实现或工具等形式对外开放,本文将精选了一些阿里巴巴的开发者工具,希望能帮助开发者们提高开发效率、更优雅的写代码。由于开发者涉及的技术领域众多,笔者仅从自己熟悉的领域,以后端开发者的视角盘点平时可能有得到的工具。每个工具按照以下几点进行介绍:工具名称和简介使用场景使用教程获取方式一、Java 线上诊断工具 ArthasArthas 阿里巴巴2018年9月开源的一款Java线上诊断工具。工具的使用场景:这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!是否有一个全局视角来查看系统的运行状况?有什么办法可以监控到JVM的实时运行状态?Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。使用教程:基础教程:https://alibaba.github.io/arthas/arthas-tutorials?language=cn&id=arthas-basics进阶教程:https://alibaba.github.io/arthas/arthas-tutorials?language=cn&id=arthas-advanced获取方式:(免费)开源地址:https://github.com/alibaba/arthas二、IDE 插件 Cloud ToolkitCloud Toolkit 是一款 IDE 插件,可以帮助开发者更高效地开发、测试、诊断并部署应用。通过 Cloud Toolkit,开发者能够方便地将本地应用一键部署到任意机器(本地或云端),并内置 Arthas 诊断、高效执行终端命令和 SQL 等。工具的使用场景:每次修改完代码后,是否正在经历反复地打包?在 Maven 、Git 以及其他运维脚本和工具的之间频繁切换?采用 SCP 工具上传?使用XShell或SecureCRT登陆服务器?替换部署包?重启?文件上传到服务器指定目录,在各种 FTP、SCP 工具之间频繁切换 ?使用教程:IntelliJ IDEA 版:https://help.aliyun.com/document_detail/98762.htmlEclipse 版:https://help.aliyun.com/document_detail/29970.htmlPyCharm 版:https://help.aliyun.com/document_detail/112740.htmlMaven 版:https://help.aliyun.com/document_detail/108682.html获取方式:(免费)工具地址:https://www.aliyun.com/product/cloudtoolkit三、混沌实验注入工具 ChaosBladeChaosBlade 是一款遵循混沌工程实验原理,提供丰富故障场景实现,帮助分布式系统提升容错性和可恢复性的混沌工程工具,可实现底层故障的注入,提供了延迟、异常、返回特定值、修改参数值、重复调用和try-catch 块异常等异常场景。工具的使用场景:微服务的容错能力不易衡量?容器编排配置是否合理无法验证?PaaS 层健壮性的测试工作无从入手?使用教程:https://github.com/chaosblade-io/chaosblade/wiki/新手指南获取方式:(免费)开源地址:https://github.com/chaosblade-io/chaosblade/wiki/新手指南四、Java 代码规约扫描插件该插件用于检测 Java 代码中存在的不规范的位置,并给予提示。规约插件是采用kotlin语言开发。使用教程:IDEA插件使用文档:https://github.com/alibaba/p3c/wiki/IDEA插件使用文档Eclipse插件使用文档:https://github.com/alibaba/p3c/wiki/Eclipse插件使用文档获取方式:(免费)开源地址:https://github.com/alibaba/p3c五、应用实时监控工具 ARMSARMS 是一款 APM 类的监控工具,提供前端、应用、自定义监控 3 类监控选项,可快速构建实时的应用性能和业务监控能力。工具的使用场景:晚上10点收到37条报警信息,你却无从下手?当我们发现问题的时候,客户/业务方已经发起投诉?每个月花几十万买服务器,却无法保障用户体验?使用教程:前端监控接入:https://help.aliyun.com/document_detail/106086.html应用监控接入:https://help.aliyun.com/document_detail/63796.html自定义监控:https://help.aliyun.com/document_detail/47474.html获取方式:(收费)工具地址:https://www.aliyun.com/product/arms六、静态开源站点搭建工具 DocsiteDocsite 一款集官网、文档、博客和社区为一体的静态开源站点的解决方案,具有简单易上手、上手不撒手的特质,同时支持 react 和静态渲染、PC端和移动端、支持中英文国际化、SEO、markdown文档、全局站点搜索、站点风格自定义、页面自定义等功能。使用教程:https://docsite.js.org/zh-cn/docs/installation.html获取方式:(免费)项目地址:https://github.com/txd-team/docsite七、Android 平台上的秒级编译方案 FreelineFreeline 可以充分利用缓存文件,在几秒钟内迅速地对代码的改动进行编译并部署到设备上,有效地减少了日常开发中的大量重新编译与安装的耗时。Freeline 最快捷的使用方法就是直接安装 Android Studio 插件。使用教程:https://github.com/alibaba/freeline/blob/master/README-zh.md获取方式:(免费)项目地址:https://github.com/alibaba/freeline八、性能测试工具 PTSPTS 可以模拟大量用户访问业务的场景,任务随时发起,免去搭建和维护成本,支持 JMeter 脚本转化为 PTS 压测,同样支持原生 JMeter 引擎进行压测。使用教程:https://help.aliyun.com/document_detail/70290.html获取方式:(收费)工具地址:https://www.aliyun.com/product/pts九、云效开发者工具KTKT 可以简化在 Kubernetes 下进行联调测试的复杂度,提高基于Kubernetes的研发效率。使用教程:https://yq.aliyun.com/articles/690519获取方式:(免费)工具地址:https://yq.aliyun.com/download/3393十、架构可视化工具 AHASAHAS 为 K8s 等容器环境提供了架构可视化的功能,同时,具有故障注入式高可用能力评测和一键流控降级等功能,可以快速低成本的提升应用可用性。工具的使用场景:服务化改造过程中,想精确的了解资源实例的构成和交互情况,实现架构的可视化?想引入真实的故障场景和演练模型?低门槛获得流控、降级功能?使用教程:https://help.aliyun.com/document_detail/90323.html获取方式:(免费)工具地址:https://www.aliyun.com/product/ahas本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 11, 2019 · 1 min · jiezi

阿里巴巴资深技术专家无相:我们能从 InteliJ IDEA 中学到什么?

本文来源于阿里巴巴资深技术专家无相在内网的分享,阿里巴巴中间件受权发布。最近因为工作的关系,要将 Eclipse 的插件升级为 IDEA 插件。升级过程中,对 IDEA 插件做了些学习和研究,希望通过本文,对“为什么收费的 InteliJ IDEA 会比免费的 Eclipse有着更好的用户口碑“这一现象,提供些个人的思考。通过这篇文章,您将了解到心流与人体工效的重要性,并使自己变得更强大,文章将从以下几点展开:InteliJ IDEA 当前的市场情况与表现;IntelliJ IDEA 成功的原因;IntelliJ IDEA 在 IDE 设计器领域胜出的两个关键点;IntelliJ IDEA 对现实工作的启示;充分利用 IntelliJ IDEA 插件,使自己变得更强大;InteliJ IDEA 的市场情况与表现是如何?2012年开始,IntelliJ IDEA 便迅速崛起,到了2016年,就占领了开发者市场的 46% 分额。直至2018的最新结果:IntelliJ IDEA 的市场份额增长到了 55.4%,显然赢得了18年 Java 领域的 IDE 王者之战,甚至还有重构的大师 Martin Fowler 在他著名的blog上,对 IntelliJ IDEA 赞誉有加。而且根据 IDEA 的产品满意度调查,其满意度竟高达 98%。从外国学者角度,分析 IntelliJ IDEA 为何成功很多国外学者也研究了 IDEA,它的成功之处归结起来有以下两点:1. 产品功能上的成功:代码的智能提示: IDEA 自主开发语言解释器,做了深度的静态分析,让编程更加智能与高效,这是一项杀手级的特色功能;没有保存按钮:每一个你想使用功能,都有快捷键;性能非常好,用户的体验及其流畅;IDEA 不仅对核心插件进行维护, 还提供了优秀的工具集,给予用户一致的UX范式体验;2. 营销策略上的成功:以产品为核心和根本,以 “更好用” 的设计理念和原则打败了很多竞争者;IDEA 没有销售团队,但是霸气的营销口号体现了其内容营销的核心逻辑:”Try it. Test it. If you feel its better, use it“ ,没有多余的营销,真正做到用产品说话;相信大部分程序员,对 IDEA 的特性已经非常熟悉了。 接下来,我们将分析其真正强大的原因。在 IDE 设计器领域里,IntelliJ IDEA 为何能胜出?IDEA 的风靡与崛起,在于它遵从了两个关键的设计哲学:1. 不打断心流Every aspect of IntelliJ IDEA is designed with ergonomics in mind. IntelliJ IDEA is built around the idea that every minute a developer spends in the flow) is a good minute, and things that break developers out of flow are bad things. Every design and implementation decision considers the possibility of interrupting developer’s flow and seeks to eliminate or minimize it.(这句话美得我不想翻译。)“Creative Flow” or just “Flow” is a state of mind where you feel evenly attuned, and focused on the task at hand.创造心流是一种思考状态,是你感觉平和或专注于手头的任务的时刻,通俗的理解就是当你沉浸一件事时,有一种忘记时间与空间的感觉。心流会让你处于你最佳的意识状态,McKinsey 在2010年的研究表明,当你处于心流状态,你的工作效率比非心流状态下的工作效率提高 500%。通过这种设计理念的学习,不禁畅想:如果越来越多的阿里产品,像IntelliJ IDEA的的产品体验一样,让人处于心流,高效完成任务,整体的生产效率将会成倍提升。2. 人体工效学IntelliJ IDEA 宣称用人体工效学来设计IDEA, 即 ”The capable and ergonomic IDE for JVM“。我们简要地科普一下人体工效学:这是一门专注研究人体舒适,通过产品设计减少疲劳、不舒适的科学。在家居设计和人体工程学上,都会重点考虑这种设计理念,让人们在使用时感受到更舒适、更高效率与更少的压力。接下来例举两个人体工效学的经典例子:1. 客服耳机如果没有佩戴式耳机的出现,客服同学估计会疯掉。1. 一撕得的包装箱一撕得的包装纸质量、胶水质量、人体工效学的拉链式设计,这三种要素在纸箱界都是业界第一。人体工效学对软件设计的提示:统一的UX风格设计;将复杂任务变成简单任务;将长任务分解成短任务;因为人类的有记忆力的限制,所以要适当提供提醒,提供关键的辅助给用户,让他们完全沉浸在核心工作中,不被打断。(更多提示,可以看参加文献的第5篇文章。)如果想体验一下人体工程学的设计,IDEA的快捷键与无保存按钮,你立刻就会明白。对我们现实工作有哪些启示?经过团队的讨论,我们认为 IDEA 的增长飞轮在于:优秀的设计理念,卓越的产品体验,InteliJ IDEA 开放的社区,免费与专业收费并行的商业模式。IDEA 不断更新迭代的路径就是用更好的产品体验,吸引到更多的用户,用户贡献了更多的利润,用来吸收更多的优秀人才,一起开发更好的产品。这给予我们现实工作的指导意义,产品要回归至以人为中心的设计理念:心流的提示:罗列出用户的任务,让用户尽可能处于心流状态,消灭导致任务低效的因素;人体工效学提示:我们在设计产品时,要充分考虑用户使用产品的场景,这是一个一体化的设计,就像星环产品设计。写代码只是软件研发的一环,需求创意提出、需求研发上线、业务商业分析这些整体环节都要考虑,让用户舒适地完成任务;智能提示:采用人工智能来提升任务的完成效率。IntelliJ IDEA的智能代码提示,是一个经典的案例;最后:我个人会将心流与人体工效学的设计思想,融入至技术产品设计过程中,期待我们团队的实践篇。小编推荐两款创造心流的 IDE 插件:1. 热替换利器:JRebel一款热部署插件,帮助开发者在项目处于运行状态下任意修改 Java 文件并动态反馈到运行的项目中。点击了解更多2. 开发测试必备部署神器:Cloud Toolkit帮助开发者更高效地开发、测试、诊断并部署应用,利用此插件,能够方便地将本地应用一键部署到任意机器(了解更多:体验链接)。参考文献https://www.javaworld.com/article/3114167/development-tools/choosing-your-java-ide.htmlhttps://www.youtube.com/watch?v=Eyy9ddRgMX8http://catalyticcolor.com/scientific-research-about-flow/https://en.wikipedia.org/wiki/Flow_(psychology))http://ergo.human.cornell.edu/ahtutorials/interface.html本文作者:无相,阿里巴巴资深技术专家,多年担任汇金平台的架构师,是阿里tbbpm工作流引擎的作者。曾在阿里云负责过云产品 0 至 1 的商业化,最近几年在负责阿里的店铺&详情等系统的中台建设。目前,新零售业务平台正在招聘优质架构师,欢迎投简历到 wuxiang#alibaba-inc.com 邮箱。本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 8, 2019 · 1 min · jiezi

Cloud Toolkit 部署应用到阿里云轻量应用服务器

在之前的文章《在 Intellij IDEA 中部署 Java 应用到 阿里云 ECS》中讲解了如何将一个本地应用部署到阿里云 ECS 上去,有些读者反馈目前正在使用阿里云轻量应用服务器,咨询是否可以通过 Cloud Toolkit 插件将应用部署到这些服务器上去?最新版本的 Cloud Toolkit 已经发布,完全支持啦。由于阿里云 ECS 云助手只能支持 VPC 网络机器,因此,轻量应用服务器只能通过 Host 模式手动添加机器,采用标准 SSH 协议来进行部署添加服务器如上图所示,在菜单Tools - Alibaba Cloud - Alibaba Cloud View - Host中打开机器视图界面,如下图:点击右上角Add Host按钮,出现添加机器界面设置服务器的 SSH 账号部署在 IntelliJ IDEA 中,鼠标右键项目工程名,在出现的菜单中点击 Alibaba Cloud - Deploy to Host…,会出现如下部署窗口:在 Deploy to Host 对话框设置部署参数,然后单击 Deploy,即可执行初次部署。部署参数说明:Deploy File:部署文件包含两种方式。Maven Build:如果当前工程采用 Maven 构建,可以使用 Cloud Toolkit 直接构建并部署。Upload File:如果当前工程并非采用 Maven 构建,或者本地已经存在打包好的部署文件,可以选择并直接上传本地的部署文件。Target Deploy host:在下拉列表中选择Tag,然后选择要部署的服务器。Deploy Location :输入在 ECS 上部署路径,如 /root/tomcat/webapps。Commond:输入应用启动命令,如 sh /root/restart.sh。表示在完成应用包的部署后,需要执行的命令 —— 对于 Java 程序而言,通常是一句 Tomcat 的启动命令。本文作者:银时阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 3, 2019 · 1 min · jiezi

在 IntelliJ IDEA 中部署应用到服务器

在之前的文章《在 Intellij IDEA 中部署 Java 应用到 阿里云 ECS》中讲解了如何将一个本地应用部署到阿里云 ECS 上去,有些读者反馈目前还有一些测试机器是在经典网络,甚至是在本地机房中,咨询是否可以通过 Cloud Toolkit 插件将应用部署到这些服务器上去?最新版本的 Cloud Toolkit 已经发布,完全支持啦。本地开发无论是编写云端运行的,还是编写本地运行的 Java 应用程序,代码编写本身并没有特别大的变化,因此本文采用一个及其基础的样例《在 Web 页面打印 HelloWorld 的 Java Servlet 》为例,做参考。public class IndexServlet extends HttpServlet { private static final long serialVersionUID = -112210702214857712L; @Override public void doGet( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { PrintWriter writer = resp.getWriter(); //Demo:通过 Cloud Toolkit ,高效的将本地应用程序代码修改,部署到云上。 writer.write(“Deploy from alibaba cloud toolkit. 2018-10-24”); return; } @Override protected void doPost( HttpServletRequest req, HttpServletResponse resp ) throws ServletException, IOException { return; }}源代码下载上述代码就是一个标准的 Java 工程,用于在 Web 页面上打印一串“Hello World”的文案。安装插件阿里云提供了基于 Intellij IDEA 的插件,以方便开发人员能够高效的将本地 IDE 中编写的应用程序,极速部署到服务器中去。插件主页:https://www.aliyun.com/product/cloudtoolkit阿里云的这个 IntelliJ IDEA 插件的安装过程,和普通的插件大同小异,这里不再赘述,读者请自行安装。添加服务器如上图所示,在菜单 Tools - Alibaba Cloud - Alibaba Cloud View - Host中打开机器视图界面,如下图:点击右上角Add Host按钮,出现添加机器界面部署在 IntelliJ IDEA 中,鼠标右键项目工程名,在出现的菜单中点击 Alibaba Cloud - Deploy to Host…,会出现如下部署窗口:在 Deploy to Host 对话框设置部署参数,然后单击 Deploy,即可执行初次部署。部署参数说明:Deploy File:部署文件包含两种方式。Maven Build:如果当前工程采用 Maven 构建,可以使用 Cloud Toolkit 直接构建并部署。Upload File:如果当前工程并非采用 Maven 构建,或者本地已经存在打包好的部署文件,可以选择并直接上传本地的部署文件。Target Deploy host:在下拉列表中选择Tag,然后选择要部署的服务器。Deploy Location :输入在 ECS 上部署路径,如 /root/tomcat/webapps。Commond:输入应用启动命令,如 sh /root/restart.sh。表示在完成应用包的部署后,需要执行的命令 —— 对于 Java 程序而言,通常是一句 Tomcat 的启动命令。本文作者:银时阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

April 2, 2019 · 1 min · jiezi

feflow 插件实现原理

最近在着手接入和推进研发的规范化、流程化,使得团队开发风格更加统一,提升研发质量与效率。在接入的过程中,选择 feflow 与 现有的相关流程相结合管理脚手架升级和项目初始化,后续考虑开发或者使用插件处理更多业务开发流程。了解插件实现原理,有利于后续插件开发和使用;学习其设计方式,对其他项目开发大有裨益。feflow 是前端研发规范化和流程化工具,常见的内置指令有: init、 dev、build、deploy等,从初始化到构建都提供内置指令,如若需要额外指令实现特定功能,就需要自定定义插件;本质上feflow是一个插件加载工具,可以让开发者开发适用于业务的插件。本文主要介绍 feflow 是如何进行插件注册、加载和使用。一、插件注册feflow 作为一个命令行执行工具,自然而然地支持命令注册,无论是内置指令还是自定义插件,都需要注册相关命令的。首先看一下如何注册指令,以 feflow-plugin-example 为例,其代码如下:feflow.cmd.register(‘add’, ‘加法运算器’, function(args) { // do something add(args._);});注册指令需要的参数如下:name 必填,指令名称desc 必填,阐述相关指令的作用options 可选,函数相关可选项fn 必填,指令调用的回调函数指令注册是 feflow 中 Commond 对象来实现的,Commond 中定义 store 对象,其会存储相关指令,并把指令和指令相关功能做一一映射。关键代码如下: funciton register(name, desc, options, fn) { //… format parameter const c = this.store[name.toLowerCase()] = fn; c.options = options; c.desc = desc; //provide an alias for the instruction. //feflow version is equal to feflow v(ersion) this.alias = abbrev(Object.keys(this.store)); }二、插件加载插件注册安装之后,都会存储在 feflow 安装的 node_modules目录下,在 feflow 进行初始化的时候,首先会读取以feflow-plugin-开头的文件夹,然后进行插件动态加载。2.1 模块初始化动态加载是模拟 Node 模块加载方式的实现,首先会初始化 module 模块。其中会包含模块相关路径、文件名称等相关信息。在进行模块加载时会进行路径查找,即 module.paths。const module = new Module(path);module.filename = path;module.paths = Module._nodeModulePaths(path);2.2 编译调用编译执行时首先会通过fs.readFile去获取对应的文件内容,接下来重点看一下是如何编译调用的,代码片段如下:script = ‘(function(exports, require, module, __filename, __dirname, feflow){’ +script + ‘});’; //(1)const fn = vm.runInThisContext(script, path); //(2)return fn(module.exports, require, module, path, pathFn.dirname(path), self); //(3)首先看到是对原始内容进行封装(标注1),会传入CommonJS 相关规范实现的 exports, require, module, _filename, _dirname 以及注入的自定义变量 feflow。经过封装的内容如下:(function (exports, require, module, __filename, __dirname) { //原始内容});经过包装后返回的字符串,会作为 vm.runInThisContext() 方法的输入参数(标注2)。vm 模块简单的来说就是用来做沙箱环境执行代码,对代码的上下文环境做隔离。vm.runInThisContext 类似 eval,不同的是生成的代码运行时可以访问外部的 global 对象,但是不能访问其他变量。接下来会传入当前 feflow 实例,调用自定义指令的注册(标注3)。三、插件使用在插件使用前确保已经全局安装 feflow-cli:npm install -g feflow-cli对于插件使用分两种情况:(1) 插件开发之后发布到 NPM 上或者 NPM 私有仓库(2) 插件未发布下面分别详细介绍使用步骤。插件已发布1.插件进行安装:feflow install feflow-plugin-example2.调用对应指令:feflow add 1 2插件未发布1.在插件目录下 npm link:cd feflow-plugin-examplenpm link2.到 feflow 安装目录 .feflow 中安装npm link feflow-plugin-example3.编辑 .feflow/package.json 文件,加入依赖dependencies: { //… “feflow-plugin-example”: “1.0.0”}修改完成之后就可以进行调用。 ...

March 25, 2019 · 1 min · jiezi

我们总结了每个技术团队都会遇到的 4 个难题

阿里巴巴 2019 年实习生校园招聘已经启动,为此,我们整理了一篇《每个技术团队都会遇到的4个难题》,帮助即将从校园进入公司实习的后端程序员,以实践的视角,看看一个后端技术团队会遇到的一些难题。虽然,技术上的难题远不止于此,但如果能从这篇文章中获得一些职业体感,也许对你的实习面试会有所帮助。- 正文开始 -从单个应用到多个应用,从百千级别的访问流量到十万、百万级别,从两三个人的创业技术团队到上千人的技术团队矩阵,这些过程中,技术团队都避不开了以下 4 个问题:如何预测业务峰值时的容量如何提升业务的稳定性如何提高业务的监控能力如何提高开发效率如何预测业务峰值时的容量早期的做法是在开发测试环境进行压测,来评估线上容量,但线下环境的机器规模,和线上差距很大,很难通过线下推导线上。根据经验,将采购的机器加入不同的应用里面,这时候就会遇到一个问题: 最大业务峰值容量是多少?这个问题,其实挺难回答的。这个应用多加几台,那个应用少加几台,整体的业务峰值承受能力就会不一样,加减的规则很难通过人的经验来确定,最多只能作为一些辅助判断。另外,核心交易链路的梳理,也是一个体力活,如果依赖人为处理,有可能会漏掉一些看起来不那么重要的”分支”,这是整个容量不确定的地方,可变的因子很多。比较有效的方式, 是在生产系统部署全链路压测,来验证各个生产环节是否能经受住各类流量的访问,让真实的流量来访问生产环境,实现全方位的真实业务场景模拟,确保各个环节的性能、容量和稳定性均可做到万无一失。如何提升业务的稳定性日常的各种运营活动,都有可能带来巨大的流量高峰,除了通过引入全链路压测来验证各个生产环节是否能经受住各类流量的访问, 构建系统的高可用保障能力也很关键,涉及多个组件或模块,例如软负载和配置中心、服务接入和调度编排、消息接收和发送、容器和调度、限流和降级 等。运营一次活动,最大的流量峰值是可以预测的,这就是服务的最大接待能力,比如50万笔的交易创建峰值,那超过的怎么办?这时候,采用限流的方式,被限流的客户在某一段时间内无法进行购物,一旦系统恢复服务能力,就可以继续服务被限流的客户,从而避免因流量超过上限,而影响整个平台的客户。如何提高业务的监控能力分布式应用系统在协作性,扩展性和一定的容错性方面,体现出了优势,但是在监控、运维和诊断层面,面临相当大的挑战。早期,架构师可以画出整个应用系统的交互架构图,随着业务的发展,当拥有大量的应用、微服务和容器,即便整理了一幅交互架构关系图,也会因为应用系统的变更,新需求的实现,整个应用系统的交互又会发生变化,这种变化无处不在,每天都在发生。因此,随着业务量的增加,需要覆盖面广且深的全链路跟踪监控系统 ,来诊断调用链的问题。越是复杂的业务形态,定位的难度越大,就越需要全方位、360度无死角的监控,因此,建立一个平台化、跨领域和立体化的监控,能极大的缩短业务遇到问题时的恢复时间。如何提高开发效率开发效率是一个很广泛的话题。不同的开发岗位,不同的使用场景,会有不一样的开发效率工具。这里,我们介绍几款后端工程师经常会用到的效率工具。云端部署效率工具:Cloud Toolkit 是一款 IDE插件,可以帮助开发者更高效地开发、测试、诊断并部署应用。借助这个工具,开发者能够方便地将本地应用一键部署到任意机器,或 ECS、EDAS、Kubernetes,并支持高效执行终端命令和 SQL 等。点此了解详情。MacOS 搜索利器:MacOS 自带的聚焦搜索(Spotlight),可以将文稿、邮件、应用等整合在一起,通过关键词匹配来进行搜索。Alfred 可以看作是Spotlight的增强版,是计算机依赖者的效率神器,支持添加自定义网络搜索引擎,指定规则精准定位本地文件,以及在命令框内使用计算器、词典等实用工具。画图效率工具:系统架构图是为了抽象的表示软件系统的整体轮廓和各个组件之间的相互关系和约束边界,以及软件系统的物理部署和软件系统的演进方向的整体视图。通过架构图,可以让干系人理解、遵循架构决策,就需要把架构信息传递出去。架构图就是一个很好的载体,所谓一图胜千言。点此了解详情。JSON 浏览效率插件对于 JSON 的数据,如果不编排,格式查看起来会很费劲。JSON-handle 是一款对 JSON 格式的内容进行浏览和编辑,以树形图样式展现 JSON 文档的插件,支持实时编辑。Java 代码规约扫描效率插件这是一款 Java 代码规约扫描工具,旨在以工具的手段进行代码规约的落地,项目包含三部分:PMD规则实现、IntelliJ IDEA 插件、Eclipse 插件,帮助开发人员在工程研发的多个阶段进行代码规约检查, 降低故障率、提升编码效率和质量。点此了解详情。当然,除了这些现成的效率工具,提升整个技术团队的开发效率,需要单独开发或改造一些系统,例如团队协作平台、服务化改造等,当你以实习生的身份加入公司后,若有机会参与到这些提升开发效率的项目过程中。由此形成的效率意识,将会影响到你今后的工作习惯和理念。本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。

March 14, 2019 · 1 min · jiezi

8 个给前端的顶级 VS Code 扩展插件

翻译:疯狂的技术宅原文:https://1stwebdesigner.com/to…本文首发微信公众号:jingchengyideng欢迎关注,每天都给你推送新鲜的前端技术文章微软的 VS (Visual Studio) Code 是一个免费的开源代码编辑器,最近越来越受欢迎。它非常轻巧、灵活,同时也提供了很多强大的功能。它支持绝大多数流行的编程语言,包括PHP、JavaScript、C++ 等。VS Code 是跨平台的。它不仅能用于 Windows 平台,同时也提供 Linux 和 Mac 版本。下载地址:https://code.visualstudio.com/。但也许最酷的是 VS Code 提供了规模超大的扩展插件,在扩展 商店 有大量的免费扩展可用于支持新语言、调试代码或添加各种其他自定义功能。你可以灵活的配置自己的编辑器,更好地满足日常开发的需要。下面将给你介绍一些适合前端的顶级 VS Code 扩展插件。Git增强:GitLens虽然Git功能已内置于 VS Code 中,但 GitLens 能够提供更多的版本控制功能来“增强”你的编辑器。它提供了对代码的深入分析功能,可以向你显示更改时间以及更改后的代码。你甚至可以比较不同的分支、标签和提交。总的来说,这个扩展插件会让你拥有全新的视觉感受。更多详情:https://marketplace.visualstu…语法高亮:Beautify你是否非常依赖语法高亮显示?如果是的话,Beautify 正是你需要的。它利用了 VS Code 中已有的 Online JavaScript Beautifier,允许你轻松更改其样式。这意味着你可以根据内容设置缩进、换行和其他细节。更多详情:https://marketplace.visualstu…代码检查:ESLintJavaScript 可能很难调试。但 ESLint 扩展可以使这个过程更容易。它能够在执行代码之前帮你指出其中潜在的问题。更强大的是它允许你创建自己的 linting 规则。更多详情:https://marketplace.visualstu…调试器:Debugger for Chrome对于在运行时期间对代码进行调试的开发人员,Debugger for Chrome 将帮你更好的完成工作。它有许多方便的功能,包括在代码、watches 和控制台中设置断点的功能。另外你可以在 VS Code 中运行Chrome实例,或把调试器附加到单独运行的浏览器实例。更多信息:https://marketplace.visualstu…环境增强:React Native ToolsReact 是最引人注目的JS库之一 —— 以至于新的 WordPress 块编辑器(又名 Gutenberg)是基于它建立的。如果你是众多的 React 程序员之一,那么React Native Tools是必不可少的扩展。它增加了运行 react-native 命令的功能,还能帮助你调试自己的代码。更多信息:https://marketplace.visualstu…界面主题:One Dark Pro在敲代码时,有一个醒目且养眼的界面主题会很有帮助。毕竟编码过程可以持续好几个小时。 One Dark Pro 把Atom 编辑器中流行的 “One Dark” 主题带到了 VS Code。更多信息:https://marketplace.visualstu…代码增强:Bracket Pair Colorizer 2Bracket Pair Colorizer 2 是一个简单的扩展,可以使代码更容易阅读。它可以对匹配括号的对代码着色,使你可以非常直观地确定函数的开始和结束位置。还可以选择要使用的颜色。更多信息:https://marketplace.visualstu…视觉增强:vscode-icons也许 vscode-icons 是 VS Code 最有效的视觉调整扩展之一。它能够处理你项目中平淡的文件列表,并添加丰富多彩、表示特定语言的图标。这样可以很容易地让你知道代码文件的类型。能够给工作区添加个性化设置是非常受欢迎的功能。更多信息:https://marketplace.visualstu…按自己的方式编写代码VS Code 提供的扩展插件数量惊人,这使其成极具吸引力的编辑器。你可以自由的进行设置,来匹配自己使用的语言和设置喜欢的工作区视觉效果。此外,它还提供了企业和开源文化的有趣组合。 VS Code 得到了微软的支持,能够确保未来会得到更好的维护。开源社区围绕软件创建了一个欣欣向荣的生态系统,可以称作是企业与开源文化相结合的典范。欢迎继续阅读本专栏其它高赞文章:12个令人惊叹的CSS实验项目世界顶级公司的前端面试都问些什么CSS Flexbox 可视化手册过节很无聊?还是用 JavaScript 写一个脑力小游戏吧!从设计者的角度看 ReactCSS粘性定位是怎样工作的一步步教你用HTML5 SVG实现动画效果程序员30岁前月薪达不到30K,该何去何从7个开放式的前端面试题React 教程:快速上手指南本文首发微信公众号:jingchengyideng欢迎扫描二维码关注公众号,每天都给你推送新鲜的前端技术文章 ...

March 11, 2019 · 1 min · jiezi

IDEA 插件开发入门教程

IntelliJ IDEA 是目前最好用的 JAVA 开发 IDE,它本身的功能已经非常强大了,但是每个人的需求不一样,有些需求 IDEA 本身无法满足,于是我们就需要自己开发插件来解决。工欲善其事,必先利其器,想要提高开发效率,我们可以借助 IDEA 提供的插件功能来满足我们的需求。如果没有我需要的功能怎么办?很简单,我们自己造一个!插件能做什么?IDEA 的插件几乎可以做任何事情,因为它把 IDE 本身的能力都封装好开放出来了。主要的插件功能包含以下四种:自定义语言支持:如果有 IDEA 暂时不支持的语言,你可以自己写一个插件来支持,例如 Go 语言原来的支持就是通过插件做的,后来单独做了一个 Goland。官方有自定义语言插件支持的教程。框架支持:例如Struts 2 的框架支持工具集成:可以给 IDEA 的自带功能进行增强,例如对 Git 的操作增加 CodeReview 的功能。参考Gerrit用户界面:自定义的插件改变用户界面。参考BackgroundImage我为了减少重复代码的编写,写了一个代码生成的插件IDEA代码生成插件CodeMaker,支持自定义代码生成的模板。Hello world 插件依照惯例,我们从 Hello world 开始。新建一个 Gradle 的插件工程有些教程推荐用 IDEA 默认的插件工程来开始,但是我比较推荐用 Gradle 来管理整个插件工程,后面的依赖管理会很方便,否则都得靠手动管理。点击新建工程,选择 Gradle接下来填写项目属性配置 Gradle,用默认配置就行新建完工程之后,IDEA 会自动开始解析项目依赖,因为它要下载一个几百兆的 SDK 依赖包,所以会比较久,打开科学上网能快一点。Gradle 依赖解析完成之后,项目结构如下图,其中 plugin.xml 是插件的配置,build.gradle 是项目依赖的配置(类比 pom.xml)。下面就是默认生成的 plugin.xml<idea-plugin> <!–插件id–> <id>com.xiaokai.test.demo</id> <!–插件名称–> <name>Demo</name> <!–开发者信息–> <vendor email=“support@yourcompany.com” url=“http://www.yourcompany.com”>YourCompany</vendor> <!–插件说明–> <description><![CDATA[ Enter short description for your plugin here.<br> <em>most HTML tags may be used</em> ]]></description> <!– please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html on how to target different products –> <!– uncomment to enable plugin in all products <depends>com.intellij.modules.lang</depends> –> <!–依赖的其他插件能力–> <extensions defaultExtensionNs=“com.intellij”> <!– Add your extensions here –> </extensions> <!–插件动作–> <actions> <!– Add your actions here –> </actions></idea-plugin>创建一个 ActionAction 是 IDEA 中对事件响应的处理器,它的 actionPerformed 就像是 JS 中的 onClick 方法。可以看出来,插件的开发本质上跟 web、Android 的开发没有什么不同,因为都是事件驱动的编程。我们可以直接使用 IDEA 提供的 Action 生成器点击 OK 之后会在 src 生成类文件:package com.xiaokai.test;import com.intellij.openapi.actionSystem.AnAction;import com.intellij.openapi.actionSystem.AnActionEvent;public class HelloWorldAction extends AnAction { @Override public void actionPerformed(AnActionEvent e) { // TODO: insert action logic here }}同时,动作的信息也会注册到 plugin.xml 中 <!–插件动作–> <actions> <!– Add your actions here –> <action id=“demo.hello.world” class=“com.xiaokai.test.HelloWorldAction” text=“HelloWorld” description=“Say Hello World”> <add-to-group group-id=“GenerateGroup” anchor=“last”/> </action> </actions>弹出对话框创建完 Action 之后我们就要开始往里面写逻辑了,既然是 Hello World 教学,那我们就来试一下最简单的弹出对话框。 @Override public void actionPerformed(AnActionEvent e) { //获取当前在操作的工程上下文 Project project = e.getData(PlatformDataKeys.PROJECT); //获取当前操作的类文件 PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE); //获取当前类文件的路径 String classPath = psiFile.getVirtualFile().getPath(); String title = “Hello World!”; //显示对话框 Messages.showMessageDialog(project, classPath, title, Messages.getInformationIcon()); }代码写完之后,打开 Gradle 的界面,点击 runIde 就会启动一个安装了插件的 IDEA,然后就可以进行测试。你还可以右键启动 Debug 模式,这样还能进行断点。运行的效果如下图:可以看到,我们右键打开 Generate 菜单之后,里面最后一项就是我们添加的 Action,进阶的教程如果想学习更多的原理和设计理念可以看IntelliJ Platform SDK的官方文档。不过老实说,它的文档写的挺差的,基本上就是简单讲了一下概念和原理,没有深入的分析。所以如果要深入研究还得靠自己。最靠谱的学习方式就是看别人写的插件,举个例子,你想知道怎么样实现自动生成代码,你就去找支持这个功能的插件,看他的源码是怎么写的。我当时写CodeMaker的时候也是靠自己啃源码之后写出来的。下面我简单介绍一下我用过的一些 API,这些 API 基本都没有文档说明,全靠代码相传。判断当前光标选择的元素是什么 //获取当前事件触发时,光标所在的元素 PsiElement psiElement = anActionEvent.getData(LangDataKeys.PSI_ELEMENT); //如果光标选择的不是类,弹出对话框提醒 if (psiElement == null || !(psiElement instanceof PsiClass)) { Messages.showMessageDialog(project, “Please focus on a class”, “Generate Failed”, null); return; }获取当前类文件的所有类对象一个类文件中可能会有内部类,所以读取的时候返回的是一个列表 public static List<PsiClass> getClasses(PsiElement element) { List<PsiClass> elements = Lists.newArrayList(); List<PsiClass> classElements = PsiTreeUtil.getChildrenOfTypeAsList(element, PsiClass.class); elements.addAll(classElements); for (PsiClass classElement : classElements) { //这里用了递归的方式获取内部类 elements.addAll(getClasses(classElement)); } return elements; }格式化代码 public static void reformatJavaFile(PsiElement theElement) { CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(theElement.getProject()); try { codeStyleManager.reformat(theElement); } catch (Exception e) { LOGGER.error(“reformat code failed”, e); } }使用粘贴板 CopyPasteManager.getInstance() .setContents(new SimpleTransferable(table.toString(), DataFlavor.allHtmlFlavor));更多更多的技巧可以参考我的项目CodeMaker,以及其他的开源插件。本文作者:风马萧萧 阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

February 25, 2019 · 2 min · jiezi

高效开发者是如何个性化VS Code插件与配置的?

译者按: IDE是生产力的保证!原文:Visual Studio Code Settings and Extensions for Faster JavaScript Development译者: Fundebug本文采用意译,版权归原作者所有2年之前,我放弃了Sublime Text,选择了Visual Studio Code作为代码编辑器。我每天花在VS Code上的时间长达5~6个小时,因此按照我的需求优化VS Code配置十分必要。过去这2年里,我试过各种各样的插件与配置,而现在我感觉一切都完美了,是时候给大家分享一下我的使用技巧了!插件VS Code有着非常丰富的插件,这里我给大家推荐几个我最喜欢的VS Code插件。Prettier Code Formatter下载量:167万我使用Prettier来统一代码风格,当我保存HTML/CSS/JavaScript文件时,它会自动调整代码格式。这样,我不用担心代码格式问题了。由于Prettier本身不能个性化配置,有时可能会引起不适,但是至少保证团队成员可以轻易统一代码风格。npm下载量:119万npm插件可以检查package.json中所定义的npm模块与实际安装的npm模块是否一致:package.json中定义了,但是实际未安装package.json中未定义,但是实际安装了package.json中定义的版本与实际安装的版本不一致npm Intellisense下载量:105万npm Intellisense插件会为package.json建立索引,这样当我require某个模块时,它可以自动补全。Bracket Pair Colorizer下载量:95万Bracket Pair Colorizer可以为代码中的匹配的括号自动着色,以不同的颜色进行区分,这样我们可以轻易地辨别某个代码块的开始与结束。Fundebug, 1代码搞定BUG监控!Auto Close Tag下载量:117万Auto Close Tag插件的功能非常简单,它可以自动补全HTML/XML的关闭标签。GitLens下载量:164万我非常喜欢Gitlens,因为它可以帮助我快速理解代码的修改历史。Current Line Blame:查看当前行代码的结尾查看最近一次commit的姓名、时间以及信息Current Line Hovers:在当前行代码的悬浮框查看详细的最近一次的commit信息。Markdown All in One下载量:45万Markdown All in One插件帮助我编写README以及其他MarkDown文件。我尤其喜欢它处理列表以及表格的方式。自动调整列表的数字序号自动格式化表格用户配置除了安装各种各样的插件,我们还可以通过配置VS Code的User Settings来个性化我们的VS Code。字体设置我非常喜欢带有ligatures(合字、连字、连结字或合体字)的字体。ligatures就是将多于一个字母的合成一个字形。我主要使用Fira Code作为我编程所使用的字体,如下图中的=>与===:我的字体配置如下:“editor.fontFamily”: “‘Fira Code’, ‘Operator Mono’, ‘iA Writer Duospace’, ‘Source Code Pro’, Menlo, Monaco, monospace”,“editor.fontLigatures”: true关于缩进,我是这样配置的: “editor.detectIndentation”: true, “editor.renderIndentGuides”: false,import路径移动或者重命名时,自动更新:“javascript.updateImportsOnFileMove.enabled”: “always”,user-settings.json下面是我的VS Code的配置文件user-settings.json:{ “workbench.colorCustomizations”: { “activityBar.background”: “#111111”, “activityBarBadge.background”: “#FFA000”, “list.activeSelectionForeground”: “#FFA000”, “list.inactiveSelectionForeground”: “#FFA000”, “list.highlightForeground”: “#FFA000”, “scrollbarSlider.activeBackground”: “#FFA00050”, “editorSuggestWidget.highlightForeground”: “#FFA000”, “textLink.foreground”: “#FFA000”, “progressBar.background”: “#FFA000”, “pickerGroup.foreground”: “#FFA000”, “tab.activeBorder”: “#FFA000”, “notificationLink.foreground”: “#FFA000”, “editorWidget.resizeBorder”: “#FFA000”, “editorWidget.border”: “#FFA000”, “settings.modifiedItemIndicator”: “#FFA000”, “settings.headerForeground”: “#FFA000”, “panelTitle.activeBorder”: “#FFA000”, “breadcrumb.activeSelectionForeground”: “#FFA000”, “menu.selectionForeground”: “#FFA000”, “menubar.selectionForeground”: “#FFA000” }, “editor.fontSize”: 14, “editor.lineHeight”: 24, // These are for subliminal, check them out. “editor.hideCursorInOverviewRuler”: true, “editor.lineNumbers”: “on”, “editor.overviewRulerBorder”: false, “editor.renderIndentGuides”: false, “editor.renderLineHighlight”: “none”, “editor.quickSuggestions”: true, // end subliminal changes “editor.fontFamily”: “‘Fira Code’, ‘Operator Mono’, ‘iA Writer Duospace’, ‘Source Code Pro’, Menlo, Monaco, monospace”, “vsicons.projectDetection.autoReload”: true, “editor.formatOnPaste”: false, “editor.formatOnSave”: true, “editor.fontLigatures”: true, “prettier.tabWidth”: 4, “editor.wordWrap”: “on”, “editor.detectIndentation”: true, “workbench.iconTheme”: “eq-material-theme-icons-palenight”, “editor.minimap.enabled”: false, “editor.minimap.renderCharacters”: false, “prettier.parser”: “flow”, “workbench.editor.enablePreview”: false, “emmet.includeLanguages”: { “javascript”: “javascriptreact”, “jsx-sublime-babel-tags”: “javascriptreact” }, “emmet.triggerExpansionOnTab”: true, “emmet.showExpandedAbbreviation”: “never”, “workbench.statusBar.visible”: true, “workbench.activityBar.visible”: true, “workbench.editor.showIcons”: false, “editor.multiCursorModifier”: “ctrlCmd”, “explorer.confirmDelete”: false, “window.zoomLevel”: 0, “javascript.updateImportsOnFileMove.enabled”: “always”, “materialTheme.accent”: “Yellow”, “editor.cursorBlinking”: “smooth”, “editor.fontWeight”: “500”}如果你想知道更多的VS Code使用技巧,可以查看VSCode Can Do That。推荐阅读30个极大提高开发效率的VS Code插件[我为什么推荐Prettier来统一代码风格关于FundebugFundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了6亿+错误事件,得到了Google、360、金山软件等众多知名用户的认可。欢迎免费试用! ...

February 25, 2019 · 1 min · jiezi

什么?你竟然还没有用这几个chrome插件?

前言其实18年之前写过一篇关于chrome插件的文章,里面安利了4个chrome插件。鉴于这已经是9102年了,之前觉得好用的chrome插件跟新了解到的比起来,还是差了那么点味道。所以决定再更新一波,顺便补上之前漏掉的几个插件。运用有效的有用的插件,会让我们的工作在一个相对舒适的状态,工作起来更加的流畅。Toby-不直观算我输大家可以将Toby当成加强版的书签栏,大家可以分类把常去的网站收藏起来,还可以正对每个分类打上对应的tag,在右上角进行筛选。当你打开了很多要用的网站,但是不得不关闭电脑时,toby可以一次性将目前打开的所有的网页全部存下来,下次再打开浏览器时,直接恢复就可以了。官网地址:–>戳这<–安装地址:–>戳这<–todoist-忘了要做什么是不可能的如果你每天都太多的事情需要做,但是记性不太好,有些时候会把大部分需要做的事情忘记,那么你可能需要todoist。这是一个插件式的to-do-list。在App Store里面还有桌面版的todoist,登陆同样的账号就可以实现数据联动。官网地址:–>戳这<–安装地址:–>戳这<–recover close tab-再也不翻历史记录经常手残把需要用到的网页给关掉了?关掉了还不不知道网址?不知道网址还要去历史记录中找一遍?recover-close-tab就是为你准备的。它可以直接打开你最后一个关闭的网页。特别适合手残党。安装地址:–>戳这<–saladict-妈妈再也不用担心我看不懂英文文档这是一款翻译用的插件。对一个需要翻译的句子或者单词,给出多种翻译工具的参考。只需要简单的双击单词,再hover旁边的logo,就可以了。有的时候这个翻译工具的翻译结果和另外一个工具的翻译结果是有一定的差别的,所以综合多个结果参考,才能更好的理解原文的意思。官网地址:–>戳这<–安装地址:–>戳这<–crx-mouse-这辈子不可能再点回退键自从用了这个插件之后,我觉得再点击左上角的退回键是有多么的难受。利用这个鼠标手势插件,按住右键轻轻往左一滑,就可以回退到上个访问的网页。就像我之前说的,很流畅。还有很多其他的手势可以用,例如移动到左边的tab、移动到右边的tab、new一个tab、关闭当前tab、前进、后退、快速向下滑一页、快速向上滑一页等等,十分有用。官网地址:–>戳这<–安装地址:–>戳这<–octotree-终于可以安静的看源码了在github上看一些项目的源码的时候,回到上一级的体验很不好,有的时候要等很久,有的时候找文件也要很久。而这个插件可以像你的ide一样将整个项目的树形结构展示出来。安装地址:–>戳这<–写在后面欢迎各位大佬安利你们觉得好用的插件,大家可以一起分享交流,相互提升自己的"用户体验"。

February 16, 2019 · 1 min · jiezi

IDE 插件新版本发布,开发效率 “biu” 起来了

近日,Cloud Toolkit正式推出了面向 IntelliJ 和 Eclipse 两个平台的新款插件,本文挑选了其中三个重大特性进行解读,点击文末官网跳转链接,可查看详细的版本说明。本地应用一键部署到任何机器上IDE 内置的命令行终端文件上传到服务器添加机器到 IntelliJ 或 Eclipse 中需要重点提下的是,虽然这个插件是阿里云官方插件,但了解到我们的开发者,还有不少原来的机器,以及线下环境,因此,这个插件不仅仅适用于阿里云 ECS,任何支持标准 SSH 协议的机器,都适用滴!在 IntelliJ 或 Eclipse,可以通过插件提供的图形引导界面,将机器配置到 IDE 中去。内置终端 Terminal在 IDE 内,开发者可以直接通过内置的终端 Terminal,即可一键快速登陆远程服务器。部署应用到远程服务器Cloud Toolkit 帮助开发者将本地应用程序一键部署到线下自有 VM,或阿里云 ECS、EDAS 和 Kubernetes 中去。当您每次修改完代码后,是否正在经历反复地打包?采用 SCP 工具上传?使用XShell或SecureCRT登陆服务器?替换部署包?重启?现在开始,请把这些重复繁琐的工作交给 Cloud Toolkit 吧!部署到 ECS完成编码后,无需在一系列运维工具之间切换,只需在 Cloud Toolkit 的图形界面上选择目标 ECS 实例,即可将应用部署至 ECS 指定目录部署到线下自有 VM支持 SSH 标准协议,你甚至可以将应用部署到任意机器中去部署到 EDAS针对阿里云 EDAS 开发者, 可以将本地代码和云端应用进行关联,实现自动化的部署部署到 Kubernetes针对阿里云 Kubernetes 开发者, 可以将本地代码和云端容器进行关联,实现自动化的镜像上传和部署文件上传Cloud Toolkit 帮助开发者在 IDE 内,一键将本地或者远程 URL 文件上传到服务器指定目录下去,无需在各种 FTP、SCP 工具之间频繁切换。更为重要的是,文件上传完毕后,还支持命令执行,比如:文件解压缩、程序启动等。官网https://toolkit.aliyun.com文档中心https://yq.aliyun.com/articles/665049需求Bug反馈https://www.wenjuan.com/s/emIFb2/本文作者:银时,Cloud Toolkit产品经理,《从Paxos到ZooKeeper》作者。立即点击下载官网:https://toolkit.aliyun.com本文作者:中间件小哥阅读原文本文为云栖社区原创内容,未经允许不得转载。

January 17, 2019 · 1 min · jiezi

vue点击弹框搜索列表功能

先看下开发完成的功能本来想借助element-ui里的 el-select和el-input组合来做但是在input框里面输入内容不能用上下键选择到具体搜出来的列表还有一个问题是当用上下键操作时移到最后一行再回到第一行的时候它会类似锚点一样定位到第一行从而把input框卷入到不可见的区域去了所以觉得这样的体验不是很好,自己就重新做了一个已经上传了到npm上去了npm下载地址npm install –save v-select-search引用import ‘v-select-search/lib/v-select-search.css’;import vSelectSearch from ‘v-select-search’;Vue.use(vSelectSearch);demo<template> <div style=“width:250px;overflow:hidden;margin:250px auto;"> <ct-select v-model=“text” @getSearchName=“getName”> <ct-option v-for="(item, index) of dataList” :key=“index” :value=“item.value” :label=“item.label”> </ct-option> </ct-select> </div></template><script type=“text/javascript”> import axios from ‘axios’; export default { name: ‘’, data() { return{ text: ‘’, dataList:[], } }, mounted() { axios.get(’/v2/book/search?q=vue&alt=json&start=1&count=45’) .then((data)=>{ this.dataList = []; for(let v of data.data.books) { this.dataList.push({ value: v.id, label: v.title }) } }) .catch(function(error){ console.log(error); }); }, methods: { getTextHandler() { console.log(this.text); }, getName(val) { axios({ method:‘POST’, url:’/v2/book/search’, data:{ q: val, alt:‘json’, start: 1, count: 15 } }).then((data)=>{ this.dataList = []; for(let v of data.data.books) { this.dataList.push({ value: v.id, label: v.title }) } }) .catch(function(error){ console.log(error); }); }, } }</script>基本配置参数功能默认值getSearchName获取搜索文本 data数据格式 [{label: ‘飞机’, value: 1}] visibleInput是否隐藏搜索框falseautoQuery是否输入后就触发truewidth设置输入框宽度值210delay请求延时间隔(autoQuery为false时)500git地址 ...

January 15, 2019 · 1 min · jiezi

mybatis增强工具MyBatis-plus

如果你正在用mybatis,那MyBatis-plus你不能错过,配合使用可极大简化开发、提高效率!简介MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。愿景我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P、2P,基友搭配,效率翻倍。特性无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer2005、SQLServer 等多种数据库支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )支持关键词自动转义:支持数据库关键词(order、key……)自动转义,还可自定义关键词内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击其中两大点可极大提高开发效率:代码生成器:采用代码或者 Maven 插件可快速生成 Dao、 Model 、 Service 、 Controller 层,Mapper.xml等代码,一键生成,无需重复编码强大的 CRUD 操作:内置通用 Mapper、通用 Service,无需编写其他代码,即用期做CRUD操作,以及自带分页插件,配置一下即可使用以下为CRUD 操作例子public interface FileTypeService extends IService<FileType> {}//注意:FileTypeService中,未写任何代码 //继承了IService通用Service public void addTest(){ //新增 FileType fileType = new FileType(); fileType.setName(“测试4”); fileTypeService.insert(fileType); } public void deleteTest(){ //根据id删除 fileTypeService.deleteById(1); //自定义条件删除 fileTypeService.delete(new EntityWrapper<FileType>().eq(“name”,“测试3”)); } public void getOneTest(){ //查询单个实体 条件为name为测试3 fileTypeService.selectOne(new EntityWrapper<FileType>().eq(“name”,“测试3”)); } public void listTest(){ //查询列表 只查"name"列 fileTypeService.selectList(new EntityWrapper<FileType>().setSqlSelect(“name”)); } public void selectPage(){ //分页查询 //参数Map Map<String,Object> param = new HashMap<>(); //当前页数 param.put(“page”,1); //每页显示 param.put(“limit”,20); //根据id字段倒序排序 param.put(“field”,“id”); param.put(“order”,“desc”); //分页查询 Page<FileType> page = fileTypeService.selectPage(new MapQuery(param).getPage()); }一行代码即可实现CRUD,单仅支持单表查询,如果需要关联多个表,还是得用以前的方法,写sql实现了支持SpringMvc和SpringBoot集成,具体使用请移步官网哈~ THANDKSEnd -一个立志成大腿而每天努力奋斗的年轻人伴学习伴成长,成长之路你并不孤单! ...

January 9, 2019 · 1 min · jiezi

chrome插件编写

chrome浏览器Chrome 浏览器追求的是全方位的快速体验。它不仅能飞快地从桌面上启动,而且能瞬间完成网页加载,还能以闪电般的速度运行网络应用。 Chrome 浏览器整洁且直观。您可在同一位置进行搜索和导航,可随意排列标签页,既快捷又轻松。您不必成为安全专家即可放心地浏览网络。Chrome 默认会为用户提供安全保护,并可供所有人轻松且安全地使用。内置地址所有内置地址列表:chrome://chrome-urls/开发者常使用列表:开发者高级选项:chrome://flags/dns缓存清除: chrome://net-internals/#dns扩展应用程序:chrome://extensions/侦测页面[包括外接安卓设备]:chrome://inspect/#devices比较全的的列表:(1)chrome://accessibility/可达性分析,默认是关闭的,点击accessibility off后变成accessibility on|show accessibility tree,点击show accessibility tree显示分析树(2)chrome://appcache-internals/应用程序缓存,显示所有的应用程序缓存路径列表(3)chrome://apps/当前chrome安装的应用列表(4)chrome://blob-internals/当前内部的blob文件列表(5)chrome://bookmarks/ 书签管理器(6)chrome://cache/当前缓存文件的url列表,点击url可以看到对应的缓存文件内容,包括类型 编码 过期时间等概要信息,以及文件内容等具体信息,以二进制方式显示(7)chrome://chrome/chrome关于页面,显示当前chrome的版本信息。(8)chrome://chrome-urls/显示chrome可用的伪url列表(9)chrome://components/显示chrome的组件列表,可以点击"检测是否有更新"来检测当前组件是否有新版本,如果有,可以直接下载更新。(10)chrome://conflicts/模块冲突检测,会列出当前已加载到主进程中的所有模块,包括模块的数量、签名方,版本以及模块所在的位置(11)chrome://copresence/Google共存信息列表,显示共存信息,包括有效指令、传输的令牌、收到的令牌(12)chrome://crashes/显示当前chrome的崩溃报告,需要启用崩溃报告后才会显示。https://support.google.com/chrome/answer/96817中说明了如何启用崩溃报告。设置后需要重启chrome才能生效(13)chrome://credits/类似于演职员列表,是一份chrome使用的一些开源组件或工具的列表,包括各种工具的主页和授权文件。但第一行的“Accessibility Audit library, from Accessibility Developer Tools”的主页居然链接的是一份未压缩的js源码,不知道是啥情况(14)chrome://device-log/设备日志,chrome://device-log/?refresh=秒数 可以自动刷新(15)chrome://devices/显示当前在网络中注册的设备,可以添加打印机到云打印(16)chrome://discards/丢弃的标签页面,标签页面按照感兴趣的程度由高到低排序。如果当前的物理内存超出运行内存后,最不感兴趣的tab页面可能被丢弃掉。(17)chrome://dns/如果当前显示DNS pre-resolution and TCP pre-connection is disabled.则打开设置,勾选“预提取资源,以便更快速地加载网页”然后刷新当前页面就可以看到相关页面预加载的分析数据列表了(18)chrome://downloads/下载内容页面(19)chrome://extensions/扩展程序列表(20)chrome://flags/实验性功能列表,可以在这里启用这些实验性的功能(21)chrome://flash/显示flash插件的版本信息,安装位置及显卡的一些具体信息,包括显卡版本号,GPU(22)chrome://gcm-internals/GCM(Google Cloud Messaging )内部构建信息,包括签到、连接、注册、发送、接收相关的日志信息。(23)chrome://gpu/显示当前的GPU信息,包括图像功能的状态(各种功能的硬件加速)、Gpu内存buffer的状态(24)chrome://help/chrome关于页面,与chrome://chrome/是同样的效果(25)chrome://histograms/直方图,柱状图,显示了浏览器启动到上一个页面加载的状态统计数据,重新加载可以获取到当前页面加载数据。(26)chrome://history/历史记录页面,显示所有的浏览记录(27)chrome://indexeddb-internals/显示chrome的内部数据库的实例列表,包括所有的内部数据所在的路径,最后修改时间及数据库大小(28)chrome://inspect/检测设备,页面,扩展插件,应用程序等,在Pages标签中显示当前打开的所有tab页面,点击inspect直接跳转到该页面,并调起开发者工具。(29)chrome://invalidations/失效的调试信息,失效调试服务状态,注册的失效服务处理器等信息(30)chrome://local-state/本地状态,显示的是一个json格式的文件,包括了浏览器的很多状态信息,插件的详细信息(31)chrome://media-internals/当前的多媒体内部构建信息,如果当前使用的是浏览器内部的播放器而不是flash播放器的话,会在Players、Audio、Video Capture显示播放文件的详细信息,在Player中可以显示当前播放的适配的详细信息,包括音频、视频及播放器的内部状态信息。(32)chrome://memory会自动跳转到chrome://memory-redirect/,显示浏览器占用的总内存以及各个内部进程占用的内存,包括各个Tab页面占用的物理内存和虚拟内存数,包括私有内存,共享内存及总内存(33)chrome://memory-internals/内存内部详细信息,点击Update后可以获取到当前浏览内存的使用信息,包括一个json格式的数据。下发有一个列表,可以显示出所有进程所占用的内存,以及V8引擎使用的和分配的内存。(34)chrome://nacl/NaCl的版本信息,包括NaCl的插件位置,版本信息(35)chrome://net-internals网络内部构件的信息。包括代理信息、时间信息、DNS信息。其中的DNS可以显示当前浏览器中缓存的DNS信息,包括过期时间(36)chrome://newtab打开一个新的标签页(37)chrome://omnibox/omnibox 的测试工具 ,omnibox API https://developer.chrome.com/extensions/omnibox(38)chrome://password-manager-internals/显示捕获到的密码管理日志。当这个页面被关闭掉,则已有的记录会被清除,并且不再捕获。(39)chrome://plugins/显示当前chrome中所使用的插件及版本信息,可以在该页面点击 停用 来停用某个插件(40)chrome://policy/显示已设置的政策,默认是没有的(41)chrome://predictors/显示预测列表,包括自动完成动作的预取列表,也就是在地址栏输入某些字母后,出现对应的完整地址的列表,还包括(42)chrome://print/浏览器打印页面(43)chrome://profiler/分析器,可以按照不同的条件分组及排序,主要应该是用于分析chrome的各种进程的内部信息(44)chrome://quota-internals/存储空间的配额信息,包括了三个tab页面,Summary、Usage&Quota、DataSummary标签页显示的是一个磁盘总的空闲空间大小以及混合统计的一些数值Usage&Quota 标签页显示的是临时的、持久化的和同步的数据库中的具体数据项Data标签中点击Dump按钮可以生成一个json格式的文件,包含了前面两个tab中的统计信息和分类信息。(45)chrome://serviceworker-internals/serviceworker的内部组件,可以勾选选择框,进行调试ServiceWorker的项目主页: https://www.chromium.org/blink/serviceworker介绍视频:https://youtu.be/4uQMl7mFB6g视频中介绍者的的代码:https://github.com/jakearchibald/simple-serviceworker-tutorialw3c ServiceWorker的Demo:https://github.com/w3c-webmob/ServiceWorkersDemos(46)chrome://settings/chrome的设置页面(47)chrome://signin-internals/当前chrome登录者信息,包括账户状态的各种信息(48)chrome://suggestions/推荐信息,也就是打开新的tab页是默认显示的推荐网站的缩略图页面的那些网站,包含了网站的信息和过期时间。(49)chrome://sync-internals/chrome账户同步信息,包含了多个tab页面,首页显示的是同步的概要信息,包含同步相关的各种信息,包括上一次同步的时间,Token请求时间,接收时间等。后面的tab按照同步的不同类型展示了不同信息,包括了同步的分类、事件等(50)chrome://system/系统的诊断数据,包括当前Chrome的版本信息、操作系统的版本信息、同步数据信息、数据压缩代理是否启用、内存使用概况信息、usb键盘检测信息。(51)chrome://terms/chrome服务条款(52)chrome://thumbnails/顶级网站的url,分为包含缩略图的和未包含的、聚焦和未聚焦,估计也是用于在新开tab页面做推荐时使用(52)chrome://tracing/可以在该页面录制chrome的跟踪信息,也可以使用监控(53)chrome://translate-internals翻译内部组件信息,此处包含了对于chrome翻译的设置,包括用户自定义的不需要自动翻译的网站列表,可以在此处进行编辑,删除包括了当前翻译引擎的设置,以及翻译组件的日志信息,日志包括了检测日志、事件日志和错误日志,其中检测日志可以dump为json格式的文件。追踪日志会将打开该页面后的浏览器访问的网页内容抓取出来,包括要翻译的文字内容列表(54)chrome://user-actions/用户操作列表,包括操作类型和发生时间。(55)chrome://version/显示当前chrome的版本信息,包括版本号、JavaScript 引擎版本号,Flash插件版本号,用户代理信息等(56)chrome://view-http-cache/显示当前http缓存的url列表,点击对应的url,可以打开缓存的文件,包含了文件的具体信息和二进制内容信息(57)chrome://webrtc-internals/webrtc内部组件信息。点击Create Dump按钮,可以下载当前的webrtc连接的数据信息和状态信息快照数据(58)chrome://webrtc-logs/webrtc日志信息应用商店扩展应用商店包含了很多实用的扩展应用,adblock,广告过滤开发人员小心你的本地调试代码也被拦截了Momentum 新开页面的美化Proxy SwitchyOmega 浏览器代理设置二维码小助手 当前页面的二维码生成器捕捉网页截图 - FireShot 滚动全局页面截图插件编写参考chrome扩展入门编一个入门的插件;扩展由不同但关联的组件构成。组件可以包括后台脚本,内容脚本,选项页面,UI元素和各种逻辑文件,根据扩展的具体功能加入需要的功能组件模块,其中使用的技术栈就是HTML、JS、CSS,而最后的扩展文件就是压缩的HTML,CSS,JavaScript,图像和Web平台中使用的其他文件得出的包,扩展具有广泛的功能。他们不仅可以修改用户查看、交互的Web页面内容,甚至可以扩展和更改浏览器本身的行为【所以每个浏览器的扩展可能有点不一样】,一个常见的chrome扩展会包含一下的一些内容:manifest.json清单文件【类似配置文件,表明权限、版本、名称、介绍、配置入口等信息】ico 【应用扩展商店和chrome浏览器上的工具栏展示的图标】Background Script 【后台脚本是扩展的事件处理程序;它包含对扩展重要的浏览器事件的侦听器。它处于休眠状态,直到事件被触发然后执行脚本逻辑。有效的后台脚本仅在需要时加载,在空闲时卸载】UI Elements 【UI界面就是正常的html页面,主要是交互中的弹窗等】Content Script 【这个就是操作用户打开的页面】Options Page 【扩展可供用户配置的页面,用于修改扩展中的一些默认配置参数】一个改变当前查看页面的背景色的扩展插件实现想要实现这个功能,很简单就知道需要一下模块:manifest.json 【配置】ico 【图标】Background Script 【图标按钮点击交互】UI Elements 【点击图标是展示的弹窗页面】Options Page 【可供用户选择修改默认的背景色的页面】Content Script 【修改用户查看的页面的背景色】manifest.json配置文件,权限、弹窗页面、ico位置等信息。{ “name”: “Getting Started Example”, “version”: “1.0”, “description”: “Build an Extension!222”, “permissions”: [“activeTab”, “declarativeContent”, “storage”], “background”: { “scripts”: [“background.js”], “persistent”: false }, “options_page”: “options.html”, “page_action”: { “default_popup”: “popup.html”, “default_icon”: { “16”: “fh-icon.png”, “32”: “fh-icon.png”, “48”: “fh-icon.png”, “128”: “fh-icon.png” } }, “icons”: { “16”: “fh-icon.png”, “32”: “fh-icon.png”, “48”: “fh-icon.png”, “128”: “fh-icon.png” }, “manifest_version”: 2}background.js后台脚本,chrome.runtime.onInstalled.addListener(function() { chrome.storage.sync.set({color: ‘#f00’}, function() { console.log(“The color is green.”); }); chrome.declarativeContent.onPageChanged.removeRules(undefined, function() { chrome.declarativeContent.onPageChanged.addRules([{ conditions: [new chrome.declarativeContent.PageStateMatcher({ pageUrl: {}, }) ], actions: [new chrome.declarativeContent.ShowPageAction()] }]); });});popup.html点击ico的时候弹出的页面,只有一个可被点击的色块按钮。<!DOCTYPE html> <html> <head> <style> button { height: 30px; width: 30px; outline: none; } </style> </head> <body> <button id=“changeColor”></button> <script src=“popup.js”></script> </body> </html>popup.js弹出页面的交互,点击弹窗页面中的按钮时,需要设置当前展示页面的背景色为chrome.storage存储的默认色值,let changeColor = document.getElementById(‘changeColor’);chrome.storage.sync.get(‘color’, function(data) { changeColor.style.backgroundColor = data.color; changeColor.setAttribute(‘value’, data.color);});changeColor.onclick = function(element) { let color = element.target.value; chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { chrome.tabs.executeScript( tabs[0].id, {code: ‘document.body.style.backgroundColor = “’ + color + ‘”;’}); });};options.html扩展应用页面可以查看每个扩展的详细介绍,这个页面就是扩展程序的扩展程序选项页面,用户可以自由配置扩展程序需要的参数【前提是扩展应用开发把配置参数放在这个页面供使用者修改了】。本案例是可供选择的背景色值。<!DOCTYPE html><html> <head> <style> button { height: 30px; width: 30px; outline: none; margin: 10px; } </style> </head> <body> <div id=“buttonDiv”> </div> <div> <p>Choose a different background color!</p> </div> </body> <script src=“options.js”></script></html>options.js扩展程序选项页面的交互脚本,在用户选择 options.html页面中的颜色块的时候,处理设置chrome.storage存储的默认色值,let page = document.getElementById(‘buttonDiv’); const kButtonColors = [’#3aa757’, ‘#e8453c’, ‘#f9bb2d’, ‘#4688f1’]; function constructOptions(kButtonColors) { for (let item of kButtonColors) { let button = document.createElement(‘button’); button.style.backgroundColor = item; button.addEventListener(‘click’, function() { chrome.storage.sync.set({color: item}, function() { console.log(‘color is ’ + item); }) }); page.appendChild(button); } } constructOptions(kButtonColors);上面实例是chrome官方提供的基础实例,还有很多API需要在使用的时候查看。不能科学上网的话,只能参考一下国内的其他浏览器的扩展开发,其实是类似的,基本都是借鉴的Chrome的方式。参考:chrome扩展入门chrome扩展综述 ...

December 26, 2018 · 2 min · jiezi

如何去设计前端框架能力?星巴克消息开放项目从0到1,从点到面的思考

本文由淘宝前端工程师罗嗣分享,主要讲述了作者在星巴克消息开放项目中的总结和思考,希望对大家有帮助,让业务分享更加有价值。摘要从满足星巴克项目需求单点出发,发散到从点到面的思考。从而总结了自己思考的基本流程(方法论)。从如下四个递进方面思考。业务拓展:拓展自有业务的边界,和其他业务合作共建,形成标准的能力透出, 合力共建。业务趋势:业务的特点和趋势是如何。技术可以如何储备来应对未来业务的变化。技术趋势:技术命题,技术趋势。选择适合的技术来解决现在的问题。保持技术对未来的弹性。需求问题:客观存在的事实,现在需求存在哪些问题,我们如何去帮助业务更加稳定,更加高效。本文提纲笔者从0到1构建一个IM前端系统,再从点到面思考整合突破原有的自有业务限制,尽量设计出的可扩展,可交互,甚至小而美的系统能力。本文会从如下几个方面去介绍。点:项目背景及需求难点(支付宝星巴克小程序入驻客服接待),以及现有的能力。面:需求做完反向思考,当前BC/CC遇到的问题及痛点,如何在同一个领域模型下做推动标准化能力。需求介绍项目背景客服接待能力由手淘消息平台和CCO团队合作共建,整体采用AMP+XSPACE的方案落地,AMP承接C端用户聊天界面,XSPACE承接B端聊天界面,同时接待又需要原有BC的聊天能力。星巴克客服接待两纵一横,底部需要对接不同的服务端,上层需要保证同一套UI来提升一致性体验。设计思路总体设计思想:设计分离出数据层和UI层,数据层和UI层以标准化协议对接。这样分层就可以解决当前业务遇到的问题,如下是当时需求的标准SDK事例点到面的思考星巴克客服消息接待开放是一种轻量级(H5形式)的客服接入能力。思考当前业务的问题是什么,如何改进,业务价值的意义等。 笔者会从如下几个方面去思考。原有H5旺旺由于历史原因有稳定性和体验的问题,这套方案能不能提供替换成原来的H5旺旺,同时对聊天接入统一收口(标准化组件)。从而达到更加稳定,更加的体验性。H5旺旺聊天可以投放到阿里系的其他端上(优酷,饿了嘛,拍卖等),甚至现在很多外投的广告业务。把H5聊天能力做强对淘宝的引流及成交都有很大的意义。同时集团里面还有小蜜作为客服聊天能力。能不能站在前端的角度思考整合输出。针对集团二方业务。需要定制个性化消息和UI能力,需要把SDK能力提供给他们去进行上层业务扩展,为保证他们低成本的接入需要提供基础能力,二方去扩展插件。同时工具链路上需要保证提高效率。生成闭环的开发环境,接入业务方只要关系自己的业务需求思考模型基于之前的背景和诉求,整体设计思路: 抽离UI层和数据层(模块),UI层和数据层基于Message实体进行标准化协议对接(桥梁)。工具链路垂直支持提高效能。 有如下几个方面衔接点:开放 UI组件 和 标准化SDK能力,让二方业务快速搭建,UI层 和 数据层之间用 标准化协议做桥梁连接在基础SDK上,会透出Context上下文(内部核心对象message,session,app)让业务去定制修改,业务方只需要去扩展插件。基于DEF脚手架体系提供相应工具链路支持,包括项目模板生成,项目测试,项目构建,完善可持续集成。业务价值在阿里做每件事情,需要明确这件事情的价值,这件事情投入产出比是多少。上文也陆续在提价值。 如图可以说明这件事价值实践方案上面几章介绍了项目背景,设计思路,思考模型和业务价值(PS:类似于论文前两章在介绍背景和理论知识)。这章主要是讲的项目实践。站在前端的角度,从四个方面去实践,并付相应代码地址。标准化协议: 由于消息领域模型是一致的,可以抽象出标准的 会话和 消息 格式。他是SDK和组件能力的桥梁SDK能力开放:提供标准化数据对接的能力,负责插件扩展能力。 业务入驻只需要开发业务相应的中间件(插件)。例如:各自业务的编解码模块,登录模块,消息处理模块组件能力开放:提供标准化的聊天能力组件。例如聊天入口接入标准化组件工具链路支撑:基于DEF脚手架体系,开发了def-kit-tbms套件。支撑项目全链路开发领域模型(标准化协议)为了达到消息标准化能力,需要把基本概念和接口达成一致。梳理两个基础概念: 会话 和 消息。会话conversation: 它是指AB通讯之间维持的一种关系,它是消息存储的载体消息message: 消息是一个对话的基本组成部分, 根据业务分为两大块消息,会话内消息和系统通知消息。会话内消息又可以分为基本消息和自定义消息。会话类型即时通讯 SDK 的核心概念「会话」,即 Conversation。我们将单聊和群聊(包括聊天室)的消息发送和接收都依托于 Conversation 这个统一的概念进行操作。会话属性备注id会话IDscene场景to聊天对象,账号或者群IDupdateTime会话更新时间unread未读数lastMsg此会话的最后一条消息custom扩展Json字符串消息类型IM SDK内的消息可以分为两类:会话内消息和系统通知消息。会话内消息只能出现并展示在聊天界面里,一般是应用内的一个用户发给另一个用户(或群组/聊天室)的消息,例如文本消息、图片消息都属于会话内消息。:会话内消息类型备注文本消息消息内容为普通文本图片消息消息内容为图片URL地址、尺寸、图片大小等信息语音消息消息内容为语音URL地址、时长、大小、格式等信息视频消息消息内容为视频文件的URL地址、时长、大小、格式等信息文件消息消息内容为文件的URL地址、大小、格式等信息,格式不限地理位置消息消息内容为地理位置标题、经度、纬度信息通知消息自定义消息可以用于消息接入扩展。 例如卡片消息,红包消息等。自定义消息**通知消息属于会话内的一种消息,用于会话内通知和提示场景。例如:群名称更新、某某某退出了群聊等。**会话和消息标准化格式标准化协议标准化会话格式标准化消息格式SDK能力开放SDK的设计参考了Koajs的设计原理(底层微创新了下)。Koajs的中间件思路: 中间件对于一次请求来处理,context分别集成了request和response对象, 同理可以映射成对一条收发消息的处理,面向切面的编程方式。。 在context中会集成message(消息),session(会话),app(如用户,初始化sdk信息等其他信息)。整个项目通过lerna进行了包管理,用Typescript写了SDK,并做了充分的单元测试,大家可以放心使用。整个项目分为了如下几个模块:@ali/tbms-compose: 函数组合模块,用于@ali/tbms-middlware服务@ali/tbms-middleware: 中间件模块@ali/tbms-util: 通用函数分装:如promise同步执行队列,mtop请求,event事件系统@ali/tbms-sdk: 消息标准化基础SDK,可以让业务扩展,补充插件测试说明:对底层支持的SDK都做了充分的单元测试,保证稳定性。后续版本更新提供差异性修改的检查使用事例组件能力开放由于需要多端投放,某些二方应用支持weex能力。从而选择了RAX技术方案。再在H5表现下对单聊做性能优化,现阶段完成聊天入口的统一接入组件,上层的组件在陆续完善中(完成度20%)。@ali/rax-tbms-chatwater tbms-components工具链路支撑基于DEF脚手架体系,开发了def-kit-tbms套件。提供项目全链路开发支撑。这个项目后续的项目搭建都采用standard-dev脚手架生成项目目录。例如:tbms-toolkit,tbms-packages总结这是一次完整的一个项目从0到1,从点到面的思考过程,建立模型到付诸于实践。从完成业务需求(需求做什么)到帮助业务成长(我能做什么)的思考过程。虽然只是站在前端角度在思考问题,但是方法论相信可以通用。后续Action改善原来的H5旺旺,使之更加稳定和更好的体验性。同时对聊天接入统一收口(标准化组件和标准化接入SDK)。Flag:利用业余时间,一月中旬前第一版本里程碑发布未完待续有什么IM相关的需求都可以联系我@罗嗣,共建标准化和生态。本文作者:罗嗣阅读原文本文为云栖社区原创内容,未经允许不得转载。

December 19, 2018 · 1 min · jiezi

蚂蚁金服 Service Mesh 渐进式迁移方案|Service Mesh Meetup 实录

摘要: Service Mesher Meetup 上海站演讲内容整理。小蚂蚁说:本文是基于在 Service Mesher Meetup 上海站的主题分享《蚂蚁金服 Service Mesh 渐进式迁移方案》内容整理,完整的分享 PPT 获取方式见文章底部。敖小剑,蚂蚁金服高级技术专家,十六年软件开发经验,微服务专家,Service Mesh 布道师,Servicemesher 社区联合创始人;龙轼,阿里巴巴技术专家、前京东 Hadoop 负责人、Hadoop 代码贡献者、现负责UC 基于 Kubernetes 自研的 PaaS 平台整体的稳定性。大家好,今天给大家带来的演讲主题是《蚂蚁金服 Service Mesh 渐进式迁移方案》,给大家介绍一下我们蚂蚁金服主站的 Service Mesh 迁移方案,在稍后的内容中我会给大家解释什么是“渐进式”。今天的演讲方式有些特殊,将会是两位讲师合作。我是敖小剑,来自蚂蚁金服中间件团队,另外一位讲师 龙轼 ,来自 UC 基础研发部。Service Mesh 演进路线今天的内容将会有四块主要内容:Service Mesh演进路线:介绍蚂蚁金服计划在主站落地Service Mesh的方案,由于涉及到大量的存量应用和超大规模,又要保证迁移过程的平滑,因此我们的落地方案相比社区方案要复杂的多。实现平滑迁移的关键:介绍在整个迁移方案中,为了实现平滑迁移的几个关键做法,然后今天我们将详细展开其他的一个关键点:DNS寻址方案。DNS寻址方案的演进:详细介绍Kubernetes/Istio/SOFAMesh一路演进过来的DNS寻址方式。DNS寻址方案的后续规划:介绍我们在DNS寻址方案上的后续规划。前两块内容将由我来为大家介绍,后两块内容将由我的同事 龙轼 为大家介绍。在展开内容之前,先看一下背景,Service Mesh在蚂蚁金服主站落地的背景:目标:需要满足我们对长期目标的认可,具体指服务间通讯走Service Mesh,而且是Istio这种带完整的控制平面的Service Mesh形态,基础设施要构建在k8s之上,而应用的形态要向微服务靠拢。现状:而现实是存在很多挑战,首先还有很多应用没有实现微服务化,而且我们的k8s普及程度也不够,还有非常多的应用没有运行在kubernets之上。Istio的成熟程度也稍显不足,不够稳定,更大的挑战的是Istio目前无法原生支持我们蚂蚁金服的规模,我们还在试图对Istio进行改进和扩展。最后,在落地时必须考虑的非常现实的一点:现有系统中为数众多的应用不可能一夜之间全部迁移。关键需求:因此在落地实施时,非常重要的需求是:要实现平滑迁移。简单说,微服务 + Service Mesh + kubernetes 是我们的目标,但是如何从现有体系出发,向目标平稳和坚实的迈进,必须给出可行的实践指导。今天演讲的内容,要给大家介绍的就是,在这样的背景下,我们蚂蚁金服选择的Service Mesh主站落地演进方案。这个方案预期会在2019年初全面铺开。主站落地方案的实施原则,这是我们在过去半年的实践中,总结归纳出来的行为指导:符合远期规划:一定要有清晰的长期目标,明确的知道未来的大方向。避免走弯路,避免浪费投资,理想状态是计划中的每一步都可以为下一步奠定坚实的基础。即使因为某些原因不得已妥协或绕行,也应该清晰的知道后面应该如何回归,谢绝中途推倒重来——代价太高,无法承受。循序渐进:认清现实,如此之大的变革,一定是需要分步进行,不要心存一步登天的幻想,现实可行的方式是小步快跑。将整个过程拆解为若干个大步骤,每一步的工作量和复杂度都控制在一个可以接受的范围内,以保证每一步都简单方便,切实可行。有可操作性:在操作层面上,要有足够的弹性,即每个步骤中的工作内容,都应该是可以分批进行。以步步为营的方式,逐步扩大战果,杜绝一刀切。在接下来的演进路线中,大家将会体会到这三个原则在实际落地时的指导作用。这个图的信息量有点大,描述的是 Service Mesh 和 k8s 落地可能的多种演进路线。我们先从最下面开始看,这是当前蚂蚁金服主站大多数应用的现状:即应用"部署在非k8s上",应用也"不是Service Mesh形态"。 然后看最上面,这是我们期望的蚂蚁金服主站未来的应用终极形态:应用"部署在k8s上",应用也迁移到了"Service Mesh形态"。这里有个特别的地方,我们将Service Mesh形态细分为两种模式:Sidecar模式:只有Sidecar,没有控制平面,和外部系统的各种集成都是在Sidecar中直接进行。这是第一代的Service Mesh,Linkerd/Envoy都是如此,华为基于ServiceComb演进而来的mesher,新浪微博的Mesh,包括我们蚂蚁金服基于MOSN开发的用于取代多语言客户端的Mesh方案。Istio模式:有完善的控制平面,可以提供强大的控制能力,而且从数据平面分离,这是第二代的Service Mesh,典型如Istio和Conkduit/Linkerd 2.0。之所以将Service Mesh形态细分,是因为我们有着这样一个特殊背景:目前的原生Istio无法支撑我们蚂蚁金服的规模,因此在改进完善Istio之前,我们不得不暂时在Sidecar模式下短暂停留。另外一个原因就是考虑到存量应用的迁移,多一个Sidecar模式作为中间缓冲,会让整个迁移过程平滑很多。现在我们来介绍图中展示的四条演进路线:左边的路线1,思路是先将应用迁移k8s部署,再迁移到Service Mesh形态。这条路线的最大好处,是过程中每个阶段的绝大多数投资都将最终得以保留,因为符合k8s+service mesh的远期目标。右边的路线2,思路是跳过k8s,先迁移到Service Mesh形态,一路演进到Istio模式,然后最后迁移到k8s。中间的路线3,直接一步到位,这个路线是Istio默认的方式,或者说Istio根本没有考虑过迁移的问题,默认客户已经有完善的k8s,然后将改造好的应用直接部署在Istio上。这个路线对于蚂蚁金服主站的复杂场景,当然是不现实的。(补充:只是对蚂蚁金服主站不合适,对于大多数公司,规模不是那么巨大,也没有历史负担,也有k8s基础,完全可行。)还有一条特别的路线4,走位飘忽,先和路线2一样迁移到Sidecar模式,然后走回路线1,上k8s,再在有k8s支持的情况下继续演进到Istio模式。下面我们来详细分析各条演进路线的优劣和实施条件。演进路线2,和路线1的核心差别,在于:是先上k8s,还是先上Service Mesh。而且路线2是在非k8s条件下一路演进Service Mesh到我们期望的终极形态Istio模式,这意味着过程中和最终目标有非常大的偏移。演进路线2的好处,在于第一步非常的自然:没有k8s的限制,因此不依赖基础设施,实施方便。毕竟,k8s普及度是个大问题。在原有的侵入式框架的客户端SDK基础上,通过包裹一个proxy,重用原有SDK的能力,可以非常快速的得到一个基本可用的Sidecar。除了多一个proxy外,没有引入太多的新概念和新思想,符合现有开发人员/运维人员的心智,容易接受因此,路线2特别容易落地,可以快速达成短期目标,直接拿到Service Mesh的部分红利,如:多语言支持,方便类库升级等。但是,这个路线的问题在于再往后走,开始完善Service Mesh的功能以向Istio模式靠拢时,由于没有k8s的底层支持,因此不得不做大量的工作来提供类k8s的功能。尤其是Istio的非k8s支持,官方方案基本上只是一个demo,完全不具备生产可用性,要完善好,工作量很大。而关键点在于,这些投入,在迁移到k8s时,又因为和k8s提供的功能重复而被放弃。因此,结合我们前面的原则(符合远期规划,不浪费投资),路线2对蚂蚁金服主站落地是不合适的。演进路线4是一个非常特殊的路线,可以理解为路线1(先上k8s再上Service Mesh)的短期妥协版本。因为路线1的前提条件是要先大规模铺开k8s,将现有应用迁移到k8s之后再继续往Service Mesh演进,这对于还没有普及k8s的公司来说是一个非常高的门槛,很容易因此受阻而无法启动。因此,如果暂时不具备k8s条件, 又不想就此止步,那么选择路线2是唯一的出路。而上面我们分析过,路线2虽然能够在第一步快速拿到短期红利,但是由于偏离长期目标后续发展会有问题。怎么办?路线4可以是这种场景下的一个折衷选择:在k8s没有铺开之前,第一步沿路线2走,先吃下非k8s下Sidecar模式快速落地的红利。然后第二步避开非k8s下继续演进到Istio模式的大坑,切换到路线1,回归长期目标。好处非常明显:在k8s未铺开前,先往前迈进一步,避免就此卡壳。和路线2一样,第一步可以快速的拿到短期红利。后续转为路线1后,因为符合远期规划,因此后续演进不存在投资浪费的问题缺点就是存在少量的投资浪费,毕竟非k8s下的Sidecar模式还是有些工作内容在迁移到k8s之后会有改动。不过,这个改动不会太大,和拿到的红利相比还是值得的。路线4在操作时,存在一个变数:现有应用在向Sidecar模式的Service Mesh迁移,是需要一定时间的。有一种可能,就是在迁移过程中,k8s的普及开始了。这个变数的发生,取决于Sidecar模式的Service Mesh普及快,还是k8s的普及快。对路线4的分析结果:这是(k8s没有普及的)特殊时期的选择。在对四条可能的演进路线分析完成之后,我们来具体介绍蚂蚁金服的最终选择。坦言说,在过去半年中,我们的演进路线有几次摇摆和修订,今天我们公布的路线,和过去几个月中我们通过 meetup/技术大会/博客文章 等方式透露出来的方式会有一些变化。主要原因是在过去的这半年中,一方面我们对Sercice Mesh的认知更加深入,另一方面是蚂蚁金服的k8s背景也在变化。首先,在今年年初,我们确认Service Mesh大方向时,k8s还没有在蚂蚁金服普及,而且也没有明确的时间表。因此,我们在一番调研之后,选择了两条腿走路的方式:在非k8s环境下,以Sidecar模式先进行少量落地,主要是替换掉原有的多语言客户端 (拿短期红利)。开发SOFAMesh,集成MOSN到Istio,增加对多种RPC协议的支持,增加对RPC服务模式的兼容(为最终目标做准备 )在今年6月底的杭州第一届Service Mesh 线下 meetup 中,我们公布了 SOFAMesh 项目,我当时做了一个演讲 大规模微服务架构下的Service Mesh探索之路 ,有兴趣的同学可以去回顾一下我们当时的背景/需求/设计方案。大概在今年九月,我们完成了对非k8s下运行istio的深入调研,得出的结论是要实现这个模式需要非常多的工作。而且,我们对Service Mesh的认知也更加深刻,明确了通过Service Mesh将传统中间件能力向以k8s为代表的基础设施层下沉的战略方向。期间,内部也明确了k8s普及的大方向,因此,综合这两个重要输入,我们选择放弃继续在路线2上继续演进(即 istio on 非k8s)的想法。关于这一点,有兴趣的同学可以去阅读我在10月份QCon大会上的演讲内容 长路漫漫踏歌而行:蚂蚁金服Service Mesh实践探索 。最近,k8s普及的时间表再一次明确提前,蚂蚁金服将会在短时间内开启k8s的大面积普及。因此,我们的演进路线再一次发生变化。目前最新的演进路线将会是这样:当前还没有开始迁移的应用(处于演进路线图最下方),将按照路线1的方式进行迁移:先迁移到k8s,再迁移到Sidecar模式的Service Mesh。目前部分已经迁移的应用(路线2/4的第一步,非k8s部署的 Sidecar 模式),将沿路线4迁移,和路线1会师。由于应用众多,因此预计到 k8s + Sidecar模式 的迁移工作会持续比较长时间,在此期间,我们会同步完善Istio,和Istio官方一起合作来实现Istio对超大规模部署的支持。最后一步,迁移到最终目标(当然这一步的方案依然有很多待定内容,继续努力)需要强调的是:这个演进路线针对的是蚂蚁金服主站的特殊场景,并不具体普适性。大家可以在理解我们演进路线背后的思路和权衡方式之后,再结合自身的实际情况进行决策。比如,我们在UC落地时,由于UC有完善的k8s支持,而且目前落地的规模没那么夸张,因此是直接从"部署在k8s上" + “不是Service Mesh形态”,直接迁移到终态的。预计在金融云落实时,也会是如此,因为客户也不会有如此规模。总结:前面我们介绍了当应用程序向Service Mesh和K8s迁移时的几种可能的演进路线,分析了各条路线的利弊。并以蚂蚁金服主站为例,介绍了我们迁移的背景和演进路线的选择思路,希望能够帮助大家更好的理解Service Mesh的落地实践,以便在未来设计自家的落地方案时能有所参考。实现平滑迁移的关键前面给大家介绍了蚂蚁金服主站的Service Mesh演进路线,期间谈到要实现现有应用的平滑迁移。今天的第二个内容,将给大家介绍平滑迁移实现中的几个关键做法。首先,第一个关键是尽量保证迁移前后服务间网络互通。以向k8s迁移为例,在非k8s环境,典型的服务间访问方式是这样:每个服务向注册中心注册。客户端发起访问前,通过注册中心得到目标服务的实例列表信息,如IP地址/端口等在向k8s迁移的过程中,我们的做法是保证k8s内外网络打通,即服务的IP地址(在k8s中是pod ip)是可以相互直接访问的。基于这个前提,服务在迁移到k8s的过程中,原有的服务注册/服务发现/发起请求等逻辑都无需修改,是不是在k8s内,是不是pod ip,对原有服务化体系完全是透明的。因此,向k8s的迁移可以做到对业务应用非常的平滑,基本感知。透明拦截在迁移过程中,可以起到非常关键的作用。以Service-A要访问Service-B,在应用向Sidecar模式的Service Mesh迁移前后,会有有四种排列组合场景:Service-A和Service-B都没有迁移到Serive Mesh:此时请求会直接从Service-A发送到Service-B,称为直连,这是应用在开始迁移到Service Mesh之前的标准工作方式。Service-A已经迁移到Service Mesh,Service-B还没有:此时Service-A发出来的请求,会被劫持,然后发送到和Service-A一起部署的Sidecar(称为Outbound Sidecar),此时链路中只有一个Sidecar,称为(客户端)单跳。Service-B已经迁移到Service Mesh,Service-A还没有:此时Service-A发出来的请求,在到达Service-B时,会被劫持到和Service-B一起部署的Sidecar(称为Inbound Sidecar),此时链路中也只有一个Sidecar,称为(服务器端)单跳。Service-A和Service-B都迁移到Serive Mesh:此时Service-A发出来的请求,会被两次劫持,分别进入Outbound Sidecar和Inbound Sidecar,此时链路中有两个Sidecar,称为双跳。这是Istio的标准工作模式,也是我们迁移完成之后的最终工作模式。在这四种场景中,所有的网络请求,请求报文都是完全一致的,即不管是否被劫持到Sidecar,对请求报文都没有影响,也就是对发出请求报文的客户端和接受请求报文的客户端都是透明的,完全无感之。因此,在迁移过程中,可以单个服务逐个迁移,甚至服务的单个实例逐个迁移,而无需修改应用本身。在展开第三个关键点之前,我们来探讨一下:在Service Mesh时代,理想的客户端应该是什么样子?图中我们列举了一个传统的侵入式框架的客户端所包含的功能,在侵入式框架中,大部分的功能都是由客户端实现,因此会包含非常多的功能,如服务发现、负载均衡等基本功能,加密、认证、路由等高级功能。在应用迁移到Service Mesh之后,这些功能都下沉到Service Mesh中。因此,Service Mesh下的客户端可以进行大幅度的简化,成为一个新的轻量级客户端。对于这个轻量级客户端,我们希望可以尽可能的做的轻薄通用:实现简单,不管哪个编程语言都可以做到轻松实现,因此跨语言就方便了。而且越简单之后升级的可能性就会越少,以避免升级客户端。那我们来继续看,这个轻量级客户端里面最后还能剩下什么内容?图中列出了三个,其中最重要的,也是必不可少的是目标服务的标识,即无论如何简化,最低限度应该告之要访问谁吧?然后是序列化,对于RPC类肯定需要提供编解码功能,不过对于HTTP/REST类很多语言直接内置了标准实现。然后链路追踪,需要做一点工作来传递诸如SpanID之类的参数,同样这块也有可能通过自动埋点来实现。因此,最理想最单薄的客户端,可能只保留最后一个信息:目标服务的标示。在侵入式框架下,目标服务的标示是和服务注册/服务发现是直接关联的,这个标示通常都是服务名,通过服务发现机制实现了一个服务名到服务实例的寻址方式。在Service Mesh机制下,由于服务发现机制被下沉到Service Mesh中,因此只要底层Service Mesh能支持,这个目标服务的标示可以不必拘泥于服务名。那么,问题来了,对客户端来说:最简单,最通用,支持最广泛的寻址方式是什么?是DNS!在我们的迁移方案中,我们考虑引入DNS寻址方式。除了前面说的DNS是支持度最好,使用最普遍的寻址方式,在所有的编程语言和平台上都可以支持之外,我们还希望将DNS寻址方式作为未来产品的长期方向:在SOFAMesh和SOFAMosn中,我们已经基于名为x-protocol的方式实现了DNS通用寻址方式,用来解决Dubbo/HSF/SOFA等传统SOA服务模型在Service Mesh下的访问问题 (备注: 具体内容请见我的博客文章 SOFAMesh中的多协议通用解决方案x-protocol介绍系列(1)-DNS通用寻址方案 )未来在我们的serverless产品中,我们希望可以为运行其上的Function提供DNS寻址支持。可能还会有其他更加广泛的使用场景。因此,在我们的演进过程中,对于客户端SDK,我们有这样一个思路:一方面简化原有的SDK,去除和Sidecar重复的内容(满足短期需求)。另一方面,考虑到必然有一次客户端SDK的更换过程,那么我们希望在简化的同时引入基于DNS的通用寻址方式,以便在未来的后续迁移和功能扩展中可以依托这个机制来实现 (符合长期目标)图中描述的是在Service Mesh下,客户端通过域名来指定要访问的目标服务,然后通过DNS解析机制来串联底层的服务注册/DNS记录更新/透明劫持传递原始信息/Sidecar查找路由目标等详细实现机制。这里仅做简单示意,我就不详细展开了。在接下来的内容中,我的同事,来自UC基础研发部的 龙轼 同学,将为大家详细的展开DNS寻址方案的细节实现。DNS寻址方案的演进大家好,我是来自UC基础研发部的龙轼。 感谢小剑老师给我们介绍了蚂蚁和UC共建的Service Mesh的演进路线和实现平滑迁移的关键。接下来由我来向大家分享下实现平滑迁移的关键中的DNS寻址方案的演进。大家可以看上面的所示的DNS寻址方案的演进,我们先了解下各个服务寻址方案的背景。从 SOA 的寻址,到 Kubernetes 的寻址,然后再到 Istio 的寻址,最后是我们的 SOFAMesh 的DNS寻址方案。它们的寻址方案有什么不同,我们将一一分析它们的细节和总体寻址方案的演进路线。现在大家可以先来看下 SOA 架构下基于服务注册和服务发现的寻址。我们可以看到图中的 SOA 其实是单进程多接口的,依赖于 SOA 的服务注册与服务发现的。接下来我们看下 Kubernetes 的 DNS 寻址方式,它的寻址方式其实是通过DNS 的。从图中我们可以看到部署到K8S 上面的userservice 服务会生成一条DNS记录指向K8S 的ClusterIP。我们在 Pod 里面发起请求时通过 DNS 的 SearchDomain 域名补全规则就会从 DNS 里面查询得到ClusterIP,我们可以看出 Kubernetes 的寻址方案是单进程单接口的。看完 Kubernetes 的服务发现之后我们继续来看 Istio 的服务发现。从图中我们可以看出之前的流程都和 K8S 一脉相承,不同的地方在于 Istio 里面有个 SideCar 它把ClusterIP 拿到之后根据 ClusterIP 从 VirtualHost 里面匹配到 Rule 规则 转发给目标的 Pod 地址。最后我们来看下 SOFAMesh 的 DNS 通用寻址方案。根据我们之前分析的 SOA 寻址方案和 Kubernetes 寻址方案,我们可以看出如果我们的微服务不经过拆分和改造想上 Service Mesh 的话我们需要支持SOA之前的那种单个Pod 多个接口的。从图中看就是我们需要支持 com.alipay.userservice.interface1, com.alipay.userservice.interface2 这些接口解析到 ClusterIP, 我们知道k8s 中的service 是不支持的。那该如何是好,我们只能在DNS 上做文章修改DNS的记录来实现这一功能。确定了这一方案之后我们来看下我们设计的DNS寻址方案实现细节。大家看这张图:我们用 CRD 定义了一个 RPCService 和之前的 Service 有同样的 selector 的标签。然后用 RPC Service Controller 对 RPCService 做 Watch,当 RPCService 有更新的时候我们就把接口就是上述的 com.alipay.userservice.interface1 的记录写入 CoreDNS 里面。而 interface 是通过 Pod 里面的 Register Agent 来获取 Dubbo 里面暴露的。好的,说完这个方案的细节之后。我们可以看出其实其他的问题都不大,但是要更新DNS的这个我们需要支持。一开始我们 K8S 集群里面是用 Kube-DNS 来做 DNS 寻址的,但我们看这张 Kube-DNS 的架构图。可以看出修改它成本是比较大的,而且所有的DNS 都在同一个域里面,这个风险系数很高。 如果一旦修改错误势必会影响到之前的 k8s 的 service,导致线上的故障。这个时候我们跟踪到社区的 CoreDNS 项目,我们来看下 CoreDNS 的具体的架构。 它采用作为 Web 服务器 Caddy 的服务器框架,延用了Caddy 中的插件机制,大大的增加了 CoreDNS 的灵活性。 它的插件机制也特别简单,把所有的插件注册进一个Map里面来,在调用的时候从Map拿出他们有共同接口的函数。有兴趣的同学可以看下 Caddy 的插件代码实现。它的 DNS 协议库采用是由 Google 工程师 Meikg 开发的 DNS 库,他同时也是 SkyDNS 的开发者。后端可以采用 UDP/TCP、TLS 或者 gRPC 作为后端数据查询。上面有个Google工程师用 gRPC 做了一个 CoreDNS 插件的后端数据查询例子,有兴趣的同学可以看下。OK,既然 CoreDNS 的 Plugins 这么强大,我们可不可以用它来实现我们刚才说到的 Renew DNS的机制。 答案很显然是可以。我们看下上面的图,实现CoreDNS 的插件很简单,只需要继承上面的接口就可以了。 CoreDNS 官网有具体的教程在教我们怎么写一个插件。这个就不具体的展开了。到了我们最关键的点了:我们应该怎么更新我们的DNS。其实这点 CoreDNS 社区里面已经有人提出需求用 REST API 的形式提供更新 DNS 的接口。互联网任务工程小组也早在 rfc2136 定义了标准的 DNS UPDATE。 Google Cloud 和AWS 都有相应的实现。CoreDNS 社区其实已经把接口实现了,但是后端存储是基于file 的,数据没有落地。 蚂蚁和UC 这边扩展了 ETCD 插件的接口,把对应 DNS UPDATE 接口给实现了,实现 DNS 数据写入ETCD 里面。从图中我们可以看到 rpc.cluster.local 这个域 和 k8s 域 cluster.local 是在不同的插件链上的。这样在k8s域中没有 dynapirest 插件,我们就不能对k8s域中的DNS进行更新,这样就把之前Kube-DNS改造之后会对k8s域里面造成影响给去除了,更加的安全。我们可以看下 CoreDNS 后端存储的接口,其实和我们之前对数据操作的接口是没有什么差别的。目前 CoreDNS 的 DynAPI 还在主库代码没合并的状态。之后 DynAPI 这个项目会独立成一个插件项目。我们可以看下 CoreDNS 社区的 DynAPI 插件进展。OK,我们来看下我们的DynAPI 实现DNS 更新的一个效果。从图中我们可以看出 record.json 里面的一个域名的更新。通过 DynAPI 我们成功把 record.json 的DNS 记录给更新进去并且dns正常工作了。到现在我们通过CoreDNS 的插件就把DNS 更新的需求给解决了。其实CoreDNS 官网还有许多有趣的插件,可以丰富 CoreDNS 的功能和提升 CoreDNS 的性能。 大家可以看下中间的 autopath 插件,他把我们多次的在 searchdomain 拼凑的 DNS 记录的查询在在服务器上给实现了。 避免了多次的 Client 端和 Server 端的数据交互。有兴趣的同学可以看下 A-Deep-Dive-into-CoreDNS-2018。我们把 CoreDNS 的功能开发完了,上线的话很多人关注它的性能。 我们这边做了一个简单的性能测试,可以看出 CoreDNS 和 Bind DNS 这种现在比较通用的DNS的性能还是有点差距的。但是,我们通过上面的图可以看到在一定的QPS 下,CoreDNS 的延时是很低的。 我们可以看到所有的延时都落在4ms 之内。为了解决QPS的问题,我们通过 Kubernetes 的 HPA 给 CoreDNS 进行横向的扩展。一开始我们只是通过CPU的维度给 CoreDNS 扩展,但发现波动有点大。 之后我们切换成通过QPS的维度来进行扩容。CoreDNS 将会在Kubernetes 1.13 之后成为 Kubernetes 的默认的DNS服务。我们将会紧跟社区实施我们的方案并且反馈给社区。DNS寻址方案的后续规划我们再来看下我们后续的一些规划。可以看到我们的 DynAPI 其实在安全上还是有欠缺的。我们后续会把 HTTP 加强成 HTTPS 协议来增强 DynAPI 的安全性。还有如果我们 CoreDNS 的后端变化的更新的 Watch 由于 Watch的范围过大的话,会返回过多的数据。这样会影响到 Watch 的性能,CoreOS 在 ETCD3.2 增加了proxy 可以让我们根据不同的 ETCD KeySpace 去Watch,这样大大的提高了Watch的性能。最后一个,我们建议在创建 Kubernetes 集群的时候把 idc 的信息给带进Kubernetes的后缀域名中。这样我们之后可以通过 kubernetai 插件把不同的 Kubernetes 集群的域名进行整合通过本 IDC 缓存提高跨 IDC DNS 的访问速度。总结最后我们总结下,总体方面小剑老师给我们讲了蚂蚁金服主站 Service Mesh 的渐进式演进路线和实现平滑迁移的几个关键。 具体细节方面我们通过CoreDNS 的单点突破解决了 SOFAMesh 的 DNS 寻址的问题。感谢大家,希望这次演讲能让大家有所收获。视频回放与资料下载地址:https://tech.antfin.com/activ…(点击阅读原文可跳转到该网页)相关链接:SOFA 文档: http://www.sofastack.tech/SOFA: https://github.com/alipaySOFAMosn:https://github.com/alipay/sof…SOFAMesh:https://github.com/alipay/sof…本文作者:平生栗子阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

December 11, 2018 · 3 min · jiezi

SegmentFault 助力 Cloud Studio 插件评选大赛

@CODING 和 腾讯云 ( @腾讯云加社区 )长期以来都是 SegmentFault 社区良好的开发者合作伙伴,他们也一直致力于通过优质的开发者产品服务好广大的开发者。此次非常感谢 Coding 选择通过 SegmentFault 平台向广大社区开发者发布这次 Cloud Studio 插件评选大赛。首先先给大家介绍一 Cloud StudioCloud Studio 是基于浏览器的集成式开发环境,为开发者提供了一个永不间断的云端工作站。不管有没有开发经验都可以毫无门槛的体验云端开发的乐趣,支持绝大部分编程语言,包括 HTML5、PHP、Python、Java、Ruby、C/C++、.NET、小程序等等。Cloud Studio 提供了完整的 Linux 环境,并且支持自定义域名指向,可以完成各种应用的开发编译与部署。立即访问 Cloud Studio https://studio.dev.tencent.com如何参与此次插件大赛注册并登陆腾讯云(https://cloud.tencent.com)⬇︎设置腾讯云开发者平台账号密码⬇︎点击进入活动页面⬇︎ 点击进行插件的编写与提交(需要选择参与评选的类别)⬇︎审核无误后即可上架自动参与评选此次插件大赛围绕 Git、实用小工具、腾讯云产品对接、UI 强化、语言支持等 14 个主题设立了大奖,同时也设立最具娱乐奖,代码最简单奖,设置功能最复杂奖等娱乐性奖,共近三十种奖项,无论从创意,实用,或娱乐角度,总有一款奖项适合你!11 月 19 日:大赛开始12 月 1 日:开始评分抽奖12 月 20 日:提交及评分截止12 月 25 日:获奖公示及奖品发放欢迎广大开发者踊跃参赛,奖品丰厚,更多信息可以查看此次大赛官网:https://studio.dev.tencent.co…

November 20, 2018 · 1 min · jiezi

支付宝移动端动态化方案实践

摘要: 支付宝从最开始的工具型应用,逐渐发展成平台型应用,一直到现在,已经成为了一个超级 App。本文将带领大家进一步了解支付宝在动态化方案的探索以及 Nebula 框架。小蚂蚁说:此前分享的《模块化与解耦式开发在蚂蚁金服mPaaS深度实践探讨》(想要了解更多相关内容,欢迎关注公众号:mPaaS )已经对支付宝在移动端开发架构的设计思路有了初步了解。本文将结合在 iWeb 武汉站的分享,带领大家进一步了解 mPaaS 在移动端动态化方案设计。分享内容将分为以下三个方面:支付宝动态化方案的探索;Nebula 框架浅析;mPaaS 科技赋能支付宝动态化方案的探索任何一种技术方案都是在业务的发展和架构的演化中逐渐探索出来的,因此我们来看一下支付宝架构的演进: 支付宝从最开始的工具型应用,逐渐发展成平台型应用,一直到现在,已经成为了一个超级 App,它拥有多应用的生态,更加开放和动态化,并且保持着高可用,高性能,高灵敏的强大特性。随着 App 的逐渐庞大,整个应用的架构也在进行不断的调整,来适应各种特性。现在的支付宝客户端的架构如图所示: 整体架构分为五层:容器层、组件层、框架层、服务层、应用层。客户端整体采用统一的框架开发,模块化的开发模式,完全插件式的容器,支持模块独立发布,方便大规模团队的并行开发。在这样的框架结构中,同样包括了我们的动态化方案。支付宝中的动态化方案主要有两种框架:Nebula 和小程序。这两种方案不仅解决了需求迭代速度和发版周期之间的矛盾、跨平台开发、实时发布等一些普适问题,而且有效地保证了发布质量,对线上问题进行紧急止血,同时也有助于建立良好的开放生态。Nebula 是支付宝移动端 Hybrid 解决方案,它提供了良好的外部扩展功能,拥有功能插件化、事件机制、JSApi 定制和 H5App 推送更新管理能力。主要功能包括:接入 H5App 后台,方便管理离线或者在线 H5App,实现 H5 应用的推送、更新。加载 H5 页面,并按照 Session 的概念进行管理各个页面。Android 使用 UCWebView,拥有解决系统级 Webview Crash 的能力,内存管理更合理,网络加载提升更快,兼容性更好。彻底告别了在Android下兼容不同 Webview 的问题。支持自定义网络库,自定义网络通道;支持自定义键盘,自定义 Native View替换 H5 标签。提供丰富的内置 JSAPI,实现譬如页面 push、pop,标题设置等功能;支持用户自定义 JSAPI 和插件功能,扩展业务需求。自带埋点功能,接入 H5 监控平台,能够实时看到页面加载的性能、错误报警和监控。还有一种动态化方案就是支付宝小程序:支付宝小程序是一种全新的开发模式,融合了 H5 的易开发性、跨平台性、Native 性能,让开发者可以快速开发高性能的页面,提供优异的用户体验。通过使用支付宝小程序,开发者为支付宝开发了大量优质的小程序,丰富了支付宝生态能力。小程序开放给开发者更多的 JSAPI 和 OpenAPI 能力,通过小程序可以为用户提供多样化便捷服务。Nebula框架浅析Nebula 的架构如图所示,从上至下依次为 H5 应用层、服务层、原生框架层:H5 应用层:基于 HTML 和 JavaScript 技术开发,在 H5 容器上运行的手机应用,它拥有跨平台的特性,配合离线包的使用可以完成实时热修复的功能。 服务层:为开发者提供了高阶语言的 API 来使用手机系统资源,包括:视窗系统,开发者可以使用它来创造应用 UI,包括文字,图片,按键及定制 View资源管理,通过它开发者可以方便的访问如多语言文字,图片和布局等非代码资源应用生命周期管理,它决定应用在手机系统里的开始,结束以及强制关闭的时机H5 容器原生框架层:是手机系统的基础层,它提供了标准 API 来让高阶语言(比如 Java 和 Object-C)使用底层的硬件,并包含了许多为硬件访问的专有软件库。当上层调用某个框架 API 来访问硬件时,手机系统将加载相应的软件库。整个 Nebula 框架的核心部分就是 H5 容器,下面看一下 H5 容器的结构:H5Service,H5Session 和 H5Page都是从 H5CoreNode 类扩展而来,以 H5Service 为根节点,它与其他类一同形成了树状结构构成了页面流程和导航。在一般情况下,H5Pages 是 H5Session 的子节点,而 H5Sessions 是 H5Service 的子节点,在任何情况下只有一个 H5Service 根节点存在。H5Service:是 Nebula 里维护 H5 应用全局状态的基础类, 在 H5 应用的生命周期内只有一个 H5Service 的单例全局实例,H5Service 可以进行的操作包括:创建且打开一个新的 Web activity创建且开启一个新的 Web page从共享空间存储和读取数据注册插件和 Provider监听应用的生命周期H5Session:一个 H5Session 是由一叠 H5Pages 组成的完整业务流程。例如一个收银台的流程包括:一个购物车的小结页面,一个结账方式的选择页面,和最后一个结账确认页面。所有的页面都可以独立存在运作, H5Session 在其中的作用是把这些页面组织起立,按照业务逻辑把它们按序排列来完成业务。当你使用 H5Service 创建且开启一个新的 Web page 时,如果当前没有 H5Session 的话,一个新的 H5Session 实例将被创建,并为后续创建的 Web page 共享。你可以从 H5Session 中移除页面直到页面叠为空,也可以使用 H5Session 所提供的方法来获取首页,以及监听该 H5Session 的生命周期。 H5Page:是用户看得见,摸得着的页面,也是应用生命周期中最重要的一部分。你可以通过 URL 来加载内容,用 H5Param 来定制页面的外观和行为,甚至可以通过获取 H5Page 的视图层次,把 H5Page 视图和其他原生 UI 部件一起内嵌到同一个布局中。下面是 H5 容器的几个重要组成部分:API 管理器主要管理 JS API:Nebula 中已经提供许多内置的 JS API 供开发者使用,比如操控 UI,显示对话框和 Toast,以及使用网络 RCP 服务等。插件管理器主要管理 Plugin:如果现有的 JS API 无法满足你的业务需求,你也可以选择创造一个新的插件。你只需把原生代码打包在插件中,在管理器里注册该插件,便可在 Javascript 层使用新的 JS API 了JS Bridge 是连接原生层和 Javascript 的沟通桥梁:它将 Javascript 代码转译成能在系统框架运行的字节码,同时也把原生层的数据结构转成 Javascript 对象使其能在 Javascript 层处理。这里 Nebula 针对JS Bridge 做了一些优化:在 Android 里,js 调用 native 的通讯是通过 console.log 的方式,这个和其他容器实现不一样,其他容器一般通过 prompt 的方式来实现的,但是使用 prompt 的方式,有两个弊端:使用 prompt 会阻断整个浏览器的进程,如果 native 处理时间一长,会导致页面假死。prompt 是在 UI 层面上会弹出一个模态窗口,在 native 没有对其进行捕获处理的话,会造成一个问题。一旦这个页面放在非此容器的环境下,就会出现一个很诡异的 prompt 弹窗。在支付宝内,曾经出现过这个问题,天猫页面在支付宝 app 里的时候,由于容器机制不同,页面中 bridge 脚本没有判断环境,导致页面中 js 调用 API 的时候,在页面上出现了 prompt 的模态对话框,严重影响了用户体验,但是如果使用 console.log 的话,就不会出现这个问题。console 的方式避免了不兼容环境的体验问题和同时也避免了页面的假死。jsbridge 注入的时机,由于业务逻辑要依赖 bridge,所以业务的所有逻辑都会在 bridge ready 之后才会触发,而 bridge js 本身运行是要一定的时间的,因此注入的时机对于性能的影响显得非常的重要。但由于 H5 页面的生命周期和容器的生命周期是相互独立的,因此在 H5 生命周期的哪个阶段注入这段 bridgejs,对于性能的影响就显得异常重要。现在在支付宝内使用的方式为监听 H5 生活周期的事件,比如说当 Webview 设置 title 结束之后,Android 会放出一个 onReceivedTitle、shouldInterceptRequest 等事件,iOS 会尝试在 webViewDidStartLoad 事件,在监听到这些事件之后,立即注入 bridgejs,让其在 H5 生命周期尽早运行。通过这种方式的注入,经过测试,最早能在页面加载开始后, 50ms 以内就能成功注入 bridgejs。Event 机制:Nebula 提供了一套事件机制来管理事件在 H5Page,H5Session 和 H5Service 之间的流通顺序。一个 H5Event 可以在 H5Page, H5Session 或 H5Service 任何一层发生,事件派遣分为两步完成事件拦截。这个步骤中事件派遣的顺序为 H5Service -> H5Session or H5Page。事件可以在任何节点被拦截 (如果 interceptEvent() 返回 true ),也可以在任何节点被处理 (如果 handleEvent() 返回 true ):如果事件在派遣过程中被拦截或处理,该事件将被视为已被消费且不再继续流通。如果在派遣过程后事件依旧没有被拦截或处理,会有错误抛给呼叫方处理。仅仅使用传统的 H5 技术展示在线页面,很容易受到网络环境影响,因而降低 H5 页面的性能。在 Neblua 中我们使用离线包技术来解决这个问题。离线包是将包括 HTML、Javascript、CSS 等页面内静态资源打包到一个压缩包内,它的目录结构如图所示:使用离线包可以使容器内的 H5 应用具有接近 Native 的体验,主要优势如下:减少网络环境对 H5 应用的影响:通过下载离线包到本地,然后在客户端打开,把打开H5页面的操作从网络 IO,变成磁盘 IO。直接从本地加载离线包,不仅最大程度地摆脱网络环境对 H5 页面的影响,而且增强了用户体验。提升用户打开 H5 应用的体验:通过离线包的方式把页面内静态资源嵌入到应用中并发布,当用户第一次开启应用的时候,就无需依赖网络环境下载该资源,而是马上开始使用该应用。实现动态更新:在推出新版本或是紧急发布的时候,您可以把修改的资源放入离线包,通过更新配置让应用自动下载更新。因此,您无需通过应用商店审核,就能让用户及早接收更新。下面介绍一下离线包的渲染过程当 H5 容器发出资源请求时,其访问本地资源或线上资源所使用的 URL 是一致的。H5 容器会先截获该请求,截获请求后,发生如下情况:如果本地有资源可以满足该请求的话,H5 容器会使用本地资源。如果没有可以满足请求的本地资源,H5 容器会使用线上资源。因此,无论资源是在本地或者是线上,WebView 都是无感知的。离线包的下载依赖用户当前的网络。一般情况下,只有在连接 WIFI 的情况下才会在后台下载离线包。如果用户处于移动网络下,不会在后台下载离线包。如果当前用户点击 APP,离线包没有下载好,用户就要等待离线包下载好才能用。为了解决离线包不可用的场景,fallback 技术应运而生。每个离线包发布的时候,都会同步在 CDN 发布一个对应的线上版本,目录结构和离线包结构一致。fallback 地址会随离线包信息下发到本地。在离线包没有下载好的场景下,客户端会拦截页面请求,转向对应的 CDN 地址, 实现在线页面和离线页面随时切换。那么本地资源如何寻址呢,我们设计了独特的虚拟域名机制,仅对离线应用有效。当页面保存在客户端之后,WebView 如果要访问的话,是通过 file schema 来从本地加载访问的。然而,用户就能在地址栏里直接看到 file 的路径,这就会导致以下问题:用户体验问题:当用户看到了 file 地址,会对暴露的地址产生不安全感和不自在。安全性问题:由于 file 协议上直接带上了本地路径,任何用户都可以看到这个文件所在的文件路径,会存在一定的安全隐患。基于如上问题的考虑,采用虚拟域名的机制而不直接使用 file 路径来访问。虚拟域名是一个符合 URL Scheme 规范的 HTTPS 域名地址,例如 https://xxxxxxx.h5app.example…Nebula 里面的 H5 容器和离线包,在传统的 Hybrid 框架的基础上进行了极致的优化,使整个 H5 应用具有如下特点:对网络链路强依赖的弱化增强对设备能力的支持增强的用户体验在性能方面,Nebula 在支付宝中经过了亿级用户的考验,crash 和 anr 以及其他稳定性指标有保障。Android 平台基于 UCWebview 深度定制,crash 率和 anr 量远低于系统webview,拥有解决系统 Webview 问题的能力。图中展示的就是在 Android 端,UCWebview 和系统 Webview 之间崩溃率和 ANR 率的对比,稳定性的优势显而易见。最后看一下小程序与 Nebula支付宝小程序复用 Nebula 容器技术栈,重构了开发方式,对外暴露有限个 jsapi 接口,让 app 开发更简单,更加便捷利用支付宝的能力,进而发布、推广、运营。小程序本质上是也是一个 H5 App 离线包,但是有一些自己的特点。小程序是为第三方 App 服务的,运行在独立进程,它的稳定和闪退不会影响到主 App,也支持二方 App 运行在主进程。小程序是支持保活的,极大的提升二次打开的体验。mPaaS技术架构与助力Nebula 有这么大优势,现在不仅在蚂蚁金服内部使用,也能够提供给外部来使用。首先什么是 mPaaS 呢,mPaaS 全称是 Mobile Platform as a Service 。是蚂蚁金服独创的移动研发平台,它源于支付宝 App 近 10 年的移动技术实践和思考,为移动开发、测试、运营及运维提供云到端的一站式解决方案,能有效降低技术门槛、减少研发成本、提升开发效率,协助生态伙伴快速搭建稳定高质量的移动 App。在 mPaaS 中,我们将 Nebula 的 H5 容器、jsapi 、离线包、小程序这些模块作为一个单独的组件来进行输出,在客户端中进行配置。任何一个 App 通过 mPaaS 插件,添加对应的模块,集成这些功能,只需要这样简单的操作,就可以让你的应用具有和支付宝一样强大的动态化能力。 同时 mPaaS 提供的小程序模块,允许用户把运行在支付宝上的小程序,无缝的迁移到自己的 App 中,做到【跨平台跨应用】开发,提高代码的复用能力Nebula 组件化输出,配合 mPaaS 提供的 MDS (移动发布服务) 来实现动态更新。mPaaS 提供的 MDS 服务,能够让每次发布更新就像发邮件一样简单。MDS 具有智能灰度发布的能力,可以通过内部灰度,外部灰度多重验证,保证在正式发布之前,发布的产品质量有充分的保证,同时提供多种升级策略,包括指定人群地域、机型,系统版本,网络环境等多种规则。对于离线包来说,更新离线包的下载对网络环境要求较高,包的大小越大,更新的成功率越低,在 mPaaS 中,我们采用增量差分的更新能力,减少数据冗余及设备带宽,在移动网络条件下优势明显。同时保证更新功能的高可用性,升级接口可用率达 99.99%,在线分钟级触达。下面是 Nebula 的生态基础,首先在集团内部,我们已经支持了不少产品,同时通过 mPaaS ,我们也与外部客户合作,将我们的技术能力输出给他们,典型的几个案例,包括 12306 客户端,广发发现精彩客户端,上海地铁,苏州银行等。尤其是 12306,使用 mPaaS 改版之后,客户端整体的体验更加优越。12306 整个客户端绝大部分都是使用的 H5 技术,他们就是使用 Nebula H5 容器 配合离线包来实现,无论是页面打开速度,还是UI事件响应,体验几乎接近 native。在更新发布方面,12306 的 app 包很少更新,以 AppStore 上的发布记录来看,今年只提交了两个版本,基本上都是通过动态化的方式完成业务的迭代发布。总结下来,蚂蚁金服 mPaaS 中就是通过「Nebula H5容器 + 离线包 + 小程序 + MDS」这样的方式来实现移动端的动态化方案。本文作者:平生栗子阅读原文本文为云栖社区原创内容,未经允许不得转载。 ...

November 20, 2018 · 3 min · jiezi

「腾讯地图」微信小程序插件:提供简单的路线多方案规划服务

上期,我们在《「腾讯视频」微信小程序插件介绍》一文中介绍了「腾讯视频」小程序插件的意义、使用场景以及使用方法。今天我们会与大家分享一款同样优秀的小程序插件——「腾讯地图」插件,从使用场景到使用方法,都将作出详细的介绍。「腾讯地图」插件能做什么?顾名思义,「腾讯地图」插件由腾讯地图官方出品,旨在为开发者提供简单的路线多方案规划服务,可在插件中显示指定位置间的路线方案,支持驾车、公交、步行的路线规划能力及 ETA 等基础路线信息。如果你想像「腾讯地图+」小程序一样实现地图的基础功能,使用「腾讯地图」插件是你的最佳选择。「腾讯地图+」小程序截图作为首批推出的小程序插件,「腾讯地图」插件经过了多个版本的优化,从最初的显示目标位置信息以及提供附近地图功能,到现在已经支持路线规划等能力,地图的功能几乎已经全部配备齐全。「腾讯地图」插件的使用场景场景一:收到小程序的婚礼请柬,但是请柬上的地址找不到?怎么办?如果你开发的是请柬邀请类的小程序,就会遇到上述场景。在传统开发模式中,引入完整的地图选点、路线规划组件,开发成本非常高,更多开发者选择让用户直接输入文字地址进行展示,以此作为降低开发成本的妥协方案。这样的设计不可点击,更没有路线规划的能力,用户还需手动输入去查询地址和交通路线。传统请柬 不可交互但如果开发者选择使用腾讯地图提供的同名小程序插件,开发成本将大幅降低,用户体验也能直线上升。我们在这里以婚庆请柬小程序为例进行说明:用户在编辑请柬小程序的过程中,提前设置好婚礼举办地点;当婚礼宾客收到请柬,点击地点,「腾讯地图」插件就能根据其宾客当前位置和目的地坐标,自动生成精准的导航路线。一键导航 简洁明了场景二:会议服务小帮手——提前了解参会路线与会者应该如何从高铁站、机场、火车站前往会议地点,一直都是各类会议邀请的必备内容。但长期以来,此类信息都习惯以纯文字形式进行发布,体验上存在不便理解、记忆难的问题。如果小程序能够使用「腾讯地图」插件,这类场景的体验将发生质的改变:会议组织方在小程序中提前设置多组起终点(如:机场 - 会议中心、高铁站 - 会议中心),与会者收到会议邀请后点击指定线路,就能在地图插件中查看到精确的参会路线。这样是不是比枯燥的文字多了几分智能呢?如何接入「腾讯地图」插件?「腾讯地图」的功能强大,使用起来却十分简单:1.申请使用插件。在「小程序管理后台 - 设置 - 第三方服务 - 插件管理」中查找插件名称「腾讯地图」(目前最新版本:1.0.6,appid:wx5bc2ac602a747594),并申请使用。2.引入插件代码后修改配置文件 JSON:{ “usingComponents”: { “map-route”: “plugin://myPlugin/mapRoute” }}3.使用地图插件。在相应的 WXML 文件中添加以下标签:<map-route route-info="{{routeInfo}}"></map-route>4.最后,按需求在 JS 文件中处理传入插件数据,数据包括:起点,终点经纬度及名称,路线算路方式,封装在 routeInfo 结构中:let plugin = requirePlugin(“myPlugin”)let routeInfo = { startLat: 39.90469, // 起点纬度 选填 startLng: 116.40717, // 起点经度 选填 startName: “我的位置”, // 起点名称 选填 endLat: 39.94055, // 终点纬度必传 endLng :116.43207, // 终点经度 必传 endName:“来福士购物中心”, // 终点名称 必传 mode:“car” //算路方式 选填}Page({ data: { routeInfo: routeInfo }})参数说明:起点:不填写或 startName=“我的位置” 或 startName=“当前位置” 或 startName=“currentLocation” 则插件会获取当前的定位位置作为起点位置发起算路,若正确填写起点信息,则以传入的起点信息发起算路。终点:必传参数,不正确传入则不会发起算路或者算路失败。算路方式:mode,目前支持三种算路方式,分别是:驾车(car),公交(bus),步行(walk);不传则默认发起驾车算路。注意:数据要在 data 中初始化,不要在 onLoad 中直接 setData,因为 onLoad 中直接 setData,properties 的 routeInfo 的 observer: function (newVal, oldVal),newVal 接收不到参数,导致参数报错,之后可以通过 bind 其他事件 setData 更新 routeInfo 达到变更起终点参数的效果。「腾讯地图」插件使用效果图如果你想了解更多「腾讯地图」插件详情,欢迎访问开发者社区插件版块相应页面(建议电脑访问):????https://developers.weixin.qq….手机端用户也可以扫码访问 ????内容来自:微信开放社区《小程序·小故事》栏目原作者:熊明钧任何问题,欢迎前往微信开放社区:https://developers.weixin.qq.com了解更多小程序开发相关内容,欢迎微信扫描下方二维码关注微信极客WeGeek公众号,共筑微信生态。 ...

November 14, 2018 · 1 min · jiezi

2018年都有哪些实用且堪称神器的 Chrome 插件?

Chrome 的简洁快速以及丰富的插件种类使得它在国内日益盛行,帮助了我们很多 Chrome 用户提升了工作效率,而今天小编要给大家推荐9款实用甚至堪称神器的 Chrome 插件,希望对提升大家的工作效率有帮助。 ...

April 3, 2018 · 1 min · jiezi