高光谱图像数据集

1:Washington DC Mal,Indian Pine等 https://engineering.purdue.edu/~biehl/MultiSpec/hyperspectral.html 2:Indian Pines, Salinas,Pavia Centre and University, Cuprite 等 http://www.ehu.eus/ccwintco/index.php?title=Hyperspectral_Remote_Sensing_Scenes 3:hydice的urban 等 http://www.erdc.usace.army.mil/Media/Fact-Sheets/Fact-Sheet-Article-View/Article/610433/hypercube/# 4:cave 数据集: http://www1.cs.columbia.edu/CAVE/databases/multispectral/ 5: icvl 数据集: http://icvl.cs.bgu.ac.il/hyperspectral/ 6:nus 数据集: http://www.comp.nus.edu.sg/~whitebal/spectral_reconstruction/index.html 如有其他的数据集,欢迎补充!

使用Kali上的Metasploit获取ssh登录到靶机权限

前置条件 靶机:metasploitable2 靶机IP:192.168.88.137 初始密码是:msfadmin/msfadmin kali安装的镜像为:kali-linux-2019.1a-amd64.iso KaliIP为:192.168.88.132 使用Metasploit获取mysql登录密码 进入Metasploit的控制台执行命令: msfconsole 查询ssh服务相关模块信息,选择如下模块: use auxiliary/scanner/ssh/ssh_login 查看ssh_login配置参数选项: show options 设置远程服务RHOSTS参数值: set RHOSTS 192.168.88.137 设置USERPASS_FILE参数,本文使用系统本身提供的: set USERPASS_FILE /usr/share/metasploit-framework/data/wordlists/piata_ssh_userpass.txt 执行攻击命令: exploit 上述操作截图如下: 退出攻击,CTRL+C,查看会话列表:sessions -l 进入指定会话:sessions -i 1,进入到会话1,执行shell命令如下截图: 上述操作时通过,ssh_login模块获取到靶机的ssh会话信息,通过会话可以操作靶机上的信息,删除创建文件等。

iOS 仿微信朋友圈实现

