首页 文章 精选 留言 我的

精选列表

搜索[开源周],共10011篇文章
优秀的个人博客,低调大师

最近一周的学习计划

最近实在太累了,直到周末搭建好最后一套灾备环境,我悬着的心才终于放下来,总算是给这段时间的忙碌画上了一个句号,随后的几天里就是些修修补补的事情了。 所以周末忙完这波,我好好睡了一觉,一下子闲下来,一下子轻松下来,有一种考完试后的迷茫感。这一段时间精神和体力都经受了多重考验,我称了下,差不多20多天的时间里,掉了3斤,而原本不喜欢饮料的我,最后转而爱上了喝凉茶,也开始喝起了碳酸饮料。然后很多手头的事情都放下来了,很多消息可能回复都是第二天或者几天之后突然想起来,很多朋友都给了我最大的宽容和理解。 而我骨子里是个不安分的人,我希望让自己做更多的事情,有些手头的东西我还是希望能够回馈出来,有些事情之前没有花时间去做,我还是希望再试一试。所以我准备制定一个短时间的学习计划。计划内容不能多,就几件核心的事情要做好。 1.我维护Oracle有一套脚本,主要适用于单实例环境,如果是RAC环境,还是略微需要修改一下,几年下来,也有几百个脚本了。这些脚本伴随了我很多关键的数据库维护工作,我还是希望能够把它完善起来,这里需要的就是广大网友的力量了,所以我首先要考虑的事情就是在github把它先开放出来,如果需要,拿走便是,别忘了给个星星。哦,对了,项目名字会是dbm_lite 2.InnoDB cluster,之前简单学了下MySQL Group Replication,现在的Innodb cluster还在使用阶段,但是我很看好它。因为它离企业级的完整方案又更近一步,而且通过InnoDB Cluster,我也看到了Oracle的野心和格局。所以这几天的事情就是要把把风风火火弄起来。 3.MySQL的索引,一直对于MySQL索引的部分很好奇,虽然有些东西已经属于内核,开发范畴了,但是索引搞不好,很多优化还是和摸黑。这里的索引会和Oracle有一些优化上的相通之处,但是我更侧重去看一些差异的地方。 4.MySQL相关的中间件方案。MySQL技术走向成熟,要把它做大做强,架构上就得做很多工作,我和很多业内朋友也聊天,有个想法很相似,那就是很多方案单纯是从数据库层面找解法其实会很难,而如果再从上层,比如中间件层面来入手,很多事情就是手到擒来。这方面很多大厂都已经有很成熟的东西了,可以参考学习一下。 5.学习python, 这次是下定决定让python的学习进度往前再走一步了。之前说忙没时间,现在没有这个借口了。我就得让自己上点心。 6.机器学习的简单了解,很多人认为机器学习和数据库没啥关系,我对之前老杨翻译的一篇文章很感兴趣,看看卡内基梅隆的这些专家是怎么完成数据库的自动优化工作的。文章可以参考DBAplus之前写的一篇。内容上估计还得再斟酌斟酌,看到一些更具体的资料再说。 这么几件事情,绝对够我忙活一个星期了,至于达到什么样的程度不好说,但是我坚持去做了,我想还是有不小的收获的。

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

Cilium 庆祝十周年

Cilium 项目庆祝成立 10 周年,社区团队在庆祝的同事也围绕未来十年的工作负载需求对路线图进行了对齐。近期项目的一些进展包括:发布 Cilium 1.19、推出项目完整指南《Cilium Up and Running》、发布一本新的儿童读物,以及来自 OVHcloud 和 Zynga 的最新生产案例研究。 “十年过去,Cilium 不仅在跟上云原生基础设施不断变化的需求——它也在帮助定义下一步的发展方向。从超大规模 AI 训练集群,到纯 IPv6 数据中心;从不断增长的生产案例库,到一本新的 O’Reilly 图书和一本儿童读物,这个项目依然保持着极高的活跃度,并始终由社区驱动向前发展。” Cilium 1.19 2 月发布的 Cilium 1.19 延续了项目的发展势头,在网络、策略和可观测性方面都带来了改进。 面向 mTLS 的 ztunnel 集成: 可以将命名空间纳入 ztunnel,实现透明的四层双向 TLS(mTLS)Pod 间流量保护,而无需对应用进行修改。关于这一新特性的意义以及其背后的工作,可进一步阅读相关内容。 增强的 IPv6 支持: IPv6 支持现已扩展到 Cilium 的二层服务通告和隧道网络,消除了运行 IPv6 优先或双栈环境团队所面临的限制。 Multi-Pool IPAM 达到稳定版: Multi-Pool IPAM 已从 Beta 晋升为 Stable,并获得了实质性增强。团队现在可以基于工作负载身份分配 Pod IP,强制执行严格的地址池匹配,并为路由流量保留真实源 IP,在不做权衡取舍的前提下,同时获得灵活性与安全性。 更智能的 DNS 网络策略: 新增的通配前缀机制,使编写基于 DNS 的出口策略变得更加容易,可通过单条规则覆盖完整的子域层级,从而降低复杂性,并减少授予过宽访问权限的风险。 Hubble 流日志聚合: Hubble 现在可以在导出前先对流日志进行聚合,按命名空间、服务或判定结果,在设定时间间隔内对流量进行分组。对于高负载集群,这可以显著减少日志量,同时保留监控和分析所需的上下文信息。 Cilium Up and Running O’Reilly “Up and Running” 系列的最新作品《Cilium: Up and Running》现已发布。 这本书是一部关于 Cilium 的完整指南,覆盖了各个方面:使用场景、配置方式、常见陷阱,以及实用教程和配套实验环境。无论你是刚开始接触 Kubernetes 网络,还是希望在生产工作负载中引入更多能力,这本书都适合阅读。 Nico Vibert、Filip Nicolic 和 James Laverack 花了一年多时间撰写、测试,并基于亲身实践经验以及真实世界中 Cilium 用户的反馈不断打磨内容。 Cilium 儿童读物 继《Buzzing Across Space: The Illustrated Children’s Guide to eBPF》发布之后,第二部作品也已经到来:《Buzzing Beyond Clouds: The Illustrated Children’s Guide to Cilium》。这本书讲述了 Obee 和 L4LB 的故事,它们踏上了一段连接并守护云原生银河系的旅程。 Cilium 在生产环境中的新案例:Zynga 与 OVHcloud Cilium 目前已拥有近 100 篇案例研究和生产用户故事,以及超过 170 家公开采用者,其使用场景也在不断变得更加复杂和成熟。Cilium 发布了与OVHcloud和Zynga相关的案例研究。 OVHcloud 将 Cilium 作为其托管 Kubernetes 服务中的默认 CNI,这一决策源于客户需求,以及对面向未来网络层的需要。Cilium 基于 eBPF 的架构降低了服务于数千租户的管理集群负载,而高级网络策略则可在大规模环境中强制执行严格的租户隔离。OVHcloud 容器与编排云架构师 Joël Le Corre 表示:“很多用户都希望在创建集群时可以选择自己的 CNI,而 Cilium 显然是这一领域的领导者。” 在 Zynga,团队迁移到 Cilium,是为了解决可扩展性挑战并整合其网络栈,用统一平台替代 AWS VPC CNI、kube-proxy 和 Istio。通过以基于 eBPF 的负载均衡替换 kube-proxy,连接跟踪(conntrack)条目从每个节点约 300,000 条——即 Linux 默认上限的 5 倍——降到了几乎为零。“一旦我们切换到 Cilium,连接上限就不再是问题了。这个问题已经被彻底消除。” 这两家组织都已经将新的 Cilium 特性列入其路线图。OVHcloud 正在探索使用 Cluster Mesh 实现多区域连接,而 Zynga 正在推进 Gateway API,并评估 L7 网络策略,以实现对应用层流量更细粒度的控制。

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

