首页 文章 精选 留言 我的

精选列表

搜索[管理工具],共4322篇文章
优秀的个人博客,低调大师

AI 浏览器 Comet 将原生集成密码管理工具 1Password

1Password 宣布与 Perplexity 达成合作,将在 AI 浏览器 Comet 中集成 1Password 的密码管理与自动填充功能。Comet 用户可通过 1Password 浏览器扩展实现安全登录、加密存储及跨设备同步,提升 AI 驱动浏览体验的安全性与便利性。 作为 Comet 的首个安全合作伙伴,1Password 提供端到端加密与零知识架构,确保用户隐私不被泄露,同时支持快速生成和保存强密码、2FA 验证及无缝设备间同步。 Perplexity 首席商务官 Dmitry Shevelenko 称,AI 浏览的高效体验必须建立在安全之上,而 1Password 的隐私、透明度与可用性优势使其成为理想合作伙伴。双方合作的目标是为用户打造「既强大又安全」的互联网体验 。 根据安排,现有 1Password 用户将收到邮件邀请,可优先体验 Comet 浏览器。1Password 强调,未来将继续扩展在 AI 场景中的安全应用,帮助用户在智能化时代安全高效地使用互联网。

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

开源 API 管理工具 v1.8.0 发布,数据上云,API 团队协作

大家好,时隔一个月,我们又又又发布啦,本月的主题是: 团队协作 。 在开发模式是前后端协作的团队里,分享 API 文档信息会是前后端对接过程中重要的一环,我想在这次月报分享下我们工具推荐的开发流程。 知乎上有一个热门问题:后端人员先开发后给文档合理吗? 我认为不合理,换位思考了下在这种开发模式下的前端人员,对接的过程应该蛮痛苦,前端开发的能力和经验决定后续改动代码的痛苦程度。 涉及到多人共同协作完成一件事的时候,不应该把设计任务只交给其中的某一个人,应该先交流和沟通,将设计的流程前置,并用文档记录设计的过程和结果。 就像开发人员总会吐槽产品文档没写清楚一样,前端人员也会吐槽后端不给文档或者写不清楚,这个问题可以通过引入一个能协作设计并展示清晰的 API 信息的工具(明示 Eoapi)解决。 你可以考虑在 Eoapi 尝试采用以下简易的协作流程: 设计接口原型,写接口文档; 前后端同步写代码,根据文档对接; 在对接过程中获得的信息优化接口原型,重复过程。 更直观一些,两种协作流程的对比如图: ​ 其实工作都是这些工作,但将设计的过程提前可以减少很多协作问题。 朋友们,相信我,想通过不写文档节省的时间最终都会在对接扯皮过程中还给我们;而且人多力量大嘛,不同的人有不同的角度,观点碰撞可以让设计更好更全面。 当然,决定在设计过程中投入多少时间和精力是需要根据团队的情况调配的,团队很有默契不用约定也能设计一致,那文档什么时候写就不太重要了,适合自己团队的流程就是最好的。 空间是什么? 我们在这个版本引入了空间的概念,一个空间一般是一个团队,我们可以往空间里添加队友: 加入后就可以一起愉快地共享 API 和环境等空间内数据啦~ 想起在月初的时候,有用户恳(wei)请(xie)我们一定一定一定不要做登录的功能,我理解他的核心的诉求其实是打开就能用,别整那么多花里胡哨的。 作为 Eoapi 的产品和开发我想说:放心吧,如果你用不上云端的功能,那就没有登录的必要,在本地空间内尽情使用吧~ 如何使用 在服务端运行下面命令使用 Docker 一键启动。 git clone https://github.com/eolinker/eoapi-remote-server cd eoapi-remote-server docker-compose up -d --build 在客户端中配置云服务地址点击连接后就可以将数据上传到云端啦。 配置这一块我们设计得十分简单,隐藏了很多配置细节,界面提示可以指引你快速上手新功能。 例如初始化时可以让你选择将本地的数据同步到云端。 后续计划 Web 部署 目前我们都是通过桌面端使用的,有的用户会觉得部署和更新不太方便。 所以我们接下来会推出 Web 版本,方便大家打开浏览器就能使用(我个人更喜欢 Web 应用)~ 其实桌面端有桌面端的好处,方便找,加载快,不需要部署,萝卜青菜各有所爱。 API 分享 正在开发中,相信很快就能在 v1.9.0 和大家见面啦。 使用很简单,一键就可以通过分享链接快速将 API 分享给相关的人员。原型图浅看一下: 获得 GVP 除了新版本发布,还有一个好消息!本月我们的开源项目终于获得了 Gitee 官方的认可,荣获 Gitee 年度最有价值的开源项目称号——GVP,谢谢官方的认可!谢谢各位用户的支持! 努力提升用户体验是我们做开源项目的初心 ,尽管我们的项目在 Gitee 上传代码不久,但为了让所有用户能有较好的下载体验, 我们会在后续任何一个新版本发布的第一时间同步 Gitee 。 我们会努力做好项目,也希望我们的项目能继续得到你们的大力支持! 关于项目,如果你有任何的疑问或者建议,老规矩,记得去 Github 或者 Gitee 上提 Issue ,我们会第一时间处理。 在线 Demo : Easy & Open Source API Ecosystem Github : GitHub - eolinker/eoapi: Eoapi 是一个可扩展的 API 开发工具。Eoapi 集合基础的 API 管理和测试功能,并且可以通过插件简化你的 API 开发工作,让你可以更快更好地创建 API。 Gitee: Eolink/eoapi

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

