首页 文章 精选 留言 我的

精选列表

搜索[HTTP/3],共10000篇文章
优秀的个人博客,低调大师

像Google一样构建机器学习系统3 - 利用MPIJob运行ResNet101

本系列将利用阿里云容器服务,帮助您上手Kubeflow Pipelines. 第一篇:在阿里云上搭建Kubeflow Pipelines 第二篇:开发你的机器学习工作流 第三篇:利用MPIJob运行ResNet101 从上篇文章中,我们可以看到如何通过Kubeflow Pipeline运行单节点任务机器学习工作流,在本文中,我们会介绍如何使用Pipeline运行分布式MPI任务,该MPI任务运行模型ResNet101的测试。 开发MPIRun Pipeline 由于Kubeflow Pipelines提供的例子多数都是单机任务,那么如何利用Pipelines运行分布式训练?阿里云容器服务团队提供了利用MPIJob训练ResNet101模型的例子,方便您在阿里云上使用和学习Kubeflow Pipelines,并且训练支持分布式的allredu

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

使用 ale.js 制作一个小而美的表格编辑器(3)

今天来教大家如何使用 ale.js 制作一个小而美的表格编辑器,首先先上 gif: 是不是还是有一点非常 cool 的感觉的?那么我们现在开始吧! 这是我们这篇文章结束后完成的效果(如果想继续完成请访问第四篇文章): ok,那继续开始吧(本篇文章是表格编辑器系列的第三篇文章,如果您还没有看过第一篇,请访问第一篇文章(开源中国)): 首先让我们把每一个列表项都添加一个他们的行数和列数作为 dataset 数据吧! 先创建一个 rowId 变量: //在 handleTemplateRender 函数里,我们把: var returnVal = "<table><thead><tr>", getSortSign = this.methods.getSortSign, sortBy = this.staticData.sortBy; //改为 var returnVal = "<table><thead><tr>", getSortSign = this.methods.getSortSign, sortBy = this.staticData.sortBy, rowId = -1; 然后再在 “循环遍历bookData数据并输出” 这行注释所对应的forEach函数的里面创建一个名叫 cellId 的变量:(就是输出td标签的forEach) //原来的代码 this.data.bookData.forEach(function(thisBook, i, arr) { //输出一行 returnVal += "<tr>"; thisBook.forEach(function(val, i, arr) { //输出一列 returnVal += "<td>" + val + "</td>"; }) returnVal += "</tr>"; }) //改为 this.data.bookData.forEach(function(thisBook, i, arr) { var cellId = -1; //这里增加了一行代码 //输出一行 returnVal += "<tr>"; thisBook.forEach(function(val, i, arr) { //输出一列 returnVal += "<td>" + val + "</td>"; }) returnVal += "</tr>"; }) 当然这样还没完,我们还需要改为这样: this.data.bookData.forEach(function(thisBook, i, arr) { var cellId = -1; //这里让rowId++ rowId++; returnVal += "<tr>"; thisBook.forEach(function(val, i, arr) { //这里让cellId++ cellId++; //注意这里写了 dataset returnVal += "<td data-row='" + rowId + "' data-cell='" + cellId + "'>" + val + "</td>"; }) returnVal += "</tr>"; }) 这样你就可以看到在控制台上已经输出了它们的 dataset: 接下来,让我们往 data 里面添加一个名叫 edit 的对象,用来指定我们点击的到底是哪个表格: edit: { row: -1, //默认为-1,因为没有选中表格 cell: -1 } 然后,我们把下面这行代码,给他添加一个 ondblclick: returnVal += "<td data-row='" + rowId + "' data-cell='" + cellId + "'>" + val + "</td>"; //改为 newVal += "<td data-cell='" + cellId + "' data-row='" + rowId + "' ondblclick='this.methods.handleBlockOndblclick(event)'>" + val + "</td>"; 然后我们在 methods 对象里面添加一个 handleBlockOndblclick 的函数: handleBlockOndblclick(e) { if (!this.staticData.isOpenEdit) { //判断是否开启了edit this.staticData.isOpenEdit = true; //获取并设置目标格位置 this.data.edit = { row: parseInt(e.target.dataset.row), cell: parseInt(e.target.dataset.cell) } } } 因为在handleBlockOndblclick 函数里面,我们用到了静态数据的 isOpenEdit,所以我们需要定义一个: isOpenEdit: false ok,那么之后我们需要再改进一下输出 book 数据的那一行代码,把他改成这样: thisBook.forEach(function(val, i, arr) { cellId++; if (rowId === edit.row && cellId === edit.cell) { returnVal += "<td><form data-cell='" + cellId + "' data-row='" + rowId + "' onsubmit='this.methods.save(event)'><input type='text' value='" + val + "'></form></td>"; } else { returnVal += "<td data-cell='" + cellId + "' data-row='" + rowId + "' ondblclick='this.methods.handleBlockOndblclick(event)'>" + val + "</td>"; } }) 接下来让我们在上方定义一个名叫 edit 的变量吧: //把 var returnVal = "<table><thead><tr>", getSortSign = this.methods.getSortSign, sortBy = this.staticData.sortBy, rowId = -1; //改为 var returnVal = "<table><thead><tr>", getSortSign = this.methods.getSortSign, sortBy = this.staticData.sortBy, rowId = -1, edit = this.data.edit; 之后我们还需要在 methods 里添加一个 save 函数,用来保存修改后的结果: save(e) { e.preventDefault(); var input = e.target.firstChild; this.staticData.isOpenEdit = false; this.data.edit = { row: -1, cell: -1 } this.data.bookData[e.target.dataset.row][e.target.dataset.cell] = input.value; this.data.bookData = this.data.bookData; } 好了,那么现在我们的编辑器就可以正式运作了,我们已经实现了本篇文章最开始时所做的功能!(按回车可以保存修改结果) 这是我们目前全部的 js 代码: Ale("excel", { template() { return this.methods.handleTemplateRender(); }, methods: { handleTemplateRender() { //定义DOM基本结构 var returnVal = "<table><thead><tr>", getSortSign = this.methods.getSortSign, sortBy = this.staticData.sortBy, rowId = -1, edit = this.data.edit; //循环遍历bookHeader数据并输出 this.data.bookHeader.forEach(function(val, i, arr) { returnVal += "<th onclick='this.methods.handleTheadOnclick(event)'>" + val + (sortBy === i ? getSortSign() : '') + "</th>"; }) returnVal += "</thead></tr><tbody>"; //循环遍历bookData数据并输出 this.data.bookData.forEach(function(thisBook, i, arr) { var cellId = -1; rowId++; //输出一行 returnVal += "<tr>"; thisBook.forEach(function(val, i, arr) { cellId++; if (rowId === edit.row && cellId === edit.cell) { returnVal += "<td><form data-cell='" + cellId + "' data-row='" + rowId + "' onsubmit='this.methods.save(event)'><input type='text' value='" + val + "'></form></td>"; } else { returnVal += "<td data-cell='" + cellId + "' data-row='" + rowId + "' ondblclick='this.methods.handleBlockOndblclick(event)'>" + val + "</td>"; } }) returnVal += "</tr>"; }) returnVal += "</tbody></table>"; //返回DOM结构 return returnVal; }, handleTheadOnclick(e) { this.methods.changeSortType(e); this.methods.sortList(e); }, changeSortType(e) { this.staticData.sortBy = e.target.cellIndex; if (this.staticData.sortType === "up") { this.staticData.sortType = "down"; } else { this.staticData.sortType = "up"; } }, sortList(e) { var index = e.target.cellIndex; if (this.staticData.sortType === "up") { this.data.bookData.sort(function(a, b) { return a[index].charCodeAt(0) > b[index].charCodeAt(0) ? 1 : -1; }) } else { this.data.bookData.sort(function(a, b) { return a[index].charCodeAt(0) < b[index].charCodeAt(0) ? 1 : -1; }) } this.data.bookData = this.data.bookData; }, getSortSign() { if (this.staticData.sortType === "up") { return '\u2191'; } else { return '\u2193'; } }, handleBlockOndblclick(e) { if (!this.staticData.isOpenEdit) { this.staticData.isOpenEdit = true; this.data.edit = { row: parseInt(e.target.dataset.row), cell: parseInt(e.target.dataset.cell) } } }, save(e) { e.preventDefault(); var input = e.target.firstChild; this.staticData.isOpenEdit = false; this.data.edit = { row: -1, cell: -1 } this.data.bookData[e.target.dataset.row][e.target.dataset.cell] = input.value; this.data.bookData = this.data.bookData; } }, data: { bookHeader: [ "Book", "Author", "Language", "Published", "Sales" ], bookData: [ ["The Lord of the Rings", " J. R. R. Tolkien", "English", "1954-1955", "150 million"], ["The Little Prince", "Antoine de Saint-Exupéry", "French", "1943", "140 million"], ["Dream of the Red Chamber", "Cao Xueqin", "Chinese", "1791", "100 million"] ], edit: { row: -1, cell: -1 } }, staticData: { sortBy: -1, sortType: 'down', isOpenEdit: false } }) Ale.render("excel", { el: "#app" }) 如果想了解更多,欢迎关注我在明天推出的第四篇教程,同时也关注一下alejs哦,感谢各位! (非常重要:如果有能力的话不妨去Github或码云上 star 一下我们吧!不过如果您特别喜欢 alejs 的话也可以 watch 或 fork 一下哦!十分感谢!)

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

