<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://punkmonday.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://punkmonday.github.io/" rel="alternate" type="text/html" hreflang="zh-CN" /><updated>2026-10-05T11:06:38+00:00</updated><id>https://punkmonday.github.io/feed.xml</id><title type="html">punkmonday’s blog</title><subtitle>punkmonday 的技术博客 — Java、Spring、Docker、Linux 与折腾笔记</subtitle><author><name>punkmonday</name></author><entry><title type="html">Datawindow</title><link href="https://punkmonday.github.io/2024/06/datawindow/" rel="alternate" type="text/html" title="Datawindow" /><published>2024-06-07T00:00:00+00:00</published><updated>2024-06-07T00:00:00+00:00</updated><id>https://punkmonday.github.io/2024/06/datawindow</id><content type="html" xml:base="https://punkmonday.github.io/2024/06/datawindow/"><![CDATA[<h2 id="如何使用工具datawindow25">如何使用工具DataWindow2.5</h2>

<p>###前置条件: 安装好对应的datawindow版本</p>

<p>如果只有pbl文件，先新建一个project,导入pbl文件，然后再导出srd文件,打开srd文件，查看源码，能看到里面的sql</p>]]></content><author><name>punkmonday</name></author><summary type="html"><![CDATA[如何使用工具DataWindow2.5]]></summary></entry><entry><title type="html">Agk Health</title><link href="https://punkmonday.github.io/2021/09/agk-health/" rel="alternate" type="text/html" title="Agk Health" /><published>2021-09-30T00:00:00+00:00</published><updated>2021-09-30T00:00:00+00:00</updated><id>https://punkmonday.github.io/2021/09/agk-health</id><content type="html" xml:base="https://punkmonday.github.io/2021/09/agk-health/"><![CDATA[<h1 id="安高科健康码接口文档">安高科健康码接口文档</h1>
<h2 id="1-简介">1 简介</h2>
<h3 id="11-概述">1.1 概述</h3>

<p>本⽂档主要描述接⼝规范。</p>

<p>闸机通⾏需要⽤到的接⼝：<strong>健康码解码接⼝</strong>，调⽤后可以查询当前群众的健康码状态。</p>

<h3 id="12--术语表">1.2  术语表</h3>

<table>
  <thead>
    <tr>
      <th>术语</th>
      <th>说明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>API_ROOT</td>
      <td>http://52.130.80.202:12700/center/api</td>
    </tr>
  </tbody>
</table>

<h2 id="2-api概览">2 API概览</h2>
<h3 id="21-相关接口">2.1 相关接口</h3>

<table>
  <thead>
    <tr>
      <th>接口名称</th>
      <th>路径</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>获取健康码</td>
      <td><API_ROOT>/health/code</API_ROOT></td>
    </tr>
    <tr>
      <td>健康码解码接口</td>
      <td><API_ROOT>/health/decode</API_ROOT></td>
    </tr>
  </tbody>
</table>

<h2 id="3--开发指引">3  开发指引</h2>
<h3 id="31-配置信息">3.1 配置信息</h3>

<p>请联系对接人员获取</p>

<ul>
  <li>appId</li>
  <li>secretKey</li>
</ul>

<h3 id="32--接入流程">3.2  接入流程</h3>

<p>sign需要加密,加密java参考:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    @Test
    public void centerFaceIdApiCompare() throws InterruptedException {
        for (int i=0;i&lt;2;i++){
            String url = "http://localhost:8080/center/api/live/compare";
            TreeMap&lt;String, Object&gt; params = new TreeMap&lt;&gt;();
            params.put("appId", "appId");
            params.put("secretKey", "secretkey");
            params.put("timestamp", String.valueOf(System.currentTimeMillis()));
            if(i==0){
                params.put("code",centerFaceIdApiCode());
                params.put("type",0);
            }else{
                params.put("code",centerFaceIdApiActionSequence());
                params.put("type",1);
            }
            params.put("sign", sign(params));
            //加图片
            params.put("image",FileUtil.file("E:\\zyh.jpg"));
            //加视频
            params.put("video",FileUtil.file("E:\\zyh.mp4"));
            String s = HttpUtil.post(url, params);
            System.out.println(s);
            Thread.sleep(60000);
        }
    }

	private static String sign(Map&lt;String, Object&gt; params) {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry&lt;String, Object&gt; entry : params.entrySet()) {
            sb.append(entry.getKey());
            sb.append("=");
            sb.append(entry.getValue());
            sb.append("&amp;");
        }
        return DigestUtils.sha256Hex(sb.toString()
        .substring(0, sb.toString().length() - 1)).toUpperCase();
    }
</code></pre></div></div>

