首页
留言
关于
友链
更多
足迹
Search
1
SpringMVC+Spring+MyBatis整合完整版Web实例(附数据)
2,817 阅读
2
关于在Flutter实现Google地图的方法
1,606 阅读
3
druid报异常 “sql injection violation, part alway true condition not allow”的解决方案
1,181 阅读
4
MyBatis的TooManyResultsException异常的解决办法
973 阅读
5
如何去掉vue路径中的“#”号
968 阅读
发现
技术
生活
户外
登录
Search
标签搜索
Git
JavaScript
Oracle
Git学习
Java
Flutter
MySQL
SQL Server
IntelliJ IDEA
Spring Boot
Flutter 2.0
对称加密算法
Google地图
Maven
ES6
秦岭户外
linux
Tomcat
Redis
Spring
Bai Keyang
累计撰写
280
篇文章
累计收到
277
条评论
首页
栏目
发现
技术
生活
户外
页面
留言
关于
友链
足迹
搜索到
226
篇与
技术
的结果
2022-12-28
使用keytool生成应用签名信息
在申请百度地图的AK时,需要 apk 对应的 SHA1 值如何利用Android Studio使用keytool生成签名信息呢?输入下面命令,回车会提示输入密码,密码输入 : androidkeytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000整个步骤操作如下:cd .android ##调试版本使用指令 keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 输入密钥库口令: 再次输入新口令: 您的名字与姓氏是什么? [Unknown]: bai 您的组织单位名称是什么? [Unknown]: kcis 您的组织名称是什么? [Unknown]: kcis 您所在的城市或区域名称是什么? [Unknown]: Xi'an 您所在的省/市/自治区名称是什么? [Unknown]: Shaanxi 该单位的双字母国家/地区代码是什么? [Unknown]: China CN=bai, OU=kcis, O=kcis, L=Xi'an, ST=Shaanxi, C=China是否正确? [否]: 是 正在为以下对象生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 10,000 天): CN=bai, OU=kcis, O=kcis, L=Xi'an, ST=Shaanxi, C=China 输入 <androiddebugkey> 的密钥口令 (如果和密钥库口令相同, 按回车): 再次输入新口令: [正在存储debug.keystore] Warning: JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。 到这里签名信息就生成完了。然后按照百度地图SDK集成文档输入一下指令即可:keytool -list -v -keystore debug.keystore 输入密钥库口令: 密钥库类型: jks 密钥库提供方: SUN 您的密钥库包含 1 个条目 别名: androiddebugkey 创建日期: 2022-12-28 条目类型: PrivateKeyEntry 证书链长度: 1 证书[1]: 所有者: CN=bai, OU=kcis, O=kcis, L=Xi'an, ST=Shaanxi, C=China 发布者: CN=bai, OU=kcis, O=kcis, L=Xi'an, ST=Shaanxi, C=China 序列号: 3f09329e 有效期为 Wed Dec 28 11:12:14 CST 2022 至 Sun May 15 11:12:14 CST 2050 证书指纹: MD5: 44:DE:98:C9:D8:6E:CD:EC:E1:1D:92:02:9E:C6:EB:A1 SHA1: 7E:24:3C:7E:A0:5C:A1:69:AA:D1:89:74:38:30:88:C8:CD:59:FF:BE SHA256: CC:90:23:5B:D1:DF:02:7C:5E:DD:F1:82:07:F3:24:7C:82:6E:16:1D:BF:90:FB:29:FB:3F:0A:5A:5E:7D:6B:A0 签名算法名称: SHA256withRSA 主体公共密钥算法: 2048 位 RSA 密钥 版本: 3 扩展: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: 7E C7 C6 EF 92 1F 2C F3 A7 0F E8 2E 0A FA F9 67 ......,........g 0010: 84 BB 3C C5 ..<. ] ] ******************************************* ******************************************* Warning: JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore debug.keystore -destkeystore debug.keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。 这样我们就顺利得到申请百度地图AK所需要的签名数据啦
2022年12月28日
47 阅读
0 评论
0 点赞
2022-12-27
Java之IO流[复习]
Java IO知识体系详解知识体系Java IO-分类(传输,操作)知识体系IO框架之知识体系:首先了解下Java IO框架包含什么,同时推荐下如何学习IO框架Java IO-分类(传输,操作)IO理解分类 - 从传输方式上IO理解分类 - 从数据操作上IO理解分类 - 从传输方式上从数据传输方式或者说是运输方式角度看,可以将 IO 类分为:字节流字符流字节流和字符流的区别字节转字符InputStreamReader、OutputStreamWriter字节流和字符流的常用方法字节是个计算机看的,字符才是给人看的字节流字符流字节流和字符流的区别字节流读取单个字节,字符流读取单个字符(一个字符根据编码的不同,对应的字节也不同,如 UTF-8 编码是 3 个字节,中文编码是 2 个字节。)字节流用来处理二进制文件(比如图片、MP3、视频文件),字符流用来处理文本文件(可以看做是特殊的二进制文件,只不过经过了编码,便于人们阅读。)。简而言之,字节是个计算机看的,字符才是给人看的;字节流可以处理一切文件,而字符流只能处理文本。虽然 IO 类很多,但核心的就是 4 个抽象类:InputStream、OutputStream、Reader、Writer。 虽然 IO 类的方法也很多,但核心的也就 2 个:read 和 write。字节转字符InputStreamReader、OutputStreamWriter编码就是把字符转换为字节,而解码是把字节重新组合成字符。如果编码和解码过程使用不同的编码方式那么就出现了乱码。GBK 编码中,中文字符占 2 个字节,英文字符占 1 个字节;UTF-8 编码中,中文字符占 3 个字节,英文字符占 1 个字节;UTF-16be 编码中,中文字符和英文字符都占 2 个字节。UTF-16be 中的 be 指的是 Big Endian,也就是大端。相应地也有 UTF-16le,le 指的是 Little Endian,也就是小端。Java 使用双字节编码 UTF-16be,这不是指 Java 只支持这一种编码方式,而是说 char 这种类型使用 UTF-16be 进行编码。char 类型占 16 位,也就是两个字节,Java 使用这种双字节编码是为了让一个中文或者一个英文都能使用一个 char 来存储。字节流和字符流的常用方法InputStream 类int read():读取数据int read(byte b[], int off, int len):从第 off 位置开始读,读取 len 长度的字节,然后放入数组 b 中long skip(long n):跳过指定个数的字节int available():返回可读的字节数void close():关闭流,释放资源OutputStream 类void write(int b): 写入一个字节,虽然参数是一个 int 类型,但只有低 8 位才会写入,高 24 位会舍弃(这块后面再讲)void write(byte b[], int off, int len): 将数组 b 中的从 off 位置开始,长度为 len 的字节写入void flush(): 强制刷新,将缓冲区的数据写入void close():关闭流Reader 类int read():读取单个字符int read(char cbuf[], int off, int len):从第 off 位置开始读,读取 len 长度的字符,然后放入数组 b 中long skip(long n):跳过指定个数的字符int ready():是否可以读了void close():关闭流,释放资源Writer 类void write(int c): 写入一个字符void write( char cbuf[], int off, int len): 将数组 cbuf 中的从 off 位置开始,长度为 len 的字符写入void flush(): 强制刷新,将缓冲区的数据写入void close():关闭流理解了上面这些方法,基本上 IO 的灵魂也就全部掌握了。IO理解分类 - 从数据操作上你细想一下,IO IO,不就是输入输出(Input/Output)嘛;从数据来源或者说是操作对象角度看,IO 类可以分为:Input:将外部的数据读入内存,比如说把文件从硬盘读取到内存,从网络读取数据到内存等等Output:将内存中的数据写入到外部,比如说把数据从内存写入到文件,把数据从内存输出到网络等等。所有的程序,在执行的时候,都是在内存上进行的,一旦关机,内存中的数据就没了,那如果想要持久化,就需要把内存中的数据输出到外部,比如说文件。文件操作算是 IO 中最典型的操作了,也是最频繁的操作。那其实你可以换个角度来思考,比如说按照 IO 的操作对象来思考,IO 就可以分类为:文件、数组、管道、基本数据类型、缓冲、打印、对象序列化/反序列化,以及转换等。文件数组管道基本数据类型缓冲打印对象序列化/反序列化转换IO理解分类-数据操作上文件文件流也就是直接操作文件的流,可以细分为字节流(FileInputStream 和 FileOuputStream)和字符流(FileReader 和 FileWriter)。 FileInputStream 的例子:int b; FileInputStream fis1 = new FileInputStream("fis.txt"); // 循环读取 while ((b = fis1.read())!=-1) { System.out.println((char)b); } // 关闭资源 fis1.close();FileOutputStream 的例子:FileOutputStream fos = new FileOutputStream("fos.txt"); fos.write("沉默王二".getBytes()); fos.close();FileReader 的例子:int b = 0; FileReader fileReader = new FileReader("read.txt"); // 循环读取 while ((b = fileReader.read())!=-1) { // 自动提升类型提升为 int 类型,所以用 char 强转 System.out.println((char)b); } // 关闭流 fileReader.close();FileWriter 的例子:FileWriter fileWriter = new FileWriter("fw.txt"); char[] chars = "沉默王二".toCharArray(); fileWriter.write(chars, 0, chars.length); fileWriter.close();当掌握了文件的输入输出,其他的自然也就掌握了,都大差不差。数组通常来说,针对文件的读写操作,使用文件流配合缓冲流就够用了,但为了提升效率,频繁地读写文件并不是太好,那么就出现了数组流,有时候也称为内存流。ByteArrayInputStream 的例子:InputStream is =new BufferedInputStream( new ByteArrayInputStream( "沉默王二".getBytes(StandardCharsets.UTF_8))); //操作 byte[] flush =new byte[1024]; int len =0; while(-1!=(len=is.read(flush))){ System.out.println(new String(flush,0,len)); } //释放资源 is.close();ByteArrayOutputStream 的例子:ByteArrayOutputStream bos =new ByteArrayOutputStream(); byte[] info ="沉默王二".getBytes(); bos.write(info, 0, info.length); //获取数据 byte[] dest =bos.toByteArray(); //释放资源 bos.close();管道Java 中的管道和 Unix/Linux 中的管道不同,在 Unix/Linux 中,不同的进程之间可以通过管道来通信,但 Java 中,通信的双方必须在同一个进程中,也就是在同一个 JVM 中,管道为线程之间的通信提供了通信能力。一个线程通过 PipedOutputStream 写入的数据可以被另外一个线程通过相关联的 PipedInputStream 读取出来。final PipedOutputStream pipedOutputStream = new PipedOutputStream(); final PipedInputStream pipedInputStream = new PipedInputStream(pipedOutputStream); Thread thread1 = new Thread(new Runnable() { @Override public void run() { try { pipedOutputStream.write("沉默王二".getBytes(StandardCharsets.UTF_8)); pipedOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { try { byte[] flush =new byte[1024]; int len =0; while(-1!=(len=pipedInputStream.read(flush))){ System.out.println(new String(flush,0,len)); } pipedInputStream.close(); } catch (IOException e) { e.printStackTrace(); } } }); thread1.start(); thread2.start();基本数据类型基本数据类型输入输出流是一个字节流,该流不仅可以读写字节和字符,还可以读写基本数据类型。DataInputStream 提供了一系列可以读基本数据类型的方法:DataInputStream dis = new DataInputStream(new FileInputStream("das.txt")) ; byte b = dis.readByte() ; short s = dis.readShort() ; int i = dis.readInt(); long l = dis.readLong() ; float f = dis.readFloat() ; double d = dis.readDouble() ; boolean bb = dis.readBoolean() ; char ch = dis.readChar() ;DataOutputStream 提供了一系列可以写基本数据类型的方法:DataOutputStream das = new DataOutputStream(new FileOutputStream("das.txt")); das.writeByte(10); das.writeShort(100); das.writeInt(1000); das.writeLong(10000L); das.writeFloat(12.34F); das.writeDouble(12.56); das.writeBoolean(true); das.writeChar('A');缓冲CPU 很快,它比内存快 100 倍,比磁盘快百万倍。那也就意味着,程序和内存交互会很快,和硬盘交互相对就很慢,这样就会导致性能问题。为了减少程序和硬盘的交互,提升程序的效率,就引入了缓冲流,也就是类名前缀带有 Buffer 的那些,比如说 BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter。缓冲流在内存中设置了一个缓冲区,只有缓冲区存储了足够多的带操作的数据后,才会和内存或者硬盘进行交互。简单来说,就是一次多读/写点,少读/写几次,这样程序的性能就会提高。打印恐怕 Java 程序员一生当中最常用的就是打印流了:System.out 其实返回的就是一个 PrintStream 对象,可以用来打印各式各样的对象。System.out.println("沉默王二是真的二!");PrintStream 最终输出的是字节数据,而 PrintWriter 则是扩展了 Writer 接口,所以它的 print()/println() 方法最终输出的是字符数据。使用上几乎和 PrintStream 一模一样。StringWriter buffer = new StringWriter(); try (PrintWriter pw = new PrintWriter(buffer)) { pw.println("沉默王二"); } System.out.println(buffer.toString());对象序列化/反序列化序列化本质上是将一个 Java 对象转成字节数组,然后可以将其保存到文件中,或者通过网络传输到远程。ByteArrayOutputStream buffer = new ByteArrayOutputStream(); try (ObjectOutputStream output = new ObjectOutputStream(buffer)) { output.writeUTF("沉默王二"); } System.out.println(Arrays.toString(buffer.toByteArray()));与其对应的,有序列化,就有反序列化,也就是再将字节数组转成 Java 对象的过程。try (ObjectInputStream input = new ObjectInputStream(new FileInputStream( new File("Person.txt")))) { String s = input.readUTF(); }. 转换 InputStreamReader 是从字节流到字符流的桥连接,它使用指定的字符集读取字节并将它们解码为字符。InputStreamReader isr = new InputStreamReader( new FileInputStream("demo.txt")); char []cha = new char[1024]; int len = isr.read(cha); System.out.println(new String(cha,0,len)); isr.close();OutputStreamWriter 将一个字符流的输出对象变为字节流的输出对象,是字符流通向字节流的桥梁。File f = new File("test.txt") ; Writer out = new OutputStreamWriter(new FileOutputStream(f)) ; // 字节流变为字符流 out.write("hello world!!") ; // 使用字符流输出 out.close() ;
2022年12月27日
44 阅读
0 评论
0 点赞
2022-12-08
让网站瞬间变灰
如遇到国家公祭日、全国哀悼日 类似的日子,为了表达哀思缅怀逝者,各大网站“蒙上黑纱”变成灰白色下面是让网站瞬间变成灰白色的CSS代码:html { -webkit-filter: grayscale(100%); /* webkit */ -moz-filter: grayscale(100%); /*firefox*/ -ms-filter: grayscale(100%); /*ie9*/ -o-filter: grayscale(100%); /*opera*/ filter: grayscale(100%); filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1); } body{ filter:gray; /*ie9- */ background : none!important; }
2022年12月08日
41 阅读
0 评论
0 点赞
2022-12-05
IntelliJ IDEA:Error:Kotlin: Module was compiled with an incompatible version of Kotlin
IntelliJ IDEA在编译和启动的时候报错:Error:Kotlin: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.1.13.解决办法重新编译项目 Build->Rebuild Project 调整完后,问题解决。<div class="_85bxh8zht73"></div><script type="text/javascript">(window.slotbydup = window.slotbydup || []).push({ id: "u6863512", container: "_85bxh8zht73", async: true });</script><!-- 多条广告如下脚本只需引入一次 --><script type="text/javascript" src="//cpro.baidustatic.com/cpro/ui/cm.js" async="async" defer="defer" ></script>
2022年12月05日
76 阅读
0 评论
0 点赞
2022-11-30
Win系统启动Nginx提示80端口被占用的问题
在Windows系统启动Nginx报如下错误信息:解决办法1、按键盘win+r打开运行界面,输入cmd,确定,打开管理员界2、输入 netstat -aon | findstr :80 查看后,pid值为 43、输入tasklist|findstr "4" 4、发现是80端口被System占用了 ,输入netsh http show servicestate5、运行中输入regedit打开注册表编辑器。6、找到 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesHTTP 7、重新启动系统,System进程就不会占用80端口,nginx就可以正常启动。再次启动nginx,可以正常启动,可以在浏览器http://localhost/ 查看资料来源:穆埙CSDN
2022年11月30日
117 阅读
0 评论
0 点赞
2022-11-29
MySQL创建自定义函数报SQL错误 [1064] [42000]的解决办法
因为一次开发需要创建一部分的自定义函数,自定义函数代码如下:CREATE FUNCTION formatDate(fdate datetime) RETURNS VARCHAR(255) BEGIN DECLARE x VARCHAR(255) DEFAULT ''; SET x= date_format(fdate,'%Y年%m月%d日%H时%i分%s秒'); RETURN x; END然而在执行创建自定义函数的语句时,却报如下的错误信息:Error occurred during SQL script execution 原因: SQL 错误 [1064] [42000]: (conn=2178035) You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 2原因:大家也都知道,在MySQL中默认分号;为语句结束或分隔符,遇到分号,MySQL就判断语句已输入完毕,系统开始执行语句。但在创建函数的过程中,输入完一句命令,就需要使用分号;来进行分割,这样的话就和MySQL的默认分号产生了冲突。解决方案:临时切换分隔符。在执行语句的时候,提前告诉MySQL切换分隔符为我们指定的符号即可,具体如下:DELIMITER // --先将结束符或者分隔符切换为成 // CREATE FUNCTION formatDate(fdate datetime) RETURNS VARCHAR(255) BEGIN DECLARE x VARCHAR(255) DEFAULT ''; SET x= date_format(fdate,'%Y年%m月%d日%H时%i分%s秒'); RETURN x; END // -- 语句执行到这里表示结束 DELIMITER ; -- 再结束符切换回来当然,以上都是使用SQL语句去执行的时候才会遇到这样的情况,如果直接使用工具去创建的话,就不会有这样的问题了。参考资料:https://blog.csdn.net/tuolingss/article/details/121234411
2022年11月29日
62 阅读
0 评论
0 点赞
2022-10-27
Nginx 命令行控制
在Linux中,Nginx默认被安装在目录 /usr/local/nginx 中,其中二进制文件路径为 /usr/local/nginx/sbin/nignx ,配置文件路径为 /usr/local/nginx/conf/nginx.conf 。{alert type="info"}注:在 configure 执行时是可以指定把它们安装在不同的目录的。{/alert}1、默认方式启动直接执行Nginx二进制程序:/usr/local/nginx/sbin/nginx/sbin/nginx这时,会读取默认路径下的配置文件: /usr/local/nginx/conf/nginx.conf 实际上,在没有显式指定 nginx.conf 配置文件路径时,将打开 configure 命令执行时使用 --conf-path=PATH 指定nginx.conf文件2、另行指定配置文件的启动方式/usr/local/nginx/sbin/nginx -c /tmp/nginx.conf这时,会读取 -c 参数后指定的nginx.conf配置文件来启动Nginx.3、另行指定安装目录的启动方式使用 -p 参数指定Nginx的安装目录/usr/local/nginx/sbin/nginx -p /usr/local/nginx/4、另行指定全局配置项的启动方式可以通过 -g 参数临时指定一些全局配置项,以使新的配置项生效/usr/local/nginx/sbin/nginx -g "pid /var/nginx/test.pid"上面这行命令意味着会把pid文件写到 /var/nginx/test.pid 中-g 参数的约束条件是指定的配置项不能与默认路径下的nginx.conf中的配置项相冲突,否则无法启动。就像上例那样,类似这样的配置项: pid /var/nginx/test.pid ,是不能存在于默认的nginx.conf中的。另一个约束条件是以 -g 方式启动的Nginx服务执行其他命令时,需要把 -g 参数也带上,否则可能出现配置项不匹配的情形。例如,如果要停止Nginx服务,那么需要执行下面代码:/usr/local/nginx/sbin/nginx -g "pid /var/nginx/test.pid" -s stop如果不带上 -g "pid /var/nginx/test.pid" ,那么找不到pid文件,也会出现无法停止服务端情况。5、测试配置信息是否错误在不启动Nginx的情况下,使用 -t 参数仅测试配置文件是否有错误:/usr/local/nginx/sbin/nginx -t执行结果中显式配置是否正确6、在测试配置阶段不输出信息测试配置选项时,使用 -q 参数可以不把error级别以下的信息输出到屏幕/usr/local/nginx/sbin/nginx/ -t -q7、显示版本信息使用 -v 参数显示Nginx的版本信息/usr/local/nginx/sbin/nginx -v8、显示编译阶段的参数使用 -V 参数除了可以显示Nginx的版本信息外,还可以显示配置编译阶段的信息,如 GCC编译器的版本、操作系统的版本、执行 configure 时的参数 等:/usr/local/nginx/sbin/nginx -V9、快速的停止服务使用 -s stop 可以强制停止Nginx服务。 -s 参数其实是告诉Nginx程序向正在运行的Nginx服务发送信号量,Nginx程序通过nginx.pid文件中得到的master进程的进程ID,再向运行中的master进行发送TERM信号来快速的关闭Nginx服务/usr/local/nginx/sbin/nginx -s stop实际上,如果通过 kill 命令直接向nginx master进程发送TERM或者INT信号,效果是一样的先通过 ps 命令来查看nginx master的进程ID[root@VM_0_16_centos ~]# ps -ef | grep nginx root 1413 1 0 2021 ? 00:00:00 nginx: master process ./sbin/nginx nobody 1414 1413 0 2021 ? 00:18:51 nginx: worker process root 26388 26323 0 13:52 pts/0 00:00:00 grep --color=auto nginx接下来直接通过 kill 命令来发送信号:kill -s SIGTERM 1413或者kill -s SIGINT 1413上面两条命令的效果与执行 /usr/local/nginx/sbin/nginx -s stop 是完全一致的10、优雅的停止服务如果系统Nginx服务可以正常的处理完当前所有请求再停止服务,那么可以使用 -s quit 参数来停止服务/usr/local/nginx/sbin/nginx -s quit该命令与快速停止Nginx服务是有区别的。当快速停止服务时,worker进程与master进程在收到信号后会立刻跳出循环,退出进程。而优雅的停止服务时,首先会关闭监听端口,停止接收新的连接,然后把当前正在处理的连接全部处理完,最后再退出进程。与快速停止服务类似,可以直接发送QUIT信息给master进程来停止服务,其效果与执行 -s quit 命令是一样的kill -s SIGQUIT <nginx master pid>如果希望优雅的停止某个worker进程,那么可以通过向该进程发送WINCH信号来停止服务kill -s SIGWINCH <nginx worker pid>11、使运行中的Nginx重读配置项并生效使用 -s reload 参数可以使运行中的Nginx服务重新加载nginx.conf文件/usr/local/nginx/sbin/nginx -s reload事实上Nginx会先检查新的配置项是否有误,如果全部正确就可以采取优雅的方式关闭,再重新启动Nginx来实现这个目的。类似的, -s 是发送信号,仍然可以使用 kill 命令发送HUP信号来达到相同的效果kill -s SIGHUP <nginx master pid>12、日志文件回滚使用 -s reopen 参数可以重新打开日志文件,这样可以先把当前日志文件改名或者转移到其他目录中进行备份,再重新打开时就会生成新的日志文件。这个功能使得日志文件不至于过大/usr/local/nginx/sbin/nginx -s reopen当然这与使用 kill 命令发送USR1信号效果相同kill -s SIGUSR1 <nginx master pid>13、平滑升级Nginx当Nginx服务升级到新的版本时,必须要将旧的二进制文件Nginx替换掉,通常情况下这是需要重启服务的,但Nginx支持不重启服务来完成新版本的平滑升级升级时包括以下步骤:通知正在运行的旧版本Nginx准备升级。通过向master进程发送USR2信号可达到目的kill -s SIGUSR2 <nginx master pid>这时运行中的Nginx会将pid文件重命名,如将 /usr/local/nginx/logs/nginx.pid 重命名为 /usr/local/nginx/logs/nginx.pid.oldbin ,这样新的Nginx才有可能启动成功启动新版本的Nginx,可以使用上面任意一种启动方法。这时通过ps命令可以发现新旧版本的Nginx在同时运行。通过 kill 命令向旧版本的master进程发送SIGQUIT信号,以优雅的方式关闭旧版本的Nginx。随后将只有新版本的Nginx服务运行,此时平滑升级完毕。14、显示命令行帮助使用 -h 或者 -? 参数会显示支持的所有命令行参数
2022年10月27日
67 阅读
0 评论
0 点赞
2022-10-19
SQL Server快速备份表
在SQL Server 中快速备份复制某一张表,可以使用下面的SQL语句来执行:SELECT * into NEW_TABLE FROM OLD_TABLE;
2022年10月19日
69 阅读
0 评论
0 点赞
2022-10-15
MariaDB关闭远程连接
近期在服务器上部署MariaDB后发现无法远程连接,经过查询资料发现MariaDB为了增强安全性而跳过了端口监听.我们可以通过一下命令查询当前端口的监听状态:mysql> SHOW VARIABLES; 或者 mysql> SHOW VARIABLES LIKE 'skip_networking';查看skip_networking,如果skip_networking=ON ,则将mariadb-server.cnf配置文件中将 skip_networking 注释掉,即可远程连接。[mysqld] # 关闭远程连接,注释掉即可打开远程连接 skip-networking # 端口 port=3306
2022年10月15日
66 阅读
0 评论
0 点赞
2022-09-28
java split | (竖线)
java split | (竖线)在java中,有一个字符串"866|10|1824261|214|",需要根据“|”截取。而直接用split("|");是不行的。原因是竖线 | 在正则中是特殊字符,需要转义,也就是split(“|”);但实际在java中使用时,又是java的特殊字符,需要转义,最终变成了split("\|");public static void main(String[] args) { String line = "866|10|1824261|214|"; String[] cells = line.split("\\|"); for(int i=0;i<cells.length;i++){ System.out.println(cells[i]); } }输出结果:866 10 1824261 214原文来自: CSDN
2022年09月28日
95 阅读
0 评论
0 点赞
2022-08-12
Flutter2.x 将Http请求结果转为Dart
在Flutter 2.x版本中将Http返回的结果转Dart稍微和前几个版本有些许差异,具体演示说明如下。Ps:在这里我用一个网上的开源api来示例请求接口地址:https://v1.hitokoto.cn/接口返回的Json对象如下:{ "id":3931, "uuid":"afc68395-6e1c-429c-b322-f1b7f4d43eba", "hitokoto":"嘿!活着是件很好的事", "type":"e", "from":"原创", "from_who":null, "creator":"Great old ones", "creator_uid":2073, "reviewer":0, "commit_from":"web", "created_at":"1538200036", "length":10 }json对应的类对象如下:class OneSentence { int id; String? hitokoto; String uuid; String? type; String? from; String? fromWho; String? creator; int? creatorUid; int reviewer; String? commitFrom; String? createdAt; int length; OneSentence( this.id, this.hitokoto, this.uuid, this.type, this.from, this.fromWho, this.creator, this.creatorUid, this.reviewer, this.commitFrom, this.createdAt, this.length); factory OneSentence.fromJson(Map<String, dynamic> json) { return OneSentence( json['id'], json['hitokoto'], json['uuid'], json['type'], json['from'], json['from_who'], json['creator'], json['creator_uid'], json['reviewer'], json['commit_from'], json['created_at'], json['length']); } Map<String, dynamic> toJson() { final Map<String, dynamic> data = new Map<String, dynamic>(); data['id'] = this.id; data['hitokoto'] = this.hitokoto; data['uuid'] = this.uuid; data['type'] = this.type; data['from'] = this.from; data['from_who'] = this.fromWho; data['creator'] = this.creator; data['creator_uid'] = this.creatorUid; data['reviewer'] = this.reviewer; data['commit_from'] = this.commitFrom; data['created_at'] = this.createdAt; data['length'] = this.length; return data; } } 请求http获取api结果:import 'dart:convert'; import 'dart:io'; import 'package:flutter/material.dart'; import 'package:flutter_demo/bean/OneSentence.dart'; class HttpPage extends StatefulWidget { const HttpPage({Key? key}) : super(key: key); @override _HttpPageState createState() => _HttpPageState(); } class _HttpPageState extends State<HttpPage> { String _text = ""; @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("Http请求"), leading: GestureDetector( onTap: () { Navigator.pop(context); }, child: Icon(Icons.arrow_back), ), ), body: Container( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded(child: ListView( children: [ Text(_text), ElevatedButton( onPressed: () => httpGet('https://v1.hitokoto.cn/', getOneSentence), child: Text('一言API')), ], )) ], ), ), ); } // 解析并转换 OneSentence getOneSentence(String res) { String _result = res; JsonCodec j = new JsonCodec(); OneSentence ons = OneSentence.fromJson(j.decode(_result)); setState(() { this._text = j.encode(ons.toJson()); }); return ons; } // 请求API并获取请求结果 void httpGet(String url, Function call) { HttpClient _httpClient = new HttpClient(); String _result = ""; _httpClient.getUrl(Uri.parse(url)) .then((HttpClientRequest request) => request.close()) .then((HttpClientResponse response) { if(response.statusCode == 200) { response.transform(utf8.decoder).join().then((value) { _result = value; call(_result); } ); } else { print('error'); _result = 'error'; call(_result); } } ); } }
2022年08月12日
110 阅读
0 评论
0 点赞
2022-05-16
Git Gui 设置语言为中文
Git Gui的英文界面如下:那么如何将该界面从英文切换到中文呢?在Git的安装目录中找到路径 \mingw64\share\git-gui\lib ,如下:如果lib目录中没有 msgs 目录和zh_cn.msg文件的(有的版本是直接把zh_cn.msg放在lib目录下),就手动创建该目录。如果有则无需创建。下载Git Gui语言文件:https://github.com/stayor/git-gui-zh下载好 Git Gui语言文件 后,将zh_cn.msg文件放入刚刚的msgs 目录中,如下:然后再次打开Git Gui,界面已经显示为中文。如下:
2022年05月16日
393 阅读
0 评论
0 点赞
1
2
...
19