12月3日云栖精选夜读 | Python程序员的30个常见错误

在这篇文章中,我将总结新老Python程序员常犯的一些错误,以帮助你们在自己的工作避免犯同样或类似错误。 热点热议 Python程序员的30个常见错误 作者:技术小能手发表在:大数据地盘 在阿里,不是每一个项目都有KPI 作者:技术小能手 12月1日:阿里巴巴对“父老乡亲”有话说 作者:技术小能手发表在:阿里巴巴公益 知识整理 《快学 Go 语言》第 11 课 —— 千军万马跑协程 作者:技术小能手发表在:码洞 Redlock:Redis分布式锁最牛逼的实现 作者:技术小能手发表在:Java技术驿站 Redisson实现Redis分布式锁的N种姿势 作者:技术小能手发表在:Java技术驿站 使用nonce巩固接口签名安全 作者:技术小能手发表在:猿天地 手把手教你如何用Python从PDF文件中导出数据 作者:技术小能手发表在:数据分析 美文回顾 安筱鹏:拥抱“数据+算法”定义的新世界 作者:技术小能手发表在:阿里研究院 “反向代理层”绝不能替代“DNS轮询”! 作者:技术小能手发表在:架构师之路 后端缓存的23个关键关注点 作者:技术小能手发表在:技术琐话 中国手机吃掉六成印度市场:小米领跑,这些“副牌”也是赢家 作者:技术小能手发表在:天下网商 阿里有群姑娘,是马老师的师兄,还是逍遥子的学长…… 作者:技术小能手发表在:阿里味儿 跨境物流链路怎么做?菜鸟工程师打造了全球通关“神器” 作者:技术小能手发表在:阿里技术 如何打造应对超大流量的高性能负载均衡? 作者:技术小能手发表在:互联网架构师 有奖话题讨论 程序员的水平越来越差了? 企业上云权限怎么管,别等出了问题追悔莫及! 往期精彩回顾 11月30日云栖精选夜读 | 用Python告诉你,现在的房租有多高? 11月29日云栖精选夜读 | Linux里10个最危险的命令 11月28日云栖精选夜读 | Spring Cloud Alibaba,中国Javaer的福音,为微服务续上18年 11月27日云栖精选夜读 | Java性能优化的50个细节 11月26日云栖精选夜读 | 机器学习高质量数据集大合辑(附链接)

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

