• [技术干货] 登录失败,有证书相关报错排查步骤
    1、确认是否在初始化之后、登录之前已调用了setConfigParam或tsdk_set_config_param接口设置了证书路径,对应的枚举值为TSDK_E_CONFIG_TLS_PARAM或tlsParam,数据结构为TSDK_S_TLS_PARAM或TsdkTlsParam(不同平台枚举值、数据结构不同,参考对应平台的接口参考),且证书路径只用传到证书文件所在的文件夹的路径,最后不需要带斜杠(/)。2、如果只有登录、BFCP不需要协商出TLS的场景,只需要导根证书,如果BFCP需要协商出TLS,则还要导客户端证书(客户端证书需要使用方自己制作,SDK不提供)。3、确认证书路径对应的文件夹已经存在,且已经包含了sdk提供的证书文件,确认app对该路径具有读、写权限。4、确认证书路径下的证书文件不超过20个。5、最好将证书路径下无关、不用的证书删除(特别是21.0升级到24.0的场景,很多21.0用过的证书一直在里面,没删过),也可能会导致登录失败,因为sdk可能会读到错误、无效的证书。
  • [技术干货] 从0到1开发一款自己的vscode插件
    一、vscode插件是什么?大家对vscode肯定都不陌生,其是微软推出的一款轻量级代码编辑器,在使用的时候总会时不时的安装一些插件去协助我们进行开发,这些插件就是利用vscode给我们开放的一些API的基础上进行扩展功能的开发,从而解决开发中的一些问题,提高生产效率。这种插件化思想一方面使该代码编辑器更轻量化;另一方面能够充分利用社区的力量,为其提供更加多元化的插件。二、vscode插件能做什么?vscode插件能做什么?其核心点在于vscode为其提供了哪些开放能力,只有其开放的能力才能为我们所用,就官网来看,利用vscode插件能够做以下事情(该部分来自于vscode官网扩展能力概述部分):通用功能可以在任何扩展中使用的核心功能,主要包括以下几点:(1)能够添加命令、配置项、快捷键、菜单项、右键菜单;(2)存储工作区或全局数据;(3)展示通知信息;(4)使用快速选择收集用户的输入;(5)打开文件选择器让用户去选择文件或文件夹;(6)使用Progress API去阐述长时间运行的操作;主题化控制vscode的外观,包括编辑器中源代码的颜色和vscode ui的颜色,其主要包含三种类型的主题:(1)颜色主题:其允许将颜色应用于VS Code UI组件和编辑器中的文本;(2)文件图标主题:文件图标显示在VS Code UI中的位置,例如文件资源管理器、快速打开列表和编辑器选项卡;(3)产品图标主题:在整个UI中使用的一组图标声明性语言特性声明性语言功能为编程语言添加了基本的文本编辑支持,例如括号匹配、自动缩进和语法突出显示。程序语言特性编程语言功能添加了丰富的编程语言支持,例如悬停、转到定义、诊断错误、IntelliSense 和 CodeLens。扩展工作台工作台是指包含标题栏、活动栏、侧边栏、控制板、编辑组、状态栏等UI组件的整体Visual Studio Code UI。VS Code提供了各种API,允许将自己的组件添加到工作台。调试可以通过编写将 VS Code 的调试 UI 连接到特定调试器或运行时的调试器扩展来利用 VS Code 的调试功能。三、vscode插件实战vscode插件其实是vscode对外提供了一些能力,如果不是特别需要其实没有必要完整的学习整体内容,仅仅需要了解其大体开发思路、能够解决的问题,之所以这么说是因为(以上纯个人观点,不一定正确)学习该部分的内容需要一定精力,但学后并不一定能够在自己项目中得到使用,深入学习投入于产出并不成正比,所以本次我只会讲述入门级内容,具体的内容扔需要读者在需要这一部分能力的时候再深入研究。3.1 项目初始化官方为了方便开发人员进行vscode插件的开发,提供了对yo应的脚手架来生成对应的项目。javascript复制代码// 安装需要的包 npm install -g yo generator-code // 运行 yo code 上述命令其实安装了两个包(yo和generator-code),这两个包用途如下:yo模块全局安装后就安装了Yeoman,Yeoman是通用型项目脚手架工具,可以根据一套模板,生成一个对应的项目结构generator-code模块是VS Code扩展生成器,与yo配合使用才能构建项目。3.2 重要文件在项目生成之后,目录结构如下所示,其中最重要的文件是package.json和extension.js,了解这两个文件基本上就可以入门开发一个vscode插件了。3.2.1 package.json该文件是vscode扩展的清单文件,里面有很多字段,官方对每个字段都进行了详细阐述,本次我们重点阐述以下初始化后期清单文件。json复制代码{ "name": "demo", // 插件名 "displayName": "插件", // 显示在应用市场的名字 "description": "我的第一个插件测试", // 具体描述 "version": "0.0.1", // 插件的版本号 "engines": { "vscode": "^1.60.0" // 最低支持的vscode版本 }, "categories": [ "Other" // 扩展类别 ], // 激活事件组,在那些事件情况下被激活 "activationEvents": [ "onCommand:demo.helloWorld" ], // 插件的主入口文件 "main": "./extension.js", // 贡献点 "contributes": { // 命令 "commands": [ { "command": "demo.helloWorld", "title": "Hello World" } ] }, "scripts": { "lint": "eslint .", "pretest": "npm run lint", "test": "node ./test/runTest.js" }, // 开发依赖项 "devDependencies": { "@types/vscode": "^1.60.0", "@types/glob": "^7.1.3", "@types/mocha": "^8.2.2", "@types/node": "14.x", "eslint": "^7.27.0", "glob": "^7.1.7", "mocha": "^8.4.0", "typescript": "^4.3.2", "vscode-test": "^1.5.2" } } 在这份清单文件中,重点关注的主要有三部分内容:activationEvents、main以及contributes,其是整个文件中的重中之重。main指明了该插件的主入口在哪,只有找到主入口整个项目才能正常的运转、activationEvents指明该插件在何种情况下才会被激活,因为只有激活后插件才能被正常使用,官网已经指明了激活的时机,这样我们就可以按需设置对应时机。(具体每个时机用的时候详细查看即可)onLanguage 打开解析为特定语言文件时被激活,例如"onLanguage:python"onCommand 在调用命令时被激活onDebug 在启动调试话之前被激活onDebugInitialConfigurationsonDebugResolveworkspaceContains 每当打开文件夹并且该文件夹包含至少一个与 glob 模式匹配的文件时onFileSystem 每当读取来自特定方案的文件或文件夹时onView 每当在 VS Code 侧栏中展开指定 id 的视图onUri 每当打开该扩展的系统范围的 Uri 时onWebviewPanelonCustomEditoronAuthenticationRequest* 只要一启动vscode,插件就会被激活onStartupFinishedcontributes通过扩展注册contributes用来扩展Visual Studio Code中的各项技能,其有多个配置,如下所示:breakpoints 断点colors 主题颜色commands 命令configuration 配置configurationDefaults 默认的特定于语言的编辑器配置customEditors 自定义编辑器debuggersgrammarsiconThemesjsonValidationkeybindings 快捷键绑定languagesmenusproblemMatchersproblemPatternsproductIconThemesresourceLabelFormatterssnippets 特定语言的片段submenustaskDefinitionsthemes 颜色主题typescriptServerPluginsviewsviewsContainersviewsWelcomewalkthroughs3.2.2 extension.js文件该文件时其入口文件,即package.json中main字段对应的文件(不一定叫extension.js这个名字),该文件中将导出两个方法:activate和deactivate,两个方法的执行时机如下所示:activate这是插件被激活时执行的函数deactivate这是插件被销毁时调用的方法,比如释放内存等。3.3 实战上述已经对vscode插件有了基础的认识,下面就进行一个简单的实战,打造属于自己的一个vscode插件,此插件的功能如下:通过在文件编辑区域或文件名上右击弹出按钮,点击按钮获取文件的大小、创建时间和修改时间;如果获取的是文件夹,则指明该文件是文件夹,不是文件,给予提示。3.3.1 package.json修改项json复制代码{ // …… // 在getFileState指令下激活 "activationEvents": [ "onCommand:getFileState" ], // 入口文件 "main": "./extension.js", "contributes": { // 命令 "commands": [ { "command": "getFileState", "title": "File State" } ], // 菜单项 "menus": { // 编辑上下文菜单 "editor/context": [ { "when": "editorFocus", "command": "getFileState", "group": "navigation" } ], // 资源管理器上下文菜单 "explorer/context": [ { "command": "getFileState", "group": "navigation" } ] } }, // …… } 3.3.2 主函数内容javascript复制代码const vscode = require('vscode'); const fs = require('fs'); function activate(context) { console.log('插件已经被激活'); // 注册命令 let commandOfGetFileState = vscode.commands.registerCommand('getFileState', uri => { // 文件路径 const filePath = uri.path.substring(1); fs.stat(filePath, (err, stats) => { if (err) { vscode.window.showErrorMessage(`获取文件时遇到错误了${err}!!!`) } if (stats.isDirectory()) { vscode.window.showWarningMessage(`检测的是文件夹,不是文件,请重新选择!!!`); } if (stats.isFile()) { const size = stats.size; const createTime = stats.birthtime.toLocaleString(); const modifyTime = stats.mtime.toLocaleString(); vscode.window.showInformationMessage(` 文件大小为:${size}字节; 文件创建时间为:${createTime}; 文件修改时间为:${modifyTime} `, { modal: true }); } }); const stats = fs.statSync(filePath); console.log('stats', stats); console.log('isFile', stats.isFile()); }); // 将命令放入其上下文对象中,使其生效 context.subscriptions.push(commandOfGetFileState); } function deactivate() {} module.exports = { activate, deactivate } 3. 4 发布插件看法完毕之后就是需要分享出去供大家使用,目前有三种方式:直接把文件夹发给别人,让别人找到vscode的插件存放目录并放进去,然后重启vscode,一般不推荐;打包成vsix插件,然后发送给别人安装,如果你的插件涉及机密不方便发布到应用市场,可以尝试采用这种方式;注册开发者账号,发布到官网应用市场,这个发布和npm一样是不需要审核的。每一种方式都可行,并且网上也有很多教程讲述其发布方式,今天我重点讲述一下第二种,毕竟在插件这么多的情况下,很多人更乐于开发一款属于自己的专用插件或者特定自己领域使用的插件,完全没必要发布到应用市场。安装对应的模块vscejavascript复制代码npm i vsce -g 利用vsce进行打包,生成对应的vsix文件javascript复制代码vsce package 安装到vscode安装完成之后就可以正常的进行使用了四、总结因为工作中目前还没有遇到这种需求,此次我只是对vscode插件的开发流程进行了一个简单的概述,并没有进一步深入探索,待工作中有这样的场景需要这样的能力去解决某些问题时,能够快速反应有这样的解决方案,再进一步学习也为时不晚,也希望爱学习的小伙伴们也对这一部分能够有一定了解,弥补自己知识上欠缺的一环,后续为己所用。五、参考文献vscode插件编写实战vscode插件开发全攻略官方文档作者:前端点线面链接:https://juejin.cn/post/7010765441144455199来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 有能力的加
    曾拿过这类比赛奖项,做过硬件Ascend一些项目,能够结合起来,来的加
  • [技术干货] 使用@Autowired为什么会被 IDEA 警告?
    问题原因关于这个问题,其实答案相对统一,实际上用大白话说起来也容易理解。1.初始化问题先看一下Java初始化类的顺序: codeduidaima.com父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块 > 父类构造器 > 子类成员变量 > 子类构造代码块 > 子类构造器而Autowired注入,则要排队到子类构造器以后了,SpringIOC并不会对依赖的bean是否为null做判断,JVM编译时同样也不会有问题,但如果使用不当,运行起来时或许会因为出现空指针异常。2.对IOC容易依赖过强@Autowired由Spring提供,而@Resource是JSR-250提供的,它是Java标准。前者会警告,而后者不警告,就是因为前者导致了应用与框架的强绑定,若是换成其他IOC框架,则不能够成功注入了。其实对于这方面,我认为在大多数情况时是不会有什么问题的。3.其他方面我看到网络上有一些其他方面的总结,比如:依赖过多却不够明显,违反了单一职责原则;不能像构造器那样注入不可变的对象等,这类问题需要结合个人实际开发进行判断。对于@Autowired使用方面,它虽然是将业务代码和框架进行了强绑定,但字段注入确实大幅简化了代码。追求完完全全的松耦合其实也过于理想化,应该在实际使用中追求平衡,否则将为了过度追求松耦合而得不偿失。其他使用方式除了使用@Autowired以外,我们其实也有几种好用的方式。使用@Resource替代@Autiwired方法是其中一种,只需要改变一个注解,这里就不展示了。1.set方法 codeduidaima.com@RestControllerpublic class TestController2 {ITestService testService;/** 堆代码 duidaima.com* 基于set注入* */@Autowiredpublic void setTestService(ITestService iTestService) {this.testService = iTestService;}@GetMapping("/status2")public Result<?> status() {return testService.status();}}这种方法也使用了@Autowired注解,但是它是作用于成员变量的Setter函数上,而不是像Fied注入一样作用于成员变量上。2.构造器 codeduidaima.com@RestControllerpublic class TestController1 {ITestService testService;/** 基于构造方法的注入* */public TestController1(ITestService iTestService) {this.testService = iTestService;}@GetMapping("/status1")public Result<?> status() {return testService.status();}}它的好处在于,采用了构造方法注入,这种方式对对象创建的顺序会有要求,它将避免循环依赖问题。是最可靠的方法。3.构造器的简化版(推荐)首先,需要引入lombok依赖。 codeduidaima.com<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.2</version></dependency>随后,我们在创建时就可以使用@RequiredArgsConstructor注解,它将帮我们创建构造器,final关键字必不可少。 codeduidaima.com@RestController@RequiredArgsConstructorpublic class TestController3 {/** 用@RequiredArgsConstructor注解,这个使用方式也可以应用于service层* */private final ITestService testService;@GetMapping("/status3")public Result<?> status() {return testService.status();}}我们在使用这些创建方法时,都可以调出IDEA的结构(Structure)面板进行查看,如下图所示。可以看到,在这个类中,已经存在我们所需要注入的内容。总结在使用中,使用构造方法是比较可行的,加上lombok,其实也可以到达非常简便转载自cid:link_0Group/Topic/JAVA/10472
  • [热门活动] 【WeLink会议激活方式】购买华为会议宝IdeaHub,领取价值10,080元会议大礼包
    点击华为会议宝IdeaHub超值大礼包立即领取!!
  • [热门活动] 【华为云会议激活方式】购买华为会议宝IdeaHub,领取价值10,080元会议大礼包
    点击华为会议宝IdeaHub超值大礼包立即领取!!
  • [热门活动] 【用户案例】华为IdeaHub办公宝助创兴银行实现跨境智能协作
            “华为IdeaHub为我们提供了一个安全、简易、高效的解决方案,打破地域限制,亦非常方便使用,让我们在最短的时间内构建了跨越粤港澳大湾区的视讯沟通与协作平台,大大减低疫情对公司业务运营的影响。” —— 创兴银行首席信息官王国良一、背景与挑战        创兴银行于1948年在香港成立,1994年在香港联合交易所上市(01111.HK),并于2014年成为越秀集团成员。创兴银行现时在中国香港设有超过30家分行,并在广州、深圳、澳门等地设有分支机构。受新冠疫情影响,企业需要适应遥距办公及远程协作的新常态。二、客户痛点        1、创兴银行在粤港澳大湾区都设有分支机构,为了在疫情期间继续保持与其他分行的有效沟通,让身处香港、澳门和广州的同事可以随时进行视频会议交流,减低疫情对公司业务运营的影响。        2、因银行业务涉及到客户隐私、银行信息等数据,需要使用符合银行安全标准的解决方案。        3、创兴银行经常进行内部会议及培训,需要具备多元化功能及稳定的会议终端来提升工作效率。三、解决方案        华为通过一系列解决方案支持企业通讯与协作迈入智能时代。创兴银行有限公司(创兴银行)选用华为IdeaHub办公宝作为企业通讯工具,其视频会议、互动协作、远程传屏等多功能整合为一的特性,为创兴银行粤港澳多地办公室提供高效、安全的智能远程沟通体验,有效保障业务连续性,亦降低员工健康风险。        创兴银行首席信息官王国良先生表示:“为了在疫情期间继续保持与其他分行的有效沟通,我们需要使用符合银行安全标准的智能协作解决方案,让我们身处香港、澳门和广州的同事可以随时进行视频会议交流。华为IdeaHub为我们提供了一个安全、简易、高效的解决方案,打破地域限制,亦非常方便使用,让我们在最短的时间内构建了跨越粤港澳大湾区的视讯沟通与协作平台,大大减低疫情对公司业务运营的影响。”创兴银行员工使用华为IdeaHub进行视频会议(左)、欢迎屏(右)等功能体验        创兴银行经常进行内部会议及培训,需要具备多元化功能及稳定的会议终端来提升工作效率。华为IdeaHub集合电子白板、无线投屏、高清视频会议等多功能于一体,可满足企业会议室、经理室、培训室、开放办公区等多场景的智能办公需求。在其4K超清无线投屏功能下,高清、流畅地呈现办公所需的文件及视频材料;而白板功能更具备35毫秒超低书写时延的特性。华为云云市场IdeaHub的简易设计亦便利员工快速熟习操作,省却系统测试时间,提升工作效率。创兴银行员工在会议上使用华为IdeaHub的白板书写功能        另一方面,华为IdeaHub的双系统特性和系统性的安全设计,让使用者可在同一个设备上快速切换内部会议或与外部人员远程会议的模式,安全便利兼备,符合银行业界的信息安全考虑,有效协助创兴银行实现跨企业、跨地域沟通,保持业务发展。四、客户价值        1、打破地域限制,有效协助创兴银行实现跨企业、跨地域沟通,保持业务发展;        2、符合银行业界的信息安全,实现在同一个设备上快速切换内部会议或与外部人员远程会议。        文中提到的商品:华为IdeaHub办公宝(华为云云市场硬件商城在售)【华为云云市场,助您上云无忧】
  • [云动向] 【通知】华为IdeaHub及会议终端云资源变更说明
    【华为云云市场,助您上云无忧】
  • [上云精品] 你的会议方式该升级了!N合一的科技新物种,带你走进“极简会议”时代!
          你是否有过这样的经历:约了重要合作伙伴来公司开会却找不到一个合适的会议室?每次远程视频会议,“网友”见面,称呼对方“那位红衣服的同事”……      该升级一下会议方式了!华为云会议宝IdeaHub,N合一的科技新物种,集投屏书写合一的智慧平板、高清智能云会议,海量办公应用为一体的智能终端。      带你走进“极简会议”时代      开会就要好好听,埋头苦记是会掉进度的!华为云会议宝提供了一整套解决方案,能渗透到会议的各个阶段。      会前,一键发起会议预约、扫码入会,随时随地都可多端接入;      会中,1080P超高清视频和4K数据共享,更高清的远程协作体验;      会后,一场高效会议必须要有结论,白板纪要一键保存本地,也可手机扫码带走,在任何一块大屏打开。      点击查看视频      这样一来,整个团队只需专注于有价值工作,有效提升运营效率。     协作白板更懂你    手写输入时延几乎“无感”,仅为35毫秒,书写创作更流畅。还有智能书写辅助功能,将手写文字、图形、流程图等自动识别转化为打印体,草稿一秒变正稿,非常实用!    重新定义办公场景    传统会议终端没有材料共享能力,普通白板讨论信息无法共享。华为云会议宝IdeaHub一体化设计,只需一根电源线即可部署,降低运维成本,提升办公效率。智能会议室        以前开会准备投影仪、摄像头、音箱……外出人员还无法参与,会议内容要专人记录。    现在会议室与移动会议室完美结合,移动接入,随时随地开会。华为云EI加持,自动生成会议纪要,告别会中奋笔疾书。智能经理室        以前面对面沟通,拿小本本记内容;电话沟通,全靠记,容易遗漏重点。    现在本地协作更深入,信息随心流转,会中智能翻译,跨语言沟通0障碍。会见客户、远程会议随时接入、公司经营看板一览无遗。智能开放区        以前一台电脑两人看,关键内容本子记。    现在团队头脑风暴,畅快沟通,激发创意,独有智能音幕功能,屏蔽干扰区域噪音,开放区会议不受干扰。    文中提到的商品:华为云会议宝IdeaHub【华为云云市场,助您上云无忧】