js-cookie二次过期后二次设置失效

js-cookie在vue使用中过期后无法二次设置 vue中使用js-cookie储存token令牌,token过期后点击任何路由跳转登录界面,点击登录后重新获取token,继续使用cookiejs插入token失效,导致其他初始化接口获取不到token值。 问题描述: 在本人开发的vue项目中,使用了统一的接口拦截,接口请求前通过cookie获取token属性,然后插入请求头。 请求拦截代码如下: 之前使用js-cookie设置token值,token设置过期时间用的是expires属性设置,设置为当前时间加2小时,在有一次上午出门后,下午接着做项目时点击界面,跳转到登录界面,点击登录后一直无法跳转路由,经查看是token没有保存,界面初始化失败。注:界面刷新后可以正常储存token值并进行登录 原因分析: 通过追踪js-cookie及自己使用原生js储存token信息最终定位到在js-cookie储存cookie过程中设置过期时间使用了toUTCString,将本地时间改为了国际时间,也就是时区为0 解决方案: 个人猜想是时区问题,导致浏览器的cookie中token值清空,但实际可能在硬盘中没有过期。解决方法个人使用了cookie中的max-age属性,也可以实现cookie失效功能。 就是需要注意cookie.js中的属性比如都为字符串,所以inFifteenMinutes 值最好加个空字符串拼接不然报错,证据如下,会执行split方法,如果不是字符串直接报错 // An highlighted block return Cookies.set(TokenKey, token, { "max-age": inFifteenMinutes }) 相关说明: 目前还不理解为什么储存cookie时过期时间要使用toTUCString改变格式,第一次写博客,如果有误,大佬轻点喷

【踩坑向】虚拟机桥接模式连不上网怎么办?

2021年9月8日 今天踩了个大坑,浪费了半天时间。 公司业务需要我们在物理机上创建若干台虚拟机搭建分布式系统,要求虚拟机网络连接采用桥接模式。然后我就在VMWare Workstation上安装了几台CentOS 7系统的虚拟机,并按照公司给我分配的ip地址设置了网络。 【物理机ip地址: xxx.xxx.xxx.121】 我的ip地址段是121-140,所以第一台安装公司软件的控制中心的虚拟机设置为122。 【虚拟机ip地址:xxx.xxx.xxx.122】 接下来怪事就发生了。重启网络后虚拟机并没有像我预想的一样能ping通外网,甚至连物理机也无法ping通。然后我尝试了修改别的ip、关闭selinux和防火墙甚至是用同事的ip,都无法顺利联网。 后来仔细排查,发现在我的VMWare Workstation软件里没有创建桥接模式的虚拟交换机,需要创建一下。 一般来说桥接模式选择VMnet0。添加完虚拟交换机后把类型改为桥接模式,选择自动桥接。 再试试能不能连上网。 成功 😃

精简版WIN10 LTSB LTSC安装Microsoft Store

为Windows 10 Enterprise LTSB LTSC增加应用商店 适用于Windows 10 Enterprise 2015 / 2016 LTSB LTSC 或 Windows Enterprise 2015 / 2016 LTSB N LTSC 下载地址 要开始安装, 请打包下载后用右键管理员运行 Add-Store.cmd 如果您不想安装App Installer / Purchase App / Xbox,请在运行安装之前删除对应的.appxbundle后缀的文件。但是,如果您计划安装游戏,或带有购买选项的应用,则不要删除。 如果装完之后商店仍然打不开,请先重启试试。如果仍然不行,请以管理员身份打开命令提示符并运行以下命令之后,然后再重启试试。 PowerShell -ExecutionPolicy Unrestricted -Command "& {$manifest = (Get-AppxPackage Microsoft.WindowsStore).InstallLocation + '\AppxManifest.xml' ; Add-AppxPackage -DisableDevelopmentMode -Register $manifest}" 商店修复 Win+R打开运行,输入WSReset.exe回车。 该命令会清空并重置Windows Store商店的所有缓存。 如果出现下载软件失败 做如下设置重启电脑 1、DNS设置 4.2.2.1 4.2.2.2 成功登录上以后恢复默认DNS 2、管理员运行CMD命令 Netsh winsock reset 重启电脑更新下Store即可

phoeinx报错、格式错误

新增数据时: UPSERT INTO “ORDER_DTL” VALUES(‘02602f66-adc7-40d4-8485-76b5632b5b53’,‘已提交’,4070,1,‘4944191’,‘2020-04-25 12:09:16’,‘手机;’); 报错信息: UPSERT INTO "ORDER_DTL" VALUES('02602f66-adc7-40d4-8485-76b5632b5b53','已提交',4070,1,'4944191','2020-04-25 12:09:16','手机;'); Error: ERROR 601 (42P00): Syntax error. Encountered "UPSERT INTO " at line 1, column 1. (state=42P00,code=601) org.apache.phoenix.exception.PhoenixParserException: ERROR 601 (42P00): Syntax error. Encountered "UPSERT INTO " at line 1, column 1. at org.apache.phoenix.exception.PhoenixParserException.newException(PhoenixParserException.java:33) at org.apache.phoenix.parse.SQLParser.parseStatement(SQLParser.java:111) at org.apache.phoenix.jdbc.PhoenixStatement$PhoenixStatementParser.parseStatement(PhoenixStatement.java:1644) at org.apache.phoenix.jdbc.PhoenixStatement.parseStatement(PhoenixStatement.java:1727) at org.apache.phoenix.jdbc.PhoenixStatement.execute(PhoenixStatement.java:1819) at sqlline.Commands.execute(Commands.java:822) at sqlline.Commands.sql(Commands.java:732) at sqlline.SqlLine.dispatch(SqlLine.java:813) at sqlline.SqlLine.begin(SqlLine.java:686) at sqlline.SqlLine.start(SqlLine.java:398) at sqlline.SqlLine.main(SqlLine.java:291) Caused by: NoViableAltException(108@[]) at org.

Parameter的使用

class Attention(nn.Module): """ 层级Attention,汇集某方玩家的轨迹为一个向量 """ def __init__(self): super(Attention,self).__init__() self.w_omega = nn.Parameter(torch.Tensor(32,32)) # hidden_layer self.u_omega = nn.Parameter(torch.Tensor(32,1)) nn.init.uniform_(self.w_omega,-0.1,0.1) nn.init.uniform_(self.u_omega,-0.1,0.1) self.attention = nn.Softmax(dim=0) # 注意我们没有batch维度 def forward(self,x): self.w_omega.data = torch.clamp(self.w_omega,max=-1) u = torch.tanh(torch.matmul(x,self.w_omega)) # k*hidden att = torch.matmul(u,self.u_omega) # k*1,内积 att_score = self.attention(att) # k*1 score_x = x * att_score # k*hidden,broadcast out = torch.sum(score_x,dim=0) # hidden return out,att_score

Failed to set the ‘value‘ property on ‘HTMLInputElement‘...(VUE)

一个神奇的问题:runtime-core.esm-bundler.js?5c40:140 DOMException: Failed to set the ‘value’ property on ‘HTMLInputElement’: This input element accepts a filename, which may only be programmatically set to the empty string… 没改之前代码:<img src="../assets/logo.png" alt="网页logo" /> 改之后代码: `import imageUrl from '../assets/logo.png';` data() { return { imageUrl: imageUrl } }, <img :src="imageUrl" alt="网页logo" /> 我用的vue-cli搭建基础VUE框架,原因貌似是在打包的时候路径会变,所以我们需要导入静态图片! 或许解释不够准确,欢迎评论告诉我原因,抱拳了 > _ < 注意: 在浏览资料的时候发现:谷歌火狐貌似不支持video和audio的自动播放autoplay, 所以当用到这两个标签时加自动播放也可能造成类似问题。

SSH登录太慢(很长时间才提示输入密码)的问题

SSH登录太慢(很长时间才提示输入密码)的问题 SSH 登录太慢可能是 DNS 解析的问题,如果 DNS 的反向解析不正确,sshd 就会等到 DNS 解析超时后才提供 ssh 连接,这样就造成连接时间过长、ssh 客户端等待的情况,一般为10-30秒左右。有个简单的解决办法就是在 sshd 的配置文件(sshd_config)里取消 sshd 的反向 DNS 解析。 解决方法如下: vim /etc/ssh/sshd_config 将 #UseDNS yes改为 UseDNS no #重启sshd systemctl restart sshd

java自定义注解

理解 @interface是注解的关键字,它和java中的class、interface、Enum是同级别的。它可以用于修饰 修饰,类、方法、变量、参数、包 。作用是使得加上了注解的“目标”实现额外的功能。 注解就是一种标志,单独使用注解,就相当于在类、方法、参数和包上加上一个装饰,什么功能也没有,仅仅是一个标志。一般情况下需要通过拦截器、AOP切面这些地方获取注解标志,并实现额外的功能。 元注解 元注解是指由java提供的基础注解类型,一共有4个,分别是@Target、@Retention、@Inherited、@Documented。在自定义注解的时候,需要加上元注解来配置自定义注解的属性。 # @Target用于描述自定义注解的使用范围,该注解可以使用在什么地方 ElementType.TYPE 应用于类、接口(包括注解类型)、枚举 ElementType.FIELD 应用于属性(包括枚举中的常量) ElementType.METHOD 应用于方法 ElementType.PARAMETER 应用于方法的形参 ElementType.CONSTRUCTOR 应用于构造函数 ElementType.LOCAL_VARIABLE 应用于局部变量 ElementType.ANNOTATION_TYPE 应用于注解类型 ElementType.PACKAGE 应用于包 ​ # @Retention 表明该注解的生命周期 RetentionPolicy.SOURCE 编译时被丢弃,不包含在类文件中 RetentionPolicy.CLASS JVM加载时被丢弃,包含在类文件中,默认值 RetentionPolicy.RUNTIME 由JVM 加载,包含在类文件中,在运行时可以被获取到 一般情况下使用RetentionPolicy.RUNTIME ​ # @Inherited:它表示自定义注解是被继承的。如果一个类用上了@Inherited修饰的自定义注解,那么其子类也会继承这个自定义注解 这个用的很少 ​ # @Documented:表明该注解标记的元素可以被Javadoc 或类似的工具文档化 没啥用 注解里面的属性 。。。 SpringAOP 。。。 springAOP+自定义注解实例 自定义注解的定义,如果只定义注解,那么该注解就仅仅只是装饰而没有任何作用 @Retention(RetentionPolicy.RUNTIME)//表明该注解在java运行时也有效 @Target(ElementType.METHOD)//表明改注解只能使用在方法上 public @interface IsRun { } 注解切面处理类 额外的功能由该类实现,这里新增一个校验的功能 @Aspect//spring的AOP @Component//注册bean @SuppressWarnings("all")//告诉编译器忽略所有的警告 public class IsRunServiceAspect { @Autowired private IsRunService isRunService; //表示将使用了自定义注解的方法,作为一个切入点 @Pointcut("