(十二) 整合spring cloud云架构 - SSO单点登录之OAuth2.0 登出流程(3)

上一篇我根据框架中OAuth2.0的使用总结,画了一个根据用户名+密码实现OAuth2.0的登录认证的流程图,今天我们看一下logout的流程: /** * 用户注销 * @param accessToken * @return */ @RequestMapping(value = "/user/logout", method = RequestMethod.POST) public ResponseVO userLogout(@RequestHeader(value = "accessToken", required = true) String accessToken, @RequestHeader(value = "userId", required = true) Long userId) throws Exception{ OauthAccessToken oauthAccessToken = userMgrService.getOauthAccessToken(accessToken); if(null == oauthAccessToken){ return UserResponseCode.buildEnumResponseVO(UserResponseCode.RESPONSE_CODE_OAUTH_ACCESSTOKEN_EMPTY, null); } //刪除OauthToken记录 boolean result = userMgrService.revokeOauthToken(oauthAccessToken); if(result){ return UserResponseCode.buildEnumResponseVO(UserResponseCode.RESPONSE_RETURN_CODE_SUCCESS, null); } return UserResponseCode.buildEnumResponseVO(UserResponseCode.RESPONSE_CODE_SYSTEM_ERROR, null); } 我这里只是简单写了一些登出的代码,我们会在后面的文章中详细贴出所有代码供大家参考,而且会从创建数据库,到执行操作的每一个流程记录下来。 从现在开始,我这边会将近期研发的spring cloud微服务云架构的搭建过程和精髓记录下来,帮助更多有兴趣研发spring cloud框架的朋友,大家来一起探讨spring cloud架构的搭建过程及如何运用于企业项目。

资源下载

更多资源
Nacos

Nacos

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册