首页 文章 精选 留言 我的

精选列表

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

ShareX 14.1 发布,改进中文 OCR 功能

ShareX 是一个开源截图工具,可捕获或记录屏幕的任何区域,并一键共享。 它还允许将图像、文本或其他类型的文件上传到超过 80 个支持的存储服务上。 ShareX 14.1 正式发布,更新内容如下: 增加了波兰语支持 OCR 的改进 OCR 窗口布局的变化 在语言选项附近添加了 OCR 帮助按钮,可以打开 OCR 帮助页面,这样用户可以看到如何安装更多的 OCR 语言 按字母顺序排列 OCR 语言 在中文、日文、韩文语言中删除词语之间的空格 在 RTL (从右到左)语言中颠倒单词的顺序 增加了单行选项 OCR 后自动选择结果文本框 增加了新的 OCR 服务链接 Google 图片 DuckDuckGo DeepL 增加了复制所有按钮 为自定义上传器解析函数添加了输入参数支持 {json:input|jsonPath} {xml:input|xpath} {regex:input|pattern|group} 在 Alt + Tab 菜单中不显示通知窗口 支持可移植的开发构建更新 更多详情可查看:https://getsharex.com/changelog/

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

ES2022 有什么新功能

鲸腾FE,来自鲸腾网络。是一支专注于 web 前端的开发团队,并在 web 前端领域积累了多年疑难问题解决经验。崇尚高效、优质、成长、自由、快乐。 ES2022 可能会在 2022 年 6 月成为标准,我们来看看将成为 ES2022 一部分的特性。 Class Fields Public Instance Fields(公有实例字段) 公有实例字段存在于类的每一个实例中。公有实例字段可以在基类的构造过程中(构造函数主体运行前)使用 Object.defineProperty 添加,也可以在子类构造函数中的 super() 函数结束后添加。 const PREFIX = 'prefix'; class ClassWithComputedFieldName { [`${PREFIX}Field`] = 'prefixed field'; instanceField; } const instance = new ClassWithComputedFieldName(); console.log(instance.prefixField); // 预期输出值: "prefixed field" console.log(instance.instanceField); // 预期输出值: "undefined" Private Instance Fields(私有实例字段) 私有实例字段使用 # 名称(发音为“哈希名称”)声明,这些名称以 # 开头。即 # 是名称本身的一部分,声明和访问时也需要加上。私有字段在类声明的构造方法中就可被访问。 从作用域之外引用 # 名称、内部在未声明的情况下引用私有字段、或尝试使用 delete 移除声明的字段都会抛出语法错误。 class ClassWithPrivateField { #privateField; constructor() { this.#privateField = 42; delete this.#privateField; // 语法错误 this.#undeclaredField = 444; // 语法错误 } } const instance = new ClassWithPrivateField() instance.#privateField === 42; // 语法错误 Static class fields and private static methods(静态类字段和私有静态方法) 类(class)通过 static 关键字定义静态方法。不能在类的实例上调用静态方法,而应该通过类本身调用。 class ClassWithStaticMethod { static #PRIVATE_STATIC_FIELD; static staticProperty = 'someValue'; static staticMethod() { return 'static method has been called.'; } static publicStaticMethod() { ClassWithStaticMethod.#PRIVATE_STATIC_FIELD = 42; return ClassWithStaticMethod.#PRIVATE_STATIC_FIELD; } static { console.log('Class static initialization block called'); } } // 预期输出值: "Class static initialization block called" console.log(ClassWithStaticMethod.staticProperty); // 预期输出值: "someValue" console.log(ClassWithStaticMethod.staticMethod()); // 预期输出值: "static method has been called." console.log(ClassWithStaticMethod.publicStaticMethod() === 42); // 预期输出值: true Private instance methods and accessors(私有实例方法) 私有实例方法是类实例上可用的方法,它们的访问方式与私有实例字段相同。 私有实例方法可以是生成器、异步或者异步生成器函数,私有getter和setter。 class ClassWithPrivateAccessor { #message; get #decoratedMessage() { return `${this.#message}`; } set #decoratedMessage(msg) { this.#message = msg; } constructor() { this.#decoratedMessage = 'hello world'; console.log(this.#decoratedMessage); } } new ClassWithPrivateAccessor(); // 预期输出值: "hello world" RegExp Match Indices 正则表达式匹配索引。向正则表达式添加标志 /d 会生成记录每个组捕获的开始和结束的匹配对象。 从上图可以看到输出的对象中增加了 indices 属性,包含匹配组的开始和结束索引。 除了索引值,还可以通过命名来获取匹配的组,如上图所示。 Top-level await 顶级 await 模块。可以在模块的顶层使用 await 并且不再需要输入异步函数或方法。 动态加载模块 let lodash; try { lodash = await import('https://primary.example.com/lodash'); } catch { lodash = await import('https://secondary.example.com/lodash'); } 使用加载速度最快的资源 const resource = await Promise.any([ fetch('http://example.com/first.txt') .then(response => response.text()), fetch('http://example.com/second.txt') .then(response => response.text()), ]); .at() Accessible Object.prototype.hasOwnProperty 即 Object.hasOwn(obj, propKey),可以安全的检查 own 属性,支持所有对象类型。 const proto = { protoProp: 'protoProp', }; const obj = { __proto__: proto, objProp: 'objProp', }; console.log('protoProp' in obj); // 预期输出值: true console.log(Object.hasOwn(obj, 'protoProp')); // 预期输出值: false console.log(Object.hasOwn(proto, 'protoProp')); // 预期输出值: true Error Cause 错误及其子类可以指定错误的原因。在深度嵌套函数中很有用,可以将错误链接起来以快速找到错误。 function doWork() { try { doSomeWork(); } catch (err) { throw new Error('Some work failed', { cause: err }); } try { doMoreWork(); } catch (err) { throw new Error('More work failed', { cause: err }); } } try { doWork(); } catch (err) { switch(err.message) { case 'Some work failed': handleSomeWorkFailure(err.cause); break; case 'More work failed': handleMoreWorkFailure(err.cause); break; } }

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

