关于程序员:Vue3-学习笔记Day1

写在后面本文为尚硅谷禹神 Vue3 教程的学习笔记。本着本人学习、分享别人的态度,分享学习笔记,心愿能对大家有所帮忙。 ::: block-1 目录0 课程介绍1 Vue3 简介2 创立 Vue3 工程 2.1 基于 vue-cli 创立2.2 基于 vite 创立(举荐)2.3 一个简略的成果:::0 课程介绍P1:https://www.bilibili.com/video/BV1Za4y1r7KE?p=11 Vue3 简介P2:https://www.bilibili.com/video/BV1Za4y1r7KE?p=2Vue 是一个用于 构建用户界面 的 渐进式 框架 官网文档: https://cn.vuejs.org/2 创立 Vue3 工程2.1 基于 vue-cli 创立P3:https://www.bilibili.com/video/BV1Za4y1r7KE?p=32.2 基于 vite 创立(举荐)vite 是新一代前端构建工具,官网地址:https://vitejs.cn 具体操作如下: ## 1.创立命令npm create vue@latest## 2.具体配置## 配置项目名称√ Project name: vue3_test## 是否增加TypeScript反对√ Add TypeScript? Yes## 是否增加JSX反对√ Add JSX Support? No## 是否增加路由环境√ Add Vue Router for Single Page Application development? No## 是否增加pinia环境√ Add Pinia for state management? No## 是否增加单元测试√ Add Vitest for Unit Testing? No## 是否增加端到端测试计划√ Add an End-to-End Testing Solution? » No## 是否增加ESLint语法查看√ Add ESLint for code quality? Yes## 是否增加Prettiert代码格式化√ Add Prettier for code formatting? No本人入手编写一个App组件: ...

February 19, 2024 · 1 min · jiezi

关于程序员:Flink介绍

Flink 介绍1. 简介Apache Flink is a framework and distributed processing engine for stateful computations over unbounded and bounded data streams. Flink has been designed to run in all common cluster environments, perform computations at in-memory speed and at any scale.Apache Flink是一个分布式解决引擎,用于在无界和有界数据流上进行有状态的计算。它在所有的通用集群环境中都能够运行,在任意规模下都能够达到内存级的计算速度。 1.1 背景Apache Flink 最后由德国柏林工业大学的 Stratosphere 我的项目倒退而来,该我的项目于 2010 年启动。最后,Stratosphere 是为了反对简单的大规模数据分析工作而设计的。起初,Flink 我的项目作为 Stratosphere 的一个分支,在 2014 年成为 Apache 软件基金会的顶级我的项目。 1.2 用处实时数据处理:Flink 能够解决实时数据流,使得企业可能实时地剖析和解决数据,从而做出更疾速的决策。批处理:除了流解决,Flink 也反对批处理模式,能够解决大规模的批量数据,实用于须要离线解决的工作。事件驱动利用:Flink 提供了灵便的事件驱动模型,可用于构建各种类型的实时应用程序,如监控、举荐零碎、实时报警等。数据湖计算:Flink 能够与现有的数据湖技术(如 Apache Hadoop、Apache Hive 等)无缝集成,为数据湖提供实时计算能力。机器学习:Flink 提供了丰盛的机器学习库和 API,可用于构建和训练机器学习模型。总之,Apache Flink 是一个多功能的流式解决引擎,能够利用于各种实时数据处理和剖析场景,是以后大数据处理畛域的重要技术之一。 ...

February 18, 2024 · 3 min · jiezi

关于程序员:Python可视化工具集合来报道-上

Python作为一种宽泛应用的编程语言,领有丰盛的可视化工具选项,使得用户能够轻松地将数据转化为易于了解和吸引人的图表和图形。可视化工具在数据分析和数据展现中扮演着重要的角色。这些工具不仅能够帮忙用户更好地了解数据,还能反对决策制定、故事讲述和洞察发现等方面。无论是用于学术研究、商业剖析还是数据迷信我的项目,Python提供的可视化工具都可能满足不同需要,晋升数据分析的成果与效率。以下是收集的可视化工具: 1.Matplotlib是Python中最罕用的可视化工具之一。它是最古老、最经典的Python可视化库,作为一个根底绘图工具,Matplotlib能够绘制各种动态图表,例如线图、散点图等,十分实用于数据的可视化展现。它提供了丰盛的配置选项,使得用户可能自定义图表的款式和外观。Matplotlib还反对多种输入格局,包含图像文件和矢量图形,不便用户在不同的媒介上应用生成的图表。这一灵活性和性能的组合,使得Matplotlib成为数据迷信畛域中必不可少的工具。 2.Seaborn是一种基于Matplotlib的高级数据可视化库。它提供了简略易用的接口,能够轻松绘制统计图表、热力求等。绝对于Matplotlib,Seaborn具备更高的好看度和可定制性,使得生成各种业余程度的图形变得更加简略。无论是在数据分析、数据挖掘还是数据可视化畛域,Seaborn都是一种十分有用的工具。通过应用Seaborn,用户能够疾速而直观地察看数据集的散布、趋势和关系。此外,Seaborn还反对主动调整图标的主题和色彩格调,使得最终的图表更具一致性和美感。 3.Plotly是一款功能强大的Python可视化工具,它可能以交互式的形式创立动静和动态图表。作为一种多样化的绘图库,Plotly提供了许多常见的图表类型,比方折线图、散点图和饼图等。此外,Plotly还具备丰盛的图表定制选项,用户能够依据本人的需要进行个性化设置,如调整轴标签、字体款式和背景色彩等。另外,Plotly反对导出图表为HTML或动态图片,不便在其余中央进行分享与展现。通过其丰盛的性能和易用的接口,Plotly成为了数据科学家和分析师们常常应用的工具之一。 4.Bokeh是一个用于构建交互式Web利用和仪表盘的库。它提供了丰盛的绘图工具和性能,能够轻松绘制高性能的交互式图表。Bokeh的核心理念是将数据可视化为视觉元素的组合,通过用户的交互来实现对数据的摸索和了解。它反对绘制多种类型的图表,如散点图、线图、柱状图等,并可能解决大规模数据。在Bokeh中,用户能够通过增加交互式控件来实现数据筛选、缩放和平移等操作,使得用户能够依据本人的需要进行数据的动静摸索和剖析。Bokeh还提供了丰盛的输入选项,能够将绘制好的图表导出为动态图片或交互式的HTML页面。通过Bokeh,用户能够疾速构建出令人印象粗浅的可视化应用程序和仪表盘。 5.Altair是基于Vega和Vega-Lite的Python可视化库。它提供了一种简略而直观的申明式语法,能够疾速生成各种动态和交互式图表。Altair的设计理念是使数据可视化过程变得简略和灵便。通过应用简洁的语法,用户能够轻松定义数据和视觉元素之间的映射关系,从而创立出具备吸引力且易于了解的图表。此外,Altair也反对动静交互,使用户可能自在地摸索数据并与其进行互动。通过应用Altair,用户能够疾速无效地进行数据分析和展现,实现对简单数据的深刻洞察。未完待续,动工大吉,今天持续更新,喜爱点赞珍藏转发,如有疑难,点击链接退出群聊【信创技术交换群】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=EjDhISXNgJlMMemn85v...

February 18, 2024 · 1 min · jiezi

关于程序员:VMware-Workstation-17安装教程轻松构建虚拟机

VMware是一款功能强大的桌面虚构计算机软件,它提供用户在繁多的桌面上同时运行不同的操作系统,并可进行开发、测试、部署新的应用程序。VMware Workstation可在一部实体机器上模仿残缺的网络环境,以及可便于携带的虚构机器,其更好的灵活性与先进的技术胜过了市面上其余的虚构计算机软件。对于企业的IT开发人员和系统管理员而言,VMware在虚构网络、实时快照、拖曳共享文件夹、反对PXE等方面的特点使它成为必不可少的工具。同时运行多个零碎VMware WorkStation虚拟机(简称VM虚拟机)软件是一款桌面计算机虚构软件,让用户可能在繁多主机上同时运行多个不同的操作系统。数据独立每个虚构操作系统的磁盘分区、数据配置都是独立的,不必放心会影响到本人电脑中本来的数据。实用功能多VM还反对实时快照、虚构网络、文件拖曳传输以及网络装置等不便实用的性能。专用局域网还能够把多台虚拟机形成一个专用局域网,应用起来很不便。 上面开始下载安装软件:下载安装包官网网址https://www.vmware.com/cn/products/workstation-pro/workstatio... 虚拟机的装置向导 承受许可条款 抉择虚拟机软件的装置门路 用户体验设置 创立快捷方式 筹备开始装置虚拟机 期待装置实现 装置向导实现界面 许可证密钥验证界面 虚拟机软件的感激界面 喜爱点赞珍藏,如有疑难,点击链接退出群聊【信创技术交换群】:http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=EjDhISXNgJlMMemn85v...

February 18, 2024 · 1 min · jiezi

关于程序员:3秒开服幻兽帕鲁如何抓住游戏背后的云计算机遇

导语 | 2024 年伊始,《幻兽帕鲁》的炽热就为新一年的游戏市场带来了极高的热度,无论是超千万份的销量还是对于游戏“缝合”与“借鉴”的争议,都使得开年游戏市场的销售前景与话题度拉满。而在游戏市场之外,云服务市场尤其是其面向集体或小团队的服务器租用服务,也意外凭借《幻兽帕鲁》的走红而实现了一次破圈。明天,咱们特邀了中国信通院低代码/无代码推动核心技术专家 沈欣老师,他将带咱们解读从《幻兽帕鲁》游戏爆火聊聊云计算倒退的将来。 引言近期《幻兽帕鲁》“火”了,一经公布后一路狂飙,这款制作老本不到 5000 万,售价 108 元(美区 29.9$)的游戏产品,在 1 月 19 日上架 steam 后,8 小时销量便破百万,24 小时销量破 200 万,5 天售出 700 万,1 月 24 日,寰球销售额曾经冲破 1.89 亿美金。同时在线人数超过 210 万,峰值人数仅次于吃鸡,夺得 Steam 历史第二的地位。 一、四大层面看《幻兽帕鲁》的火爆其实,帕鲁的胜利有许多争议的中央,可能也是促其爆火的起因,例如 AI+IP 的模型生成、和宝可梦缝合怪的玩法、看待帕鲁时兽性的缺失、“周末玩帕鲁,周一变帕鲁”的打工人发泄等等。 但随着游戏的倒退过程,咱们看到,从最早的单机游戏——代表了齐全的娱乐自我,到起初的联机游戏——代表了社交圈内娱乐,再进入网游年代——游戏带来新社交。从中国的社交不足年代开始,游戏有越多人在线,就越有价值,当初在大型城市曾经开始进入社交溢出年代,小团体的深刻社交更有价值,适度社交下,很多人只违心和好友一起游玩。 用户的变动让人印象粗浅,用户们围绕“无聊的翻新不如好玩的剽窃”开展了热烈的探讨,针对那些一味沉迷于老 IP 红利而碌碌无为的大企业的声讨,是否也意味着传统游戏 IP 的衰败呢? 咱们发现,小团体社交群玩家其实更有粘性,既然游戏的实质就是在乏味的显规定下,建设合乎集体标签的亚规定,实现本人的潜规则,那么分布式云娱乐商业模式该如何设计呢?其实,从技术层面看,也有很多乏味的法则和景象。例如,用腾讯云 Lighthouse 3秒极速搭建幻兽帕鲁专用服务器,无需繁琐配置,全自动开服联机畅玩,UI 界面疾速配置游戏世界规定,这算不算低代码或者无代码开发呢? 二、云计算的倒退路在何方作为开发人员,咱们看到,只有在云计算的年代,才有可能做到疾速搭建专用服务器,在自建服务器年代,这只能是十分小众的自娱自乐。因为云,极大地升高了部署和运维难度。让咱们再一次思考,云计算的意义在哪里? 咱们都记得当云计算最早呈现时,大家认为,算力将会和电力一样,随处可得,按需付费,每个人都能够随时随地的应用与开释算力。而理论状况则是,大部分的利用还是企业级的,市场上非常不足间接面对 C 端的云计算产品,也没有适合的场景。随着 AI 的风行,云计算又面临着如何构建服务于 AI 的云,咱们刚好通过以下这个表格来做一个比照: 云计算是一个大概念,实质是是否让指标客户在具体场景中低成本高效部署,同时免费又可能落在老本和客户能承受的空间内。之前的云计算商业模式并没有给集体“代理”留出空间:代理人通过本人的服务,在特定平台上,为 C 端用户带来价值。那些违心付费部署本人专有服务器,并带好友进来游戏的玩家,就是将来最好的代理。值得一提的是,每一个能够调整规定的帕鲁云服务器,就是一个小小的元宇宙。 结语咱们从幻兽帕鲁想到了将来的 AI 元宇宙,将来难道不应该是 Agents 主动洽购云服务,而后构建面向消费者的服务么?Agents 一旦可能应用货币或者代币进行洽购,那么,它也就是咱们两头的一员了。咱们如果可能透过景象看实质,从而找到法则,并以终为始提前布局,设计面向未来的场景,就有可能在将来步步当先,这,就是翻新。 点击Lighthouse部署游戏服,进入帕鲁福利专区,3秒极速开服畅玩~

February 18, 2024 · 1 min · jiezi

关于程序员:快速部署MES源码万界星空科技开源MES

什么是开源MES软件? 开源MES软件是指源代码能够收费获取、批改和散发的MES软件。与传统的商业MES软件相比,开源MES软件具备更高的灵活性和可定制性。企业能够依据本身的需要对软件进行定制化开发,满足不同生产环境下的特定需要。 开源MES软件的劣势 收费获取:企业无需领取高额的技术受权费用,能够收费获取开源MES软件。 灵活性和可定制性:开源MES软件源代码能够被企业自在批改和定制。企业能够依据本身需要对软件进行二次开发,满足不同工厂环境下的特定需要。 社区反对:开源MES软件通常领有宏大的开发者社区。企业能够通过社区获取技术支持,解决在应用过程中遇到的问题。 什么是MES源码?MES源码是为企业提供的一种生产执行零碎(MES)软件的源代码。MES是一种以信息化伎俩反对生产过程治理和协调的零碎,通过自动化和数据化的形式实现对生产全过程的监控和管制,从而进步生产效率和品质。 疾速部署的劣势与传统的MES零碎相比,万界星空科技开源MES源码具备以下劣势: 疾速部署:咱们的MES源码曾经通过精心设计和开发,能够疾速部署到您的企业生产环境中。不须要长时间的定制和调试,能够立刻投入使用。易于操作:咱们的MES源码采纳了直观的界面设计和用户敌对的操作形式,使您的员工能够疾速上手,无需额定的培训老本。灵便定制:咱们的MES源码提供灵便的定制选项,能够依据您企业的理论需要进行定制开发。无论是生产打算治理、生产过程管制还是生产数据分析,都能够依据您的要求对系统进行个性化定制。实现精益生产的要害性能咱们的疾速部署MES源码提供了一系列要害性能,帮忙您实现精益生产: 打算治理:通过智能化的排产算法,实现最优的生产打算,正当利用资源,降低生产老本。追溯及品质治理:实现对生产过程的全程追溯,实时监控产品质量,及时发现并解决异常情况,进步产品质量。产能剖析:通过对生产数据的收集和剖析,帮忙您全面理解生产效率,及时发现并改良生产瓶颈,进步产能。网站收费下载地址:拜访万界星空科技官网:或者百度搜寻万界星空科技 开源收费下载地址: 拜访万界星空科技开源:GitHub - metaxk-company/free-mes: 收费MES、开源MES,市面上最好的收费MES

February 18, 2024 · 1 min · jiezi

关于程序员:JavaWeb之响应

响应Servlet封装响应并返回给申请的客户端,该响应由ServletResponse类型的response对象示意,在HTTP申请场景下,容器提供的响应对象的具体类型为HttpServletResponse HTTP的响应音讯分为三局部:状态行、响应头、响应注释。 状态行对应的办法是 public void setStatus(int sc);响应头对应的办法为 public void addHeader(String name, String value);//或者public void setHeader(String name, String value);响应注释对应的办法为 public ServletOutputStream getOutputStream() throws IOException;//或者public PrintWriter getWriter() throws IOException;https://zhhll.icu/2021/javaweb/根底/3.响应/本文由mdnice多平台公布

February 18, 2024 · 1 min · jiezi

关于程序员:精通C语言打造高效便捷的通讯录管理系统

✨✨ 欢送大家来到贝蒂大讲堂✨✨ 养成好习惯,先赞后看哦~ 所属专栏:C语言我的项目 贝蒂的主页:Betty‘s blog 引言:在咱们大抵学习完C语言之后,咱们就能够利用目前所学的常识去做一些有意思的我的项目,而明天贝蒂就带大家实现一个通讯录的繁难实现, 本章你可能须要的常识: 动态内存的应用:动态内存治理文件的创立与应用:[文件操作]()1. 通讯录要求通讯录包含每个人的姓名,性别,年龄,电话与地址。玩家能够自由选择通讯录的进出。玩家能够自在增删查改通讯录中的数据。 2. 多文件治理为了不便代码的治理和保障通讯录实现逻辑的清晰性,咱们将采纳多文件治理的模式。 创立头文件contact.c,蕴含所有头文件(其余源文件只需援用它即可),以及所有通讯录性能的展示。创立源文件contact.c,负责通讯录所有性能的具体代码实现。创立源文件text.c,负责展示通讯录实现的总体逻辑。3. 通讯录的筹备3.1 预处理信息为了不便咱们后续更换通信的信息,咱们能够利用宏来定义通讯录的具体信息的大小。 #define MAX 100//最大人数#define MAX_NAME 20//名字最大长度#define MAX_SEX 5//性别最大长度#define MAX_TELE 12//电话最大长度#define MAX_ADDR 30//地址最大长度3.2 构造体定义每个人的通讯录都要蕴含姓名,性别,年龄,电话与地址等信息,这时就须要咱们创立一个构造体来方便管理。 typedef struct PeoInfo{ char name[MAX_NAME];//名字 int age;//年龄 char sex[MAX_SEX];//性别 char tele[MAX_TELE];//电话 char addr[MAX_ADDR];//地址}PeoInfo;而咱们须要用这个构造体创立一个大小为100的数组,并且咱们还须要晓得以后通讯录的大小能力进行增删查改的操作,这两者非亲非故,为了简化代码和减少代码的可读性,咱们能够将这两者从新定义一个构造体。 typedef struct contact{ PeoInfo data[MAX];//一百个人的数据 int sz;//通讯录的大小}contact;4. 繁难菜单void menu(){ printf("***********************************\n"); printf("** 1.add 2.delete **\n"); printf("** 3.search 4.modify **\n"); printf("** 5.display 6.sort **\n"); printf("** 0.exit **\n"); printf("***********************************\n");}画面展现: 5. 通讯录具体性能5.1 初始化咱们首先对通讯录进行初始化。 ...

February 17, 2024 · 7 min · jiezi

关于程序员:23年你可能错过的-10个-前端新变化

2023年前端圈中迎来了很多新的变动,快来回顾一下吧 1. 可迭代对象 group by应用 group by 很容易对可迭代对象进行分组,例如上面的数组示例数据 const arr = [ { name: "芦笋", type: "蔬菜", quantity: 5 }, { name: "香蕉", type: "水果", quantity: 0 }, { name: "山羊", type: "肉", quantity: 23 }, { name: "樱桃", type: "水果", quantity: 5 }, { name: "鱼", type: "肉", quantity: 22 },];const cb = ({ type }, index) => type;const result = Object.groupBy(arr, cb); Object.groupBy()")") 为可迭代对象中的每个元素调用一次提供的 callbackFn 函数。回调函数应返回一个字符串或 symbol(不属于这两种类型的值会被强制转换为字符串),用于批示元素所属的分组。callbackFn 的返回值会被用作 Map.groupBy() 返回的对象的键。每个键都有一个相关联的数组,其中蕴含回调函数返回雷同值的所有元素。2. toSortedArray 实例的 toSorted() 办法是 sort() 办法的复制办法版本。它返回一个新数组,其元素按升序排列。 ...

February 17, 2024 · 2 min · jiezi

关于程序员:JavaWeb之请求

申请客户端申请由ServletRequest类型的request对象示意,在HTTP申请场景下,容器提供的申请对象的具体类型为HttpServletRequest HTTP的申请音讯分为三局部:申请行、申请头、申请注释。 <!-- more --> 申请行对应办法 // 获取申请行中的协定名和版本public String getProtocol();// 获取申请形式public String getMethod();// url中的额定门路信息public String getPathInfo();// url中的额定门路信息多对应的资源的真是门路public String getPathTranslated();// 获取申请URL所属的WEB应用程序门路,以/结尾,示意整个web站点的根目录public String getContextPath();// 申请行中的参数public String getQueryString();// 获取申请行中的资源名,主机端口之后,参数之前的局部public String getRequestURI();// 获取Servlet所映射的门路public String getServletPath();网络连接信息相干办法 // 客户端的ippublic String getRemoteAddr();//客户端的主机public String getRemoteHost();//客户端的端口public int getRemotePort();// 服务器接管以后申请的网络接口的ip对应的主机名public String getLocalName();// 服务器接管以后申请的网络接口的ippublic String getLocalAddr();// 服务器接管以后申请的网络接口的端口public int getLocalPort();// 获取URLpublic StringBuffer getRequestURL();// 以后申请所指向的主机名public String getServerName();// 以后申请所连贯的服务器端口号public int getServerPort();// 协定名public String getScheme();申请头信息 // 获取申请头public long getDateHeader(String name);public String getHeader(String name); public Enumeration<String> getHeaders(String name); public Enumeration<String> getHeaderNames();public int getIntHeader(String name);// 获取Content-Length头字段信息public int getContentLength();// 返回Content-Type头字段信息public String getContentType();// 返回申请音讯的字符集编码,Content-Type头字段信息public String getCharacterEncoding();public String getAuthType(); public Cookie[] getCookies();public String getRemoteUser();public boolean isUserInRole(String role);public java.security.Principal getUserPrincipal();public String getRequestedSessionId();public HttpSession getSession(boolean create);public HttpSession getSession();public String changeSessionId();public boolean isRequestedSessionIdValid();public boolean isRequestedSessionIdFromCookie();public boolean isRequestedSessionIdFromURL();public boolean isRequestedSessionIdFromUrl();public boolean authenticate(HttpServletResponse response) throws IOException,ServletException;public void login(String username, String password) throws ServletException;public void logout() throws ServletException;public Collection<Part> getParts() throws IOException, ServletException;public Part getPart(String name) throws IOException, ServletException;public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass) throws IOException, ServletException;获取申请参数 ...

February 17, 2024 · 1 min · jiezi

关于程序员:JavaWeb之Servlet接口

Servlet接口什么是Servlet?Servlet是一种基于Java技术的Web组件,用于生成动静内容,由容器治理,是平台无关的Java类组成,并且由Java Web服务器加载执行,是Web容器的最根本组成单元 什么是Servlet容器?Servlet容器作为Web服务器或应用服务器的一部分,通过申请和响应提供Web客户端与Servlets交互的能力,容器治理Servlet实例以及它们的生命周期(创立、初始化、提供服务、销毁等) 在java web中不论是应用J2EE原生的servlet/jsp还是应用springmvc/springboot,在web服务器看来只是对外裸露进去的Servlet,而这个Servlet是javax.servlet.Servlet接口,该接口定义了Servlet引擎与Servlet程序之间通信的协定约定。 // Servlet的加载和实例化能够产生在容器启动时,也能够提早初始化直到有申请须要解决时public interface Servlet { // 负责初始化Servlet对象,容器创立好Servlet对象后由容器调用调用,只执行一次 // 当load-on-startup设置为正数或者不设置时会在Servlet第一次用到时才被调用 void init(ServletConfig config) throws ServletException; // 获取该Servlet的初始化参数信息 ServletConfig getServletConfig(); // 负责响应客户端的申请,当容器接管到客户端要求拜访特定Servlet对象的申请时,会调用该Servlet对象的service()办法,每次申请都会执行 void service(ServletRequest req, ServletResponse res) throws ServletException, IOException; // 返回Servlet信息,蕴含创建者、版本、版权等信息 String getServletInfo(); // Servlet完结生命周期时调用,开释Servlet对象占用的资源 void destroy();}<!-- more --> 而为了简化开发,jdk中提供了一个实现Servlet接口的简略的Servlet类,javax.servlet.GenericServlet,该类实现了Servlet的基本功能,对init(ServletConfig config)、service(ServletRequest req, ServletResponse res)和destroy()办法提供了默认实现 jdk针对HTTP协定专门提供了一个Servlet类,javax.servlet.http.HttpServlet,该类继承于GenericServlet类,在其根底上针对HTTP的特点进行裁减,个别编写程序时继承HttpServlet即可,这样只须要重写doGet()和doPost()办法即可 Servlet中波及的次要对象 申请对象 ServletRequest、HttpServletRequest响应对象 ServletResponse、HttpServletResponseServlet配置对象 ServletConfigServlet上下文对象 ServletConfigServlet注册与运行Servlet编写好之后须要在web.xml中进行注册和映射能力被Servlet容器加载从而被外界拜访 <!-- 留神servlet和servlet-mapping都是成对呈现的 --> <!-- 注册Servlet --> <servlet> <servlet-name>HW</servlet-name> <servlet-class>com.zhanghe.study.servlet.HelloWorldServlet</servlet-class> <!-- 配置servlet初始化init时中ServletConfig参数--> <init-param> <param-name>name</param-name> <param-value>john</param-value> </init-param> <!-- servlet加载机会,若为正数,则在第一次申请时被创立,若为0或者负数,在web利用被Servlet容器加载时创立实例,值越小越早被启动 --> <load-on-startup>1</load-on-startup> </servlet> <!-- 映射Servlet --> <servlet-mapping> <!-- 对应servlet标签中的servlet-name值 --> <servlet-name>HW</servlet-name> <!-- 结尾的/示意web用用程序的根目录 --> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping>tomcat中的web.xml蕴含有一个缺省的Servlet ...

February 16, 2024 · 3 min · jiezi

关于程序员:改进-Git-flow-来管理-Bitbucket-上的私有-TypeScript-依赖

在目前的工作中,Bitbucket 同时被咱们用作代码仓库和公有 NPM 仓库。通过 git+ssh 指定 tag 来装置依赖,对于纯 JavaScript 的我的项目非常不便。 随着局部依赖开始应用 TypeScript,基于现有应用形式,须要对这部分依赖采取上面的一种形式进行治理。 间接将编译后的 dist 文件提交到主分支上。在 postinstall 中进行编译。当依赖被装置后,就会主动编译。但无论哪种形式,都会有一些瑕疵。 间接将 dist 提交到主分支上,在做 Code review 时会额定多出许多文件烦扰,我的项目构造也不优雅。通过 postinstall 的形式对于纯 JavaScript 的我的项目就须要额定装置 typescript,同样不优雅。出于人力以及迁徙仓库的老本思考(咱们有近 100 个依赖,且每个依赖有许多版本并且被不同的服务援用),对此只能通过改良 Git flow 来解决上述瑕疵。 指标从新设计的 Git flow 须要满足以下指标。 开发分支上不须要编译后 dist 文件。不须要通过 postinstall 的形式来编译。援用的形式不产生扭转,还是通过 git+ssh 指定 tag 的形式装置依赖。须要思考到 hotfix 的状况。Git flow 改良为了实现上述指标,上面是改良后的 Git flow。 对于失常的开发,当代码合并到 master 后,先推送 src tag 并批改 .gitignore 长期创立 build 分支。随后在 build 分支编译并且打上正式 tag,正式 tag 蕴含 dist 文件,能够被其余服务援用。 ...

February 16, 2024 · 2 min · jiezi

关于程序员:2023某熊的成长之路拥抱更大的世界

<article class=“article fmt article-content”><h2>2023~某熊的成长之路</h2><p>2023 的确是颇为艰巨的一年,认为是先立再破,没想到最初经济大环境还是变成了不破不立;时代的浪潮吼叫而来,让很多个体都感觉到了风雨飘摇。2023 年也是孕育心愿的一年,我意识了将陪伴我毕生的、又一位只有死亡能力将咱们离开的(超难带)虎子哥;我本人感觉也开始持续地睁眼看世界,致力地突破惯性的认知的枷锁,尝试、拥抱新的货色,尽管曾经三十多岁了,然而感觉跟小时候看到的小孩儿不一样。既不像小时候看到的小孩儿那样成熟稳重,也不想早早地躺在床上等着八十岁下葬。</p><h2>睁(小)眼看世界的常识体系,拥抱国际化</h2><p>2023 年在常识体系上最大的变动就是从纯 CS 技术体系扩大到了产品、商业、投资等诸多方面。</p><p></p><p>2024 年随着咱们海内业务的扩张,我也开始真正地拥抱国际化,继续地用糟糕地英语与海内的客户、合作伙伴进行交换。出海在最后认为就是做翻译、做 SEO、做海内社媒,起初发现,真正地壁垒还是在于 Think in Native。置信将来随着一带一路的一直推动,随着地缘政治、人民币国际化的一直深入,在中国重回世界之巅的征途上,会像当年的英美一样带来许多新的机会。</p><h2>组织建设、产品定义、畛域数据建模、技术治理</h2><p>2023 年学到的最大教训就是要器重组织性与产品定义,这也是从技术开发的视角向保障组织胜利的最大转变吧。在漫长的征途上,集体的激情与投入很重要,然而往往也是十分充斥不确定的。团队须要的对后果的绝对确定性,这是对上、对下、对本人的负责。</p><p></p><ul><li><p>做好产品定义</p><ul><li>产品的定义是多维度的</li><li>产品定义是资源投入的前置条件</li><li>有些产品是无奈定义的</li></ul></li><li><p>均衡好务实与求实</p><ul><li>策略决定下限,组织决定上限</li></ul></li><li><p>做有共识的事,与适合的人共事</p><ul><li>很难依赖组织翻新</li><li><p>共识是层层递进的</p><ul><li>有的人因为看到所以置信,有的人因为置信所以看到</li><li>从一个胜利走向另一个胜利</li></ul></li></ul></li><li><p>尊重软件开发的天然周期</p><ul><li>通用并不是最好的</li><li>正当应用第三方软件</li></ul></li></ul><h2>编程、算命、买股票</h2><p>当初是一个超级个体的时代,社交媒体上的嘈杂越发让人感触到心田的充实,冠盖满京华,斯人独憔悴。我也在想,有什么事件是能够遵循长期主义,可能脱离年龄带来的裂谷。</p><p></p><p>编程的乐趣在于可能亲手去发明虚构地世界,与天然博弈;算命的乐趣在于可能去摸索人类的心理,与未知博弈;买股票的乐趣在于可能去摸索人类的欲望,与本人博弈;。算命与买股票都是概率游戏,尽管 2022 & 2023 年胜利地在中国最大的常识付费平台亏掉了 90W。不过站在知行合一的角度,我还是动摇地认为 2024 年锚定正当估值和流动性溢价的机构自救,还有半导体科创会是两个大概率的机会。</p><h2>年度工作</h2><p>果然,2023 的年度工作有很多没有做完的,2024 持续加油咯;</p><ul><li><p>技术:把握 C++ & Rust</p><ul><li>[ ] 学习 Google 的 Rust 教程;</li><li>[ ] 学习 QT 基础教程;</li><li>[ ] 浏览并整顿 BytebyteGo 的文章;</li><li>[ ] 浏览《Clojure 编程乐趣第二版》</li><li>[ ] 浏览并整顿《Modern-CPP-Programming》</li><li>[ ] 浏览并整顿《计算几何》</li><li>[x] 浏览《计算机图形学(微课版)》</li></ul></li><li><p>AI:Follow 并试验 3D AIGC 相干钻研</p><ul><li>[ ] Follow 最新的 3D-CV & Generation 畛域的论文;</li><li>[ ] 学习 Fast.ai Courses;</li></ul></li><li><p>产品:构建体系化产品与治理认知</p><ul><li>[ ] 翻译并且浏览完 《About The Startup CTO’s Handbook》;</li><li>[ ] 听完齐豪杰高效能人士的七个习惯音频;</li><li>[ ] 学习至多三个系列的 SEO 教程:《CrossBorder-Notes》</li></ul></li><li><p>命理学</p><ul><li>[ ] 整顿袁树珊、周德元老师几篇书籍的前言序为电子版;</li><li>[ ] 看完 YouTube 上对于手相的一节;</li></ul></li><li><p>投资:建设对于投资的体系化认知</p><ul><li>[ ] 浏览《置身事内》</li></ul></li><li><p>英语:继续学习,建设国际化视线</p><ul><li>[ ] 实现多邻国的英语两阶段课程;</li><li>[ ] 每日温习有道词典单词库内容;</li><li>[ ] 浏览海之光英语的系列学习视频并笔记;</li></ul></li><li><p>衰弱:让静止成为习惯</p><ul><li>[ ] 每周至多去两次健身房;</li><li>[ ] 进行两次体检;</li><li>[ ] 更新保险;</li></ul></li></ul></article> ...

February 15, 2024 · 1 min · jiezi

关于程序员:贝蒂的捣蛋小游戏C语言

✨✨ 欢送大家来到贝蒂大讲堂✨✨ 养成好习惯,先赞后看哦~ 所属专栏:C语言我的项目 贝蒂的主页:Betty‘s blog 引言 后面贝蒂曾经给大家介绍了抉择,循环构造~,明天贝蒂就基于这两种构造,为大家解说一种捣蛋小游戏的设计思路和办法哦。 1.游戏要求游戏要求: 电脑⾃动⽣成1~100的随机数玩家猜数字,猜数字的过程中,依据猜想数据的⼤⼩给出⼤了或⼩了的反馈。玩家一共有五次机会,在五次内,猜对就游戏通关,猜错就游戏失败。游戏失败执行惩办措施(60s后电脑关机),若输出我是猪,则勾销关机。2. 随机数的生成2.1 rand()函数头文件#include<stdlib.h>int rand(void)作用:返回一个范畴在 0 到 RAND_MAX 之间的“随机数”。RAND_MAX 是一个常量,它的默认值在不同的实现中会有所不同,然而值至多是 32767。返回值:该函数返回一个范畴在 0 到 RAND_MAX 之间的整数值。那咱们就测试⼀下rand函数,这⾥多调⽤⼏次,产⽣5个随机数, 代码实现如下: #include <stdio.h>#include <stdlib.h>int main(){ printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); return 0;}第一次输入后果: 第二次输入后果: 这时咱们就有个疑难?为什么两次生成的数都雷同呢? 因为rand()函数生成的“随机数”是一种伪随机数,是依据一个数值依照某个公式推算出来的,并不是真正的随机数,也就是说每次程序启动生成的随机数都是雷同的2.2 srand()函数这时咱们引入了srand()函数,它能间接管制rand()函数生成的值, 咱们晓得了rand()并不是真正的随机数,它是依据某种算法生成的,咱们自然而然想到,咱们能不能通过管制srand(),来间接管制rand()呢,让咱们来试验一下吧。 头文件#include<stdlib.h>void srand(unsigned int seed)作用:收获由函数 rand 应用的随机数发生器。。返回值:不返回值。代码实现如下: #include <stdio.h>#include <stdlib.h>int main(){ srand(1); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); printf("%d\n", rand()); return 0;}输入后果: ...

February 14, 2024 · 3 min · jiezi

关于程序员:掌握C语言文件操作从入门到精通的完整指南

✨✨ 欢送大家来到贝蒂大讲堂✨✨ 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 1. 什么是文件文件其实是指一组相干数据的有序汇合。这个数据集有一个名称,叫做文件名。文件通常是驻留在内部介质(如磁盘等)上的,在应用时才调入内存中来。从文件性能上来讲,个别可分为:程序文件与数据文件 1.1 文件名一个文件要有一个惟一的文件标识,以便用户辨认和援用,这就是文件名⽂件名蕴含3局部:⽂件门路+⽂件名主⼲+⽂件后缀例如:c:\code\test.txt 1.2 程序文件程序文件个别指:源程序文件(后缀为.c),指标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)源程序文件个别在创立程序目录文件下 ![]() 源程序文件通过编译器链接与链接器链接能够生成咱们的可执行程序的文件。 1.3 数据文件⽂件的内容不⼀定是程序,⽽是程序运行时读写的数据,⽐如程序运⾏须要从中读取数据的⽂件,或者输入内容的⽂件。本章探讨的是数据文件。 在以前各章所解决数据的输⼊输入都是以终端为对象的,即从终端的键盘输⼊数据,运⾏后果显⽰到显⽰器上。 其实有时候咱们会把信息输入到磁盘上,当须要的时候再从磁盘上把数据读取到内存中使⽤,这⾥解决的就是磁盘上⽂件。 2. 文件的作用如果没有⽂件,咱们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就失落了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进⾏长久化的保留,咱们就须要使⽤文件。 3. 文件的关上与敞开3.1 流与规范流(1) 流咱们程序的数据须要输入到各种外部设备,也须要从外部设备获取数据,不同的外部设备的输⼊输入操作各不相同,为了⽅便程序员对各种设施进⾏⽅便的操作,咱们形象出了流的概念,咱们能够把流设想成流淌着字符的河。 C程序针对文件、画面、 键盘等的数据输⼊输入操作都是通过流操作的。⼀般状况下,咱们要想向流⾥写数据,或者从流中读取数据,都是要关上流,而后操作。 (2) 规范流那为什么咱们从键盘输⼊数据,向屏幕上输入数据,并没有关上流呢?那是因为C语⾔程序在启动的时候,默认关上了3个流:• stdin-规范输⼊流,在⼤少数的环境中从键盘输⼊,scanf函数就是从规范输⼊流中读取数据。• stdout-规范输入流,⼤少数的环境中输入⾄显⽰器界⾯,printf函数就是将信息输入到规范输入流中。• stderr-规范谬误流,⼤少数环境中输入到显⽰器界⾯。 这是默认关上了这三个流,咱们使⽤scanf、printf等函数就能够间接进⾏输⼊输入操作的。stdin、stdout、stderr三个流的类型是: FILE* ,通常称为文件指针。在C语⾔中,就是通过 FILE* 的⽂件指针来保护流的各种操作的。 3.2 文件指针在缓冲文件系统中,要害的概念是“文件类型指针”,简称“文件指针”。 每个被应用的文件都在内存中开拓了一个相应的文件信息区,用来寄存文件的相干信息(如文件的名字,文件状态及文件以后的地位等)。这些信息是保留在一个构造体变量中的。该构造体类型是有零碎申明的,取名【FILE】 例如,VS2022编译环境提供的 stdio.h 头文件中有以下的文件类型申明: struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; };typedef struct _iobuf FILE;FILE* pf;//文件指针变量不同的C编译器的FILE类型蕴含的内容不完全相同,然而大同小异。每当关上一个文件的时候,零碎会依据文件的状况主动创立一个FILE构造的变量,并填充其中的信息,使用者不用关怀细节。 ...

February 14, 2024 · 6 min · jiezi

关于程序员:独立开发周记-52龙年大吉

2023,第六周,0205-0211祝各位:龙年大吉, 龙腾四海, 龙腾虎跃,鱼跃龙门,龙马精神 watchOS 开发年前的几天都在一边学一边做 watchOS 开发。以前总据说 watchOS 开发十分折磨人,一开始我还不信,当初我信了。 能不能胜利运行到真机上,全靠运气即便在真机上运行了,很快也会断开连接Digital Crown 在 Preview 里是有效的App Group 不能在 iOS 和 watchOS 之间共享 Core Data 和 UserDefaultsWatchConnectivity 只能传输一些简略类型,必须把简单的数据结构拆成一个个字符串从一端传到另一端,而后再从新构建数据过年那些事张灯结彩去看了灯会,还不错,拍了几张特地称心的照片。 年年有余过年就是大盘大碗,大鱼大肉,大吃大喝。 好运连连日盼夜盼(等了差不多三个月),2月6日终于收到了 Google Play 发来的礼物,是一张金属贴纸。 逼格十分高,成为了我的 MacBook 上第一张贴纸。 招财进宝大年初二,打了一下午和一早晨麻将,胡了一把全场最大的。 事业有成是谁在大年三十早晨的鞭炮声声中还在提交代码?原来是我啊。 开卷有益过年期间,根本没什么工夫碰电脑,于是就抉择了读书。初一和初二,两天读完了《SwiftUI 编程思维》。 本文由博客一文多发平台 OpenWrite 公布!

February 14, 2024 · 1 min · jiezi

关于程序员:SpringBoot启动流程及扩展点分析

<article class=“article fmt article-content”><p>先来一段经典的SpringBoot启动代码</p><pre><code class=“java”>@SpringBootApplicationpublic class SpringbootDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringbootDemoApplication.class, args); }}</code></pre><p>SpringBoot应用程序的启动是调用SpringApplication的动态run办法开始的,咱们看一下其源代码</p><pre><code class=“java”>public static ConfigurableApplicationContext run(Class<?> primarySource, String… args) { return run(new Class<?>[] { primarySource }, args);}public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) { return new SpringApplication(primarySources).run(args);}</code></pre><p>能够看到,启动程序是先将启动类,即示例代码中的SpringbootDemoApplication类作为参数,结构出一个SpringApplication实例,再调用这个SpringApplication实例的run办法进行启动</p><h2>getSpringFactoriesInstances</h2><p>这里咱们先理解一下SpringBoot中很常见的getSpringFactoriesInstances办法</p><pre><code class=“java”>// 从各个jar包中的spring.factories中获取到类型为type的类,并将其实例化private <T> Collection<T> getSpringFactoriesInstances(Class<T> type) { return getSpringFactoriesInstances(type, new Class<?>[] {});}/** * 从各个jar包中的spring.factories中获取到类型为type的类,并调用其结构函数参数类型为parameterTypes的函数进行初始化 * type: 从各个jar包中的spring.factories中获取到类型为type的类 * parameterTypes: 构造函数的参数类型列表 * args: 构造函数的参数列表 /private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object… args) { ClassLoader classLoader = getClassLoader(); // 调用SpringFactoriesLoader,找到其中类型为type的类,返回这些类的全限定名 Set<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader)); // 结构下面这些类的实例 List<T> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names); // 依照注解排个序,即@Order AnnotationAwareOrderComparator.sort(instances); // 返回这些实例 return instances;}</code></pre><p>下面代码中,通过SpringFactoriesLoader加载类型为type的类。这里咱们不深入分析了,简略来说,SpringFactoriesLoader就是加载类门路下,所有的META-INF/spring.factories文件,这些文件中是一个properties文件,其中定义了各个类型(即type)及其实现子类,以下是一个文件实例<br/>key就是type的全限定名,value就是咱们返回的类名的汇合<br/><br/></p><h2>SpringApplication构造方法</h2><pre><code class=“java”>public SpringApplication(Class<?>… primarySources) { this(null, primarySources);}/** resourceLoader 资源加载器,默认为空* primarySources 咱们的启动类的class*/@SuppressWarnings({ “unchecked”, “rawtypes” })public SpringApplication(ResourceLoader resourceLoader, Class<?>… primarySources) { // 资源加载器,默认为空 this.resourceLoader = resourceLoader; Assert.notNull(primarySources, “PrimarySources must not be null”); this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources)); // 1. 检测Web应用程序类型 this.webApplicationType = WebApplicationType.deduceFromClasspath(); // 2. 加载疏导上下文的初始化器,疏导上下文也是一个容器,次要利用在SpringBoot启动阶段疏导应用程序上下文启动 this.bootstrapRegistryInitializers = new ArrayList<>( getSpringFactoriesInstances(BootstrapRegistryInitializer.class)); // 3. 加载应用程序初始化器 setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); // 4. 加载监听器 setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); // 5. 设置主启动类 this.mainApplicationClass = deduceMainApplicationClass();}</code></pre><p>咱们来挨个剖析其中的代码</p><h3>检测Web应用程序类型</h3><p>检测Web应用程序类型是由WebApplicationType实现的,以下是WebApplicationType的源代码</p><pre><code class=“java”>public enum WebApplicationType { // 阐明不是Web应用程序,不应该启动Web服务器 NONE, // 阐明应用程序是基于Servlet启动的,会启动内嵌的Web服务器 SERVLET, // 阐明应用程序时基于响应式的web应用程序,会启动内嵌的响应式Web服务器 REACTIVE; private static final String[] SERVLET_INDICATOR_CLASSES = { “javax.servlet.Servlet”, “org.springframework.web.context.ConfigurableWebApplicationContext” }; private static final String WEBMVC_INDICATOR_CLASS = “org.springframework.web.servlet.DispatcherServlet”; private static final String WEBFLUX_INDICATOR_CLASS = “org.springframework.web.reactive.DispatcherHandler”; private static final String JERSEY_INDICATOR_CLASS = “org.glassfish.jersey.servlet.ServletContainer”; static WebApplicationType deduceFromClasspath() { // 如果类门路下有DispatcherHandler并且没有DispatcherServlet,也没有ServletContainer,阐明是响应式Web应用程序 if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null) && !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) { return WebApplicationType.REACTIVE; } // 如果类门路下没有Setvlet相干类,则阐明不是Web应用程序 for (String className : SERVLET_INDICATOR_CLASSES) { if (!ClassUtils.isPresent(className, null)) { return WebApplicationType.NONE; } } // 其余状况示意是一般的Servlet的Web应用程序 return WebApplicationType.SERVLET; }}</code></pre><h3>加载疏导上下文的初始化器</h3><p>接下来是加载疏导上下文的初始化器,即BootstrapRegistryInitializer的实例,咱们能够看一下BootstrapRegistryInitializer的源代码</p><pre><code class=“java”>// BootstrapRegistry的回调接口,在BootstrapRegistry应用之前对BootstrapRegistry进行解决@FunctionalInterfacepublic interface BootstrapRegistryInitializer { void initialize(BootstrapRegistry registry);}</code></pre><p>在这里就不得不先提到疏导上下文BootstrapContext,它是一个小容器,专门在SpringBoot启动过程中疏导应用程序容器启动,而BootstrapContext目前只有惟一一个实现类DefaultBootstrapContext,而它同时实现了BootstrapRegistry。BootsstrapRegistryInitializer就是对这个DefaultBootstrapContext做解决的<br/><br/><br/>而默认状况下,SpringBoot并没有定义任何的BootstrapRegistryInitializer</p><h3>加载应用程序初始化器</h3><p>应用程序初始化器,对应用程序上下文进行初始化解决的</p><pre><code class=“java”>/** * ConfigurableApplicationContext的回调接口,会在refresh办法调用之前对ApplicationContext进行解决 * 个别用于对ApplicationContext进行一些初始化工作,比方注册一个属性源或者激活某个profile * * ApplicationContextInitializer会依照Ordered接口或者@Order注解定义的优先级进行排序 /@FunctionalInterfacepublic interface ApplicationContextInitializer<C extends ConfigurableApplicationContext> { void initialize(C applicationContext);}</code></pre><p>以下是SpringBoot默认提供的应用程序上下文的初始化器<br/><br/></p><h3>加载监听器</h3><pre><code class=“java”>// 应用程序监听器,监听ApplicationEvent接口。是基于观察者模式创立的接口@FunctionalInterfacepublic interface ApplicationListener<E extends ApplicationEvent> extends EventListener { void onApplicationEvent(E event); /* * 静态方法,为音讯类型T创立一个监听器 / static <T> ApplicationListener<PayloadApplicationEvent<T>> forPayload(Consumer<T> consumer) { return event -> consumer.accept(event.getPayload()); }}</code></pre><p>咱们再看看SpringBoot默认提供了哪些利用监听器<br/><br/></p><h3>设置主启动类</h3><pre><code class=“java”>private Class<?> deduceMainApplicationClass() { try { StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); for (StackTraceElement stackTraceElement : stackTrace) { if (“main”.equals(stackTraceElement.getMethodName())) { return Class.forName(stackTraceElement.getClassName()); } } } catch (ClassNotFoundException ex) { // Swallow and continue } return null;}</code></pre><p>这个代码十分有意思,它是手动创立了一个异样,而后追踪异样堆栈信息,找到main办法所在的类,它就是启动类</p><h2>run办法解析</h2><p>看完了SpringApplication的构造方法逻辑,咱们接下来看看run办法的实现</p><pre><code class=“java”>// 创立应用程序的ApplicationContext,并进行刷新启动public ConfigurableApplicationContext run(String… args) { long startTime = System.nanoTime(); // 1. 创立疏导上下文 DefaultBootstrapContext bootstrapContext = createBootstrapContext(); ConfigurableApplicationContext context = null; // 配置无头模式参数,不做剖析 configureHeadlessProperty(); // 2. 创立SpringBootRunListeners,即启动过程中的监听器。在启动过程中会触发这些监听器 SpringApplicationRunListeners listeners = getRunListeners(args); // 触发应用程序开始启动的事件 listeners.starting(bootstrapContext, this.mainApplicationClass); try { // 解析命令行参数,封装到ApplicationArguments ApplicationArguments applicationArguments = new DefaultApplicationArguments(args); // 3. 筹备好Environment ConfigurableEnvironment environment = prepareEnvironment(listeners, bootstrapContext, applicationArguments); configureIgnoreBeanInfo(environment); // 输入banner,不重要,疏忽 Banner printedBanner = printBanner(environment); // 4. 创立应用程序上下文 context = createApplicationContext(); context.setApplicationStartup(this.applicationStartup); // 5. 筹备好应用程序上下文 prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner); // 6. 刷新应用程序上下文 refreshContext(context); // 刷新后的解决,默认没有实现,这个是交给子类实现的 afterRefresh(context, applicationArguments); Duration timeTakenToStartup = Duration.ofNanos(System.nanoTime() - startTime); if (this.logStartupInfo) { new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), timeTakenToStartup); } // 触发启动结束的事件 listeners.started(context, timeTakenToStartup); // 7. 调用SpringRunner callRunners(context, applicationArguments); } catch (Throwable ex) { // 解决启动失败 handleRunFailure(context, ex, listeners); throw new IllegalStateException(ex); } try { Duration timeTakenToReady = Duration.ofNanos(System.nanoTime() - startTime); // 触发筹备结束的事件 listeners.ready(context, timeTakenToReady); } catch (Throwable ex) { // 解决启动失败 handleRunFailure(context, ex, null); throw new IllegalStateException(ex); } return context;}</code></pre><p></p><h3>创立疏导上下文createBootstrapContext</h3><p>SpringApplication会调用createBootstrapContext办法创立疏导上下文</p><pre><code class=“java”>private DefaultBootstrapContext createBootstrapContext() { DefaultBootstrapContext bootstrapContext = new DefaultBootstrapContext(); this.bootstrapRegistryInitializers.forEach((initializer) -> initializer.initialize(bootstrapContext)); return bootstrapContext;}</code></pre><p>这里就能够看到,在SpringApplication构造方法中的BootstrapRegistryInitializers就会利用到DefaultBootstrapContext中。这也是SpringBoot提供的扩大点之一</p><h4>以后扩大点图谱</h4><p></p><h3>创立SpringApplicationRunListeners</h3><pre><code class=“java”>private SpringApplicationRunListeners getRunListeners(String[] args) { Class<?>[] types = new Class<?>[] { SpringApplication.class, String[].class }; return new SpringApplicationRunListeners(logger, getSpringFactoriesInstances(SpringApplicationRunListener.class, types, this, args), this.applicationStartup);}</code></pre><h4>SpringApplicationRunListener</h4><p>SpringApplicationRunListener监听run办法的各个阶段,在不同的阶段监听不同的事件</p><pre><code class=“java”>// 对run办法中的各个阶段进行监听触发,其实现类必须有一个公共结构参数,其承受的参数为// SpringApplication和[]String,前者为SpringApplication的实例,后者为启动应用程序输出的参数public interface SpringApplicationRunListener { /* * 在run办法开始启动时触发 * @param bootstrapContext 疏导上下文 / default void starting(ConfigurableBootstrapContext bootstrapContext) { } /* * 当Environment筹备结束时触发,此时应用程序上下文ApplicationContext还没有被创立 * 触发办法为prepareEnvironment * @param bootstrapContext 疏导上下文 * @param environment Environment实例 / default void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) { } /* * 在应用程序上下文ApplicationContext创立并筹备实现时触发 * 触发办法为prepareContext * @param context 应用程序上下文 / default void contextPrepared(ConfigurableApplicationContext context) { } /* * 在应用程序上下文ApplicationContext载入初始化bean之后触发,此时还未触发上下文的refresh办法 * 触发办法文prepareContext * @param context 应用程序上下文 / default void contextLoaded(ConfigurableApplicationContext context) { } /* * 在应用程序上下文刷新并启动实现之后触发,此时CommandLineRunner和ApplicationRunner还未触发 * 在run办法内触发 * @param context 应用程序上下文 * @param timeTaken 从应用程序启动至触发started事件触发破费的工夫,可能为null * @since 2.6.0 / default void started(ConfigurableApplicationContext context, Duration timeTaken) { started(context); } /* * 晚期的started办法,已弃用 / @Deprecated default void started(ConfigurableApplicationContext context) { } /* * 在应用程序启动并刷新实现,并且所有的CommandLineRunner和ApplicationRunner都运行实现之后触发 * 在run办法内触发 * @param context 应用程序上下文 * @param timeTaken 从应用程序启动至触发ready事件触发破费的事件,可能为null * @since 2.6.0 / default void ready(ConfigurableApplicationContext context, Duration timeTaken) { running(context); } /* * 晚期的ready办法,已弃用 / @Deprecated default void running(ConfigurableApplicationContext context) { } /* * 当启动利用失败时触发 * @param context 应用程序上下文,可能为null * @param exception 导致启动失败的异样 * @since 2.0.0 / default void failed(ConfigurableApplicationContext context, Throwable exception) { }}</code></pre><p>接下来看看SpringBoot默认提供的SpringApplicationRunListener<br/><br/></p><h4>SpringApplicationRunListeners</h4><p>SpringApplicationRunListeners是一个封装类,其中封装了一个SpringApplicationRunListener的列表,当触发某个事件是,就挨个调用其中的SpringApplicationRunListener的对应办法</p><pre><code class=“java”>class SpringApplicationRunListeners { private final Log log; private final List<SpringApplicationRunListener> listeners; private final ApplicationStartup applicationStartup; SpringApplicationRunListeners(Log log, Collection<? extends SpringApplicationRunListener> listeners, ApplicationStartup applicationStartup) { this.log = log; this.listeners = new ArrayList<>(listeners); this.applicationStartup = applicationStartup; } void starting(ConfigurableBootstrapContext bootstrapContext, Class<?> mainApplicationClass) { doWithListeners(“spring.boot.application.starting”, (listener) -> listener.starting(bootstrapContext), (step) -> { if (mainApplicationClass != null) { step.tag(“mainApplicationClass”, mainApplicationClass.getName()); } }); } void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) { doWithListeners(“spring.boot.application.environment-prepared”, (listener) -> listener.environmentPrepared(bootstrapContext, environment)); } void contextPrepared(ConfigurableApplicationContext context) { doWithListeners(“spring.boot.application.context-prepared”, (listener) -> listener.contextPrepared(context)); } void contextLoaded(ConfigurableApplicationContext context) { doWithListeners(“spring.boot.application.context-loaded”, (listener) -> listener.contextLoaded(context)); } void started(ConfigurableApplicationContext context, Duration timeTaken) { doWithListeners(“spring.boot.application.started”, (listener) -> listener.started(context, timeTaken)); } void ready(ConfigurableApplicationContext context, Duration timeTaken) { doWithListeners(“spring.boot.application.ready”, (listener) -> listener.ready(context, timeTaken)); } void failed(ConfigurableApplicationContext context, Throwable exception) { doWithListeners(“spring.boot.application.failed”, (listener) -> callFailedListener(listener, context, exception), (step) -> { step.tag(“exception”, exception.getClass().toString()); step.tag(“message”, exception.getMessage()); }); } private void callFailedListener(SpringApplicationRunListener listener, ConfigurableApplicationContext context, Throwable exception) { try { listener.failed(context, exception); } catch (Throwable ex) { if (exception == null) { ReflectionUtils.rethrowRuntimeException(ex); } if (this.log.isDebugEnabled()) { this.log.error(“Error handling failed”, ex); } else { String message = ex.getMessage(); message = (message != null) ? message : “no error message”; this.log.warn(“Error handling failed (” + message + “)”); } } } private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction) { doWithListeners(stepName, listenerAction, null); } private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction, Consumer<StartupStep> stepAction) { StartupStep step = this.applicationStartup.start(stepName); // 调用每个办法 this.listeners.forEach(listenerAction); if (stepAction != null) { stepAction.accept(step); } step.end(); }}</code></pre><h4>EventPublishingRunListener</h4><p>SpringBoot默认应用EventPublishingRunListener作为run办法的监听者,咱们来看看其源代码</p><pre><code class=“java”>/* * SpringApplicationRunListener 的实现类,它次要是依赖Spring的事件散发机制来触发事件 /public class EventPublishingRunListener implements SpringApplicationRunListener, Ordered { private final SpringApplication application; private final String[] args; private final SimpleApplicationEventMulticaster initialMulticaster; public EventPublishingRunListener(SpringApplication application, String[] args) { this.application = application; this.args = args; this.initialMulticaster = new SimpleApplicationEventMulticaster(); for (ApplicationListener<?> listener : application.getListeners()) { this.initialMulticaster.addApplicationListener(listener); } } @Override public int getOrder() { return 0; } @Override public void starting(ConfigurableBootstrapContext bootstrapContext) { this.initialMulticaster .multicastEvent(new ApplicationStartingEvent(bootstrapContext, this.application, this.args)); } @Override public void environmentPrepared(ConfigurableBootstrapContext bootstrapContext, ConfigurableEnvironment environment) { this.initialMulticaster.multicastEvent( new ApplicationEnvironmentPreparedEvent(bootstrapContext, this.application, this.args, environment)); } @Override public void contextPrepared(ConfigurableApplicationContext context) { this.initialMulticaster .multicastEvent(new ApplicationContextInitializedEvent(this.application, this.args, context)); } @Override public void contextLoaded(ConfigurableApplicationContext context) { for (ApplicationListener<?> listener : this.application.getListeners()) { if (listener instanceof ApplicationContextAware) { ((ApplicationContextAware) listener).setApplicationContext(context); } context.addApplicationListener(listener); } this.initialMulticaster.multicastEvent(new ApplicationPreparedEvent(this.application, this.args, context)); } @Override public void started(ConfigurableApplicationContext context, Duration timeTaken) { context.publishEvent(new ApplicationStartedEvent(this.application, this.args, context, timeTaken)); AvailabilityChangeEvent.publish(context, LivenessState.CORRECT); } @Override public void ready(ConfigurableApplicationContext context, Duration timeTaken) { context.publishEvent(new ApplicationReadyEvent(this.application, this.args, context, timeTaken)); AvailabilityChangeEvent.publish(context, ReadinessState.ACCEPTING_TRAFFIC); } @Override public void failed(ConfigurableApplicationContext context, Throwable exception) { ApplicationFailedEvent event = new ApplicationFailedEvent(this.application, this.args, context, exception); if (context != null && context.isActive()) { // Listeners have been registered to the application context so we should // use it at this point if we can context.publishEvent(event); } else { // An inactive context may not have a multicaster so we use our multicaster to // call all the context’s listeners instead if (context instanceof AbstractApplicationContext) { for (ApplicationListener<?> listener : ((AbstractApplicationContext) context) .getApplicationListeners()) { this.initialMulticaster.addApplicationListener(listener); } } this.initialMulticaster.setErrorHandler(new LoggingErrorHandler()); this.initialMulticaster.multicastEvent(event); } } private static class LoggingErrorHandler implements ErrorHandler { private static final Log logger = LogFactory.getLog(EventPublishingRunListener.class); @Override public void handleError(Throwable throwable) { logger.warn(“Error calling ApplicationEventListener”, throwable); } }}</code></pre><p>从代码中能够看到,EventPublishingRunListener会从SpringApplication中获取其Listener,即后面咱们在构造方法中看到的ApplicationListener实例,在触发事件时,就是利用Spring的事件机制公布事件,触发ApplicationListener进行触发<br/>这里须要留神的是,ApplicationListener的起源是spring.factories,而不是咱们平时应用的@EventListener,也就是说,如果不写入到spring.factories,那么ApplicationListener就不会呈现在这里的EventPublishingRunListener中</p><h4>以后扩大点图谱</h4><p></p><h3>筹备好Environment prepareEnvironment</h3><p>先看源码</p><pre><code class=“java”>private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners, DefaultBootstrapContext bootstrapContext, ApplicationArguments applicationArguments) { // 1. 创立一个Environment实例 ConfigurableEnvironment environment = getOrCreateEnvironment(); // 2. 对Environment进行配置 configureEnvironment(environment, applicationArguments.getSourceArgs()); // 对environment减少configurationProperty的属性源 ConfigurationPropertySources.attach(environment); // 3. 触发监听SpringApplicationRunListener的environmentPrepared事件 listeners.environmentPrepared(bootstrapContext, environment); // 将名为defaultProperties的属性源挪动到最初 DefaultPropertiesPropertySource.moveToEnd(environment); Assert.state(!environment.containsProperty(“spring.main.environment-prefix”), “Environment prefix cannot be set via properties.”); // 将environment的属性设置到SpringApplication中 bindToSpringApplication(environment); // 依据状况对Environment进行一次转换 if (!this.isCustomEnvironment) { EnvironmentConverter environmentConverter = new EnvironmentConverter(getClassLoader()); environment = environmentConverter.convertEnvironmentIfNecessary(environment, deduceEnvironmentClass()); } ConfigurationPropertySources.attach(environment); return environment;}</code></pre><h4>创立Environment实例,getOrCreateEnvironment</h4><pre><code class=“java”>private ConfigurableEnvironment getOrCreateEnvironment() { // 如果以后environment不为空,间接返回 if (this.environment != null) { return this.environment; } // 依据利用类型创立Environment ConfigurableEnvironment environment = this.applicationContextFactory.createEnvironment(this.webApplicationType); // 如果用户本人通过编程形式定制了applicationContextFactory,且其自定义的applicationContextFactory没有胜利创立Environment // 则采纳默认的形式创立一个environment if (environment == null && this.applicationContextFactory != ApplicationContextFactory.DEFAULT) { environment = ApplicationContextFactory.DEFAULT.createEnvironment(this.webApplicationType); } // 反正最初必定会返回一个不为空的Environment return (environment != null) ? environment : new ApplicationEnvironment();}</code></pre><p>这里会应用成员属性applicationContextFactory创立Environment,其是一个ApplicationContextFactory接口类型。默认状况下SpringApplication中applicationContextFactory是DefaultApplicationContextFactory类型的</p><pre><code class=“java”>// SpringApplication中对applicationContextFactory的定义private ApplicationContextFactory applicationContextFactory = ApplicationContextFactory.DEFAULT;// ApplicationContextFactory 中对DEFAULT的定义ApplicationContextFactory DEFAULT = new DefaultApplicationContextFactory();</code></pre><h5>ApplicationContextFactory</h5><p>咱们先来看看ApplicationContextFactory是做啥的</p><pre><code class=“java”>// 是提供给SpringApplication用来创立ConfigurableApplicationContext的策略接口// 创立上下文时不应该扭转其初始的内容,而是交给SpringApplication负责进行配置和刷新@FunctionalInterfacepublic interface ApplicationContextFactory { // 定义了ApplicationContextFactory的默认实现DEFAULT ApplicationContextFactory DEFAULT = new DefaultApplicationContextFactory(); /* * 依据传入的利用类型WebApplicationType返回其冀望的Environment的类型 * 该办法次要用在转换已有的Environment * @param webApplicationType 利用类型 * @since 2.6.14 / default Class<? extends ConfigurableEnvironment> getEnvironmentType(WebApplicationType webApplicationType) { return null; } /* * 依据利用类型WebApplicationType创立Environment,这个Environment随后会被设置到应用程序上下文中 * 请留神,这个办法的返回值必须和getEnvironmentType办法的保持一致 * @param webApplicationType 利用类型 * @since 2.6.14 / default ConfigurableEnvironment createEnvironment(WebApplicationType webApplicationType) { return null; } /* * 创立应用程序上下文 * @param webApplicationType 利用类型 / ConfigurableApplicationContext create(WebApplicationType webApplicationType); /* * 传入一个应用程序上下文类型,创立一个会应用该类型创立上下文的ApplicationContextFactory * @param contextClass 应用程序上下文类型 * @return the factory that will instantiate the context class * @see BeanUtils#instantiateClass(Class) / static ApplicationContextFactory ofContextClass(Class<? extends ConfigurableApplicationContext> contextClass) { return of(() -> BeanUtils.instantiateClass(contextClass)); } //工具办法,与ofContextClass配套应用 static ApplicationContextFactory of(Supplier<ConfigurableApplicationContext> supplier) { return (webApplicationType) -> supplier.get(); }}</code></pre><p>总的来说,ApplicationContextFactory正如其名,次要负责创立应用程序上下文,附带会创立所需的Environment</p><h5>DefaultApplicationContextFactory</h5><p>因而,接下来咱们看一下默认的DefaultApplicationContextFactory是如何创立Environment的</p><pre><code class=“java”>class DefaultApplicationContextFactory implements ApplicationContextFactory { // 省略无关代码 @Override public Class<? extends ConfigurableEnvironment> getEnvironmentType(WebApplicationType webApplicationType) { return getFromSpringFactories(webApplicationType, ApplicationContextFactory::getEnvironmentType, null); } @Override public ConfigurableEnvironment createEnvironment(WebApplicationType webApplicationType) { return getFromSpringFactories(webApplicationType, ApplicationContextFactory::createEnvironment, null); } @Override public ConfigurableApplicationContext create(WebApplicationType webApplicationType) { try { return getFromSpringFactories(webApplicationType, ApplicationContextFactory::create, AnnotationConfigApplicationContext::new); } catch (Exception ex) { throw new IllegalStateException(“Unable create a default ApplicationContext instance, " + “you may need a custom ApplicationContextFactory”, ex); } } /* * 从spring.factories中获取ApplicationContextFactory类型的实例,遍历这些实例创立Environment * @param webApplicationType 利用类型,即后面提到的NONE,SERLVET,REACTIVE * @param action 函数,定义对每个ApplicationContextFactory调用哪个办法进行解决 * @param defaultResult 定义默认值 / private <T> T getFromSpringFactories(WebApplicationType webApplicationType, BiFunction<ApplicationContextFactory, WebApplicationType, T> action, Supplier<T> defaultResult) { for (ApplicationContextFactory candidate : SpringFactoriesLoader.loadFactories(ApplicationContextFactory.class, getClass().getClassLoader())) { T result = action.apply(candidate, webApplicationType); if (result != null) { return result; } } return (defaultResult != null) ? defaultResult.get() : null; }}</code></pre><p>DefaultApplicationContextFactory的设计采纳了组合模式,它自身没有太多逻辑,它的职责是通过SpringFactoriesLoader加载spring.factories中定义的ApplicationContextFactory,而后将相干逻辑交给这些spring.factories中的ApplicationContextFactory进行解决</p><h5>其余ApplicationContextFactory</h5><p>这里又看到了相熟的SpringFactoriesLoader,因而咱们持续看看默认状况下SpringBoot提供了哪些ApplicationContextFactory<br/><br/><br/><br/>简略看看SpringBoot默认提供的这些ApplicationContextFactory</p><pre><code class=“java”>// 对应响应式应用程序public class AnnotationConfigReactiveWebServerApplicationContext extends ReactiveWebServerApplicationContext implements AnnotationConfigRegistry { // 省略无关代码 static class Factory implements ApplicationContextFactory { @Override public Class<? extends ConfigurableEnvironment> getEnvironmentType(WebApplicationType webApplicationType) { return (webApplicationType != WebApplicationType.REACTIVE) ? null : ApplicationReactiveWebEnvironment.class; } @Override public ConfigurableEnvironment createEnvironment(WebApplicationType webApplicationType) { return (webApplicationType != WebApplicationType.REACTIVE) ? null : new ApplicationReactiveWebEnvironment(); } @Override public ConfigurableApplicationContext create(WebApplicationType webApplicationType) { return (webApplicationType != WebApplicationType.REACTIVE) ? null : new AnnotationConfigReactiveWebServerApplicationContext(); } }}// 对应一般Web应用程序public class AnnotationConfigServletWebServerApplicationContext extends ServletWebServerApplicationContext implements AnnotationConfigRegistry { // 省略无关代码 static class Factory implements ApplicationContextFactory { @Override public Class<? extends ConfigurableEnvironment> getEnvironmentType(WebApplicationType webApplicationType) { return (webApplicationType != WebApplicationType.SERVLET) ? null : ApplicationServletEnvironment.class; } @Override public ConfigurableEnvironment createEnvironment(WebApplicationType webApplicationType) { return (webApplicationType != WebApplicationType.SERVLET) ? null : new ApplicationServletEnvironment(); } @Override public ConfigurableApplicationContext create(WebApplicationType webApplicationType) { return (webApplicationType != WebApplicationType.SERVLET) ? null : new AnnotationConfigServletWebServerApplicationContext(); } }}</code></pre><p>这里两个ApplicationContextFactory就别离对应SERVLET和REACTIVE两种利用类型。<br/>咱们常常应用SpringBoot开发Web应用程序,基本上都是SERVLET类型的,所以,在创立Environment时就是ApplicationServletEnvironment。本文的重点不是Environment,因而不做深刻的解析了</p><h4>对Environment进行配置,configureEnvironment</h4><pre><code class=“java”>/* * 模板办法,次要逻辑委托给configurePropertySources和configureProfiles进行解决 * 能够覆写本办法实现对environment的齐全管制 * 或者覆写configurePropertySources和configureProfiles实现部分的管制 * @param environment 应用程序的Environment * @param args 传递给run办法的参数列表 /protected void configureEnvironment(ConfigurableEnvironment environment, String[] args) { // 1. 为environment设置上转换服务ConversionService if (this.addConversionService) { environment.setConversionService(new ApplicationConversionService()); } // 2. 配置属性源 configurePropertySources(environment, args); // 3. 配置profiles configureProfiles(environment, args);}</code></pre><h5>设置转换服务ConversionService</h5><p>这里咱们简略看一下ConversionService是做啥的</p><pre><code class=“java”>/* * 用于类型转换的服务接口,ConversionService是Spring类型转换零碎的入口 * 调用convert(Object, class)能够进行一个线程平安的转换 * @since 3.0 /public interface ConversionService { /* * 判断类型sourceType是否能够转换为targetType类型 * 如果返回true,阐明能够通过convert(Object, Class)进行转换 * * 对于汇合,数组,map这些容器类型须要特地留神: * 对于这几个类型之间的互相转换,这个办法将总是返回true,即便其元素类型的转换会产生异样,也会返回true * 这就须要调用者自行处理ConversionException异样了 * @param sourceType 源类型,如果source自身就是null,则传入null * @param targetType 指标类型 * @throws 如果targetType为空,则会抛出非法参数异样 / boolean canConvert(@Nullable Class<?> sourceType, Class<?> targetType); // 和前一个函数性能一样,只是参数不一样了 boolean canConvert(@Nullable TypeDescriptor sourceType, TypeDescriptor targetType); /* * 将指定的source转换为指标类型target * @param source 数据源,可为null * @param targetType 指标类型,不可为null * @return 转换后果,targetType的实例 * @throws ConversionException 转换异样 * @throws IllegalArgumentException 如果targetType为null,抛出该异样 / @Nullable <T> T convert(@Nullable Object source, Class<T> targetType); // 和前一个函数性能一样,只是参数不一样了 @Nullable Object convert(@Nullable Object source, @Nullable TypeDescriptor sourceType, TypeDescriptor targetType);}</code></pre><p>简略来说,ConversionService负责转换类型,将某个source转成指标类型。因为Environment接口实现了PropertyResolver,其中有一个办法为</p><pre><code class=“java”>// 获取key的属性值,并依照targetType进行返回@Nullable<T> T getProperty(String key, Class<T> targetType);</code></pre><p>因而,Environment借助了ConversionService来实现将属性值转换成targetType的性能</p><h5>配置属性源 configurePropertySources</h5><pre><code class=“java”>/* * 增加,删除或者重排序environment中的PropertySource的程序 * @param environment 应用程序的Environment实例 * @param args 传递给run办法的参数 /protected void configurePropertySources(ConfigurableEnvironment environment, String[] args) { MutablePropertySources sources = environment.getPropertySources(); if (!CollectionUtils.isEmpty(this.defaultProperties)) { DefaultPropertiesPropertySource.addOrMerge(this.defaultProperties, sources); } // addConmandLineProperties: 是否要将命令行参数作为属性源增加到Environment中,默认为true if (this.addCommandLineProperties && args.length > 0) { // 将命令行参数作为属性源增加到Environment中 String name = CommandLinePropertySource.COMMAND_LINE_PROPERTY_SOURCE_NAME; if (sources.contains(name)) { // 如果Environment中曾经蕴含了同名的属性源,则将这两个属性源合并后替换到原来的 PropertySource<?> source = sources.get(name); CompositePropertySource composite = new CompositePropertySource(name); composite.addPropertySource( new SimpleCommandLinePropertySource(“springApplicationCommandLineArgs”, args)); composite.addPropertySource(source); sources.replace(name, composite); } else { // 将命令行参数放到第一优先级 sources.addFirst(new SimpleCommandLinePropertySource(args)); } }}</code></pre><h5>配置profiles configureProfiles</h5><pre><code class=“java”>/* * 能够在这里配置激活哪个profile,这和spring.profiles.active并不抵触。默认不激活任何profile * @param environment Environment实例 * @param args 传递给run办法的参数 */protected void configureProfiles(ConfigurableEnvironment environment, String[] args) {}</code></pre><h4>触发监听SpringApplicationRunListener的environmentPrepared事件</h4><p>这里对environmentPrepared事件须要非凡介绍的起因是这外面还包含一个扩大点,咱们来剖析一下<br/>后面剖析中提到,ApplicationListener也是SpringBoot提供的一个非凡扩大点,他是由默认的EventPublishingRunListener(SpringApplicationRunListener的实现)并联合事件机制实现的。而SpringBoot默认提供的ApplicationListener中有一个EnvironmentPostProcessorApplicationListener,咱们来剖析这个EnvironmentPostProcessorApplicationListener<br/><br/></p><h5>EnvironmentPostProcessorApplicationListener</h5><pre><code class=“java”>public class EnvironmentPostProcessorApplicationListener implements SmartApplicationListener, Ordered { public static final int DEFAULT_ORDER = Ordered.HIGHEST_PRECEDENCE + 10; private final DeferredLogs deferredLogs; private int order = DEFAULT_ORDER; private final Function<ClassLoader, EnvironmentPostProcessorsFactory> postProcessorsFactory; // 能够回到后面的章节,在SpringApplication构造函数中创立ApplicationListener时,调用的是无参构造方法 public EnvironmentPostProcessorApplicationListener() { this(EnvironmentPostProcessorsFactory::fromSpringFactories, new DeferredLogs()); } public EnvironmentPostProcessorApplicationListener(EnvironmentPostProcessorsFactory postProcessorsFactory) { this((classloader) -> postProcessorsFactory, new DeferredLogs()); } EnvironmentPostProcessorApplicationListener( Function<ClassLoader, EnvironmentPostProcessorsFactory> postProcessorsFactory, DeferredLogs deferredLogs) { this.postProcessorsFactory = postProcessorsFactory; this.deferredLogs = deferredLogs; } // 返回监听的事件类型,次要有三类事件 // 1. ApplicationEnvironmentPreparedEvent // 2. ApplicationPreparedEvent // 3. ApplicationFailedEvent @Override public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) { return ApplicationEnvironmentPreparedEvent.class.isAssignableFrom(eventType) || ApplicationPreparedEvent.class.isAssignableFrom(eventType) || ApplicationFailedEvent.class.isAssignableFrom(eventType); } // 监听入口,能够看到最初会调用onApplicationEnvironmentPreparedEvent进行解决 @Override public void onApplicationEvent(ApplicationEvent event) { if (event instanceof ApplicationEnvironmentPreparedEvent) { onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event); } if (event instanceof ApplicationPreparedEvent) { onApplicationPreparedEvent(); } if (event instanceof ApplicationFailedEvent) { onApplicationFailedEvent(); } } // 最初是遍历成员属性postProcessorsFactory获取到EnvironmentPostProcessor private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) { ConfigurableEnvironment environment = event.getEnvironment(); SpringApplication application = event.getSpringApplication(); for (EnvironmentPostProcessor postProcessor : getEnvironmentPostProcessors(application.getResourceLoader(), event.getBootstrapContext())) { postProcessor.postProcessEnvironment(environment, application); } } private void onApplicationPreparedEvent() { finish(); } private void onApplicationFailedEvent() { finish(); } private void finish() { this.deferredLogs.switchOverAll(); } List<EnvironmentPostProcessor> getEnvironmentPostProcessors(ResourceLoader resourceLoader, ConfigurableBootstrapContext bootstrapContext) { ClassLoader classLoader = (resourceLoader != null) ? resourceLoader.getClassLoader() : null; EnvironmentPostProcessorsFactory postProcessorsFactory = this.postProcessorsFactory.apply(classLoader); return postProcessorsFactory.getEnvironmentPostProcessors(this.deferredLogs, bootstrapContext); } @Override public int getOrder() { return this.order; } public void setOrder(int order) { this.order = order; }}</code></pre><p>这里能够看到EnvironmentPostProcessorApplicationListener的事件处理逻辑是调用外部的EnvironmentPostProcessor进行解决,而EnvironmentPostProcessor则是通过成员属性postProcessorsFactory获取到的。默认状况下,SpringBoot会调用EnvironmentPostProcessorApplicationListener的无参构造方法创立对应的监听请,而其无参构造方法中则是通过EnvironmentPostProcessorsFactory静态方法fromSpringFactories获取,对应源代码为:</p><pre><code class=“java”>static EnvironmentPostProcessorsFactory fromSpringFactories(ClassLoader classLoader) { return new ReflectionEnvironmentPostProcessorsFactory(classLoader, SpringFactoriesLoader.loadFactoryNames(EnvironmentPostProcessor.class, classLoader));}</code></pre><p>该代码会返回一个ReflectionEnvironmentPostProcessorsFactory,同时这里也看到了相熟的SpringFactoriesLoader<br/>咱们挨个来剖析</p><h5>ReflectionEnvironmentPostProcessorsFactory</h5><pre><code class=“java”>class ReflectionEnvironmentPostProcessorsFactory implements EnvironmentPostProcessorsFactory { private final List<Class<?>> classes; private ClassLoader classLoader; private final List<String> classNames; ReflectionEnvironmentPostProcessorsFactory(Class<?>… classes) { this.classes = new ArrayList<>(Arrays.asList(classes)); this.classNames = null; } ReflectionEnvironmentPostProcessorsFactory(ClassLoader classLoader, String… classNames) { this(classLoader, Arrays.asList(classNames)); } // EnvironmentPostProcessorsFactory.fromSpringFactories调用的构造函数 ReflectionEnvironmentPostProcessorsFactory(ClassLoader classLoader, List<String> classNames) { this.classes = null; this.classLoader = classLoader; this.classNames = classNames; } // 外围代码,EnvironmentPostProcessorApplicationListener 会调用这个办法来获取到 // EnvironmentPostProcessor @Override public List<EnvironmentPostProcessor> getEnvironmentPostProcessors(DeferredLogFactory logFactory, ConfigurableBootstrapContext bootstrapContext) { Instantiator<EnvironmentPostProcessor> instantiator = new Instantiator<>(EnvironmentPostProcessor.class, (parameters) -> { parameters.add(DeferredLogFactory.class, logFactory); parameters.add(Log.class, logFactory::getLog); parameters.add(ConfigurableBootstrapContext.class, bootstrapContext); parameters.add(BootstrapContext.class, bootstrapContext); parameters.add(BootstrapRegistry.class, bootstrapContext); }); return (this.classes != null) ? instantiator.instantiateTypes(this.classes) : instantiator.instantiate(this.classLoader, this.classNames); }}</code></pre><p>能够看到,ReflectionEnvironmentPostProcessorsFactory的性能就是接管spring.factories中指定的EnvironmentPostProcessor类型,并实例化后交给EnvironmentPostProcessorApplicationListener来触发</p><h5>关系图</h5><p>上面是整顿的关系图,能够帮忙理清相干关系<br/></p><h4>扩大点</h4><p></p><h3>创立应用程序上下文 createApplicationContext</h3><pre><code class=“java”>protected ConfigurableApplicationContext createApplicationContext() { return this.applicationContextFactory.create(this.webApplicationType);}</code></pre><p>这里就是调用ApplicationContextFactory进行创立Context<br/>依据前文的源码剖析咱们能够晓得,对于咱们罕用的Web应用程序来说,其ApplicationContextFactory是AnnotationConfigServletWebServerApplicationContext.Factory。其相干源码在前文能够查阅</p><h3>筹备应用程序上下文 preparedContext</h3><pre><code class=“java”>private void prepareContext(DefaultBootstrapContext bootstrapContext, ConfigurableApplicationContext context, ConfigurableEnvironment environment, SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) { // 设置Environment context.setEnvironment(environment); // 1. 对context进行后置解决 postProcessApplicationContext(context); // 2. 利用初始化器 applyInitializers(context); // 触发ContextPreparedEvent事件 listeners.contextPrepared(context); // 在疏导上下文中触发BootstrapContextClosedEvent事件 bootstrapContext.close(context); if (this.logStartupInfo) { logStartupInfo(context.getParent() == null); logStartupProfileInfo(context); } // 增加SpringBoot特有的一些单例bean到应用程序上下文中 ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); beanFactory.registerSingleton(“springApplicationArguments”, applicationArguments); if (printedBanner != null) { beanFactory.registerSingleton(“springBootBanner”, printedBanner); } if (beanFactory instanceof AbstractAutowireCapableBeanFactory) { ((AbstractAutowireCapableBeanFactory) beanFactory).setAllowCircularReferences(this.allowCircularReferences); if (beanFactory instanceof DefaultListableBeanFactory) { ((DefaultListableBeanFactory) beanFactory) .setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding); } } // 增加懒加载相干的BeanFactoryPostProcessor if (this.lazyInitialization) { context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor()); } context.addBeanFactoryPostProcessor(new PropertySourceOrderingBeanFactoryPostProcessor(context)); // 3. 对source进行解决,在这里咱们能够提前注册一些bean到应用程序上下文中 Set<Object> sources = getAllSources(); Assert.notEmpty(sources, “Sources must not be empty”); load(context, sources.toArray(new Object[0])); listeners.contextLoaded(context);}</code></pre><h4>对context进行后置解决 postProcessApplicationContext</h4><pre><code class=“java”>protected void postProcessApplicationContext(ConfigurableApplicationContext context) { // 注册单例的beanNameGenerator,它的性能是生成bean的名称 if (this.beanNameGenerator != null) { context.getBeanFactory().registerSingleton(AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR, this.beanNameGenerator); } // 设置资源加载器 if (this.resourceLoader != null) { if (context instanceof GenericApplicationContext) { ((GenericApplicationContext) context).setResourceLoader(this.resourceLoader); } if (context instanceof DefaultResourceLoader) { ((DefaultResourceLoader) context).setClassLoader(this.resourceLoader.getClassLoader()); } } // 设置转换服务 if (this.addConversionService) { context.getBeanFactory().setConversionService(context.getEnvironment().getConversionService()); }}</code></pre><p>这个后置解决就是减少一些bean,设置一些字段到context中</p><h4>利用初始化器 applyInitializers</h4><pre><code class=“java”>protected void applyInitializers(ConfigurableApplicationContext context) { for (ApplicationContextInitializer initializer : getInitializers()) { Class<?> requiredType = GenericTypeResolver.resolveTypeArgument(initializer.getClass(), ApplicationContextInitializer.class); Assert.isInstanceOf(requiredType, context, “Unable to call initializer.”); initializer.initialize(context); }}</code></pre><p>能够看到,这里是获取了SpringApplication外部的初始化器,对context进行初始化操作。而这里的initializers是在SpringApplication构造函数中实现加载的,能够回到后面看一下,它也是从spring.factories中获取的</p><h4>对source进行解决</h4><p>source是SpringBoot提供的一种注册bean的形式,souce能够是一个class,能够是一个包Package,能够是一个XML文件或者Groovy脚本的Resource,能够是上述三种的字符串形容<br/>SpringApplication中用成员属性sources来保留这些资源</p><pre><code class=“java”>protected void load(ApplicationContext context, Object[] sources) { if (logger.isDebugEnabled()) { logger.debug(“Loading source " + StringUtils.arrayToCommaDelimitedString(sources)); } // 结构一个BeanDefinitionLoader,用于从sources中加载BeanDefinition,将其注册到context中去 BeanDefinitionLoader loader = createBeanDefinitionLoader(getBeanDefinitionRegistry(context), sources); if (this.beanNameGenerator != null) { loader.setBeanNameGenerator(this.beanNameGenerator); } if (this.resourceLoader != null) { loader.setResourceLoader(this.resourceLoader); } if (this.environment != null) { loader.setEnvironment(this.environment); } // 进行加载 loader.load();}</code></pre><p>这里就不进行深刻的源码解析了,总结一下source状况</p><ul><li>如果source是一个Class类型,或者其是一个Class的全限定名字符串,则会将其对应的类注册到context中,非凡状况是Groovy脚本(这种状况没见到过,然而BeanDefinitionLoader的确会进行非凡解决)</li><li>如果source是一个Package类型,或者其是一个包名的字符串,则会进行扫描,相似于ComponentScan</li><li><p>如果source是一个Resource类型,或者是一个资源的字符串表白,则会尝试将其作为XML配置文件,或者Groovy脚本文件进行加载注册</p><h4>扩大点</h4><p>某种意义上,source也是一个扩大点,但思考到很少用,暂不退出<br/><br/></p><h3>刷新应用程序上下文 refreshContext</h3><pre><code class=“java”>private void refreshContext(ConfigurableApplicationContext context) { if (this.registerShutdownHook) { shutdownHook.registerApplicationContext(context); } refresh(context);}protected void refresh(ConfigurableApplicationContext applicationContext) { applicationContext.refresh();}</code></pre><p>这里的代码比较简单,仅仅是调用applicationContext的刷新函数refresh即可。其外部是AbastactApplicationContext的刷新流程,本文暂不涉略其中</p><h3>调用SpringRunner callRunners</h3><pre><code class=“java”>private void callRunners(ApplicationContext context, ApplicationArguments args) { List<Object> runners = new ArrayList<>(); // 从应用程序上下文中获取所有ApplicationRunner的实例 runners.addAll(context.getBeansOfType(ApplicationRunner.class).values()); // 从应用程序上下文中获取所有CommandLineRunner的实例 runners.addAll(context.getBeansOfType(CommandLineRunner.class).values()); // 依照Ordered接口或者Order注解排序 AnnotationAwareOrderComparator.sort(runners); // 遍历,调用办法 for (Object runner : new LinkedHashSet<>(runners)) { if (runner instanceof ApplicationRunner) { callRunner((ApplicationRunner) runner, args); } if (runner instanceof CommandLineRunner) { callRunner((CommandLineRunner) runner, args); } }}private void callRunner(ApplicationRunner runner, ApplicationArguments args) { try { (runner).run(args); } catch (Exception ex) { throw new IllegalStateException(“Failed to execute ApplicationRunner”, ex); }}private void callRunner(CommandLineRunner runner, ApplicationArguments args) { try { (runner).run(args.getSourceArgs()); } catch (Exception ex) { throw new IllegalStateException(“Failed to execute CommandLineRunner”, ex); }}</code></pre><p>callRunners的办法比较简单,就是从容器中获取到ApplicationRunner和CommandLineRunner,调用其run办法<br/>这也算一个扩大点</p><h4>扩大点</h4><p></p><h2>总结</h2><p>SpringBoot的启动是一个非常复杂的流程,本文仅仅对SpringBoot的启动做了一些简要的梳理,同时总结了一些比拟常见的SpringBoot的扩大点</p></li></ul><p>本文由mdnice多平台公布</p></article> ...

February 12, 2024 · 13 min · jiezi

关于程序员:Go高级并发模式

<article class=“article fmt article-content”><blockquote><em>Go对并发提供了弱小的原生反对,本文探讨Go的高级并发模式,了解这些并发模式,能够帮忙咱们编写高效的Go应用程序。原文: Advanced Concurrency Patterns in Go</em></blockquote><p></p><p><em>“并发不是并行,但使并行成为可能。"</em> —— Rob Pike</p><p>本文将深入探讨Go中的一些高级并发模式。Go以其内置的并发原语而闻名,了解这些模式能够帮忙咱们编写更高效、可扩大的应用程序。</p><hr/><h4>1. 根底Goroutine</h4><p>goroutine是由Go运行时治理的轻量级线程。要启动一个goroutine,只需在函数前应用<code>go</code>关键字。</p><pre><code class=“golang”>package mainimport ( “fmt” “time”)func sayHello() { fmt.Println(“Hello from a goroutine!”)}func main() { go sayHello() // This starts a new goroutine. time.Sleep(1 * time.Second) // Give goroutine some time to execute.}</code></pre><p><em>在本例中,<code>sayHello</code>函数与<code>main</code>函数并发运行。</em></p><hr/><h4>2. Channel和Select</h4><p>channel用于在程序之间进行通信,同步执行并确保数据安全。</p><p><strong>根底channel示例</strong></p><pre><code class=“golang”>package mainimport “fmt"func main() { message := make(chan string) // create a new channel go func() { // start a goroutine message <- “Hello from the other side!” // send a message to the channel }() msg := <-message // receive a message from the channel fmt.Println(msg)}</code></pre><p><em>咱们能够通过channel平安的在例程之间发送和接管音讯。</em></p><p><strong>应用Select</strong></p><p><code>select</code>容许程序期待多个通信操作,它就像一个针对channel的switch语句。</p><pre><code class=“golang”>package mainimport ( “fmt” “time”)func main() { ch1 := make(chan string) ch2 := make(chan string) go func() { for { ch1 <- “from ch1” time.Sleep(2 * time.Second) } }() go func() { for { ch2 <- “from ch2” time.Sleep(3 * time.Second) } }() go func() { for { select { case msg1 := <-ch1: fmt.Println(msg1) case msg2 := <-ch2: fmt.Println(msg2) } } }() select {} // keep the main function alive}</code></pre><p><em>基于<code>select</code>,咱们能够同时解决多个channel。</em></p><hr/><h4>3. 高级模式: 工作池(Worker Pool)</h4><p>工作池是一种限度运行的goroutine数量的办法。</p><p><strong>工作池示例</strong></p><pre><code class=“golang”>package mainimport ( “fmt” “time”)func worker(id int, jobs <-chan int, results chan<- int) { for j := range jobs { fmt.Println(“worker”, id, “processing job”, j) time.Sleep(time.Second) results <- j * 2 }}func main() { const numJobs = 5 jobs := make(chan int, numJobs) results := make(chan int, numJobs) // start 3 workers for w := 1; w <= 3; w++ { go worker(w, jobs, results) } // send jobs for j := 1; j <= numJobs; j++ { jobs <- j } close(jobs) // collect results for a := 1; a <= numJobs; a++ { <-results }}</code></pre><p><em>工作池帮忙咱们治理和限度并发运行的goroutine数量。</em></p><hr/><h4>论断</h4><p>Go中的并发(goroutine、channel和模式)为开发人员提供了弱小的工具集。通过了解和利用这些概念,能够构建高性能和可伸缩的应用程序。</p><hr/><blockquote>你好,我是俞凡,在Motorola做过研发,当初在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓重的趣味,平时喜爱浏览、思考,置信继续学习、一生成长,欢送一起交流学习。为了不便大家当前能第一工夫看到文章,请敌人们关注公众号"DeepNoMind”,并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的反对和能源,激励我继续写下去,和大家独特成长提高!</blockquote><p>本文由mdnice多平台公布</p></article> ...

February 12, 2024 · 2 min · jiezi

关于程序员:10分钟搞懂20个Golang最佳实践

<article class=“article fmt article-content”><blockquote><em>最佳实际是一些不成文的经验总结,遵循最佳实际能够使咱们站在前人的肩膀上,防止某些常见谬误,写出更好的代码。原文: Golang Best Practices (Top 20)</em></blockquote><p>只须要花上10分钟浏览本文,就能够帮忙你更高效编写Go代码。</p><h5>20: 应用适当缩进</h5><p>良好的缩进使代码更具可读性,始终应用制表符或空格(最好是制表符),并遵循Go规范的缩进约定。</p><pre><code class=“golang”>package mainimport “fmt"func main() { for i := 0; i < 5; i++ { fmt.Println(“Hello, World!”) }}</code></pre><p>运行<code>gofmt</code>依据Go规范主动格式化(缩进)代码。</p><pre><code class=“bash”>$ gofmt -w your_file.go</code></pre><h5>19: 正确导入软件包</h5><p>只导入须要的包,并格式化导入局部,将规范库包、第三方包和本人的包分组。</p><pre><code class=“golang”>package mainimport ( “fmt” “math/rand” “time”)</code></pre><h5>18: 应用描述性变量名和函数名</h5><ol><li><strong><em>有意义的名称:</em></strong> 应用可能传播变量用处的名称。</li><li><strong><em>驼峰表示法(CamelCase):</em></strong> 以小写字母结尾,前面每个单词的首字母大写。</li><li><strong>简短的名称:</strong> 简短、简洁的名称对于作用域小、寿命短的变量是能够承受的。</li><li><strong><em>不应用缩写:</em></strong> 防止应用费解的缩写和首字母缩略词,尽量应用描述性名称。</li><li><strong><em>一致性:</em></strong> 在整个代码库中放弃命名一致性。</li></ol><pre><code class=“golang”>package mainimport “fmt"func main() { //应用有意义的名称申明变量 userName := “John Doe” // CamelCase:以小写字母结尾,前面的单词大写。 itemCount := 10 // 简短的名称:对于小作用域变量来说,短而简洁。 isReady := true // 不应用缩写:防止应用费解的缩写或首字母缩写。 // 显示变量值 fmt.Println(“User Name:”, userName) fmt.Println(“Item Count:”, itemCount) fmt.Println(“Is Ready:”, isReady)}// 对包级变量应用mixedCasevar exportedVariable int = 42// 函数名应该是描述性的func calculateSumOfNumbers(a, b int) int { return a + b}// 一致性:在整个代码库中放弃命名的一致性。</code></pre><h5>17: 限度每行长度</h5><p>尽可能将每行代码字符数管制在80个以下,以进步可读性。</p><pre><code class=“golang”>package mainimport ( “fmt” “math”)func main() { result := calculateHypotenuse(3, 4) fmt.Println(“Hypotenuse:”, result)}func calculateHypotenuse(a, b float64) float64 { return math.Sqrt(aa + bb)}</code></pre><h5>16: 将魔法值定义为常量</h5><p>防止在代码中应用魔法值。魔法值是硬编码的数字或字符串,扩散在代码中,不足上下文,很难了解其目标。将魔法值定义为常量,能够使代码更易于保护。</p><pre><code class=“golang”>package mainimport “fmt"const ( // 为重试的最大次数定义常量 MaxRetries = 3 // 为默认超时(以秒为单位)定义常量 DefaultTimeout = 30)func main() { retries := 0 timeout := DefaultTimeout for retries < MaxRetries { fmt.Printf(“Attempting operation (Retry %d) with timeout: %d seconds\n”, retries+1, timeout) // … 代码逻辑 … retries++ }}</code></pre><h5>15. 错误处理</h5><p>Go激励开发者显式处理错误,起因如下:</p><ol><li><strong><em>安全性:</em></strong> 错误处理确保意外问题不会导致程序panic或忽然解体。</li><li><strong><em>清晰性:</em></strong> 显式错误处理使代码更具可读性,并有助于辨认可能产生谬误的中央。</li><li><strong><em>可调试性:</em></strong> 处理错误为调试和故障排除提供了有价值的信息。</li></ol><p>咱们创立一个简略程序来读取文件并正确处理错误:</p><pre><code class=“golang”>package mainimport ( “fmt” “os”)func main() { // Open a file file, err := os.Open(“example.txt”) if err != nil { // 处理错误 fmt.Println(“Error opening the file:”, err) return } defer file.Close() // 完结时敞开文件 // 读取文件内容 buffer := make([]byte, 1024) _, err = file.Read(buffer) if err != nil { // 处理错误 fmt.Println(“Error reading the file:”, err) return } // 打印文件内容 fmt.Println(“File content:”, string(buffer))}</code></pre><h5>14. 防止应用全局变量</h5><p>尽量减少应用全局变量,全局变量可能导致不可预测的行为,使调试变得艰难,并妨碍代码重用,还会在程序的不同局部之间引入不必要的依赖关系。相同,通过函数参数传递数据并返回值。</p><p>咱们编写一个简略的Go程序来阐明防止全局变量的概念:</p><pre><code class=“golang”>package mainimport ( “fmt”)func main() { // 在main函数中申明并初始化变量 message := “Hello, Go!” // 调用应用局部变量的函数 printMessage(message)}// printMessage是带参数的函数func printMessage(msg string) { fmt.Println(msg)}</code></pre><h5>13: 应用构造体解决简单数据</h5><p>通过构造体将相干的数据字段和办法组合在一起,使代码更有组织性和可读性。</p><p>上面是一个残缺示例程序,演示了构造体在Go中的利用:</p><pre><code class=“golang”>package mainimport ( “fmt”)// 定义名为Person的构造体来示意人的信息。type Person struct { FirstName string // 名字 LastName string // 姓氏 Age int // 年龄}func main() { // 创立Person构造的实例并初始化字段。 person := Person{ FirstName: “John”, LastName: “Doe”, Age: 30, } // 拜访并打印构造体字段的值。 fmt.Println(“First Name:”, person.FirstName) // 打印名字 fmt.Println(“Last Name:”, person.LastName) // 打印姓氏 fmt.Println(“Age:”, person.Age) // 打印年龄}</code></pre><h5>12. 对代码进行正文</h5><p>增加正文来解释代码的性能,特地是对于简单或不显著的局部。</p><p><strong>单行正文</strong></p><p>单行正文以<code>//</code>结尾,用来解释特定的代码行。</p><pre><code class=“golang”>package mainimport “fmt"func main() { // 单行正文 fmt.Println(“Hello, World!”) // 打印问候语}</code></pre><p><strong>多行正文</strong></p><p>多行正文蕴含在<code>/ /</code>中,用于较长的解释或逾越多行的正文。</p><pre><code class=“golang”>package mainimport “fmt"func main() { / 多行正文。 能够逾越多行。 */ fmt.Println(“Hello, World!”) // 打印问候语}</code></pre><p><strong>函数正文</strong></p><p>在函数中增加正文,解释函数的用处、参数和返回值。函数正文应用’<em>godoc</em>‘款式。</p><pre><code class=“golang”>package mainimport “fmt”// greetUser通过名称向用户示意欢送。// Parameters:// name (string): 欢送的用户名// Returns:// string: 问候语func greetUser(name string) string { return “Hello, " + name + “!"}func main() { userName := “Alice” greeting := greetUser(userName) fmt.Println(greeting)}</code></pre><p><strong>包正文</strong></p><p>在Go文件顶部增加正文来形容包的用处,应用雷同的’<em>godoc</em>‘款式。</p><pre><code class=“golang”>package mainimport “fmt”// 这是Go程序的主包。// 蕴含入口(main)函数。func main() { fmt.Println(“Hello, World!”)}</code></pre><h5>11: 应用goroutine解决并发</h5><p>利用goroutine来高效执行并发操作。在Go语言中,gooutine是轻量级的并发执行线程,可能并发的运行函数,而没有传统线程的开销。从而帮忙咱们编写高度并发和高效的程序。</p><p>咱们用一个简略的例子来阐明:</p><pre><code class=“golang”>package mainimport ( “fmt” “time”)// 并发运行的函数func printNumbers() { for i := 1; i <= 5; i++ { fmt.Printf("%d “, i) time.Sleep(100 * time.Millisecond) }}// 在主goroutine中运行的函数func main() { // 开始goroutine go printNumbers() // 继续执行main for i := 0; i < 2; i++ { fmt.Println(“Hello”) time.Sleep(200 * time.Millisecond) } // 确保在goroutine在退出前实现 time.Sleep(1 * time.Second)}</code></pre><h5>10: 用Recover解决panic</h5><p>应用<code>recover</code>来优雅解决panic和避免程序解体。在Go中,panic是可能导致程序解体的意外运行时谬误。然而,Go提供了一种名为<code>recover</code>的机制来优雅的解决panic。</p><p>咱们用一个简略的例子来阐明:</p><pre><code class=“golang”>package mainimport “fmt”// 可能会panic的函数func riskyOperation() { defer func() { if r := recover(); r != nil { // 从panic中Recover,并优雅解决 fmt.Println(“Recovered from panic:”, r) } }() // 模仿panic条件 panic(“Oops! Something went wrong.”)}func main() { fmt.Println(“Start of the program.”) // 在从panic中复原的函数中调用有危险的操作 riskyOperation() fmt.Println(“End of the program.”)}</code></pre><h5>9. 防止应用’init’函数</h5><p>除非必要,否则防止应用<code>init</code>函数,因为这会使代码更难了解和保护。</p><p>更好的办法是将初始化逻辑移到显式调用的惯例函数中,通常从<code>main</code>中调用,从而提供了更好的管制,加强了代码可读性,并简化了测试。</p><p>上面是一个简略的Go程序,演示了如何防止应用<code>init</code>函数:</p><pre><code class=“golang”>package mainimport ( “fmt”)// InitializeConfig初始化配置func InitializeConfig() { // 初始化配置参数 fmt.Println(“Initializing configuration…”)}// InitializeDatabase初始化数据库连贯func InitializeDatabase() { // 初始化数据库连贯 fmt.Println(“Initializing database…”)}func main() { // 显示调用初始化函数 InitializeConfig() InitializeDatabase() // 主代码逻辑 fmt.Println(“Main program logic…”)}</code></pre><h5>8: 应用Defer进行资源清理</h5><p><code>defer</code>能够将函数的执行提早到函数返回的时候,通常用于敞开文件、解锁互斥锁或开释其余资源等工作。</p><p>这确保了即便在存在谬误的状况下也能执行清理操作。</p><p>咱们创立一个简略的程序,从文件中读取数据,应用<code>defer</code>确保文件被正确敞开,不必管可能产生的任何谬误:</p><pre><code class=“golang”>package mainimport ( “fmt” “os”)func main() { // 关上文件(用理论文件名替换"example.txt”) file, err := os.Open(“example.txt”) if err != nil { fmt.Println(“Error opening the file:”, err) return // Exit the program on error } defer file.Close() // 确保函数退出时敞开文件 // 读取并打印文件内容 data := make([]byte, 100) n, err := file.Read(data) if err != nil { fmt.Println(“Error reading the file:”, err) return // 出错退出程序 } fmt.Printf(“Read %d bytes: %s\n”, n, data[:n])}</code></pre><h5>7: 抉择复合字面值而不是构造函数</h5><p>应用复合字面值来创立struct实例,而不是构造函数。</p><p><strong>为什么要应用复合文字?</strong></p><p>复合字面值提供了几个长处:</p><ol><li>简洁</li><li>易读</li><li>灵便</li></ol><p>咱们用一个简略例子来阐明:</p><pre><code class=“golang”>package mainimport ( “fmt”)// 定义一个示意人的构造类型type Person struct { FirstName string // 名字 LastName string // 姓氏 Age int // 年龄}func main() { // 应用复合字面量创立Person实例 person := Person{ FirstName: “John”, // 初始化FirstName字段 LastName: “Doe”, // 初始化LastName字段 Age: 30, // 初始化Age字段 } // Printing the person’s information fmt.Println(“Person Details:”) fmt.Println(“First Name:”, person.FirstName) // 拜访并打印FirstName字段 fmt.Println(“Last Name:”, person.LastName) // 拜访并打印LastName字段 fmt.Println(“Age:”, person.Age) // 拜访并打印Age字段}</code></pre><h5>6. 最小化性能参数</h5><p>在Go中,编写洁净高效的代码至关重要。实现这一点的一种办法是尽量减少函数参数的数量,从而进步代码的可维护性和可读性。</p><p>咱们用一个简略例子来阐明:</p><pre><code class=“golang”>package mainimport “fmt”// Option构造保留配置参数type Option struct { Port int Timeout int}// ServerConfig是承受Option构造作为参数的函数func ServerConfig(opt Option) { fmt.Printf(“Server configuration - Port: %d, Timeout: %d seconds\n”, opt.Port, opt.Timeout)}func main() { // 创立Option构造并初始化为默认值 defaultConfig := Option{ Port: 8080, Timeout: 30, } // 用默认值配置服务 ServerConfig(defaultConfig) // 创立新的Option构造并批改端口 customConfig := Option{ Port: 9090, } // 用自定义端口和默认Timeout配置服务 ServerConfig(customConfig)}</code></pre><p>在这个例子中,咱们定义了一个<code>Option</code>构造体来保留服务器配置参数。咱们没有向<code>ServerConfig</code>函数传递多个参数,而是应用<code>Option</code>构造体,这使得代码更易于保护和扩大。这种办法在具备大量配置参数的函数时特地有用。</p><h5>5: 清晰起见,应用显式返回值而不是命名返回值</h5><p>命名返回值在Go中很罕用,但有时会使代码不那么清晰,特地是在较大的代码库中。</p><p>咱们用一个简略例子来看看它们的区别。</p><pre><code class=“golang”>package mainimport “fmt”// namedReturn演示命名返回值。func namedReturn(x, y int) (result int) { result = x + y return}// explicitReturn演示显式返回值。func explicitReturn(x, y int) int { return x + y}func main() { // 命名返回值 sum1 := namedReturn(3, 5) fmt.Println(“Named Return:”, sum1) // 显示返回值 sum2 := explicitReturn(3, 5) fmt.Println(“Explicit Return:”, sum2)}</code></pre><p>下面的示例程序中有两个函数,<code>namedReturn</code>和<code>explicitReturn</code>,以下是它们的不同之处:</p><ul><li><code>namedReturn</code>应用命名返回值<code>result</code>。尽管函数返回的内容很分明,但在更简单的函数中可能不会很显著。</li><li><code>explicitReturn</code>间接返回后果,这样更简略、明确。</li></ul><h5>4: 将函数复杂性放弃在最低限度</h5><p>函数复杂性是指函数代码的复杂程度、嵌套水平和分支水平。放弃较低的函数复杂度会使代码更具可读性、可维护性,并且不易出错。</p><p>咱们用一个简略的例子来摸索这个概念:</p><pre><code class=“golang”>package mainimport ( “fmt”)// CalculateSum返回两个数字的和func CalculateSum(a, b int) int { return a + b}// PrintSum打印两个数字的和func PrintSum() { x := 5 y := 3 sum := CalculateSum(x, y) fmt.Printf(“Sum of %d and %d is %d\n”, x, y, sum)}func main() { // 调用PrintSum函数来演示最小函数复杂度 PrintSum()}</code></pre><p>在下面的示例程序中:</p><ol><li>咱们定义了两个函数,<code>CalculateSum</code>和<code>PrintSum</code>,各自具备特定职责。</li><li><code>CalculateSum</code>是一个简略函数,用于计算两个数字的和。</li><li><code>PrintSum</code>调用<code>CalculateSum</code>计算并打印5和3的和。</li><li>通过放弃函数简洁并专一于单个工作,咱们放弃了较低的函数复杂性,进步了代码的可读性和可维护性。</li></ol><h5>3: 防止暗藏变量</h5><p>当在较窄的范畴内申明具备雷同名称的新变量时,就会产生变量暗藏,这可能导致意外行为。这种状况下,具备雷同名称的内部变量会被暗藏,使其在该作用域中不可拜访。尽量避免在嵌套作用域中暗藏变量以避免混同。</p><p>参考如下示例程序:</p><pre><code class=“golang”>package mainimport “fmt"func main() { // 申明并初始化值为10的内部变量’x’。 x := 10 fmt.Println(“Outer x:”, x) // 在外部作用域里用新变量’x’笼罩内部’x’。 if true { x := 5 // 笼罩产生在这里 fmt.Println(“Inner x:”, x) // 打印外部’x’, 值为5 } // 内部’x’放弃不变并依然能够拜访 fmt.Println(“Outer x after inner scope:”, x) // 打印内部’x’, 值为10}</code></pre><h5>2: 应用接口进行形象</h5><p><strong>形象</strong></p><p>形象是Go中的基本概念,容许咱们定义行为而不指定实现细节。</p><p><strong>接口</strong></p><p>在Go语言中,接口是办法签名的汇合。</p><p>实现接口的所有办法的任何类型都隐式的满足该接口。</p><p>因而只有遵循雷同的接口,咱们就可能编写能够解决不同类型的代码。</p><p>上面是一个用Go语言编写的示例程序,演示了应用接口进行形象的概念:</p><pre><code class=“golang”>package mainimport ( “fmt” “math”)// 定义Shape接口type Shape interface { Area() float64}// Rectangle构造type Rectangle struct { Width float64 Height float64}// Circle构造type Circle struct { Radius float64}// 实现Rectangle的Area办法func (r Rectangle) Area() float64 { return r.Width * r.Height}// 实现Circle的Area办法func (c Circle) Area() float64 { return math.Pi * c.Radius * c.Radius}// 打印任何形态面积的函数func PrintArea(s Shape) { fmt.Printf(“Area: %.2f\n”, s.Area())}func main() { rectangle := Rectangle{Width: 5, Height: 3} circle := Circle{Radius: 2.5} // 对矩形和圆形调用PrintArea,因为都实现了Shape接口 PrintArea(rectangle) // 打印矩形面积 PrintArea(circle) // 打印圆形面积}</code></pre><p>在这个程序中,咱们定义了<code>Shape</code>接口,创立了两个构造体<code>Rectangle</code>和<code>Circle</code>,每个构造体都实现了<code>Area()</code>办法,并应用<code>PrintArea</code>函数打印满足<code>Shape</code>接口的任何形态的面积。</p><p>这演示了如何在Go中应用接口进行形象,从而应用公共接口解决不同的类型。</p><h5>1: 防止混合库包和可执行文件</h5><p>在Go中,在包和可执行文件之间放弃清晰的隔离以确保代码洁净和可维护性至关重要。</p><p>上面是演示库和可执行文件拆散的示例我的项目构造:</p><pre><code>myproject/ ├── main.go ├── myutils/ └── myutils.go</code></pre><p><code>myutils/myutils.go</code>:</p><pre><code class=“golang”>// 包申明——为实用程序函数创立独自的包package myutilsimport “fmt”// 导出打印消息的函数func PrintMessage(message string) { fmt.Println(“Message from myutils:”, message)}</code></pre><p><code>main.go</code>:</p><pre><code class=“golang”>// 主程序package mainimport ( “fmt” “myproject/myutils” // 导入自定义包)func main() { message := “Hello, Golang!” // 调用自定义包里的导出函数 myutils.PrintMessage(message) // 演示主程序逻辑 fmt.Println(“Message from main:”, message)}</code></pre><ol><li>在下面的例子中,有两个独立的文件: <code>myutils.go</code>和<code>main.go</code>。</li><li><code>myutils.go</code>定义了一个名为<code>myutils</code>的自定义包,蕴含输入函数<code>PrintMessage</code>,用于打印消息。</li><li><code>main.go</code>是应用相对路径(<code>myproject/myutils</code>)导入自定义包<code>myutils</code>的可执行文件。</li><li><code>main.go</code>中的<code>main</code>函数从<code>myutils</code>包中调用<code>PrintMessage</code>函数并打印一条音讯。这种关注点拆散放弃了代码的组织性和可维护性。</li></ol><hr/><blockquote>你好,我是俞凡,在Motorola做过研发,当初在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓重的趣味,平时喜爱浏览、思考,置信继续学习、一生成长,欢送一起交流学习。为了不便大家当前能第一工夫看到文章,请敌人们关注公众号"DeepNoMind”,并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的反对和能源,激励我继续写下去,和大家独特成长提高!</blockquote><p>本文由mdnice多平台公布</p></article> ...

February 11, 2024 · 5 min · jiezi

关于程序员:Cloudera-Manager-620安装指南

本文由mdnice多平台公布

September 28, 2023 · 1 min · jiezi

关于程序员:行业追踪20230927

主动复盘 2023-09-27凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。 板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. 翻新药1. 翻新药1. 翻新药1. 电机2. CRO2. 化学制药2. CRO2. 减速器3. 医疗服务3. CRO3. 证券3. 银行4. 化学制药4. 煤炭行业4. 券商概念4. 工业母机5. 生物制品5. 工业母机5. 煤炭行业5. 汽车零部件6. 中药6. 生物制品6. 化学制药6. 汽车热治理7. 中药概念7. 医疗美容7. 工业大麻7. 页岩气8. 医疗器械8. 中药概念8. 化妆品概念8. 工业4.09. 医疗美容9. 中药9. 银行9. 铁路公路10. 工业母机10. 工业大麻10. 医疗美容10. 证券11. 化妆品概念11. 医疗服务11. ST股11. 空气能热泵12. 工业大麻12. 医疗器械12. 中药12. 地摊经济13. 精准医疗13. 精准医疗13. 医疗服务13. 通用设备14. 风电设施14. 铁路公路14. 生物制品14. 燃气15. 体外诊断15. 化妆品概念15. 多元金融15. 汽车整车16. 医疗器械概念16. 电子化学品16. 中药概念16. 券商概念17. 油气设服17. ST股17. 人造肉17. 激光雷达18. 工业4.018. 空间站概念18. 酿酒行业18. 油气设服19. 铁路公路19. 银行19. 互联金融19. 工程机械概念20. 银行20. 动物照明20. 精准医疗20. 煤炭行业21. 电机21. 油气设服21. 通信服务21. 船舶制作22. 通用设备22. 通信设施22. 铁路公路22. 天然气23. 疫苗冷链23. 体外诊断23. 水泥建材23. 纺织服装24. 互联医疗24. 石油行业24. 白酒24. 通信设施25. 宠物经济25. 3D打印25. 医疗器械25. 仪器仪表板块 rps20 排名详情板块详情1. 翻新药2. 化学制药3. 煤炭行业4. CRO5. 工业母机6. 生物制品7. 中药概念8. 中药9. 医疗美容10. 工业大麻11. 医疗服务12. 精准医疗13. 医疗器械14. 化妆品概念15. 电子化学品16. 铁路公路17. ST股18. 空间站概念19. 银行20. 动物照明21. 油气设服22. 通信设施23. 石油行业24. 体外诊断25. 3D打印板块 rps50 排名详情板块详情1. 翻新药2. CRO3. 券商概念4. 证券5. 煤炭行业6. 化学制药7. 化妆品概念8. 银行9. 工业大麻10. ST股11. 医疗美容本文由mdnice多平台公布 ...

September 27, 2023 · 1 min · jiezi

关于程序员:提升技术招聘有效性-|-为什么企业总考算法题

前些年技术圈有个经典名梗: 广受谷歌员工欢送的 macOS 包管理器Homebrew 的开发者,技术大佬Max Howell,去谷歌面试时因为不会做一道十分根底的算法题——翻转二叉树,而被谷歌拒了。 过后圈内炸了锅,有人感觉是大佬不屑于去做,有人顺带吐槽了本人的相似经验...... 其中一位网友的评论切中要害:“大佬不会做翻转二叉树,但他依然开发出了Homebrew ;你虽会做,但却开发不来。” 问题出在哪呢? 至多咱们能发现谷歌的这道题并没能挖掘出大佬真正的技术实力,从招聘指标来看,其实是有些失败的。 大佬在之后在技术论坛里做出了解释: 他抵赖本人过后的确不晓得二叉树,但强调了谷歌不能因而拒掉他。 尽管他不懂很多CS 实践,但他开发出了在乎用户体验、饱受好评的Homebrew, “真正开源世界中一颗闪亮的星”,他认为这跟CS 实践没有半点关系。 他表白了一个清晰无力的观点:实际比实践更加重要。 01 为什么总出算法题?企业为什么执着于出算法题呢? 有三方面起因: 省时省力:技术岗位的次要工作是实现工程项目,并没有太多工夫和资源来针对岗位需要来制订题目。 算法题则无需编程语言或环境的配置,甚至用白板都能间接进行考核,对企业很不便。 算法题容易评估:企业要出跟理论我的项目相干的题型,就须要更多的工夫和资源来设计和评估,许多简单的细节难以量化和评估。 算法题有标准答案和主观指标,如工夫/空间复杂度来间接评估候选人的程度。 企业的“保底思维”:算法题考查了程序员的基本功,像一个大漏斗,留下来的至多基本功不错,外面可能存在适合具体岗位的人选。 但只考算法题存在着许多局限性。 02 算法题的局限2.1 理论我的项目有时不须要懂太多算法 有人会说,算法考核的都是根底,若连根底都不会,那怎么证实他有更强的实战能力呢?走路都不会,又怎么加入短跑较量呢? 但算法与理论我的项目的关系,并非上楼梯似的递进,而更像水分子跟水一样的层级关系。人类真正理解水分子结构不过几百年,但不障碍人类始终在用水。 就像打造一个游戏引擎,须要学习很多算法,但游戏设计师应用游戏引擎来设计游戏,却不须要懂太多算法。 其实,许多算法早已被封装好,集成在各种工具和框架中,除非底层开发工作,比方开发新的游戏引擎,许多岗位早已不须要接触这些算法原理了。 事实工作中,如何很好地实现业务需要,更多取决于候选人如何很好地去应用相干的工具与框架。 2.2 算法题匹配不了简单的工程问题 算法题通常是形象、简化、规范的,理论我的项目中的问题往往是具体、简单、多变的。 招聘时的算法题,往往事后设计了一个最优解,让候选人在限定工夫内解出。 但事实中,工程问题往往不仅没有标准答案,有时甚至连问题在哪,是否能用现有技术解决都不分明。 比方招聘中,企业会让候选人写一个从A到B点的最短门路算法。这类题目通常被精心设计,数据被结构,肯定存在最优解,问题的输出和边界条都绝对简略和标准。 但理论的交通系统我的项目中,存在着拥挤、施工、事变多种路况,步行、汽车、公交多种形式、用户随便更改目的地,以及要实时同步交通数据,这些都是要候选人花更多精力思考的简单状况,而非仅需记忆相似Dijkstra 的一个算法就能搞定。 我的项目代码是真实世界的,存粹的算法代码只存在于阉割版的证实实践里。 只有实践,而无奈高效实现的算法也并不少,比方Kruskal 算法很早就呈现,但很久之后才找到了较好的实现形式,变得实用。 技术人才的外围价值,是用代码实现具体的性能,而非仅懂实践概念。 2.3 AI 新浪潮的冲击 招聘中,候选人往往须要闭卷限时解答算法题。 但事实中简单的我的项目,技术人员能够长时间沟通交流、合作,并且自行查阅材料。 随着AI 倒退,查阅实践算法常识,更是轻而易举,记忆算法的价值大幅削弱。 这是我用AI 工具实现的“关键词呈现频率统计”性能,其中波及到了Porter Stemming和Snowball Stemming 等词干提取的算法,而我对这些算法无所不知。 目前算法题考核招聘形式,无奈还原理论场景中的材料搜寻、沟通协调等相干能力。 总之,通过算法题先筛人,再进一步靠面试判断岗位匹配度, “先筛人,后匹配”的模式,仅是拐弯抹脚开掘能力的形式。 不仅会漏掉如Howell 那种有后劲、创造力、有特长的技术大佬,也容易招到一群只会做算法题,但不足沟通合作、解决理论问题等领有工程能力的人。 好比打靶并没刻意瞄准靶心,只是先让本人手别抖,这样“弹孔”容易稳固地集中在某一区域,招到一群类似的“优良”人才,但却可能偏离岗位的“靶心”。 有没有什么办法,能间接冲着“靶心”瞄准,反过来从岗位登程,间接招到匹配该岗位人才的形式呢? 03 ShowMeBug 基于岗位的“实战题型”ShowMeBug 致力于深挖技术实力,为企业找到技术岗位的最佳匹配人选,专门打造了基于岗位的“实战题型”。 ...

September 27, 2023 · 1 min · jiezi

关于程序员:OpenHarmony创新赛|最全赛事奖项信息来啦

OpenHarmony翻新赛最全赛事奖项信息来啦! 不仅有人气作品奖、优良行业奖、优秀学生奖、翻新激励奖 参赛即有机会取得多项荣誉激励! 快来报名吧! 作品提交地址 https://atomgit.com/ 参赛队伍在AtomGit上建仓提交作品材料 提交作品时将仓库地址同步给工作人员即可 参赛作品需蕴含阐明文档、演示视频、开源源码及利用hap包 有任何疑难,欢送分割咱们: 开源大赛官网 https://competition.atomgit.com OpenHarmony翻新赛官网 https://www.openharmony.cn/competition/introduction 官网邮箱 growing@mail.openharmony.io 心愿大家踊跃参加 都能在OpenHarmony翻新赛上获得好问题! 本文由博客一文多发平台 OpenWrite 公布!

September 27, 2023 · 1 min · jiezi

关于程序员:linux-监控内存利用率

监控内存利用率应用free来剖析CPU应用信息 #!/bin/bashDATE=$(date +%F" "%H:%M)IP=$(ifconfig eth0 |awk -F '[ :]+' '/inet addr/{print $4}') MAIL="example@mail.com"TOTAL=$(free -m |awk '/Mem/{print $2}')USE=$(free -m |awk '/Mem/{print $3-$6-$7}')FREE=$(($TOTAL-$USE))# 内存小于1G发送报警邮件if [ $FREE -lt 1024 ]; then echo " Date: $DATE Host: $IP Problem: Total=$TOTAL,Use=$USE,Free=$FREE " | mail -s "Memory Monitor" $MAILfihttps://zhhll.icu/2021/linux/实用shell/监控内存利用率/本文由mdnice多平台公布

September 27, 2023 · 1 min · jiezi

关于程序员:生信教程使用全基因组SNP数据进行ABBABABA分析

动动发财的小手,点个赞吧! 简介ABBA BABA 统计(也称为“D 统计”)为偏离严格的分叉进化历史提供了简略而无力的测试。因而,它们常常用于应用基因组规模的 SNP 数据(例如来自全基因组测序或 RADseq)来测试基因渗入。 在本次实际中,咱们将联合应用可用软件和一些用 R 从头编写的代码来执行 ABBA BABA 剖析。咱们将剖析来自几个 Heliconius 蝴蝶种群的基因组数据。 流程从多个个体的基因型数据开始,咱们首先推断每个 SNP 的等位基因频率。而后,咱们计算 D 统计量,而后应用block jackknife来测试与 D=0 的零冀望的显着偏差。最初咱们预计f“混合比例”。 数据集咱们将钻研三个物种的多个种族:Heliconius melpomene、Heliconius timareta 和 Heliconius cydno。这些物种的散布范畴局部重叠,人们认为它们在同源地区产生杂交。咱们的样本集包含来自巴拿马和哥伦比亚安第斯山脉西坡的两对同域种群 H. melpomene 和 H. cydno。在哥伦比亚和秘鲁的安第斯山脉东坡,还有两对同域种群:H. melpomene 和 H. timareta。最初,有两个来自外群物种 Heliconius numata 的样本,这是进行 ABBA BABA 剖析所必须的。 所有样本均应用深度全基因组测序进行测序,并应用规范流程为每个个体的基因组中每个位点获取基因型。数据通过过滤,仅保留双等位基因单核苷酸多态性 (SNP),并且这些数据已进一步细化,以减小本教程的文件大小。 假如咱们假如同域物种之间的杂交将导致 H. cydno 和来自东方的 H. melpomene 同域种族之间以及 H. timareta 和来自东部的 H. melpomene 相应的同域种族之间共享遗传变异。安第斯山脉。还有来自法属圭亚那的 H. melpomene 的另一个种族,它是 H. timareta 和 H. cydno 的异源性,它应该没有经验过与这两个物种最近的遗传替换,因而能够作为对照。 ...

September 26, 2023 · 4 min · jiezi

关于程序员:行业追踪20230926

主动复盘 2023-09-26凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。 板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. 翻新药1. 翻新药1. 证券1. 银行2. CRO2. 工业母机2. 券商概念2. 减速器3. 工业母机3. 煤炭行业3. 银行3. 工业母机4. 生物制品4. 电子化学品4. 煤炭行业4. 电机5. 化学制药5. 动物照明5. ST股5. 铁路公路6. 铁路公路6. 化学制药6. 工业大麻6. 汽车零部件7. 中药概念7. 通信设施7. 人造肉7. 证券8. 医疗服务8. 3D摄像头8. 化学制药8. 船舶制作9. 银行9. 生物制品9. 多元金融9. 汽车热治理10. 航运港口10. 光学光电子10. 铁路公路10. 工业4.011. 中药11. 激光雷达11. 翻新药11. 页岩气12. 医疗器械12. 空间站概念12. 化妆品概念12. 券商概念13. 医疗美容13. 智能穿戴13. 互联金融13. 激光雷达14. 煤炭行业14. ST股14. 房地产开发14. 燃气15. 精准医疗15. CRO15. 酿酒行业15. 地摊经济16. 水泥建材16. 生产电子16. 医疗美容16. 煤炭行业17. 化妆品概念17. 医疗美容17. CRO17. 汽车整车18. ST股18. 中药18. 通信服务18. 空气能热泵19. 工业4.019. 中药概念19. 白酒19. 通用设备20. 工业大麻20. 屏下摄像20. 中药20. 通信设施21. 油气设服21. 无线耳机21. 水泥建材21. 油气设服22. 石油行业22. Chiplet概念22. 中药概念22. 天然气23. 钢铁行业23. 医疗器械23. 纺织服装23. 纺织服装24. 通用设备24. 通信服务24. 土地流转24. 工程机械概念25. 医疗器械概念25. 3D打印25. 生物制品25. 石油行业板块 rps20 排名详情板块详情1. 工业母机2. 翻新药3. 煤炭行业4. 电子化学品5. 动物照明6. 化学制药7. 生物制品8. 通信设施9. 3D摄像头10. 光学光电子11. 激光雷达12. 智能穿戴13. 空间站概念14. ST股15. 生产电子16. CRO17. 医疗美容18. 中药19. 中药概念20. 屏下摄像21. 无线耳机22. Chiplet概念23. 3D打印24. 通信服务25. 医疗器械板块 rps50 排名详情板块详情1. 证券2. 券商概念3. 银行4. 煤炭行业5. 工业大麻6. ST股7. 人造肉8. 化学制药9. 多元金融10. 铁路公路11. 翻新药号: ...

September 26, 2023 · 1 min · jiezi

关于程序员:解析es6中let和const并模拟实现私有变量

应用let 和 const 申明变量早曾经司空见惯了。笔者作为面试官面试过上百人,能精确了解let/const块级作用域以及的候选人有余一二。本文将深入研究 let 和 const 的实现原理,以及多种形式来模仿公有变量,心愿本文能给初中级前端小伙伴们一点帮忙。一、let 和 const 的实现原理1.1 JavaScript 的作用域链在深刻理解 let 和 const 前,让咱们首先回顾一下 JavaScript 中的作用域。作用域是一个决定变量可见性和拜访性的概念。JavaScript 具备两种次要的作用域:全局作用域和函数作用域。 全局作用域是整个程序的顶层作用域,其中申明的变量能够在程序的任何中央拜访。函数作用域限定了变量的作用范畴,只有在函数外部能力拜访这些变量。 1.2 词法环境和变量对象JavaScript 引擎应用词法环境来治理变量和函数的作用域。词法环境包含两个重要局部:词法环境记录和对外部词法环境的援用。 词法环境记录是一个外部数据结构,用于存储变量和函数申明。全局环境的词法环境记录蕴含全局变量和函数,而函数环境的词法环境记录蕴含局部变量和参数。 1.3 let 和 const 的块级作用域ES6 引入了 let 和 const,它们引入了块级作用域的概念。块级作用域容许咱们在 {} 外部创立独立的作用域,使得变量仅在该块内无效。 if (true) { let x = 10; const y = 20;}console.log(x); // 报错:x is not definedconsole.log(y); // 报错:y is not defined在下面例子中,x 和 y 只在 if 语句块内可见,内部无法访问它们。 1.4 let 和 const 的长期死区let 和 const 引入了“长期死区”(Temporal Dead Zone,TDZ)的概念。TDZ 是指在变量申明之前,变量无奈被拜访或赋值的状态。 ...

September 26, 2023 · 2 min · jiezi

关于程序员:shell-sort命令

sort命令shell中还能够应用sort进行排序 # 以行作为单位sort [option] [files]-b:疏忽每行后面的空格-c:查看文件是否曾经依照程序排序-d:排序时,解决英文字母、数字和空格字符,疏忽其余字符-g: 个别数值,以浮点数字类型比拟字段-f:排序时,将小写字母视为大写字母,也就是疏忽大小写-i:排序时,解决040~176之间的ASCII字符,疏忽其余字符-m:将几个排序好的文件进行合并-M:将后面3个字母按月份缩写进行排序-n:依照数值大小进行排序-o outfile: 将排序后的后果存入outfile文件-r: 以相同的程序进行排序-k:指定须要排序的列数-t:分隔符,指定排序时用来分隔列的-u 去重# 将第二列依照数字大小排列sort -nk 2 -t: test.txt# 先以第四列排列,再以第三列排列sort -t: -k4n -k3n /etc/passwdhttps://zhhll.icu/2022/linux/shell/sort命令/本文由mdnice多平台公布

September 26, 2023 · 1 min · jiezi

关于程序员:隧道代理IP和API代理IP有什么区别

代理IP按应用形式来分,能够分为隧道代理IP和API代理IP,这两种代理IP有什么区别呢,各有什么优缺点呢?咱们一起来看看。 隧道代理IP应用更不便。用户只须要设置固定的IP和端口或固定的域名和端口为隧道代理,将申请发送到隧道代理服务器,隧道代理服务器会主动调配代理IP来转发申请给指标网站服务器。简略的来说,应用隧道代理IP能够主动更换IP,不须要用户本人去切换代理IP。 API代理IP应用起来比隧道代理IP略微繁琐一些,用户须要通过调用API接口来获取代理IP和端口,而后再去应用,须要不停的调用API接口,不停的设置代理IP和切换代理IP。 简略的来说,应用API代理IP须要本人更换代理IP,须要本人把握调用API接口提取代理IP的频率,须要本人把握什么时候切换代理IP比拟适合。 初看起来,隧道代理IP比拟好,抉择隧道代理IP就好了。其实不然,隧道代理IP尽管应用起来更加不便,但也有毛病。一是速度会比较慢,因为隧道代理IP比API代理IP多了一个转发的过程,而且多个用户在同一台转发服务器上转发,也会存在抢资源的状况,更加影响速度。 API代理IP尽管应用起来没有那么不便,但速度会更快一些,用户间接将申请发送到代理服务器,代理服务器再转发给指标网站服务器 隧道代理IP多了一个转发过程,用户将申请发送到隧道服务器,隧道服务器将申请随机转发给一个代理服务器,代理服务器再将申请转发给指标网站服务器。 API代理IP更适宜分布式爬虫,能够同时提取应用多个代理IP发送申请,反对高并发;隧道代理IP一个隧道同时只能应用一个代理IP,大多数是1秒只能发5个申请,有的能降级每秒申请数,有的不能降级,对于工作量比拟大的爬虫来说,隧道代理IP并不是很适合。 综上所述,隧道代理IP和API代理IP各有优缺点,用户能够依据本人的业务需要来抉择。

September 25, 2023 · 1 min · jiezi

关于程序员:shell-sed命令

sed命令sed次要用于将数据进行选取、替换、删除、新增的命令,以批处理的形式而不是交互的形式来编辑文件,sed读取文件是一次读取一行 语法格局为sed [选项] '[动作]' 文件名 #删除第二行sed '2d' stu.txt# 删除第一个冒号之后的所有货色sed 's/:.*//' user.txt# 屡次替换sed -e 's/foo/bar/g' -e 's/chicken/cow/g' test.txt > newtest.txt-----------------------选项-n 把通过sed命令解决的数据输入到屏幕,只输入p指令的行-e 容许对输出数据利用多条sed命令,当有多个命令须要执行时,能够应用该选项-f 脚本文件名 从sed脚本中读入sed操作,当有多个命令须要执行时,能够应用该选项-r 在sed中反对正则-i 用sed的批改后果间接批改读取数据的文件,而不是由屏幕输入动作a \ 追加,在以后行后增加一行或多行。增加多行时,除最初一行外,每行开端都须要用\来示意数据未完结,appendc \ 行替换,用c后的字符串替换原数据行,替换多行时,除最初一行外,每行开端都须要用\来示意数据未完结,changei \ 插入,在以后行前插入一行或多行,插入多行时,除最初一行外,每行开端都须要用\来示意数据未完结,insertd 删除指定行,deletep 打印,输入指定行s 字符替换,用一个字符串替换另一个字符串。格局为'行范畴s/旧字符串/新字符串/g' ,substuite字符替换# 去除双引号sed -i 's/"//g' tmp_query.txthttps://zhhll.icu/2021/linux/shell/sed命令/本文由mdnice多平台公布

September 25, 2023 · 1 min · jiezi

关于程序员:什么是外企中经常提到的-adhoc-work

Ad-hoc工作:何为、实例剖析、重要性与应答策略 Ad-hoc工作,这个术语在外企治理畛域经常被提及,是一种灵便的、非结构化的工作形式。它通常用来应答突发性的工作、问题或需要,而不是依照预约打算或流程执行的工作。本文将深入探讨Ad-hoc工作的含意、重要性、理论案例以及有效应对策略,以帮忙外企管理者更好地了解和应答这种工作形式。 Ad-hoc工作的定义 Ad-hoc一词源自拉丁语,意为“为了此事”。在治理畛域,Ad-hoc工作指的是依据具体情况长期制订、执行的工作工作,通常没有事后制订的打算或规范操作程序。这种工作形式强调灵活性和适应性,可能迅速应答新的挑战和机会。 Ad-hoc工作通常呈现在以下情境中: 紧急任务:当呈现紧急任务,须要立刻解决,而没有当时布局的工夫。问题解决:解决突发问题或危机,须要即时口头,以减小潜在的影响。新机会:抓住意外的商机,须要迅速调整策略并采取行动。特殊要求:满足特定客户或合作伙伴的个性化需要,可能须要不同于惯例的工作流程。实例剖析:Ad-hoc工作案例 为了更好地了解Ad-hoc工作,让咱们通过几个理论案例来具体阐明它的运作形式以及在外企治理中的利用。 案例1:市场机会迅速把握 设想一家跨国批发企业,正进行一次促销流动。忽然,竞争对手的某项新产品在市场上获得了巨大成功,引发了消费者的趣味。公司的治理团队决定迅速调整促销策略,以充分利用这一市场机会。他们长期招集了销售、市场营销和供应链团队,制订了新的广告打算、库存管理策略和销售指标,以满足这一突发需要。 案例2:危机治理与公关 一家跨国制药公司的一款重要产品被媒体曝光存在安全隐患,引发了消费者和监管机构的担心。公司的危机治理团队迅速招集了法律、公关、医学和生产专家,制订了一项应答危机的Ad-hoc打算。他们制订了紧急回应策略,包含产品召回、与媒体的沟通、监管机构的单干和改良产品安全措施的打算。 案例3:客户特殊要求 一家国内供应链治理公司的客户提出了一个非凡的要求:在短时间内为他们的产品运输提供更高级别的平安保障。公司的供应链团队必须立刻制订新的运输计划,包含更平安的运输容器和更具体的跟踪程序。这种定制化的服务要求灵便的Ad-hoc工作,以满足客户的需要。 这些案例突出了Ad-hoc工作的外围特点,即灵活性、紧急性和依据具体情况采取行动。在外企治理中,这种工作形式是不可或缺的,因为外部环境的不确定性和变动使得事后布局的工作打算常常须要调整和修改。 重要性:为什么Ad-hoc工作如此重要 Ad-hoc工作在外企治理中具备重要位置,起因如下: 应答不确定性:不可预测的事件和机会经常出现,要求组织可能疾速做出反馈。Ad-hoc工作容许企业迅速适应新状况,加重不确定性带来的危险。翻新和竞争劣势:外企须要不断创新以放弃竞争劣势。Ad-hoc工作为翻新提供了空间,使企业可能灵便地摸索新市场、新产品和新服务。客户满意度:满足客户非凡需要是放弃客户满意度和忠诚度的要害。Ad-hoc工作可能确保企业可能满足客户的个性化需要,建设良好的客户关系。危机治理:危机随时可能产生,而无效的危机治理对于企业的生存至关重要。Ad-hoc团队可能疾速响应和解决危机,缩小潜在的负面影响。应答策略:无效治理Ad-hoc工作 为了胜利治理Ad-hoc工作,外企管理者能够采取以下策略: 建设专门团队:创立专门的Ad-hoc团队,由具备不同专业知识和技能的成员组成,以便迅速应答各种挑战。明确职责和流程:为Ad-hoc工作明确定义职责和流程,确保团队晓得在紧急情况下该如何合作和采取行动。技术和工具反对:投资于技术和工具,以便更高效地解决Ad-hoc工作,例如项目管理软件、通信工具和数据分析平台。继续培训:放弃团队的技能和常识更新,以应答一直变动的外部环境。评估和学习:在Ad-hoc工作实现后进行评估,辨认胜利因素和改良点,以便进步将来的应答能力。总结 Ad-hoc工作是外企治理中不可或缺的一部分,它强调了灵活性、紧急性和依据状况采取行动。通过明确定义职责、建设专门团队、投资技术和工具,外企管理者能够更好地应答Ad-hoc工作,充分利用机会、升高危险并放弃竞争劣势。理解Ad-hoc工作的重要性和应答策略对于古代企业领导者至关重要。

September 24, 2023 · 1 min · jiezi

关于程序员:shell-awk命令

awk命令awk是shell进阶的重要命令,能够用来编排字段 awk把输出流看做一串记录的汇合,每条记录都能够进一步细分为字段,一个awk程序是一对以模式和大括号框起来的操作组合而成的,awk每次从文件中读取一条记录 awk [选项] '条件{动作} 条件{动作}' 文件 -v 设置变量值pattern {action} 如模式匹配,则执行操作pattern {action}<!-- more --> # 打印第一个字段awk 'print $1'# 打印整行awk 'print $0'# 打印第2与第5个字段awk 'print $2,$5'# 打印非空行awk 'NF > 0 {print $0}'在读取数据时,默认的分隔符是空格,能够应用-F来指定分隔符 #awk [-F 分隔符] '命令' input-file# 分隔符默认是空格# 例: 打印出root用户记录awk -F: '$1=="root"{print $0}' /etc/passwd在输入数据时,默认的分隔符是空格,能够应用-v来设置输入字段分隔符 # 默认状况下,-v 扭转输入字段的分隔字符,这里必须设置OFS变量来扭转输入字段分隔符awk -F: -v 'OFS=**' '{print $1,$5}' /etc/passwd标量变量保留繁多值的变量叫做标量变量,罕用的有 FILENAME 以后输出文件的名称FNR 以后输出文件的以后行号,当有多个输出文档时相当有用 FNR == 3 选定第三条记录FS 字段分隔符,默认为空格NF 以后记录的字段数 NF == 0 选定空记录NF > 3 选定领有三个字段以上的记录NF < 5 选定第1到第4条记录NR 输出数据流的以后行号OFS 输入字段分隔字符,默认为空格ORS 输入记录分隔字符,默认为\nRS 输出记录分隔字符$0 以后行的全部内容$n 以后行的第n的字段的内容自定义变量能够应用-v来设置自定义变量 ...

September 24, 2023 · 1 min · jiezi

关于程序员:算法基础之高精度总结

高精度算法分类分类:加、减、乘、除 其中加减乘都实用于两个数都是高精度,除法因为除数是高精度的话不好用整除的办法,所以除法时被除数是高精度,除数是整型。高精度加减乘除的异同点加和乘相同点须要从低位到高位解决 for(int i=stra.size()-1;i>=0;i--) c.push_back(stra[i]-'0');加和乘解决向上进位 int t=0;for(...){ t += a[i]; c.push_back(t % 10); t /= 10;}能够应用通用模板 加法c[i]+=a[i];c[i]+=b[i];//而后对立对c进行进位解决乘法c[i+j] = a[i]*b[j];//而后对立对c进行进位解决减和除相同点有可能以后位的数不够,须要借用上一位不同点减法须要从低位到高位解决,除法是从高位到低位解决减法每一位都要解决上一位的借位状况,借位要么是0要么是1 int t=0;//留神:a是从低位到高位排序for(int i=0;i<a.size();i++){ t = a[i]-t; if(i<b.size()) t -= b[i]; c.push_back(t % 10); //下一位的借位 if(t <0) t=1; else t = 0;}除法更多的应该是叫凑位,把高位的数*10和低位的数合并,每个地位不须要再独自加减 int r=0; //余数//留神a是从高位到低位排序for(int i=0;i<a.size();i++){r = r * 10+a[i];c.push_back(r /b); r = r % b;}4.除法解决前导0的状况须要翻转,把高位翻转到开端 reverse(c.begin(),c.end());解决前导0的形式四种运算都一样,只是除法先要翻转数组 while(c.size()>1 && c.back()==0) c.pop_back();本文由mdnice多平台公布

September 24, 2023 · 1 min · jiezi

关于程序员:下一代TCP-网络演进的平台

随着往年TCP最新标准RFC 9293的公布,IETF对过来几十年TCP的倒退做解决阶段性总结,同时也是下一阶段倒退的终点。随着网络规模的扩充和倒退,兴许有一天TCP会隐没,或者演变为基于业务的可编程平台,置信今后会有很多好玩的货色呈现。原文: TCP: The "P" is for Platform随着最近TCP新标准(RFC 9293)的公布,咱们须要反思TCP在过来几十年的倒退,并想晓得将来会产生什么。 传输控制协议(TCP)原始标准在1981年作为RFC 793公布。在过来的四十年里,TCP被证实是一个不死板的充斥弹性的协定,有泛滥扩大和实现,因而很难跟踪所有变动,很容易错过某个重要个性。而刚刚公布的RFC 9293(2022年8月),就是为了解决这个问题。作为一个重要的里程碑,RFC 793当初正式过期了。 对于经验了TCP大部分倒退过程的人来说,浏览RFC 9293就像在回顾中散步,从愚昧的窗口综合症到慢启动、疾速重传、反复ACK、窗口缩放等等,TCP的历史就是一个零碎演进的很好的钻研案例。对钻研人员来说,提出全新设计是很有诱惑力的想法,但TCP中有太多历史教训和包袱,任何替换计划都须要逾越十分高的门槛。 让咱们先疏忽掉细节,退后一步看看"零碎演进"的故事,其中有几件事让我印象粗浅。对于初学者来说,我比拟厌恶仅仅基于浏览RFC 9293(及其援用的其余RFC)来从头实现TCP。至于这么做是否可行本就是一个凋谢问题,多年来TCP始终是由其参考实现定义的,RFC更多的是描述性的而不是规范性的。这不是批评,因为从一开始IETF就偏爱基于实现来定义协定,而RFC 9293则是这一迭代过程中最新的更新。 如果由实现驱动标准,那么哪个实现是权威的?答案是当今占主导地位的开源实现,也就是最后由BSD(Berkeley Software Distribution) Unix所作的实现。BSD及其后辈始终连续到明天(最驰名的是FreeBSD),但最终在21世纪初被Linux所取代(古代许多商业操作系统都是从BSD或Linux派生进去的)。 然而Linux版本的TCP不仅仅是参考实现,能够认为Linux内核为TCP的倒退提供了一个平台。在浏览RFC 9293的时候,我隐约记得在TCP扩大的鼎盛时期发表过一个RFC,题目为"TCP扩大是无害的(TCP Extensions Considered Harmful)",我谷歌了一下,是RFC 1263。(其实我也是该钻研的合著者,可能我还写过什么货色,但当初早就遗记了。)该RFC介绍了TCP演变的个别机制,而这些机制比TCP扩大选项更正当(本质上是提出了明天被称为语义版本控制的货色),但其中有一个和当初相干的论断: 因为不足任何代替计划,TCP实际上曾经成为实现其余协定的平台。它与内核提供了一个含糊的标准接口,运行在许多机器上,并有定义良好的散发门路。这让咱们陷入了一个含糊的两难处境,是将TCP作为平台来倒退传输性能,还是作为Linux网络子系统。但实际上两者并没有区别,可选头字段能够作为向内核增加"传输插件"的一种办法。(这里我应用的是平台的一个简略定义,即它是一种工具或框架,能够随着工夫的推移增加新性能。) 将Linux TCP作为可扩大框架的另一个例子是拥塞管制。《TCP拥塞管制详解》书中介绍的所有算法都能够在Linux内核中应用(能够抉择激活),在Linux内核中,与TCP自身一样,其实现就是算法的权威定义。因而,呈现了一种用于拥塞管制的API,提供了定义良好的办法来一直适应TCP。思考到个性开发速度,Linux当初提供了一种更为不便平安的形式,即通过eBPF(extended Berkeley Packet Filter)通过API动静的向内核注入新的拥塞管制逻辑,从而简化试验新算法或调整现有算法的难度,避开了期待相干Linux内核部署的阻碍。还能够不便的定制每个流所应用的拥塞控制算法,以及显式的向决策过程凋谢设施级入口/进口队列。(这就是在Linux内核中反对CoDel和ECN的形式。) 这真是个好消息,但作为钻研如何最无效倒退软件的案例,后果还是喜忧参半。例如,就API而言,Linux TCP拥塞管制API不是特地直观,惟一的文档都在代码中。其次是其复杂性,尽管API能够将不同算法替换到TCP中,但现实的接口应该反对复用,使不同传输协定(如SCTP、QUIC)能够复用现有算法,而不用保护独自/平行实现。咱们看到的第三个后果是,尽管Linux在使文件系统可替换方面做得很好(能够以平安和高性能的形式实现),但这种办法并不适用于TCP,因为TCP在整个内核中有太多依赖。所有这些,再加上RFC 1263中所提到的TCP可选项的局限性,可能会让咱们得出这样的论断,即TCP在这些年里的倒退并没有涉及其本身,咱们至多会对失去的机会感到遗憾。 与此同时,云计算基于TCP倒退了起来,其重点是进步个性开发速度。一旦可能决定连贯的两端各自运行什么代码,(物理层之上的)协定规范就不那么重要了,云计算和古代利用很好利用了这一点。人们不得不狐疑,现在的TCP是否会在将来隐没,不是因为会呈现全新的替代品,而是因为有可能被云计算实际所取代。QUIC仿佛是对这一假如的很好的测试,它既提供了TCP所没有的价值(设计良好且高效的申请/应答机制),又提供了继续集成和继续部署新个性的古代办法。 一个可能的后果是网络作为整体成为一个可编程平台,从终端传输协定到网络交换机的转发流水线,进步所有个性的公布速度。平台越残缺、麻利,RFC所定义的标准就越有可能被淘汰。正如RFC 1263中所说: 咱们心愿可能在更短的工夫内设计和散发协定,而不是由规范委员会约定可承受的会议工夫。兴许咱们正在靠近实现这一指标。 *你好,我是俞凡,在Motorola做过研发,当初在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓重的趣味,平时喜爱浏览、思考,置信继续学习、一生成长,欢送一起交流学习。 \微信公众号:DeepNoMind* 本文由mdnice多平台公布

September 24, 2023 · 1 min · jiezi

关于程序员:你真的会用ES6模版字符串

模板字符串(template strings)是JS一个十分有用并且弱小的个性。模板字符串不仅能够让字符串拼接更加简洁,还反对一些高级的用法,本文和大家深入探讨模板字符串的高级用法,分享如何利用它实现更加优雅和弱小的字符串操作。什么是模板字符串?模板字符串是ES6引入的一种新的字符串示意形式。它应用反引号(`)来定义字符串,并反对插值表达式,使字符串拼接更加不便。以下是一个简略的模板字符串示例: const name = "Alice";const greeting = `Hello, ${name}!`;console.log(greeting); // 输入 "Hello, Alice!"在下面的示例中,${name} 是一个插值表达式,它会在运行时被替换为变量 name 的值。这使得在字符串中嵌入变量变得轻而易举。 1. 多行字符串传统的字符串示意形式要创立多行字符串通常须要应用换行符(\n),而模板字符串容许您间接编写多行字符串,使代码更加清晰: const multiLineString = ` This is a multi-line string.`;console.log(multiLineString);这使得文本块的创立变得更加天然,无需手动增加换行符。 2. 嵌套模板字符串模板字符串能够嵌套在其余模板字符串外部,这样能够构建简单的字符串构造。这在创立HTML模板或其余嵌套字符串时十分有用: const firstName = "John";const lastName = "Doe";const fullNameHTML = ` <div> <p>First Name: ${firstName}</p> <p>Last Name: ${lastName}</p> </div>`;console.log(fullNameHTML);3. 函数调用模板字符串也能够作为函数的参数传递,这为字符串解决提供了更多的灵活性。您能够定义一个函数,接管模板字符串作为参数,并在函数外部解决字符串,例如格式化字符串或执行其余操作: function formatCurrency(strings, ...values) { let result = ""; values.forEach((value, index) => { result += `${strings[index]}${value}`; }); result += strings[strings.length - 1]; return result;}const price = 19.99;const discount = 0.2;const formattedPrice = formatCurrency`Price: ${price} (20%)`;console.log(formattedPrice); // 输入 "Price: 19.99 (20%)"这个例子中,formatCurrency 函数接管一个模板字符串以及值,而后将它们组合成一个新的字符串。这种形式能够用于国际化、文本格式化等场景。 ...

September 23, 2023 · 1 min · jiezi

关于程序员:shell-字符串操作

字符串操作字符串切片字符串的第一个字符,编号为0,右邻的字符编号,一次减少1 取字符串切片的语法有两种 ${变量:地位终点}由指定的地位开始,截取子字符串到字符串完结 str="123456"substr=${str:4}# 打印后果为56echo $substr${变量:地位终点:长度}str="123456"substr=${str:2:5}# 打印后果为3456echo $substr<!-- more --> 字符串长度应用${#变量名称}能够计算变量值的字符串长度 name="test"# 4echo ${#name}字符串替换只替换第一个合乎的字符串应用${变量/字符串/替换为的字符串}来进行替换第一个合乎的字符串 str="test..1.."replace=${str/../-}# test-1..echo $replace替换所有符合条件的字符串应用${变量//字符串/替换为的字符串}来进行替换所有符合条件的字符串 str="test..1.."replace=${str//../-}# test-1-echo $replacehttps://zhhll.icu/2022/linux/shell/字符串操作/本文由mdnice多平台公布

September 23, 2023 · 1 min · jiezi

关于程序员:Rust-vs-C-深度比较

Rust因为其弱小的安全性受到大量关注,被认为C++在零碎编程畛域最弱小的挑战者。本文从语言、框架等方面比拟了两者的优缺点。原文: Rust vs C++: An in-depth language comparison Rust和C++的比拟是开发人员最近的热门话题,两者之间有许多相似之处,许多开发人员想晓得哪一种更好(特地是对于零碎编程)。 这两种语言都在零碎开发畛域竞争,与Python等对初学者更敌对的语言相比,两者都有平缓的学习曲线。 在抉择某种编程语言时,应该思考对于特定用例的效率和生产力。本指南将深入研究Rust和C++,比拟两种语言的用处和优缺点。 概览: 什么是Rust?什么是C++?技术比拟框架游戏开发总结和论断 什么是Rust?Rust是Mozilla开发的一种多范式编程语言,次要关注性能和安全性,以其高级的平安并发能力而闻名,语法相似于C++,但提供了更快的速度和内存安全性(不应用垃圾收集器)。 Rust最后是为Mozilla Firefox浏览器开发的,但其效率及劣势吸引了许多C++开发人员,他们开始转而应用Rust(通常用于游戏开发)。Rust在内存治理方面独具翻新。例如,不容许空指针或野指针。因为其性能,Rust通常被用于构建设施驱动程序、嵌入式零碎、游戏和操作系统,如BlogOS、Redox、RustOS、Rux、Tock。 Rust代码以其在测试前调试代码的速度和能力而闻名。例如,Rust能够帮忙咱们开发在运行时查看代码谬误的程序。 Rust的显著特色内存治理内存平安所有权零碎多范式速度和性能Rust的Hello World: fn main() {println!("Hello World!");}-->Hello World! 什么是C++?C++是一种高级通用编译语言,曾经存在了很长时间。因为其简单的语法,C++代码通常用于须要高速、并发性的程序。C++以帮忙开发者真正靠近操作硬件而闻名。 C++是C语言的扩大,因而继承了许多相似之处,但更偏向于嵌入式软件和大型零碎。C++以其性能、健壮性和效率而闻名,提供了对系统及其内存的大量管制。C++是构建微软Windows等操作系统和电子游戏开发的次要语言,许多游戏开发框架都是用C++开发的。 C++还提供了丰盛的规范库,称为规范模板库(Standard Template Library)。有了STL,从图形界面利用到桌面利用、3D图形和游戏,所有都很容易构建。 C++的显著特色面向对象C++模板(STL)操作符重载继承Lambda表达式C++的Hello World: #include <iostream>using namespace std;int main() { // your code goes here cout << "Hello World"; return 0;}-->Hello World技术比拟那么,为什么要用Rust,或者为什么要用C++呢?如果两者都是高性能、开源、功能强大的,那么哪个是更好的抉择呢?咱们深入研究一下它们的技术组成部分。 从更高的角度来看,C++领有更大的社区、更宽泛的用例和更多框架,并且失去了所有软件公司的认可。另一方面,Rust在安全性、速度以及避免因为动态类型个性而导致的谬误、不平安代码方面体现更好。 Rust在避免可能导致未定义行为的数据竞争方面做得很好,而C++做不到这一点,并有可能产生破绽。内存安全性大多数零碎级语言都不提供主动内存治理,因为垃圾收集等个性会升高性能。为了放弃速度,C++就义了内存安全性,这是一个显著的毛病。 C++最近的更新有了一些新个性,如RAII(资源获取即初始化, Resource Acquisition is Initialization) ,以解脱手动内存治理,但并没有解决底层的外围问题。 为了解决这一问题,Rust应用了一种所有权零碎(system of ownership) ,该零碎全面增强并进步了内存安全性,基本上打消了任何手动内存治理过程。Rust为内存治理过程提供了内置个性,而C++则将其留给了开发者。 指针在计算机科学中,指针是存储内存地址的对象。换句话说,地址"指向"程序中的其余数据。智能指针是具备额定元数据和性能的数据结构。大多数高级和低级语言都有某种指针性能。 C++提供了能够像智能指针一样应用的类型std::shared_ptr和std::unique_ptr。Rust规范库中有几个智能指针,比方援用计数智能指针类型。 Rust和C++都以对象的模式大量应用智能指针(Rust中的String或C++中的std::string),并提供了许多有用的附加个性。 编译工夫C++和Rust的残缺构建工夫大致相同(取决于C++我的项目实现了多少个模板,模板越多越慢)。C++通常在增量编译方面做得更好。Rust的编译器以敌对著称,提供了有用的谬误音讯和一流的工具。 易用性大多数同时应用Rust和C++的人都说Rust更容易应用,因为它有定义良好的语义和避免不必要/未定义行为的能力。相似的,C++有如此多的个性,以至于要跟踪其倒退很有挑战性。因为C++向开发者展现了底层工作原理,所以C程序员能够十分好的了解其性能。 框架和类库只管Rust比C++更年老,但都提供了优良的框架和库,不过C++库往往更通用一些。这里的区别在于,C++不是像Java、C#或JavaScript那样的框架驱动环境,因而这些框架并不会被宽泛应用。 在Rust中,有几个提供了良好性能、安全性和健壮性代码的框架,例如: Rocket: 用于进步安全性、速度和灵活性的Rust web框架。Nickel: 用于开发具备明确验证规定、用户敌对的信息流控制系统的Rust框架。Azul: 基于Rust的即时模式GUI框架,用于开发桌面应用程序。在库方面,C++次要是规范库,这是类和函数的汇合,提供了几种通用容器、用于操作容器的函数、通用字符串和流(包含交互I/O和文件I/O)以及其余语言反对。 ...

September 23, 2023 · 1 min · jiezi

关于程序员:一文彻底搞懂JS作用域

JavaScript的作用域是一个十分根底且重要的概念,对于初学者来说,常常会感觉有些凌乱搞不清楚。本文会具体介绍JavaScript作用域,包含全局作用域、函数作用域和块级作用域,以及ES6+新增的let、const和block scope等个性,让你彻底搞懂作用域。 1. JavaScript作用域简介在JavaScript中,作用域是指在代码中定义变量的区域。这个区域定义了变量的可见性和生命周期。JavaScript有两种次要的作用域类型:全局作用域和函数作用域。 var globalVar = "I'm global!"; // 全局作用域function someFunction() { var functionVar = "I'm local!"; // 函数作用域 console.log(globalVar); // 能够拜访全局变量 console.log(functionVar); // 能够拜访函数内的变量}console.log(globalVar); // 能够拜访全局变量console.log(functionVar); // 报错,不能拜访函数内的变量2. 全局作用域在代码的任何中央都能拜访到的变量被定义在全局作用域。在浏览器环境中,全局变量被定义在window对象上。 3. 函数作用域在函数外部定义的变量只能在函数外部拜访,这就是函数作用域。这意味着,如果你在一个函数外部定义了一个变量,那么这个变量在函数内部是不可见的。 4. ES6+ 块级作用域ES6引入了两种新的申明形式:let和const,它们与var相比,最大的区别就是它们具备块级作用域。块级作用域是指变量在最近的{}代码块内无效。 if (true) { var varVar = "I'm var!"; // 函数作用域 let letVar = "I'm let!"; // 块级作用域 const constVar = "I'm const!"; // 块级作用域}console.log(varVar); // 输入 "I'm var!"console.log(letVar); // 报错,letVar未定义console.log(constVar); // 报错,constVar未定义5. let和constlet和const都是块级作用域,它们的作用范畴被限度在最近的一对花括号{}内。let容许你从新赋值,而const定义的是一个常量,一旦赋值就不能扭转。 ...

September 22, 2023 · 2 min · jiezi

关于程序员:行业追踪20230922

主动复盘 2023-09-22凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。 板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. 生物制品1. 动物照明1. 券商概念1. 减速器2. 翻新药2. 电子化学品2. 证券2. 证券3. CRO3. Chiplet概念3. ST股3. 银行4. 化学制药4. 3D摄像头4. 多元金融4. 券商概念5. 医疗器械5. 生产电子5. 银行5. 电机6. 中药概念6. 光学光电子6. 煤炭行业6. 激光雷达7. 工业大麻7. 煤炭行业7. 工业大麻7. 算力概念8. 医疗美容8. 通信设施8. 房地产开发8. 铁路公路9. 中药9. 翻新药9. 人造肉9. 汽车零部件10. 医疗服务10. 智能穿戴10. 装修建材10. 工业母机11. ST股11. 激光雷达11. 铁路公路11. 汽车热治理12. 精准医疗12. 无线耳机12. 互联金融12. 页岩气13. 化妆品概念13. 工业母机13. 土地流转13. 通信设施14. 铁路公路14. 空间站概念14. 酿酒行业14. 地摊经济15. 多元金融15. 屏下摄像15. 水泥建材15. 船舶制作16. 煤炭行业16. MiniLED16. 通信服务16. 通信服务17. 体外诊断17. 传感器17. 白酒17. 工业4.018. 啤酒概念18. PCB18. 化妆品概念18. 多元金融19. 航运港口19. 医疗器械19. 地摊经济19. 空气能热泵20. 银行20. 5G概念20. 商业百货20. 土地流转21. 疫苗冷链21. 半导体21. 医疗美容21. 屏下摄像22. 医疗器械概念22. 汽车芯片22. 化学制药22. 汽车整车23. 石油行业23. 北斗导航23. 纺织服装23. 煤炭行业24. 水泥建材24. 通信服务24. 美容护理24. 无人驾驶25. 钢铁行业25. ST股25. 装修装璜25. 燃气板块 rps20 排名详情板块详情1. 电子化学品2. 动物照明3. 3D摄像头4. Chiplet概念5. 生产电子6. 光学光电子7. 通信设施8. 翻新药9. 煤炭行业10. 激光雷达11. 智能穿戴12. 工业母机13. 无线耳机14. MiniLED15. 屏下摄像16. 空间站概念17. 传感器18. PCB19. 5G概念20. 医疗器械21. 半导体22. 汽车芯片23. 通信服务24. ST股25. 北斗导航板块 rps50 排名详情板块详情1. 券商概念2. 证券3. 多元金融4. ST股5. 银行6. 煤炭行业7. 人造肉8. 房地产开发9. 工业大麻10. 铁路公路11. 装修建材本文由mdnice多平台公布 ...

September 22, 2023 · 1 min · jiezi

关于程序员:代码整洁之道程序员的职业素养十二

压力无论是在工作还是生存中,面对压力和挑战都是不可避免的。业余开发人员在压力下可能放弃沉着并果决应答,是他们训练和纪律的后果。 躲避压力:防止陷入会导致压力的处境是放弃沉着的最好形式。尽管齐全躲避压力可能不太可能,但通过采取一些措施能够大大降低压力的水平和持续时间。例如,与业务方沟通,寻找达成指标的办法,但不自觉承受业务方的承诺。如果无奈兑现承诺,要求过后做出承诺的人承担责任。放弃整洁:零碎、代码和设计的整洁可能防止压力的产生。放弃输入成绩整洁洁净,不容忍凌乱。凌乱会升高工作速度,导致工期延误,失信于承诺。因而,要尽力放弃整洁,但不要破费过多工夫在代码清理上。遵守纪律准则:抉择一些在危机时刻依然遵循的纪律准则,并在所有工作中坚守这些准则。遵守纪律准则是防止陷入危机的最佳路径。特地是在危机时刻,要放弃沉着和均衡。正确应答压力:放松本人,对问题进行三思而行。寻找可能带来最佳后果的门路,并以正当稳固的节奏后退。防止惊恐的产生,因为惊恐会使压力加倍减少,让人愤恨和失去理性。求助和结对:及时与团队和主管沟通,告知本人所面临的窘境,并提出解决方案的打算。寻求他们的反对和领导,防止陷入惊恐状态。此外,结对编程能够帮忙疾速后退,缩小缺点。结对搭档可能守住准则,防止精力错乱,并提供有帮忙的想法。在压力下放弃沉着并应答挑战是一项重要的能力。通过躲避压力、放弃整洁、遵守纪律准则、正确应答压力以及求助和结对,咱们能够无效地解决压力和挑战。在面临窘境时,沉着思考并采取适当的口头,将会使咱们更好地应答压力,并取得成功。

September 22, 2023 · 1 min · jiezi

关于程序员:shell-重定向

重定向文件的规范操作分为 规范输出(stdin)、规范输入(stdout)、规范报错输入(stderr) 输出重定向输出重定向符是< 规范输出 文件描述符是0# 命令的输出来自于文件而不是键盘command < input-file输入重定向输入重定向符是> bash的输入分为规范输入和谬误输入 规范输入 文件描述符是1谬误输入 文件描述符是2而输入重定向能够将本应该输入到控制台的内容输入到文件 规范输入重定向 命令 > 文件 笼罩原文件内容 命令 >> 文件 追加谬误输入重定向 谬误命令 2>文件 笼罩原文件内容 谬误命令 2>文件 追加应用 # 把命令的规范输入保留到文件中 再将谬误输入保留到参数1中,即文件中命令 >> 文件 2>&1能够将命令输入内容追加到文件中(不论是错误信息还是正确信息) https://zhhll.icu/2021/linux/shell/重定向/本文由mdnice多平台公布

September 22, 2023 · 1 min · jiezi

关于程序员:基础算法

01.前缀和概念:前缀和是指在一个数列中,以某个数字作为前缀的数字和 一维数组一维前缀和数组模板 sum[0]=arr[0]; i=0 sum[i]=sum[i-1]+arr[i]; i>0int arr[5] = {2,3,5,7,11}; int sum[5]; for(int i = 0;i < 5;i++) { if(i == 0) sum[i] = arr[i]; else sum[i] = sum[i-1] + arr[i]; } //输入sum数组验证 for(int i = 0;i < 5;i++) cout << sum[i] << " "; //输入2 5 10 17 28作用:求区间[l,r]内的数组和 区间[l,r]的和 = arr[l]+arr[l+1]+...arr[r-1]+arr[r];sum[r]-sum[l-1] = sum[0]+sum[1]+...sum[l-2]+sum[l-1]+sum[l]+...sum[r] - sum[0]+sum[1]+...sum[l-2]+sum[l-1] =sum[l]+...sum[r]由此可得,当求一个数组在区间[l,r]内的和,咱们能够用它的前缀和和数组疾速得出答案

September 22, 2023 · 1 min · jiezi

关于程序员:前端性能优化必杀技骨架屏让你快人一步

在古代前端开发中,用户体验和性能优化始终是小伙伴们谋求的指标之一。骨架屏(Skeleton Screen)作为一种优化用户界面加载速度的办法,利用在各种(App/小程序/h5)利用外面。本文将深入探讨骨架屏的最佳实际,联合代码案例,介绍如何实现和优化骨架屏。什么是骨架屏?骨架屏是一种在页面加载过程中,以占位符模式展现页面构造的技术。它通过显示简略的灰色块和线条,让用户在期待内容加载时取得视觉反馈,进步了用户的满意度。 为什么须要骨架屏?在挪动设施和慢速网络环境下,页面加载速度变得尤为要害。用户不愿期待长时间能力看到页面内容。骨架屏可能在内容加载齐全之前疾速展现页面构造,让用户感触到页面加载的进度,从而进步了用户体验。 应用纯 CSS 实现骨架屏实现骨架屏的办法有很多,能够应用纯CSS,也能够应用SVG,甚至还能够利用一些前端库。上面咱们以一个简略的纯CSS实现为例。 1、实现简略的html骨架页面<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Skeleton Example</title></head><body> <div class="skeleton"> <div class="skeleton-header"></div> <div class="skeleton-body"> <div class="skeleton-line"></div> <div class="skeleton-line"></div> <div class="skeleton-line"></div> </div></div></body></html>2、实现骨架屏款式/* skeleton.css */.skeleton { width: 300px; padding: 20px; background-color: #f6f7f8;}.skeleton-header { width: 100%; height: 200px; background-color: #e0e0e0;}.skeleton-body .skeleton-line { width: 100%; height: 20px; margin-top: 20px; background-color: #e0e0e0;}实现成果如图,骨架屏尽管简略,但要做得好,还能够进一步优化。 3、骨架屏优化/* CSS */@keyframes shimmer { 0% { background-position: -468px 0; } 100% { background-position: 468px 0; }}.skeleton-header, .skeleton-body .skeleton-line { animation-duration: 1.25s; animation-fill-mode: forwards; animation-iteration-count: infinite; animation-name: shimmer; animation-timing-function: linear; background: #f6f7f8; background: linear-gradient(to right, #eeeeee 8%, #dddddd 18%, #eeeeee 33%); background-size: 800px 104px; position: relative;} ...

September 21, 2023 · 1 min · jiezi

关于程序员:行业追踪20230921

主动复盘 2023-09-21凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。 板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. 生物制品1. 电子化学品1. ST股1. 银行2. 翻新药2. 煤炭行业2. 煤炭行业2. 减速器3. ST股3. 翻新药3. 证券3. 证券4. 化学制药4. ST股4. 多元金融4. 铁路公路5. 中药概念5. 化学制药5. 银行5. 券商概念6. CRO6. 动物照明6. 券商概念6. 煤炭行业7. 医疗美容7. 空间站概念7. 房地产开发7. 电机8. 医疗器械8. 光学光电子8. 工业大麻8. 汽车零部件9. 中药9. Chiplet概念9. 铁路公路9. 激光雷达10. 铁路公路10. 生物制品10. 人造肉10. 汽车热治理11. 精准医疗11. 医疗器械11. 装修建材11. 船舶制作12. 医疗服务12. 激光雷达12. 土地流转12. 地摊经济13. 工业大麻13. 中药概念13. 互联金融13. 页岩气14. 航运港口14. 3D摄像头14. 水泥建材14. 汽车整车15. 多元金融15. 智能穿戴15. 通信服务15. 土地流转16. 体外诊断16. 稀缺资源16. 石油行业16. 多元金融17. 煤炭行业17. 医疗美容17. 钢铁行业17. 石油行业18. 银行18. 煤化工18. 航运港口18. 燃气19. 化妆品概念19. 工业母机19. 商业百货19. 工业母机20. 医疗器械概念20. 工业大麻20. 酿酒行业20. 空气能热泵21. 钢铁行业21. 生产电子21. 纺织服装21. 天然气22. 疫苗冷链22. 屏下摄像22. 白酒22. 工业4.023. 石油行业23. 无线耳机23. 医疗美容23. 动物照明24. 啤酒概念24. MiniLED24. 煤化工24. 油气设服25. 人造肉25. 中药25. 化妆品概念25. 中字头板块 rps20 排名详情板块详情1. 电子化学品2. 煤炭行业3. 翻新药4. ST股5. 化学制药6. 动物照明7. 光学光电子8. 空间站概念9. Chiplet概念10. 医疗器械11. 生物制品12. 激光雷达13. 中药概念14. 稀缺资源15. 3D摄像头16. 智能穿戴17. 医疗美容18. 煤化工19. 工业大麻20. 工业母机21. 屏下摄像22. 生产电子23. 无线耳机24. MiniLED25. 中药板块 rps50 排名详情板块详情1. ST股2. 煤炭行业3. 多元金融4. 证券5. 券商概念6. 银行7. 房地产开发8. 铁路公路9. 工业大麻10. 人造肉11. 装修建材本文由mdnice多平台公布 ...

September 21, 2023 · 1 min · jiezi

关于程序员:shell-重导和管道

重导和管道重导和管道不能独自应用,须要配合其余命令一起应用 重导重导可将命令后果输入到文件中,有两种模式">"和">>" ">"是将后果输入到文件中,将该文件中的原内容笼罩 ls -a > dir.txt">>"是将后果追加到文件中 ls -a >> dir.txt<!-- more --> 两个非凡文件/dev/null 当被用做重定向时,输入内容会被摈弃/dev/tty 当被用做重定向时,示意被重定向到终端管道管道的作用是将某个命令的后果输入作为另一个命令的输出,符号是"|" # 将ls命令后果传给grep,展现蕴含conf的文件ls | grep 'conf'https://zhhll.icu/2022/linux/shell/重导和管道/本文由mdnice多平台公布

September 21, 2023 · 1 min · jiezi

关于程序员:API网关是如何提升API接口安全管控能力的

API平安的重要性近几年,越来越多的企业开始数字化转型之路。数字化转型的外围是将企业的服务、资产和能力打包成服务(服务的模式通常为API,API又称接口,下文中提到的API和接口意思雷同),从而让资源之间造成更强的连贯和互动关系,开释原有资产的价值,晋升企业的服务能力。企业数字化转型使得基于API的业务零碎剧增,随之而来带来的平安问题也日渐凸显。Gartner预测,到2022年,API滥用将成为最常见的攻打媒介,导致企业呈现数据泄露。 API安全事件频发,技术能力当先的头部企业也屡遭数据泄露。2020年3月19日,有用户在暗网上发现微博的5.38亿用户信息在暗网发售,其中1.72亿条有账户根本信息,起因就是来自于终端APP的业务逻辑API被非法流量调用超过40亿次而导致。 API给企业带来的挑战有:1)资产理不清,有多少API对外开放、有多少敏感数据、有什么类型数据、是什么等级的数据;2)滥用管不住,API未经脱敏就间接应用、凋谢API被第三方零碎滥用;3)审计日志不具体,导致API安全事件产生后没有无效的溯源伎俩。 API安全性越来越重要,对API平安进行防护既有利于用户平安的应用API所提供的服务,又可能为用户的隐衷数据进行保驾护航。所以,进步API平安防护能力的问题亟待解决。面对以上局势,当初越来越多的企业采纳API网关来治理外部API。以下从API资产治理、API平安防护、API危险溯源三个方面介绍API网关如何对API进行全生命周期的平安治理。 API资产治理API网关反对API注册、分级分类、资产清单导出和API签约审批等。通过API网关,API提供者能够清晰把握每个调用方的应用状况,并且可严格把控API的签约应用,实现API的可管可控。 API平安防护1. 认证鉴权API网关反对依据能力提供者提供的相干API鉴权要求,要求能力使用者在应用相干API时,遵循相应的鉴权要求。 1)IP黑白名单认证IP黑白名单API策略适配器帮忙能力提供者对能力使用者的API 调用依照申请端IP黑白名单进行管制,确保API拜访的安全性。能力提供者针对每个API可独立设置IP黑白名单,每个IP地址都与能力使用者存在对应关系。 2)APPID身份认证能力使用者在应用API时,须要先注册APP,并获取APPID。 调用API时,以APP为单位调用,而不是以能力使用者身份调用。实践上同一个能力使用者的多个APP之间不容许在非受权状况下相互应用对方APP不具备的API。API网关网关需提供“APPID+ SecretKey”用于身份认证,认证通过后才容许该能力使用者调用API。APPID和SecretKey由零碎调配。当能力使用者在零碎中胜利创立APP后,零碎就主动为其调配APPID和SecretKey。能力提供者能够针对每个API设置APPID认证策略。 3)能力鉴权即便APPID认证通过,若该能力使用者调用未申请的接口,同样会被API网关拦挡。 4)密钥更换API网关为每个零碎或利用调配专属的秘钥,调用方零碎应用秘钥才有权限调用申请的API,秘钥一旦泄露,第三方就能够非法调用API,该性能能够防止秘钥泄露导致的API平安问题。 5)签名认证API网关反对签名认证,例如应用RSA非对称加密模式时,能力使用者在应用API时,须要应用APP私钥进行签名,从API网关获取 API响应或者API网关被动发送音讯给APP时,API网关会应用私钥进行签名,能力使用者须要通过API网关公钥验证,以确保消息来源牢靠。 2. 流量管制流量管制次要指对利用接入的流控和API拜访的流量管制。针对 API,流量控制策略适配器帮忙能力提供者对能力使用者的API调用依照设置的TPS进行拜访速率管制,从而能够拦挡非法调用并爱护后端API服务器。能力提供者针对每个API、签约利用加API、 签约利用等不同维度,可独立设置TPS,当能力使用者调用API时,API网关零碎将依照能力提供者设置的TPS值进行API 调用速率管制 3. 数据脱敏数据脱敏(Data Masking),又称数据漂白、数据去隐衷化或数据变形。数据脱敏的定义为:指对某些敏感数据通过脱敏规定进行数据的变形,实现敏感隐衷数据的牢靠爱护。这样,就能够在开发、测试和其它非生产环境以及外包环境中平安地应用脱敏后的实在数据集。敏感数据,又称隐衷数据,常见的敏感数据有: 姓名、身份证号码、地址、电话号码、银行账号、邮箱地址、所属城市、邮编、明码类 ( 如账户查问明码、取款明码、登录明码等 )、组织机构名称、营业执照号码、银行帐号、交易日期、交易金额等。 4. 传输平安API网关零碎反对接口的HTTPS协定传输。HTTPS顾名思义,即平安的HTTP,一般的HTTP申请和响应对任何监控网络传输的用户都可见,而HTTPS传输的信息通过平安传输层(TLS,也被称为SSL)暗藏和爱护。HTTPS的次要作用是,确认单方的身份,和建设平安通道,保障传输数据的平安,保障接口业务在调用过程中的防篡改等平安能力。 API危险溯源API网关基于日志行为审计的危险溯源, 解决3个外围,5个因素。3个外围次要是指:谁,应用了什么账号(用户)?拜访了哪些API(利用)?查问了哪些敏感数据(内容)?5个因素是指:什么时候(工夫)?什么IP(地点)?查问了哪些涉敏数据(操作)?胜利与否和次数多少(后果)?此外还有账户行为详细分析与可视化统计无效防止事故责任难追溯的问题(画像)。基于以上因素,API网关提供日志审计的性能,可对系统日志和接口调用的的异样进行剖析,日志审计内容包含: 登陆日志的审计。提供用户登录次数,登陆地点,登陆工夫,校验失败次数,验证码验证状况等的剖析记录,为运营者提供平台是否被暴力破解,攻打等行为的判断。零碎用户的操作日志审计,提供操作行为的统计分析数据,为运营者提供破坏者等的行为判断根据。平安调用审计,提供拜访申请起源,拜访频率,流量,拜访时段等的剖析数据,为运营者提供平台是否收到非法攻打,歹意调用的行为判断根据。数据安全审计,提供数据存储的拜访状况,拜访账号,拜访数据信息及记录等,为运营者提供数据是否被歹意窃取,被批量操作等提供判断根据。 总结API网关对API的平安管控基于多种规定的穿插,实现对网络层、应用层、信息层的安全策略的利用、审计和管制,来保障对外开放API时业务、数据、利用的平安。API网关对API的爱护贯通API的创立、上线、凋谢、传输、以及最终销毁的全生命周期。除以上本文提到的API平安管控性能外,API网关也提供实时的告警监控,可能及时对API调用的异常情况收回告警,无效保障API的稳固运行和对外服务。本文由mdnice多平台公布

September 21, 2023 · 1 min · jiezi

关于程序员:提升技术招聘有效性|-杜绝候选人刷题应试

企业在技术人员招聘中,时常呈现候选人“口试考高分,工作写Bug,绩效来垫底”的难堪困境,让企业倍感煎熬。不仅浪费时间精力、也增大招人的老本投入。 如何招到真正适合的技术人选,成为摆在企业心头的难题。 适合的技术人才,象征能满足理论工作的需要,而非仅有一堆理论知识储备。 对企业而言,候选人解决理论问题的工程能力 > 理论知识。 技术招聘过程中,是否继续挖掘出候选人解决理论问题的工程能力,决定了招聘的长期有效性(也可称为招聘的信效度)。 在接下来的几篇文章中,咱们会谈谈企业应该如何晋升招聘的信效度。 在本篇里,咱们将探讨下在技术招聘中,口试题目反复呈现,对招聘有效性产生的负面影响。 01 口试题反复呈现的问题:应试者刷题在网上搜寻“程序员大厂题库”等关键词,可检索到各类技术岗位的题库包,尤其是各类大厂的题目。 这反映出显著问题,候选人总寄希望于刷题取得企业技术岗位,早已成为当今公开的机密与趋势。 刷题景象的本源之一,在于企业一直复用几套同类题库,发送给大量候选人口试,之后又被候选人记录下来,又陆续分享给其余候选人。 长此以往,会产生两大问题: 第一,同样反复的题目,会有不同候选人在同一场口试中,或者相邻场次间互相串通,一个人把题目甚至答案提前告知另一人,最终升高招聘有效性。 第二,被长期重复刷过的各类题库,会变得无奈再精确评估候选人的实在技术能力。 对于第二点,一位科技企业CEO 曾跟咱们分享过他的亲自故事,他的技术部门曾以各类实践算法题招聘高分候选人,入职后发现他这人上班后既不劳动也不娱乐,而是热衷于刷各类编程题型。 但后果呢?工作中照样Bug 一直,绩效垫底,最终只能花钱请人来到,草草收场。后果那人又被另一家企业高薪聘用。 其实许多大厂搭建题库,自有其情理。早年通过各类被戏称为“八股文”的结构化题目,能够从侧面间接反映出候选人的技术能力。 正如想疾速理解一个人的学识,能够让他列举书单一样。 但也正如数学考试,光会背公式远远不够,利用公式去解决问题才是要害。 这种只考“公式”记忆的形式流于滥觞。因为这类题型反复呈现,题目与答案都是理论知识绝对容易记忆,于是各类题库包以及笔/面试攻略如雨后春笋般在网上涌现。 大量应试者应运而生,他们不足实战我的项目的磨砺,靠着死记硬背的常识取得了进入各类企业的快捷船票,但又不足理论工程能力。 通过大量背诵记忆“如何造航母”的高分候选人,入职后可能连“螺丝”都拧不好。 02 更新题库面临的艰难企业想要杜绝“刷题”导致的低效招聘,抉择之一就是不断更新本人的题库。但更新题库,会面临如下两点艰难:  1. 出题与验证费时费力 企业出题须要基于所招岗位的画像、所需能力来制订出一套出题规范。个别大厂有能力自行制订,中小企业往往只能参考大厂并依据本身需要作调整。 依据规范从新出题,或者重新制定出题规范,都将消耗企业大量工夫。并且调整后对题目进行验证、检测与迭代,也须要技术部门投入不少精力。 2. 规范比拟形象,难保题目品质的稳固 出题规范中的岗位能力需要是一种比拟形象的概念,比方“纯熟应用MySQL” 中,什么是“纯熟”?每家企业或每个出题官都可能有不同的认知。 依据形象需要主观调整题目难度,会导致出题品质的不稳固。 有的企业经常出现一开始出题过于简略,招到不满足工作需要的人选;之后出题又太难,导致基本招不到人。 前后两套试卷的难度不对立,不仅有损招聘的偏心,打击候选人的积极性,更侵害了招聘的有效性。 企业反复出同类型题目,而且都是算法/八股文,更新题库又费时费力且难保品质稳固,这些都升高了技术招聘有效性。 那有没有办法能解决以上问题呢? 03 具像化出题规范,类似题随机替换ShowMeBug 作为一款反对实战编程的技术能力评估平台,总结了大量过往实战我的项目,提炼实战知识点并搭建题库,致力于开掘候选人的实在技术能力。 ShowMeBug 的题型笼罩了32 种支流技术岗位,许多实战题型均为与行业专家和大厂单干独家研发的非公开题,并且题库以每月400 道的速度更新,杜绝了候选人提前刷题的可能性。 并且,为了防止同场口试中候选人串通舞弊,以及长期招聘后题型泄露导致刷题等问题,ShowMeBug 还反对类似题“随机出题”性能,可供企业设置。 企业可在官网后盾中创立试卷,在题目设置中可看到“寻找类似题”的按钮。 点击后零碎会在题库中寻找类似的题目,并在下方列举。企业可点击“随机出题”,并抉择下方的类似题目。这样,同一场口试中,不同候选人将会抽中不同的类似题目。 如何实现不同题目下难度的对立?ShowMeBug 自研了岗位能力模型,作为出题规范,可间接供企业应用或参考。 该模型将形象的岗位画像,细化为一条条的能力维度。再将这些能力维度,细化为一一技能与知识点,并基于知识点出题考核。 这样就将出题规范中形象的岗位能力,细化为了一一具体的知识点,也便于企业进行自定义调整、批改,并以此出题。 所以在零碎给出的类似题目中,均是基于同样的能力维度、同样的题型,保障了不同题目领有同样的难度、同样的分值。 总之,企业可间接应用ShowMeBug 独家实战题库,深挖候选人实力;间接应用或者参考ShowMeBug 能力模型,依据本身需要智能组卷,节俭大量工夫精力。 “随机出题”性能还让试卷随机化,让每一次考试、每个人的试卷都不一样,真正做到“千人千卷”,让候选人无奈临场串通,也让背题、泄题,其余候选人靠刷题来应试的行为失去意义。 并且在保障题目差异化的同时,还能基于同一能力维度,让候选人进行同样类型的实战编程能力考核,保障了招聘的偏心与有效性。 您的企业也苦恼于候选人刷题应试吗?用ShowMeBug 试试疾速组建多样化的试卷,深挖候选人实在技术能力吧。

September 21, 2023 · 1 min · jiezi

关于程序员:eBPF深度探索-高效DNS监控实现

eBPF能够灵便扩大Linux内核机制,本文通过实现一个DNS监控工具为例,介绍了怎么开发理论的eBPF利用。原文: A Deep Dive into eBPF: Writing an Efficient DNS MonitoringeBPF是内核内置的虚拟机,在Linux内核外部提供了高层库、指令集以及执行环境,被用于诸多Linux内核子系统,特地是网络、跟踪、调试和平安畛域。其性能即反对扭转内核对数据包的解决,也容许对网络设备(如智能网卡)进行编程。 曾经有大量各种语言的对于eBPF的介绍文章,所以本文不会过多波及eBPF的细节。只管许多文章都提供了相当多的信息,但都没有答复最重要的问题: eBPF是如何解决数据包并监督从主机发送给用户的数据包的?本文将从头开始创立一个理论的应用程序,逐渐丰盛其性能,特地是监控DNS申请、响应及其过程,并提供所有这些过程的解释、评论以及源代码链接。因为想多举几个例子,而不仅仅只是繁多问题的解决方案,因而有时候咱们会略微有点偏题。最终心愿那些想要相熟eBPF的人能够花更少的工夫钻研有用的资料,并更快的开始编程。 简介假如主机能够发送非法的DNS申请,但发送这些申请的IP地址是未知的。在网络过滤器日志中,能够看到一直受到申请,但不分明这是非法申请,还是信息曾经泄露给了攻击者?如果发送数据的服务器所在的域是已知的,那就容易了。可怜的是,PTR曾经过期,SecurityTrails显示这个IP要么什么都没有,要么有太多乌七八糟的货色。 咱们能够执行tcpdump命令,然而谁违心始终盯着显示器呢?如果有多个服务器又怎么办呢?ELK技术栈里有packetbeat,这是一个能够吃掉服务器上所有处理器解决能力的怪物。Osquery也是一个很好的工具,它十分理解网络连接,但不理解DNS查问,相干反对曾经不再提供了。Zeek是一个我在寻找如何跟踪DNS查问时理解到的工具,看起来还不错,但有两点让人感到困惑: 它不仅仅监督DNS,这意味着资源还将花在我不须要的工作上(兴许只管能够在设置中抉择协定),它也不晓得是哪个过程发送了申请。 咱们将用Python并从最简略的局部开始编写代码,从而了解Python是如何与eBPF交互的。首先装置这些包: #apt install python3-bpfcc bpfcc-tools libbpfcc linux-headers-$(uname -r)这是在Ubuntu下的命令,然而如果想要深刻内核,为其余发行版找到必要的包应该也不是问题。当初让咱们开始吧: #!/usr/bin/env python3from bcc import BPFFIRST_BPF = r"""int first(void *ctx) { bpf_trace_printk("Hello world! execve() is calling\n"); return 0;}"""bpf = BPF(text=FIRST_BPF)bpf.attach_kprobe(event=bpf.get_syscall_fnname("execve"), fn_name="first")while True: try: (_, _, _, _, _, event_b) = bpf.trace_fields() events = event_b.decode('utf8') if 'Hello world' in events: print(events) except ValueError: continue except KeyboardInterrupt: break留神: 在Ubuntu 20.04 LTS和18.04 LTS中,默认状况下容许无特权用户加载eBPF程序,但在最近的Ubuntu版本(21.10和22.04 LTS)中,出于平安思考,默认禁用了这一性能。通过以下命令能够重启此能力: ...

September 21, 2023 · 9 min · jiezi

关于程序员:一文彻底搞懂JS函数柯里化

函数柯里化是一种弱小的函数式编程技术,它使咱们可能预设函数的参数,创立新的函数,并在须要的时候执行这些函数。这个技术提供了弱小的代码复用和组合能力,使咱们的代码变得更简洁、更具可读性。什么是函数柯里化?函数柯里化(Currying)是在函数式编程中罕用的技术,它的根本思维是将一个带有多个参数的函数转化为一系列应用一个参数的函数。这种转化能够使咱们在函数调用时只提供局部参数,从而失去一个新的函数,这个新的函数接管剩下的参数。 函数柯里化的长处次要有两个长处: 参数复用:咱们能够创立一个新的函数,它的一部分参数曾经被预设好了。提早执行:咱们能够创立一系列的函数,只有在真正须要执行时才提供所有的参数。如何实现函数柯里化?在JavaScript中,实现函数柯里化的一种常见办法是应用高阶函数。上面是一个简略的柯里化函数的实现: function curry(fn) { var arity = fn.length; return function f1(...args) { if (args.length >= arity) { return fn(...args); } else { return function f2(...moreArgs) { const newArgs = [...args, ...moreArgs]; return f1(...newArgs); } } };}在上述代码中,curry函数承受一个函数fn作为参数,而后返回一个新的函数f1。如果f1接管的参数个数大于或等于fn的参数个数,就间接调用fn,否则返回一个新的函数f2,这个函数会将新的参数和旧的参数合并,而后递归调用f1。 如何应用函数柯里化?上面这个例子,演示如何应用下面的curry函数: // 原始函数function multiply(a, b, c) { return a * b * c;}// 柯里化后的函数var curriedMultiply = curry(multiply);// 应用柯里化后的函数var temp = curriedMultiply(2); // 返回一个新的函数console.log(temp(3)(4)); // 输入 24在上述代码中,咱们首先定义了一个函数multiply,而后应用curry函数将其柯里化。通过调用柯里化后的函数,咱们能够在不同的工夫点提供不同的参数,并失去新的函数。最初,咱们通过提供所有的参数,失去了最终的后果。 总结下函数柯里化的长处: 参数复用:柯里化能够使咱们在定义函数时设置一些通用的参数,而后生成一个新的函数,咱们在调用这个新的函数时只须要提供剩下的参数。这样能够缩小反复代码,进步代码复用性。 例如,如果咱们有一个增加事件监听的函数,它须要元素、事件类型和处理函数作为参数。如果咱们要为多个元素增加雷同类型的事件和处理函数,咱们能够把这个函数柯里化,预设事件类型和处理函数,而后为每个元素生成一个新的函数。 提早执行:柯里化的函数在接管到足够的参数之前不会执行,而是返回一个新的函数,期待残余的参数。这意味着咱们能够在任何须要的时候提供参数,而后在最初一刻计算结果。这对于一些须要简单计算的函数来说特地有用,咱们能够把参数的收集和理论的计算离开,只在须要后果的时候进行计算。进步代码可读性:通过柯里化,咱们能够创立更具描述性的函数,进步代码的可读性和可维护性。这是因为柯里化的函数通常会有更具体的用处和更明确的函数名。函数组合:柯里化能够使函数更容易组合。咱们能够创立一系列的小函数,每个函数只做一件事,而后通过柯里化和函数组合来创立更简单的函数。这是函数式编程的一种常见手法。最初还是要提一点,<font color=red>柯里化函数的次要指标是提供参数复用和提早执行的性能,而不是进步性能</font>。因而,柯里化函数可能会比原始函数略微慢一些,但对利用的性能影响微不足道。 ...

September 20, 2023 · 1 min · jiezi

关于程序员:行业追踪20230920

主动复盘 2023-09-20凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。 板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. 翻新药1. 电子化学品1. 证券1. 减速器2. 生物制品2. 煤炭行业2. 煤炭行业2. 银行3. 化学制药3. 翻新药3. 券商概念3. 铁路公路4. ST股4. 化学制药4. 多元金融4. 证券5. CRO5. 生物制品5. ST股5. 汽车零部件6. 中药概念6. ST股6. 银行6. 汽车热治理7. 医疗器械7. 医疗器械7. 铁路公路7. 电机8. 医疗美容8. 动物照明8. 房地产开发8. 激光雷达9. 铁路公路9. 医疗服务9. 人造肉9. 券商概念10. 中药10. 医疗美容10. 工业大麻10. 地摊经济11. 精准医疗11. CRO11. 酿酒行业11. 煤炭行业12. 多元金融12. 中药概念12. 土地流转12. 页岩气13. 医疗服务13. 稀缺资源13. 装修建材13. 算力概念14. 银行14. 钛白粉14. 白酒14. 工业母机15. 工业大麻15. 精准医疗15. 水泥建材15. 空气能热泵16. 煤炭行业16. Chiplet概念16. 互联金融16. 汽车整车17. 体外诊断17. 工业大麻17. 石油行业17. 多元金融18. 化妆品概念18. 空间站概念18. 通信服务18. 燃气19. 人造肉19. 培养钻石19. 水产养殖19. 土地流转20. 航运港口20. 中药20. 化妆品概念20. 船舶制作21. 鸡肉概念21. 体外诊断21. 商业百货21. 工业4.022. 石油行业22. 化妆品概念22. 医疗美容22. 天然气23. 水产养殖23. 无线耳机23. 钢铁行业23. 动物照明24. 啤酒概念24. 光学光电子24. 纺织服装24. 石油行业25. 医疗器械概念25. 煤化工25. 美容护理25. 油气设服板块 rps20 排名详情板块详情1. 煤炭行业2. 电子化学品3. 化学制药4. 翻新药5. 生物制品6. ST股7. 医疗器械8. 动物照明9. 医疗服务10. 医疗美容11. CRO12. 稀缺资源13. 中药概念14. 钛白粉15. Chiplet概念16. 精准医疗17. 空间站概念18. 工业大麻19. 中药20. 培养钻石21. 化妆品概念22. 体外诊断23. 无线耳机24. 煤化工25. 光学光电子板块 rps50 排名详情板块详情1. 煤炭行业2. 证券3. 券商概念4. 多元金融5. ST股6. 银行7. 房地产开发8. 铁路公路9. 人造肉10. 工业大麻11. 酿酒行业本文由mdnice多平台公布 ...

September 20, 2023 · 1 min · jiezi

关于程序员:shell-循环语句

循环语句Bash中有三种能够用来反复执行一系列命令的语句:for循环语句、while循环语句和until循环语句 for循环#for循环的语法一 for 变量 in 列表 do 语句 done#for循环的语法二for (( 初始值;循环管制条件;变量变动 )) do 语句 done<!-- more --> 示例: #!/bin/bash# 语法一for num in 1 2 3 4 5do echo "num is $num"done#语法二for (( i=0;i<=5;i++ )) do echo "num is $i" donewhile循环#while循环的语法 while [ 循环条件 ] do 语句 done示例: 1到10相加 #!/bin/bashsum=0i=1while [ $i -le 10 ]do sum=$(($sum+$i)) i=$(($i+1))doneecho $sumuntil循环until循环和while循环相同,until循环只有条件不成立则进行循环,一旦条件成立,则终止 #until循环的语法until [ 循环条件 ]do 语句done示例: 1到10相加 #!/bin/bashsum=0i=1until [ $i -gt 10 ]do sum=$(($sum+$i)) i=$(($i+1))doneecho $sum退出循环退出循环次要应用exit、continue、break这三个来进行管制 ...

September 20, 2023 · 1 min · jiezi

关于程序员:代码整洁之道程序员的职业素养十一

预估预估是软件开发中一项重要而又艰难的流动。它既关乎业务价值,又影响开发团队的名誉。然而,预估常常成为业务人员和开发人员之间的阻碍,造成单方的不信赖和沟通艰难。在这篇文章中,我将探讨预估的挑战以及如何进步预估的准确性和可信度。 首先,让咱们回顾一下预估的实质。预估是一种猜想,它是基于对工作复杂性和开发人员能力的感性判断。然而,不同的人对预估有不同的了解。业务方往往将预估视为承诺,冀望开发人员按时交付。而开发人员则将预估视为猜想,他们晓得在软件开发中难以避免的不确定性。因而,为了解决这一阻碍,咱们须要建设相互理解和信赖的根底。 为了进步预估的准确性和可信度,以下是几点倡议: 拆分工作:将大工作拆分成小工作,以便更准确地估算工时。拆分工作有助于了解工作的实质和可能的危险因素。同时,拆分工作还能够缩小对预估后果的影响,因为小工作的预估谬误绝对较小。利用专业知识:业余开发人员应该利用本人的教训和常识来进步预估的准确性。他们应该深刻理解我的项目的需要和技术细节,以便更好地评估工作的复杂性和可能的挑战。单干探讨:预估不应该是一个孤立的流动。开发人员应该与团队中的其余成员进行单干探讨,独特评估工作的工时和危险。通过集思广益,能够更全面地思考各种因素,进步预估的准确性。通明沟通:开发人员应该与业务方进行通明沟通,将预估后果以概率的模式出现,阐明可能的不确定性和危险。这样能够帮忙业务方更好地了解预估后果,并做出相应的打算和决策。最初,我想分享我的独特见解。预估是一项艺术而非迷信。它受到许多因素的影响,包含工作的复杂性、开发人员的教训和技能、我的项目的紧急水平等等。因而,预估永远不可能齐全精确。然而,通过一直学习和改良,咱们能够逐步进步预估的准确性和可信度。同时,预估也是一项团队流动,须要各方的共同努力和了解。只有通过相互合作和沟通,咱们能力在预估中获得更好的后果。 在软件开发中,预估是一项必不可少的流动。只管它具备挑战性,但通过正当的办法和团队的共同努力,咱们能够进步预估的准确性和可信度。最重要的是,预估应该被视为一种沟通和打算的工具,而不是承诺的保障。只有通过通明和单干的形式,咱们能力在预估中获得更好的后果,并实现胜利的我的项目交付。

September 20, 2023 · 1 min · jiezi

关于程序员:日志的艺术

良好的日志是运维、开发人员排查问题的好工具,本文倡议定义JSON格局的结构化日志格局,从而无效优化人工以及机器排查日志的效力,并能不便创立机器索引。原文: The Art of Logging 从历史上看,日志对于诊断应用程序和基础设施性能十分重要,被广泛应用于业务仪表板的可视化和性能剖析。 对日志文件中的数据进行结构化,以便可能无效提取、操作和剖析数据(除了便于人类了解,也便于机器剖析)的重要性正在迅速回升。此外,微服务的衰亡也带来了另一个挑战,即怎么在整个零碎中跟踪申请的流传。 本文将介绍便于人和机器解析、了解的日志构造的最佳格局,特地是跟用户登录无关的要害信息及数据结构的倡议,并将尝试提供一些重要的注意事项。 为什么日志应该是人类可读的?只管日志最后是由机器来解析、解决和存储的,但当初正越来越多的由人类来读取、了解和诊断。日志是咱们考察凶杀现场的最佳指标,而凶手正是咱们的死敌: Bug! 没什么比试图了解简短而且非结构化的日志线中失落的信息更令人丧气和耗时的了。日志必须有有意义,并且人们应该能够很容易了解和深刻开掘与他们无关的内容。 66.249.65.159 - - [06/Nov/2014:19:10:38 +0000] "GET /news/53f8d72920ba2744fe873ebc.html HTTP/1.1" 404 177 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.16)"只管咱们曾经习惯了默认的Nginx格局,但下面的示例依然很难浏览和解决。例如,这是为了再现生产bug而提取的微小日志文件的一部分,很难了解其背地含意是什么。 JSON绝对于其余数据交换格局(如XML)的劣势非常明显,这是一种在数组中有序嵌套的键值对的简略语法,对人类来说很容易读、写和了解。 那么,用JSON编写的日志音讯是什么样子的呢?以下是与之前雷同的JSON格局的Nginx web服务器日志示例: {"time": "06/May/2022:19:10:38 +0100","remote_ip": "66.249.65.159","remote_user": "-","request": "GET /news/53f8d72920ba2744fe873ebc.html HTTP/1.1","response": 404,"bytes": 177,"referrer": "-","agent": "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.16)"}为什么日志应该是对机器敌对的?再次思考下面的日志线示例: 66.249.65.159 - - [06/Nov/2014:19:10:38 +0000] "GET /news/53f8d72920ba2744fe873ebc.html HTTP/1.1" 404 177 "-" "Debian APT-HTTP/1.3 (0.8.16~exp12ubuntu10.16)"为了了解,咱们须要: 了解语法编写逻辑来解析音讯并提取须要的数据可怜的是,这种逻辑很软弱,如果日志格局产生了更改(比方开发人员增加了一个新字段或更改了字段程序),那么解析器就会解体,置信任何人都有面对或经验相似问题的时候。 而这就是像JSON这样的结构化格局能够提供帮忙的中央。键值对使提取特定值和跨数据集筛选和搜寻变得容易,如果增加了新的键值对,解析日志音讯的软件将只是疏忽那些非冀望的键,而不会齐全生效。 在机器上应用JSON日志的益处是: 具备结构化的格局,因而便于剖析日志和查问每个字段。每种编程语言都能够对其进行解析。通常,咱们能够在日志解析零碎(ELK、newRelic、Datadog等)中聚合JSON数据,从而为咱们提供弱小的报告、搜寻和对数据的洞察能力。这些工具使索引某些字段变得更容易,从而解决在微服务环境下跟踪申请的问题。 应该蕴含哪些信息?这里列举了应该蕴含在日志中的信息列表,有些元素是可选的,字段名后面的(o)示意可选字段。 message <string>: 用于形容状况的人类可读的信息,在过滤时易于浏览,以取得对内容的概述。level <integer>: 优先级级别的数值示意(下一节将具体介绍),对于将音讯按不同优先级排序或生成蕴含零碎概述的仪表板十分有用。level_name <string>: 优先级级别的字符串示意(更多细节将在下一节中介绍)。datetime_iso <DateTime>: iso8601格局的日期,因为咱们须要将工夫与其余事件相关联,因而是必填项。只管能够应用服务器的日期-工夫,但可能会产生误导,因为服务器的工夫可能并不统一,甚至可能位于不同的时区。correlation_id <string(uuidv4)>: 这是微服务环境的一个重要字段,咱们将基于解析后的音讯/申请的correlation id来跟踪服务之间整个链路的申请。(o)hostname <string>: 用于确定是哪台机器生成了此日志,倡议在微服务环境中应用。当服务器日志曾经从docker的服务名映射到原始主机时,可能是多余的。(o)build_id <string>: 记录信息的软件版本,能够帮忙跟踪不兼容问题,特地是那些在服务器端软件部署期间产生的问题。(o)application<string>: 用于辨认哪个设施或应用程序生成了此日志。(o)owner_id <string(uuidv4)/null>: 报告用户id或API key id(如果有的话),能够追踪用户执行了哪些步骤来再现他的操作。(o)tenant_id <string(uuidv4)/null>: 报告可用的租户id,对于多租户零碎十分有用。(o)tags <string[]>: 能够是一个元素数组,蕴含对于申请的元信息,如类型、应用的协定等。(o)stacktrace: <string/null>: 有stack trace时以字符串格局显示stack trace。(o)exception: <string/null>: 有异样音讯时显示异样音讯。日志级别和相干日志码<style> table th:first-of-type { width: 100px; } </style> ...

September 20, 2023 · 1 min · jiezi

关于程序员:生信技巧-GNU-并行操作

简介有些剖析须要很长时间,因为它在单个处理器上运行并且有大量数据须要解决。如果数据能够分成块并独自解决,那么问题就被认为是可并行化的。 数据并行状况当文件的每一行都能够独自解决时基因组的每条染色体都能够独自解决组件的每个脚手架都能够独自解决解决并行压缩或解压缩 10 到 100 个文件计算大文件中的行数将许多样本的原始测序数据文件与基因组进行比对不能并行的状况基因组组装并不是简略的可并行化,因为第一步须要将每个读数与其余读数进行对齐,以便找到哪些读数类似并且应该连贯(组装)。获取读取的子集会导致低质量的组装后果。 GNU 并行咱们用来并行化生物信息学问题的程序是 GNU 并行。它是“一种应用一个或多个计算节点并行执行作业的 shell 工具”。 GNU 并行可帮忙您运行本来要按程序一项一项或循环运行的作业。您能够查看 GNU Parallel 网站,以确定如何在集群上装置 Parallel 和/或理解如何应用它。 ubuntu装置sudo apt update # 更新包列表sudo apt install parallel# 版本查看parallel --version集群,咱们加载模块并查看版本# 集群load 模块module load parallel # 版本查看parallel --version 一般状况咱们将应用纽约时报 github 存储库整顿的 COVID-19 数据 mkdir GNU-parallelcd GNU-parallelwget https://raw.githubusercontent.com/nytimes/covid-19-data/master/us-counties.csv这是一个逗号分隔的文件,所以让咱们将其转换为制表符分隔的文件 more us-counties.csv | tr ',' '\t' > us-counties.tab如您所见,此数据蕴含各县和州无关疫情随工夫变动的信息。 head us-counties.tab 让咱们按县/州离开这些数据,而不是一个大文件 应用 sort 和 awk,咱们能够首先按县/州对文件进行排序,而后应用 awk 将每一行 ($0) 打印到名为 County-state.tab 的文件中。 sort -k 2,3 us-counties.tab | awk '{print $0 > $2"-"$3".tab"}'这将生成 2578 个文件 + 咱们下载的原始 2 个文件 ...

September 19, 2023 · 1 min · jiezi

关于程序员:揭秘一文彻底搞懂JSONP

JSONP是一种很远古用来解决跨域问题的技术,当然当初理论工作当中很少用到该技术了,然而很多同学在找工作面试过程中还是常常被问到,本文将带您深刻理解JSONP的工作原理、应用场景及平安注意事项,让您轻松把握JSONP。 JSONP是什么?JSONP,全称JSON with Padding,是一项用于在不同域之间进行数据交互的技术。这项技术的核心思想是通过在页面上动态创建<script>标签,从另一个域加载蕴含JSON数据的内部脚本文件,而后将数据包裹在一个函数调用中返回给客户端。JSONP不仅简略而且弱小,尤其在解决跨域数据申请时表现出色。 JSONP的工作原理JSONP的工作流程如下: 客户端申请数据:首先,客户端会创立一个<script>标签,向蕴含JSON数据的近程服务器发出请求。这个申请通常包含一个名为callback的参数,用来指定在数据加载结束后应该调用的JavaScript函数的名称。<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>JSONP Example</title></head><body> <h1>JSONP Example</h1> <div id="result"></div> <script> // 定义JSONP回调函数 function callback(data) { const resultDiv = document.getElementById('result'); resultDiv.innerHTML = `Name: ${data.name}, Age: ${data.age}`; } // 创立JSONP申请 const script = document.createElement('script'); script.src = 'http://localhost:3000/data?callback=callback'; document.body.appendChild(script); </script></body></html>服务器响应:服务器收到申请后,将JSON数据包装在指定的回调函数中,并将其返回给客户端。响应的内容相似于:const Koa = require('koa');const Router = require('koa-router');const app = new Koa();const router = new Router();// 定义一个简略的JSON数据const jsonData = { name: 'John', age: 30,};// 增加路由解决JSONP申请router.get('/data', (ctx) => { const callback = ctx.query.callback; if (callback) { ctx.body = `${callback}(${JSON.stringify(jsonData)})`; } else { ctx.body = jsonData; }});// 将路由注册到Koa应用程序app.use(router.routes()).use(router.allowedMethods());// 启动Koa应用程序const port = 3000;app.listen(port, () => { console.log(`Server is running on port ${port}`);});客户端解决数据:在客户端的页面中,咱们必须当时定义好名为callback的函数,以便在响应被加载和执行时被调用。这个函数会接管JSON数据,供咱们在页面中应用。JSONP应用场景跨域申请:JSONP次要用于解决跨域申请问题,尤其实用于无奈通过CORS或代理等形式实现跨域的状况。数据共享:在多个域名之间共享数据,能够利用JSONP实现跨域数据共享。第三方数据获取:当须要从第三方网站获取数据时,能够应用JSONP技术。 ...

September 19, 2023 · 1 min · jiezi

关于程序员:打造安全的Open-RAN

O-RAN架构在为RAN网络引入更多灵活性和最佳实际的同时,也面临着更多的平安危险。本文别离从网元接口通信、RIC平安框架、云原生平安平台等角度全面介绍O-RAN架构在平安方面应该采取的措施。原文: Security in Open RAN引言Open RAN是O-RAN联盟在3GPP及其他规范的根底上标准化的开放式无线接入网络(RAN)架构,O-RAN联盟对于RAN性能的划分基于三个要害准则: 硬件和软件解耦云基础设施网络性能之间的标准化凋谢接口在IT畛域,很久以前就实现了软硬件的解耦,从而使得在特定畛域呈现了专业级软件供应商。这些公司的软件能够在任何硬件上运行,为运营商客户提供了多种抉择。此外,还呈现了同样丰盛的硬件厂商生态系统。 [TOC] 1. 概述虚拟化技术通过无效利用计算资源、打消硬件孤岛和进步自动化水平,帮忙企业升高TCO(总领有老本)。为了提供5G服务,运营商须要虚拟化网络,可能基于用户抉择、策略驱动的服务来扩大服务。云原生架构容许将网络性能(NF)作为容器化微服务集群进行部署,每个微服务都能够独立部署、扩容和降级,从而不须要扩容整个应用程序,而只须要扩容NF中所需的组件。 各种网络性能之间的凋谢接口容许在网络中应用最好的设施,使运营商可能依据须要定制网络性能,从而在竞争中怀才不遇。 本文展现了通过采纳零信赖平安框架(zero-trust security framework),Open RAN架构提供了一条通向比当初更平安的开放式网络和开放式接口的路线。只管存在误会,但O-RAN技术规范中定义的凋谢接口提供了更多的独立可见性,并提供了全面加强更平安零碎的机会。 5G和Open RAN实现了新的能力和控制点,使供应商、测试设施制造商、无线运营商和网络运营商可能无效评估、缓解和治理平安危险。本文具体介绍了O-RAN如何使运营商对其网络的端到端平安有充沛的理解和管制。 宏大的云产业正在致力于解决平安问题,云RAN与其余云网络性能相似,有相似的平安要求和解决方案。云架构确保了弹性、可扩展性和解耦,并引入了AI/ML以及多接入边缘计算(MEC)等性能。例如,利用MEC能够在工厂收集和解决传感器流量,将DDoS检测及缓解转移到网络边缘,边缘事件能够与网络的其余局部隔离。微分段、容器化、虚拟化和网络切片从硬件上提供了加强的安全性和隔离性。安全措施是内建在零碎中的,而不是像传统零碎那样在预先加装。 2. 下一代RAN架构3GPP[1]为5G NR gNB定义了如下架构,如图1所示。 gNB被宰割成两个逻辑性能,称为CU(集中式单元)和DU(分布式单元),如图1所示,两个实体通过3GPP TS 38.473[2]中定义的F1-C和F1-U接口连贯。值得注意的是,3GPP架构并没有指定近程无线单元(RRU)的接口,PHY层和RF层之间的接口留给供应商实现。 O-RAN联盟是由定义Open RAN标准的当先供应商和运营商组成的个人,进一步合成了3GPP定义的CU和DU的网络性能[3],这些性能通过凋谢、标准化的平安接口互联,如图2所示。 图3显示了3GPP和O-RAN的性能及接口划分,O-RAN联盟在3GPP的5G RAN架构之外减少了新的接口和性能。 因为O-RAN联盟建设在3GPP的5G NR架构之上,受害于3GPP为5G引入的高级平安性能[4],包含: 加强的用户身份隐衷性,即订阅暗藏标识符(SUCI, Subscription Concealed Identifier)空口对终端和gNB之间的管制/用户面流量的全面爱护(加密和完整性爱护)gNB接口的全面爱护,包含CU-CP与CU-UP之间的E1接口,CU与DU之间的F1接口加强的归属网络管制(身份验证)基于SLA的网络切片的额定安全性3. 基于零信赖的Open RAN平安体系架构基于"永不置信,总是验证(never trust, always verify)"准则,零信赖(Zero Trust)旨在通过通过网络隔离、避免横向挪动、提供L7威逼预防以及简化细化的用户访问控制来爱护古代数字环境。 零信赖架构(ZTA, zero trust architecture)是基于零信赖准则的网络安全架构,旨在避免数据泄露以及限度外部横向挪动,以下内容来自NIST出版的800-207-"零信赖架构"[5]。 网络安全的"零信赖"(ZT)办法次要侧重于数据和服务爱护,但能够也应该扩充到包含所有企业资产(设施、基础设施组件、应用程序、虚构和云组件)和主体(终端用户、应用程序以及其余从资源中申请信息的非人类实体)。 在这种新范式下,企业必须假设没有隐性信赖,并一直剖析和评估其资产和业务性能的危险,而后制订保护措施,以加重危险。在零信赖中,这些保护措施通常包含尽量减少对资源(如数据和计算资源以及应用程序/服务)的拜访,只容许那些被确认为须要拜访的主体和资产,以及一直验证及受权每个拜访申请的身份和平安情况。 对零信赖架构的反对要求每个O-RAN组件恪守既定性能和保护措施。O-RAN联盟[6]曾经为其正在进行的工作确定了几个领导准则,包含: 反对应用行业标准协议与内部身份、凭证和拜访管理系统(ICAM, identity, credential and access management)集成要求对所有拜访进行认证和受权反对基于角色的访问控制(RBAC, role-based access control)。对O-RAN和内部组件之间的连贯进行加密对O-RAN和内部组件之间的连贯施行完整性检查反对静态数据加密避免重放攻打实现平安日志生成并收集集成到内部平安信息和事件治理(SIEM,security information and event management)。以下各节的剖析基于云原生Open RAN网络的假如,其网络性能被建模为容器化的微服务。 Open RAN平安建设在以下准则之上: 网络性能之间的平安通信RIC的平安框架平安的网络性能托管平台4. 网络性能间的平安通信本节探讨Open RAN中网络性能之间提供平安通信无关的内容。 ...

September 19, 2023 · 2 min · jiezi

关于程序员:行业追踪20230919

主动复盘 2023-09-19凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。 板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. 翻新药1. 煤炭行业1. 煤炭行业1. 减速器2. 生物制品2. 电子化学品2. 证券2. 铁路公路3. 化学制药3. 翻新药3. 券商概念3. 汽车零部件4. 铁路公路4. 化学制药4. 多元金融4. 银行5. 医疗器械5. 生物制品5. 铁路公路5. 页岩气6. 精准医疗6. 稀缺资源6. 银行6. 证券7. 中药概念7. 培养钻石7. 酿酒行业7. 地摊经济8. 煤炭行业8. 动物照明8. ST股8. 汽车热治理9. ST股9. 医疗器械9. 工业大麻9. 汽车整车10. 多元金融10. 中药概念10. 人造肉10. 电机11. 中药11. 医疗服务11. 白酒11. 煤炭行业12. 医疗美容12. 钛白粉12. 房地产开发12. 激光雷达13. CRO13. 精准医疗13. 土地流转13. 券商概念14. 体外诊断14. Chiplet概念14. 装修建材14. 燃气15. 工业大麻15. 煤化工15. 互联金融15. 石油行业16. 医疗服务16. 工业大麻16. 商业百货16. 空气能热泵17. 银行17. 中药17. 稀缺资源17. 船舶制作18. 石油行业18. CRO18. 石油行业18. 油气设服19. 医疗器械概念19. 石油行业19. 水泥建材19. 工业母机20. 汽车整车20. 医疗美容20. 煤化工20. 天然气21. 化妆品概念21. 空间站概念21. 钛白粉21. 土地流转22. 激光雷达22. ST股22. 美容护理22. 多元金融23. 地摊经济23. 体外诊断23. 钢铁行业23. 算力概念24. 游览酒店24. 光学光电子24. 页岩气24. 工业4.025. 稀缺资源25. 3D摄像头25. 地摊经济25. 中字头板块 rps20 排名详情板块详情1. 电子化学品2. 煤炭行业3. 化学制药4. 翻新药5. 稀缺资源6. 生物制品7. 动物照明8. 医疗器械9. 培养钻石10. 中药概念11. 医疗服务12. 精准医疗13. 钛白粉14. Chiplet概念15. 工业大麻16. 煤化工17. 中药18. CRO19. 医疗美容20. 石油行业21. 空间站概念22. ST股23. 体外诊断24. 3D摄像头25. 光学光电子板块 rps50 排名详情板块详情1. 证券2. 煤炭行业3. 券商概念4. 多元金融5. 铁路公路6. 银行7. 酿酒行业8. 工业大麻9. ST股10. 白酒11. 人造肉本文由mdnice多平台公布 ...

September 19, 2023 · 1 min · jiezi

关于程序员:shell-位置参数变量

地位参数变量在写shell脚本的时候,难免会进行命令行传参,上面来介绍一下地位参数变量 $n n为数字,$0代表自身,即以后程序的名称 $1-$9代表第一到第九个参数,十以上的参数须要应用大括号,如${10}$* 表示命令行中的所有参数,把所有参数看成一个整体$@ 也表示命令行中的所有参数,然而把每个参数辨别看待${@:终点} 由终点开始,获得前面所有的地位参数${@:终点:个数} 由终点开始,获得指定个数的地位参数$# 表示命令行中所有参数的个数$? 命令或程序执行完后的状态,个别返回0示意执行胜利例: #在hello.sh中echo "参数个数为$#"echo "第一个参数是$1"echo "第二个地位开始数据${@:2}"echo "第一个地位开始两个数据${@:1:2}"------------------------------#执行hello.shsh hello.sh 1 2 3参数个数为3第一个参数是1第二个地位开始数据2 3第一个地位开始两个数据1 2https://zhhll.icu/2021/linux/shell/地位参数变量/本文由mdnice多平台公布

September 19, 2023 · 1 min · jiezi

关于程序员:OpenHarmony-Meetup常州站招募令

OpenHarmony Meetup 常州站正炽热招募中!诚邀充斥激情的开发者参加线下盛会~摸索OpenHarmony前沿科技,畅谈将来前景,感触OpenHarmony生态构建之路的魅力! 线下参加,名额有限,仅限20位幸运者!报名截止工夫为9月26日24:00点,快快口头起来~ 加入OpenHarmony Meetup 常州站将有好礼相送:1. 惊喜开发者礼品一份;2. 与现场大咖面对面交换,深度技术探讨;3. 打卡拍照,互动乐趣一直; 4. 现场发问,专家技术解答;更有抽奖环节,侥幸大奖等你拿!机会百年不遇,不容错过!赶快报名,与咱们一起点燃激情,开启OpenHarmony精彩世界之旅吧!流动议程如下: 本文由博客一文多发平台 OpenWrite 公布!

September 19, 2023 · 1 min · jiezi

关于程序员:TypeScript逆变-条件推断和泛型的应用

1 一个类型问题有一个名为 test 的函数,它承受两个参数。第一个参数是函数 fn,第二个参数 options 受到 fn 参数的限度。乍一看,这个问题貌似并不简单,不是吗?糊业务的时候,这种不是常见的需要嘛。 “创立一个泛型类型 Test,以确保这两个参数之间存在束缚关系就完事了,睡醒再说”,就这样暗忖着,又昏昏沉沉睡过去,只有那 T extends unknown[]闯入我梦中,飘忽不定,不即不离,暗示着我再次翻车【看题时感觉简略,解题时头大如牛】的命运。 上面咱们先来看看题目: type InjectorFunction<P> = () => P;interface Options<P> { injector: InjectorFunction<P>;}const fn1 = () => 1;const fn2 = (p: number) => `number is: ${p}!`;const fn3 = (p: string) => `hello ${p}!`;const fn4 = (p?: string) => `hello ${p || 'fn4'}!`;type Test<F extends (...args: any[]) => any = any> = (fn: F, options?: Options<Parameters<F>>) => void;const test: Test = (fn, options) => { return fn(options?.injector?.());}// 定义 Test 函数的类型,使得上面类型成立test(fn1); // righttest(fn1, { injector: () => {} }); // error, dont need injectortest(fn2, { injector: () => 4 }); // righttest(fn3, { injector: () => 'world' }); // righttest(fn3); // error, options.injector is requiredtest(fn4); // righttest(fn4, { injector: () => 'test4' }); // right在持续往下翻阅之前,先来typescript playground 玩呀,兄弟们。也能够用来配合本文食用哦。 ...

September 18, 2023 · 4 min · jiezi

关于程序员:行业追踪20230918

主动复盘 2023-09-18凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。 板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. 翻新药1. 电子化学品1. 煤炭行业1. 汽车热治理2. 煤炭行业2. 煤炭行业2. 证券2. 减速器3. 化学制药3. Chiplet概念3. 多元金融3. 汽车零部件4. 生物制品4. 动物照明4. 券商概念4. 电机5. 医疗器械5. 翻新药5. 工业大麻5. 证券6. 电子化学品6. 稀缺资源6. 银行6. 地摊经济7. 空间站概念7. 激光雷达7. ST股7. 银行8. 中药概念8. 3D摄像头8. 酿酒行业8. 激光雷达9. 精准医疗9. 空间站概念9. 人造肉9. 页岩气10. 动物照明10. 光学光电子10. 商业百货10. 煤炭行业11. 游览酒店11. 培养钻石11. 铁路公路11. 汽车整车12. 激光雷达12. 屏下摄像12. 装修建材12. 券商概念13. CRO13. MiniLED13. 白酒13. 铁路公路14. 工业大麻14. 游览酒店14. 地摊经济14. 工业4.015. 铁路公路15. 工业大麻15. 互联金融15. 空气能热泵16. 体外诊断16. 化学制药16. 房地产开发16. 船舶制作17. 医疗美容17. 生物制品17. 美容护理17. 燃气18. 中药18. 智能穿戴18. 土地流转18. 工业母机19. 多元金融19. 中芯概念19. 稀缺资源19. 算力概念20. 医疗服务20. 汽车零部件20. CRO20. 油气设服21. 医疗器械概念21. 工业母机21. 石油行业21. 多元金融22. 地摊经济22. EDA概念22. 煤化工22. 天然气23. 光学光电子23. 生产电子23. 纺织服装23. 石油行业24. 稀缺资源24. 传感器24. 化妆品概念24. 商业百货25. ST股25. 无线耳机25. 通信服务25. 无人驾驶板块 rps20 排名详情板块详情1. 电子化学品2. 煤炭行业3. 动物照明4. Chiplet概念5. 稀缺资源6. 翻新药7. 激光雷达8. 3D摄像头9. 空间站概念10. 培养钻石11. 光学光电子12. 屏下摄像13. MiniLED14. 工业大麻15. 游览酒店16. 化学制药17. 智能穿戴18. 生物制品19. 中芯概念20. 汽车零部件21. 工业母机22. EDA概念23. 生产电子24. 无线耳机25. 传感器板块 rps50 排名详情板块详情1. 证券2. 煤炭行业3. 券商概念4. 多元金融5. 银行6. 工业大麻7. 人造肉8. ST股9. 酿酒行业10. 铁路公路11. 商业百货本文由mdnice多平台公布 ...

September 18, 2023 · 1 min · jiezi

关于程序员:故障治理如何进行故障复盘

故障复盘的重要性无需多说,每一次故障都是贵重的学习机会,自己接手故障复盘工作曾经半年无余,从一开始的不知所措,缓缓变得熟能生巧。以下内容为自己从网上查阅学习多个专家教训,并联合工作经验总结而来,仅供参考。 一、故障复盘目标通过复盘总结教训,找到根因,从根本上进行优化和改良,前期工作中躲避问题再产生。有策略的、系统性的去组织复盘踩过的坑,还原事实,找到薄弱点加以改进。最终目标是激励做事,而不是处罚失败。二、 故障复盘准则激励做事和品质改良,拥护推诿扯皮不作为;激励公开通明,拥护覆盖问题;激励整体的零碎思考和团队协同,拥护把问题推给集体。明确主旨,回绝甩锅:故障复盘的目标是为了找出问题,明确改良计划防止再次踩坑。要尽量对事不对人,防止造成对某一方的批评会。心态凋谢,感性求实:敢于抵赖本人的问题,承受本人的有余。同时,在尊重别人的前提,每个人都能够就故障过程充沛发表观点和认识。激励疾速复原、激励通过演练发现更多的线上问题等。三、 故障复盘运作机制3.1 故障复盘前筹备3.1.1 提交故障报告故障间接起因方(非最终认定的故障责任方)在故障产生后3个工作日内提交故障报告。如故障起因波及多个部门,需跨部门独特帮助撰写故障报告。 3.1.2 确定复盘owner每次故障复盘都必须有惟一的复盘owner,故障复盘owner负责被动疏导大家,推动复盘进度。复盘owner的主要职责如下: 复盘开始前,由复盘owner依据故障解决报告初稿来推动所有故障干系方实现工夫线的梳理,比方某工夫点做了哪些操作,产生了什么后果等;收集故障影响范畴,与各个关联方核实影响的数据,包含业务指标、零碎指标、其余指标(客诉、舆情影响等)。要害信息通过截图等进行佐证,联合故障解决报告造成故障复盘报告初稿。复盘会议中,复盘owner要被动疏导参会人员,推动复盘进度,避免出现一些无意义的指摘、与故障无关的发散探讨等。复盘会议后,联合故障解决报告造成故障复盘报告定稿,发给所有故障干系人及相干领导。3.1.3 确定故障干系人复盘owner确定故障间接起因方、关联(受影响)方等与故障无关的干系人。 3.1.4 组织复盘会议确定故障复盘工夫、模式及地点、参会人员等,并组织召开复盘会议。 工夫要求:故障产生后一周内,工夫拖到久容易忘记故障细节参会人员要求:故障干系人必须全副参加,复盘owner在复盘文档中记录参会人员名单,必要时抽调SRE专家团队,视故障的危害水平来确定是否须要更高层级的管理人员到场3.2 故障复盘要害流程步骤(包含但不限于)3.2.1 故障背景概述故障的背景要解释分明本次故障的根本状况,即产生了什么故障,影响了什么业务(产品)等。 3.2.2 对齐故障影响范畴讲清楚本次故障的影响范畴,包含影响时间段、影响的业务、影响的零碎(服务)、订单量、用户量、客诉量,以及有无产生资金损失等等。 3.2.3 故障工夫线回放故障工夫线回放是指从故障的最源头开始,从旁观者的角度从新梳理一遍故障的具体过程,包含每个工夫点的人员操作、指标变动、监控告警、零碎异样、业务理论状况等等。留神对以下几个要害工夫点进行辨认。 故障产生工夫点: 即这个故障实际上是从什么时候开始的。业务指标变动工夫点: 业务指标开始上涨、开始复原等。监控告警收回工夫点: 即监控是从什么时候发现异常的,告警什么时候收回的。告警的级别、接管人是否响应超时等相干信息都要记录进来。人员染指响应工夫点: 故障对应的零碎值班owner是从什么时候开始响应的。异样定位工夫点:即定位到故障的异样点。要害操作工夫点:是否做了一些应急预案,包含重启、复原、止血、高可用配置等。还须要理分明每个操作的后果,即每个操作之后,报错面有无放大、系统资源水位有无变动等。确认故障复原工夫点: 通过测试验证或者观测业务指标、系统日志等确认零碎曾经复原。依据以上工夫点计算出故障均匀修复工夫(MTTR),而后一一沟通探讨如何缩短其中的每一个环节耗时。MTTR具体释义见附录。 3.2.4 深挖根因在复盘过程中,既要明确诱因,更要深挖根因。能够基于5why分析法深挖根因,多问几个为什么,层层递进。5why分析法释义详见附录。 3.2.5 改良项汇总晋升系统可靠性的两个要害伎俩:升高故障产生概率(MTBF)和缩短故障持续时间(MTTR)。参考第3步的MTTR合成环节和第4步的故障根因合成环节,推导出咱们对于本次故障复盘的改良事项。在梳理改良事项的时候,还要从流程制度、团队组织、零碎设计、底层工具平台综合思考。改良项需遵循SMART准则,SMART准则释义详见附录。此外每条改良项必须有明确的责任人牵头人,确保每一条改良措施有人跟进有人负责。 3.3 故障定级定责复盘owner组织所有干系人确定故障干系方部门每一方责任占比以及故障级别,明确扣罚明细。定级定责规范参见各自故障考核治理方法。这里留神,故障定级定责规范规定要明确,并可能与各方达成统一,此外,故障定级定责规范要一直回头看,针对有争议的中央一直修理,这样就会最大水平地缩小扯皮推诿的状况呈现 3.4 故障复盘后果通告复盘owner依据复盘会议及故障定责后果、最终的故障起因、改良计划等论断,在原故障报告的根底上,批改欠缺并造成最终定稿,以邮件的模式发给所有故障干系人及相干领导进行上报和周知,不便干系人及领导查阅整个复盘报告,同时让改良打算中波及的各方明确通晓后续相干工作。 四、故障改良及闭环故障复盘后由复盘owner(或其余)将故障信息(也就是故障报告里的内容)录入故障管理系统,零碎将向故障改良措施负责人派单,整改负责人整改实现后在零碎回单并提交整改实现的证实资料,由复盘owner审核通过前方可敞开工单,这样能够保障整改措施的,实现故障闭环治理 五、处分机制依据故障复盘过程中各位干系人及SRE专家团队体现(是否及时提交故障报告,配合度、是否踊跃改良、踊跃献策等维度逆向评估并给予相应奖惩,目标是激励各位被动复盘被动改良。 附录:相干名词解释一、5why分析法:所谓5why分析法,又称“5问法”,也就是对一个问题点间断以5个“为什么”来自问,以追究其根本原因。虽为5个为什么,但应用时不限定只做“5次为什么的探讨”,次要是必须找到根本原因为止 二、MTBF:即均匀无故障工夫,即均匀无故障工作工夫,是掂量一个产品(尤其是电器产品)的可靠性指标。单位为“小时”。它反映了产品的工夫品质,是体现产品在规定工夫内放弃性能的一种能力。具体来说,是指相邻两次故障之间的均匀工作工夫,也称为均匀故障距离。 三、MTTR:即故障的均匀修复工夫,对MTTR进行拆解,失去如下几个时间段:MTTR = MTTI + MTTK + MTTF + MTTV Mean Time To Identify (MTTI): 从故障开始到应急响应染指的工夫,个别是考查监控告警、人员值班oncall的合理性。Mean Time To Know (MTTK):从应急响应染指到故障定位的工夫,次要考查根因剖析、可观测性等工具的能力。Mean Time To Fix (MTTF): 从故障定位到故障复原的工夫,次要考查应急预案、快恢体系的能力。Mean Time To Verify (MTTV):从故障复原之后到确认故障曾经解决的工夫,个别通过用户反馈、自动化测试等确认复原。四、SMART准则 S - 必须是具体的(Specific),改良项必须是能够落地的,不要泛泛而谈。M - 必须是能够掂量的(Measurable),即改良项是能够评估的,比方通过故障演练来测验依赖关系的有效性。A - 必须是能够达到的(Attainable),在以后的技术环境下,这个改良项是可行的。R - 与其余指标具备肯定的相关性(Relevant),能够了解与本次故障中其余改良项有关联性。T - 必须具备明确的截止期限(Time-bound),要写分明改良项的截止工夫,在到期之后进行验收。本文由mdnice多平台公布 ...

September 12, 2023 · 1 min · jiezi

关于程序员:ssh总是很短时间自动断开连接

ssh断开连接有时候应用ssh连贯服务器,只是一会儿没用就主动断开连接了,又得从新连,很烦人,那么有没有方法能够让连贯放弃很久一直开呢?那必定是有的 在/etc/ssh目录下的sshd_config就是用来配置ssh的,其对于客户端连贯的配置默认是这样的 # ClientAliveInterval指定了服务器端向客户端申请音讯的工夫距离, 默认是0, 不发送。设置60示意每分钟发送一次, 而后客户端响应, 这样就放弃长连贯了。ClientAliveInterval 0# ClientAliveCountMax示意服务器发出请求后客户端没有响应的次数达到肯定值, 就主动断开。失常状况下, 客户端不会不响应,应用默认值3即可ClientAliveCountMax 3能够将ClientAliveInterval设置为60 而后重启下ssh就能够了 service sshd reloadhttps://zhhll.icu/2022/linux/小技巧/1.ssh断开连接/本文由mdnice多平台公布

September 12, 2023 · 1 min · jiezi

关于程序员:行业追踪20230911

主动复盘 2023-09-11凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。工--号:醉卧梦星河欧奈尔行业RPS排名天天更新追踪主力行业趋势更容易来这里一图看趋势。板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. 光刻胶1. 光刻胶1. 证券1. 减速器2. 电子化学品2. 电子化学品2. 券商概念2. 激光雷达3. 激光雷达3. Chiplet概念3. 多元金融3. 电机4. Chiplet概念4. 空间站概念4. 房地产开发4. 汽车热治理5. 空间站概念5. 激光雷达5. 时空大数据5. 证券6. 3D摄像头6. 时空大数据6. 煤炭行业6. 汽车零部件7. 光学光电子7. 煤炭行业7. 光刻胶7. 船舶制作8. 半导体8. 3D摄像头8. 互联金融8. 通信设施9. PCB9. 光学光电子9. 人造肉9. 无人驾驶10. 生产电子10. 动物照明10. 银行10. 券商概念11. 北斗导航11. 航天概念11. 土地流转11. 屏下摄像12. 屏下摄像12. 减速器12. 商业百货12. 工业母机13. 汽车芯片13. 北斗导航13. 装修建材13. 工业4.014. 动物照明14. 屏下摄像14. 酿酒行业14. 地摊经济15. 无线耳机15. PCB15. 电子化学品15. 云游戏16. MiniLED16. MiniLED16. 地摊经济16. 文化传媒17. 工业母机17. 生产电子17. 电子车牌17. 空气能热泵18. 智能穿戴18. EDA概念18. 白酒18. 汽车整车19. 减速器19. 通信服务19. 页岩气19. 游戏20. 中芯概念20. 智能穿戴20. 装修装璜20. 时空大数据21. 半导体概念21. 工业母机21. ST股21. 计算机设备22. 氮化镓22. 半导体22. 钛白粉22. 光学光电子23. EDA概念23. 汽车零部件23. 稀缺资源23. 机器人概念24. 航天概念24. 传感器24. 水产养殖24. 银行25. 国产芯片25. 无人驾驶25. 通信服务25. 5G概念板块 rps20 排名详情板块详情1. 电子化学品2. 光刻胶3. Chiplet概念4. 空间站概念5. 时空大数据6. 激光雷达7. 3D摄像头8. 光学光电子9. 煤炭行业10. 动物照明11. 航天概念12. 北斗导航13. 减速器14. PCB15. MiniLED16. 屏下摄像17. 生产电子18. EDA概念19. 通信服务20. 智能穿戴21. 汽车零部件22. 半导体23. 工业母机24. 无人驾驶25. 传感器板块 rps50 排名详情板块详情1. 证券2. 券商概念3. 房地产开发4. 多元金融5. 时空大数据6. 煤炭行业7. 光刻胶8. 人造肉9. 互联金融10. 银行11. 土地流转本文由mdnice多平台公布 ...

September 11, 2023 · 1 min · jiezi

关于程序员:网络学习-认识计算机

@网络学习集体学习记录,心愿有搭档一起成长。学习目录:0x01,意识计算机0x02,操作系统理解0x03,数据库理解0x04,端口理解0x05,网络安全理解0x06,咱们能够怎么做0x07,对于浸透0x08,编程理解大略打算就是这样,前面还有会进行补充。0x01,意识计算机:俗称电脑,一种高速解决数据的电子机器,古代计算机属于4代或者5代。作用:数值和逻辑计算,贮存数据;日常用处就是看电视、电影、小说,听歌、玩游戏、办公等组成分类:1.硬件:又叫裸机.留神,台式和笔记本是不一样的(1)CPU(中央处理器),是零碎运行和管制外围;当初日常中有两个牌子AMD和Intel,AMD处理速度快,Intel比较稳定,个别抉择Intel。主要参数参考:主频、缓存、核数等(2)内存,存储计算机数据,俗称仓库;包含两局部,硬盘和内存条。 ①硬盘,分为固态和机械,个别抉择固态,如果有大量存储须要,能够机械+固态;主要参数参考:容量、缓存、转速/读写速度等②内存条,RAM随机存储器,个别抉择品牌如,金士顿;主要参数参考:容量和频率等(3)显示,就是显示画面的设施,分为显卡和显示器。 ①显卡,个别主板都会有一个自带显卡,如对画面要求高的能够购买一个独立显卡,依据兼容性购买就行;主要参数参考:显存、位宽、频率等②显示器,能够说就是电视机模式的显示设施,然而不是,不要搞错了,留神兼容。(个别接口容许也是能够临时用的)主要参数参考:分辨率和尺寸等(4)外壳,又叫机箱盒,常见的分四类:加大型、标准型、紧凑型、小型;个别抉择规范,要留神和主板对上;主要参数参考:接口数量、抗静电、资料品质、散热、扩展性等(5)主板和电源。 ①主板是连贯所有设施的主体,个别分类:规范、改良、一体化,都能够抉择,看本人需要。主要参数参考:芯片组、扩展槽、接口数等②电源俗称人的心脏,所以供电性能能够抉择大或者可调,不能选小的。主要参数参考:功率、品牌、质保等(6)其它,还有一些网卡、外置摄像头、麦克风等依据需要购买就行,不是特地需要都能够不必管,主板的自带性能就够了。2.软件:底层数据处理操作系统,常有计算操作系统:Windows,Linux;与内部连贯的网络。(1)操作系统,如果只是个别的办公,休闲抉择Windows,有特地须要的,比方搞研发、高平安等就用Linux。(留神,特地需要不是说个别的编程,AD画图等),零碎外面的所有面向人类的,都属于利用,实现某方面的性能,比方,看电影的BT播放器,听音乐的QQ音乐等(2)网络,实现多台计算机之间的交换。分成三局部:硬件设施、网络类型和网络IP。①硬件设施包含路由器和交换机,路由器次要是全域络,交换机次要是局域网②网络类型分为:总线型、环形、星型和网型,当初都是以网型为主③网络IP分为:私有、公有和非凡地址,私有IP是因特网进行负责;公有集体或者组织外部应用;非凡IP:0.0.0.0未辨认的主机IP都在这里,能够说是其它类,255.255.255.255以后子网的播送IP,127.0.0.1固定本机IP,169.254.x.x此类地址大概率是不能专用网络,如浏览器无奈辨认 一些常识总结,加了一些本人的了解,如有更好的常识,或者谬误请指教。如想本人组装电脑的,能够参考,然而要留神价格、接口、品牌、商品比照等

September 9, 2023 · 1 min · jiezi

关于程序员:生信教程|替代模型选择

摘要因为教程工夫比拟长远,因而不倡议实操,仅浏览以理解学习。 在运行基于可能性的系统发育剖析之前,用户须要决定模型中应蕴含哪些自在参数:是否应该为所有替换假如繁多速率(如序列进化的 Jukes-Cantor 模型)或者是否应该容许不同的转换率和颠换率(如 HKY 模型)。或者是否应该对所有替换应用不同的比率(如 GTR 模型)四种核苷酸的频率(“状态频率”)是否应该被预计或假如为全副相等?自在模型参数的最佳数量取决于可用数据,并且能够依据 Akaike 信息准则(AIC)等规范进行抉择,该准则旨在在模型拟合的改良与模型拟合所需的附加参数数量之间获得均衡。 在本教程中,我将介绍如何应用软件 PAUP (Swofford 2003) 抉择系统发育剖析的代替模型,PAUP 是一种用于各种类型系统发育剖析的风行多功能工具。 数据集本教程中应用的数据是教程多序列比对中为 16s 和 RAG1 序列生成的比对的过滤版本。因为 PAUP* 须要 Nexus 格局的对齐作为输出,因而请应用文件 16s_filtered.nex 和 rag1_filtered.nex。 PAUP*该软件最后开发于 20 世纪 80 年代末,是最古老的系统发育分析程序之一,只管它曾经存在了很长时间,但其作者 Dave Swofford 从未公布过最终版本。只管在基于可能性的系统发育推断方面,PAUP 在速度方面早已被其余程序超过,但它对于它蕴含的各种其余性能依然很重要。不久前,PAUP 只能以 100 美元左右的价格从 Sinauer Associates 购买。自 2015 年起,Dave Swofford 在他的新 PAUP 网站上收费散发 PAUP 4.0 的更新版本作为试用版。这些试用版会在几个月后过期,因而如果您未来还想应用 PAUP,则可能须要从新下载。这种状况可能只是临时的,因为 PAUP 5 的开发正在进行中,该产品将至多局部进行商业散发。 尽管本教程中的形容假如您已装置实用于 Mac OS X 或 Windows 的 PAUP 图形用户界面 (GUI) 版本,但也能够装置 PAUP 的命令行版本,这在 Linux 上是必须的或 Mac OS X Catalina 或更新版本,因为这些零碎以后不存在 GUI。如果您应用命令行版本,您可能须要查找等效命令;启动 PAUP 后,始终能够通过 PAUP 的帮忙屏幕来实现此操作,只需键入“?”即可显示该帮忙屏幕。并按 Enter 键。上面的屏幕截图显示了 PAUP* 命令行版本的帮忙屏幕。 ...

September 9, 2023 · 1 min · jiezi

关于程序员:linux-文件系统命令

文件系统命令磁盘空间应用linux 能够对组进行配额限度1、vi /etc/fstab 文件将要设置配额的分区设置开机主动挂载在增加行在 defaults 前面加上,usrquota(grpquota)示意要建设用户或组的磁盘配额 2、从新挂载文件系统之前重启看成果,能够应用 umount -a 卸载所有文件挂载,而后应用 mount -a 挂载所有文件系统3、在挂载目录下创立 aquota.user 文件(或者aquota.group文件)在挂载目录下执行 touch aquota.user4、进行配额查看 执行 quotacheck -avu(g)(g 是启用组配额) quotacheck -ugavmc######-a 扫描fstab文件退出quota设置的分区-d 具体显示命令执行过程-g 扫描磁盘空间时,计算每个组标识符GID所占用的目录和文件数目-v 标识命令执行过程-m 强制执行命令-c 不读取曾经存在的aquota数据库,从新扫描硬盘并保留<!-- more --> 5、设置用户磁盘配额 执行 edquota -u rose 如果设置宽限工夫,能够让用户在规定的工夫内能够超过软极限,但必须在硬极限之内。6、设置宽限工夫edquota -t 编辑工夫。7、启用配额 quotaon /qt(配额目录) 如果勾销限度,则为quotaoff -avug 8、进行配额测试创立文件,占用磁盘空间,而后超过软极限,看揭示,而后再超过硬极限,看成果如果要对其余用户设置雷同的配额,能够复制配额edquota -up rose u1 u2 u3如果要使配额每次启动失效,能够将配额检查和激活命令放在默认/etc/rc.d/rc.sysinit 启动脚本中 执行quota -v命令检测是否超过限度 df命令全称disk free,磁盘可用空间,查看文件系统的应用状况,分区存储状况,大小,使用率等 df统计的残余空间是精确的 #df [选项] [文件或目录]df -h ----------------h 应用K或M或G为单位,显示文件系统-k 应用K为单位-m 应用M为单位-T 显示文件系统类型-a 显示全副文件系统-l 仅显示本地文件系统-i 显示inode信息du命令全称disk usage,磁盘用量,查看目录所占磁盘空间的应用状况 du统计的文件大小是精确的 ...

September 9, 2023 · 1 min · jiezi

关于程序员:你为什么总招不到对的人

办公室里,技术面试官Arron 和 HR 正对近期的招聘失误进行争执——新招的技术岗试用了几个月,就因能力有余来到了。 HR 一直吐槽岗位画像太含糊,Arron 反诘:“不是给了你关键词吗?” HR 气不打一处来:“你要招Java 后端,说要纯熟应用Java 语言,你给我翻译翻译,到底什么叫纯熟?纯熟的规范是什么?” “我不是还抽空出了几道口试题去测他吗?” Arron 反驳道。“你出的那些算法题、八股文,网上一堆答案,候选人早就背得滚瓜烂熟了,下次出题用心点吧。” Arron 无语,他不晓得该如何解决这些问题…… 01 不要口试,要技术测评随着经济环境变动,企业逐步器重起技术招聘的信效度。找到适合的人,解决工作问题,而不是找到貌似优良的人,但无奈解决工作问题,成为许多企业的共识。 个别企业的技术招聘考核重心仅在简历筛选、面试和录用前的评估,这种形式仅凭感觉,常常容易招错人。 尽管多企业为了考核候选人实在能力,也会进行口试,但题目往往停留实践层面,候选人可通过死记硬背,蒙混过关,难以深挖技术实力。 对理论工作能力,企业只能试用后考查,为此付出额定老本,最危险还可能留下没有实力的老油条,空耗资源。 这根本反映了企业技术招聘时的面临四大难题:   1. 需要不明确,岗位画像含糊    HR 有时不分明技术岗位工作内容,技术面试官给出关键词又会比拟含糊,两者间沟通不畅,导致企业难有清晰岗位画像。 2. 依据岗位画像出题难,考点含糊 有了岗位画像,但出题时市面上的算法/八股文不贴合工作场景,考点难以匹配画像需要;技术面试官本人出题比拟耗时,也不肯定就能写出考核岗位画像所需能力的题目。    3. 评卷不足主观规范,费时并过于主观  候选人答题后,评卷不足主观规范,面试官主观一致大,不仅耗时耗力,也会有失公允性,升高招聘信效度。   4. 招聘失误后,复盘迭代没有根据  因为不足规范,在招聘失误后,企业无奈无效复盘。招聘者对谬误起因各执一词,无奈迭代降级,持续吃一堑;长一智。 那是否在试用前的考核中,尽可能一次性地精准筛选到适合人选呢? 企业须明确,技术招聘仅靠口试考核理论知识远远不够,进行涵盖残缺规范的技术测评很有必要。 胜利的技术测评 除了考核理论知识外,还会考核候选人的实战技能、工程实现能力、解决问题能力和工程素质 等。 理论知识决定了是否能被录用,但前面的能力才决定了理论工作体现。 ShowMeBug 技术测评的“冰山模型” 那要考核以上能力,并实现胜利的技术测评,应涵盖几个方面: 精准考核岗位所需能力的题目与流程,解决岗位画像含糊不匹配问题;反对实战编程环境,模仿工作场景,深挖候选人实战状况下的技术实力;主观高效的评卷和人才报告,晋升招聘效率,为决策与复盘提供根据;实现上述几点的办法与规范。02 ShowMeBug 技术测评2.0——低时投入、主观、高信效度的技术测评体系针对企业招聘中存在的有余,ShowMeBug 推出技术测评2.0版本,提供全自动一站式技术测评解决方案,涵盖出题组卷、实战技术测评、自动化评卷、人才报告和岗位定级等残缺流程。企业仅需明确所需招聘岗位和等级,残余测评流程均能自动化实现。 ShowMeBug 曾推出1.0 版本,针对不同岗位的能力维度,反对手动调节熟练度,并生成能力雷达图及主动组卷。有客户会纳闷,能力熟练度的根据以及主动组卷的机制是什么?这次的2.0 版本更新,将会彻底解答这些纳闷。 技术测评2.0 版本,基于ShowMeBug 技能评估团队自主研发的测评引擎,可主动解析岗位要求,通过能力模型主动生成适宜岗位的能力维度、技能树与知识点,最终主动推导出合乎岗位画像的题目与试卷。 无妨再以技术面试官Arron 的企业须要招聘Java 后端工程师为例: 这次他便能登陆ShowMeBug 后盾进行智能组卷。他可间接找到匹配的岗位,并抉择相应的能力等级。 该岗位定级规范是ShowMeBug 技术团队对标国内支流一线大厂所制订,依据岗位的能力维度与技能点的把握水平,划分成4个等级: 1.理解 2.相熟 3.把握 4.精通。粗疏的划分有助于企业精准定位岗位所需能力,并明确相应的职级。 比方Arron 决定招聘S6 级Java 后端工程师,则按规范该岗位需把握Java 的进阶个性,理解Linux 根底,把握关系数据库常识,把握各类框架与中间件,得出S6 级工程师需能独立实现中等难度性能开发。零碎会依据各个技能点的把握水平,生成相应知识点,并以此主动出题组卷,如图所示。 ...

September 8, 2023 · 1 min · jiezi

关于程序员:生信教程多序列比对

摘要所有系统发育推断办法都须要同源数据集作为输出。因而,当核苷酸序列用于系统发育剖析时,第一步通常是推断不同类群序列中的哪些核苷酸彼此同源,以便这些核苷酸之间的差别仅源于序列进化中产生的变动。不同序列的核苷酸之间的同源性推断最常通过属于“多序列比对”类别的办法来实现。 在本教程中,我将介绍如何应用最快、最风行的多序列比对工具之一,程序 MAFFT(Katoh 和 Standley 2013)。我将进一步演示如何检测和排除其中核苷酸同源性可能存在问题的比对区域,如何应用公共序列数据库(NCBI 的 GenBank)辨认其余同源序列,以及如何应用这些序列来补充现有数据集。 数据集本教程中应用的数据集是 Matschiner 等人应用的数据的一小部分。预计非洲和新寒带丽鱼科鱼类与冈瓦纳大陆印度、马达加斯加、非洲和南美洲决裂相干的分化工夫。这里应用的数据集包含两个基因的序列;编码 16S 核糖体 RNA 的线粒体 16S 基因和编码重组激活蛋白 1 的核 RAG1 基因。 依赖MAFFT:MAFFT 网页上提供了 MAFFT 的装置阐明和预编译版本。尽管该程序的装置在所有操作系统上都应该很容易,但本教程的所有步骤也能够应用 MAFFT 的服务器版本进行;因而,该软件的装置是可选的。AliView:为了可视化序列比对,举荐应用软件 AliView (Larsson 2014)。 AliView 的装置在 http://www.ormbunkar.se/aliview/ 中进行了形容,并且应该能够在所有操作系统上进行。BMGE:BMGE对于辨认和删除序列比对中对齐不良的区域十分有用。最新版本的 BMGE 以 Java jar 文件模式提供,位于 ftp://ftp.pasteur.fr/pub/gensoft/projects/BMGE/。比对与可视化咱们将首先应用 MAFFT 程序比对线粒体 16S 基因的序列,而后应用软件 AliView 可视化并改良比对。 将蕴含 16S 序列的文件 16s.fasta 下载到您的剖析目录。在文本编辑器或命令行上查看该文件,例如应用 less 命令:less 16s.fasta您将看到每条记录都由一个 ID 和一个序列组成,其中 ID 始终位于以“>”符号结尾的单行上,前面是蕴含序列的行。序列尚未对齐;这就是它们不蕴含间隙且长度不同的起因。能够利用其余命名计划,而不是该文件中应用的 14 个字符的 ID;然而,我强烈建议应用简短的 ID,因为在系统发育剖析中,如果您应用蕴含空格或连字符的理论拉丁名或常见物种名称,许多程序或脚本可能无奈工作。 关上 MAFFT 在线版本的网站。该网站提供了 MAFFT 对齐程序的 Web 界面。如果您胜利装置了 MAFFT,您还能够在计算机上应用 MAFFT,而不是应用该网站。在 MAFFT 服务器网站上的“高级设置”题目下(向下滚动查看),您将找到可用的对齐选项。在第一个题目为“策略”的灰色框中,您能够在全局和部分对齐办法之间进行抉择。 “G-INS-i”办法实现全局 Needleman-Wunsch 算法(Needleman 和 Wunsch 1970),“L-INS-i”办法实现部分“Smith-Waterman”算法(Smith 和 Waterman 1981)。为简略起见,保留默认的“主动”选项。如果您在本人的计算机上应用 MAFFT 的命令行版本而不是 MAFFT 服务器,则等效命令如下:mafft --auto 16s.fasta > 16s_aln.fasta在“高级设置”局部的第三个灰色框中,题目为“参数”,您能够更改评分矩阵。对于氨基酸序列,您能够抉择任何与 PAM 矩阵等效的 BLOSUM 矩阵。对于核苷酸序列,能够抉择“1PAM / K=2”、“20PAM / K=2”和“200PAM / K=2”。目前,保留所有默认选项。单击“提交”按钮。将 Fasta 格局的比对下载到您的计算机。为此,请右键单击页面最顶部的“Fasta 格局”链接。将文件命名为 16s_aln.fasta。反复雷同的操作,这次惩办设置为 2,而不是默认值 1.53。将剖析所得的比对文件命名为 16s_op2_aln.fasta。如果您应用 MAFFT 的命令行版本,则等效命令如下:mafft --auto --op 2 16s.fasta > 16s_op2_aln.fasta在AliView中关上文件16s_aln.fasta。在不敞开 AliView 窗口的状况下,在第二个 AliView 窗口中关上文件 16s_op2_aln.fasta。比拟右下角状态栏中显示的总对齐长度。在两个 AliView 窗口中,滚动到地位 1250 和 1350 之间的区域。在 16s_aln.fasta 的窗口中,辨认对齐不良的区域(例如地位 1020 到 1040 四周)并尝试从新对齐。为此,请通过单击路线顶部的标尺来抉择区域,如上面的屏幕截图所示。 ...

September 8, 2023 · 2 min · jiezi

关于程序员:Day8浅谈useMemo

指标: 继续输入!每日分享对于web前端常见常识、面试题、性能优化、新技术等方面的内容。Day8-今日话题useMemo 是 React 中一个无力的性能优化Hook。可从用法、工作原理、作用、优缺点、应用场景、应用留神点进行学习、温习。 拿vue作比拟的话,性能能够类比成vue的计算属性computed,都是因为依赖项发生变化而进行从新计算。 1. 用法useMemo 是 React 中的一个 Hook,用于缓存计算结果,以缩小不必要的计算和渲染。它承受两个参数: 一个函数,用于计算须要缓存的值。一个依赖数组,蕴含了在数组中列出的变量发生变化时才从新计算值,能够为空数组或蕴含多个依赖。const memoizedValue = useMemo(() => computeExpensiveValue(dep1, dep2), [dep1, dep2]);2. 工作原理useMemo 的工作原理波及到 React 的渲染过程和依赖数组的比拟,上面具体介绍其工作原理: 组件的初始渲染和依赖项变动时: 当一个组件首次渲染时或其依赖项发生变化时,React 会执行组件函数内的所有代码,包含 useMemo。在 useMemo 中,第一个参数是一个计算函数。React 调用这个函数,计算并返回一个值,同时将这个值存储在外部。React 还会将依赖数组(useMemo 的第二个参数)的内容记录下来。比拟依赖项: 当组件从新渲染时,React 会再次执行组件函数,包含 useMemo。在这个阶段,React会比拟以后的依赖数组和上一次渲染时存储的依赖数组。从新计算或复用: 如果以后的依赖数组和上一次的依赖数组完全相同(即每个元素都严格相等),React 会认为依赖项没有变动,不会从新计算 useMemo 的后果。如果以后的依赖数组和上一次的依赖数组不相等,React 将从新调用 useMemo 中的计算函数,计算并返回新的值。如果依赖数组为空([]),则 useMemo 的后果只会在组件首次渲染时计算一次,并且永远不会从新计算。返回计算结果: 无论是从新计算还是复用,useMemo 的最终后果都将返回给组件,能够在组件中应用。这个工作原理确保了 useMemo 只在其依赖项发生变化时才会从新计算,从而无效地防止了不必要的计算和渲染。这对于优化性能和确保组件的一致性十分重要。 须要留神的是,useMemo 返回的是缓存的值,而不是一个函数。如果须要缓存一个函数,能够应用 useCallback。此外,useMemo 的依赖数组应该蕴含所有在计算函数中应用的变量,以确保在依赖项变动时从新计算。 3. 作用性能优化:useMemo 能够用于缓存低廉的计算,防止不必要的从新计算,从而进步性能。防止不必要的渲染:通过将 useMemo 的后果用作子组件的 prop,能够防止子组件在不必要的状况下从新渲染。缓存援用类型:能够缓存援用类型(如对象或数组),以防止在每次渲染时都创立新的援用。4. 长处性能优化:最显著的长处是帮忙优化性能,防止不必要的计算和渲染。可读性:通过明确指定依赖,代码变得更加可读和可保护。5. 毛病滥用可能导致性能问题:适度应用 useMemo 可能会导致性能问题,因为它可能导致不必要的内存占用。应该审慎抉择应用它,只在须要缓存计算结果时才应用。复杂性减少:如果依赖数组蕴含多个变量,保护这些依赖可能会减少代码复杂性。6. 应用场景计算结果低廉:用于缓存计算成本昂扬的值,例如数学计算、数据筛选、数据转换等。防止不必要的渲染:将 useMemo 的后果用作子组件的 prop,以确保子组件只在必要时从新渲染。缓存援用类型:当须要在屡次渲染之间放弃雷同的援用类型时,能够应用 useMemo。艰深来讲就是说,以后组件或者以后组件所在的父组件批改状态(state)时,咱们不想让其 render 函数中的某个节点或者本身因为不相干的状态变动而去从新渲染造成性能上的节约,能够应用useMemo来解决这个问题。 ...

September 8, 2023 · 1 min · jiezi

关于程序员:linux-网络命令

网络命令配置ip配置ip有两种形式 #形式一#setup能够应用配置工具进行配置setup#形式二 linux服务器默认网卡配置文件的目录/etc/sysconfig/network-scripts,进行配置网卡的配置文件类型- ifcfg-ethX 有线网卡的配置文件,eth0示意第一块网卡,eth1示意第二块网卡,以此类推- ifcfg-ethX:X 有线网卡的虚构网卡的配置文件- ifcfg-wlanX 无线网卡的配置文件网卡配置文件中各行代表的含意DEVICE="eth0" #物理设施名 BOOTPROTO=dhcp #IP 地址的获取形式[none|static|bootp|dhcp 别离是不应用协定|动态调配|BOOTP协定|DHCP协定]TYPE=Ethernet #网卡类型HWADDR= #MAC 地址ONBOOT=yes #开机启动 [yes|no]IPADDR= #Ip 地址NETMASK= #子网掩码GATEWAY= #网关地址#配置实现后重启网卡/etc/init.d/network restart# 应用ifconfig来进行配置# 查看 ip 信息ifconfig# 配置 eth0 的 IP 信息ifconfig eth0 200.200.200.2 netmask 255.255.255.0# 禁用网卡ifdown eth0 # 启用网卡ifup eth0 # 批改网卡 eth0 的 MAC 地址ifconfig eth0 hw ether 00:11:22:33:44:55 配置完之后重启网络服务 service network restart<!-- more --> 查看ip信息ifconfig能够查看主机IP地址和其余一些对于网络接口的信息,相当于windows的ipconfig ifconfigping#ping [选项] ipping www.baidu.com-------------------------c 次数-b 对ip段进行播送配置DNSlinux中DNS配置文件在/etc/resolv.conf search bj.baidu.internalnameserver 192.168.0.2 # 主DNSnameserver 192.168.0.3 # 备DNSoptions rotate timeout:1netstat查看网络状态,既能够查看本机开启端口,也能够查看有哪些客户端连贯 ...

September 8, 2023 · 1 min · jiezi

关于程序员:行业追踪20230907

主动复盘 2023-09-07凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。 板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. 光刻胶1. 光刻胶1. 券商概念1. 游戏2. 电子化学品2. 电子化学品2. 证券2. 减速器3. Chiplet概念3. Chiplet概念3. 煤炭行业3. 激光雷达4. 煤炭行业4. 煤炭行业4. 房地产开发4. 云游戏5. EDA概念5. 时空大数据5. 多元金融5. 电机6. 光学光电子6. 减速器6. 装修建材6. 文化传媒7. 中芯概念7. 动物照明7. 土地流转7. 汽车热治理8. MiniLED8. 空间站概念8. 电子化学品8. 证券9. 动物照明9. 通信服务9. 装修装璜9. 券商概念10. 空间站概念10. EDA概念10. 商业百货10. 屏下摄像11. PCB11. 光学光电子11. 银行11. 在线教育12. 装修建材12. 航天概念12. 互联金融12. 通信设施13. 半导体13. 装修建材13. 人造肉13. 工业4.014. 智能穿戴14. 生产电子14. 稀缺资源14. 无人驾驶15. 屏下摄像15. 装修装璜15. 页岩气15. 人工智能16. 3D摄像头16. PCB16. 光刻胶16. 元宇宙概念17. 生产电子17. 塑料制品17. 地摊经济17. 银行18. 半导体概念18. MiniLED18. 酿酒行业18. 汽车零部件19. 无线耳机19. 智能穿戴19. 时空大数据19. Web3.020. 氮化镓20. 北斗导航20. ST股20. 工业母机21. 北斗导航21. 工业母机21. 水产养殖21. Chiplet概念22. LED22. 航天航空22. 石油行业22. 东数西算23. 被动元件23. 被动元件23. 白酒23. 计算机设备24. 培养钻石24. 屏下摄像24. 拆卸修建24. 时空大数据25. 汽车芯片25. 环保行业25. 食粮概念25. 地摊经济板块 rps20 排名详情板块详情1. 电子化学品2. 光刻胶3. 煤炭行业4. Chiplet概念5. 时空大数据6. 减速器7. 空间站概念8. 动物照明9. 通信服务10. 光学光电子11. EDA概念12. 航天概念13. 装修建材14. PCB15. 生产电子16. 装修装璜17. 塑料制品18. MiniLED19. 智能穿戴20. 北斗导航21. 工业母机22. 被动元件23. 航天航空24. 屏下摄像25. 环保行业板块 rps50 排名详情板块详情1. 券商概念2. 证券3. 房地产开发4. 煤炭行业5. 装修建材6. 多元金融7. 装修装璜8. 土地流转9. 电子化学品10. 商业百货11. 银行本文由mdnice多平台公布 ...

September 7, 2023 · 1 min · jiezi

关于程序员:一文搞懂XaaS

云服务是指通过互联网按需提供给企业和客户的各种服务,大抵能够分为IaaS、PaaS、SaaS三类,每一类又衍生出不同细分的云服务模式。本文介绍了以后曾经提出的19种云服务模式,原文: The Comprehensive Concept of IaaS, PaaS, SaaS, AaaS, BaaS, FaaS, DaaS, STaaS, CaaS, NaaS, DBaaS, AaaS, aPaaS, iPaaS, apimPaaS, IoT PaaS, mPaaS, dbPaaS, and UIPaaS如果你想建设、托管网站,但不想应用云服务(即本地部署模式, on-premises),那么就须要以更高的后期老本购买服务器硬件,益处是能够更好的管制这些服务并与业务集成。 如果不想购买服务器硬件,但依然想取得计算资源,能够通过互联网按需订购这些服务,从而服务终端用户。 IaaS = Infrastructure as a service\PaaS = Platform as a service\SaaS = Software as a service\AaaS = Analytics as a service\BaaS = Backend as a service\FaaS = Function as a service\DaaS = Data as a service\STaaS = Storage as a service\CaaS = Container as a service\NaaS = Network as a service\DBaaS = Database as a service\AaaS =Authentication as a service\aPaaS = Application platform as a service\iPaas = Integration platform as a service\apimPaas = API management PaaS API\IoT PaaS = Internet of Things PaaS\mPaaS = Mobile PaaS\dbPaaS = Global Database PaaS\UIPaaS = User Interface PaaS ...

September 7, 2023 · 2 min · jiezi

关于程序员:linux-进程管理命令

过程治理命令查看过程命令ps命令显示零碎上运行的过程列表 # 查看零碎中所有正在运行的零碎ps aux# 获取占用内存资源最多的10个过程,能够应用如下命令组合:ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head# 获取占用CPU资源最多的10个过程,能够应用如下命令组合:ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head------------a 显示所有用户的所有过程,除了会话引线u 显示过程的归属用户及内存的应用状况,依照用户名和启动工夫程序显示x 显示没有管制终端的过程-e 显示零碎中所有的过程-f 显示过程间关系-H 显示树状构造-r 显示以后终端的程序-T 显示以后终端的所有程序-p 依据过程ID显示对应的信息-A 扼要查看系统启动的所有过程aux 显示所有用户所有过程的详细信息ps -ef<!-- more --> 显示的内容 USER 哪个用户产生的PID 过程的ID号%CPU 该过程占用CPU资源的百分比%MEM 该过程占用物理内存的百分比VSZ 该过程占用虚拟内存的大小,单位KBRSS 该过程占用理论物理内存的大小,单位KBTTY 该过程是在哪个终端中运行的。tty1-tty7代表本地控制台终端,tty1-tty6是本地字符界面终端,tty7是图形终端。pts/0-255代表虚构终端,个别是近程连贯的终端,第一个近程连贯占用的是pts/0终端,顺次递增,?示意由内核间接启动的,是零碎过程STAT 过程状态。 D示意不可唤醒的睡眠状态,通常用于I/O状况R示意过程正在进行S示意过程在睡眠状态,可被唤醒T示意进行状态,可能是在后盾暂停或过程在出错状态W示意内存交互状态X示意死掉的过程Z示意僵尸过程。过程曾经终止,然而局部程序还在内存当中<示意高优先级N示意低优先级L示意被锁入内存s示意饱汉子过程l示意多线程+示意位于后盾START 该过程的启动工夫TIME 该过程占用CPU的运算工夫COMMAND 产生此过程的命令top命令实时对系统处理器状态进行监控 top -p 1298-------选项-p 只查看某个PID-b 分屏显示输入信息,联合-n能够把数据能够写入文件-n 刷新几次-d 指定刷新距离-i 不显示闲置的过程信息-c 显示过程的整个命令门路------交互选项P 依照CPU排序,默认M 依照内存使用率排序N 依照PID排序k 终止一个过程,提醒用户输出一个须要终止过程的pidi 疏忽闲置过程s 扭转top刷新距离o 扭转输入信息中显示我的项目的程序。按小写的a~z键能够将相应的列向右挪动,按大写的A~Z键能够将相应的列向左挪动。回车确认c 显示残缺命令行q 退出top命令默认状况下,top是依照过程来显示CPU耗费状况的,按 SHIFT+H 能够依照线程来查看CPU的耗费状况显示的内容 ...

September 6, 2023 · 1 min · jiezi

关于程序员:行业追踪20230906

主动复盘 2023-09-06凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。 板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. 电子化学品1. 电子化学品1. 券商概念1. 激光雷达2. 光刻胶2. 光刻胶2. 证券2. 减速器3. 中芯概念3. Chiplet概念3. 光刻胶3. 游戏4. Chiplet概念4. 煤炭行业4. 电子化学品4. 电机5. EDA概念5. 减速器5. 房地产开发5. 汽车热治理6. 半导体6. EDA概念6. 装修建材6. 云游戏7. 3D摄像头7. 时空大数据7. 煤炭行业7. 屏下摄像8. PCB8. 光学光电子8. 土地流转8. 文化传媒9. 半导体概念9. 空间站概念9. 装修装璜9. 证券10. 光学光电子10. PCB10. Chiplet概念10. 工业4.011. 智能穿戴11. 通信服务11. 多元金融11. Chiplet概念12. 生产电子12. 动物照明12. 人造肉12. 券商概念13. 无线耳机13. 塑料制品13. 商业百货13. 汽车零部件14. 汽车芯片14. 装修建材14. 地摊经济14. 无人驾驶15. 氮化镓15. 航天概念15. 互联金融15. 工业母机16. 屏下摄像16. 生产电子16. 稀缺资源16. 空气能热泵17. 动物照明17. 北斗导航17. 页岩气17. 在线教育18. MiniLED18. 中芯概念18. 电子车牌18. 船舶制作19. 第三代半导体19. MiniLED19. 环保行业19. 光学光电子20. 空间站概念20. 智能穿戴20. 银行20. 通信设施21. 工业气体21. 环保行业21. 有色金属21. 机器人概念22. 被动元件22. 被动元件22. ST股22. 动物照明23. 国产芯片23. 半导体23. 时空大数据23. 银行24. 电子元件24. 工业母机24. 钛白粉24. 电子化学品25. LED25. 3D摄像头25. 拆卸修建25. 地摊经济板块 rps20 排名详情板块详情1. 光刻胶2. 电子化学品3. Chiplet概念4. 煤炭行业5. 减速器6. EDA概念7. 时空大数据8. 空间站概念9. 光学光电子10. PCB11. 通信服务12. 塑料制品13. 动物照明14. 装修建材15. 生产电子16. 航天概念17. 北斗导航18. 中芯概念19. MiniLED20. 智能穿戴21. 半导体22. 环保行业23. 被动元件24. 3D摄像头25. 工业母机板块 rps50 排名详情板块详情1. 证券2. 券商概念3. 电子化学品4. 光刻胶5. 房地产开发6. 装修建材7. 装修装璜8. 土地流转9. 煤炭行业10. 多元金融11. Chiplet概念本文由mdnice多平台公布 ...

September 6, 2023 · 1 min · jiezi

关于程序员:Day7浅谈useEffect

指标: 继续输入!每日分享对于web前端常见常识、面试题、性能优化、新技术等方面的内容。Day7-今日话题useEffect 是 React 中一个十分重要的 Hook,用于解决副作用和订阅内部数据源的变动。它能够在函数式组件中执行各种操作,例如数据获取、订阅事件、手动DOM操作等。上面我将从以下五个角度介绍useEffect: 用法作用工作原理优缺点应用留神点对于常常应用vue进行开发的同学来说,能够类比成watch 用法useEffect 在函数式组件内被调用,用于在组件渲染后执行副作用操作,它承受两个参数。 第一个参数是一个回调函数,该函数蕴含副作用操作的代码, 能够可选地返回一个清理函数,用于在组件卸载或下一次副作用触发前执行清理操作。 第二个参数是一个数组,用于指定依赖项。如果依赖项发生变化,useEffect 将从新运行。如果为空数组,useEffect 仅在组件挂载和卸载时运行一次 import React, { useEffect } from 'react';function MyComponent() { useEffect(() => { // 这里编写副作用操作 // 返回一个清理函数,可选 return () => { // 在组件卸载或下一次副作用触发前执行清理操作 }; }, [dependencies]); // 组件的其余代码}作用解决副作用操作,例如数据获取、订阅事件、DOM 操作等。在组件挂载和更新时触发副作用操作。在组件卸载时清理副作用操作,以避免内存透露和不必要的副作用。工作原理概括useEffect 利用 React 的调度机制,在组件渲染后执行指定的副作用操作。React 会确保在浏览器实现绘制之后才执行这些操作,以防止阻塞渲染。 具体组件挂载:当一个组件首次渲染到页面上时,React 会执行组件函数,包含其中的 useEffect 回调函数。这个回调函数中蕴含了须要执行的副作用操作。此时,React 不会期待副作用操作实现,而是将其退出一个队列中,以便稍后执行。浏览器绘制实现后执行:React 会期待浏览器实现以后的渲染工作,确保页面元素曾经出现给用户。一旦浏览器实现绘制,React 会执行队列中的副作用操作。这能够确保副作用操作不会阻塞页面的渲染,从而进步用户体验。 组件更新:当组件的状态或 props 发生变化时,React 会从新渲染组件。如果在 useEffect 中指定了依赖项数组,React 将比拟以后的依赖项和上一次渲染时的依赖项。如果它们不统一,阐明依赖项发生变化,React 将再次执行 useEffect 中的回调函数。清理操作:如果 useEffect 中返回了一个函数(清理函数),这个函数将在下一次副作用操作执行之前运行。这通常用于清理资源、勾销订阅或解决副作用的清理工作。组件卸载:当组件从页面中卸载时(如路由切换或组件不再须要渲染),React 会执行清理函数(如果存在),以确保开释副作用操作可能持有的资源,从而防止内存透露。性能优化:React 还会进行一些性能优化,例如将多个 useEffect 中的副作用操作合并成一个以缩小不必要的工作。这是通过外部的调度机制来实现的,React 会智能地决定何时执行哪些副作用操作。优缺点长处: ...

September 6, 2023 · 1 min · jiezi

关于程序员:免费的-Windows-软件下载网站为您的电脑增添功能和效率

在数字时代,咱们的计算机不仅仅是工作工具,还是咱们的娱乐中心和沟通枢纽。为了充分利用您的 Windows 计算机,您可能须要装置各种软件,从办公套件到多媒体工具和系统优化程序。然而,购买所有这些软件可能会产生微小的费用。好消息是,有许多牢靠的收费 Windows 软件下载网站,为用户提供了宽泛的抉择。 Softpedia(Softpedia)Softpedia 是一个综合性的软件下载网站,领有微小的软件库。这个网站提供了 Windows 软件的宽泛分类,包含办公、娱乐、平安和零碎工具。用户能够轻松地搜寻并下载他们须要的软件,而且所有软件都通过平安检测。FileHippo(FileHippo)FileHippo 是另一个备受欢送的 Windows 软件下载站点,以其简略易用的界面和软件库的更新速度而闻名。它提供了大量的收费 Windows 软件,包含最新版本的浏览器、多媒体播放器、防病毒软件等。Ninite(Ninite)Ninite 是一个十分不便的工具,容许用户一次性下载和装置多个常用软件,而无需屡次点击“下一步”。您只需在 Ninite 上抉择您须要的软件,而后它将为您创立一个自定义安装程序,使装置过程变得疾速而无缝。SourceForge(SourceForge)SourceForge 是一个开源软件社区,提供了大量收费的开源 Windows 软件。如果您对开源软件感兴趣,这个网站是一个贵重的资源,提供了开源我的项目的下载和奉献机会。PortableApps(PortableApps)PortableApps 专一于便携式应用程序,这意味着您能够将它们装置到 USB 驱动器上并随身携带,而无需在不同计算机上安装。这对于须要在多台计算机之间应用雷同软件的人来说十分不便。这些收费 Windows 软件下载网站为用户提供了宽泛的抉择,无论您是在寻找办公软件、娱乐工具还是系统优化程序,都能够在这些网站上找到适合的软件。但请留神,无论您从哪里下载软件,都要确保只从可信赖的起源下载,并定期更新以放弃计算机的安全性。 本文由mdnice多平台公布

September 6, 2023 · 1 min · jiezi

关于程序员:免费的创意宝库探索这些图库网站为您的项目找到完美的视觉素材

以下是一些收费的图库网站,它们提供各种类型的图片和插图,可用于集体和商业我的项目,但请留神,某些网站可能须要您认真查看其应用条款和许可协定以确保您的应用非法: Unsplash: 网站:Unsplash简介:Unsplash 是一个高品质的收费图片库,提供各种主题的照片,包含自然风景、人物、城市景色等。图片都能够收费用于集体和商业我的项目。Pixabay: 网站:Pixabay简介:Pixabay 提供数百万张收费的高分辨率照片、插图和矢量图。您能够在我的项目中自在应用这些资源,而无需提供归属。Pexels: 网站:Pexels简介:Pexels 提供高质量的收费照片和视频素材,实用于集体和商业用途。它还有一个搜寻性能,能够轻松找到您须要的图像。Burst by Shopify: 网站:Burst简介:Burst 是由Shopify创立的图库,专门为电子商务和创业者提供收费的高分辨率图片。它包含多种类别,如时尚、家居、天然等。Gratisography: 网站:Gratisography简介:Gratisography 提供创意独特的收费高分辨率照片,实用于那些寻找不寻常和乏味图像的人。Freepik: 网站:Freepik简介:Freepik 提供宽泛的收费和付费图形资源,包含矢量图、照片、插图和 PSD 文件。您能够依据须要抉择应用收费或付费资源。Vecteezy: 网站:Vecteezy简介:Vecteezy 是一个矢量图库,提供各种矢量图形,实用于图形设计和插图我的项目。它有收费和付费资源。Flickr Creative Commons: 网站:Flickr Creative Commons简介:Flickr 的局部用户在其图片上利用了创意共享许可,容许其他人在遵循许可协定的前提下应用这些图片。您能够在高级搜寻选项中筛选这些图片。请留神,只管这些资源大多容许收费应用,但某些状况下可能须要归属作者或遵循特定的应用条款。在应用这些图库中的图片前,请确保您理解并恪守相应的许可协定。 本文由mdnice多平台公布

September 6, 2023 · 1 min · jiezi

关于程序员:11GPT回答Rust-Web框架-和微服务框架表格对比

Rust Web 框架和微服务框架的比照信息: Axum框架简介:Axum是一个基于async/await的轻量级Web框架。官网地址:https://github.com/tokio-rs/axumGitHub地址:https://github.com/tokio-rs/axumStar数量:未知是否反对gRPC:不反对是否反对Dubbo:不反对性能比拟:未知论坛网址:未知出名博客:未知应用该框架商用的公司:未知Actix-web框架简介:Actix-web是一个基于Actix actor框架的弱小、疾速且可扩大的Web框架。官网地址:https://actix.rs/GitHub地址:https://github.com/actix/actix-webStar数量:未知是否反对gRPC:反对是否反对Dubbo:不反对性能比拟:未知论坛网址:https://actix.rs/community/出名博客:未知应用该框架商用的公司:未知Rocket框架简介:Rocket是一个Ergonomic Web框架,它具备弱小的类型检查和宏。官网地址:https://rocket.rs/GitHub地址:https://github.com/SergioBenitez/RocketStar数量:未知是否反对gRPC:不反对是否反对Dubbo:不反对性能比拟:未知论坛网址:https://rocket.rs/community/出名博客:Sergio Benitez应用该框架商用的公司:未知Warp框架简介:Warp是一个基于async/await的轻量级Web框架,具备高性能和灵便的路由。官网地址:https://seanmonstar.com/post/warp-in-2020/GitHub地址:https://github.com/seanmonstar/warpStar数量:未知是否反对gRPC:不反对是否反对Dubbo:不反对性能比拟:未知论坛网址:未知出名博客:未知应用该框架商用的公司:未知Polaris框架简介:Polaris是一个实用于数据处理和数据分析的Rust框架。官网地址:https://pola-rs.github.io/GitHub地址:https://github.com/segmentio/polarsStar数量:未知是否反对gRPC:不反对是否反对Dubbo:不反对性能比拟:未知论坛网址:https://github.com/segmentio/polars/issues出名博客:未知应用该框架商用的公司:未知Dubbo-rs框架简介:Dubbo-rs是阿里Dubbo协定的Rust实现。官网地址:https://github.com/apache/dubbo-rsGitHub地址:https://github.com/apache/dubbo-rsStar数量:未知是否反对gRPC:不反对是否反对Dubbo:反对性能比拟:未知论坛网址:https://github.com/apache/dubbo-rs/issues出名博客:未知应用该框架商用的公司:未知Volo框架简介:Volo是一个用于构建工具的Rust框架。官网地址:https://volo.rs/GitHub地址:https://github.com/volkswoagen/voloStar数量:未知是否反对gRPC:不反对是否反对Dubbo:不反对性能比拟:未知论坛网址:https://github.com/volkswoagen/volo/issues出名博客:未知应用该框架商用的公司:未知Tonic框架简介:Tonic是一个用于构建gRPC服务的Rust框架。官网地址:https://github.com/hyperium/tonicGitHub地址:https://github.com/hyperium/tonicStar数量:未知是否反对gRPC:反对是否反对Dubbo:不反对性能比拟:未知论坛网址:https://community.rust-lang.org/c/announcements出名博客:未知应用该框架商用的公司:未知上面是对应的表格比照: 框架简介官网地址GitHub地址Star数量gRPC反对Dubbo反对性能比拟论坛网址出名博客应用该框架商用的公司Axum基于async/await的轻量级Web框架LinkLinkUnknown❌❌UnknownUnknownUnknownUnknownActix-web基于Actix actor框架的弱小、疾速且可扩大的Web框架LinkLinkUnknown✔️❌UnknownLinkUnknownUnknownRocketErgonomic Web框架,具备弱小类型检查和宏LinkLinkUnknown❌❌UnknownLinkSergio BenitezUnknownWarp基于async/await的轻量级Web框架,高性能和灵便路由LinkLinkUnknown❌❌UnknownUnknownUnknownUnknownPolaris实用于数据处理和数据分析的Rust框架LinkLinkUnknown❌❌UnknownLinkUnknownUnknownDubbo-rs阿里Dubbo协定的Rust实现LinkLinkUnknown❌✔️UnknownLinkUnknownUnknownVolo用于构建工具的Rust框架LinkLinkUnknown❌❌UnknownLinkUnknownUnknownTonic用于构建gRPC服务的Rust框架LinkLinkUnknown✔️❌UnknownLinkUnknownUnknown请留神,上述表格中的一些信息是 "Unknown",这意味着我无奈提供相干数据。同时,出名博客和应用该框架商用的公司信息可能因实时性和数据可用性而有所不同,请自行依据须要进行进一步考察和钻研。 心愿这个表格对你有所帮忙!如果须要进一步的帮忙,请随时通知我。 本文由mdnice多平台公布

September 5, 2023 · 1 min · jiezi

关于程序员:一个后端工程师对前端云-Vercel-的体验和探索

一个后端工程师对前端云 Vercel 的体验和摸索 明天小猿姐特邀咱们资深的程序猿为大家带来产品的体验报告。 Vercel 概述Vercel 是一个为前端开发者设计的一体化平台(前端云),能够帮忙开发者疾速地将网站和应用程序部署到各种环境中,并且提供了一个灵便、可扩大和平安的平台,非常适合开发者在不同平台和环境中进行开发和部署。 Vercel 的次要特点包含: 通过主动配置构建设置和提供具体的构建日志,简化了部署治理过程。借助集成的 CI/CD 性能,开发者能够预览其更改,并无缝合并到主分支进行生产部署。反对自定义域名,能够轻松配置并为部署调配个性化的 URL。提供了查看、剖析和应用状况等监控工具,以跟踪网站性能和用户参与度。借助 Vercel,开发者能够简化开发流程,实现疾速、个性化的 Web 内容交付。 Vercel 的用户十分宽泛,也为许多不同类型的企业提供服务,例如 Facebook、Chipotle 和 Carhartt。 Vercel 的倒退历史产品演进迄今为止,Vercel曾经通过了8年的倒退。 工夫线2015 创立 Zeit(Vercel 前身)2016 年外围产品 Now 公布针对小公司和集体开发者,Now 与现在的 Vercel 在产品逻辑上曾经非常靠近。 2016 年 Zeit 推出开源的 React 下层框架 Next.js简略的学习曲线和弱小的性能,使得 Next.js 很快成为了热门开源我的项目。Next.js 我的项目的胜利也让大量开发者间接理解到了 Zeit 和 Now。 并且相比部署一般 Web 网站,性能更弱小并简单的 Next.js 部署起来也更加简单。主导极简部署的 Now 便适时地深度集成了 Next.js,实现了双剑合璧。与 Next.js 的交融,也让 Zeit 的社区日益凋敝。 2020 实现 A 轮融资,改名为 Vercel,集成 React 以外支流框架截至 2020 年 4 月,Zeit 一共博得了 30多万 用户。开发者的青眼助力 Zeit 实现 2100w 美元 A 轮融资。 ...

September 5, 2023 · 3 min · jiezi

关于程序员:112GPT教学window安装go121的powershell脚本

在 Windows 电脑上装置 Go 1.21本文将介绍如何在 Windows 电脑上装置 Go 1.21,并配置罕用设置和工具,包含卸载之前的 Go 版本、装置地位、GOPATH、环境变量设置、dlv 的装置和中国境内代理设置。 筹备工作在开始装置之前,请确保进行以下筹备工作: 曾经在零碎上装置了 PowerShell曾经有其余版本的 Go,须要卸载之前的版本卸载之前的 Go 版本如果你之前曾经装置了其余版本的 Go,并想要卸载它们,请依照以下步骤进行: 创立一个名为 uninstall_go.ps1 的 PowerShell 脚本文件,并将以下内容粘贴进去:$uninstallVersions = @("1.20", "1.19") # 填写你要卸载的版本号,能够有多个$goInstallDir = "D:\Tools\Go\Env\" # Go 装置目录的门路foreach ($version in $uninstallVersions) { $versionInstallDir = $goInstallDir + "go" + $version Write-Host "Uninstalling Go $($version)..." Remove-Item -Recurse -Force $versionInstallDir Write-Host "Go $($version) has been successfully uninstalled."}依据你须要卸载的版本号,在 $uninstallVersions 数组中填入相应的版本号。运行 uninstall_go.ps1 脚本,它将顺次卸载每个版本的 Go。PS C:\> .\uninstall_go.ps1装置 Go 1.21接下来,咱们将装置 Go 1.21。依照以下步骤进行操作: ...

September 5, 2023 · 2 min · jiezi

关于程序员:快速成长的秘诀|自我成长的方法有哪些

疾速成长总共三篇,别离是《实现自我降级》、《自我成长的办法》、《学会自我造就或造就别人》。在成长第一篇《实现自我降级》公布后,有很多同学做了仔细阅读,而且其中一位同学给了我十分好的反馈补充,他的原话: "我看完了,给我一个最大的感触是,您把一整套认知思维串起来了。从对大脑的意识到,司空见惯,到做事注意力,到执行力,以及起初的跳出舒服区等。就感觉把日常工作中的方方面面正好都串起来。这样的话就是在工作生存中,每时每刻都能够找到对应的认知点,本人能够时刻觉察当下在认知上是否又掉到消费者里了。" 的确,过来看到很多的认知都是点的,所以经常性把他们当作鸡汤,当作洗脑,然而一旦把一些点的认知集中起来放在一起,内化成本人的认知零碎,兴许看问题的角度,思考的形式都会产生十分大的变动。 2000年,亚马逊创始人贝索斯给巴菲特打电话,问他:“你的投资体系这么简略,为什么你是全世界最富裕的人之一,他人不做和你一样的事件?” 巴菲特答复说:“因为没人违心缓缓地变富。” 巴菲特50岁时只有1亿美元的财产,也就是说,当初的800多亿美元,靠近99%的财产,都是在50岁当前靠每年20%的复利产生的。蠢才没有一开始就胜利的。 这个实在的故事很励志,但真正有多少人从中看到了“因为没人违心缓缓的变富”这句话背地的智慧,我置信有很多人,我只是其中一个。这句话放在个人成长上,能够这样说,没人违心缓缓地期待成长,期待被发现,期待被认可。大部人遗记了:胜利=意志力*间断,遗记人生是一个操作系统须要继续打补丁,继续降级的过程。 自我成长是毕生的必修课,而这门必修课须要本人的践行和验证,而我通过这几年的思考和实际,总结出了适宜本人成长的最佳实际,当然必定存在其余更优良的成长门路,然而我置信找到一条无效的门路,继续走上来,做出品质,必定可能达到起点。 我会从9个维度分享自我成长,下图6层金字塔是成长的阶梯,从认知到方法论,我会一个个谈谈我的认识,同时金字塔两边是从本人的视角和别人的视角如何掂量本人的成长,最初通过利TA让本人成长成大树的同时帮忙别人成长,独特长成树林。 1.认知成长:晓得何为成长,本人所处角色是平庸者、沉睡者,思行者,还是践行者; 2.善用财产:每个人身上的财产有金钱、工夫和注意力,应该如何善用财产; 3.懂得分辨:成长过程中一直呈现的烦扰,懂得辨别哪些是信息,哪些是常识,哪些是贵人,哪些是智慧; 4.成长心态:所谓以终为始,就是站在将来看当初,须要作出的口头,具备的心态; 5.成长办法:套用办法,临摹别人的成长办法,也能取得疾速成长,我来通知大家几个实用办法; 6.成长后果:所有的成长最终还是须要内化成本人的能力,多维视角缓缓拓展本人的能力圈; 7.衡量标准:当开始拓展能力圈后,用什么去掂量本人的成长; 8.集体标签:心愿给本人打造什么样的集体标签,身上的什么特点吸引了他人; 9.利TA:长10年,成大树的同时帮忙别人长成大树,多做利TA的事件; 一、认知成长 “平庸者”不晓得本人不晓得,对“平庸者”打了个双引号,是因为我认为绝大部分人都不平庸,都能够做到十分优良,只是没有好的信息输出,没有过认知降级,短少成长的办法,导致失去了自我成长的意识和机会,想想本人的孩子,或本人小时候,对陈腐事物的好奇心,对常识的渴望,总爱问为什么,总爱入手折腾,然而长大后的咱们缓缓变懒了,每日再也不是波澜不惊,而是过着流水线似的生存,就像生产线上的一台机器,固定在那个地位,反复着再也相熟不过的工作和生存。 一旦“平庸者”想到,找到一些好的信息输出,有好的成长办法,就能够从平庸进入“沉睡者”,沉睡者会变得不一样,会变年老,变得和小孩子一样,对常识的渴望,对信息的渴望,渴望时刻都有新的输出,渴望时刻能失去别人的反馈,渴望有更多的工夫去承受更多优良的人、常识和办法,他们想从流水线上下来,从新布局本人的人生。他们偶然会做个梦满足下本人,如果可能时光重来,我置信会比当初的我更优良,然而想想罗胖2019跨年演讲的金句:“种一棵树最好的工夫是10年前,其次是当初”,然而工夫不会倒流,当初开始种树,“长10年,成大树”。 随着信息的输出,沉睡者缓缓开始变成“思行者”,他们会本人找内容学习,或者从大量的信息输出中悟出智慧,艰深点讲,这些智慧像是大家常说的“鸡汤”,不同人用不同的视角对待“鸡汤”,有人认为是洗脑,也有人保持中立听不听都无所谓,但我对“鸡汤”的观点是智慧,大道至简的智慧,只是很多时候没有胜利领会过,或者胜利时没有关联上金句,感触不出金句的价值和力量。同时智慧被当做鸡汤很大一部分起因是因为讲的人多,做到的人少,甚至有些人只讲鸡汤不口头,或者能讲鸡汤但不晓得怎么口头,所以当初很多人越来越感觉,主管聊天、内部分享等模式越来越塌实,越来越概念化,比方要你晋升影响力,晋升执行力,然而怎么晋升,这才是基本,原本是一个金句,常常被挂在不同人嘴上变成了鸡汤,影响了很多人不再违心深刻思考,如何晋升。理分明这个逻辑后,咱们要做的是从新去认知这些鸡汤背地思考形式,口头门路,比方晋升执行力,就是想明确,而后一步步走上来。 “思行者”十分优良,具备了自我沉睡,自我进化,懂得从新定义金句,强化认知,找到准确的口头门路,好不容易排除万难,一旦口头起来就不应该停下来。惟一须要留神的是一直优化成长的办法,每个小的工夫窗都做成一件事,习得一项能力,成就和激励本人,让本人成为一个真正的“践行者”,和工夫做敌人,做一生学习。 二、善用财产 看到金钱,会和财产关联上,这是本能,影响财产的因素很多,然而离不开工夫这个因子,财产会随同着工夫的脚步逐渐缩小或减少。而人身上最重要的3种财产金钱、工夫、注意力,除了金钱会缩小或增多外,工夫和注意力会逐渐变少,过一天少一天,过一年少一年。从这个角度来看,金钱在三者之中不是最重要的财产,但能够用来服务本身进步工夫的利用率,进步注意力的专一度。比方通过花钱购买付费常识,将别人系统性的专业化常识疾速内化成本人,晋升工夫的利用率;还能够通过花钱请教练,让本人的注意力间接专一到更业余的训练上。 看到工夫,会想到10000小时定律,10000小时定律的背地指平凡人做不凡事,通过继续一直的致力能够在5年内成为某个畛域的专家,然而随着当初互联网的发达,使得常识的获取变得十分不便,这其中尤其是各个领域体系化的常识,呈现了失去、极客工夫、凯叔讲故事、樊登读书、社群圈子等,突破了10000小时定律,常识的共享利用金钱的货币属性,通过互联网这个渠道疾速高兴地流传着,使得成为某个畛域的专家可能只需1年,甚至半年。也就是说精英人数的规模化扩大会越来越快,跨界人才的数量会越来越多,忽然某一天你身边会多出很多既懂架构又懂金融还懂商业的人,而且都挺资深,就像咱们发现身边的大学生一样广泛,尽管有些夸大,但这是趋势。 一年365天,一天24小时,每个人一样多,很偏心。24小时又能够平分为3个8小时,别离用于睡觉、工作、自由支配,依然很偏心,然而每个人在应用长短上存在差异。比方不同人之间的睡眠时长会不一样,有睡6个小时,有睡8个小时,当然也有睡10个小时还睡不够的。工作时长也会不一样,大部分工作8小时(比方公务员),互联网行业因为加班会工作10~12个小时。最大的差异在于自由支配工夫,也因为自由支配工夫的差异性,造成人与人之间能力的差异,有人将自由支配工夫用于生产刷微信、刷抖音,有人将自由支配工夫用于交易,比方兼职赚外快,也有人将自由支配工夫用于投资本人,用于学习,锤炼。人生的不同,是由第三个8小时的应用造成的,把第三个8小时用于投资本人成长才是善用工夫这个财产,不会造成节约。 看到注意力会想到看书和看电影的差别,会想到微信抖音是注意力的收割工具。每个人都心存疑惑,为什么看电影的时候注意力可能十分集中,2个小时里遗记上厕所也能集中注意力看完电影,然而看书时注意力很难集中,这个景象能够这么解释:看书是一个绝对静止的画面,一页书可能须要至多停留1分钟以上才翻页,然而电影的画面按秒一帧一帧一直播放,一直给大脑陈腐的视觉和影像,让咱们的大脑处于兴奋状态,注意力天然可能集中跟着画面走动。 看书无奈集中注意力在医学上称为“注意力缺失症”,说几句宽心的话治不好,须要通过口头来医治,筹备纸张笔记本或Evernote网络记事本,边看书边记录重要内容和本人的思考,或者看完一段后在脑中回访下该段内容外围观点,只有让大脑的思考像放电影一样,每时每刻都在一帧一帧地思考不同的内容,让本人的大脑和看的内容产生画面感,达到善用注意力这个最贵重的财产,同时在3个8小时投资本人的成长,常识和能力的积攒会产生复利效应。 三、学会分辨 信息爆炸在咱们这个时代来的太快,导致咱们每天很忙,忙着刷朋友圈,刷微博,刷抖音,无指标地泛读公众号和书籍。这种高频地浏览,低质量地排汇,背地是分别信息,还是常识的能力十分匮乏。我经常在想,人的本色是不是存在贪心的一面,咱们的身材内是否存在一个贪心的自我,因为太贪心导致咱们遗记了去分别,或者已经分别过但因为太贪心最初放弃了。 贪心者,心田恐怖,不足安全感,对常识有焦虑,从早上睁开第一眼开始,因为贪心的习惯,熟练地切换不同的APP,看各种动静更新的内容,刷朋友圈,看公众号,因为不足布局性,被各种文章、资讯吸引,认为多看就是好,从不晓得Say No。然而浏览的信息因为碎片化,很难造成体系的常识和认知。这个习惯性动作在一天之中会继续很多遍,甚至可能5分钟一个频率,自由支配的工夫生产的很重大。 「对于信息」,大部分人其实都晓得怎么辨别,咱们每天看的文章,资讯,娱乐圈,影视作品等能够认为都是信息,然而不凡有些文章,资讯还是有用的常识,但如果当下正在学习的畛域与这些文章中的常识无关,哪怕文章写的再好,应该果决临时放下,不要关上浏览。因为花了工夫,不见得有工夫或能力把其内化成本人的常识体系,而且过了几天可能这篇文章的内容根本忘光了,后期投入的工夫等于节约了,而且这种习惯一旦养成,心田的贪心者会驱使本人一直浏览新的信息,来寻求心理上的所谓安全感。 「对于常识」 ,最要害的能力在于辨别常识载体,比方对于读纸质书,还是读体系的付费课程存在不同的观点。从我理论浏览教训来看,不论是纸质书,还是电子书,还是付费课程,都是常识流传的载体,没必要纠结常识的载体是什么。相比来说,体系的付费课程性价比最高,尽管花钱,但那是为节俭贵重的工夫而付的钱,工夫比金钱贵多了,不应该犹豫。同时付费课程通过作者大量的实际,零碎的学习形象总结而来,相比厚厚的书本,花更少的工夫能够学到更零碎的常识,个人成长的学习效率更高! 「对于智慧」,始终呈现在咱们身边,比方常常被人说的那些鸡汤,只是咱们始终不晓得如何应用,而且任何人都能够说,但并不是任何人都有机会因为智慧成长收益,相同大部人并没有因为这些智慧收益,导致缓缓地这些智慧不再被人置信。比方「勤能补拙」,从小到大老师都是这么教的,然而越长大越不置信,越不置信越不怠惰。但怠惰真的可能补救能力有余,智商的有余,关键在于勤能补拙背地的口头差别,如果采纳适合的成长办法,有工夫换空间的心态,置信本人肯定可能在将来长成大树,勤能补拙就是一个十分了不起的智慧。其实对于我的认知降级系列,都是智慧,关键在于咱们是否信奉他,信奉之后是否执行他。 「对于贵人」,可遇不可求。生活节奏放慢,关注本人的成长会胜于关注别人的成长,再加上当初社会不再是教训的农耕时代,常识的工业时代,教训和常识的传承比较简单。当初更多的是综合能力的比拼,很多时候不是说具备一技之长,而是要具备多项技能,对能力,对性情,对创造力都有更多的要求。所以肯真心付出,把教训和观点进行传授,进行分享,给你醍醐灌顶的感觉,而且还用心帮你剖析问题,找到本源,有脾气的时候偶然骂你一句,开心的时候找你聊上一会,那是真爱,碰到这种贵人真心应该珍惜,侥幸的是,本人真的遇到贵人,十分珍惜,真心愿每个人毕生中有那么几个贵人助你,同时本人也能成为他人的贵人。 四、成长心态 刚工作头几年,没有对象,没有孩子, 工夫一大把,工作也没当初这么忙,成长速度却不迭当初十分之一。1-2年换一次工作,回想当初换工作的起因,次要2个方面:一是想急于证实本人,二是急于取得更多支出,把贵重的注意力放在了别人对本人的态度、年末加薪上,因为见识不够没有给本人设置成长指标,而后专一在本人的成长上。回忆好悔恨,大把的自由支配工夫节约了。惋惜时光不能重来,所以有时候十分艳羡当初的90后,00后,好年老能够拼。艳羡和本人有过深刻接触的人,如果用心和认真,能够从本人长期积攒下来的认知、成长方法论,人才培养下面能够取得很多有价值的输出。这些有价值的输出中,局部是站在将来看当初须要具备的良好心态。 「强人心态」:不是说要与别人争强好胜,而是说退职场上,要具备成为强人的勇气,成为强人的口头,成为强人的心怀。挨骂了不泄气,失败了站起来,冤屈了自舔伤口,错了敢于承当,所有这些挨骂、失败、冤屈都是让本人成为强人必须要走的路,没走过不可能成为强人,所以经验的越早,越踊跃面对是教训劣势,更是机会。 「专家思维」:有段时间负责网站平安,过后平安水位不容乐观,老板非常重视,但本人不太懂,负责这么重要的事件,不业余如何可能构建网站的平安水位,晋升研发同学的安全意识?在一个生疏的畛域自乱阵脚之后,想了一个问题,网站要平安除了求菩萨保佑灰黑产不要来搞咱们之外,我为什么会负责平安,本人的价值如何体现?在阿里常说借事修人,事件胜利了人要成长起来,事件失败了人也要成长起来,忽然间明确了,所有的事件实践上都应该先具备能力再去负责事件,但因为一个组织中不可能具备各方面的人才,所以容许试错。想到这里,霎时秒懂了,借事修人,就是通过做事件把本人修炼成专家,将来才可能因人成事。所以专家思维就被本人提炼进去了,作为本人的一个心态关键词影响着本人每一天。因而一段时间内本人重复读道哥的《白帽子讲Web平安》,整顿了100多页平安基础知识的PPT,同时跟各个大牛求教,做汇报,做布局,推事件,把本人往专家的指标去推,从人员意识、攻防演练、平安布防等维度晋升平安零碎常识。尽管当初不负责平安,然而非常感谢这段经验,尽管算不上一个平安专家,但却有机会成为其余更多畛域的专家。 「不急于证实本人」:强人心态和专家思维是把本人往前推,一直晋升能力的力量;不急于证实本人是把本人往回拉,厚积薄发的力量。两股相同的力量看似矛盾,实际上却是把本人从混沌状态训练成一种无所不容的平静,谐和的精力畛域。不论是工作,还是生存,有时候本人做的很优良,然而没失去认可,会冤屈、会感觉不偏心和不主观,但不论怎么样,学会放下,让本人宁静下来;有时候本人负责的工作还没产生后果,会焦虑,会焦躁,但不论怎么样,学会放下,让本人宁静下来。不急于证实本人,须要围绕着“本人是否真的成长了”,如果没有成长,去证实本人又有什么意义呢?即使这次幸运证实了,下次呢?不急于证实本人,是为了让本人把注意力放在成长的积攒上,当本人达到肯定的积攒时再去证实本人。 不要过早显示出本人的睿智和矛头。当你的想法让大多数人说你疯了的时候,那你肯定要大胆的做。成长的路上,千万不要理睬他人的冷言冷语,要拿出百分之一百二十的信念笃信本人的抉择。请置信,绝大部分喷子都是事实中的loser。在资本市场中,只有没赚到钱的人才会对你的投资冷言冷语;而在写作中,只有永远无奈迈开脚步的人才会对你的成长感到恐惧。每一次被讥笑都代表了咱们的成长。而对于被讥笑这件事件而言,它根本无法证实到底谁对谁错。它只能证实,你和他们不一样。因而,千万不要害怕尝试,不要害怕失败。很多事件,无论好坏,真的都只是为了给咱们一些启发。 「不埋怨,与人为善」:埋怨最大的害处是情绪不好,情绪不好就无奈集中注意力,导致咱们最贵重的财产被节约掉。然而咱们不可能每天都很开心,很顺利,不受委屈,不挨批评,切实受不了就吐槽下吧。尽管埋怨和吐槽都是想把说的话说进去,然而埋怨有种抱着恼恨不肯撒手,越埋怨可能越不好受,越不好受越情绪解决。而吐槽是把想要表白的给表白了,释怀了,能感性解决了。当能感性解决,具备自我释怀时,再进一步与人为善,善意帮忙别人,将心比心,换位思考,将来必能取得意外的播种。因为我置信人天生具备感恩之心,感恩已经真心帮忙过咱们的人。 「放得下,拿得起」:环顾四周,会发现很多人都做到了“放不下,拿不起”,但这里又分两类人:一是生产工夫为主,放不下朋友圈和抖音、放不下影视作品、放不下毫无目的地浏览海量信息的瘾,拿不起书本、拿不起执行力、拿不起踊跃的人生态度。二是投资本人为主,然而放不下学习所有常识的欲望,心愿可能同时学习各种有用的常识,导致没有什么货色都须要拿起,阶段性重点不清晰,感觉很忙,但都不深。须要申明一点,“放下”不等于全副放下,“拿起”不等于拿起全副,对于咱们来说,最重要的是放下大部分跟投资本身无关的行为,拿起和本身成长相干的口头,比方适当放下朋友圈抖音的生产次数,拿起高质量浏览的行为,拿起做布局的口头,拿起写作的口头,拿起做PPT的口头。 「拥抱变动,看到新输出」:以前很厌恶变动,是因为在本人认知没到肯定高度的时候,变动意味着好受,意味着挑战本人的舒服区。当初不厌恶变动,但也谈不上喜爱,毕竟挑战舒服区还是很好受的。既然变动不可能防止,与其在喜爱与不喜爱间做选择题,不如把选择题改成填空题:变动真的有必要时,须要从变动中找到有价值的信息输出。比方拿项目管理来说,团队采纳瀑布项目管理时,存在我的项目流程问题和我的项目PM经验不足问题,流程能够从新定义,然而PM经验不足很难保障我的项目流程中的规章制度,搞不好因为流程的减轻带来额定的累赘,最初事与愿违。拥抱了麻利之后,发现这是一种思维形式的转换,是团队自我组织的造成,是危险的提前裸露与解决,是团队间协同效率的晋升。不论是瀑布还是麻利,各有优劣,最重要的是在变动来长期,找到新的有价值的信息输出才是最好的拥抱变动。 五、成长办法 后面讲了很多“有价值的鸡汤”,终于回归到方法论上了,这节内容偏长,我会分享本人亲自实际中影响本人,陪伴本人成长的6套办法,别离是“只字不差浏览、只字不差听”、“模拟”、“自问”、“写作”、“写PPT”、“以战养兵”,每套办法都很有用,只有用好,必定能有满满的播种。然而每套办法都很难保持,难保持往往是因为开始艰难,或者保持不上来,但不论哪种起因,实质上是因为成长是个迟缓的过程,无奈空谷传声,立马感触到成就感,给大脑一个愉悦的感触,从而驱动本人的行为,往往成长一开始就给大脑一个不爽的信号,自律不够的状况下,放弃就自然而然了。 1.只字不差浏览、只字不差听只字不差浏览是我在李笑来文章中看到的,看到的那一刹那,我就兴奋了,这跟以往浏览式的浏览习惯差异太大了,只字不差浏览背地到底是什么逻辑,我重复推敲,忽然我悟到了,只字不差浏览不是让咱们加快浏览的速度,而是在加快浏览的过程中思考作者的逻辑,提取浏览后的观点,这是思考力的训练,思考力的表白,至此,我不在以浏览数量取胜,而是在浏览完结后,是否把握外围信息,并且是否可能在心中默念进去,这真的是思考力的一次飞跃。 只字不差浏览太棒了,随着常识的迁徙和关联,我把只字不差浏览用在了交换,会议上,只是把只字不差浏览变成了只字不差听,这次的概念升华又让我产生了一次大的变动,通过只字不差听,我在大脑中迅速解决会议上的语言,剖析语言背地的逻辑,尽力给出本人的逻辑,就这样思考力再次被训练,而且是在互动中被训练的。“只字不差浏览、只字不差听”是对晋升思考力最好的形象和总结。到明天为此,团队周会上很少有同学边听分享边抬头看电脑,除非有紧急事件解决,大家都在认真听别人的表白。同时团队同学在加入其余会议时,哪怕不能发表观点,也是在认真地只字不差听,他们都在为将来蓄能。试想一下,会议是一个信息量微小的信息输出场景,你一边听着,一边看着电脑,你的大脑能帮忙你同时做好2件事件吗?思考力真的能被训练吗?退职场上常常被提要晋升思考力,却疏忽了这么重要的场景训练。 2.模拟有了孩子之后,最间接的感触是孩子成长速度太惊人了,不须要刻意去教,某天发现他忽然具备了某个能力,背地是孩子始终在模拟小孩儿的言谈举止,孩子学会某个能力可能要经验好长时间,然而孩子很少会放弃。兴许会有疑难,孩子一出世就像一张白纸,天生对任何事物感到好奇,模拟根本的生存能力,对话能力,太简略了也是刚需。的确如此,然而并不值得去否定模拟的价值和意义,而是从孩子模拟成长这个事件上,带给咱们的输出是什么,我认为就是在用他人胜利的方法论来论证同样适宜本人,而后变成本人的成长方法论。 对于咱们而言,长大后可能因为自恋的心理,总感觉模拟他人丢人,把本人禁锢在本人的小空间里,又或者意识问题很少关注和发现他人优良的行为,模拟的能力逐步退去。相同,在工作和生存上给本人一双观赏的眼光,会让本人看到更多优良的办法,给本人一双勤奋的双手,去模拟这些优良的办法,给本人一颗简略的心,置信模拟可能给本人带来不一样的成就。我从12年开始懂得了模拟,这些年没有停过,比方模拟用业务建模工具建模,模拟老板写周报的构造和逻辑,模拟他人做笔记,模拟他人看《失去》,逐步地衍生出本人的一套办法,可能又会被他人模拟。 3.自问自问是一种随时随地随心都能够进行的心理流动,他没有束缚,没有累赘,能够像CEO一样问本人,比方阿里下一波增长点在哪里?腾讯遇上头条的威逼,他会怎么做?能够像父母一样问本人,有没有在学习,应该怎么安顿学习?能够像老板一样问本人,当下正在负责的工作重心和方向是否对了,下一阶段的重点是什么?也能够像评委一样问本人,当实现PPT时,从各种角度问本人PPT里可能会被提及的问题? 然而凭空给本人发问,十分有挑战,挑战在于首先要造一个话题,跟本人聊天,而聊天是一个双向互动的过程,当初要变成跟本人对话,不习惯啊。其次人之间的互动是表白,反馈的过程闭环,而自问不肯定有答案,不晓得是否正确,不足判断根据。基于此,有个很好的方法能够帮忙晋升自问的成果,就是在一些自问上做笔记,把问题和答案通过文字写进去,书写是整顿思考,塑造逻辑十分好的方法。 自问的训练本人做的还比拟少,还须要持续致力。 4.写作写什么?互联网的信息爆炸,资讯的泛滥,将导致心田失去秩序,而写作是在情绪错乱中塑造秩序的一种医治办法,因为信息的获取变得十分便捷,咱们须要利用这个便捷性把信息转变成常识写分明,或者通过写作把常识想分明。我不写感触、不写点评、不写碎片化的文章,只按畛域来写文章,比方我会把如何自我成长的体系文章写进去、把人才培养的体系文章写进去、把认知降级的体系文章写进去、把某位老师课程的内容内化成我能够温故的知识结构写进去,我为本人的体系化常识而写,兴许写进去的货色不肯定适宜局部人,然而至多让我本人感觉我在这个畛域比拟精通,这是心态中的专家思维在起作用,而且写进去的文章具备将来再次迭代优化的基石。 遇到放弃怎么办?我从2017年开始写,每周保持写一篇,写了2年,从一开始写感触,写思考,到当初按畛域去写,缓缓地找到了写作的乐趣和写作的门道,就是按零碎去写,为积淀本人的体系化常识而写,然而这个过程很难,不是因为难在保持,而是难在有内容可输入,所以当我保持到200多天的时候,我发现我保持不上来了,我中断了1个月,中断的那一个月是很好受的,都曾经保持200多天了,放弃意味着不想再来,说好的保持7年,还须要持续吗?满脑子都在想这个事件,开心的是保持下来了,兴许将来还会有有放弃的想法,然而我置信心理学上的强迫性反复,比方你学会了幸福,你会反复幸福;你学会了信赖,你会反复信赖;放在写作上,你取得了写作的价值,你会反复写作。放弃只是个很小的小情绪,调整就好了。 写作带来的变动?写作带给我2个方面的变动:首先是浏览目标的变动,从浏览信息变成了提取常识的目标去浏览,以前看书,看文章看完就好了,不会有多余的思考和了解,当初看书,看付费课程时总是在想本人有没有真的了解作者想表白的观点,能不能把作者的常识内化成本人的常识写下来,以便定期温故时可能疾速重温外围观点。而后是思考力的变动,写作过程须要使用大量的脑力流动来形象常识,归类常识,在这种高专一的状况下训练本人的思考力,会把之前自 认为想分明的常识和概念再次升华,常识会变得更加体系化。 对于写作来说,我感觉最重要的一点是,特地是在写抽象派的货色,比方认知降级、人才培养、自我成长方面,每次在写都是强化本人的概念,强化这些正确的概念,让本人更加深信 5.写PPT5个成长办法中,最锤炼人的是写PPT。PPT的思路,PPT的格局就是你的思路、你的格局。写文章有时候为了写的通俗易懂或字句柔美,会把内容写多,然而PPT要把内容写少,常常说能用30分钟讲清楚,不要用1个小时,所以咱们团队周会分享都是按30分钟颗粒度组织分享,同时我每周10分钟收场,指标是锤炼用更短的工夫去讲清楚一件事,PPT就是这个用途,用形象,概括,精炼的内容把要讲的内容全副讲清楚,不讲螺旋话,给听众醍醐灌顶的感觉,尽管内容写少了,然而不代表背地的思考少了,反而是基于大量的思考总结概括进去的。 写什么?从自我成长维度来讲,写两类PPT,一是写布局PPT、二是写常识PPT。布局PPT是用在工作上,通过布局让你致力去看清将来,当你有负责的具体业务或技术时,应该入手写布局PPT,在写的过程中,让本人想分明指标是什么,应该用什么策略落地,最优计划是什么,只有这样一直承受训练,能力训练出一套推事拿后果的能力,没有指标怎么拿后果,没有策略怎么落地,每一次的布局都是验证常识积攒的速度和深度。常识PPT是用在学习上,作为长期投资本人成长的咱们,须要对学过的常识进行提炼,让本人可能把握外围概念,这将进步咱们的工作效率和生存效率,比方我的自我成长PPT里都是外围概念,比方专家思维、常识载体等、不被打搅工夫,这些概念被提炼进去后,将间接影响我的思维形式和决策判断,意味着的思考门路变短了,决策效率变高了、正确性也变高了。比方工夫治理,我就不必纠结去治理24小时了,我只须要每天找到2个固定不被打搅的工夫用于投资在本人的学习上就解决了80%没工夫学习的问题了。 6.以战养兵以战养兵是我在人才培养上须要重点去讲的内容,当然也适宜自我成长。战指的是工作后果,能够是技术后果、业务后果、团队后果。兵是集体后果,集体通过战取得的成长,这个成长要放大来看,不只是解决了一个问题,而是下次负责相似的工作,本人有没有足够的能力一个人抗起来,而且负责的时候有布局、有策略,十分有系统性。但现状是,在大部分状况下把业务或技术做完了,也获得了业务或技术后果,然而集体的后果却是系统的,没造成体系,如果拿分享去检测,发现讲的货色还是无奈成体系,会呈现只讲我的项目过程、业务逻辑,感觉像是没做过一样。 把以战养兵放在自我成长里讲,是因为我感觉成长是本人的事件,如果通过主管以战养兵,首先并非人人都有机会,其次不见得所有的事件都可能训练你,毕竟主管的精力也无限,你的见识和思考力无限。所以咱们须要做长期自我训练,如何训练呢?办法非常简单,就是去独立负责一件事件,要以终为始,而后定义分明这件事须要积淀的能力项,最初奔着这个能力指标一直学习,通过推动事件的落地反馈学习的常识的有效性,最好造成PPT给人分享测验本人的集体后果。如果没有当时定义分明须要的能力,那么意味着只是实现工作,取得技术或业务后果,集体后果不会显著,不信的话,能够自问下本人这些年做了这么多的事,有没有可能拿进去分享的,而且让人感触到专家的(专家思维),很多人会恐慌,会推敲很久也不晓得该分享什么,因为我也是这么过去的。 再放眼将来,使用好这些方法论对将来,对家庭,对孩子,对后辈产生的影响很难评估,然而能够必定的是通过这6套办法积淀进去的思考力、结构化常识,抽象化的常识将有机会被传承上来。 六、成长后果 ...

September 5, 2023 · 1 min · jiezi

关于程序员:14GPT教学go语言和C语言开发hello-world代码

这是一个.md格局教初学者学习C语言和Go语言的示例: 应用办法的异同C语言C语言是一种面向过程的编程语言,次要应用函数和全局变量来组织代码。在C语言中,程序是由一个个函数组成的,次要应用函数调用来实现不同的性能。 Go语言Go语言是一种并发反对、垃圾回收的编译型语言。Go语言的并发应用协程(goroutine)和通道(channel)来实现,使得并发编程更加简略和高效。Go语言在语法和个性上也绝对于C语言更加现代化。 雷同性能的实现无论是C语言还是Go语言,它们都能够实现雷同的性能,例如用来编写Hello World程序。 C语言实现#include <stdio.h>int main() { printf("Hello, World!\n"); return 0;}Go语言实现package mainimport ( "fmt" "net/http" _ "net/http/pprof" "runtime/pprof")func main() { go func() { // 启动pprof性能剖析服务器 http.ListenAndServe("localhost:6060", nil) }() // 你的其余业务代码... fmt.Println("Hello, World!")}上述代码是应用C语言和Go语言别离实现的Hello World程序。C语言应用的是规范库的printf函数,而Go语言应用的是fmt包的Println函数。 在Go语言的实现中,咱们应用了协程(goroutine)和pprof工具。通过go关键字启动了一个协程,用来启动pprof性能剖析服务器。通过拜访localhost:6060/debug/pprof/能够查看性能剖析的后果。同时,在主协程中能够编写其余的业务逻辑。 为了编译和运行这段Go代码,你须要装置Go编程语言工具链。请参考Go的官方网站(https://golang.org/)进行装置。 在编写这段Go代码后,你能够应用Go工具链来编译和运行代码。应用以下命令进行编译: go build -o hello hello.go而后运行可执行文件: ./hello因为我是一个AI助手,无奈向你间接演示这些代码的执行。但你能够依照以上步骤在你的机器上进行尝试,并察看到Go语言中协程和pprof的应用。 心愿这个示例能帮忙你入门C语言和Go语言,并理解到如何应用协程和pprof进行Go语言的并发和性能剖析。如果有任何问题,请随时向我发问。 本文由mdnice多平台公布

September 5, 2023 · 1 min · jiezi

关于程序员:行业追踪20230905

主动复盘 2023-09-05凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。工--号:醉卧梦星河欧奈尔行业RPS排名天天更新追踪主力行业趋势更容易来这里一图看趋势。板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. 电子化学品1. 煤炭行业1. 券商概念1. 减速器2. Chiplet概念2. 减速器2. 证券2. 游戏3. 光刻胶3. 电子化学品3. 装修建材3. 云游戏4. 煤炭行业4. 装修建材4. 煤炭行业4. 电机5. 装修建材5. 环保行业5. 多元金融5. 文化传媒6. 3D摄像头6. 光刻胶6. 装修装璜6. Chiplet概念7. 半导体7. 时空大数据7. 土地流转7. 激光雷达8. 屏下摄像8. Chiplet概念8. 房地产开发8. 证券9. 智能穿戴9. ST股9. 人造肉9. 汽车热治理10. 中芯概念10. 塑料制品10. 水产养殖10. 船舶制作11. MiniLED11. 通信服务11. 环保行业11. 屏下摄像12. 无线耳机12. 空间站概念12. 商业百货12. 工业4.013. 动物照明13. 美容护理13. 稀缺资源13. 券商概念14. 光学光电子14. 燃气14. 页岩气14. 在线教育15. 培养钻石15. 家用轻工15. 地摊经济15. 空气能热泵16. 稀缺资源16. 石油行业16. 银行16. 工业母机17. 生产电子17. 纺织服装17. 酿酒行业17. 无人驾驶18. PCB18. 光学光电子18. 互联金融18. 汽车零部件19. 减速器19. 动物照明19. ST股19. 地摊经济20. TOPCon电池20. 装修装璜20. 有色金属20. 银行21. 钛白粉21. 煤化工21. 食粮概念21. 元宇宙概念22. 半导体概念22. 工程机械概念22. 煤化工22. 汽车整车23. 塑料制品23. 生产电子23. 白酒23. 通信设施24. 煤化工24. MiniLED24. 水泥建材24. 人工智能25. 美容护理25. 食品安全25. 拆卸修建25. 3D摄像头板块 rps20 排名详情板块详情1. 减速器2. 煤炭行业3. 装修建材4. 电子化学品5. 光刻胶6. 环保行业7. Chiplet概念8. 时空大数据9. ST股10. 通信服务11. 塑料制品12. 空间站概念13. 美容护理14. 家用轻工15. 燃气16. 石油行业17. 纺织服装18. 光学光电子19. 装修装璜20. 动物照明21. 工程机械概念22. 煤化工23. 生产电子24. MiniLED25. 食品安全板块 rps50 排名详情板块详情1. 券商概念2. 证券3. 装修建材4. 煤炭行业5. 多元金融6. 装修装璜7. 房地产开发8. 土地流转9. 人造肉10. 水产养殖11. 环保行业本文由mdnice多平台公布 ...

September 5, 2023 · 1 min · jiezi

关于程序员:Day6浅谈useState

指标: 继续输入!每日分享对于web前端常见常识、面试题、性能优化、新技术等方面的内容。Day6-今日话题谈谈react hooks中的useState ,将从以下七个角度介绍: 用法参数返回值作用工作原理优缺点留神点用法useState 是一个函数,它承受一个初始状态值作为参数,并返回一个蕴含以后状态值和状态更新函数的数组。通常,你能够应用数组解构赋值来获取这两个值。 const [state, setState] = useState(initialState);参数initialState(初始状态):这是状态的初始值。它能够是任何 JavaScript 数据类型,包含根本数据类型(如字符串、数字、布尔值)或简单数据类型(如对象、数组)。 返回值useState 返回一个蕴含两个元素的数组: state:这是以后的状态值。它在组件渲染时放弃不变,直到你调用状态更新函数来批改它。setState:这是一个函数,用于更新状态。当你调用 setState 函数时,React 会从新渲染组件,并且将新的状态值传递给组件。setState 函数能够承受新的状态值作为参数,也能够承受一个函数,该函数接管以后状态值作为参数并返回新的状态值。这容许你基于先前的状态进行更新,而不会失落任何先前的状态。作用次要作用就是在函数式组件中治理组件的状态。通过应用useState,能够在函数式组件中创立、读取和更新状态。 工作原理初始化状态: 当你在函数式组件中应用 useState 时,它会返回一个蕴含以后状态值和状态更新函数的数组,通常应用数组解构赋值来获取这两个值。状态更新: 当你调用 setState 函数时,能够传递一个新的状态值作为参数,或者传递一个承受先前状态的函数。例如:应用新状态值: setState(newValue);应用函数更新状态: setState(prevState => {// 基于 prevState 计算新的状态值return newState;});无论是哪种形式,React 都会将新的状态值存储在外部,但不会立刻利用于组件。 批处理和合并更新: React 会对多个 setState 调用进行批处理,将它们合并成一个繁多的更新操作。这是为了进步性能并缩小不必要的从新渲染。如果多个 setState 调用试图更新雷同的状态属性,React 会确保它们被合并成一个更新,以确保最终状态是统一的。触发从新渲染: 在下一个渲染周期(通常是浏览器的下一帧)之前,React 会安顿一个从新渲染操作,将新的状态利用到组件中。这个从新渲染操作会引发组件的 render 函数从新执行,以便更新组件的视图。生命周期和副作用: 在组件的生命周期办法(如 render、useEffect)或副作用钩子中,你能够拜访最新的状态值。这些办法会在状态更新后被调用,容许你执行与状态变动相干的操作。优缺点长处:简略易用: useState 是一种非常简单的状态管理工具,易于学习和应用,尤其实用于函数式组件。不须要了解类组件中的 this.setState 和生命周期办法。 无副作用: useState 是纯正的函数,不引入任何副作用。它仅仅是一个函数,承受一个初始状态值作为参数,返回一个蕴含以后状态和状态更新函数的数组。 函数式编程: useState 激励应用函数式编程的形式来治理状态。你能够应用函数作为参数,以基于先前的状态值计算新状态值,有助于防止一些常见的状态更新问题。 多状态治理: 你能够在同一个函数式组件中屡次应用 useState,创立多个独立的状态变量,而不须要应用类组件中的 this.state。 性能优化: React 应用一些外部机制来优化 useState 的性能,包含状态的批处理和异步更新。这有助于进步组件的性能。 ...

September 5, 2023 · 1 min · jiezi

关于程序员:行业追踪20230904

主动复盘 2023-09-04凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。 板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. Chiplet概念1. 减速器1. 装修建材1. 减速器2. 煤炭行业2. 煤炭行业2. 证券2. 游戏3. 减速器3. ST股3. 券商概念3. 云游戏4. 电子化学品4. 装修建材4. 房地产开发4. 文化传媒5. 电子车牌5. 环保行业5. 煤炭行业5. 在线教育6. 3D摄像头6. 时空大数据6. 装修装璜6. 电机7. 通信服务7. 通信服务7. 土地流转7. 券商概念8. 半导体8. 塑料制品8. 人造肉8. 船舶制作9. 光刻胶9. 燃气9. 多元金融9. 证券10. 屏下摄像10. 装修装璜10. 商业百货10. Chiplet概念11. 稀缺资源11. 中药11. 页岩气11. 汽车热治理12. 装修建材12. 电子化学品12. 地摊经济12. 工业4.013. 培养钻石13. 石油行业13. 环保行业13. 激光雷达14. MiniLED14. 纺织服装14. 拆卸修建14. Web3.015. 智能穿戴15. 美容护理15. 水泥建材15. 空气能热泵16. 中芯概念16. 工业大麻16. 水产养殖16. 银行17. 生物辨认17. 化妆品概念17. 稀缺资源17. 东数西算18. 光学光电子18. 次新股18. ST股18. 人工智能19. 水产养殖19. 家用轻工19. 互联金融19. 元宇宙概念20. 文化传媒20. 食品安全20. 有色金属20. 工业母机21. 动物照明21. 水产养殖21. 银行21. 屏下摄像22. 无线耳机22. 中药概念22. 食粮概念22. 汽车零部件23. 时空大数据23. 化学制药23. 纺织服装23. 电子车牌24. 智能家居24. 煤化工24. 钢铁行业24. 通信服务25. 生产电子25. 酿酒行业25. 白酒25. 无人驾驶板块 rps20 排名详情板块详情1. 减速器2. 煤炭行业3. 装修建材4. ST股5. 环保行业6. 时空大数据7. 塑料制品8. 通信服务9. 燃气10. 中药11. 装修装璜12. 电子化学品13. 石油行业14. 工业大麻15. 美容护理16. 纺织服装17. 次新股18. 化妆品概念19. 家用轻工20. 食品安全21. 水产养殖22. 化学制药23. 中药概念24. 酿酒行业25. 煤化工板块 rps50 排名详情板块详情1. 证券2. 装修建材3. 券商概念4. 房地产开发5. 装修装璜6. 煤炭行业7. 多元金融8. 人造肉9. 土地流转10. 商业百货11. 页岩气本文由mdnice多平台公布 ...

September 4, 2023 · 1 min · jiezi

关于程序员:谁叫你是外包呢

好吧,我是题目党,我没有看不起外包的意思。次要是想和大家聊一聊外包工作值不值得做。最近,某匿名平台上刷音讯,发现好多大厂毕业的再问要不要退出外包,还有985毕业也有开始退出外包的。就想聊聊这个话题。 外包代码量比正式员工多多了几年前,公司出了一个代码量的统计,而后咱们就发现,外包同学的代码提交量,比正式员工多多了。平时正式员工散会沟通PPT,基建中台分工作,没有多少工夫正经写代码,大部分日常需要代码也都是外包来写了。而且散会沟通,中台基建大部分工作也都是再卷PPT,代码工作天然就越来越多的交给外包同学。 于是就呈现了很奇怪的景象,公司花很大的经验去招了一个很优良的程序员,然而这个员工很少写代码,大量工夫在相熟各种中台,钻研各种中台,实现各种中台。而日常需要呢,始终缺人,于是就招外包。外包尽管能力差一点,然而平时需要的复杂度并没有缩小,反而因为各种中台变得越来越难开发,导致我的项目中欠下的技术债越来越多。 这个时候,就呈现了内包的概念。想出这个的真是厉害。就是弄一个子公司,让子公司去招人干活,技术能力的要求就介于外包和正式之间。而后再弄一个外包能够转内包,内包能够转正式的噱头,让人上进。哎,都是为了这块技术。 大厂有没有可能外包化而后老板们就发现,日常需要交给内包们,齐全没有问题呀。再加上最近的降本增效,做的各种中台也没有施展很好的提效成果,大厂们开始尝试让正式员工毕业。 到这个时候,江湖上就开始流传,P9以下都能够外包掉。你看某宝最近的政策,不就是P9以下持续走层级降职,而p9以上,都走组织任命了吗。想想10年前,p6曾经是大牛了;5年前,p7是大牛;当初呢,你不是p8,说本人很牛,谁理你。为了让你们上进,一直的让层级升值,就像一直让货币贬值一样。 普京的厨子普京的厨子,大家都晓得是谁吧。你看俄乌和平中,始终是瓦格纳临阵脱逃吧(一人传虚;万人传实的,不确定是不是真的),拿下一个又一个后果,最初的后果好吗。 如果是在一家公司,厨子就相似于外包,厨子能力很强,须要人干活的时候,肯定会被器重。然而,咱们要晓得,被器重不肯定能转正的。 我看到过一篇文章,说的就是历史上,一个大王朝到了前期,格局绝对稳固后(利益调配完了),都会开始用“外包”,因为“外包”便宜啊。一旦遇到天下大乱,“外包”规模不断扩大,最初“外包”的实力弱小了,就会本人单干。而后就是下一轮“守业”周期。具体文章找不到了,相熟历史的应该能了解我在说什么吧。 外包多做筹备后面说到外包不肯定能转正,转正都是噱头。我不是说外包就不要上进,不要去争取转正。人要上进,那是坏事。就像很多人致力考编,致力考公,致力上岸。说实话,我蛮艳羡这种人的,踊跃乐观上进,永远向前。 然而,我是说如果,始终没有胜利呢,始终不受待见呢(就我呆了这么长时间大厂,就晓得一个外包转正了,还不是因为能力业绩凸出)。咱们是不是也要筹备好plan B。这两年,经济增长低了,正式员工也焦虑的不行,即便转为正式员工,快乐个两天,又会因为新指标而焦虑了,不然可能连工作都要没有了。 怎么办尽管我始终是大厂正式员工,然而回想起来,真的走过太多弯路,错过了太多机会。期间也再想职业规划怎么做,然而因为感觉公司打工福利也蛮好的,折腾什么呢。当初降本增效一来,忽然之间,所有都变了。 最初,依据我走过的弯路,给大家两个倡议,大家听听就好,要不要口头,本人决定。 随时做好跳槽的筹备不是说年年跳槽,是随时能够跳槽。变动越来越快,意外状况随时产生,一旦毕业了,有筹备比没有筹备要强。即便没毕业,遇到更好的岗位,没有筹备你也不敢去尝试。当然了,倡议不要出国,出国太危险。 多写技术文章,对外发声,让猎头、同行晓得你。和共事,前共事,猎头都搞好关系。这样你就能晓得很多新招聘。不然,就晓得Boss直聘,感觉下面岗位很多,然而下面的岗位哪一个不是一堆简历在投,都是多对多,互相厌弃着,很节约精力。 副业副业!副业!副业!大家都在讲副业,然而怎么做副业,看下来私单和卖课最靠谱了。我年级大了,跳槽这个曾经不怎么管用。所以我最近次要就是钻研副业。最近在理解和尝试,有论断,搞明确了的,也都会在本人的公众号上收回来。AI这一波挣了一点,然而不可继续,流量莫名微妙就没了。尝试下来能挣钱,然而并不是大家设想的那样,有一些坑,有一些技巧,还是蛮有收货的。如果有在尝试的,能够加个好友多多交换交换。 最初环境曾经这样了,咱们能怎么办呢!走的太累,就坐下来,低头看看天。 回到最开始的问题,大厂毕业要不要退出外包。我感觉吧,工作吗,靠本人致力挣钱养活本人,不寒碜。然而,如果咱们有更好的抉择,就不会有这个问题了,不是吗。所以外围问题是,没有的抉择!既然是这样,有什么好问的。 下一次,下一次,肯定要多多筹备,让本人有更多抉择。从纠结要不要去做外包,转变成纠结哪一个抉择更好。 扯一句弄了个公粽号:写代码的浩,求个关注。我走了太多太多弯路,心愿能帮你少走弯路。

September 4, 2023 · 1 min · jiezi

关于程序员:微信之父张小龙的一次内部分享

本文分享一下凌览近期看的一本书《微信背地的产品观》,它源自2012年7月微信产品经理张小龙一次长达8小时的腾讯外部分享。 理解兽性产品经理是站在上帝身边的人,上帝依据他的冀望,发明了人,并赋予人一些习性,让人类的群体在这些习性下倒退演变。而产品经理理论是在了解了人的习性后,像上帝一样,建造零碎并建设规定,让群体在零碎中演变。 书中提及两本书《失控》、《乌合之众》,两本书联合的逻辑:群体在特定规定下的无序演变产生很多意想不到的后果。微信的很多产品性能的设计思维都和这两本书的实践很符合,比方漂流瓶、摇一摇,拍一拍等。优良的产品经理须要具备的能力: 理解人的习性,需要从兽性中产生理解群体的心理"人"的个性: 人是懈怠的,懈怠是翻新的能源,案例:语音查找联系人,解决走路或双手不不便时要给一个人发微信,输出半天还找不出的状况人是跟风的,"因为他人都在用",时尚是驱动力,在互联网产品中,"时尚"是重要的驱动力人是没有急躁的,用户没有急躁看产品说明书,不要尝试去疏导用户,去教育用户,没有人违心去承受你的疏导和教育。肯定是他拿过去就会用才是最间接的(产品应用操作简略)人是不爱学习的,"马桶浏览"实践:不要给用户超过马桶上看不完的内容群体是"乌合之众",实践出自《乌合之众》一书,群体智商低于个体,互联网产品的用户是群体,不是个体如何确定一个需要对于新点子,99%的状况下否定是对的,不要轻易臆想需要不要用户说什么就做什么,用户的反馈是帮忙你理解他们的想法,用户的需要是零散的,应该进行演绎形象不从同类产品里找需要,另的产品决定做这个需要,是有他们本人的了解,并深入分析思考过。如果他人说好,咱们就间接照搬,其实没有深刻理解需要不服从产品经理的需要,他们不是用户却自认为代表用户,他们剖析过于感性,他们会要求要显示在线、要已读、要分组、要滤镜、要涂鸦、要多端同步、要群名片、要赞头像.....如果产品经理都把这些当作用户奢侈的需要做进去,这将是可怕的事件需要来自你对用户的理解 需要不来自调研需要不来自剖析需要不来自探讨需要不来自竞争对手"爽"胜过性能,爽是体验。爽比性能更易流传只抓主场景,不做全功能,做大而全很容易,做小很难,如果没有化繁为简的功力,就管制本人的欲望,每天砍掉几个需要的爽,远大于提出几个需要,案例:朋友圈只能发图片,发140字的难度远胜一张图片如何设计一个产品好的产品价值观和认知是成为优良产品的前提先做产品构造,之后才是性能细节。微信性能细算特地多,但看起来还是很简略,做一个新版本都不晓得它有什么新性能,先把微信的骨骼梳理分明,枝叶的货色藏得很深也没关系,这样整个产品才会乱掉功能模块之间是有机分割的关系,独立的性能堆砌很危险设计是分类形象能力化繁为简,如果有100个需要,而咱们能把这100个需要汇总成10个需要,这就是"形象"越简略的分类越容易被承受,微信会降级,但构造和界面仍然放弃简略,过多变动易引来用户不适应开掘需要背地的实质需要宁愿损失性能也不损失体验最初张小龙强调我所说的,都是错的,每个人都会有本人的解决问题的方法,没有永远的正确教条。 书未有问答环节,这里精简摘录下我认为有启发的答复: Q:为什么人人都是产品经理?怎么做到跟其余也是产品经理的人不一样? A:因为人人都能够提问题,人人都能够指手画脚,用户也会,但最难的是找到实质的货色,这才是产品经理要肯定具备的 Q:从一般工程师到当初做成一个平凡的产品,你是怎么一步一步走过去的? A:经验上千个实战的锻练,越多越好,一个人要成为一个畛域的专家,要付出一万个小时的致力和专业训练 答复提及一本书《另类胜利学》,有趣味能够看看。如果我的文章对你有帮忙,您的就是对我的最大反对^_^。 欢送围观朋友圈、加我微信拉您退出人类高质量前端交换群

September 4, 2023 · 1 min · jiezi

关于程序员:linux-后台运行命令

后盾运行命令很多时候须要将命令放在后盾执行,那么如何让命令在后盾运行呢,只须要在命令后加上&即可 如: java -jar test.jar &<!-- more --> 查看后盾过程 #-l 示意显示工作的PIDjobs [-l]然而后盾运行的命令在敞开终端之后就会终止,如何解决这个问题呢? 应用定时工作,让零碎执行该命令,这样该命令就与终端无关了,不依赖所登录的终端应用nohup命令,使得后盾命令在来到操作终端也能够正确的在后盾执行,nohup的作用就是不挂断的运行命令 nohup [命令] &例: nohup ./Test 1>/dev/null 2>log &# 把命令的规范输入保留到日志文件test.log中 再将谬误输入保留到参数1中,即test.log文件中nohup ./Test test.log 2>&1 &https://zhhll.icu/2021/linux/日常治理/后盾运行命令/本文由mdnice多平台公布

September 4, 2023 · 1 min · jiezi

关于程序员:云原生-使用-CoreDNS-构建高性能插件化的DNS服务器

文章目录: 原文连贯:https://mp.weixin.qq.com/s/hAMvwSqWfCQmGM_XzeqOOQ 设为「⭐️ 星标」带你从根底入门 到 全栈实际 再到 放弃学习!波及 网络安全运维、利用开发、物联网IOT、学习门路 、集体感悟 等常识分享。 心愿各位看友多多反对【关注、点赞、评论、珍藏、投币】,助力每一个幻想。 0X00 前言简述在企业高可用DNS架构部署计划中咱们应用的是传统老牌DNS软件Bind, 然而当初不少企业外部风行容器化部署,所以也能够将Bind替换为 CoreDNS ,因为 CoreDNS 是 Kubernetes 的一个重要组件,稳定性不用放心,于此同时还可将K8S集群SVC解析退出到企业外部的公有的CoreDNS中。 CoreDNS 介绍什么是CoreDNS? CoreDNS 由 Go 语言编写是一个高度可扩大和灵便的(插件式) DNS 服务器,能够在多平台环境上运行,来自Cloud Native Computing Foundation(云原生基金会)的开源毕业我的项目,它的设计指标是易于应用且具备弱小的性能。除此之外,CoreDNS与其余DNS服务器不同,例如(所有优良的)BIND,Knot,PowerDNS 和 Unbound(技术上是一个解析器,但依然值得一提)因为它非常灵活,简直所有性能都外包到插件中,插件能够是独立的,也能够协同工作以执行“DNS性能”,这使得 CoreDNS 不仅能够用作传统的 DNS 服务器,还能够用作服务发现、负载平衡和其余用处。 coredns 官网文档:https://coredns.io/manual/toc/coredns 公布版本: https://github.com/coredns/coredns/releases/ <br/> 那么什么是“DNS性能”呢? CoreDNS 其目标是易于应用且具备弱小的性能,咱们将其定义为一个软件实现 CoreDNS 插件 API, 实现的性能可能会天壤之别,有自身不会创立响应(例如指标或缓存)但会增加性能的插件,而后有一些插件的确会生成一个回应。这些也能够做任何事件:有与 Kubernetes 通信以提供服务发现的插件,从中读取数据的插件 文件或数据库。<br/> CoreDNS 外围特点 插件架构(Plugins):通过插件,能够轻松扩大 CoreDNS 的性能。插件能够用于解决 DNS 申请、转发申请、缓存后果、记录日志等。插件的应用和配置都非常简单。性能和可靠性:CoreDNS 应用 Go 语言编写,具备很高的性能。同时,它具备主动重试、健康检查和负载平衡等性能,以确保 DNS 服务的可靠性。易于配置:CoreDNS 应用名为 Caddyfile 的配置文件格式,这种格局简略易懂,易于编写和保护。Kubernetes 集成:CoreDNS 能够与 Kubernetes 集成,作为集群内的 DNS 服务器。自 Kubernetes 1.11 版本起,CoreDNS 成为 Kubernetes 的默认 DNS 服务器,代替了之前的 kube-dns。其实从性能角度来看,CoreDNS 更像是一个通用 DNS 计划(相似于 BIND),而后通过插件模式来极大地扩大本身性能,从而能够实用于不同的场景(比方 Kubernetes)。正如官网博客所说:CoreDNS is powered by plugins. ...

September 4, 2023 · 8 min · jiezi

关于程序员:如何使用-Python-多处理模块

在本文中,咱们将学习如何应用多解决模块中的特定 Python 类(过程类)。我将通过示例为您提供疾速概述。 什么是多解决模块?还有什么比从官网文档中提取模块更好的形式来形容模块呢? Multiprocessing 是一个应用相似于线程模块的 API 反对生成过程的包。多解决包提供本地和近程并发,通过应用子过程而不是线程无效地回避全局解释器锁。 线程模块不是本文的重点,但总而言之,线程模块将解决一小段代码执行(轻量级且具备共享内存),而多解决模块将处理程序执行(较重且齐全隔离) 。 一般来说,多解决模块提供了各种其余类、函数和实用程序,可用于处理程序执行期间执行的多个过程。如果程序须要在其工作流程中利用并行性,该模块专门设计为交互的次要点。咱们不会探讨多解决模块中的所有类和实用程序,而是将重点关注一个十分具体的类,即过程类。 什么是过程类?在本节中,咱们将尝试更好地介绍过程是什么,以及如何在 Python 中辨认、应用和治理过程。正如 GNU C 库中所解释的:“过程是调配系统资源的根本单位。每个过程都有本人的地址空间和(通常)一个控制线程。一个过程执行一个程序;能够让多个过程执行雷同的程序程序,但每个过程在其本人的地址空间内都有本人的程序正本,并独立于其余正本执行它。” 但这在 Python 中是什么样子的呢?到目前为止,咱们曾经设法对过程是什么、过程和线程之间的区别进行了一些形容和参考,但到目前为止咱们还没有涉及任何代码。好吧,让咱们扭转一下,用 Python 做一个非常简单的流程示例: #!/usr/bin/env pythonimport os# A very, very simple process.if __name__ == "__main__": print(f"Hi! I'm process {os.getpid()}")这将产生以下输入: [r0x0d@fedora ~]$ python /tmp/tmp.iuW2VAurGG/scratch.pyHi! I'm process 144112正如您所看到的,任何正在运行的 Python 脚本或程序都是它本人的一个过程。 创立子过程那么在父过程中生成不同的子过程又如何呢?好吧,要做到这一点,咱们须要多解决模块中的 Process 类的帮忙,它看起来像这样: #!/usr/bin/env pythonimport osimport multiprocessingdef child_process(): print(f"Hi! I'm a child process {os.getpid()}")if __name__ == "__main__": print(f"Hi! I'm process {os.getpid()}") # Here we create a new instance of the Process class and assign our # `child_process` function to be executed. process = multiprocessing.Process(target=child_process) # We then start the process process.start() # And finally, we join the process. This will make our script to hang and # wait until the child process is done. process.join()这将产生以下输入: ...

September 4, 2023 · 5 min · jiezi

关于程序员:linux-查看端口占用

查看端口占用应用lsof能够应用lsof -i:端口号 来查看端口占用状况 lsof -i:8010COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMEnginx 35653 zhanghe 10u IPv4 0xcac2e413ddf9c5b9 0t0 TCP *:8010 (LISTEN)nginx 35654 zhanghe 10u IPv4 0xcac2e413ddf9c5b9 0t0 TCP *:8010 (LISTEN)nginx 35655 zhanghe 10u IPv4 0xcac2e413ddf9c5b9 0t0 TCP *:8010 (LISTEN)nginx 35656 zhanghe 10u IPv4 0xcac2e413ddf9c5b9 0t0 TCP *:8010 (LISTEN)nginx 55650 zhanghe 10u IPv4 0xcac2e413ddf9c5b9 0t0 TCP *:8010 (LISTEN)<!-- more --> 应用netstat能够应用netstat -tunlp | grep 端口号 来查看指定的端口号的过程状况 netstat -tunlp | grep 8096tcp6 0 0 :::8096 :::* LISTEN 22027/java -t 显示tcp协定连贯情况-u 显示udp协定连贯情况-n 应用ip和端口号显示,不应用域名-l 仅列出在Listen(监听)服务状态的连贯-p 显示PID和程序名https://zhhll.icu/2021/linux/日常治理/查看端口占用/本文由mdnice多平台公布 ...

September 3, 2023 · 1 min · jiezi

关于程序员:一不留神就掉坑

乘除程序问题 在据卡特兰数公式,解决leetcode-96 不同的二叉搜寻树时,遇到一个十分诡异的问题, package mainimport "fmt"func main() { for i := 0; i <= 40; i++ { fmt.Printf("第%d个卡特兰数为:%d\n", i, numTrees(i)) }}func numTrees(n int) int { rs := 1 for i := 0; i < n; i++ { rs = rs * 2 * (2*i + 1) / (i + 2) //rs *= 2 * (2*i + 1) / (i + 2) } return rs} 即 正文掉的这一行,竟然和上一行得出了齐全不同的后果. 尽管马上解决,但对固有认知影响微小---难道对始终以来司空见惯的乘法语法糖了解有误??? *= 为乘法和赋值运算符,它将右操作数与左操作数相乘,并将后果赋给左操作数. C *= A 相当于 C = C * A ...

September 3, 2023 · 2 min · jiezi

关于程序员:vim编辑器

vim编辑器vim有三种模式,命令模式,插入模式,末行模式,在一开始的时候默认进入的是命令模式 命令模式命令模式:默认的模式,该模式下有很多的快捷键 <!-- more --> 文件内挪动n+Shift+g(或nG)疾速定位到指定的行,先按你想要的跳转的行,而后按G,如:7G,跳转到第7行Shift+g(或者G)跳转到尾行0 跳转到该行首个字符gg跳转到首行:n 跳到指定行 n为指定的行号Ctrl+G 报告光标地位Ctrl+f 屏幕向前挪动一页Ctrl+b 屏幕向后挪动一页Ctrl+d 屏幕向前挪动半页Ctrl+u 屏幕向后挪动半页$ 跳转到该行最初一个字符w 光标前移一字b 光标倒退一字+挪动非空格的下一行-挪动非空格的上一行H 移到以后屏幕最顶行M 移到以后屏幕地方一行L 移到以后屏幕最底行G 移到文本最末行n +回车(n示意数字)光标向下挪动n行j 光标向下挪动一格k 光标向上挪动一格行内挪动^ 挪动到行首$ 挪动到行尾w、b键,别离示意向后和向前挪动一个单词h 光标向左挪动一格l 光标向右挪动一格删除字母x 删除单个字母nx 删除多个字符dw 删除一个字符(剪切)删除整行dd 删除整行D 删除光标所在行到开端行的内容ndd 删除多行:n1,n2d删除指定行dG 从以后行删除到文件尾想要删除该行开端的回车,也就是两行合并为一行,应用Shift+j剪切、复制、粘贴dd 既是删除也是剪切,按p是粘贴至光标后,P是粘贴至光标前yw 复制一个词yy 复制单行nyy 复制多行p 粘贴,从以后行前面粘贴被复制的行P 粘贴,从以后行后面粘贴被复制的行撤销u 撤销批改Ctrl+r 反撤销:u! 复原到文档初始状态替换r 替换光标所在处的字母R 进入替换模式,从光标所在处开始替换字符,按esc完结查找,按下/键,而后输出所要查找的字符,按回车,如果找到光标会跳转到第一个搜寻后果的地位,而后按n,持续向下查找,如果按Shift+n,会反向向上查找插入模式插入模式(输出模式):能够向文件中输出字符的模式。 在命令模式下, 按a 在光标所在位置后插入(追加)按i 在光标所在位置前插入(插入)按A 在光标所在行尾插入按I 在光标所在行首插入按o 在光标上插入新行按O 在光标上插入新行按Esc退出输出模式,进入命令模式 末行模式末行模式:该模式下,在vim界面最下边能够输出命令,来执行各种操作,编辑完文件之后,想要保留批改或者不保留批改都须要进入末行模式来进行操作,从命令模式切到底末模式,按:(冒号)进入末行模式 文件编辑:w 保留文件但不退出vi:w 文件名 将批改另外保留到新的文件中,不退出vinew 文件名 如果该文件存在则关上该文件,如果不存在,则新建(只有保留之后该文件才会创立胜利):w! 强制保留,不退出vi:wq 保留文件并退出vi:wq! 强制保留文件,并退出vi:q 不保留文件,退出vi:q! 不保留文件,强制退出vi:e! 放弃所有批改,从上次保留文件开始再编辑参数设置:set nu 显示行号:set nonu 暗藏行号:set list 显示特殊符号(Tab用^I示意,换行符用$显示):set nolist 不显示特殊符号查找/查找内容 从光标处往下查找?查找内容 从光标处往上查找n 下一个N 上一个替换:s/old/new 以后行的第一个old替换为new:s/old/new/g 替换以后行的所有old为new:1,10s/old/new 将1到10行的每一行的第一个old替换为new,如果应用1,$则是从第一行到最初一行:1,10s/old/new/g 替换1到10行的所有old为new,如果应用1,$则是从第一行到最初一行:%s/old/new/g 替换全文的所有old为new#1到10行增加正文# (应用^是因为^在正则中示意行首):1,10s/^/#/g#1到10行勾销正文# (应用^是因为^在正则中示意行首):1,10s/^#//g能够在vim中执行shell,而不退出vi ...

September 2, 2023 · 1 min · jiezi

关于程序员:远程办公十大网络安全意识隐患

一场从天而降的疫情扭转了咱们的生存,也扭转了咱们的工作形式。在颠三倒四的停工过程中,很多企业和单位都开启了近程办公模式,在保障衰弱和工作的同时,因为员工信息安全意识单薄所带来的安全隐患也不可漠视。 在新冠肺炎抗疫失去管制的同时,咱们不能漠视全民近程办公的网络安全“次生疫情”,尤其是那些随同疫情产生的,或者减轻的平安威逼! 以下是网络安全意识业余机构给出的近程办公安全意识十大隐患,Masutaa小编整顿如下,供近程办公人员或企业网络安全部门参考备忘(只需三分钟即可让你或者你的员工疾速辨认并躲避最常见安全隐患): 01 应用未经受权的集体设施办公,不足平安防护子女的游戏PC、各种存在后门的盗版软件……很多人在家中办公无奈做好欠缺的办公设备筹备工作,不少人应用的是不足业余平安防护及管制的集体设施发展工作。更有甚者,安全意识单薄的员工,连设置开机明码等最根底的平安操作都没有。 02 家人误操作、宠物趴键盘造成数据失落对于在家办公的写照与吐槽在网络上层出不穷,熊孩子动电脑、宠物趴键盘、“办公桌”上放着牛奶等养分物资… 看到这些搞笑又实在的在家近程办公的场景,不禁让人忍俊不禁。但这也恰好反映了一个网络安全隐患。以上任一家人的误操作,都会带来工作中断、数据失落等危险。 03 应用家庭Wi-Fi,危险加剧为了便于记忆,很多家庭Wi-Fi明码设置简略,安全漏洞也多年未曾修补(固件更新),除了有被人蹭网的危险外,还有可能会被黑客攻击,伪造成家庭的网关,所有数据如通过这个伪造网关,会呈现信息被劫持、以及被钓鱼、被欺骗等恶劣影响。 04 应用微信等即时通讯工具造成数据泄露非凡期间,共事之间在线交换的频率和次数达到了顶峰,利用微信等即时通讯工具的便利性,疾速上传下达,很多网络安全要求与规定被抛之脑后,间接用微信传递机密文件,造成数据透露的事件最近时有爆出。 05 应用社交媒体带来的信息被收集的危险在家近程办公,情绪一时难以在公私之间自在转换和隔离,很多人一时衰亡会通过社交媒体抒发本人的工作状况甚至是内容,而这些看似零散的信息,却是黑客收集的材料对象,进行针对性的鱼叉钓鱼的数据跳板。 06 钓鱼危险激增打着企业停工给员工买口罩的旗号、假冒管理员降级账号、假冒领导索要材料等的钓鱼层出不穷,俨然行将成为网络安全的重灾区。员工如网络安全意识不强,面对不拘一格的钓鱼,很难分辨真伪,躲避危险。 07 利用公共云盘传输材料造成数据泄露很多企业并没有部署业余的近程传输材料工具或平台,无论是基于便利性,还是其余起因,在家近程办公期间,利用公共云盘传输材料成为了很多人不得已的抉择,但其中蕴含的数据透露危险微小,不法分子甚至提供云盘内容检索服务,能够搜寻下载个人用户寄存在云盘中的敏感数据。 08 设施突发状况,自行处理,没有及时上报办公设备呈现问题虽属于突发状况,可一旦呈现,就没有平时现场办公时那么不便失去专业人士的声援并且可能失去欠缺的解决,随之带来的是,员工本人排查或找“别人”帮忙解决,造成数据失落或透露。 09 集体设施接入公司外部网络的危险依照各地的治理规定,目前停工的企业,基本上是一部分员工在公司办公,一部分员工是居家办公。居家办公的员工就会有集体设施接入公司外部网络的可能,而这带来的网络安全危险显而易见。 10 零碎、软件更新不及时造成破绽的危险近程办公,及时进行系统升级、软件更新这些必要的平安操作,在有些员工的意识中不复存在,容易造成破绽,成为黑客攻击的跳板。 网络安全,以人为本,无论在什么状况下,对员工的网络安全意识宣教都需紧跟工作,在目前广泛采纳近程办公的大环境下更是如此。疫情过后,咱们的工作都会回归到失常甚至到减速轨道上来,心愿不要面临因为员工不足网络安全意识,而须要咱们再回头“补破绽”的场面。 对于MasutaaMasutaa是个互联网从业者自在合作交流平台,链接行业内TOP10%人才!目前平台上曾经有将近400名互联网尖端人才,其中近70%的从业者从业年限超3年。 在这个平台上,你有机会取得近程我的项目,也可实现天文套利,成为数字游民!

September 1, 2023 · 1 min · jiezi

关于程序员:行业追踪20230901

主动复盘 2023-09-01凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天继续公布板块的rps排名,追踪板块,板块来开仓,板块去清仓,抛弃自以为是的想法,板块去留让市场来通知你 跟踪板块总结: 成交额超过 100 亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个下级的归类,这样更能体现支流方向rps 有时候比拟滞后,但不少是欲杨先抑, 应该继续跟踪,等 macd 反转时参加一线红:第一次买点呈现后往往是高峰,等回调,macd 反转,rps50 还始终红,第二次买点重现行业趋势仍旧在,做最强个股,别恐高。第一波行情 rps20 + 10日均线,第二波行情 rps50 + macd反转。工--h:醉卧梦星河陶博士秘密武器RPS板块排名,号每天都更新,文章图看趋势。板块 rps 排名rps10排名rps20排名rps50排名rps120排名1. Chiplet概念1. 减速器1. 证券1. 游戏2. 电子化学品2. 时空大数据2. 房地产开发2. 减速器3. 时空大数据3. ST股3. 装修建材3. 云游戏4. 电子车牌4. 次新股4. 券商概念4. 文化传媒5. 光刻胶5. 环保行业5. 土地流转5. 电机6. 文化传媒6. 煤炭行业6. 煤炭行业6. 证券7. 算力概念7. 食品安全7. 人造肉7. Web3.08. 通信服务8. 教育8. 多元金融8. 在线教育9. 减速器9. 通信服务9. ST股9. 券商概念10. 生物辨认10. 燃气10. 环保行业10. 激光雷达11. 煤炭行业11. 水产养殖11. 装修装璜11. 汽车热治理12. 3D摄像头12. 美容护理12. 商业百货12. 工业4.013. 半导体13. 石油行业13. 页岩气13. 人工智能14. 屏下摄像14. 电子化学品14. 食粮概念14. 船舶制作15. 中芯概念15. 塑料制品15. 水产养殖15. Chiplet概念16. 互联网服务16. 文化传媒16. 地摊经济16. 空气能热泵17. MiniLED17. 纺织服装17. 乳业17. 屏下摄像18. 在线教育18. 汽车零部件18. 纺织服装18. 元宇宙概念19. 光学光电子19. 互联网服务19. 银行19. 东数西算20. 动物照明20. 工业大麻20. 减速器20. 近程办公21. 智能穿戴21. 家用轻工21. 供销社概念21. 工业母机22. 近程办公22. 化妆品概念22. 拆卸修建22. 电子车牌23. 加强事实23. 装修建材23. 燃气23. 银行24. 教育24. 中药24. 水泥建材24. 汽车零部件25. 生产电子25. Chiplet概念25. 有色金属25. 虚拟现实板块 rps20 排名详情板块详情1. 时空大数据2. 减速器3. ST股4. 次新股5. 煤炭行业6. 环保行业7. 教育8. 食品安全9. 通信服务10. 燃气11. 水产养殖12. 石油行业13. 美容护理14. 文化传媒15. 电子化学品16. 塑料制品17. 纺织服装18. 汽车零部件19. 互联网服务20. 工业大麻21. 化妆品概念22. 家用轻工23. 装修建材24. Chiplet概念25. 中药板块 rps50 排名详情板块详情1. 证券2. 房地产开发3. 券商概念4. 装修建材5. 土地流转6. 煤炭行业7. 多元金融8. ST股9. 人造肉10. 装修装璜11. 环保行业本文由mdnice多平台公布 ...

September 1, 2023 · 1 min · jiezi

关于程序员:减肥100天我还是曾经那个少年

成绩我从六月开始减肥,过后体重 184 斤,身高 177cm, 穿衣 2XL,六月减掉14斤,七月减掉 11 斤,八月减掉 10斤,9月1号早上体重 149 斤。之所以先说成绩,是想激励正在减肥或者想要减肥的人,当然更多的是激励本人,为本人这三个月以来的致力,交上一个称心的答卷。 身材变动当我减掉 10 斤的时候,身材有一些轻微的变动,肚子没有那么圆了,走路不会那么快就感觉累了;这个时候感觉不是特地的显著,可能是我体重过大的起因吧。 然而当我减掉 20 斤的时候,我的身材就开始呈现显著的变动了,脸部不再是圆滚滚了,开了有了棱角,腰间游泳圈不见了,上衣感觉像是穿了一个裙子,显著的大了一码,腰带都必须要剪短了,曾经没有能用的卡扣了。这个时候为了激励本人,给本人买了小一码的衣服;穿上显著感觉整个人小了一圈;这个时候依据艾动摇了我下个阶段的减肥信心。 当我减掉 34 斤,体重到了 150 的时候,身边的共事都开始问我,是不是身材出了问题,感觉我暴瘦了好多,每每听到这种话,都会让我兴奋一整天;这个时候我那大肚子曾经彻底看不出来了,腰线开始往里面膨胀,衣服也曾经换成了 L 码,在这期间腰带又剪短了一次,整个人换完衣服显著精力了许多;正如题目那样,我变回到了已经那个体型的少年。 我的形式告诫大基数且平时不怎么静止的人,不要一开始就去静止,身材容易受伤,亲自领会!!! 从皓叔出事儿后,五月中旬开始我那时候是想通过静止减肥的,开始了上手最简略的跑步,刚开始 1 公里都跑不完就感觉喘不上气,到前面逐步减少,到第二周能够一口气跑 2 公里,到第三周 能够跑到 3.3 公里,到了第周围能够继续不间断的跑完 4.6 公里,也就在这个时候我膝盖开始疼了,走路都疼,没法蜿蜒,这个阶段其实我就瘦了 1 斤(还可能损失的是水分),这个时候我其实想要放弃的,然而看了看本人都厌弃身材,我开始去网上寻找减肥的其它办法。 也凑巧这个时候抖音上各种明星减肥法开始风行,我开始去看去找适宜本人的,我没有自觉的去跟,毕竟对于咱们上班族而言,还要放弃一天的精力去工作,然而也确定了通过正当饮食来减肥。这个时候刚好 6月初,进入了一年天气最热的一段时间,天气热胃口会受到影响,各种瓜果蔬菜也比拟丰盛,这也开始了我安稳的减肥办法。施行也证实了管住嘴远比迈开腿重要。 我的饮食减肥有一个总的计划就是控糖控油,减低粗劣碳水,减少蛋白质的摄入。只有能做到这点儿,你减肥就肯定能达到本人的指标。我的习惯饮食就是碳水尽量放到早上,中午蛋白质配蔬菜,早晨就各种瓜果配蔬菜,而后一天喝够 2000ml 的水。 碳水减肥期间我的碳水次要来源于 玉米、土豆、红薯、燕麦。每天摄入碳水一些博主举荐是 200 g, 我日常摄入大略在 150g 以内,具体我没撑过,而且我个别会把碳水放在早上或者中午,早晨不会补充碳水;这样成果更好。并且燕麦我是在8月份才开始减少的。后面两个月次要靠 玉米土豆红薯,做法就是蒸煮,土豆丝也能够炒一下留神少油少盐。 蛋白质蛋白质我次要靠 鸡蛋、鸡胸肉、去皮卤鸡腿(本人找的低卡卤鸡腿配方)、鱼。减肥期间肯定要摄入蛋白质,即便吃多了也不会胖,所以放心大胆的吃,不要用油炸就行。 当然有钱间接上牛肉,大虾也是很好的蛋白质起源。 蔬菜减肥期间晚餐我吃的最多的是 黄瓜、西红柿、生菜、上海青这四个能够说是刷脂必备吃到撑都无所谓。当然其它常见的绿叶菜菠菜、小白菜、空心菜、包菜等等都是能够大胆的吃的,每天换着吃就行。 平时肉类蛋白不想吃了,能够吃西兰花,这也是一个优质的减脂菜。 菌菇类的次要就是金针菇、平菇这两种; 水果苹果、梨,我次要吃着两种,苹果居多。防止吃寒带的高热量水果就行。 其它豆腐也能够当主食来吃,特地是嫩豆腐,热量极低,又富含大豆蛋白,千张少吃一点也无所谓,热量比豆腐要高!能够当做下面那些食物吃腻了的替代品;对豆腥味敏感的能够下热水烫一下或者蒸一下,凉拌煮汤都不错 饮水我平时就喝本人泡的绿茶,我喜爱入口清新回味略带香甜的绿茶口感;而且没有减肥之前我也是夏天绿茶冬天红茶。减肥期间肯定要大量饮水。每日至多喝够 1500ml 的水。饮料想喝就喝无糖的;其实我集体对于无糖饮料也是不举荐的。 静止跑步腿疼后,我就不怎么静止了,每周两天绕着小区走 三圈差不多 6.5 公里左右吧!当然可能做到饮食+静止联合成果必定会更好,依据集体的身材状况来就行。 购买的设施体重秤一台,喷油壶一个。这里说一下体重最好每天早上排过小便测一次,能够以这个体重当做净体重;看着每天下面的数字都能缩小,也是一种激励;喷油壶就是单纯的为了管制油脂的摄入量。 购买的食品六月初购入了一箱荞麦挂面(因为我是面食爱好者),八月份购入了两桶燕麦片;其它产品没有买过;既然决定减肥了就吃本人加工的食物就肯定是最洁净的,不要去置信那些网红举荐的货色了。 放荡餐放荡餐频率每周一次,有两种吃法,一种是高碳水吃法,我自己喜爱吃面食,所以我周末会吃两餐面条,不管制量能吃多少吃多少,一种是什么都不限度,平时想吃的烧烤、炸鸡、奶茶、红烧肉啊什么的也是想吃多少吃多少,不过只能吃一顿,一顿后立刻恢复正常饮食;这两种办法我都用过,吃完后体重的确会增长 2-3 斤左右,不过在你复原饮食后一天就能将这些代谢掉,而且接下来两天减的成果会更好。 ...

September 1, 2023 · 1 min · jiezi

关于程序员:打造坚不可摧的代码堡垒-搭建GitLab私有仓库完全指南

在古代软件开发中,版本控制是一个不可或缺的环节。GitLab是一个风行的版本控制平台,容许开发团队协同工作并治理他们的代码。在某些状况下,您可能心愿将您的代码托管在一个公有仓库中,以确保代码的安全性和机密性。在本文中,咱们将向您展现如何搭建GitLab公有仓库,以便您能够平安地治理和分享您的代码。 步骤1:筹备服务器首先,您须要筹备一台运行Linux操作系统的服务器。您能够抉择本人的物理服务器或云服务器,如AWS或DigitalOcean。确保服务器上安装了Docker和Docker Compose,这将是咱们部署GitLab的工具。 步骤2:装置GitLab应用SSH登录到您的服务器。应用以下命令下载GitLab的Docker Compose文件:curl -LJO https://gitlab.com/gitlab-org/omnibus-gitlab/-/archive/14.0.6/omnibus-gitlab-14.0.6-0.el8-cf.yaml创立一个名为gitlab-config的目录,并将下载的Compose文件挪动到该目录中。mkdir -p /srv/gitlab/configmv omnibus-gitlab-14.0.6-0.el8-cf.yaml /srv/gitlab/config/gitlab.yml在/srv/gitlab/config目录中创立一个名为gitlab-secrets.json的文件,用于存储GitLab的密钥。touch /srv/gitlab/config/gitlab-secrets.json关上gitlab-secrets.json文件,并增加以下内容,确保替换YOUR_SECRET_KEY_BASE和YOUR_OTP_KEY_BASE为随机生成的平安密钥。{ "production": { "secret_key_base": "YOUR_SECRET_KEY_BASE", "otp_key_base": "YOUR_OTP_KEY_BASE" }}创立一个名为/srv/gitlab/data的目录,用于存储GitLab的数据。mkdir -p /srv/gitlab/data最初,应用Docker Compose启动GitLab容器。docker-compose -f /srv/gitlab/config/gitlab.yml up -d步骤3:配置GitLab在您的浏览器中拜访服务器的IP地址或域名,并设置管理员明码。登录GitLab并创立一个新的我的项目。在我的项目设置中,您能够抉择将我的项目设置为公有,确保只有受权的用户可能拜访它。当初,您曾经胜利搭建了一个GitLab公有仓库,能够开始治理您的代码并邀请团队成员退出。GitLab提供了弱小的合作和版本控制工具,帮忙您更好地组织和开发我的项目。 无论您是集体开发者还是团队的一员,搭建GitLab公有仓库都将有助于爱护和治理您的代码。心愿本文对您有所帮忙,让您可能顺利开始应用GitLab来治理您的软件我的项目。 本文由mdnice多平台公布

September 1, 2023 · 1 min · jiezi

关于程序员:Plasticine-面向并行模式的可重配架构

本文基于对并行模式的分层架构、数据局部性和控制流的形象,提出了Plasticine架构,从而为并行模式计算提供更好的灵活性和更低的能耗反对。原文: Plasticine: A Reconfigurable Architecture For Parallel Patterns 摘要近年来,因为可重配架构有助于设计高能效加速器,迅速失去遍及。因为位级(bit-level)的可重配形象,细粒度构造(如FPGA)传统上存在着性能和能效低下的问题。细粒度和粗粒度架构(如CGRA)传统上都须要低级编程,并忍耐漫长的编译工夫。咱们用Plasticine来解决这两个挑战,这是一个新的空间可重配架构,旨在无效执行由并行模式组成的应用程序。并行模式曾经从最近的并行编程钻研中怀才不遇,成为弱小的高级形象,能够优雅捕获数据地位、内存拜访模式和逾越宽泛的密集和稠密利用的并行性。 首先,咱们通过观察要害利用的并行模式特色,发现这些特色适宜于硬件加速,如分层并行、数据局部性、内存拜访模式和控制流,从而激发咱们构思了Plasticine。基于这些察看,咱们将Plasticine架构为模式计算单元(Pattern Compute Units) 和模式存储单元(Pattern Memory Units) 的汇合。模式计算单元是可重配的SIMD性能单元的多级流水线,能够无效执行嵌套模式。模式存储单元应用分组暂存器(banked scratchpad memories)和可配置的地址解码器实现数据定位。多个片上地址生成器和scatter-gather引擎通过反对大量未实现的内存申请、内存合并和密集拜访的突发模式,无效利用了DRAM带宽。Plasticine基于28纳米工艺实现的芯片面积为113 $mm^2$,在1GHz时钟下的最大功耗为49瓦。通过应用周期准确的模拟器,证实Plasticine在宽泛的密集和稠密利用中比传统的FPGA提供了高达76.9倍的每瓦性能改良。 1. 简介为了寻求更高的性能和能源效率,计算零碎正越来越多的应用专门的加速器[7, 9-11, 19, 33, 44]。加速器实现了定制的数据和管制门路,以适应某一畛域的利用,从而防止通用处理器中的大量灵活性开销。然而,因为设计和制作的一次性工程(NRE, non-recurring engineering)老本高,以及部署和迭代工夫长,以专用ASIC的模式进行专业化很低廉,因而ASIC加速器只适宜最广泛的利用。 像FPGA这样的可重配架构(reconfigurable architectures) 通过在动态可编程网络互连中提供灵便的逻辑块来实现自定义数据门路,从而对消高额的NRE制作老本。通过FPGA,能够在位级(bit-level)定制数据通路,容许用户对任意数字逻辑进行原型化,并利用架构反对任意精度的计算,这种灵活性曾经吸引了一些数据中心胜利部署了基于FPGA的商业加速器[28, 29, 37]。然而,灵活性是以架构的低效为代价的。计算和网络资源的位级(bit-level)可重配带来了微小的芯片面积和功耗开销。例如,FPGA中超过60%的芯片面积和功耗是用在可编程网络上[4, 5, 22, 35]。通过多个逻辑元件的长组合门路限度了加速器设计能够运行的最大时钟频率。低效率促使了粗粒度可重配架构(CGRA, Coarse-Grain Reconfigurable Architecture)的倒退,其字级(word-level)性能单元合乎大多数加速器利用的计算需要。CGRAs提供密集的计算资源、电源效率以及比FPGA高一个数量级的时钟频率。古代商业FPGA架构,如英特尔的Arria 10和Stratix 10器件系列,曾经倒退到包含越来越多的粗粒度块,包含整数乘积器("DSP")、浮点单元、流水线互连和DRAM存储控制器。然而,FPGA中的互连依然是细粒度的,以使这些器件可能施展其作为任意数字逻辑原型验证构造的最后目标。 可怜的是,FPGA和以前提出的CGRA都很难用。加速器设计通常造成低级编程模型和长编译工夫[3, 21, 22]。大多数CGRA和带有粗粒度块的FPGA中资源的异质性进一步减少了复杂度。简化加速器开发的一个有心愿的办法是用特定畛域语言,这些语言能够捕捉到高级别的并行模式,如map、reduce、filter和flatmap[38, 41]。并行模式曾经胜利用于简化并行编程和代码生成,实用于各种并行架构,包含多核芯片[27, 34, 40]和GPU[8, 23]。最近的工作表明,并行模式也可用于从高级语言中为FPGA生成优化的加速器[15, 36]。在这项工作中,咱们专一于开发粗粒度、可重配的架构,对并行模式有间接的架构反对,在面积、功耗和性能方面都很高效,在编程和编译的复杂性方面也很容易应用。 为此咱们引入了Plasticine,作为新的空间可重配加速器架构,为高效执行并行模式进行了优化。Plasticine是由两种粗粒度的可重配单元组成的二维阵列: 模式计算单元(PCU, Pattern Compute Unit) 和模式存储单元(PMU, Pattern Memory Unit) 。每个PCU由一个可重配流水线组成,具备多级SIMD性能单元,并反对跨SIMD通道的转移和简化。PMU由一个分组暂存器(banked scratchpad memory )和专用寻址逻辑及地址解码器组成。这些单元通过流水线动态混合互连(static hybrid interconnect) 互相通信,具备独立的总线级(bus-level)和字级(word-level)数据,以及位级(bit-level)管制网络。Plasticine架构中的层次结构简化了编译器映射,进步了执行效率。编译器能够将内循环计算映射到一个PCU上,这样大多数操作数就能够间接在性能单元之间传输,而不须要应用scratchpad存储器或PCU之间的通信。片上scratchpad存储器可配置为反对流式和双缓冲拜访,片外存储控制器反对流式(突发)模式和scatter/gather拜访。最初,片上管制逻辑可配置为反对嵌套模式。 咱们用基于Scala的硬件定义语言Chisel[2]实现Plasticine,应用Synopsys Design Compiler综合设计后失去面积估算,通过模仿轨迹和PrimeTime失去功率数。应用VCS和DRAM-Sim2进行准确周期模仿,在线性代数、机器学习、数据分析和图剖析等畛域大量密集、稠密计算基准测试的根底上对Plasticine架构进行具体评估。 本文的其余部分组织如下: 第2节回顾并行模式中的要害概念及其硬件实现。第3节介绍了Plasticine架构并探讨了要害的设计衡量。第4节介绍了与FPGA相比,Plasticine的电源和性能效率。第5节探讨相干工作。 ...

September 1, 2023 · 10 min · jiezi

关于程序员:自智网络简介

网络随着业务和流量的倒退,曾经变的无比简单,很难通过人力治理,因而业界提出了自智网络(主动驾驶网络)的概念。普林斯顿大学的Nick Feamster和Jennifer Rexford在本文中探讨了为什么网络须要自动化,以及达成这一指标的门路。原文: Why (and How) Networks Should Run Themselves概要随着人们日常生活中依赖的网络设备、零碎和应用程序越来越多,对网络的治理比以往任何时候都更加重要。应用程序对网络安全、可用性和性能的要求越来越高,并且要求在逾越不同协定和零碎的简单网络上实时解决网络问题,使得对网络的治理越来越艰难。就在网络管理的重要性日益晋升的时候,网络却曾经变得如此简单以至于仿佛无奈治理。在这样一个新时代,网络管理须要有根本性变更,而不只是闭合优化剖析个别协定。网络运营商须要数据驱动,基于机器学习的端到端模型,基于高级策略指标的应用程序性能优化,以及底层组件的整体视图。运营商须要可能基于分类和检测算法做出实时闭环决策,而不只是对网络检测数据执行离线剖析异样检测算法。换句话说,网络应该学会自我驱动。这篇论文探讨了这一概念,并探讨应该如何实现这一指标。达成这一雄心勃勃的指标须要将测量和实时控制更严密耦合在一起,并依附学习对网络应用和零碎进行推理和预测,而不是对个别协定进行闭合剖析。 1. 简介古代网络应用曾经运行在一个前所未见的规模和范畴上。虚拟现实和加强事实须要实时响应,应用容器部署的微服务带来了流量负载的疾速变动,物联网(IoT)显著减少了连贯设施的数量,同时也带来了新的平安和隐衷问题。这些利用深刻了咱们的日常生活中,进步了对实时交互、高可用性、抵挡攻打的弹性、无处不在的拜访和大规模的冀望,因而无形中进步了网络管理的门槛。网络管理始终是一项值得致力的工作,但当初更为要害。 然而,网络管理依然是一项西西弗斯式的工作。随着用户需要和网络复杂性的持续增长,网络运营商开发并应用脚本和工具来帮忙他们布局、排除故障和爱护网络。网络钻研人员致力改良网络协议、优化设计、测量性能,但却始终无奈跟上网络的要求,因为不同的协定、动静的网络条件,以及它们与用户体验之间的关系正变得越来越简单。20年前,咱们曾心愿(并胜利的)创立洁净、关闭的繁多协定、应用程序和零碎模型[4,24]。而明天,网络曾经过于简单,无奈进行闭合剖析。预测问题,如确定搜寻查问响应工夫将如何随缓存的地位而变动,更适宜基于测量数据的统计推理和机器学习[29]。 当然,咱们必须对网络做出扭转,使网络管理更容易,相似的话曾经说了很多年,但依然没有达到冀望的指标。问题的局部起因在于业界继续关注于个别协定的设计、了解和调整,咱们专一于更好的BGP模型,对TCP、QUIC、DNS或目前风行的协定进行优化。事实上,问题不在于协定,与单个协定相比,无奈对整体网络系统进行建模,使得运营商很难了解网络中正在产生的事件。软件定义网络(SDN)提供了更强的可编程性和集中控制,但控制器依然依赖于收集本人须要的数据,并在交换机中配置低级匹配规定,而SDN并不能扭转事实的网络化零碎过于简单、无奈用闭合模型进行剖析的事实。 作为网络钻研人员,必须扭转解决这些问题的办法。网络管理的一个雄心勃勃的指标是自智网络(self-driving network) ,其中(1)网络测量由工作驱动,并与网络管制紧密结合,(2)网络管制依赖整个网络的学习和大规模数据分析,而不是单个协定的关闭模型。最近的倡导提出了这一高级指标[14,28],并与主动驾驶汽车进行类比,主动驾驶汽车能够做出决策,治理不确定性并升高危险,以实现某些工作(例如,返回某个目的地的交通)。本文具体探讨了这一指标,开发了自智网络的技术要求和个性,并概述了一个宽泛的、跨学科的钻研议程,能够让咱们离实现这一指标更近。 多年来,网络界始终致力于解决这一难题,从应用程序性能的预测模型[19,29]到基于网络流量剖析的统计异样和入侵检测算法[2,7],不一而足。然而,目前的技术水平只是为创立真正的自智网络这一更为雄心勃勃的打算奠定了根底。现在,测量依然与网络管制拆散,并不可避免的将网络运维人员置于管制回路中,从而引入了不确定性以及造成误差的可能性。如何利用咱们所领有的技术,并使其既可能实时控制又具备分布式的长处,在网络(以及更宽泛的计算机科学)畛域带来了全新的挑战: 从高级策略中派生测量、推理和管制的规定: 自智网络应该将与性能或安全性相干的高级指标作为输出,并独特得出(1)该网络应该收集的测量数据,(2)该网络应该执行的推理,以及(3)该网络最终应该执行的决策。第2节介绍的编程语言形象和对网络的程序化管制的新方向,最终可能实现这些性能。 主动执行,实时推理: 过来十年证实了机器学习在检测和预测网络攻击方面的微小后劲,咱们必须在网络管理中一直减少的自动化推理工作的根底上,最终将其集成到一个管制回路中,从而实现更自动化的决策。第3节介绍了这一挑战的两个方面: (1)基于学习改善网络管理,(2)设计网络进步为学习算法提供数据的品质。在自智网络中,数据品质(Quality of Data, QoD)是服务质量(Quality of service, QoS)的前提,并最终是用户体验品质(Quality of experience, QoE)的前提。 可扩大的数据面运维: 网络社区曾经开始为这方面奠定根底,通过齐全可编程的、独立于协定的数据立体(例如,Barefoot Tofino芯片集[5]和Netronome网卡[30])以及为它们编程的语言(例如,P4[6])。通过这些提高,数据面当初开始反对带内测量,再加上分布式流剖析平台,程序化网络管制的后劲微小,不仅包含转发(已启用SDN),还包含测量数据的收集。第4节介绍了这些畛域的钻研挑战和时机。 运营商始终心愿网络更容易治理,算法、机器学习、形式化办法、编程语言和硬件的倒退,激励咱们思考更大的指标,即尽可能加重运维人员的累赘,甚至可能齐全不须要人工运维。实际上,可能帮忙咱们实现这些指标的工具和技术正在呈现,但咱们还没有这一拼图的所有碎片,例如,对自动化管制或推理的需要对机器学习算法提出了新的要求。因而,自智网络对网络乃至计算机科学都是微小的挑战。因为咱们做的简直所有事件都依赖于互联网,咱们必须承受这一挑战。 2. 筹备开始自智网络的第一个组成部分是布局,网络运维人员指定高级策略,运行时系统生成相应的测量、推理和管制操作。自智网络应该依赖对立的框架来指定SLA、全网范畴的资源优化和包交互,以及能够生成运行在异构网络设备集上的分布式程序的运行时,以集成测量、推理和管制。 2.1 定义简单网络策略构想有这么一个网络,运营商能够指定 (1)客户冀望(例如,提早和抖动的统计保障); (2)全网指标(例如,尽量减少拥塞); (3)利用性能和业务(如:网络地址转换、访问控制、入侵检测)。 客户冀望(服务水平协定)。 网络运营商应指定服务水平协定(SLA)在保障网络指标(例如,提早、抖动和DDoS响应工夫)或用户体验质量指标(如VoIP的MOS或网页浏览加载工夫)。每个SLA应该对应于流量的一个特定子集,该子集由数据包报头字段以及地点指定,或者更好的是,基于Web站点(如www.netflix.com)或应用程序(如视频流)的更高级别名称指定。交互式应用程序能够确保包提早至多在99.9%的工夫内小于10毫秒。SLA可能对应于与客户的合同协定,并能够驱动监控(检测网络何时有违反保障的危险)、适应(在短期内缓解问题)和学习("学习"如何抉择满足SLA的配置,同时避免浪费网络资源)。明天,服务提供商只是非正式的指定SLA。只管一些初步钻研提出了用于指定SLA的语言[16,18],但这些工作在主动监控、适应和学习方面没有实现闭环。 网络指标(资源优化)。 网络运营商除了要满足客户的服务承诺外,亦要满足整个网络的指标,使其网络能高效、牢靠的运作。这些指标能够天然的表白为优化问题,具备指标(objectives, 如最小化拥挤)和束缚(constraints, 如节约流量或限度门路长度),管理员应该可能将这些指标间接指定为优化问题。例如,一个常见的流量工程指标是最小化所有链路上某个链路利用率凸函数$f()$的总和(例如,$\sum_{l}f(u_{l}/c_{l})$),其中链路利用率取决于流量矩阵($v_{ij}$,从入口i到进口j的负载)和路由($r_{ij}$),从入口i到进口j的流量中穿过链路$l$的百分比)。也就是说,链路利用率是遵循遍历链路门路的所有流量矩阵的和($u_{l}=\sum_{ij}r_{ijl}*v_{ij}$)。从而通过求解这一优化问题失去网络($r_{ijl}$)。实际中,运行时必须决定多久收集一次测量指标(以及准确到什么水平)、扭转路由的频率以及如何示意路由决策(基于网络设备的性能)。 从拥挤的对端转移流量。 当某一特定链路上的流量超过阈值时,运营商可能心愿将多余流量转移到另一条互连链路上。基于此策略,运行时零碎应该监测第一条链路上的流量负载,并决定是否以及如何均衡负载,而不只是依赖于动态阈值。相干决策也可能依赖于更高级别的QoE要求监控关联流量取得的指标(如MOS,甚至是来自应用程序的对于视频比特率或从新缓冲的间接信令)。 检测、拦挡非预期流量。 运营商能够制订某个策略来检测和缓解拒绝服务攻打(DoS),该策略可能要求网络应该对从许多不同的发送方接管特定DNS响应音讯的目的地的流量进行限流。基于此策略,运行时应该生成必要的监控查问,并依据监控后果对可疑流量进行限速,而不是期待检测到DoS攻打时的特定阈值,从而通过该策略能够指定某种检测技术(例如,通过端口扫描的程序假如测试)来辨认攻打。 3. 适应动静环境网络的复杂性及其底层过程的动静个性使机器学习算法成为检测、诊断和缓解中断的人造工具。之前的工作利用了机器学习和用户交互技术,以改善网络安全[2,7,9]和性能[19,29]的具体方面。然而到目前为止,这些技术次要还是基于现有设计,而不是间接整合到网络管制中。例如,机器学习在网络安全方面的许多利用都波及到大规模流量跟踪算法的开发和(通常是离线的)测试,下一步天然是将这些类型的推理和控制算法集成到网络决策和管制中。即便是利用现有的学习算法也常常遇到很多艰难,局部起因是基于现有网络协议和技术不容易取得数据样本标签。另外,当初的机器学习算法往往不是为大容量、分布式和疾速倒退的网络数据量身定制的,现有算法也使得迭代精炼监督学习算法中应用的特色(对于大容量网络流量跟踪可能须要)或执行简单的工夫序列剖析变得艰难。 本节咱们将介绍机器学习和用户交互技术如何在自智网络畛域提供帮忙: (1)基于机器学习促成自智网络,在许多状况下,网络能够学习本人运行,防止由运维人员做出决定(第3.1节); (2)联合应用程序和人类用户的输出从而更好的改良学习算法(第3.2节)。 3.1 通过学习改善运维网络应该提供高可用性、良好的应用程序性能,以及基于自动化和半自动化来应答中断,从而晋升安全性。过来应用单点解决方案(例如,防火墙和垃圾邮件过滤器等中间体)来修补现有网络,与此相反,咱们倡议让网络内建这些中间体提供的性能。咱们将探讨两个适宜自智网络的治理畛域: (1)满足性能要求和服务水平协定; (2)自动检测和缩小不必要的通信(例如,垃圾邮件、DoS攻打)。 性能: 应用程序和服务水平协定。 要提供良好的网络性能,须要在短时间内对一直变动的网络条件做出反馈。为某些应用程序提供良好的网络性能,须要了解利用级指标(例如,视频比特率,再缓冲事件)以及通过网络流量能够测量什么之间的关系。在其余状况下,运营商的工作可能波及确定服务水平协定(SLA),包含确定网络条件何时可能导致违反SLA。当网络比较简单的时候,能够应用闭合剖析来模仿(比方)TCP连贯的行为,以及预测特定网络的变动(例如,路由协定权重的变动)可能会对应用程序性能的影响。然而,在明天的网络中,不再容易进行这种闭合剖析,因为网络的复杂性以及许多相互作用的网络组件独特影响了网络和应用程序的性能。 通过收集、存储和剖析附加数据的能力,网络能够生成模型,在利用率等较低级别指标和流媒体利用性能等较高级别指标之间建设更简单的关系。例如,以前的工作曾经建设了对特定配置决策如何最终影响网络搜寻响应工夫[29]建模的可能性。过来的工作曾经证实,理解低级别网络个性(如往返提早)和应用程序性能指标(如搜寻响应工夫)之间的关系是可能的。随着算法速度和复杂性的倒退,加上数据立体可编程性的提高,应该思考将这些技术扩大到无关实时性能监控的问题上来,包含利用级性能保障和SLA监控。 平安: 非必要流量。 近年来,机器学习在统计异样检测中的利用获得了重大进展。钻研人员开发出了新的学习算法,通过剖析网络流量(从报文跟踪到IPFIX记录)[17]、DNS查问[2]和域注册[8],甚至BGP路由音讯[15]来检测(甚至预测)攻打。然而,这些异样检测算法大多只在离线流量跟踪数据上进行了演示,这样的演示对于辨认运行在独立网络设备上的异样检测算法的特色十分有用,从而为自智网络的前景带来了更多的挑战和时机。其中一个挑战波及到对这些算法进行调整,使其实时运行,并可能联合实时操作。例如,基于轻量级特色的简略回归模型能够在反对可定制特征提取和计算的可编程交换机中执行(例如基于Barefoot Tofino芯片组[5]),咱们将在第4.2节进一步探讨。另一个挑战波及开发新的机器学习算法,基于轻量级特色(例如基于元数据或粗统计)执行粗分类,并当分类不确定时触发更重量级特色的收集(例如来自数据包),咱们将在下一节中更具体探讨这种可能性。 ...

September 1, 2023 · 5 min · jiezi