<h3 id="33--省市区编码">3.3  省市区编码</h3>
<p>采⽤2020省市区国标编码</p>
<h3 id="34--证件类型编码">3.4  证件类型编码</h3>
<p>| 证件类型编码 | 证件类型名称 |
|  —-  | —-  |
|  10  | 居民身份证  |
| 14 | 港澳居民来往内地通行证 |
| 15 | 台湾居民来往大陆通行证 |
| 16 | 一次性台湾居民来往大陆通行证 |
| 20 | 护照 |
| 34 | 外国人永久居留证 |
| 99 | 其他 |</p>

<h2 id="4--接口列表">4  接口列表</h2>
<h3 id="41--获取健康码">4.1  获取健康码</h3>
<p>接口地址</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;API_ROOT&gt;/health/code
</code></pre></div></div>
<p>请求方式</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>post
</code></pre></div></div>
<p>请求参数</p>

<table>
  <thead>
    <tr>
      <th>字段</th>
      <th>必填</th>
      <th>类型</th>
      <th>描述</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>appId</td>
      <td>是</td>
      <td>String</td>
      <td>appId</td>
    </tr>
    <tr>
      <td>secretKey</td>
      <td>是</td>
      <td>String</td>
      <td>secretKey</td>
    </tr>
    <tr>
      <td>sign</td>
      <td>是</td>
      <td>String</td>
      <td>sign</td>
    </tr>
    <tr>
      <td>timestamp</td>
      <td>是</td>
      <td>String</td>
      <td>时间戳</td>
    </tr>
    <tr>
      <td>certificate_id</td>
      <td>是</td>
      <td>String</td>
      <td>证件号</td>
    </tr>
    <tr>
      <td>certificate_type</td>
      <td>是</td>
      <td>String</td>
      <td>参见3.4证件类型编码</td>
    </tr>
    <tr>
      <td>name</td>
      <td>是</td>
      <td>String</td>
      <td>姓名</td>
    </tr>
  </tbody>
</table>

<p>返回结果</p>

<table>
  <thead>
    <tr>
      <th>参数名</th>
      <th>必 选</th>
      <th>类型</th>
      <th>范 围</th>
      <th>说明</th>
      <th>字典</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>report_date</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>申报时间,为空则没有申报过</td>
      <td> </td>
    </tr>
    <tr>
      <td>report_valid_date</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>申报信息有效期时间 YYYY-MM-DD HH:mm:ss</td>
      <td> </td>
    </tr>
    <tr>
      <td>report_expired</td>
      <td>是</td>
      <td>Bool</td>
      <td> </td>
      <td>申报是否过期</td>
      <td> </td>
    </tr>
    <tr>
      <td>risk_assessment_grade</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>健康码⻛险等级</td>
      <td>00 绿码 01 ⻩码 10 红 码</td>
    </tr>
    <tr>
      <td>reason</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>⻛险等级原因（⻩、红码）</td>
      <td> </td>
    </tr>
    <tr>
      <td>guide</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>⻛险等级引导建议</td>
      <td> </td>
    </tr>
    <tr>
      <td>code_content</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>健康码字符串(⽤于显⽰⼆维码)</td>
      <td> </td>
    </tr>
    <tr>
      <td>code_expire_time</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>码失效时间 YYYY-MM-DD HH:mm:ss</td>
      <td> </td>
    </tr>
  </tbody>
</table>

<h3 id="42--健康码解码接">4.2  健康码解码接⼝</h3>

<p>接口地址</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;API_ROOT&gt;/health/decode
</code></pre></div></div>

<p>请求方式</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>post
</code></pre></div></div>

<p>请求参数</p>

<table>
  <thead>
    <tr>
      <th>字段</th>
      <th>必填</th>
      <th>类型</th>
      <th>描述</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>appId</td>
      <td>是</td>
      <td>String</td>
      <td>appId</td>
    </tr>
    <tr>
      <td>secretKey</td>
      <td>是</td>
      <td>String</td>
      <td>secretKey</td>
    </tr>
    <tr>
      <td>sign</td>
      <td>是</td>
      <td>String</td>
      <td>sign</td>
    </tr>
    <tr>
      <td>timestamp</td>
      <td>是</td>
      <td>String</td>
      <td>时间戳</td>
    </tr>
    <tr>
      <td>code_content</td>
      <td>是</td>
      <td>String</td>
      <td>健康码码串</td>
    </tr>
  </tbody>
</table>

<p>返回结果</p>

