﻿<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>顾陌 | Blog</title><link>http://songker.com/</link><description>一个初级码农的个人Blog</description><item><title>Redis查找所有不过期的redis值</title><link>http://songker.com/index.php/post/250.html</link><description>&lt;p&gt;Redis使用Scan扫描获取所有的redis值，并将主键列表导出成no_ttl.log文件。如果无法执行redis-cli命令，需要安装redis：yum install redis&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;db_ip=127.0.0.1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;redis&amp;nbsp;连接IP
db_port=6379&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;redis&amp;nbsp;端口
password=&amp;#39;123456&amp;#39;&amp;nbsp;&amp;nbsp;#&amp;nbsp;redis&amp;nbsp;密码
cursor=0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;第一次游标
cnt=100&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;每次迭代的数量
new_cursor=0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;下一次游标
&amp;nbsp;
redis-cli&amp;nbsp;-c&amp;nbsp;-h&amp;nbsp;$db_ip&amp;nbsp;-p&amp;nbsp;$db_port&amp;nbsp;-a&amp;nbsp;$password&amp;nbsp;scan&amp;nbsp;$cursor&amp;nbsp;count&amp;nbsp;$cnt&amp;nbsp;&amp;gt;&amp;nbsp;scan_tmp_result
new_cursor=`sed&amp;nbsp;-n&amp;nbsp;&amp;#39;1p&amp;#39;&amp;nbsp;scan_tmp_result`&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;获取下一次游标
sed&amp;nbsp;-n&amp;nbsp;&amp;#39;2,$p&amp;#39;&amp;nbsp;scan_tmp_result&amp;nbsp;&amp;gt;&amp;nbsp;scan_result&amp;nbsp;&amp;nbsp;#&amp;nbsp;获取&amp;nbsp;key
cat&amp;nbsp;scan_result&amp;nbsp;|while&amp;nbsp;read&amp;nbsp;line&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;循环遍历所有&amp;nbsp;key
do
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ttl_result=`redis-cli&amp;nbsp;-c&amp;nbsp;-h&amp;nbsp;$db_ip&amp;nbsp;-p&amp;nbsp;$db_port&amp;nbsp;-a&amp;nbsp;$password&amp;nbsp;ttl&amp;nbsp;$line`&amp;nbsp;&amp;nbsp;#&amp;nbsp;获取key过期时间
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[[&amp;nbsp;$ttl_result&amp;nbsp;==&amp;nbsp;-1&amp;nbsp;]];then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#if&amp;nbsp;[&amp;nbsp;$ttl_result&amp;nbsp;-eq&amp;nbsp;-1&amp;nbsp;];then&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;判断过期时间，-1&amp;nbsp;是不过期
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;$line&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;no_ttl.log&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;追加到指定日志
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi
done
&amp;nbsp;
while&amp;nbsp;[&amp;nbsp;$cursor&amp;nbsp;-ne&amp;nbsp;$new_cursor&amp;nbsp;]&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#&amp;nbsp;若游标不为0，则证明没有迭代完所有的key，继续执行，直至游标为0
do
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;redis-cli&amp;nbsp;-c&amp;nbsp;-h&amp;nbsp;$db_ip&amp;nbsp;-p&amp;nbsp;$db_port&amp;nbsp;-a&amp;nbsp;$password&amp;nbsp;scan&amp;nbsp;$new_cursor&amp;nbsp;count&amp;nbsp;$cnt&amp;nbsp;&amp;gt;&amp;nbsp;scan_tmp_result
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new_cursor=`sed&amp;nbsp;-n&amp;nbsp;&amp;#39;1p&amp;#39;&amp;nbsp;scan_tmp_result`
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sed&amp;nbsp;-n&amp;nbsp;&amp;#39;2,$p&amp;#39;&amp;nbsp;scan_tmp_result&amp;nbsp;&amp;gt;&amp;nbsp;scan_result
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cat&amp;nbsp;scan_result&amp;nbsp;|while&amp;nbsp;read&amp;nbsp;line
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;do
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ttl_result=`redis-cli&amp;nbsp;-c&amp;nbsp;-h&amp;nbsp;$db_ip&amp;nbsp;-p&amp;nbsp;$db_port&amp;nbsp;-a&amp;nbsp;$password&amp;nbsp;ttl&amp;nbsp;$line`
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;[[&amp;nbsp;$ttl_result&amp;nbsp;==&amp;nbsp;-1&amp;nbsp;]];then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#if&amp;nbsp;[&amp;nbsp;$ttl_result&amp;nbsp;-eq&amp;nbsp;-1&amp;nbsp;];then
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;$line&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;no_ttl.log
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;done
done
rm&amp;nbsp;-rf&amp;nbsp;scan_tmp_result
rm&amp;nbsp;-rf&amp;nbsp;scan_result&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 05 Dec 2022 14:10:34 +0800</pubDate></item><item><title>nexus搭建流程</title><link>http://songker.com/index.php/post/249.html</link><description>&lt;p&gt;# Create repository。&lt;br/&gt;&lt;/p&gt;&lt;p&gt;创建的时候有type类型，proxy/hosted/group.&lt;/p&gt;&lt;table width=&quot;962&quot;&gt;&lt;thead style=&quot;box-sizing: border-box; outline: 0px; overflow-wrap: break-word;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box; outline: 0px; border-width: 1px 0px 0px; border-right-style: initial; border-bottom-style: initial; border-left-style: initial; border-right-color: initial; border-bottom-color: initial; border-left-color: initial; border-image: initial; border-top-style: solid; border-top-color: rgb(221, 221, 221); overflow-wrap: break-word;&quot; class=&quot;firstRow&quot;&gt;&lt;th style=&quot;box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px; overflow-wrap: break-word; border-top-color: rgb(221, 221, 221); font-size: 14px; color: rgb(79, 79, 79); line-height: 22px; text-align: left; background-color: rgb(239, 243, 245);&quot;&gt;项目&lt;/th&gt;&lt;th style=&quot;box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px; overflow-wrap: break-word; border-top-color: rgb(221, 221, 221); font-size: 14px; color: rgb(79, 79, 79); line-height: 22px; text-align: left; background-color: rgb(239, 243, 245);&quot;&gt;具体说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody style=&quot;box-sizing: border-box; outline: 0px; border: 0px; overflow-wrap: break-word;&quot;&gt;&lt;tr style=&quot;box-sizing: border-box; outline: 0px; border-width: 1px 0px 0px; border-right-style: initial; border-bottom-style: initial; border-left-style: initial; border-right-color: initial; border-bottom-color: initial; border-left-color: initial; border-image: initial; border-top-style: solid; border-top-color: rgb(221, 221, 221); overflow-wrap: break-word;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px; overflow-wrap: break-word; font-size: 14px; color: rgb(79, 79, 79); line-height: 22px;&quot;&gt;hosted&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px; overflow-wrap: break-word; font-size: 14px; color: rgb(79, 79, 79); line-height: 22px;&quot;&gt;本地存储。像官方仓库一样提供本地私库功能&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; outline: 0px; border-width: 1px 0px 0px; border-right-style: initial; border-bottom-style: initial; border-left-style: initial; border-right-color: initial; border-bottom-color: initial; border-left-color: initial; border-image: initial; border-top-style: solid; border-top-color: rgb(221, 221, 221); background-color: rgb(247, 247, 247); overflow-wrap: break-word;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px; overflow-wrap: break-word; font-size: 14px; color: rgb(79, 79, 79); line-height: 22px;&quot;&gt;proxy&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px; overflow-wrap: break-word; font-size: 14px; color: rgb(79, 79, 79); line-height: 22px;&quot;&gt;提供代理其它仓库的类型&lt;/td&gt;&lt;/tr&gt;&lt;tr style=&quot;box-sizing: border-box; outline: 0px; border-width: 1px 0px 0px; border-right-style: initial; border-bottom-style: initial; border-left-style: initial; border-right-color: initial; border-bottom-color: initial; border-left-color: initial; border-image: initial; border-top-style: solid; border-top-color: rgb(221, 221, 221); overflow-wrap: break-word;&quot;&gt;&lt;td style=&quot;box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px; overflow-wrap: break-word; font-size: 14px; color: rgb(79, 79, 79); line-height: 22px;&quot;&gt;group&lt;/td&gt;&lt;td style=&quot;box-sizing: border-box; outline: 0px; padding: 8px; margin: 0px; overflow-wrap: break-word; font-size: 14px; color: rgb(79, 79, 79); line-height: 22px;&quot;&gt;组类型，能够组合多个仓库为一个地址提供服务&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;正常情况需要搭建两个repository，一个是hosted类型以便公司/团队内上传自己的包，一个是groups类型组合阿里以及自己团队的发布的包的一个集合repository。&lt;/p&gt;&lt;p&gt;groups类型的仓库需要包含hosted的仓，以便其他项目能够正常拉取；&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 配置1&lt;/p&gt;&lt;p&gt;创建2个仓库以后，修改自己的电脑上的maven配置，默认的settings.xml的文件位置在 C盘用户文件夹下的 .m2 文件中。&amp;nbsp;&lt;/p&gt;&lt;p&gt;如果需要发布上传内部的jar包则需要配置nexus账户及密码。&lt;/p&gt;&lt;pre class=&quot;brush:xml;toolbar:false&quot;&gt;&amp;lt;?xml&amp;nbsp;version=&amp;quot;1.0&amp;quot;&amp;nbsp;encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;
&amp;lt;settings&amp;nbsp;xmlns=&amp;quot;http://maven.apache.org/SETTINGS/1.0.0&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;xsi:schemaLocation=&amp;quot;http://maven.apache.org/SETTINGS/1.0.0&amp;nbsp;http://maven.apache.org/xsd/settings-1.0.0.xsd&amp;quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;localRepository&amp;gt;D://apache-maven-3.6.0-bin//localRestory&amp;lt;/localRepository&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;servers&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;server&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;id&amp;gt;chow-commons&amp;lt;/id&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;username&amp;gt;admin&amp;lt;/username&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;password&amp;gt;123456&amp;lt;/password&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/server&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/servers&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;mirrors&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;mirror&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;id&amp;gt;chow-groups&amp;lt;/id&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;name&amp;gt;中央仓库&amp;lt;/name&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url&amp;gt;http://172.16.2.200/repository/chow-groups/&amp;lt;/url&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/mirror&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&amp;nbsp;阿里云仓库&amp;nbsp;--&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;mirror&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;id&amp;gt;alimaven&amp;lt;/id&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;name&amp;gt;aliyun&amp;nbsp;maven&amp;lt;/name&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url&amp;gt;http://maven.aliyun.com/nexus/content/repositories/central/&amp;lt;/url&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/mirror&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&amp;nbsp;中央仓库1&amp;nbsp;--&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;mirror&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;id&amp;gt;repo1&amp;lt;/id&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;name&amp;gt;Human&amp;nbsp;Readable&amp;nbsp;Name&amp;nbsp;for&amp;nbsp;this&amp;nbsp;Mirror.&amp;lt;/name&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url&amp;gt;http://repo1.maven.org/maven2/&amp;lt;/url&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/mirror&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!--&amp;nbsp;中央仓库2&amp;nbsp;--&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;mirror&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;id&amp;gt;repo2&amp;lt;/id&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;mirrorOf&amp;gt;central&amp;lt;/mirrorOf&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;name&amp;gt;Human&amp;nbsp;Readable&amp;nbsp;Name&amp;nbsp;for&amp;nbsp;this&amp;nbsp;Mirror.&amp;lt;/name&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url&amp;gt;http://repo2.maven.org/maven2/&amp;lt;/url&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/mirror&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/mirrors&amp;gt;&amp;nbsp;
&amp;lt;/settings&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 项目上传jar公用包的配置&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot; class=&quot;brush:xml;toolbar:false;&quot;&gt;&amp;lt;distributionManagement&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;repository&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;id&amp;gt;chow-commons&amp;lt;/id&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;name&amp;gt;chow-nexus&amp;lt;/name&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url&amp;gt;http://172.16.2.200:8081/repository/chow-commons/&amp;lt;/url&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/repository&amp;gt;
&amp;lt;/distributionManagement&amp;gt;&lt;/pre&gt;&lt;p&gt;然后在maven里，点击deploy或者执行命令：mvn deploy&lt;/p&gt;&lt;p&gt;# 项目引用公用包的配置&lt;/p&gt;&lt;pre style=&quot;background-color:#2b2b2b;color:#a9b7c6;font-family:&amp;#39;JetBrains Mono&amp;#39;,monospace;font-size:9.8pt;&quot; class=&quot;brush:xml;toolbar:false;&quot;&gt;&amp;lt;dependency&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;groupId&amp;gt;com.chow.commons&amp;lt;/groupId&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;artifactId&amp;gt;chow-entities&amp;lt;/artifactId&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;version&amp;gt;1.0-20220715.061559-2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;# 错误&lt;/p&gt;&lt;p&gt;出现错误：maven Transfer failed for jar 405 PUT，原因：上传的包对应仓库类型需要是hosted。&lt;/p&gt;&lt;p&gt;出现错误：Transfer failed for http://**********/maven-metadata.xml 503 Repository offline，原因：仓库配置了离线，设置库的Online勾选；&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 15 Jul 2022 15:50:38 +0800</pubDate></item><item><title>2022深圳疫情魔幻记事(有空放图)</title><link>http://songker.com/index.php/post/247.html</link><description>&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;21&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;年底在公司内申请了人才房，预计&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;2022&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;年初可以入住罗湖的政府人才房。年前政府公告通知说会延期交付，因为罗湖出现了新一波的新冠疫情，需要将部分密切接触者转移至人才房进行隔离。所以年后在上沙的搬离计划也一并延期耽误了。然后魔幻的&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;2022&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;开端了。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; min-height: 20.3px; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;s1&quot;&gt;2.22&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;封村&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;当天预备正常上班，&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;7&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;出门时候发现楼下聚集了一大波人，询问告知社区封闭，无法正常出入。原以为就像正常的小区封闭检测，全体核酸测试无病例以后就能正常出入了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;第二天以及后续几天依旧封闭，不让外出，期间外卖、超市等均正常，每日要求进行核酸检查并系统上报。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;然而其他楼巷的病例数开始增多，并且上沙各村和小区内不再允许下楼、外卖以及超市关闭，楼下超市以及快递点等出现在流调记录里，部分人员出现恐慌情绪。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;s1&quot;&gt;3.1&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;派餐&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;社区开始统计每户的实际居住人数，并分发物质，前期&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;天可能是人手安排不过来，下沙社区人都吃了&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;餐了，上沙什么物质都没有送到。所以有了下沙吃不下，上沙吃不上的梗。反馈到微博和卫健委，&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;天以后物质总算是彻底解决了。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;s1&quot;&gt;3.9&lt;/span&gt;产检&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;p4&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; min-height: 20.3px; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;s1&quot;&gt;3.13解封半天又新增&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;根据本村前几日连续没有新增，所以当天晚发布通知进行解封。解封需要&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;24&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;小时核酸以及提交人员资料后可出入本村。当时解封时候排队核酸的人也是非常密集，也是担心容易密集感染。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;封闭了这么久准备去备一些物质，防止后续再被封&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;下沙例子&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;，出村取了一次快递，另外一个快递安排在早上送到。结果一语成谶，第二天早上&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点就通知又封闭了，恢复到之前状态，快递也没法取了。查看卫健委消息，刚解封却又出现新增病例，而且接近&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;20&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;例，复杂的是还有两个大白被感染。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p4&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; min-height: 20.3px; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;s1&quot;&gt;3.17转移隔离&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;昨天&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点多就通知了收拾物品准备&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;8&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点转移，结果等到&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点。本来基本都选择去的，等到凌晨&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点都太困了，而且有孩子、有孕妇、有宠物得家庭一堆问题没人能够解答，等另外也不知道去哪里、去多久、什么时候去、去的环境怎么样&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;…&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;什么都不知道，唯一知道的就是要转移，本全部都要去，导致最后超过一半的人选择不去，未知产生恐惧。然后快到&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点说安排不过来，选择去的人也回来了。最后都没去成。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;根据网上的其他已经去的人微博提到，凌晨&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;店到坪山，等待安排物质等到&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点，排队上电梯到新房&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;大概率是公租房&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;感谢政府，感谢各位防疫工作人员，虽然人员众多协调困难，但是具体实施下来措施还是有太多让人吐槽的东西。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;s1&quot;&gt;3.18确认转移&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;当天晚上转移，也差不多等到&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点那时候，排队坐上公交，等了半小时发车，终点大鹏葵安雅居。到了的时候差不多接近一点，再细收拾就到了接近&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点。虽然磕磕碰碰，但是还是过来了。在此感慨，那些大白们太辛苦了，每日都是超负荷的工作。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;3.22隔离一个月&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;隔离的第一个月，伙食也有了明显改善&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;因为远程办公需求，用床头柜和床板给自己拼了一张电脑桌，连接电视作为显示器。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;s1&quot;&gt;3.30&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;产检，又是&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;120&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;接送。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;诊断疑似胰腺炎。希望没事，都是误诊。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;集中隔离医生夺命电话，必须要求在医院住院。一直到第二天中午我们同意转去福田中八大医院才结束。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;s2&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;s1&quot;&gt;3.31&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;坐上&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;120&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;飙车&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;中午&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;12&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点准时的&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;120&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;又来了，紧急收拾行李出发福田中八大复查，办理住院观察。一路超速经过大棚罗湖最后到福田。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;办理住院手续，可是之前沟通说可以陪护，然而特殊时期不允许陪护。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;自己去找麦当劳，肯德基关门歇业。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;联系社区要求接回，晚上&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;22:30&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;，一辆可以载上几十人的空大巴车停在中八大门口，车门敞开，专门接我一个人返航。顶着周围人的目光独自上车。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;大概&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;分钟后达到中航城格兰云天酒店，工作人员看到隔离转运的大巴车来了，接待工作人员在车门口准备接送一车人的行李，我再一次顶着所有人的目光一个人下了车，独自一人扛上了行李，&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;多个人的留在原地一脸懵逼。&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;23:20&amp;nbsp;&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;办理入住，整碗泡面，洗澡睡觉。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 9px; margin-bottom: 8px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;br/&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;s1&quot;&gt;4.1&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;愚人节&lt;/span&gt;&lt;/strong&gt;&lt;span class=&quot;s2&quot;&gt;里好消息的一天&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;老婆办理住院，详细检查过后果然是误诊！&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;其他隔离在龙岗大鹏的邻居，被通知可以转移回上沙，比较尴尬的是我昨天转移过来的，我这边也联系酒店要求返回。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;下午接近&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;点，告知可以离开，先美美的吃了一顿麦当劳，&lt;/span&gt;我爱自由我爱快乐水我爱这些垃圾食品。&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; min-height: 20.3px; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p class=&quot;p2&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; min-height: 20.3px; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p class=&quot;p3&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;strong&gt;&lt;span class=&quot;s2&quot;&gt;4.2&lt;/span&gt;终于上班啦&lt;/strong&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal; -webkit-text-size-adjust: auto;&quot;&gt;&lt;span class=&quot;s1&quot;&gt;联系楼下一并隔离的广告店，制作了两面锦旗，一面送给中山过来支援的志愿者小哥，一面送给了福田人力资源中心的小姐姐。&lt;/span&gt;&lt;/p&gt;&lt;p class=&quot;p1&quot; style=&quot;margin-top: 0px; margin-bottom: 0px; font-stretch: normal; font-size: 17px; line-height: normal; white-space: normal;&quot;&gt;&lt;span class=&quot;s2&quot;&gt;&lt;/span&gt;&lt;span class=&quot;s3&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 24 Mar 2022 14:32:49 +0800</pubDate></item><item><title>PGSQL数据库层面的加密解密</title><link>http://songker.com/index.php/post/246.html</link><description>&lt;p&gt;需求：需要将现在的用户关键信息在数据库层面做加密。&lt;/p&gt;&lt;p&gt;--安装pgcrypto扩展&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;create&amp;nbsp;extension&amp;nbsp;pgcrypto;
select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;pg_available_extensions&amp;nbsp;&amp;nbsp;--查看pgcrypto是否安装成功&lt;/pre&gt;&lt;p&gt;--加密&amp;nbsp;&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;select&amp;nbsp;encode(encrypt(&amp;#39;17817719973&amp;#39;::bytea,&amp;#39;0000000ctsdev123&amp;#39;,&amp;#39;aes-ecb&amp;#39;),&amp;#39;base64&amp;#39;)&lt;/pre&gt;&lt;p&gt;--解密&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;select&amp;nbsp;convert_from(decrypt(decode(&amp;#39;gGBEj3ScUIF1Ow08cftkpA==&amp;#39;,&amp;#39;base64&amp;#39;),&amp;#39;0000000ctsdev123&amp;#39;,&amp;#39;aes-ecb&amp;#39;),&amp;#39;SQL_ASCII&amp;#39;);&lt;/pre&gt;&lt;p&gt;--为了以后方便直接建立一个加密函数（cts_encrypt） 参数1为明文，参数2为密钥&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;CREATE&amp;nbsp;or&amp;nbsp;replace&amp;nbsp;FUNCTION&amp;nbsp;cts_encrypt(var1&amp;nbsp;VARCHAR,var2&amp;nbsp;varchar(16))&amp;nbsp;
&amp;nbsp;&amp;nbsp;RETURNS&amp;nbsp;&amp;nbsp;VARCHAR&amp;nbsp;as&amp;nbsp;$$
BEGIN
&amp;nbsp;&amp;nbsp;RETURN&amp;nbsp;(SELECT&amp;nbsp;encode(encrypt(var1::bytea,var2&amp;nbsp;::&amp;nbsp;bytea,&amp;#39;aes-ecb&amp;#39;),&amp;#39;base64&amp;#39;));
END;&amp;nbsp;$$
language&amp;nbsp;plpgsql;&lt;/pre&gt;&lt;p&gt;测试加密：&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;select&amp;nbsp;cts_encrypt(&amp;#39;18700000000&amp;#39;,&amp;#39;0000000ctsdev123&amp;#39;)&lt;/pre&gt;&lt;p&gt;--解密函数cts_decrypt 参数1为密文，参数2为密钥&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;CREATE&amp;nbsp;or&amp;nbsp;replace&amp;nbsp;FUNCTION&amp;nbsp;cts_decrypt(var1&amp;nbsp;VARCHAR,var2&amp;nbsp;varchar(16))&amp;nbsp;
&amp;nbsp;&amp;nbsp;RETURNS&amp;nbsp;&amp;nbsp;VARCHAR&amp;nbsp;as&amp;nbsp;$$
BEGIN
&amp;nbsp;&amp;nbsp;RETURN&amp;nbsp;(select&amp;nbsp;convert_from(decrypt(decode(var1,&amp;#39;base64&amp;#39;),var2&amp;nbsp;::&amp;nbsp;bytea,&amp;#39;aes-ecb&amp;#39;),&amp;#39;SQL_ASCII&amp;#39;));
END;&amp;nbsp;$$
language&amp;nbsp;plpgsql;&lt;/pre&gt;&lt;p&gt;测试解密：&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;select&amp;nbsp;cts_decrypt(&amp;#39;XyFXGdD/gt8Fjc+lsjWLKg==&amp;#39;,&amp;#39;0000000ctsdev123&amp;#39;)&lt;/pre&gt;&lt;p&gt;备份用户信息表：&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;create&amp;nbsp;table&amp;nbsp;base_user_detail&amp;nbsp;as&amp;nbsp;(&amp;nbsp;select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;base_user);
ALTER&amp;nbsp;TABLE&amp;nbsp;base_user_detail&amp;nbsp;ADD&amp;nbsp;PRIMARY&amp;nbsp;KEY&amp;nbsp;(id)&amp;nbsp;;&lt;/pre&gt;&lt;p&gt;加密用户表里面的手机号信息&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;update&amp;nbsp;base_user_detail&amp;nbsp;set&amp;nbsp;mobile=cts_encrypt(mobile,&amp;#39;0000000ctsdev123&amp;#39;)&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;对应的Java应用层面的加解密：&lt;/p&gt;&lt;pre class=&quot;brush:java;toolbar:false&quot;&gt;private&amp;nbsp;static&amp;nbsp;String&amp;nbsp;MODEL&amp;nbsp;=&amp;nbsp;&amp;quot;AES/ECB/PKCS5Padding&amp;quot;;
private&amp;nbsp;static&amp;nbsp;String&amp;nbsp;useKey&amp;nbsp;=&amp;quot;0000000ctsdev123&amp;quot;;
public&amp;nbsp;static&amp;nbsp;String&amp;nbsp;encrypt(String&amp;nbsp;content)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(StringUtils.isEmpty(content)){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;content;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;result&amp;nbsp;=&amp;nbsp;content;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;contentBytes&amp;nbsp;=&amp;nbsp;content.getBytes(&amp;quot;UTF-8&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SecretKeySpec&amp;nbsp;skeySpec&amp;nbsp;=&amp;nbsp;new&amp;nbsp;SecretKeySpec(useKey.getBytes(&amp;quot;UTF-8&amp;quot;),&amp;nbsp;&amp;quot;AES&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Cipher&amp;nbsp;cipher&amp;nbsp;=&amp;nbsp;Cipher.getInstance(MODEL);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cipher.init(Cipher.ENCRYPT_MODE,&amp;nbsp;skeySpec);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;encryptResult&amp;nbsp;=&amp;nbsp;cipher.doFinal(contentBytes);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;Base64.encodeBase64String(encryptResult);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//替换\r&amp;nbsp;\n
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;result.replace(&amp;quot;\n&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;).replace(&amp;quot;\r&amp;quot;,&amp;nbsp;&amp;quot;&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(Exception&amp;nbsp;ex)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;RuntimeException(ex);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result;
}
public&amp;nbsp;static&amp;nbsp;String&amp;nbsp;decrypt(String&amp;nbsp;content){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(StringUtils.isEmpty(content)){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;content;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;result&amp;nbsp;=&amp;nbsp;content;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;contentBytes&amp;nbsp;=null;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(content.length()%4==0){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contentBytes&amp;nbsp;=Base64.decodeBase64(content);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}else{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;RuntimeException(&amp;quot;字符串&amp;quot;+content+&amp;quot;不是base64编码过的字符串！&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(Exception&amp;nbsp;ex)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;RuntimeException(ex);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(contentBytes!=null){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SecretKeySpec&amp;nbsp;skeySpec&amp;nbsp;=&amp;nbsp;new&amp;nbsp;SecretKeySpec(useKey.getBytes(&amp;quot;UTF-8&amp;quot;),&amp;nbsp;&amp;quot;AES&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Cipher&amp;nbsp;cipher&amp;nbsp;=&amp;nbsp;Cipher.getInstance(MODEL);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cipher.init(Cipher.DECRYPT_MODE,&amp;nbsp;skeySpec);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;decryptResult&amp;nbsp;=&amp;nbsp;cipher.doFinal(contentBytes);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(decryptResult&amp;nbsp;!=&amp;nbsp;null)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;new&amp;nbsp;String(decryptResult,&amp;nbsp;&amp;quot;UTF-8&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;catch&amp;nbsp;(Exception&amp;nbsp;ex)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;throw&amp;nbsp;new&amp;nbsp;RuntimeException(ex);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;result;
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 21 Feb 2022 11:14:01 +0800</pubDate></item><item><title>.NetCore WebSocket跨域问题 SignalR CORS跨域</title><link>http://songker.com/index.php/post/244.html</link><description>&lt;p&gt;将 SignalR 集成到 ASP.NET Core api 程序的时候，按照官方 DEMO 配置完成，同域名访问没有问题，但是前端一直报跨域问题。原设置项：&lt;/p&gt;&lt;pre class=&quot;brush:c#;toolbar:false&quot;&gt;&amp;nbsp;&amp;nbsp;services.AddCors(op&amp;nbsp;=&amp;gt;&amp;nbsp;{&amp;nbsp;op.AddPolicy(&amp;quot;cors&amp;quot;,&amp;nbsp;builder&amp;nbsp;=&amp;gt;&amp;nbsp;{&amp;nbsp;builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod().AllowCredentials();&amp;nbsp;});&amp;nbsp;});&lt;/pre&gt;&lt;p&gt;出现该问题的原因是由于 CORS 策略设置不正确造成的，原始设置我是允许所有 Origin 来源，在正常跨域请求正常，在请求Websocket相关请求时候提示跨域错误。&lt;/p&gt;&lt;p&gt;但是由于 dotnetCore 2.2 的限制，无法使用 AllowAnyOrigin() + AllowCredentials() 的组合，只能显式指定 Origin 来源，或者通过下述方式来间接实现。&lt;/p&gt;&lt;p&gt;解决方案1，修改跨域配置：&lt;/p&gt;&lt;pre class=&quot;brush:c#;toolbar:false&quot;&gt;　services.AddCors(op&amp;nbsp;=&amp;gt;&amp;nbsp;{&amp;nbsp;op.AddPolicy(&amp;quot;cors&amp;quot;,&amp;nbsp;builder&amp;nbsp;=&amp;gt;&amp;nbsp;{&amp;nbsp;builder.SetIsOriginAllowed(origin&amp;nbsp;=&amp;gt;&amp;nbsp;true).AllowAnyHeader().AllowAnyMethod().AllowCredentials();&amp;nbsp;});&amp;nbsp;});&lt;/pre&gt;&lt;p&gt;解决方案2，直接采用中间件进行设置请求头：&lt;/p&gt;&lt;pre class=&quot;brush:c#;toolbar:false&quot;&gt;public&amp;nbsp;class&amp;nbsp;CorsMiddleware
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;private&amp;nbsp;readonly&amp;nbsp;RequestDelegate&amp;nbsp;next;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;CorsMiddleware(RequestDelegate&amp;nbsp;next)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.next&amp;nbsp;=&amp;nbsp;next;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public&amp;nbsp;async&amp;nbsp;Task&amp;nbsp;Invoke(HttpContext&amp;nbsp;context)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(context.Request.Headers.ContainsKey(CorsConstants.Origin))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.Headers.Add(&amp;quot;Access-Control-Allow-Origin&amp;quot;,&amp;nbsp;context.Request.Headers[&amp;quot;Origin&amp;quot;]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.Headers.Add(&amp;quot;Access-Control-Allow-Methods&amp;quot;,&amp;nbsp;&amp;quot;PUT,POST,GET,DELETE,OPTIONS,HEAD,PATCH&amp;quot;);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.Headers.Add(&amp;quot;Access-Control-Allow-Headers&amp;quot;,&amp;nbsp;context.Request.Headers[&amp;quot;Access-Control-Request-Headers&amp;quot;]);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.Headers.Add(&amp;quot;Access-Control-Allow-Credentials&amp;quot;,&amp;nbsp;&amp;quot;true&amp;quot;);

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(context.Request.Method.Equals(&amp;quot;OPTIONS&amp;quot;))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;context.Response.StatusCode&amp;nbsp;=&amp;nbsp;StatusCodes.Status200OK;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;await&amp;nbsp;next(context);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}&lt;/pre&gt;&lt;pre class=&quot;brush:c#;toolbar:false&quot;&gt;//在Configure方法中添加如下内容
app.UseMiddleware&amp;lt;CorsMiddleware&amp;gt;();&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 17 Sep 2021 11:37:21 +0800</pubDate></item><item><title>PostgreSQL物化视图相关操作</title><link>http://songker.com/index.php/post/242.html</link><description>&lt;p&gt;使用普通视图查询较慢，改用pgsql的物化视图。物化视图和普通视图的区别在于物化视图会将试图内容物理保存在数据库中。&lt;/p&gt;&lt;p&gt;1、创建一个名为mv_memberdetail的物化视图&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;create&amp;nbsp;materialized&amp;nbsp;view&amp;nbsp;mv_memberdetail&amp;nbsp;as
select&amp;nbsp;m.*,p.diamond_value,p.grade_name,p.orderTotal,p.orderNum
from&amp;nbsp;crm_membership&amp;nbsp;m
inner&amp;nbsp;join(
select&amp;nbsp;membership_id,sum(remain)&amp;nbsp;diamond_value,SUM(money)&amp;nbsp;orderTotal,count(product_number)&amp;nbsp;orderNum,
case&amp;nbsp;when&amp;nbsp;sum(remain)&amp;lt;100&amp;nbsp;then&amp;nbsp;&amp;#39;黄金&amp;#39;
&amp;nbsp;when&amp;nbsp;sum(remain)&amp;gt;=100&amp;nbsp;and&amp;nbsp;sum(remain)&amp;lt;1000&amp;nbsp;then&amp;nbsp;&amp;#39;铂金&amp;#39;
&amp;nbsp;when&amp;nbsp;sum(remain)&amp;gt;=1000&amp;nbsp;then&amp;nbsp;&amp;#39;钻石&amp;#39;&amp;nbsp;else&amp;nbsp;&amp;#39;&amp;#39;&amp;nbsp;end&amp;nbsp;grade_name&amp;nbsp;
from&amp;nbsp;crm_point_logs
where&amp;nbsp;is_delete=false&amp;nbsp;and&amp;nbsp;point_type=&amp;#39;钻石&amp;#39;&amp;nbsp;and&amp;nbsp;status&amp;nbsp;in(&amp;#39;0&amp;#39;,&amp;#39;1&amp;#39;,&amp;#39;2&amp;#39;)&amp;nbsp;
group&amp;nbsp;by&amp;nbsp;membership_id
)&amp;nbsp;p&amp;nbsp;on&amp;nbsp;m.id=p.membership_id
where&amp;nbsp;m.is_delete=false&lt;/pre&gt;&lt;p&gt;2、创建视图索引&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;create&amp;nbsp;unique&amp;nbsp;index&amp;nbsp;index_mv_memberdetail_id&amp;nbsp;on&amp;nbsp;mv_memberdetail(id);&lt;/pre&gt;&lt;p&gt;3、刷新物化视图（会锁住视图，刷新较快）&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;refresh&amp;nbsp;materialized&amp;nbsp;view&amp;nbsp;mv_memberdetail;&lt;/pre&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;刷新物化视图（不会锁住视图，刷新速度大幅下降）&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;refresh&amp;nbsp;materialized&amp;nbsp;view&amp;nbsp;concurrently&amp;nbsp;mv_memberdetail;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;刷新物化视图以及CONCURRENTLY的介绍&lt;/strong&gt;&lt;/p&gt;&lt;ul class=&quot; list-paddingleft-2&quot; style=&quot;list-style-type: disc;&quot;&gt;&lt;li&gt;&lt;p&gt;对物化视图的刷新不阻塞在该物化视图上的并发选择。如果没有这个选项，一次影响很多行的刷新将使用更少的资源并且更快结束，但是可能会阻塞其他尝试从物化视图中读取的连接。这个选项在只有少量行被影响的情况下可能会更快。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;只有当物化视图上有至少一个UNIQUE索引（只用列名 并且包括所有行）时，才允许这个选项。也就是说，该索引不能建立在任何 表达式上或者包括WHERE子句。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;当物化视图还未被填充时，这个选项不能被使用。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;即使带有这个选项，对于任意一个物化视图一次也只能运行一个REFRESH&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 07 May 2021 16:04:35 +0800</pubDate></item><item><title>微信默认表情符号的代码对照表</title><link>http://songker.com/index.php/post/241.html</link><description>&lt;p&gt;&lt;img src=&quot;http://songker.com/zb_users/upload/2020/10/20201029171741_86196.png&quot; width=&quot;900&quot; height=&quot;1636&quot; border=&quot;0&quot; hspace=&quot;0&quot; vspace=&quot;0&quot; title=&quot;&quot; style=&quot;width: 900px; height: 1636px;&quot;/&gt;&lt;/p&gt;</description><pubDate>Thu, 29 Oct 2020 17:17:28 +0800</pubDate></item><item><title>PGSQL的跨库查询（替换dblink）</title><link>http://songker.com/index.php/post/240.html</link><description>&lt;p&gt;&lt;span style=&quot;line-height: 0px;&quot;&gt;﻿&lt;/span&gt;因业务涉及到跨库查询，之前的方案为dblink进行查询，随着数据量变大，dblink的响应时间严重超时，因为dblink一次请求都会对远端数据库进行一次全表扫描，且所有数据都会传输回本地数据库内，导致性能降低并且严重浪费当前系统资源。本地系统每通过DBLINK链接远端系统一次，都会生成一个本地session，如本地session不退出或者手动释放，只有通过session超时才能自动释放，会浪费大量的系统资源。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;在PGSQL上可使用postgres_fdw这个扩展来代替dblink。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;-- 01 创建扩展参数&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;CREATE&amp;nbsp;EXTENSION&amp;nbsp;postgres_fdw;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;-- 02&amp;nbsp;创建一个外部服务器，设置数据库的连接（删除 DROP SERVER foreign_server CASCADE）&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;CREATE&amp;nbsp;SERVER&amp;nbsp;foreign_server
FOREIGN&amp;nbsp;DATA&amp;nbsp;WRAPPER&amp;nbsp;postgres_fdw
OPTIONS&amp;nbsp;(host&amp;nbsp;&amp;#39;localhost&amp;#39;,&amp;nbsp;port&amp;nbsp;&amp;#39;5432&amp;#39;,&amp;nbsp;dbname&amp;nbsp;&amp;#39;外部的数据库名称&amp;#39;);

--&amp;nbsp;后续对此进行修改：ALTER&amp;nbsp;SERVER&amp;nbsp;foreign_server&amp;nbsp;OPTIONS&amp;nbsp;(SET&amp;nbsp;port&amp;nbsp;&amp;#39;1921&amp;#39;,&amp;nbsp;SET&amp;nbsp;host&amp;nbsp;&amp;#39;localhost&amp;#39;,&amp;nbsp;SET&amp;nbsp;dbname&amp;nbsp;&amp;#39;数据库名称&amp;#39;);
--&amp;nbsp;如需删除某个配置项：ALTER&amp;nbsp;SERVER&amp;nbsp;foreign_server&amp;nbsp;OPTIONS&amp;nbsp;(DROP&amp;nbsp;host,&amp;nbsp;DROP&amp;nbsp;port);
--&amp;nbsp;添加某个配置项&amp;nbsp;&amp;nbsp;ALTER&amp;nbsp;SERVER&amp;nbsp;foreign_server&amp;nbsp;OPTIONS&amp;nbsp;(ADD&amp;nbsp;host);
--&amp;nbsp;查询本数据库的连接端口&amp;nbsp;show&amp;nbsp;port&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;如果有该报错信息：&lt;strong style=&quot;white-space: normal; box-sizing: border-box; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 15px; background-color: rgb(255, 255, 255);&quot;&gt;only connections to self instance are supported, please do not specify the host or hostaddr parameters。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;则创建外部服务器的时候，不要填写port和host的信息，如：&lt;/p&gt;&lt;p&gt;&lt;strong style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: -apple-system, BlinkMacSystemFont, &amp;quot;Helvetica Neue&amp;quot;, &amp;quot;PingFang SC&amp;quot;, &amp;quot;Microsoft YaHei&amp;quot;, &amp;quot;Source Han Sans SC&amp;quot;, &amp;quot;Noto Sans CJK SC&amp;quot;, &amp;quot;WenQuanYi Micro Hei&amp;quot;, sans-serif; font-size: 15px; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;/strong&gt;&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;CREATE&amp;nbsp;SERVER&amp;nbsp;foreign_server
FOREIGN&amp;nbsp;DATA&amp;nbsp;WRAPPER&amp;nbsp;postgres_fdw
OPTIONS&amp;nbsp;(dbname&amp;nbsp;&amp;#39;外部的数据库名称&amp;#39;);&lt;/pre&gt;&lt;p&gt;-- 03&amp;nbsp;定义的用户映射， 辨认将要在远程服务器上使用的角色&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;CREATE&amp;nbsp;USER&amp;nbsp;MAPPING&amp;nbsp;FOR&amp;nbsp;postgres
SERVER&amp;nbsp;foreign_server
OPTIONS&amp;nbsp;(user&amp;nbsp;&amp;#39;postgres&amp;#39;,&amp;nbsp;password&amp;nbsp;&amp;#39;密码&amp;#39;);&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;white-space:pre&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;-- 04 创建schema，并创建所有的外部数据库表&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;CREATE&amp;nbsp;SCHEMA&amp;nbsp;ft;
import&amp;nbsp;foreign&amp;nbsp;schema&amp;nbsp;public&amp;nbsp;from&amp;nbsp;server&amp;nbsp;foreign_server&amp;nbsp;into&amp;nbsp;ft;

--&amp;nbsp;单独增加外部表（如果后续有新的外部表可以用这个增加limit&amp;nbsp;to/排除except）
IMPORT&amp;nbsp;FOREIGN&amp;nbsp;SCHEMA&amp;nbsp;public
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LIMIT&amp;nbsp;TO&amp;nbsp;&amp;nbsp;(test_tablename)&amp;nbsp;
from&amp;nbsp;server&amp;nbsp;foreign_server&amp;nbsp;into&amp;nbsp;ft

select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;ft.表名&lt;/pre&gt;&lt;p&gt;如果区分权限不创建所有的表，只创建单独的外部表关联&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;--&amp;nbsp;drop&amp;nbsp;FOREIGN&amp;nbsp;TABLE&amp;nbsp;f_order_info&amp;nbsp;
CREATE&amp;nbsp;FOREIGN&amp;nbsp;TABLE&amp;nbsp;f_order_info&amp;nbsp;(
id&amp;nbsp;CHAR(24)&amp;nbsp;NOT&amp;nbsp;NULL,
order_no&amp;nbsp;VARCHAR(50),
&amp;nbsp;&amp;nbsp;store_id&amp;nbsp;VARCHAR(50),
department_id&amp;nbsp;VARCHAR(50),
order_status&amp;nbsp;VARCHAR(20),
product_count&amp;nbsp;int,
product_total&amp;nbsp;decimal(18,2)
)
SERVER&amp;nbsp;foreign_server
OPTIONS&amp;nbsp;(schema_name&amp;nbsp;&amp;#39;public&amp;#39;,&amp;nbsp;table_name&amp;nbsp;&amp;#39;外部数据库表名&amp;#39;);
select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;f_order_info&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;参考：https://help.aliyun.com/document_detail/142422.html&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;&lt;strong&gt;衍生问题：（赋予某子账户跨库查询权限）&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;-- 01 创建 子账户的映射&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;CREATE&amp;nbsp;USER&amp;nbsp;MAPPING&amp;nbsp;FOR&amp;nbsp;子账户名称
SERVER&amp;nbsp;foreign_server
OPTIONS&amp;nbsp;(user&amp;nbsp;&amp;#39;子账户名称&amp;#39;,&amp;nbsp;password&amp;nbsp;&amp;#39;子账户密码&amp;#39;);&lt;/pre&gt; &lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;-- 02 赋予schema的权限给子账户&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;grant&amp;nbsp;all&amp;nbsp;on&amp;nbsp;SCHEMA&amp;nbsp;ft&amp;nbsp;to&amp;nbsp;子账户名称;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;-- 03 赋予schema的表权限给子账户&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;GRANT&amp;nbsp;SELECT,INSERT,DELETE&amp;nbsp;ON&amp;nbsp;ALL&amp;nbsp;TABLES&amp;nbsp;IN&amp;nbsp;SCHEMA&amp;nbsp;ft&amp;nbsp;TO&amp;nbsp;子账户名称;&amp;nbsp;&amp;nbsp;--&amp;nbsp;赋予所有的表查询、插入、删除权限
GRANT&amp;nbsp;SELECT&amp;nbsp;ON&amp;nbsp;TABLE&amp;nbsp;ft.表名&amp;nbsp;TO&amp;nbsp;子账户名称;&amp;nbsp;&amp;nbsp;--&amp;nbsp;赋予单独的表查询权限
REVOKE&amp;nbsp;SELECT&amp;nbsp;ON&amp;nbsp;TABLE&amp;nbsp;表名&amp;nbsp;FROM&amp;nbsp;子账户名称;&amp;nbsp;&amp;nbsp;&amp;nbsp;--&amp;nbsp;撤销某表的查询权限&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style=&quot;font-size: 16px; white-space: normal;&quot;&gt;202304故障：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;凌晨RDS数据库实例被阿里云强制升级了,早上各运营业务群反馈部分功能异常. 经过排查定位到是跨库查询失效了. 查看阿里云通知提示数据库被强制小版本升级了,怀疑是本次升级导致问题.&lt;strong style=&quot;font-size: 16px; white-space: normal;&quot;&gt;&lt;br/&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们在主库中用的postgres_fdw插件创建foreign_server以实现数据库本实例的跨库查询.&lt;br/&gt;我们连接的是本示例内的另外数据库,之前的连接有设置OPTIONS&amp;nbsp;(host&amp;nbsp;&amp;#39;localhost&amp;#39;,&amp;nbsp;port&amp;nbsp;&amp;#39;3002&amp;#39;,&amp;nbsp;dbname&amp;nbsp;&amp;#39;数据库名&amp;#39;).升级以后不能使用localhost和port了.&amp;nbsp;查询同一个实例只用设置数据库名dbname,其他的设置host和port设置的localhost/127.0.0.1和3002端口就不能使用了,使用了就会报错误提示&amp;nbsp;&lt;span style=&quot;color: rgb(51, 51, 51); font-family: PingFangSC-Regular; white-space: pre-wrap; background-color: rgb(255, 255, 255);&quot;&gt;ERROR: &amp;nbsp;only connections to self instance are supported, please do not specify the port parameter &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color:#333333;font-family:PingFangSC-Regular&quot;&gt;&lt;span style=&quot;white-space: pre-wrap; background-color: rgb(255, 255, 255);&quot;&gt;本次处理删除掉OPTIONS&amp;nbsp;中的host和port就恢复正常.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;</description><pubDate>Thu, 10 Sep 2020 15:41:19 +0800</pubDate></item><item><title>pgsql单表查询超时问题（vacuum）</title><link>http://songker.com/index.php/post/236.html</link><description>&lt;p&gt;今天生产数据库遇到一个严重的问题，某一个PostgreSQL的业务表查询异常缓慢，导致该模块业务查询超时。甚至slect count(id) from table查询整表数据数量的时候都需要执行超过60秒。&lt;br/&gt;&lt;/p&gt;&lt;p&gt;最初怀疑是索引的问题，删除索引或者重建索引都无法解决问题。&lt;/p&gt;&lt;p&gt;后面查询各表的碎片化问题，查询到该表异常（这个命令是查询按照最老的XID排序，查看大于1G而且是排名前20的表）：&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;SELECT&amp;nbsp;relname,&amp;nbsp;age(relfrozenxid)&amp;nbsp;as&amp;nbsp;xid_age,&amp;nbsp;pg_size_pretty(pg_table_size(oid))&amp;nbsp;as&amp;nbsp;table_size&amp;nbsp;FROM&amp;nbsp;pg_class&amp;nbsp;WHERE&amp;nbsp;relkind&amp;nbsp;=&amp;nbsp;&amp;#39;r&amp;#39;&amp;nbsp;and&amp;nbsp;pg_table_size(oid)&amp;nbsp;&amp;gt;&amp;nbsp;1073741824
ORDER&amp;nbsp;BY&amp;nbsp;age(relfrozenxid)&amp;nbsp;DESC&amp;nbsp;LIMIT&amp;nbsp;20;&lt;/pre&gt;&lt;p&gt;才了解到PGSQL(未开启定期维护任务)需要定期进行垃圾回收，原因是当系统有更新操作（包括INSERT VALUES、UPDATE、DELETE、ALTER TABLE ADD COLUMN等），会在系统表和被更新的数据表中留存不再使用的垃圾数据，造成系统性能下降，并占用大量磁盘空间，因此需要定期进行垃圾回收。&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;vacuum的效果：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1释放,再利用 更新/删除的行所占据的磁盘空间.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2更新POSTGRESQL查询计划中使用的统计数据&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3防止因事务ID的重置而使非常老的数据丢失。&lt;/p&gt;&lt;p&gt;第一点的原因是PostgreSQL数据的插入,更新,删除操作并不是真正放到数据库空间.如果不定期释放空间的话,由于数据太多,查询速度会巨降.&lt;/p&gt;&lt;p&gt;第二点的原因是PostgreSQL在做查询处理的时候,为了是查询速度提高,会根据统计数据来确定执行计划.如果不及时更新的话,查询的效果可能不如预期.&lt;/p&gt;&lt;p&gt;第三点的原因是PostgreSQL中每一个事务都会产生一个事务ID,但这个数字是有上限的. 当事务ID达到最大值后,会重新从最小值开始循环.这样如果不及时把以前的数据释放掉的话,原来的老数据会因为事务ID的丢失而丢失掉.&lt;/p&gt;&lt;p&gt;执行释放解决（锁表，效率很低）：&lt;/p&gt;&lt;pre class=&quot;brush:sql;toolbar:false&quot;&gt;vacuum&amp;nbsp;full&amp;nbsp;&amp;lt;表名称&amp;gt;;&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Thu, 28 May 2020 12:42:01 +0800</pubDate></item><item><title>openmediavault家用私人NAS等应用部署教程</title><link>http://songker.com/index.php/post/230.html</link><description>&lt;p&gt;OpenMediaVault，是一个开源的基于 Debian Linux 的下一代网络附加存储(NAS)解决方案。它包含众多服务，如 SSH、(S)FTP、SMB / CIFS、DAAP 媒体服务器、RSync、BitTorrent 客户机等。并具有通过插件可增强的模块化设计框架特性。其核心如下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;基于Web方式的系统管理&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;通过Debian软件包简单的系统升级&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;用户管理&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;计划任务&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;多语言支持（0.4.18版支持繁体中文）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;基于DNS-SD(Apple’s protocol)的服务公告&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;插件系统&lt;/p&gt;&lt;p&gt;下面介绍如何在Debian上安装配置 OpenMediaVault：&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;#更新
apt-get&amp;nbsp;update
apt-get&amp;nbsp;upgrade&lt;/pre&gt;&lt;p&gt;编辑软件源&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;vim&amp;nbsp;/etc/apt/sources.list
#添加debian&amp;nbsp;10系统&amp;nbsp;软件源
deb&amp;nbsp;https://packages.openmediavault.org/public&amp;nbsp;usul&amp;nbsp;main
#检查&amp;nbsp;debian系统，如果是debian9则是&amp;nbsp;deb&amp;nbsp;https://packages.openmediavault.org/public&amp;nbsp;arrakis&amp;nbsp;main&lt;/pre&gt;&lt;p&gt;其他版本的系统需要参考官方文档：https://openmediavault.readthedocs.io/en/stable/releases.html。（需要注意的是Codename需要小写）&lt;/p&gt;&lt;p&gt;添加保存完毕：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;apt-get&amp;nbsp;update&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;如果出现以下错误：&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;The&amp;nbsp;following&amp;nbsp;signatures&amp;nbsp;couldn&amp;#39;t&amp;nbsp;be&amp;nbsp;verified&amp;nbsp;because&amp;nbsp;the&amp;nbsp;public&amp;nbsp;key&amp;nbsp;is&amp;nbsp;not&amp;nbsp;available:&amp;nbsp;NO_PUBKEY&amp;nbsp;7E7A6C592EF35D13&amp;nbsp;NO_PUBKEY&amp;nbsp;24863F0C716B980B&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;则需要执行：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;apt-key&amp;nbsp;adv&amp;nbsp;--recv-keys&amp;nbsp;--keyserver&amp;nbsp;keyserver.ubuntu.com&amp;nbsp;7E7A6C592EF35D13
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;apt-key&amp;nbsp;adv&amp;nbsp;--recv-keys&amp;nbsp;--keyserver&amp;nbsp;keyserver.ubuntu.com&amp;nbsp;24863F0C716B980B&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;如果执行以上代码添加密钥出现错误：E: gnupg, gnupg2 and gnupg1 do not seem to be installed, but one of them is required for this operation，则需要安装gnupg。&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;apt-get&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;gnupg
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;apt-get&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;gnupg1
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;apt-get&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;gnupg2&lt;/pre&gt;&lt;p&gt;安装：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;apt-get&amp;nbsp;install&amp;nbsp;openmediavault-keyring&amp;nbsp;postfix
apt-get&amp;nbsp;install&amp;nbsp;openmediavault&amp;nbsp;-y&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;如果出现mask等错误：&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Failed&amp;nbsp;to&amp;nbsp;restart&amp;nbsp;lvm2-lvmpolld.service:&amp;nbsp;Unit&amp;nbsp;lvm2-lvmpolld.socket&amp;nbsp;is&amp;nbsp;masked&lt;/pre&gt;&lt;p&gt;执行：&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;systemctl&amp;nbsp;unmask&amp;nbsp;lvm2-lvmpolld.socket&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;安装时间会有点长，耐心等待几分钟，待安装完成后输入以下命令初始化OMV（debian10无须执行）&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;omv-initsystem&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;OMV的命令行界面配置面板&lt;/p&gt;&lt;pre class=&quot;brush:bash;toolbar:false&quot;&gt;omv-firstaid&lt;/pre&gt;&lt;p&gt;默认的用户：admin，密码：openmediavault&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 13 Dec 2019 11:05:43 +0800</pubDate></item></channel></rss><!--77.24 ms , 10 query , 4861kb memory , 0 error-->