下面讨论一下微信朋友圈的实现方式。先分析结构,和布局。 微信朋友圈,看起来很有秩序,而且滑动的时候也不卡,应用的非常好。对于微信朋友圈的样式,我们可以大致分成以下6种类型。 纯文字类型单张图得显示多张图得显示(按照九宫格排练)链接类型视频类型广告类型 那么我们需要分析每种类型的布局有什么共同点,和不同点。 每种类型都是有一个头像和一个姓名,这个是必须的,我们可以封装到父类里。每种类型,都可以附带文字说明,也可以不带,我们也可以封装到父类里,但是这个不是必须要创建的时候,就生成的,而是根据当前有没有文字说明来生成的,所有说他应该是动态生成的,对于复用我们可以用隐藏。最好不要从父类移除。 还有就是评论,每种类型都可以评论。那么我们就要把评论封装到一起。也可以封装到父类。对于显示时间这个也是必须的我们也可以封装到父类里。 那么我们可以看到如下结构: 以一个多张图类型,我们分析一下,红框算一个cell,只有黑框位置的内容是不一样的,所以我们只要把黑框以外的分装好做成基类,其他的类型都继承基类,这样我们就能减少布局的变化,并且还能更多的复用。 那么我们用MVC的模式来分析: 模型 class JHSMessageModel: NSObject { var name = ""; var modelType: MessageModelType! var contentText: String! init(type: MessageModelType) { super.init(); modelType = type; self.configData(); } func configData() -> Void { } private var _contextSize: CGSize! var contextSize: CGSize { if contentText == nil { return CGSize.zero; } if _contextSize != nil { return _contextSize; } _contextSize = contentText.textSize(size: CGSize(width: PengConfigParamter.maxWidth, height: CGFloat.

使用pandas对xlsx文件的基本操作

起因:因最近实习期间,要求查看.xlsx文件中数据是否有误,由于数据较多,想用python去执行,结果发现网上对xlsx文件操作或是太旧,大多难以应用,所以自己整理了一下,以备自己后用。 模拟一个测试数据集data_test.xlsx文件,文件如下: 导入pandas,并读入文件 # 若报错:SyntaxError: Non-UTF-8 code starting with '\xd0' in file,则把下面这句加上 # coding=gbk import pandas as pd df = pd.read_excel('C:/Users/enuit/Desktop/data_test.xlsx') 读取行列数及索引 # 行数 (不包含表头,且一下均如此) print(len(df.index.values)) # 行索引 print(df.index.values) # 列数 print(len(df.columns.values)) # 列索引 print(df.columns.values) 读取指定单行和多行数据 # 表示第0行数据 data = df.loc[0].values print('第0行数据: \n', data) # 读取多行数据(这里是第1行和第2行) data = df.loc[[1, 2]].values print('第1行和第2行数据: \n', data) 读取指定单列和多列数据 # 读第1列数据 data = df.iloc[:, 1].values print('第1列数据: \n', data) # 读取多列数据(这里是第1列和第2列) data = df.iloc[:, [1, 2]].

linux原始套接字

通常情况下程序员接所接触到的套接字(Socket)为两类: (1)流式套接字(SOCK_STREAM):一种面向连接的 Socket,针对于面向连接的TCP 服务应用; (2)数据报式套接字(SOCK_DGRAM):一种无连接的 Socket,对应于无连接的 UDP 服务应用。 从用户的角度来看,SOCK_STREAM、SOCK_DGRAM 这两类套接字似乎的确涵盖了 TCP/IP 应用的全部,因为基于 TCP/IP 的应用,从协议栈的层次上讲,在传输层的确只可能建立于 TCP 或 UDP 协议之上,而 SOCK_STREAM、SOCK_DGRAM 又分别对应于 TCP 和 UDP,所以几乎所有的应用都可以用这两类套接字实现。 但是,当我们面对如下问题时,SOCK_STREAM、SOCK_DGRAM 将显得这样无助: (1)怎样发送一个自定义的 IP 包? (2)怎样发送一个 ICMP 协议包? (3)怎样分析所有经过网络的包,而不管这样包是否是发给自己的? (4)怎样伪装本地的 IP 地址? 这使得我们必须面对另外一个深刻的主题——原始套接字(SOCK_RAW)。原始套接字广泛应用于高级网络编程,也是一种广泛的黑客手段。著名的网络sniffer(一种基于被动侦听原理的网络分析方式)、拒绝服务攻击(DOS)、IP 欺骗等都可以通过原始套接字实现。 原始套接字(SOCK_RAW)可以用来自行组装数据包,可以接收本机网卡上所有的数据帧(数据包),对于监听网络流量和分析网络数据很有作用。 原始套接字是基于 IP 数据包的编程(SOCK_PACKET 是基于数据链路层的编程)。另外,必须在管理员权限下才能使用原始套接字。 原始套接字(SOCK_RAW)与标准套接字(SOCK_STREAM、SOCK_DGRAM)的区别在于原始套接字直接置“根”于操作系统网络核心(Network Core),而 SOCK_STREAM、SOCK_DGRAM 则“悬浮”于 TCP 和 UDP 协议的外围。 流式套接字只能收发 TCP 协议的数据,数据报套接字只能收发 UDP 协议的数据,原始套接字可以收发内核没有处理的数据包。 --------------------- 作者:Mike__Jiang 来源:CSDN 原文:https://blog.csdn.net/tennysonsky/article/details/44655077 

jsp页面checkbox全选与单选并显示已选中数量

文章目录 checkbox全选与单选第一步,设置checkbox标签第二步,写方法效果 checkbox全选与单选 第一步,设置checkbox标签 <center> <table> <tr><td>已选中【<span id="number"></span>】个</td><td></td></tr> <tr><td><input type="checkbox" id="check_all" onchange="check_all();"/></td><td>全选</td></tr> <tr><td><input type="checkbox" name="check" onchange="num()"/></td><td>西瓜</td></tr> <tr><td><input type="checkbox" name="check" onchange="num()"/></td><td>苹果</td></tr> <tr><td><input type="checkbox" name="check" onchange="num()"/></td><td>香蕉</td></tr> <tr><td><input type="checkbox" name="check" onchange="num()"/></td><td>橙子</td></tr> <tr><td><input type="checkbox" name="check" onchange="num()"/></td><td>凤梨</td></tr> </table> </center> 第二步,写方法 <%--全选--%> <script type="text/javascript"> function check_all() { //根据id找到元素,获取选择状态 var status = document.getElementById("check_all").checked; var mycc = document.getElementsByName("check"); //遍历集合,改变每个checkbox状态随着全选按钮的状态儿改变 for (a=0;a<mycc.length;a++){ mycc[a].checked=status; } num(); } <%--计数--%> function num() { //统计被选中数量 var checknum=0; var myck= document.getElementsByName("check"); for (a=0;a<myck.length;a++){ if (myck[a].

linux如何通过ioctl调用驱动的

ioctl作用:应用层的ioctl函数传入的cmd和arg参数会直接传入驱动层的ioctl接口,在对应驱动文件里会对相应的命令进行操作 对于传递的ioctl命令有一定的规范,具体可以参考:/include/asm/ioctl.h,/Documentation/ioctl-number.txt 这两个文件 应用层和驱动程序联系如下: 最终ioctl是通过系统调用sys_ioctl软中断陷入到内核,通过系统中断号最终调用到内核态的ioctl函数。 构造ioctl命令linux已经给我们提供了宏命令: 举一个简单的例子:

欢迎使用CSDN-markdown编辑器- 简书

欢迎使用CSDN-markdown编辑器 96 流水潺湲 关注 2017.03.09 10:41* 字数 876 阅读 965评论 0喜欢 0 —来自CSDN博客 欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 标题快捷键 加粗 Ctrl + B 斜体 Ctrl + I 引用 Ctrl + Q 插入链接 Ctrl + L 插入代码 Ctrl + K 插入图片 Ctrl + G 提升标题 Ctrl + H 有序列表 Ctrl + O 无序列表 Ctrl + U 横线 Ctrl + R 撤销 Ctrl + Z 重做 Ctrl + Y

ARM独占访问指令ldrex、strex

为了实现线程间同步,一般都要在执行关键代码段之前加互斥(Mutex)锁,且在执行完关键代码段之后解锁。为了实现所谓的互斥锁的概念,一般都需要所在平台提供支持。 本文主要用来说明ARM平台上特有的独占访问指令LDREX和STREX的工作原理,以及如何使用。而它们也是ARM平台上,实现互斥锁等线程同步工具的基础。 我们先来看看LDREX和STREX两条指令的语义。其实LDREX和STREX指令,是将单纯的更新内存的原子操作分成了两个独立的步骤。 1)LDREX用来读取内存中的值,并标记对该段内存的独占访问: LDREX Rx, [Ry] 上面的指令意味着,读取寄存器Ry指向的4字节内存值,将其保存到Rx寄存器中,同时标记对Ry指向内存区域的独占访问。 如果执行LDREX指令的时候发现已经被标记为独占访问了,并不会对指令的执行产生影响。 2)而STREX在更新内存数值时,会检查该段内存是否已经被标记为独占访问,并以此来决定是否更新内存中的值: STREX Rx, Ry, [Rz] 如果执行这条指令的时候发现已经被标记为独占访问了,则将寄存器Ry中的值更新到寄存器Rz指向的内存,并将寄存器Rx设置成0。指令执行成功后,会将独占访问标记位清除。 而如果执行这条指令的时候发现没有设置独占标记,则不会更新内存,且将寄存器Rx的值设置成1。 一旦某条STREX指令执行成功后,以后再对同一段内存尝试使用STREX指令更新的时候,会发现独占标记已经被清空了,就不能再更新了,从而实现独占访问的机制。 大致的流程就是这样,但是ARM内部为了实现这个功能,还有不少复杂的情况要处理。 在ARM系统中,内存有两种不同且对立的属性,即共享(Shareable)和非共享(Non-shareable)。共享意味着该段内存可以被系统中不同处理器访问到,这些处理器可以是同构的也可以是异构的。而非共享,则相反,意味着该段内存只能被系统中的一个处理器所访问到,对别的处理器来说不可见。 为了实现独占访问,ARM系统中还特别提供了所谓独占监视器(Exclusive Monitor)的东西,其结构大致如下: 可以看出来,一共有两种类型的独占监视器。每一个处理器内部都有一个本地监视器(Local Monitor),且在整个系统范围内还有一个全局监视器(Global Monitor)。 如果要对非共享内存区中的值进行独占访问,只需要涉及本处理器内部的本地监视器就可以了;而如果要对共享内存区中的内存进行独占访问,除了要涉及到本处理器内部的本地监视器外,由于该内存区域可以被系统中所有处理器访问到,因此还必须要由全局监视器来协调。 对于本地监视器来说,它只标记了本处理器对某段内存的独占访问,在调用LDREX指令时设置独占访问标志,在调用STREX指令时清除独占访问标志。 而对于全局监视器来说,它可以标记每个处理器对某段内存的独占访问。也就是说,当一个处理器调用LDREX访问某段共享内存时,全局监视器只会设置针对该处理器的独占访问标记,不会影响到其它的处理器。当在以下两种情况下,会清除某个处理器的独占访问标记: 1)当该处理器调用LDREX指令,申请独占访问另一段内存时; 2)当别的处理器成功更新了该段独占访问内存值时。 对于第二种情况,也就是说,当独占内存访问内存的值在任何情况下,被任何一个处理器更改过之后,所有申请独占该段内存的处理器的独占标记都会被清空。 另外,更新内存的操作不一定非要是STREX指令,任何其它存储指令都可以。但如果不是STREX的话,则没法保证独占访问性。 现在的处理器基本上都是多核的,一个芯片上集成了多个处理器。而且对于一般的操作系统,系统内存基本上都被设置上了共享属性,也就是说对系统中所有处理器可见。因此,我们这里主要分析多核系统中对共享内存的独占访问的情况。 为了更加清楚的说明,我们可以举一个例子。假设系统中有两个处理器内核,而一个程序由三个线程组成,其中两个线程被分配到了第一个处理器上,另外一个线程被分配到了第二个处理器上。且他们的执行序列如下: 大致经历的步骤如下: 1)CPU2上的线程3最早执行LDREX,锁定某段共享内存区域。它会相应更新本地监视器和全局监视器。 2)然后,CPU1上的线程1执行LDREX,它也会更新本地监视器和全局监视器。这时在全局监视器上,CPU1和CPU2都对该段内存做了独占标记。 3)接着,CPU1上的线程2执行LDREX指令,它会发现本处理器的本地监视器对该段内存有了独占标记,同时全局监视器上CPU1也对该段内存做了独占标记,但这并不会影响这条指令的操作。 4)再下来,CPU1上的线程1最先执行了STREX指令,尝试更新该段内存的值。它会发现本地监视器对该段内存是有独占标记的,而全局监视器上CPU1也有该段内存的独占标记,则更新内存值成功。同时,清除本地监视器对该段内存的独占标记,还有全局监视器所有处理器对该段内存的独占标记。 5)下面,CPU2上的线程3执行STREX指令,也想更新该段内存值。它会发现本地监视器拥有对该段内存的独占标记,但是在全局监视器上CPU1没有了该段内存的独占标记(前面一步清空了),则更新不成功。 6)最后,CPU1上的线程2执行STREX指令,试着更新该段内存值。它会发现本地监视器已经没有了对该段内存的独占标记(第4步清除了),则直接更新失败,不需要再查全局监视器了。 所以,可以看出来,这套机制的精髓就是,无论有多少个处理器,有多少个地方会申请对同一个内存段进行操作,保证只有最早的更新可以成功,这之后的更新都会失败。失败了就证明对该段内存有访问冲突了。实际的使用中,可以重新用LDREX读取该段内存中保存的最新值,再处理一次,再尝试保存,直到成功为止。 还有一点需要说明,LDREX和STREX是对内存中的一个字(Word,32 bit)进行独占访问的指令。如果想独占访问的内存区域不是一个字,还有其它的指令: 1)LDREXB和STREXB:对内存中的一个字节(Byte,8 bit)进行独占访问; 2)LDREXH和STREXH:中的一个半字(Half Word,16 bit)进行独占访问; 3)LDREXD和STREXD:中的一个双字(Double Word,64 bit)进行独占访问。 它们必须配对使用,不能混用。 --------------------- 作者:roland_sun 来源:CSDN 原文:https://blog.csdn.net/roland_sun/article/details/47670099 版权声明:本文为博主原创文章,转载请附上博文链接! 以上是转载自其他作者的解释,这里在调试cortex a7的时候,会碰到多核情况,原子操作编译出strex和ldrex指令,当需要访问的这段内存是uncahced,mmu属性没有配置,会直接进入到指令异常,我理解这个指令是需要过cache的,monitor在提供给竞争线程返回数据的时候,是利用了cache的数据,实际并不会真的访问到实际内存。