微软成立五十周年

4 月 4 日,微软迎来成立 50 周年纪念日,并在其雷德蒙德总部举行了庆祝活动。现任 CEO Satya Nadella、创始人 Bill Gates、前 CEO Steve Ballmer 首次同台。 活动期间,三名 CEO 共同回顾了该公司历史,Nadella 演示了如何在数分钟内用 GitHub Copilot 功能编写出适用于古旧 IBM Altair 8800 电脑的代码,而这些代码在 50 年前花费了 Bill Gates 数月时间完成。(Gates 在个人网站上以 150 页扫描 PDF 的形式发布了这些代码。)Ballmer 则再次表演了自己大喊「开发者!开发者!开发者!」的 1999 年名场面。 在活动期间,至少有两名员工先后打断了演讲环节。其中一名员工直接向 AI 负责人喊话,指责其为「战争奸商」,并称「微软手上沾满了鲜血」,要求停止将 AI 用于「种族灭绝」。第二次打断发生在三名 CEO 同台环节。部分员工还在场外举行了集会。 此前有报道指出,微软和 OpenAI 的 AI 模型被用于以色列军方在近期加沙和黎巴嫩冲突中选择轰炸目标的项目。据报道,两名公开抗议的员工事后已无法登录其工作账户,可能表明着她们已被解雇。 微软由 Bill Gates 和 Paul Allen 于 1975 年 4 月 4 日创立,最初专注于为早期个人电脑开发软件,凭借 MS-DOS、Windows 和 Office 等里程碑式产品的巨大成功成为科技巨头。行业走入移动时代后,微软的移动软硬件均未获成功,与苹果、谷歌等竞争对手拉开差距。但近年来,微软以云服务和软件为核心、押注 AI 领域的转向努力取得了初步成效。 为庆祝 50 周年,微软上线了一个专题网站,并准备了多项新功能和纪念品发布。AI 助理服务 Copilot增加了一系列对标竞品的新功能,包括个性化记忆、使用浏览器自动执行任务、深度研究,以及整合了 AI 的 Copilot 搜索等等。Xbox发布了 50 周年动态主题和壁纸。官方商店则上架了印有像素风 Windows 鼠标指针的主题纪念品。

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

GoLand 迎来五周年,2022.3 发布

