Thursday, January 20, 2022

SegmentFault 最新的文章

SegmentFault 最新的文章


PWA 技术落地!让你的站点(Web)秒变APP(应用程序)

Posted: 18 Jan 2022 09:42 PM PST

Web应用方兴未艾,我们已经十分习惯习惯了在电脑上进行以自己的工作,而随着众多功能强大的在线网站,我们的Windows的桌面也不再拥挤着各种快捷方式;不光是PC端,在移动端我们也不再在浩如烟海的应用市场安装各种软件,轻量级的各种小程序取代了他们的位置,无需安装点开即用的方式为大家的工作生活带来了很大便利。

我们很明白这种改变对我们生活工作带来的便利,但是偶尔在网上冲浪我们也会怀念那个满桌面都是本地应用的时代,桌面双击即可运行,不用在开启的网页中搜寻我们需要的功能网页,哪怕断网了依旧可以正常使用,使用速度上它们似乎是比网页更快。

看到这里你可能想说,你说这么多,跟你讲的PWA有什么关系啊?

什么是 渐进式 Web 应用( PWA )?

                --- 渐进式 Web 应用(Progressive Web App简称PWA)介绍

PWA 指的是使用指定技术和标准模式来开发的 Web 应用,让Web应用具有原生应用的特性和体验。比如我们觉得本地应用使用便捷,响应速度更加快等。

通过PWA技术,有两个好处。一方面应用开发还是采用Web开发的方式,我们只需要简单的配置就可以使用,无需为各种操作系统制作安装包,应用的入口依旧是网页,在浏览器中一键安装,没有繁琐的访问应用商店下载过程。

另一方面应用安装后,用户可以通过桌面图标快速访问,应用所需资源在第一次安装后离线缓存在本地离线也可使用,可以实时使用系统推送,应用自动升级无需重新安装。

例如在Chrome中支持PWA技术的站点,可以直接在地址栏中点击安装,或者浏览器选项中点击install安装。

PWA 现状

PWA 由 Google 于 2016 年提出,于 2017 年正式技术落地,并在 2018 年迎来重大突破,全球顶级的浏览器厂商,Google、Microsoft、Apple 已经全数宣布支持 PWA 技术。PWA的关键技术是Service Worker,目前桌面和移动设备上的所有主流浏览器都已支持。目前除了Safari,其他主流浏览器都已支持添加主屏幕、推送通知消息。

在这里我们简单为大家介绍一下Service Worker。

Service Worker充当代理服务器的位置,位于 Web 应用程序、浏览器和网络(如果可用)之间。这个API旨在创造更好的离线体验,拦截网络请求并根据网络是否可用采取适当的行动,并更新驻留在服务器上的内容,它还允许访问推送通知和并和后台API同步。

PWA 的使用场景和未来在何处?

根据PWA的介绍,你可能会问,这玩意儿的价值在哪里呢?

目前的数据统计显示移动端之下,PWA并没有太多市场,在我们移动端上3G、4G到现在5G一个百兆的APP可以被很快的下,除了坐飞机,我们的手机基本不会有离线的时候。

而在PC端,我们开始工作,只要你还在使用Office等办公软件,你就会意识到WPA带来的便捷不可估量。在全球信息化的过程中,我们的公司也在不断信息化的过程。各种常用的工具软件会变成必备的一环,从而被集成到Web应用中。比如在线Excel在线报表设计,在线word等。

这一切,都逐渐和"在线""web前端"连在一起。

想要将这些应用顺利挪入Web应用中,却不是那么简单的事。这些工具功能复杂,资源较重,同时对于一些需要实时反馈的工作流项目,也会经常出现忘记操作的情况。

仅拿在线Excel来说,协同编辑这一方面的难点包括不仅限于:多人冲突处理、版本数据更新、房间管理、富文本处理、复制黏贴处理等等。

下图使用PWA技术集成了Excel表格编辑器,对于最终用户,完全保留了Excel的操作体验,多任务工作时,使用alt(cmd)——tab快速切换应用,系统级别推送实时关注工作状态。而这一切都可以在我们的Web应用中出现,不再需要本地应用。

介绍了PWA的相关知识点,下面我们就一起来通过实例看看PWA如何让一个站点变成APP吧。

实例使用

准备工作,下载表格编辑器示例, https://www.grapecity.com.cn/...
让SpreadJS在线表格编辑器支持PWA只需要实现App Manifest 和 Service Worker

  1. 添加 manifest.json 文件
    新建manifest.json,并在index.html中引用

    {   "name": "SpreadJSDesigner",   "short_name": "SJSD",   "descriptions": "SpreadJS在线表格编辑器",   "start_url": "./",   "background_color": "#fff",   "display": "minimal-ui",   "scope": "./",   "theme_color": "#fff",   "icons": [  {    "src": "./welcome.png",    "type": "image/png",    "sizes": "200x200",    "purpose": "any"  }   ] }
