278 lines
155 KiB
JSON
278 lines
155 KiB
JSON
{
|
||
"version": "https://jsonfeed.org/version/1",
|
||
"title": "涛声依旧",
|
||
"subtitle": "天下事有难易乎?为之,则难者亦易矣",
|
||
"icon": "https://hitoli.com/images/favicon.ico",
|
||
"description": "天生我材必有用",
|
||
"home_page_url": "https://hitoli.com",
|
||
"items": [
|
||
{
|
||
"id": "https://hitoli.com/2024/01/19/IntellIJ%E5%8F%AA%E7%BC%96%E8%AF%91%E6%89%93%E5%8C%85%E6%8C%87%E5%AE%9A%E7%9A%84%E6%A8%A1%E5%9D%97/",
|
||
"url": "https://hitoli.com/2024/01/19/IntellIJ%E5%8F%AA%E7%BC%96%E8%AF%91%E6%89%93%E5%8C%85%E6%8C%87%E5%AE%9A%E7%9A%84%E6%A8%A1%E5%9D%97/",
|
||
"title": "IntellIJ只编译打包指定的模块",
|
||
"date_published": "2024-01-19T08:06:00.000Z",
|
||
"content_html": "<h4 id=\"新增maven配置\"><a class=\"anchor\" href=\"#新增maven配置\">#</a> 新增 Maven 配置</h4>\n<p>IntellIJ -》 右侧小锤子旁下拉按钮选择 Edit Configurations -》+ 号按钮 -》Maven</p>\n<p><img data-src=\"https://nas.hitoli.com:18014/images/2024/01/19/58082ccf2487.png\" alt=\"\" /></p>\n<p><img data-src=\"https://nas.hitoli.com:18014/images/2024/01/19/3097ede8d80c.png\" alt=\"\" /></p>\n<p><img data-src=\"https://nas.hitoli.com:18014/images/2024/01/19/31412cdf03de.png\" alt=\"\" /></p>\n<h4 id=\"填写maven命令\"><a class=\"anchor\" href=\"#填写maven命令\">#</a> 填写 Maven 命令</h4>\n<p>Working directory 选择根目录,命令是基于选中的目录为执行目录,Run 填写以下命令</p>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">clean install -pl emergency-dzdz/dzdz-yzt -am package -f pom.xml</span><br><span class=\"line\"></span><br><span class=\"line\">clean: 执行项目的清理操作,删除之前编译生成的文件。</span><br><span class=\"line\">install: 将项目构建的结果安装到本地Maven仓库中,以供其他项目使用。</span><br><span class=\"line\">-pl emergency-dzdz/dzdz-yzt: 指定要构建的模块。注意模块路径,此处是构建emergency-dzdz下的dzdz-yzt模块。</span><br><span class=\"line\">-am: 表示构建指定模块时,同时构建其依赖模块。这样可以确保依赖模块也被更新。</span><br><span class=\"line\">package: 打包项目,生成JAR或WAR文件。</span><br><span class=\"line\">因此,这个命令的作用是清理、编译、安装dzdz-yzt和依赖模块,并将它们的构建结果安装到本地Maven仓库中。</span><br></pre></td></tr></table></figure></p>\n",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"IntellIJ",
|
||
"Maven"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2024/01/03/%E8%A7%A3%E5%86%B3Nginx%E8%AE%BF%E9%97%AE%E8%87%AA%E7%AD%BEssl%E8%AF%81%E4%B9%A6%E6%8A%A5%E4%B8%8D%E5%AE%89%E5%85%A8%E5%91%8A%E8%AD%A6/",
|
||
"url": "https://hitoli.com/2024/01/03/%E8%A7%A3%E5%86%B3Nginx%E8%AE%BF%E9%97%AE%E8%87%AA%E7%AD%BEssl%E8%AF%81%E4%B9%A6%E6%8A%A5%E4%B8%8D%E5%AE%89%E5%85%A8%E5%91%8A%E8%AD%A6/",
|
||
"title": "解决Nginx访问自签ssl证书报不安全告警",
|
||
"date_published": "2024-01-03T10:01:00.000Z",
|
||
"content_html": "<h4 id=\"生成根证书私钥和根证书\"><a class=\"anchor\" href=\"#生成根证书私钥和根证书\">#</a> 生成根证书私钥和根证书</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -subj <span class=\"string\">"/C=国家/ST=省/L=市/O=机构"</span> -keyout CA-private.key -out CA-certificate.crt -reqexts v3_req -extensions v3_ca</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#示例</span></span><br><span class=\"line\">openssl req -x509 -nodes -days 36500 -newkey rsa:2048 -subj <span class=\"string\">"/C=CN/ST=EZ/L=EZ/O=EZ"</span> -keyout CA-private.key -out CA-certificate.crt -reqexts v3_req -extensions v3_ca</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"生成自签名证书私钥\"><a class=\"anchor\" href=\"#生成自签名证书私钥\">#</a> 生成自签名证书私钥</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">openssl genrsa -out private.key 2048</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"根据自签名证书私钥生成自签名证书申请文件\"><a class=\"anchor\" href=\"#根据自签名证书私钥生成自签名证书申请文件\">#</a> 根据自签名证书私钥生成自签名证书申请文件</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">openssl req -new -key private.key -subj <span class=\"string\">"/C=CN/ST=EZ/L=EZ/O=EZ/CN=192.168.2.117"</span> -sha256 -out private.csr</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"定义自签名证书扩展文件解决chrome安全告警新建privateext文件并写入以下内容ip为nginx服务器ip同nginxconf中的server_name\"><a class=\"anchor\" href=\"#定义自签名证书扩展文件解决chrome安全告警新建privateext文件并写入以下内容ip为nginx服务器ip同nginxconf中的server_name\">#</a> 定义自签名证书扩展文件 (解决 chrome 安全告警),新建 private.ext 文件并写入以下内容(IP 为 nginx 服务器 ip,同 nginx.conf 中的 server_name)</h4>\n<p><figure class=\"highlight text\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">[ req ]</span><br><span class=\"line\">default_bits = 1024</span><br><span class=\"line\">distinguished_name = req_distinguished_name</span><br><span class=\"line\">req_extensions = san</span><br><span class=\"line\">extensions = san</span><br><span class=\"line\">[ req_distinguished_name ]</span><br><span class=\"line\">countryName = CN</span><br><span class=\"line\">stateOrProvinceName = Definesys</span><br><span class=\"line\">localityName = Definesys</span><br><span class=\"line\">organizationName = Definesys</span><br><span class=\"line\">[SAN]</span><br><span class=\"line\">authorityKeyIdentifier=keyid,issuer</span><br><span class=\"line\">basicConstraints=CA:FALSE</span><br><span class=\"line\">keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment</span><br><span class=\"line\">subjectAltName = IP:192.168.2.117</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"生成自签名证书有效期100年\"><a class=\"anchor\" href=\"#生成自签名证书有效期100年\">#</a> 生成自签名证书(有效期 100 年)</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">openssl x509 -req -days 36500 -<span class=\"keyword\">in</span> private.csr -CA CA-certificate.crt -CAkey CA-private.key -CAcreateserial -sha256 -out private.crt -extfile private.ext -extensions SAN</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"nginx的ssl证书配置\"><a class=\"anchor\" href=\"#nginx的ssl证书配置\">#</a> nginx 的 ssl 证书配置</h4>\n<p><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"string\">ssl_certificate_key</span> <span class=\"string\">/usr/local/nginx/ssl/private.key;</span></span><br><span class=\"line\"><span class=\"string\">ssl_certificate</span> <span class=\"string\">/usr/local/nginx/ssl/private.crt;</span></span><br></pre></td></tr></table></figure></p>\n<h4 id=\"证书安装\"><a class=\"anchor\" href=\"#证书安装\">#</a> 证书安装</h4>\n<p>需要安装 CA-certificate.crt 到受信任的根证书颁发机构下,即可从浏览器正常访问且不会报不安全警告。</p>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#ssl测试</span></span><br><span class=\"line\">openssl s_client -connect localhost:8080</span><br><span class=\"line\"><span class=\"comment\">#检查证书格式</span></span><br><span class=\"line\">openssl x509 -<span class=\"keyword\">in</span> private.crt -text -noout</span><br><span class=\"line\">openssl rsa -<span class=\"keyword\">in</span> private.key -check</span><br><span class=\"line\"><span class=\"comment\">#检查证书是否过期(确保 "notBefore" 小于当前日期,"notAfter" 大于当前日期)</span></span><br><span class=\"line\">openssl x509 -<span class=\"keyword\">in</span> private.crt -noout -dates</span><br><span class=\"line\"><span class=\"comment\">#查看证书链</span></span><br><span class=\"line\">openssl x509 -<span class=\"keyword\">in</span> private.crt -noout -issuer -subject</span><br></pre></td></tr></table></figure></p>\n",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"Nginx",
|
||
"https",
|
||
"SSL",
|
||
"证书"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2024/01/03/Centos7%E7%BC%96%E8%AF%91%E5%8D%87%E7%BA%A7nginx/",
|
||
"url": "https://hitoli.com/2024/01/03/Centos7%E7%BC%96%E8%AF%91%E5%8D%87%E7%BA%A7nginx/",
|
||
"title": "Centos7编译升级nginx",
|
||
"date_published": "2024-01-03T09:40:00.000Z",
|
||
"content_html": "<h4 id=\"配置\"><a class=\"anchor\" href=\"#配置\">#</a> 配置</h4>\n<p>./configure<br />\n# 安装目录<br />\n --prefix=/usr/local/nginx<br />\n#nginx 运行时的非特权用户<br />\n --user=nginx<br />\n#nginx 运行时的非特权用户组<br />\n --group=nginx<br />\n#nginx 运行时 pid 的目录<br />\n --pid-path=/var/run/nginx/nginx.pid<br />\n# 锁定文件目录,防止误操作,或其他使用<br />\n --lock-path=/var/lock/nginx.lock<br />\n#nginx 错误日志目录<br />\n --error-log-path=/var/log/nginx/error.log<br />\n#nginx 运行日志目录<br />\n --http-log-path=/var/log/nginx/access.log<br />\n# 开启 gz 模块,压缩静态页面<br />\n --with-http_gzip_static_module<br />\n--with-http_gunzip_module<br />\n# 开启 ssl 模块<br />\n --with-http_ssl_module<br />\n# 开启 http2 模块<br />\n --with-http_v2_module<br />\n#openssl 目录<br />\n --with-openssl=/home/openssl-3.2.0<br />\n#nginx 的客户端状态<br />\n --with-http_stub_status_module<br />\n--with-http_realip_module<br />\n# 设定客户端请求的临时目录<br />\n --http-client-body-temp-path=/usr/local/nginx/client<br />\n# 设定 http 代理临时目录<br />\n --http-proxy-temp-path=/usr/local/nginx/proxy<br />\n# 设定 fastcgi 临时目录<br />\n --http-fastcgi-temp-path=/usr/local/nginx/fastcgi<br />\n# 设定 uwsgi 临时目录<br />\n --http-uwsgi-temp-path=/usr/local/nginx/uwsgi<br />\n# 设定 scgi 临时目录<br />\n --http-scgi-temp-path=/usr/local/nginx/scgi<br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-openssl=/home/openssl-3.2.0</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"编译\"><a class=\"anchor\" href=\"#编译\">#</a> 编译</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">make(不要make install)</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"备份\"><a class=\"anchor\" href=\"#备份\">#</a> 备份</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"built_in\">cp</span> /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.old</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"更新\"><a class=\"anchor\" href=\"#更新\">#</a> 更新</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#关闭nginx</span></span><br><span class=\"line\">nginx -s stop</span><br><span class=\"line\"><span class=\"comment\">#更新nginx</span></span><br><span class=\"line\"><span class=\"built_in\">cp</span> /root/nginx-1.24.0/objs/nginx /usr/local/nginx/sbin/</span><br><span class=\"line\"><span class=\"comment\">#启动nginx</span></span><br><span class=\"line\">nginx</span><br></pre></td></tr></table></figure></p>\n",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"Nginx",
|
||
"CentOS"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/12/24/Docker-desktop%E9%83%A8%E7%BD%B2nacos/",
|
||
"url": "https://hitoli.com/2023/12/24/Docker-desktop%E9%83%A8%E7%BD%B2nacos/",
|
||
"title": "Docker desktop部署nacos",
|
||
"date_published": "2023-12-24T13:37:00.000Z",
|
||
"content_html": "<h4 id=\"创建数据库\"><a class=\"anchor\" href=\"#创建数据库\">#</a> 创建数据库</h4>\n<p><figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">create</span> database nacos</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"下载初始化脚本\"><a class=\"anchor\" href=\"#下载初始化脚本\">#</a> 下载初始化脚本</h4>\n<p><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2FsaWJhYmEvbmFjb3MvYmxvYi9tYXN0ZXIvZGlzdHJpYnV0aW9uL2NvbmYvbXlzcWwtc2NoZW1hLnNxbA==\">脚本文件</span></p>\n<h4 id=\"以普通模式启动获取数据\"><a class=\"anchor\" href=\"#以普通模式启动获取数据\">#</a> 以普通模式启动获取数据</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run -d --restart=always --name=<span class=\"string\">"nacos"</span> -e MODE=standalone -p 8848:8848 -p 9848:9848 nacos/nacos-server:latest</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"进入容器内修改文件权限\"><a class=\"anchor\" href=\"#进入容器内修改文件权限\">#</a> 进入容器内修改文件权限</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"built_in\">chmod</span> 777 /home/nacos/conf</span><br><span class=\"line\"><span class=\"built_in\">chmod</span> 777 /home/nacos/data</span><br><span class=\"line\"><span class=\"built_in\">chmod</span> 777 /home/nacos/logs</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"拷贝文件到本地\"><a class=\"anchor\" href=\"#拷贝文件到本地\">#</a> 拷贝文件到本地</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker <span class=\"built_in\">cp</span> nacos:/home/nacos/conf D:\\docker\\nacos\\data\\</span><br><span class=\"line\">docker <span class=\"built_in\">cp</span> nacos:/home/nacos/data D:\\docker\\nacos\\data\\</span><br><span class=\"line\">docker <span class=\"built_in\">cp</span> nacos:/home/nacos/logs D:\\docker\\nacos\\data\\</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"创建正式容器\"><a class=\"anchor\" href=\"#创建正式容器\">#</a> 创建正式容器</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker run -d --name nacos --restart=always --network my-net -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODE=standalone --privileged=<span class=\"literal\">true</span> -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=mysql地址 -e MYSQL_SERVICE_PORT=mysql端口 -e MYSQL_SERVICE_USER=mysql用户名 -e MYSQL_SERVICE_PASSWORD=mysql密码 -e MYSQL_SERVICE_DB_NAME=nacos -e TIME_ZONE=<span class=\"string\">'Asia/Shanghai'</span> -v D:\\docker\\nacos\\data\\logs:/home/nacos/logs -v D:\\docker\\nacos\\data\\data:/home/nacos/data -v D:\\docker\\nacos\\data\\conf:/home/nacos/conf nacos/nacos-server:latest</span><br></pre></td></tr></table></figure></p>\n",
|
||
"tags": [
|
||
"Windows",
|
||
"工具",
|
||
"docker",
|
||
"nacos"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/12/02/fastjson%E5%BA%8F%E5%88%97%E5%8C%96%E5%8E%BB%E9%99%A4%E7%A9%BA%E5%AD%97%E7%AC%A6%E4%B8%B2/",
|
||
"url": "https://hitoli.com/2023/12/02/fastjson%E5%BA%8F%E5%88%97%E5%8C%96%E5%8E%BB%E9%99%A4%E7%A9%BA%E5%AD%97%E7%AC%A6%E4%B8%B2/",
|
||
"title": "fastjson序列化去除空字符串属性",
|
||
"date_published": "2023-12-02T13:47:00.000Z",
|
||
"content_html": "<p>今天在把对象转为 json 时需要去除 key 或者 value 为 null 或空字符串的属性,特此记录一下后续好复用。<br />\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"keyword\">static</span> String <span class=\"title function_\">toJSONString</span><span class=\"params\">(Object object)</span> {</span><br><span class=\"line\"> SerializerFeature[] serializerFeatures = <span class=\"keyword\">new</span> <span class=\"title class_\">SerializerFeature</span>[] {</span><br><span class=\"line\"> <span class=\"comment\">//格式化时间</span></span><br><span class=\"line\"> SerializerFeature.WriteDateUseDateFormat</span><br><span class=\"line\"> };</span><br><span class=\"line\"> <span class=\"keyword\">return</span> JSON.toJSONString(object, <span class=\"keyword\">new</span> <span class=\"title class_\">ValueFilter</span>() {</span><br><span class=\"line\"> <span class=\"meta\">@Override</span></span><br><span class=\"line\"> <span class=\"keyword\">public</span> Object <span class=\"title function_\">process</span><span class=\"params\">(Object object, String name, Object value)</span> {</span><br><span class=\"line\"> <span class=\"comment\">// 如果名称或者值为null或空字符串,则不序列化该属性</span></span><br><span class=\"line\"> <span class=\"keyword\">if</span> (name == <span class=\"literal\">null</span> || (name <span class=\"keyword\">instanceof</span> String && ((String) name).isEmpty()) ||</span><br><span class=\"line\"> value == <span class=\"literal\">null</span> || (value <span class=\"keyword\">instanceof</span> String && ((String) value).isEmpty())) {</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"literal\">null</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"keyword\">return</span> value;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> }, serializerFeatures);</span><br><span class=\"line\"> }</span><br></pre></td></tr></table></figure></p>\n",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"fastjson"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/11/03/Linux%E4%B8%8B%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2SpringBoot%E9%A1%B9%E7%9B%AE%E7%9A%84%E8%84%9A%E6%9C%AC/",
|
||
"url": "https://hitoli.com/2023/11/03/Linux%E4%B8%8B%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2SpringBoot%E9%A1%B9%E7%9B%AE%E7%9A%84%E8%84%9A%E6%9C%AC/",
|
||
"title": "Linux下快速部署SpringBoot项目的脚本",
|
||
"date_published": "2023-11-03T13:35:00.000Z",
|
||
"content_html": "<h4 id=\"windows部署脚本\"><a class=\"anchor\" href=\"#windows部署脚本\">#</a> Windows 部署脚本</h4>\n<p>只需要把 jar 和 yml 跟脚本放在同一目录下即可快速启动。</p>\n<div class=\"note info\">\n<p>拷贝以下代码放入 txt 文本,<span class=\"exturl\" data-url=\"aHR0cDovL3huLS1zdGFydC1kcTFoNzE2YXVzOGFldHcuc2g=\">然后改为 start.sh</span></p>\n</div>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#!/bin/bash</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">export</span> CLOUD_HOME=`<span class=\"built_in\">pwd</span>`</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\"># 获取当前目录中的第一个JAR文件的名称</span></span><br><span class=\"line\">jar_file=$(find . -maxdepth 1 -<span class=\"built_in\">type</span> f -name <span class=\"string\">"*.jar"</span> | <span class=\"built_in\">head</span> -n 1)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">if</span> [ -n <span class=\"string\">"<span class=\"variable\">$jar_file</span>"</span> ]; <span class=\"keyword\">then</span></span><br><span class=\"line\"> jar_file=<span class=\"variable\">${jar_file#./}</span></span><br><span class=\"line\"> <span class=\"comment\">#echo "JAR文件的名称是: $jar_file"</span></span><br><span class=\"line\"> jar_file_name=$(<span class=\"built_in\">basename</span> <span class=\"string\">"<span class=\"variable\">$jar_file</span>"</span> .jar)</span><br><span class=\"line\"><span class=\"keyword\">else</span></span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">"当前目录没有JAR文件."</span></span><br><span class=\"line\"> <span class=\"built_in\">exit</span></span><br><span class=\"line\"><span class=\"keyword\">fi</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\"># 获取当前目录中的第一个yml文件的名称</span></span><br><span class=\"line\">yml_file=$(find . -maxdepth 1 -<span class=\"built_in\">type</span> f -name <span class=\"string\">"*.yml"</span> | <span class=\"built_in\">head</span> -n 1)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">if</span> [ -n <span class=\"string\">"<span class=\"variable\">$yml_file</span>"</span> ]; <span class=\"keyword\">then</span></span><br><span class=\"line\"> yml_file=<span class=\"variable\">${yml_file#./}</span></span><br><span class=\"line\"> <span class=\"comment\">#echo "YML文件的名称是: $yml_file"</span></span><br><span class=\"line\"><span class=\"keyword\">else</span></span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">"当前目录中没有YML文件."</span></span><br><span class=\"line\"><span class=\"keyword\">fi</span></span><br><span class=\"line\"></span><br><span class=\"line\">pids=$(ps -ef | grep java | grep <span class=\"variable\">$jar_file_name</span> | grep -v grep | awk <span class=\"string\">'{print $2}'</span>)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">for</span> pid <span class=\"keyword\">in</span> <span class=\"variable\">$pids</span>; <span class=\"keyword\">do</span></span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">"<span class=\"variable\">$jar_file_name</span> is running, pid="</span><span class=\"variable\">$pid</span></span><br><span class=\"line\"> <span class=\"built_in\">exit</span> 0</span><br><span class=\"line\"><span class=\"keyword\">done</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">echo</span> <span class=\"string\">"<span class=\"variable\">$jar_file_name</span> is pedding..."</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">sleep</span> 3</span><br><span class=\"line\"></span><br><span class=\"line\">JAVA_OPTS=<span class=\"string\">"-Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF8"</span></span><br><span class=\"line\">JAVA_OPTS=<span class=\"string\">"<span class=\"variable\">$JAVA_OPTS</span> -Dsun.jnu.encoding=UTF8 -Xms512m -Xmx1024m"</span></span><br><span class=\"line\">JAVA_OPTS=<span class=\"string\">"<span class=\"variable\">$JAVA_OPTS</span> -Dpid.path=<span class=\"variable\">$CLOUD_HOME</span>/temp -Dspring.config.additional-location=<span class=\"variable\">$CLOUD_HOME</span>/<span class=\"variable\">$yml_file</span>"</span></span><br><span class=\"line\">JAVA_OPTS=<span class=\"string\">"<span class=\"variable\">$JAVA_OPTS</span> -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5007"</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">nohup</span> java <span class=\"variable\">$JAVA_OPTS</span> -jar <span class=\"variable\">$CLOUD_HOME</span>/<span class=\"variable\">$jar_file</span> >/dev/null 2> <span class=\"variable\">$CLOUD_HOME</span>/<span class=\"variable\">$jar_file_name</span>.run &</span><br><span class=\"line\"><span class=\"comment\">#nohup java $JAVA_OPTS -jar $CLOUD_HOME/$jar_file > $CLOUD_HOME/$jar_file_name.run 2>&1 &</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">echo</span> <span class=\"string\">"<span class=\"variable\">$jar_file_name</span> started."</span></span><br></pre></td></tr></table></figure></p>\n<div class=\"note info\">\n<p>拷贝以下代码放入 txt 文本,<span class=\"exturl\" data-url=\"aHR0cDovL3huLS1zdG9wLXVoNWZ0MjJhOWs1YXBidS5zaA==\">然后改为 stop.sh</span></p>\n</div>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">#!/bin/bash</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">export</span> CLOUD_HOME=`<span class=\"built_in\">pwd</span>`</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\"># 获取当前目录中的第一个JAR文件的名称</span></span><br><span class=\"line\">jar_file=$(find . -maxdepth 1 -<span class=\"built_in\">type</span> f -name <span class=\"string\">"*.jar"</span> | <span class=\"built_in\">head</span> -n 1)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">if</span> [ -n <span class=\"string\">"<span class=\"variable\">$jar_file</span>"</span> ]; <span class=\"keyword\">then</span></span><br><span class=\"line\"> jar_file=<span class=\"variable\">${jar_file#./}</span></span><br><span class=\"line\"> <span class=\"comment\">#echo "JAR文件的名称是: $jar_file"</span></span><br><span class=\"line\"> jar_file_name=$(<span class=\"built_in\">basename</span> <span class=\"string\">"<span class=\"variable\">$jar_file</span>"</span> .jar)</span><br><span class=\"line\"><span class=\"keyword\">else</span></span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">"当前目录没有JAR文件."</span></span><br><span class=\"line\"> <span class=\"built_in\">exit</span></span><br><span class=\"line\"><span class=\"keyword\">fi</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\"># 获取当前目录中的第一个yml文件的名称</span></span><br><span class=\"line\">yml_file=$(find . -maxdepth 1 -<span class=\"built_in\">type</span> f -name <span class=\"string\">"*.yml"</span> | <span class=\"built_in\">head</span> -n 1)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">if</span> [ -n <span class=\"string\">"<span class=\"variable\">$yml_file</span>"</span> ]; <span class=\"keyword\">then</span></span><br><span class=\"line\"> yml_file=<span class=\"variable\">${yml_file#./}</span></span><br><span class=\"line\"> <span class=\"comment\">#echo "YML文件的名称是: $yml_file"</span></span><br><span class=\"line\"><span class=\"keyword\">else</span></span><br><span class=\"line\"> <span class=\"built_in\">echo</span> <span class=\"string\">"当前目录中没有YML文件."</span></span><br><span class=\"line\"><span class=\"keyword\">fi</span></span><br><span class=\"line\"></span><br><span class=\"line\">pids=$(ps -ef | grep java | grep <span class=\"variable\">$jar_file_name</span> | grep -v grep | awk <span class=\"string\">'{print $2}'</span>)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">for</span> pid <span class=\"keyword\">in</span> <span class=\"variable\">$pids</span>; <span class=\"keyword\">do</span></span><br><span class=\"line\"> <span class=\"built_in\">kill</span> -9 <span class=\"variable\">$pid</span></span><br><span class=\"line\"><span class=\"keyword\">done</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">echo</span> <span class=\"string\">"<span class=\"variable\">$jar_file_name</span> is stopping..."</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">sleep</span> 5</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">echo</span> <span class=\"string\">"<span class=\"variable\">$jar_file_name</span> stopped."</span></span><br></pre></td></tr></table></figure></p>\n",
|
||
"tags": [
|
||
"Linux",
|
||
"Shell",
|
||
"Linux",
|
||
"SpringBoot",
|
||
"快速部署",
|
||
"bash"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/10/29/%E7%BB%99%E6%88%91%E7%9A%84%E8%80%81%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%B8%85%E7%90%86%E7%81%B0%E5%B0%98/",
|
||
"url": "https://hitoli.com/2023/10/29/%E7%BB%99%E6%88%91%E7%9A%84%E8%80%81%E7%AC%94%E8%AE%B0%E6%9C%AC%E6%B8%85%E7%90%86%E7%81%B0%E5%B0%98/",
|
||
"title": "给我的老笔记本清理灰尘",
|
||
"date_published": "2023-10-29T12:41:00.000Z",
|
||
"content_html": "<p>今天闲着无事就把我的老笔记本拆了,清理了一下灰尘。笔记本已经 10 多年了,中间加过内存,换过固态硬盘。清理一下还能发挥它的余热!<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/c7b84a3d703a.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/fd2e099d875d.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/0fea7641ccde.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/73c63c1438a8.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/4c5d526af3e7.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/4b9bcbecbca3.jpg\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/29/38ffc2e9639f.jpg\" alt=\"\" /></p>\n",
|
||
"tags": [
|
||
"生活",
|
||
"日常记录",
|
||
"笔记本",
|
||
"DELL"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/10/28/Windows%E4%B8%8B%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2SpringBoot%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%89%B9%E5%A4%84%E7%90%86/",
|
||
"url": "https://hitoli.com/2023/10/28/Windows%E4%B8%8B%E5%BF%AB%E9%80%9F%E9%83%A8%E7%BD%B2SpringBoot%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%89%B9%E5%A4%84%E7%90%86/",
|
||
"title": "Windows下快速部署SpringBoot项目的批处理",
|
||
"date_published": "2023-10-28T11:56:00.000Z",
|
||
"content_html": "<h4 id=\"windows部署脚本\"><a class=\"anchor\" href=\"#windows部署脚本\">#</a> Windows 部署脚本</h4>\n<p>只需要把 jar 和 yml 跟批处理放在同一目录下即可点击快速启动。启动后再次点击会关闭上次启动的窗口并重新启动。</p>\n<div class=\"note info\">\n<p>拷贝以下代码放入 txt 文本,然后改为 start.bat</p>\n</div>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br><span class=\"line\">58</span><br><span class=\"line\">59</span><br><span class=\"line\">60</span><br><span class=\"line\">61</span><br><span class=\"line\">62</span><br><span class=\"line\">63</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">@ECHO OFF</span><br><span class=\"line\">setlocal enabledelayedexpansion</span><br><span class=\"line\"></span><br><span class=\"line\">REM 关闭上次进程</span><br><span class=\"line\">SET <span class=\"string\">"pidFile=pid.txt"</span></span><br><span class=\"line\"><span class=\"keyword\">if</span> exist <span class=\"string\">"%pidFile%"</span> (</span><br><span class=\"line\">\t<span class=\"keyword\">for</span> /f <span class=\"string\">"usebackq"</span> %%a <span class=\"keyword\">in</span> (<span class=\"string\">"pid.txt"</span>) <span class=\"keyword\">do</span> (</span><br><span class=\"line\">\t\t<span class=\"built_in\">set</span> PID=%%a</span><br><span class=\"line\">\t)</span><br><span class=\"line\">\t<span class=\"keyword\">if</span> not <span class=\"string\">"!PID!"</span>==<span class=\"string\">""</span> (</span><br><span class=\"line\">\t\ttaskkill /F /T /PID !pid!</span><br><span class=\"line\">\t\tdel pid.txt</span><br><span class=\"line\">\t)</span><br><span class=\"line\">)</span><br><span class=\"line\"></span><br><span class=\"line\">REM 存储当前进程</span><br><span class=\"line\"><span class=\"keyword\">for</span> /f %%i <span class=\"keyword\">in</span> (<span class=\"string\">'wmic process where "name='</span>cmd.exe<span class=\"string\">' and CommandLine like '</span>%%<scriptname>.bat%%<span class=\"string\">'" get ParentProcessId ^| findstr /r "[0-9]"'</span>) <span class=\"keyword\">do</span> <span class=\"built_in\">set</span> pid=%%i</span><br><span class=\"line\"><span class=\"built_in\">echo</span> %PID% > pid.txt</span><br><span class=\"line\"></span><br><span class=\"line\">REM 设置title</span><br><span class=\"line\"><span class=\"keyword\">for</span> /f <span class=\"string\">"tokens=2"</span> %%i <span class=\"keyword\">in</span> (<span class=\"string\">'chcp'</span>) <span class=\"keyword\">do</span> <span class=\"built_in\">set</span> codepage=%%i</span><br><span class=\"line\">chcp 65001 > nul</span><br><span class=\"line\">title 我的SpringBoot项目</span><br><span class=\"line\">chcp %codepage% > nul</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">cd</span> %~dp0</span><br><span class=\"line\"></span><br><span class=\"line\">REM 获取jar</span><br><span class=\"line\"><span class=\"built_in\">set</span> <span class=\"string\">"jarFile="</span></span><br><span class=\"line\"><span class=\"keyword\">for</span> %%i <span class=\"keyword\">in</span> (*.jar) <span class=\"keyword\">do</span> (</span><br><span class=\"line\"> <span class=\"keyword\">if</span> not defined jarFile (</span><br><span class=\"line\"> <span class=\"built_in\">set</span> <span class=\"string\">"jarFile=%%i"</span></span><br><span class=\"line\"> )</span><br><span class=\"line\">)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">if</span> not defined jarFile (</span><br><span class=\"line\"> <span class=\"built_in\">echo</span> not find jar</span><br><span class=\"line\"> pause</span><br><span class=\"line\"> <span class=\"built_in\">exit</span></span><br><span class=\"line\">)</span><br><span class=\"line\"></span><br><span class=\"line\">SET JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom -Dfile.encoding=UTF-8</span><br><span class=\"line\"><span class=\"built_in\">set</span> JAVA_OPTS=%JAVA_OPTS% -Dsun.jnu.encoding=UTF8 -Xms512m -Xmx1024m</span><br><span class=\"line\"><span class=\"built_in\">set</span> JAVA_OPTS=%JAVA_OPTS% -agentlib:jdwp=transport=dt_socket,server=y,<span class=\"built_in\">suspend</span>=n,address=5007</span><br><span class=\"line\"><span class=\"built_in\">set</span> JAVA_OPTS=%JAVA_OPTS% -Dpid.path=./temp</span><br><span class=\"line\"></span><br><span class=\"line\">REM 获取yml</span><br><span class=\"line\"><span class=\"built_in\">set</span> <span class=\"string\">"ymlFile="</span></span><br><span class=\"line\"><span class=\"keyword\">for</span> %%i <span class=\"keyword\">in</span> (*.yml) <span class=\"keyword\">do</span> (</span><br><span class=\"line\"> <span class=\"keyword\">if</span> not defined ymlFile (</span><br><span class=\"line\"> <span class=\"built_in\">set</span> <span class=\"string\">"ymlFile=%%i"</span></span><br><span class=\"line\"> )</span><br><span class=\"line\">)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"keyword\">if</span> defined ymlFile (</span><br><span class=\"line\">\t<span class=\"built_in\">set</span> JAVA_OPTS=%JAVA_OPTS% -Dspring.config.additional-location=!ymlFile!</span><br><span class=\"line\">) <span class=\"keyword\">else</span> (</span><br><span class=\"line\">\t<span class=\"built_in\">echo</span> not find yml</span><br><span class=\"line\">)</span><br><span class=\"line\"></span><br><span class=\"line\">REM 启动服务</span><br><span class=\"line\">java %JAVA_OPTS% -jar !jarFile!</span><br><span class=\"line\">pause</span><br></pre></td></tr></table></figure></p>\n<div class=\"note info\">\n<p>拷贝以下代码放入 txt 文本,然后改为 stop.bat</p>\n</div>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">@ECHO OFF</span><br><span class=\"line\">setlocal enabledelayedexpansion</span><br><span class=\"line\"></span><br><span class=\"line\">REM 关闭上次进程</span><br><span class=\"line\">SET <span class=\"string\">"pidFile=pid.txt"</span></span><br><span class=\"line\"><span class=\"keyword\">if</span> exist <span class=\"string\">"%pidFile%"</span> (</span><br><span class=\"line\">\t<span class=\"keyword\">for</span> /f <span class=\"string\">"usebackq"</span> %%a <span class=\"keyword\">in</span> (<span class=\"string\">"pid.txt"</span>) <span class=\"keyword\">do</span> (</span><br><span class=\"line\">\t\t<span class=\"built_in\">set</span> PID=%%a</span><br><span class=\"line\">\t)</span><br><span class=\"line\">\t<span class=\"keyword\">if</span> not <span class=\"string\">"!PID!"</span>==<span class=\"string\">""</span> (</span><br><span class=\"line\">\t\ttaskkill /F /T /PID !pid!</span><br><span class=\"line\">\t\tdel pid.txt</span><br><span class=\"line\">\t)</span><br><span class=\"line\">)</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"built_in\">exit</span></span><br></pre></td></tr></table></figure></p>\n",
|
||
"tags": [
|
||
"Windows",
|
||
"工具",
|
||
"SpringBoot",
|
||
"快速部署",
|
||
"Bat",
|
||
"批处理"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/10/28/Centos%E6%8C%82%E8%BD%BD%E6%96%B0%E7%A1%AC%E7%9B%98/",
|
||
"url": "https://hitoli.com/2023/10/28/Centos%E6%8C%82%E8%BD%BD%E6%96%B0%E7%A1%AC%E7%9B%98/",
|
||
"title": "Centos挂载新硬盘",
|
||
"date_published": "2023-10-28T11:26:00.000Z",
|
||
"content_html": "<h4 id=\"查看磁盘信息\"><a class=\"anchor\" href=\"#查看磁盘信息\">#</a> 查看磁盘信息</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">fdisk -l 查看当前磁盘的分区情况</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/4dc953fc5a5e.png\" alt=\"\" /><br />\n 可从图中获取以下信息:<br />\n/dev/vdb 数据盘容量为 60GB,包含 MBR 分区 /dev/vdb1,容量为 50GB。<br />\n/dev/vdc 数据盘容量为 60GB,包含 GPT 分区 /dev/vdc1,容量为 50GB。</p>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"built_in\">df</span> -TH 分区的文件系统类型</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/8996c9620632.png\" alt=\"\" /><br />\n 可从图中获取以下信息:<br />\n/dev/vdb1 文件系统类型为 ext4,已挂载至 /mnt/disk1。<br />\n/dev/vdc1 文件系统类型为 xfs,已挂载至 /mnt/disk2。<br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">fdisk /dev/vdb 查看新磁盘情况</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/0f1237aef57b.png\" alt=\"\" /><br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">lsbl 查看分区情况</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/8071a3832e29.png\" alt=\"\" /></p>\n<h4 id=\"挂载新硬盘\"><a class=\"anchor\" href=\"#挂载新硬盘\">#</a> 挂载新硬盘</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">mkfs.ext4 /dev/vdb 格式化磁盘</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/9353dd85579f.png\" alt=\"\" /><br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"built_in\">cd</span> /mnt</span><br><span class=\"line\"><span class=\"built_in\">mkdir</span> data 新建挂载点</span><br><span class=\"line\">mount /dev/vdb /mnt/data 挂载</span><br></pre></td></tr></table></figure><br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"built_in\">df</span> -h 查看挂载情况</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/ead4f7b1323f.png\" alt=\"\" /><br />\n 查看 UUID 有三种方式:<br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">blkid</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/236412bc1e3f.png\" alt=\"\" /><br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">lsblk -f</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/35d7182c5647.png\" alt=\"\" /><br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">ll /dev/disk/by-uuid/</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/10/28/3f9d4f69d8ea.png\" alt=\"\" /><br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">设置自动挂载:</span><br><span class=\"line\"><span class=\"built_in\">echo</span> <span class=\"string\">"UUID=c8ac09ca-fd4d-4511-bd2c-4fdf96f08168 /data ext4 defaults 0 0"</span> >> /etc/fstab</span><br><span class=\"line\">自动挂载/etc/fstab里面的东西</span><br><span class=\"line\">mount -a</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"临时卸载\"><a class=\"anchor\" href=\"#临时卸载\">#</a> 临时卸载</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">umount /dev/vdb 重启机器之后又恢复到挂载状态</span><br></pre></td></tr></table></figure></p>\n<h4 id=\"永久卸载\"><a class=\"anchor\" href=\"#永久卸载\">#</a> 永久卸载</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">vim /etc/fstab 把添加的磁盘信息删除即可。</span><br></pre></td></tr></table></figure></p>\n",
|
||
"tags": [
|
||
"Linux",
|
||
"Centos",
|
||
"Centos",
|
||
"Linux",
|
||
"Mount"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/09/09/squid-stunnel-%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91/",
|
||
"url": "https://hitoli.com/2023/09/09/squid-stunnel-%E7%A7%91%E5%AD%A6%E4%B8%8A%E7%BD%91/",
|
||
"title": "squid+stunnel 科学上网",
|
||
"date_published": "2023-09-09T08:48:00.000Z",
|
||
"content_html": "<h4 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h4>\n<p>科学上网的方法有多种,有很多第三方提供的免费方案,这些方案优缺点暂时不予讨论。实际工作生活中还是会有需要自己搭建的情况,这次介绍的是使用 squid+stunnel 方案进行搭建。</p>\n<h4 id=\"准备\"><a class=\"anchor\" href=\"#准备\">#</a> 准备</h4>\n<p>一台可以访问外网的服务器,如香港的云主机并安装 Ubuntu 系统。</p>\n<h5 id=\"squid部分\"><a class=\"anchor\" href=\"#squid部分\">#</a> squid 部分</h5>\n<ul>\n<li>1、安装</li>\n</ul>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">apt-get install -y squid</span><br></pre></td></tr></table></figure></p>\n<ul>\n<li>2、配置</li>\n</ul>\n<div class=\"note info\">\n<p>生成用户文件</p>\n</div>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">apt-get install apache2-utils</span><br><span class=\"line\">htpasswd -c /etc/squid/squid_user.txt 用户名</span><br></pre></td></tr></table></figure></p>\n<div class=\"note info\">\n<p>修改 squid 配置<br />\n 1、直接修改 /etc/squid/squid.conf 文件<br />\n 2、修改 /etc/squid/conf.d/debian.conf 文件<br />\n两种方式都一样,在底部加入以下代码</p>\n</div>\n<p><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#dns服务器地址</span></span><br><span class=\"line\"><span class=\"string\">dns_nameservers</span> <span class=\"number\">8.8</span><span class=\"number\">.8</span><span class=\"number\">.8</span> <span class=\"number\">8.8</span><span class=\"number\">.4</span><span class=\"number\">.4</span></span><br><span class=\"line\"><span class=\"string\">dns_v4_first</span> <span class=\"string\">on</span></span><br><span class=\"line\"><span class=\"comment\"># 监听端口</span></span><br><span class=\"line\"><span class=\"string\">http_port</span> <span class=\"number\">3128</span></span><br><span class=\"line\"><span class=\"comment\"># 定义squid密码文件与ncsa_auth文件位置</span></span><br><span class=\"line\"><span class=\"string\">auth_param</span> <span class=\"string\">basic</span> <span class=\"string\">program</span> <span class=\"string\">/usr/lib/squid/basic_ncsa_auth</span> <span class=\"string\">/etc/squid/squid_user.txt</span></span><br><span class=\"line\"><span class=\"comment\"># 认证进程的数量</span></span><br><span class=\"line\"><span class=\"string\">auth_param</span> <span class=\"string\">basic</span> <span class=\"string\">children</span> <span class=\"number\">15</span></span><br><span class=\"line\"><span class=\"comment\"># 认证对话框显示提示信息</span></span><br><span class=\"line\"><span class=\"string\">auth_param</span> <span class=\"string\">basic</span> <span class=\"string\">realm</span> <span class=\"string\">Squid</span> <span class=\"string\">proxy-caching</span> <span class=\"string\">web</span> <span class=\"string\">server</span></span><br><span class=\"line\"><span class=\"comment\"># 认证有效期</span></span><br><span class=\"line\"><span class=\"string\">auth_param</span> <span class=\"string\">basic</span> <span class=\"string\">credentialsttl</span> <span class=\"number\">24</span> <span class=\"string\">hours</span></span><br><span class=\"line\"><span class=\"comment\"># 是否区分用户名大小,off为不区分</span></span><br><span class=\"line\"><span class=\"string\">auth_param</span> <span class=\"string\">basic</span> <span class=\"string\">casesensitive</span> <span class=\"string\">off</span></span><br><span class=\"line\"><span class=\"comment\"># 对定义的squid_user文件内的用户开启认证访问</span></span><br><span class=\"line\"><span class=\"string\">acl</span> <span class=\"string\">用户名</span> <span class=\"string\">proxy_auth</span> <span class=\"string\">REQUIRED</span></span><br><span class=\"line\"><span class=\"comment\"># 允许squid_user文件内用户进行代理</span></span><br><span class=\"line\"><span class=\"string\">http_access</span> <span class=\"string\">allow</span> <span class=\"string\">用户名</span></span><br><span class=\"line\"><span class=\"comment\"># 顺序匹配,最后添加拒绝所有未允许的规则。不添加会发现,未匹配到的规则会被放行</span></span><br><span class=\"line\"><span class=\"string\">http_access</span> <span class=\"string\">deny</span> <span class=\"string\">all</span></span><br><span class=\"line\"><span class=\"comment\"># 缓存设置</span></span><br><span class=\"line\"><span class=\"string\">cache_dir</span> <span class=\"string\">ufs</span> <span class=\"string\">/var/spool/squid</span> <span class=\"number\">100</span> <span class=\"number\">16</span> <span class=\"number\">256</span> <span class=\"string\">read-only</span></span><br><span class=\"line\"><span class=\"string\">cache_mem</span> <span class=\"number\">0</span> <span class=\"string\">MB</span></span><br><span class=\"line\"><span class=\"string\">coredump_dir</span> <span class=\"string\">/var/spool/squid</span></span><br><span class=\"line\"><span class=\"comment\"># 配置高匿,不允许设置任何多余头信息,保持原请求header。</span></span><br><span class=\"line\"><span class=\"string\">header_access</span> <span class=\"string\">Via</span> <span class=\"string\">deny</span> <span class=\"string\">all</span></span><br><span class=\"line\"><span class=\"string\">header_access</span> <span class=\"string\">X-Forwarded-For</span> <span class=\"string\">deny</span> <span class=\"string\">all</span></span><br><span class=\"line\"><span class=\"string\">header_access</span> <span class=\"string\">Server</span> <span class=\"string\">deny</span> <span class=\"string\">all</span></span><br><span class=\"line\"><span class=\"string\">header_access</span> <span class=\"string\">X-Cache</span> <span class=\"string\">deny</span> <span class=\"string\">all</span></span><br><span class=\"line\"><span class=\"string\">header_access</span> <span class=\"string\">X-Cache-Lookup</span> <span class=\"string\">deny</span> <span class=\"string\">all</span></span><br><span class=\"line\"><span class=\"string\">forwarded_for</span> <span class=\"string\">off</span></span><br><span class=\"line\"><span class=\"string\">via</span> <span class=\"string\">off</span></span><br><span class=\"line\"><span class=\"comment\"># logs相关配置</span></span><br><span class=\"line\"><span class=\"string\">emulate_httpd_log</span> <span class=\"string\">on</span></span><br><span class=\"line\"><span class=\"string\">logformat</span> <span class=\"string\">squid</span> <span class=\"string\">%{X-Forwarded-For}>h</span> <span class=\"string\">%ui</span> <span class=\"string\">%un</span> [<span class=\"string\">%tl</span>] <span class=\"string\">"%rm %ru HTTP/%rv"</span> <span class=\"string\">%Hs</span> <span class=\"string\">%<st</span> <span class=\"string\">"<span class=\"template-variable\">%{Referer}</span>>h"</span> <span class=\"string\">"<span class=\"template-variable\">%{User-Agent}</span>>h"</span> <span class=\"string\">%Ss:%Sh</span></span><br><span class=\"line\"><span class=\"string\">access_log</span> <span class=\"string\">/var/log/squid/access.log</span> <span class=\"string\">squid</span></span><br><span class=\"line\"><span class=\"string\">cache_log</span> <span class=\"string\">/var/log/squid/cache.log</span></span><br><span class=\"line\"><span class=\"string\">cache_store_log</span> <span class=\"string\">/var/log/squid/store.log</span></span><br><span class=\"line\"><span class=\"string\">logfile_rotate</span> <span class=\"number\">20</span></span><br></pre></td></tr></table></figure></p>\n<div class=\"note primary\">\n<p>至次已经可以通过填写安装 squid 的服务器 ip 加端口 3128 加用户名密码进行代理访问了(通过访问<span class=\"blue\"><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuaXAuY24v\"> https://www.ip.cn/</span></span> 查看 ip 就会发现自己的出口 ip 已经变成了 squid 服务器的 ip 了)。但是要想科学上网还必须对代理的数据进行加密,否则访问外网还是会被我国的长城防火墙阻挡,所以还需要安装 stunnel 来实现此目的。</p>\n</div>\n<h5 id=\"stunnel服务端部分\"><a class=\"anchor\" href=\"#stunnel服务端部分\">#</a> stunnel 服务端部分</h5>\n<ul>\n<li>1、安装(和 squid 装在一起)</li>\n</ul>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">apt-get install -y stunnel</span><br></pre></td></tr></table></figure></p>\n<ul>\n<li>2、生成 TLS/SSL 证书</li>\n</ul>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">openssl req -new -x509 -days 3650 -nodes -out stunnel.pem -keyout stunnel.pem</span><br></pre></td></tr></table></figure></p>\n<ul>\n<li>\n<p>3、将证书 stunnel.pem 放到 /etc/stunnel/ 目录下</p>\n</li>\n<li>\n<p>4、修改 stunnel 配置 (/etc/stunnle/stunnle.conf)</p>\n</li>\n</ul>\n<p><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">设置stunnel的pid文件路径</span></span><br><span class=\"line\"><span class=\"string\">pid</span> <span class=\"string\">=</span> <span class=\"string\">/etc/stunnel/stunnel.pid</span></span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">设置stunnel工作的用户(组)</span></span><br><span class=\"line\"><span class=\"string\">setuid</span> <span class=\"string\">=</span> <span class=\"string\">root</span></span><br><span class=\"line\"><span class=\"string\">setgid</span> <span class=\"string\">=</span> <span class=\"string\">root</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">开启日志等级:emerg</span> <span class=\"string\">(0),</span> <span class=\"string\">alert</span> <span class=\"string\">(1),</span> <span class=\"string\">crit</span> <span class=\"string\">(2),</span> <span class=\"string\">err</span> <span class=\"string\">(3),</span> <span class=\"string\">warning</span> <span class=\"string\">(4),</span> <span class=\"string\">notice</span> <span class=\"string\">(5),</span> <span class=\"string\">info</span> <span class=\"string\">(6),</span> <span class=\"string\">or</span> <span class=\"string\">debug</span> <span class=\"string\">(7)</span></span><br><span class=\"line\"><span class=\"string\">debug</span> <span class=\"string\">=</span> <span class=\"number\">7</span></span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">日志文件路径</span></span><br><span class=\"line\"><span class=\"string\">output</span> <span class=\"string\">=</span> <span class=\"string\">/etc/stunnel/stunnel.log</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">证书文件</span></span><br><span class=\"line\"><span class=\"string\">cert</span> <span class=\"string\">=</span> <span class=\"string\">/etc/stunnel/stunnel.pem</span></span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">私钥文件</span></span><br><span class=\"line\"><span class=\"string\">key</span> <span class=\"string\">=</span> <span class=\"string\">/etc/stunnel/stunnel.pem</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">自定义服务名squid-proxy</span></span><br><span class=\"line\">[<span class=\"string\">squid-proxy</span>]</span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">服务监听的端口,client要连接这个端口与server通信</span></span><br><span class=\"line\"><span class=\"string\">accept</span> <span class=\"string\">=</span> <span class=\"number\">1234</span><span class=\"string\">(自定义)</span></span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">服务要连接的端口,连接到squid的3128端口,将数据发给squid</span></span><br><span class=\"line\"><span class=\"string\">connect</span> <span class=\"string\">=</span> <span class=\"number\">3128</span></span><br></pre></td></tr></table></figure></p>\n<h5 id=\"stunnel客户端部分\"><a class=\"anchor\" href=\"#stunnel客户端部分\">#</a> stunnel 客户端部分</h5>\n<div class=\"note info\">\n<p>可以安装在要代理的机器上,在需要代理的情况下再开启(代理地址填 127.0.0.1 加客户端监听端口)。也可以安装在国内的服务器上一直保持连接(代理信息填国内服务器 ip 加客户端监听端口)。本示例客户端为 windows 系统</p>\n</div>\n<ul>\n<li>1、下载地址</li>\n</ul>\n<p><span class=\"blue\"><span class=\"exturl\" data-url=\"aHR0cHM6Ly93d3cuc3R1bm5lbC5vcmcvZG93bmxvYWRzLmh0bWw=\">https://www.stunnel.org/downloads.html</span></span></p>\n<ul>\n<li>2、修改配置(C:\\Program Files (x86)\\stunnel\\config\\stunnel.conf)</li>\n</ul>\n<p><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">[<span class=\"string\">squid-proxy</span>]</span><br><span class=\"line\"><span class=\"string\">client</span> <span class=\"string\">=</span> <span class=\"literal\">yes</span></span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">监听3128端口,那么用户浏览器的代理设置就是</span> <span class=\"string\">stunnel-client-ip:3128</span></span><br><span class=\"line\"><span class=\"string\">accept</span> <span class=\"string\">=</span> <span class=\"number\">3128</span></span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">要连接到的stunnel</span> <span class=\"string\">server的ip与端口</span></span><br><span class=\"line\"><span class=\"string\">connect</span> <span class=\"string\">=</span> <span class=\"string\">stunnel服务端ip:1234(服务端自定义端口)</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">需要验证对方发过来的证书</span></span><br><span class=\"line\"><span class=\"string\">verify</span> <span class=\"string\">=</span> <span class=\"number\">2</span></span><br><span class=\"line\"><span class=\"string\">;</span> <span class=\"string\">用来进行证书验证的文件(stunnel服务端生成的证书复制到以下目录并改名为stunnel-server.pem)</span></span><br><span class=\"line\"><span class=\"string\">CAfile</span> <span class=\"string\">=</span> <span class=\"string\">C:\\Program</span> <span class=\"string\">Files</span> <span class=\"string\">(x86)\\stunnel\\config\\stunnel-server.pem</span></span><br></pre></td></tr></table></figure></p>\n<div class=\"note primary\">\n<p>至次配置好代理 ip 为 stunnel 客户端 ip 加端口 3128 就可以正式科学上网了。如果只想对需要科学的 url 进行代理,可以通过安装 Proxy SwitchyOmega 插件实现(规则地址可通过<span class=\"blue\"><span class=\"exturl\" data-url=\"aHR0cHM6Ly9naXRodWIuY29tL2dmd2xpc3QvZ2Z3bGlzdA==\"> https://github.com/gfwlist/gfwlist</span></span> 获取)。</p>\n</div>\n<p><img data-src=\"https://nas.hitoli.com:18014/images/2023/09/09/6a38fcb32752.png\" alt=\"\" /><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/09/09/72892168bfeb.png\" alt=\"\" /></p>\n",
|
||
"tags": [
|
||
"生活",
|
||
"技术分享",
|
||
"squid",
|
||
"stunnel",
|
||
"科学上网",
|
||
"代理"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/09/09/Windows-11%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95%E6%81%A2%E5%A4%8D%E8%80%81%E7%89%88%E6%9C%AC/",
|
||
"url": "https://hitoli.com/2023/09/09/Windows-11%E5%8F%B3%E9%94%AE%E8%8F%9C%E5%8D%95%E6%81%A2%E5%A4%8D%E8%80%81%E7%89%88%E6%9C%AC/",
|
||
"title": "Windows 11右键菜单恢复老版本",
|
||
"date_published": "2023-09-09T08:38:00.000Z",
|
||
"content_html": "<h4 id=\"恢复方法\"><a class=\"anchor\" href=\"#恢复方法\">#</a> 恢复方法</h4>\n<p>1、按【Win+X】</p>\n<p>2、选择【终端管理员】</p>\n<p>3、输入以下命令并回车:<br />\n <code>reg add "HKCU\\Software\\Classes\\CLSID\\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\\InprocServer32" /f /ve</code></p>\n<p>4、重启电脑</p>\n",
|
||
"tags": [
|
||
"Windows",
|
||
"系统优化",
|
||
"Windows 11"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/07/08/%E8%A7%A3%E5%86%B3Lombok%E6%8A%A5%E9%94%99/",
|
||
"url": "https://hitoli.com/2023/07/08/%E8%A7%A3%E5%86%B3Lombok%E6%8A%A5%E9%94%99/",
|
||
"title": "解决Lombok报错",
|
||
"date_published": "2023-07-08T02:51:00.000Z",
|
||
"content_html": "<h4 id=\"问题描述\"><a class=\"anchor\" href=\"#问题描述\">#</a> 问题描述</h4>\n<ol>\n<li>报错详情</li>\n</ol>\n<div class=\"note info\">\n<p>java: You aren’t using a compiler supported by lombok, so lombok will not work and has been disabled.<br />\nYour processor is: com.sun.proxy.$Proxy26<br />\nLombok supports: OpenJDK javac, ECJ</p>\n</div>\n<p><img data-src=\"https://nas.hitoli.com:18014/images/2023/07/08/393a238856e4.png\" alt=\"\" /></p>\n<ol start=\"2\">\n<li>\n<p>问题分析<br />\n属于 lombok 编译不通过,原因可能是因为依赖没有更到最新版本</p>\n</li>\n<li>\n<p>解决办法<br />\n在 IntelliJ IDEA 的全局配置 Compiler 中添加如下配置:<br />\n<figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"string\">-Djps.track.ap.dependencies=false</span></span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/07/08/34bac08a5d10.png\" alt=\"\" /></p>\n</li>\n</ol>\n",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"Lombok",
|
||
"IntelliJ",
|
||
"IDEA"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/07/01/shoka%E4%B8%BB%E9%A2%98%E9%80%9F%E5%BA%A6%E4%BC%98%E5%8C%96-%E6%8B%86%E5%88%86jsdelivr/",
|
||
"url": "https://hitoli.com/2023/07/01/shoka%E4%B8%BB%E9%A2%98%E9%80%9F%E5%BA%A6%E4%BC%98%E5%8C%96-%E6%8B%86%E5%88%86jsdelivr/",
|
||
"title": "shoka主题速度优化-拆分jsdelivr",
|
||
"date_published": "2023-06-30T17:15:00.000Z",
|
||
"content_html": "<h4 id=\"前言\"><a class=\"anchor\" href=\"#前言\">#</a> 前言</h4>\n<div class=\"note primary\">\n<p>该篇文章介绍了如何对 shoka 主题进行 jsdelivr 聚合拆分,以便使用国内镜像源和异步加载,从而优化网站速度。具体操作包括更改模板、注册 helper 和更改配置。其中,推荐使用 advVendors 配置,可自定义加载源和 js 文件名,同时支持异步加载、pjax 刷新和 integrity 防 XXS 等特性。</p>\n</div>\n<p>众所周知,jsdelivr 在国内的速度可以用慢的一批来形容而 shoka 主题使用了 jsdelivr 的 combine 功能加载第三方 js, 而 combine 在国内没有镜像源并且阻断了使用 CDN 并发加速的道路,本篇博文会将 jsdelivr 聚合拆分为几个独立的 js, 以便使用国内镜像源和异步加载。</p>\n<div class=\"note info\">\n<p>此方案相较于本地化而言有较大速度优势,尤其在 CDN 并发加持下</p>\n</div>\n<h4 id=\"拆分-jsdelivr\"><a class=\"anchor\" href=\"#拆分-jsdelivr\">#</a> 拆分 jsdelivr</h4>\n<ol>\n<li>更改模板</li>\n</ol>\n<p>打开 <span class=\"red\">shoka\\layout\\_partials\\layout.njk</span>,找到第 144 行左右:</p>\n<p><figure class=\"highlight html\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">script</span> <span class=\"attr\">src</span>=<span class=\"string\">"https://cdn.polyfill.io/v3/polyfill.js"</span>></span><span class=\"tag\"></<span class=\"name\">script</span>></span></span><br><span class=\"line\"><span class=\"symbol\">&#123;</span><span class=\"symbol\">&#123;</span> _vendor_js() <span class=\"symbol\">&#125;</span><span class=\"symbol\">&#125;</span></span><br><span class=\"line\"><span class=\"symbol\">&#123;</span><span class=\"symbol\">&#123;</span> _js('app.js') <span class=\"symbol\">&#125;</span><span class=\"symbol\">&#125;</span></span><br><span class=\"line\"><span class=\"symbol\">&#123;</span><span class=\"symbol\">&#123;</span> partial('_partials/third-party/baidu-analytics.njk', <span class=\"symbol\">&#123;</span><span class=\"symbol\">&#125;</span>, <span class=\"symbol\">&#123;</span>cache: true<span class=\"symbol\">&#125;</span>) <span class=\"symbol\">&#125;</span><span class=\"symbol\">&#125;</span></span><br></pre></td></tr></table></figure></p>\n<p>更改为如下内容:</p>\n<p><figure class=\"highlight html\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"tag\"><<span class=\"name\">script</span> <span class=\"attr\">src</span>=<span class=\"string\">"https://cdn.polyfill.io/v3/polyfill.js"</span>></span><span class=\"tag\"></<span class=\"name\">script</span>></span></span><br><span class=\"line\"><span class=\"symbol\">&#123;</span>%- if theme.advVendors.enable %<span class=\"symbol\">&#125;</span></span><br><span class=\"line\">\t<span class=\"symbol\">&#123;</span>% for i in _list_vendor_js() %<span class=\"symbol\">&#125;</span></span><br><span class=\"line\">\t\t<span class=\"symbol\">&#123;</span><span class=\"symbol\">&#123;</span> _adv_vendor_js(i) <span class=\"symbol\">&#125;</span><span class=\"symbol\">&#125;</span></span><br><span class=\"line\">\t<span class=\"symbol\">&#123;</span>% endfor %<span class=\"symbol\">&#125;</span></span><br><span class=\"line\"><span class=\"symbol\">&#123;</span>%- else %<span class=\"symbol\">&#125;</span></span><br><span class=\"line\"><span class=\"symbol\">&#123;</span><span class=\"symbol\">&#123;</span> _vendor_js() <span class=\"symbol\">&#125;</span><span class=\"symbol\">&#125;</span></span><br><span class=\"line\"><span class=\"symbol\">&#123;</span>%- endif %<span class=\"symbol\">&#125;</span></span><br><span class=\"line\"><span class=\"symbol\">&#123;</span><span class=\"symbol\">&#123;</span> _js('app.js')<span class=\"symbol\">&#125;</span><span class=\"symbol\">&#125;</span></span><br><span class=\"line\"><span class=\"symbol\">&#123;</span><span class=\"symbol\">&#123;</span> partial('_partials/third-party/baidu-analytics.njk', <span class=\"symbol\">&#123;</span><span class=\"symbol\">&#125;</span>, <span class=\"symbol\">&#123;</span>cache: true<span class=\"symbol\">&#125;</span>) <span class=\"symbol\">&#125;</span><span class=\"symbol\">&#125;</span></span><br></pre></td></tr></table></figure></p>\n<ol start=\"2\">\n<li>注册 helper</li>\n</ol>\n<p>打开 <span class=\"red\">shoka\\scripts\\helpers\\asset.js</span>, 最后一行新建空行,增加如下内容:</p>\n<p><figure class=\"highlight javascript\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">hexo.<span class=\"property\">extend</span>.<span class=\"property\">helper</span>.<span class=\"title function_\">register</span>(<span class=\"string\">'_list_vendor_js'</span>, <span class=\"function\">() =></span> {</span><br><span class=\"line\"> <span class=\"keyword\">return</span> hexo.<span class=\"property\">theme</span>.<span class=\"property\">config</span>.<span class=\"property\">vendorsList</span>.<span class=\"property\">js</span>;</span><br><span class=\"line\">});</span><br><span class=\"line\"></span><br><span class=\"line\">hexo.<span class=\"property\">extend</span>.<span class=\"property\">helper</span>.<span class=\"title function_\">register</span>(<span class=\"string\">'_adv_vendor_js'</span>, <span class=\"keyword\">function</span> (<span class=\"params\">js_name</span>) {</span><br><span class=\"line\"> <span class=\"keyword\">const</span> config = hexo.<span class=\"property\">theme</span>.<span class=\"property\">config</span>.<span class=\"property\">advVendors</span>.<span class=\"property\">js</span>[js_name];</span><br><span class=\"line\"> <span class=\"keyword\">const</span> src = config[<span class=\"string\">"src"</span>];</span><br><span class=\"line\"> <span class=\"keyword\">let</span> result;</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (src.<span class=\"title function_\">indexOf</span>(<span class=\"string\">"http"</span>) !== -<span class=\"number\">1</span>) {</span><br><span class=\"line\"> result = src;</span><br><span class=\"line\"> } <span class=\"keyword\">else</span> <span class=\"keyword\">if</span> (src.<span class=\"title function_\">indexOf</span>(<span class=\"string\">"combine"</span>) !== -<span class=\"number\">1</span>) {</span><br><span class=\"line\"> <span class=\"variable language_\">console</span>.<span class=\"title function_\">log</span>(<span class=\"string\">"The combine feature is not recommended!"</span>)</span><br><span class=\"line\"> result = hexo.<span class=\"property\">theme</span>.<span class=\"property\">config</span>.<span class=\"property\">advVendors</span>.<span class=\"property\">combine</span> + src;</span><br><span class=\"line\"> } <span class=\"keyword\">else</span> <span class=\"keyword\">if</span> (src.<span class=\"title function_\">indexOf</span>(<span class=\"string\">"npm"</span>) !== -<span class=\"number\">1</span>) {</span><br><span class=\"line\"> result = hexo.<span class=\"property\">theme</span>.<span class=\"property\">config</span>.<span class=\"property\">advVendors</span>.<span class=\"property\">npm</span> + src.<span class=\"title function_\">slice</span>(<span class=\"number\">4</span>);</span><br><span class=\"line\"> } <span class=\"keyword\">else</span> <span class=\"keyword\">if</span> (src.<span class=\"title function_\">indexOf</span>(<span class=\"string\">"gh"</span>) !== -<span class=\"number\">1</span>) {</span><br><span class=\"line\"> result = hexo.<span class=\"property\">theme</span>.<span class=\"property\">config</span>.<span class=\"property\">advVendors</span>.<span class=\"property\">github</span> + src.<span class=\"title function_\">slice</span>(<span class=\"number\">3</span>);</span><br><span class=\"line\"> } <span class=\"keyword\">else</span> {</span><br><span class=\"line\"> result = <span class=\"string\">"/"</span> + src;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"keyword\">let</span> attr = {<span class=\"attr\">src</span>: result};</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (config[<span class=\"string\">"async"</span>]) attr[<span class=\"string\">"async"</span>] = <span class=\"string\">"async"</span>;</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (config[<span class=\"string\">"data-pjax"</span>]) attr[<span class=\"string\">"data-pjax"</span>] = <span class=\"string\">"data-pjax"</span>;</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (config[<span class=\"string\">"hash-value"</span>]) attr[<span class=\"string\">"integrity"</span>]=config[<span class=\"string\">"hash-value"</span>];</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (config[<span class=\"string\">"deferLoad"</span>]) {</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"title function_\">htmlTag</span>(<span class=\"string\">'script'</span>, {<span class=\"string\">"data-pjax"</span>: <span class=\"literal\">true</span>}, <span class=\"string\">`</span></span><br><span class=\"line\"><span class=\"string\"> const script=document.createElement("script");script.src="<span class=\"subst\">${result}</span>",script.async=true,document.body.appendChild(script)</span></span><br><span class=\"line\"><span class=\"string\"> `</span>)</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"title function_\">htmlTag</span>(<span class=\"string\">'script'</span>, attr, <span class=\"string\">''</span>);</span><br><span class=\"line\">})</span><br></pre></td></tr></table></figure></p>\n<ol start=\"3\">\n<li>更改配置</li>\n</ol>\n<p>在 shoka 目录下 <span class=\"red\">_config.yml</span> 增加如下内容:</p>\n<div class=\"note info\">\n<p>推荐内容,可根据自己情况更改</p>\n</div>\n<p><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">advVendors:</span></span><br><span class=\"line\"> <span class=\"attr\">enable:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"> <span class=\"attr\">github:</span> <span class=\"string\">"https://cdn.jsdelivr.net/gh/"</span></span><br><span class=\"line\"> <span class=\"attr\">combine:</span> <span class=\"string\">"https://cdn.jsdelivr.net/"</span></span><br><span class=\"line\"> <span class=\"attr\">npm:</span> <span class=\"string\">"https://unpkg.com/"</span></span><br><span class=\"line\"> <span class=\"attr\">js:</span></span><br><span class=\"line\"> <span class=\"attr\">pace:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/pace/1.0.2/pace.min.js</span></span><br><span class=\"line\"> <span class=\"attr\">pjax:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">https://lib.baomitu.com/pjax/0.2.8/pjax.min.js</span></span><br><span class=\"line\"> <span class=\"attr\">fetch:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">npm/whatwg-fetch@3.4.0/dist/fetch.umd.js</span></span><br><span class=\"line\"> <span class=\"attr\">anime:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/animejs/3.2.0/anime.min.js</span></span><br><span class=\"line\"> <span class=\"attr\">algolia:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/algoliasearch/4.12.1/algoliasearch-lite.umd.min.js</span></span><br><span class=\"line\"> <span class=\"attr\">instantsearch:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/instantsearch.js/4.39.0/instantsearch.production.min.js</span></span><br><span class=\"line\"> <span class=\"attr\">lazyload:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/lozad.js/1.16.0/lozad.min.js</span></span><br><span class=\"line\"> <span class=\"attr\">quicklink:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/quicklink/2.2.0/quicklink.umd.min.js</span></span><br><span class=\"line\"> <span class=\"attr\">fancybox:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">https://lf26-cdn-tos.bytecdntp.com/cdn/expire-1-M/??jquery/3.5.1/jquery.min.js,fancybox/3.5.7/jquery.fancybox.min.js,justifiedGallery/3.8.1/js/jquery.justifiedGallery.min.js</span></span><br><span class=\"line\"> <span class=\"attr\">async:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"> <span class=\"attr\">valine:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">gh/amehime/MiniValine@4.2.2-beta10/dist/MiniValine.min.js</span></span><br><span class=\"line\"> <span class=\"attr\">copy_tex:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">https://lf9-cdn-tos.bytecdntp.com/cdn/expire-1-M/KaTeX/0.12.0/contrib/copy-tex.min.js</span></span><br><span class=\"line\"> <span class=\"attr\">async:</span> <span class=\"literal\">true</span></span><br><span class=\"line\"> <span class=\"attr\">chart:</span></span><br><span class=\"line\"> <span class=\"attr\">src:</span> <span class=\"string\">npm/frappe-charts@1.5.0/dist/frappe-charts.min.iife.js</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"attr\">vendorsList:</span></span><br><span class=\"line\"> <span class=\"attr\">js:</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">pace</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">pjax</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">fetch</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">anime</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">algolia</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">instantsearch</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">lazyload</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">quicklink</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">fancybox</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">valine</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">copy_tex</span></span><br><span class=\"line\"> <span class=\"bullet\">-</span> <span class=\"string\">chart</span></span><br></pre></td></tr></table></figure></p>\n<p>下面为结构详解:</p>\n<p><figure class=\"highlight yaml\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"attr\">advVendors:</span></span><br><span class=\"line\">\t<span class=\"attr\">enable:</span> <span class=\"literal\">true</span> <span class=\"comment\">#是否开启,关闭使用主题默认加载</span></span><br><span class=\"line\">\t<span class=\"attr\">github:</span> <span class=\"comment\">#github 使用的加载源,需要协议头和末尾斜杠</span></span><br><span class=\"line\">\t<span class=\"attr\">combine:</span> <span class=\"comment\">#聚合 js 使用的加载源 (不建议使用)</span></span><br><span class=\"line\">\t<span class=\"attr\">npm:</span> <span class=\"comment\">#npm 的加载源</span></span><br><span class=\"line\">\t<span class=\"attr\">js:</span></span><br><span class=\"line\">\t\t<span class=\"attr\">jspackage:</span> <span class=\"comment\">#js 名,可以与文件名不一致</span></span><br><span class=\"line\">\t\t\t<span class=\"attr\">src:</span> <span class=\"string\">"资源地址,详情见后面"</span></span><br><span class=\"line\">\t\t\t<span class=\"comment\"># async: true 异步加载此 js</span></span><br><span class=\"line\">\t\t\t<span class=\"comment\"># data-pjax: true 在 pjax 加载时刷新此 js</span></span><br><span class=\"line\">\t\t\t<span class=\"comment\"># hash-value: 这个资源的 integrity 值,用于防 XXS</span></span><br><span class=\"line\">\t\t\t<span class=\"comment\"># deferLoad: true 使用动态 DOM 节点添加延迟 js 加载 (实验性)</span></span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"attr\">vendorsList:</span></span><br><span class=\"line\"> <span class=\"attr\">js:</span></span><br><span class=\"line\"> \t<span class=\"bullet\">-</span> <span class=\"string\">jspackage</span> <span class=\"comment\">#与上方 jspackage 一致即可</span></span><br></pre></td></tr></table></figure></p>\n<p>资源地址格式如下:</p>\n<p><span class=\"red\"><span class=\"exturl\" data-url=\"aHR0cHM6Ly9leGFtcGxlLmNvbS94eHguanM=\">https://example.com/xxx.js</span></span> 使用 http (s) 地址加载 js<br />\n<span class=\"red\">combine/xxx.js,xxx.js</span> 使用 jsdelivr 的 combine 功能加载 (不推荐)<br />\n<span class=\"red\">npm/xxx/xxx.js</span> 使用 npm 源加载 js<br />\n<span class=\"red\">gh/xxx/xxx.js</span> 使用 gh 源加载 js<br />\n<span class=\"red\">xxx.js</span> 从本地加载 js<br />\n 优先级如下:<br />\n<span class=\"red\">http>combine>npm>gh > 本地</span></p>\n",
|
||
"tags": [
|
||
"极空间",
|
||
"Docker",
|
||
"Hexo",
|
||
"Hexo",
|
||
"Shoka",
|
||
"jsdelivr"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/05/30/http%E8%AF%B7%E6%B1%82%E4%B9%8BrestTemplate%E9%85%8D%E7%BD%AE%E8%B6%85%E6%97%B6%E6%97%B6%E9%97%B4/",
|
||
"url": "https://hitoli.com/2023/05/30/http%E8%AF%B7%E6%B1%82%E4%B9%8BrestTemplate%E9%85%8D%E7%BD%AE%E8%B6%85%E6%97%B6%E6%97%B6%E9%97%B4/",
|
||
"title": "http请求之restTemplate配置超时时间",
|
||
"date_published": "2023-05-30T09:20:00.000Z",
|
||
"content_html": "<h4 id=\"问题\"><a class=\"anchor\" href=\"#问题\">#</a> 问题</h4>\n<p>http 请求发起后接收不到返回数据!!!【测试环境没出问题,发到正式环境就有问题】</p>\n<p>项目中通过 restTemplate 发起请求:<br />\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">log.info(<span class=\"string\">"请求入参:{}"</span>,JSON.toJSONString(request));<span class=\"comment\">//打印日志1</span></span><br><span class=\"line\"><span class=\"comment\">// 配置http请求的连接超时时间和读取超时时间</span></span><br><span class=\"line\"><span class=\"type\">HttpsClientRequestFactory</span> <span class=\"variable\">factory</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"title class_\">HttpsClientRequestFactory</span>();</span><br><span class=\"line\">factory.setConnectTimeout(<span class=\"number\">60</span> * <span class=\"number\">1000</span>);</span><br><span class=\"line\">factory.setReadTimeout(<span class=\"number\">5</span> * <span class=\"number\">60</span> * <span class=\"number\">1000</span>);</span><br><span class=\"line\"><span class=\"type\">RestTemplate</span> <span class=\"variable\">restTemplate</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"title class_\">RestTemplate</span>(factory);</span><br><span class=\"line\">Result<InventoryResult> result = restTemplate.postForObject(address.concat(inventoryUrl), request, Result.class);</span><br><span class=\"line\">log.info(<span class=\"string\">"库存同步,返回数据: {}"</span>, result);<span class=\"comment\">//打印日志2</span></span><br></pre></td></tr></table></figure></p>\n<ul>\n<li>打印日志 1 内容为:</li>\n</ul>\n<p>http 请求入参:{data=[{ productStatus=10,skuCode=null}], messageId=ewpfpr1t6ey5r6qj0su0w1h6rt73hr,token=vgvU5EJKuZbuHii7WH6pTINp40ZRicaqLz4dq5P7L6pDzWir8EEGZhCKPucQjljsw69EHasEy+iJfdTofDg==}</p>\n<ul>\n<li>\n<p>打印日志 2 内容为:没有打印内容!!!</p>\n</li>\n<li>\n<p>最后发现是因为测试环境中数据量较小,http 请求后,很快能得到相应,而正式环境数据量较大,没有及时得到响应,连接或者读取超时!!!</p>\n</li>\n</ul>\n<h4 id=\"解决方式\"><a class=\"anchor\" href=\"#解决方式\">#</a> 解决方式</h4>\n<h6 id=\"第一种\"><a class=\"anchor\" href=\"#第一种\">#</a> 第一种</h6>\n<ol>\n<li>\n<p>添加 HttpsClientRequestFactory 类,并继承 SimpleClientHttpRequestFactory<br />\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br><span class=\"line\">45</span><br><span class=\"line\">46</span><br><span class=\"line\">47</span><br><span class=\"line\">48</span><br><span class=\"line\">49</span><br><span class=\"line\">50</span><br><span class=\"line\">51</span><br><span class=\"line\">52</span><br><span class=\"line\">53</span><br><span class=\"line\">54</span><br><span class=\"line\">55</span><br><span class=\"line\">56</span><br><span class=\"line\">57</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">/**</span></span><br><span class=\"line\"><span class=\"comment\"> * 兼容调Https接口</span></span><br><span class=\"line\"><span class=\"comment\"> */</span></span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"keyword\">class</span> <span class=\"title class_\">HttpsClientRequestFactory</span> <span class=\"keyword\">extends</span> <span class=\"title class_\">SimpleClientHttpRequestFactory</span> {</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"meta\">@Override</span></span><br><span class=\"line\"> <span class=\"keyword\">protected</span> <span class=\"keyword\">void</span> <span class=\"title function_\">prepareConnection</span><span class=\"params\">(HttpURLConnection connection, String httpMethod)</span></span><br><span class=\"line\"> <span class=\"keyword\">throws</span> IOException {</span><br><span class=\"line\"> <span class=\"keyword\">if</span> (connection <span class=\"keyword\">instanceof</span> HttpsURLConnection) {</span><br><span class=\"line\"> prepareHttpsConnection((HttpsURLConnection) connection);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"built_in\">super</span>.prepareConnection(connection, httpMethod);</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">private</span> <span class=\"keyword\">void</span> <span class=\"title function_\">prepareHttpsConnection</span><span class=\"params\">(HttpsURLConnection connection)</span> {</span><br><span class=\"line\"> connection.setHostnameVerifier(<span class=\"keyword\">new</span> <span class=\"title class_\">SkipHostnameVerifier</span>());</span><br><span class=\"line\"> <span class=\"keyword\">try</span> {</span><br><span class=\"line\"> connection.setSSLSocketFactory(createSslSocketFactory());</span><br><span class=\"line\"> }</span><br><span class=\"line\"> <span class=\"keyword\">catch</span> (Exception ex) {</span><br><span class=\"line\"> <span class=\"comment\">// Ignore</span></span><br><span class=\"line\"> }</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">private</span> SSLSocketFactory <span class=\"title function_\">createSslSocketFactory</span><span class=\"params\">()</span> <span class=\"keyword\">throws</span> Exception {</span><br><span class=\"line\"> <span class=\"type\">SSLContext</span> <span class=\"variable\">context</span> <span class=\"operator\">=</span> SSLContext.getInstance(<span class=\"string\">"TLS"</span>);</span><br><span class=\"line\"> context.init(<span class=\"literal\">null</span>, <span class=\"keyword\">new</span> <span class=\"title class_\">TrustManager</span>[] { <span class=\"keyword\">new</span> <span class=\"title class_\">SkipX509TrustManager</span>() },</span><br><span class=\"line\"> <span class=\"keyword\">new</span> <span class=\"title class_\">SecureRandom</span>());</span><br><span class=\"line\"> <span class=\"keyword\">return</span> context.getSocketFactory();</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">private</span> <span class=\"keyword\">class</span> <span class=\"title class_\">SkipHostnameVerifier</span> <span class=\"keyword\">implements</span> <span class=\"title class_\">HostnameVerifier</span> {</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"meta\">@Override</span></span><br><span class=\"line\"> <span class=\"keyword\">public</span> <span class=\"type\">boolean</span> <span class=\"title function_\">verify</span><span class=\"params\">(String s, SSLSession sslSession)</span> {</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"literal\">true</span>;</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"keyword\">private</span> <span class=\"keyword\">static</span> <span class=\"keyword\">class</span> <span class=\"title class_\">SkipX509TrustManager</span> <span class=\"keyword\">implements</span> <span class=\"title class_\">X509TrustManager</span> {</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"meta\">@Override</span></span><br><span class=\"line\"> <span class=\"keyword\">public</span> X509Certificate[] getAcceptedIssuers() {</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">new</span> <span class=\"title class_\">X509Certificate</span>[<span class=\"number\">0</span>];</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"meta\">@Override</span></span><br><span class=\"line\"> <span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title function_\">checkClientTrusted</span><span class=\"params\">(X509Certificate[] chain, String authType)</span> {</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"meta\">@Override</span></span><br><span class=\"line\"> <span class=\"keyword\">public</span> <span class=\"keyword\">void</span> <span class=\"title function_\">checkServerTrusted</span><span class=\"params\">(X509Certificate[] chain, String authType)</span> {</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure></p>\n</li>\n<li>\n<p>使用 restTemplate 发起请求前先设置连接和超时时间或者通过容器加载配置类然后设置超时时间<br />\n <figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">//配置http请求的连接超时时间和读取超时时间</span></span><br><span class=\"line\"><span class=\"type\">HttpsClientRequestFactory</span> <span class=\"variable\">factory</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"title class_\">HttpsClientRequestFactory</span>();</span><br><span class=\"line\">factory.setConnectTimeout(<span class=\"number\">60</span> * <span class=\"number\">1000</span>);</span><br><span class=\"line\">factory.setReadTimeout(<span class=\"number\">5</span> * <span class=\"number\">60</span> * <span class=\"number\">1000</span>);</span><br><span class=\"line\"><span class=\"type\">RestTemplate</span> <span class=\"variable\">restTemplate</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"title class_\">RestTemplate</span>(factory);</span><br><span class=\"line\">BaseResult<QueryInventoryResult> result = restTemplate.postForObject(address.concat(inventoryUrl), request, Result.class);</span><br></pre></td></tr></table></figure><br />\n<figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">@Configuration</span></span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"keyword\">class</span> <span class=\"title class_\">RestConfig</span> {</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"comment\">//60 * 1000</span></span><br><span class=\"line\"> <span class=\"meta\">@Value("${rest.connectTimeout:60000}")</span></span><br><span class=\"line\"> <span class=\"keyword\">private</span> <span class=\"type\">int</span> connectTimeout;</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"comment\">//5 * 60 * 1000</span></span><br><span class=\"line\"> <span class=\"meta\">@Value("${rest.readTimeout:300000}")</span></span><br><span class=\"line\"> <span class=\"keyword\">private</span> <span class=\"type\">int</span> readTimeout;</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"meta\">@Bean</span></span><br><span class=\"line\"> <span class=\"keyword\">public</span> RestTemplate <span class=\"title function_\">restTemplate</span><span class=\"params\">()</span> {</span><br><span class=\"line\"> <span class=\"type\">SimpleClientHttpRequestFactory</span> <span class=\"variable\">simpleClientHttpRequestFactory</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"title class_\">SimpleClientHttpRequestFactory</span>();</span><br><span class=\"line\"> simpleClientHttpRequestFactory.setConnectTimeout(connectTimeout);</span><br><span class=\"line\"> simpleClientHttpRequestFactory.setReadTimeout(readTimeout);</span><br><span class=\"line\"> <span class=\"type\">RestTemplate</span> <span class=\"variable\">restTemplate</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"title class_\">RestTemplate</span>(simpleClientHttpRequestFactory);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> restTemplate;</span><br><span class=\"line\"> }</span><br></pre></td></tr></table></figure></p>\n</li>\n</ol>\n<h6 id=\"第二种\"><a class=\"anchor\" href=\"#第二种\">#</a> 第二种</h6>\n<p><figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">@Configuration</span></span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"keyword\">class</span> <span class=\"title class_\">RestConfig</span> {</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"comment\">//60 * 1000</span></span><br><span class=\"line\"> <span class=\"meta\">@Value("${rest.connectTimeout:60000}")</span></span><br><span class=\"line\"> <span class=\"keyword\">private</span> <span class=\"type\">int</span> connectTimeout;</span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"comment\">//5 * 60 * 1000</span></span><br><span class=\"line\"> <span class=\"meta\">@Value("${rest.readTimeout:300000}")</span></span><br><span class=\"line\"> <span class=\"keyword\">private</span> <span class=\"type\">int</span> readTimeout; </span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"meta\">@Value("${rest.connectionRequestTimeout:300000}")</span></span><br><span class=\"line\"> <span class=\"keyword\">private</span> <span class=\"type\">int</span> connectionRequestTimeout; </span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"comment\">/**</span></span><br><span class=\"line\"><span class=\"comment\"> * 使用 HttpComponentsClientHttpRequestFactory创建http请求(推荐)</span></span><br><span class=\"line\"><span class=\"comment\"> */</span></span><br><span class=\"line\"> <span class=\"meta\">@Bean</span></span><br><span class=\"line\"> <span class=\"keyword\">public</span> RestTemplate <span class=\"title function_\">restTemplate</span><span class=\"params\">()</span> {</span><br><span class=\"line\"> <span class=\"type\">HttpComponentsClientHttpRequestFactory</span> <span class=\"variable\">httpRequestFactory</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"title class_\">HttpComponentsClientHttpRequestFactory</span>();</span><br><span class=\"line\"> httpRequestFactory.setConnectionRequestTimeout(connectionRequestTimeout);</span><br><span class=\"line\"> httpRequestFactory.setConnectTimeout(connectTimeout);</span><br><span class=\"line\"> httpRequestFactory.setReadTimeout(readTimeout);</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">new</span> <span class=\"title class_\">RestTemplate</span>(httpRequestFactory);</span><br><span class=\"line\"> </span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure></p>\n<h6 id=\"第三种基于第二种升级\"><a class=\"anchor\" href=\"#第三种基于第二种升级\">#</a> 第三种(基于第二种升级)</h6>\n<p><figure class=\"highlight java\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br><span class=\"line\">37</span><br><span class=\"line\">38</span><br><span class=\"line\">39</span><br><span class=\"line\">40</span><br><span class=\"line\">41</span><br><span class=\"line\">42</span><br><span class=\"line\">43</span><br><span class=\"line\">44</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"meta\">@Configuration</span></span><br><span class=\"line\"><span class=\"keyword\">public</span> <span class=\"keyword\">class</span> <span class=\"title class_\">RestConfig</span> {</span><br><span class=\"line\"> </span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"comment\">/**</span></span><br><span class=\"line\"><span class=\"comment\"> * 高并发采用HttpClient连接池</span></span><br><span class=\"line\"><span class=\"comment\"> */</span></span><br><span class=\"line\"> <span class=\"meta\">@Bean</span></span><br><span class=\"line\"> <span class=\"keyword\">public</span> RestTemplate <span class=\"title function_\">restTemplate</span><span class=\"params\">()</span> {</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">new</span> <span class=\"title class_\">RestTemplate</span>(httpRequestFactory());</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"meta\">@Bean</span></span><br><span class=\"line\"> <span class=\"keyword\">public</span> ClientHttpRequestFactory <span class=\"title function_\">httpRequestFactory</span><span class=\"params\">()</span> {</span><br><span class=\"line\"> <span class=\"keyword\">return</span> <span class=\"keyword\">new</span> <span class=\"title class_\">HttpComponentsClientHttpRequestFactory</span>(httpClient());</span><br><span class=\"line\"> }</span><br><span class=\"line\"> </span><br><span class=\"line\"> </span><br><span class=\"line\"> <span class=\"meta\">@Bean</span></span><br><span class=\"line\"> <span class=\"keyword\">public</span> HttpClient <span class=\"title function_\">httpClient</span><span class=\"params\">()</span> {</span><br><span class=\"line\"> Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()</span><br><span class=\"line\"> .register(<span class=\"string\">"http"</span>, PlainConnectionSocketFactory.getSocketFactory())</span><br><span class=\"line\"> .register(<span class=\"string\">"https"</span>, SSLConnectionSocketFactory.getSocketFactory())</span><br><span class=\"line\"> .build();</span><br><span class=\"line\"> <span class=\"type\">PoolingHttpClientConnectionManager</span> <span class=\"variable\">connectionManager</span> <span class=\"operator\">=</span> <span class=\"keyword\">new</span> <span class=\"title class_\">PoolingHttpClientConnectionManager</span>(registry);</span><br><span class=\"line\"> <span class=\"comment\">//设置整个连接池最大连接数</span></span><br><span class=\"line\"> connectionManager.setMaxTotal(<span class=\"number\">1000</span>);</span><br><span class=\"line\"> \t\t\t<span class=\"comment\">//路由是对maxTotal的细分</span></span><br><span class=\"line\"> connectionManager.setDefaultMaxPerRoute(<span class=\"number\">100</span>);</span><br><span class=\"line\"> <span class=\"comment\">//定义不活动的时间(毫秒),超过的连接从连接池拿取需要重新验证</span></span><br><span class=\"line\"> connectionManager.setValidateAfterInactivity(<span class=\"number\">200</span>);</span><br><span class=\"line\"> <span class=\"type\">RequestConfig</span> <span class=\"variable\">requestConfig</span> <span class=\"operator\">=</span> RequestConfig.custom()</span><br><span class=\"line\"> .setSocketTimeout(<span class=\"number\">30000</span>) <span class=\"comment\">//返回数据的超时时间</span></span><br><span class=\"line\"> .setConnectTimeout(<span class=\"number\">20000</span>) <span class=\"comment\">//连接上服务器的超时时间</span></span><br><span class=\"line\"> .setConnectionRequestTimeout(<span class=\"number\">1000</span>) <span class=\"comment\">//从连接池中获取连接的超时时间</span></span><br><span class=\"line\"> .build();</span><br><span class=\"line\"> <span class=\"keyword\">return</span> HttpClientBuilder.create()</span><br><span class=\"line\"> .setDefaultRequestConfig(requestConfig)</span><br><span class=\"line\"> .setConnectionManager(connectionManager)</span><br><span class=\"line\"> .evictIdleConnections(<span class=\"number\">2</span>, TimeUnit.SECONDS) <span class=\"comment\">//保持空闲的最大时间</span></span><br><span class=\"line\"> .build();</span><br><span class=\"line\"> }</span><br><span class=\"line\">}</span><br></pre></td></tr></table></figure></p>\n",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"RestTemplate"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/05/25/%E8%A7%A3%E5%86%B3MySQL%E6%8A%A5only-full-group-by%E9%94%99%E8%AF%AF/",
|
||
"url": "https://hitoli.com/2023/05/25/%E8%A7%A3%E5%86%B3MySQL%E6%8A%A5only-full-group-by%E9%94%99%E8%AF%AF/",
|
||
"title": "解决MySQL报only_full_group_by错误",
|
||
"date_published": "2023-05-25T10:25:00.000Z",
|
||
"content_html": "<h4 id=\"问题描述\"><a class=\"anchor\" href=\"#问题描述\">#</a> 问题描述</h4>\n<p>当我们迁移到 MySQL 5.7+ 的版本时,常会碰到 ERROR 1055 only_full_group_by 错误,这是 5.7 之后 SQL_MODE 默认打开了严格模式导致的错误。说明你代码里有地方写的不严谨。</p>\n<h4 id=\"解决方法\"><a class=\"anchor\" href=\"#解决方法\">#</a> 解决方法</h4>\n<ol>\n<li>重写 sql</li>\n<li>返回宽松模式<br />\n <figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">#查询sql_mode</span><br><span class=\"line\"><span class=\"keyword\">select</span> @<span class=\"variable\">@GLOBAL</span>.sql_mode;</span><br><span class=\"line\">#删除ONLY_FULL_GROUP_BY</span><br><span class=\"line\">#设置sql_mode</span><br><span class=\"line\"><span class=\"keyword\">set</span> @<span class=\"variable\">@GLOBAL</span>.sql_mode<span class=\"operator\">=</span><span class=\"string\">'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'</span>;</span><br></pre></td></tr></table></figure></li>\n<li>使用聚合函数<br />\n如果某些特别的原因就是要查询未分组字段,但你又没空改代码,那么我们可使用聚合函数来规避这类错误,算是一种折中的方案了,语法改严谨了,代码又不需要大动。如 ANY_VALUE ()、MAX ()、MIN () 或者 GROUP_CONCAT () 等聚合函数。</li>\n</ol>\n",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"mysql"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/05/25/MySQL%E4%B8%AD%E7%9A%84any-value-%E5%87%BD%E6%95%B0/",
|
||
"url": "https://hitoli.com/2023/05/25/MySQL%E4%B8%AD%E7%9A%84any-value-%E5%87%BD%E6%95%B0/",
|
||
"title": "MySQL中的any_value()函数",
|
||
"date_published": "2023-05-25T10:07:00.000Z",
|
||
"content_html": "<h4 id=\"问题\"><a class=\"anchor\" href=\"#问题\">#</a> 问题</h4>\n<p>业务要求:查询所有省份:<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/05/25/778f34f5670d.png\" alt=\"\" /></p>\n<h4 id=\"方法\"><a class=\"anchor\" href=\"#方法\">#</a> 方法</h4>\n<ol>\n<li>\n<p>distinct 排除重复<br />\n <figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">SELECT</span></span><br><span class=\"line\">\t<span class=\"keyword\">DISTINCT</span>(province_code),</span><br><span class=\"line\">\tprovince_name</span><br><span class=\"line\"><span class=\"keyword\">FROM</span></span><br><span class=\"line\">\tt_mip_base_area</span><br></pre></td></tr></table></figure></p>\n</li>\n<li>\n<p>group by 根据身份编码分组<br />\n <figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">SELECT</span> </span><br><span class=\"line\">\tprovince_code,</span><br><span class=\"line\">\tany_value(province_name)</span><br><span class=\"line\"><span class=\"keyword\">FROM</span> t_mip_base_area</span><br><span class=\"line\"><span class=\"keyword\">GROUP</span> <span class=\"keyword\">BY</span> province_code</span><br></pre></td></tr></table></figure></p>\n</li>\n</ol>\n<h6 id=\"若这样写\"><a class=\"anchor\" href=\"#若这样写\">#</a> 若这样写</h6>\n<p><figure class=\"highlight sql\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"keyword\">SELECT</span> </span><br><span class=\"line\"> province_code,</span><br><span class=\"line\"> province_name</span><br><span class=\"line\"><span class=\"keyword\">FROM</span> t_mip_base_area</span><br><span class=\"line\"><span class=\"keyword\">GROUP</span> <span class=\"keyword\">BY</span> province_code</span><br></pre></td></tr></table></figure><br />\n 则会报错<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/05/25/c57a8e811928.png\" alt=\"\" /></p>\n<h4 id=\"总结\"><a class=\"anchor\" href=\"#总结\">#</a> 总结:</h4>\n<ol>\n<li>\n<p>MySQL5.7 之后,sql_mode 中 ONLY_FULL_GROUP_BY 模式默认设置为打开状态。</p>\n</li>\n<li>\n<p>ONLY_FULL_GROUP_BY 的语义就是确定 select target list 中的所有列的值都是明确语义,简单的说来,在此模式下,target list 中的值要么是来自于聚合函数(sum、avg、max 等)的结果,要么是来自于 group by list 中的表达式的值</p>\n</li>\n<li>\n<p>MySQL 提供了 any_value () 函数来抑制 ONLY_FULL_GROUP_BY 值被拒绝</p>\n</li>\n<li>\n<p>any_value () 会选择被分到同一组的数据里第一条数据的指定列值作为返回数据</p>\n</li>\n</ol>\n",
|
||
"tags": [
|
||
"工作",
|
||
"解决问题",
|
||
"mysql"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/04/16/%E5%91%BD%E4%BB%A4%E5%A4%A7%E6%9D%82%E7%83%A9/",
|
||
"url": "https://hitoli.com/2023/04/16/%E5%91%BD%E4%BB%A4%E5%A4%A7%E6%9D%82%E7%83%A9/",
|
||
"title": "命令大杂烩",
|
||
"date_published": "2023-04-16T05:32:00.000Z",
|
||
"content_html": "<h4 id=\"日常命令记录\"><a class=\"anchor\" href=\"#日常命令记录\">#</a> 日常命令记录</h4>\n<p><figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br><span class=\"line\">16</span><br><span class=\"line\">17</span><br><span class=\"line\">18</span><br><span class=\"line\">19</span><br><span class=\"line\">20</span><br><span class=\"line\">21</span><br><span class=\"line\">22</span><br><span class=\"line\">23</span><br><span class=\"line\">24</span><br><span class=\"line\">25</span><br><span class=\"line\">26</span><br><span class=\"line\">27</span><br><span class=\"line\">28</span><br><span class=\"line\">29</span><br><span class=\"line\">30</span><br><span class=\"line\">31</span><br><span class=\"line\">32</span><br><span class=\"line\">33</span><br><span class=\"line\">34</span><br><span class=\"line\">35</span><br><span class=\"line\">36</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"comment\">#windows系统修复</span></span><br><span class=\"line\">DISM.exe /Online /Cleanup-image /Scanhealth</span><br><span class=\"line\">DISM.exe /Online /Cleanup-image /Restorehealth </span><br><span class=\"line\">sfc /scannow</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#windows网络修复</span></span><br><span class=\"line\">netsh winsock reset</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#合并ts文件</span></span><br><span class=\"line\">copy /b c:\\Users\\hito\\Downloads\\*.ts d:\\50.mp4</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#windows11家庭版安装Hyper-V(以下命令拷贝到txt文本后重命名为bat文件然后用管理员权限运行)</span></span><br><span class=\"line\"><span class=\"built_in\">pushd</span> <span class=\"string\">"%~dp0"</span></span><br><span class=\"line\"><span class=\"built_in\">dir</span> /b %SystemRoot%\\servicing\\Packages\\*Hyper-V*.mum >> hyper-v.txt</span><br><span class=\"line\"><span class=\"keyword\">for</span> /f %%i <span class=\"keyword\">in</span> (<span class=\"string\">'findstr /i . hyper-v.txt 2^>nul'</span>) <span class=\"keyword\">do</span> dism /online /norestart /add-package:<span class=\"string\">"%SystemRoot%\\servicing\\Packages\\%%i"</span></span><br><span class=\"line\">del hyper-v.txt</span><br><span class=\"line\">Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#mysql查看索引使用情况</span></span><br><span class=\"line\">EXPLAIN SELECT A.XXX, B.XXX FROM TABLE1 A, TABLE2 B ON A.XXX = B.XXX;</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#mysql使用触发器插入数据自动生产uuid主键</span></span><br><span class=\"line\">insert_before BEFORE 插入</span><br><span class=\"line\">BEGIN</span><br><span class=\"line\">\t\t\tSET NEW.ID = REPLACE(UUID(),<span class=\"string\">"-"</span>,<span class=\"string\">""</span>);</span><br><span class=\"line\">END</span><br><span class=\"line\"></span><br><span class=\"line\"><span class=\"comment\">#excel</span></span><br><span class=\"line\"><span class=\"comment\">#合并</span></span><br><span class=\"line\">=CONCATENATE(<span class=\"string\">"EX010"</span>,D2,C2,<span class=\"string\">"1"</span>)</span><br><span class=\"line\"><span class=\"comment\">#截断</span></span><br><span class=\"line\">=LEFT(E2,6)</span><br><span class=\"line\"><span class=\"comment\">#判断取值</span></span><br><span class=\"line\">=IF(O2=<span class=\"string\">"宜都市"</span>,<span class=\"string\">"420500000000000"</span>,IF(O2=<span class=\"string\">"高新区"</span>,<span class=\"string\">"420592000000000"</span>,IF(O2=<span class=\"string\">"枝江市"</span>,<span class=\"string\">"420583000000000"</span>,IF(O2=<span class=\"string\">"当阳市"</span>,<span class=\"string\">"420582000000000"</span>,IF(O2=<span class=\"string\">"远安县"</span>,<span class=\"string\">"420525000000000"</span>,IF(O2=<span class=\"string\">"兴山县"</span>,<span class=\"string\">"420526000000000"</span>,IF(O2=<span class=\"string\">"秭归县"</span>,<span class=\"string\">"420527000000000"</span>,IF(O2=<span class=\"string\">"长阳"</span>,<span class=\"string\">"420528000000000"</span>,IF(O2=<span class=\"string\">"五峰县"</span>,<span class=\"string\">"420529000000000"</span>,IF(O2=<span class=\"string\">"夷陵区"</span>,<span class=\"string\">"420506000000000"</span>,IF(O2=<span class=\"string\">"点军区"</span>,<span class=\"string\">"420504000000000"</span>,IF(O2=<span class=\"string\">"西陵区"</span>,<span class=\"string\">"420502000000000"</span>,IF(OR(ISNUMBER(FIND({<span class=\"string\">"伍家"</span>;<span class=\"string\">"伍家区"</span>;<span class=\"string\">"伍家岗区"</span>},O2))),<span class=\"string\">"420503000000000"</span>,IF(OR(ISNUMBER(FIND({<span class=\"string\">"猇亭"</span>;<span class=\"string\">"猇亭区"</span>},O2))),<span class=\"string\">"420505000000000"</span>))))))))))))))</span><br><span class=\"line\"><span class=\"comment\">#经纬度计算</span></span><br><span class=\"line\">=LEFT(T2,FIND(<span class=\"string\">"°"</span>,T2)-1)+MID(T2,FIND(<span class=\"string\">"°"</span>,T2)+1,FIND(<span class=\"string\">"′"</span>,T2)-FIND(<span class=\"string\">"°"</span>,T2)-1)/60+MID(T2,FIND(<span class=\"string\">"′"</span>,T2)+1,FIND(<span class=\"string\">"″"</span>,T2)-FIND(<span class=\"string\">"′"</span>,T2)-1)/3600</span><br></pre></td></tr></table></figure></p>\n",
|
||
"tags": [
|
||
"生活",
|
||
"技术分享",
|
||
"命令"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/04/16/K8S%E9%A1%B9%E7%9B%AE%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E6%AD%A5%E9%AA%A4/",
|
||
"url": "https://hitoli.com/2023/04/16/K8S%E9%A1%B9%E7%9B%AE%E6%9C%AC%E5%9C%B0%E9%83%A8%E7%BD%B2%E6%AD%A5%E9%AA%A4/",
|
||
"title": "K8S项目本地部署步骤",
|
||
"date_published": "2023-04-16T04:39:00.000Z",
|
||
"content_html": "<h4 id=\"本地部署步骤\"><a class=\"anchor\" href=\"#本地部署步骤\">#</a> 本地部署步骤</h4>\n<ol>\n<li>本机安装 wsl_update_x64.msi (已安装可忽略)</li>\n<li>本机安装 Docker Desktop Installer.exe (已安装可忽略)</li>\n<li>安装成功后,打开设置<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/ab557bae79bf.png\" alt=\"\" /></li>\n<li>选择 Docker Engine,粘贴进如下配置后重启<br />\n <figure class=\"highlight json\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br><span class=\"line\">11</span><br><span class=\"line\">12</span><br><span class=\"line\">13</span><br><span class=\"line\">14</span><br><span class=\"line\">15</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"punctuation\">{</span></span><br><span class=\"line\"> <span class=\"attr\">"builder"</span><span class=\"punctuation\">:</span> <span class=\"punctuation\">{</span></span><br><span class=\"line\"> <span class=\"attr\">"gc"</span><span class=\"punctuation\">:</span> <span class=\"punctuation\">{</span></span><br><span class=\"line\"> <span class=\"attr\">"defaultKeepStorage"</span><span class=\"punctuation\">:</span> <span class=\"string\">"20GB"</span><span class=\"punctuation\">,</span></span><br><span class=\"line\"> <span class=\"attr\">"enabled"</span><span class=\"punctuation\">:</span> <span class=\"literal\"><span class=\"keyword\">true</span></span></span><br><span class=\"line\"> <span class=\"punctuation\">}</span></span><br><span class=\"line\"> <span class=\"punctuation\">}</span><span class=\"punctuation\">,</span></span><br><span class=\"line\"> <span class=\"attr\">"experimental"</span><span class=\"punctuation\">:</span> <span class=\"literal\"><span class=\"keyword\">false</span></span><span class=\"punctuation\">,</span></span><br><span class=\"line\"> <span class=\"attr\">"features"</span><span class=\"punctuation\">:</span> <span class=\"punctuation\">{</span></span><br><span class=\"line\"> <span class=\"attr\">"buildkit"</span><span class=\"punctuation\">:</span> <span class=\"literal\"><span class=\"keyword\">true</span></span></span><br><span class=\"line\"> <span class=\"punctuation\">}</span><span class=\"punctuation\">,</span></span><br><span class=\"line\"> <span class=\"attr\">"insecure-registries"</span><span class=\"punctuation\">:</span> <span class=\"punctuation\">[</span></span><br><span class=\"line\"> <span class=\"string\">"http://192.168.86.117"</span></span><br><span class=\"line\"> <span class=\"punctuation\">]</span></span><br><span class=\"line\"><span class=\"punctuation\">}</span></span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/93533dd8e043.png\" alt=\"\" /></li>\n<li>本项目 clean、compile、package<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/c14b2405a234.jpg\" alt=\"\" /></li>\n<li>添加一个 DockerFile 的启动配置<br />\n 192.168.86.117/zhsl/ys-zhslsgcgl:0.0.1<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/66f152c95d6e.png\" alt=\"\" /></li>\n<li>保证代码是最新的之后,运行上步的配置,会把刚才 install 生成的 jar 包上传到本机 Docker 生成一个本机 docker 镜像<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/4b915691271f.png\" alt=\"\" /></li>\n<li>命令行登录本地的 KUBESPHERE,把本机 docker 镜像上传到 KUBESPHERE<br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker login 192.168.86.117</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/d1acb4e8e336.png\" alt=\"\" /><br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">docker images命令也可以看到本机docker镜像</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/2b22d19f4649.png\" alt=\"\" /><br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">把本机docker镜像上传到KUBESPHERE</span><br><span class=\"line\">docker push 192.168.86.117/zhsl/ys-zhslsgcgl:0.0.1</span><br></pre></td></tr></table></figure><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/f1d792024e54.png\" alt=\"\" /></li>\n<li>网页登录本地的 KUBESPHERE。<br />\n<span class=\"exturl\" data-url=\"aHR0cDovLzE5Mi4xNjguODYuMTE3OjMwODgwLyVFRiVCQyU4QyVFOCVCRiU5QiVFNSU4NSVBNSVFMiU4MCU5QyVFNSVCNyVBNSVFNCVCRCU5QyVFOCVCNCU5RiVFOCVCRCVCRCVFMiU4MCU5RCVFNiU4OSVCRSVFNSU4OCVCMCVFNSU4OCU5QSVFNCVCOCU4QSVFNCVCQyVBMERvY2tlciVFNiU5QyU4RCVFNSU4QSVBMSVFOSU5NSU5QyVFNSU4MyU4RiVFRiVCQyU4QyVFNSVCOSVCNiVFNSU5MCVBRiVFNSU4QSVBOCVFMyU4MCU4Mg==\">http://192.168.86.117:30880/,进入 “工作负载” 找到刚上传 Docker 服务镜像,并启动。</span><br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/fcd7e6459555.png\" alt=\"\" /></li>\n</ol>\n<h4 id=\"通过导出镜像部署\"><a class=\"anchor\" href=\"#通过导出镜像部署\">#</a> 通过导出镜像部署</h4>\n<ol>\n<li>docker images 查看要导出的镜像 id<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/1edd4bacf81c.png\" alt=\"\" /></li>\n<li>docker save 58310865054f > szy.tar 导出到用户目录下 C:\\Users\\hito</li>\n<li>docker load -i szy.tar 载入镜像<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/04/16/32154204eff2.png\" alt=\"\" /></li>\n<li>docker tag 58310865054f harbor.zhsl.local:30881/zhsl/ys-zhslszy:0.0.1 标记镜像</li>\n<li>docker push harbor.zhsl.local:30881/zhsl/ys-zhslszy:0.0.1 上传镜像</li>\n</ol>\n",
|
||
"tags": [
|
||
"工作",
|
||
"项目部署",
|
||
"项目部署",
|
||
"K8S"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/04/16/%E7%83%BD%E7%81%AB10G-ONU%E5%A4%A9%E7%BF%BC%E7%BD%91%E5%85%B34-0%E7%A0%B4%E8%A7%A3%EF%BC%88HG5143F/",
|
||
"url": "https://hitoli.com/2023/04/16/%E7%83%BD%E7%81%AB10G-ONU%E5%A4%A9%E7%BF%BC%E7%BD%91%E5%85%B34-0%E7%A0%B4%E8%A7%A3%EF%BC%88HG5143F/",
|
||
"title": "烽火10G-ONU天翼网关4.0破解(HG5143F)",
|
||
"date_published": "2023-04-16T03:03:00.000Z",
|
||
"content_html": "<h4 id=\"开启telent\"><a class=\"anchor\" href=\"#开启telent\">#</a> 开启 telent</h4>\n<p>注意:54XXXXXXXXC8 为光猫背后 ONU MAC:54-XX-XX-XX-XX-C8</p>\n<ol>\n<li>打开 http://192.168.X.X:8080 (网关地址) 使用密码登陆</li>\n<li>执行 http://192.168.X.X:8080/cgi-bin/telnetenable.cgi?key=54XXXXXXXXC8&telnetenable=1</li>\n<li>用 telent 命令登陆<br />\n用户名:telecom 密码:nE7jA%5m</li>\n<li>获取 telnet 用户名密码<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">获取telnet的用户名</span><br><span class=\"line\">cfg_cmd get InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.TelnetUserName</span><br><span class=\"line\">获取telnet的密码</span><br><span class=\"line\">cfg_cmd get InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.TelnetPassword</span><br></pre></td></tr></table></figure></li>\n<li>转为 root 用户<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">su</span><br><span class=\"line\">密码:Fh@XXXXXX(X为mac地址的后6位)</span><br></pre></td></tr></table></figure></li>\n<li>获取 web 超级密码<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd get InternetGatewayDevice.DeviceInfo.X_CT-COM_TeleComAccount.Password | grep <span class=\"string\">'get success'</span> | <span class=\"built_in\">cut</span> -d = -f 2</span><br></pre></td></tr></table></figure><br />\n7、访问 http://192.168.1.1:8080/html/logoffaccount.html 把隐藏用户打开,其它选项改为可修改</li>\n</ol>\n<p>两种命令模式:</p>\n<h4 id=\"工厂模式\"><a class=\"anchor\" href=\"#工厂模式\">#</a> 工厂模式</h4>\n<ol>\n<li>进入工厂模式<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">load_cli factory</span><br></pre></td></tr></table></figure></li>\n<li>显示管理员密码<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">show admin_pwd</span><br></pre></td></tr></table></figure></li>\n<li>显示所有命令<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">?</span><br></pre></td></tr></table></figure></li>\n<li>显示所有 show 命令<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">show ?</span><br></pre></td></tr></table></figure></li>\n<li>显示所有 set 命令<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\"><span class=\"built_in\">set</span> ?</span><br></pre></td></tr></table></figure></li>\n<li>显示所有信息<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">show allinfo</span><br></pre></td></tr></table></figure></li>\n</ol>\n<h4 id=\"cfg_cmd命令模式\"><a class=\"anchor\" href=\"#cfg_cmd命令模式\">#</a> cfg_cmd 命令模式</h4>\n<ol>\n<li>开启 TELNET<br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.TelnetEnable 1</span><br><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.TelnetUserName 用户名</span><br><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.TelnetPassword 密码</span><br></pre></td></tr></table></figure></li>\n<li>打开 FTP 功能<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.FtpEnable 1</span><br><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.FtpUserName 用户名</span><br><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_ServiceManage.FtpPassword 密码</span><br></pre></td></tr></table></figure></li>\n<li>获取 LOID<br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd get InternetGatewayDevice.X_CT-COM_UserInfo.UserName |grep <span class=\"string\">'value'</span> |<span class=\"built_in\">cut</span> -d <span class=\"string\">'='</span> -f 2</span><br></pre></td></tr></table></figure></li>\n<li>TR069<br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br><span class=\"line\">3</span><br><span class=\"line\">4</span><br><span class=\"line\">5</span><br><span class=\"line\">6</span><br><span class=\"line\">7</span><br><span class=\"line\">8</span><br><span class=\"line\">9</span><br><span class=\"line\">10</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd get InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.Enable</span><br><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.Enable 0 <span class=\"comment\">#0禁用,1启用</span></span><br><span class=\"line\">cfg_cmd get InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.VLANIDMark</span><br><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.VLANIDMark 99 <span class=\"comment\">#默认46</span></span><br><span class=\"line\">cfg_cmd get InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.Mode</span><br><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.Mode 2 <span class=\"comment\">#默认2</span></span><br><span class=\"line\">cfg_cmd get InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_AccessControl.Enabled</span><br><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_AccessControl.Enabled 0 <span class=\"comment\">#0禁用,1启用</span></span><br><span class=\"line\">cfg_cmd get InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.Enable</span><br><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.WANIPConnection.1.Enable 0 <span class=\"comment\">#0禁用,1启用</span></span><br></pre></td></tr></table></figure></li>\n<li>关闭 TR069 中间件<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.DeviceInfo.X_CT-COM_MiddlewareMgt.Tr069Enable 0</span><br></pre></td></tr></table></figure></li>\n<li>删除 1_TR069_R_VID_46<br />\n<figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1.X_CT-COM_WANEponLinkConfig.IP_Routed=<span class=\"string\">''</span></span><br></pre></td></tr></table></figure></li>\n<li>查看设备目前的连接数<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd get InternetGatewayDevice.Services.X_CT-COM_MWBAND.TotalTerminalNumber</span><br></pre></td></tr></table></figure></li>\n<li>设置设备连接数<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd <span class=\"built_in\">set</span> InternetGatewayDevice.Services.X_CT-COM_MWBAND.TotalTerminalNumber 255</span><br></pre></td></tr></table></figure></li>\n<li>用户信息<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd get InternetGatewayDevice.X_CT-COM_UserInfo.UserName</span><br></pre></td></tr></table></figure></li>\n<li>获取 cfg_cmd 帮助<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd <span class=\"built_in\">help</span></span><br></pre></td></tr></table></figure></li>\n<li>获取指定节点后的节点<br />\n <figure class=\"highlight bash\"><table><tr><td class=\"gutter\"><pre><span class=\"line\">1</span><br><span class=\"line\">2</span><br></pre></td><td class=\"code\"><pre><span class=\"line\">cfg_cmd shownode InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1. [0|1] </span><br><span class=\"line\">(如cfg_cmd shownode InternetGatewayDevice.WANDevice.1.WANConnectionDevice.1. [0])</span><br></pre></td></tr></table></figure></li>\n</ol>\n",
|
||
"tags": [
|
||
"生活",
|
||
"技术分享",
|
||
"烽火",
|
||
"天翼网关",
|
||
"破解",
|
||
"HG5143F"
|
||
]
|
||
},
|
||
{
|
||
"id": "https://hitoli.com/2023/02/18/%E4%BF%AE%E6%94%B9IntellIJ-IDE%E8%83%8C%E6%99%AF%E8%89%B2%E5%92%8C%E5%AD%97%E4%BD%93%E5%A4%A7%E5%B0%8F/",
|
||
"url": "https://hitoli.com/2023/02/18/%E4%BF%AE%E6%94%B9IntellIJ-IDE%E8%83%8C%E6%99%AF%E8%89%B2%E5%92%8C%E5%AD%97%E4%BD%93%E5%A4%A7%E5%B0%8F/",
|
||
"title": "修改IntellIJ IDE背景色和字体大小",
|
||
"date_published": "2023-02-18T09:42:00.000Z",
|
||
"content_html": "<h4 id=\"引言\"><a class=\"anchor\" href=\"#引言\">#</a> 引言</h4>\n<p>网上搜索了几个修改 IDE 背景色和字体大小的方法,记录一下方便以后查看。</p>\n<h4 id=\"操作截图\"><a class=\"anchor\" href=\"#操作截图\">#</a> 操作截图</h4>\n<ol>\n<li>\n<p>修改代码区颜色<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/02/18/bb050e7e4c3b3ff2968b0a1be311d31f.png\" alt=\"bb050e7e4c3b3ff2968b0a1be311d31f.png\" /></p>\n</li>\n<li>\n<p>修改代码区字体大小<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/02/18/af92e69249a74978f56a5b2f8bf792a8.png\" alt=\"af92e69249a74978f56a5b2f8bf792a8.png\" /></p>\n</li>\n<li>\n<p>修改控制台背景色<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/02/18/80dd5d82bfc6d0380ce34a590d8beeb4.png\" alt=\"80dd5d82bfc6d0380ce34a590d8beeb4.png\" /></p>\n</li>\n<li>\n<p>修改控制台字体大小<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/02/18/86bd97d1937b77faa27d31db7c2abb91.png\" alt=\"86bd97d1937b77faa27d31db7c2abb91.png\" /></p>\n</li>\n<li>\n<p>修改左侧背景色<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/02/18/4875f8006144733c0e6710a2b04bc2be.jpg\" alt=\"4875f8006144733c0e6710a2b04bc2be.jpg\" /></p>\n</li>\n<li>\n<p>修改 UI 字体大小<br />\n<img data-src=\"https://nas.hitoli.com:18014/images/2023/03/02/UI.png\" alt=\"UI.png\" /></p>\n</li>\n</ol>\n",
|
||
"tags": [
|
||
"工作",
|
||
"IDE",
|
||
"IDE",
|
||
"intellIJ"
|
||
]
|
||
}
|
||
]
|
||
} |