奇富科技:大数据任务从诊断到自愈的实践之路

一、为什么要做诊断引擎 毓数平台是奇富科技公司自主研发的一站式大数据管理、开发、分析平台,覆盖大数据资产管理、数据开发及任务调度、自助分析及可视化、统一指标管理等多个数据生命周期流程,让用户使用数据的同时,挖掘数据最大的价值。而毓数平台的大数据任务调度底层是基于Apache DolphinScheduler实现的。 整个大数据平台有1000+机器、70P数据量,每日新增200T数据。每天在毓数工作流上运行的任务实例有13万+,周活跃用户400+;每天在毓数自助查询中运行的sql有16万+,周活跃用户500+。运行的任务类型有Spark任务、Sqoop任务、DataX任务等10多种任务类型。 而我们的几百位业务同学对大数据框架底层原理几乎都不太了解,因此日常会需要数据平台部门同学协助业务去分析和排查大数据任务运行问题。数据平台部门同学每天都会花费很多时间和精力在任务人工诊断上,而相应业务同学面对异常任务也会很苦恼。每个月数据平台部门协助用户诊断任务问题平均耗费4人/天工时。 对于,异常任务,让我印象很深刻的一件事情是,23年有一位业务同学在群里询问他的sql为啥报错。将业务的Sql简写后异常如下图所示。 然后过了几分钟另外一个业务同学在群里回复他说:“你多写了一个库名”。这个现象让我发现,虽然我们数据平台的同学认为这个问题很简单,很容易排查。但是当业务的sql比较复杂并且业务对写sql不太熟悉时,就会经常被异常困扰几分钟甚至更长时间,不能快速解决sql的异常。 而且sql语法异常可能大家排查和解决比较简单,而spark sql的数据倾斜、数据膨胀、OOM等异常需要业务登录spark ui去排查。这样对业务简直就太困难了,因此我们决定做一款面向自助查询和工作流的大数据任务实时诊断引擎。 二、诊断引擎需求分析 (一)、诊断所有大数据任务 我们理想中诊断引擎必须支持毓数平台中运行的所有大数据任务。前面我们说过,我们工作流有Spark任务、Sqoop任务、DataX任务等10多种任务类型;而自助查询支持mysql、tidb、doris、tidb、spark等数据源查询。因此诊断引擎必须能够对所有大数据任务进行诊断。 (二)、实时看见诊断结果 诊断引擎必须实时产出诊断报告,我们不太能接受用户看见了异常点击诊断按钮,然后旋转几圈才能看见诊断报告(也可能看不见报告)。也不能接受用户需要从A平台跳转到B平台去看诊断报告。 用武侠小说里的一句话,“毒蛇出没之处,七步之内必有解药”。必须让用户在看见异常1秒钟内看见所对应的诊断报告。让用户使用毓数平台的诊断体验达到最好。 其次,通过自助查询提交的Spark任务虽然还在运行中,没有失败,但是从Spark指标或者日志中已经发现了数据倾斜、数据膨胀、OOM等。也应该在任务提交处,及时弹出诊断报告。达到任务还没有失败时,诊断报告已经产出。最终实现异常与诊断报告实时产出。 (三)、诊断规则易扩展 诊断引擎的诊断规则新增流程必须快速,不能通过发版的方式,例如每周发布一次。如果诊断规则,每周发布一次,对于我们快速帮助业务解决问题而言,太慢了。 因此,我们对于诊断规则发布和生效要求在分钟级。开发、测试好后的诊断规则在1分钟内就能发布到生产环境进行诊断。 (四)、诊断规则灰度发布 诊断引擎的诊断规则必须支持灰度发布,在生产环境运行一段时间后,效果评估没有问题后,用户才能在任务提交入口处看见诊断报告。 (五)、支持阈值实时调整 比如我们的诊断规则有Spark大任务、Spark 小文件。那么多少Spark的task达到多少阈值才算命中Spark大任务?平均写出HDFS多少字节算是小文件?这些阈值可以脱离诊断规则,配置在常量表中。同样修改这些阈值配置,支持分钟级生效。 三、诊断引擎架构剖析 (一)、大数据任务提交入口 诊断元数据采集的入口有工作流、自助查询,但是未来也不排除需要支持Linux客户端、Jupyter等提交任务入口。 (二)、大数据诊断元数据类型 需要支持的大数据诊断元数据有log、metrics,未来也不排除支持Trace等数据。 (三)、诊断引擎架构 以下是我们诊断引擎架构图,我们会实时收集Apache DolphinScheduler worker上所有任务产生的日志到Kafka中。 我们也会和我司自研的自助查询系统合作,自助查询系统也会实时发送用户提交任务的日志到Kafka中。其次,我们重写了Spark的metric sink,实现将运行的Spark任务metric实时发送到kafka中。 我们自研了一个基于Flink和Janino的规则引擎,通过Flink消费Kafka的数据,并对数据进行实时诊断。而Flink引擎每隔1分钟会将存在mysql中新增的java代码交给Janino编译成字节码,从而实现了规则实时加载和实时生效。 规则引擎实时加载规则,并对kafka中的数据进行实时诊断,将诊断结果写入mysql中。而工作流或者自助查询系统调用接口查询mysql中是否有诊断报告,并对用户展示诊断报告。 (四)、诊断引擎与开源对比 以下是我司自研的大数据诊断引擎与OPPO开源的罗盘对比。我觉得我们的诊断引擎在易用性、实时性,规则灰度、任务自愈、大数据任务类型等方面是优于罗盘的。不过我们在诊断规则深度方面还不如罗盘,比如Spark CPU浪费、内存浪费等方面,我们还没有开发规则。 不过后续,我们也可以实现这些资源浪费规则,目前精力主要做的是异常覆盖率提升、还有调度自愈等。 功能毓数诊断引擎Oppo罗盘实时诊断支持不支持易用性容易困难参数调优支持支持自助查询支持不支持诊断规则实时加载支持不支持诊断规则灰度支持不支持一键调优规划中不支持任务自愈支持不支持 OPPO罗盘:https://github.com/cubefs/compass 四、诊断引擎实现 一)任务元数据采集 Push:有侵入性、运维简单、容易丢数据、适应性好。一般适用于任务类采集。 Pull:没有侵入性、运维复杂、不容易丢数据、适应性差。一般适用于服务类采集。 在对工作流任务运行的log采集上,我们采用了push方式主动上报任务运行日志到kafka中。 不采用pull方式的原因是,worker上运行的任务log写到了磁盘很多个文件中,而通过filebeat等方式采集磁盘log文件很难实现。 在这里,可以将taskAppId理解为分布式跟踪中的TraceId,每条log都需要携带一条TraceId,通过TraceId和工作流或者自助查询等关联起来。 对自助查询也是,自助查询提交的sql运行的日志也会实时push到kafka中。通过解析自助查询发送到kafka中log携带的TaskAppId,就能关联到自助查询每个Query的唯一的ID。 而采集Spark运行的指标,因为我们要做到实时诊断,因此没有采集Spark history的数据,而是实现一个spark metric kafka sink。这样随着启动Spark任务,便会将Spark任务运行的metric实时上报到kafka中。 { "app_name": "SPARK", "sparkMetricReportVersion": "v1", "applicationUser": "hive", "dataCenter": "xx", "ip_address": "xx", "metrics": [ { "