layui form表单下的button按钮会自动提交表单的问题以及解决方案

layui表单自动提交问题 最近使用layui的表单提交时,遇到了这个问题:在form内的按钮总是会自动提交。 而按钮放在form外面就不会出现这种问题,很让人头痛。 下面让我们来看看如何解决form内按钮自动提交问题的吧。 <form class="layui-form"> <label class="layui-form-label">银行卡号</label> <input type="text" name="bankCard" lay-verify="required" class="layui-input"> <label class="layui-form-label">银行卡开户行</label> <input type="text" name="bankInfo" lay-verify="required" class="layui-input"> <button class="layui-btn layui-btn-sm" lay-submit lay-filter="formDemo">评审完成</button> <button class="layui-btn layui-btn-sm" "window.scrollTo(0,0);">返回顶部 </button> </from> <script type="text/javascript"> form.on('submit(formDemo)',function(data){ }); </script> 上面是出现自动提交的代码,点击返回顶部和评审完成都会自动提交表单。 解决的方案: 1、放在表单中的button将其type设置为button,则不会自动提交。 Button按钮的type有三个可选属性:Button,submit,reset,而Button按钮的type属性默认值是submit ,所以在没有指定type属性的情况下,点击Button按钮会触发提交form表单 <button type="button" class="layui-btn layui-btn-sm" "window.scrollTo(0,0);">返回顶部</button> 2、使用a标签做成的按钮来替代button。 <a class="layui-btn layui-btn-sm" "window.scrollTo(0,0);">返回顶部</a> 3、在表单中按钮的js回调函数里添加 return false制止。 form.on('submit(formDemo)',function(data){ ...... return false; }); 但是按钮中若没有添加lay-submit属性,layui的form.on的表单提交监听不到这个按钮,那么return false对提交的制止也就失效了。 对应的按钮需要加上lay-filter=“formDemo” , 里面的formDemo标识用于绑定方法。