pgAdmin 4 v5.0 发布,PostgreSQL 的开源图形化管理工具

pgAdmin 4 v5.0 已正式发布,更新内容包括修复 bug 和引入新特性。 新特性 基于NWjs 的桌面运行时(DesktopRuntime) 桌面运行时现在基于 NWjs 构建,它将浏览器和 Python 服务器集成,并创建了一个独立的应用。通过使用 NWjs 实现运行时,pgAdmin 4 不再依赖单独的服务器应用和独立的浏览器,此外也不依赖 Qt和 C++ 运行时逻辑。 此功能存在两个已知的小问题(6255和6258),这两个问题都是由于 NWjs 本身的 bug 造成的;临时应对方法为,如果是 macOS 用户,应该从应用程序菜单退出 pgAdmin,而不是从Dock 底栏退出,以避免出现#6255问题。第二个问题可能会导致 Windows 用户在某些情况下看到一个红色方块,而不是正常的应用程序图标。 支持逻辑复制 逻辑复制使用发布和订阅模型,一个或多个订阅者在发布者节点上订阅一个或多个发布。通过引入新的树状视图节点和对话框,新版本增加了对逻辑复制的支持,用户可以轻松地创建/修改/删除发布和订阅。此外,对逻辑复制的支持也包含在 Schema Diff 工具中。 快速搜索功能 在“帮助 (Help)”菜单中增加了一个快速搜索选项,用于搜索菜单项和帮助文章。输入至少三个字符,以显示菜单项下的所有匹配可能性和帮助文章下的相关文档。 支持关闭 Statistics, Dependencies, Dependants 选项卡 用户可以使用标签栏上下文菜单中的“添加面板 (Add panel)”选项将其添加回去 在 Docker/Kubernetes 中运行时,确保日志不存储在容器中,只发送到控制台 Bugfix & 其他变更 使用 cheroot 作为 pgAdmin4 的默认生产服务器 将 JavaScript 依赖项升级到最新版本 修复了关闭错误对话框后,没有在过滤器文本编辑器上正确设置焦点的问题 修复了“依赖项”选项卡在具有共享依赖项的对象上显示多个所有者的问题 修复用户无法更改服务器背景颜色问题 修复了将日志级别设置为 DEBUG 时,外部实用程序作业(备份和维护等)失败的问题 确保DEB/RPM 软件包彼此依赖相同的版本 修复了自动补全问题,如果 schema 名称包含转义字符,则不显示任何建议 发布公告|Release Note 下载地址:https://www.pgadmin.org/download/

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

代码质量管理工具:SonarQube常见的问题及正确解决方案