SDP(软件定义边界)让SDN更安全,你的对面可不能是一条狗!

编者按:近年来,软件定义网络(SDN)如同海藻一样疯狂地席卷全球。但火热的SDN真的安全吗?Gartner分析师Neil MacDonald表示“SDN创建了一个抽象层,这将带来很多新的攻击面,例如OpenFlow协议、供应商API等”。为解决这难题,一种新型的安全模型软件定义边界(Software Defined Perimeter)诞生了,国际云安全联盟(CSA)表示“SDP被设计为与软件定义网络(SDN)高度互补”。 1993年,美国著名卡通漫画家Peter Steiner发表了一幅闻名全球的漫画:一条狗蹲在电脑前对另一条狗说“互联网上没人知道你是一条狗”。这句话放在今天也依旧正确。当你坐在电脑旁真的能确定你对面的“用户”是谁?如何验证远程连接对面的人(或者狗),是网络安全工作的一大重要问题。 SDP到底是什么? 软件定义的边界(SDP)是由云安全联盟(CSA)开发的一种安全框架,它根据身份控制对资源的访问。该框架基于美国国防部的“need to know”模型——每个终端在连接服务器前必须进行验证,确保每台设备都是被允许接入的。其核心思想是通过SDP架构隐藏核心网络资产与设施,使之不直接暴露在互联网下,使得网络资产与设施免受外来安全威胁。 SDP有时被说成是“黑云”,因为应用架构是“黑”的——根据美国国防部的定义,这个“黑”代表了架构无法被检测到。如果攻击者无法知道目标在何方,那么攻击将无法进行。因此,在SDP架构中,服务器没有对外暴露的DNS或者IP地址,只有通过授权的SDP客户端才能使用专有的协议进行连接。 SDP架构与部署模式 SDP的体系结构由两部分组成:SDP主机和SDP控制器。SDP控制器主要进行主机认证和策略下发。SDP主机和SDP控制器之间通过一个安全的控制信道进行交互。 SDP控制器是SDP的大脑,在业务驱动的前提下,它在访问者和资源之间建立动态和细粒度的“业务访问隧道”,不同于传统VPN隧道,SDP的隧道是按照业务需求来生成的,也就是说这是一种单包和单业务的访问控制,SDP控制器建立的访问规则只对被授权的用户和服务开放,密钥和策略也是动态和仅供单次使用的。通过这种类似“白名单”的访问控制形式,网络中未被授权的陌生访问在TCP链接建立阶段就是完全被屏蔽和拒绝的,这种“临时并单一”的访问控制方式,将私有云资源对非法用户完全屏蔽,这样便大大防止了门外“野蛮陌生人”对云的暴力攻击(如DDoS流量攻击)、精准打击(如APT持续威胁)、漏洞利用(如心脏出血漏洞)等,通过构建“暗黑网络”来减小网络的被攻击面。 SDP工作流如下: 一个或多个SDP控制器上线,并且和可选的认证和授权服务建立连接;一个或多个可接受连接的SDP主机上线,这些主机与控制器建立连接并被控制器认证。然而,这些主机并不对其他主机的通信进行应答,也不会响应非预分配的请求;每一个发起连接的SDP主机上线,它和控制器建立连接并被控制器认证;在认证通过后,SDP控制器确定一个发起连接的主机可以被授权通信的主机列表;SDP控制器通过加密信道通知可接受连接的SDP主机,以及一些可选的策略;SDP控制器将可接受连接的主机的列表和可选的策略发送给发起连接的主机;发起连接的SDP主机与所有授权的可接受连接的主机之间建立Mutual TLS连接。 云安全联盟(CSA)列出了4种SDP部署模式。 客户端到网关部署将服务器置于接受主机后面,该主机充当受保护服务器和客户端之间的网关。客户端到网关SDP可以部署在网络内,以减少诸如操作系统(OS)和应用程序漏洞利用,中间人攻击和服务器扫描等横向移动攻击。它还可以直接部署在互联网上,以便将受保护的服务器与未经授权的用户隔离开来,并减轻攻击。客户端到服务器部署类似于客户端到网关部署,客户端和服务器之间没有网关代理。客户端直接连接到主机。服务器到服务器部署,用于向应用程序提供服务(通过REST API)的服务器。客户端到服务器到客户端的实现依赖于客户端之间的对等(P2P)关系,可以用于聊天,视频会议,IP电话等应用程序。在此部署中,SDP模糊了连接客户端的IP地址,服务器充当两个客户端的中介。 为什么需要SDP? 为了阻止所有类型的网络攻击,包括DDoS、中间人攻击、服务器查询(OWASP十大威胁之一)和高级持续性威胁(ATP),SDP的安全模型融合了设备身份验证、基于身份的访问和动态配置连接三大组件,虽然SDP中的安全组件都很常见,但这三者的集成却是相当创新的。 SDP要求用户拿出多种身份验证变量,比如时间、位置、机器健康状况和配置等,用以证实该用户身份,或者验证用户能否被信任。这一上下文信息可使公司企业识别出非法用户——即便该用户持有合法用户凭证。 访问控制是动态的,能够应对风险和权限提升。用户与系统和应用间的互动是实时的。在会话中,用户可以执行任意数量不同风险级别的事务。举个例子,用户可以多次查看电子邮件、打印机密文档,以及更新企业博客。当用户行为或环境发生变化时,SDP会持续监视上下文,基于位置、时间、安全状态和一些自定义属性实施访问控制管理。 SDP还能够脚本化,以便能够检查除设备信息之外的更多情况。SDP能够收集并分析其他数据源,以提供上下文,帮助进行用户授权动作。这能确保在合法用户试图访问新设备或不同设备上资源的时候,有足够的信息可供验证用户并授权访问。 一旦用户可被验证,我们就可以确信用户是谁(可能是骗子或狗狗),SDP在用户和所请求的资源间创建一条安全的加密隧道,保护二者之间的通信。而且,网络的其他部分则被设为不可见。通过隐藏网络资源,SDP可减小攻击界面,并清除用户扫描网络和在网络中横向移动的可能性。 最后,因为当今IT环境的复杂性和巨大规模,SDP需可扩展并高度可靠。最好是打造得像云一样能够容纳大规模扩展,且是分布式和恢复力强的。 SDP使用案例 SDP可以支持大量的用例,这些用例可以帮助IT领导人支持新的业务活动,简化IT架构和操作。许多企业已经在为各种关键用例使用软件定义的边界。需要注意的是,并不是所有的SDP服务都是以相同的方式构建的,所以安全和网络专家在部署SDP时,应该根据实际场景来规划部署方式。下表中列举了一些SDP的应用场景: SDP与传统VPN的区别 目前,虚拟专用网络(VPN)是很多公司远程访问的解决方案之一。但是,VPN用户一旦获得授权就可以广泛访问公司网络上的资源。这种广泛访问的方法使潜在的敏感资源和信息暴露给VPN用户和攻击者。因此,围绕软件定义的边界解决方案(SDP)成为安全远程访问的一个更具吸引力的替代方案。 传统的VPN具有过度信任、访问广泛、复杂等问题。首先传统VPN遵循以网站为中心的拓扑结构,具有广泛的信任度。其次在传统的VPN网络访问中,一旦用户登陆了VLAN,他们的主机就可以广播地址解析协议(ARP),以检查是否有其他东西连接到这个网段。由于地址解析协议是建立在网络中各个主机互相信任的基础上的,网络上的主机可以自主发送ARP应答消息,其他主机收到应答报文时不会检测该报文的真实性就会将其记入本机ARP缓存;由此攻击者就可以向某一主机发送伪ARP应答报文,使其发送的信息无法到达预期的主机或到达错误的主机,这最终会创建一个相当大的攻击界面,供黑客使用。最后,在企业迁移到云时,VPN管理变得复杂。IT管理员必须在不同的地理位置配置和协调VPN、防火墙策略。这反过来又很难拦截未经授权的访问。 软件定义边界完全颠倒了传统的网络安全模型,每个网络资源、用户、设备和数据中心、应用程序都可以连接到SDP云。与传统的以站点为中心的方法相反,用户现在成为网络的中心。在这种情况下,我们拥有一个以用户为中心的拓扑结构,用户位于中心,可以从任何地方访问应用程序,无论是在云端还是旧数据中心。 整个软件定义的边界模型假定为零信任。它假设用户、设备和服务之间不存在任何信任。零信任不仅基于身份:用户的ID,他们的设备,还包括他们访问的服务、应用程序和网络。基于身份的访问控制用于阻止或允许网络连接。 在配置方面,传统的VPN需要配置在每个数据中心和云上。而通过SDP,管理员可以向平台添加一次网络资源,然后以集中方式管理云中的所有策略。使用完全基于云的SDP解决方案的另一个好处是,在授予数据中心或虚拟私有云内的访问权限时,几乎不需要额外的配置和维护。所有与安全相关的活动,都在云中执行。 总之,SDP的安全远程访问机制吸引了众多企业的关注。它为用户和资源实现了自定义的网络访问策略。这些资源对于未授权的用户来说是不可见的,减少了潜在的攻击面。SDP解决方案以客户为导向,使其更易于控制、全面适用和灵活。这些特点超越了传统VPN服务的优点。 SDP与SDN高度互补 当提到软件定义边界时,可能会有人问“它与软件定义的网络(SDN)有关系吗?” 云安全联盟(CSA)表示“SDP被设计为与软件定义网络(SDN)高度互补”。似乎SDP是为了预防网络攻击而实施的SDN。 根据定义,SDN是一种计算机网络方法,允许网络管理员通过抽象出更高级别的功能来管理网络服务。SDN通过控制平面和转发平面分离来管理网络基础设施。它具有动态性、可管理性、成本效益和适应性,是当今各组织的理想选择。 SDP是一个安全控制框架,在授予对应用程序基础结构的访问权限之前,设备和身份是经过验证的。因此,虽然SDN是建立动态网络基础设施的概念,让用户能够以尽可能多的吞吐量快速有效地进行点对点连接,但SDP遍历多个OSI层,使用经过审查的安全模型将应用程序和用户与可信网络联系起来。二者高度互补,对于未来的云技术来说,它们显然比传统的IT系统更安全。 SDN和SDP相结合能为网络管理和安全带来1+1>2的效果。首先当组织需要管理和保护不断增长的数据量时,完整的网络可见性和透明度是必不可少的。通过SDN和SDP提供网络自动化和业务流程,可以创建更多数据,以提供有价值的见解和及时的警报,为IT管理人员提供安全分析的良好基础。其次,SDP与SDN功能密切配合可以从设备到应用程序提供安全的点对点网络隧道,在动态基础上最小化网络攻击面。所以,SDP与SDN的结合对于云技术、网络安全都有深远意义。 SDP潜在的挑战 尽管SDP给出了零信任条件下、满足现代企业数据保护需求的访问控制模型,但从框架到落地实现还涉及到许多技术问题及资源整合;同时,即使在此完成基础上,SDP自身仍有一些能力缺陷。 SDP方法的最大挑战之一是带外控制器,当初始认证请求完成后,认证的信息不会停留在实际的数据路径中。假设一个用户连接到企业应用程序的场景,在通过SDP控制器进行初始认证和授权之后,客户端或IH将根据策略和端口号通过SDP网关建立一个带有应用程序服务的隧道。如果同一用户感染了恶意软件,它可以很容易地通过开放端口传播到其他应用程序。无论是物理的还是逻辑的安全域总是有既定边界,而对于某些开放业务、包括一些实际需求往往不得不违背信息流安全策略,即高安全域内的敏感数据需要流向低安全域,这是SDP本身无法解决的。例如,假设存在内、外两个不同等级的安全域:银行向监管机构上报数据相当于从内网流向外网;供应链上下游厂家给平台提交数据也是从内部流向外部。其实无论是组织内外都大量存在类似的案例。因此,即使有安全边界但所谓泄漏通道在现实场景中也是必须考虑的。SDP面临的另一类挑战是难以解决横向攻击。理论上,SDP通过隐藏网络资源,侧重规划安全策略的实施空间和范围,减小攻击面,但没有落地安全策略的实施机制。因此,无论是某个终端还是服务器第一时间被攻破后,攻击很可能转移至其它设备或应用,即横向攻击。 商业解决方案 目前市场中有很多商业和开源解决方案提供SDP功能。Vidder和CryptZone有推向市场的SDP解决方案。一些网络软件产品中也提供SDP中的关键元素,例如Cisco ACI(以及类似的开源项目),VMware NSX,Nuage VSP。谷歌已经发布了BeyondCorp来分享这些概念。Cisco,HPE,Juniper提供的NAC解决方案也提供类似SDP的解决方案。Verizon Enterprise等服务提供商已开始接受这些概念。软件定义边界的概念被许多安全或网络设备供应商采用。 Vidder是软件定义边界(SDP)计划的先驱。Vidder的可信访问控制技术利用除了授权用户外所有人都看不到服务器的方法,来减轻网络的攻击。Vidder公司较出名的SDP解决方案是PrecisionAccess。PrecisionAccess只允许受信任的客户端访问企业应用程序,隔离受感染的设备。无论应用程序是在内部还是云端,PrecisionAccess都可以保护应用程序和服务器免受未经授权的用户,未注册的设备的攻击。PrecisionAccess架构在连接层和应用层运行,而不是使用传统的基于网络的控件,因此成本较低。 Cryptzone的AppGate SDP是一种新的安全方法。它使用Software Defined Perimeter(软件定义边界)保护网络,该模型可动态地在用户与其访问的资源之间创建一对一的网络连接。AppGate 3.0版本增加了新功能,可帮助组织提供安全,经过身份验证的资源访问,包括单数据包授权技术,可防止未经授权的用户隐藏网络资源。从技术角度来看,该方案有一个控制器,它充当SDP网络的集中身份验证点和策略存储点。另外,还有一组保护网络资源的网络网关,安装在端点设备上的客户端。客户端用于创建一个安全的、加密的虚拟专用网络(VPN)隧道,以便在策略允许的情况下访问资源。AppGate SDP也可在各种云市场中使用。 Zscaler Private Access采用以用户和应用程序为中心的网络安全方法。它确保只有授权用户和设备才能访问特定的内部应用程序。ZPA不使用物理或虚拟设备,而是使用轻量级基础架构软件将用户和应用程序连接到Zscaler Security Cloud。ZScaler Private Access解决方案类似SDP的安全概念,Zscaler Connector相当于是SDP网关,ZApp客户端是Initiating主机,Central Authority是SDP Controller。Broker(ZEN)是一个额外的组件,它消除了对数据中心或云网络段的传入连接的需求。在客户端和连接器之间添加了一层额外的Mutual TLS,以提供额外的加密和信任层。