Firefox 98 发布,大幅优化下载功能

Firefox 98 如期而至,该版本最大的变化就是优化了下载流程,除此之外还有一系列的小改进、性能优化和安全性增强。 Firefox 98 优化了下载流程,改变了浏览器长期存在的一个行为。以往当用户使用 Firefox 下载文件时,浏览器会弹出一个窗口提示,要求用户选择一个开启文件的应用程序,或将文件直接保存到本地(无论如何都要二选一)。从 Firefox 98 开始,所有文件将自动保存到默认的下载文件夹中,不会再弹窗提示了。 除此之外,新版本中还为下载面板新增了多个有用的选项(上图): 自动打开该类型文件:让 Firefox 浏览器自动用系统默认的应用程序打开相同类型的下载文件 在访达(macOS)或文件夹(Windows)中显示:打开包含下载文件的文件夹 转至下载页面:即使在离开网站或关闭标签页面后,也会重新打开最初的下载页面 复制下载链接:复制下载链接以分享或保存等用途 删除:你现在可以直接从下载面板中删除已下载的文件(不是删除下载记录,而是从设备中彻底删除这个文件,无需跳转至对应的文件夹再进行删除操作) 从历史记录中移除:从下载文件列表中删除这个文件的下载记录(仅删除记录,不删除文件) 清空预览面板:清空面板中的下载项目列表 现在用户还可以在文件下载完成之前就双击文件,Firefox 会在文件完成后自动开启它。 搜索引擎 Firefox 浏览器允许用户从一些内置的搜索引擎中选择一个作为默认的搜索引擎。在这个版本中,一些以前配置过默认引擎的用户会注意到他们的默认搜索引擎已经发生了改变,因为 Mozilla 无法获得部分搜索引擎提供商的正式许可,因此需要移除部分搜索引擎,中国大陆用户并未发生任何变化(可查看我们这篇报道)。 其他内容: 更新到 Firefox 98 后,“总是询问” 下载操作现在将被重置; 在 Firefox 98 的 Linux 版本中,Wayland 支持默认并没有启用。有需要的用户可以手动启用 Wayland 支持; 这个版本将通过只使用 webRequest 阻塞调用来改善启动期间加载附加组件的情况,此前 webRequest 非阻塞调用会导致附加组件提前启动,这会引发 Firefox 出现性能问题,现在 Firefox 浏览器的启动速度将变得更快; Firefox 98 默认启用了 <dialog> HTML 元素,以增加对基于 HTML 的模态对话框的支持; 增加了对 HTMLElement.outerText DOM 元素的支持; 改进了 navigator.registerProtocolHandler() API; 更多详情可查看:https://www.mozilla.org/en-US/firefox/98.0/releasenotes

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

