LaTeX 排版(四)——颜色与超链接

1. 使用颜色 原始的 LaTeX \LaTeX LATE​X 不支持使用各种颜色。color 宏包或者 xcolor 宏包提供了对颜色的支持,给 PDF 输出生成颜色的特殊指令. 1.1 颜色的表达方式 调用 color 或 xcolor 宏包后,我们就可以用如下命令切换颜色: \color[⟨color-mode⟩]{⟨code⟩} \color{⟨color-name⟩} 颜色的表达方式有两种,其一是使用色彩模型和色彩代码,代码用 0 ∼ 1 的数字代表成分的比例. color 宏包支持 rgb、cmyk 和 gray 模型,xcolor 支持更多的模型如 hsb 等. \large\sffamily {\color[gray]{0.6} 60\% 灰色} \\ {\color[rgb]{0,1,1} 青色} 其二是直接使用名称代表颜色,前提是已经定义了颜色名称(没定义的话会报错): \large\sffamily {\color{red} 红色} \\ {\color{blue} 蓝色} color 宏包仅定义了 8 种颜色名称,xcolor 补充了一些,总共有 19 种,见下表: \large\sffamily {\color{red!40} 40\% 红色}\\ {\color{blue}蓝色 \color{blue!50!black}蓝黑 \color{black}黑色}\\ {\color{-red}红色的互补色} 我们还可以通过命令自定义颜色名称,注意这里的 ⟨color-mode⟩ 是必选参数: \definecolor{⟨color-name⟩}{⟨color-mode⟩}{⟨code⟩} 1.2 带颜色的文本和盒子 原始的 \color 命令类似于字体命令 \bfseries,它使之后排版的内容全部变成指定的颜色,所以直接使用时通常要加花括号分组。color / xcolor 宏包都定义了一些方便用户使用的带颜色元素.

用Keepalived搭建milvus高可用方案

用Keepalived搭建milvus高可用方案 本人是在centos中搭建项目,如有问题还请多讨论。 准备工作如下: 1.准备两台服务器 本人192.168.78.118 192.168.78.119 2.两台机器安装docker容器,Python 3.6版本和pip Python安装参照https://www.cnblogs.com/yjlch1016/p/9289588.html pip安装可按照https://pip.pypa.io/en/stable/installing/ 3.安装mysql 目前milvus只支持mysql和sqlite 建议生产使用mysql 4.两台机器有共享存储设备 安装milvus 1.拉取milvus 1.0版本(可根据自己业务选择) #docker pull milvusdb/milvus:1.0.0-cpu-d030521-1ea92e 2.创建milvus目录 /app/$user/milvus 在milvus下分别创建db、conf和logs目录 3.在conf下拉取配置文件server_config.yaml,也可去官网复制,修改配置文件内milvus端口号和mysql配置,其他可根据官网配置 wget https://raw.githubusercontent.com/milvus-io/milvus/v1.0.0/core/conf/demo/server_config.yaml 4.启动milvus命令 docker run -d --name xgmilvus \ -p 19530:19530 \ -p 19121:19121 \ -v /app/milvus/db:/var/lib/milvus/db \ -v /app/milvus/conf:/var/lib/milvus/conf \ -v /app/milvus/logs:/var/lib/milvus/logs \ milvusdb/milvus:1.0.0-cpu-d030521-1ea92e 查看是否启动成功命令 docker logs <milvus容器ID> 安装keepalived 1.在主备机环境中输入如下命令 # vim /etc/sysctl.conf 将net.ipv4.ip_forward=1前面的“#”号删除,将net.ipv4.ip_nonlocal_bind=1 插入其后并保存退出 使用如下命令使其生效: # sysctl -p 2.在主备机中安装 keepalived 及其依赖包 # apt-get install libssl-dev openssl libpopt-dev # apt-get install keepalived 3.

MODIS数据的下载(hdf格式与图片格式)

1. hdf格式MODIS数据下载 下载方法 MODIS数据的下载(新地址) 下载网址: https://ladsweb.nascom.nasa.gov/search 数据读取,借助matlab的hdftool工具读取数据,imshow函数显示图像 2. 图片格式MODIS数据下载 下载地址(Worldview Snapshots): https://wvs.earthdata.nasa.gov/ 真彩色tiff图片matlab读取(imread和imshow函数): Matlab读取高光谱遥感数据.Mat 和.tif(2020.12.27) https://blog.csdn.net/jing_zhong/article/details/111770040 3. 其他相关网址: MODIS官网:https://modis.gsfc.nasa.gov/ Ocean Color Web:https://oceancolor.gsfc.nasa.gov/ MODIS-Land:https://modis-land.gsfc.nasa.gov/ Atmosphere-Imager:https://atmosphere-imager.gsfc.nasa.gov/ MCST(MODIS团队):https://mcst.gsfc.nasa.gov/

STM32相关知识——u8是什么意思?

通俗理解下,u8是无符号32位整型数据的其中一种表示方法,完整表示为(typedef unsigned char uint8_t)。程序员为了定义数据类型少敲几个字符,简化而来。 参考core_cm3.c下的stdint.h 部分代码如下。

Chrome浏览器通过chrono下载插件设置下载断点续传

1.问题: Chrome浏览器下载设置默认不支持断点续传。 2015年前以前是在chrome://flags/里找到: #enable-download-resumption 启动: 开启Chrome自带的断点续传方法 新版本用不了上述方法,网上搜也没有。 2.解决方法: 安装Chrono插件,替换掉Chrome内置下载 优点:支持断点续传,只要不更改上网节点就可以(更改后会下载失败) 显示文件大小、当前速度,暂停,继续等操作 如何安装Chrono插件(具体操作如下): Chrome下载断点续传 安装和管理扩展程序

关于zynq petalinux 2020.2版本交叉编译环境工具链的搭建和使用备忘

用过xilinx zynq petalinux的人都知道petalinux编译一次非常慢,即使下载了sstate和download包之后编译还是很慢很慢,真是让人难以接受了。。。。 so....经过我一番艰苦研究之后终于弄明白了如何使用petalinux生成的sdk来编译自己的驱动程序,步骤如下: 第一步:vivado搭建硬件环境,编译出xsa,在petalinux下创建工程,按照官方指导步骤最后 petalinux-build 编译一次生成整个linux工程 第二步:使用petalinux-build --sdk,petalinux-package --sysroot命令编译出交叉编译工具链,这样只会在 images/linux/sdk文件夹下就生成了编译工具和sysroot,到此步骤之后,如果你只想编译linux 应用程序的话 就打开终端,输入source xxxx/images/linux/sdk/environment-setup-cortexa9t2hf-neon-xilinx-linux-gnueabi 导入sdk到环境变量,然后 输入 arm-xilinx-linux- 按tab键就可以看到petalinux的gcc交叉编译环境已经有了, 之后按照常规方法编译你自己的应用程序就可以了,但是这样只能编译linux 应用程序,要开发petalinux 驱动程序的话是无法编译的,编译提示错误,找不到一堆头文件,要使用petalinux 2020.2的交叉编译器还要下面几个步骤 第三步:如果你想用petalinux 2020.2自带的sdk交叉编译环境编译自己的驱动程序的话,makefile需要指定一个预编译好的内核文件目录 LINUX_KERNEL_PATH := xxx,由于petalinux build出来的文件分散放在不同目录,因此直接使用petalinux工程目录 xxxx/components/yocto/workspace/sources/linux-xlnx下的源码是不行的,编译起来会提示你没有config过,让你重新编译一次,虽然拷贝一份内核代码到别的目录后自己make menugconfig一次能解决,但是这样的话会有一个问题,就是最终即使能正常编译出自己的 ko 文件,但是加载到zynq开发板上是不能 insmod 的,因为zynq上运行的内核和你编译ko的源码内核不是同一个环境编译的,因此不能加载ko。知道原因就好办,想办法把petalinux环境编译内核时生成的目标文件和目录找出来,将文件复制到内核源码下面的对应路径即可,经过一番研究,发现petalinux2020.2编译出的内核文件目录在 xxxx/build/tmp/work-shared/zynq-generic/kernel-build-artifacts这目录下,只要按照这个目录下的文件夹名称,将里面的东西复制到linux内核源码目录下对应名字的文件夹里面即可,经过我试验,确认这个方法是ok的,使用这个方法之后每次编译自己的驱动程序只要几秒钟,原来使用petalinux-build一次5分钟以上,简直爽爆了! Makefile写法参考如下 obj-m := fuckpetalinux.o CURRENT_PATH := $(shell pwd) LINUX_KERNEL_PATH :=/xxx/Petalinux_2020.2/linux-xlnx (linux源码目录) all: make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules clean: make -C $(CURRENT_PATH) M=`pwd` clean 比较好的做法不应该直接复制文件,因为直接复制的话如果要重新编译内核的话,又要重新复制一次,非常麻烦,后面我直接创建petalinux编译后的文件超链接,将超链接复制到linux内核源码目录下,这样之后即使改了硬件,重新编译了内核代码都可以不用修改就能直接编译驱动程序了,记得每次打开终端时source一次即可

服务器常见错误代码500、501、502、503、504、505