GoogleNet v1结构和代码复现

1 大致结构 Top5错误率6.7%; 使用9个inception模块, 改变CNN原串行结构, 并行, 共22层; 使用平均池化替代FC层; 参数量仅为AlexNet的1/12; 使用softmax获取平均结果; 网络结构的更新, 性能比AlexNet要好; 2014年ILSVRC冠军。 下面是他的具体参数 其实感觉对于GoogleNet结构除了inception结构和多出来的两个输出结构并没有什么好介绍的,具体介绍下inception结构,和那两个输出结构 2 inception结构 inception结构,就是将上述的四种卷积的结构进行concat通道合并输出到下一个inception 在原图中,inception结构是右图模样,有人会好奇,加不加1x1卷积有什么区别吗,其实整体感受效果是差不多,主要在于计算量上,先通过1x1来降维使通道压缩,然后再3x3卷积,会减少不少的计算量。 3 两个额外输出结构 主要是网络层次越深,容易导致梯度消失,或者梯度很小反向传播效果不好,导致模型学习能力不强,就添加了两个分支,这两个分支,因为输出的时候层次还不深,所以梯度不会很小,通过这两个分支的反向传播,增加模型的学习能力。 4 代码复现 import torch import torch.nn as nn class BasicConv2d(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, stride, padding): super(BasicConv2d, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding) self.relu = nn.ReLU() def forward(self, x): return self.relu(self.conv(x)) class Inception(nn.Module): def __init__(self, in_channels, out_channels): """ :param in_channels: 输入通道数目, eg: 192 :param out_channels: 各个分支的输出通道数目, eg: [[64], [96,128], [16,32], [32]] "

设置SSH主机:正在本地下载 VS Code 服务器

其实呢,我觉得,你可以多等一会儿或者换个网,正常下载了连接上了,以后就可以正常使用了,同时以后注意使用习惯,关闭运行进程,删除文件夹,回退版本。 问题描述 很简单,就是我电脑强制重启之后用vscode再去连服务器,发现连不上了 解决办法 如上图,点击重试按钮,下面的这些东西就可以复制粘贴了 ctr+f查找commit,这个时候就能找到一串d037ac076cee195194f93ce6fe2bdfe2969cc82d,然后就好了,执行下述命令下载vscode-server 然后通过SSH连接目标服务器,进入~/.vscode-server/bin文件夹。看有没有这样的文件目录,没有就创建,有就把里面的东西全部删掉 wget https://vscode.cdn.azure.cn/stable/d037ac076cee195194f93ce6fe2bdfe2969cc82d/vscode-server-linux-x64.tar.gz 当然也可以在浏览器地址栏输入网址,无论哪种方式都能得到一个压缩文件,然后将其解压 tar zxvf vscode-server-linux-x64.tar.gz 然后将解压后的内容原封不动的考到远程主机上 scp -r /home/visionx/下载/temp/vscode-server-linux-x64/* visionx@10.26.13.39:/home/visionx/.vscode-server/bin/d037ac076cee195194f93ce6fe2bdfe2969cc82d 重新启动VS Code,现在即可直接连上Linux主机了 特别注意:不要这样做 在这里边还是给出了一种比较简单且操作性比较强的解决办法,按照我这个情况,其实应该是在远程主机上有d037ac076cee195194f93ce6fe2bdfe2969cc82d这个文件目录的,但是为什么链接不上呢?原因就在于,可能是因为强制关机,而连接中的这个被强制关闭导致部分文件损坏了,所以没有办法重新连接,那有意思的就来了,我们找一个没损坏的不就行了嘛?把其他的配置文件直接考过去不就行了嘛? 显然是不行的,会让你不断的输入密码,但是无法连接 扩展阅读 正常来说,有外网的环境比较轻松,vscode通过ssh链接服务器比较便捷: 1、安装vscode 2、安装remote ssh 3、设置用户名和ip通过remote ssh链接服务器 如果可以正常走就不会有这篇文章了,因为网速问题,可能会卡在标题的地方很久很久 所以这里再给出一种解决办法: vscode通过ssh链接服务器卡在downloading with wget - 知乎如题,vscode通过ssh链接服务器卡在downloading with wget/vscode server 正常来说,有外网的环境比较轻松,vscode通过ssh链接服务器比较便捷: 安装vscode 安装remote ssh 设置用户名和ip通过remote ssh链接服务…https://zhuanlan.zhihu.com/p/426876766 当然还有其他解决办法: 1. 找到此VS Code Server版本的commit_id 在VS Code界面上打开底端面板,找到“输出”,然后查看远程插件“Remote-SSH”的输出,会发现输出栏会有如下信息: Deleting old install from /home/username/.vscode-server/bin/6445d93c81ebe42c4cbd7a60712e0b17d9463e97 Deleting old log file from /home/username/.vscode-server/.6445d93c81ebe42c4cbd7a60712e0b17d9463e97.log Installing to /home/username/.vscode-server/bin/f1b07bd25dfad64b0167beb15359ae573aecd2cc... 等,也可能是其他类似输出,但是这些输出都不重要,重要的在于其最后的这一串字符,我们称之为commit_id,也就是说,可能由于网络环境或者软件版本不同,该界面具体执行的命令可能不同,导致输出信息不局限于上述信息。但是,重要的是commit_id,只要你能看得懂英语,你就能知道当前软件正在下载的VS Code Server对应的是哪一串commit_id。

Git怎样用?(下载到本地,和在本地初始化)

全局设置: 点击第二个 输入: 例如;邮箱是随意地 git config --global user.name "名字" git config --global user.email "邮箱" 获取git仓库 本地初始化: 创建仓库 右键第二个 输入 git init 克隆: 新目录,右键第二个打开,命令窗口中输入: 如果出现输入框: 账号是刚才输入的邮箱 密码是你账户的密码 成功!!!

Idea设置代理后无法clone git项目

背景 对于我们程序员来说,经常上github找项目、找资料是必不可少的,但是一些原因,我们访问的时候速度特别的慢,需要有个代理,才能正常的访问。 今天碰到个问题,使用idea工具 clone项目,速度特别的慢,经常失败,配置idea代理: 配置好以后,check connection github 提示成功 使用idea 去clone项目 还是失败,提示连不上,代理都配置了,为什么还连接不上呢? git还是通过默认的方式去访问github的服务,所以需要让git访问本地的代理服务 解决方案 git 设置代理 在终端中使用以下命令行为git设置代理: 全局代理,代理所有仓库 git config --global http.proxy http://127.0.0.1:1777 git config --global https.proxy http://127.0.0.1:1777 设置完成后,不管使用idea工具,还是使用命令 git clone 速度杠杠的 这是全局代理了所有的仓库,会导致有的仓库速度特别慢,我们单独指定代理的仓库 代理指定的仓库 git config --global http.https://github.com.proxy http://127.0.0.1:1777 这种代理 ,代理只会对 https://github.com 这个仓库有效,不会影响其他的仓库 设置完成后,不管使用idea工具,还是使用命令 git clone 速度杠杠的 git 取消代理 如果不适用这个代理,使用下面的命令取消 git config --global --unset http.proxy git config --global --unset https.proxy 添加 --depth 参数 如果一个项目很大,时间久远,分支、commit 特别多,clone的时候速度特别慢,有时候还容易失败,那怎么办呢? 加上参数–depth,速度杠杠的,提升几十倍太轻松了,命令如下: https://github.com/pinpoint-apm/pinpoint.git --depth=1 加上 --depth 会只下载一个 commit,所以内容少了很多,速度也就上去了。

Vue3的自定义指令怎么迁移到nuxt3

一、找到Vue3中指令的源码 const DISTANCE = 100; // 距离 const ANIMATIONTIME = 500; // 500毫秒 let distance: number | null = null, animationtime: number | null = null; const map = new WeakMap(); const ob = new IntersectionObserver((entries) => { for (const entrie of entries) { if (entrie.isIntersecting) { const animation = map.get(entrie.target); if (animation) { animation.play(); ob.unobserve(entrie.target); } } } }); function isBelowViewport(el: HTMLElement) { const rect = el.getBoundingClientRect(); return rect.

this.$set()用法,强制刷新,新删改查

this.$set 是Vue中的一个方法,用于在响应式对象上设置新的属性或修改已有的属性,强制刷新并确保这些属性也是响应式的。 定义数据对象: obj: { name: "小明", age: 18, }, 基本语法: this.$set(需要改变的对象,"需要改变的对象属性","新值") 2.对象修改 this.$set(this.obj, "name", "小刘"); 控制台输出:obj: { name: "小刘", age: 18, }, 3、对象新增未知属性(这里的item是传递的参数,不带引号,"reading"是参数值) this.$set(this.obj, item, "reading"); 对象新增 this.$set(this.obj, "hobby", "study"); 控制台输出:obj: { name: "小明", age: 18, hobby: "study"}, 数组 使用this.$set(),修改和新增 定义数组包对象: arr: [ { name: "小王", age: 18 }, { name: "小张", age: 20 }, ], 定义普通数组: twoArr: [11, 22, 33, ], 基本语法: this.$set(需要修改的数组,需要修改的数组下标,{ "要修改的数组对象,一个/多个" }) 数组修改 修改数组对象: this.

表单常用正则表达式(手机,邮箱,身份证,数字,空格...)

#表单常用正式表达式 为了后面项目的拿来即用以便不时之需,特意整理一文,把常用的表单验证的正则表达式整理如下。 不能为空 pattern: /^[^\s]+$/ 验证手机号 pattern: /^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/ 验证邮箱 pattern:/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ 验证身份证号 pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/ 只能输入数字 pattern: ^[0-9]+$ 验证不能输入空格 pattern: /^[^\s]*$/ 只能输入中文 pattern: ^[\u4e00-\u9fa5]*$/ 只能输入数字、字母 pattern: /^[A-Za-z0-9]+$/ 只能输入数字、字母、特殊字符 pattern: /^[A-Za-z0-9~!@#$%^&*()_+`\-={}:";'<>?,.\/]*$/ 密码必须包含数字、字母、特殊字符,且长度为6-16位 pattern: /^(?=.*[a-zA-Z])(?=.*\d)(?=.*[~!@#$%^&*()_+`\-={}:";'<>?,.\/]).{6,16}$/ 验证链接 pattern: /(http|https):\/\/([\w.]+\/?)\S*/ 待续.... 有其他的可以评论随时更新

iOS 自动打包如何配置配置打包证书和profile provision文件

Jenkins 打包相关问题记录 打包失败截图: 1、证书找不到 NO certificate matching ‘ ‘ for ‘ ’ code singing is required …. D791BAD1-390A-4587-A35C-A743A3D88D52.png 由于更新过证书配置,导致新证书没有导入到Jenkins中。 配置步骤: Jenkins-系统管理-keychains and provisioning profiles managerment 以为 更新 login.keychain 就好了,其实并不然 25DE5B03-AC83-49FA-9677-4E828EBB570F.png 在升级至Mac 10.12 之后 login.keychain 的存储发生改变。 默认 10.12 的钥匙串存储为👇 路径: ~/Library/Keychains/login.keychain-db A774CF07-6ACC-4A48-A079-0F66B0B8D6C1.png 而10.12之前版本 为 FE243165-275E-41C0-8F8C-8109AAE7DC7A.png 老版本 默认存在 login.keychain 中,而升级到10.12后会存在 login.keychain-db中。 这是第一个注意点。 重点: 由于Jenkins不支持上传文件后缀为 keychain-db的文件。 我们需要做的就是 1、copy ~/Library/Keychains/login.keychain-db 2、rename 为login.keychain 3、upload 至Jenkins keychains and provisioning profiles managerment 4 、done 在进行打包,这次应该可以了吧。 结果。。。

低代码

腾讯云微搭低代码 WeDa _低代码开发平台_可视化开发平台-腾讯云 首页 - 钉钉宜搭 快速上手多维表格 爱速搭 - 企业应用智能设计平台 | 低代码平台 - 百度智能云 Astro轻应用 Astro Zero_低代码开发平台_软件开发工具_应用开发工具_华为云 低代码是一种软件开发方法,它使用可视化建模工具和自动生成代码的技术,使得开发人员能够更快速地创建应用程序。低代码平台通常提供了可视化界面来设计和生成应用程序,包括表单、报表、工作流等组件,而不需要手动编写大量的代码。以下是低代码的一些特点和优势: 1.快速开发: 低代码平台可以大幅减少开发人员的编码工作量,从而加速应用程序的开发和交付。使用低代码平台,开发人员可以在短时间内创建出可运行的应用程序,并进行迭代和调试。 2.易于使用: 低代码平台使用可视化界面和拖放操作,使得开发人员可以更直观地设计和开发应用程序。这样可以使得非专业的开发人员也可以参与开发,从而扩大了应用程序的开发人群。 3.可扩展性: 低代码平台通常提供了丰富的组件和插件,开发人员可以根据需要进行扩展和定制。这样可以满足不同应用场景的需求,并为未来的应用程序升级提供了便利。 4.更高的质量: 低代码平台使用自动生成的代码,减少了手动编码的错误率,并提高了代码的一致性和可维护性。这样可以减少应用程序中的缺陷和漏洞,提高应用程序的质量和安全性。 Java低代码平台 Java 低代码平台是一种用于快速应用程序开发的工具,它们通常提供了可视化界面和代码生成器,以减少手动编写大量代码的工作量。以下是一些流行的 Java 低代码平台: 1.OutSystems: OutSystems 是一个领先的低代码开发平台,支持 Java 开发。它提供了可视化界面和模板,使开发人员能够快速构建企业级应用程序,并集成各种数据源和服务。 2.Mendix: Mendix 提供了广泛的低代码开发工具,支持 Java 开发。它提供了可视化建模工具和组件库,使开发人员能够快速构建企业级应用程序,而无需深入编写代码。 3.Appian: Appian 是一个全面的低代码开发平台,支持 Java 开发。它提供了可视化开发环境和丰富的组件库,使开发人员能够快速构建复杂的企业应用程序。 4.WaveMaker: WaveMaker 是一个开源的低代码开发平台,支持 Java 开发。它提供了可视化界面和模型驱动的开发方法,使开发人员能够轻松地创建 Web 和移动应用程序。 低代码平台提供了可视化界面和拖放操作,使得开发人员可以直观地设计和开发应用程序。下面是一般的低代码开发过程: 1.定义数据模型: 首先,你需要定义应用程序所需的数据模型。这包括确定需要的表格、字段和关系等。在低代码平台中,通常会提供数据建模工具,可通过可视化界面来创建和管理数据模型。 2.设计用户界面: 在低代码平台中,你可以使用可视化界面来设计应用程序的用户界面。这包括创建表单、报表、仪表板等组件,并定义它们的布局和样式。你可以通过拖放操作来添加和配置这些组件,而无需手动编写代码。 3.配置业务逻辑: 低代码平台通常提供了业务逻辑配置的功能。你可以使用可视化界面来定义应用程序的业务规则、验证逻辑、流程控制等。这些配置可以根据具体需求进行自定义,以实现特定的业务流程和功能。 4.集成外部服务: 低代码平台通常支持与外部系统和服务的集成,例如数据库、API、第三方服务等。你可以使用平台提供的集成工具来配置和管理这些集成,以实现应用程序与外部系统的数据交换和功能扩展。 5.测试和部署: 在完成应用程序的设计和配置后,你可以使用低代码平台提供的测试工具来验证应用程序的功能和性能。一旦通过测试,你可以将应用程序部署到目标环境中,使其对用户可用。 需要注意的是,虽然低代码平台提供了可视化的开发界面,但在某些情况下可能仍需要编写自定义的代码逻辑。这取决于具体的需求和平台的功能限制。 以下是一个使用 JHipster 作为 Java 低代码开发平台的示例:

java8 查找和匹配方法(`anyMatch`)(`allMatch`、`noneMatch`)(`findAny`)(`findFirst`)

5.3 查找和匹配 5.3.1 检查谓词是否至少匹配一个元素(anyMatch) anyMatch方法可以回答“流中是否有一个元素能匹配给定的谓词”。 boolean anyMatch(Predicate<? super T> predicate); // 菜单里面是否有素食可选择 if(menu.stream().anyMatch(Dish::isVegetarian)){ System.out.println("The menu is (somewhat) vegetarian friendly!!"); } 5.3.2 检查谓词是否匹配所有元素(allMatch、noneMatch) allMatch方法的工作原理和anyMatch类似,但它会看看流中的元素是否都能匹配给定的谓词。 boolean allMatch(Predicate<? super T> predicate); boolean isHealthy = menu.stream().allMatch(d -> d.getCalories() < 1000); 和allMatch相对的是noneMatch。它可以确保流中没有任何元素与给定的谓词匹配。 boolean noneMatch(Predicate<? super T> predicate); boolean isHealthy = menu.stream().noneMatch(d -> d.getCalories() >= 1000); anyMatch、allMatch和noneMatch这三个操作都用到了我们所谓的短路,这就是大家熟悉的Java中&&和||运算符短路在流中的版本。 短路操作: allMatch、anyMatch、noneMatch、findFirst、findAny、limit --------------------------------------------- # 任意满足 --------------------------------------------- List<Person> list = new ArrayList<>(); boolean present2 = list.stream().anyMatch(a -> a.getAge() > 10); boolean present1 = list.

如何制作一个简单的HTML个人网页

在当今的数字化时代,个人网页已经成为展示个人品牌、项目或兴趣爱好的重要平台。对于许多初学者来说,如何制作一个简单而精美的个人网页可能会有些困惑。本文将向您介绍如何制作一个简单的HTML个人网页,帮助您轻松入门网页制作。 一、准备工具和素材 在开始制作网页之前,您需要准备以下工具和素材: 文本编辑器:您可以使用任何文本编辑器,如Notepad++、Sublime Text或Visual Studio Code等。这些编辑器都提供了代码高亮和自动补全等功能,可以提高您的编写效率。浏览器:您需要一款浏览器来预览和测试您的网页。常见的浏览器有Google Chrome、Mozilla Firefox和Safari等。图片处理软件:为了美化您的网页,您可能需要一些图片素材。您可以使用图像处理软件如Photoshop或GIMP来处理图片。素材:您可以从网上下载一些免费的素材,如背景图片、字体和图标等。 二、创建HTML文件 在您的文本编辑器中创建一个新文件,并将其保存为.html格式。例如,您可以将其命名为index.html。 三、编写HTML代码 现在,您可以开始编写HTML代码了。以下是一个简单的HTML结构示例: <!DOCTYPE html> <html> <head> <title>我的个人网页</title> <style> /* 在这里添加CSS样式 */ </style> </head> <body> <header> <!-- 在这里添加页眉内容 --> </header> <nav> <!-- 在这里添加导航菜单 --> </nav> <main> <!-- 在这里添加主要内容 --> </main> <footer> <!-- 在这里添加页脚内容 --> </footer> </body> </html> 在这个结构中,您需要将页眉内容放在<header>标签中,导航菜单放在<nav>标签中,主要内容放在<main>标签中,页脚内容放在<footer>标签中。您可以使用任意数量的HTML标签来创建您想要的页面布局和内容。 四、添加CSS样式 为了美化您的网页,您可以在<style>标签中添加CSS样式。例如,您可以设置背景颜色、字体样式和边距等。下面是一个简单的CSS样式示例: body { font-family: Arial, sans-serif; margin: 0; padding: 0; background-color: #f2f2f2; } header { background-color: #333; color: #fff; padding: 10px; } nav { background-color: #555; padding: 10px; } main { padding: 20px; } footer { background-color: #333; color: #fff; padding: 10px; } 在这个样式中,我们设置了body、header、nav、main和footer的背景颜色、字体样式和边距等属性。您可以根据您的喜好进行调整和修改。

python如何编译

前言 1、说明 编译python程序就是把python脚本转换成操作系统中的可执行文件,一般使用pyinstaller来完成。 2、步骤 (1)安装pyinstaller 使用pipinstallpyinstaller命令来安装 (2)编译脚本 python安装目录\script\pyinstaller脚本文件名 (3)完成 执行脚本后就可以在脚本目录生成dist目录,目录就有打包好的可执行文件 3、备注 pyinstaller参数 -w指令 直接发布的exe应用带命令行调试窗口,在指令内加入-w命令可以屏蔽。 -F指令 注意指令区分大小写。这里是大写。使用-F指令可以把应用打包成一个独立的exe文件,否则是一个带各种dll和依赖文件的文件夹。 -p指令 这个指令后面可以增加pyinstaller搜索模块的路径。因为应用打包涉及的模块很多。这里可以自己添加路径。不过经过笔者测试,site-packages目录下都是可以被识别的,不需要再手动添加。 以上内容为大家介绍了python学习之如何编译,希望对大家有所帮助。 -END- 读者福利:如果大家对Python感兴趣,这套python学习资料一定对你有用 对于0基础小白入门: 如果你是零基础小白,想快速入门Python是可以考虑的。 一方面是学习时间相对较短,学习内容更全面更集中。 二方面是可以根据这些资料规划好学习计划和方向。 包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习、Python量化交易等习教程。带你从零基础系统性的学好Python! 零基础Python学习资源介绍 ① Python所有方向的学习路线图,清楚各个方向要学什么东西 ② 600多节Python课程视频,涵盖必备基础、爬虫和数据分析 ③ 100多个Python实战案例,含50个超大型项目详解,学习不再是只会理论 ④ 20款主流手游迫解 爬虫手游逆行迫解教程包 ⑤ 爬虫与反爬虫攻防教程包,含15个大型网站迫解 ⑥ 爬虫APP逆向实战教程包,含45项绝密技术详解 ⑦ 超300本Python电子好书,从入门到高阶应有尽有 ⑧ 华为出品独家Python漫画教程,手机也能学习 ⑨ 历年互联网企业Python面试真题,复习时非常方便 👉Python学习路线汇总👈 Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取哈) 👉Python必备开发工具👈 温馨提示:篇幅有限,已打包文件夹,获取方式在:文末 👉Python学习视频600合集👈 观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。 👉实战案例👈 光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。 👉100道Python练习题👈 检查学习结果。 👉面试刷题👈 资料领取 这份完整版的Python全套学习资料已经上传网盘,朋友们如果需要可以点击下方微信卡片免费领取 ↓↓↓【保证100%免费】 或者 【点此链接】领取

抓包工具 数据包抓取

# Wireshark:Wireshark 是一个开源的网络抓包工具,可以在多个平台上运行,支持多种协议的抓取和分析。 # Fiddler:Fiddler 是一个跨平台的抓包工具,可以用于捕获和分析 HTTP 和 HTTPS 流量。它提供了强大的调试和排查功能。 # Charles Proxy:Charles Proxy 是一款跨平台的代理服务器工具,可以捕获并分析 HTTP 和 HTTPS 流量。它具有图形化界面和丰富的功能,适用于移动设备和桌面应用程序的抓包。 # Tcpdump:Tcpdump 是一个命令行抓包工具,适用于 Linux 和 Unix 系统。它可以捕获和分析网络流量,并提供灵活的过滤和输出选项 使用charles抓取手机https包(手机需要root) 模拟器安装charles证书 <br class="Apple-interchange-newline"><div></div> 手机或模拟器只能抓取http请求的数据包,https无法抓取。 想要抓取,就需要在手机上安装charles的证书。 ​ ### 注意: 安卓7 以下设备,安装完证书就可以使用,不用移动证书 安卓7以上设备,安装完证书后,为用户证书,必须把用户证书,移动成系统证书,需要借助于magisk刷move cert模块,需要root权限 <br class="Apple-interchange-newline"><div></div> 手机或模拟器只能抓取http请求的数据包,https无法抓取。 想要抓取,就需要在手机上安装charles的证书。 ​ ### 注意: 安卓7 以下设备,安装完证书就可以使用,不用移动证书 安卓7以上设备,安装完证书后,为用户证书,必须把用户证书,移动成系统证书,需要借助于magisk刷move cert模块,需要root权限

面经基础版案例(路由,请求渲染,传参,组件缓存)

文章目录 1.案例效果分析2.配置一级路由(首页,详情)3.配置二级路由4.导航高亮效果5.首页的请求渲染6.传参(查询参数 $ 动态路由)7.详情页渲染8.组件缓存kepp-alive9.总结 1.案例效果分析 2.配置一级路由(首页,详情) 把首页配成一个路由 → 注意项关于'/' import Vue from 'vue' import VueRouter from "vue-router"; import Layout from '@/views/Layout' import ArticleDetail from '@/views/ArticleDetail' Vue.use(VueRouter) const router = new VueRouter({ routes: [ { path:'/',//首页可以配成一个/ component: Layout //渲染一个组件 }, { path:'/detail', component:ArticleDetail } ] }) export default router 3.配置二级路由 如果要配嵌套路由可以直接写一个配置项children import Vue from 'vue' import VueRouter from "vue-router"; import Layout from '@/views/Layout' import Article from '@/views/Article' import Collect from '@/views/Collect' import Like from '@/views/Like' import User from '@/views/User' import ArticleDetail from '@/views/ArticleDetail' Vue.

勒索病毒如何预防?用什么工具

勒索病毒进入服务器加密文件,让文件变得不能访问,我们经常可以见到这样的新闻,被勒索后没什么好的办法,只能交钱。 碰到言而有信的黑客还好。有时候交钱了,坏人也未必给你解密文件。 有什么工具可以预防这样的勒索病毒吗? 有 WGCLOUD是一款开源免费的运维监控工具,在github有4.5K⭐,非常火爆 我们在项目中就曾经出现过一次被勒索病毒攻击的情况,非常危险,幸好WGCLOUD及时发送告警通知,然后我们马上处理,减少了很多损失 WGCLOUD有个模块【文件防篡改】,可以实时监控文件和文件夹,如果发现文件被篡改,被删除,被修改,WGCLOUD会立刻发送告警通知

「优选算法刷题」:丢失的数字

一、题目 给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。 示例 1: 输入:nums = [3,0,1] 输出:2 解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。 示例 2: 输入:nums = [0,1] 输出:2 解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。 示例 3: 输入:nums = [9,6,4,2,3,5,7,0,1] 输出:8 解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。 示例 4: 输入:nums = [0] 输出:1 解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。 二、思路解析 还是这 2 条公式 : x ^ x = 0 x ^ 0 = x 也就是,重复元素互相异或上的时候,会被消掉变成 0 ;而异或上 0 则会变成他本身。

第十一章 结构化开发(上午题)

一、模块化 模块化是指将一个待开发的软件分解成若干个小的简单部分–模块,每个模块独立开发测试 二、模块独立 模块独立是指每个模块完成一个相对独立的特定子功能,并且与其他模块间的联系简单,衡量模块独立的标准有两个:内聚性、耦合性 三、耦合 耦合是模块之间相对独立性(互相连接的紧密程度)的度量,耦合程度越高,模块独立性越弱耦合的七种类型由低到高排序 无直接耦合:两个模块之间没有直接关系(没有调用、不传递任何信息)数据耦合:两个模块间有调用关系,传递简单的数据值(值传递)标记耦合:有调用关系,传递的是数据结构控制耦合:有调用关心,传递的是控制变量,控制变量可以让被调用方有选择的执行某一功能外部耦合:模块间通过软件之外的环境联结公共耦合:通过公共数据环境相互作用的那些模块间的耦合内容耦合:一个模块直接使用另一个模块的内部数据,或通过非正常入口传入另一模块内部时 四、内聚 内聚是对一个模块内部各个元素之间彼此结合紧密程度的度量,内聚程度越高,模块独立性越强内聚的其中类型由低到高排序 偶然内聚(巧合内聚):模块内各元素间没有任何联系 逻辑内聚:指模块内执行若干个结逻辑相似的功能,通过参数来确定要执行哪一个 时间内聚:特定时间需要同时执行的动作组合在一起形成的模块、 过程内聚:一个模块完成多个任务,这些任务必须按照指定过程执行 通信内聚:模块内的处理元素都在同一个数据结构上操作 顺序内聚:单一功能,模块内各个处理元素密切相关,且需要顺序执行 功能内聚:模块内所有元素共同完成同一功能,缺一不可 五、系统结构设计原则 分解 - 协调原则:大问题分解成小问题自顶向下原则:抓住系统的主功能,由上到下分层分解信息隐蔽 - 抽象原则:上层规定下层做什么和模块间协调,但不规定怎么做一致性原则:统一规范、统一标准、统一的文件模式明确性原则:每个模块功能明确、接口明确,消除多重功能、无用接口,避免病态链接、消除接口复杂度高内聚低耦合扇入扇出适中:模块调用其他模块称为扇出,被其他模块调用称为扇如模块规模适中:过大,则是分解的不充分,过小,则可能降低模块独立性模块的作用范围应该再其控制范围之内 六、系统文档 系统文档是系统建设过程的”痕迹“,是系统维护人员的指南,是开发人员与用户的交流工具系统文档在系统开发人员、项目管理人员、系统维护人员、系统评价人员、用户之间的作用 用户–系统分析人员:可行性研究报告、总体规划报告、系统开发合同、系统方案说明书系统开发人员–项目管理人员:系统开发计划、系统开发月报、系统开发总结报告、项目管理文件系统测试人员–系统开发人员:系统方案说明书、系统开发合同、系统设计说明书、测试计划文档系统开发人员–用户:用户手册、操作指南系统开发人员–系统维护人员:系统设计说明书、系统开发总结报告、技术手册用户–维修人员:系统运行报告、维护修改建议 七、数据流图 基本图形元素 外部实体:矩形,一般用 Ei 表示 数据存储:两条横线或者缺边矩形,一般用 Di 表示 数据流:有向边,起点 ———— > 终点 加工:圆角矩形或圆,一般用 Pi 表示 顶层数据流图描述了系统的输入输出, 0 层数据流图是对顶层数据流图的细分 外部实体:当前系统之外的人、物、外部系统 人:学生、老师、员工、主管 物 : 传感器、控制器、车辆、采购部门 外部系统:支付系统、车辆交易系统、库存管理系统 数据存储:存储数据、提供数据 存储加工后的输出数据,提供加工的输入数据 例如: xxx 表、 xxx 文件 加工 : 将输入数据处理后得到输出数据 一个加工至少有一个输入数据流和一个输出数据里 只有输入没有输出称为”黑洞“ 只有输出没有输入称为”白洞“ 加工的数据不足以产生输出”灰洞“ 数据流:数据流的起点或者重点必有一个是加工 八、父图子图平衡 父图中的数据流,子图中也要有,其实就是根据父图去子图里一个个找看看有没有是父图里有的数据流但是子图没有找出丢失数据流的技巧 父图子图平衡 加工既要有输入数据里、也要有输出数据流 数据守恒(到题目的内容中去找图中有哪些丢失的部分)

Apache Doris 2.0.4 版本正式发布

亲爱的社区小伙伴们,Apache Doris 2.0.4 版本已于 2024 年 1 月 26 日正式发布,该版本在新优化器、倒排索引、数据湖等功能上有了进一步的完善与更新,使 Apache Doris 能够适配更广泛的场景。此外,该版本进行了若干的改进与优化,以提供更加稳定高效的性能体验。新版本已经上线,欢迎大家下载使用! 官网下载:https://doris.apache.org/download/ GitHub 下载:https://github.com/apache/doris/releases 行为变更 提供了更精确的 Precision 和 Scale 推导,可满足金融场景计算的高要求Drop Policy 支持了 User 和 Role 新功能 新优化器支持了 datev1, datetimev1 及 decimalv2 数据类型新优化器支持了 ODBC 外表倒排索引支持了 lower_case 和 ignore_above 选项倒排索引支持了 match_regexp 和 match_phrase_prefix 查询加速数据湖支持了 Paimon Native Reader数据湖支持读取 LZO 压缩的 Parquet 文件审计日志支持 insert into 改进和优化 对数据均衡、迁移等存储管控进行了改进对数据冷却策略进行了改进,以节省本地硬盘存储空间对 ASCII 字符串 substr 进行了优化针对使用 date 函数查询时的分区裁剪进行了优化针对优化器自动统计信息收集的可观测性和性能进行了优化