websocket stomp配置以及ws/wss协议的使用 STOMP是一个更高级的协议,它使用一个基于帧(frame)的格式来定义消息,与HTTP的request和response类似。本人主要讲述stomp 在websocket中的配置,以及与session的集合做点对点通信,以及微信小程序等需要ws/wss协议时候前后端的配置。
基本配置以及与SESSION的结合 1 springboot 中引入websocket依赖,这里用gradle构建,用maven对应过去就是了
compile group: 'org.springframework.boot', name: 'spring-boot-starter-websocket' 2 定义WebSocketStompConfig 配置类
@Configuration @EnableWebSocketMessageBroker public class WebSocketStompConfig extends AbstractWebSocketMessageBrokerConfigurer { /** * 注册stomp的端点 */ @Override public void registerStompEndpoints(StompEndpointRegistry registry) { // 允许使用socketJs方式访问,访问点为webSocketServer,允许跨域 // 在网页上我们就可以通过这个链接 // http://localhost:8080/webSocketServer // 来和服务器的WebSocket连接 registry.addEndpoint("/webSocketServer") .setAllowedOrigins("*") .addInterceptors(new SessionAuthHandshakeInterceptor()) .withSockJS(); } /** * 配置信息代理 */ @Override public void configureMessageBroker(MessageBrokerRegistry registry) { // 订阅Broker名称 registry.enableSimpleBroker("/queue", "/topic"); // 全局使用的消息前缀(客户端订阅路径上会体现出来) registry.setApplicationDestinationPrefixes("/app"); // 点对点使用的订阅前缀(客户端订阅路径上会体现出来),不设置的话,默认也是/user/ registry.setUserDestinationPrefix("/user/"); } /** * 配置客户端入站通道拦截器 */ @Override public void configureClientInboundChannel(ChannelRegistration registration) { registration.
此文章转载自:https://www.cnblogs.com/SarahLiu/p/5954832.html
这是面试中一道非常经典的问题。
当你在浏览器中输入一个网址,浏览器的处理过程如下:
第一步 浏览器查找该域名的 IP 地址 第二步 浏览器根据解析得到的IP地址向 web 服务器发送一个 HTTP 请求 第三步 服务器收到请求并进行处理 第四步 服务器返回一个响应 第五步 浏览器对该响应进行解码,渲染显示。 第六步 页面显示完成后,浏览器发送异步请求。 第七步 整个过程结束之后,浏览器关闭TCP连接。 下面对每个环节做进一步分析:
01 浏览器查找该域名的 IP 地址
DNS查找过程为:浏览器缓存->系统缓存->路由器缓存->ISP DNS缓存->递归搜索递归搜索过程为:从根域名服务器到顶级域名服务器到你查询的域名服务器。
浏览器缓存 首先是查找浏览器缓存,浏览器会缓存DNS记录一段时间,不同浏览器保存的时常不等(2分钟到30分钟不等)。 系统缓存 如果在浏览器缓存里没有找到需要的记录,浏览器会做一个系统调用来查找这个网址的对应DNS信息。 路由器缓存 如果在系统缓存里没有找到找到对应的IP,请求会发向路由器,它一般会有自己的DNS缓存。 ISP DNS服务器 如果在路由器缓存里还是没有对应的IP,请求会被发送到ISP。 根域名服务器 如果还是没有,请求将发向根域名服务器进行搜索。找不到就说明此域名不存在。
02 浏览器根据解析得到的IP地址向 web 服务器发送一个 HTTP 请求
可能会重定向响应
例如“http://facebook.com/”,服务器会给浏览器响应一个301永久重定向响应,这样浏览器就会访问“http://www.facebook.com/” 而非“http://facebook.com/”。
服务器重定向的原因有很多,举其中两个: 一:跟搜索引擎排名有关。你看,如果一个页面有两个地址,就像“http://www.facebook.com/” 和“http://facebook.com/”。搜索引擎会认为它们是两个网站,结果造成每一个的搜索链接都减少从而降低排名。 二:不同的地址会造成缓存友好性变差。当一个页面有好几个名字时,它可能会在缓存里出现好几次。
然后浏览器会跟踪重定向地址 浏览器会发送另一个获取请求到”http://www.facebook.com/”。
过程:
通过DNS获取到IP后,目标IP和本机IP分别与子网掩码相与的结果相同,那么它们在一个子网,那么通过ARP协议可以查到目标主机的MAC地址,否则的话,需要通过网关转发,也就是目标MAC是网关的MAC。 请求需要进行编码,生成一个HTTP数据包,依次打上TCP、IP、以太网协议的头部。其中TCP头部主要信息是本机端口和目标端口号等信息,用于标识同一个主机的不同进程,对于HTTP协议,服务器端的默认端口号是80,本机浏览器的话生成一个1024到65535之间的端口号。IP头部主要包含本地IP和目标IP等信息。以太网协议头部主要是双方的MAC地址,目标MAC可以由第一条所诉方法得到。以太网数据包的数据部分,最大长度为1500字节,所以如果IP包太大的话还要拆包,比如IP包5000字节,要分为4包,每一包都包含一个IP头部。
03 服务器收到请求并进行处理
负载均衡
网站可能会有负载均衡设备来平均分配所有用户的请求。 负载均衡,即对工作任务进行平衡,分摊到多个操作单元上执行,如图片服务器,应用服务器。可分为链路负载均衡,集群负载均衡,操作系统负载均衡 集群负载均衡又分为硬件负载均衡和软件负载均衡。
CDN
请求的数据可能存储在分布式缓存、静态文件或者数据库中。如果请求的数据是静态文件,如果在CDN上,那么CDN服务器又会处理这个用户的请求。如果在数据库中需要向数据库发起查询请求。
04 服务器返回一个响应
BasicAuth认证与Go Basic Auth是一种开放平台认证方式,简单的说就是需要你输入用户名和密码才能继续访问。Bath Auth是其中一种认证方式,另一种是OAuth。
Basic Auth认证处理简单几乎没有什么优点了,最大的缺点就是安全性低。不用说,OAuth认证方式克服了Basic Auth认证的所有缺点,并且也是目前广泛应用的。
gin框架提供了Bath Auth认证中间件,我们来看看该怎么玩。
首先是服务端代码:
package main import "gopkg.in/gin-gonic/gin.v1" var secrets = gin.H{ "foo": gin.H{"email": "foo@bar.com", "phone": "123433"}, "austin": gin.H{"email": "austin@example.com", "phone": "666"}, "lena": gin.H{"email": "lena@guapa.com", "phone": "523433"}, } func getSecrets(c *gin.Context) { user := c.MustGet(gin.AuthUserKey).(string) if secret, ok := secrets[user]; ok { c.JSON(200, gin.H{"user": user, "secret": secret}) } else { c.JSON(200, gin.H{"user": user, "secret": "No SECRET :("}) } } func main() { r := gin.
欢迎关注微信公众号: 程序员小圈圈 转载请标明出处^_^ 原文首发于: www.zhangruibin.com 本文出自于: RebornChang的博客 厚颜打广告,博主个人博客地址传送门 ,欢迎来访 请求远程接口的方式有很多,规则也有很多,暴露接口的方式也有很多,这里简单的说下怎样使用http请求方式提交post请求,并且参数是以xml文本格式.
首先要确定这个接口能够使用xml格式参数请求成功,可以先用接口测试工具进行测验,工具比如Postman,soapUI等等,具体的接口工具安装使用教程这里就不多说了,网上一搜一大把的,那么接下来说下HTTP+POST+XML格式的请求代码思路:
1.将参数XML参数格式写在项目文件中,在封装参数的时候,先读取XML文件,然后根据获取到的参数进行请求报文的拼接.这种方式的优点是可维护性较好,但是过程比较繁琐.
2.使用stringbilder或者stringbuffer对请求报文进行拼接.这种方式比之前一种效率略高,但是维护性偏低.
所以选择哪种方式进行请求报文的拼接,因地制宜.
然后再简单说下HTTP请求的报文传输,传输的过程大致分为以下几步:
1:创建HTTP链接.HTTPpost请求方式,基于HTTP协议创建链接,三次握手啥的,具体的创建链接过程可参考书籍深入理解HTTP1.0;
2:传输报文.当链路传输建立之后,就是使用协议请求方式(比如post)进行报文的传输.报文的传输无疑是用流的方式进行传输的,请求方先在本地定义好请求的报文,然后以流的方式通过建立的管道传输给服务端,服务端拿到请求数据流之后,对这个流进行解析,然后根据请求报文流的内容作出自己不同的回应.
3:对相应报文进行解析.服务端给出的回应到了请求端后,请求端根据服务器端返回的报文内容作出自己的判断.
那么将这个步骤体现到java代码又是怎样的?博主po出来自己写的一个使用StringBuilder拼接报文的样例代码仅供参考,其中请求的URL接口写在配置文件中,然后使用java UTIL 包里面的propertie进行properties文件的解析,拿到远端的请求接口.具体的代码如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import java.util.regex.Pattern; import com.ztesoft.sale.controller.login.LoginByAuthenUtils; /** * * @ClassName: HttpPostXml * @Description: TODO 使用http+post+xml方式访问远端接口 * @author: zhrb * @date: 2018年7月6日 上午11:26:28 v1.0 */ public class HttpPostXml { /** * * @author: zhrb * @Title: creatPostAndTransData * @Description: TODO * @param: @param dataMap,内含ip,disPhone,email * @param: @return String 类型,string是请求接口返回的报文信息拼接的字符串 * @return: String * @throws MalformedURLException,IOException */ public String creatPostAndTransData(Map<String, Object> dataMap) { String urlStr = "
刚刚看完相关的opencv编程的书籍,于是自己想做点东西练练手
要求是:对给定的图片中人体的脸部和手势进行提取
现在先是对一张图片进行训练,再过度到小包(含有多张图片的文件夹),这是用摄像机对我同学进行拍摄的图片(希望他不会打我。。)
先读出一张图片,对图片进行简单的噪声和滤波处理,然后转换成灰度图进行处理。
这里我用的是高斯滤波,也可以用其他的方法,个人感觉高斯滤波效果好点
肤色模型提取
在这里我提供两种方法给大家,一个是改进的YCbCrd的肤色检测和HSV模型检测。
此处参考的链接https://blog.csdn.net/jacke121/article/details/77861696
改进的YCbCrd的肤色检测
具体是Hsu等人提出在YCbCr空间建立肤色模型。算法步骤如下:
(1)亮度补偿:R、G、B三通道5%非线性Gamma校正
(2)颜色空间转换:RGB颜色空间转换到YCbCr颜色空间;
(3)使用规则作肤色分割。
Image2.create(srcImage.rows, srcImage.cols, CV_8UC3); float gamma = 0.95; for (int r = 0;r < Image2.rows;r++) { for (int c = 0;c < Image2.cols;c++) { Image2.at<Vec3b>(r, c)[0] =(int) pow(srcImage.at<Vec3b>(r, c)[0], gamma); Image2.at<Vec3b>(r, c)[1] = (int)pow(srcImage.at<Vec3b>(r, c)[1], gamma); Image2.at<Vec3b>(r, c)[2] = (int)pow(srcImage.at<Vec3b>(r, c)[2], gamma); } } Mat imgYcc; cvtColor(Image2, imgYcc,COLOR_BGR2YCrCb); cvtColor(srcImage, srcImage, COLOR_BGR2RGB); Mat imgSkin; imgSkin.create(srcImage.rows, srcImage.cols, CV_8UC3); float Wcb = 46.
一、Linux 目录 /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目录。所有的东西都是从这里开始。当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录。
/bin: /usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。
/boot:放置linux系统启动时用到的一些文件,如Linux的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub。
/dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱 mount /dev/cdrom /mnt。
/etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有 /etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d。
/home:系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,~表示当前用户的家目录,~edu 表示用户 edu 的家目录。
/lib: /usr/lib: /usr/local/lib:系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助。
/lost+fount:系统异常产生错误时,会将一些遗失的片段放置于此目录下。
/mnt: /media:光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。
/opt:给主机额外安装软件所摆放的目录。
/proc:此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有 /proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/* 等。
/root:系统管理员root的家目录。
/sbin: /usr/sbin: /usr/local/sbin:放置系统管理员使用的可执行命令,如fdisk、shutdown、mount 等。与 /bin 不同的是,这几个目录是给系统管理员 root使用的命令,一般用户只能"查看"而不能设置和使用。
/tmp:一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下。
/srv:服务启动之后需要访问的数据目录,如 www 服务需要访问的网页数据存放在 /srv/www 内。
/usr:应用程序存放目录,/usr/bin 存放应用程序,/usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local: 存放软件升级包。
/usr/share/doc: 系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录。
/var:放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,
/var/log/message:所有的登录文件存放目录,/var/spool/mail:邮件存放的目录,/var/run:程序或服务启动后,其PID存放在该目录下。
-----------------------------------------警记---------------------------------------------
//创建一个形状类Shape,包含纯虚函数area,派生出Circle类及Rectangle类,通过一个total函数求其二者的和 #include<iostream> using namespace std; const double pi = 4 * atan(1.0); class Shape { public: virtual double area() = 0; }; class Circle :public Shape { private: double radius; public: Circle(double r) :radius(r) {} double area() { return pi * radius * radius; } }; class Rectangle :public Shape { private: double length; double width; public: Rectangle(double l,double w):length(l),width(w){} double area() { return length * width; } }; double total(Shape *shape[], int num) { double tot = 0; for (int i = 0; i < num; i++) { tot += shape[i]->area(); } return tot; } int main() { Circle cir(2); cout << cir.
最近用到的一个开源项目kkFileView:可以实现多种文本文件在Web端在线预览,由于是部署在linux服务器上,部署过程出一些乱码的问题,在此整理一下。
1.安装LibreOffice 下载LibreOffice_5.4.7_Linux_x86-64_rpm.tar.gz解压在解压后的目录下执行./install ./RPMS/ /home/xyh/officeTool (/home/xyh/officeTool是安装路径,执行该命令后会在该路径下生成/opt/libreoffice5.4目录,此为libreoffice的安装路径) 2.安装redis 下载redis安装包。在redis-4.0.9/src/目录下执行./redis-server & 3.将kkFileView-master打jar包 (1)进入kkFileView-master/jodconverter-web/src/main/resources目录下。 (2)修改application-dev.properties文件。
修改file.dir = /home/xyh/officeTool/upfile(为上传ppt文件设置保存位置)。修改office.home=/home/xyh/officeTool/opt/libreoffice5.4(设置libreoffice的安装路径) (3)修改logback.xml文件的标签。
修改value="/home/xyh/officeTool/upfile/app.log"(日志路径) (4)利用maven将kkFileView-master进行打包,如果没有maven要先进行安装 在kkFileView-master下执行mvn package,如果失败,加上跳过测试的参数,执行mvn package -Dmaven.test.skip=true (5)运行kkFileView-master/jodconverter-web/target/jodconverter-web-1.5.8.RELEASE.jar。
java -jar jodconverter-web-1.5.8.RELEASE.jar cn.keking.FilePreviewApplication & 4.访问http://192.168.1.104:8012/index如果显示下图,则部署成功。 5.如果出现中文乱码可能是因为以下两个原因。 ubuntu操作系统的默认语言是英语,需要修改成中文的。如果操作系统已经是中文的了,那就是缺少字体库。 以上问题的解决方案 修改系统语言为中文
/** 编辑locale文件,将内容修改为: LANG="zh_CN.UTF-8" LANGUAGE="zh_CN:zh" **/ sudo vim /etc/default/locale` reboot//重启后方可生效 修改系统字体库
/usr/share/fonts //将字体库替换。替换fonts文件夹即可。
微信公众号:吉姆餐厅ak
学习更多源码知识,欢迎关注。
概述: Spring Boot 2.0相对于之前的版本,变化还是很大的。首先对jdk的版本要求已经不能低于1.8,其次依赖的spring的版本也是最新版本5.0,并集成了功能强大的webflux等。
SpringCloud Finchley 版本的升级也带来了全新组件:Spring Cloud Function 和 Spring Cloud Gateway ,前者致力于函数式编程模块的整合,后者则是网关netflix zuul 的替换组件。
1)需要的依赖: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.iyb</groupId> <artifactId>saturn</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>sc-saturn</name> <description>sc-saturn for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.1.RELEASE</version> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <mapper.version>3.4.0</mapper.version> <pagehelper.version>4.1.6</pagehelper.version> <fastjson.version>1.2.13</fastjson.version> <jackson.version>2.8.5</jackson.version> <druid.version>1.0.27</druid.version> <mysql.version>5.1.40</mysql.version> <commons-fileupload.version>1.3.1</commons-fileupload.version> </properties> <dependencies> <!--starter begin--> <!--spring cloud starter--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.
信息转自网上 普通的请求JS无法获取,只有ajax请求才能获取到。
$.ajax({ type: 'HEAD', // 获取头信息,type=HEAD即可 url : window.location.href, complete: function( xhr,data ){ // 获取相关Http Response header var wpoInfo = { // 服务器端时间 "date" : xhr.getResponseHeader('Date'), // 如果开启了gzip,会返回这个东西 "contentEncoding" : xhr.getResponseHeader('Content-Encoding'), // keep-alive ? close? "connection" : xhr.getResponseHeader('Connection'), // 响应长度 "contentLength" : xhr.getResponseHeader('Content-Length'), // 服务器类型,apache?lighttpd? "server" : xhr.getResponseHeader('Server'), "vary" : xhr.getResponseHeader('Vary'), "transferEncoding" : xhr.getResponseHeader('Transfer-Encoding'), // text/html ? text/xml? "contentType" : xhr.getResponseHeader('Content-Type'), "cacheControl" : xhr.getResponseHeader('Cache-Control'), // 生命周期? "exprires" : xhr.
nIT行业技术变更周期越来越快,作为技术人最重要的是持续学习,现在的学习途径有很多,我们到底该如何做出选择?我觉得最重要有两方面:第一,需要保持良好的技术视野,持续关注行业内技术新动向;第二,多向IT行业大佬学习,了解他们走过来的经验。
今天推荐一些行业内优质技术号,这些号的主人在技术圈深耕多年,关注这些技术号可以让我们第一时间了解行业前沿技术,深度学习他们分享的实战经验,让我们的技术提升事半功倍。
Java后端技术
▲长按图片识别二维码关注
专注Java相关技术:SSM、Spring全家桶、微服务、MySQL、MyCat、集群、分布式、中间件、Linux、网络、多线程,偶尔讲点运维Jenkins、Nexus、Docker、ELK,偶尔分享些技术干货,致力于Java全栈开发!
Java技术栈
▲长按图片识别二维码关注
Java技术栈,这是一个以 Java 后端技术为主的原创技术公众号。包括 Java 核心技术、多线程编程、Spring Boot、Spring Cloud、缓存、消息队列、架构设计等各种技术干货、Java 面试题、各种技术教程等。☞ 现在关注,掌握一手 Java 开发技术行情。
Hollis
▲长按图片识别二维码关注
Hollis是一个专注于Java技术的公众号,其发布内容90%以上都是原创Java相关技术文章,包括但不限于源码,原理,经验,杂谈等。该号的负责人是《JAVA工程师成神之路》系列文章的作者,就职于阿里巴巴,有着丰富的开发经验。关注他,和他一起码出未来。
Java葵花宝典
▲长按图片识别二维码关注
java知识和技术查漏补缺,空余时间学习碎片化知识,分享开发、运维、架构等综合性知识,助力职场最后一公里与职业进阶,每天看宝典,就选它。
码农有道
▲长按图片识别二维码关注
一个百度人的技术提升之路,为您提供一系列系统架构、数据结构、网络、C++、计算机底层等高质量技术文章,让您的碎片化时间最大价值化。同时会不定期分享精品免费视频和资源,让您的技术之路不再单调枯燥。
Java之猿程之家
▲长按图片识别二维码关注
本公众号由各大互联网公司在职的技术负责人组成的小编团队,都是有过多年大型互联网项目的开发经验以及团队管理经验,公众号正在持续更新从Java初级、中级、高级,以及大数据,自行编写的开源框架,并且带有最全的知识星球(视频资源以及电子书籍)Java新的书籍的详解文章,等等一系列的文章供大家参考,学习,赶快加入吧。
Java面试那些事儿
▲长按图片识别二维码关注
简介:Java面试那些事儿,一个坚持原创的技术型公众号。站在初学者的角度来深挖每一个知识点,站在面试官的角度来分析每一道面试题,站在攻击者的角度来写好每一篇防御案例,已帮助不少小伙伴进入了一线互联网企业。
程序员小秘圈
▲长按图片识别二维码关注
程序员小密圈,一个学习编程技术和读者福利共存的公众号。每天推送高质量的优秀博文、开源项目、实用工具、面试技巧、编程学习资源等等。目标是做到最好公众号推送平台 。公众号每月至少有一次读者送书福利!欢迎关注,老铁!
程序员内推圈
▲长按图片识别二维码关注
IT人交流面试经验,分享有趣的段子,推荐工作机会的平台。欢迎IT行业的同胞们加入!
JAVA小咖秀
▲长按图片识别二维码关注
用漫画的方式使得技术有趣起来,用画图的方式使得理解起来更简单。在这会让你化繁为简,事半功倍。前行路上不要一个人,加入小咖这一家,和我们一起学习,我们关心你飞的高不高,更关心你飞的累不累。
文末福利 留言说说对公众号的建议,比如排版、内容等都可以,也欢迎有小伙伴们投稿!抽取3名幸运观众,送3本实体书籍【java多线程编程核心技术】
本文转载自博客园 作者:小a玖拾柒 出处:http://www.cnblogs.com/ftl1012/
setuid(suid): 针对命令和二进制程序的,当普通用户执行某个(passwd)命令的时候,可以拥有这个命令对应用户的权限,
即让普通用户可以以root用户的角色执行程序或命令。
setgid(sgid): 希望一个目录被多个用户(同属于一个组)共享,同一个组的用户可以处理
粘滞位(t) : 把一个文件夹的权限都打开,然后共享文件,像/tmp一样,但是 生产环境一般不使用
suid setuid(suid): 针对命令和二进制程序的
chmod u+s h.txt
chmod 4777 h.txt
chmod u-s h.txt
查看passwd命令的权限
1 2 3 4 [root@localhost ftl]# ll /usr/bin/passwd 问题: passwd文件的属组是root,表示只有root用户可以访问的文件,为什么普通用户依然可以使用该命令更改自己的密码? 答案:当普通用户[omc]使用passwd命令的时候,系统看到passwd命令文件的属性有大写s后,表示这个命令的属主权限被omc用户获得,也就是omc用户获得文件/etc/shadow的root的rwx权限 image
用户添加s权限【用4表示s位,有大写s表示有suid权限】
1 2 [root@localhost ftl]# chmod 4600 hhh.txt –>【当x位没有小写x执行权限的时候,sudi的权限显示的就是大S】 [root@localhost ftl]# chmod 600 hhh.txt
image
查找拥有s权限且文件权限为755的文件
1 find / -type f -perm 4755 image
取消ping命令的共享权限
1 2 3 which ping –> /bin/ping –>显示4755 chmod 755 /bin/ping 普通用户用不了 ping命令了 image
1.有一张shop表,有三个字段article,author,price,选出每个author的price的最高的纪录。(要包含所有字段) 解法一:使用相关子查询:
SELECT article,author,price FROM shop s1 WHERE price = (SELECT MAX(s2.price)FROM shop s2 WHERE s1.author=s2.author ); 解法二:使用非相关子查询:
SELECT article,s1.author,s1.price FROM shop s1 JOIN(SELECT author,MAX(price) AS price FROM shop GROUP BY author) AS s2 ON s1.author=s2.author AND s1.price=s2.price; 由于子查询在有些时候,效率会很低,所以最后提供的方法是用LEFT JOIN语句。 解法三:使用LEFT JOIN 语句
SELECE s1.article,s1.author,s1.price FROM shop s1 LEFT JOIN shop s2 ON s1.author=s2.author AND s1.price<s2.price WHERE s2.article IS NULL; 上述LEFT JOIN(左连接)语句的原理是: 当 s1.price 是当前author的最大值时,就没有 s2.price比它还要大,所以此时s2的rows的值都会是NULL。 2.两个表结构如下: ①如果学号的前两位表示年纪,要查找98级女生的姓名,请写出相应SQL语句。 第一种:
一、传递函数与微分方程是一一对应的关系
传递函数、频率特性、频域分析与时域的各个环节是一一对应的,好处在于便于分析计算。
频域本身没有什么物理意义,它的意义就在于与时域环节一 一对应,见到频域的传递函数,就想到它对应的时域的环节。
以惯性环节为例,看到传递函数K/(Ts+1)就想到惯性环节的过程是先对输入进行积分,等到3~4T的时候才保持恒值
确实有点惯性的意思,给它一个输入,它不愿意马上就变过去,还想保持原来的状态,于是就扭扭捏捏地变过去。
二、惯性环节
惯性环节的输出一开始并不与输入同步按比例变化,直到过渡过程结束,y(t)才能与x(t)保持比例。这就是惯性地反映。惯性环节的时间常数就是惯性大小的量度。凡是具有惯性环节特性的实际系统,都具有一个存储元件或称容量元件,进行物质或能量的存储,如电容、热容等。由于系统的阻力,流入或流出存储元件的物质或能量不可能为无穷大,存储量的变化必须经过一段时间才能完成,这就是惯性存在的原因。
eg.电机就是惯性环节:给它施加电压,不能马上转到电压对应的速度;撤去电压,Motor不能马上停。
惯性环节
分母阶次大于分子阶次,主要表现在系统的惯性。
这句话值得思考,像上面的一阶惯性环节,分母阶次比分子大一阶,其实就是多了一阶导函数。
三、惯性环节与积分环节
可以看到,惯性环节的bode图分为两个部分,首先是比例过程,等过渡过程结束之后就是一个积分过程。
https://blog.csdn.net/heartsdance/article/details/119734906
thrift 下载网址: http://archive.apache.org/dist/thrift/0.9.3/
需要下载的依赖库有:openssl-1.0.2o-- 、thrift-0.9.3、libevent-2.1.8-stable、boost_1_66_0--其中依赖库也需要生成LIB来进行调用。
1.编译BOOST: 编译好后,自己用一下 ,可以写一个简单的demo
关于boost的编译,参见 https://blog.csdn.net/ljt350740378/article/details/87091133
2.编译openssl-1.0.2o : 编译好后,自己用一下 ,可以写一个简单的demo
参见 https://blog.csdn.net/ljt350740378/article/details/87807544 2.编译 libevent-2.1.8-stable: 编译好后,自己用一下 ,可以写一个简单的demo
编译 libevent-2.1.8-stable,其中可以把 openssl嵌套编译进去,如下图:参见 https://blog.csdn.net/ljt350740378/article/details/87856875
3.下载thrift
http://thrift.apache.org/download thrift-0.12.0.tar.gz 和 thrift-0.12.0.exe
E:\canDel\thrift-0.12.0\tutorial\cpp 里面有例子教程
参考 https://github.com/Zuolijia/thrift https://blog.csdn.net/zuolj/article/details/77450108
4.编译thrift
打开工程,如下所示: E:\canDel\thrift-0.12.0\lib\cpp\thrift.sln
thrift命令:
thrift --gen cpp xxx.thrift #Linux下
thrift-0.9.3.exe --gen cpp xxx.thrift #Windows下
thrift-0.9.3.exe -r -strict --gen cpp:cob_style xxx.thrift #异步
然后其中:添加包含目录: $(ProjectDir)\src\;$(ProjectDir)\src\thrift\windows\;E:\canDel\boost_1_59_0\;E:\canDel\libevent-2.1.9-beta\openssl\inc32\include;E:\canDel\libevent-2.1.9-beta\;E:\canDel\libevent-2.1.9-beta\include;E:\canDel\libevent-2.1.9-beta\WIN32-Code\nmake\;$(IncludePath)
库目录:$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);E:\canDel\libevent-2.1.9-beta;E:\canDel\libevent-2.1.9-beta\openssl\inc32\lib;
附加依赖库:libevent.lib;libevent_core.lib;libevent_extras.lib;libevent_openssl.lib;libeay32.lib;ssleay32.lib;
将E:\canDel\thrift-0.12.0\config.h 放入 E:\canDel\thrift-0.12.0\lib\cpp\src\thrift 中。
有时候 会出现错误,如:错误 1 error C1083: 无法打开包括文件: “netinet/in.
案例:
FailureMessage = FText::Format( LOCTEXT("PrimaryGameModuleCouldntBeLoaded", "The game module '{0}' could not be loaded. There may be an operating system error or the module may not be properly set up."), TextModuleName );
调用单例:
FMessageDialog::Open(EAppMsgType::Ok, FailureMessage);
效果:
参考:
UE4 ProjectManager.cpp /94/
一、算术运算 + - * % 等
二、条件测试 用于判断需求是否满足。测试机制 测试命令有: test expression [ expression ] [[ expression ]] 注意:expression前后必须要有空白字符 bash的测试类型:
数值测试: -gt 是否大于 -lt 是否小于 -ge 大于等于 -le 小于等于 -eq 等于 -ne 不等于 字符串测试: == 等于 > 大于 < 小于 != 不等于 ~= 左右两侧是否能够匹配 -z “string” 测试字符串是否为空,空则真,否则假 -n “string” 测试字符串是否不为空,不空则真。否则假 注意:用于字符串比较时用到的操作数都应该使用引号
bash中变量的种类: ①本地变量 生效范围为当前shell进程,对其他shell进程均无效 变量赋值:name=‘value’ value ——可以是直接字串,name=“username” 变量引用,name=“$username” 命令引用,name=command或者name= (command)变量引用: ( c o m m a n d ) 变 量 引 用 : {name} 显示已定义的变量:set 删除已定义的变量:unset name ②环境变量 生效范围为当前shell及其子进程 变量声明、赋值: export name=value declare -x name=value
变量引用: $name 显示所有环境变量: export env printenv 删除环境变量:unset
③位置变量:调用命令行传递给脚本的参数
$1 $2……对应调用第几参数 shift [n] 表示撤销几个参数的命令 $0 表示命令本身 $*:传递给脚本的所有参数 $@:所有参数 $#:传递给脚本的个数
http://www.elijahqi.win/archives/3930 题意:缩小一次之后最小的长度缩小为多少
那么我是直接暴力做的.. 考虑首先先把每个字符串变成数字 然后暴力枚举区间
然后贪心的看和这个区间相同的最多有多少个 那么 找出之后计算答案看能否更新即可
#include<bits/stdc++.h> using namespace std; const int N=330; int n,s[N],id[N],cnt,ans; map<string,int> mm; int main(){ // freopen("f.in","r",stdin); std::ios::sync_with_stdio(false); cin>>n; for (int i=1;i<=n;++i){ string tmp;cin>>tmp;int idd=0; if(!mm[tmp]) mm[tmp]=idd=++cnt;else idd=mm[tmp]; id[i]=idd;s[i]=s[i-1]+tmp.length(); }ans=s[n]+n-1; for (int i=1;i<=n;++i){ for (int j=i;j<=n;++j){ int d=j-i,tot=0; for (int k=j+1;k+d<=n;++k){ bool flag=1; for (int z=0;z<=d;++z) if (id[i+z]!=id[k+z]){flag=0;break;} if (flag) ++tot,k+=d; } if(tot){ int tmp=s[n]-(tot+1)*(s[j]-s[i-1])+tot+n; ans=min(ans,tmp); } } }printf("%d\n",ans); return 0; }