一:500错误 1、500 Internal Server Error 内部服务错误:顾名思义500错误一般是服务器遇到意外情况,而无法完成请求。 2、500出错的可能性: a、编程语言语法错误,web脚本错误 b、并发高时,因为系统资源限制,而不能打开过多的文件 3、一般解决思路: a、查看nginx、php的错误日志文件,从而看出端倪 b、如果是too many open files,修改nginx的worker_rlimit_nofile参数,使用ulimit查看系统打开文件限制,修改/etc/security/limits.conf,还是出现too many open files,那就要考虑做负载均衡,把流量分散到不同服务器上去了 c、如果是脚本的问题,则需要修复脚本错误,优化代码 二:502、504错误 1、502 Bad Gateway错误、504 Bad Gateway timeout 网关超时 2、502、504出现的可能性 web服务器故障、程序进程不够 3、一般解决思路 a、使用nginx代理,而后端服务器发生故障;或者php-cgi进程数不够用;php执行时间长,或者是php-cgi进程死掉;已经fastCGI使用情况等都会导致502、504错误。 b、502 是指请求的php-fpm已经执行,但是由于某种原因而没有执行完毕,最终导致php-fpm进程终止。一般来说,与php-fpm.conf的设置有关,也与php的执行程序性能有关,网站的访问量大,而php-cgi的进程数偏少。针对这种情况的502错误,只需增加 php-cgi的进程数。具体就是修改/usr/local/php/etc/php-fpm.conf文件,将其中的max_children值适当增加。这个数据要依据你的服务器的配置进行设置。一般一个php-cgi进程占20M内存,你可以自己计算下,适量增多。 /usr/local/php/sbin/php-fpm reload 然后重启一下. c、504 表示超时,也就是客户端所发出的请求没有到达网关,请求没有到可以执行的php-fpm。与nginx.conf的配置也有关系。 501 服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。 503 服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。(服务不可用) 505 服务器不支持请求中所用的 HTTP 协议版本。(HTTP 版本不受支持) 附:新增全部状态码含义 状态码分类 整体范围 已定义范围 分类 100~199 100~101 信息提示 200~299 200~206 成功 300~399 300~305 重定向 400~499 400~415 客户端错误 500~599 500~505 服务器错误 100(continue):说明收到了请求的初始部分,请客户端继续。

数据分析|面试必考——产品日活(DAU)下降,该如何分析

点击上方"蓝字" 关注我们吧! 案例:例如 某APP日活突然下降5%,需要尽快排查一下数据下跌的原因。 这是一道经典的数据分析师面试题,考察的重点不在于从哪些指标去分析,而是面对这样的问题时的分析框架与逻辑思维,这是一个优秀的数据分析师必须具备的能力。针对数据异常类问题,可参考如下分析框架: 1对数据异常原因做出假设,利用数据验证 影响DAU因素较多,对所有维度直接拆解耗时耗力。所以需要结合以往经验及各种信息,对数据异常的原因做出假设,然后对数据从不同维度拆分来验证假设。可能随着之前的假设的验证不断进行新的假设,直到定位原因。 2确认数据真实性 将时间轴拉长(3个月),做同比和环比,看近期异常还是历史异常; 查看与该指标关联的其他指标是否异常; 找数据流相关产品和研发确实数据真实性。 3常见拆分维度 根据以上维度拆分之后,每项数据都需要和历史数据做对比,计算影响系数。 影响系数 今日数据 昨日数据 今日总量 昨日总量 影响系数越大,说明此处为主要原因所在。通过上述维度进行初步拆分,可以大致定位数据异常范围。 4外部原因分析 外部:外部原因分析可以根据PEST(政治、经济、社会、技术)模型进行分析。 5内部原因分析 通过初步分析定位范围之后,需要进行进一步的排查,一般从三个维度来分析:产品、技术、运营;可以和这几个人一起拉一个会讨论一下。同时应注意数据统计口径是否发生变化。 6总结 所以我们整个的分析流程大致为: 先结合以往数据异常进行假设 —— 在一个假设得到验证之后 —— 从不同维度进行拆解,确定异常范围 —— 从产品、运营、技术侧逐一排查,最终找到原因。 以上分析框架不仅局限于DAU波动,对于数据异常类问题也可根据以上模型进行分析。

01-IO模型(BIO、NIO、AIO)

目录 一、IO模型分类1.1 阻塞型 IO1.2 非阻塞型 IO1.3 I/O 多路复用1.4 信号驱动 I/O1.5 异步 I/O1.6 五大 I/O 模型比较 二、BIO、NIO与AIO2.1 BIO2.1.1 传统 BIO2.1.2 伪异步 IO1.3 代码示例 2.2 NIO (New I/O)2.2.1 NIO 简介2.2.2 NIO与BIO的区别(1)Non-blocking(非阻塞)(2)Buffer(缓冲区)(3)Channel (通道)(4)Selector (选择器) 2.2.3 代码示例 2.3 AIO (Asynchronous I/O)2.4. BIO、NIO、AIO适用场景 参考 文章放置于:https://github.com/zgkaii/CS-Study-Notes,欢迎批评指正! 一、IO模型分类 首先明确两个概念:用户空间和内核空间。 操作系统的核心是内核(kernel),它独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证内核的安全,现在的操作系统一般都强制用户进程不能直接操作内核。具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分,一部分为内核空间,另一部分为用户空间。 其实所有的系统资源管理都是在内核空间中完成的。比如读写磁盘文件,分配回收内存,从网络接口读写数据等等。我们的应用程序是无法直接进行这样的操作的。但是我们可以通过内核提供的接口来完成这样的任务。 所以,当我们使用 TCP 发送数据的时候,需要先将数据从用户空间拷贝到内核空间,再由内核操作将数据从内核空间发送出去;当我们使用 TCP 读取数据的时候,数据先在内核空间准备好,再从内核空间拷贝到用户空间供用户进程使用。 客户端 --1.发送请求-> 网关 --2.拷贝-> 内核空间 --3.拷贝-> 用户空间 | 客户端 <--7.响应-- 网关 <--6.拷贝-- 内核空间 <--5.拷贝-- 用户空间(4.用户进程处理数据) 所以,一次 IO 的读取操作分为两个阶段(写入操作类似): 等待内核空间准备数据数据从内核空间拷贝到用户空间 在这基础之上,Unix 把 IO 分成了以下五种 IO 模型:

记录一个Android Studio build.gradle文件很坑的问题

点击build.gradle文件上面的代码,比如 点击 JavaCompile ,无法进入源代码查看,提示 “cannot find declaration to go to” ,直接说就是找不到要转到的声明,产生原因是我修改了.gradle的路径,以至于新的路径Android studio4.1.3环境没有识别到,还是使用了默认位置,但是默认位置的文件此时我是已经删除了的。 android.libraryVariants.all { variant -> JavaCompile javaCompile = variant.javaCompileProvider.get() javaCompile.doLast { String[] args = ["-showWeaveInfo", "-1.5", "-inpath", javaCompile.destinationDir.toString(), "-aspectpath", javaCompile.classpath.asPath, "-d", javaCompile.destinationDir.toString(), "-classpath", javaCompile.classpath.asPath, "-bootclasspath", android.bootClasspath.join( File.pathSeparator)] org.aspectj.bridge.MessageHandler handler = new org.aspectj.bridge.MessageHandler(true) new org.aspectj.tools.ajc.Main().run(args, handler) } } 解决办法:设置GRADLE_USER_HOME的环境变量,路径为自定义的.gradle的路径,之后重启开发环境或者重启电脑

Mybatis使用xml方式配置(三)

相关章节: Mybatis使用xml方式配置 Mybatis使用xml方式配置(二) 官网地址:https://mybatis.org/mybatis-3/zh/configuration.html 这里,我们开始学习官网中的xml配置。MyBatis的配置文件包含了会深深影响 MyBatis行为的设置和属性信息。可配置项有: properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处理器) objectFactory(对象工厂) plugins(插件) environments(环境配置) environment(环境变量) transactionManager(事务管理器) dataSource(数据源) databaseIdProvider(数据库厂商标识) mappers(映射器) 1. properties属性配置 连接数据库的一些属性等可以在外部进行配置,并可以进行动态替换。在mybatis-config.xml文件中,我们可以配置properties属性: <properties resource="org/mybatis/example/config.properties"> <property name="username" value="dev_user"/> <property name="password" value="F2Fa3!33TYyg"/> </properties> 那么,在该文件中就可以使用动态配置的属性值,如: <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> 按照文档,我们在resources文件夹下新建db.properties文件,在其中我们写入: driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username=root password=123456 注意此时的&的转义&amp;就不再需要了,在前面文章中转义是因为配置在xml文件中。 然后,我们在mybatis-config.xml文件中配置properties的文件关联,以及使用: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!--核心配置文件--> <configuration> <properties resource="db.properties"/> <environments default="

layui实现分页查询

layui实现分页查询 一、导入分页插件 <!-- 分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.2.12</version> </dependency> 二、service层 /** * 分页查询 */ List<HouseAdmin> findAllAdminByPage(int pageNum,int pageSize); 三、mapper /** * 查询所有管理员 */ public List<HouseAdmin> selectHouseAdminList(); 三、mapper.xml <resultMap type="HouseAdmin" id="HouseAdminResult"> <result property="admId" column="adm_id" /> <result property="admUser" column="adm_user" /> <result property="admPsw" column="adm_psw" /> <result property="admName" column="adm_name" /> <result property="admSex" column="adm_sex" /> </resultMap> <sql id="selectHouseAdminVo"> select adm_id, adm_user, adm_psw, adm_name, adm_sex from house_admin </sql> <select id="selectHouseAdminList" parameterType="HouseAdmin" resultMap="HouseAdminResult"> <include refid="selectHouseAdminVo"/> <where> <if test="

layui实现请求携带token,解决跨域问题