MPP架构

数据库构架设计中主要有Shared Everthting、Shared Nothing、和Shared Disk: Shared Everthting:一般是针对单个主机,完全透明共享CPU/MEMORY/IO,并行处理能力是最差的,典型的代表SQLServer Shared Disk:各个处理单元使用自己的私有 CPU和Memory,共享磁盘系统。典型的代表Oracle Rac, 它是数据共享,可通过增加节点来提高并行处理的能力,扩展能力较好。其类似于SMP(对称多处理)模式,但是当存储器接口达到饱和的时候,增加节点并不能获得更高的性能 。 Shared Nothing:各个处理单元都有自己私有的CPU/内存/硬盘等,不存在共享资源,类似于MPP(大规模并行处理)模式,各处理单元之间通过协议通信,并行处理和扩展能力更好。典型代表DB2 DPF和hadoop ,各节点相互独立,各自处理自己的数据,处理后的结果可能向上层汇总或在节点间流转。 我们常说的 Sharding 其实就是Share Nothing架构,它是把某个表从物理存储上被水平分割,并分配给多台服务器(或多个实例),每台服务器可以独立工作,具备共同的schema,比如MySQL Proxy和Google的各种架构,只需增加服务器数就可以增加处理能力和容量。 MPP概念 MPP即大规模并行处理(Massively Parallel Processor )。 在数据库非共享集群中,每个节点都有独立的磁盘存储系统和内存系统,业务数据根据数据库模型和应用特点划分到各个节点上,每台数据节点通过专用网络或者商业通用网络互相连接,彼此协同计算,作为整体提供数据 库服务。非共享数据库集群有完全的可伸缩性、高可用、高性能、优秀的性价比、资源共享等优势。 大规模并行处理(MPP)架构 例子 Greenplum是一种基于PostgreSQL的分布式数据库。其采用shared nothing架构(MPP),主机,操作系统,内存,存储都是自我控制的,不存在共享。也就是每个节点都是一个单独的数据库。节点之间的信息交互是通过节点互联网络实现。通过将数据分布到多个节点上来实现规模数据的存储,通过并行查询处理来提高查询性能。 这个就像是把小数据库组织起来,联合成一个大型数据库。将数据分片,存储在每个节点上。每个节点仅查询自己的数据。所得到的结果再经过主节点处理得到最终结果。通过增加节点数目达到系统线性扩展。 elasticsearch也是一种MPP架构的数据库,Presto、Impala等都是MPP engine,各节点不共享资源,每个executor可以独自完成数据的读取和计算,缺点在于怕stragglers,遇到后整个engine的性能下降到该straggler的能力,所谓木桶的短板,这也是为什么MPP架构不适合异构的机器,要求各节点配置一样。 Spark SQL应该还是算做Batching Processing, 中间计算结果需要落地到磁盘,所以查询效率没有MPP架构的引擎(如Impala)高。

Nacos的连接错误:ErrCode:-401, ErrMsg:Client not connected,current status:STARTING的解决办法