<table>
  <thead>
    <tr>
      <th>参数名</th>
      <th>必 选</th>
      <th>类型</th>
      <th>范 围</th>
      <th>说明</th>
      <th>字典</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>name</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>脱敏的字符串</td>
      <td> </td>
    </tr>
    <tr>
      <td>phone</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>脱敏的字符串</td>
      <td> </td>
    </tr>
    <tr>
      <td>certificate_id</td>
      <td>是</td>
      <td>Bool</td>
      <td> </td>
      <td>脱敏的字符串</td>
      <td> </td>
    </tr>
    <tr>
      <td>certificate_type</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td> </td>
      <td>参见3.4证件类型编码</td>
    </tr>
    <tr>
      <td>risk_assessment_grade</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>⻛险等级</td>
      <td>00绿码 01 ⻩码 10 红 码</td>
    </tr>
    <tr>
      <td>reason</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>⻛险等级原因（⻩、红码）</td>
      <td> </td>
    </tr>
    <tr>
      <td>guide</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>⻛险等级引导建议</td>
      <td> </td>
    </tr>
    <tr>
      <td>report_date</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>申报时间,为空则没有申报过</td>
      <td> </td>
    </tr>
    <tr>
      <td>report_valid_date</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>申报信息有效期时间 YYYY-MM-DD HH:mm:ss</td>
      <td> </td>
    </tr>
    <tr>
      <td>report_expired</td>
      <td>是</td>
      <td>Boolean</td>
      <td> </td>
      <td>申报或打卡是否过期</td>
      <td> </td>
    </tr>
    <tr>
      <td>certificate_token</td>
      <td>是</td>
      <td>String</td>
      <td> </td>
      <td>加密后的报⽂</td>
      <td> </td>
    </tr>
  </tbody>
</table>

<p>健康码过期返回结果</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{
 "errcode": 0,
 "errmsg": "SUCCESS",
 "data": {
   "qrcode_expired": true, // 健康码是否过期
     "report_expired": false // 申报状态是否过期
 }
}
</code></pre></div></div>]]></content><author><name>punkmonday</name></author><summary type="html"><![CDATA[安高科健康码接口文档 1 简介 1.1 概述]]></summary></entry><entry><title type="html">nginx内网转发rocketmq sendDefaultImpl timeout</title><link href="https://punkmonday.github.io/2021/07/nginx-rocketmq/" rel="alternate" type="text/html" title="nginx内网转发rocketmq sendDefaultImpl timeout" /><published>2021-07-05T00:00:00+00:00</published><updated>2021-07-05T00:00:00+00:00</updated><id>https://punkmonday.github.io/2021/07/nginx-rocketmq</id><content type="html" xml:base="https://punkmonday.github.io/2021/07/nginx-rocketmq/"><![CDATA[<h2 id="nginx转发内网docker-rocketmq-senddefaultimpl-call-timeout">nginx转发内网Docker rocketmq sendDefaultImpl call timeout</h2>

<h3 id="问题描述">问题描述</h3>

<p>主要原因是内网的rocketmq无法和客户端通信导致的,公司外网服务器只允许开放的端口号12000-13000,而rocketmq默认端口号10911不在范围内,需要改为12xxx-13000,并且nginx的转发的端口也要保持一致,既nginx到docker 12021(nginx) -&gt; 12021(主机) -&gt; 12021(docker),还有rocketmq的fastRemoting模式端口是listenPort - 2 也必须转发出去</p>

<h3 id="操作步骤">操作步骤</h3>

<p>本文docker部署脚本使用<a href="https://github.com/foxiswho/docker-rocketmq">foxiswho / docker-rocketmq</a></p>

<ol>
  <li>修改/rmq/rmq/brokerconf/broker.conf, brokerIP1改为外网地址, listenPort改为12021</li>
  <li>修改docker-comopse.yml,broker端口映射 12019:12019 12021:12021</li>
  <li>docker-compose down, 从新运行start.sh</li>
  <li>ngin修改转发stream端口 12021 -&gt; 12021  12019 -&gt; 12019</li>
</ol>

<h3 id="参考脚本">参考脚本</h3>

<p>docker-copose.yml</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>version: '3.5'

services:
  rmqnamesrv:
    image: foxiswho/rocketmq:4.8.0
#    image: registry.cn-hangzhou.aliyuncs.com/foxiswho/rocketmq:4.7.0
    container_name: rmqnamesrv
    ports:
      - 9876:9876
    volumes:
      - ./rmqs/logs:/home/rocketmq/logs
      - ./rmqs/store:/home/rocketmq/store
    environment:
      JAVA_OPT_EXT: "-Duser.home=/home/rocketmq -Xms512M -Xmx512M -Xmn128m"
    command: ["sh","mqnamesrv"]
    networks:
        rmq:
          aliases:
            - rmqnamesrv
  rmqbroker:
    image: foxiswho/rocketmq:4.8.0