GoLand 2022.3 提供了性能增强以及针对泛型和 Go 工作区的新功能。新版本集成了 Go Playground,添加了改进 Go 文档注释的支持,为 HTTP 客户端和 Docker 引入了新功能,并提供了新 UI。 此外,GoLand 也迎来了 5 岁生日,官方邀请各位开发者们一起庆祝。现在在 GoLand 2022.3 或 GoLand 2022.2.5 中输入 “Happy B-day, GoLand!”,看看会有什么彩蛋。 性能改进 有助于改进索引编制的 go list 更改 打开项目时,GoLand 会为文件编制索引并运行 [go list](<https://go.dev/ref/mod#go-list-m>) 命令,该命令会报告有关项目结构的信息。 索引编制会在 go list 运行时暂停,在索引编制完成之前您无法访问代码洞察功能。 此前,GoLand 在某些情况下会运行两次 go list。 我们更改了 API,减少了 go list 启动的数量。 我们希望这一改变能够显著提高具有许多模块的大型项目的性能。 打开时从缓存还原项目结构 现在,打开项目时,go list 报告的信息将被保存到磁盘缓存。 再次打开该项目时,项目结构相关数据将从内存加载并在索引编制开始时被纳入考量。 由此,索引编制可以不间断地继续,更快完成,并且代码洞察功能在打开项目后可以更快可用。 更快的 IDE 启动和项目打开 GoLand 还获得了许多其他性能改进,旨在减少启动应用程序以及在 JetBrains IDE 中打开项目所需的时间。 整体启动性能(包括编辑器还原)因此提高了约 30%。 泛型 泛型函数的测试生成 现在,您可以为具有泛型形参的函数生成测试。 大写类型形参的快速修复 现在有一项检测小写类型形参的检查,以及将其变成大写的快速修复。 Go 工作区 Go Workspace File(Go 工作区文件)操作 在 New(新建)上下文菜单中,您现在会找到 Go Workspace File(Go 工作区文件)操作。 选择时,根文件夹中将出现一个 go.work 文件。 现有 Go 模块将自动添加到 go.work 文件中。 使用 replace 指令生成 go.work 如果有 replace 指令,您现在可以从 go.mod 生成 go.work。 将文本光标置于 replace 指令上,按 ⌥⏎ 查看所有可用意图操作,然后选择 Add … module to workspace…(将 … 模块添加到工作区)快速修复。 Go 文档注释 Go 1.19 在文档注释中添加了对链接、列表和新标题的支持。 GoLand 2022.3 也支持这些新功能。 对链接的支持 我们在 GoLand 中添加了对文档链接的引用。 点击它们可以前往引用的元素,点击文本链接会前往文本链接定义。 文本和文档链接在 Quick Documentation(快速文档)弹出窗口和 Documentation(文档)工具窗口中都呈现为链接。 对新标题的支持 从 Go 1.19 开始,标题是以数字符号 (#) 开头后跟空格和标题文本的行。 新标题在 GoLand 的 Quick Documentation(快速文档)弹出窗口和 Documentation(文档)工具窗口中呈现为 HTML 标题。 对列表的支持 列表在 GoLand 的 Quick Documentation(快速文档)弹出窗口和 Documentation(文档)工具窗口中呈现为 HTML 列表。 集成式 Go Playground 我们在 GoLand 中集成了 Go Playground 功能。 您可以选择一段代码,选择 Open In(打开方式)选项,然后点击 Playground。 这将打开带有工具栏的 scratch 文件,工具栏中的选项与 Go Playground 相同。 您可以格式化和共享您的代码、更改 Go 版本、使用 Go Playground 服务器运行代码,或在本地运行。 新的快速修复 无效递归类型的快速修复 如果类型包含自身,您将收到“Invalid recursive type”(无效递归类型)错误。 为避免这种情况,您应该包含一个指向类型的指针,而不是类型本身。 我们现在提供了快速修复。 编辑器 Code Vision 我们已经开始实现 Code Vision 功能。 目前,启用版本控制集成后会显示代码作者。 点击代码作者姓名将打开 Annotate with Git blame(使用 Git 追溯注解)边栏,显示是谁引入了更改。 我们还引入了在所有函数和类型附近显示的用法,显示函数或类型在当前项目中被引用的次数。 常量定义的内嵌提示 GoLand 现在会显示常量定义块的内嵌提示。 这在 iota 派生的常量块中特别实用,其中提示显示了与每个位置关联的 iota 值。 Fill all fields(填充所有字段)忽略自动生成的 protobuf 字段 调用 Fill all fields(填充所有字段)意图操作时,IDE 会忽略以 XXX_ 开头的自动生成的协议缓冲区字段。 这些字段仅在第二次调用补全后显示。 其他 Go 相关功能 Go 环境变量在设置中显示 GoLand 现在会自动获取 Go 模块相关系统变量,并将其显示在 Environment variables(环境变量)对话框窗口中。 要打开此窗口,请转至 Preferences | Go | Go Modules(设置 | Go | Go 模块),点击 Edit environment variables(编辑环境变量)图标。 软件包名称始终显示在 Quick documentation(快速文档)中 IDE 现在始终在顶层声明的 Quick documentation(快速文档)弹出窗口中显示软件包名称。 此前,只有在找到 doc.go 或 <pkg_name>.go 文件时才会显示软件包头。 提高文件大小上限 我们已将文件大小上限从 2.5 MB 提高到 10 MB。 代码洞察功能(如导航和高亮显示)不适用于超过大小上限的文件。 虽然 2.5 MB 的上限对于大多数文件来说已经足够,但有些项目的文件更大,例如 AWS SDK 或 GCP。 Receiver names are different(接收器名称不同)检查忽略生成的代码 由于 Receiver names are different(接收器名称不同)检查与生成的代码无关,我们已为包含与以下正则表达式匹配的注释的文件将其禁用:^// Code generated .* DO NOT EDIT\\.$ HTTP 客户端 为 JavaScript 处理程序预请求脚本和新 API HTTP 客户端现在支持在请求之前执行脚本块。 您可以在执行请求之前生成数据,并使用变量将其放入最终请求。 可以使用快速修复创建用于初始化变量的样板代码。 HTTP 客户端现已支持 Crypto API。 您可以计算 HTTP 请求的 md5 或 sha1 哈希值。 对于简单的情况,IDE 现在具有一组新的随机变量。 Docker 在不安装 Docker Desktop 的情况下从 WSL 使用 Docker 可执行文件 GoLand 现在支持连接到在适用于 Linux 的 Windows 子系统 (WSL) 中运行的 Docker。 您可以在 Preferences | Build, Execution, Deployment | Docker(设置 | 构建、执行、部署 | Docker)中设置连接。 新意图操作:Pull Docker image(拉取 Docker 镜像) 现在,有一种无需从 Dockerfile 或 docker-compose.yml 运行即可拉取镜像的简单方式。 为此,在高亮显示的镜像名称上调用上下文操作 (⌥⏎),然后选择 Pull Docker image(拉取 Docker 镜像)。 .dockerignore 文件类型支持 我们引入了对 .dockerignore 文件的全面支持,包括代码高亮显示和补全。 从 IDE 构建镜像时,这些文件会被纳入考量。 在 Dockerfile 文件中支持 heredoc 格式 Here 文档允许将后续 Dockerfile 行重定向到 RUN 或 COPY 命令的输入。 GoLand 现在支持此语法,您可以使用它在 Dockerfile 文件中生成配置文件或多行脚本。 来自 Docker 上下文的 Docker 连接 如果 Docker 配置中已有这些设置,您现在可以使用 Docker 上下文设置额外的 Docker 连接。 为此,您可以在 Services(服务)视图中调用 Add Service(添加服务)上下文菜单并选择 Docker Connections From Docker Contexts(来自 Docker 上下文的 Docker 连接)。 远程开发(测试版) IDE 后端现在可以直接在 WSL 2 中启动,并且您可以像在 GoLand 中使用远程开发时连接到远程机器一样连接到它。 用户界面 新 UI 如您所知,今年 5 月我们宣布了 JetBrains IDE 中新 UI 的封闭预览计划。 我们邀请您在 Preferences | Appearance & Behavior | New UI Preview(设置 | 外观与行为 | 新 UI 预览)中切换到新 UI。 意图操作预览默认启用 意图操作的预览功能现在默认开启,让您可以立即查看应用 IDE 建议后代码将如何变化。 在意图操作列表打开时,您可以按 F1 启用或禁用预览功能。 将工具窗口停靠到浮动编辑器选项卡 为了让您可以更轻松地安排工作空间并在多个显示器上与 GoLand 交互,我们实现了将工具窗口拖出主窗口并将其停靠到浮动编辑器选项卡的选项。 改进了 Tips of the Day(每日小技巧) 我们增强了 Tips of the Day(每日小技巧)功能,这是一种帮助您探索 GoLand 的学习工具。 每个提示现在都有一个标题。 我们还微调了确定显示哪些提示的算法,让您可以看到与 IDE 体验和正在处理的项目最相关的提示。 更新了 Bookmarks(书签) 现在,又可以从编辑器选项卡中为文件添加书签了。 只需右键点击选项卡调用上下文菜单并选择 Bookmarks(书签)。 您可以将当前打开的所有选项卡中的所有文件添加到 Bookmarks(书签)。 为此,可以调用相同上下文菜单并选择 Bookmark Open Tabs(为打开的选项卡添加书签),也可以使用编辑器选项卡窗格右侧的三点图标调用此操作。 新的 Settings Sync(设置同步)解决方案 我们为同步自定义用户设置引入了重做的解决方案。 长期以来,有两个并行存在且具有交叉功能的插件:IDE Settings Sync(IDE 设置同步)和 Settings Repository(设置仓库)。 为避免因拥有两个近似捆绑插件而造成困惑,我们将其功能集合并为一个解决方案,即新的 Settings Sync(设置同步)插件。 数据库 Redis 支持 期待已久的 Redis 支持的初步迭代现已实现。 快速筛选 现在,使用快速搜索时,您也可以筛选对象。 所有不匹配的对象都将被隐藏。 Web 开发 针对 JavaScript 和 TypeScript 的 Code Vision 此版本为 Web 开发引入了的新 Code Vision 功能。 它可以收集 JavaScript 和 TypeScript 代码中类型和类型成员的各种指标,并在声明附近显示此信息。 其他更新 在 YAML 中禁止检查的快速修复 在 YAML 文件(包括 Kubernetes 文件、OpenAPI 规范和 docker-compose.yml 文件)中,新增的快速修复可以通过注释禁止检查。 还引入了一个选项,用于折叠组成 3 行或更多行的块并以 # 开头的多行注释。 适用于 Windows ARM64 的安装程序 GoLand 已经开始分发适用于 Windows ARM64 的安装程序,开发者可以从官方网站或通过 Toolbox App 下载。 更多详情可查看:https://blog.jetbrains.com/go/2022/12/01/goland-turns-5/

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

周大侠啊 进击的 JavaScript(六) 之 this

记得刚开始,我理解 this 的时候 也是云里雾里的,哈哈,希望通过这篇文章,对你有帮助吧。 关于 this 最多的说法,就是:谁调用它,this就指向谁。这话呢,不能说它错了,只能说它讲的不严谨,为什么呢?我们先来了解下 this 的几种绑定规则。 一、默认绑定 默认绑定 发生在全局环境 。 全局环境中,this 默认绑定到 window。(严格模式下一样) console.log(this === window); //true "use strict"; //使用严格模式执行代码 var a = 666; console.log(this.a) //666 二、隐式绑定 隐式绑定 发生在 方法调用(执行)。 什么是方法呢?通常把 对象的属性值 是函数的,称为方法。 var obj = { fun: function(){} } //这里obj 对象里 的fun 属性值是个函数, 就把 这个fun 属性称为方法了。 通常,方法调用时,this 隐式绑定到其 所属的对象 上。 var a = "window"; var obj = { a: "obj", fun: function(){ console.log(this.a); } } obj.fun(); //"obj" 来个难一点的: var obj1 = { a: "obj1", obj2: { a: "obj2", fun: function(){ console.log(this.a); } } } obj1.obj2.fun(); //"obj2" 这里的答案 跟你想的一样吗? 出现这个答案的关键 就是于,fun 函数 在作为对象方法执行时, this 绑定的是它的 所属对象,也就是 obj2 。 而非外层 的 obj1。 三、隐式绑定丢失 在判断是否是隐式绑定的时候,最容易出问题的地方就是发生在 隐式绑定丢失。 隐式丢失是指被隐式绑定的函数丢失绑定对象,从而绑定到window。这种情况容易出错却又常见。(严格模式下,绑定到undefined) 隐式绑定丢失 一般 发生在 函数独立调用时。 啥是独立调用呢?就是一个简单的函数执行. 函数名的前面没有任何引导内容。 function ff(){}; ff(); //独立调用 当函数独立调用(执行)时,this 就会隐式绑定丢失,而绑定到 window 对象上。(非严格模式下) function fun(){ console.log(this === window); } fun(); //true 那么严格模式下呢?是指向 undefined 的。 function fun(){ "use strict"; //使用严格模式执行代码 console.log(this); } fun(); //undefined 考考你: var a = "window"; var obj = { a: "obj", fun1: function(){ console.log(this.a); } } var fun2 = obj.fun; fun2(); //"window" 判断是否隐式绑定丢失的关键就在于, 判断函数 是否是哪种调用。 上面的例子,关键点就在 最后两行代码。 先看其中的第一行: var fun2 = obj.fun; 这里把 obj 的fun 方法 赋值给了 一个变量 fun2,这里的 fun 并没有作为对象的方法来执行,因为,fun 方法这里没有执行。 其后: fun2(); 再执行 fun2,它保存着 fun1 方法,这时候执行 fun2(等于fun1) ,但是,它是独立调用。因为,没有作为对象的方法来调用。所以 this 就被指向 window了。 那么怎么解决隐式丢失问题呢? var a = "window"; var obj = { a: "obj", fun: function(){ return function(){ console.log(this.a); } } } obj.fun()(); //"window" //这里我们想要的是 obj里 a 的值,可是,隐式绑定丢失导致获取到了 window 里 a 的值。 可以基础好的已经知道答案了: var a = "window"; var obj = { a: "obj", fun: function(){ var that = this; return function(){ console.log(that.a); } } } obj.fun()(); //"obj" 因为 fun 是作为方法调用的,所以 this 绑定到 obj 对象上,因此,我们就可以先用一个变量 that 来保存 this,然后 在内部的 匿名函数中 使用 that 就可以了。它保存着 上面 this 的绑定对象。 忽然灵机一动,想出个题目,看人家都玩出题,我也试试,哈哈: var a = "window"; function fun(){ var a = "fun"; return (function(){ return this.a; })() } fun() //“你猜” 这道题中 有立即执行函数、this问题,哈哈,乍一看挺恶心,其实看完上面的,应该可以看出来的。 四、显示绑定 通过call()、apply()、bind()方法把 this 绑定到对象上,叫做显式绑定。对于被调用的函数来说,叫做间接调用。 var a = "window" var obj = { a:"obj", } function fun(){ console.log(this.a); } fun.call(obj); //"obj"; 这里使用了 call 方法,把fun 中的 this 绑定到 obj 对象上。 javascript内置的一些函数,具有显式绑定的功能,如数组的5个迭代方法:map()、forEach()、filter()、some()、every(),以及创建对象的 Object.create() 函数(后面原型链中会细说),都可以手动绑定this。 大家可以去看下API文档,数组的这几个函数的最后一个参数,就是指定函数内 this 的绑定,如果不指定,则是window,严格模式下是undefined。 var a = [1,2,3]; a.forEach(function(){ console.log(this) },a); //绑定 this 为 a 这个数组 //(3) [1, 2, 3] //(3) [1, 2, 3] //(3) [1, 2, 3] 五、new 绑定 如果 使用 new 来创建对象,因为 后面跟着的是构造函数,所以称它为构造器调用。对于this绑定来说,称为new绑定。 想知道 构造器调用 中 this 的绑定,就要知道 new 到底做了啥了。 先来个 new 的实现。看不懂不要紧,在后面原型链那篇,还会说的。 function New(proto){ //proto 为传进来的构造函数 var obj = {}; obj.__proto__ = proto.prototype; proto.apply(obj, Array.prototype.slice.call(argument,1)); //你这要看懂这步就行。这里把构造函数里的 this 绑定到了 新的obj 对象上,最后 返回了该新对象,作为实例对象。 return obj; } 所以在使用 new 来创建实例对象时,new 内部把 构造函数的 this 绑定到 返回的新对象 上了。 function Person(name){ this.name = name; } var c = new Person("zdx"); c.name; 总结: this的四种绑定规则:隐式绑定、隐式绑定丢失、显式绑定和new绑定,分别对应函数的四种调用方式:方法调用、独立调用、间接调用和构造器调用。 附录: 1、关于this绑定 的优先级问题。 简单提一下吧: new 绑定 > 显示绑定 > 隐式绑定 > 默认绑定 。 2、ES6 中,箭头函数的 this 绑定。 箭头函数内的 this 绑定的 是所属的环境(函数或者对象), 它是固定不变的。 先看下上面的这个例子 var a = "window"; var obj = { a: "obj", fun: function(){ return function(){ console.log(this.a); } } } obj.fun()(); //"window" 上面我们使用 一个变量来保存 this 的绑定,下面我们来用 箭头函数解决问题 var a = "window"; var obj = { a: "obj", fun: function(){ return () => { console.log(this.a); } } } obj.fun()(); //"obj" 实际上,箭头函数内部是没有this 的,所以,它不能使用 new 构造器调用,call 等显示绑定。所以它内部就是使用了一个变量来保存 箭头函数 所属环境的(函数或者对象) this。 就相当于: var a = "window"; var obj = { a: "obj", fun: function(){ that = this; return function(){ console.log(that.a); } } } obj.fun()(); //"obj" 考考你: var a = "window"; var obj = { a: "obj", fun1: function(){ return () => { console.log(this.a); } } } var fun2 = obj.fun1; fun2()();

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

第二十七周微职位

一、概述docker容器虚拟化技术,并完成以下练习: (1)构建一个基于centos的httpd镜像,要求,其主目录路径为/web/htdocs,且主页存在,并以apache用户的身份运行,暴露80端口; (2)进一步地,其页面文件为主机上的卷; (3)进一步地,httpd支持解析php页面; (4)构建一个基于centos的maridb镜像,让容器间可互相通信; (5)在httpd上部署wordpress; 1)创建带Apache服务的Centos Docker镜像. 基础镜像: [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE sshd-centos latest 64136bdc0cc8 22 hours ago 261.8 MB centos latest 0f73ae75014f 5 weeks ago 172.3 MB 2)以镜像sshd-centos为基础新建容器,并指定容器的ssh端口22映射到宿主机的10022端口上 docker run -p 10022:22 -d sshd-centos /usr/sbin/sshd -D 3)查看容器运行情况: [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 66b4ab8dbdeb sshd-centos "/usr/sbin/sshd -D" 22 hours ago Up 12 seconds 0.0.0.0:10022->22/tcp trusting_morse 4)在宿主机上通过ssh登录容器 ssh localhost -p 10022 5)如果提示没有ssh命令请安装openssh-clients yum install -y openssh-clients 6)下载apache源码包,编译安装 1.安装wget:yum install -y wget 2.下载源码包:cd /usr/local/src wgethttp://apache.fayea.com/httpd/httpd-2.4.17.tar.gz 3.解压源码包:tar -zxvf httpd-2.4.17.tar.gz cd httpd-2.4.17 4.安装gcc 、make编译器和apache依赖包 由于下载的docker镜像是简化版,所以连最基本的gcc和make都没有带,只好自已安装; 同时需 要安装apache依赖包apr 和 pcre yum install -y gcc make apr-devel apr apr-util apr-util-devel pcre-devel 5.编译:./configure --prefix=/usr/local/apache2 --enable-mods-shared=most --enable-so make make install 6.修改apache配置文件 sed -i 's/#ServerName www.example.com:80/ServerName localhost:80/g' /usr/local/apache2/conf/httpd.conf 7.启动apache服务:/usr/local/apache2/bin/httpd 8.查看是否启动:ps aux 9.编写启动ssh和apache服务的脚本 cd /usr/local/sbin vi run.sh ------------------------------------------------------ #!/bin/bash /usr/sbin/sshd & /usr/local/apache2/bin/httpd -D FOREGROUND 改变脚本权限,使其可以运行:chmod 755 run.sh 10.创建带有apache和ssh服务的镜像 1)查看当前容器的 Container ID: [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 66b4ab8dbdeb sshd-centos "/usr/sbin/sshd -D" 23 hours ago Up 45 minutes 0.0.0.0:10022->22/tcp trusting_morse 2)根据容器CONTAINER ID生成新的镜像:docker commit 66b4ab8dbdeb apache:centos 3)查看新生成的镜像: [root@localhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE apache centos 31668185b8f1 About a minute ago 433.4 MB sshd-centos latest 64136bdc0cc8 23 hours ago 261.8 MB centos latest 0f73ae75014f 5 weeks ago 172.3 MB 11.根据新生成的镜像生成容器 分别映射容器的22端口和80端口到宿主机的2222端口和8000端口 docker run -d -p 2222:22 -p 8000:80 apache:centos /usr/local/sbin/run.sh 查看生成的容器: [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7a9021c9b510 apache:centos "/usr/local/sbin/run 4 minutes ago Up 4 minutes 0.0.0.0:2222->22/tcp, 0.0.0.0:8000->80/tcp tender_payne 66b4ab8dbdeb sshd-centos "/usr/sbin/sshd -D" 23 hours ago Up 57 minutes 0.0.0.0:10022->22/tcp trusting_morse 6c40d0d2d8be centos "/bin/bash" 23 hours ago Exited (137) 23 hours ago centos-ssh 12.测试apache服务:[root@localhost ~]# curl localhost:8000&lt;html&gt;&lt;body&gt;&lt;h1&gt;It works!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt; 13.测试ssh服务 [root@localhost ~]#ssh localhost -p 2222 root@localhost's password: Last login: Sat Nov 13 14:20:41 2017 from 172.17.42.1 [root@7a9021c9b510 ~]# 测试通过! 14.映射宿主机目录 将宿主机的/www目录映射到容器的/usr/local/apache2/htdocs目录 1)在宿主机上新建目录并建立主页文件 mkdir /www cd /www vi index.html 代码如下:&lt;html&gt;&lt;body&gt;&lt;h1&gt;It's test!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt; 为了区别于之前生成的8000端口的容器的默认主页内容,我将“It works” 改为 “It’s test”. 2)生成新的窗口 docker run -d -p 2223:22 -p 8001:80 -v /www:/usr/local/apache2/htdocs:ro apache:centos /usr/local/sbin/run.sh 分别映射容器的22端口和80端口到宿主机的2223端口和8001端口; 通过-v 参数将/www映射到/usr/local/apache2/htdocs,同时出于安全性和隔离性的考虑加上ro只读参数 3)查看生成的容器: [root@localhost www]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bd8335195b44 apache:centos "/usr/local/sbin/run 9 minutes ago Up 9 minutes 0.0.0.0:2223->22/tcp, 0.0.0.0:8001->80/tcp cranky_nobel 7a9021c9b510 apache:centos "/usr/local/sbin/run 21 minutes ago Up 21 minutes 0.0.0.0:2222->22/tcp, 0.0.0.0:8000->80/tcp tender_payne 66b4ab8dbdeb sshd-centos "/usr/sbin/sshd -D" 23 hours ago Up About an hour 0.0.0.0:10022->22/tcp trusting_morse 6c40d0d2d8be centos "/bin/bash" 24 hours ago Exited (137) 23 hours ago centos-ssh 4)测试: [root@localhost www]# curl localhost:8001&lt;html&gt;&lt;body&gt;&lt;h1&gt;It's test!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt; [root@localhost www]# curl localhost:8000&lt;html&gt;&lt;body&gt;&lt;h1&gt;It works!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt; 事例2: 容器导入和导出: docker export docker import 镜像的保存及装载: docker save -o /PATH/TO/SOMEFILE.TAR NAME[:TAG] docker load -i /PATH/FROM/SOMEFILE.TAR 回顾: Dockerfile指令: FROM,MAINTAINER COPY,ADD WORKDIR, ENV USER VOLUME EXPOSE RUN CMD,ENTRYPOINT ONBUILD Dockerfile(2) 示例2:httpd FROM centos:latest MAINTAINER MageEdu "<mage@magedu.com>" RUN sed -i -e 's@^mirrorlist.repo=os.$@baseurl=http://mirrors.163.com/centos/$releasever/@g' -e '/^mirrorlist.repo=updates/a enabled=0' -e '/^mirrorlist.repo=extras/a enabled=0' /etc/yum.repos.d/CentOS-Base.repo && \ yum -y install httpd php php-mysql php-mbstring && \ yum clean all && \ echo -e '<?php\n\tphpinfo();\n?>' > /var/www/html/info.php EXPOSE 80/tcp CMD ["/usr/sbin/httpd","-f","/etc/httpd/conf/httpd.conf","-DFOREGROUND"] 二、搭建一套hadoop集群系统。 1、首先到官网上下载一个Hadoop的压缩安装包,我安装用的版本是hadoop-2.7.1.tar.gz,由于我安装的是最新的版本,和Hadoop之前的版本有很大的差异,所以网上很多的教程都不适用,这也是导致在安装过程中遇到问题所在,下载地址:http://www.apache.org/dyn/closer.cgi/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz 2、下载完成后(这个压缩包比较大,有201M,下载比较慢,耐心等待吧),放到Linux某个目录下,这里我用的系统是:CentOS release 6.5 (Final),我放的目录是:/usr/local/jiang/hadoop-2.7.1.tar.gz,然后执行:tar zxvf hadoop-2.7.1.tar.gz解压(这些操作都是要在集群中的主机上进行,也就是hadoop的master上面) 3、配置host文件 进入/etc/hosts,配置主机名和ip的映射, 这里是集群的每个机子都需要配置,这里我的logsrv02是主机(master),其余两台是从机(slave) [root@logsrv03 /]# vi /etc/hosts 172.17.6.142 logsrv02 172.17.6.149 logsrv04 172.17.6.148 logsrv03 4、jdk的安装(这里我的机子上面已经有了,所以就不需要再安装了) 我使用的jdk是jdk1.7.0_71,没有的需要安装,将jdk下载下来,解压到某个目录下,然后到/etc/profile中配置环境变量,在执行Java -version验证是否安装成功。 5、配置SSH免密码登陆 这里所说的免密码登录是相对于主机master来说的,master和slave之间需要通信,配置好后,master和slave进行ssh登陆的时候不需要输入密码。 如果系统中没有ssh的需要安装,然后执行: [root@logsrv03 ~]# ssh-keygen -t rsa 会在根目录下生成私钥id_rsa和公钥id_rsa.pub [root@logsrv03 /]# cd ~ [root@logsrv03 ~]# cd .ssh [root@logsrv03 .ssh]# ll 总用量 20 -rw------- 1 root root 1185 11月 10 14:41 authorized_keys -rw------- 1 root root 1675 11月 2 15:57 id_rsa -rw-r--r-- 1 root root 395 11月 2 15:57 id_rsa.pub 然后将这里的公钥分别拷贝到其余slave中的.ssh文件中,然后要把公钥(id_dsa.pub)追加到授权的key中去: cat id_rsa.pub >> authorized_keys 然后修改权限 [root@logsrv04 .ssh]# chmod 600 authorized_keys [root@logsrv04 .ssh]# chmod 700 -R .ssh 将生成的公钥复制到从机上的.ssh目录下: [root@logsrv03 .ssh]# scp -r id_rsa.pub root@logsrv02:~/.ssh/ [root@logsrv03 .ssh]# scp -r id_rsa.pub root@logsrv04:~/.ssh/ 然后所有机子都需要重启ssh服务 [root@logsrv03 .ssh]# service sshd restart [root@logsrv02 .ssh]# service sshd restart [root@logsrv04 .ssh]# service sshd restart 然后验证免密码登陆是否成功,这里在主机master这里验证: [root@logsrv03 .ssh]# ssh logsrv02 [root@logsrv03 .ssh]# ssh logsrv04 如果在登陆slave不需要输入密码,则免密码登陆设置成功。 6、开始安装Hadoop,配置hadoop环境变量/etc/profile(所有机子都需要配置) export HADOOP_HOME=/usr/local/jiang/hadoop-2.7.1 export PATH= HADOOP_HOME/bin 7、修改配置文件: (1)、修改hadoop-2.7.1/etc/hadoop/hadoop-env.sh [root@logsrv03 /]# cd usr/local/jiang/hadoop-2.7.1 [root@logsrv03 hadoop-2.7.1]# cd etc/hadoop/ [root@logsrv03 hadoop]# vi hadoop-env.sh export JAVA_HOME=/usr/local/jdk1.7.0_71 (2)、修改hadoop-2.7.1/etc/hadoop/slaves [root@logsrv03 hadoop]# vi slaves logsrv02 logsrv04 (3)、修改hadoop-2.7.1/etc/hadoop/core-site.xml <configuration> <property> <name>fs.defaultFS</name> <value>hdfs://logsrv03:8020</value> </property> <property> <name>io.file.buffer.size</name> <value>131072</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/opt/hadoop/tmp</value> </property> <property> <name>fs.hdfs.impl</name> <value>org.apache.hadoop.hdfs.DistributedFileSystem</value> <description>The FileSystem for hdfs: uris.</description> </property> <property> <name>fs.file.impl</name> <value>org.apache.hadoop.fs.LocalFileSystem</value> <description>The FileSystem for hdfs: uris.</description> </property> </configuration> (4)、修改hadoop-2.7.1/etc/hadoop/hdfs-site.xml <configuration> <property> <name>dfs.namenode.name.dir</name> <value>file:/opt/hadoop/dfs/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/opt/hadoop/dfs/data</value> </property> <property> <name>dfs.replication</name> <value>2</value> </property> </configuration> (5)、修改hadoop-2.7.1/etc/hadoop/yarn-site.xml <configuration> <!-- Site specific YARN configuration properties --> <property> <name>yarn.resourcemanager.address</name> <value>logsrv03:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>logsrv03:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>logsrv03:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>logsrv03:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>logsrv03:8088</value> </property> <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce.shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> </configuration> (6)、修改hadoop-2.7.1/etc/hadoop/mapred-site.xml <configuration> <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> <property> <name>mapreduce.jobhistory.address</name> <value>logsrv03:10020</value> </property> <property> <name>mapreduce.jobhistory.webapp.address</name> <value>logsrv03:19888</value> </property> </configuration> 8、这些配置文件配置完毕后,然后将整个hadoop-2.7.1文件复制到各个从机的目录下,这里目录最好与主机一致 [root@logsrv03 hadoop-2.7.1]# scp -r hadoop-2.7.1 root@logsrv02:/usr/local/jiang/ [root@logsrv03 hadoop-2.7.1]# scp -r hadoop-2.7.1 root@logsrv04:/usr/local/jiang/ 9、到这里全部配置完毕,然后开始启动hadoop,首先格式化hdfs [root@logsrv03 hadoop-2.7.1]# bin/hdfs namenode -format 如果出现successfully formatted则表示格式化成功。 10、然后启动hdfs [root@logsrv03 hadoop-2.7.1]# sbin/start-dfs.sh 到这里,可以查看启动的进程: 主机logsrv03: [root@logsrv03 hadoop-2.7.1]# jps 29637 NameNode 29834 SecondaryNameNode 从机logsrv02、logsrv04: [root@logsrv02 hadoop-2.7.1]# jps 10774 DataNode [root@logsrv04 hadoop-2.7.1]# jps 20360 DataNode 11、启动yarn [root@logsrv03 hadoop-2.7.1]# sbin/start-yarn.sh 到这里,启动的进程: 主机logsrv03: [root@logsrv03 hadoop-2.7.1]# jps 29637 NameNode 29834 SecondaryNameNode 30013 ResourceManager 从机logsrv02、logsrv04: [root@logsrv02 hadoop-2.7.1]# jps 10774 DataNode 10880 NodeManager [root@logsrv04 hadoop-2.7.1]# jps 20360 DataNode 20483 NodeManager 到这里,恭喜整个集群配置完成,可以通过:http://logsrv03:8088/cluster查看hadoop集群图: 查看HDFS:可以通过:http://logsrv03:50070查看 本文转自xinrenbaodao 51CTO博客,原文链接:http://blog.51cto.com/11832904/2044235,如需转载请自行联系原作者

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

❤️‍🔥FlyFlow 工作流周更来咯~~

FlyFlow 借鉴了钉钉与飞书的界面设计理念,致力于打造一款用户友好、快速上手的工作流程工具。相较于传统的基于 BPMN.js 的工作流引擎,我们提供的解决方案显著简化了操作逻辑,使得用户能够在极短的时间内构建定制化的业务流程,即便是不具备深厚技术背景的普通用户也能迅速掌握,实现零门槛的高效工作流配置。 本周更新如下: 新增:分栏表单支持多列配置(2-4列) 优化:vue路由模式从hash改成history 修复:抄送任务没有接收人的时候报错 修复:创建角色时没有角色key显示异常 优化:表单、节点等id生成规则添加标识符 优化:表单值变更记录显示改成只显示值内容 修复:明细、单用户和单部门的表单验证异常 优化:数字、金额等表单验证规则

资源下载

更多资源
Mario

Mario

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

Spring

Spring

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

Rocky Linux

Rocky Linux

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

Sublime Text

Sublime Text

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

用户登录
用户注册