layui实现请求携带token,解决跨域问题 Access to XMLHttpRequest at 'http://localhost:8001/admin/save' from origin 'http://127.0.0.1:8848' has been blocked by CORS policy: Request header field token is not allowed by Access-Control-Allow-Headers in preflight response. 23:28:32.890 jquery.js:4 POST http://localhost:8001/admin/save net::ERR_FAILED 一,layui请求(ajax)携带token 使用localStorage保存登录成功时后端返回的token localStorage.token = data.token; console.log(data) $.ajax({ type:"post", url: requestUrl+"admin/login", dataType:"json", contentType:"application/json", data: JSON.stringify(data), success: function(data) { console.log(data) if(data.code == 200){ // 保存token localStorage.token = data.token; layer.msg(data.msg, function () { window.location = '../index.html'; }); }else if(data.code != 200){ layer.

k8s运维 pod、node、namespace、pv处于terminating的原因及处理方法

1. 概述 node、pod、ns、pv由于一些原因在生产中处于terminating的状态,常规方法无法删除,一下总结了一些原因以及删除方法 2. node处于Terminating状态原因及处理方法 node节点不可达的情况下,kubectl delete po XXX 仅仅是控制组件标记删除,由于节点不可达,不能通过kubelet通知API该容器已终止,所以该节点未从API收到删除的消息,因此POD一直处于Terminating状态。可通过以下举例方式强制删除: kubectl delete pod/kube-flannel-ds-amd64-kwztb -n kube-system --grace-period=0 --force kubectl delete pod/nginx-ingress-controller-77db54fc46-rdw89 -n ingress-nginx --grace-period=0 --force 注意:pod所引用的资源不可用,例如挂载的nfs不可达,导致pod删除不了,要先使nfs可达后才能删除 3. ns处于terminating状态, 删除方法 NAMESPACE=monitoring kubectl proxy & kubectl get namespace $NAMESPACE -o json | jq '.spec = {"finalizers":[]}' >temp.json curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize 4. pod处于Terminating状态原因 查看报错日志,是因为master与node节点的kubelet之前失联导致的,重新对应节点的kubelet之后,异常pod即可关闭 5. 删除pv kubectl describe pvc PVC_NAME | grep Finalizers kubectl get pv | tail -n+2 | awk '{print $1}' | xargs -I{} kubectl patch pv {} -p '{"

系统分析师

客观题 时间:150分钟类型:选择题 案例题 时间:90分钟类型:简答 论文 时间:120分钟

vue项目中,设置页面局部loading加载效果(element)

直接引用element的loading,默认的是全屏loading,实际中有很多地方不需要全屏loading,只需要某部分loading,如上图 话不多说,直接上代码 封装好的loading.js import Vue from 'vue' // loading框设置局部刷新,且所有请求完成后关闭loading框 let loading let needLoadingRequestCount = 0 // 声明一个对象用于存储请求个数 function startLoading (targetdq) { loading = Vue.prototype.$loading({ lock: true, text: '努力加载中...', background: 'rgba(255,255,255,.4)', target: document.querySelector(targetdq) // 设置加载动画区域 }) } function endLoading () { loading.close() } export function showFullScreenLoading (targetdq) { if (needLoadingRequestCount === 0) { startLoading(targetdq) } needLoadingRequestCount++ } export function hideFullScreenLoading () { if (needLoadingRequestCount <= 0) return needLoadingRequestCount-- if (needLoadingRequestCount === 0) { endLoading() } } export default { showFullScreenLoading, hideFullScreenLoading } 在需要的页面中,import引入这个loading.

AxMath安装和使用

1.安装 云盘链接:https://pan.baidu.com/s/1uKc-WTlHvWcKsKPd9OXyxA 提取码:zdy1 先点击运行外面那个安装程序exe文件,按照指示安装好以后粘贴破解版的exe文件到安装好的文件夹里替换原装的exe文件 2. 在word上安装AxMath插件 打开AxMath,这里有一个设置小齿轮,点开 在Office上创建插件菜单–>确定 打开word就能看到 3. 使用 1.在操作面板上输入公式 这里输入的是勾股定理 2.转换成LaTeX代码 3.在word上插入“行内公式” 4.粘贴LaTeX代码 粘贴好以后就点那个按钮就可以转换成公式 4.转换成word上的公式 点击那个按钮以后就可以转换成公式直接显示在word上了

2021-04-12

PFC6.0中利用柔性膜模拟三轴试验中的橡胶模是可行的 来自文献:Influence of block shape on macroscopic deformation response and meso-fabric evolution of crushed gangue under the triaxial compression

eclipse如何设置编辑器字体大小

eclipse如何设置编辑器字体大小 1.打开eclipse,选择“window”----- “preference” 2.在弹出的窗口中找到“general” 3.在左侧搜索框搜索colors and fonts 修改字体大小

Vue获取url路径

Vue中获取url路径 需要使用window.location.[options] 我们先弹出看一下window.location会显示什么? alert(window.location); /sys-user为当前vue的路径 options属性有如下 属性描述hash从#号开始的RULhost主机名和当前URL的端口hostname当前URL的主机名herf完整的URLpathname当前URL的路径部分port当前URL的端口protocol当前URL协议search从问好(?)开始的URL(查询部分) alert(window.location.hash) alert(window.location.host); alert(window.location.hostname); alert(window.location.href); alert(window.location.pathname); alert(window.location.port); alert(window.location.protocol); alert(window.location.search); 比如: http://localhost:8080/#/test?limitUserName=test&grade=0 像这种路径,取到的就是空值 因为查询字符串search只能在取到“?”后面和“#”之前的内容,如果“#”之前没有“?”search取值为空。

2021 前端校招面试知识点(八股文)整理

1. JavaScript 基本数据类型 (7种)this 的指向 (new, 隐式绑定, 显式绑定)Function 的 call, apply, bind 方法Promise, eventloop, 宏任务和微任务闭包 (概念, 用途, 手写)原型链继承 (extends, 原型链继承, 构造函数继承, 组合继承, 寄生组合继承)深拷贝和浅拷贝事件冒泡/捕获, 事件委托, 阻止冒泡, 哪些事件不能冒泡sort() 的复杂度 2. 浏览器 回流和重绘http 缓存, 协商缓存cookies, sessionStorage, localStorage跨域问题 3. CSS 盒子模型, 怪异盒子float, 清除浮动垂直居中的方法flow, absolute, relative, stickyflex样式优先级 4. HTML 块元素, 行内元素语义化标签: header, section 等异步加载JS文件: defer 和 async 5. Vue 响应式原理 (Vue2 和 Vue3)生命周期, 父子生命周期的顺序组件通信: props, $emit 等vuex: action 和 mutationdiff 原理v-if 和 v-showdata 为什么是一个函数computed 和 watchmixin mixin 的缺陷异步组件, keep-alive路由, history模式 6.

ubuntu里面webots报错:cannot open shared object file: No such file or directory

ubuntu里面webots报错:cannot open shared object file: No such file or directory 问题描述 INFO: ros: Starting controller: /usr/local/webots/projects/default/controllers/ros/ros /usr/local/webots/projects/default/controllers/ros/ros: error while loading shared libraries: libroscpp.so: cannot open shared object file: No such file or directory WARNING: ‘ros’ controller exited with status: 127. 解决方法 我们需要从终端使用命令行的形式打开webots,不能点击webots软件图标来打开,然后从webots里面加载模型就没有问题了。 1、首先要在终端数输入roscore启动 roscore 2、然后打开新终端输入软件名打开webots软件 webots 3、问题解决 具体神马原因我也不清楚,无意间发现这样就可以把问题解决了 如果可以帮到你,可以点个赞肯定一下。

eclipse怎么切换工作空间

1.进行点击Eclipse编辑代码的窗口界面中,进行点击菜单中file的选项。 2.弹出了下拉菜单中进行选择为“switch workspace”的选项。 3.弹出了下一级菜单中进行选择为other的选项。 4.然后就会弹出了eclipse launcher的选项窗口,进行点击browse的选项。 5.在已有路径用进行选择为不同路径中。点击ok的选项。

错误 LNK1181 无法打开输入文件“opencv_worldXXX.dll“ 解决办法

在进行VS+Opencv项目时,碰到一个小问题,就是编译过程中提示错误 LNK1181 无法打开输入文件“opencv_worldXXX.dll" . 尝试将相应的dll文件放入system32文件夹方法无果。 1.挨个配置检查,最后在附加依赖项中找到,在这里发现,该文件作为继承的值存在,但在此处无法进行修改删除。 2.在属性管理器中 点击.user文件进入配置 链接器->输入->附加依赖项在这里可以更改继承的项.将找不到的.dll文件名删掉 3.删掉之后,回到解决方案资源管理器视图,检查附加依赖项.此时.dll文件已经没了.点击生成解决方案 4.成功 造成这种情况的原因: 新手,可能是之前在进行项目配置时输入错误,将.dll文件当做.lib文件添加了进去。 这种错误挺白痴的,但是如果不仔细检查,确实很难发现这种低级错误 往往也就是这种低级错误会影响整个项目的进度,所以把这个错误记录下来,警醒自己。

Latex引用引理出现??的解决方法