1.    <link rel="manifest" href="./manifest.json">
  1. 实现Service Worker
    新建sw.js, 通过Service Worker缓存设计器所需要的spreadjs资源

    var cacheName = 'v14.2.2'; var cacheFiles = [     '/',     './index.html',     './lib/css/gc.spread.sheets.excel2013white.14.2.2.css',   './lib/css/gc.spread.sheets.designer.14.2.2.css',   './custom.css',     './lib/scripts/gc.spread.sheets.all.14.2.2.js',     './lib/scripts/plugins/gc.spread.sheets.charts.14.2.2.js',     './lib/scripts/plugins/gc.spread.sheets.shapes.14.2.2.js',     './lib/scripts/plugins/gc.spread.sheets.print.14.2.2.js',     './lib/scripts/plugins/gc.spread.sheets.barcode.14.2.2.js',     './lib/scripts/plugins/gc.spread.sheets.pdf.14.2.2.js',     './lib/scripts/plugins/gc.spread.pivot.pivottables.14.2.2.js',     './lib/scripts/interop/gc.spread.excelio.14.2.2.js',     './lib/scripts/resources/zh/gc.spread.sheets.resources.zh.14.2.2.js',     './lib/scripts/gc.spread.sheets.designer.resource.cn.14.2.2.js',     './lib/scripts/gc.spread.sheets.designer.all.14.2.2.js', ]; // 监听 install 事件,安装完成后,进行文件缓存 self.addEventListener('install', function (e) {     console.log('Service Worker 状态: install');     var cacheOpenPromise = caches.open(cacheName).then(function (cache) {   // 把要缓存的 cacheFiles 列表传入   return cache.addAll(cacheFiles);     });     e.waitUntil(cacheOpenPromise); }); // 监听 fetch 事件,安装完成后,进行文件缓存 self.addEventListener('fetch', function (e) {     console.log('Service Worker 状态: fetch');     var cacheMatchPromise = caches.match(e.request).then(function (cache) {       // 如果有cache则直接返回,否则通过fetch请求       return cache || fetch(e.request);   }).catch(function (err) {       console.log(err);       return fetch(e.request);   })     e.respondWith(cacheMatchPromise); }); // 监听 activate 事件,清除缓存 self.addEventListener('activate', function (e) {     console.log('Service Worker 状态: activate');     var cachePromise = caches.keys().then(function (keys) {   return Promise.all(keys.map(function (key) {       if (key !== cacheName) {           return caches.delete(key);       }   }));     })     e.waitUntil(cachePromise);     return self.clients.claim(); });

    index.html页面组册sw.js

    <script>           if ('serviceWorker' in navigator) {                   window.addEventListener('load', function () {                           navigator.serviceWorker.register('./sw.js')                           .then(function (registration) {                                   // 注册成功                                   console.log('ServiceWorker registration successful with scope: ', registration.scope);                           })                           .catch(function (err) {                                   // 注册失败:                                   console.log('ServiceWorker registration failed: ', err);                           });                   });           }   </script>

    通过以上两个步骤的操作,spreadjs在线表格编辑器页面就支持PWA了。注意PWA需要https的支持,本地通过localhost测试不受影响。
    通过localhost访问页面,可以在Chrome地址栏看到安装选项

安装后,就可以通过应用程序按钮双击访问了

对于Chrome 的PWA应用,同样可以通过快捷键开启开发者工具,在Network中可以看到,资源都是通过ServiceWorker缓存获取

以上便是借助PWA技术让SpreadJS在线表格编辑器变成桌面编辑器的操作步骤,大家在熟练掌握并使用 PWA 架构及其相关技术后,便可以试着用它来构建更具高可用的现代化 Web 应用,快去试试吧!

SegmentFault D-Day 2021 年度总结报告

Posted: 17 Jan 2022 01:31 AM PST

关于 D-Day:
这里的 D-Day 不是军事术语,而是开发者(Developer)的抢滩登陆之日!SegmentFault D-Day 全称 SegmentFault Developer Day,是由 SegmentFault 思否发起主办的系列技术沙龙。自 2014 年启动,D-Day 技术沙龙已在北、上、广、深、杭等 10 个城市巡回举办了数十场,涉及大前端、技术架构、云计算、大数据、移动开发等众多主题,覆盖数万名开发者。

2021 SegmentFault D-Day 强势回归,于 7 月开始相继举行 5 场技术分享,聚焦云原生、大前端、技术架构、开源等领域。一直以来我们在技术传播的道路上从未放慢步伐,在技术分享的质量上也从未放低要求,因此 SegmentFault D-Day 也受到了越来越多开发者的热爱与肯定。

我们希望为更多的开发者,在 SegmentFault 思否社区上有更多的收获~

2021 SegmentFault D-Day 已经结束,我们重新整理了 D-Day 的精彩内容,再次与大家分享。以下是 2021 年全年 D-Day 的精彩回顾:

SegmentFault D-Day 大前端技术沙龙

嘉宾议题介绍:

  • 夏温武,阿里巴巴前端技术专家《淘系 web 前端架构开发实践》
  • 陆宏鸣,驻云科技技术总监 《如何进行前端性能的观测》
  • 郑仁杰,字节跳动前端工程师 《面向未来与浏览器规范的前端 DDD 架构设计》
  • 姚尧,葡萄城技术布道师 《前端电子表格技术分享》
  • 卡颂,《React技术揭秘》作者 《React 对全球前端框架发展的影响》

分享回顾:https://ke.segmentfault.com/c...

SegmentFault D-Day 后端架构演进之路

嘉宾议题介绍:

  • 方杨,阿里巴巴技术专家《NOAH-面向业务价值的自适应高可用架构》
  • 蒋烁淼,观测云创始人 《SRE工程的落地指南》
  • 李能,每日互动股份有限公司(个推)服务端资深技术专家 《个推API网关演进之路》
  • 毛雯蓓,网易有道资深开发工程师《自建私有云or公有云 —— 有道少儿团队的云原生实践与思考》
  • 周斌杰,蚂蚁集团技术专家《service mesh 落地之后:为 sidecar 注入灵魂》

分享回顾:https://ke.segmentfault.com/c...

SegmentFault D-Day Online 开源开放与新技术创新

嘉宾议题介绍:

  • 潘杨,观测云产品方案架构师《开源可观测与观测云查询语言对比》
  • 马嘉伦,移动端开发工程师 《浅谈 Flutter 复杂状态管理 — 封装一个可扩展的 IM 页面库》
  • 张晋涛,支流科技云原生技术专家 《容器镜像构建的原理和最佳实践》

分享回顾:https://ke.segmentfault.com/c...

SegmentFault D-Day Online 论道云原生与微服务

嘉宾议题介绍:

  • 马若飞,FreeWheel 首席工程师《FreeWheel的云原生应用实践》
  • 刘玉杰,观测云产品方案架构师《第三代微服务技术Istio实操》
  • 王英伟,解决方案架构师《云原生全家桶,企业真的需要吗?》
  • 方阗,青云科技顾问研发工程师《镜像构建技术 Buildpacks 的原理及在函数计算平台中的落地》

分享回顾:https://ke.segmentfault.com/c...

SegmentFault D-Day Online 前端前沿技术实践

嘉宾议题介绍:

  • 范济颖(边城),四川凯路威科技有限公司 软件总工程师《前端技术迁移实践 - 从 jQuery 到 Vue3》
  • 邓昌亮,观测云 资深前端开发工程师《如何优雅的捕获 web 应用的各种指标数据》
  • 陈俊文,腾讯科技有限公司 前端高级工程师《从小众到大众-看Web端如何玩转音视频》
  • 姚尧,西安葡萄城软件有限公司 技术布道师《前端电子表格技术应用实践》

分享回顾:https://ke.segmentfault.com/c...

特别鸣谢

最后,特别感谢在 SegmentFault D-Day 中,给我们分享技术内容的老师们,也感谢一直支持我们的合作伙伴!

SegmentFault 将继续致力于维护最纯粹的技术分享平台,为大家带来更干货的实践内容分享,也为开发者们提供更优质的交流空间。

期待 2022 我们与各位开发者小伙伴们一起成长~


在社区中有什么问题也可以反馈给小姐姐哦~

image.png

思否小姐姐在这里提前祝大家新年快乐,新的一年头发浓密,没有 BUG ~

线程池如何观测?这个方案让你对线程池的运行情况了如指掌!

Posted: 17 Jan 2022 12:04 AM PST

今天我们来聊一个比较实用的话题,动态可监控可观测的线程池实践。

这是个全新的开源项目,作者提供了一种非常好的思路解决了线程池的可观测问题。

这个开源项目叫:DynamicTp

地址在文章末尾。


写在前面

稍微有些Java编程经验的小伙伴都知道,Java的精髓在juc包,这是大名鼎鼎的Doug Lea老爷子的杰作,评价一个程序员Java水平怎么样,一定程度上看他对juc包下的一些技术掌握的怎么样,这也是面试中的基本上必问的一些技术点之一。

juc包主要包括:

1.原子类(AtomicXXX)

2.锁类(XXXLock)

3.线程同步类(AQS、CountDownLatch、CyclicBarrier、Semaphore、Exchanger)

4.任务执行器类(Executor体系类,包括今天的主角ThreadPoolExecutor)

5.并发集合类(ConcurrentXXX、CopyOnWriteXXX)相关集合类

6.阻塞队列类(BlockingQueue继承体系类)

7.Future相关类

8.其他一些辅助工具类

多线程编程场景下,这些类都是必备技能,会这些可以帮助我们写出高质量、高性能、少bug的代码,同时这些也是Java中比较难啃的一些技术,需要持之以恒,学以致用,在使用中感受他们带来的奥妙。

上边简单罗列了下juc包下功能分类,这篇文章我们主要来介绍动态可监控线程池的,所以具体内容也就不展开讲了,以后有时间单独来聊吧。看这篇文章前,希望读者最好有一定的线程池ThreadPoolExecutor使用经验,不然看起来会有点懵。

如果你对ThreadPoolExecutor不是很熟悉,推荐阅读下面两篇文章

javadoop: https://www.javadoop.com/post/java-thread-pool

美团技术博客: https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html


背景

使用ThreadPoolExecutor过程中你是否有以下痛点呢?

1.代码中创建了一个ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适

2.凭经验设置参数值,上线后发现需要调整,改代码重启服务,非常麻烦

3.线程池相对开发人员来说是个黑盒,运行情况不能感知到,直到出现问题

如果你有以上痛点,这篇文章要介绍的动态可监控线程池(DynamicTp)或许能帮助到你。

如果看过ThreadPoolExecutor的源码,大概可以知道其实它有提供一些set方法,可以在运行时动态去修改相应的值,这些方法有:

public void setCorePoolSize(int corePoolSize); public void setMaximumPoolSize(int maximumPoolSize); public void setKeepAliveTime(long time, TimeUnit unit); public void setThreadFactory(ThreadFactory threadFactory); public void setRejectedExecutionHandler(RejectedExecutionHandler handler);

现在大多数的互联网项目其实都会微服务化部署,有一套自己的服务治理体系,微服务组件中的分布式配置中心扮演的就是动态修改配置,实时生效的角色。那么我们是否可以结合配置中心来做运行时线程池参数的动态调整呢?答案是肯定的,而且配置中心相对都是高可用的,使用它也不用过于担心配置推送出现问题这类事儿,而且也能减少研发动态线程池组件的难度和工作量。

综上,我们总结出以下的背景

  • 广泛性:在Java开发中,想要提高系统性能,线程池已经是一个90%以上的人都会选择使用的基础工具
  • 不确定性:项目中可能会创建很多线程池,既有IO密集型的,也有CPU密集型的,但线程池的参数并不好确定;需要有套机制在运行过程中动态去调整参数
  • 无感知性,线程池运行过程中的各项指标一般感知不到;需要有套监控报警机制在事前、事中就能让开发人员感知到线程池的运行状况,及时处理
  • 高可用性,配置变更需要及时推送到客户端;需要有高可用的配置管理推送服务,配置中心是现在大多数互联网系统都会使用的组件,与之结合可以大幅度减少开发量及接入难度

简介

我们基于配置中心对线程池ThreadPoolExecutor做一些扩展,实现对运行中线程池参数的动态修改,实时生效;以及实时监控线程池的运行状态,触发设置的报警策略时报警,报警信息会推送办公平台(钉钉、企微等)。报警维度包括(队列容量、线程池活性、拒绝触发等);同时也会定时采集线程池指标数据供监控平台可视化使用。使我们能时刻感知到线程池的负载,根据情况及时调整,避免出现问题影响线上业务。

    |  __ \                            (_) |__   __|     | |  | |_   _ _ __   __ _ _ __ ___  _  ___| |_ __       | |  | | | | | '_ \ / _` | '_ ` _ | |/ __| | '_ \      | |__| | |_| | | | | (_| | | | | | | | (__| | |_) |     |_____/ __, |_| |_|__,_|_| |_| |_|_|___|_| .__/               __/ |                              | |                 |___/                               |_|          :: Dynamic Thread Pool :: 

特性

  • 参考美团线程池实践 ,对线程池参数动态化管理,增加监控、报警功能
  • 基于Spring框架,现只支持SpringBoot项目使用,轻量级,引入starter即可食用
  • 基于配置中心实现线程池参数动态调整,实时生效;集成主流配置中心,默认支持Nacos、Apollo,同时也提供SPI接口可自定义扩展实现
  • 内置通知报警功能,提供多种报警维度(配置变更通知、活性报警、容量阈值报警、拒绝策略触发报警),默认支持企业微信、钉钉报警,同时提供SPI接口可自定义扩展实现
  • 内置线程池指标采集功能,支持通过MicroMeter、JsonLog日志输出、Endpoint三种方式,可通过SPI接口自定义扩展实现

架构设计

主要分四大模块

  • 配置变更监听模块:

    1.监听特定配置中心的指定配置文件(默认实现Nacos、Apollo),可通过内部提供的SPI接口扩展其他实现

    2.解析配置文件内容,内置实现yml、properties配置文件的解析,可通过内部提供的SPI接口扩展其他实现

    3.通知线程池管理模块实现刷新

  • 线程池管理模块:

    1.服务启动时从配置中心拉取配置信息,生成线程池实例注册到内部线程池注册中心中

    2.监听模块监听到配置变更时,将变更信息传递给管理模块,实现线程池参数的刷新

    3.代码中通过getExecutor()方法根据线程池名称来获取线程池对象实例

  • 监控模块:

    实现监控指标采集以及输出,默认提供以下三种方式,也可通过内部提供的SPI接口扩展其他实现

    1.默认实现Json log输出到磁盘

    2.MicroMeter采集,引入MicroMeter相关依赖

    3.暴雷Endpoint端点,可通过http方式访问

  • 通知告警模块:

    对接办公平台,实现通告告警功能,默认实现钉钉、企微,可通过内部提供的SPI接口扩展其他实现,通知告警类型如下

    1.线程池参数变更通知

    2.阻塞队列容量达到设置阈值告警

    3.线程池活性达到设置阈值告警

    4.触发拒绝策略告警


使用

  • maven依赖

    <dependency>      <groupId>io.github.lyh200</groupId>      <artifactId>dynamic-tp-spring-cloud-starter</artifactId>      <version>1.0.2-RELEASE</version> </dependency>
  • 线程池配置

    spring:   dynamic:     tp:       enabled: true       enabledBanner: true        # 是否开启banner打印,默认true       enabledCollect: false      # 是否开启监控指标采集,默认false       collectorType: logging     # 监控数据采集器类型(JsonLog | MicroMeter),默认logging       logPath: /home/logs        # 监控日志数据路径,默认${user.home}/logs       monitorInterval: 5         # 监控时间间隔(报警判断、指标采集),默认5s       nacos:                     # nacos配置,不配置有默认值(规则name-dev.yml这样)         dataId: dynamic-tp-demo-dev.yml         group: DEFAULT_GROUP       apollo:                    # apollo配置,不配置默认拿apollo配置第一个namespace         namespace: dynamic-tp-demo-dev.yml       configType: yml            # 配置文件类型       platforms:                 # 通知报警平台配置         - platform: wechat           urlKey: 3a7500-1287-4bd-a798-c5c3d8b69c  # 替换           receivers: test1,test2                   # 接受人企微名称         - platform: ding           urlKey: f80dad441fcd655438f4a08dcd6a     # 替换           secret: SECb5441fa6f375d5b9d21           # 替换,非sign模式可以没有此值           receivers: 15810119805                   # 钉钉账号手机号                 executors:                                   # 动态线程池配置         - threadPoolName: dynamic-tp-test-1           corePoolSize: 6           maximumPoolSize: 8           queueCapacity: 200           queueType: VariableLinkedBlockingQueue   # 任务队列,查看源码QueueTypeEnum枚举类           rejectedHandlerType: CallerRunsPolicy    # 拒绝策略,查看RejectedTypeEnum枚举类           keepAliveTime: 50           allowCoreThreadTimeOut: false           threadNamePrefix: test           # 线程名前缀           notifyItems:                     # 报警项,不配置自动会配置(变更通知、容量报警、活性报警、拒绝报警)             - type: capacity               # 报警项类型,查看源码 NotifyTypeEnum枚举类               enabled: true               threshold: 80                # 报警阈值               platforms: [ding,wechat]     # 可选配置,不配置默认拿上层platforms配置的所以平台               interval: 120                # 报警间隔(单位:s)             - type: change               enabled: true             - type: liveness               enabled: true               threshold: 80             - type: reject               enabled: true               threshold: 1
  • 代码方式生成,服务启动会自动注册

    @Configuration public class DtpConfig {     @Bean    public DtpExecutor demo1Executor() {        return DtpCreator.createDynamicFast("demo1-executor");   }     @Bean    public ThreadPoolExecutor demo2Executor() {        return ThreadPoolBuilder.newBuilder()               .threadPoolName("demo2-executor")               .corePoolSize(8)               .maximumPoolSize(16)               .keepAliveTime(50)               .allowCoreThreadTimeOut(true)               .workQueue(QueueTypeEnum.SYNCHRONOUS_QUEUE.getName(), null, false)               .rejectedExecutionHandler(RejectedTypeEnum.CALLER_RUNS_POLICY.getName())               .buildDynamic();   } }
  • 代码调用,根据线程池名称获取

    public static void main(String[] args) {        DtpExecutor dtpExecutor = DtpRegistry.getExecutor("dynamic-tp-test-1");        dtpExecutor.execute(() -> System.out.println("test")); }

注意事项

  1. 配置文件配置的参数会覆盖通过代码生成方式配置的参数
  2. 阻塞队列只有VariableLinkedBlockingQueue类型可以修改capacity,该类型功能和LinkedBlockingQueue相似,只是capacity不是final类型,可以修改,
    VariableLinkedBlockingQueue参考RabbitMq的实现
  3. 启动看到如下日志输出证明接入成功

     |  __ \                            (_) |__   __|    | |  | |_   _ _ __   __ _ _ __ ___  _  ___| |_ __   | |  | | | | | '_ \ / _` | '_ ` _ | |/ __| | '_ \  | |__| | |_| | | | | (_| | | | | | | | (__| | |_) | |_____/ __, |_| |_|__,_|_| |_| |_|_|___|_| .__/           __/ |                              | |             |___/                               |_|      :: Dynamic Thread Pool ::   DynamicTp register, executor: DtpMainPropWrapper(dtpName=dynamic-tp-test-1, corePoolSize=6, maxPoolSize=8, keepAliveTime=50, queueType=VariableLinkedBlockingQueue, queueCapacity=200, rejectType=RejectedCountableCallerRunsPolicy, allowCoreThreadTimeOut=false)
  4. 配置变更会推送通知消息,且会高亮变更的字段

     DynamicTp [dynamic-tp-test-1] refresh end, changed keys: [corePoolSize, queueCapacity], corePoolSize: [6 => 4], maxPoolSize: [8 => 8], queueType: [VariableLinkedBlockingQueue => VariableLinkedBlockingQueue], queueCapacity: [200 => 2000], keepAliveTime: [50s => 50s], rejectedType: [CallerRunsPolicy => CallerRunsPolicy], allowsCoreThreadTimeOut: [false => false]

通知报警

触发报警阈值会推送相应报警消息(活性、容量、拒绝),且会高亮显示相应字段

配置变更会推送通知消息,且会高亮变更的字段


监控日志

通过collectType属性配置监控指标采集类型,默认 logging

  • MicroMeter:通过引入相关MicroMeter依赖采集到相应的平台
    (如Prometheus,InfluxDb...)
  • Logging:定时采集指标数据以Json日志格式输出磁盘,地址${logPath}/dy
    namictp/${appName}.monitor.log

    2022-01-11 00:25:20.599 INFO [dtp-monitor-thread-1:d.m.log] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"rejectHandlerName":"RejectedCountableCallerRunsPolicy","queueCapacity":1024,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":1024,"corePoolSize":6,"queueType":"VariableLinkedBlockingQueue","completedTaskCount":0,"dtpName":"remoting-call","maximumPoolSize":8} 2022-01-11 00:25:25.603 INFO [dtp-monitor-thread-1:d.m.log] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"rejectHandlerName":"RejectedCountableCallerRunsPolicy","queueCapacity":1024,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":1024,"corePoolSize":6,"queueType":"VariableLinkedBlockingQueue","completedTaskCount":0,"dtpName":"remoting-call","maximumPoolSize":8} 2022-01-11 00:25:30.609 INFO [dtp-monitor-thread-1:d.m.log] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"rejectHandlerName":"RejectedCountableCallerRunsPolicy","queueCapacity":1024,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":1024,"corePoolSize":6,"queueType":"VariableLinkedBlockingQueue","completedTaskCount":0,"dtpName":"remoting-call","maximumPoolSize":8} 2022-01-11 00:25:35.613 INFO [dtp-monitor-thread-1:d.m.log] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"rejectHandlerName":"RejectedCountableCallerRunsPolicy","queueCapacity":1024,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":1024,"corePoolSize":6,"queueType":"VariableLinkedBlockingQueue","completedTaskCount":0,"dtpName":"remoting-call","maximumPoolSize":8} 2022-01-11 00:25:40.616 INFO [dtp-monitor-thread-1:d.m.log] {"activeCount":0,"queueSize":0,"largestPoolSize":0,"poolSize":0,"rejectHandlerName":"RejectedCountableCallerRunsPolicy","queueCapacity":1024,"fair":false,"rejectCount":0,"waitTaskCount":0,"taskCount":0,"queueRemainingCapacity":1024,"corePoolSize":6,"queueType":"VariableLinkedBlockingQueue","completedTaskCount":0,"dtpName":"remoting-call","maximumPoolSize":8}
  • 暴露EndPoint端点(dynamic-tp),可以通过http方式请求

    [     {         "dtp_name": "remoting-call",         "core_pool_size": 6,         "maximum_pool_size": 12,         "queue_type": "SynchronousQueue",         "queue_capacity": 0,         "queue_size": 0,         "fair": false,         "queue_remaining_capacity": 0,         "active_count": 0,         "task_count": 21760,         "completed_task_count": 21760,         "largest_pool_size": 12,         "pool_size": 6,         "wait_task_count": 0,         "reject_count": 124662,         "reject_handler_name": "CallerRunsPolicy"     },     {         "max_memory": "228 MB",         "total_memory": "147 MB",         "free_memory": "44.07 MB",         "usable_memory": "125.07 MB"     } ]

项目地址

gitee地址: https://gitee.com/yanhom/dynamic-tp-spring-cloud-starter

github地址https://github.com/lyh200/dynamic-tp-spring-cloud-starter


联系作者

对项目有什么想法或者建议,可以在上述地址中加到作者微信进行交流,或者创建issues,一起完善项目!

最后,支持的话还望大家去点个star哦。

能用js实现的最终用js实现,Shell脚本也不例外

Posted: 16 Jan 2022 08:57 PM PST

大家好,我是秋风。

今天来讨论一个牛逼的项目 ——zx ,1个月增长15000 star, 成为了2021年度明星项目排行榜第一。

图片

图片

zx 到底是什么呢?

我们可以从官网的介绍看到,一个能更方便地写脚本的工具。(A tool for writing better scripts)

Bash is great, but when it comes to writing scripts, people usually choose a more convenient programming language. JavaScript is a perfect choice, but standard Node.js library requires additional hassle before using. The zx package provides useful wrappers around child_process, escapes arguments and gives sensible defaults.

翻译:

Bash 用来写脚本非常棒,但是大家通常还是会去选择一种更方便方式去编写脚本,例如使用像 JavaScript 这种编程语言。但是 Node.js 在使用之前需要很多额外的操作,比如装包、引库等。但是zx 提供更多便捷的功能并且还对 child_process 进行了简化封装,从而能够直接调用一些命令。

通过阅读摘要和描述,我们可以知道虽然 Bash 很棒,但是没有 Node.js 简单。虽然 Node.js 编写起来简单,但是在使用前还是有一些麻烦的操作。而zx 没有以上两种方式的缺点,能够化繁为简,提供简单又方便操作。

在继续深入了解 zx 前,我们先来屡清楚目前提到的一些概念,了解这些概念有助于我们更好地去写脚本。

Shell、Shell脚本、Bash、zx、Node

首先来说说什么是Shell,Shell的中文意思是贝壳,是指与操作内核连接的外壳。

图片

狭义的Shell指的是命令行方面的软件,大多指Bash(Bash全称为 Bourne Again SHell ,是linux标准的默认Shell,它基于Bourne Shell,吸收了C Shell和Korn Shell );广义的Shell则包括图形界面。

因此 Shell 是一个大概念,包含了 Bash 等这些命令行工具,而利用这些工具写的脚本叫做Shell 脚本;而 Node 属于编程语言,可以编写 js 文件来执行一些命令, zx 是基于 Node 开发的工具,因此也能通过编写脚本来执行命令。

他们之间的关系我用一张图进行了描述,标题的概念用红色字样进行了加重。

图片

脚本可以做那些事情?

最为简单的就是重复的事情、处理数据格式,数据导入导出以及各种简单常用小工具的制作,环境配置等等。

举一些具体的例子就是:

下载视频

https://www.jianshu.com/p/0a0...

图片

下载音乐

图片

https://binaryify.github.io/N...

统计字数

图片

https://geek-docs.com/shell/s...

自动签到

图片

https://github.com/RWoxiN/Qia...

...

功能太多了列举不过来,反正你会的操作能帮你简化,你不会的操作能帮你实现。

哪些人可以使用?

脚本不仅仅可以帮助开发人员还能帮助非开发人员

例如很多人都喜欢在个人博客上面写文章,这时就可以用WordPress 快速搭建一个博客,然后我们就用脚本一键来安装WordPress,下面以 Shell 脚本为例:

图片

https://gist.github.com/dessi...

zx、Node、Shell(Bash) 功能评测

上面聊了脚本的一些概念以及脚本能帮助我们做什么。那么既然脚本这么强大,且脚本种类也非常多,为什么 zx 一经推出就这么收欢迎呢?

我们就以实际的功能为例来体验一下,分别使用了zx、Node、Shell(Bash,以下都称作Bash )三种脚本写一个批量压缩音视频的脚本

实现一个音频功能主要分成四个步骤

1.遍历当前目录

2.判断当前文件类型

3.执行压缩音频视脚本

首先我们先来看遍历当前目录三种脚本的写法:

Bash

#!bin/bash for file in `(ls)`; do     ... done

Node

import fs from 'fs';  const dirs = fs.readdirSync('./')); for (let i in dirs) {    ...  }

zx

const dirs = (await $`ls`).stdout.split('\n')  for (let i in dirs) {   ... }

可以看到 Bash 和 zx 差不多,但是 zx 比Node 省去了引包的代码。

优势:zx = Bash > Node

其次我们再来看判断当前文件类型三种脚本的写法:

Bash

if test -f $file then     filename=$(basename $file);     if [ "${file##*.}"x = "mp4"x ];then              fi      if [ "${file##*.}"x = "mp3"x ]; then      fi fi

Node、zx

if (dirs[i] && !fs.statSync(source).isDirectory()) {      if (source.endsWith(".mp4")) {              }     if (source.endsWith(".mp3")) {              } }

用Shell 来写整体上代码都非常的精炼,但是对于不经常使用的人来说,常常会遇到一些问题,例如 if 语句格式非常严格、判断比较的方式比较特殊、字符串操作都比较麻烦。

优势 Node = zx > Bash

最后再来执行压缩音频视脚本

Bash

... ffmpeg -i $file -r 30 -c copy -c:v libx264 -vf scale=720:-2 "${filename%%.*}-30-720".mp4; ...

Node

const { spawn } = require('child_process');  function run(command) {     return new Promise((rev, rej) => {         console.log(command);         const cmd = spawn(command.slice(0, 1)[0], command.slice(1));          cmd.stdout.on('data', (data) => {           console.log(`stdout: ${data}`);         });                  cmd.stderr.on('data', (data) => {           console.error(`stderr: ${data}`);         });                  cmd.on('close', (code) => {             console.log(`child process exited with code ${code}`);             rev();         });     }) }  ... await run(["ffmpeg", "-i", source ,"-r","30","-c", "copy","-c:v", "libx264",  "-vf", "scale=720:-2", `${dirs[i].replace('.mp4', '')}-30-720.mp4`]); ...

zx

$`ffmpeg -i ${file} -r 30 -c copy -c:v libx264 -vf scale=720:-2 ${file.replace(".mp4","")}-30-720.mp4;`;

用 zx 可以做到和 Shell 一样的精简,利用内置的一些 Node 包使得整体的代码量大大下降。Node需要写一些额外的代码,例如执行命令run等等。

优势 Bash = zx > Node

上手程度代码复杂度
Shell简洁
Node简单繁琐
zx简单简洁

zx 上手体验非常好,可以说用四个字来概括, "简洁易用",至此你是否对 zx 心动了呢?

Serverless 背景下,一部分“前端工程师”会转变为“应用交付工程师”

Posted: 16 Jan 2022 06:42 PM PST

大家好,我是杨成功。

这是我的 2022 年第一篇文章。一直在想写些什么比较好,既然是新年,新年新气象,写点技术展望的想法是不是更合适?于是这篇文章的标题,也就是本文的核心思想出来了:

Serverless 背景下,一部分"前端工程师"会转变为"应用交付工程师"

这里有三个名词:

  • Serverless
  • 前端工程师
  • 应用交付工程师

下面就从这三个方面,聊一下我对 2022 前端的展望。

Serverless

什么是 Serverless?

单从意思理解,非常明显,就是很少的服务

我觉得这个理解就很好。因为现在大家对 Serverless 的翻译是 无服务,真正无服务吗?也不是,我们先来看一下它的具体概念:

【Red Hat】Serverless 是一种云原生开发模型,可使开发人员专注构建和运行应用,而无需管理服务器。

听不懂?大白话翻译一下。就是说以前的服务啊,比如说我们前端要对接的接口应用,它们是要部署在 服务器上 的。后端同学要开发一套接口,首先得申请一台服务器,然后将应用部署到这个服务器上,用域名解析一下,才能给到前端接口 URL 地址,供前端调用。

但是 Serverless 出现以后,即便没有服务器,不懂运维,在线上部署应用也成为了可能。

关键点就在:没有服务器,也能部署应用

那怎么部署呢?先看一下 Serverless 的两种形式:

  • BaaS:全称 Backend as a Service,译为后端即服务。
  • FaaS:全称 Function as a Service,译为函数即服务。

BaaS 是指一个服务端应用,也叫云应用。举个例子,我们常用的阿里云的云数据库对象存储,都属于 BaaS。事实上不管是数据库还是静态资源存储,我们完全可以自己在服务器上搭建。但是因为有了像 云数据库 这类的产品,我们可以绕过服务器,直接使用一个云端的数据库。

这就是 "无服务" 的第一层概念:淡化服务器,直接接触服务端应用

注意:这里是淡化服务器,并不是真正的没有服务器。只不过是云厂商已经将服务器进行了抽象封装,暴露给开发人员的直接是应用,因此对开发人员来说好像是无服务。

BaaS 最广泛的应用在后端,因为后端好多基础设施(如数据库,日志等)不用手动搭建了,有云厂商标准稳定的支持,可以把精力集中到业务逻辑上。

但是随着前端的快速发展,以及后端的云原生化,有些奇思妙想的大佬就这么想了:"前端调用后端接口,都是在前端的一个函数中发起请求,这样的话就必然需要后端提供一个接口服务。那我们是不是可以这样,直接将这个函数部署在云上,变成云函数,供前端直接用,是不是就不需要后端的接口了?"

大佬一拍大腿,这想法竟然如此绝妙。这么干的话,前端岂不是要翻身农奴把歌唱?于是大佬们将 server 继续 less,于是 FaaS 就出现了。

FaaS 是一种面向函数的构建和部署软件的方式,也就是云函数。FaaS 是对 BaaS 的又一次升级,在淡化服务器的基础上,又淡化了应用,直接向前端暴露函数。以前我们前端的函数都是本地声明,本地调用。现在云函数是单独部署在云上,供我们前端远程调用。

这是 "无服务" 的第二层概念:淡化服务器,淡化应用,直接接触函数

事实上,Serverless 在发展到 FaaS 阶段,才真正对前端产生了变革式的影响。

前端工程师

什么是前端工程师?

早年的前端工程师更像是"页面工程师",绝大部分人的工作就是用"三驾马车"将设计图做成一张网页,直到现在还有很多后端开发对前端的印象就是如此。

但是近几年大家发现,前端工程师仿佛一直在"外卷",不断的拓展边界。虽然还是顶着"前端工程师"的帽子,但是干的事情早已经超出了传统前端范畴。

从"拓展边界"这个事情来说,大致分两个方向:

  • 向前:往产品和设计靠
  • 向后:往后端和运维靠

向前表现为,一部分前端开始对自己做的东西,会更多的思考"为什么"?

以前是产品确定到设计出图,前端只需要还原设计图就好了。理想如此,但实际情况是有些地方产品和设计考虑不到,等落实到前端这才发现不可行,于是呢就只能"改需求"或"推倒重来",这是前端最反感的事情。

这种情况一多,就会倒逼前端们不得不思考:这个页面设计合不合理?交互方面有没有问题? 如果有问题,那这个需求我们就不接,产品先回去捋清楚了再说。这样大大减少了前端的无用功,提升了开发效率,也渐渐培养了前端的产品思维。

除了产品思维,前端也在思考,如何在设计层面让"图"变成"代码"更容易。于是近年来出现了很多设计图转代码的方案,比如蓝湖,还有阿里的 imgcook。这些实践方案让一个应用从设计之初,就有了前端的影子。

而向后发展的表现,典型是 Node.js 出现以后,以 Express 为代表的超轻量框架,因为相对简单又是 JS 语言,因此在前端圈掀起了一股 "全栈开发" 的热潮。这不是没有原因的,有些小应用就是适合用 Node.js 写,速度快效率高用过都说好。

但是在一些大型生产应用上,前端就够不着了。特别是云原生出现以后,后端的门槛蹭蹭的上来了。我相信有很多优秀的前端工程师,用 Node.js 接个数据库,写一些业务逻辑的接口,完全没有问题。但是如果让你搞一些后端的高级玩法,做一些服务器运维的事情,你可能就整不来了。

哪些算高级?之前在网上看到对后端大佬的描述挺有意思,是这么说的:左手高并发,右手高可用,头顶中间件,脚踩微服务,怀抱云原生,这就是大佬的全套战甲。

所以你看看,后端围墙高筑,把妄图横插一脚的前端挡在了门外。至此后端深耕,前端也在不断的尝试中找到了自己的方向,大家各自干各自领域的事情,互不纠缠。

但是 Serverless 特别是 FaaS 出现以后,这个平衡开始出现了微妙的变化。

应用交付工程师

什么是"应用交付工程师"?

首先声明一点,这个不是官方概念,是我在思考前端向后发展时萌生的。

我们上面说了,传统前端工程师的职责,就是把设计图做成网页,但随着 Node.js 出现,前端开始有更多的机会接触到后端。对于某些小应用,一部分优秀的前端可以靠自己完成前端和接口,然后上线,不需要后端参与。

这部分人我们可以称作是"全栈工程师"。所谓的全栈要么是一端深一端浅,要么是两端都浅(当然超级大牛忽略),所以开发小应用可以,大型生产应用就没全栈什么事了。

而现在随着 Serverless 云函数横空出世,屏蔽了服务器和后端应用的部分,使后端开发门槛大幅降低。前端仿佛又看到了希望,我们可以不用写接口,只需要编写云函数,也能实现生产应用的后端开发。

以前有高墙,前端卷不进来。现在墙拆了,你说我们进不进?

典型的例子是微信小程序云开发。前端在微信开发者工具上编写云函数,一键上传与部署。然后在小程序代码中获取并调用这个远程函数,相当于整个流程前后端都是自己实现自己调试,直到应用开发完成。这就是一个典型的"前端工程师"转变"应用交付工程师"的例子。

使用 Serverless 云函数不光能轻松实现后端的业务功能,而且监控,并发,负载这些由云厂商统一实现,一应俱全。因此在稳定性可靠性上也非常有保障。

还有一点,目前可能是大家的观念问题,认为单独的云函数服务需要自己付费,还不如自己直接在云服务器上部署应用。事实上函数计算是按照调用次数,访问流量计费的,比云服务器要更节约资源更省钱。

这个观念我认为 2022 年会在大厂推动下逐步放开,越来越多的 web 应用也会接入 serverless,因此更多的前端开发工程师会转变为应用交付工程师。

以前前端要实现一些自己的想法,必须要有后端的接口配合,而且还需要后端或运维帮忙在线上部署。但是现在不用了,我们有机会自己搞定这一切。我觉得这对前端来说是巨大的机会,一个可以将产品和自己的想法,直接产出一个应用的好机会。

除此之外,前端的协作模式可能也会发生变化。以前的一个大应用,前端组是分模块开发。但是现在有了 Serverless,再加上去年已经逐步成熟的微前端,前端协作模式很可能由 "一个模块一个模块开发" 变成 "一个应用一个应用开发",这是一件非常酷的事情。

还有向前拓展时培养的产品思维,前端未来可能是最了解整个应用的人,所以前景不必多说。

加油吧,前端人们!2022 祝大家升职加薪,再攀高峰!

我想学更多

为了更好的保护原创,本文会首发微信公众号  前端砍柴人。这个公众号只做原创,每周至少一篇高质量文章,方向是前端工程与架构等实践与思考。

除此之外,我还建了一个微信群,专门提供对这个方向感兴趣的同学交流与学习。如果你也感兴趣,欢迎加我微信  ruidoc  拉你入群~

19 岁少年入侵 25 辆特斯拉汽车;开发者因无报酬破坏 NPM 开源库;Rust 1.58.0 发布 | 思否周刊

Posted: 15 Jan 2022 07:57 PM PST

40s 新闻速递

  • 苹果将于 3 月或 4 月举行发布会:推 iPhone SE3
  • 开发者因无报酬故意破坏知名 NPM 开源库,引发热议
  • 苹果 2021 年总共向开发者支付 600 亿美元,创下新纪录
  • H2 数据库中发现类似 Log4j 的漏洞
  • 19 岁少年远程入侵 25 辆特斯拉汽车 称利用软件漏洞
  • 为免遭攻击,安全研究员呼吁要求 Apple 禁用"2G"
  • Linux 准备最终移除对 a.out 格式的支持
  • Chrome 将禁止外部域名访问本地网络
  • Linux 5.16 发布,带来许多改进、修复
  • 谷歌推出 Chrome 98 测试版,支持颜色渐变矢量字体
  • Linux 5.16 开发者统计
  • KeePass 2.50 发布,密钥派生功能显著增加
  • Rust 1.58.0 发布,引入捕获的标识符
  • KDE Plasma 5.24 Beta 发布

行业资讯

苹果将于 3 月或 4 月举行发布会:推 iPhone SE3

据美国媒体最新报道称,苹果目前正计划今年 3 月或 4 月举行发布会,推出支持 5G 网络的 iPhone SE3。这次发布会依然是线上虚拟形式。按照之前的说法,全新第三代 iPhone SE 将于今年发布,并支持 5G 网络,升级 A 系列芯片。外观方面,不会有任何变化。在最近两年,iPhone SE3 的传言一直很多,一些信息提到 iPhone SE3 会迎来全新设计,类似 iPhone 11,没有触控 ID,边框变窄,但另外一些传言称,iPhone SE3 外观不会变化,全新设计的 iPhone SE 已经推迟至 2024 年。

开发者因无报酬故意破坏知名 NPM 开源库,引发热议

近日,知名开源工具 faker.js 的作者 Marak Squires 故意破坏 GitHub 上的开源库 "faker.js" 和"color.js",将项目所有代码清空,并在 commit 中留下 "endgame" 字样,还在 README 中写道 "What really happened with Aaron Swartz?"。(Swartz 是一位美国程序员、企业家和著名的黑客活动家,在一场官司之后自杀。)据悉,Marak 破坏该项目原因系无报酬。此前在 2020 年 9 月,Marak 曾在家中备有炸弹材料,疑似患有"精神问题" 并因鲁莽危害被起诉。11 月他发文要求使用 faker.js 项目的公司向他支付费用,否则他将不再提供维护工作。

目前,Marak 已经被暂停 GitHub 账号,同时 NPM 也恢复到了之前版本的 faker.js 包。Marak 的举动引发了网友大量的争议:资讯安全专家 VessOnSecurity 称该行为"不负责任";软件工程师 Sergio Gómez 称这是"绑架",并提出需要开始分散托管免费开源代码等。

苹果 2021 年总共向开发者支付 600 亿美元,创下新纪录

苹果公司表示在 2021 年共向开发者支付 600 亿美元。此外,自 2008 年以来,App Store 应用商店总共向开发者支付了 2600 亿美元。,这表明 App Store 的销售仍然在以创纪录的速度增长。截至 2019、2020 年,苹果支付给开发者的总金额分别为 1550 亿和 2000 亿美元,这意味着 2020 年苹果向应用开发者支付了 450 亿美元。

外媒报道称,苹果支付给开发者的款项占苹果应用商店总销售额的 70% 至 85%,而应用商店的销售额占应用程序数字购买销售额的 15% 至 30%。分析师们以此估算,苹果应用商店销售额仍在快速增长。

H2 数据库中发现类似 Log4j 的漏洞

近日,JFrog Security(软件分发社交平台)的一名安全研究人员在 H2 数据库(开源 Java SQL 数据库)控制台中发现了一个基于 JNDI 的严重漏洞,与 Log4Shell 类似,该漏洞存在于 Apache 日志库中。此漏洞现在被跟踪为 CVE-2021-42392。

而在 1 月 10 日,美国网络安全与基础设施安全局(CISA)高级官员表示,安全人员与 log4j 安全漏洞的斗争将是一场持久战。在 10 日的电话会议期间,CISA 主管 Jen Easterly 向记者透露,尽管还有许多攻击未公开,但除了对比利时国防部的攻击之外,目前美国联邦机构还没有看到直接 Log4j 漏洞进行的重大网络攻击。

19 岁少年远程入侵 25 辆特斯拉汽车 称利用软件漏洞

19 岁的德国安全研究人员大卫 · 科伦坡(David Colombo)日前表示,他在特斯拉的系统中发现一处软件漏洞,并通过该漏洞远程入侵了 13 个国家的逾 25 辆特斯拉电动汽车,使其关闭安全系统。科伦坡自称为「信息技术专家」,当地时间周二在 Twitter 上称,特斯拉汽车的该软件漏洞允许他远程打开门窗,无需钥匙就能启动汽车,还能关闭车辆的安全系统。科伦坡还表示,他一直在与特斯拉的安全团队保持联系,特斯拉目前正在调查该问题,如果有最新进展也会告知科伦坡。

为免遭攻击,安全研究员呼吁要求 Apple 禁用"2G"

去年,谷歌为新的 Android 智能手机推出了 "禁用 2G" 功能,它将为蜂窝站点模拟器提供一些保护,这是一种在全国范围内使用的侵入性警察监视技术。2G 中有许多安全漏洞,这些漏洞使得用户容易受到攻击。因此谷歌实现这一功能非常受用,但对于 iPhone 用户来说不同,因为 Apple 并不支持此项禁用功能。对此,EFF 的一名安全研究员和技术专家 Cooper Quintin 发文呼吁大家要求 Apple 也停止此功能。

Linux 准备最终移除对 a.out 格式的支持

1 月 13 日,Linux 内核开发人员 Borislav Petkov 提议从内核中移除对 a.out 支持的补丁。Linux 一直依赖 a.out 格式,直到 90 年代中期的 v1.2,ELF 成为流行的二进制文件格式。虽然多年来 a.out 格式并未在 Linux 上广泛使用,但在 2019 年才真正弃用了 x86 32 位上运行的 a.out 二进制文件。到目前为止,其他响应的上游开发人员都支持清除这种已弃用的 a.out。一些旧的系统调用和其他未使用的内核代码也有可能在此过程中被清除。

Chrome 将禁止外部域名访问本地网络

为防止恶意脚本悄悄在浏览器上执行本地 HTTP 请求,Chrome 将实现名为 Private Network Access (PNA)的 W3C 新规格阻止这一被恶意程序滥用的行为。新功能将在今年上半年推出,PNA 将在 Chrome 中引入一个机制,外部域名在尝试与本地网络设备建立连接前需要征得系统许可,如果本地设备如服务器或路由器没有回应,尝试建立连接的请求将被阻止。

最新技术动态

Linux 5.16 发布,带来许多改进、修复

1 月 9 日,Linux 5.16 发布,内核已升级至稳定版。

主要更新内容

  • 用于帮助 Steam Play(和 Wine)的 FUTEX2 futex_waitv 系统调用;
  • AMD Ryzen 6000 移动系列正在形成更好的形状;
  • 英特尔对 Sapphire Rapids 的 AMX 支持已经落地;
  • 大型 AMD Ryzen 具有 Radeon 图形性能改进以及大量其他硬件改进

谷歌推出 Chrome 98 测试版,支持颜色渐变矢量字体

继上周发布 Chrome 97 之后,谷歌将 Chrome 98 升级为 beta 版本。在 Chrome 98 中,有一些小的改进,主要面向开发人员。

主要更新内容

  • 支持 COLRv1 颜色渐变矢量字体作为新的字体格式;
  • 使用动态范围和视频动态范围的 CSS 进行 HDR 彩色媒体查询;
  • 支持控制 window.open() 行为,无论是新窗口中的弹出窗口还是新选项卡等

Linux 5.16 开发者统计

近日发布的 Linux 5.16 包含了来自 1,988 名开发者的 14,190 个变更集。开发者数量仅次于 Linux 5.13 的 2,062 人,为历史第二高,有 296 名开发者是首次向内核贡献补丁。根据变更集统计,最活跃的五名开发者是 Michael Straube,Cai Huoqing,Jakub Kicinski,Christoph Hellwig 和 Bart Van Assche,其中 Michael Straube 的贡献主要集中在 r8188eu 无线网卡驱动程序,而 Cai Huoqing 主要做了大量的清理工作(可能是百度开发者,此前曾用 @baidu.com 后缀的邮件),Jakub Kicinski 改进了网络子系统,Christoph Hellwig 的贡献集中在块和文件系统层,Bart Van Assche 修改了 SCSI 子系统代码。

KeePass 2.50 发布,密钥派生功能显著增加

目前,KeePass 2.50 已升级到稳定版,新版本密钥派生功能得到显著增加。

主要更新内容

  • 在 Windows 上 AES-KDF 的速度约快一倍,若安装了 libgcrypt 库,在 Linux 系统上 AES-KDF 的速度大约快 4 倍;
  • 进了对 Brave、Epiphany、Pale Moon 和 Vivaldi 浏览器的检测;
  • 改进了密码管理器中的密钥处理;
  • 改进了独占密钥提供程序的处理等

Rust 1.58.0 发布,引入捕获的标识符

1 月 13 日,Rust 团队宣布 Rust 1.58.0 发布。

主要更新内容

  • 在格式字符串中引入捕获的标识符;
  • 改变 Windows 上的 Command 搜索路径;
  • 在标准库中增加 #[must_use] 注释;
  • 以及一些新的库稳定性改进等

KDE Plasma 5.24 Beta 发布

在稳定版之前,KDE 发布 Plasma 5.24 Beta 版。

主要更新内容

  • Wayland 改进;
  • Breeze 主题的改进;
  • 各种系统托盘和小部件改进;
  • KDE 系统设置的更改;
  • 新的 KWin 概览效果;
  • 许多 Discover 改进以及大量修复等

No comments:

Post a Comment