StratoVirt 基于 Rust 的 balloon 功能实践

StratoVirt 是计算产业中面向云数据中心的企业级虚拟化 VMM,实现了一套架构统一支持虚拟机、容器、Serverless 三种场景。StratoVirt 在轻量低噪、软硬协同、Rust 语言级安全等方面具备关键技术竞争优势。 背景介绍: 通常,在同一台服务器上存在着不同的用户,而多数用户对内存的使用情况是一种间断性的使用。也就是说用户对内存的使用率并不是很高。在服务器这种多用户的场景中,如果很多个用户对于内存的使用率都不高的话,那么会存在服务器实际占用的内存并不饱满这样一种情况。实际上各个用户使用内存的分布图可能如下图所示(黄色部分表示 used 部分,绿色部分表示 free 的部分)。 解决方案: 为了解决上述服务器上内存使用率低的问题,可以将虚拟机中暂时不用的内存回收回来给其他虚拟机使用。而当被回收内存的虚拟机需要内存时,由 host 再将内存归还回去。有了这样的内存伸缩能力,服务器便可以有效提高内存的使用率。在 StratoVirt 中,我们使用 balloon 设备来对虚拟机中的空闲内存进行回收和释放。下面详细了解一下 StratoVirt 中的 balloon 设备。 balloon 设备简介: 由于 StratoVirt 只是负责为虚拟机分配内存,只能感知到每个虚拟机总的内存大小。但是在每个虚拟机中如何使用内存,内存剩余多少。StratoVirt 是无法感知的,也就无法得知该从虚拟机中回收多少内存了。为此,需要在虚拟机中放置一个“气球(balloon)”设备。该设备通过 virtio 半虚拟化框架来实现前后端通信。当 Host 端需要回收虚拟机内部的空闲内存时,balloon 设备“充气”膨胀,占用虚拟机内部内存。而将占用的内存交给 Host 使用。如果虚拟机的空闲内存被回收后,虚拟机内部由于业务要求突然需要内存时。位于虚拟机内部的 balloon 设备可以选择“放气”缩小。释放出更多的内存空间给虚拟机使用。 balloon 实现: balloon 的具体代码实现位于 StratoVirt 项目的/virtio/src/balloon.rs 文件中,相关细节可阅读代码理解。代码架构如下: virtio├──Cargo.toml└──src├──balloon.rs├──block.rs├──console.rs├──lib.rs├──net.rs├──queue.rs├──rng.rs├──vhost│├──kernel││├──mod.rs││├──net.rs││└──vsock.rs│└──mod.rs├──virtio_mmio.rs└──virtio_pci.rs 由于 balloon 是一个 virtio 设备,所以在前后端通信时也使用了 virtio 框架提供的 virtio queue。当前 StratoVirt 支持两个队列:inflate virtio queue(ivq)和 deflate virtio queue(dvq)。这两个队列分别负责 balloon 设备的“充气”和“放气”。 气球的充放气时,前后端的信息是通过一个结构体来传递。 structVirtioBalloonConfig{///NumberofpageshostwantsGuesttogiveup.pubnum_pages:u32,///Numberofpageswe'veactuallygotinballoon.pubactual:u32,} 因此后端向前端要内存的时候,只需要修改这个结构体中的 num_pages 的数值,然后通知前端。前端读取配置结构体中的 num_pages 成员。并与本身结构体中的 actual 对比,判断是进行 inflate 还是 deflate。 inflate 如果是 inflate,那么虚拟机以 4k 页为单位去申请虚拟机内存,并将申请到的内存地址保存在队列中。然后通过 ivq 将保存了分配好的页面地址的数组分批发往后端处理(virtio queue 队列长度最大 256,也就是一次最多只能传输 1M 内存信息,对于大于 1M 的内存只能分批传输)。后端通过得到信息后,找到相应的 MemoryRegion,将对应的 page 标记为”WILLNEED“。然后通知前端,完成配置。 deflate 如果是 deflate 则从保存申请到的内存地址队列中弹出一部分内存的地址。通过 dvq 分批次传输给后端处理。后端将 page 标记为“DONTNEED"。 下面结合代码进行说明: 定义 BalloonIoHandler 结构体作为处理 balloon 事件的主体。 structBalloonIoHandler{///Thefeaturesofdriver.driver_features:u64,///Addressspace.mem_space:Arc<AddressSpace>,///Inflatequeue.inf_queue:Arc<Mutex<Queue>>,///InflateEventFd.inf_evt:EventFd,///Deflatequeue.def_queue:Arc<Mutex<Queue>>,///DeflateEventFd.def_evt:EventFd,/*省略*/} 其中包含上述的两个 virtio 队列inf_queue和def_queue,以及对应的触发事件描述符(EventFd)inf_evt和def_evt。两个队列均使用了Mutex锁,保证了队列在同一时刻只有一个使用者对该队列进行操作。保证了多线程共享的数据安全。 fnprocess_balloon_queue(&mutself,req_type:bool)->Result<()>{letqueue=ifreq_type{&mutself.inf_queue}else{&mutself.def_queue};//获得对应的队列letmutunlocked_queue=queue.lock().unwrap();whileletOk(elem)=unlocked_queue.vring.pop_avail(&self.mem_space,self.driver_features){matchRequest::parse(&elem){Ok(req)=>{if!self.mem_info.has_huge_page(){//进行内存标记req.mark_balloon_page(req_type,&self.mem_space,&self.mem_info);}/*省略*/}Err(e)=>{/*省略错误处理*/}}}/*省略*/} 当相应的EventFd被触发后process_balloon_queue函数将会被调用。通过判断请求类型确定是“充气”还是”放气“,然后再从相应的队列中取数据进行内存标记。其中while let是 Rust 语言提供的一种循环模式匹配机制。借助该语法可以将队列中 pop 出来的所有数据遍历取出到elem中。 内存标记及优化: 标记内存在mark_balloon_page函数中进行实现,起初的实现思路为:将虚拟机传送过来的地址逐个进行标记。即,从队列中取出一个元素,转化为地址后立即进行标记。后来经过测试发现:balloon 设备在对页地址进行一页一页标记内存时花费时间巨大。而同时也发现通过虚拟机传回来的地址中有大段的连续内存段。于是通过改变标记方法:由原来的一页一页标记改为将这些连续的内存统一标记。大大节省了标记时间。下面代码为具体实现: fnmark_balloon_page(&self,req_type:bool,address_space:&Arc<AddressSpace>,mem:&BlnMemInfo,){letadvice=ifreq_type{libc::MADV_DONTNEED}else{libc::MADV_WILLNEED};/*略*/foriovinself.iovec.iter(){letmutoffset=0;letmuthvaset=Vec::new();whileletSome(pfn)=iov_to_buf::<u32>(address_space,iov,offset){offset+=std::mem::size_of::<u32>()asu64;letgpa:GuestAddress=GuestAddress((pfnasu64)<<VIRTIO_BALLOON_PFN_SHIFT);lethva=matchmem.get_host_address(gpa){Some(addr)=>addr,None=>{/*略*/}};//将hva地址保存在hvaset的vec中hvaset.push(hva);}//对hvaset进行从小到大排序。hvaset.sort_by_key(|&b|Reverse(b));/*略*///将hvaset中连续的内存段进行标记whileletSome(hva)=hvaset.pop(){iflast_addr==0{free_len+=1;start_addr=hva;}elseifhva==last_addr+BALLOON_PAGE_SIZE{free_len+=1;}else{memory_advise(start_addras*constlibc::c_voidas*mut_,(free_len*BALLOON_PAGE_SIZE)asusize,advice,);free_len=1;start_addr=hva;}ifcount_iov==iov.iov_len{memory_advise(start_addras*constlibc::c_voidas*mut_,(free_len*BALLOON_PAGE_SIZE)asusize,advice,);}count_iov+=std::mem::size_of::<u32>()asu64;last_addr=hva;}/*略*/}}} 首先将 virtio 队列中的地址全部取出,并保存在 vec 中,然后将该 vec 进行从小到大的排序。有利于快速找出连续的内存段并进行标记。由于 hvaset 中的地址是按照从小到大排列的,因此可以从头开始遍历 hvaset,遇到不连续的地址后将前面的连续段进行标记。这样就完成了由原来逐页标记到连续内存段统一标记的优化。 经过测试,StratoVirt 的 balloon 速度也有了极大的提高。 关注我们 StratoVirt 当前已经在 openEuler 社区开源。后续我们将开展一系列主题分享,如果您对 StratoVirt 的使用和实现感兴趣,欢迎您围观和加入。 项目地址:https://gitee.com/openeuler/stratovirt 项目 wiki:https://gitee.com/openeuler/stratovirt/wikis 您也可以订阅邮件列表:https://mailweb.openeuler.org/postorius/lists/virt.openeuler.org/ 如有疑问,也欢迎提交 issue:https://gitee.com/openeuler/stratovirt/issues 入群 如果您对虚拟化技术感兴趣,可以进入 openEuler StratoVirt 主页查找相关资源(点击阅读原文进入项目主页,https://www.openeuler.org/zh/other/projects/stratovirt/),包括安装指导、虚拟机配置、代码仓库、学习资料等。也欢迎加入Virt SIG 技术交流群,讨论 StratoVirt、KVM、QEMU 和 Libvirt 等相关虚拟化技术。感兴趣的同学可以添加如下微信小助手,回复 StratoVirt 入群。 本文分享自微信公众号 - openEuler(openEulercommunity)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

ExcelUtil 3.1.2 发布,新增水印导出功能

你还在写大量的Excel导入导出代码? ExcelUtil一行代码搞定导入导出哦! 更多示例见官网哦,2.x不建议观看,直接看3.x版本哦 【官网文档】http://www.likaixuan.top/excelUtil/doc/v3 【本次更新内容如下】 1.新增水印。 话不多说,先看效果图, 对于大多数程序员来说,吭哧百度白天,水印倒是添加上去了,居然是假水印,[偷笑],所谓加水印就是生成图片贴在Exel上,这种水印实在不敢恭维 有区别于市面上好多贴图在Excel上面的假水印,我们可是真水印 哦! 【温馨提示:用ExcelUtil工具只需要一行代码,不仅能导出Excel,还能添加水印哦】 【说明】现在很多工具类,为了设计为工具,其本身有学习成本在里面,ExcelUtil作为一个工具类,其一开始就为了开发者能够迅速上手 ,所以我们的一贯宗旨就是极简的代码上手,对入门者来说十分简单就能使用。 更多用法请参见官网:http://www.likaixuan.top/excelUtil/doc/v3 以下用例都是3.x用法: 一行代码搞定Excel导出且有水印!!! 就是这么简单!!! /** * * 参数说明:1.response 没什么好说的 2.list 数据集 3.导出excel的名称 4.自定义水印文字 */ @GetMapping(value = "/export") public void testExport(HttpServletResponse response) throws Exception{ List<PhoneModel> list = new ArrayList<>(); for(int i=0;i<10;i++){ PhoneModel model = new PhoneModel(); model.setNum((i+1)); model.setColor("金色"+i); model.setPhoneName("苹果"+i+"S"); model.setPrice(i); model.setSj(new Date()); list.add(model); } ExcelUtil.exportExcelOutputStream(response,list,PhoneModel.class,"测试Excel导出","素剑步青尘"); } 引入pom <!--https://mvnrepository.com/artifact/net.oschina.likaixuan/excelutil--> <dependency> <groupId>net.oschina.likaixuan</groupId> <artifactId>excelutil</artifactId> <version>3.1.2</version> </dependency>

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

ExcelUtil 3.1.0 发布,新增模板导出功能

更新内容如下: 1.新增模板导出。 【说明】现在很多工具类,为了设计为工具,其本身有学习成本在里面,ExcelUtil作为一个工具类,其一开始就为了开发者能够迅速上手 ,所以我们的一贯宗旨就是极简的代码上手,对入门者来说十分简单就能使用。 更多用法请参见官网: http://www.likaixuan.top/excelUtil/doc/v3 以下用例都是3.x用法: //浏览器中直接下载 /** * * 参数说明:1.response 没什么好说的 2.模板地址 3.类对象 4.文件导出名称 */ @GetMapping(value = "/exportTemplate") public void exportTemplate(HttpServletResponse response) throws Exception{ PhoneModel model = new PhoneModel(); model.setColor("金色"); model.setPhoneName("苹果12 S"); model.setPrice(9999); model.setSj(new Date()); ExcelUtil.templateWrite(response,"E:\\新建XLSX 工作表.xlsx",model,"ce测试时"); } //导出带文件名称但不带表头,文件名称用当前时间,年月日时分秒命名 @GetMapping(value = "/export") public void testExport(HttpServletResponse response) throws Exception{ List<PhoneModel> list = new ArrayList<>(); PhoneModel model = null; for(int i=0;i<10;i++){ model = new PhoneModel(); model.setNum((i+1)); model.setColor("金色"+i); model.setPhoneName("苹果"+i+"S"); model.setPrice(i); model.setSj(new Date()); list.add(model); } ExcelUtil.exportExcelOutputStream(response,list,PhoneModel.class); } //导出带文件名和表头,文件名称和表头保持一致 @GetMapping(value = "/exportHeader") public void testExportHeader(HttpServletResponse response) throws Exception{ List<PhoneModel> list = new ArrayList<>(); PhoneModel model = null; for(int i=0;i<10;i++){ model = new PhoneModel(); model.setNum((i+1)); model.setColor("金色"+i); model.setPhoneName("苹果"+i+"S"); model.setPrice(i); model.setSj(new Date()); list.add(model); } ExcelUtil.exportExcelOutputStream(response,list,PhoneModel.class,"文件名后面参数true标识表头也是同样名称",true); } 引入pom <!--https://mvnrepository.com/artifact/net.oschina.likaixuan/excelutil--> <dependency> <groupId>net.oschina.likaixuan</groupId> <artifactId>excelutil</artifactId> <version>3.1.0</version> </dependency>

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

maxCompute的UDAF demo,实现累加功能

需求:将表中数据按照name聚合,并且count进行累加 name count Jan 1 Jan 2 Feb 3 Feb 1 Mar 1 Mar 5 预期结果: name count Jan 3 Feb 7 Mar 13 使用idea的maxCompute studio新增UDAF 然后自动生成未实现的方法,我的字段name是string,count是bigint所以@Resolve("string,bigint->bigint") 新增一个class用来存储字段 private String name; private Long count; @Override public void write(DataOutput out) throws IOException { out.writeUTF(name); out.writeLong(count); } @Override public void readFields(DataInput in) throws IOException { name = in.readUTF(); count = in.readLong(); } } 这样newBuffer就可以这样写了 public Writable newBuffer() { return new MyBuffer(); } 还需要一个Map来存储key(name)和value(count),一个long类型的参数存储累加的值 Long old_count = 0L;//存储累加值 private LongWritable ret = new LongWritable();//存储输出值 完整代码参考: public class UDAFTest extends Aggregator { private static class MyBuffer implements Writable { private String name; private Long count; @Override public void write(DataOutput out) throws IOException { out.writeUTF(name); out.writeLong(count); } @Override public void readFields(DataInput in) throws IOException { name = in.readUTF(); count = in.readLong(); } } @Override public Writable newBuffer() { return new MyBuffer(); } Map<String,Long> map = new LinkedHashMap<>(); Long old_count = 0L; @Override public void iterate(Writable buffer, Writable[] args) throws UDFException { String arg = String.valueOf(args[0]); Long cnt = Long.parseLong(String.valueOf(args[1])); MyBuffer buf = (MyBuffer) buffer; if (arg != null) { if(map.containsKey(arg)){ Long newcnt = map.get(arg); old_count = cnt+newcnt; map.put(arg,old_count); }else { map.put(arg,old_count+cnt); } } buf.name = arg; buf.count = map.get(arg); } private LongWritable ret = new LongWritable(); @Override public Writable terminate(Writable arg0) throws UDFException { MyBuffer buffer = (MyBuffer) arg0; ret.set(buffer.count); return ret; } @Override public void merge(Writable buffer, Writable partial) throws UDFException { MyBuffer buf = (MyBuffer) buffer; MyBuffer p = (MyBuffer) partial; buf.name = p.name; buf.count = p.count; } } 然后通过maxCompute studio发布下 发布名为test20191119,这样就可以在Dataworks中调用了。 其中原表数据:

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

WebStorm

WebStorm

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

用户登录
用户注册