撰写论文时需要引用文章前面所写的引理/定理 这里我遇到了一个问题 \newtheorem{Lemma}{引理}[section] \begin{Lemma}\label{doc} (1)。。。 (2)。。。 (3)。。。 \end{Lemma} 引用的时候要用\ref ,\cite是不行的,且第一次使用 引用定理\ref{doc} 的时候会输出 引用定理 ?? 的结果,多编译一次就好了,每次修改label括号中的名字后都需要多编译两次才能去掉问号。 注:注意使用头文件 \usepackage{hyperref} \hypersetup{hypertex=true, colorlinks=true, linkcolor=blue, anchorcolor=blue, citecolor=blue}%用于公式引用

PYTHON : 二进制 、 八进制 、十六进制的转换和输出

PYTHON : 二进制 、 八进制 、十六进制的转换和输出 十进制转换成其他进制 保存为文本串 二进制 bIn()八进制 oct()十六进制 hex() 不输出前缀 使用format函数 如果不想输出进制前面的 前缀符号 , 这时我们就要使用format函数 在这里我们要注意 , 二进制和八进制 的再format里的 符号是‘b’,‘o’ 而十六进制format 里的符号就不再是‘h’ 而是**‘x’**。 当然如果是要输入的是负数,输出结果前也是会返回一个负号的。 如果要产生一个没有前缀 ,并且想增加指示最大的值 x = -2546 format(2**32 + x,'b') 其他 进制转换成十进制 其他不同的进制转换成十进制 ,我们就可以简单的使用int()函数 介绍一下int()函数 int(x,base=10) 在int()中的 base 表示进制数,默认为十进制 如果是带base的话 ,我们输入的数就要以字符串的形式进行输入 例如 int('12',16) int('oxe',16) 顺便讲一下 python中字符和ASCll码是如何转换的 字符转换成ASCll n = ord('A') ASCll转换成字符 n = chr(69)

第七届蓝桥杯省赛(四平方和)---哈希

四平方和 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多4个正整数的平方和。 如果把0包括进去,就正好可以表示为4个数的平方和。 比如: 5 = 0^2 + 0^2 + 1^2 + 2^2 7 = 1^2 + 1^2 + 1^2 + 2^2 (^符号表示乘方的意思) 对于一个给定的正整数,可能存在多种平方和的表示法。 要求你对4个数排序: 0 <= a <= b <= c <= d 并对所有的可能表示法按 a,b,c,d 为联合主键升序排列,最后输出第一个表示法 程序输入为一个正整数N (N<5000000) 要求输出4个非负整数,按从小到大排序,中间用空格分开 例如,输入: 5 则程序应该输出: 0 0 1 2 再例如,输入: 12 则程序应该输出: 0 2 2 2 再例如,输入: 773535 则程序应该输出: 1 1 267 838 题解: 首先明白题目要我们输出的是第一个表示法,并且要按照升序排列(0要带上)。 所以最直观来看的方法便是四层for循环遍历寻找符合的答案。 不过我们可以对其进行优化,首先是使用三层for循环进行解答。因为我们的目标是四个数各自的平方相加为n,既然如此我们不妨只利用三层循环找出三个数,第四个数我们可以由n减去前面三个数各自的平方再开方得到,这样的话我们只用判断这个数是否为整数即可。 并且我们可以先创建一个哈希表来简单的判断一下什么可以符合题意什么不符合题意来删去一部分不用进行判断的元素。 需要注意的是由于我们i,j,k分别为第一层,第二层,第三层循环,因此若能出现小的数,其必会先出现,即四个数中最小的数必然是在i先出现,第二小的在j出现,其余同理,即我们直接将i,j,k,c输出即可,其本来便一定为按照从小到大排列的。并且由于我们只要出现的第一种,所以后面i,j,k大小反转的情况也不会出现。即若在1,3,4,5停止了,后面本应会出现的5,4,3,1到达不了了。因为会先出现第一种的情况。 所以j,k循环中起点可以为j = i,k = j。

linux 解、打war包,jar 命令详解

打包命令(带目录) jar -cvfM tast.war ./tast 解释:tast.war 要打包的文件名字,可以自己定义 ./tast 文件存放目录 解包命令 jar -xvf tast.war 解释同上

Mysql基本数据类型

Schema与数据类型优化 1选择优化的数据类型 1.1更小的通常更好 选择你认为不会超过范围的最小类型 1.2简单就好 整型比字符操作代价更低,因为字符型的校对规则比整型比较更复杂,一个是使用mysql内建的类型而不是字符串存储日期和时间,另外一个是使用整型存储IP地址 1.3尽量避免NULL 可为NULL的列使得索引、索引统计、和值比较更为复杂。可为NULL的列会使用更多的存储空间,在MYsql例也需要特俗存储 总结: 在为列选择数据类型时,第一步需要确定合适大类型,数字、字符串、时间,这通常标胶简单 2、整数类型 整数 TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT 8,16,24,32,64 整数类型为TINYINT UNSIgned,表示不允许为负值,这使得正数的上限提升一倍,有符号和无符号,使用相同的存储空间,具有相同的性能 实数 FLOAT DOUBLE DECIMAL,浮点类型在存储同样范围值的时候,通常比DECIMAL使用更少的空间 因此需要额外的空间和时间开销,因此尽量只在对小数进行精确计算时,才使用DECIMAL,但在数据量较大时,应当使用BIGINT,将小数乘以一百万,,可以同时避免浮点存储计算 字符串类型 VARCHAR 存储可变长字符串,比定长字符串更节省空间,VARCHAR需要1-2字节记录字符串的长度,VARCHAR节省了存储空间,对性能有帮助,但是由于行是变长的,所以update时,可能使行变得比原来更长,下列情况使用VARCHAR是合适的,字符串列的最大长度比平均长度大很多,列的更新很少,所以碎片不是问题。 CHAR MYSQL总是根据分配的字符串长度分配足够的空间,当存储为char时,会删除所有的末尾空格,CHAR适合存储所有很短的字符串,或者所有的字符串都接近一个长度。 BLOB、TEXT 二者都是为了存储很大的数据而设计的字符串的数据类型,分别使用二进制和字符方式存储, 不同的是,BLOB二进制没有排序规则,TEXT有字符集和排序规则,再进行排序时,只能对该字段的最前面的部分字符进行排序 使用枚举代替字符串类型 目前没遇到,不进行学习 日期和时间类型 DATETIME 这个类型保存大范围的值,从1001到9999年,日期和时间封装到格式为YYYYMMDDHHMMSS,与时区无关,使用8个字节的存储空间 TIMESTAMP 1970倒2038年,日期和时间封装到格式为YYYYMMDDHHMMSS,与时区有关,使用4个字节的存储空间,对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于DATETIME,不做任何改变,基本上是原样输入和输出。 关于TIMESTAMP和DATETIME的自动初始化和更新 自动初始化指的是如果对该字段(譬如上例中的hiredate字段)没有显性赋值,则自动设置为当前系统时间。 自动更新指的是如果修改了其它字段,则该字段的值将自动更新为当前系统时间。 范式是符合某一种级别的关系模式的集合。构造数据库必须遵循一定的规则。在关系数据库中,这种规则就是范式。 关系数据库中的关系必须满足一定的要求,即满足不同的范式。大数据生态中,各类强大的查询引擎层出不穷,相对廉价的磁盘和分布式技术,也让数据冗余变得可接受甚至更加方便。 在创建一个数据库的过程中,范化是将其转化为一些表的过程,这种方法可以使从数据库得到的结果更加明确。这样可能使数据库产生重复数据,从而导致创建多余的表。范化是在识别数据库中的数据元素、关系以及定义所需的表和各表中的项目等这些初始工作之后的一个细化的过程。 范式和反范式 1. 第一范式 1NF是对属性的原子性,要求属性具有原子性,即列不可再分解; 如学生(学号,姓名,性别,出生年月日) 2. 第二范式 2NF是对记录的惟一性,要求记录有惟一标识,即实体的惟一性,即不存在部分依赖; 简单来说就是拆表,以人为粒度做一张明细表,以课程号为粒度做一张维度表,两表关联使用,消除了数据冗余 表:学号、课程号、姓名、学分; 这个表明显说明了两个事务:学生信息, 课程信息;由于非主键字段必须依赖主键,这里学分依赖课程号,姓名依赖与学号,所以不符合二范式。 可能会存在问题: 数据冗余:每条记录都含有相同信息; 删除异常:删除所有学生成绩,就把课程信息全删除了; 插入异常:学生未选课,无法记录进数据库; 更新异常:调整课程学分,所有行都调整。 正确做法: 学生:Student(学号, 姓名); 课程:Course(课程号, 学分); 选课关系:StudentCourse(学号, 课程号, 成绩)。 三、第三范式 3NF是对字段的冗余性,要求任何字段不能由其他字段派生出来,它要求字段没有冗余,即不存在传递依赖;

JDBC基础

//1.注册安装驱动 Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/myemployees"; String user="root"; String passworld="123456"; //2.连接数据库 Connection con = DriverManager.getConnection(url,user,passworld); if (con != null){ System.out.println("数据库登录成功..."); }else { System.out.println("数据库登录失败..."); } String sql="delete from employees where employee_id=206;"; String sql1="SELECT * FROM `jobs`; "; //3.获取发送SQL的对象 Statement statement=con.createStatement(); //DML语句返回int类型 int result=statement.executeUpdate(sql); if (result ==1 ){ System.out.println("执行成功..."); }else { System.out.println("执行失败..."); } //DQL语句返回结果数据集 ResultSet rs= statement.executeQuery(sql1); while (rs.next()){ String job_id=rs.getString(1); String job_title=rs.getString(2); String min_salary=rs.getString(3); String max_salary=rs.getString(4); System.out.println(job_id+"\t"+job_title+"\t"+min_salary+"\t"+max_salary); } //释放资源。 rs.close(); statement.close(); con.close(); #常见错误 java.