Java编程思想 - Java反射机制(一)Class对象、类加载器、泛化的Class引用、cast()转型方法

RTTI含义:运行时类型信息Class对象和类加载器 Class对象:包含了与类有关的信息,每一个类都有一个Class对象 类加载器:类加载器是Java虚拟机(JVM)的一个子系统,所有的类都是在对其第一次使用时,动态加载到JVM中的。当程序创 建一个对类的静态引用时,就会加载这个类。因此证明了构造器也是类的静态方法,用new操作费创建类的新对象也会被当做对类的静态成员引用。类加载时,类加载器首先检查类的Class对象是否已经加载,如果尚未加载,默认的类加载器就会根据类名查找.class文件。static初始化是在类加载时进行的。获取类的Class对象的方式 (1)Class 对象名 = Class.forName(“包名.类名”); 需要检查异常(用try-catch包围或throws抛出异常),并会初始化类 (2)Class 对象名 = 类名.class; 无需检查异常,不会进行初始化,比类名.forName方式更高效 (3)Class 对象名 = 类名.getClass(); (4)通过ClassLoader加载,ClassLoader.getSystemClassLoader().loadClass(“包名.类名”); 没有对类进行初始化,只是把类加载到了虚拟机中使用类时准备工作三个步骤 (1)加载:由类加载器执行,查找字节码(通常在classpath所指定的路径中查找),并从这些字节码中创建一个Class对象、 (2)链接:在链接阶段将验证类中的字节码,为静态域分配存储空间,如果必需的话,将解析这个类创建对其它类的所有引用。 (3)初始化:如果该类具有超类,则对其进行初始化,执行静态初始化器(如构造方法)和静态初始化块。 使用.class方式获取类的Class对象时。初始化操作被延迟到对静态方法(构造器也是隐式地是静态的)或非常数静态域(需要运行时才能确定的静态域)进行首次调用时才执行 import java.util.Random; class Initable { static final int staticFinal = 47; static final int staicFinal2 = Test1.rand.nextInt(1000); static { System.out.println("Initializing Initable"); } } class Initable2 { static int staticFinal = 147; static { System.out.println("Initializing Initable2"); } } class Initable3 { static final int staticFinal = 74; static { System.

IDEA中Git项目的更新、提交方法

更新方法一: 直接点击图中的箭头就可以更新项目(这是最简单的) 更新方法二: 项目上点击右键,然后进行以下步骤的操作就好 提交方法一: 注意:在提交项目之前一定要先对项目进行更新,假如别人有项目提交到服务器上,你没有更新的话就会提交不上去或者是有冲突。 直接使用上面的步骤就可以提交项目了,记得一定要写备注信息。提交项目之后可以去服务器上确认一下是否提交成功。 提交方法二:

Xmanager Enterprise 1249最新版下载使用

树挪死,人挪活。 大城市小人物,生活最终会把你变成你讨厌的人。 以前就随便用了一个5的版本,结果搜到有关于漏洞的消息 Xmanager 5 的最新版网上找了一圈,都被国内某代理公司给起诉了,最新版不好下载,下面就告诉大家一个方法下载最新版: 随便装一个Xmanager 5版本,需要挂VPN翻墙 下载后运行安装包,一般来说就结束了,但是最新的安装包还是没有保留下来,其实很简单 任务管理器右键正在执行的安装包,找到下载目录直接复制出来安装包就好。 方便没有翻墙的小伙伴,网盘地址:(带注册机) 初级防爆密码:Xmanager Enterprise 1249 链接: https://pan.baidu.com/s/1f-oqV2YyXl4rCj86vItuxg 提取码: 7fam VPN付费使用注册地址:(shadowsocks) shadowsocks

Anaconda 安装whl 文件和tar.gz文件——channel中找不到该文件,怎么办

使用anaconda对应的python3.7版本,win10,64位 一、安装whl文件 1、下载whl文件。 2、打开窗口“anaconda prompt" 3、在命令窗口输入 pip install +whl文件名 4、输入pip list 检查是否安装成功 检查方法二、首先输入Python 然后再输入 import wx 检查是否安装成功。 二、安装tar.gz文件 把相关文件解压缩在根目录, PS:目前依然不清楚,在命令窗口使用PIP已经安装成功,但是不能调用,只有在prompt窗口输入才能成功调用 问题2:在命令窗口安装,在pycharm和anaconda都不能用,若在prompt安装则都可以成功调用。 首先下载tar.gz文件,比如web.py,下载后是一个tar.gz文件,用好压或其他解压软件解压,你会看到目录里有一个setup.py文件,这时,在地址栏输入%comspec%,这样会出现该目录下的提示符,再写python.exe setup.py install,回车即可。(前提,环境变量已设置,否则无法使用)

淘宝sign 解密 淘宝商品爬虫

淘宝api sign加密算法 转载学习:https://cloud.tencent.com/developer/article/1200820 淘宝对于h5的访问采用了和客户端不同的方式,由于在h5的js代码中保存appsercret具有较高的风险,mtop采用了随机分配令牌的方式,为每个访问端分配一个token,保存在用户的cookie中,通过cookie带回服务端分配的token, 客户端利用分配的token对请求的URL参数生成摘要值sign, MTOP利用这个摘用值和cookie中的token来防止URL篡改。 流程 当本地cookie中的token为空时(通常是第一次访问),mtop会收到”FAIL_SYS_TOKEN_EXOIRED:: 令牌过期“这个错误应答,同时mtop会生成token写入cookie中(response.cookies)。第二次请求时,js通过读取cookie中的token值,按照约定的算法生成sign, sign在mtop的请求中带上,mtop通过cookie中和token用同样的方式计算出sign,与请求的sign进行比较,检查通过将返回api的应答,失败提示“FAIL_SYS_ILLEGAL_ACCESS:: 非法请求”cookie中的token是有时效性的,遇到token失效时,将收到应答"FAIL_SYS_TOKEN_EXOIRED:: 令牌过期", 同时会写入新的token,js利用新的token重新计算sign并重发请求。 关于cookie中的token的自我检查,由于token在cookie中是明文的,可能会被仿冒,在输出的cookie中包含一个用非对称密钥的公钥加密后的token, MTOP在每次请求时会先检查cookie中的token是否是由服务端分配出去的(利用加密后的token和私钥还原token,与回传的明文token比较) sign 生成 关于sign的生成公式:

微信小程序“豆瓣电影”

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CNZSWYMP/article/details/78676642 </div> <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-f57960eb32.css"> <div class="htmledit_views" id="content_views"> <p>开发环境为微信web开发者工具,实现的功能是可以在首页查看豆瓣电影评分前250名并且可以点击跳转到详情页,在搜索页输入关键字搜索相关电影。效果图如下</p> 代码 app.json { "pages":[ "pages/index/index", "pages/movie/movie", "pages/search/search", "pages/profile/profile" ], "window":{ "navigationBarBackgroundColor": "#35495e", "navigationBarTextStyle": "white", "navigationBarTitleText": "豆瓣电影", "backgroundColor": "#fff", "backgroundTextStyle": "dark", "enablePullDownRefresh": true }, "tabBar":{ "list":[ { "text": "推荐电影", "iconPath": "images/board.png", "selectedIconPath": "images/board-actived.png", "pagePath": "pages/index/index" }, { "text": "发现电影", "iconPath": "images/search.png", "selectedIconPath": "images/search_black.png", "pagePath": "pages/search/search" }, { "text": "我的电影", "iconPath": "images/profile.png", "selectedIconPath": "images/profile-actived.png", "pagePath": "pages/profile/profile" } ] } } app.wxss page{ font-family: "

为什么配置了环境变量(path)依然无法在cmd中直接启动?

问题描述: 我希望在cmd中执行mysql,已经把mysql所在bin目录配在了环境变量里面,但是依然报错:‘mysql’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 解决: 首先要确定你配置在环境变量中的路径能访问到该.exe文件,比如mysql.exe.检查该路径是否带了多余的分号,需要把分号去掉。 重新开一个cmd窗口。执行mysql命令,ok!

jQuery中的 $(window) load()与$(document) ready()以及jquery $(document) ready() 与window onload 的区别

目录 1:document.ready和onload的区别——JavaScript文档加载完成事件页面加载完成有两种事件 2:$(function()和$(document).ready(function()和$().ready(function() 3:document.ready和onload的区别 1.$(window).load(function(){...}方法 ⑴执行时机: ⑵多次使用: 2.$(document).ready()方法 ⑴执行时机: ⑵多次使用: 注:一般情况先一个页面响应加载的顺序是:域名解析-加载html-加载js和css-加载图片等其他信息。 1:document.ready和onload的区别——JavaScript文档加载完成事件 页面加载完成有两种事件 一是ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件) 二是onload,指示页面包含图片等文件在内的所有元素都加载完成。 2:$(function()和$(document).ready(function()和$().ready(function() 用jQ的人很多人都是这么开始写脚本的: $(function(){ // do something }); 其实这个就是jq ready()的简写,他等价于: $(document).ready(function(){ //do something }) //或者等价于下面这个方法,jQuer的默认参数是:“document”; $().ready(function(){ //do something }) 这个就是jq ready()的方法就是Dom Ready,他的作用或者意义就是:在DOM加载完成后就可以可以对DOM进行操作。 那么Dom Ready应该在“加载js和css”和“加载图片等其他信息”之间,就可以操作Dom了。 3:document.ready和onload的区别 1.$(window).load(function(){...}方法 ⑴执行时机: 在网页中所有元素(包括元素的所有关联文件)完全加载到浏览器后才执行,即JavaScript 此时可以访问网页中的所有元素。 window.οnlοad=function(){ //原生js } $(window).load(function(){ //jquery的window.load }); ⑵多次使用: JavaScript的onload事件一次只能保存对一个函数的引用,他会自动用最后面的函数覆盖前面的函数。 function one(){ alert("one"); } function two(){ alert("two"); } window.οnlοad=one; window.οnlοad=two; //运行代码后只有 two 2.$(document).ready()方法 ⑴执行时机: 在DOM完全就绪时就可以被调用。(这并不意味着这些元素关联的文件都已经下载完毕) 举个例子:$(document).ready()方法明知要DOM就绪就可以操作了,不需要等待所有图片下载完毕。 ⑵多次使用: function one(){

C++输入月份,输出季节

输入数据(用循环语句),判断数据是否小于等于0或大于12,应用if…else分别判断季节 #include<iostream> using namespace std; int main() { int a; for(int i=0;;i++) { cin>>a; if(a<=0||a>12) cout<<"错误,请重新输入"<<endl; else if(a>=3&&a<=5) cout<<"春季"<<endl; if(a>=6&&a<=8) cout<<"夏季"<<endl; if(a>=9&&a<=11) cout<<"秋季"<<endl; if(a<=2&&a>0||a==12) cout<<"冬季"<<endl; } system("pause"); return 0; }