SonarQube 简介 Sonar 是一个用于代码质量管理的开放平台。通过插件机制,Sonar 可以集成不同的测试工具,代码分析工具,以及持续集成工具。 与持续集成工具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代码检查工具结果(例如 FindBugs,PMD 等)直接显示在 Web 页面上,而是通过不同的插件对这些结果进行再加工处理,通过量化的方式度量代码质量的变化,从而可以方便地对不同规模和种类的工程进行代码质量管理。 在对其他工具的支持方面,Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse 和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。 此外,Sonar 的插件还可以对 Java 以外的其他编程语言提供支持,对国际化以及报告文档化也有良好的支持 Math operands should be cast before assignment-数字操作在操作或赋值前要分配 对整数执行算术运算时,结果将始终是整数。您可以通过自动类型转换将该结果分配给long,double或float类型,但是以int或long形式开始时,结果可能不会达到您的期望。 例如,如果将int除法的结果分配给浮点变量,则在分配之前将失去精度。同样,如果将乘法结果分配给long,则在分配之前它可能已经溢出。 不合规代码 float twoThirds = 2/3; // Noncompliant; int division. Yields 0.0 long millisInYear = 1_000*3_600*24*365; // Noncompliant; int multiplication. Yields 1471228928 long bigNum = Integer.MAX_VALUE + 2; // Noncompliant. Yields -2147483647 long bigNegNum = Integer.MIN_VALUE-1; //Noncompliant, gives a positive result instead of a negative one. Date myDate = new Date(seconds * 1_000); //Noncompliant, won't produce the expected result if seconds > 2_147_483 ... public long compute(int factor){ return factor * 10_000; //Noncompliant, won't produce the expected result if factor > 214_748 } public float compute2(long factor){ return factor / 123; //Noncompliant, will be rounded to closest long integer } 合规代码 float twoThirds = 2f/3; // 2 promoted to float. Yields 0.6666667 long millisInYear = 1_000L*3_600*24*365; // 1000 promoted to long. Yields 31_536_000_000 long bigNum = Integer.MAX_VALUE + 2L; // 2 promoted to long. Yields 2_147_483_649 long bigNegNum = Integer.MIN_VALUE-1L; // Yields -2_147_483_649 Date myDate = new Date(seconds * 1_000L); ... public long compute(int factor){ return factor * 10_000L; } public float compute2(long factor){ return factor / 123f; } 或者是 float twoThirds = (float)2/3; // 2 cast to float long millisInYear = (long)1_000*3_600*24*365; // 1_000 cast to long long bigNum = (long)Integer.MAX_VALUE + 2; long bigNegNum = (long)Integer.MIN_VALUE-1; Date myDate = new Date((long)seconds * 1_000); ... public long compute(long factor){ return factor * 10_000; } public float compute2(float factor){ return factor / 123; } 分析 本项sonar 规则,主要是Java 中 小类型可以向大的类型转换,如int 可以自动向long 转换。避免这种自动转换引发的问题,就是本规则的初衷。 让开发者可以明确的清楚当前数据的类型。 Strings and Boxed types should be compared using "equals()" 字符串和包装类型对比时应该使用equals方法。 使用引用相等==或!=比较java.lang.String或包装类型(如java.lang.Integer)的两个实例几乎总是false,因为它不是在比较实际值,而是在内存中的位置。 不合格的代码 String firstName = getFirstName(); // String overrides equals String lastName = getLastName(); if (firstName == lastName) { ... }; // Non-compliant; false even if the strings have the same value 合规的代码 String firstName = getFirstName(); String lastName = getLastName(); if (firstName != null && firstName.equals(lastName)) { ... }; 分析 在Java 中包装类型与基本数据类型存储位置不同。 Java 基本数据类型存放位置 方法参数、局部变量存放在栈内存中的栈桢中的局部变量表 常量存放在常量池中 包装类型如Integer存放位置 常量池 堆内存 Integer 存储在常量池中时可以使用==对比,但当在堆内存中时,使用==对比,实际对比的是两个内存地址而非值。 根据Integer源码, 可以看出数值在-128-127时,会使用cache中的数据,其实也就是常量池。超过范围后新创建Integer,此时数据就无法使用==。 本项规则,主要就是为了避免对比内存地址而引发的错误判断。 Boxing and unboxing should not be immediately reversed 装箱(创建int/Integer类型值的对象)和拆箱(将对象中原始值解出来)不应连续操作。 由于在装箱和拆箱期间原始值保持不变,因此在不需要时进行任何操作都是没有意义的。这也适用于自动装箱和自动拆箱(当Java为您隐式处理原始/对象转换时)。 不合规代码 public void examineInt(int a) { //... } public void examineInteger(Integer a) { // ... } public void func() { int i = 0; Integer iger1 = Integer.valueOf(0); double d = 1.0; int dIntValue = new Double(d).intValue(); // Noncompliant examineInt(new Integer(i).intValue()); // Noncompliant; explicit box/unbox examineInt(Integer.valueOf(i)); // Noncompliant; boxed int will be auto-unboxed examineInteger(i); // Compliant; value is boxed but not then unboxed examineInteger(iger1.intValue()); // Noncompliant; unboxed int will be autoboxed Integer iger2 = new Integer(iger1); // Noncompliant; unnecessary unboxing, value can be reused } 合规代码 public void examineInt(int a) { //... } public void examineInteger(Integer a) { // ... } public void func() { int i = 0; Integer iger1 = Integer.valueOf(0); double d = 1.0; int dIntValue = (int) d; examineInt(i); examineInteger(i); examineInteger(iger1); } 分析 拆箱,与装箱数值没有发生变化,但在大数据量前提下是极其浪费时间。以下实例中,两者耗时相差10倍。此项目检查主要是提高性能。 Intermediate Stream methods should not be left unused 中间流方法不应该闲置,应该提供对应的终端操作(流操作有两种类型:中间操作(返回另一个流)和终端操作(返回比流更多的内容)。中间操作是惰性的,如果中间流操作的结果没有提供给终端操作,那么它就没有任何作用) 不合规 widgets.stream().filter(b -> b.getColor() == RED); // Noncompliant 合规 int sum = widgets.stream() .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum(); Stream<Widget> pipeline = widgets.stream() .filter(b -> b.getColor() == GREEN) .mapToInt(b -> b.getWeight()); sum = pipeline.sum(); Loops with at most one iteration should be refactored 循环执行一次应该重构。 不合规 for (int i = 0; i < 10; i++) { // noncompliant, loop only executes once printf("i is %d", i); break; } ... for (int i = 0; i < 10; i++) { // noncompliant, loop only executes once if(i == x) { break; } else { printf("i is %d", i); return; } } 不合规 for (int i = 0; i < 10; i++) { printf("i is %d", i); } ... for (int i = 0; i < 10; i++) { if(i == x) { break; } else { printf("i is %d", i); } } Non-thread-safe fields should not be static 非线程安全的属性不能设置为静态 不合规 public class MyClass { private static SimpleDateFormat format = new SimpleDateFormat("HH-mm-ss"); // Noncompliant private static Calendar calendar = Calendar.getInstance(); // Noncompliant 合规 public class MyClass { private SimpleDateFormat format = new SimpleDateFormat("HH-mm-ss"); private Calendar calendar = Calendar.getInstance(); 分析 线程不安全的类型设置为静态后,对于静态变量来说,类在加载的时候会占用同一个存储区,而每个线程都是公用这个存储区的,因此存在线程安全的问题。 在多并发的过程中容易产生问题,而且问题原因不易跟踪。 "InterruptedException" should not be ignored 绝不应该在代码中忽略InterruptedExceptions,在这种情况下,只需将异常计数记录为“忽略”即可。抛出InterruptedException会清除Thread的中断状态,因此,如果未正确处理该异常,则该线程被中断的事实将丢失。相反,应该立即或在清除方法状态后重新抛出InterruptedExceptions-或应该通过调用Thread.interrupt()重新中断线程,即使这应该是单线程应用程序也是如此。任何其他措施可能会导致线程关闭延迟,并丢失该线程被中断的信息-可能未完成其任务。 合规代码 InterruptedExceptions should never be ignored in the code, and simply logging the exception counts in this case as "ignoring". The throwing of the InterruptedException clears the interrupted state of the Thread, so if the exception is not handled properly the fact that the thread was interrupted will be lost. Instead, InterruptedExceptions should either be rethrown - immediately or after cleaning up the method's state - or the thread should be re-interrupted by calling Thread.interrupt() even if this is supposed to be a single-threaded application. Any other course of action risks delaying thread shutdown and loses the information that the thread was interrupted - probably without finishing its task. public void run () { try { while (true) { // do stuff } }catch (InterruptedException e) { // Noncompliant; logging is not enough LOGGER.log(Level.WARN, "Interrupted!", e); } } 不合规 public void run () { try { while (true) { // do stuff } }catch (InterruptedException e) { LOGGER.log(Level.WARN, "Interrupted!", e); // Restore interrupted state... Thread.currentThread().interrupt(); } } 总结 sonarqube 进行代码质量检查,不仅可以分析当前代码已存在问题。也可以通过问题进行分析,把错误的代码习惯,改正。 长期使用sonarqube,可以培养开发者写优秀代码。降低bug率。

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

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

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册