oracle wait_time -1,个人对于v$session_wait中的WAIT_TIME,SECONDS_IN_WAIT,STATE关系的一点理解...

首先意识到一点很重要,那就是oracle会话(进程)它不仅要waiting,更要working.[@more@] 首先意识到一点很重要,那就是oracle会话(进程)它不仅要waiting,更要working.其实这就是一层窗户纸,说出来谁都明白,但之前我好象就没有意识到这一点,所以对这3个字段之间的关系似乎一直都无法理解。 从操作系统的角度来讲,oracle进程等待资源可用,等待先决动作完成,等待新的工作去做,都会使它处于被阻塞的状态;当阻塞态解除的时候,它变为可运行状态,等待被调度进程调度占有CPU;最终它被调度占有CPU,从而执行它的动作。 oracle的等待事件针对的就是被阻塞态(当然也许是它的一个很大的一个子集,但不是全集),也就是说这时会话在waiting,如果这个时候你查询v$session_wait,STATE=WAITING,SECONDS_IN_WAIT表示已经等待的时间(误差是3秒),WAIT_TIME可以不予关注(8i中这时这个值一定就是0,但9i开始不一定就是0了,所以STATE=WAITING与WAIT_TIME=0不一定就存在着对应关系)。 但如果你查询v$session_wait时,对应的进程正处于可运行态,或者正占有CPU(比如正进行LIO,HASH运算等),也就是说这时会话在working,这时v$session_wait会怎样表现这种情况呢?在v$session_wait中没有对应行数据?不!有数据,但数据是最近的上一次等待的数据(这个等待已经结束,但下一次等待还没有到来),那如何与正在等待区分呢?通过STATE字段!这种情况下STATE是除WAITING之外的3种选择值: WAITED UNKNOWN TIME :这时WAIT_TIME=-2,表示TIMED_STATISTICS=FALSE,oracle无法确定等待时间 WAITED SHORT TIME :这时WAIT_TIME=-1,表示最近的上一次等待的时间少于1cs,SECONDS_IN_WAIT表示自最近的上一次等待开始已经经历的时间(误差是3秒) WAITED KNOWN TIME :表示最近的上一次等待的时间>=1cs,具体时间由WAIT_TIME(单位是cs)决定,SECONDS_IN_WAIT表示自最近的上一次等待开始已经经历的时间(误差是3秒) 这时也可以从OS级查看进程状态,也可以从v$sesstat,v$sess_io等会话统计信息处查看会话是否正在处理数据,比如LIO是否持续增大,会话的CPU时间是否持续增大等. 实验代码如下: SA调用的脚本代码(instruct.txt): select sid from v$mystat where rownum=1; alter session set session_cached_cursors=100; select name,value from v$parameter where name='session_cached_cursors'; select to_char(sysdate,'hh24:mi:ss') time from dual; declare v_num number(1); begin dbms_lock.sleep(300); for i in 1..200000000 loop select 1 into v_num from dual; end loop; end; / SA调用如下: SQL> @h:instruct.txt; SID 14 Session altered NAME VALUE

【H5移动端】用你的手机去访问电脑上的本地html文件(亲测有效!!前端小白福音)

文章目录 网络环境http协议服务关闭指定端口的防火墙手机访问IOS调试工具 废话不多说,直接开整! 网络环境 首先你的手机要和电脑是在同一个局域网,例如手机和电脑连接同一个wifi,此次举例我是笔记本电脑连接我的手机热点,也是同属一个局域网下。 http协议服务 然后我们需要在电脑安装个http协议服务,就用http-server,我们通过cmd用npm的下载安装方式(如果是第一次见npm的小白,需要安装node环境哦,去百度安装一下) npm install http-server -g 注意:然后通过cmd进入到你放html文件的文件夹内,通过http-server指令开启服务,cmd就会提示: 例如我的,第一个就是你手机可以访问的内网地址,第二个是你电脑的回环地址。 PS:按快捷键CTRL+C可以关闭服务 关闭指定端口的防火墙 别急啊,现在你的手机还是访问不了。打开你的防火墙设置–高级设置 新建个入站规则: 这里开放和http-server服务里一样的端口,例如我的是8080 名字随便取: 同样的操作,给出站的创建一个: 这样,8080端口就被完全打开了。 手机访问 好了,手机怎么访问,先看你的文件夹,例如我的啊。 当我在手机浏览器输入http-server服务给我开的172.20.10.4:8080后,默认访问的是index.html文件,如果你想访问其他文件,例如css效果测试,应该这样172.20.10.4:8080/css效果测试,就可以访问了。 每次修改完html文件后,手机浏览器页面要刷新一下才会更新哦。 IOS调试工具 在知乎发现个app调试工具,不过好像目前只有ios版的,在app store搜DebugAnywhere,下载。 打开,输入网址后点击debug: 目前版本好像不能刷新后更新。 如果成功的话请给个赞呀,谢谢!

更新后改写m3u8文件 钉钉回放视频下载

文章目录 前言一、m3u8文件的修改方式二、下载步骤1.下载m3u8文件2.修改数据 后记 前言 今天下载钉钉群的网课,发现以往使用的m3u8下载方式没法正常下载了,经过观察发现是钉钉对m3u8文件进行了改写,导致正常的下载器直接下载出错。 下载m3u8文件后进行编辑可使其符合下载格式。 需要的软件:Fiddler或Charles等抓包软件、m3u8下载器、支持正则表达式替换的文本编辑器 一、m3u8文件的修改方式 经过查找,阿里文档中有提到如何改写文件,链接如下 M3U8标准加密改写 二、下载步骤 1.下载m3u8文件 用抓包软件找到m3u8文件,复制其内容粘贴到本地的文档中。 注意保留原m3u8文件的url链接。 2.修改数据 m3u8文件内容如下: #EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXT-X-TARGETDURATION:34 #EXTINF:32.000, bffb7015-4493-4746-ab79-aa775cef081a/1.ts?auth_key=1618919458-0-0-8afda3452a5da02cc7c08b8c1d28016e #EXTINF:32.000, bffb7015-4493-4745-ab79-aa775cef081a/2.ts?auth_key=1618919458-0-0-467ee08df8e993eab57556c642639f7f #EXTINF:32.000, bffb7015-4493-4744-ab79-aa775cef081a/3.ts?auth_key=1618919458-0-0-541acd9e2427f4a566ae7d805a3d4ea8 #EXT-X-ENDLIST 而url链接为: https://aliliving-pre.alicdn.com/live_hp/bffb7015-4493-4746-ab79-aa775cef080a_merge.m3u8?app_type=win&auth_key=1618919458-0-0-d3c65539bc1d0fdb46c9628347a92678&cid=458038508a9e019409695952cdd64481&token=3245ad693c070196dd5d99a695fd26efXp2ObViFILefEDrDg2gG70icBpXEup5S_-19MKfwXV9cdSreaNwnOL_qa7jwxDmxpkU4swvYPd04mjNVTJAbeeoIM_JTGDL1PEnA_UHVzj4=&token2=6e39f5b39bfcad0b01b1a53a28557b904qsIRDl5rOEFTTtEK-kbbXkX5oZ4tVyCxgRN4G863_h-ahkRipxgWzd3LwFQXcjnAq8KxiH9oJRBn2R3s6loovbysIigaREwQ9UuMzx6CC4&version=6.0.3-Release.3030387 这里需要修改两个地方,一个是ts文件的相对地址改为绝对地址,一个是去掉?及后面的多余内容。其中ts文件的完整url是: https://aliliving-pre.alicdn.com/live_hp/bffb7015-4493-4746-ab79-aa775cef081a/1.ts 所以只要使用替换修改 bffb7015 为 https://aliliving-pre.alicdn.com/live_hp/bffb7015 其中的开头url来自之前保存的url链接。 再用正则表达式匹配后面的auth_key内容并删除即可。 使用到的正则表达式如下 \?auth_key=1618919458-0-0-................................. 一共有32个"."用于匹配后面的随机key 完成修改的m3u8文件如下: #EXTM3U #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXT-X-TARGETDURATION:34 #EXTINF:32.000, https://aliliving-pre.alicdn.com/live_hp/bffb7015-4493-4746-ab79-aa775cef081a/1.ts #EXTINF:32.000, https://aliliving-pre.alicdn.com/live_hp/bffb7015-4493-4745-ab79-aa775cef081a/2.ts #EXTINF:32.000, https://aliliving-pre.alicdn.com/live_hp/bffb7015-4493-4744-ab79-aa775cef081a/3.ts #EXT-X-ENDLIST 文档改后缀名为.m3u8后就可以直接在下载器中下载了。 后记 不会下载m3u8文件和缺少软件可以看这个链接。 Fiddler 抓包下载 M3U8 视频.

Mac 每次都要执行source ~/.bash_profile 后,配置的环境变量才生效(maven配置重启终端不生效)

问题:自己在 ~/.bash_profile 中配置环境变量, 可是每次重启终端后配置不生效.需要重新执行 : $source ~/.bash_profile后,才会生效。原因:自己是在bash中配置的环境变量,而当前系统是使用的是shell 查看当前使用的shell,终端输入:echo $SHELL 输出是/bin/zsh,说明使用的是zsh,就会出现这个问题,如果是/bin/bash 就没有这个问题解决办法:在.zshrc文件加中添加source ~/.bash_profile,方法如下 进入主目录 cd ~显示隐藏文件,找到.zshrc文件 ls -a(如果没有可以直接创建)编辑文件 vi .zshrc按i进入编辑模式,加入source ~/.bash_profile后,esc,再输入 :wq 保存退出

