最近做安全测试,遇到了SQL盲注的漏洞,从发现漏洞,确认漏洞,协助开发复现漏洞,验证漏洞一整套流程下来,有了亿点点收获,下面分享给大家,希望对软件测试同学有所启发,难度不大,小白看完也能上手的那种。
话不多说,先上图!!!
一、sqlmap工具简介
sqlmap 是一个自动化的 SQL 注入和渗透测试工具,是开源免费的, 支持 MySQL、Oracle、PostgreSQL、Microsoft SQL Server、Microsoft Access、IBM DB2、SQLite、Firebird、Sybase 和 SAP MaxDB 等数据库管理系统, 可以帮助渗透测试人员自动化地检测和利用 SQL 注入漏洞,获取数据库服务器上的数据,甚至可以在某些情况下获取操作系统的shell。
sqlmap支持五种不同的注入模式:
基于布尔的盲注,即可以根据返回页面判断条件真假的注入;
基于时间的盲注,即不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;
基于报错注入,即页面会返回错误信息,或者把注入语句的结果直接返回在页面中;
联合查询注入,可以使用 union 情况下的注入;
堆查询注入,可以同时执行多条语句执行时的注入。
二、sqlmap工具安装
1、安装Python
此次演示的Python版本是Python 3.6.6
2、在官网:sqlmap: automatic SQL injection and database takeover tool,下载sqlmap安装包,选择任意一种格式均可
3、解压sqlmap,并将解压的文件复制到Python安装路径下
演示的Python安装目录在:D:\Python36
4、在桌面创建一个cmd的快捷方式,并命名为sqlmap
5、在快捷方式sqlmap上鼠标右键,选择“属性”,把起始位置修改为sqlmap所在路径后,点击“确定”按钮
6、双击快捷方式sqlmap,并输入:sqlmap.py -h
这样,sqlmap就安装成功了。
三、sqlmap参数讲解
1、-u "URL"
指定URL,一般用于get请求
用法:python sqlmap.py -u "接口地址"
例如:python sqlmap.py -u "https://xxxx/saler/list?customerId=2"
2、-r
sqlmap可以从一个文本中读取原始的 HTTP 请求,通过这种方式,能够免于设置部分选项(例如:设置 Cookies,POST 数据等参数)
例如:python sqlmap.py -r D:\user.txt --dbs
详细梳理数据总线、地址总线、字、字长、字节和位的概念及关系。
欢迎指正、讨论、关注、分享~
一、计算机总线 总线是CPU、内存、输出/输出设备传递信息的公用通道。在计算机系统中,主机的各个部件通过总线相连接,外部设备通过相应的接口电路与总线相连接。按照计算机所传输的信息种类,计算机总线分为:控制总线CB、数据总线DB和地址总线AB。
1. 控制总线 通过传递控制信号和时序信号(如读/写信号、中断响应信号等)对外部器件进行控制。
2. 数据总线 用于传送数据信息,是双向三态形式的总线。
双向:
①将CPU的数据传送到存储器(RAM、ROM)或I/O接口等其他部件
②将其他部件的数据传送到CPU
三态:
高水平(1)、低水平(0)、高组态(Z)
数据总线的宽度一般指CPU中运算器与存储器之间进行互连的内部总线二进制位数,即CPU一次读取的二进制位数(内部总线根数)。数据总线宽度决定了就是计算机一次所能传递的二进制位数(数据量),决定了在主存储器和CPU之间的数据交换效率 。数据总线宽度是决定计算机性能的一个重要指标。
数据总线宽度说明字长,数据总线宽度为n ,字长为n位(bit)
3. 地址总线 用于传送地址信息,由于地址只能从CPU传向外部存储器或I/O端口,所以地址总线是单向三态的。
地址总线的位数,即地址总线宽度,即地址总线根数
地址总线的位数决定了CPU可直接寻址的内存空间大小,决定了CPU能直接访问的内存单元的个数。
内存单元=(字节)存储单元
内存按字节(byte)编址,每个地址指向的存储单元可以保存一个字节的数据。即每个存储单元内存空间大小为1Byte
地址总线宽度为n ,则CPU可直接寻址空间大小为2^n字节,CPU可直接访问的内存单元个数为2^n
二、字和字长 1. 字 在计算机中,字是其用来一次性处理事务的一个固定长度的位组。
存储单元:
存放一个机器字的存储单元,通常称为字存储单元,其单元地址称为字地址。
存放一个字节的存储单元,称为字节存储单元,其单元地址称为字节地址。
计算机中可以编址的最小单元是字存储单元,则该计算机为按字寻址的计算机。
计算机可编址的最小单位是字节,则该计算机为按字节寻址的计算机。
例如:一个32位计算机,一个字=32位=4字节
2. 字长 字长,一个字的二进制位数(bit), 指的是CPU一次能并行处理的二进制位数。
字长直接反映了一台计算机的计算精度,在其他指标相同时,字长越大计算机的处理数据的速度就越快。
例如:一个32位计算机,其字长为32位
三、字节和位 1字节(Byte/B) = 8 位(bit/b)
本文默认用户在已经配置好服务器和本地ssh私钥。
1. 安装 remote-ssh 插件 2. 安装完后点击 + 号 3. 输入命令, 如: ssh -p 22 xxx@192.168.10.10 其中 -p 22 参数指定端口为22。(22为ssh默认端口) xxx为要登录使用的用户名,@ 后面的是目标服务器的ip地址。
4. 选择config文件 第3点的命令回车后能看到选择config文件的路径。默认选择 C:\Users\xxx\.ssh 即可。
图中D盘的路径是我指定的自定义路径。
5. 连接 选择完config后能看到弹窗,说的是配置已经加入到config文件中。点击connect连接即可。
若关闭了窗口,可以点击下图绿色部分进行连接。
近期,最大的计算机领域新闻莫过于Intel CPU严重漏洞曝光。该漏洞被称为“Meltdown”和“Spectre”,几乎涵盖了所有使用Intel芯片的计算机,包括PC、笔记本电脑、服务器和移动设备。
Meltdown漏洞的主要风险是黑客可以利用此漏洞访问操作系统的核心内存,从而获得操作系统中存储的所有敏感数据,如密码、私钥、加密密钥等。而Spectre则可以允许攻击者通过危险的JavaScript代码从一个网站窃取另一个网站的信息。
此次漏洞严重影响了全球各个领域的计算机安全问题,包括银行、信用卡公司、云计算、医疗保健等。
不过,幸运的是目前市场上已经有多家厂商发布了补丁程序,其中包括Microsoft、Apple、Amazon、Google、Linux等。而且,Intel公司已承诺将为这些公司提供技术支持和更改设计以解决这些漏洞。
尽管这一事件引起了一些担忧,但人们依然相信计算机仍然是目前社会运转的基石之一,并且相信在科技的帮助下,我们能够应对和解决这些问题。
此次漏洞的曝光也进一步提醒人们在日常使用计算机时的安全意识。作为普通用户,应当避免不必要的访问来路不明的网站和程序,保护好自己的网络账号和密码,不轻易输入个人身份信息等。同时,应该及时更新操作系统和安装的软件以及防病毒软件以保证计算机的安全。
而对于企业、政府机构等,更需要加强网络安全防护措施,在网络安全管理上加强控制和监督,并定期组织员工进行相关安全教育和培训,以切实保障组织运转的安全性。
最后,我们要注意的是,计算机技术的发展速度是非常快的,而漏洞的发现以及修复难以完全规避,因此保持安全意识和及时更新软件与系统是长久以来保护计算机安全的有效手段。
同时,对于漏洞的修复也需要采取多种手段。除了开发者发布补丁外,用户和企业也可以采取以下措施:
限制软件的使用权限。比如,操作系统和应用程序可以设置使用权限,避免非管理员账户对系统敏感信息和配置进行修改。
防火墙和入侵检测系统的帮助。防火墙和入侵检测系统可以阻止攻击者从计算机网络访问电脑系统,并对恶意流量进行检测和阻止。
安全软件的使用。安全软件能够通过不断更新特征库,以便及时发现和阻止病毒、恶意软件,保障计算机及相关数据的安全。
及时备份数据。在备份时要注意备份数据的完整性和恢复数据的可靠性。
总之,计算机安全是一个重要问题,需要个人和组织共同关心和维护。只有在大家的共同努力下,才能进一步提升计算机的安全水平。
此外,随着技术的不断进步,安全风险也在不断增加。如今的云计算、物联网、人工智能等新兴技术,也给注重安全的企业和个人带来更多挑战。
针对这些新兴技术带来的威胁,我们需要不断学习和探究相关安全知识和解决方案,同时也需要注重网络安全法规和标准。如欧盟通用数据保护条例(GDPR)、全球数据保护条例(GPDR)等,都为互联网治理和信息安全提供了有力的支撑和引导。
综上所述,计算机安全是一个长期而艰巨的任务,需要我们不断地关注和投入精力。只有透过漏洞修复、技术完善和监管加强等多重手段,才能实现计算机及数字化世界的安全有序运转。
此外,提高个人安全意识也是保障计算机安全的重要环节。许多网络攻击都是通过利用用户的疏忽或无知来实现的。因此,我们需要了解一些基本的安全知识,比如设置复杂的密码,不轻易泄露个人信息,不随意打开邮件附件或下载来路不明的软件等。
企业和机构应该建立健全的安全管理制度和体系,包括完善的安全防控方案、网络安全培训和演练、及时的安全漏洞修复等。同时,还需要引进专业的安全产品和服务,如入侵检测与防御系统、数据加密技术、安全服务外包等,为企业和机构提供更可靠的保障。
总之,保障计算机安全是一个千头万绪的工程,需要广泛的意识宣传、政府、企业和组织的合作以及人类智慧和努力。只有全社会共同参与才能真正实现数字世界的安全发展。
方法一 使用 ResizeObserver methods:{ // echarts 图表 domEcaharts(){ let dom = document.getElementById('centent') let myChart= this.$echarts.init(dom) let option = {....} myChart.setOption(option) this.chartRsize(myChart,dom) } // echats 自适公共方法 chartRsize(myChart,dom){ const chartObserver = new ResizeObserver(() => { myChart.resize(); }); chartObserver.observe(dom); } } 方法二 使用 addEventListener methods:{ // echarts 图表 domEcaharts(){ let dom = document.getElementById('centent') let myChart= this.$echarts.init(dom) let option = {....} myChart.setOption(option) window.addEventListener("resize", () => { myChart.resize(); }); // window.addEventListener('resize', () => { // myChart1.
1 设置用户名
git config --global user.name "username"
2 设置邮箱 (没有双引号)
git config --global user.email useremail@qq.com 3 . 查看用户名和密码
git config user.name
git config user.email
目录 1. 优先级队列1.1 概念 2. 优先级队列的模拟实现2.1 堆的概念2.2 堆的存储方式2.3 堆的创建2.3.1堆的向下调整2.3.2 建堆的时间复杂度堆的插入和删除 2.常用接口2.1 `PriorityQueue`的特性2.2 `PriorityQueue`常用接口介绍2.3 练习 3. 堆的应用3.1 PriorityQueue的实现3.2 堆排序3.3 Top-k问题 1. 优先级队列 1.1 概念 队列是一种先进先出的数据结构,有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出列,该中场景下,使用队列显然不合适,比如:在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话。
这种情况下,数据结构因该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。而这种数据结构,就叫做优先级队列(Priority Queue)。
2. 优先级队列的模拟实现 JDK1.8中的PriorityQueue底层使用了堆这种数据结构,而堆实际就是在完全二叉树的基础上进行了一些调整。
2.1 堆的概念 如果有一个关键码的集合K = {k0,k1,k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组 中,并满足:Ki <= K2*i+1 且 Ki<= K2*i+2 (或Ki >= K2*i+1 且 Ki >= K2*i+2) i = 0,1,2…,则称为小堆(或大堆)。根结点最大的堆叫做最大堆或者大根堆,根结点最小的堆叫做最小堆或小根堆。
解释:这里的K2*i+1是Ki的左孩子,K2*i+2是Ki的右孩子
堆的性质:
堆中某个节点的值总是不大于或不小于其父节点的值堆总是一棵完全二叉树 数组中存储的就是完全二叉树层序遍历 的结果
2.2 堆的存储方式 从堆的概念可知,堆是一棵完全二叉树,因此可以层序的规则采用顺序的方式来高效存储.
注意:对于非完全二叉树,则不适合使用顺序方式进行存储**,因为为了能够还原二叉树,空间中必须要存储空节点,就会导致空间利用率比较低。非完全二叉树建议采用链式存储的方式进行存储。
2.3 堆的创建 2.3.1堆的向下调整 向下调整:从子树的根节点向下比较
我们来看这个数组27,15,19,18,28,34,65,49,25,37,如何将它变成大根堆?
先将它转化成为完全二叉树
我们从下面开始向上调整:37 > 28,change;49 > 25 > 18,change;65 > 34 > 19,change;
xshell 是一个强大的安全终端模拟软件,它支持SSH1,SSH2以及microsoft windows 平台的TELNET协议。xshell通过互联网到远程主机的安全连接。
xshell可以在windows界面下来访问远程终端不同系统下的服务器,从而比较好的达到远程控制终端的目的。
步骤一 打开xshell软件。双击桌面上xshell软件快捷图标,就可以打开软件,打开软件的主界面如下图所示。
xshell的主界面
步骤二 打开xshell软件后,找到左上角的的“文件”菜单并单击,在弹出来一个下拉对话框,点击选择“新建”命令“Alt+n”
步骤三 在单击“新建”之后就会出现下面这样一个界面,“名称”根据自己的需求填写,“协议”就是默认的SSH,“主机”这一步最关键,一定要填写,否则无法连接登录,“端口号”默认是22 “说明”可以根据自己的需要进行填写 其他不用填写,填写之后先不要点确认,看下一步。
步骤三 找到连接选项选项栏中的,“用户身份验证”,点击,在点击之后会让你填写用户名和密码,其中“方法”默认“password”,用户名,填写你的FTP用户名,密码,密码填写你的FTP密码,填写完成点击确认。
步骤四 在下拉框中找到 “终端”并点击“终端” 在转换中的编码选择uincode(UFT-8)
步骤五 登录刚才保存的账户,在左上角的“文件”菜单,在下拉菜单选项选择“打开”命令,会弹出对话框,根据需求选择,然后找你到你想登录的服务器,点击“连接”即可
连接之后会出现如下界面[root@....~]# 就表示连接成功
根据以上步骤,就可以连接Linux。在连接过程中一定要保证数据的安全,离开电脑或者不需要使用时候,将其退出,更安全的方法是每次登录都输入账户和密码
平常使用的命令
1.ssh username@ip地址 连接IP
2.yum install name 安装的名称
3.wget url
4.find /-name filename(文件名)查找文件
5.vim fileurl (文件路径) 编辑文件
6./ 要搜索的内容
7.q退出
8.!q强制退出
9. wq保存并退出
10.权限 chmod -R 777 filepath (777)第一个7是admin 7是读写 5是读
第二个7是root
第三个7是public
点击获取网络安全教程https://mp.weixin.qq.com/s/KQx_eIwdjCj3QdErxKb7ZQ
EFI系统分区迁移 前言 我是用的是Manjaro,由于当时/home目录的分区太小了,而Linux上扩展分区只能连续的分区中扩展,我的efi堵在了中间,所以就想把他迁移到另一个分区,顺利扩展/home目录分区。
步骤 以下是在同一个硬盘中迁移中的EFI系统分区的详细步骤:
打开终端,并使用以下命令卸载要迁移的EFI系统分区: sudo umount /boot/efi 使用 lsblk 命令或其他分区工具查看硬盘的分区布局,确定要迁移的EFI系统分区及其设备文件名和UUID。
使用以下命令创建一个与要迁移的EFI系统分区大小相同的新分区:
sudo fdisk /dev/sda n p <Enter> <Enter> <Enter> t <Enter> 1c w 其中,/dev/sda 是硬盘的设备文件名,n 命令创建新分区,p 命令指定分区类型为主分区,t 命令更改分区类型,1 是要更改的分区编号,c 是EFI系统分区的类型代码,w 命令将更改写入硬盘。
格式化新分区为FAT32文件系统: sudo mkfs.vfat -F32 /dev/sdaY 其中,/dev/sdaY 是新分区的设备文件名,Y 是新分区的编号。
挂载原始EFI系统分区和新分区: sudo mount /dev/sdaX /mnt sudo mount /dev/sdaY /mnt2 其中,/dev/sdaX 是要迁移的EFI系统分区的设备文件名,/dev/sdaY 是新分区的设备文件名,/mnt 和 /mnt2 是挂载点。
使用以下命令将原始EFI系统分区的内容复制到新分区: sudo cp -a /mnt/. /mnt2/ 其中,/mnt/ 是原始EFI系统分区的挂载点,/mnt2/ 是新分区的挂载点。
更新新分区的 /etc/fstab 文件,并将新分区的UUID添加到其中: sudo blkid /dev/sdaY 其中,/dev/sdaY 是新分区的设备文件名,它将返回新分区的UUID。
文章目录 一、基础概念二、相关API参数与使用说明三、整体连接流程总结 本篇文章以ESP32C3平台作为主机连接血糖仪蓝牙设备的过程为例,对代码的实现进行分析与理解。
一、基础概念 在上手撕代码之前,让我们准备好砍柴刀,先使用nRF Connect APP连接血糖仪对Gatt协议概念以及各层次进行理解,APP下载链接自行百度,这里就不贴出来了,废话不多说,打开手机蓝牙连接血糖仪蓝牙设备,左图为血糖仪的所有服务项,分别是Generic Access、Device Information、Unknown Service、Unknown Service四项服务(Service),右图是UUID为0x1000的Unknown Service服务项的内容,该服务有四个特征(Characteristic)Unknown Characteristic ,每个特征下又有许多属性,下面对涉及到的各个概念进行说明。
Profile
一个profile文件可以包含一个或者多个服务,一个profile文件包含需要的服务的信息或者为对等设备如何交互的配置文件的选项信息。一般一个设备就一个profileUUID
UUID是“Universally Unique Identifier”的缩写,通用唯一识别码的意思。对于蓝牙设备,每个服务都有一个与它对应的UUID,蓝牙技术联盟SIG定义UUID共用了一个基本的UUID:0x0000xxxx-0000-1000-8000-00805F9B34FB。总共128位,为了进一步简化基本UUID,每一个蓝牙技术联盟定义的属性有一个唯一的16位UUID,以代替上面的基本UUID的‘x’部分。使用16位的UUID便于记忆和操作,技术联盟已定义好较多的标准服务UUID,同时,也允许厂商定义自己的UUID,以满足已定义服务外的功能实现Service
一个服务包含一个或多个特性,这些特性是逻辑上相关的集合体。Characteristic
一个特性至少包含2个属性:一个属性用于声明(又叫描述符),一个属性用于存放特性的值。
存放特性值的属性就是真正传输的数据,声明属性用来确定该特性是否可读写、是否可以发起通知(类似于向主机发起中断)等信息。
比如,LED状态就是一个特性,该特性可读写。Properties
特性的操作类型有:写、没有回应的写、读、通知、指示(有回应的通知)
通过字面意思就可以理解,比如LED特性,需要写和读性质。如果设备有事件需要上报,比如按键等,就需要通知或者指示性质。通知就是上报完就没事了,指示的话还需要主机给个响应。Descriptors
描述符就是用于声明的属性。 有一个特别的描述符值得特别地提起:客户端特性配置描述符(Client Characteristic Configuration Descriptor,CCCD),其uuid为0x2901,画知识点,后面会考…这个描述符是给任何支持通知或指示功能的特性额外增加的。在CCCD中写入“1”使能通知功能,写入“2”使能指示功能,写入“0”同时禁止通知和指示功能。 其他概念
角色
GATT中也分为两个角色,GATT服务器和GATT客户端。
提供属性的设备称为GATT服务器,访问GATT服务器而获得属性的设备称为GATT客户端。
比如手机通过访问蓝牙设备的属性来控制设备LED,所以蓝牙设备就是GATT服务器,手机就是GATT客户端。属性
属性是GATT服务器中最基本的单元。GATT服务器将其所有的属性组成一个属性表。
1)一个属性包含句柄、UUID、值:
2)句柄是属性在GATT表中的索引。我们一般用不到
3)UUID是属性的ID,包含了属性值的类型等信息,可能有多个属性拥有同一个UUID
关于GATT协议的一些基础知识 二、相关API参数与使用说明 下面是本例中用到的也是比较常用的API接口的说明
注册设备APP Profile接口
搜索服务(通过给定的服务UUID来搜索相应的服务,若搜索到服务,会进入回调函数中的搜索完成事件,搜索结果也会被保存下来到对应的数据结构,将Handle值等都记录下来) 获取属性数量(通过给定的起始Handle值,在起始Handle范围内搜索属性的数量)
查找描述符(通过给定的描述符uuid来搜索结果) 查找特征(通过给定的特征uuid来搜索结果)
注册通知(若特征有通知属性,则需要额外注册通知并且写通知的描述符CCCD(描述符UUID:0x2902))
写特征描述符(通过这个API写描述符的值)
读特征(顾名思义,读取对应handle特征的值)
写特征(同上)
具体官方文档的API说明
三、整体连接流程 本例使用了gattc_multi_connect官方示例进行修改,官方示例完成了一个可以连接多个蓝牙设备的主机,主机连接设备的整体流程图如下:
这里流程图已经把GATTC扫描连接的过程描述得很清楚了,现在让我们通过官方提供的接口来完成这些流程:
1) Register Callbacks & Register APP Profile
//Register Callbacks: esp_gap_cb && esp_gattc_cb esp_ble_gap_register_callback(esp_gap_cb); esp_ble_gattc_register_callback(esp_gattc_cb); //Register APP Profile: PROFILE_Bioland_BGM_APP_ID esp_ble_gattc_app_register(PROFILE_Bioland_BGM_APP_ID); 2)Set scan parameters
目录
点击更换图片 猜数字
搜索页面展示
表白墙
点击更换图片 我们先看下面这个例子:
使用input里面的button按钮, 并且利用函数, 将一个搜狗logo转换为百度logo:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>JSDemo-Test</title> <script src="toos.js"></script> </head> <body> <img src="https://www.sogou.com/web/img/logo115_50.png?v=5" id = "sougou" width="200px" height="100px"> <br> <input type="button" onclick="op()" value="更换图片"> <script> function op() { var path = "https://www.baidu.com/img/flexible/logo/pc/result.png"; document.getElementById("sougou").src = path; } </script> </body> </html> 我们来看看效果:
这里面是偶先使用img标签, 导入一个网络图片, 也就是搜狗的logo图片, 然后给这个img标签设置好id, 然后在后面的input标签设置一个内置式的js语句, 也就是onclick, 然后onclick执行的操作为函数op(), 这个函数里面可以将sougou这个id所对应的标签里面的src属性更改为百度的logo地址.
使用document对象的getElementById(id)来获取到这个标签对象, 然后通过点号"."的方式来获取src地址, 然后更改这个地址为百度的logo网络地址.
猜数字 <!
这里写目录标题 前言1.初始化棋盘2.展示棋盘3.布置雷4.开始扫雷4.1判断输赢4.2扫雷时连续性展开4.3展示玩法 5.整体代码展示5.1 game.h头文件展示5.2 game.c源文件展示5.3 text.c源文件展示 所属专栏:C语言
博主首页:初阳785
代码托管:chuyang785
感谢大家的支持,您的点赞和关注是对我最大的支持!!!
博主也会更加的努力,创作出更优质的博文!!
关注我,关注我,关注我,重要的事情说三遍!!!!!!!!
前言 我们的扫雷和三子棋也是有一点形同之处的。就比如我们写的菜单其实是形同的,这里就不多讲了。直接上菜单: void menu() { printf("***********************\n"); printf("******** 1.play *******\n"); printf("******** 0.exit *******\n"); printf("***********************\n"); } int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请选择:>"); scanf("%d", &input); switch (input) { case 1: printf("开始游戏\n\n"); game(); break; case 0: printf("退出游戏\n"); break; printf("选择错误,请重新选择:>"); default: break; } } while (input); return 0; } 这个可以说是一个模板了,我们之前写的猜数字游戏和三子棋游戏都是用到了这个模板的,现在我们的扫了游戏也用到了,可以说是固定搭配了,小伙伴们可以慢慢品味。
再看我我们的引用的头文件:
#pragma once #include <stdio.h> #include <time.
结构体struct 1.结构体的基本用法 1.1 定义 结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的“成员” ,其描述了一块内存区间的大小及解释意义。
1.2 定义格式 struct 结构体名
{
数据类型 成员变量1;
数据类型 成员变量2;
数据类型 成员变量3;
…
};
举例:构造一个新的数据类型叫student,用来描述学生。
struct student
{
char name[32];
int age;
float score;
};
1.3 结构体变量 1.3.1 概念 通过结构体数据类型定义的变量
1.3.2 格式 struct 结构体名 变量名;
1.3.3 定义结构体变量 (1)先定义结构体,再定义结构体变量。
struct 结构体名
{
成员变量;
};
struct 结构体名 变量名;
例如:
struct student
{
char name[32];
int age;
float score;
};
struct student s1;
(2)定义结构体的同时,定义结构体变量。
struct 结构体名
{
目录
一. 什么是JavaScript?
概念
JavaScript可以做的事情
JavaScript和HTML, CSS之间的关系
JavaScript运行过程
二. 基础语法篇
第一个JavaScript程序
JS的书写形式
JS的代码注释
输入输出
变量的使用
变量命名
数据类型
变量的声明和使用
理解动态类型
JS变量类型
JS数组
运算符
算术运算符
赋值运算符 & 复合赋值运算符
自增自减运算符
比较运算符
逻辑运算符 & 位运算符 % 移位运算
条件语句
三元表达式
switch-case语句
循环语句
函数
创建函数
关于函数参数 arguments
函数表达式
作用域
对象
概念
使用字面量创建对象
使用new object()创建对象
使用构造函数来创建对象
😶🌫️😘创作不易多多支持
每日励志名言: 忍一时之气, 免百日之忧
这句话送给正在忍受巨大磨难的人, 希望他们能通过磨炼快速成长, 战胜不了自己的磨砺, 都会让自己变得更加强大!! 一. 什么是JavaScript? 概念 JavaScript简称JS. JS是世界上最流行的编程语言之一, 它是一个脚本语言, 通过解释器运行, 主要在客户端(浏览器)运行, 现在也可以基于node.js在服务器上运行.
JS是一种具有函数有限的轻量级, 解释型 或即时编译型的编程语言. 虽然他是作为开发web页面的脚本语言而出名, 但是他也被用到了许多非浏览器环境中, JS基于原型编程, 多凡事的动态脚本语言.
(1)单一文件 即将源文件和CMakeLists.txt放在同一文件夹下,那么:
cmake_minimum_required(VERSION 3.0 FATAL_ERROR) project(test1) set(Torch_DIR "/your/path/libtorch/share/cmake/Torch") find_package(Torch REQUIRED) add_executable(test1 test1.cpp) target_link_libraries(test1 "${TORCH_LIBRARIES}") set_property(TARGET test1 PROPERTY CXX_STANDARD 14) 此处使用的是Pre-cxx11 ABI
(2)分文件编写项目 文件结构如下:
. ├── CMakeLists.txt ├── include │ └── test.h ├── src │ └── test.cpp └── test_m.cpp 编写CMakeList.txt
cmake_minimum_required(VERSION 3.0 FATAL_ERROR) project(test1) set(Torch_DIR "/your/path/libtorch/share/cmake/Torch") find_package(Torch REQUIRED) find_package(OpenCV REQUIRED) include_directories( ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/include ) add_library(${PROJECT_NAME} SHARED src/test.cpp include/test.h ) add_executable(test_m test_m.cpp) target_link_libraries(test_m ${PROJECT_NAME} ${TORCH_LIBRARIES} ) set_property(TARGET test_m PROPERTY CXX_STANDARD 14) 报错:
你是否曾经梦想过,能够在一个平台上,和多种不同的 AI 模型进行有趣、有用、有深度的对话,甚至还能轻松地把你的对话分享给其他人?如果你有这样的梦想,那么 Poe 一站式 AI 工具箱就是你的不二之选! Poe 是国外知名问答社区 Quora 推出的 AI 平台,它汇集了多个基于大型语言模型的聊天机器人(目前总共汇集了八种),例如 ChatGPT4、GPT-4、Claude+ 、Sage 和 Dragonfly等。
你可以在 Poe 上自由地和各种 AI 互动,发现他们的回答和特点,也可以把你的对话分享给其他人。Poe 可以帮助你更深入地了解 AI 的能力和局限,拓展你的知识和视野,提高你的创造力和沟通技巧。在本文中,我们将尝试科学导师身份,针对8岁儿童,如何培养动手做机器人的能力,学习人工智能与编程的爱好兴趣?,来进行逐一探讨。如果你对 AI 有兴趣,那就快来和我们一起探索吧!
一、Sage
对于8岁的孩子,培养动手做机器人的能力、学习人工智能与编程的爱好兴趣可以从以下几个方面入手:
1、创造一个有趣、互动的学习环境
孩子们天性喜欢玩耍和探索,因此创造一个有趣、互动的学习环境是很重要的。可以使用一些具有视觉吸引力的教具和玩具来帮助孩子们理解机器人和编程的概念,例如机器人组装套件、迷宫游戏、绘画机器人等。同时,可以设计一些小型项目和挑战,让孩子们动手去解决问题,提高他们的实践能力。
2、引导孩子们学习编程的基础知识
在教授编程的基础知识时,可以使用一些简单易懂的编程语言,例如Scratch等,这些语言通常具有可视化编程界面,孩子们可以通过拖动和放置代码块的方式来编写程序,这样可以降低孩子们的学习难度并且提高他们的兴趣。
3、鼓励孩子们创造和分享自己的作品
让孩子们有机会创造和分享自己的作品是非常重要的,这可以帮助他们提高自信心和动手实践的能力。可以让孩子们参加一些编程和机器人比赛,或者发布自己的作品在社交网络上,这样可以让他们感受到自己的创造力和成就感。
4、提供学习资源和支持
为了鼓励孩子们在机器人和编程领域取得更大的进步,可以提供一些学习资源和支持,例如在线课程、编程书籍和指导。可以与其他家长或者学校合作,组织机器人和编程俱乐部,让孩子们可以在一个有共同兴趣的小组中交流学习经验。
二、GPT-4
作为一名科学老师,你可以通过以下方法来培养8岁儿童动手做机器人的能力,以及培养他们对人工智能和编程的爱好兴趣:
1、启发式教学:以儿童为中心,激发他们的好奇心和探索欲望。通过讲故事、观察能力、游戏等方法,帮助他们建立机器人、人工智能和编程的基本概念。
2、简单的编程环境:推荐使用适合儿童的编程软件和工具,如Scratch、Blockly等。这些工具可以帮助他们以简单、有趣的方式学习编程基础。
3、实践操作:让孩子们动手组装和编程简单的机器人。根据他们的年龄和能力,可以选择一些简单的套件,如LEGO Mindstorms、Makeblock等。这样可以让他们在实践中学习和培养兴趣。
4、合作学习:组织机器人工作坊或编程活动,让孩子们互相帮助和合作,共同完成项目。这样可以培养他们的团队精神和沟通能力。
5、展示成果:鼓励孩子们将他们的机器人和编程作品展示给他们的同学、家人和朋友。这样可以增强他们的自信和动力。
6、鼓励创新:鼓励孩子们尝试不同的设计和编程方法,发挥他们的想象力和创造力。让他们了解,失败和挫折是学习过程中不可或缺的部分,鼓励他们从失败中吸取经验。
7、定期更新课程:根据孩子们的学习进度和兴趣,定期更新课程内容和活动,确保他们始终保持学习的热情。
8、拓展资源:推荐一些适合儿童的人工智能和编程相关的书籍、视频和网站,让他们在课外继续学习和探索。
9、联系实际应用:通过讲解现实生活中的机器人和人工智能应用案例,让孩子们了解这些技术的实际意义和价值。
10、家长参与:鼓励家长参与孩子的学习过程,共同关注孩子的兴趣发展,为孩子提供学习和成长的支持。
通过上述方法,你可以有效地培养8岁儿童动手做机器人的能力,激发他们对人工智能和编程的爱好兴趣。
三、Claude+
对8岁儿童来说,培养对机器人和人工智能的兴趣,最好的方式是通过动手实践。可以考虑以下几个方面:
1、组装简单的机器人套件。现在有很多面向儿童的机器人套件,比如Lego Mindstorms等,可以让孩子们动手组装简单的机器人,并编程控制它们。这可以培养他们的动手能力和编程思维。
2、进行简单的机器人编程训练。使用像Scratch这样的可视化编程语言,教会孩子如何控制机器人运动、感知环境等。Scratch有很多适合8岁孩子的机器人编程教程。
3、利用手机或平板上的应用进行机器人编程体验。现在有一些机器人编程软件可以配合手机控制,这是一种简单的入门方式,可以让孩子们玩着学编程。
4、组织机器人竞赛或展示活动。这可以激发孩子们对机器人的热情,也可以让他们应用所学知识完成一个项目,体会成就感。
5、选择好的机器人玩具。现在有一些机器人玩具,既适合8岁以下的孩子,又可以让他们得到一定的编程体验,这也是培养兴趣的一个好方式。
通过以上活动,可以让孩子们在玩中学会编程和动手实践,从而培养他们对机器人和人工智能的兴趣。希望这些建议能对您有所帮助!
四、Claude-instant
对8岁儿童培养对机器人和人工智能的兴趣和动手能力,可以从以下几个方面入手:
1、通过游戏和讲故事来启蒙。用广为人知的机器人和AI角色如机器人沃利、R2D2等做简单的介绍和讲故事,激发孩子的好奇和探索欲。
2、提供简单的机器人和编程玩具。给孩子一些像Lego Mindstorms,Ozobot,Dash and Dot等简单的机器人玩具和编程工具,让他们通过组装和编程来操作机器人,从而初步体验机器人和编程。
3、简单机器人和编程活动。设计类似寻找水手人工作站这样的简单编程和机器人活动,引导孩子完成简单的程序设计和算法思维训练。
4、常读相关故事书。给孩子提供充满想象力的机器人和AI相关故事书和儿童科幻小说,激发他们对未来机器人和AI科技的憧憬。
一、vue 基础用法 1.1 引入vue
1.2 使用vue语法编写ui
1.3 实现数据绑定
示例代码如下
<div id="app"> {{ message }} </div> <script> var app = new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) </script> 1.4 代码效果:使用浏览器打开对应的的html文件,则会看到Hello Vue!
二、源码下载 2.1 在(一)中,我们在script标签中,编写了vue.js 提供的vue 实例化语法,创建了一个vue实例。并将文档中id 为app 下的 {{message}} 文本替换成了实例内的 message变量的真实值,完成渲染。
2.2 那么上面的过程中,vue.js 帮我们完成了哪些工作呢?下面带大家深入源码。
2.3 下载源码后(vue 2.6 源码地址)执行 npm install 安装依赖,安装完毕后,执行 npm run dev 启动项目,其编译的文件 位于 dist/vue.js 文件
2.4 在example 目录中,vue 提供很多demo ,我们可以将其脚本引入的路径改为经过2.3 编译过的文件,这样我们在调试源码的时候,更改文件后,便会同步到vue.js 脚本,方便调试。
三、npm run dev 的做了什么 3.
mybatis的collection标签查询,问题定位及解决方法。
问题:
在用mybatisPlus做关联查询时,发现list集合中只能显示出一条数据,且总是保持为第一条,而mybatis日志打印都是正确的。
日志打印如下:
==> Preparing: select ui.id, ui.user_name, ui.pass_word, r.id r_id, r.role from user_info ui left join roles r on ui.id = r.id where ui.user_name = ? ==> Parameters: zhangsan(String)
<== Columns: id, user_name, pass_word, r_id, role
<== Row: 3, zhangsan, 123456, 3, 1
<== Row: 3, zhangsan, 123456, 3, 2
<== Row: 3, zhangsan, 123456, 3, 3
<== Total: 3
结果:
UserLoginInfoDto(id=3, username=zhangsan, password=123456, roles=[Role(id=3,
role=1)])
代码:
一、实验目的 采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。
二、实验要求 采用递归下降语法制导翻译法,对算术表达式,赋值语句进行语义分析并生成四元式序列。
1.实验的输入和输出
输入是语法分析提供的正确的单词串,输出为三地址指令形式的四元式序列。
例如:对于语句串
begin a:=2+3*4;x:=(a+b)/c end#
输出的三地址指令如下:
(1) t1=3*4
(2) t2=2+t1
(3) a=t2
(4) t3=a+b
(5) t4=t3/c
(6) x=t4
三、源程序 #include<stdio.h> #include <stdlib.h> #include<string.h> #include <conio.h> char prog[80],token[6]; int count=0; char ch; /*当前读入单词*/ int syn,p,m,n,sum,kk=0,k=0; //p/*输入缓冲区指针*/ int length=0; //输入字符长度 int mark=0; /*标记注释//*/ int mark2;// 用于/* */ 注释 char * rwtab[6]={"begin","if","then","while","do","end"}; char *expression(void); struct { char result[8]; char ag1[8]; char op[8]; char ag2[8]; }quad[20]; void emit(char * result,char * ag1,char * op,char * ag2) { strcpy(quad[count].
Qt漂亮界面 功能规划:一、去掉菜单栏和工具栏二、顶部导航栏的设计appinit.h头文件appinit.cpp的文件使用方式: 三、阵列按钮的点击事件写法四、重写缩写界面、放大界面和关闭程序事件五、鼠标事件的处理Qt大量同类控件的操作正则表达式的设计Qt 手把手教你实现漂亮的登录界面前言一、手把手教你实现漂亮的登录界面第一步、新建一个Qwidget项目第二步、添加界面组件第三步、实现最小化窗口和关闭窗口功能展示如下:第四步、隐藏widget窗口边框和背景第五步、实现界面可移动 Qt之QWidget设置窗口背景图片的几种方法使用间接的方式来设置背景 QToolButton 工具按钮参考连接 原文链接:
https://blog.csdn.net/kissgoodbye2012/article/details/120404744?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-13.pc_relevant_antiscanv2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-13.pc_relevant_antiscanv2&utm_relevant_index=22
要做一个类似下面的qt界面,顶部是导航栏的样子——包含图标和程序名称,右边是界面切换按钮,然后放大、缩小和关闭按钮也在,还能拖动。这样,就更像一个商用的软件了。
功能规划: 1.去掉菜单栏、工具栏;
2.顶部导航栏包含程序图标、名称、界面切换按钮、放大缩小关闭按钮;
3.顶部导航栏可以拖动;
4.导航栏按钮可以切换界面。
可以参考的相关博客链接
一、去掉菜单栏和工具栏 在UI设计界面,在menuBar和mainToolBar上右键,选择移除菜单栏和移除工具栏。
把顶部的图标和程序名称、放大缩小关闭按钮都去掉,使用如下语句。
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowSystemMenuHint | Qt::WindowMinMaxButtonsHint); 二、顶部导航栏的设计 主要是用installEventFilter来实现的。参考第6章节。
这个顶部导航栏是通过注册监听事件,让app监控所有的程序事件。如果属性是可移动的,然后记录鼠标的坐标等,来控制窗口的位置和大小。
appinit.h头文件 #ifndef APPINIT_H #define APPINIT_H #include <QObject> class AppInit : public QObject { Q_OBJECT public: static AppInit *Instance(); explicit AppInit(QObject *parent = 0); void start(); protected: bool eventFilter(QObject *obj, QEvent *evt); private: static AppInit *self; signals: public slots: }; #endif // APPINIT_H appinit.