使用命令:netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 查看连接状态统计
或者ss -s命令查看
问题描述:
http大量短连接以及客户端主动closed会导致大量time_wait以及closed
我方主动或者客户端调用close()断开连接,收到对方确认后状态变为TIME_WAIT。TCP协议规定TIME_WAIT状态会一直持续2MSL(即两倍的分 段最大生存期),以此来确保旧的连接状态不会对新连接产生影响。处于TIME_WAIT状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少TIME_WAIT状态造成的资源浪费。因此,解决服务器time_wait最好办法是用tcp长连接。
TCP协议中有TIME_WAIT这个状态
主要有两个原因
1、防止上一次连接中的包,迷路后重新出现,影响新连接(经过2MSL,上一次连接中所有的重复包都会消失)
2、可靠的关闭TCP连接。在主动关闭方发送的最后一个 ack(fin) ,有可能丢失,这时被动方会重新发
fin, 如果这时主动方处于 CLOSED 状态 ,就会响应 rst 而不是 ack。所以主动方要处于 TIME_WAIT 状态,而不能是 CLOSED 。
解决方法:
使用命令:vim /etc/sysctl.conf
编辑文件,加入以下内容:
net.ipv4.tcp_syncookies = 1 (某些情况下该参数已启用)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
然后执行/sbin/sysctl -p让参数生效。
net.ipv4.tcp_syncookies = 1表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
文章目录 1 实验目的和内容1.1 实验目的1.2 实验内容1.3 实验要求 2 设计思想2.1 根据BNF描述该文法2.2 根据文法写出LR(0)项目集规范族2.3 根据项目集规范族画出识别活前缀的DFA2.4 判断该文法是否是LR(0)文法2.5 构造LR(0)分析表 3 算法流程4 源程序5 调试数据6 思考:词法分析+语法分析6.1 将实验一的词法分析作为函数写入语法分析程序6.2 调试数据6.3 调试结果 7 实验调试情况及体会7.1 实验调试情况7.2 实验体会 1 实验目的和内容 1.1 实验目的 (1)给出 PL/0 文法规范,要求编写 PL/0 语言的语法分析程序。
(2)通过设计、编制、调试一个典型的自下而上语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。
(3)选择最有代表性的语法分析方法,如算符优先分析法、LR 分析法;或者调研语法分析器的自动生成工具 YACC 的功能与工作原理,使用YACC 生成一个自底向上的语法分析器。
1.2 实验内容 (1)已给 PL/0 语言文法,构造表达式部分的语法分析器。
(2)分析对象〈算术表达式〉的 BNF 定义如下:
<表达式> ::= [+|-]<项>{<加法运算符> <项>}
<项> ::= <因子>{<乘法运算符> <因子>}
<因子> ::= <标识符>|<无符号整数>| ‘(’<表达式>‘)’
<加法运算符> ::= +|-
<乘法运算符> ::= *|/
<关系运算符> ::= =|#|<|<=|>|>=
在三表查询时,我的collection集合还能获取到一条数据,找了3小时,最终发现是因为主键名重复(我sql查询语句中第二个表没有写主键,导致我忽略了主键不能重复),还是之前犯过的错误,细微且致命!
一:原代码: 我的Mapper映射如下:
三表查询select标签如下:
<select id="selectOrder" resultMap="orderMap"> select d_order.*,orderItem.count,orderItem.amount, book.book_name,book.Dangprice,book.product_image from d_order left join order_item orderItem on d_order.id=orderItem.order_id left join d_book book on book.book_id=orderItem.product_id where d_order.user_id=1 order by d_order.ordertime desc </select> 二、修改后的代码: 映射不变,只需给主键名字重复起别名即可,修改sql语句如下:
<select id="selectOrderById" resultMap="orderMap"> select d_order.*,order_item.id order_item_id,order_item.count count,order_item.amount,d_book.book_name,d_book.Dangprice,d_book.product_image from d_order left join order_item on d_order.id=order_item.order_id left join d_book on d_book.book_id=order_item.product_id where d_order.id=#{orderId} </select> 三、总结 任何细小的过失都要付出沉重的代价!!
目录
前言
一、VS2019的安装
二、解除“scanf”的警报及“懒人”头文件包的添加
三、多个程序文件的创建与运行
四、VS2019的常用快捷键
前言 在开始接触编程学习时,我们最先接触的编译软件大概就是vc 6.0 & Dev-c ++ ,它们的界面相似,使用起来是有诸多不便的,vc 6.0就不必说了,打个括号还得先左后右,Dev-c ++有时需要手动缩进也让人头疼(有的版本debug程序还会出错)。
这时,有一款VS 2019(Visual Studio 2019)“杀”了进来,它的自动缩进,对齐,准确报错……都碾压了前两者,给我们的编程学习带来了极妙的体验。但有些同学在自行安装使用的过程中“走进了大牢”,被各种陌生选项给劝退。其实很多难以看懂的地方是不需要了解的,我们只需要使用2019的部分内容就已足够。别慌放心,请和笔者一起不费脑子地学会如何使用VS2019吧。
一、VS2019的安装 首先我们直接在百度中寻找VS2019.
接着,我们找准其中的Community 2019下载 当下载好以后,2019会要求你确认下载位置,默认下载在C盘,其实倒像是“强制安装”在C盘,当我们选择其他盘的时候,2019总会提示错误。所以我们直接按照默认下载地址点击确认就好。
接下来,确认工作负载,我们只需要点击“使用C++的桌面开发”即可,已能满足日常编程学习的需求(毕竟2019其实是一个办公使用的开发软件),勾选其他选项将下载一些暂时用不上的内容,且内存占用较大。(若有其他需求可自行勾选)
(中间还有一步确认主题颜色的设置,黑色yyds)
安装好以后,运行VS 2019,我们将看到如下界面,点击创建新项目。 点击空项目。
写下一个你喜欢的项目名。 当我们点击创建以后,本以为可以像Dev-c++ 一样开始敲代码了,但出现的界面确是空空如也,找不到一个可以敲代码的地方。
这时,我们找到界面上方的“视图” →“解决方案资源管理器”并点击。
在界面的右方便会出现管理器,接着我们找到其中的“头文件”→“添加”→“新建项”。
选择“C++文件(.cpp)” ,在底下创建你喜欢的文件名称。
这时,可以敲代码的界面就生成啦!
接着,让我。们来敲一段简单的输入a,并输出a的值的程序。
点击“本地Windows调试器”进行编译与运行。 这时我们发现程序无法运行,并没有跳出熟悉的小黑框,而是在底下发出了错误警告。
我们一起来看一看这段错误说明,它说“scanf”也许不安全,应该考虑用“scanf_s”进行替代,那么我们将scanf改成scanf_s便应该行得通,那么这时我们可能就有疑问,为什么scanf不安全?如果每次输入的时候都要多敲一个“_S”岂不是特别麻烦?
解释一下,scanf是标准的C语言的输入,但是对于不同的编译器,输入操作是会存在不同的表示形式的(其实大部分相同)。VS2019的输入便特殊为“scanf_s”,所以当我们只敲scanf时,编译器是会发出警报的。
那么每次多敲一个“_S”的麻烦有没有办法解决呢?
有!
下面我们进入一个简单的添加设置。
二、解除“scanf”的警报及“懒人”头文件包的添加 在我们初学C语言的时候,每一个程序都要在开头加上一句
#include<stdio.h> 有的时候还会使用到<math.h>头文件以及其他头文件,重复无脑的码在开头,也许会让珍惜时间的我们感到枯燥。通过添加设置,我们既可以解除警报,又能使创建的每一个新文件都在开头自动生成这些头文件。
操作如下。
首先,右击你的VS2019图标(桌面,任务栏都行),点击属性。
在属性中,打开文件所在位置。
在界面右上方的寻找处输入以下文件名:
newc++ file.cpp 并寻找。
接着,先左击选中它,再右击查看→“打开方式”→“记事本”。
我们的大致流程是将解除警告的一行字符,及我们需要添加的头文件写入记事本中,并保存就能达到效果了。但是当我们进行保存操作时,它会提示你未有管理员权限。 这时我们的“支线任务”是用管理员模式打开记事本。
对于任意一个应用,我们基本都能通过右击它,来寻找打开它的管理员模式。
但对于有的电脑(比如笔者的联想),我们会发现怎么找不到“记事本”这个应用? 这时我们可以这样做,先以正常的操作右击“newc++ file.cpp”文件以记事本形式打开,这时,在我们电脑的底栏里就会出现记事本图标,右击它,便能找到管理员身份。
这时候,我们又打开了一个新的记事本窗口(可以把原来开的那个不是管理员身份的关掉)
复制粘贴以下代码:
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.
全双工,双工,单工的区别
全双工(Full Duplex)是通讯传输的一个术语。
通信允许数据在两个方向上同时传输,它在能力上相当于两个单工通信方式的结合。全双工指可以同时进行信号的双向传输
单工就是在只允许甲方向乙方传送信息,而乙方不能向甲方传送 。
半双工(Half Duplex)数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。例如,在一个局域网上使用具有半双工传输的技术,一个工作站可以在线上发送数据,然后立即在线上接收数据,这些数据来自数据刚刚传输的方向。像全双工传输一样,半双工包含一个双向线路,两线制。
动态规划.join()函数:一个字符串方法,它返回被子字符串连接的字符串。
语法: ‘sep’.join(seq)
参数说明
sep: 分隔符。可以为空
seq: 要连接的元素序列、字符串、元组、字典
上面的语法即: 以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值: 返回一个以分隔符sep连接各个元素后生成的字符串
参数: The join() method takes join()方法需要可迭代的元素来一次返回它的一个成员,比如列表,元组,字符串,字典和集合
返回值: join()方法返回一个被子字符串连接的字符串。
Type Error: 如果这个可迭代元素包含任何不是字符串的值,join()函数就会抛出 list1 = ['1','2','3','4'] s = "-" s = s.join(list1) print(s) python中字符串强制类型转化是str()int()函数:
int(object, base) >> object : 一个数字或字符串参数 ; base :进制数
可完成将其他进制数转化为十进制bin()函数:
将十进制转化为二进制装饰器概念:
装饰器的实现是由闭包支撑的;装饰器本质上是⼀个python函数,它可以在让其他函数在不需要做任何代码的变动的前提下增加额外的功能;装饰器的返回值也是⼀个函数的对象,它经常用于有切面需求的场景,实现路由传参,flask的路由传参依赖于装饰器,浏览器通过url访问到装饰器的路由,从而访问视图函数获得返回的HTML页面;装饰器应用场景:
可以在外层函数加上时间计算函数,计算函数运行时间;计算函数运行次数;可以用在框架的路由传参上;插入日志,作为函数的运行日志;事务处理,可以让函数实现事务的一致性,让函数要么一起运行成功,要么一起运行失败;缓存,实现缓存处理;权限的校验,在函数外层套上权限校验的代码,实现权限校验;装饰器 @unctools.lru_cache(maxsize=128, typed=False)
参数 >>>
maxsize: 代表缓存的内存占用值,超过这个值之后,就的结果就会被释放,然后将新的计算结果进行缓存,其值应当设为2的幂
typed: 若为True,则会把不同的参数类型得到的结果分开保存
MDK与git一起使用管理嵌入式软件项目 使用git管理MDK工程的忽略文件基本原理具体操作第一步:增加忽略文件第二步:生成git本地库并提交git提交 STM32CubeMX工程忽略文件示例 使用git管理MDK工程的忽略文件 使用MDK开发stm32,RT1052等ARM MCU比较方便,但是在程序编译、连接等中间过程中会产生很多无用文件。
基本原理 git可指定忽略的文件类型,我们只需要将上述keilkill.bat脚本中指定删除特定扩展名的文件类型设置为git忽略即可。
具体操作 第一步:增加忽略文件 在git工程根目录下新建 .gitignore文件,该文件为git要忽略的配置文件,将keilkill.bat的扩展名复制粘贴到文件中,如下:
# Keil Generated output files in the sub-directories .\Listings and .\Objects *.lst *.o *.d *.crf *.lnp *.axf *.htm *.build_log.htm *.dep *.iex *.i *.bin *.hex SI/ project/ #Keil Project screen layout file *.uvguix.* *.uvgui.* #JLINK file JLinkLog.txt 第二步:生成git本地库并提交 在git bash中执行以下命令
git init
git提交 图片中三步操作分别为:git本地仓库初始化、增加文件到暂存区、提交文件。
执行完成后本地仓库已经建立,之后每次修改都可以进行后两步操作来对源代码进行存储管理。
还可以针对不同功能进行分支开发:matser、feature、dev,具体参考一般互联网开发流程,比如gitflow等。
这样就可以只管理你的.c .h文件了。
但是这种方式只能在新建工程后,就创建,如果已经执行了git add . && git commit . -m “somethings”
再新建.gitignore的话,.gitignore对之前添加的文件是不起作用的。
一.两种进程的简要介绍: 孤儿进程:父进程先于子进程结束,则子进程成为孤儿进程,子进程的父进程成为 init 进程,称为 init 进程领养孤儿进程 ;
僵尸进程:进程终止,父进程尚未回收,子进程残留资源(PCB)存放于内核之中,变成僵尸进程(它几乎放弃进程退出前占用的所有内存,既没有可执行代码,也不能被调度,只在进程列表中保留一个位置,记载进程的退出状态,供父进程收集);
二.实例 1.孤儿进程代码及结果如下:
#include"stdio.h" #include"stdlib.h" #include"unistd.h" int main(){ pid_t pid; printf("Begin...\n"); pid = fork(); if(pid == -1){ // pid 值为-1,则创建子进程失败 perror("fork error!"); exit(1); } else if(pid == 0){ // pid 值为0,则创建子进程成功 printf("i am child,pid = %u,ppid = %u\n",getpid(),getppid()); sleep(3); printf("i am child,pid = %u,ppid = %u\n",getpid(),getppid()); } else{ // pid 值为非负整数,则为父进程 printf("i am parent,pid = %u,ppid = %u\n",getpid(),getppid()); sleep(1); printf("...parent goes to die.
今天在cmd运行 python .... 突然爆出来这个错,都懵逼了,重启之后也是这样 看了下path的环境变量,windowsApps在最前面
只需要把 python的提到他之前就可以了
如果用cc.label显示特别长的文字,有可能会显示不出来,需要把 cacheMode 设置为 CHAR ,就可以正常显示了。
Win10系统设置在开机,关机,登录时执行脚本 有时为了特定需要Win10在开机,关机,登录时等情况下执行某个脚本,那么需要如何操作呢?我们可以利用组策略管理功能,分别在计算机配置及用户配置中提供,用户添加对应的脚本即可,支持普通脚本和PowerShell脚本,而不支持组策略的系统也可以使用其它的办法。下面一起来看看如设置。
步骤如下:
1、打开开始菜单或运行,输入gpedit.msc打开,展开 计算机配置 - Windows 设置 - 脚本,添加启动或关机脚本,用户配置 - Windows 设置 - 脚本,添加登录或注销脚本。
2、它们的添加方式完全相同,希望在什么时候执行脚本就双击哪个,点击添加按钮填入脚本路径及可能的参数。PowerShell脚本默认会在普通脚本执行后执行,在PowerShell脚本选项卡下选择执行先后
3、启动及登录的脚本可以设置为同步及不同步执行,默认不同步。同步执行代表系统会在启动文件资源管理器界面程序和创建桌面之前等待脚本完成运行,所以可能会延长进入系统的时间。
4、在 计算机配置 - Windows 设置 - 管理模板 - 系统 - 脚本 下设置,用户配置下也有部分选项,但优先级低于计算机配置中的设置。
在“指定组策略脚本的最长等待时间”中设置超时时间,如果脚本在设置的时间内还没有执行完毕,则会被强制终止,并记录一个错误事件。
建议在添加脚本前先手动运行一次,检查错误。
如果系统不支持组策略,可以使用另外的办法让系统在关机前执行任务,比如写一个脚本,将关机命令添加到最后面,每次通过此脚本关机即可,开机启动的方式就更多了。
搬砖网络侵权立删
转载:https://www.juyifx.cn/article/874156415.html
ioctl是iocontrol的缩写,就是IO控制。
行为上
简单来说,如果你在写驱动程序时候,碰到一些IO操作,在逻辑上不能归类到read,不能归类到write,那就可以认为是ioctl的部分。
read和write应该是写入和读出数据的,应该是作为单纯的数据交换的方式来处理。而ioctl则是控制read和write一些选项的。
比如:你做了一个通用的读写IO端口的驱动模块。read和write是从端口读写数据的,但是更改读写的端口,这个操作应该如何处理呢?显然用ioctl来实现比较合理。
比如你的read和write是可以阻塞的,或者不能阻塞的,或者对设备文件的读写是可以并发的,或者是不可以并发的,这些都可以写成可以用ioctl来配置的情况。后面为了可以用ioctl来实现模块不同的IO特点。
参数上
ioctl的一般参数格式就是命令字(常量)+命令参数的方式。
read和write的参数格式都是数据缓冲区+数据目的地指针+长度。
一、 什么是ioctl ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。下面是其源代码定义:
函数名: ioctl
功 能: 控制I/O设备
用 法: int ioctl(int handle, int cmd,[int *argdx, int argcx]);
参数:fd是用户程序打开设备时使用open函数返回的文件标示符,cmd是用户程序对设备的控制命令,后面是一些补充参数,一般最多一个,这个参数的有无和cmd的意义相关。
include/asm/ioctl.h中定义的宏的注释:
#define _IOC_NRBITS 8 //序数(number)字段的字位宽度,8bits #define _IOC_TYPEBITS 8 //幻数(type)字段的字位宽度,8bits #define _IOC_SIZEBITS 14 //大小(size)字段的字位宽度,14bits #define _IOC_DIRBITS 2 //方向(direction)字段的字位宽度,2bits #define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) //序数字段的掩码,0x000000FF #define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) //幻数字段的掩码,0x000000FF #define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) //大小字段的掩码,0x00003FFF #define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) //方向字段的掩码,0x00000003 #define _IOC_NRSHIFT 0 //序数字段在整个字段中的位移,0 #define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) //幻数字段的位移,8 #define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) //大小字段的位移,16 #define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) //方向字段的位移,30 #define _IOC_NONE 0U //没有数据传输 #define _IOC_WRITE 1U //向设备写入数据,驱动程序必须从用户空间读入数据 #define _IOC_READ 2U //从设备中读取数据,驱动程序必须向用户空间写入数据 #define _IOC(dir,type,nr,size) \ (((dir) << _IOC_DIRSHIFT) | \ ((type) << _IOC_TYPESHIFT) | \ ((nr) << _IOC_NRSHIFT) | \ ((size) << _IOC_SIZESHIFT)) //构造无参数的命令编号 #define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) //构造从驱动程序中读取数据的命令编号 #define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) //用于向驱动程序写入数据命令 #define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) //用于双向传输 #define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) //从命令参数中解析出数据方向,即写进还是读出 #define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) //从命令参数中解析出幻数type #define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) //从命令参数中解析出序数number #define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) //从命令参数中解析出用户数据大小 #define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) #define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT) #define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT) #define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT) #define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) #define IOCSIZE_SHIFT (_IOC_SIZESHIFT) 二、ioctl的必要性 如果不用ioctl的话,也可以实现对设备I/O通道的控制。例如,我们可以在驱动程序中实现write的时候检查一下是否有特殊约定的数据流通过,如果有的话,那么后面就跟着控制命令(一般在socket编程中常常这样做)。但是如果这样做的话,会导致代码分工不明,程序结构混乱,程序员自己也会头昏眼花的。所以,我们就使用ioctl来实现控制的功能。要记住,用户程序所作的只是通过命令码(cmd)告诉驱动程序它想做什么,至于怎么解释这些命令和怎么实现这些命令,这都是驱动程序要做的事情。
今天给小伙伴们分享一个基于 SpringBoot + Vue 实现的可视化拖拽编辑的大屏项目-AJ-Report
简介 AJ-Report由 安吉加加 开源的一个BI平台,酷炫大屏展示,能随时随地掌控业务动态,让每个决策都有数据支撑。
多数据源支持,内置mysql、elasticsearch、kudu驱动,支持自定义数据集省去数据接口开发,支持17种大屏组件,不会开发,照着设计稿也可以制作大屏。
三步轻松完成大屏设计:配置数据源---->写SQL配置数据集---->拖拽配置大屏---->保存发布。欢迎体验。
在线体验 在线体验: https://report.anji-plus.com/index.html 体验账号:guest 密码:guest
在线文档: https://report.anji-plus.com/report-doc/
在线提问: https://gitee.com/anji-plus/report/issues
发行版本: https://gitee.com/anji-plus/report/releases
功能概述 组件介绍
大屏设计(AJ-Report)是一个可视化拖拽编辑的,直观,酷炫,具有科技感的图表工具全开源项目。内置的基础功能包括数据源,数据集,报表管理,项目部分截图如下。
在线案例还在努力创造中,敬请期待!!! 数据流程图 打包目录build ├── bin 启动命令脚本 │ ├── restart.sh │ ├── start.bat │ ├── start.sh │ └── stop.sh ├── conf 配置文件目录 │ └── bootstrap-dev.yml ├── logs 启动日志目录 ├── cache 本地缓存目录 ├── lib 自定义扩展包&report-core核心包 系统目录 ├── doc 文档源码 │ ├── docs │ ├── package.json │ └── README.
最基本的Makefile编写 工程文件夹下有 main.c f1.c f2.c head.h 四个文件
Makefile可以省略头文件
text:f1.o f2.o main.o //生成text的目标文件 gcc main.o f1.o f2.o -o text //具体生成的执行命令 f1.o:f1.c //生成f1.o 的目标文件 gcc -c -Wall f1.c -o f1.o //具体生成的执行命令 f2.o:f2.c gcc -c -Wall f2.c -o f2.o main.o:main.c gcc -c -Wall main.c -o main.o .PHONY:clean//伪命令 ,加上之后不管什么情况都可以执行clean clean://清除命令 rm *.o text ~ 还可以使用下面这种方式,用变量代替一些参数,功能类似宏定义
OBJS=f1.o f2.o OBJS+=main.o CFLAGS=-c -Wall CC=gcc text:$(OBJS) $(CC) $(OBJS) -o text f1.o:f1.c $(CC) $(CFLAGS) f1.c -o f1.o f2.o:f2.c $(CC) $(CFLAGS) f2.
转载自:移动云开发者社区
一、 Windows沙盒技术介绍
Windows沙盒提供了轻型桌面环境,可安全地隔离运行应用程序。 沙盒环境中Windows软件保持"沙盒"状态,并独立于主机运行。沙盒是临时的, 关闭后,将删除所有软件和文件以及状态。每次打开应用程序时,都会获得沙盒的全新的实例。安装在主机上的软件和应用程序不会直接在沙盒中提供。如果需要沙盒环境中可用的特定Windows,则必须在环境中显式安装它们。
(一)Windows沙盒具有以下属性:
· 部分Windows系统支持: 此功能所需的一切内容都包含在Windows 10 专业版和Enterprise。 无需下载 VHD。
· 用户: 每次Windows沙盒运行时,它都像全新安装沙盒Windows。
· 可释放:设备上不会保留任何内容。 当用户关闭应用程序时,将放弃所有内容。
· 安全:使用基于硬件的虚拟化进行内核隔离。 它依赖 Microsoft 虚拟机监控程序运行单独的内核,该内核将沙Windows与主机隔离。
· 高效: 使用集成的内核计划程序、智能内存管理和虚拟 GPU。
(二)启动沙盒的必备条件
· Windows 10 专业版、Enterprise 或教育版 18305 或 Windows 11 (Windows 沙盒当前在家庭版Windows不受支持)
· AMD64 体系结构
· BIOS 中启用的虚拟化功能
· 建议至少 4 GB 的 RAM (8 GB)
· 建议使用 SSD 至少 1 GB (SSD)
· 在四个内核中 (两个 CPU 内核,建议使用超线程)
二、 本地环境测试
最近有一个需求 给我几个三角形 他们之间的边相邻
但是我们知道unity中的图片都是矩形的,所以因为他们的位置关系,他们的空白处都会互相影响
就像上边这个图一样,除了三角区域其他都是我们不想要的 接到的需求是 鼠标移动到每个三角里边,都会高亮
我在网上找了好多资料,也找到几种方法
1.计算 我们把三角形的几个顶点以及我们鼠标传进入 然后计算是否鼠标在三角形区域里边
因为我们这里是每帧检测的,所以显然这个不是很适合
2.射线检测 这个的局限性比较大,如果项目中的UI不是很方便的调用相机,我们总不能为了这一个小小的需求去大改我们的整体
3.继承Image 这个是我参考一个博主的文章 下面我给出地址
源地址
这里他是继承unity原生的Image类 然后重写了一个方法
public class IrregularCollision : Image { private PolygonCollider2D _polygon; private PolygonCollider2D Polygon { get { if (_polygon == null) _polygon = GetComponent<PolygonCollider2D>(); return _polygon; } } public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera) { Vector3 point; RectTransformUtility.ScreenPointToWorldPointInRectangle(rectTransform, screenPoint, eventCamera, out point); return Polygon.OverlapPoint(point); } } 我们需要把上边的脚本加载到检测的图片上 然后使用PolygonCollider2D 组件 在图片上绘制出来不规则的范围
1:下载源码:libssh2https://www.libssh2.org/
2.OpenSSL安装
编译libssh2需要安装OpenSSL,这里自己编译库比较复杂,直接安装带库的包比较方便:
直接从 Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 下载
注意,不要下载 light 版本,因为 light 版本不带库文件。
这里仅仅是使用安装目录的库文件。
3.在根目录创建编译目录
mkdir build cd build cmake .. 如果环境正确:
-- Configuring done -- Generating done -- Build files have been written to: E:/libssh2-libssh2-1.10.0/build 执行:
cmake --build . 将会在E:\libssh2-libssh2-1.10.0\build\example\Debug中编译出各个例子的exe文件。
同样在E:\libssh2-libssh2-1.10.0\build\src\Debug中会生成libssh2.lib文件。
4.编译dll
双击E:\libssh2-libssh2-1.10.0\build\example的ALL_Build.vcxproj(任何一个都行)
打开VS:
这里我将Debug模式改为了release,重新生成libssh2目录:
在E:\libssh2-libssh2-1.10.0\build\src\Release便生成新的release的lib.
修改libssh2文件夹下的CmakeLists.txt文件:
将
add_library(libssh2 ${SOURCES}) 改为:
add_library(libssh2 SHARED ${SOURCES}) 重新编译: 目录: E:\libssh2-libssh2-1.10.0\build\src\Release Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 2021/9/26 10:29 226304 libssh2.
首先,为什么我们需要作物?裁剪是为了从图像中移除所有不需要的物体或区域或者是突出图像的一个特殊特征。
与Numpy使用切片操作实现裁剪不同,OpenCV没有特定的函数来进行裁剪操作。读取的每个图像都存储在一个2D数组中(对于每个颜色通道)。只需指定要裁剪的区域的高度和宽度(以像素为单位)即可。
1.简单版本代码实现 下面的代码片段展示了如何使用Python和c++裁剪图像。在后面的文章中,你将会更详细地了解这些。
(1)Python
# 导入相关包 import cv2 import numpy as np img = cv2.imread('test.jpg') print(img.shape) # Print image shape cv2.imshow("original", img) # 裁剪图像 cropped_image = img[80:280, 150:330] # 显示裁剪图像 cv2.imshow("cropped", cropped_image) # 保存裁剪图像 cv2.imwrite("Cropped Image.jpg", cropped_image) cv2.waitKey(0) cv2.destroyAllWindows() (2)C++
// 包含库文件 #include<opencv2/opencv.hpp> #include<iostream> // 命名空间 using namespace std; using namespace cv; int main() { // 读取图像 Mat img = imread("test.jpg"); cout << "Width : " << img.size().width << endl; cout << "
css:级联样式表,层叠样式表,W3C提出的,用来装饰网页样式和UI等等一门技术
一、css的几种写法:
行内样式:
style属性上写 :<div style = "color=red"><.div>
页面样式:(內联样式)<style> div{color:yellow}</style>
外联样式:写在一个独立的xxx.css文件中
2007年 W3C三层分离
HTML 结构层
css 行为层
JavaScript 行为层
<link rel="stylesheet" type="text/css" href="css/index.css"/>引入css文件、、、type可以不写
link和@import的区别:
@import是 CSS 提供的语法规则,只有导入样式表的作用;link是HTML提供的标签
加载页面时,link标签引入的 CSS 被同时加载;@import引入的 CSS 将在页面加载完毕后被加载。
link引入的样式权重大于@import引入的样式。
二、css的颜色设置
<div style="color=red">
三原色:< div style="#00FF00">每两位表示一种颜色(红绿蓝)
< div style="color=rgb(255,255,255);">
<div style="color=rgb(255,255,255,.2)>透明度 0.2可省略为.2