oracle asm 状态,ASM 规划ASM DISK GROUP、查看asm 磁盘当前状态等

规划ASM DISK GROUP、查看asm 磁盘当前状态、mount or dismount 磁盘组、检查磁盘组 metadata 的内部一致性 规划ASM DISK GROUP: 1. 每个磁盘组里的磁盘应该大小、性能、新旧等一致,不能有太大差距 2. 对database files 和 fast recovery area 分别创建不同的diskgroup。 一般来说我们也可以把备份文件存放到FRA里。 所以Oracle 建议我们不要创建太多的diskgroup,2组就够了,一组DATA,一组FRA. ORACLE ASM 在磁盘组,磁盘和文件的个数限制如下: (1)最多63个disk groups (2)最多10000个ASM disks (3)每个disk group里最多1百万个文件。 非Exadata 存储的情况下,ASM 存储大小限制: (若是exadata,则容量*2倍) (1)支持的每个ASM disk 最大容量是2 TB。 (2)整个ASM存储系统最大支持的空间是20 PB。 查看当前asm磁盘状态信息 (grid用户执行) 1. --查看有多少asm磁盘 node1-> kfod disk=all 2. --查看asm磁盘组 node1-> kfod op=groups 3. 查看磁盘与磁盘组的对应关系 node1-> kfod ds=true di=all mount or dismount 磁盘组 注意: 当我们dismount 一个disk

浏览器环境和node环境下的事件循环

前提:浏览器中的事件循环(Event Loop)和node环境下的事件循环表现是不同的。因为运行和执行是两个概念,不同的环境造就不同的人生。 一、浏览器中的 Event Loop 1、核心概念 事件循环中的异步队列有两种:macro(宏任务)队列和 micro(微任务)队列。宏任务队列可以有多个,微任务队列只有一个。 (1)常见的 macro-task 比如:setTimeout、setInterval、 setImmediate、script(整体代码)、 I/O 操作、UI 渲染等。 (2)常见的 micro-task 比如: process.nextTick、new Promise().then(回调)、MutationObserver(html5 新特性) 等。 2、过程图 (1)一开始执行栈空,我们可以把执行栈认为是一个存储函数调用的栈结构,遵循先进后出的原则。micro 队列空,macro 队列里有且只有一个 script 脚本(整体代码)。 (2)全局上下文(script 标签)被推入执行栈,同步代码执行。在执行的过程中,会判断是同步任务还是异步任务,通过对一些接口的调用,可以产生新的 macro-task 与 micro-task,它们会分别被推入各自的任务队列里。同步代码执行完了,script 脚本会被移出 macro 队列,这个过程本质上是队列的 macro-task 的执行和出队的过程。 (3)上一步我们出队的是一个 macro-task,这一步我们处理的是 micro-task。但需要注意的是:当 macro-task 出队时,任务是一个一个执行的;而 micro-task 出队时,任务是一队一队执行的。因此,我们处理 micro 队列这一步,会逐个执行队列中的任务并把它出队,直到队列被清空。 (4)JS引擎线程挂起,GUI线程执行渲染,执行渲染操作,更新界面 (5)检查是否存在 Web worker 任务,如果有,则对其进行处理 (6)上述过程循环往复,直到两个队列都清空 所以,事件循环的过程归纳为: 当某个宏任务执行完后(首次执行的主代码块或者任务队列中的回调函数),会查看是否有微任务队列。如果有,先执行微任务队列中的所有任务,如果没有,JS引擎线程挂起,GUI线程执行渲染,GUI线程渲染完毕后挂起,JS引擎线程会读取宏任务队列中下一个排在最前的任务,执行宏任务的过程中,遇到微任务,依次加入微任务队列。栈空后,再次读取微任务队列里的任务,依次类推。 3、示例 分析: (1)一开始执行栈的同步任务(整体script代码块属于宏任务)执行完毕,会去查看是否有微任务队列,上题中存在then(有且只有一个),然后执行微任务队列中的所有任务输出 Promise1,同时会生成一个宏任务 setTimeout2,放到宏任务队列。 (2)微任务队列所有微任务执行完后,然后去查看宏任务队列,宏任务 setTimeout1 在 setTimeout2 之前,宏任务队列有两个宏任务,setTimeout1和setTimeout2,先执行宏任务 setTimeout1,输出 setTimeout1 (3)在执行宏任务 setTimeout1 时会生成微任务 Promise2 ,放入微任务队列中,接着先去清空微任务队列中的所有任务,输出 Promise2

dubbo整合nacos

一,dubbo-nacos-common 描述:公共模块 1.依赖 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> <version>1.18.18</version> </dependency> 2.接口 public interface OrderService { void createOrder(Integer uid,Integer skuid,Integer skunum); } 二,dubbo-nacos-provider 描述:服务提供者 1.依赖 <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <dependency> <groupId>com.yhd</groupId> <artifactId>dubbo-nacos-common</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.nacos</groupId> <artifactId>nacos-client</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-registry-nacos</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>org.apache.dubbo</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>2.7.8</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> 2.配置文件 server: port: 8001 spring: application: name: service-prod dubbo: # 配置服务信息 application: name: service-prod # 禁用QOS同一台机器可能会有端口冲突现象 qos-enable: false qos-accept-foreign-ip: false # 配置注册中心 registry: address: nacos://localhost:8848 # 设置协议-协议由提供方指定消费方被动接受 protocol: name: dubbo port: 20880 3.

轮廓文本阴影(outlined text shadow with fallback)