#    image: registry.cn-hangzhou.aliyuncs.com/foxiswho/rocketmq:4.7.0
    container_name: rmqbroker
    ports:
      - 12019:12019
      - 12021:12021
    volumes:
      - ./rmq/logs:/home/rocketmq/logs
      - ./rmq/store:/home/rocketmq/store
      - ./rmq/brokerconf/broker.conf:/etc/rocketmq/broker.conf
    environment:
        JAVA_OPT_EXT: "-Duser.home=/home/rocketmq -Xms512M -Xmx512M -Xmn128m"
    command: ["sh","mqbroker","-c","/etc/rocketmq/broker.conf","-n","rmqnamesrv:9876","autoCreateTopicEnable=true"]
    depends_on:
      - rmqnamesrv
    networks:
      rmq:
        aliases:
          - rmqbroker

  rmqconsole:
    image: styletang/rocketmq-console-ng
    container_name: rmqconsole
    ports:
      - 8180:8080
    environment:
        JAVA_OPTS: "-Drocketmq.namesrv.addr=rmqnamesrv:9876 -Dcom.rocketmq.sendMessageWithVIPChannel=false"
    depends_on:
      - rmqnamesrv
    networks:
      rmq:
        aliases:
          - rmqconsole

networks:
  rmq:
    name: rmq
    driver: bridge
</code></pre></div></div>

<p>broker.conf</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.


#所属集群名字
brokerClusterName=DefaultCluster

#broker名字，注意此处不同的配置文件填写的不一样，如果在broker-a.properties使用:broker-a,
#在broker-b.properties使用:broker-b
brokerName=broker-a

#0 表示Master，&gt;0 表示Slave
brokerId=0

#nameServer地址，分号分割
#namesrvAddr=rocketmq-nameserver1:9876;rocketmq-nameserver2:9876
namesrvAddr=rmqnamesrv:9876

#启动IP,如果 docker 报 com.alibaba.rocketmq.remoting.exception.RemotingConnectException: connect to &lt;192.168.0.120:10909&gt; failed
# 解决方式1 加上一句producer.setVipChannelEnabled(false);，解决方式2 brokerIP1 设置宿主机IP，不要使用docker 内部IP
brokerIP1=10.10.13.68

#在发送消息时，自动创建服务器不存在的topic，默认创建的队列数
defaultTopicQueueNums=4

#是否允许 Broker 自动创建Topic，建议线下开启，线上关闭 ！！！这里仔细看是false，false，false
#原因下篇博客见~ 哈哈哈哈
autoCreateTopicEnable=true

#是否允许 Broker 自动创建订阅组，建议线下开启，线上关闭
autoCreateSubscriptionGroup=true

#Broker 对外服务的监听端口
listenPort=12021

#删除文件时间点，默认凌晨4点
deleteWhen=04

#文件保留时间，默认48小时
fileReservedTime=120

#commitLog每个文件的大小默认1G
mapedFileSizeCommitLog=1073741824

#ConsumeQueue每个文件默认存30W条，根据业务情况调整
mapedFileSizeConsumeQueue=300000

#destroyMapedFileIntervalForcibly=120000
#redeleteHangedFileInterval=120000
#检测物理文件磁盘空间
diskMaxUsedSpaceRatio=88
#存储路径
#storePathRootDir=/home/ztztdata/rocketmq-all-4.1.0-incubating/store
#commitLog 存储路径
#storePathCommitLog=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/commitlog
#消费队列存储
#storePathConsumeQueue=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/consumequeue
#消息索引存储路径
#storePathIndex=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/index
#checkpoint 文件存储路径
#storeCheckpoint=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/checkpoint
#abort 文件存储路径
#abortFile=/home/ztztdata/rocketmq-all-4.1.0-incubating/store/abort
#限制的消息大小
maxMessageSize=65536

#flushCommitLogLeastPages=4
#flushConsumeQueueLeastPages=2
#flushCommitLogThoroughInterval=10000
#flushConsumeQueueThoroughInterval=60000

#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=ASYNC_MASTER

#刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=ASYNC_FLUSH

#发消息线程池数量
#sendMessageThreadPoolNums=128
#拉消息线程池数量
#pullMessageThreadPoolNums=128

</code></pre></div></div>

<p>nginx</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    upstream mq9876 {
        server 10.2.0.4:9876 weight=5 max_fails=3 fail_timeout=30s;
    }
    server {
        listen 12006;
        proxy_pass mq9876;
        proxy_timeout 600s;
        proxy_connect_timeout 30s;
    }
    upstream mq12021 {
        server 10.2.0.4:12021 weight=5 max_fails=3 fail_timeout=30s;
    }
    server {
        listen 12021;
        proxy_pass mq12021;
        proxy_timeout 600s;
        proxy_connect_timeout 30s;
    }
    upstream mq12019 {
        server 10.2.0.4:12019 weight=5 max_fails=3 fail_timeout=30s;
    }
    server {
        listen 12019;
        proxy_pass mq12019;
        proxy_timeout 600s;
        proxy_connect_timeout 30s;
    
</code></pre></div></div>]]></content><author><name>punkmonday</name></author><category term="java" /><category term="java" /><summary type="html"><![CDATA[nginx转发内网Docker rocketmq sendDefaultImpl call timeout]]></summary></entry><entry><title type="html">Springboot Controller 返回字符串类型叠加双引号的处理办法</title><link href="https://punkmonday.github.io/2020/11/response-string/" rel="alternate" type="text/html" title="Springboot Controller 返回字符串类型叠加双引号的处理办法" /><published>2020-11-11T00:00:00+00:00</published><updated>2020-11-11T00:00:00+00:00</updated><id>https://punkmonday.github.io/2020/11/response-string</id><content type="html" xml:base="https://punkmonday.github.io/2020/11/response-string/"><![CDATA[<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@GetMapping("/sayHello")
public String sayHello(String char){
	return "hello"
}
</code></pre></div></div>

