最近有一批 json 文件需要导入到 MySQL 中,因为 json 文件过大,无法准确的评估字段长度,所以决定在 MySQL 中建表的时候把字段类型都设置为了 text,导入成功之后再评估一下长度,然后修改字段类型。
通过以下语句获取指定列的最大长度
SELECT MAX(LENGTH(ci)) FROM meta_ci;
More … 概述
在 Java 编程开发中,有时候需要将 List 打印出来,方便调试。本文总结了打印 List 的几种方式。
通过 for 循环打印:
List<String> list = new ArrayList<>();
list.add("北京");
list.add("上海");
list.add("广州");
// 遍历List
for (int i=0;i< list.size();i++) {
System.out.println(list.get(i));
}
通过 foreach 循环打印:
List<String> list = new ArrayList<>();
list.add("北京");
list.add("上海");
list.add("广州");
for (String s : list) {
System.out.println(s);
}
通过 List 的 forEach 方法+lambda 表达式打印:
List<String> list = new ArrayList<>();
list.add("北京");
list.add("上海");
list.add("广州");
list.forEach(s->System.out.println(s));
通过 List 的 forEach 函数+方法引用打印:
List<String> list = new ArrayList<>();
list.add("北京");
list.add("上海");
list.add("广州");
list.forEach(System.out::println);
目前的Windows11新版右键菜单有两个问题:
1、展示项目无法定制,想用的功能被折叠了,每次都要点击一下“显示更多选项”;
2、二级菜单如果朝上方展示,在鼠标从一级菜单向二级菜单移动的过程中,二级菜单可能会自动消失;

主要是第一点,非常烦人,通过以下方式可以恢复经典右键菜单:
reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve
taskkill /f /im explorer.exe
start explorer.exe
恢复经典菜单之后,二级菜单点不中的问题就彻底消失了:

通过以下命令可以使用新版右键菜单:
reg.exe delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f
taskkill /f /im explorer.exe
start explorer.exe
lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
几个示例:
通过某个进程号显示该进行打开的文件
lsof -p 1
列出多个进程号对应的文件信息
lsof -p 1,2,3
列出除了某个进程号,其他进程号所打开的文件信息
lsof -p ^1
列出所有的网络连接
lsof -i
列出所有tcp 网络连接信息
lsof -i tcp
列出所有udp网络连接信息
lsof -i udp
列出谁在使用某个端口
lsof -i :3306
列出谁在使用某个特定的udp端口/tcp端口
lsof -i udp:55
lsof -i tcp:80
列出某个用户打开的文件信息
lsof -u username
列出某个程序进程所打开的文件信息
lsof -c mysql
列出多个进程多个打开的文件信息
lsof -c mysql -c apache
列出某个用户以及某个进程所打开的文件信息
lsof -u test -c mysql
手头有个比较老的 fastadmin 项目,启动的时候因为偷懒,直接把 vendor 目录和 thinkphp 目录都提交到了 git 仓库中,这样部署的时候可以将全量代码同步到 web 目录即可。一般情况下,第三方库无需放到版本库中,就像 node 项目无需把 node_modules 目录放到版本库,python 项目无需把 venv 目录放入版本库一样。
于是决定优化一下:
1、首先将 vendor 和 thinkphp 目录从仓库中删除:
git rm -r --cached ./thinkphp
git rm -r --chached ./vendor
git add .
git commit -a -m '从版本库中删除vendor和thinkphp'
git push
参数说明:
--cached :表示从暂存区中删除,如果不加--cahced 参考,表示从工作区和暂存区同时删除该文件/文件夹;
-r :用于递归删除目录中的文件及子目录;
2、然后将 composer install 添加到部署脚本中即可。
临时指定镜像源
通过参数 -i 指定镜像源,适合临时使用一下,以安装PyMySQL为例,命令如下:
阿里云
pip install -i https://mirrors.aliyun.com/pypi/simple/ PyMySQL
清华源
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyMySQL
在Windows中设置镜像源
可以直接在 C:\Users\用户名\AppData\Roaming\pip 目录中创建文件pip.ini,然后输入以下内容:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
或者直接通过以下命令设置也可以:
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
输出:
Writing to C:\Users\用户名\AppData\Roaming\pip\pip.ini
在deepin中设置镜像源
deepin系统中pip配置文件路径是:/home/用户名/.config/pip/pip.conf,文件内容同上,也可以使用pip config 命令配置。
php文件在执行过程中,可能会遇到“No input file specified”的错误信息,从字面来看,是没有找到输入文件的意思,而背后真正的原因可能会各不相同,总结一下我曾经遇到的一些情况。
一、php文件确实不存在
比如,webroot下没有名为a.php的文件,然后访问以下路径:http://localhost/a.php 。
如果以命令行方式运行一个不存在的php文件,会收到类似的错误信息:
PS C:\dev\php\code\core> php a.php
Could not open input file: aa.php
二、文件属主造成的没有执行权限问题
一般在linux桌面开发的时候会遇到这个问题,php以www用户运行,php项目检出之后的权限为:darkmi:darkmi,此时php文件是没有执行权限的。解决方案是,把当前用户的附加组增加www,命令如下:
usermod -a -G www darkmi
三、php配置造成的没有执行权限问题
在php.ini和user.ini中有个配置项为open_basedir,该配置项会限制php对本地文件系统的访问,即把所有的文件操作都限制指定的目录下。如果open_basedir指定的目录没有当前的项目目录,就会出现No input file specified的错误。
.user.ini 知识点补充
自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用 .htaccess 文件有同样效果。
除了主 php.ini 之外,PHP 还会在每个目录下扫描 INI 文件,从被执行的 PHP 文件所在目录开始一直上升到 web 根目录($_SERVER [‘DOCUMENT_ROOT’] 所指定的)。如果被执行的 PHP 文件在 web 根目录之外,则只扫描该目录。
在 .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和 PHP_INI_USER 模式的 INI 设置可被识别。
https://segmentfault.com/a/1190000011552335
问题描述
最近为我司系统接入某第三方服务,假设该第三方服务为W系统,使用https协议对外提供接口,访问W系统接口的时候,收到如下错误:
org.springframework.web.client.ResourceAccessException: I/O error on GET request for "https://open.wwww.com/api/device/status": Received fatal alert: protocol_version; nested exception is javax.net.ssl.SSLHandshakeException: Received fatal alert: protocol_version
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:746)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:672)
根据日志提示,可猜测为SSL协议版本问题造成的异常。
问题分析
首先查看一下W系统支持的SSL协议版本
方法一:通过myssl.com网站
输出如下:

可知,W系统仅支持TLSv1.2。
以上工具地址为:SSL/TLS安全评估报告 (myssl.com)
More …macOS更新到 Catalina 10.15.4之后,原来显示隐藏文件的快捷键:Command + Shift + . 失效了,只能先用shell命令临时处理一下:
显示隐藏文件:
defaults write com.apple.finder AppleShowAllFiles -boolean true ; killall Finder
隐藏隐藏文件:
defaults write com.apple.finder AppleShowAllFiles -boolean false ; killall Finder
今天在分析nginx日志的时候,发现用户的请求中有如下格式的字符:
\xB6\xF1\xD2\xE2
而大部分用户提交的请求则是如下形式:
%E4%BC%98%E8%A1%A3%E5%BA%93
对于前者,使用以下python代码进行解码:
def decode_query_str():
str = b'\xB6\xF1\xD2\xE2'
print("{} ==》 {}".format(str, str.decode('GBK')))
执行结果:
b'\xb6\xf1\xd2\xe2' ==》 恶意
发生这种情况,可能的原因如下:
IE浏览器设置中有一个选项:”以UTF-8 形式发送URL路径”,当该选项有效时,IE将会对特殊字符进行UTF-8编码,同时进行URL编码。如果该选项无效,则使用默认编码”GBK”,并且不进行 URL编码。但是,对于URL后面的参数,则总是不进行编码,相当于UTF-8选项无效。比如: “中文.html?a=中文”, 当UTF-8选项有效时,将发送链接”%e4%b8%ad%e6%96%87.html?a=/x4e/x2d/x65/x87″; 而UTF-8选项无效时,将发送链接”/x4e/x2d/x65/x87.html?a=/x4e/x2d/x65/x87″。 在此注意,不管此选项是否有勾选,后面的参数都没有改变,改变的仅仅是地址。
对于后者,通过urldecode即可得到解码之后的数据,python代码如下:
def str_two():
str = '恶意'
print(urllib.parse.quote(str))
str = '%E6%81%B6%E6%84%8F'
print(urllib.parse.unquote(str))