轮廓文本阴影 (outlined text shadow with fallback) 示例HTMLCSS 更多有趣示例 尽在知屋安砖社区 示例 HTML <h1>知屋安砖</h1> CSS body { font-family: system-ui, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0; } h1 { font-size: calc( 1em + 30vmin ); font-weight: 900; color: tomato; --x-offset: -0.0625em; --y-offset: 0.0625em; --stroke: 0.025em; --background-color: white; --stroke-color: lightblue; text-shadow: var(--x-offset) var(--y-offset) 0px var(--background-color), calc( var(--x-offset) - var(--stroke) ) calc( var(--y-offset) + var(--stroke) ) 0px var(--stroke-color); } /* for browsers that support spread, added in https://drafts.

使用Madagascar实现三维地震数据体的动态展示

#!/bin/sh plot() { segyFile=3D.segy segyDir=. imgDir=. title=3D ny= number Of Inline nx= number Of Crossline crl0= the first Crossline to show inl0= the first Inline to show gain=98 inlshow= the default inline to show movinl= how many inline to show ((movfrom=$movinl-$inl0)) ((windowf3=$inlshow-$inl0)) sfsegyread verb=1 endian=y tape=$segyFile | sfwindow f1=0 f2=0 f3=0 n1=trace length\ | sfput n2=$ny n3=$nx label1=Sample label2=Crossline label3=Inline title=""\ d1=1 d2=1 d3=1 unit1="" unit2="" unit3="" o1=0 o2=${crl0} o3=${inl0} \ | sfpow pow1=1 >$title.

使用Madagascar绘制剖面图

1.查看要绘制的segy文件的总道数,以确定绘制范围 sfsegyread < 文件名.segy endian=1 | sfin n1 : 每一道的采样点数 n2 : 总道数 2.快速预览从第a道起的b道剖面(注意:a+b<n2) sfsegyread < 文件名.segy endian=1 | sfput d1=0.01 unit1=km label1=Depth title= 标题 |sfpow powl=0 | sfwindow f2=a n2=b | sfgrey pclip=97 | sfpen & 如果想加色标,可以这么写: sfsegyread < 文件名.segy endian=1 | sfput d1=0.01 unit1=km label1=Depth title=标题 |sfpow powl=0 | sfwindow f2=a n2=b | sfgrey pclip=97 scalebar=y | sfpen & 3.将剖面图转为vpl文件 sfsegyread < 文件名.segy endian=1 | sfput d1=0.01 unit1=km label1=Depth title=标题 |sfpow powl=1 | sfwindow f2=a n2=b | sfgrey pclip=97 > 文件名.

matlab函数之reshape()

reshape - 重构数组 功能: B = reshape(A, sz); 按矢量sz定义的维度(包括行数 列数 维数)重构矩阵A来得到矩阵B 实现原理 先将矩阵A先排列成一列(结果感受就是按列优先排列),再按照矢量sz定义大小的行数切割 结构及实例 A = rand(4,5) 0.3537 0.6694 0.6692 0.3119 0.8322 0.6230 0.1045 0.5429 0.9518 0.3994 0.6557 0.4872 0.5621 0.9596 0.4807 0.1019 0.2323 0.9449 0.1287 0.2518 1. B = reshape(A, m, n) 返回m * n的矩阵 (m:行数,n:列数) B = reshape(A, 10, 2) 0.3537 0.5621 0.6230 0.9449 0.6557 0.3119 0.1019 0.9518 0.6694 0.9596 0.1045 0.1287 0.4872 0.8322 0.2323 0.3994 0.6692 0.

Logisim新手入门实验

索引 LED计数电路 5输入按键编码器 七段数码管显示驱动 一.LED计数电路 1.新建项目“LED计数电路” 2.绘制电路图 3.封装电路 4.再新建一个测试电路项目“LED计数测试电路”,加按钮,LED灯并连接。效果如下图 二.5输入按键编码器 1.新建项目“5输入按键编码器” 2.通过excel真值表自动生成表达式 3.封装电路 4.再将封装设计好的电路移动到“LED计数测试电路”中,连接,实现计数效果。 三.七段数码管显示驱动 1.新建项目“七段数码管显示驱动” 2.通过输入真值表自动生成表达式 3.封装电路 4.再新建项目“7段数码管显示驱动测试”,将封装好的电路移动到项目中,通过时钟来测试 5.再将封装设计好的电路移动到“LED计数测试电路”中,连接,实现计数效果。 总结:这个实验其实就是给新手熟悉logisim操作的!

斐波那契数列(II)(使用循环而非递归)

斐波那契数列(II) 题目答案 题目 答案 #include<iostream> using namespace std; int main() { int n; cin>>n; int result,tmp,f1=1,f2=1; if(n==1||n==2) tmp=1; else { for(int i=3;i<=n;i++) { tmp=(f1+f2)%998244353; f1=f2; f2=tmp; } result=tmp; } cout<<tmp; }

无法启动此程序,因为计算机中丢失api-ms-win-crt-runtime-|1-1-0.dll

安装python时,出现启动程序报错,最大的可能是该文件损坏了。 然后我是用vc_redist.x64工具包修复依旧报错,多次尝试后,终于明白了原因。 这是因为损坏的文件没有被删除,导致工具包修复依旧报错。 现在C盘中搜索到该文件(可能由于之前未删除就修复导致存在多个api-ms-win-crt-runtime-|1-1-0.dll文件),直接删除。然后再用vc_redist.x64进行修复。即可 之后重启电脑,解决。 就这么个玩意儿,怎么好意思让大家去资源社区下载,放网站吧。可以直接下载该工具包: https://www.microsoft.com/en-us/download/details.aspx?id=48145. 搞定!!

element表格组件,内容自动滚动(并可设置)

最近项目有个需求,两个表格,定时自动切换,而且每个表格内容自动滚动,还要加个设置功能,可以设置两个表格之前自动切换的间隔时间,和滚动速度,大概效果如下 话不多说,直接上代码 主要的功能方法 autoRoll()内容自动滚动的实现 autoChange()两个表格之间自动切换的实现 <!-- * @Description: * @Author: lzp * @Date: 2021-04-06 15:58:13 * @LastEditTime: 2021-04-08 14:30:46 * @LastEditors: xxx --> <template> <div class="main"> <div class="setbox"> <el-row :gutter="15"> <el-form ref="elForm" :model="formData" size="small" label-width="px" label-position="left"> <el-col :span="23"> <el-form-item label-width="110px" label="数据刷新(秒)"> <el-input-number v-model="formData.refreshTime" placeholder="单位/s" :step="1" :min="0"></el-input-number> </el-form-item> </el-col> <el-col :span="24"> <el-form-item label-width="110px" label="滚动时间)"> <el-input-number v-model="formData.rollTime" placeholder="单位/10ms" :step="1" :min="0"></el-input-number> </el-form-item> </el-col> <el-col :span="24"> <el-form-item label-width="110px" label="滚动间距"> <el-input-number v-model="formData.rollPx" placeholder="单位/px" :step="1" :min="

大连海事大学计算机20考研(计算机应用 技术)专硕410+经验贴

大连海事大学计算机20考研(计算机应用 技术)专硕410+经验贴 有什么事,有资料的!有资料的!有问题可以直接问我!终于!我也是学姐学长了,大连海事我来啦!一直没有写经验贴是因为觉得自己还不是准研究生,昨天录取名单公布!上岸啦,今年是网络复试,所以网络复试的经验对下一届的貌似没有什么用处,你们就看看初试我的时间分配,还有使用的方法吧! 首先我的时间是这样分配的,3到6月份我就是简单看了一遍数学(数学我一起听的张宇粑粑的课,老老实实做18讲就可以,线代跟着李永乐爷爷就可以,1000题),英语就是过了一遍考虫的8节词汇课(vivian老师的强烈推荐,声音太治愈了!,去b站找就可以,我听的2019版本的,后来比对2020的好像没啥区别,所以随便找一年就行),专业课没有任何进度,政治没有任何进度,因为最后还有一些实习,暑假回家发现学的线代都忘记了,好气! 重点来了!暑假我是选择回家学习的,时间每天大概是早上6点到晚上10点半,哥哥偷懒,7点起来学习的,所以我每天稍微比他多学了一个小时的英语单词,最后英语比哥哥多了9分,也还可以哈哈哈哈,一会告诉你他背单词的独家秘诀。 时间分配是这样的: 8:00-10:00 张宇粑粑强化课+闭关修炼(只做高数部分)+重复看前一天的笔记。(闭关修炼暑期做了两遍,第一遍跟着张宇讲,不要在书上写答案,第二遍自己找a4重新做,暑期结束之前做完两遍的你,数学好得不得了,还有18讲也要再做一遍哦!) 10:00-12:00 线代强化课-线性代数辅导书(都是李永乐爷爷的,忘记叫什么名字了!) 13:30-15:30 英语 这呢第一遍复习算是,我们是用的一个超级可爱的学姐的方法,把每个阅读都翻译到本子上,开始挑自己不认识的单词,重复背。我是每天翻译一篇阅读理解,不要做答案!到暑期结束,我做到2015吧大概,如果你前期跟着考虫都过一遍词汇课,基本每篇有10-20个不认识的,ps:哥哥就做到2013大概,单词也都没记住,哭! 15:30-5:30 又回数学来了,我就是喜欢做数学,哈哈哈,这时候就是把上午学的东西,自己整理一遍,题不用整理错题本,直接拿题做,数学110+肯定可以。 19:00-10:00 这段时间三个小时,我就开始看809数据结构了,怎么说呢,数据结构是算是好学的,因为海事数据结构题目比较沉稳,yes!买一本天勤就可以+初试材料,根据初试大纲,在书上画出重点,一天一章,我没有看视频,哪里不会我就去b站找一找,暑假中期就可以做往年真题,编程还有证明题我都留下来没有做,等10月才开始的。 10:00-10:30 干哈呢,躺床上用百词斩背25个单词,背完玩会手机,呼呼! 政治没看政治没看,原谅我涛涛,把你忘记了!但是我还是考了75+ 暑期就这么愉快的结束啦!紧接着回学校,可以和哥哥一起学习啦!9月到10月大约是早8点半到10点,时间分配如下: 8:30-10:30 高数,从暑假回来,刚开始不要做真题,你会听到你周围的小伙伴说,真题真简单,压住自己,别做,稳住,我们开始继续重复一遍闭关修炼+18讲,做的过程中,标注出你认为难的,容易做错的题! 10:30-12:00 线代,跟着线代王走,重复做线性代数辅导书,因为2020的线代 二次型是从定义角度出发的那种题型,有网友说是跟张宇8套卷里面的线代题型类似,可惜我最后冲刺没有做,所以有时间的冲刺做一下李林+张宇8套卷。 2:00-4:00 英语,这时候哥哥算是真真正正开始背单词了,嘻嘻,所以想考60-70的可以这按照哥哥的复习思路,直接挑阅读理解里面不认识的单词背,并且找到同义词,形近词,PE单词总结起来,重复背,一直背到12月份,完全没有看什么语法,也没有长难句,,我还是按照暑假的方法继续做到了2018年的真题卷,到9月份末尾我们俩完成的就只有阅读的单词 4:00-6:00 依旧是重复数学,错题,容易错的题,按照趋势来看,同学们一定要加大自己的计算量,真正考试计算量出奇的大! 8:00-10:00 专业课+政治,政治听徐涛的强化课+肖爷爷的那个精讲精练,每天2倍速听听,我还傻乎乎的记笔记,结果没用,啥也记不住,就听听就得了,缓解一下数学带来的压力,按照涛涛视频的顺序学马原啥的就可以。专业课依旧正常学,做真题,找自己不会的,两个人互相问,互相考判断,填空那些知识点。 回去洗漱+百词斩25个单词,呼呼。 10月份开始了,这个阶段,时间大概就7点到10点,10月中旬到11月中旬,我们考研小分队是直接学到11点50,在回寝室。 7:00-8:00 这个时间就是一遍吃面包,一遍看看昨天学习的内容,阅读理解的英语单词,昨天的数学公式,专业课知识等。 8:00-11:00 高等数学 可以开始真题了(我买的张宇的真题,这个随便嘻嘻嘻),前两年真题超级简单,1999的吧,100分的卷子不用掐时间做,随心所欲一点。到150的就要按照时间来,拿个闹钟,自己看看能做完多少,标注错题。 11:00-11:30 这个时间 定外卖,商量一下吃啥 ,是不是太具体了,哈哈哈,放松一下,缓解一下脑袋。 13:00-15:00 英语开始听唐迟的课,直接上唐叔的2010-2020的英语真题课,就够了,这是第一遍做阅读理解,不要在卷子上写答案,我第一遍自己做,大概每篇就错两个,听到2018年,再从头2010的重新做,拿个a4纸,标注日期,第二遍每篇,错一个到2个,也是做到2018年,再从头2010开始做,写卷子上就可以了,这回就错的很少,记住要掌握你错的原因,是方法不对,还是单词不认识。翻译可以做起来了,跟任何一个翻译老师都可以,只听真题的翻译就可以,英语二不需要技巧。还有英语二的新题型,自己做就可以,不需要听视频,也可以做起来了,不用做完形填空!。 15:30-17:30 还是学数学,这回做真题的错题+闭关修炼错题,闭关修炼做3遍以上,你会得到一个满意的分数(ps:汤家凤老师的也超级好,但是我听了:“这可不得了”,我就哈哈笑,影响不太好,而且张宇的题难了一点,就比较贴近真题.)。 19:00-21:00 听涛涛强化,直到肖秀荣爷爷的8+4卷出来,直接做选择,我当时是跟哥哥做完了,互相对答案,11-12月份初我们都没有背大题,我们赌对了,确实不用背。 晚上,就是专业课,开始背证明题还有编程大题,其他的互相都整明白了。 11中旬到12月20日: 这段期间,基本就是真题+心态 高数:真题+李林6卷+李林4卷(挑题做) 英语:就是练字还有作文! 真题+大概考研前一周到两周刘晓燕老师的救命班(这时我们才开始做完形填空,按照她的方法能得4分)+作文(大作文不需要买!随便去小红书或者知乎啥的找,背下来往里面套就可以,小作文我们也是从刘晓燕老师的救命班才开始写,她会说几个万能的句式)!!一定要买答题卡,淘宝就有,练一练自己的字体,哥哥的字简直是超级无敌好看,小小的,但是很清楚,可惜在学校没法上图,我就按照他的学的,贼好!最后两周就好好写字! 专业课:真题就够了,专业课拉不开分,学的特别快,好好学基本130以上,注意一下有一个给你编程的句子,让你写答案的那道题,15分挺拉风,剩下大家都会,我觉得的哈哈。 政治:我跟哥哥就是把肖秀荣爷爷说必背的4套卷,前两套全背下来了,考试的时候全写上就可以,实在不会就抄材料(转换一下说,不能一次不差),最后夸国家,国家多么美好呀!大胆预测啊,今年应该都是疫情吧,致敬守护我们的医护人员!字也同英语,一定要练好看, 以上适用于专硕哦,英语我用的时间真的仅次于数学,可最后考试改了一下阅读答案,改错了,所以千万不要随便改英语答案,保佑大家! 不知道有没有人看下去,这里是复试经验,复试是分为专业课+英语面试+综合面试,今年就只有两场,分别是专业课和综合面试。 专业课是最拉分的,今年是抽题的形式,随便抽题,正常年份只要做好真题+看好书就可以; 综合面试是你进去考场,老师确认你姓名,然后说面试开始,英语问题我准备基本有以下几个: 1 介绍家乡; 2 你为什么想来我们学校; 3.你想学什么专业/研究方向; 4.你大学最喜欢的有哪些课程,特点; 5.介绍一下本科学校; 6.介绍家庭;

Burpsuite教程(五)Burpsuite无法抓包解决办法

文章目录 1.问题描述1.1原因一 未正确配置1.2 原因二 证书无效 2.解决办法2.1 更换抓包工具2.2 Fiddler和Burpsuite联动 3.流量路径 1.问题描述 有时候按照教程配置之后也无法抓包,有哪些原因呢? 1.1原因一 未正确配置 尝试下面教程重新配置 Burpsuite抓包教程 1.2 原因二 证书无效 有的网站对证书做了限制或者黑名单,所以Burpsuite无法抓取 2.解决办法 2.1 更换抓包工具 换成Fiddler: Fiddler抓包教程 有朋友觉得fidder对数据包进行操作不方便,那么可以将burpsuite作为上层代理,把fiddler抓到的流量转到burpsuite上面,然后进行操作就很方便了。方法见下: 2.2 Fiddler和Burpsuite联动 总体配置不变,首先参考下面教程正确配置两个工具 Burpsuite抓包教程 Fiddler抓包教程 然后Fiddler开启网关 最后各个工具代理配置情况 firefox浏览器代理配置: Fiddler代理配置: Fiddler代理网关: Burpsuite代理: 3.流量路径 服务器–>Fiddler–>Burpsuite–>服务器

Kerberos安全认证原理

目录 1、Kerberos是什么 2、主要角色 3、基本概念 4、认证过程 4.1 初始验证 4.2 获取服务票据 4.3 服务验证 5、环境假设 6、局限性 7、相关命令 参考文档: 协议: 协议 主要命令: 主要命令 1、Kerberos是什么 Kerberos是一种一种网络身份验证协议,只包括验证环节,不负责授权。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。 用户只需输入一次身份验证信息,就可凭借此验证获得的票据授予票据(ticket-granting ticket)访问多个接入Kerberos的服务,即SSO(Single Sign On,单点登录)。 在Kerberos认证中,最主要的问题是如何证明“你是你”的问题,如当一个Client去访问Server服务器上的某服务时,Server如何判断Client是否有权限来访问自己主机上的服务,同时保证在这个过程中的通讯内容即使被拦截或篡改也不影响通讯的安全性,这正是Kerberos解决的问题。 2、主要角色 在Kerberos协议中主要是有三个角色的存在: 访问服务的Client提供服务的ServerKDC(Key Distribution Center)密钥分发中心 KDC服务默认会安装在一个域的域控中,而Client和Server为域内的用户或者是服务,如HTTP服务,SQL服务等。KDC服务作为客户端和服务器端信赖的第三方,为其提供初始票据(initial ticket)服务和票据授予票据(ticket-granting ticket)服务,前半部分被称为AS,后半部分被称为TGS: AS: Authentication Server,认证服务,用来验证Client端的身份,验证通过就会给一张TGT(Ticket Granting Ticket)票给Client。TGS: Ticket Granting Server,许可证服务,用来将AS发送给Client的TGT换取访问Server端的票据ST(Service Ticket)。有的地方也称呼ST为TGS Ticket,或者直接叫Ticket。 3、基本概念 Kerberos协议相关角色相关的概念: Principal:安全个体,具有唯一命名的客户端或服务器。命名规则:主名称+实例+领域,如sherlocky/admin@EXAMPLE.COM SS:特定服务的提供端(Service Server),即上述角色分类中的ServerKDC:Key Distribution Center,密钥分发中心由AS和TGS组成 AS:Authentication Server,认证服务器,KDC的一部分。通常会维护一个包含安全个体及其秘钥的数据库,用于身份认证TGS:Ticket Granting Server,许可证服务器,KDC的一部分,根据客户端传来的TGT发放访问对应服务的票据 密钥和票据相关的概念: Session key:会话密钥,指两个安全个体之间使用的临时加密秘钥,其时效性取决于单点登录的会话时间长短Ticket:票据,一条包含客户端标识信息、会话密钥和时间戳的记录,客户端用它来向目标服务器认证自己TGT:Ticket Granting Ticket,票据授予票据,包含客户端ID、客户端网络地址、票据有效期以及client/TGS会话密钥Client本地密钥:用户输入的密码,或者keytab文件中的密码。所有使用用户密钥加密的操作,都是将用户密钥hash后再使用的。 TGT和Ticket的关系:TGT类似于护照,Ticket则是签证,TGT可标识你的身份并允许你获得多个Ticket(签证),每个Ticket对应一个特定的服务,TGT和Ticket同样具有有效期,过期后就需要重新认证。 4、认证过程 Kerberos的认证过程可细分为三个阶段: 初始验证:客户端向KDC中的AS发送用户信息,以请求TGT获取服务票据:客户端拿着之前获得的TGT向KDC中的TGS请求访问某个服务的票据服务验证。客户端拿到票据(Ticket)后再到该服务的提供端验证身份,然后使用建立的加密通道与服务通信。 4.1 初始验证 初始验证的主要目的是客户端向AS请求TGT。 客户端向AS发送鉴权消息Authenticator1,该动作通常发生在用户初次登陆或使用kinit命令时。 Authenticator1的主要内容:用Client本地密钥hash后加密的时间戳、Client ID、网络地址、加密类型等信息(只有时间戳加密!!!)AS检查本地数据库是否存在该用户,若存在则返回如下两条信息。这一步AS会验证 SessionKey-as:AS生成的会话密钥,用于Client和TGS之间通信。SessionKey-as是用用户密钥加密过的,用户密钥存储在AS本地数据库中的。这个信息可以验证Client是否可信,只有可信的Client才能获取到用户密钥解密出SessionKey-as。票据TGT:TGT中包含客户端ID、客户端网络地址、票据有效期和SessionKey-as,并使用TGS的密钥加密。Timestamp:时间戳不加密,这是client在上一步发给AS的时间戳。当客户端上述两条消息,它会: 对于加密的SessionKey-as,客户端会用本地密钥进行解密,拿到SessionKey-as,用来和TGS进行后续的会话。这里就相当于AS对客户端的一次验证,只有真正拥有正确用户密钥的客户端才能有机会与AS进行后续会话。对于加密的TGT,由于是用TGS的密钥加密的,故Client无法对其解密;对于Timestamp:Client会对时间戳进行验证,即和自己发送的时间戳做对比,如果一样,说明AS可以解密出自己密钥加密的信息,是可信的。 需要注意的是,TGT是给TGS看的,Client只用来透传,是看不到TGT的具体内容的。

Java通过反射获取Method方法

1. 创建GFather祖先类,Father父类并且继承GFather类,Son子类并且继承父类。 package reflection.commen; public class GFather { public int g_age = 1; public String g_name = "爷爷"; public GFather(){ } public GFather(int age, String name) { this.g_age = age; this.g_name = name; } public int getG_age() { return g_age; } private void setG_age(int g_age) { this.g_age = g_age; } } package reflection.commen; public class Father extends GFather { private int f_age; public String f_name; public Father(){ } public Father(int father_age, String father_name) { super(); this.