<p>返回的数据会叠加”“转义为<code class="language-plaintext highlighter-rouge">"\"hello\""</code>,处理方法：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@GetMapping(value="/sayHello",produces = "text/plain;charset=utf-8")
public String sayHello(String char){
	return "hello"
}
</code></pre></div></div>]]></content><author><name>punkmonday</name></author><category term="java" /><category term="java" /><summary type="html"><![CDATA[@GetMapping("/sayHello") public String sayHello(String char){ return "hello" }]]></summary></entry><entry><title type="html">sql映射vo注意事项</title><link href="https://punkmonday.github.io/2020/06/sqlToJpa/" rel="alternate" type="text/html" title="sql映射vo注意事项" /><published>2020-06-04T00:00:00+00:00</published><updated>2020-06-04T00:00:00+00:00</updated><id>https://punkmonday.github.io/2020/06/sqlToJpa</id><content type="html" xml:base="https://punkmonday.github.io/2020/06/sqlToJpa/"><![CDATA[<p>sql映射到vo，<code class="language-plaintext highlighter-rouge">count as</code>需要映射为<code class="language-plaintext highlighter-rouge">BigInteger</code>，否则会报错</p>

<p>示例：
sql</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> select s.user_id as userId, s.user_name as userName,s.user_photo as userPhoto, count(1) as score from voluntary_activity_signup s where s.is_apply= 0 and s.delete_flag = 0 group by s.user_id order by score desc
</code></pre></div></div>

<p>对应的class</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@Data
public class InfoT {
    private String userName;
    private String userId;
    private String userPhoto;
    private BigInteger score;
}
</code></pre></div></div>

<p>源码是如何处理的</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> Query q = em.createNativeQuery(sql);
        q.unwrap(SQLQuery.class).setResultTransformer(Transformers.aliasToBean(clazz));
        List resultList = q.getResultList();
        return resultList;
</code></pre></div></div>

<p>参考</p>

<p><a href="https://blog.csdn.net/richerg85/article/details/41745819" title=" Hibernate对原生sql处理及结果集和VO的映射"> Hibernate对原生sql处理及结果集和VO的映射</a></p>]]></content><author><name>punkmonday</name></author><category term="java" /><category term="jpa" /><summary type="html"><![CDATA[sql映射到vo，count as需要映射为BigInteger，否则会报错]]></summary></entry><entry><title type="html">单机使用docker-machine搭建docker集群</title><link href="https://punkmonday.github.io/2018/06/docker-swarm/" rel="alternate" type="text/html" title="单机使用docker-machine搭建docker集群" /><published>2018-06-21T00:00:00+00:00</published><updated>2018-06-21T00:00:00+00:00</updated><id>https://punkmonday.github.io/2018/06/docker-swarm</id><content type="html" xml:base="https://punkmonday.github.io/2018/06/docker-swarm/"><![CDATA[<h2 id="安装docker">安装docker</h2>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>dnf remove docker <span class="se">\</span>
                  docker-client <span class="se">\</span>
                  docker-client-latest <span class="se">\</span>
                  docker-common <span class="se">\</span>
                  docker-latest <span class="se">\</span>
                  docker-latest-logrotate <span class="se">\</span>
                  docker-logrotate <span class="se">\</span>
                  docker-selinux <span class="se">\</span>
                  docker-engine-selinux <span class="se">\</span>
                  docker-engine
                  
<span class="nv">$ </span><span class="nb">sudo </span>dnf <span class="nt">-y</span> <span class="nb">install </span>dnf-plugins-core
<span class="nv">$ </span><span class="nb">sudo </span>dnf config-manager <span class="se">\</span>
    <span class="nt">--add-repo</span> <span class="se">\</span>
    https://download.docker.com/linux/fedora/docker-ce.repo
<span class="nv">$ </span><span class="nb">sudo </span>dnf <span class="nb">install </span>docker-ce
<span class="nv">$ </span>dnf list docker-ce  <span class="nt">--showduplicates</span> | <span class="nb">sort</span> <span class="nt">-r</span>
<span class="nv">$ </span><span class="nb">sudo </span>systemctl start docker
<span class="nv">$ </span><span class="nb">sudo </span>docker run hello-world
</code></pre></div></div>

<p>使用脚本安装</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>curl <span class="nt">-fsSL</span> get.docker.com <span class="nt">-o</span> get-docker.sh
<span class="nv">$ </span><span class="nb">sudo </span>sh get-docker.sh
</code></pre></div></div>