最近在将HASentinel(https://gitee.com/laofeng/hasentinel)接入Nacos配置中心,在连接的时候怎么都不能够连接成功,报错误: ErrCode:-401, ErrMsg:Client not connected,current status:STARTING 使用的Nacos server及client的版本都是2.0.3。 创建ConfigService使用的是方法ConfigFactory.createConfigService(Properties),如下所示: 反复确认过Properties中所有的配置都正确,通过Debug跟踪代码,发现通过传入Properties传入参数构造对象ServerListManager时,会将isFixed这个变量设置为true,如下所示: ServerListManager对象创建成功,会调用启动连接的start()方法,如下所示: 但是在start()方法会同时判断isStarted及isFixed两个参数,只要有一个的值为true,就会立即返回不继续往下执行,如下所示: 但是在前面isFixed已经被修改为了true,因而就不会继续执行连接操作,对isFixed变量进行了跟踪,发现只有这么一处业务逻辑。 于是下载最新的代码,修改ServerListener.start()的判断逻辑去掉去isFixed的判断: if (isStarted) { return; } 然后重新编码api、common、client模块,版本为2.1.0-SNAPSHOT,然后在pom中重新依赖这些模块,再次启动就不再报上面的401错误。 难道就我一个遇到?后面继续跟进该问题!

Unity 点击 随机选择

using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class RandomSelect : MonoBehaviour { Button btn; public Text text; public GameObject coverImage; public Transform[] items; public ParticleSystem ps; void Start () { btn = GetComponent<Button>(); btn.onClick.AddListener(StartRandom); ps.Stop(); } int index = 0; void Update () { if(isRandoming) { if(randomTime>0) { //Debug.Log(randomTime); randomTime -= Time.deltaTime; if(randomTime<0) { ps.Play(); } stepTime -= Time.deltaTime; if(stepTime<0) { if (index == items.Length) index = 0; coverImage.

github pages 无法加载css的问题

今天再将sphinx自动生成的html上传到github上面充当说明文档,遇到了一个问题,就是_static/css/路径下的css和js文件加载不出来,查了很多方法,都没有试成功,其实后面我测试的时候发现,只要带下划线的文件里面的内容都无法访问,这是因为github pages的jekyll模版会忽略下划线开头的文件,所以要禁用jekyll。 禁用方法就是在项目根目录下添加一个空白文件,命名为:.nojekyll 这样就解决了无法加载_static文件的问题。 note:在操作的时候,不要开代理服务器,发现我网络开着代理服务器,还是没有加载成功,幸好自己在手机上试了试发现可以正常显示css样式,然后让同学试了试也没问题,这才找到问题。 另外记录一下整个过程: 关于sphinx生成说明文档的过程,可以查看我的这篇博客使用sphinx自动生成python项目说明文档,下面是在说明文档已经生成之后的步骤: 1.首先创建一个仓库,仓库的名字antsesame.github.io,注意antsesame可以修改,后面的github.io是不可以修改的,建议尽量和自己的github名字一样(我的github名字就是antsesame),这样直接通过antsesame.github.io就可以访问,如果你设置的是其他的名字比如abc.github.io,后面访问的时候需要通过antsesame.github.io/abc.github.io才可以进行访问。 2.点击settings,找到github Pages,点击check it out here 3.branch选择main,后面选择/(root),这个地方选择/(root)是指的你的仓库的根目录就是root目录,所以index直接放到仓库根目录下就可以,如果选择/docs,意味着你得建一个docs文件夹,docs是项目的github pages根目录,然后index放到docs这个文件下。另外在这里可以直接看到访问的站点信息。 4.然后往仓库里面放网站的内容就可以了,由于我的是通过sphinx生成的html所以我直接把html中的所有内容放到根目录就可以了。 5.通过settings中的github Pages上面显示的站点信息访问就可以了。(注意此处已经将空白的.nojekyll文件放到根目录下了。) 参考: sphinx生成说明文档放到github pages官方指南 https://daler.github.io/sphinxdoc-test/includeme.html 在github上搭建个人博客 https://zhuanlan.zhihu.com/p/28321740

电脑无法连接到网络的解决方法(可能,不妨试一试)

出现的状况: 情况一: 1.打开“控制面板"->"网络和Internet" 2.点击"网络和共享中心" 3.点击“更改适配器设置” 4.看是否WLAN已禁用,若禁用,则点击”WLAN" ​​​​​​​​​​​​​​ 5.点击“启用此网络设备”即可。 情况二: 重置网络试一下: 1.打开设置并搜索“网络重置”即可 2.点击“网络重置”

小白入门-------如何将阿里云盘挂载到本地(Windows)

这里写自定义目录标题 先来看一下效果:普通人需要掌握的知识:需要的软件支持第一步下载webdav-aliyundriver的包第二步下载Java运行环境JDK1:首先下载JDK2:安装JDK3:配置环境4:验证安装是否成功 第三步 运行webdav-aliyundriver包然后,然后,最后一步就要完成了:挂载实现 注意!!!所有的包 先来看一下效果: 普通人需要掌握的知识: 会安装软件、用鼠标键盘即可!!! 需要的软件支持 由于将阿里云盘挂载到本地是借助于阿里云webDAV协议,我们不必了解他是什么,借助于GitHub上大神zxbu的webdav-aliyundriver的包即可。然后借助开源免费的RaiDrive软件就能将阿里云挂载到本地。 所有需要下载的包在文后有链接。 第一步下载webdav-aliyundriver的包 下载地址:源代码地址https://github.com/zxbu/webdav-aliyundriver 第二步下载Java运行环境JDK 由于所使用的包采用的为JAVA语言,运行需要软件环境,所以需要下载安装JDK。 所以需要下载安装并配置环境。 具体安装步骤如下: 1:首先下载JDK JDK官方下载地址: https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html 打开网址直接下拉,找到对应的系统版本,然后下载。 2:安装JDK 双击运行安装包更改安装路径,不要安装到C盘根据提示安装完成 3:配置环境 右击计算机图标,选择属性 2.下拉找到 高级系统设置 3.单机进去,找到环境变量 在系统变量里新建"JAVA_HOME"变量,变量值为:F:\java\jdk1.8(JDK的安装路径); 在系统变量里新建"classpath"变量,并添加值:(注意点别漏了) .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar 4.找到path变量添加变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin 4:验证安装是否成功 cmd打开命令行,执行java -version 出现如下画面,则表示安装成功: 第三步 运行webdav-aliyundriver包 1.打开阿里云盘的网页版 没有阿里云盘账号的点这里: 注册阿里云 登陆后,按F2打开软件的源代码:然后点击应用程序,然后进入本地存储、 在下拉里面找到refresh——token,复制即可 2.打开windows的cmd环境: 输入 java -jar 你电脑本地的存放jar的路径 --aliyundrive.refresh-token="你的阿里云token" --server.port=8181 --aliyundrive.auth.enable=true --aliyundrive.auth.user-name=设置用户名 --aliyundrive.auth.password=设置密码 --aliyundrive.work-dir=日志存放路径 回车运行后会显示: 然后浏览器输入网址:浏览器地址http://127.0.0.1:8181/ 进入后输入你设置的用户名和密码 就会得到: 然后,然后,最后一步就要完成了: 借助RaiDrive软件内支持的webDAV协议,所以需要下载RaiDrive软件。 下载地址:RaiDrive下载地址https://www.raidrive.com/ 然后安装即可 挂载实现 打开RaiDrive软件,选择setting,设置中文简体选择NAS选项把地址的https改为http,然后输入127.0.0.1: 8181 和账户密码点击确定就可以大功告成了! 注意!!! cmd窗口内运行的相当于一个服务器程序,想要使用就必须运行上述的代码!没有尝试使用服务器作为中间的,网友们感兴趣可以尝试一下!第一次配置完成后,可以将这一行代码使用Windows的bat文件实现。 所有的包 阿里云下载地址:

前端H5 video视频在360浏览器、微信内置浏览器层级提升(太高)问题

我们在对页面进行浏览器兼容性测试的时候会发现页面中的视频在部分浏览器中(QQ浏览器、360浏览器、搜狗浏览器等)会被提升,这属于浏览器自身优化行为,无法通过CSS的z-index属性改变其层级关系。目前找到了360浏览器、微信内置浏览器的解决方案: <video controls360=no // 360浏览器 webkit-playsinline playsinline x5-playsinline // 针对腾讯系 x5-video-player-type="h5-page" // 针对腾讯系 src="src" > </video> 目前还未找到QQ、搜狗等浏览器的解决方案,有知道的大佬麻烦留言^_|

Pytest测试框架(二)环境初始化与数据清除

一、fixture的用途 pytest fixture 与setup,teardown功能一样,但比之更加灵活,完全可以代替setup,teardown 1.做测试前后的初始化设置,如测试数据准备,链接数据库,打开浏览器等这些操作都可以使用fixture来实现 2.测试用例的前置条件可以使用fixture实现 3.支持经典的xunit fixture ,像unittest使用的setup和teardown 4.fixture可以实现unittest不能实现的功能,比如unittest中的测试用例和测试用例之间是无法传递参数和数据的,但是fixture却可以解决这个问题。 二、fixture的定义 fixture通过@pytest.fixture()装饰器装饰一个函数,那么这个函数就是一个fixture import pytest @pytest.fixture() def login(): print('登陆方法') yield #激活fixture teardown方法 print('teardown') # 测试用例之前,先执行login方法 def test_case1(login): print('case1') def test_case2(): print('case2') def test_case3(): print('case3') 运行结果如下: test_login.py::test_case2 test_login.py::test_case3 ============================== 3 passed in 0.02s =============================== Process finished with exit code 0 登陆方法 PASSED [ 33%]case1 teardown PASSED [ 66%]case2 PASSED [100%]case3 三、共享 fixture 函数:conftest.py 1.conftest.py文件名字是固定的,不可以做任何修改 2.文件和用例文件在同一个目录下,那么conftest.py作用于整个目录 3.conftest.py文件不能被其他文件导入 4.所有同目录测试文件运行前都会执行conftest.py文件 在测试过程中,多个测试文件可能都要调用 fixture 函数,可以将其移动到 conftest.py 文件中。conftest.

export 设置环境变量及删除

1. 设置环境变量 export 变量名=值 2. 删除环境变量 unset 变量名 参考: liunx 中如何删除export设置的环境变量 - fuhaizi - 博客园 (cnblogs.com)

easyflash源码分析流程图

最近周末刚好有空,将easyflash源码看了一下,了解了作者的设计理念。将学习内容整理成流程图贴上来。 1. esayflash初始化流程 2. esayflash set_env

stm32 uart4无法接收问题

项目用到了四个串口,usart1,2,3,和uart4, 使用了hal库 问题: usart1,2,3,都可以正常使用,但是uart4无法进入接收中断,一开始以为stm32的usart和uart的hal库使用有所不同,反复查看代码也没发现问题。中断也开启了 解决: 最后发现是在STM32CUBEMX中,没有勾选UART4的全局中断, 勾选后即可正常使用uart4

C语言基础 -- uint32_t

uint32_t 是一个32位的无符号整型。 使用这个类型需要加上头文件 #include <stdint.h> unsigned int32_t 是错误的写法。 %x 是以16进制的形式来输出 例子: 我有一个32位的无符号整型的数,我想知道高16位和低16位相加的和是多少,结果以16进制输出? #include <stdio.h> #include <stdlib.h> #include <stdint.h> int main() { uint32_t i = 0x11223344; // i>>16 //得到高位 // i&0xFFFF //得到低位 //以16进制输出 printf("0x%x.\n",((i >>16) + (i & 0xFFFF))); return 0; }

Kafka单节点安装部署

本文主要是基于Kafka最新版kafka_2.12-2.8.0进行配置,这里ZooKeeper服务器的搭建主要是用kafka内置的ZooKeeper便捷脚本来快速简单地创建一个单节点ZooKeeper实例。 1、本地下载kafka文件,然后再把文件放到linux中 官网下载地址:https://kafka.apache.org/downloads 小提示: 小伙伴们看到kafka_2.12-2.8.0.tgz压缩包会很疑惑到底kafka的版本号是什么? 以kafka_2.12-2.8.0.tgz为例,2.12表示scala的版本,因为Kafka服务器端代码完全由Scala语音编写,”-“ 后面的2.8.0表示的kafka的版本信息,kafka的命名都是遵循这个规则的。但是Kafka新版客户端代码完全由Java语言编写,当然,不是Scala不行了,那是因为之前的Scala程序员隐退了,所以在社区找来了一批Java程序员来写Kafka新版客户端。 2、解压kafka_2.12-2.8.0.tgz文件 tar -xzf kafka_2.12-2.8.0.tgz cd kafka_2.12-2.8.0 Kafka解压后,具体目录结构如下图所示: Kafka中重要的四大配置文件如下: kafka最重要的配置文件server.properties内容详细说明: # 每个broker在集群中唯一存在,数值必须是正数;kafka根据id来识别broker机器,当该服务的地址发生变化时,broker.id没有变化,则不会影响consumers的消息情况。 broker.id=0 # broker server服务端口 port=9092 # broker的主机地址 host.name=localhost # 套接字服务器侦听的地址 listeners=PLAINTEXT://192.168.243.133:9092 # 代理将向生产者和消费者公布主机名和端口。如果没有设置, # 如果已配置,它将使用“侦听器”的值。否则,它将使用该值从java.net.InetAddress.getCanonicalHostName()返回 advertised.listeners=PLAINTEXT://192.168.243.133:9092 # broker处理消息的最大线程数,一般情况下不需要去修改 num.network.threads=3 # broker处理磁盘IO的线程数,数值应该大于你的硬盘数 num.io.threads=8 # socket的发送缓冲区,socket的调优参数SO_SNDBUFF socket.send.buffer.bytes=102400 # socket的接受缓冲区,socket的调优参数SO_RCVBUFF socket.receive.buffer.bytes=102400 # socket请求的最大数值,防止serverOOM,message.max.bytes必然要小于socket.request.max.bytes,会被topic创建时的指定参数覆盖 socket.request.max.bytes=104857600 # kafka数据的存放地址,多个地址的话用逗号分割/root/kafka_2.12-2.8.0/log-1,/root/kafka_2.12-2.8.0/log-2 log.dirs=/root/kafka_2.12-2.8.0/logs # 每个topic的分区个数,若是在topic创建时候没有指定的话会被topic创建时的指定参数覆盖 num.partitions=1 # 在启动时用于日志恢复和在关闭时刷新的每个数据目录的线程数。 num.recovery.threads.per.data.dir=1 # 组元数据内部主题“__consumer_offsets”和“__transaction_state”的复制因子 # 对于除开发测试之外的任何其他内容,建议使用大于1的值以确保可用性,例如3。 offsets.topic.replication.factor=1 transaction.state.log.replication.factor=1 transaction.state.log.min.isr=1 # 日志文件因使用年限而有资格删除的最短使用年限 log.retention.hours=168 # topic的分区是以一堆segment文件存储的,这个控制每个segment的大小,会被topic创建时的指定参数覆盖 log.

latex中如何设置定理定义环境的编号 & newtheorem的用法

出现Environment example undefined. 等错误,我们应该怎么办? 我们在使用definition环境、theorem环境、lemma环境、example环境等诸多数学环境之前,需要调用宏包amsthm,这个宏包是专门用来设置定理类环境,其次我们还需要给出它们的编号定义。 \newtheorem命令可以用来定义定理之类的环境,其语法如下: {环境名}[编号延续]{显示名}[编号层次] 例1. 下面代码定义了四个环境:定义、定理、引理和推论,它们都在一个section内统一编号,而引理和推论会延续定理的编号 \newtheorem{definition}{定义}[subsection] % 跟随三级标题排序 \newtheorem{theorem}{定理}[section] %跟随二级标题排序 \newtheorem{lemma}[theorem]{引理} \newtheorem{corollary}[theorem]{推论} 下面给出写学术型论文常用的定理类环境的定义: %=================== 定理类环境定义 =================== \newtheorem{example}{例} % 整体编号 \newtheorem{algorithm}{算法} \newtheorem{theorem}{定理}[section] % 按 section 编号 \newtheorem{definition}[theorem]{定义} \newtheorem{axiom}[theorem]{公理} \newtheorem{property}[theorem]{性质} \newtheorem{proposition}[theorem]{命题} \newtheorem{lemma}[theorem]{引理} \newtheorem{corollary}[theorem]{推论} \newtheorem{remark}[theorem]{注解} \newtheorem{condition}[theorem]{条件} \newtheorem{conclusion}[theorem]{结论} \newtheorem{assumption}[theorem]{假设}

VScode连接远程失败?修改默认SSH为Git的SSH

问题 在进行VScode配置远程连接1的过程中遇到了连接失败的问题,VScode提示无法建立连接,并报错: 过程试图写入的管道不存在 解决办法 在网络上找了一些资料后,总结为本机的SSH配置出现了问题。 修改系统环境变量(无效) 首先修改了系统的环境变量2,将系统环境变量path中的%SYSTEMROOT%\System32\OpenSSH\删除,然后在路径中添加git目录下ssh的位置: D:\ProgramFiles\Git\Git\usr\bin 修改保存后重启VS code进行连接测试并未生效。 在VScode中设置SSH的路径(有效) 随后,参考vscode远程连接更改ssh位置3。 首先,打开VScode的设置。 在搜索框搜索remote ssh Default Forwarded Ports,点击Edit in settings.json 在其中添加如下一条命令,修改SSH的默认路径为Git下的SSH: "remote.SSH.path": "D:\\ProgramFiles\\Git\\Git\\usr\\bin\\ssh.exe", 修改后的配置如下图所示: 重新测试连接,在终端提示输入密码,然后成功建立连接。 参考文献 [效率]使用VScode连接远程服务器进行开发,这里优质彩笔,https://zhuanlan.zhihu.com/p/141205262,2021-09-04. ↩︎ VScode通过remote ssh连接虚拟机 & 报错 过程试图写入的管道不存在(已解决),tmhhh,https://blog.csdn.net/weixin_43569916/article/details/105168505,2021-09-04. ↩︎ vscode远程连接更改ssh位置,idestina,https://blog.csdn.net/idestina/article/details/113666172,2021-09-04. ↩︎

UVM自学笔记3——项目之三——从零开始搭建ahb_sramc验证平台

创建如下所示的目录结构: 2.在tb的文件下:顶层的testbench如下:在tb中,第24行的代码将uvm宏相关的内容include进来,第26行的代码把uvm_pkg包导入进来,然后将agent相关的包(ahb_pkg/sram_pkg),testcase相关的包(uvm_ahb_sram_test_pkg)以及env相关的包(uvm_ahb_sram_env_pkg)都导入进来,在第38行和39行将接口以virtual interface的形式配置给ahb_agent和sramc_agent下的所有组件,之后在第41行通过run_test()启动testbench。 在tests文件夹下的目录结构: 这个uvm_ahb_sram_test_pkg包的作用是将所有的testcase都include到当前的package下,其他所有的包功能都是类似的,此时我们只有一个名为uvm_ahb_sram_2的testcase基类,因此在第33行将该文件include进来。 Testcase_base的代码如下: 在build phase实例化env,在build_phase结束后的end_of_elabration_phase里面将拓扑结构打印出来。 env的文件目录如下: 将该env相关的类都包如pkg中: Env的代码如下:在build_phase里实例化组件,包括reference model 、scoreboard和agent,在env的connect phase中,因为目前我们没有trans要传递,所以我们先不建立组件之间的连接。 Reference model的代码如下,包含有一个main phase,之后我们会在main phase中执行具体的操作。 同样,scoreboard的代码如下:包含有一个main phase agent的目录结构如下: Ahb_if是其接口: Driver代码如下:后续我们会具体进行完善,driver中connect_phase get到vif的配置信息,main_phase中有将激励灌入到DUT内部的主要方法do_drive(),我们注意到目前driver的main phase中是通过第58行代码接收到seqr传来的trans后,执行do_drive,但实际我们可能并非如此操作,比如ahb的二级流水当总线上hready为低时,我们按照这种方式可能会丢掉数据。这一点我们后面进行具体的更改。 Monitor的代码如下:monitor与driver具有一定的相似度,但又有所不同,monitor负责监视总线上的信号,并将pin级的信号打包成trans通过analysis port传递给reference model等组件。 Agent的代码如下:agent中实例化了driver monitor和sequencer,并且在connect phase中建立起组件之间的连接,将driver和sequencer以及monitor和agent中的port连接起来。 Sequence_item的代码如下:我们要在sequence_item中将interface中的信号包装成trans类型,并利用automatic_field将诸多自动函数调用。 Sequence的代码如下: Sim文件夹的目录结构如下: Makefile的代码如下: 将所有组件的框架搭建起来以后,我们尝试跑一下testcase,发现没有fatal和error 接下来,我们看下拓扑结构:

hive on spark 提交任务出现问题

背景: 启动hive之前已经启动了hadoop、hiveserver2。而且已经进入到了hive的界面中,且创建好了表格和装载了数据,但是当进行sum操作的时候,报了下边的错误。spark session的问题? org.apache.hadoop.hive.ql.parse.SemanticException: Failed to get a spark session: org.apache.hadoop.hive.ql.metadata.HiveException: Failed to create Spark client for Spark session 36a3f749-9322-43a8-b72c-cc8a6e92a542 检查之后把spark的配置文件hive-site.xml进行了修改,将超时时间扩大了,但是还是出现了一样的错误。 <property> <name>hive.spark.client.connect.timeout</name> <value>10000ms</value> </property> 解决策略 不使用spark来跑hive的程序,将spark配置的参数全部注释掉,走mr的底层可以进行查询,聚合操作。 如果想使用spark来跑程序,可以试下卸载重装。如果你有好的解决方法,希望可以提出来哟~

使用Mybatis进行简单的sql查询(Mybatis入门)

最近呢,学习了mybatis的相关内容,就写下了这篇博客来记录顺便复习一下如何使用Mybatis来进行简单的sql语句查询。希望我写的这篇博客能帮助大家。有问题大家可以提出来,一起进步。 先来看看我的分包,一个好的分包能够让你更好的整理思路,大家要养成分包的习惯哦。 1.分包: 2.编写db.properties文件: driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=Hongkong&characterEncoding=utf-8&autoReconnect=true username=root password=201225qq 有没有觉得很眼熟?没错!在使用JDBC时我们也有这个步骤哦 3.编写Mybatis_config.xml核心配置文件: 我们在核心配置文件使用<properties resource="db.properties"/>标签,就可以以引入外部的db.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:核心配置文件--> <configuration> <!-- 引入外部配置文件--> <properties resource="db.properties"/> <typeAliases> <typeAlias type="com.xxx.pojo.User" alias="User"/> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}"/> <property name="username" value="${username}" /> <property name="password" value="${password}" /> </dataSource> </environment> </environments> <!-- 映射器--> <mappers> <mapper resource="com/xxx/mapper/UserMapper.xml"/> </mappers> </configuration> 4.获取SqlSessionFactory对象(类似与JDBC中获取connection连接对象): public class MybatisUtils { private static SqlSessionFactory sqlSessionFactory; static { try { //使用mybatis第一步,获取SqlSessionFactory对象 String resource = "

搭建Kafka集群( 2.8.0版本)之一

1、启动zookeeper集群 Kafka最新版本2.8.0可以不依赖zookeeper,但是仍然测试阶段,所以官方不推荐使用,因此还是要使用zookeeper集群。 [root@node1 ~]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /opt/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node1 ~]# [root@node2 ~]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /opt/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node2 ~]# [root@node3 ~]# zkServer.sh start ZooKeeper JMX enabled by default Using config: /opt/zookeeper-3.4.10/bin/../conf/zoo.cfg Starting zookeeper ... STARTED [root@node3 ~]# 2、下载与上传 http://kafka.apache.org/downloads 当前最新版本是2.8.0 此处下载了 kafka_2.12-2.8.0.tgz,2.12是Scala的版本,2.8.0是kafka的版本。 然后上传到服务器 [root@node1 opt]# tar -zxvf kafka_2.12-2.8.0.tgz [root@node1 opt]# mv kafka_2.

2.2 ElasticSearch分词之分词器API

1.简介 elasticsearch提供了一个测试分词效果的API接口,endpoint是_analyze,其主要有指定analyzer、指定索引中的字段(分词结果与预期不一致时使用)以及自定义分词器三种测试方式。 2.指定analyzer POST /_analyze { "analyzer": "standard", "text": "stephen curry" } analyzer:分词器名称,standard是elasticsearch自带的一个分词器,并且是默认的text:测试文本 { "tokens" : [ { "token" : "stephen", "start_offset" : 0, "end_offset" : 7, "type" : "<ALPHANUM>", "position" : 0 }, { "token" : "curry", "start_offset" : 8, "end_offset" : 13, "type" : "<ALPHANUM>", "position" : 1 } ] } token:分词结果start_offset:起始偏移end_offset:结束偏移position:分词位置 3.指定索引中的字段 POST /employee/_analyze { "field": "name", "text": "stephen curry" } { "tokens" : [ { "

【RocketMQ】使用Prometheus + AlertManager制作RocketMQ告警

文章目录 安装AlertManager编写告警规则文件配置PrometheusWebhook接口 安装AlertManager 下载地址:https://prometheus.io/download/ 解压: tar -zxvf alertmanager-0.23.0.linux.amd64.tar.gz 修改alertmanager.yml配置文件,添加webhook route: group_wait: 30s group_interval: 5m repeat_interval: 1h receiver: 'xadd-rocketmq' receivers: - name: 'xadd-rocketmq' webhook_configs: - url: 'http://10.201.243.26:2301/rocketmq/api/alerts/webhook' 启动: nohup ./alertmanager --config.file=./alertmanager.yml & 访问页面: 默认端口为9093,可以看到配置已加载成功 编写告警规则文件 告警规则不是一成不变的,需要根据实际的业务量、机器的配置以及诸多因素进行调整。 刚开始写的规则,有几个一直报错:vector contains metrics with the same labelset after applying alert labels,原因是表达式查出的结果集里,有一个标签:group和系统自带的重复了,在使用{{$labels.group}}取值的时候就不知道取哪个了,使用label_replace函数替换一下即可,以下是修改后的规则文件: rockrtmq-rules.yaml groups: - name: rocketmq-rules rules: - alert: high disk ratio warning expr: sum(rocketmq_brokeruntime_commitlog_disk_ratio) by (cluster,brokerIP) * 100 > 60 for: 10m labels: group: xadd-rocketmq severity: warning annotations: message: 集群:{{$labels.

RT-Thread Studio 编译的APP程序不跳转的问题

RT-Thread Studio 编译的APP程序不跳转的问题 问题:使用RT-Thread Studio编辑代码,生成APP程序的时候通过,下图设置APP程序地址 但是下载进去发现APP程序不能跳转,遇到这种情况是没有把中断映射表整对,按照下图所示设置即可。

cat命令的基本用法

cat 可以查看文本内容 格式 cat [OPTION]...[FILE]... 常见选项 -E:显示行结束符$ -A:显示所有控制符 -n:对显示出的每一行进行编号 -b:非空行编号 -s:压缩连续的空行成一行 [root@mikeaq ~]# cat -E /data/aa.txt Linus is a$ great person $ [root@mikeaq ~]# cat /data/aa.txt 1 2 3 4 5 [root@mikeaq ~]# cat -A /data/aa.txt 1^I2$ 3^I4$ 5$ [root@mikeaq ~]# cat -n /data/aa.txt 1 1 2 3 2 4 5 3 6 7 8 4 9 [root@mikeaq ~]# cat -b /data/aa.txt 1 1 2 2 3 3 4 4 [root@mikeaq ~]# cat -ns /data/aa.

如何在电脑上安装并编译第一句Python

1.安装Anaconda 进入Anaconda官网下载 下载并安装 2.验证是否安装成功: 安装完成之后,从Windows开始菜单,点击 Anaconda Navigator 菜单项。 Navigator 首页显示了一些应用,其中有Spyder 已经默认安装好了,点击Launch 按钮。Sypder 是Python的一个简单的集成开发环境。 启动Spyder应用后,在左侧输入输出内容 ,如下所示。 2、安装PyCharm 进入PyCharm官网下载安装 直接点击“Download”即可。Pycharm有两种主要版本:Community和Professional,其中Community可以免费使用,点击Community的Download。 3. 如何用PyCharm写第一个代码 创建项目 选择File --> New Project–> Pure Python(在如下箭头位置处点击选择存储位置)–> create。 然后在New Project窗口,会出现设置项目名称和选择解释器(Interpreter)。 都设置完成之后,点击Create 安装,真正开始创建项目文件了。 添加Python File,命名为Hello。 在文件中,输入代码:print(“Hello World”)。 然后运行,在下方显示Python 代码的运行结果。 如何在PyCharm中配置Anaconda的包? 在PyCharm界面中选择:File-> Settings-> … ,如图中所示。 

jupyter合并(拆分)cell单元格

按住shift选中多个cell后,按shift+m可以合并选中的多个cell为一个cell。 这两个单元格合并之后变成一个。 合并之后也可以将一个单元格切分成两部分,首先将光标放在想分割的地方,然后按Ctrl+shift+ - 关于Jupyter Notebook的28个技巧

724 寻找数组的中心下标(前缀和)

1. 问题描述: 给你一个整数数组 nums ,请计算数组的中心下标 。数组中心下标是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。 示例 1: 输入:nums = [1, 7, 3, 6, 5, 6] 输出:3 解释: 中心下标是 3 。 左侧数之和 sum = nums[0] + nums[1] + nums[2] = 1 + 7 + 3 = 11 , 右侧数之和 sum = nums[4] + nums[5] = 5 + 6 = 11 ,二者相等。 示例 2: 输入:nums = [1, 2, 3] 输出:-1 解释: 数组中不存在满足此条件的中心下标。 示例 3:

PLSQL登录时报错:No matching authentication protocol

PLSQL连接Oracle数据库登录时报错 No matching authentication protocol 我的解决办法:客户端版本问题引起,换个高版本的客户端 (1) 打开PLSQL 点开【工具】 然后 【首选项】 找到【连接】 (2)解压instantclient_11_2.zip放置到D盘 (instantclient_11_2附件在文档末尾里) (3)更换配置 Oracle 主目录名 和OCI库,点击应用 D:\instantclient_11_2 D:\instantclient_11_2\oci.dll 附件为我的文件 下载链接 Oracle报错问题.docx

ArrayList和LinkedList哪个更占空间?

前言 相信在面试的时候可能都会碰到关于ArrayList和Linkedlist相关的面试题。趁此机会也记录一下。 ArrayList ArrayList是List接口的一个实现类,底层是Object数组,数据放在一个变量里面: transient Object[] elementData; 而这个elementData数组使用了一个transient关键字修饰,transient表示的意思是:序列化对象的时候,如果在属性前面加上了该关键字,那么在序列化是就不会将该属性序列化。 ArrayList初始化时默认数组长度为10,随着我们不断的往list中插入数据,当list大小超过容量时就会进行扩容,每次扩容的大小为之前的1.5倍。可以这么理解,当list已经足够大时,如果刚好插入的数据满足扩容的条件,那么扩容之后的list容量为之前的1.5,于是这个空间已经扩展的很大了。 由于ArrayList底层是数组,数组我们都知道可以根据索引来定位,相应ArrayList查找性能很快。但是数组我们又知道是一连串的空间组成,于是当我们在中间插入或者删除一个元素时,插入或删除位置之后的元素是不是都要向后移动或向前移动一位,所以插入或者删除都比较消耗性能。最后我们又知道,既然你是在中间插入或删除时后面元素需要移动,那我在最后插入元素是不是很快呢?是的,最后插入由于不需要移动元素,插入的效率很高。总结:ArrayList底层是数组,可以根据索引查找元素,查找效率很高,在数组中间插入或删除元素由于需要移动数据导致效率很低,但是在最后插入元素效率很高。 Linkedlist Linkedlist底层是双向链表,不需要指定初始容量,链表中任何一个存储单元都可以通过向前或向后的指针获取到前面或后面的存储单元。源码中使用Node来存储数据。 private static class Node<E> { E item; Node<E> next; Node<E> prev; Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } } 因为有保存前后节点的地址,LinkedList增删数据的时候不需要像ArrayList那样移动整片的数据,只需要通过引用指定index位置前后的两个节点即可。删除数据只需要改变index位置前后节点的指向地址即可。虽然增删数据很快,但是查询数据效率就比较低,查询数据时,首先会计算下链表总长度的一半,判断对应索引是在该值的左边还是右边,然后决定从头节点还是尾节点开始遍历。所以,Linkedlist增删数据较快,查询数据较慢,并且对内存占用空间也是很大的,因为每个node都维护这前后指向地址的节点。 谁更占空间? 表面上看,肯定是Linkedlist更占用空间,但是ArrayList扩容的时候会把之前的容量扩充为1.5倍。你可以试想下,我往ArrayList只想加一个元素,但刚好满足扩容条件,那是不是剩下的空间就浪费了呢。况且ArrayList本身就很大了,扩容1.5倍。。。 所以,如果数据量很大又在实时添加数据的情况下,ArrayList占用的空间不一定会比LinkedList空间小,这样的回答就显得谨慎些了,听上去也更加让人容易认同,但你以为这样回答就完美了吗?还记得我前面说的那个transient变量吗?它的作用已经说了,不想序列化的对象就可以用它来修饰,用transient修饰elementData意味着我不希望elementData数组被序列化。 为什么要这么做呢?这是因为序列化ArrayList的时候,ArrayList里面的elementData,也就是数组未必是满的,比方说elementData有10的大小,但是我只用了其中的3个,那么是否有必要序列化整个elementData呢? 显然没有这个必要,因此ArrayList中重写了writeObject方法。 每次序列化的时候调用这个方法,先调用defaultWriteObject()方法序列化ArrayList中的非transient元素,elementData这个数组对象不去序列化它,而是遍历elementData,只序列化数组里面有数据的元素,这样一来,就可以加快序列化的速度,还能够减少空间的开销。 最后,一般情况下,LinkedList的占用空间更大,因为每个节点要维护指向前后地址的两个节点,但也不是绝对,如果刚好数据量超过ArrayList默认的临时值时,ArrayList占用的空间也是不小的,因为扩容的原因会浪费将近原来数组一半的容量,不过,因为ArrayList的数组变量是用transient关键字修饰的,如果集合本身需要做序列化操作的话,ArrayList这部分多余的空间不会被序列化。

python爬虫报错:不信任证书问题的解决

SSLError 请求异常,SSL错误,证书认证失败问题解决 在爬取某些网站时,会发现如下报错: #请求脚本 from lxml import etree import os import requests headers = { "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36", } url = 'https://www.ygdy8.net/index.html' response = requests.get(url, headers=headers) content = response.content.decode('gbk') #报错信息 SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",) 解决方式: 第一种解决方式: 将https请求改为http请求,或许可能成功解决 from lxml import etree import os import requests headers = { "user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.

james-server-app-3.6.0 Windows

Install D:\Apache-James-Server\james-server-app-3.6.0\bin\wrapper-windows-x86-64.exe -i D:\Apache-James-Server\james-server-app-3.6.0\conf\wrapper.conf Remove D:\Apache-James-Server\james-server-app-3.6.0\bin\wrapper-windows-x86-64.exe -r D:\Apache-James-Server\james-server-app-3.6.0\conf\wrapper.conf Configations D:\Apache-James-Server\james-server-app-3.6.0\conf -------------------wrapper.conf------------------ set.default.REPO_DIR=../lib set.APP_BASE=. set.TMP=D:/Apache-James-Server/james-server-app-3.6.0/temp wrapper.console.loglevel=ERROR wrapper.java.maxmemory=2048 wrapper.logfile.loglevel=ERROR -----------------smtpserver.xml--------------------- <bind>0.0.0.0:25</bind> <authorizedAddresses>*</authorizedAddresses> <maxmessagesize>0</maxmessagesize> ----------------log4j2.xml----------------------- <Property name="logDir">D:\Apache-James-Server\james-server-app-3.6.0\log</Property> <AppenderRef ref="Console" level="ERROR" /> <AppenderRef ref="James" level="ERROR" /> -------------------pop3server.xml------------------ <bind>0.0.0.0:110</bind> <connectiontimeout>1200</connectiontimeout> ------------------domainlist.xml----------------- <defaultDomain>testserver.com</defaultDomain> Add users james-cli.bat -h 127.0.0.1 -p 9999 ListUsers james-cli.bat -h 127.0.0.1 -p 9999 AddUser Test@testserver.com 1

初学SpringJdbcTemplate报错记录一 type ‘java.sql.Driver‘ for property ‘driver‘: no

警告: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userDaoImpl': Unsatisfied dependency expressed through field 'jdbcTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbc' defined in class path resource [spring-config.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [spring-config.xml]: Initialization of bean failed; nested exception is org.

SU处理野外地震数据常用命令

1 数据格式转换 segy2su: segyread tape=filepath/input.segy > output.su su2bin: sustrip < input.su > output.bin 2 道头字查看 查看所有道头字 :sukeyword 查看某个道头字范围 :surange < input.su key=sx,gx,... 逐道查看道头字 :suedit < input.su key=sx,gx,... | more 3 观测系统输出及编辑 观测系统输出到屏幕 sugethw < input.su key=tracl,tracr,sx,sy,gx,gy,ns | more 观测系统输出到文件 sugethw < input.su key=tracl,tracr,sx,sy,gx,gy,ns output=geom > geometry.txt sugethw < input.su key=tracl,tracr,sx,sy,gx,gy,ns > geometry.txt 关键道头字设置 sushw < input.su key=key1,key2 a=a1,a2 b=b1,b2 c=c1,c2 d=d1,d2 j= > output.su a:起始值(第一道的值) b:道间隔 c:炮间隔 d:道偏移量 j:每炮道数 i=itr+d (itr道号,起始值为0而不是1) val(key)= a + b*(i%j) + c*(i/j) %取余 /取整 关键道头字改变/计算 suchw < input.

Target class [控制器] does not exist.

今天新建了一个laravel的项目 我也是第一次碰见这个错,一开始还以为自己的原因 解决如下 找到Providers目录 protected $namespace = ‘App\Http\Controllers’; 注释打开完美解决问题## 标题## Target class [控制器] does not exist.

基于STM32跑RT-Thread系统,bootload跳转到APP无法启动的问题

如题,无法启动的原因已经找到了,是中断向量表偏移没有在没有在合适的地方设置。 正常来说中断向量表偏移在STM32的启动文件的系统时钟初始化:“SystemInit()”函数中有做设置,如图: 所以我的中断向量表设置就这样的: 但是不管怎么样RT-Thread无法跑起来。debug发现bootload是没问题的;注释掉我的向量表偏移设置,把keil5的flash起始地址设置改回0x8000000,APP程序也是可以跑起来的。那到底是什么原因的? 不断调试发现bootload跳转到APP后,在APP的启动文件无法跳转RT-Thread的“$Sub$$main()”函数,后来我把APP启动文件的我自己的中断向量表设置注释掉,把中断向量表设置放在了"rt_hw_board_init()"函数的开头,然后就成功了,如图: 为什么会这样呢?项目急没有深究。。。感兴趣的朋友可以去深究一下为什么,也告诉我一下呗。 解决问题总结: 1、不要在STM32的启动文件的系统时钟初始化:“SystemInit()”函数中设置中断向量表。 2、在RT-Thread源文件的board.c里的"rt_hw_board_init()"函数开头设置自己的中断向量表。

springboot docker应用发布

springboot docker应用发布 idea docker 官网:https://www.jetbrains.com/help/idea/docker.html 说明:idea docker插件默认已经安装(file ==> settings ==> plugins) ************************ docker 远程连接 2375:非认证端口,不安全 2376:认证端口,需使用ca证书 制作 ca 证书:https://docs.docker.com/engine/security/protect-access/ country=cn state=zj city=hz orginazation=ali department=dev host=****** emailAddress=123456@qq.com openssl genrsa -aes256 -passout pass:123456 -out ca-key.pem 4096 openssl req -new -x509 -passin "pass:123456" -days 365 -key ca-key.pem -sha256 -out ca.pem -subj "/C=$country/ST=$state/L=$city/O=$orginazation/OU=$department/CN=$host/emailAddress=$emailAddress" openssl genrsa -out server-key.pem 4096 openssl req -subj "/CN=$host" -sha256 -new -key server-key.pem -out server.csr echo subjectAltName = IP:$host,IP:0.0.0.0 >> extfile.

结合Hutool实现SM2算法文件加解密 & 签名验签

结合Hutool实现文件加解密 & 签名验签 欢迎浏览本文章0 . 背景0.1 SM2 算法背景0.2 本文背景1 . 依赖引入2 .创建秘钥对象3 .核心:工具类4 .其他辅助类 欢迎浏览本文章 该文属于个人经验分享类,结合csdn多篇文章整合重制而成,可能存在不足和缺点,欢迎提出指导&意见。 0 . 背景 业务中涉及SM2算法,特抽象出为工具类。 0.1 SM2 算法背景 SM2密码算法是一种椭圆(非对称)密码算法,具有以下重要特性: 加密强度:256位(私钥长度);公私钥长度:公钥长度为64字节(512位),私钥32字节(256位);支持签名最大数据量及签名结果长度:最大签名数据量长度无限制;签名结果为64字节(但由于签名后会做ASN.1编码,实际输出长度为70-72字节);支持加密最大数据量及加密后结果长度:支持最大近128G字节数据长度;加密结果(C=C1C3C2)增加96字节【C1(64字节) + C3(32字节)】(如果首个字节为0x04则增加97字节,实际有效96字节)。 0.2 本文背景 本文并非100%原创,只是做了必要的封装,提供给同样需求的朋友。参考了以下文章,在此衷心感谢他们的研究和分享: 【SM2 SM3 SM4简介】https://blog.csdn.net/cqwei1987/article/details/107329600;【国密算法—SM2介绍及基于BC的实现】https://blog.csdn.net/zcmain/article/details/114099664;【hutool国密sm2算法使用, 正确的秘钥生成签名及验签,签名为64字节】https://blog.csdn.net/qq_33140565/article/details/113818235;【国密SM2算法加解密文件】https://blog.csdn.net/A_Lonely_Smile/article/details/118366945 1 . 依赖引入 <!--开始-国密SM2 算法依赖:bouncycastle & hutool --> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15to18</artifactId> <version>1.66</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.3.10</version> </dependency> <!--结束-国密SM2 算法依赖:bouncycastle & hutool --> 2 .创建秘钥对象 import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; /** * SM2 国密算法生成秘钥对 - 对象 */ @Data @Accessors(chain = true) @ApiModel(value = "

crontab 定时任务

一、crond简介 crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。 Linux下的任务调度分为两类,系统任务调度和用户任务调度。 系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。 /etc/crontab文件包括下面几行: cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=HOME=/ # run-parts 51 * * * * root run-parts /etc/cron.hourly 24 7 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly 前四行是用来配置crond任务运行的环境变量 第一行SHELL变量指定了系统要使用哪个shell,这里是bash 第二行PATH变量指定了系统执行命令的路径 第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务 执行信息给用户 第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。 第六至九行表示定时执行的任务。 使用者权限文件: 文件:/etc/cron.deny 说明:该文件中所列用户不允许使用crontab命令 文件:/etc/cron.allow 说明:该文件中所列用户允许使用crontab命令 文件:/var/spool/cron/ 说明:所有用户crontab文件存放的目录,以用户名命名 crontab文件的含义: 用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下: minute hour day month week command 其中:

一款非常好用且专业的免费万兴数据恢复软件

Wondershare Recoverit Mac版是一款非常好用且专业的免费万兴数据恢复软件,可以恢复所有文件类型,包括照片、视频、文档和其他文件。从所有数据丢失场景中检索数据,并从所有存储设备中恢复数据,并崩溃Windows系统或可启动问题!可靠的数据恢复软件,恢复率96%。测试环境:MacOS 11.3.1 Wondershare Recoverit Mac版安装教程 Apple T2 安全芯片的电脑无法使用该软件,查看方法如下: 在按住 Option 键的同时,选取苹果 () 菜单 >“系统信息”。 在边栏中,选取“控制器”或“iBridge”,具体取决于所使用的 macOS 版本。 如果您在右侧看到“Apple T2 芯片”,即表示您的 Mac 配备 Apple T2 安全芯片。如下图这样的就无法使用该软件。 安装包下载完成后,双击安装,根据安装器提示进行安装即可。 Wondershare mac破解版功能介绍 100%安全和完整的恢复过程 只读恢复 本程序不会尝试“修复”或写入您即将恢复的设备,因此它可以在不损坏您的数据的情况下运行。 恢复前预览 您可以随时预览文件,如照片,文档等等。 保存并恢复 保存以前的扫描结果并将其导入以恢复恢复,而无需再次扫描。 搜索 过滤按文件名,日期和大小的搜索功能快速查找文件,并节省时间。 完全恢复 删除文件恢复 回收站恢复 格式化磁盘恢复 丢失的分区恢复 外部设备恢复 病毒攻击数据恢复 系统崩溃数据恢复 轻松从具有可启动媒体的崩溃Windows系统中恢复数据。 全方位恢复 全面的综合恢复算法可以恢复您需要的一切。 数据恢复工具格式支持 文档 DOC / DOCX,XLS / XLSX,PPT / PPTX,PDF,CWK,HTML / HTM,INDD,Eps等。 照片 JPG,TIFF / TIF,PNG,BMP,GIF,psD,CRW,CR2,NEF,ORF,RAF,SR2,MRW,DCR,WMF,DNG,ERF,RAW等。 视频 AVI,MOV,MP4,M4V,3GP,3G2,WMV,ASF,FLV,SWF,MPG,RM / RMVB等

Python:找出两列表中相同元素,并打印出来

方法一: list1=['w','fk',12,6,'my',9] list2=['t',9,'h','w',6,70] print(set(list1)&set(list2)) #将两列表转换成集合,并求交集 #集合是无序的,打印出来的也是无序的 方法二: list1=['w','fk',12,6,'my',9] list2=['t',9,'h','w',6,70] list3=[] #创建空列表list3 for i in list1: #遍历list1的所有元素 if i in list2: #如果该元素在list2内(即是两列表相同元素),就添加到list3 list3.append(i) print(list3)

[laravel]laravel用户认证及api认证,session,cookie,api_token

我们开始制作完哪个站的时候第一个想要做的就是用户的问题,但是用户的问题说难不难,说简单也不简单,对于网页端,保存用户信息需要考虑使用的session,还是cookie,也有的公司使用token的,既然laravel本身是一个很牛逼的框架,那么我们就使用laravel来实现以下这三种用户认证方式,以方便我们在使用的时候可以选择自己需要的方式进行技术的选择. 一. 基础的认证功能(session) laravel本身提供了很好的认证功能,auth我们可以在创建工程的时候就可以直接使用这套认证系统.现在就来说明一下从0搭建这个基础的认证框架是怎么实现的,及其中的知识 1. 新建laravel项目叫project_laravel,并配置对应的服务器以及伪静态 laravel new project_laravel 2. 创建一个mysql数据库project_laravel_db 3. 使用vscode打开工程,修改.env文件制定数据库相关信息 4. 数据库处理 修改数据库配置文件内容,文件路径为\app\Providers\AppServiceProvider.php 添加use内容 use Illuminate\Support\Facades\Schema; 添加boot内函数 Schema::defaultStringLength(191); 创建迁移数据库表命令行中输入 php artisan migrate 5. 创建用户的控制器MyUserController php artisan make:controller MyUserController 6. MyUserController中定义reguser,sessionlogin和sessionuser方法 <?php namespace App\Http\Controllers; use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Auth; class MyUserController extends Controller { public function reguser(Request $request) { $user = User::create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); Auth::login($user); return Auth::user(); } public function sessionlogin(Request $request) { if (Auth::attempt(['name' => $request->username, 'password' => $request->password])) { return Auth::user(); } } public function sessionuser(Request $request) { if (Auth::check()) { return "

常用的排序算法(C语言版)

交换函数: void swap(int arr[], int i, int j) { int tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; } 一、冒泡排序 Bubble Sort 基本思想:交换排序,两两比较相邻记录的关键字,如果反序则交换,知道没有反序的记录为止。 (对相邻的元素进行两两比较,顺序相反则进行交换) 原始版: #include <stdio.h> void BubbleSort(int arr[], int len) { for (int i = 0; i < len; ++i) for (int j = len - 2; j >= i; --j) if (arr[j] > arr[j + 1]) swap(arr[j], arr[j + 1]); } int main() { int arr[] = {50, 10, 90, 30, 70, 40, 80, 60, 20}; int len = sizeof(arr)/sizeof(arr[0]); BubbleSort(arr, len); for (int i = 0; i < len; ++i) printf("