<p>卸载</p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sudo </span>dnf remove docker-ce

Images, containers, volumes, or customized configuration files on your host are not automatically removed. To delete all images, containers, and volumes:

<span class="nv">$ </span><span class="nb">sudo rm</span> <span class="nt">-rf</span> /var/lib/docker


</code></pre></div></div>

<h2 id="安装docker-machine">安装docker-machine</h2>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ base</span><span class="o">=</span>https://github.com/docker/machine/releases/download/v0.14.0 <span class="o">&amp;&amp;</span>
  curl <span class="nt">-L</span> <span class="nv">$base</span>/docker-machine-<span class="si">$(</span><span class="nb">uname</span> <span class="nt">-s</span><span class="si">)</span>-<span class="si">$(</span><span class="nb">uname</span> <span class="nt">-m</span><span class="si">)</span> <span class="o">&gt;</span>/tmp/docker-machine <span class="o">&amp;&amp;</span>
  <span class="nb">sudo install</span> /tmp/docker-machine /usr/local/bin/docker-machine
<span class="nv">$ </span>docker-machine <span class="nt">-v</span>

</code></pre></div></div>

<h2 id="安装kvm-driver">安装kvm driver</h2>

<p><a href="https://github.com/dhiltgen/docker-machine-kvm/releases" title="docker-machine-kvm">docker-machine-kvm</a></p>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl <span class="nt">-L</span> https://github.com/dhiltgen/docker-machine-kvm/releases/download/v0.10.0/docker-machine-driver-kvm-centos7 <span class="o">&gt;</span> /usr/local/bin/docker-machine-driver-kvm <span class="se">\ </span>
  <span class="nb">chmod</span> +x /usr/local/bin/docker-machine-driver-kvm
</code></pre></div></div>

<h2 id="组装集群">组装集群</h2>

<div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>docker-machine create <span class="nt">-d</span> kvm master
docker-machine create <span class="nt">-d</span> kvm slave1
docker-machine create <span class="nt">-d</span> kvm slave2
docker-machine create <span class="nt">-d</span> kvm slave3

docker-machine ssh master 
//初始化 master节点为manager
docker swarm init <span class="nt">--advertise-addr</span> 192.168.99.100
//分别进入slave节点,加入master
docker swarm <span class="nb">join</span> <span class="nt">--token</span> SWMTKN-1-1uzft9zcrd5cl7eva4gr4ptgrs1gc252483ey19xfphcuxc8ta-evsmmj7b7kleh7yoezjutzuu2 192.168.99.100:2377
//进入master节点,查看node
docker node <span class="nb">ls</span> 
//创建服务
docker service create <span class="nt">--replicas</span> 2 <span class="nt">-d</span> <span class="nt">-p</span> 8080:80 <span class="nt">--name</span> mynginx registry.docker-cn.com/library/nginx
//查看创建的服务
docker service <span class="nb">ls
</span>docker service ps mynginx
//使用浏览器可以查看到各个节点上的nginx,表示集群安装完成
//服务扩容为3个实例
docker service scale <span class="nv">mynginx</span><span class="o">=</span>3
</code></pre></div></div>]]></content><author><name>punkmonday</name></author><category term="docker" /><category term="docker" /><summary type="html"><![CDATA[安装docker]]></summary></entry><entry><title type="html">fedora28安装nvidia显卡驱动</title><link href="https://punkmonday.github.io/2018/05/fedora28-nvidia/" rel="alternate" type="text/html" title="fedora28安装nvidia显卡驱动" /><published>2018-05-22T00:00:00+00:00</published><updated>2018-05-22T00:00:00+00:00</updated><id>https://punkmonday.github.io/2018/05/fedora28-nvidia</id><content type="html" xml:base="https://punkmonday.github.io/2018/05/fedora28-nvidia/"><![CDATA[<p><a href="https://www.if-not-true-then-false.com/2015/fedora-nvidia-guide/" title="fedora-nvidia-guide">fedora-nvidia-guide</a></p>

<p>查看显卡驱动信息：</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nvidia-smi
<span class="nb">cat</span> /proc/driver/nvidia/version
</code></pre></div></div>]]></content><author><name>punkmonday</name></author><category term="linux" /><category term="linux" /><summary type="html"><![CDATA[fedora-nvidia-guide]]></summary></entry><entry><title type="html">mysql drop database 带横杠 失败</title><link href="https://punkmonday.github.io/2018/03/mysql-hyphen/" rel="alternate" type="text/html" title="mysql drop database 带横杠 失败" /><published>2018-03-22T00:00:00+00:00</published><updated>2018-03-22T00:00:00+00:00</updated><id>https://punkmonday.github.io/2018/03/mysql-hyphen</id><content type="html" xml:base="https://punkmonday.github.io/2018/03/mysql-hyphen/"><![CDATA[<p>加`符号</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>drop database `test-database`;
</code></pre></div></div>]]></content><author><name>punkmonday</name></author><category term="java" /><category term="java" /><summary type="html"><![CDATA[加`符号]]></summary></entry><entry><title type="html">大架构的模型穿越</title><link href="https://punkmonday.github.io/2017/12/Bounded-Context/" rel="alternate" type="text/html" title="大架构的模型穿越" /><published>2017-12-07T00:00:00+00:00</published><updated>2017-12-07T00:00:00+00:00</updated><id>https://punkmonday.github.io/2017/12/Bounded-Context</id><content type="html" xml:base="https://punkmonday.github.io/2017/12/Bounded-Context/"><![CDATA[<p>不同的上下文(context)模型协作，举个例子，就类似一个用户账号（userID),在不同的游戏场景play,进入中世纪，同样的user，扮演的是一个骑士(类型class)，进入未来世界，同样的user，扮演的是机器人，那么在边界之间该如何穿越呢，这里就在进入不同的时空隧道时，给一个函数入口F(String userID),通过这个函数，就进入到了不同的世界，这就需要设计师在设计接口的时候统一留一个标识作为USER的记录，单体结构下可以就是一个字符串，微服务就是一个RESTFUL接口，最终都是将这个userID变为自己边界内的一个领域模型（在中世纪领域，是骑士，在未来世界，是机器人）来完成不同领域的业务逻辑（PLAY）</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//一个应用服务，把传递过来的anAuthorId转变为Forum领域的Author</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">ForumApplicationService</span> <span class="o">{</span> 
	<span class="kd">public</span> <span class="kt">void</span> <span class="nf">startExclusiveForumWithDiscussion</span><span class="o">(</span>
            <span class="nc">String</span> <span class="n">aTenantId</span><span class="o">,</span>
            <span class="nc">String</span> <span class="n">anExclusiveOwner</span><span class="o">,</span>
            <span class="nc">String</span> <span class="n">aCreatorId</span><span class="o">,</span>
            <span class="nc">String</span> <span class="n">aModeratorId</span><span class="o">,</span>
            <span class="nc">String</span> <span class="n">anAuthorId</span><span class="o">,</span>
            <span class="nc">String</span> <span class="n">aForumSubject</span><span class="o">,</span>
            <span class="nc">String</span> <span class="n">aForumDescription</span><span class="o">,</span>
            <span class="nc">String</span> <span class="n">aDiscussionSubject</span><span class="o">,</span>
            <span class="nc">ForumCommandResult</span> <span class="n">aResult</span><span class="o">)</span> <span class="o">{</span>
    	<span class="nc">Tenant</span> <span class="n">tenant</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Tenant</span><span class="o">(</span><span class="n">aTenantId</span><span class="o">);</span>

        <span class="nc">String</span> <span class="n">forumId</span> <span class="o">=</span>
                <span class="k">this</span><span class="o">.</span><span class="na">forumQueryService</span><span class="o">()</span>
                    <span class="o">.</span><span class="na">forumIdOfExclusiveOwner</span><span class="o">(</span>
                            <span class="n">aTenantId</span><span class="o">,</span>
                            <span class="n">anExclusiveOwner</span><span class="o">);</span>

        <span class="nc">Forum</span> <span class="n">forum</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>

        <span class="k">if</span> <span class="o">(</span><span class="n">forumId</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
            <span class="n">forum</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="na">forumRepository</span><span class="o">()</span>
                        <span class="o">.</span><span class="na">forumOfId</span><span class="o">(</span>
                                <span class="n">tenant</span><span class="o">,</span>
                                <span class="k">new</span> <span class="nf">ForumId</span><span class="o">(</span><span class="n">forumId</span><span class="o">));</span>
        <span class="o">}</span>
      
      <span class="k">if</span> <span class="o">(</span><span class="n">forum</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
            <span class="n">forum</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="na">startNewForum</span><span class="o">(</span>
                    <span class="n">tenant</span><span class="o">,</span>
                    <span class="n">aCreatorId</span><span class="o">,</span>
                    <span class="n">aModeratorId</span><span class="o">,</span>
                    <span class="n">aForumSubject</span><span class="o">,</span>
                    <span class="n">aForumDescription</span><span class="o">,</span>
                    <span class="n">anExclusiveOwner</span><span class="o">);</span>
        <span class="o">}</span>

        <span class="nc">String</span> <span class="n">discussionId</span> <span class="o">=</span>
                <span class="k">this</span><span class="o">.</span><span class="na">discussionQueryService</span><span class="o">()</span>
                    <span class="o">.</span><span class="na">discussionIdOfExclusiveOwner</span><span class="o">(</span>
                            <span class="n">aTenantId</span><span class="o">,</span>
                            <span class="n">anExclusiveOwner</span><span class="o">);</span>

        <span class="nc">Discussion</span> <span class="n">discussion</span> <span class="o">=</span> <span class="kc">null</span><span class="o">;</span>

        <span class="k">if</span> <span class="o">(</span><span class="n">discussionId</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
            <span class="n">discussion</span> <span class="o">=</span> <span class="k">this</span><span class="o">.</span><span class="na">discussionRepository</span><span class="o">()</span>
                             <span class="o">.</span><span class="na">discussionOfId</span><span class="o">(</span>
                                     <span class="n">tenant</span><span class="o">,</span>
                                     <span class="k">new</span> <span class="nf">DiscussionId</span><span class="o">(</span><span class="n">discussionId</span><span class="o">));</span>
        <span class="o">}</span>

        <span class="k">if</span> <span class="o">(</span><span class="n">discussion</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
            <span class="nc">Author</span> <span class="n">author</span> <span class="o">=</span>
                    <span class="k">this</span><span class="o">.</span><span class="na">collaboratorService</span><span class="o">().</span><span class="na">authorFrom</span><span class="o">(</span><span class="n">tenant</span><span class="o">,</span> <span class="n">anAuthorId</span><span class="o">);</span>
            <span class="n">discussion</span> <span class="o">=</span>
                    <span class="n">forum</span><span class="o">.</span><span class="na">startDiscussionFor</span><span class="o">(</span>
                            <span class="k">this</span><span class="o">.</span><span class="na">forumIdentityService</span><span class="o">(),</span>
                            <span class="n">author</span><span class="o">,</span>
                            <span class="n">aDiscussionSubject</span><span class="o">,</span>
                            <span class="n">anExclusiveOwner</span><span class="o">);</span>

            <span class="k">this</span><span class="o">.</span><span class="na">discussionRepository</span><span class="o">().</span><span class="na">save</span><span class="o">(</span><span class="n">discussion</span><span class="o">);</span>
        <span class="o">}</span>

        <span class="k">if</span> <span class="o">(</span><span class="n">aResult</span> <span class="o">!=</span> <span class="kc">null</span><span class="o">)</span> <span class="o">{</span>
            <span class="n">aResult</span><span class="o">.</span><span class="na">resultingForumId</span><span class="o">(</span><span class="n">forum</span><span class="o">.</span><span class="na">forumId</span><span class="o">().</span><span class="na">id</span><span class="o">());</span>
            <span class="n">aResult</span><span class="o">.</span><span class="na">resultingDiscussionId</span><span class="o">(</span><span class="n">discussion</span><span class="o">.</span><span class="na">discussionId</span><span class="o">().</span><span class="na">id</span><span class="o">());</span>
        <span class="o">}</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>]]></content><author><name>punkmonday</name></author><category term="ddd" /><category term="ddd" /><summary type="html"><![CDATA[不同的上下文(context)模型协作，举个例子，就类似一个用户账号（userID),在不同的游戏场景play,进入中世纪，同样的user，扮演的是一个骑士(类型class)，进入未来世界，同样的user，扮演的是机器人，那么在边界之间该如何穿越呢，这里就在进入不同的时空隧道时，给一个函数入口F(String userID),通过这个函数，就进入到了不同的世界，这就需要设计师在设计接口的时候统一留一个标识作为USER的记录，单体结构下可以就是一个字符串，微服务就是一个RESTFUL接口，最终都是将这个userID变为自己边界内的一个领域模型（在中世纪领域，是骑士，在未来世界，是机器人）来完成不同领域的业务逻辑（PLAY）]]></summary></entry><entry><title type="html">什么时候该AJAX,什么时候该跳转页面</title><link href="https://punkmonday.github.io/2017/12/Thinking-in-ajax/" rel="alternate" type="text/html" title="什么时候该AJAX,什么时候该跳转页面" /><published>2017-12-07T00:00:00+00:00</published><updated>2017-12-07T00:00:00+00:00</updated><id>https://punkmonday.github.io/2017/12/Thinking-in-ajax</id><content type="html" xml:base="https://punkmonday.github.io/2017/12/Thinking-in-ajax/"><![CDATA[<p>ajax主要做局部页面刷新,如果业务逻辑完成之后,不仅仅只是局部刷新,而是需要从新加载所有数据的时候,就跳转页面,从新加载一遍数据,目前的趋势是逐步改为Ajax单页应用,angular就是用来实现单页应用,不跳转页面,可以实现跨平台(PC,移动,平板)</p>]]></content><author><name>punkmonday</name></author><category term="java" /><category term="java" /><summary type="html"><![CDATA[ajax主要做局部页面刷新,如果业务逻辑完成之后,不仅仅只是局部刷新,而是需要从新加载所有数据的时候,就跳转页面,从新加载一遍数据,目前的趋势是逐步改为Ajax单页应用,angular就是用来实现单页应用,不跳转页面,可以实现跨平台(PC,移动,平板)]]></summary></entry></feed>