<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>小皮博客 | Xiaopi&#39;s Blog</title>
  
  <subtitle>没有人的梦想会更卑微,做点什么让自己骄傲</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://blog.xiaoyuyu.net/"/>
  <updated>2020-11-04T01:59:59.859Z</updated>
  <id>http://blog.xiaoyuyu.net/</id>
  
  <author>
    <name>盛领</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>112-【pki体系及安全策略】1-openssl及各类证书详解</title>
    <link href="http://blog.xiaoyuyu.net/post/45c4089e.html"/>
    <id>http://blog.xiaoyuyu.net/post/45c4089e.html</id>
    <published>2020-11-03T14:54:50.000Z</published>
    <updated>2020-11-04T01:59:59.859Z</updated>
    
    <content type="html"><![CDATA[<p>PKI(公钥基础设施)是一个包括硬件、软件、人员、策略和规程的集合，用来实现基于公钥密码体制的密钥和证书的产生、管理、存储、分发和撤销等功能。<br>本专题将系统的讲解整个体系。</p><a id="more"></a><h1 id="基本术语"><a href="#基本术语" class="headerlink" title="基本术语"></a>基本术语</h1><p>之后专门写一个章节来解释吧。</p><h1 id="详解"><a href="#详解" class="headerlink" title="详解"></a>详解</h1><h2 id="生成及查看rsa密钥"><a href="#生成及查看rsa密钥" class="headerlink" title="生成及查看rsa密钥"></a>生成及查看rsa密钥</h2><ul><li>openssl: 一个开源组织，配套做了一套开源的工具，囊括了主要的加密算法及周边的内容</li></ul><ol><li>下面的命令生成了一个“私钥密钥对”，这个key里面包含了公钥和私钥。<blockquote><p>openssl genpkey -algorithm rsa -out rsa_demo_001.key</p></blockquote></li></ol><ol start="2"><li>直接查看文件内容<blockquote><p>vim rsa_demo_001.key </p></blockquote></li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">-----BEGIN PRIVATE KEY-----</span><br><span class="line">MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDc+fOnG1mzB7v8</span><br><span class="line">qHONlgXjqPtdZ30Dso+xvwLwv+U4sAtqsuIZdqMYaoU71BNcSx/fIYo/ArtlkPfr</span><br><span class="line">Qg4QlGNflyB9ylcxKmAhgdt/5QrIPc6Pswkxaw4EVQhSsmw6gecx7fZxaE2Y+F6M</span><br><span class="line">TI8paTFy0c25OiztB1RLs39nBzQr7o1OA3opng3jO5XiTsgMQP1rVkjz3EZiduga</span><br><span class="line">AA7Xy5XVmisrZTL8pPaX50PjgBdF2GQ7FubJr6DU7Tr9sP6lXqSoIWnQ9IouDbLU</span><br><span class="line">4v4z7MXevIPMixsTkRfG4Qn0T86j4wtSvh/e255z42fkZCiMRjTMVmXFOb/0JCc7</span><br><span class="line">poashZYTAgMBAAECggEBAIqXHVBuH+jf7e/9elOPhuwM3HHtaQO7ptG02dRCljHi</span><br><span class="line">f5aQ0Ktls86paBxo2yekWj3oXDs+rGd773GWQRn25whZ0V/zWpIUYKxDNHZXIVcL</span><br><span class="line">JJUNlbNv0B+5cPnku2pKdMTk2Q6xexF4nFvj3Fn9hqzbluoX6XtTgHPmBP6KDxeJ</span><br><span class="line">YBdRlCke3Y3yMeo44LiiogMUIe1E7DVCzhn1GRFN8HHRMHFLmwJQLcr+wnOkjvz+</span><br><span class="line">6MYKuAcHriqihykNfS7DXruqfrWTuipTX3OcaemFYbeuu+KdtCOuiHszTnLml7/W</span><br><span class="line">7OO51qCXvJrHf6ibnPBoXWrgFt9It0+fWV3ICx0EzpkCgYEA/WMfCHO4YM2UJYPw</span><br><span class="line">QnkK1fibCP1FfX5ZGnC0m5q4M6mBW5pBeoLyonkpTGsqOgbLZjDTsqaHAyo3GAyK</span><br><span class="line">QZIHF51ruH5EfnLDTntUFZZ9CoTrWAea8ZYFke9x5zdBN5ssCQMYmLQVR3c4UvzY</span><br><span class="line">tsaJXL2LhBjErbCjdcRqWfehPt8CgYEA30FGKzPLg2M46cX/CWfEandLvTeZuLPk</span><br><span class="line">FXflrifGaPgDJbaSMHT+O0/WAUVVCC4xBjSkidVem39YlUhuGB/2lhwlvi17zHCS</span><br><span class="line">tawaJofNy7MaP/JYPN02iyGIcxNTBaH5wLFAVD+X81To2cwzcr5vruZkk+lcGTsi</span><br><span class="line">UQhpxCCo800CgYEAlDE5gB710Z/KKhq9FJNoM/Ye7iX6U0fm4uDRsEPPwV88aY+R</span><br><span class="line">Bg65yy4jai8u1hsNMGoUFeLxCXfSGv2SioDWJwiJbLBkbLO/6BGW/r0xykosviJM</span><br><span class="line">i0hbX5tzuW+Gc/gLzAWEiCKiY1almVuJf3Qj+BpfE1XNCWxKXWEPdiiupG8CgYEA</span><br><span class="line">xf7TxjjXQpzauqj4OFUo4usN5q/Kyv3vSALfVYa89hcOY4H5QLRhTCTPvKzKbsjY</span><br><span class="line">fZJuYjczAmD8JNjpmseuHw6zgmhAJN2pnykUwBssrn0WyKObEc92Mgn5Q2Vd+d7e</span><br><span class="line">6r/IN292yT0CjTYGYrr1vX1isbMCFPZWxtrZQjFc5PkCgYEA81fd5J8ZAWp+FCSV</span><br><span class="line">N2T5JNW7sbPAVMmtQYslxHsrzcbI1zWTM/gLVJU5KYmjJKFcu7GefqD0tPqVzJOI</span><br><span class="line">/xaeYOtPaUtY+UnleOrLMex5XftiajZ+eny2EgdbOXN9mhSnOLtYsAOFHHsNOKmK</span><br><span class="line">6xW4E2PEiRq/6CfhvcOXqfgF110=</span><br><span class="line">-----END PRIVATE KEY-----</span><br></pre></td></tr></table></figure><ol start="3"><li>查看其中的公钥和私钥。<blockquote><p>openssl rsa -in rsa_demo_001.key -text</p></blockquote></li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br></pre></td><td class="code"><pre><span class="line">Private-Key: (2048 bit)</span><br><span class="line">modulus:</span><br><span class="line">    00:dc:f9:f3:a7:1b:59:b3:07:bb:fc:a8:73:8d:96:</span><br><span class="line">    05:e3:a8:fb:5d:67:7d:03:b2:8f:b1:bf:02:f0:bf:</span><br><span class="line">    e5:38:b0:0b:6a:b2:e2:19:76:a3:18:6a:85:3b:d4:</span><br><span class="line">    13:5c:4b:1f:df:21:8a:3f:02:bb:65:90:f7:eb:42:</span><br><span class="line">    0e:10:94:63:5f:97:20:7d:ca:57:31:2a:60:21:81:</span><br><span class="line">    db:7f:e5:0a:c8:3d:ce:8f:b3:09:31:6b:0e:04:55:</span><br><span class="line">    08:52:b2:6c:3a:81:e7:31:ed:f6:71:68:4d:98:f8:</span><br><span class="line">    5e:8c:4c:8f:29:69:31:72:d1:cd:b9:3a:2c:ed:07:</span><br><span class="line">    54:4b:b3:7f:67:07:34:2b:ee:8d:4e:03:7a:29:9e:</span><br><span class="line">    0d:e3:3b:95:e2:4e:c8:0c:40:fd:6b:56:48:f3:dc:</span><br><span class="line">    46:62:76:e8:1a:00:0e:d7:cb:95:d5:9a:2b:2b:65:</span><br><span class="line">    32:fc:a4:f6:97:e7:43:e3:80:17:45:d8:64:3b:16:</span><br><span class="line">    e6:c9:af:a0:d4:ed:3a:fd:b0:fe:a5:5e:a4:a8:21:</span><br><span class="line">    69:d0:f4:8a:2e:0d:b2:d4:e2:fe:33:ec:c5:de:bc:</span><br><span class="line">    83:cc:8b:1b:13:91:17:c6:e1:09:f4:4f:ce:a3:e3:</span><br><span class="line">    0b:52:be:1f:de:db:9e:73:e3:67:e4:64:28:8c:46:</span><br><span class="line">    34:cc:56:65:c5:39:bf:f4:24:27:3b:a6:86:ac:85:</span><br><span class="line">    96:13</span><br><span class="line">publicExponent: 65537 (0x10001)</span><br><span class="line">privateExponent:</span><br><span class="line">    00:8a:97:1d:50:6e:1f:e8:df:ed:ef:fd:7a:53:8f:</span><br><span class="line">    86:ec:0c:dc:71:ed:69:03:bb:a6:d1:b4:d9:d4:42:</span><br><span class="line">    96:31:e2:7f:96:90:d0:ab:65:b3:ce:a9:68:1c:68:</span><br><span class="line">    db:27:a4:5a:3d:e8:5c:3b:3e:ac:67:7b:ef:71:96:</span><br><span class="line">    41:19:f6:e7:08:59:d1:5f:f3:5a:92:14:60:ac:43:</span><br><span class="line">    34:76:57:21:57:0b:24:95:0d:95:b3:6f:d0:1f:b9:</span><br><span class="line">    70:f9:e4:bb:6a:4a:74:c4:e4:d9:0e:b1:7b:11:78:</span><br><span class="line">    9c:5b:e3:dc:59:fd:86:ac:db:96:ea:17:e9:7b:53:</span><br><span class="line">    80:73:e6:04:fe:8a:0f:17:89:60:17:51:94:29:1e:</span><br><span class="line">    dd:8d:f2:31:ea:38:e0:b8:a2:a2:03:14:21:ed:44:</span><br><span class="line">    ec:35:42:ce:19:f5:19:11:4d:f0:71:d1:30:71:4b:</span><br><span class="line">    9b:02:50:2d:ca:fe:c2:73:a4:8e:fc:fe:e8:c6:0a:</span><br><span class="line">    b8:07:07:ae:2a:a2:87:29:0d:7d:2e:c3:5e:bb:aa:</span><br><span class="line">    7e:b5:93:ba:2a:53:5f:73:9c:69:e9:85:61:b7:ae:</span><br><span class="line">    bb:e2:9d:b4:23:ae:88:7b:33:4e:72:e6:97:bf:d6:</span><br><span class="line">    ec:e3:b9:d6:a0:97:bc:9a:c7:7f:a8:9b:9c:f0:68:</span><br><span class="line">    5d:6a:e0:16:df:48:b7:4f:9f:59:5d:c8:0b:1d:04:</span><br><span class="line">    ce:99</span><br><span class="line">prime1:</span><br><span class="line">    00:fd:63:1f:08:73:b8:60:cd:94:25:83:f0:42:79:</span><br><span class="line">    0a:d5:f8:9b:08:fd:45:7d:7e:59:1a:70:b4:9b:9a:</span><br><span class="line">    b8:33:a9:81:5b:9a:41:7a:82:f2:a2:79:29:4c:6b:</span><br><span class="line">    2a:3a:06:cb:66:30:d3:b2:a6:87:03:2a:37:18:0c:</span><br><span class="line">    8a:41:92:07:17:9d:6b:b8:7e:44:7e:72:c3:4e:7b:</span><br><span class="line">    54:15:96:7d:0a:84:eb:58:07:9a:f1:96:05:91:ef:</span><br><span class="line">    71:e7:37:41:37:9b:2c:09:03:18:98:b4:15:47:77:</span><br><span class="line">    38:52:fc:d8:b6:c6:89:5c:bd:8b:84:18:c4:ad:b0:</span><br><span class="line">    a3:75:c4:6a:59:f7:a1:3e:df</span><br><span class="line">prime2:</span><br><span class="line">    00:df:41:46:2b:33:cb:83:63:38:e9:c5:ff:09:67:</span><br><span class="line">    c4:6a:77:4b:bd:37:99:b8:b3:e4:15:77:e5:ae:27:</span><br><span class="line">    c6:68:f8:03:25:b6:92:30:74:fe:3b:4f:d6:01:45:</span><br><span class="line">    55:08:2e:31:06:34:a4:89:d5:5e:9b:7f:58:95:48:</span><br><span class="line">    6e:18:1f:f6:96:1c:25:be:2d:7b:cc:70:92:b5:ac:</span><br><span class="line">    1a:26:87:cd:cb:b3:1a:3f:f2:58:3c:dd:36:8b:21:</span><br><span class="line">    88:73:13:53:05:a1:f9:c0:b1:40:54:3f:97:f3:54:</span><br><span class="line">    e8:d9:cc:33:72:be:6f:ae:e6:64:93:e9:5c:19:3b:</span><br><span class="line">    22:51:08:69:c4:20:a8:f3:4d</span><br><span class="line">exponent1:</span><br><span class="line">    00:94:31:39:80:1e:f5:d1:9f:ca:2a:1a:bd:14:93:</span><br><span class="line">    68:33:f6:1e:ee:25:fa:53:47:e6:e2:e0:d1:b0:43:</span><br><span class="line">    cf:c1:5f:3c:69:8f:91:06:0e:b9:cb:2e:23:6a:2f:</span><br><span class="line">    2e:d6:1b:0d:30:6a:14:15:e2:f1:09:77:d2:1a:fd:</span><br><span class="line">    92:8a:80:d6:27:08:89:6c:b0:64:6c:b3:bf:e8:11:</span><br><span class="line">    96:fe:bd:31:ca:4a:2c:be:22:4c:8b:48:5b:5f:9b:</span><br><span class="line">    73:b9:6f:86:73:f8:0b:cc:05:84:88:22:a2:63:56:</span><br><span class="line">    a5:99:5b:89:7f:74:23:f8:1a:5f:13:55:cd:09:6c:</span><br><span class="line">    4a:5d:61:0f:76:28:ae:a4:6f</span><br><span class="line">exponent2:</span><br><span class="line">    00:c5:fe:d3:c6:38:d7:42:9c:da:ba:a8:f8:38:55:</span><br><span class="line">    28:e2:eb:0d:e6:af:ca:ca:fd:ef:48:02:df:55:86:</span><br><span class="line">    bc:f6:17:0e:63:81:f9:40:b4:61:4c:24:cf:bc:ac:</span><br><span class="line">    ca:6e:c8:d8:7d:92:6e:62:37:33:02:60:fc:24:d8:</span><br><span class="line">    e9:9a:c7:ae:1f:0e:b3:82:68:40:24:dd:a9:9f:29:</span><br><span class="line">    14:c0:1b:2c:ae:7d:16:c8:a3:9b:11:cf:76:32:09:</span><br><span class="line">    f9:43:65:5d:f9:de:de:ea:bf:c8:37:6f:76:c9:3d:</span><br><span class="line">    02:8d:36:06:62:ba:f5:bd:7d:62:b1:b3:02:14:f6:</span><br><span class="line">    56:c6:da:d9:42:31:5c:e4:f9</span><br><span class="line">coefficient:</span><br><span class="line">    00:f3:57:dd:e4:9f:19:01:6a:7e:14:24:95:37:64:</span><br><span class="line">    f9:24:d5:bb:b1:b3:c0:54:c9:ad:41:8b:25:c4:7b:</span><br><span class="line">    2b:cd:c6:c8:d7:35:93:33:f8:0b:54:95:39:29:89:</span><br><span class="line">    a3:24:a1:5c:bb:b1:9e:7e:a0:f4:b4:fa:95:cc:93:</span><br><span class="line">    88:ff:16:9e:60:eb:4f:69:4b:58:f9:49:e5:78:ea:</span><br><span class="line">    cb:31:ec:79:5d:fb:62:6a:36:7e:7a:7c:b6:12:07:</span><br><span class="line">    5b:39:73:7d:9a:14:a7:38:bb:58:b0:03:85:1c:7b:</span><br><span class="line">    0d:38:a9:8a:eb:15:b8:13:63:c4:89:1a:bf:e8:27:</span><br><span class="line">    e1:bd:c3:97:a9:f8:05:d7:5d</span><br><span class="line">writing RSA key</span><br><span class="line">-----BEGIN RSA PRIVATE KEY-----</span><br><span class="line">MIIEpgIBAAKCAQEA3PnzpxtZswe7/KhzjZYF46j7XWd9A7KPsb8C8L/lOLALarLi</span><br><span class="line">GXajGGqFO9QTXEsf3yGKPwK7ZZD360IOEJRjX5cgfcpXMSpgIYHbf+UKyD3Oj7MJ</span><br><span class="line">MWsOBFUIUrJsOoHnMe32cWhNmPhejEyPKWkxctHNuTos7QdUS7N/Zwc0K+6NTgN6</span><br><span class="line">KZ4N4zuV4k7IDED9a1ZI89xGYnboGgAO18uV1ZorK2Uy/KT2l+dD44AXRdhkOxbm</span><br><span class="line">ya+g1O06/bD+pV6kqCFp0PSKLg2y1OL+M+zF3ryDzIsbE5EXxuEJ9E/Oo+MLUr4f</span><br><span class="line">3tuec+Nn5GQojEY0zFZlxTm/9CQnO6aGrIWWEwIDAQABAoIBAQCKlx1Qbh/o3+3v</span><br><span class="line">/XpTj4bsDNxx7WkDu6bRtNnUQpYx4n+WkNCrZbPOqWgcaNsnpFo96Fw7Pqxne+9x</span><br><span class="line">lkEZ9ucIWdFf81qSFGCsQzR2VyFXCySVDZWzb9AfuXD55LtqSnTE5NkOsXsReJxb</span><br><span class="line">49xZ/Yas25bqF+l7U4Bz5gT+ig8XiWAXUZQpHt2N8jHqOOC4oqIDFCHtROw1Qs4Z</span><br><span class="line">9RkRTfBx0TBxS5sCUC3K/sJzpI78/ujGCrgHB64qoocpDX0uw167qn61k7oqU19z</span><br><span class="line">nGnphWG3rrvinbQjroh7M05y5pe/1uzjudagl7yax3+om5zwaF1q4BbfSLdPn1ld</span><br><span class="line">yAsdBM6ZAoGBAP1jHwhzuGDNlCWD8EJ5CtX4mwj9RX1+WRpwtJuauDOpgVuaQXqC</span><br><span class="line">8qJ5KUxrKjoGy2Yw07KmhwMqNxgMikGSBxeda7h+RH5yw057VBWWfQqE61gHmvGW</span><br><span class="line">BZHvcec3QTebLAkDGJi0FUd3OFL82LbGiVy9i4QYxK2wo3XEaln3oT7fAoGBAN9B</span><br><span class="line">Riszy4NjOOnF/wlnxGp3S703mbiz5BV35a4nxmj4AyW2kjB0/jtP1gFFVQguMQY0</span><br><span class="line">pInVXpt/WJVIbhgf9pYcJb4te8xwkrWsGiaHzcuzGj/yWDzdNoshiHMTUwWh+cCx</span><br><span class="line">QFQ/l/NU6NnMM3K+b67mZJPpXBk7IlEIacQgqPNNAoGBAJQxOYAe9dGfyioavRST</span><br><span class="line">aDP2Hu4l+lNH5uLg0bBDz8FfPGmPkQYOucsuI2ovLtYbDTBqFBXi8Ql30hr9koqA</span><br><span class="line">1icIiWywZGyzv+gRlv69McpKLL4iTItIW1+bc7lvhnP4C8wFhIgiomNWpZlbiX90</span><br><span class="line">I/gaXxNVzQlsSl1hD3YorqRvAoGBAMX+08Y410Kc2rqo+DhVKOLrDeavysr970gC</span><br><span class="line">31WGvPYXDmOB+UC0YUwkz7ysym7I2H2SbmI3MwJg/CTY6ZrHrh8Os4JoQCTdqZ8p</span><br><span class="line">FMAbLK59FsijmxHPdjIJ+UNlXfne3uq/yDdvdsk9Ao02BmK69b19YrGzAhT2Vsba</span><br><span class="line">2UIxXOT5AoGBAPNX3eSfGQFqfhQklTdk+STVu7GzwFTJrUGLJcR7K83GyNc1kzP4</span><br><span class="line">C1SVOSmJoyShXLuxnn6g9LT6lcyTiP8WnmDrT2lLWPlJ5XjqyzHseV37Ymo2fnp8</span><br><span class="line">thIHWzlzfZoUpzi7WLADhRx7DTipiusVuBNjxIkav+gn4b3Dl6n4Bddd</span><br><span class="line">-----END RSA PRIVATE KEY-----</span><br></pre></td></tr></table></figure><ol start="4"><li>提取其中的公钥<blockquote><p>openssl rsa -pubout -in rsa_demo_001.key</p></blockquote></li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">writing RSA key</span><br><span class="line">-----BEGIN PUBLIC KEY-----</span><br><span class="line">MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3PnzpxtZswe7/KhzjZYF</span><br><span class="line">46j7XWd9A7KPsb8C8L/lOLALarLiGXajGGqFO9QTXEsf3yGKPwK7ZZD360IOEJRj</span><br><span class="line">X5cgfcpXMSpgIYHbf+UKyD3Oj7MJMWsOBFUIUrJsOoHnMe32cWhNmPhejEyPKWkx</span><br><span class="line">ctHNuTos7QdUS7N/Zwc0K+6NTgN6KZ4N4zuV4k7IDED9a1ZI89xGYnboGgAO18uV</span><br><span class="line">1ZorK2Uy/KT2l+dD44AXRdhkOxbmya+g1O06/bD+pV6kqCFp0PSKLg2y1OL+M+zF</span><br><span class="line">3ryDzIsbE5EXxuEJ9E/Oo+MLUr4f3tuec+Nn5GQojEY0zFZlxTm/9CQnO6aGrIWW</span><br><span class="line">EwIDAQAB</span><br><span class="line">-----END PUBLIC KEY-----</span><br></pre></td></tr></table></figure><ol start="5"><li>写入公钥到文件里面,指定了-out就不会再输出到控制台。<blockquote><p>openssl rsa -pubout -in rsa_demo_001.key -out rsa_demo_001.pub.key</p></blockquote></li></ol><h2 id="使用密钥加密解密文件"><a href="#使用密钥加密解密文件" class="headerlink" title="使用密钥加密解密文件"></a>使用密钥加密解密文件</h2><ol><li><p>生成一个数据文件</p><blockquote><p>echo “{“data”:[{“6544242”:[121.40541199401648,32.95890201633851]}]}” &gt; data.json </p></blockquote></li><li><p>使用公钥对文件进行加密操作。</p><blockquote><p>openssl rsautl -encrypt -in data.json -inkey rsa_demo_001.pub.key -pubin -out data-encrypt.json</p></blockquote></li></ol><p>此时获得的文件 data-encrypt.json是加密后的文件，不可被直接理解了。一般在传输过程中，会对这个二进制流转码成hex或者base64。</p><ol start="3"><li><p>在2的基础上，使用私钥文件进行解密。</p><blockquote><p>openssl rsautl -decrypt -in data-encrypt.json -inkey rsa_demo_001.key </p></blockquote></li><li><p><strong>重要:</strong> 在实际操作过程中，我们一般会把私钥保存，把公钥发出去，这样通过公钥加密的内容，只有接收者可以看到。实际上、私钥加密的内容，公钥可以解密。但是因为私钥中已经包含了公钥，所以如果私钥文件发出去，就失去了非对称加密的意义了。私钥加密的场景，其实是验证，私钥签名的内容，可以用公钥验证是这个私钥签名的。</p></li><li><p>私钥“签名”（也是加密），公钥验证签名（也是解密）。</p><blockquote><p>openssl rsautl -sign -in data.json -inkey rsa_demo_001.key -out data-sign.json</p></blockquote></li></ol><blockquote><p>openssl rsautl -verify -in data-sign.json -inkey rsa_demo_001.pub.key -pubin</p></blockquote><p>可以看出，其实和上面的过程是类似的，只是定义不同。从数学上来说没有区别。加密的中间文件可能会不一样。</p><h2 id="证书"><a href="#证书" class="headerlink" title="证书"></a>证书</h2><p>密钥虽然已经有了，但是上面没有任何组织或者个人的标识，那么如何才能通过证书本身来标志组织或者持有者的身份呢。当你拿到这个公钥之后，怎么知道这个公钥是这个组织所有的，而不是被偷梁换柱之后的？</p><p>所以我们有证书： 公钥信息+额外的附加信息（所属实体，采取的加密算法等）=证书。扩展名一般为crt。（cert)</p><h3 id="证书的获得"><a href="#证书的获得" class="headerlink" title="证书的获得"></a>证书的获得</h3><ol><li><p>自行通过密钥对生成证书。</p><blockquote><p>openssl genpkey -algorithm rsa -out rsa_for_cert.key # 和前面的证书章节一样。</p></blockquote></li><li><p>基于这个私钥生成一个CSR（证书签名请求）。</p><blockquote><p>采用私钥生成一个CSR，过程中需要输入一些信息，这些信息都是公开的<br>openssl req -new -key rsa_for_cert.key -out server.csr</p></blockquote></li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">You are about to be asked to enter information that will be incorporated</span><br><span class="line">into your certificate request.</span><br><span class="line">What you are about to enter is what is called a Distinguished Name or a DN.</span><br><span class="line">There are quite a few fields but you can leave some blank</span><br><span class="line">For some fields there will be a default value,</span><br><span class="line">If you enter &apos;.&apos;, the field will be left blank.</span><br><span class="line">-----</span><br><span class="line">Country Name (2 letter code) []:CN</span><br><span class="line">State or Province Name (full name) []:TIANJIN</span><br><span class="line">Locality Name (eg, city) []:HEPING</span><br><span class="line">Organization Name (eg, company) []:hugerfuture</span><br><span class="line">Organizational Unit Name (eg, section) []:IT Corp</span><br><span class="line">Common Name (eg, fully qualified host name) []:IT </span><br><span class="line">Email Address []:shengling@hugerfuture.com</span><br><span class="line"></span><br><span class="line">Please enter the following &apos;extra&apos; attributes</span><br><span class="line">to be sent with your certificate request</span><br><span class="line">A challenge password []:!@#$1234QWER</span><br></pre></td></tr></table></figure><ol start="3"><li>文件生成了，我们查看一下。<blockquote><p>openssl req -in server.csr -text -noout</p></blockquote></li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line">Certificate Request:</span><br><span class="line">    Data:</span><br><span class="line">        Version: 0 (0x0)</span><br><span class="line">        Subject: C=CN, ST=TIANJIN, L=HEPING, O=hugerfuture, OU=IT Corp, CN=IT /emailAddress=shengling@hugerfuture.com</span><br><span class="line">        Subject Public Key Info:</span><br><span class="line">            Public Key Algorithm: rsaEncryption</span><br><span class="line">                Public-Key: (2048 bit)</span><br><span class="line">                Modulus:</span><br><span class="line">                    00:9d:fe:64:ce:c2:db:69:35:7c:59:e4:b7:84:ac:</span><br><span class="line">                    8e:9b:af:a3:c3:f5:48:78:cd:b3:c9:1a:de:78:a2:</span><br><span class="line">                    47:92:50:2e:8d:c1:3c:75:d6:22:a2:ce:07:98:f5:</span><br><span class="line">                    ce:cc:48:76:fb:40:4b:3d:ef:65:f2:21:09:a6:65:</span><br><span class="line">                    a4:45:86:c5:5c:1b:01:a9:55:75:1d:76:e8:8f:0c:</span><br><span class="line">                    6b:02:7b:d6:3f:55:39:60:99:fd:48:d3:99:fd:25:</span><br><span class="line">                    74:83:7e:33:41:02:2a:59:df:e3:63:29:5c:77:d4:</span><br><span class="line">                    f8:5c:8a:03:53:3e:b5:d9:06:1a:2c:ea:d7:4c:9f:</span><br><span class="line">                    0e:fa:b9:f2:e4:3a:7f:a3:81:7f:78:70:a1:84:e6:</span><br><span class="line">                    b9:d4:a5:4c:23:e8:30:c0:fe:cb:db:46:87:bd:0d:</span><br><span class="line">                    c6:8c:5a:b6:d7:88:05:ba:0d:27:1c:10:74:8c:cf:</span><br><span class="line">                    83:ee:3c:0d:44:71:aa:b1:89:98:a0:21:57:d9:3e:</span><br><span class="line">                    e8:ec:e8:d8:4d:65:77:a7:1e:4c:30:fd:4e:ae:3d:</span><br><span class="line">                    14:a1:f0:eb:39:45:0f:1b:a7:50:99:b1:66:5f:a3:</span><br><span class="line">                    45:88:a6:61:62:9b:89:fd:28:5e:d3:88:1f:18:38:</span><br><span class="line">                    90:4c:6f:d7:45:40:90:ba:dd:d6:5b:ce:d5:8c:ad:</span><br><span class="line">                    eb:32:26:89:46:0c:7b:10:50:4e:9d:b4:9a:96:28:</span><br><span class="line">                    be:07</span><br><span class="line">                Exponent: 65537 (0x10001)</span><br><span class="line">        Attributes:</span><br><span class="line">            challengePassword        :unable to print attribute</span><br><span class="line">    Signature Algorithm: sha256WithRSAEncryption</span><br><span class="line">         93:46:f3:0c:69:16:32:e6:d5:a4:be:2d:09:6c:23:12:e8:4a:</span><br><span class="line">         a5:62:db:e8:bd:ab:14:1b:5a:4e:17:d3:18:d2:cc:f0:e8:d2:</span><br><span class="line">         a5:61:62:aa:93:e6:4e:44:f9:45:d7:6a:7f:22:5a:6c:d9:0b:</span><br><span class="line">         61:31:26:75:03:78:75:73:b1:8d:47:12:08:53:e9:93:a9:63:</span><br><span class="line">         62:e0:2f:f1:7d:fa:67:b4:1b:d3:02:20:63:3f:87:14:1d:66:</span><br><span class="line">         85:49:7e:29:d6:ac:e1:f5:d9:fb:35:d0:6e:91:87:9b:f0:37:</span><br><span class="line">         10:65:b4:ea:eb:b3:79:27:9f:43:1c:42:f3:04:64:c7:7b:b0:</span><br><span class="line">         f7:25:c7:92:47:86:ee:b2:cf:3b:a1:2c:99:6d:3c:e4:3f:cf:</span><br><span class="line">         52:15:01:08:f8:0e:89:54:c2:ee:78:96:f9:f3:00:45:40:bc:</span><br><span class="line">         df:c5:3d:01:eb:0a:29:d5:80:8d:89:0a:11:07:7e:ce:93:09:</span><br><span class="line">         bc:eb:1e:56:70:20:b0:fa:29:b8:f5:62:db:76:32:51:33:ea:</span><br><span class="line">         3c:e5:7e:ea:6f:4b:da:67:0b:c8:cc:9b:53:d9:8e:4d:0b:8e:</span><br><span class="line">         2e:f8:e4:ef:db:d6:6f:28:58:e9:66:76:84:63:7e:0f:35:24:</span><br><span class="line">         87:58:df:15:95:a2:ba:5f:78:ac:61:ff:21:6f:51:66:a5:d7:</span><br><span class="line">         f9:f4:a4:b4</span><br></pre></td></tr></table></figure><ol start="4"><li><p>我们可以把这个证书发给CA机构，让他们认证。CA认证过的(签名）的证书，是可以被主流浏览器直接识别的。唯一的问题是要收钱。</p></li><li><p>自己充当CA来注册一下。并且这里是把自己当做root证书来自签名。（而浏览器里面是预埋了各个CA机构的公钥，可以来验证是不是由这个CA机构签发的证书,因为公钥可以verify私钥sign的内容）。</p><blockquote><p>openssl x509 -req -days 365 -in server.csr -signkey rsa_for_cert.key -out my-cert.crt </p></blockquote></li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Signature ok</span><br><span class="line">subject=/C=CN/ST=TIANJIN/L=HEPING/O=hugerfuture/OU=IT Corp/CN=IT /emailAddress=shengling@hugerfuture.com</span><br><span class="line">Getting Private key</span><br></pre></td></tr></table></figure><ol start="6"><li>查看证书相关信息<blockquote><p>openssl x509 -in my-cert.crt -text</p></blockquote></li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line">Certificate:</span><br><span class="line">    Data:</span><br><span class="line">        Version: 1 (0x0)</span><br><span class="line">        Serial Number: 16079925940232298387 (0xdf275f7292229f93)</span><br><span class="line">    Signature Algorithm: sha1WithRSAEncryption</span><br><span class="line">        Issuer: C=CN, ST=TIANJIN, L=HEPING, O=hugerfuture, OU=IT Corp, CN=IT /emailAddress=shengling@hugerfuture.com</span><br><span class="line">        Validity</span><br><span class="line">            Not Before: Nov  3 08:48:50 2020 GMT</span><br><span class="line">            Not After : Nov  3 08:48:50 2021 GMT</span><br><span class="line">        Subject: C=CN, ST=TIANJIN, L=HEPING, O=hugerfuture, OU=IT Corp, CN=IT /emailAddress=shengling@hugerfuture.com</span><br><span class="line">        Subject Public Key Info:</span><br><span class="line">            Public Key Algorithm: rsaEncryption</span><br><span class="line">                Public-Key: (2048 bit)</span><br><span class="line">                Modulus:</span><br><span class="line">                    00:9d:fe:64:ce:c2:db:69:35:7c:59:e4:b7:84:ac:</span><br><span class="line">                    8e:9b:af:a3:c3:f5:48:78:cd:b3:c9:1a:de:78:a2:</span><br><span class="line">                    47:92:50:2e:8d:c1:3c:75:d6:22:a2:ce:07:98:f5:</span><br><span class="line">                    ce:cc:48:76:fb:40:4b:3d:ef:65:f2:21:09:a6:65:</span><br><span class="line">                    a4:45:86:c5:5c:1b:01:a9:55:75:1d:76:e8:8f:0c:</span><br><span class="line">                    6b:02:7b:d6:3f:55:39:60:99:fd:48:d3:99:fd:25:</span><br><span class="line">                    74:83:7e:33:41:02:2a:59:df:e3:63:29:5c:77:d4:</span><br><span class="line">                    f8:5c:8a:03:53:3e:b5:d9:06:1a:2c:ea:d7:4c:9f:</span><br><span class="line">                    0e:fa:b9:f2:e4:3a:7f:a3:81:7f:78:70:a1:84:e6:</span><br><span class="line">                    b9:d4:a5:4c:23:e8:30:c0:fe:cb:db:46:87:bd:0d:</span><br><span class="line">                    c6:8c:5a:b6:d7:88:05:ba:0d:27:1c:10:74:8c:cf:</span><br><span class="line">                    83:ee:3c:0d:44:71:aa:b1:89:98:a0:21:57:d9:3e:</span><br><span class="line">                    e8:ec:e8:d8:4d:65:77:a7:1e:4c:30:fd:4e:ae:3d:</span><br><span class="line">                    14:a1:f0:eb:39:45:0f:1b:a7:50:99:b1:66:5f:a3:</span><br><span class="line">                    45:88:a6:61:62:9b:89:fd:28:5e:d3:88:1f:18:38:</span><br><span class="line">                    90:4c:6f:d7:45:40:90:ba:dd:d6:5b:ce:d5:8c:ad:</span><br><span class="line">                    eb:32:26:89:46:0c:7b:10:50:4e:9d:b4:9a:96:28:</span><br><span class="line">                    be:07</span><br><span class="line">                Exponent: 65537 (0x10001)</span><br><span class="line">    Signature Algorithm: sha1WithRSAEncryption</span><br><span class="line">         26:08:e9:54:20:6d:11:6c:b7:fe:4b:67:9a:d5:27:6b:f1:89:</span><br><span class="line">         70:2e:fd:58:7d:9f:83:a5:c6:f6:13:6f:76:94:02:cd:e7:a2:</span><br><span class="line">         cf:2a:73:6c:75:52:87:69:2c:f7:2f:1f:57:05:dc:b2:72:ca:</span><br><span class="line">         8a:16:07:65:1b:ba:7b:85:a1:0b:44:99:20:bc:e6:28:2e:bf:</span><br><span class="line">         8e:a1:f8:82:82:66:2e:56:5e:28:65:ff:81:fe:3c:51:99:74:</span><br><span class="line">         d0:c8:87:f5:31:cc:59:a6:dd:d3:8b:ad:dd:0c:27:99:53:85:</span><br><span class="line">         13:db:ef:3b:18:67:e1:61:e2:8c:e6:de:2b:32:a8:b9:64:73:</span><br><span class="line">         5b:c3:c5:c1:4c:7e:08:30:1c:6d:bf:09:f5:ca:86:15:44:8f:</span><br><span class="line">         38:01:57:92:bf:2a:6b:07:a3:b6:d9:08:65:a1:2b:a4:d3:7d:</span><br><span class="line">         71:76:0e:8b:e3:09:f2:c9:2b:36:3b:ed:44:ac:d2:4b:39:f8:</span><br><span class="line">         7d:a5:e6:8e:82:be:ba:cc:fb:7c:53:96:8e:a5:18:95:02:43:</span><br><span class="line">         9d:39:e4:52:a4:a5:49:21:1c:38:88:99:ab:45:1d:cb:1d:2f:</span><br><span class="line">         85:32:e0:e8:64:97:f3:7c:f9:04:c8:fc:8d:2b:1b:61:aa:36:</span><br><span class="line">         e7:11:f0:dd:4f:c8:3a:ec:4f:29:46:16:65:00:27:2f:61:58:</span><br><span class="line">         7b:46:3c:1d</span><br><span class="line">-----BEGIN CERTIFICATE-----</span><br><span class="line">MIIDnjCCAoYCCQDfJ19ykiKfkzANBgkqhkiG9w0BAQUFADCBkDELMAkGA1UEBhMC</span><br><span class="line">Q04xEDAOBgNVBAgMB1RJQU5KSU4xDzANBgNVBAcMBkhFUElORzEUMBIGA1UECgwL</span><br><span class="line">aHVnZXJmdXR1cmUxEDAOBgNVBAsMB0lUIENvcnAxDDAKBgNVBAMMA0lUIDEoMCYG</span><br><span class="line">CSqGSIb3DQEJARYZc2hlbmdsaW5nQGh1Z2VyZnV0dXJlLmNvbTAeFw0yMDExMDMw</span><br><span class="line">ODQ4NTBaFw0yMTExMDMwODQ4NTBaMIGQMQswCQYDVQQGEwJDTjEQMA4GA1UECAwH</span><br><span class="line">VElBTkpJTjEPMA0GA1UEBwwGSEVQSU5HMRQwEgYDVQQKDAtodWdlcmZ1dHVyZTEQ</span><br><span class="line">MA4GA1UECwwHSVQgQ29ycDEMMAoGA1UEAwwDSVQgMSgwJgYJKoZIhvcNAQkBFhlz</span><br><span class="line">aGVuZ2xpbmdAaHVnZXJmdXR1cmUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A</span><br><span class="line">MIIBCgKCAQEAnf5kzsLbaTV8WeS3hKyOm6+jw/VIeM2zyRreeKJHklAujcE8ddYi</span><br><span class="line">os4HmPXOzEh2+0BLPe9l8iEJpmWkRYbFXBsBqVV1HXbojwxrAnvWP1U5YJn9SNOZ</span><br><span class="line">/SV0g34zQQIqWd/jYylcd9T4XIoDUz612QYaLOrXTJ8O+rny5Dp/o4F/eHChhOa5</span><br><span class="line">1KVMI+gwwP7L20aHvQ3GjFq214gFug0nHBB0jM+D7jwNRHGqsYmYoCFX2T7o7OjY</span><br><span class="line">TWV3px5MMP1Orj0UofDrOUUPG6dQmbFmX6NFiKZhYpuJ/She04gfGDiQTG/XRUCQ</span><br><span class="line">ut3WW87VjK3rMiaJRgx7EFBOnbSalii+BwIDAQABMA0GCSqGSIb3DQEBBQUAA4IB</span><br><span class="line">AQAmCOlUIG0RbLf+S2ea1Sdr8YlwLv1YfZ+Dpcb2E292lALN56LPKnNsdVKHaSz3</span><br><span class="line">Lx9XBdyycsqKFgdlG7p7haELRJkgvOYoLr+OofiCgmYuVl4oZf+B/jxRmXTQyIf1</span><br><span class="line">McxZpt3Ti63dDCeZU4UT2+87GGfhYeKM5t4rMqi5ZHNbw8XBTH4IMBxtvwn1yoYV</span><br><span class="line">RI84AVeSvyprB6O22QhloSuk031xdg6L4wnyySs2O+1ErNJLOfh9peaOgr66zPt8</span><br><span class="line">U5aOpRiVAkOdOeRSpKVJIRw4iJmrRR3LHS+FMuDoZJfzfPkEyPyNKxthqjbnEfDd</span><br><span class="line">T8g67E8pRhZlACcvYVh7Rjwd</span><br><span class="line">-----END CERTIFICATE-----</span><br></pre></td></tr></table></figure><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;PKI(公钥基础设施)是一个包括硬件、软件、人员、策略和规程的集合，用来实现基于公钥密码体制的密钥和证书的产生、管理、存储、分发和撤销等功能。&lt;br&gt;本专题将系统的讲解整个体系。&lt;/p&gt;
    
    </summary>
    
      <category term="术业专攻" scheme="http://blog.xiaoyuyu.net/categories/%E6%9C%AF%E4%B8%9A%E4%B8%93%E6%94%BB/"/>
    
    
      <category term="PKI" scheme="http://blog.xiaoyuyu.net/tags/PKI/"/>
    
      <category term="安全专题" scheme="http://blog.xiaoyuyu.net/tags/%E5%AE%89%E5%85%A8%E4%B8%93%E9%A2%98/"/>
    
      <category term="安全策略" scheme="http://blog.xiaoyuyu.net/tags/%E5%AE%89%E5%85%A8%E7%AD%96%E7%95%A5/"/>
    
  </entry>
  
  <entry>
    <title>110-【RASA系列教程-4】-RASA做天气问答机器人</title>
    <link href="http://blog.xiaoyuyu.net/post/b053a315.html"/>
    <id>http://blog.xiaoyuyu.net/post/b053a315.html</id>
    <published>2020-09-26T14:37:58.000Z</published>
    <updated>2020-10-16T06:30:50.295Z</updated>
    
    <content type="html"><![CDATA[<p>天气问答是NLU及DM领域的经典案例。</p><a id="more"></a><h1 id="依赖准备"><a href="#依赖准备" class="headerlink" title="依赖准备"></a>依赖准备</h1><p>准备好对应的虚拟环境(略)<br>将对应的依赖下载下来</p><h2 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h2><blockquote><p>vim config.yml</p></blockquote><pre>language: zhpipeline: - name: "nlp_mitie"  model: "data/total_word_feature_extractor_zh.dat"- name: "tokenizer_jieba"- name: "ner_mitie"- name: "ner_synonyms"- name: "intent_featurizer_mitie"- name: "intent_classifier_sklearn"</pre><h1 id="数据准备"><a href="#数据准备" class="headerlink" title="数据准备"></a>数据准备</h1><h2 id="nlu-json"><a href="#nlu-json" class="headerlink" title="nlu.json"></a>nlu.json</h2><pre>{  "rasa_nlu_data": {    "common_examples": [      {        "intent": "weather_address_date-time",        "entities": [          {            "start": 2,            "end": 4,            "value": "上海",            "entity": "address"          },          {            "start": 4,            "end": 6,            "value": "明天",            "entity": "date-time"          }        ],        "text": "我要上海明天的天气"      },   ...</pre><h2 id="stories-md"><a href="#stories-md" class="headerlink" title="stories.md"></a>stories.md</h2><pre>## simple path with greet* greet  - utter_greet* weather_address_date-time{"address": "上海", "date-time": "明天"}  - utter_working_on_it  - action_report_weather  - utter_report_weather## simple path* weather_address_date-time{"address": "上海", "date-time": "明天"}  - utter_working_on_it  - action_report_weather  - utter_report_weather ...</pre><h2 id="domain-yml"><a href="#domain-yml" class="headerlink" title="domain.yml"></a>domain.yml</h2><pre>intents:  - greet  - goodbye  - weather  - weather_address_date-time  - weather_address  - weather_date-timeslots:  address:    type: text  date-time:    type: text  matches:    type: unfeaturizedentities:  - address  - date-timeactions:  - utter_greet  - utter_ask_address  - utter_ask_date-time  - utter_working_on_it  - action_report_weather  - utter_report_weather  - utter_goodbyetemplates:  utter_greet:    - text: "你好，请说出需要提供天气预测服务的地点和时间"  utter_working_on_it:    - text: "正在查询中，请稍后 ..."  utter_goodbye:    - text: "再见！"  utter_ask_address:    - text: "哪里呢？"  utter_ask_date-time:    - text: "什么时候？"  utter_report_weather:    - text: "{matches}"  utter_default:    - text: "系统不明白您说的话"</pre><h2 id="配置endpoints-yml"><a href="#配置endpoints-yml" class="headerlink" title="配置endpoints.yml"></a>配置endpoints.yml</h2><pre>action_endpoint:  url: "http://localhost:5055/webhook"</pre><h1 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h1><h2 id="生成模型"><a href="#生成模型" class="headerlink" title="生成模型"></a>生成模型</h2><blockquote><p>rasa train </p></blockquote><h2 id="运行action服务"><a href="#运行action服务" class="headerlink" title="运行action服务"></a>运行action服务</h2><blockquote><p>git clone <a href="https://github.com/howl-anderson/WeatherBot_Action" target="_blank" rel="noopener">https://github.com/howl-anderson/WeatherBot_Action</a><br>pip3 install -r requirements.txt<br>python3 -m rasa_core_sdk.endpoint –actions bot</p></blockquote><center><img src="/img/2020/2020-09-26-04.jpg" alt></center><br><center>最终效果</center><h2 id="使用restapi访问"><a href="#使用restapi访问" class="headerlink" title="使用restapi访问"></a>使用restapi访问</h2><pre>import jsonimport secretsimport requestsdef post(url, data=None):    data = json.dumps(data, ensure_ascii=False)    data = data.encode(encoding="utf-8")    r = requests.post(url=url, data=data)    r = json.loads(r.text)    return rsender = secrets.token_urlsafe(16)url = "http://localhost:5005/webhooks/rest/webhook"while True:    message = input("Your input ->  ")    data = {        "sender": sender,        "message": message    }    result = post(url, data)    for i in result:        print(i)</pre><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;天气问答是NLU及DM领域的经典案例。&lt;/p&gt;
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>109-【RASA系列教程-3】-RASA NLU模型训练</title>
    <link href="http://blog.xiaoyuyu.net/post/3d9c5ef.html"/>
    <id>http://blog.xiaoyuyu.net/post/3d9c5ef.html</id>
    <published>2020-09-26T05:48:40.000Z</published>
    <updated>2020-09-26T06:31:47.403Z</updated>
    
    <content type="html"><![CDATA[<p>准备好训练数据之后要进行的就是模型训练。而RASA NLU可以定义不同的pipeline。</p><a id="more"></a><h1 id="Rasa-NLU-Chi方案"><a href="#Rasa-NLU-Chi方案" class="headerlink" title="Rasa_NLU_Chi方案"></a>Rasa_NLU_Chi方案</h1><p>官方地址在: <a href="https://github.com/crownpku/Rasa_NLU_Chi" target="_blank" rel="noopener">https://github.com/crownpku/Rasa_NLU_Chi</a></p><p>配置文件如下: </p><pre>language: "zh"  pipeline:- name: "nlp_mitie"  model: "data/total_word_feature_extractor_zh.dat"- name: "tokenizer_jieba"- name: "ner_mitie"- name: "ner_synonyms"- name: "intent_entity_featurizer_regex"- name: "intent_classifier_mitie"</pre><h1 id="tensorflow-embedding"><a href="#tensorflow-embedding" class="headerlink" title="tensorflow_embedding"></a>tensorflow_embedding</h1><pre>language: "zh"   pipeline: - name: "tokenizer_jieba" - name: "ner_crf" - name: "intent_featurizer_count_vectors"   OOV_token: oov   token_pattern: '(?u)\b\w+\b' - name: "intent_classifier_tensorflow_embedding"</pre><h1 id="Rasa-NLU自定义component"><a href="#Rasa-NLU自定义component" class="headerlink" title="Rasa_NLU自定义component"></a>Rasa_NLU自定义component</h1><p>参考: <a href="https://www.jianshu.com/p/4ecd09be4419，作者定义了一套component，可以实现两个实体识别模型" target="_blank" rel="noopener">https://www.jianshu.com/p/4ecd09be4419，作者定义了一套component，可以实现两个实体识别模型</a>: bilstm+crf 和 idcnn + crf。代码在<a href="https://github.com/GaoQ1/rasa_nlu_gq,可以通过pip3安装" target="_blank" rel="noopener">https://github.com/GaoQ1/rasa_nlu_gq,可以通过pip3安装</a></p><blockquote><p>pip3 install rasa-nlu-gao</p></blockquote><h2 id="ner-bilstm-crf"><a href="#ner-bilstm-crf" class="headerlink" title="ner_bilstm_crf"></a>ner_bilstm_crf</h2><pre>language: "zh" pipeline:   - name: "tokenizer_jieba"   - name: "intent_featurizer_count_vectors"     token_pattern: '(?u)\b\w+\b'   - name: "intent_classifier_tensorflow_embedding"   - name: "ner_bilstm_crf"     lr: 0.001     char_dim: 100     lstm_dim: 100     batches_per_epoch: 10     seg_dim: 20     num_segs: 4     batch_size: 200     tag_schema: "iobes"     model_type: "bilstm" # 模型支持两种idcnn膨胀卷积模型或bilstm双向lstm模型     clip: 5     optimizer: "adam"     dropout_keep: 0.5     steps_check: 100</pre><h2 id="jieba-pseg-extractor"><a href="#jieba-pseg-extractor" class="headerlink" title="jieba_pseg_extractor"></a>jieba_pseg_extractor</h2><p>上面对slot filling的精度进行了提高，但是前提还是需要有大量的训练数据，如果训练数据不多的话还是建议使用ner_crf。原作者还自定义了组件jieba_pseg_extractor,以借助jieba来解决人名识别的问题。</p><pre>language: "zh" pipeline: - name: "tokenizer_jieba" - name: "ner_crf" - name: "jieba_pseg_extractor"   part_of_speech: ["nr", "ns", "nt"] - name: "intent_featurizer_count_vectors"   OOV_token: oov   token_pattern: '(?u)\b\w+\b' - name: "intent_classifier_tensorflow_embedding"</pre><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;准备好训练数据之后要进行的就是模型训练。而RASA NLU可以定义不同的pipeline。&lt;/p&gt;
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>108-【RASA系列教程-2】-使用chatito生成配置及语料</title>
    <link href="http://blog.xiaoyuyu.net/post/bfa48480.html"/>
    <id>http://blog.xiaoyuyu.net/post/bfa48480.html</id>
    <published>2020-09-26T05:06:59.000Z</published>
    <updated>2020-09-26T05:30:37.844Z</updated>
    
    <content type="html"><![CDATA[<p>rasa nlu需要大量的语料训练，而如果我们通过直接手写配置文件必然是工作量很大的事情。这里选择了一个开源工具chatito。官方地址在: <a href="https://github.com/rodrigopivi/Chatito" target="_blank" rel="noopener">https://github.com/rodrigopivi/Chatito</a> </p><a id="more"></a><h1 id="使用指南"><a href="#使用指南" class="headerlink" title="使用指南"></a>使用指南</h1><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><blockquote><p>npm install -g chatito</p></blockquote><h2 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h2><p>One particular behavior of the Rasa adapter is that when a slot definition sentence only contains one alias, and that alias defines the ‘synonym’ argument with ‘true’, the generated Rasa dataset will map the alias as a synonym. e.g.:</p><p>Rasa适配器的一种特殊行为是，当插槽定义语句仅包含一个别名，并且该别名将“ synonym”参数定义为“ true”时，生成的Rasa数据集会将别名映射为同义词。 例如:</p><pre>%[some intent]('training': '1')    @[some slot]@[some slot]    ~[some slot synonyms]~[some slot synonyms]('synonym': 'true')    synonym 1    synonym 2</pre><h2 id="创建定义语料文件"><a href="#创建定义语料文件" class="headerlink" title="创建定义语料文件"></a>创建定义语料文件</h2><blockquote><p>vim botTrainData.chatito</p></blockquote><p>这里选用了一个定义好的配置文件: <a href="https://github.com/GaoQ1/chatito_gen_nlu_data/blob/master/trainClimateBot.chatito" target="_blank" rel="noopener">https://github.com/GaoQ1/chatito_gen_nlu_data/blob/master/trainClimateBot.chatito</a></p><p>具体的文件定义语法可以参考: <a href="https://github.com/rodrigopivi/Chatito/blob/master/spec.md" target="_blank" rel="noopener">https://github.com/rodrigopivi/Chatito/blob/master/spec.md</a></p><pre>%[greet]('training': '2')    ~[hi] @[name?] ~[whatsUp?]~[hi]    hi    hey    你好    你好啊    嗨    哈罗    hello@[name]    Janis    Bob    shengl    盛领    小皮~[whatsUp]    whats up    how is it going    怎么样    咋啦    最近咋样了</pre><h2 id="生成训练文件"><a href="#生成训练文件" class="headerlink" title="生成训练文件"></a>生成训练文件</h2><blockquote><p>npx chatito botTrainData.chatito</p></blockquote><pre>NOTE: Using regular as default frequency distribution.Processing file: /Users/shengl/0000-hugerfuture/0-code/20-xiaoling/205-brain/00-github-demo/02-rasa-chatbot-cn/chatito_gen_nlu_data/01-hellochatito/botTrainData.chatitoSaved training dataset: /Users/shengl/0000-hugerfuture/0-code/20-xiaoling/205-brain/00-github-demo/02-rasa-chatbot-cn/chatito_gen_nlu_data/01-hellochatito/default_dataset_training.json</pre><h2 id="查看生成的文件"><a href="#查看生成的文件" class="headerlink" title="查看生成的文件"></a>查看生成的文件</h2><blockquote><p>vim default_dataset_training.json</p></blockquote><p><pre><br>{<br>    “greet”: [<br>        [{<br>            “type”: “Text”,<br>            “value”: “嗨 “<br>        }, {<br>            “value”: “Bob”,<br>            “type”: “Slot”,<br>            “slot”: “name”<br>        }, {<br>            “type”: “Text”,<br>            “value”: “ how is it going”<br>        }],<br>        [{<br>            “type”: “Text”,<br>            “value”: “你好 咋啦”<br>        }]<br>    ]<br>}<br></pre></p><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p><p></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;rasa nlu需要大量的语料训练，而如果我们通过直接手写配置文件必然是工作量很大的事情。这里选择了一个开源工具chatito。官方地址在: &lt;a href=&quot;https://github.com/rodrigopivi/Chatito&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/rodrigopivi/Chatito&lt;/a&gt; &lt;/p&gt;
    
    </summary>
    
      <category term="术业专攻" scheme="http://blog.xiaoyuyu.net/categories/%E6%9C%AF%E4%B8%9A%E4%B8%93%E6%94%BB/"/>
    
    
      <category term="RASA" scheme="http://blog.xiaoyuyu.net/tags/RASA/"/>
    
      <category term="NLU" scheme="http://blog.xiaoyuyu.net/tags/NLU/"/>
    
      <category term="数据生成" scheme="http://blog.xiaoyuyu.net/tags/%E6%95%B0%E6%8D%AE%E7%94%9F%E6%88%90/"/>
    
      <category term="chatito" scheme="http://blog.xiaoyuyu.net/tags/chatito/"/>
    
  </entry>
  
  <entry>
    <title>107-python3集成flask及swagger</title>
    <link href="http://blog.xiaoyuyu.net/post/8e7e2220.html"/>
    <id>http://blog.xiaoyuyu.net/post/8e7e2220.html</id>
    <published>2020-09-25T20:47:11.000Z</published>
    <updated>2020-09-26T04:48:14.712Z</updated>
    
    <content type="html"><![CDATA[<p>Swagger最大的好处是与代码在一起生成文档，理论上你改完了代码，文档也接着更新了。良好的解决了常规情况下文档与代码不一致的情况。<br>本文主要记录python的常用框架与swagger集成的问题。</p><a id="more"></a><h1 id="编写文档"><a href="#编写文档" class="headerlink" title="编写文档"></a>编写文档</h1><pre>swagger: "2.0"info:  version: 1.0.0  title: HelloWorld API  description: A simple API to learn how to write OpenAPI Specificationschemes:  - httpshost: api.domain.iobasePath: /helloworldpaths:  /persons:    get:      summary: Gets some persons      description: Returns a list containing all persons.      responses:        200:          description: A list of Person          schema:            type: array            items:              required:                - username              properties:                firstName:                  type: string</pre><h1 id="使用swagger-codegen"><a href="#使用swagger-codegen" class="headerlink" title="使用swagger-codegen"></a>使用swagger-codegen</h1><p>官方地址在: <a href="https://github.com/swagger-api/swagger-codegen" target="_blank" rel="noopener">https://github.com/swagger-api/swagger-codegen</a></p><h2 id="使用pip3安装"><a href="#使用pip3安装" class="headerlink" title="使用pip3安装"></a>使用pip3安装</h2><blockquote><p>pip3 install swagger-py-codegen</p></blockquote><h2 id="生成代码"><a href="#生成代码" class="headerlink" title="生成代码"></a>生成代码</h2><ul><li>其中helloworld.yml文件参考前面的文档，也可以自行编写。</li><li>swagger本身的规范移步谷歌即可。</li></ul><blockquote><p>swagger_py_codegen –swagger-doc helloworld.yml helloworld-py-app</p></blockquote><pre>generate    helloworld-py-app/helloworld_py_app/helloworld/schemas.pygenerate    helloworld-py-app/helloworld_py_app/helloworld/routes.pygenerate    helloworld-py-app/helloworld_py_app/helloworld/api/persons.pygenerate    helloworld-py-app/helloworld_py_app/helloworld/validators.pygenerate    helloworld-py-app/helloworld_py_app/helloworld/api/__init__.pygenerate    helloworld-py-app/helloworld_py_app/helloworld/__init__.pygenerate    helloworld-py-app/helloworld_py_app/__init__.pygenerate    helloworld-py-app/requirements.txt</pre><h2 id="可选参数"><a href="#可选参数" class="headerlink" title="可选参数"></a>可选参数</h2><p>如果不指定-tlp参数，默认将使用flask作为框架，如果指定–ui –spec则会在-p指定的目录下生成ui目录static</p><blockquote><p>swagger_py_codegen –help</p></blockquote><pre>Usage: swagger_py_codegen [OPTIONS] DESTINATIONOptions:  -s, --swagger-doc TEXT   Swagger doc file.  [required]  -f, --force              Force overwrite.  -p, --package TEXT       Package name / application name.  -t, --template-dir TEXT  Path of your custom templates directory.  --spec, --specification  Generate online specification json response.  --ui                     Generate swagger ui.  --validate               Validate swagger file.  -tlp, --templates TEXT   gen flask/tornado/falcon/sanic templates, default                           flask.  --version                Show current version.  --help                   Show this message and exit.</pre><blockquote><p>swagger_py_codegen –swagger-doc helloworld.yml helloworld-py-app-ui –ui –spec</p></blockquote><pre>generate    helloworld-py-app-ui/helloworld_py_app_ui/static/swagger-uigenerate    helloworld-py-app-ui/helloworld_py_app_ui/helloworld/schemas.pygenerate    helloworld-py-app-ui/helloworld_py_app_ui/helloworld/routes.pygenerate    helloworld-py-app-ui/helloworld_py_app_ui/helloworld/api/persons.pygenerate    helloworld-py-app-ui/helloworld_py_app_ui/static/helloworld/swagger.jsongenerate    helloworld-py-app-ui/helloworld_py_app_ui/helloworld/validators.pygenerate    helloworld-py-app-ui/helloworld_py_app_ui/helloworld/api/__init__.pygenerate    helloworld-py-app-ui/helloworld_py_app_ui/helloworld/__init__.pygenerate    helloworld-py-app-ui/helloworld_py_app_ui/__init__.pygenerate    helloworld-py-app-ui/requirements.txtgenerate    helloworld-py-app-ui/helloworld_py_app_ui/static/swagger-ui/index.html</pre><p>此时可以看到app框架已经生成了，routes.py是自动生成的路由，运行<strong>init</strong>.py</p><blockquote><p>python3 <strong>init</strong>.py</p></blockquote><pre>* Serving Flask app "__init__" (lazy loading) * Environment: production   WARNING: This is a development server. Do not use it in a production deployment.   Use a production WSGI server instead. * Debug mode: on * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 851-087-703</pre><p>访问<a href="http://127.0.0.1:5000/static/swagger-ui/index.html" target="_blank" rel="noopener">http://127.0.0.1:5000/static/swagger-ui/index.html</a></p><ul><li>最终效果如下:</li></ul><center><img src="/img/2020/2020-09-26-03.jpg" alt></center><br><center>最终效果</center><h1 id="使用sanic模板"><a href="#使用sanic模板" class="headerlink" title="使用sanic模板"></a>使用sanic模板</h1><h2 id="生成框架代码"><a href="#生成框架代码" class="headerlink" title="生成框架代码"></a>生成框架代码</h2><blockquote><p>swagger_py_codegen –swagger-doc helloworld.yml helloworld-app-sanic-ui –ui –spec -tlp sanic</p></blockquote><pre>generate    helloworld-app-sanic-ui/helloworld_app_sanic_ui/static/swagger-uigenerate    helloworld-app-sanic-ui/helloworld_app_sanic_ui/helloworld/schemas.pygenerate    helloworld-app-sanic-ui/helloworld_app_sanic_ui/helloworld/routes.pygenerate    helloworld-app-sanic-ui/helloworld_app_sanic_ui/helloworld/api/persons.pygenerate    helloworld-app-sanic-ui/helloworld_app_sanic_ui/static/helloworld/swagger.jsongenerate    helloworld-app-sanic-ui/helloworld_app_sanic_ui/helloworld/validators.pygenerate    helloworld-app-sanic-ui/helloworld_app_sanic_ui/helloworld/api/__init__.pygenerate    helloworld-app-sanic-ui/helloworld_app_sanic_ui/helloworld/__init__.pygenerate    helloworld-app-sanic-ui/helloworld_app_sanic_ui/__init__.pygenerate    helloworld-app-sanic-ui/requirements.txtgenerate    helloworld-app-sanic-ui/helloworld_app_sanic_ui/static/swagger-ui/index.html</pre><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><blockquote><p>cd helloworld-app-sanic-ui/<br>pip3 install -r requirements.txt </p></blockquote><pre><p></p></pre><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p><p></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;Swagger最大的好处是与代码在一起生成文档，理论上你改完了代码，文档也接着更新了。良好的解决了常规情况下文档与代码不一致的情况。&lt;br&gt;本文主要记录python的常用框架与swagger集成的问题。&lt;/p&gt;
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>106-【RASA系列教程-1】-简单开始</title>
    <link href="http://blog.xiaoyuyu.net/post/51ca0d3.html"/>
    <id>http://blog.xiaoyuyu.net/post/51ca0d3.html</id>
    <published>2020-09-25T08:35:10.000Z</published>
    <updated>2020-09-26T05:06:02.206Z</updated>
    
    <content type="html"><![CDATA[<p>RASA可以用于构建基于上下文的对话平台。RASA主要有两个模块，RASA-NLU用于做语义理解。RASA-Core用于对话管理。RASA的官方文档在：<a href="https://rasa.com/docs/rasa/" target="_blank" rel="noopener">https://rasa.com/docs/rasa/</a></p><a id="more"></a><h1 id="安装RASA及RASA-X"><a href="#安装RASA及RASA-X" class="headerlink" title="安装RASA及RASA X"></a>安装RASA及RASA X</h1><p>假设已经安装好了python3(因为本机已经有python2.7版本，所以使用了别名),virtualenv.</p><pre>virtualenv -p python3 venvsource venv/bin/activatepip3 install rasa-x --extra-index-url https://pypi.rasa.com/simple</pre><h1 id="RASA的Helloworld"><a href="#RASA的Helloworld" class="headerlink" title="RASA的Helloworld"></a>RASA的Helloworld</h1><p>官方示例：<a href="https://rasa.com/docs/rasa/prototype-an-assistant#train-and-talk-to-your-assistant，这里可以直接通过浏览器测试。" target="_blank" rel="noopener">https://rasa.com/docs/rasa/prototype-an-assistant#train-and-talk-to-your-assistant，这里可以直接通过浏览器测试。</a></p><h2 id="创建默认的初始项目"><a href="#创建默认的初始项目" class="headerlink" title="创建默认的初始项目"></a>创建默认的初始项目</h2><blockquote><p>rasa init –no-prompt</p></blockquote><h3 id="安装过程效果如下"><a href="#安装过程效果如下" class="headerlink" title="安装过程效果如下"></a>安装过程效果如下</h3><pre>Welcome to Rasa! 🤖To get started quickly, an initial project will be created.If you need some help, check out the documentation at https://rasa.com/docs/rasa.Created project directory at '/Users/shengl/0000-hugerfuture/0-code/20-xiaoling/205-brain/2052-rasa-framework'....Your Rasa model is trained and saved at '/Users/shengl/0000-hugerfuture/0-code/20-xiaoling/205-brain/2052-rasa-framework/models/20200926-023658.tar.gz'.If you want to speak to the assistant, run **'rasa shell'** at any time inside the project directory.</pre><ul><li>如描述所说，可以使用<strong>“rasa shell”</strong>来运行对话管理。</li></ul><h3 id="这些命令将创建以下文件"><a href="#这些命令将创建以下文件" class="headerlink" title="这些命令将创建以下文件"></a>这些命令将创建以下文件</h3><pre>-rw-r--r--  1 shengl  staff     0  9  3 22:33 __init__.pydrwxr-xr-x  4 shengl  staff   128  9 26 02:36 __pycache__-rw-r--r--  1 shengl  staff   757  9  3 22:33 actions.py-rw-r--r--  1 shengl  staff   622  9  3 22:33 config.yml-rw-r--r--  1 shengl  staff   938  9  3 22:33 credentials.ymldrwxr-xr-x  4 shengl  staff   128  9 26 02:36 data-rw-r--r--  1 shengl  staff   549  9  3 22:33 domain.yml-rw-r--r--  1 shengl  staff  1456  9  3 22:33 endpoints.ymldrwxr-xr-x  3 shengl  staff    96  9 26 02:38 modelsdrwxr-xr-x  3 shengl  staff    96  9 26 02:36 tests</pre><h3 id="解读"><a href="#解读" class="headerlink" title="解读"></a>解读</h3><h4 id="nlu"><a href="#nlu" class="headerlink" title="nlu"></a>nlu</h4><ul><li>data/nlu.md 用于定义我们的对话管理想要处理的意图。系统默认的有这些:</li></ul><pre>## intent:greet- hey- hello- hi- good morning- good evening- hey there## intent:goodbye- bye- goodbye- see you around- see you later## intent:affirm- yes- indeed- of course- that sounds good- correct</pre><ul><li>RASA NLU会识别其中的intents(意图)</li></ul><h4 id="系统配置"><a href="#系统配置" class="headerlink" title="系统配置"></a>系统配置</h4><blockquote><p>vim config.yml # 主要定义了pipline和策略</p></blockquote><pre>pipeline:  - name: WhitespaceTokenizer  - name: RegexFeaturizer  - name: LexicalSyntacticFeaturizer  - name: CountVectorsFeaturizer  - name: CountVectorsFeaturizer    analyzer: "char_wb"    min_ngram: 1    max_ngram: 4  - name: DIETClassifier    epochs: 100  - name: EntitySynonymMapper  - name: ResponseSelector    epochs: 100</pre><h4 id="对话的流程"><a href="#对话的流程" class="headerlink" title="对话的流程"></a>对话的流程</h4><ul><li>对话管理(DM,Dialogue Management)是对话平台的核心调度模块。在RASA中由RASA Core负责。我们需要定义好stories(对话场景的流程,一个story处理一种对话场景)。基本要素包括用户的意图和它需要处理的行动。</li></ul><blockquote><p>vim data/stories.md</p></blockquote><pre>## happy path* greet  - utter_greet* mood_great  - utter_happy## sad path 1* greet  - utter_greet* mood_unhappy  - utter_cheer_up  - utter_did_that_help* affirm  - utter_happy</pre><h4 id="Domain-领域"><a href="#Domain-领域" class="headerlink" title="Domain-领域"></a>Domain-领域</h4><p>Domain定义了意图（intent)和动作(action),以及对应的内容模板(templates).</p><blockquote><p>vim domain.yml</p></blockquote><pre>ntents:  - greet  - goodbye  - affirm  - deny  - mood_great  - mood_unhappy  - bot_challengeresponses:  utter_greet:  - text: "Hey! How are you?"  utter_cheer_up:  - text: "Here is something to cheer you up:"    image: "https://i.imgur.com/nGF1K8f.jpg"  utter_did_that_help:  - text: "Did that help you?"  utter_happy:  - text: "Great, carry on!"</pre><ul><li>RASA Core将管理这些流程，并且在对应的场景选择对应的动作。</li></ul><h4 id="训练模型"><a href="#训练模型" class="headerlink" title="训练模型"></a>训练模型</h4><blockquote><p>rasa train</p></blockquote><pre>Nothing changed. You can use the old model stored at '/Users/shengl/0000-hugerfuture/0-code/20-xiaoling/205-brain/2052-rasa-framework/01-rasa-startup/models/20200926-023658.tar.gz'.</pre><h4 id="对话"><a href="#对话" class="headerlink" title="对话"></a>对话</h4><blockquote><p>rasa shell</p></blockquote><pre>2020-09-26 03:26:31 INFO     root  - Connecting to channel 'cmdline' which was specified by the '--connector' argument. Any other channels will be ignored. To connect to all given channels, omit the '--connector' argument.2020-09-26 03:26:31 INFO     root  - Starting Rasa server on http://localhost:50052020-09-26 03:26:41 INFO     root  - Rasa server is up and running.Bot loaded. Type a message and press enter (use '/stop' to exit): Your input ->  hello                                                                                                                                                                                        Hey! How are you?Your input ->  whats your name                                                                                                                                                                              I am a bot, powered by Rasa.Your input ->  who am i                                                                                                                                                                                     I am a bot, powered by Rasa.Your input ->         </pre><center><img src="/img/2020/2020-9-26-1.jpg" alt></center><br><center>在浏览器中访问服务</center><h1 id="中文样例"><a href="#中文样例" class="headerlink" title="中文样例"></a>中文样例</h1><h2 id="配置修改"><a href="#配置修改" class="headerlink" title="配置修改"></a>配置修改</h2><ul><li>在data/nlu.md, data/stories.md和domain.yml里面增加对中文的支持。</li></ul><blockquote><p>vim data/nlu.md</p></blockquote><pre>## intent:greet- hey- hello- hi- good morning- good evening- hey there- 你好- 早上好- 中午好- 晚上好- 你好呀## intent:mood_happy- great- very good- nice- 很好- 不错- 我很好## intent:mood_unhappy- sad</pre><blockquote><p>vim data/stories.md # 由于这里只涉及流程，我们不准备新增流程，所以中文和英文的流程是一样的，暂时不做修改。</p></blockquote><blockquote><p>vim domain.yml</p></blockquote><pre>...responses:  utter_greet:  - text: 你好，你今天过的如何?  utter_happy:  - text: 那很不错  utter_unhappy:  - text: 发生什么事情啦，可以和我说说嘛?actions:...</pre><h2 id="训练及运行"><a href="#训练及运行" class="headerlink" title="训练及运行"></a>训练及运行</h2><blockquote><p>rasa train<br>rasa shell nlu<br>rasa shell</p></blockquote><pre>2020-09-26 03:37:03 INFO     root  - Connecting to channel 'cmdline' which was specified by the '--connector' argument. Any other channels will be ignored. To connect to all given channels, omit the '--connector' argument.2020-09-26 03:37:03 INFO     root  - Starting Rasa server on http://localhost:50052020-09-26 03:37:13 INFO     root  - Rasa server is up and running.Bot loaded. Type a message and press enter (use '/stop' to exit): Your input ->  hello                                                                                                                                                                                        你好，你今天过的如何?Your input ->  你好                                                                                                                                                                                         你好，你今天过的如何?Your input ->  还可以                                                                                                                                                                                       你好，你今天过的如何?Your input ->  不错                                                                                                                                                                                         那很不错Your input ->  晚上好                                                                                                                                                                                       你好，你今天过的如何?Your input ->  不好                                                                                                                                                                                         发生什么事情啦，可以和我说说嘛?Your input ->  你懂个啥                                                                                                                                                                                     你好，你今天过的如何?Your input ->    </pre><ul><li>最终效果如下:</li></ul><center><img src="/img/2020/2020-9-26-2.jpg" alt></center><br><center>最终效果</center><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;RASA可以用于构建基于上下文的对话平台。RASA主要有两个模块，RASA-NLU用于做语义理解。RASA-Core用于对话管理。RASA的官方文档在：&lt;a href=&quot;https://rasa.com/docs/rasa/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://rasa.com/docs/rasa/&lt;/a&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="术业专攻" scheme="http://blog.xiaoyuyu.net/categories/%E6%9C%AF%E4%B8%9A%E4%B8%93%E6%94%BB/"/>
    
    
      <category term="专栏" scheme="http://blog.xiaoyuyu.net/tags/%E4%B8%93%E6%A0%8F/"/>
    
      <category term="RASA" scheme="http://blog.xiaoyuyu.net/tags/RASA/"/>
    
      <category term="NLP" scheme="http://blog.xiaoyuyu.net/tags/NLP/"/>
    
      <category term="系列教程" scheme="http://blog.xiaoyuyu.net/tags/%E7%B3%BB%E5%88%97%E6%95%99%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>105-使用rasa-nlu-chi构造中文意图识别服务</title>
    <link href="http://blog.xiaoyuyu.net/post/217889f.html"/>
    <id>http://blog.xiaoyuyu.net/post/217889f.html</id>
    <published>2020-09-05T12:53:14.000Z</published>
    <updated>2020-09-05T13:11:16.773Z</updated>
    
    <content type="html"><![CDATA[<p>如果说NLP是AI领域的皇冠，那么NLU则是那颗皇冠上的明珠。😏</p><a id="more"></a><h1 id="克隆代码到本地"><a href="#克隆代码到本地" class="headerlink" title="克隆代码到本地"></a>克隆代码到本地</h1><blockquote><p>git clone <a href="https://github.com/crownpku/rasa_nlu_chi" target="_blank" rel="noopener">https://github.com/crownpku/rasa_nlu_chi</a></p></blockquote><h1 id="处理流程"><a href="#处理流程" class="headerlink" title="处理流程"></a>处理流程</h1><h2 id="下载依赖"><a href="#下载依赖" class="headerlink" title="下载依赖"></a>下载依赖</h2><blockquote><p>pip3 –default-timeout=1000 install -U jieba -i <a href="https://pypi.tuna.tsinghua.edu.cn/simple" target="_blank" rel="noopener">https://pypi.tuna.tsinghua.edu.cn/simple</a>  </p></blockquote><blockquote><p>pip3 sklearn</p></blockquote><h2 id="使用处理好的训练数据"><a href="#使用处理好的训练数据" class="headerlink" title="使用处理好的训练数据"></a>使用处理好的训练数据</h2><blockquote><p>python3 -m rasa_nlu.train -c sample_configs/config_jieba_mitie_sklearn.yml –data data/examples/rasa/demo-rasa_zh.json –path models</p></blockquote><h2 id="修改sklearn相关的代码"><a href="#修改sklearn相关的代码" class="headerlink" title="修改sklearn相关的代码"></a>修改sklearn相关的代码</h2><blockquote><p>代码位置在: rasa_nlu/classifiers/sklearn_intent_classifier.py</p></blockquote><p>修改的git记录</p><pre>         :param y: List of labels to convert to numeric representation -        return self.le.inverse_transform(y) +        #return self.le.inverse_transform(y) +        return self.le.inverse_transform(np.squeeze(y))     def train(self, training_data, cfg, **kwargs):         # type: (TrainingData, RasaNLUModelConfig, **Any) -> None</pre><h2 id="运行服务"><a href="#运行服务" class="headerlink" title="运行服务"></a>运行服务</h2><blockquote><p>python3 -m rasa_nlu.server -c sample_configs/config_jieba_mitie_sklearn.yml –path models</p></blockquote><p>运行时的日志如下</p><pre>2020-09-05 21:04:26 WARNING  py.warnings - /Users/shengl/0000-hugerfuture/0-code/20-xiaoling/209-github-demo/Rasa_NLU_Chi/rasa_nlu/utils/__init__.py:236: YAMLLoadWarning: calling yaml.load() without Loader=... is deprecated, as the default Loader is unsafe. Please read https://msg.pyyaml.org/load for full details.  return yaml.load(read_file(filename, "utf-8"))2020-09-05 21:04:26+0800 [-] Log opened.2020-09-05 21:04:26+0800 [-] Site starting on 50002020-09-05 21:04:26+0800 [-] Starting factory <twisted.web.server.site object at 0x110a80b00></twisted.web.server.site></pre><ul><li>测试请求</li></ul><blockquote><p>curl -XPOST localhost:5000/parse -d ‘{“q”:”我发烧了该吃什么药？”}’</p></blockquote><ul><li><p>测试效果</p><pre>{"intent": {  "name": "medical",  "confidence": 0.4941633432400155},"entities": [  {    "entity": "disease",    "value": "发烧",    "start": 1,    "end": 3,    "confidence": null,    "extractor": "ner_mitie"  }],"intent_ranking": [  {    "name": "medical",    "confidence": 0.4941633432400155  },  {    "name": "restaurant_search",    "confidence": 0.20337275690232598  },  {    "name": "affirm",    "confidence": 0.11712655806238002  },  {    "name": "goodbye",    "confidence": 0.11572347313876986  },  {    "name": "greet",    "confidence": 0.0696138686565087  }],"text": "我发烧了该吃什么药？"}</pre></li><li><p>请求后的日志<br><pre><br>2020-09-05 21:04:26 WARNING  py.warnings - /Users/shengl/0000-hugerfuture/0-code/20-xiaoling/209-github-demo/Rasa_NLU_Chi/rasa_nlu/utils/<strong>init</strong>.py:236: YAMLLoadWarning: calling yaml.load() without Loader=… is deprecated, as the default Loader is unsafe. Please read <a href="https://msg.pyyaml.org/load" target="_blank" rel="noopener">https://msg.pyyaml.org/load</a> for full details.<br>return yaml.load(read_file(filename, “utf-8”))</pre></p></li></ul><p>2020-09-05 21:04:26+0800 [-] Log opened.<br>2020-09-05 21:04:26+0800 [-] Site starting on 5000<br>2020-09-05 21:04:26+0800 [-] Starting factory &lt;twisted.web.server.Site object at 0x110a80b00&gt;<br>2020-09-05 21:06:09+0800 [-] /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/scipy/<strong>init</strong>.py:143: builtins.UserWarning: NumPy 1.14.5 or above is required for this version of SciPy (detected version 1.14.0)<br>2020-09-05 21:06:14+0800 [-] No Jieba Default Dictionary found<br>2020-09-05 21:06:14+0800 [-] No Jieba User Dictionary found<br>2020-09-05 21:06:15+0800 [-] Building prefix dict from the default dictionary …<br>2020-09-05 21:06:16+0800 [-] Dumping model to file cache /var/folders/xq/n7_8pfk11qz8p9l5s_09d5zw0000gn/T/jieba.cache<br>2020-09-05 21:06:16+0800 [-] Loading model cost 1.322 seconds.<br>2020-09-05 21:06:16+0800 [-] Prefix dict has been built successfully.<br>2020-09-05 21:06:16+0800 [-] “127.0.0.1” - - [05/Sep/2020:13:06:15 +0000] “POST /parse HTTP/1.1” 200 722 “-“ “curl/7.54.0”<br></p><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;如果说NLP是AI领域的皇冠，那么NLU则是那颗皇冠上的明珠。😏&lt;/p&gt;
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>104-微服务安全设计-用户&amp;服务鉴权</title>
    <link href="http://blog.xiaoyuyu.net/post/2270bd06.html"/>
    <id>http://blog.xiaoyuyu.net/post/2270bd06.html</id>
    <published>2020-07-21T19:28:56.000Z</published>
    <updated>2020-07-25T07:15:50.294Z</updated>
    
    <content type="html"><![CDATA[<p>微服务架构下，系统整体的安全性与原有的单体应用结构也有很多差别。我们需要解决服务间的鉴权和认证，同时也要解决对调用者进行认证。</p><a id="more"></a><h1 id="设计原则"><a href="#设计原则" class="headerlink" title="设计原则"></a>设计原则</h1><ul><li>无状态: 为了合理保持微服务水平扩展的特性。</li><li>客户端无关: 需要设计统一的安全策略来满足不同终端请求。</li><li>统一登录: 一次登录，可以在平台各个模块间共享登录状态及信息。</li><li>权限控制: 每个组件或者子系统应该有不同的权限控制。</li></ul><h1 id="常见的鉴权方案"><a href="#常见的鉴权方案" class="headerlink" title="常见的鉴权方案"></a>常见的鉴权方案</h1><h2 id="分布式session"><a href="#分布式session" class="headerlink" title="分布式session"></a>分布式session</h2><ul><li>相对于传统单体应用使用的session+中间件(如tomcat)session共享机制,服务的水平扩展受到了极大的制约。一般的优化方案是把session放在跨进程的存储架构中，比如redis。  </li><li>Springcloud同样也可以使用redis做分布式session的存储方案。</li><li>Spring Session对分布式Session提供了支持，同时也可以与Springboot/SpringCloud无缝集成。</li></ul><h2 id="API-Tokens"><a href="#API-Tokens" class="headerlink" title="API Tokens"></a>API Tokens</h2><h3 id="流程"><a href="#流程" class="headerlink" title="流程"></a>流程</h3><ul><li>Token一般会包含用户的鉴权相关信息，通过在请求当中携带token来传递状态，保证服务本身易于水平扩展。其他微服务可以从token当中提取用户，权限信息完成认证(确定是系统合法用户)和鉴权(确定该用户的角色，权限)，而不需要建立客户端对服务器端的session(一般tomcat或者其他容器共享session很麻烦)。</li></ul><p><img src="/img/2020/2020-07-24-01.jpg" alt></p><center>API Token时序图</center><br>1. 用户使用包含用户名和密码的credential包从客户端发起资源请求。这里的客户端可以是web的js代码，也可以是android或者ios系统及其他物联网设备。<br>2. 后端API接收请求后通过授权中心(也有可能是用户中心或者用户微服务),生产出token，返回给客户端。登录及认证流程完成。<br>3. 客户端获取token后，后续在token失效前都是通过携带此token发起资源请求。<br>4. 后端验证token的有效性及其权限信息，确认用户合法性及权限，然后调用对应的服务返回给客户端。<br><br>### 优点<br><em> 服务器端无状态，也不存储session，在每个请求里面携带用户信息。</em> 为水平扩展提高了上限。<br><em> 支持移动端。</em> 支持跨程序，跨域调用。<br><br>### 缺点<br><em> 每次请求都要携带token，与auth服务进行交互验证。</em> 将鉴权的性能压力由原来的每个服务承担，变成了鉴权服务器承担，并且引入了额外的请求资源消耗（但是符合职责分离的原则，便于优化）。<br><br>## JWT<br>### 描述<br>JSON Web Tokens(JWT)是一种认证协议，基于JSON的开放标准(RFC 7519)。JWT一般被用来在身份提供者和服务提供者之间传递被认证的用户身份信息，便于从服务器端获取资源，也可以增加其他一些额外的其他业务逻辑必须的声明信息。Token可以直接被用于认证，也可以用于加密。<br><br><em> 授权服务器将用户信息和授权范围序列化后放入JSON字符串，使用Base64进行编码，然后使用私钥对这个字符串进行签名，得到一个JSON Web Token。</em> 其他所有的资源服务器都应该持有对应RSA公钥，当资源服务器接收到这个在Http Header中存有的token请求，资源服务器就可以拿到这个token，并且verify他们是否用正确的私钥签名的（是否经过授权服务器签名，也就是验签)。验签通过后，反序列化之后就拿到了token中包含的有效验证信息。<br><br>### JWT认证流程<br><center><img src="/img/2020/2020-07-24-02.png" alt></center><br><center>JWT认证流程</center><ul><li>客户端调用登录接口(或者获取token接口),传入用户名密码。</li><li>服务器端请求身份认证中心，确认用户名密码正确。</li><li>服务端创建JWT,返回给客户端。</li><li>客户端拿到JWT，进行存储(可以存储在缓存中，数据库中,如果是浏览器，存储在cookie中)，在后续请求中，在HTTP请求头加上JWT。</li><li>服务端校验JWT，校验通过后，返回相关资源和数据。</li></ul><h3 id="JWT数据结构"><a href="#JWT数据结构" class="headerlink" title="JWT数据结构"></a>JWT数据结构</h3><center><img src="/img/2020/2020-07-24-03.png" alt></center><br><center>JWT数据结构</center><blockquote><p>header.payload.signature</p></blockquote><p>JWT是由此三段信息的BASE64编码之后通过.连接起来的。</p><ul><li>图上的header参数表示类型为JWT，签名算法是<strong>RS256</strong></li><li>payload用来存放有效信息<ul><li>iss: jwt的签发者。</li><li>sub: jwt所面向的用户。</li><li>aud: 接收jwt的接收方，比如测试环境用 test-api.domain.io, 生产环境用api.domain.io</li><li>exp: jwt的过期时间，必须大于签发时间。</li><li>iat: jwt的签发时间。</li><li>scope: jwt的唯一身份标志，用来标识token的一次性，避免重放攻击。</li><li>还可以定义私有字段。</li></ul></li><li>签名(signature): 使用header及payload进行base65编码，并且使用私钥进行加密。  </li></ul><blockquote><p>rsa256.sign(&lt;base64.encode(header)&gt;.&lt;base64.encode(payload)&gt;)</p></blockquote><h3 id="优点"><a href="#优点" class="headerlink" title="优点"></a>优点</h3><ul><li>是api tokens的一个标准实现，比自定义方案更加成熟稳定，易于统一规范和共识。</li><li>跨语言支持，使用JSON作为标准结构。</li><li>基于token，无状态。</li><li>占用字节小，便于传输。</li></ul><h3 id="token注销方式"><a href="#token注销方式" class="headerlink" title="token注销方式"></a>token注销方式</h3><ul><li>由于jwt的校验方式只依赖客户端持有，如果用户显式的注销，可能服务器端还未进行注销状态同步，而各个业务服务器的校验token的方式并不会去集中式的查一下是否合法，而是直接依赖非对称加密算法在业务服务器自身完成。</li><li>token可以存储在localstorage中，浏览器注销时自然情况。</li><li>token放在分布式缓存，每次校验时去查一下状态是否已经注销，但这样的话就落入了方式1当中的分布式session的逻辑，失去了快速校验的优点。</li><li>过期自动注销，过期时间可以短一些，比如20分钟。现在大部分服务的策略应该是基于此。</li></ul><h3 id="范例"><a href="#范例" class="headerlink" title="范例"></a>范例</h3><p>参考github.com/sunsetyan/9008-blog-demo/01-jwt.git</p><h2 id="OAuth2"><a href="#OAuth2" class="headerlink" title="OAuth2"></a>OAuth2</h2><center><img src="/img/2020/2020-07-24-04.png" alt></center><br><center>OAuth2流程</center><ul><li>OAuth2是一个跨服务授权(Authorization)的开放网络标准，在业界广泛应用的是2.0版本。</li><li>简单来说是客户端应用程序代表用户(得到用户的批准的情况下)去访问受保护的资源。常见的微信授权登录、支付宝小程序授权都是OAuth2的实现方案或者变种。</li></ul><h2 id="Spring-Cloud-Security"><a href="#Spring-Cloud-Security" class="headerlink" title="Spring Cloud Security"></a>Spring Cloud Security</h2><ul><li>包含了Spring Security和Spring Scurity OAuth</li><li>基于OAuth2和OPENID协议的可配置SSO登录机制。</li><li>基于tokens保证访问安全。</li><li>引入UAA(User Account and Authenticaiton)鉴权。</li></ul><h3 id="范例-1"><a href="#范例-1" class="headerlink" title="范例"></a>范例</h3><p>参考github.com/sunsetyan/9008-blog-demo/02-springcloud-security.git</p><h2 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h2><p><a href="https://www.dazhuanlan.com/2019/12/17/5df8295721b81/" target="_blank" rel="noopener">https://www.dazhuanlan.com/2019/12/17/5df8295721b81/</a><br><a href="https://blog.csdn.net/u013322876/article/details/60139167" target="_blank" rel="noopener">https://blog.csdn.net/u013322876/article/details/60139167</a></p><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;微服务架构下，系统整体的安全性与原有的单体应用结构也有很多差别。我们需要解决服务间的鉴权和认证，同时也要解决对调用者进行认证。&lt;/p&gt;
    
    </summary>
    
      <category term="术业专攻" scheme="http://blog.xiaoyuyu.net/categories/%E6%9C%AF%E4%B8%9A%E4%B8%93%E6%94%BB/"/>
    
    
      <category term="他山之石" scheme="http://blog.xiaoyuyu.net/tags/%E4%BB%96%E5%B1%B1%E4%B9%8B%E7%9F%B3/"/>
    
  </entry>
  
  <entry>
    <title>103-【模型思维】-[1-第一性原理]</title>
    <link href="http://blog.xiaoyuyu.net/post/788b8fff.html"/>
    <id>http://blog.xiaoyuyu.net/post/788b8fff.html</id>
    <published>2020-07-05T14:08:43.000Z</published>
    <updated>2020-07-06T03:46:08.786Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>我在想存在一种好的思维框架。那是物理学的东西，你知道，有点儿像第一原理推理（first principles reasoning）。总体来讲，我认为存在将事情缩减至其根本实质……你必须能够把那些问题“煮沸”才能从里面找出那些最基本的东西。<br>                                                – Elon Musk</p></blockquote><a id="more"></a><h1 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h1><p>第一性原理听起来有点难以理解，最开始的定义来自于亚里士多德曾经提出的思维模式：“在每一种系统的探索中，存在第一性原理，这是一个最基本的命题或假设，不能被省略或删除，也不能被违反。”而<strong>Elon Musk</strong>描述的是，其实我们思考问题的时候，应该总是尝试思考我当前面临的场景下，最本质的问题是什么，应该去推理得出这个领域的最本质的原理。所以也叫第一原理（比如热力学第一原理，行星运动三定律的第一定律）。那么这个模型思维的过程，可以定义为推到第一原理的思维方式。</p><h1 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h1><ol><li>第一性原理负责解决什么问题呢？比如当你想要了解用户需求的时候，你会怎么去做呢，同行的经验是”调查问卷“。当然还有用户访谈什么的。这种同行业累积的经验，就是你工作的基础层。在生活中，我们有80%的事情，依赖经验的判断就够了(正是生活中的这些不变，才能让我们应付剩下来的20%的变化和创新-但是这不是今天的重点)。但是，总有一些时候，我们需要跳出事情的表象，找到本质。</li></ol><ol start="2"><li>比如汽车大亨 Henry Ford 曾经说过：</li></ol><blockquote><p>如果我当初问用户需要什么，他们会说“一匹更快的马”。</p></blockquote><ol start="3"><li>正如《教父》中所说的:<blockquote><p>”在一秒钟内看到本质的人和花半辈子也看不清一件事本质的人,自然是不一样的命运。“</p></blockquote></li></ol><ol start="4"><li><p>当你在现有的框架下做事情，可能能够稳扎稳打的获取1%，3%的进步。但是想要持续指数级的增长10%，20%呢，很难吧。但是因为这条路，大家都已经优化了很多了，想要更进一步，其实没那么容易。</p></li><li><p>但是，换个角度呢，也许200%的增速，反而会很容易，跳出原有的思维框架。</p></li><li><p>参考<a href="http://www.woshipm.com/pmd/841189.html" target="_blank" rel="noopener">李少加</a>的解释，第一性原理有三个关注点</p><ul><li>需要针对”具体情境来分析讨论“，它不是孤立的系统。</li><li>我们要分析第一性原理所在的层次和粒度。仍然是要思考本质。</li><li>需要经过长期的实践，思考，洞察才可以。但是我们都是要调出原有的框架，思考本质。</li></ul></li><li><p>另外，不要满足于简单的解释，要思考到底，要利用自己的好奇心。同时，不停的思考自己的思维有什么局限性，想想有哪些东西是自己不知道的，并且善于运用知识体系去寻找并且发掘自己的知识盲点。</p></li><li><p>有两个学习笔记当中，有更好的例子和解释,这里就不复制粘贴了，参考:</p><ul><li><a href="https://www.jianshu.com/p/e910f4fd181b" target="_blank" rel="noopener">什么是第一性原理？</a></li><li><a href="http://www.woshipm.com/pmd/841189.html" target="_blank" rel="noopener">第一性原理:戳中问题本质的人是怎么思考的？</a></li></ul></li></ol><h1 id="案例"><a href="#案例" class="headerlink" title="案例"></a>案例</h1><h2 id="”涨工资“的第一性原理"><a href="#”涨工资“的第一性原理" class="headerlink" title="”涨工资“的第一性原理"></a>”涨工资“的第一性原理</h2><p>工资是由你的苦劳决定的吗？是由其他人的工资决定的吗？都不是。是由市场供求决定的。一个教授或者一个作家，也许要比看上去的有些职业要难得多，”有价值的“多，但是呢，因为供求关系，决定了另外一些职业的工资更高。为什么，因为商人有利可图。招聘也是一样，很多时候并不是你不符合要求，或者是你符合要求（被录取的时候），只是因为，供求刚好决定了。高考录取也是一样的，往年的录取分数线只能当做参考，今年的录取分数是由填写志愿的人的分数决定的。</p><p>想要提升工资，那么你需要换一个岗位，或者提升自己的核心竞争力而变得不可获取，或者给公司创造更多价值。</p><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p><center><img src="/img/2020/2020-07-05-01.jpg" alt></center></p><p><center>按照卡尼曼的分类，日常琐事多用用“系统1”，偷偷懒也无妨</center><br>如前面说的，我们不需要时时刻刻运用这个原理，只有遇到一些关键决策或者问题的时候，多多思考问题的本质是什么吧(20%)。剩下的时候(80%)，用图片中的System1部分，就可以啦。</p><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;我在想存在一种好的思维框架。那是物理学的东西，你知道，有点儿像第一原理推理（first principles reasoning）。总体来讲，我认为存在将事情缩减至其根本实质……你必须能够把那些问题“煮沸”才能从里面找出那些最基本的东西。&lt;br&gt;                                                – Elon Musk&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="他山之石" scheme="http://blog.xiaoyuyu.net/categories/%E4%BB%96%E5%B1%B1%E4%B9%8B%E7%9F%B3/"/>
    
    
      <category term="学习笔记" scheme="http://blog.xiaoyuyu.net/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="思维模型" scheme="http://blog.xiaoyuyu.net/tags/%E6%80%9D%E7%BB%B4%E6%A8%A1%E5%9E%8B/"/>
    
  </entry>
  
  <entry>
    <title>102-【查理芒格的100种投资思维模型】-[1-机会成本]思维模型</title>
    <link href="http://blog.xiaoyuyu.net/post/4dbaff59.html"/>
    <id>http://blog.xiaoyuyu.net/post/4dbaff59.html</id>
    <published>2020-07-04T16:30:05.000Z</published>
    <updated>2020-07-05T14:12:13.084Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><strong>定义</strong>： 机会成本是指在面临多个选择时，被舍弃的选项中最高价值(不一定是金钱的)是本次决策的机会成本,当然，你得需要等到复盘的时候才能看到。<br><strong>推论1</strong>： 没有“选项”就等于没有成本(如果你没有选择，其实等于没有成本)，一切成本都是机会的成本。   </p></blockquote><a id="more"></a><h1 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h1><h1 id="说明解读"><a href="#说明解读" class="headerlink" title="说明解读"></a>说明解读</h1><p>机会成本所指的机会必须是决策者可选择的项目，“不要说我本来可以..”，如果不是可选择的选项便不是机会。放弃的机会中的收益最高的项目才是机会成本，而不是所有放弃的可选项的收益的总和。而<strong>“沉没成本”</strong>是不能算作机会成本的。</p><p>机会成本是奥地利经济学家弗冯维塞尔在其《自然价值》中首先提出的。他通过分析成本定律，联系效用和成本，独创机会成本。他认为机会成本是潜在利益的减少<strong>而非实际发生的支出</strong>。</p><p>机会成本通常有显性机会成本和隐形机会成本组成。<br>显性机会成本：做出最优选择需要额外付出的成本，或者使用他人资源需要付给资源拥有者的货币代价。<br>隐形机会成本：使用自有资源而放弃的那个最大预期回报。</p><h1 id="案例"><a href="#案例" class="headerlink" title="案例"></a>案例</h1><h2 id="工作选择"><a href="#工作选择" class="headerlink" title="工作选择"></a>工作选择</h2><h3 id="场景"><a href="#场景" class="headerlink" title="场景"></a>场景</h3><p>笔者同时拿到了多个offer，A公司年薪120万,B公司年薪80万+60万/年的股票但是有条件(数学期望0.8）兑付,在B公司的时间要多每天2小时。</p><h3 id="解答"><a href="#解答" class="headerlink" title="解答"></a>解答</h3><p>假设其他要素相同(笔者之前做过一个工作机会的评估模型，但是这里为了讲述此思维模型先简化)，包括行业地位，公司规模，发展，职位话语权和未来机会相同。<br>那么，如果选择A公司任职，总的机会成本是：80万+60乘以0.8 = 128万<br>选择B公司任职，机会成本=120万+2小时乘以22天*12=120万+528小时</p><p>而考虑到单位时间的收益(不考虑加班带来的别的问题)，每小时单价是 120万/22乘以8乘以12 = 576/小时。实际上多付出的528小时时间是价值30万的，所以应该选择工作A。</p><h2 id="兼职与学习"><a href="#兼职与学习" class="headerlink" title="兼职与学习"></a>兼职与学习</h2><h3 id="场景-1"><a href="#场景-1" class="headerlink" title="场景"></a>场景</h3><p>平时日常有时间，可以考虑学习或者兼职。假设兼职可以每月赚5000元,每天需要2小时。而培训需要学费8000元/月，并且伙食费需要1000，住宿费需要2000.那么选择培训学习的机会成本是多少呢？</p><h3 id="解答-1"><a href="#解答-1" class="headerlink" title="解答"></a>解答</h3><p>机会成本=学费+住宿费（如果是额外的）+放弃兼职的收益 = 8800 + 2000 + 5000 = 15800。伙食费不应该当做机会成本，因为你本来就需要吃饭。如果伙食费有差价，可以算到机会成本里面。如果与放弃的东西无关，就不应该作为机会成本。</p><h2 id="感情取舍"><a href="#感情取舍" class="headerlink" title="感情取舍"></a>感情取舍</h2><h3 id="场景-2"><a href="#场景-2" class="headerlink" title="场景"></a>场景</h3><p>女朋友跟你分手了，你以前付出的感情全部付诸东流。此时可以选择自杀或者郁郁不欢，努力挽回，纠缠不休，或者果断放弃转而寻找新的爱情。</p><h3 id="解答-2"><a href="#解答-2" class="headerlink" title="解答"></a>解答</h3><ol><li>自杀的成本是: 生命，得到的收益是：解脱。</li><li>郁郁不欢的成本是：心情受损，得到的收益：负。</li><li>努力挽回的成本是：挽回所需要花的时间，心力和精力以及金钱，总成本量化为1。得到的收益是：可能（概率是0.3）可以把以前的感情挽回，假设收益是3，则数学期望是0.9。</li><li>纠缠不休：挽回所需要花的时间，心力和精力以及金钱，总成本量化为2。并且需要付出心情受损，痛苦等等，总成本量化为3。得到的收益是：可能（概率是0.3）可以把以前的感情挽回，假设收益是3，则数学期望是0.9。并且有概率（0.3）使得情况恶化，数学期望为0或者负，量化为0或者-0.3。</li><li>果断放弃转而寻找新的爱情的成本是：所需要花的时间，心力和精力以及金钱，总成本量化为1（假设把挽回的资源投入新的感情)，得到的收益：可能概率是（0.5）找到新的感情，但是因为没有感情基础(相比原来的感情收益-2)，但是也没有负担(收益+1），那么数学期望是0.5*（3-2+1）=1。</li><li>结论，应该选择3或者5.最优选择可能是5（随着概率不同略有差别）</li></ol><h1 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h1><p>人生中要面临无数次选择，不管恋爱，择业，投资都会面临选择，每次选择都要付出代价，如果你选了A，可能就不能选B。而你选择B的机会成本，不是你当前付出的成本，而是你放弃了B的收益。</p><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p><p></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;定义&lt;/strong&gt;： 机会成本是指在面临多个选择时，被舍弃的选项中最高价值(不一定是金钱的)是本次决策的机会成本,当然，你得需要等到复盘的时候才能看到。&lt;br&gt;&lt;strong&gt;推论1&lt;/strong&gt;： 没有“选项”就等于没有成本(如果你没有选择，其实等于没有成本)，一切成本都是机会的成本。   &lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="他山之石" scheme="http://blog.xiaoyuyu.net/categories/%E4%BB%96%E5%B1%B1%E4%B9%8B%E7%9F%B3/"/>
    
    
      <category term="学习笔记" scheme="http://blog.xiaoyuyu.net/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="思维模型" scheme="http://blog.xiaoyuyu.net/tags/%E6%80%9D%E7%BB%B4%E6%A8%A1%E5%9E%8B/"/>
    
      <category term="查理芒格思维模型" scheme="http://blog.xiaoyuyu.net/tags/%E6%9F%A5%E7%90%86%E8%8A%92%E6%A0%BC%E6%80%9D%E7%BB%B4%E6%A8%A1%E5%9E%8B/"/>
    
  </entry>
  
  <entry>
    <title>101-使用neo4j构建ownthink知识图谱</title>
    <link href="http://blog.xiaoyuyu.net/post/294dd39b.html"/>
    <id>http://blog.xiaoyuyu.net/post/294dd39b.html</id>
    <published>2020-06-21T03:47:57.000Z</published>
    <updated>2020-06-21T06:27:58.577Z</updated>
    
    <content type="html"><![CDATA[<p>ownthink开源了其知识图谱数据，用来作为构建知识图谱的基础数据是很好的选择。笔者选用了neo4j作为知识图谱的数据存储。</p><a id="more"></a><h1 id="结果"><a href="#结果" class="headerlink" title="结果"></a>结果</h1><ul><li>因为后面的数据导入过程实在是太长，所以先上个效果图。</li></ul><blockquote><p>MATCH (n) RETURN n LIMIT 2000</p></blockquote><p><img src="/img/2020/2020-06-21-01.jpg" alt></p><pre><code>* 诸葛亮的性别是男* 你还能看出什么别的呢?</code></pre><h1 id="环境安装"><a href="#环境安装" class="headerlink" title="环境安装"></a>环境安装</h1><ul><li>安装neo4j</li><li>安装python3(也可以用shell处理数据，不过还是算了吧)</li><li>安装go(数据处理工具,有现成的,也可以自己写python)</li></ul><h1 id="数据准备"><a href="#数据准备" class="headerlink" title="数据准备"></a>数据准备</h1><p>从百度网盘或者官网下载 <a href="https://www.ownthink.com/docs/kg/#_1" target="_blank" rel="noopener">https://www.ownthink.com/docs/kg/#_1</a></p><p>解压得到的csv文件<br>wc -l ownthink_v2.csv #可以看到其数据量</p><ul><li>zip文件应该是1.95G</li><li>解压后的csv文件有8G多</li></ul><p>解压及处理后前20行如下:</p><pre>实体,属性,值胶饴,描述,别名: 饴糖、畅糖、畅、软糖。词条,描述,词条（拼音：cí tiáo）也叫词目，是辞书学用语，指收列的词语及其释文。词条,标签,文化红色食品,描述,红色食品是指食品为红色、橙红色或棕红色的食品。红色食品,中文名,红色食品红色食品,是否含防腐剂,否红色食品,主要食用功效,预防感冒，缓解疲劳红色食品,适宜人群,全部人群红色食品,用途,增强表皮细胞再生和防止皮肤衰老红色食品,标签,非科学红色食品,标签,生活大龙湫,描述,雁荡山景区分散，东起羊角洞，西至锯板岭；南起筋竹溪，北至六坪山。大龙湫,中文名称,大龙湫大龙湫,外文名称,big dragon autrum大龙湫,地理位置,浙江省温州市雁荡山景区大龙湫,开放时间,08:00~18:00大龙湫,门票价格,50元大龙湫,著名景点,芙蓉峰大龙湫,著名景点,剪刀峰</pre><h1 id="数据处理-amp-清洗"><a href="#数据处理-amp-清洗" class="headerlink" title="数据处理&amp;清洗"></a>数据处理&amp;清洗</h1><h2 id="说明"><a href="#说明" class="headerlink" title="说明"></a>说明</h2><p>基于上面的数据分析，这里的知识图谱数据是三元组，实体，属性，值(也可以处理为实体)。用图的模型来分析，应该将他们清洗为两个点和一个边的关系才好。<br>当然更进一步，应该分析出来，哪些应该作为属性，哪些应该作为关系。<br>比如我不应该把姚明的性别“男”作为一个实体。但是应该把他的老婆“叶莉”作为实体。</p><h2 id="数据结构转换"><a href="#数据结构转换" class="headerlink" title="数据结构转换"></a>数据结构转换</h2><ul><li>将三元组数据转换为实体关系</li><li>下载 <a href="https://github.com/jievince/rdf-converter" target="_blank" rel="noopener">https://github.com/jievince/rdf-converter</a></li><li>重新编译根目录下  </li></ul><blockquote><p>go build</p></blockquote><ul><li>处理数据</li></ul><blockquote><p>./rdf-converter –path /path/to/ownthink_v2.csv</p></blockquote><ul><li>结果数据应该是4000万左右的实体数据和1.4亿左右的边的数据。</li><li><p>vertex.csv</p><pre>-2469395383949115281,过度包装-5567206714840433083,Over  Package3836323934884101628,有的商品故意增加包装层数1185893106173039861,很多采用实木、金属制品3455734391170888430,非科学9183164258636124946,教育5258679239570815125,成熟市场-8062106589304861485,"成熟市场是指低增长率,高占有率的市场。"</pre></li><li><p>edge.csv</p><pre>3413383836870836248,-948987595135324087,含义3413383836870836248,8037179844375033188,定义3413383836870836248,-2559124418148243756,标签3413383836870836248,8108596883039039864,标签2587975790775251569,-4666568475926279810,描述2587975790775251569,2587975790775251569,中文名称2587975790775251569,3771551033890875715,外文名称2587975790775251569,2900555761857775043,地理位置2587975790775251569,-1913521037799946160,占地面积2587975790775251569,-1374607753051283066,开放时间</pre></li></ul><h2 id="数据格式转换"><a href="#数据格式转换" class="headerlink" title="数据格式转换"></a>数据格式转换</h2><ul><li>之前数据清洗的工具是照着Nebula Graph 开发的，所以要改造成neo4j可导入的格式，还需要弄一下neo4j。参考<a href="https://blog.csdn.net/muruibin88/java/article/details/106475757" target="_blank" rel="noopener">ownthink格式转换</a></li></ul><h3 id="python格式转换代码"><a href="#python格式转换代码" class="headerlink" title="python格式转换代码"></a>python格式转换代码</h3><pre>def prep_vertex_all():    # 注意替换成自己的路径    ferror = open("kg/kg-clean/err_vertex.csv",'w')    frname = "kg/kg-clean/vertex.csv"    fwname = "kg/kg-clean/vertex_output_vertex_all.csv"    with open(frname, 'r') as fr:        with open(fwname, 'w') as fw:            fw.write("{},{},{}\n".format(":ID", "name", ":LABEL"))            for line in fr:                try:                    # print(line.strip())                    line = line.strip()                    if not line:                        continue                    spo = line.split(",")                    # print(spo)                    fw.write("{},{},{}\n".format(spo[0], spo[1].replace('"',''), "ENTITY"))                except:                    ferror.write("{}\n".format(line))                    continuedef prep_edge_all():    ferror = open("kg/kg-clean/err_edge.csv",'w')    frname = "kg/kg-clean/edge.csv"    fwname = "kg/kg-clean/edge_output_all.csv"    print(frname)    print(fwname)    with open(frname, 'r') as fr:        with open(fwname, 'w') as fw:            fw.write("{},{},{},{}\n".format(":START_ID", "name", ":END_ID", ":TYPE"))            for line in fr:                try:                    # print(line.strip())                    line = line.strip()                    if not line:                        continue                    spo = line.split(",")                    # print(spo)                    fw.write("{},{},{},{}\n".format(spo[0], spo[2].replace('"', ''), spo[1], "RELATIONSHIP"))                except:                    ferror.write("{}\n".format(line))                    continueif __name__ == '__main__':    prep_vertex_all()    prep_edge_all()</pre><h3 id="格式转换后的csv文件"><a href="#格式转换后的csv文件" class="headerlink" title="格式转换后的csv文件"></a>格式转换后的csv文件</h3><ul><li><p>实体</p><pre>:ID,name,:LABEL-201035082963479683,实体,ENTITY-1779678833482502384,值,ENTITY4646408208538057683,胶饴,ENTITY-1861609733419239066,别名: 饴糖、畅糖、畅、软糖。,ENTITY-2047289935702608120,词条,ENTITY5842706712819643509,词条（拼音：cí tiáo）也叫词目，是辞书学用语，指收列的词语及其释文。,ENTITY-3063129772935425027,文化,ENTITY-2484942249444426630,红色食品,ENTITY-3877061284769534378,红色食品是指食品为红色、橙红色或棕红色的食品。,ENTITY-3402450096279275143,否,ENTITY4786182067583989997,预防感冒，缓解疲劳,ENTITY-8978611301755314833,全部人群,ENTITY-382812815618074210,增强表皮细胞再生和防止皮肤衰老,ENTITY3455734391170888430,非科学,ENTITY-4368442157131186527,生活,ENTITY-4016848910133347272,大龙湫,ENTITY-1751058806841876591,雁荡山景区分散，东起羊角洞，西至锯板岭；南起筋竹溪，北至六坪山。,ENTITY-4369745808943528904,big dragon autrum,ENTITY-3278556255913778158,浙江省温州市雁荡山景区,ENTITY</pre></li><li><p>关系</p><pre>:START_ID,name,:END_ID,:TYPE-201035082963479683,属性,-1779678833482502384,RELATIONSHIP4646408208538057683,描述,-1861609733419239066,RELATIONSHIP-2047289935702608120,描述,5842706712819643509,RELATIONSHIP-2047289935702608120,标签,-3063129772935425027,RELATIONSHIP-2484942249444426630,描述,-3877061284769534378,RELATIONSHIP-2484942249444426630,中文名,-2484942249444426630,RELATIONSHIP-2484942249444426630,是否含防腐剂,-3402450096279275143,RELATIONSHIP-2484942249444426630,主要食用功效,4786182067583989997,RELATIONSHIP-2484942249444426630,适宜人群,-8978611301755314833,RELATIONSHIP-2484942249444426630,用途,-382812815618074210,RELATIONSHIP-2484942249444426630,标签,3455734391170888430,RELATIONSHIP-2484942249444426630,标签,-4368442157131186527,RELATIONSHIP-4016848910133347272,描述,-1751058806841876591,RELATIONSHIP-4016848910133347272,中文名称,-4016848910133347272,RELATIONSHIP-4016848910133347272,外文名称,-4369745808943528904,RELATIONSHIP-4016848910133347272,地理位置,-3278556255913778158,RELATIONSHIP-4016848910133347272,开放时间,-1081363081064284954,RELATIONSHIP-4016848910133347272,门票价格,3797530799472559859,RELATIONSHIP-4016848910133347272,著名景点,6249183780323029504,RELATIONSHIP</pre></li></ul><h1 id="数据导入neo4j"><a href="#数据导入neo4j" class="headerlink" title="数据导入neo4j"></a>数据导入neo4j</h1><ul><li><p>使用neo4j-admin import指令来导入</p><blockquote><p>./bin/neo4j-admin import –database=graph.db –mode=csv –nodes /Users/shengl/24-xiaoling/1600-data/01-Archived/01-cleandata/rdf-converter/vertex_output_vertex_all.csv –relationships /Users/shengl/24-xiaoling/1600-data/01-Archived/01-cleandata/rdf-converter/edge_output_all.csv –ignore-duplicate-nodes=true –ignore-missing-nodes=true –id-type=string</p></blockquote></li><li><p>导入的执行过程如下</p></li><li>Tips中途有几次卡死的情况，我每次都是重新处理的。但是考虑到我们的数据量实在是太大，占用内存很多，所以其实可以安静的等待结果</li></ul><pre>Neo4j version: 3.5.12Importing the contents of these files into /Users/shengl/2-sys-ai/neo4j-3.5.12/data/databases/graph.db:Nodes:  /Users/shengl/24-xiaoling/1600-data/01-Archived/01-cleandata/rdf-converter/vertex_output_vertex_all.csvRelationships:  /Users/shengl/24-xiaoling/1600-data/01-Archived/01-cleandata/rdf-converter/edge_output_all.csvAvailable resources:  Total machine memory: 8.00 GB  Free machine memory: 443.01 MB  Max heap memory : 1.78 GB  Processors: 4  Configured max memory: 5.60 GB  High-IO: trueWARNING: 300.88 MB memory may not be sufficient to complete this import. Suggested memory distribution is:heap size: 1.02 GBminimum free and available memory excluding heap size: 2.52 GBImport starting 2020-06-21 00:56:14.222+0800  Estimated number of nodes: 124.08 M  Estimated number of node properties: 124.04 M  Estimated number of relationships: 153.90 M  Estimated number of relationship properties: 153.88 M  Estimated disk space usage: 23.27 GB  Estimated required memory usage: 2.52 GBInteractiveReporterInteractions command list (end with ENTER):  c: Print more detailed information about current stage  i: Print more detailed information(1/4) Node import 2020-06-21 00:56:14.318+0800  Estimated number of nodes: 124.08 M  Estimated disk space usage: 12.52 GB  Estimated required memory usage: 2.52 GB.......... .......... .......... .......... ..........   5% ∆59s 400ms.......... .......... .......... .......... ..........  10% ∆44s 67ms.......... .......... .......... .......... ..........  15% ∆40s 843ms.......... .......... .......... .......... .......-..  20% ∆1s 846ms.......... .......... .......... .......... ..........  25% ∆0ms.......... .......... .......... .......... ..........  30% ∆21s 900ms.......... .......... .......... .......... ..........  35% ∆24s 483ms.......... .......... .......... .......... ..........  40% ∆21s 689ms.......... .......... .......... .......... ..........  45% ∆3s 624ms.......... .......... .......... .......... ..........  50% ∆9s 70ms.......... .......... .......... .......... ..........  55% ∆19s 469ms.......... .......... .......... .......... ..........  60% ∆22s 82ms.......... .......... .......... .......... ..........  65% ∆26s 136ms.......... .......... .......... .......... ..........  70% ∆43s 238ms.......... .......... .......... .......... ..........  75% ∆1m 21s 497ms.......... ........-. .......... .......... ..........  80% ∆12m 31s 254ms.......... .......... .......... .......... ..........  85% ∆8ms.......... .......... .......... .......... ..........  90% ∆0ms.......... .......... .......... .......... ..........  95% ∆0ms.......... .......... .......... .......... .........(2/4) Relationship import 2020-06-21 01:16:45.024+0800  Estimated number of relationships: 153.90 M  Estimated disk space usage: 10.75 GB  Estimated required memory usage: 3.19 GB.......... .......... .......... .......... ..........   5% ∆3m 13s 542ms.......... .......... .......... .......... ..........  10% ∆3m 11s 870ms.......... .......... .......... .......... ..........  15% ∆3m 19s 289ms.......... .......... .......... .......... ..........  20% ∆3m 9s 639ms.......... .......... .......... .......... ..........  25% ∆3m 950ms.......... .......... .......... .......... ..........  30% ∆2m 55s 403ms.......... .......... .......... .......... ..........  35% ∆2m 59s 21ms.......... .......... .......... .......... ..........  40% ∆2m 32s 129ms.......... .......... .......... .......... ..........  45% ∆2m 34s 393ms.......... .......... .......... .......... ..........  50% ∆2m 41s 458ms.......... .......... .......... .......... ..........  55% ∆2m 52s 905ms.......... .......... .......... .......... ..........  60% ∆2m 8s 285ms.......... .......... .......... .......... ..........  65% ∆2m 9s 676ms.......... .......... .......... .......... ..........  70% ∆2m 10s 811ms.......... .......... .......... .......... ..........  75% ∆2m 2s 33ms.......... .......... .......... .......... ..........  80% ∆3m 55s 170ms.......... .......... .......... .......... ..........  85% ∆3m 31s 936ms.......... .......... .......... .......... ..........  90% ∆3m 18s 954ms.......... .......... .......... .......... ..........  95% ∆51s 591ms.......... .......... .......... .......... .......... 100% ∆1ms(3/4) Relationship linking 2020-06-21 02:09:24.090+0800  Estimated required memory usage: 1.46 GB.......... .......... .......... .......... ..........   5% ∆20s 682ms.......... .......... .......... .......... ..........  10% ∆30s 169ms.......... .......... .......... .......... ..........  15% ∆29s 796ms.......... .......... .......... .......... .........-  20% ∆202ms.......... .......... .......... .......... ..........  25% ∆6s 441ms.......... .......... .......... .......... ..........  30% ∆6s 818ms.......... .......... .......... .......... ..........  35% ∆12s 849ms.......... .......... .......... .......... ..........  40% ∆5s 14ms.......... .......... .......... .......... ..........  45% ∆16s 472ms.......... .......... .......... .......... ..........  50% ∆14s 857ms.......... .......... .......... .......... ..........  55% ∆24s 711ms.......... .......... .......... .......... ........-.  60% ∆331ms.......... .......... .......... .......... ..........  65% ∆5s 810ms.......... .......... .......... .......... ..........  70% ∆7s 29ms.......... .......... .......... .......... ..........  75% ∆15s 47ms.......... .......... .......... .......... ..........  80% ∆7s 229ms.......... .......... .......... .......... ..........  85% ∆20s 888ms.......... .......... .......... .......... ..........  90% ∆26s 123ms.......... .......... .......... .......... ..........  95% ∆15s 461ms.......... .......... .......... .......... .......... 100% ∆23s 694ms(4/4) Post processing 2020-06-21 02:15:32.752+0800  Estimated required memory usage: 1020.01 MB-......... .......... .......... .......... ..........   5% ∆5s 435ms.......... .......... .......... .......... ..........  10% ∆2s 612ms.......... .......... .......... .......... ..........  15% ∆3s 407ms.......... .......... .......... .......... ..........  20% ∆2s 9ms.......... .......... .......... .......... ..........  25% ∆2s 10ms.......... .......... .......... .......... ..........  30% ∆1s 423ms.......... .......... .......... .......... ..........  35% ∆1s 609ms.......... .......... .......... .......... ......-...  40% ∆349ms.......... .......... .......... .......... ..........  45% ∆1s 809ms.......... .......... .......... .......... ..........  50% ∆2s 5ms.......... .......... .......... .......... ..........  55% ∆4s 214ms.......... .......... .......... .......... ..........  60% ∆2s 207ms.......... .......... .......... .......... ..........  65% ∆6s 821ms.......... .......... .......... .......... ..........  70% ∆4s 7ms.......... .......... .......... .......... ..........  75% ∆2s 612ms.......... .......... .......... .......... ..........  80% ∆2s 610ms.......... .......... .......... .......... ..........  85% ∆4s 8ms.......... .......... .......... .......... ..........  90% ∆2s 2ms.......... .......... .......... .......... ..........  95% ∆2s 804ms.......... .......... .......... .......... .......... 100% ∆1s 807msIMPORT DONE in 1h 20m 44s 293ms. Imported:  45464809 nodes  139951301 relationships  185317766 propertiesPeak memory usage: 3.19 GBThere were bad entries which were skipped and logged into /Users/shengl/2-sys-ai/neo4j-3.5.12/import.report</pre><h1 id="待改进"><a href="#待改进" class="headerlink" title="待改进"></a>待改进</h1><ul><li>最后效果可以看文章开头的结果。</li><li>如何识别其中的属性值(非实体的值,比如身高175这种)，可能要专门写数据处理程序来处理。</li><li>参考文献  <ul><li><a href="https://cloud.tencent.com/developer/article/1451738" target="_blank" rel="noopener">https://cloud.tencent.com/developer/article/1451738</a></li><li><a href="https://blog.csdn.net/muruibin88/article/details/106475757/" target="_blank" rel="noopener">https://blog.csdn.net/muruibin88/article/details/106475757/</a></li><li><a href="https://github.com/jievince/rdf-converter" target="_blank" rel="noopener">https://github.com/jievince/rdf-converter</a></li><li><a href="https://www.cnblogs.com/nebulagraph/p/11934229.html" target="_blank" rel="noopener">https://www.cnblogs.com/nebulagraph/p/11934229.html</a></li><li><a href="https://blog.csdn.net/sinat_26917383/article/details/82424508" target="_blank" rel="noopener">https://blog.csdn.net/sinat_26917383/article/details/82424508</a></li><li><a href="http://openkg.cn/" target="_blank" rel="noopener">http://openkg.cn/</a> <p><!--<span id="busuanzi_container_page_pv">阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p></li></ul></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;ownthink开源了其知识图谱数据，用来作为构建知识图谱的基础数据是很好的选择。笔者选用了neo4j作为知识图谱的数据存储。&lt;/p&gt;
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>100-【摘要】谈谈“伪自律”</title>
    <link href="http://blog.xiaoyuyu.net/post/26256d45.html"/>
    <id>http://blog.xiaoyuyu.net/post/26256d45.html</id>
    <published>2020-06-16T08:35:53.000Z</published>
    <updated>2020-06-17T14:36:25.426Z</updated>
    
    <content type="html"><![CDATA[<p>所谓“伪自律”，就是做不到为了清晰明确的目标而持之以恒，过分追求形式感和仪式感，用表面上的自律，来回避绩效的追问。</p><p>这样的自律，一旦少了外力的作用，就极易反弹，于是周而复始，绵绵无期。</p><a id="more"></a><h1 id="01"><a href="#01" class="headerlink" title="01"></a>01</h1><p>数学上有一个概念，叫<strong>马尔可夫过程。</strong></p><p><strong>指的是不管初始条件为何，均会收敛于特定均衡的过程。</strong></p><h1 id="02"><a href="#02" class="headerlink" title="02"></a>02</h1><p>伪自律者的“改变”，也是一个马尔可夫过程。</p><p>比如，加入学习群的人，闲暇时只做两件事，读书和玩手机；如果读书就有60%概率继续读下去，40%概率转去玩手机；如果玩手机就有90%概率继续玩手机，10%概率转去读书。</p><p>那么，计算后会发现，不管最初在读书和玩手机上怎么分配时间，不管反复多少次，最终都会收敛到一个均衡：80%时间玩手机，20%时间读书。</p><p>也就是说，即便你有一段时间发疯式地，将100%闲暇时间都用于读书，过一段时间也会故态复萌。</p><p>这就是为什么强迫自己自律一段时间后，打卡活动一结束，坏习惯又反弹的原因。</p><p>要改善这个问题，就必须改变状态切换的概率。</p><p>比如，读书时，60%概率继续读下去，提高到90%。玩手机时，90%概率继续玩手机，降低到50%。</p><p>做到这一点的方法有很多，比如读书时把手机调静音、关机、或是放在自己不容易看到的地方等等。</p><p>要想从根本上解决自律的问题，就必须改变整个生活方式，而不是为了打卡而学习，为了“读完多少页”而读书。</p><p>关于健身和减肥的问题也是一样，不是为了让自己“看到”体重的下降，规定自己要进食多少、完成多少的运动量，而是应该从根本上改变自己的生活方式。</p><p>什么是所谓的生活方式？</p><p>作家Lachel提到，<strong>可持续的，无需费力的，才是生活方式。</strong></p><p>把减肥健身当任务，当作苦差事，每次吃饭都要精挑细选算上大半天，这种方式就不可持续。</p><p>好的生活方式是，锻炼先从简单的有氧运动开始，饮食一点一点地改善。</p><p>在锻炼的过程中，去体会其中的乐趣，感受它带给你的改变：精力更旺盛了；不容易疲劳了……慢慢地，你就会坚持下来，直到变成一种习惯，乃至于停不下来。</p><p>调整饮食的过程中，先戒掉零食，接着妥善安排好一日三餐的摄入量，直到你的身体适应了这种模式，再也不想吃太多东西为止。</p><p>在这个过程中，你的体重不一定会下降，有可能会波动，但是你的整个生活状态在慢慢变好，慢慢变健康。</p><p><strong>长此以往，当这种生活状态成为习惯后，你想要达到的目标自然也慢慢实现了。</strong></p><h1 id="03"><a href="#03" class="headerlink" title="03"></a>03</h1><p>那些玩一样就减肥成功的人，并没有多神通广大。</p><p>他们只不过比那些急功近利的人，更能沉下心来，一点一滴地改变自己的整个生活模式，系统地让自己进入更好的状态。</p><p>74岁黄百鸣保持一身肌肉的秘诀，也是如此。</p><p>对于身材管理，黄百鸣早前就有自曝过他健康的生活方式：</p><p>饮食上，少油，拒绝零食和垃圾食品，多吃蔬菜和水果，饭只吃七分饱。</p><p>运动上，他时间有限，只有周末的两天时间去健身房。</p><p>但即便如此，只要身体适应了这个规律，古稀之年的黄百鸣，也依然能够拥有六块腹肌的好身材。</p><p>作家桐华曾说：“最终能让人成功的，还是不带任何功利心的兴趣。”</p><p><strong>最好的自律，不是刻意去做什么，以成为什么样的人，而是先成为什么样的人，并从中体验到乐趣，那么一切就会自然而然地变好。</strong></p><p>希望你我都能掌握这个规律，摆脱“伪自律”的人生。</p><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;所谓“伪自律”，就是做不到为了清晰明确的目标而持之以恒，过分追求形式感和仪式感，用表面上的自律，来回避绩效的追问。&lt;/p&gt;
&lt;p&gt;这样的自律，一旦少了外力的作用，就极易反弹，于是周而复始，绵绵无期。&lt;/p&gt;
    
    </summary>
    
      <category term="他山之石" scheme="http://blog.xiaoyuyu.net/categories/%E4%BB%96%E5%B1%B1%E4%B9%8B%E7%9F%B3/"/>
    
    
      <category term="方法论" scheme="http://blog.xiaoyuyu.net/tags/%E6%96%B9%E6%B3%95%E8%AE%BA/"/>
    
      <category term="自律" scheme="http://blog.xiaoyuyu.net/tags/%E8%87%AA%E5%BE%8B/"/>
    
      <category term="伪自律" scheme="http://blog.xiaoyuyu.net/tags/%E4%BC%AA%E8%87%AA%E5%BE%8B/"/>
    
  </entry>
  
  <entry>
    <title>99-跨域请求详解</title>
    <link href="http://blog.xiaoyuyu.net/post/2b54d784.html"/>
    <id>http://blog.xiaoyuyu.net/post/2b54d784.html</id>
    <published>2020-05-31T07:20:08.000Z</published>
    <updated>2020-05-31T15:12:02.883Z</updated>
    
    <content type="html"><![CDATA[<p>以前每次遇到跨域的问题，都是case by case解决掉了，从来没有系统的分析过这里面的原理，这次整理一下各种框架和情况下会遇到的问题。</p><a id="more"></a><h1 id="跨域问题解释"><a href="#跨域问题解释" class="headerlink" title="跨域问题解释"></a>跨域问题解释</h1><p>跨域访问，是指浏览器在一个网站下不能执行其他网站的脚本，它是由浏览器的同源策略造成的，是浏览器对JavaScript试试的安全限制。</p><p>同源策略限制了以下行为：</p><ul><li>Cookie、LocalStorage和IndexDB无法读取。</li><li>DOM和JS对象无法获取。</li><li>Ajax请求发送不出去。</li></ul><h1 id="跨域场景说明"><a href="#跨域场景说明" class="headerlink" title="跨域场景说明"></a>跨域场景说明</h1><p>跨域的反义词是同源，那么同源是指的域名、端口、协议均相同。</p><blockquote><p><a href="http://www.xiaoyuyu.net/index.html" target="_blank" rel="noopener">http://www.xiaoyuyu.net/index.html</a> 调用 <a href="http://www.xiaoyuyu.net/helloworld.do" target="_blank" rel="noopener">http://www.xiaoyuyu.net/helloworld.do</a> 非跨域</p></blockquote><blockquote><p><a href="http://www.xiaoyuyu.net/index.html" target="_blank" rel="noopener">http://www.xiaoyuyu.net/index.html</a> 调用 <a href="http://www.baidu.com/helloworld.do" target="_blank" rel="noopener">http://www.baidu.com/helloworld.do</a> 跨域，主域名不同。</p></blockquote><blockquote><p><a href="http://www.xiaoyuyu.net/index.html" target="_blank" rel="noopener">http://www.xiaoyuyu.net/index.html</a> 调用 <a href="http://blog.xiaoyuyu.net/hello.do">http://blog.xiaoyuyu.net/hello.do</a> 跨域，子域名不同。</p></blockquote><blockquote><p><a href="http://www.xiaoyuyu.net/index.html" target="_blank" rel="noopener">http://www.xiaoyuyu.net/index.html</a> 调用 <a href="http://www.xiaoyuyu.net:8080/hello.do" target="_blank" rel="noopener">http://www.xiaoyuyu.net:8080/hello.do</a> 跨域，端口不同</p></blockquote><blockquote><p><a href="http://www.xiaoyuyu.net/index.html" target="_blank" rel="noopener">http://www.xiaoyuyu.net/index.html</a> 调用 <a href="https://www.xiaoyuyu.net/hello.do" target="_blank" rel="noopener">https://www.xiaoyuyu.net/hello.do</a> 跨域，协议不同</p></blockquote><blockquote><p>localhost 调用127.0.0.1 跨域，IP不同(浏览器并不会去查路由表)</p></blockquote><h1 id="解决方案-降低浏览器安全策略"><a href="#解决方案-降低浏览器安全策略" class="headerlink" title="解决方案-降低浏览器安全策略"></a>解决方案-降低浏览器安全策略</h1><p>由于跨域限制是浏览器行为，所以首先可以通过降低浏览器安全策略的方式来进行调试。这种方式适用于联调阶段且生产环境最后是同源的情况。比如开发在本地进行联调，最后代码会部署到同源的服务器上。这样做的意义在于不要为了解决跨域问题引入跨站攻击(当然跨站攻击应该额外防御)。</p><h2 id="Chrome"><a href="#Chrome" class="headerlink" title="Chrome"></a>Chrome</h2><blockquote><p>mkdir ~/.chrome-config-for-cors # 文件夹是用来保存关闭安全策略后的用户信息的</p></blockquote><blockquote><p>open -n /Applications/Google\ Chrome.app/ –args –disable-web-security –user-data-dir=~/.chrome-config-for-cors  </p></blockquote><h2 id="Firefox"><a href="#Firefox" class="headerlink" title="Firefox"></a>Firefox</h2><ul><li>进入浏览器配置页，浏览器地址栏输入： about:config</li><li>点击我了解此风险。</li><li>搜索 security.fileuri.strict_origin_policy, 设置为false</li><li>重启浏览器</li></ul><h1 id="跨域解决方案-技术方案"><a href="#跨域解决方案-技术方案" class="headerlink" title="跨域解决方案-技术方案"></a>跨域解决方案-技术方案</h1><p>如果本来就需要使用非同源策略来进行最终的生产环境部署，那么我们不应该采用上面的策略。</p><h2 id="JSONP跨域"><a href="#JSONP跨域" class="headerlink" title="JSONP跨域"></a>JSONP跨域</h2><p>jsonp跨域其实也是JavaScript设计模式中的一种代理模式，在HTML页面中通过相应的标签从不同域名下加载静态资源文件是被浏览器允许的，所以可以用这种方式先绕过跨域限制。一般我们可以动态的创建Script标签，再去请求一个带参数网址来实现跨域通信。</p><h3 id="原生方式实现"><a href="#原生方式实现" class="headerlink" title="原生方式实现"></a>原生方式实现</h3><pre>let script = document.createElement('script');script.src = 'http://www.xiaoyuyu.net/login?username=shengl&callback=callback';document.body.appendChild(script);function callback(res) {    console.log(res);}</pre><h3 id="JQuery方式实现"><a href="#JQuery方式实现" class="headerlink" title="JQuery方式实现"></a>JQuery方式实现</h3><pre>$.ajax({    url: "http://www.xiaoyuyu.net/login',    type: "GET",    dataType: "jsonp", // 请求方式为jsonp    jsonpCallback: "callback",    data: {        "username": "shengl"    }})</pre><p>使用JSONP只能满足GET请求。</p><h2 id="document-domain-iframe跨域"><a href="#document-domain-iframe跨域" class="headerlink" title="document.domain + iframe跨域"></a>document.domain + iframe跨域</h2><p>这种跨域方式主要要求主域名相同。<br>假设a.xiaoyuyu.net和b.xiaoyuyu.net分别指向不同ip的服务器。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">// a.xiaoyuyu.net/text.html</span><br><span class="line"><span class="meta">&lt;!DOCTYPE html&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>html<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span> = <span class="string">"jquery-1.12.1.js"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span>&gt;</span>A页面<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">iframe</span> </span></span><br><span class="line"><span class="tag">    <span class="attr">style</span> = <span class="string">"display : none"</span> </span></span><br><span class="line"><span class="tag">    <span class="attr">name</span> = <span class="string">"iframe1"</span> </span></span><br><span class="line"><span class="tag">    <span class="attr">id</span> = <span class="string">"iframe"</span> </span></span><br><span class="line"><span class="tag">    <span class="attr">src</span>=<span class="string">"http://b.xiaoyuyu.net/1.html"</span> <span class="attr">frameborder</span>=<span class="string">"0"</span>&gt;</span><span class="tag">&lt;/<span class="name">iframe</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="undefined">        $(function()&#123;</span></span><br><span class="line"><span class="undefined">            try&#123;</span></span><br><span class="line"><span class="undefined">                document.domain = "xiaoyuyu.net"</span></span><br><span class="line"><span class="undefined">            &#125;catch(e)&#123;&#125;</span></span><br><span class="line"><span class="undefined">            $("#iframe").load(function()&#123;</span></span><br><span class="line"><span class="undefined">                var jq = document.getElementById('iframe').contentWindow.$</span></span><br><span class="line"><span class="undefined">                jq.get("http:/xiaoyuyu.net/test.json",function(data)&#123;</span></span><br><span class="line"><span class="undefined">                    console.log(data);</span></span><br><span class="line"><span class="undefined">                &#125;);</span></span><br><span class="line"><span class="undefined">            &#125;)</span></span><br><span class="line"><span class="undefined">        &#125;)</span></span><br><span class="line"><span class="undefined">    </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><h2 id="跨域资源共享CORS"><a href="#跨域资源共享CORS" class="headerlink" title="跨域资源共享CORS"></a>跨域资源共享CORS</h2><p>目前主流的跨域解决方案</p><h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><ul><li>CORS是一个W3C标准，全称是“跨域资源共享”(Cross-Origin Resource Sharing)。他允许浏览器向跨院服务器发出XMLHttpRequest请求，从而克制AJAX只能同源使用的限制。  </li><li>CORS需要浏览器和服务器同时支持，IE8以下不能支持，IE8/IE9需要使用XDomainRequest对象来支持CORS。</li><li>整个CORS通信过程都是浏览器自动完成，不需要用户参与。对于开发者来说，CORS通信与同源的AJAX通信没有差别。浏览器一旦发现AJAX请求跨源，就会自动添加一些附加的头信息，有时候还会多出一次附加请求。</li></ul><h3 id="两种请求"><a href="#两种请求" class="headerlink" title="两种请求"></a>两种请求</h3><p>在此场景下分为两种请求，一种是简单请求，一种是非简单请求。简单请求的条件如下:</p><ul><li>请求方式为HEAD、POST或者GET。</li><li>http头信息不超过以下字段：Accept、Accept-Language、Content-Language、Last-Event-ID、Content-Type(限于三个值: application/x-www-form-urlencoded、multipart/form-data、text/plain)</li><li>浏览器对于简单请求和非简单请求的处理方式不同。</li></ul><h3 id="简单请求基本流程"><a href="#简单请求基本流程" class="headerlink" title="简单请求基本流程"></a>简单请求基本流程</h3><p>对于简单请求，浏览器直接发出CORS请求。具体来说，就是在头信息中加一个origin字段。下面是一个例子，浏览器发现这次跨源AJAX请求是简单请求，就自动在头信息之中，添加一个Origin字段。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">GET /cors HTTP/1.1</span><br><span class="line">Origin: http://api.bob.com</span><br><span class="line">Host: api.alice.com</span><br><span class="line">Accept-Language: en-US</span><br><span class="line">Connection: keep-alive</span><br><span class="line">User-Agent: Mozilla/5.0</span><br></pre></td></tr></table></figure><p>Origin字段用来说明，本次请求来自哪个源(协议+域名+端口)。服务器根据这个值，决定是否同意这次请求。<br>如果Origin指定的源，不在许可范围内，服务器会返回一个正常的HTTP回应。浏览器发现这个回应的头信息没有包含Access-Control-Allow-Origin字段，就知道出错了，从而抛出一个错误，被XMLHttpRequest的onerror回调捕获。<br>这种错误无法通过状态码识别。因为HTTP返回码有可能是200.<br>如果Origin指定的域名在许可范围内，服务器返回的响应，会多出几个头信息字段。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Access-Control-Allow-Origin: http://api.bob.com</span><br><span class="line">   Access-Control-Allow-Credentials: true</span><br><span class="line">   Access-Control-Expose-Headers: FooBar</span><br><span class="line">   Content-Type: text/html; charset=utf-8</span><br></pre></td></tr></table></figure><p>上面的头信息之中，有三个与CORS请求相关的字段，都以Access-Control-开头</p><p>Access-Control-Allow-Origin :该字段是必须的。它的值要么是请求时Origin字段的值，要么是一个*，表示接受任意域名的请求<br>Access-Control-Allow-Credentials: 该字段可选。它的值是一个布尔值，表示是否允许发送Cookie。默认情况下，Cookie不包括在CORS请求之中。设为true，即表示服务器明确许可，Cookie可以包含在请求中，一起发给服务器。这个值也只能设为true，如果服务器不要浏览器发送Cookie，删除该字段即可。<br>Access-Control-Expose-Headers:该字段可选。CORS请求时，XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段：Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段，就必须在Access-Control-Expose-Headers里面指定  </p><h4 id="withCredentials-属性"><a href="#withCredentials-属性" class="headerlink" title="withCredentials 属性"></a>withCredentials 属性</h4><p>上面说到，CORS请求默认不发送Cookie和HTTP认证信息。如果要把Cookie发到服务器，一方面要服务器同意，指定Access-Control-Allow-Credentials字段。<br>另一方面，开发者必须在AJAX请求中打开withCredentials属性。<br><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> xhr = <span class="keyword">new</span> XMLHttpRequest(); <span class="comment">// IE8/9需用window.XDomainRequest兼容</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 前端设置是否带cookie</span></span><br><span class="line">xhr.withCredentials = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">xhr.open(<span class="string">'post'</span>, <span class="string">'http://www.domain2.com:8080/login'</span>, <span class="literal">true</span>);</span><br><span class="line">xhr.setRequestHeader(<span class="string">'Content-Type'</span>, <span class="string">'application/x-www-form-urlencoded'</span>);</span><br><span class="line">xhr.send(<span class="string">'user=admin'</span>);</span><br><span class="line"></span><br><span class="line">xhr.onreadystatechange = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (xhr.readyState == <span class="number">4</span> &amp;&amp; xhr.status == <span class="number">200</span>) &#123;</span><br><span class="line">        alert(xhr.responseText);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// jquery</span></span><br><span class="line">$.ajax(&#123;</span><br><span class="line">    ...</span><br><span class="line">   xhrFields: &#123;</span><br><span class="line">       withCredentials: <span class="literal">true</span>    <span class="comment">// 前端设置是否带cookie</span></span><br><span class="line">   &#125;,</span><br><span class="line">   crossDomain: <span class="literal">true</span>,   <span class="comment">// 会让请求头中包含跨域的额外信息，但不会含cookie</span></span><br><span class="line">    ...</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></p><p>否则即使服务器同意发送cookie，浏览器也不会发送。或者服务器要求设置Cookie，浏览器也不会处理。但是如果省略withCredentials设置，有的浏览器还是会一起发送Cookie。这时可以显式关闭withCredentials。<br>需要注意的是，如果要发送cookie，Access-Control-Allow-Origin就不能设置为星号，必须指定明确的，与请求网页一致的域名。同时Cookie依然需要遵循同源策略，只有用服务器域名设置的Cookie才会上传，其他域名的Cookie并不会上传，且（跨源）原网页代码中的document.cookie也无法读取服务器域名下的Cookie。</p><h3 id="非简单请求"><a href="#非简单请求" class="headerlink" title="非简单请求"></a>非简单请求</h3><p>非简单请求是那种对服务器有特殊要求的请求，比如请求方法是PUT或DELETE，或者Content-Type字段的类型是application/json。<br>非简单请求的CORS请求，会在正式通信之前，增加一次HTTP查询请求，称为”预检”请求（preflight）。<br>浏览器先询问服务器，当前网页所在的域名是否在服务器的许可名单之中，以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复，浏览器才会发出正式的XMLHttpRequest请求，否则就报错。  </p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> url = <span class="string">'http://api.alice.com/cors'</span>;</span><br><span class="line"><span class="keyword">var</span> xhr = <span class="keyword">new</span> XMLHttpRequest();</span><br><span class="line">xhr.open(<span class="string">'PUT'</span>, url, <span class="literal">true</span>);</span><br><span class="line">xhr.setRequestHeader(<span class="string">'X-Custom-Header'</span>, <span class="string">'value'</span>);</span><br><span class="line">xhr.send();</span><br></pre></td></tr></table></figure><p>浏览器发现，这是一个非简单请求，就自动发出一个“预检”请求。要求服务器确认可以这样请求。下面是这个“预检”请求的HTTP头信息。  </p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">OPTIONS /cors HTTP/1.1</span><br><span class="line">Origin: http://api.bob.com</span><br><span class="line">Access-Control-Request-Method: PUT</span><br><span class="line">Access-Control-Request-Headers: X-Custom-Header</span><br><span class="line">Host: api.alice.com</span><br><span class="line">Accept-Language: en-US</span><br><span class="line">Connection: keep-alive</span><br><span class="line">User-Agent: Mozilla/5.0...</span><br><span class="line">``` </span><br><span class="line">"预检"请求用的请求方法是OPTIONS，表示这个请求是用来询问的。头信息里面，关键字段是Origin，表示请求来自于哪个源。</span><br><span class="line">* Access-Control-Request-Method: 该字段是必须的，用来列出浏览器的CORS请求会用到哪些HTTP方法，比如这里的PUT。</span><br><span class="line">* Access-Control-Request-Headers：该字段是一个逗号分隔的字符串，指定浏览器CORS请求会额外发送的头信息字段，上例是X-Custom-Header</span><br><span class="line"></span><br><span class="line">#### 预检请求的回应</span><br><span class="line">服务器收到"预检"请求以后，检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后，确认允许跨源请求，就可以做出回应</span><br><span class="line"></span><br><span class="line">```html</span><br><span class="line">HTTP/1.1 200 OK</span><br><span class="line">Date: Mon, 01 Dec 2008 01:15:39 GMT</span><br><span class="line">Server: Apache/2.0.61 (Unix)</span><br><span class="line">Access-Control-Allow-Origin: http://api.bob.com</span><br><span class="line">Access-Control-Allow-Methods: GET, POST, PUT</span><br><span class="line">Access-Control-Allow-Headers: X-Custom-Header</span><br><span class="line">Content-Type: text/html; charset=utf-8</span><br><span class="line">Content-Encoding: gzip</span><br><span class="line">Content-Length: 0</span><br><span class="line">Keep-Alive: timeout=2, max=100</span><br><span class="line">Connection: Keep-Alive</span><br><span class="line">Content-Type: text/plain</span><br></pre></td></tr></table></figure><p>上面的HTTP回应中，关键的是Access-Control-Allow-Origin字段，表示<a href="http://api.bob.com可以请求数据。该字段也可以设为星号，表示同意任意跨源请求。" target="_blank" rel="noopener">http://api.bob.com可以请求数据。该字段也可以设为星号，表示同意任意跨源请求。</a><br>如果浏览器否定了”预检”请求，会返回一个正常的HTTP回应，但是没有任何CORS相关的头信息字段。这时，浏览器就会认定，服务器不同意预检请求，因此触发一个错误，被XMLHttpRequest对象的onerror回调函数捕获。控制台会打印出如下的报错信息。<br>服务器回应的其他CORS相关字段如下：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">Access-Control-Allow-Methods: GET, POST, PUT</span><br><span class="line">Access-Control-Allow-Headers: X-Custom-Header</span><br><span class="line">Access-Control-Allow-Credentials: true</span><br><span class="line">Access-Control-Max-Age: 1728000</span><br></pre></td></tr></table></figure><ul><li>Access-Control-Allow-Methods：该字段必需，它的值是逗号分隔的一个字符串，表明服务器支持的所有跨域请求的方法。注意，返回的是所有支持的方法，而不单是浏览器请求的那个方法。这是为了避免多次”预检”请求。</li><li>Access-Control-Allow-Headers：如果浏览器请求包括Access-Control-Request-Headers字段，则Access-Control-Allow-Headers字段是必需的。它也是一个逗号分隔的字符串，表明服务器支持的所有头信息字段，不限于浏览器在”预检”中请求的字段。</li><li>Access-Control-Allow-Credentials： 该字段与简单请求时的含义相同。</li><li>Access-Control-Max-Age： 该字段可选，用来指定本次预检请求的有效期，单位为秒。上面结果中，有效期是20天（1728000秒），即允许缓存该条回应1728000秒（即20天），在此期间，不用发出另一条预检请求。</li></ul><h4 id="浏览器正常请求回应"><a href="#浏览器正常请求回应" class="headerlink" title="浏览器正常请求回应"></a>浏览器正常请求回应</h4><p>一旦服务器通过了”预检”请求，以后每次浏览器正常的CORS请求，就都跟简单请求一样，会有一个Origin头信息字段。服务器的回应，也都会有一个Access-Control-Allow-Origin头信息字段。</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">PUT /cors HTTP/1.1</span><br><span class="line">Origin: http://api.bob.com</span><br><span class="line">Host: api.alice.com</span><br><span class="line">X-Custom-Header: value</span><br><span class="line">Accept-Language: en-US</span><br><span class="line">Connection: keep-alive</span><br><span class="line">User-Agent: Mozilla/5.0...</span><br></pre></td></tr></table></figure><p>浏览器的正常CORS请求。上面头信息的Origin字段是浏览器自动添加的。下面是服务器正常的回应。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Access-Control-Allow-Origin: http://api.bob.com</span><br><span class="line">Content-Type: text/html; charset=utf-8</span><br></pre></td></tr></table></figure><p>Access-Control-Allow-Origin字段是每次回应都必定包含的。</p><h3 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h3><p>CORS与JSONP的使用目的相同，但是比JSONP更强大。JSONP只支持GET请求，CORS支持所有类型的HTTP请求。JSONP的优势在于支持老式浏览器，以及可以向不支持CORS的网站请求数据。</p><h2 id="WebSocket协议跨域"><a href="#WebSocket协议跨域" class="headerlink" title="WebSocket协议跨域"></a>WebSocket协议跨域</h2><ul><li>WebSocket protocol是HTML5一种新的协议。它实现了浏览器与服务器全双工通信，同时允许跨域通讯，是server push技术的一种很好的实现。</li><li>原生WebSocket API使用起来不太方便，我们使用Socket.io，它很好地封装了webSocket接口，提供了更简单、灵活的接口，也对不支持webSocket的浏览器提供了向下兼容。</li></ul><h3 id="前端代码"><a href="#前端代码" class="headerlink" title="前端代码:"></a>前端代码:</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span>user input：<span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./socket.io.js"</span>&gt;</span><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="undefined"></span></span><br><span class="line"><span class="javascript"><span class="keyword">var</span> socket = io(<span class="string">'http://www.domain2.com:8080'</span>);</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="javascript"><span class="comment">// 连接成功处理</span></span></span><br><span class="line"><span class="javascript">socket.on(<span class="string">'connect'</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">    <span class="comment">// 监听服务端消息</span></span></span><br><span class="line"><span class="javascript">    socket.on(<span class="string">'message'</span>, <span class="function"><span class="keyword">function</span>(<span class="params">msg</span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">        <span class="built_in">console</span>.log(<span class="string">'data from server: ---&gt; '</span> + msg); </span></span><br><span class="line"><span class="undefined">    &#125;);</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="javascript">    <span class="comment">// 监听服务端关闭</span></span></span><br><span class="line"><span class="javascript">    socket.on(<span class="string">'disconnect'</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123; </span></span><br><span class="line"><span class="javascript">        <span class="built_in">console</span>.log(<span class="string">'Server socket has closed.'</span>); </span></span><br><span class="line"><span class="undefined">    &#125;);</span></span><br><span class="line"><span class="undefined">&#125;);</span></span><br><span class="line"><span class="undefined"></span></span><br><span class="line"><span class="javascript"><span class="built_in">document</span>.getElementsByTagName(<span class="string">'input'</span>)[<span class="number">0</span>].onblur = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</span></span><br><span class="line"><span class="javascript">    socket.send(<span class="keyword">this</span>.value);</span></span><br><span class="line"><span class="undefined">&#125;;</span></span><br><span class="line"><span class="undefined"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="node-server"><a href="#node-server" class="headerlink" title="node server"></a>node server</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">var http = require(&apos;http&apos;);</span><br><span class="line">var socket = require(&apos;socket.io&apos;);</span><br><span class="line"></span><br><span class="line">// 启http服务</span><br><span class="line">var server = http.createServer(function(req, res) &#123;</span><br><span class="line">    res.writeHead(200, &#123;</span><br><span class="line">        &apos;Content-type&apos;: &apos;text/html&apos;</span><br><span class="line">    &#125;);</span><br><span class="line">    res.end();</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">server.listen(&apos;8080&apos;);</span><br><span class="line">console.log(&apos;Server is running at port 8080...&apos;);</span><br><span class="line"></span><br><span class="line">// 监听socket连接</span><br><span class="line">socket.listen(server).on(&apos;connection&apos;, function(client) &#123;</span><br><span class="line">    // 接收信息</span><br><span class="line">    client.on(&apos;message&apos;, function(msg) &#123;</span><br><span class="line">        client.send(&apos;hello：&apos; + msg);</span><br><span class="line">        console.log(&apos;data from client: ---&gt; &apos; + msg);</span><br><span class="line">    &#125;);</span><br><span class="line"></span><br><span class="line">    // 断开处理</span><br><span class="line">    client.on(&apos;disconnect&apos;, function() &#123;</span><br><span class="line">        console.log(&apos;Client socket has closed.&apos;); </span><br><span class="line">    &#125;);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h2 id="node代理跨域"><a href="#node代理跨域" class="headerlink" title="node代理跨域"></a>node代理跨域</h2><ul><li>node中间件实现跨域代理，是通过启一个代理服务器，实现数据的转发，也可以通过设置  * cookieDomainRewrite参数修改响应头中cookie中域名，实现当前域的cookie写入，方便接口登录认证。  </li><li>利用node + express + http-proxy-middleware搭建一个proxy服务器  </li></ul><h3 id="前端代码-1"><a href="#前端代码-1" class="headerlink" title="前端代码"></a>前端代码</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> xhr = <span class="keyword">new</span> XMLHttpRequest();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 前端开关：浏览器是否读写cookie</span></span><br><span class="line">xhr.withCredentials = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 访问http-proxy-middleware代理服务器</span></span><br><span class="line">xhr.open(<span class="string">'get'</span>, <span class="string">'http://www.domain1.com:3000/login?user=admin'</span>, <span class="literal">true</span>);</span><br><span class="line">xhr.send();</span><br></pre></td></tr></table></figure><h3 id="后端代码"><a href="#后端代码" class="headerlink" title="后端代码"></a>后端代码</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">var express = require(&apos;express&apos;);</span><br><span class="line">var proxy = require(&apos;http-proxy-middleware&apos;);</span><br><span class="line">var app = express();</span><br><span class="line"></span><br><span class="line">app.use(&apos;/&apos;, proxy(&#123;</span><br><span class="line">    // 代理跨域目标接口</span><br><span class="line">    target: &apos;http://www.domain2.com:8080&apos;,</span><br><span class="line">    changeOrigin: true,</span><br><span class="line"></span><br><span class="line">    // 修改响应头信息，实现跨域并允许带cookie</span><br><span class="line">    onProxyRes: function(proxyRes, req, res) &#123;</span><br><span class="line">        res.header(&apos;Access-Control-Allow-Origin&apos;, &apos;http://www.domain1.com&apos;);</span><br><span class="line">        res.header(&apos;Access-Control-Allow-Credentials&apos;, &apos;true&apos;);</span><br><span class="line">    &#125;,</span><br><span class="line"></span><br><span class="line">    // 修改响应信息中的cookie域名</span><br><span class="line">    cookieDomainRewrite: &apos;www.domain1.com&apos;  // 可以为false，表示不修改</span><br><span class="line">&#125;));</span><br><span class="line"></span><br><span class="line">app.listen(3000);</span><br><span class="line">console.log(&apos;Proxy server is listen at port 3000...&apos;);</span><br></pre></td></tr></table></figure><h1 id="VUE-CLI解决跨域"><a href="#VUE-CLI解决跨域" class="headerlink" title="VUE-CLI解决跨域"></a>VUE-CLI解决跨域</h1><ul><li>首先创建项目</li></ul><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vue init webpack cors</span><br></pre></td></tr></table></figure><ul><li>在vue-cli项目文件夹中找到/config/index.js,找到proxyTable: {} 加入如下配置:</li></ul><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"> proxyTable: &#123;</span><br><span class="line">  <span class="string">'/v1'</span>: &#123;</span><br><span class="line">    target: <span class="string">'http://tingapi.ting.baidu.com'</span>, <span class="comment">//需要代理的网址</span></span><br><span class="line">    changeOrigin: <span class="literal">true</span>,</span><br><span class="line">    pathRewrite: &#123;</span><br><span class="line">      <span class="string">'^/v1'</span>: <span class="string">'/v1'</span></span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;,</span><br></pre></td></tr></table></figure><ul><li>在/src/main.js中引入axios</li></ul><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> axios <span class="keyword">from</span> <span class="string">'axios'</span></span><br><span class="line">Vue.prototype.$http = axios;</span><br></pre></td></tr></table></figure><ul><li>在vue-cli项目中找到/src/App.vue 在方法中添加如下代码：</li></ul><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">&lt;template&gt;</span><br><span class="line">  &lt;div id=<span class="string">"app"</span>&gt;</span><br><span class="line">    &lt;button v-on:click=<span class="string">"sbt"</span>&gt;访问跨域&lt;<span class="regexp">/button&gt;</span></span><br><span class="line"><span class="regexp">  &lt;/</span>div&gt;</span><br><span class="line">&lt;<span class="regexp">/template&gt;</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">&lt;script&gt;</span></span><br><span class="line"><span class="regexp">import axios from 'axios'</span></span><br><span class="line"><span class="regexp">import VueAxios from 'vue-axios'</span></span><br><span class="line"><span class="regexp"></span></span><br><span class="line"><span class="regexp">export default &#123;</span></span><br><span class="line"><span class="regexp">  name: 'App',</span></span><br><span class="line"><span class="regexp">  methods: &#123;</span></span><br><span class="line"><span class="regexp">    sbt: function() &#123;</span></span><br><span class="line"><span class="regexp">      this.$http.get("/</span>v1/restserver/ting?type=<span class="number">1</span>&amp;size=<span class="number">30</span>&amp;offset=<span class="number">0</span>&amp;method=baidu.ting.billboard.billList<span class="string">").then(m=&gt;console.log(m));</span></span><br><span class="line"><span class="string">    &#125;</span></span><br><span class="line"><span class="string">  &#125;</span></span><br><span class="line"><span class="string">&#125;</span></span><br></pre></td></tr></table></figure><ul><li><p>最终访问效果如下:<br><img src="/img/2020/2020-05-31-01.jpeg" alt></p></li><li><p>源代码放在: <a href="https://github.com/sunsetyan/vue-cli-cross-domain-demo" target="_blank" rel="noopener">https://github.com/sunsetyan/vue-cli-cross-domain-demo</a></p></li></ul><h1 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h1><p><a href="https://www.jianshu.com/p/abbfe1143ff1" target="_blank" rel="noopener">https://www.jianshu.com/p/abbfe1143ff1</a><br><a href="https://juejin.im/post/5a2f92c65188253e2470f16d" target="_blank" rel="noopener">https://juejin.im/post/5a2f92c65188253e2470f16d</a> </p><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;以前每次遇到跨域的问题，都是case by case解决掉了，从来没有系统的分析过这里面的原理，这次整理一下各种框架和情况下会遇到的问题。&lt;/p&gt;
    
    </summary>
    
      <category term="术业专攻" scheme="http://blog.xiaoyuyu.net/categories/%E6%9C%AF%E4%B8%9A%E4%B8%93%E6%94%BB/"/>
    
    
      <category term="浏览器跨域" scheme="http://blog.xiaoyuyu.net/tags/%E6%B5%8F%E8%A7%88%E5%99%A8%E8%B7%A8%E5%9F%9F/"/>
    
      <category term="跨域" scheme="http://blog.xiaoyuyu.net/tags/%E8%B7%A8%E5%9F%9F/"/>
    
      <category term="CORS" scheme="http://blog.xiaoyuyu.net/tags/CORS/"/>
    
      <category term="vue-cli" scheme="http://blog.xiaoyuyu.net/tags/vue-cli/"/>
    
  </entry>
  
  <entry>
    <title>97-系统架构设计方法论-TOGAF</title>
    <link href="http://blog.xiaoyuyu.net/post/320fd534.html"/>
    <id>http://blog.xiaoyuyu.net/post/320fd534.html</id>
    <published>2020-05-19T13:39:41.000Z</published>
    <updated>2020-05-31T06:39:34.769Z</updated>
    
    <content type="html"><![CDATA[<p>一直想要整理架构设计相关的方法论。</p><a id="more"></a><h1 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h1><blockquote><p>TOGAF，全称The Open Group Architecture Framework，是由组织The Open Group在1995年发布的企业架构框架，最新版本是9.2。The Open Group（开放群组）是国际著名标准化组织，拥有超过20年的标准制定与推广历史，而TOGAF框架可以说是它最著名的贡献了。TOGAF可以说是企业架构理论从政府进入到社会各研究机构的一个典型案例，它起源于美国国防部的信息管理技术架构框架（TAFIM，Technical Architecture Framework for Information Management），并在获得美国国防部的允许和鼓励之后，借助于美国政府大笔资金的投入，经过多年的努力最终于1995年发布了TOGAF的第一版。到目前为止，可以说TOGAF是最主流、最为人所广知的一个EA框架。由80%全球排名前50的公司都在使用它，中国企业对TOGAF的认可度也超过50%，以至于说起企业架构，很多人第一时间就以为是TOGAF。它还是唯一一个提供认证的框架。</p><footer><strong>[whfeng[</strong><cite>简书]] [https://www.jianshu.com/p/0a867fe89e90] [企业架构框架之TOGAF]</cite></footer></blockquote><p><br></p><h1 id="框架介绍"><a href="#框架介绍" class="headerlink" title="框架介绍"></a>框架介绍</h1><p><img src="/img/2020/2020-05-25-01.png" alt></p><p>图中具有彩色的部分就是TOGAF几大组成部分，下面分别说明一下。</p><ul><li><p>TOGAF架构开发方法（TOGAF ADM（Architecture Development Method））：这是TOGAF框架的核心部分，是TOGAF针对企业架构建设方法的论述，它以一个循环迭代模型为基础将企业架构的建设过程划分为前后衔接的若干步骤，并对每个步骤的输入、输出以及所采用方法都进行了详尽的阐述。</p></li><li><p>TOGAF内容框架（Architecture Content Framework）：这部分是TOGAF 9新加入的部分，是针对企业架构中所包含的各种工作产品以及他们之间的关系作出了详细的描述，从此改变了只重视架构开发过程和方法的风格，填补了以往没有架构内容描述和指导方面的空白。</p></li><li><p>TOGAF能力框架（TOGAF Capability Framework）：为了在一个企业中有效地操作企业架构并使其发挥最大的效能，一系列适当的组织结构、流程、技能、角色和责任需要被定义并结合起来，而TOGAF的能力框架正为如何组织好这些元素提供了指南。</p></li><li><p>TOGAF企业迭代框架和工具（TOGAF Enterprise Continuum and Tools）：企业连续体是企业架构资源库的一张视图，它为企业中的各种架构和解决方案制品提供了一种分类和组织的方法。</p></li><li><p>上述四部分相对独立，其中能力框架方面的内容着重于帮助企业更好地使用企业架构，架构开发方法和内容框架着重于帮助企业提高其企业架构建设和维护过程的标准化水平和执行效率，而企业连续体以及各种方法工具则更关注于为企业在企业架构的开发、使用和维护过程中提供参考和最佳实践。虽然这三个部分相对独立，但是一个优良的企业架构的创建、使用和维护是他们三者紧密配合、相互作用的结果。</p></li></ul><p>在这四部分中，个人认为架构开发方法ADM是TOGAF最核心的部分，把它搞懂了，TOGAF就八九不离十了。</p><h1 id="ADM介绍"><a href="#ADM介绍" class="headerlink" title="ADM介绍"></a>ADM介绍</h1><p>ADM方法被迭代式的应用在架构演进的整个过程中、阶段之间和每个阶段内部。</p><p>ADM便形成了3个级别的迭代概念：</p><ol><li>基于ADM整体的迭代，应用ADM方法，表明在一个架构开发循环结束后又进入新的循环。</li><li>多个架构过程的迭代，列入在完成了技术架构阶段的设计工作后又重新回到业务架构设计阶段。</li><li>在一个阶段内部的迭代，TOGAF支持基于一个阶段内部的多个开发活动，对复杂的架构内容进行迭代设计。</li></ol><h2 id="ADM方法中各个阶段的活动："><a href="#ADM方法中各个阶段的活动：" class="headerlink" title="ADM方法中各个阶段的活动："></a>ADM方法中各个阶段的活动：</h2><p><img src="/img/2020/2020-05-25-02.png" alt></p><center>The Architecture Development Method Cycle</center><ul><li><strong>准备阶段:</strong> 为实施成功的企业架构做好准备，包括定义组织机构特定的<strong>架构框架(?文档范围？大纲)</strong>，<strong>架构原则</strong>和<strong>架构工具</strong>。</li><li><strong>需求管理:</strong> 完成需求识别，需求管理和交付（持续的过程）？需求管理是贯穿整个架构设计的全生命周期的。具体和架构相关的活动可能包括需求分析及需求评审(可能时间上在设计开始之前)，需求确认(设计过程中)，需求验证(设计及开发活动结束之后)三种活动。按照优先级进行持续迭代。TOGAF项目的每个阶段，都是建立在业务需求至上并且需要对需求进行确认。</li><li><strong>架构愿景阶段(规划):</strong> 设置TOGAF项目的范围，约束和期望。<ul><li>创建架构愿景。</li><li>定义利益相关者（干系人）。</li><li>确认业务的上下文及环境，外部系统之间的调用关系及依赖。</li><li>创建架构设计说明书（大纲，条目？）</li><li>取得上层批准。</li></ul></li><li><strong>阶段B：业务架构 阶段C：信息系统架构（应用架构，数据架构），阶段D：技术架构。</strong><ul><li>从业务，信息系统和技术三个层面进行架构设计，在每一个层面分别完成以下三个活动：<ul><li>开发基线架构描述。</li><li>开发目标架构描述。</li><li>执行差距分析。</li></ul></li></ul></li><li><strong>阶段E：机会和解决方案：</strong> <ul><li>进行初步的实施规划，提出实施计划，并且确认在前面的各个阶段中确定的各种构建块的交付物形式；确定主要实施项目。</li><li>对项目分组并且纳入过渡架构。</li><li>决定各个模块的落地方案（制造，购买，重用，外包，商用，使用开源框架）。</li><li>评估优先级顺序。</li><li>识别依赖项。</li></ul></li><li><strong>阶段F: 迁移规划</strong> <ul><li>对阶段E确定的项目进行绩效分析和风险评估。</li><li>制定一个详细的实施和迁移计划。</li></ul></li><li><strong>阶段G: 实施治理</strong><ul><li>定义实施项目的架构限制。</li><li>提供实施项目的架构监督。</li><li>发布实施项目的架构合同。</li><li>检测实施项目以确保符合架构要求。</li></ul></li><li><strong>阶段H: 架构变更管理</strong><ul><li>提供持续检测和变更管理的流程，以确保架构可以响应企业的需求并且将架构对于业务的价值最大化。</li></ul></li></ul><h1 id="方法的详细说明"><a href="#方法的详细说明" class="headerlink" title="方法的详细说明"></a>方法的详细说明</h1><p>在ADM过程的应用过程中，根据ADM提供的相位目标，根据一些输入和步骤产生许多输出。比如：</p><ul><li>流程、</li><li>架构要求、</li><li>项目计划</li><li>。。。</li></ul><p>为了以一致和结构化的方式整理和展示这些主要的工作产品，TOGAF定义了一个结构模型，用于放置他们。 </p><ul><li>这些只是建议，不需要完全遵循。</li><li>生成的每个可交付成果应进行版本化以指示何时发生更改。</li><li>显示的版本编号也只是一个建议，大致表示处于哪个阶段。</li></ul><p>以下的文档从目标、步骤、输入和输出几个方面对ADM环中每个阶段进行了分析和描述。</p><h2 id="准备阶段"><a href="#准备阶段" class="headerlink" title="准备阶段"></a>准备阶段</h2><blockquote><p>整理一个文档，回答如下问题。</p></blockquote><h3 id="目标"><a href="#目标" class="headerlink" title="目标"></a>目标</h3><ul><li>对进行企业架构活动的组织的背景和环境进行审查;</li><li>确认利益相关者、他们的需求、优先级和需要承担的义务;</li><li>确定并审视企业机构中受到影响的部分，并且对其范围进行界定，定义约束条件和假设条件，这一点在使用联邦式体系结构环境的大型机构中特别重要;</li><li>定义组织的“架构足迹”，包括确定执行架构开发工作的人是谁、他们在哪里，以及他们的责任是什么;</li><li>定义用于进行企业架构建设的框架和详细方法，这里通常是对ADM进行适应性的改变（裁剪或者修改）;</li><li>确定一个治理和支持框架，用来在整个ADM过程中为架构治理提供业务流程和资源方面的支持，此种框架将会确保目标架构的适用性（fitness-for-purpose），并对其在进行过程中的效能进行评测；</li><li>选择和落实用于支持架构活动的各种工具和基础设施；</li><li>定义架构原则，而这些原则将会成为约束架构工作的一个部分。</li></ul><h3 id="步骤"><a href="#步骤" class="headerlink" title="步骤"></a>步骤</h3><ul><li>界定将要受到影响的企业组织的范围；</li><li>确定治理和支持框架；</li><li>建立企业架构团队；</li><li>定义架构原则；</li><li>选择架构框架并裁减定义；</li><li>落实相关架构工具；</li></ul><h3 id="输入"><a href="#输入" class="headerlink" title="输入"></a>输入</h3><ul><li>TOGAF架构框架资料；</li><li>其他的架构框架资料；</li><li>业务原则、业务目标和驱动力；</li><li>架构治理策略;</li><li>IT战略；</li><li>当前企业架构组织模型；</li><li>当前企业架构框架；</li><li>当前企业架构原则；</li><li>当前企业架构资源库；</li></ul><h3 id="输出"><a href="#输出" class="headerlink" title="输出"></a>输出</h3><ul><li>企业架构的组织模型；</li><li>定制的企业架构框架，包括架构原则；</li><li>企业架构资源库的雏形；</li><li>针对业务目标，原则和驱动力的声明或者引用；</li><li>治理框架；</li><li>架构工作要求说明书；</li></ul><h2 id="阶段A-架构的愿景"><a href="#阶段A-架构的愿景" class="headerlink" title="阶段A-架构的愿景"></a>阶段A-架构的愿景</h2><p>在架构愿景阶段，将启动一次架构开发过程的迭代，设置迭代工作范围，约束和期望，创建架构愿景、验证业务上下文，创景架构工作说明书并且取得大家的一致认可。<br>愿景表达了我们对架构的期望结果，阐明重要涉众关注的问题和目标，可帮助团队关注架构的核心领域。</p><h3 id="目标-1"><a href="#目标-1" class="headerlink" title="目标"></a>目标</h3><ul><li>获取管理层对这次特定的ADM循环的相关承诺;</li><li>制定一个架构开发周期;</li><li>确认业务原则、业务目标、驱动力和KPI(Key Performance Indicators);</li><li>定义基线架构的范围，明确其所包含的组件以及组件的优先级;</li><li>确认相关的干系人，他们的关注点和目标;</li><li>定义架构工作所要解决的关键业务需求，以及必须应对的各项约束;</li><li>阐明架构愿景，并且定制价值主张，这些价值主张被用来阐述对于那些需求和约束的回应；</li><li>创建一个符合企业项目管理框架要求的综合计划；</li><li>去的继续下一个步骤工作的正式批准；</li><li>理解与其他并行的企业架构开发循环之间的相互影响；</li></ul><h3 id="步骤-1"><a href="#步骤-1" class="headerlink" title="步骤"></a>步骤</h3><ul><li>成立架构项目（这里应该融合进企业整体的项目管理范畴）；</li><li>识别干系人、关注点和业务需求；</li><li>确定并且拆书业务目标、驱动力和约束；</li><li>评估业务能力；</li><li>评估业务转型的准备情况；</li></ul><h3 id="输入-1"><a href="#输入-1" class="headerlink" title="输入"></a>输入</h3><ul><li>架构工作要求说明书；</li><li>业务原则、业务目标和驱动力；</li><li>企业架构的组织模型，包括受影响的组织范围、成熟度评测、差距及解决办法、架构团队所担当的角色和职责；</li><li>定制的架构框架，包括定制的架构方法、架构内容、架构原则和配置部署工具；</li><li>初具内容的架构资源库（包括初始的框架说明、架构描述和基线描述内容）</li></ul><h3 id="输出-1"><a href="#输出-1" class="headerlink" title="输出"></a>输出</h3><ul><li>得到批准的架构工作说明书；<br><br>   </li><li>范围和约束；</li><li>架构工作计划；</li><li>角色和职责；</li><li>风险和应对措施；</li><li>工作产品效能评测；</li><li>业务案例与KPI指标；<br><br>   </li><li>改善的业务原则、业务目标和驱动力说明；</li><li>架构原则；</li><li>能力评估；</li><li>定制的架构框架（方法、内容、工具）；</li><li>架构愿景；<br><br>   </li><li>改善的关键高层次干系人的需求；</li><li>基线业务架构0.1版</li><li>基线数据架构0.1版（信息架构）</li><li>基线应用架构0.1版</li><li>基线技术架构0.1版</li><li>目标业务架构0.1版</li><li>目标应用架构0.1版</li><li>目标数据架构0.1版</li><li>目标技术架构0.1版<br><br>   </li><li>沟通计划</li><li>纳入到架构资源库中的新增内容</li></ul><h2 id="阶段B-业务架构"><a href="#阶段B-业务架构" class="headerlink" title="阶段B-业务架构"></a>阶段B-业务架构</h2><p>在业务架构阶段，将开发一个支持架构愿景的业务架构。架构愿景中概括的基线和目标业务架构将在此被细化，从而使它们可以作为技术分析的有用输入。业务过程建模、业务目标建模和用例建模是用于生成业务架构的一些技术，这又包含了所期望状态的差距分析。<br>本阶段的核心内容包括组织如何满足业务目标；企业静态特征（业务目标、业务组织结构、业务角色）；企业动态特征（流程、功能、服务）。</p><h3 id="目标-2"><a href="#目标-2" class="headerlink" title="目标"></a>目标</h3><ul><li>描述基线业务架构；</li><li>设计出目标业务架构；</li><li>执行以上二者的差距分析；</li><li>选择和开发相关的架构视角，通过这些视角架构师可以阐述业务架构是如何对各个干系人的关注点进行解答的；</li><li>确定与架构视角相关的工具和技术；</li></ul><h3 id="步骤-2"><a href="#步骤-2" class="headerlink" title="步骤"></a>步骤</h3><ul><li>选择参考模型、视角和工具；</li><li>开发基线业务架构描述；</li><li>开发目标业务架构描述；</li><li>执行差距分析；</li><li>定义架构路线图组件；</li><li>分析对整个架构的影响；</li><li>涉众评审；</li><li>最终确定业务架构；</li><li>创建架构定义文档；</li></ul><h3 id="输入-2"><a href="#输入-2" class="headerlink" title="输入"></a>输入</h3><ul><li>架构工作要求书；</li><li>业务原则、业务目标和驱动力；</li><li>能力评估；</li><li>沟通计划<br><br></li><li>企业架构的组织模型;</li><li>得到批准的架构工作说明书；</li><li>业务架构原则、包括在此之前已经存在了的业务原则；</li><li>定制的架构框架；</li><li>企业连续体；</li><li>架构资源库：<ul><li>可重用的组件和模块；</li><li>公开且可得的参考模型；</li><li>组织特定的参考模型；</li><li>组织标准；</li></ul></li><li>架构愿景，包括：<ul><li>经过改善的关键高层次干系人的需求</li><li>基线业务架构0.1版</li><li>基线数据架构0.1版</li><li>基线应用架构0.1版</li><li>基线技术架构0.1版</li><li>目标业务架构0.1版</li><li>目标应用架构0.1版</li><li>目标数据架构0.1版</li><li>目标技术架构0.1版    </li></ul></li></ul><h3 id="输出-2"><a href="#输出-2" class="headerlink" title="输出"></a>输出</h3><ul><li>架构工作说明书（更新）</li><li>经过验证的业务原则、业务目标和驱动力；</li><li>详细的业务架构原则；</li><li>架构定义文档草稿；</li><li>基线业务架构1.0版本；如果有</li><li>目标业务架构1.0版本</li><li>组织结构；</li><li>业务目标；</li><li>业务功能；</li><li>业务服务；</li><li>业务流程，包括测评和交付物；</li><li>业务角色，包括相关技能需求的发展与改进；</li><li>业务数据模型；</li><li>组织和功能之间的相互关联；</li><li>主要涉众关注的业务架构视图；</li><li>架构需求说明书草稿；</li><li>差距分析的结果；</li><li>技术需求；</li><li>更新的业务需求；</li><li>架构路线图和业务架构组件；</li></ul><h2 id="阶段C-信息系统架构"><a href="#阶段C-信息系统架构" class="headerlink" title="阶段C-信息系统架构"></a>阶段C-信息系统架构</h2><p>在信息系统架构设计阶段，确定主要的信息类型和处理这些信息的应用系统。在本阶段有两个主要的步骤，数据架构设计（信息架构）和应用架构设计，二者既可以依次开发，也可以并行开发。核心内容为：IT系统如何满足企业的业务目标；信息以及信息之间的关系；应用以及应用之间的关系。</p><h3 id="数据架构-归纳且符合企业整体的信息架构-目标"><a href="#数据架构-归纳且符合企业整体的信息架构-目标" class="headerlink" title="数据架构(归纳且符合企业整体的信息架构)-目标"></a>数据架构(归纳且符合企业整体的信息架构)-目标</h3><ul><li>定义业务运行所需的数据源和数据类型。</li></ul><h3 id="步骤-3"><a href="#步骤-3" class="headerlink" title="步骤"></a>步骤</h3><ul><li>选择参考模型、视角和工具；</li><li>开发基线数据架构1.0版本；</li><li>开发目标数据架构1.0版本；</li><li>执行差距分析；</li><li>定义组件；</li><li>分析对整个架构的影响；</li><li>涉众评审；</li><li>确定最终的数据架构；</li><li>完善架构定义文档；</li></ul><h3 id="输入-3"><a href="#输入-3" class="headerlink" title="输入"></a>输入</h3><ul><li>架构工作要求说明书；</li><li>能力评估；</li><li>沟通计划；<br><br></li><li>企业架构的组织模型；</li><li>定制的架构框架；</li><li>数据原则（如果有，在整体的信息架构基础上）；</li><li>架构工作说明书；</li><li>架构资源库；<br><br></li><li>可重用的构建快；</li><li>公开可得的参考模型；</li><li>组织特定的参考模型；</li><li>组织标准；<br><br></li><li>按机构定义文档草稿-包括:<ul><li>基线业务架构1.0版；</li><li>目标业务架构1.0版；</li><li>基线数据架构0.1版；</li><li>目标数据架构0.1版；</li><li>基线应用架构（0.1或1.0版）；</li><li>目标应用架构（0.1或1.0版）；</li><li>基线技术架构（0.1版）；</li><li>目标技术架构（0.1版）；</li></ul></li><li>架构需求说明书:<ul><li>差距分析结果；</li><li>适用于此阶段的相关技术需求；</li><li>在架构路线图中的业务架构组件；</li></ul></li></ul><h3 id="输出-3"><a href="#输出-3" class="headerlink" title="输出"></a>输出</h3><ul><li>经过改善或者更新的架构与安静阶段中的各交付物；</li><li>架构工作说明（update）</li><li>经过验证的数据原则或者新增的数据原则；</li><li>更新的架构定义文档草稿；</li><li>基线数据架构1.0版本；</li><li>目标数据架构1.0版本；<br><br></li><li>业务数据模型；</li><li>逻辑数据模型；</li><li>数据管理流程模型；</li><li>数据实体/业务功能矩阵；<br><br></li><li>主要涉众关注的数据架构视图；</li><li>更新的架构需求说明书；</li><li>差距分析结果；</li><li>数据集成需求；</li><li>适用于当前阶段的相关技术需求；</li><li>对于下一步将要设计的技术架构约束；</li><li>更新的也无需求；</li><li>更新的应用需求；</li><li>架构路线图中的数据架构组件；</li></ul><h3 id="应用架构-目标"><a href="#应用架构-目标" class="headerlink" title="应用架构-目标"></a>应用架构-目标</h3><ul><li>定义处理数据并支撑业务运行所需的各种应用系统；</li></ul><h3 id="步骤-4"><a href="#步骤-4" class="headerlink" title="步骤"></a>步骤</h3><ul><li>选择参考模型、视角和工具；</li><li>开发基线应用架构1.0版本；</li><li>开发目标应用架构1.0版本；</li><li>执行差距分析；</li><li>定义组件；</li><li>分析对整个架构的影响；</li><li>涉众评审；</li><li>最终确定应用架构；</li><li>完善架构定义文档；</li></ul><h3 id="输入-4"><a href="#输入-4" class="headerlink" title="输入"></a>输入</h3><ul><li>架构工作要求说明书；</li><li>能力评估；</li><li>沟通计划；<br><br></li><li>企业架构的组织模型；</li><li>定制的架构框架；</li><li>应用原则；</li><li>架构工作说明书；</li><li>架构资源库；<br><br></li><li>架构定义文档草稿-包括：<ul><li>基线业务架构1.0版；</li><li>目标业务架构1.0版；</li><li>基线数据架构（0.1或者1.0版本);</li><li>目标数据架构（0.1版或1.0版）；</li><li>基线应用架构0.1版；</li><li>目标应用架构0.1版；</li><li>基线技术架构0.1版；</li><li>目标技术架构0.1版；</li></ul></li><li>架构需求说明书草稿，包括：<ul><li>差距分析结果；</li><li>适用于此阶段的相关技术需求；</li><li>架构路线图的业务架构组件和数据架构组件；</li></ul></li></ul><h3 id="输出-4"><a href="#输出-4" class="headerlink" title="输出"></a>输出</h3><ul><li>经过改善和更新的架构愿景阶段中的各交付物：</li><li>架构工作说明（Update）；</li><li>经过验证的应用原则或新增的应用原则；</li><li>更新的架构定义文档：</li><li>基线应用架构1.0版</li><li>目标应用架构1.0版</li><li>主要涉众关注的应用架构视图</li><li>更新的架构需求说明书：</li><li>差距分析结果</li><li>应用交互需求</li><li>适用于当前阶段的相关技术需求；</li><li>对于将要设计的技术架构的约束；</li><li>更新的业务需求；</li><li>更新的数据需求；</li><li>架构路线图的应用架构组件。</li></ul><h2 id="阶段D-技术架构"><a href="#阶段D-技术架构" class="headerlink" title="阶段D-技术架构"></a>阶段D-技术架构</h2><p>在技术架构阶段，完成对IT系统基础服务设施的设计，定义了架构解决方案的物理实现，包括硬件、软件和通信技术。</p><h3 id="目标-3"><a href="#目标-3" class="headerlink" title="目标"></a>目标</h3><ul><li>开发一个目标技术架构，并以此作为后续的实施和迁移计划的基础。</li><li>将应用架构中定义的各种应用组件映射为相应的技术组件，</li><li>这些技术组件代表了各种可以从市场或组织内部获得的软件和硬件组件。</li></ul><h3 id="步骤-5"><a href="#步骤-5" class="headerlink" title="步骤"></a>步骤</h3><ul><li>选择参考模型，视角和工具；</li><li>开发基线技术架构1.0版；</li><li>开发目标技术架构1.0版；</li><li>执行差距分析；</li><li>定义组件；</li><li>分析对整个架构的影响；</li><li>涉众评审；</li><li>技术架构定稿；</li><li>完善架构定义文档。</li></ul><h3 id="输入-5"><a href="#输入-5" class="headerlink" title="输入"></a>输入</h3><ul><li>架构工作要求说明书</li><li>能力评估；</li><li>沟通计划<br><br></li><li>企业架构的组织模型；</li><li>定制的架构框架；</li><li>技术原则；</li><li>架构工作说明书；</li><li>架构资源库（四个方面）；</li><li>架构定义文档草稿-包括：<ul><li>基线业务架构1.0版</li><li>目标业务架构1.0版</li><li>基线数据架构1.0版</li><li>目标数据架构1.0版</li><li>基线应用架构1.0版</li><li>目标应用架构1.0版</li><li>基线技术架构0.1版</li><li>目标技术架构0.1版</li></ul></li><li>架构需求说明书草稿-包括：<ul><li>差距分析结果；</li><li>来自于之前各个阶段的相关技术需求；</li><li>架构路线图的业务、数据和应用架构组件；</li></ul></li></ul><h3 id="输出-5"><a href="#输出-5" class="headerlink" title="输出"></a>输出</h3><ul><li>经过改善和更新的架构愿景阶段中的各个交付物；</li><li>架构工作说明（update）</li><li>经过验证的或者新增的技术原则；</li><li>更新的架构定义文档；</li><li>基线技术架构1.0版</li><li>目标技术架构1.0版</li><li>个技术组件以及他们与信息系统之间的关系；</li><li>各个技术平台以及他的结构组成；</li><li>环境和位置；</li><li>期望的处理符合以及技术组件间的负荷分布；</li><li>物理（网络）通信；</li><li>硬件及网络说明；</li><li>主要涉众关注的技术架构视图；</li><li>更新的架构需求说明书；</li><li>差距分析结果；</li><li>从业务架构和信息系统架构阶段输出的需求；</li><li>更新后的技术需求；</li><li>架构路线图的技术架构组件；</li></ul><h2 id="机会及解决方案"><a href="#机会及解决方案" class="headerlink" title="机会及解决方案"></a>机会及解决方案</h2><p>这是第一个直接关注实施的阶段，该阶段主要描述确定目标架构交付物（项目、程序或文件）的过程。</p><h3 id="目标-4"><a href="#目标-4" class="headerlink" title="目标"></a>目标</h3><ul><li>重新审查业务目标和业务能力，合并从阶段B到阶段D的差距分析，确定主要工作包并分组；</li><li>重新审查并确认企业承受变化的能力；</li><li>获得一系列过渡架构，它们可以通过对各种机会的开发利用，来为各构建块的实现提供持续的业务价值；</li><li>产生概要性的实施与迁移策略，并取得共识。 </li></ul><h3 id="步骤-6"><a href="#步骤-6" class="headerlink" title="步骤"></a>步骤</h3><ul><li>确定关键的公司变更属性；</li><li>确定项目实施的业务约束；</li><li>审查并合并从阶段B到阶段D的差距分析结果；</li><li>从功能的角度审查IT需求；</li><li>确定并加强交互需求；</li><li>改善并验证依赖关系；</li><li>确认业务转型的准备情况和风险；</li><li>制订高层次的实施和迁移策略；</li><li>识别主要的工作包并进行分组；</li><li>确定过渡架构；</li><li>创建项目投资组合和项目章程，同时对架构进行更新。</li></ul><h3 id="输入-6"><a href="#输入-6" class="headerlink" title="输入"></a>输入</h3><ul><li>产品信息；<br><br></li><li>架构工作要求书；</li><li>能力评估；</li><li>沟通计划；</li><li>规划方法；<br><br></li><li>企业架构的组织模型；</li><li>定制的架构框架；</li><li>架构工作说明书；</li><li>架构愿景；</li><li>架构资源库；</li><li>架构定义文档草稿（v1.0版的4个基线架构和4个目标架构）；</li><li>架构需求说明书草稿：</li><li>差距分析结果（业务、数据、应用和技术架构）</li><li>架构需求</li><li>IT服务管理一体化要求</li><li>现存业务程序或项目的变更请求。</li></ul><h3 id="输出-6"><a href="#输出-6" class="headerlink" title="输出"></a>输出</h3><ul><li>经过改善和更新的架构愿景、业务架构、信息系统架构和技术架构阶段中的各交付物：</li><li>架构工作说明（Update）；</li><li>架构愿景（Update）；</li><li>架构定义文档草稿：</li><li>识别出的增量内容</li><li>交互和共存需求</li><li>实现和移植策略</li><li>项目清单和项目章程</li><li>架构需求说明书草稿（Update）；</li><li>能力评估：</li><li>企业架构成熟度概况</li><li>转型准备工作报告</li><li>过渡架构1.0版：</li><li>确定的关于差距、解决方案和依赖性的评估</li><li>风险注册表1.0版本</li><li>影响分析（项目列表）</li><li>依赖性分析报告</li><li>实施因素的评估和推导矩阵(Deduction Matrix)</li><li>实施和迁移计划0.1版本（概述）</li></ul><h2 id="阶段F-迁移规划"><a href="#阶段F-迁移规划" class="headerlink" title="阶段F-迁移规划"></a>阶段F-迁移规划</h2><p>该阶段通过制订一个详细的实现和迁移计划完成从基线架构向目标架构的转变。</p><h3 id="目标-5"><a href="#目标-5" class="headerlink" title="目标"></a>目标</h3><ul><li>确保实施和迁移规划与企业中正在使用的各种管理框架相协调；</li><li>通过分配业务价值和执行业务成本分析，划分所有工作包、项目和构建块的优先级；</li><li>最终确定架构愿景和架构定义文档，使其与共同商定的实施方法一致；</li><li>与相关干系人一起确认在机会和解决方案阶段中定义的过渡架构；</li><li>创建、演进并监控详细的实施和迁移规划，提供实现过渡架构所需的各种资源。</li></ul><h3 id="步骤-7"><a href="#步骤-7" class="headerlink" title="步骤"></a>步骤</h3><ul><li>确定管理框架与实施和迁移规划之间的相互作用；</li><li>为每个项目指定业务价值；</li><li>估算资源需求、项目时间和交付工具；</li><li>通过绩效评估和风险验证，确定迁移项目的优先级；</li><li>确定过渡架构的增量内容并更新架构定义文档；</li><li>生成架构实现路线图（有时间标识）和迁移计划；</li><li>创建架构演进循环并记录收到的经验教训。</li></ul><h3 id="输入-7"><a href="#输入-7" class="headerlink" title="输入"></a>输入</h3><ul><li>架构工作要求书；</li><li>能力评估（企业架构成熟度概况和转型准备报告）；</li><li>沟通计划；<br><br></li><li>企业架构的组织模型；</li><li>治理模型和框架：</li><li>企业架构管理框架</li><li>能力管理框架</li><li>投资组合管理框架</li><li>项目管理框架</li><li>运营管理框架</li><li>定制的架构框架；</li><li>架构工作说明；</li><li>架构愿景；</li><li>架构资源库；</li><li>架构定义文档草稿：</li><li>迁移规划策略</li><li>影响分析（项目列表和章程）</li><li>架构需求说明书草稿：</li><li>差距分析结果（业务、数据、应用和技术架构）</li><li>架构需求</li><li>IT服务管理一体化要求</li><li>现存业务程序和项目的变更请求；</li><li>经过确认和验证的架构路线图；</li><li>过渡架构1.0版：</li><li>确定的关于差距、解决方案和依赖性的评估</li><li>风险注册表1.0版本</li><li>影响分析（项目列表）</li><li>依赖性分析报告</li><li>实施因素评估和推导矩阵</li><li>实现和迁移计划0.1版。</li></ul><h3 id="输出-7"><a href="#输出-7" class="headerlink" title="输出"></a>输出</h3><ul><li>实施和迁移计划1.0版；</li><li>定稿的架构定义文档；</li><li>定稿的架构需求说明书；</li><li>定稿的架构路线图；</li><li>定稿的过渡架构；</li><li>可重用的架构构建块；</li><li>架构工作要求书（各实施项目，如果有的话）；</li><li>架构契约（关于各实施项目）；</li><li>实施治理模型；</li><li>从经验教训中产生的变更请求。</li></ul><h2 id="阶段G——实施治理"><a href="#阶段G——实施治理" class="headerlink" title="阶段G——实施治理"></a>阶段G——实施治理</h2><p>该阶段定义了实施项目的架构约束，提供项目构建的架构监督，产生一个架构契约。</p><h3 id="目标-6"><a href="#目标-6" class="headerlink" title="目标"></a>目标</h3><ul><li>为每个实施项目给予建议；</li><li>对涵盖整个实施和部署过程的架构契约进行治理；</li><li>在解决方案正在实施和部署时，行使恰当的治理职责；</li><li>确保各实施项目符合于规定的架构；</li><li>确保按工作计划成功部署了解决方案的相关程序；</li><li>确保已经部署的解决方案与目标架构一致；</li><li>组织各种支持性行动，确保被部署的解决方案长期有效。</li></ul><h3 id="步骤-8"><a href="#步骤-8" class="headerlink" title="步骤"></a>步骤</h3><ul><li>通过开发管理工作，确认部署的范围和优先级；</li><li>明确用于部署的资源和技能；</li><li>指导部署解决方案的开发工作；</li><li>执行企业架构合规审查；</li><li>实施业务和IT运营；</li><li>执行实施后审查并结束实施工作。</li></ul><h3 id="输入-8"><a href="#输入-8" class="headerlink" title="输入"></a>输入</h3><ul><li>架构工作要求说明书；</li><li>能力评估；<br><br></li><li>企业架构的组织模型：</li><li>受影响的组织范围</li><li>成熟度评测、差距及解决方法</li><li>架构团队所担当的角色和职责</li><li>架构工作的约束</li><li>预算需求</li><li>治理和支持策略</li><li>定制的架构框架：</li><li>定制的架构方法</li><li>定制的架构内容（交付物和制品）</li><li>配置和部署工具</li><li>架构工作说明书；</li><li>架构愿景；</li><li>架构资源库：</li><li>可重用的构建块</li><li>公开且可得的参考模型</li><li>组织特定的参考模型</li><li>组织标准</li><li>架构定义文档；</li><li>架构需求说明书：</li><li>架构需求</li><li>差距分析结果（业务、数据、应用和技术）</li><li>架构路线图；</li><li>过渡架构；</li><li>实施治理模型；</li><li>架构契约；</li><li>架构工作要求书（经过机会与解决方案和迁移规划阶段明确的）；</li><li>实施和迁移计划。</li></ul><h3 id="输出-8"><a href="#输出-8" class="headerlink" title="输出"></a>输出</h3><ul><li>架构契约（签字）；</li><li>变更请求；</li><li>影响分析（实施）；</li><li>建议；</li><li>可部署的符合架构要求的解决方案：</li><li>实现的符合架构要求的系统</li><li>填充了相关资料的架构资源库</li><li>架构合规性建议与特许</li><li>对服务交付需求的建议</li><li>关于效能指标的建议</li><li>服务水平协议（SLAs）</li><li>在实施后经过更新的架构愿景</li><li>在实施后经过更新的架构定义文档</li><li>在实施后经过更新的过渡架构</li><li>已实施解决方案的业务和IT运营模型</li></ul><h2 id="阶段H——架构变更管理"><a href="#阶段H——架构变更管理" class="headerlink" title="阶段H——架构变更管理"></a>阶段H——架构变更管理</h2><p>该阶段确保能够以一种可控制的方式对架构的改变进行管理。</p><h3 id="目标-7"><a href="#目标-7" class="headerlink" title="目标"></a>目标</h3><ul><li>确保基线架构持续符合当前实际情况；</li><li>评估架构性能并提出改进建议；</li><li>评估在之前阶段中制定的框架和原则的变化；</li><li>为实施治理阶段建立的新的企业架构基线建立一个架构变更管理流程；</li><li>将架构和运营的业务价值最大化；</li><li>运用治理框架。</li></ul><h3 id="步骤-9"><a href="#步骤-9" class="headerlink" title="步骤"></a>步骤</h3><ul><li>建立价值实现过程；</li><li>部署监控工具；</li><li>管理风险；</li><li>提供架构变更管理分析；</li><li>开发变更需求以满足性能目标；</li><li>管理治理过程；</li><li>启动实施变更的流程。</li></ul><h3 id="输入-9"><a href="#输入-9" class="headerlink" title="输入"></a>输入</h3><ul><li>在阶段E和F中确认的架构工作要求书；<br><br></li><li>企业架构的组织模型；</li><li>架构工作说明书；</li><li>架构愿景；</li><li>架构资源库；</li><li>架构定义文档；</li><li>架构需求说明书；</li><li>架构路线图；</li><li>由技术变化产生的变更请求：</li><li>新技术报告</li><li>资产管理成本削减措施</li><li>技术退出报告</li><li>各标准举措</li><li>由业务变化产生的变更请求：</li><li>业务发展</li><li>业务异常</li><li>业务革新</li><li>业务技术革新</li><li>战略变化发展</li><li>由经验教训产生的变更请求；</li><li>过渡架构；</li><li>实施治理模型；</li><li>架构契约（签字）；</li><li>合规性的评估；</li><li>实施和迁移计划。</li></ul><h3 id="输出-9"><a href="#输出-9" class="headerlink" title="输出"></a>输出</h3><ul><li>架构的各种更新；</li><li>对架构框架和原则的变更；</li><li>新的架构工作要求书，用于发起另一次ADM循环；</li><li>架构工作说明书（Update）；</li><li>架构契约（Update）；</li><li>合规性的评估（Update）。</li></ul><h2 id="需求管理"><a href="#需求管理" class="headerlink" title="需求管理"></a>需求管理</h2><p>架构需求管理适用于ADM的所有阶段，这是一个动态的过程，完成对企业需求的识别、存储并把它们插入或取出相应的ADM阶段。需求管理是ADM流程的中心。处理需求变化的能力对于ADM过程是非常重要的，架构通过其天然处理不确定性和变化的能力在涉众诉求之间架起桥梁并交付一个可实践的解决方案。</p><h3 id="目标-8"><a href="#目标-8" class="headerlink" title="目标"></a>目标</h3><ul><li>定义一个可以贯穿ADM循环各个阶段的管理架构需求的过程；</li><li>识别和存储企业需求并与相应的ADM阶段进行交互。</li></ul><h3 id="步骤-10"><a href="#步骤-10" class="headerlink" title="步骤"></a>步骤</h3><ul><li>通过业务情景或其它模拟技术来识别并记录需求（ADM各阶段）；</li><li>建立需求基线：</li><li>确定产生于当前架构开发方法阶段的各优先级事项</li><li>确认干系人认可各个结果优先级事项</li><li>记录需求优先级并将其放入需求库<br><br></li><li>监控需求基线；</li><li>识别发生变更的需求（ADM各阶段）：</li><li>增、删、改处理并重新评定优先级</li><li>识别并解决冲突</li><li>生成需求影响说明</li><li>评估变更的需求对现在和之前的ADM阶段产生的影响（ADM各阶段）；</li><li>实施架构变更管理阶段的需求（ADM架构变更管理阶段）；</li><li>更新需求资源库；</li><li>实施当前阶段的需求变更（ADM各阶段）；</li><li>评估并修订先前阶段的差距分析（ADM各阶段）。</li></ul><h3 id="输入-10"><a href="#输入-10" class="headerlink" title="输入"></a>输入</h3><ul><li>各个ADM阶段中与需求相关的输出就是需求管理流程的输入；</li><li>最初高层次的需求是作为一部分的架构愿景所产生；</li><li>每个架构领域都有相应的详细需求，之后的ADM阶段交付物也包含了对新的需求类型的映射（如一致性需求）。</li></ul><h3 id="输出-10"><a href="#输出-10" class="headerlink" title="输出"></a>输出</h3><ul><li>更新的架构需求说明（如有必要）；</li><li>需求影响的评估，识别出需要回到的ADM阶段。最终版本必须包含需求的全部含义（如成本、时间范围和业务流程）。</li></ul><h2 id="建立架构活动的范围"><a href="#建立架构活动的范围" class="headerlink" title="建立架构活动的范围"></a>建立架构活动的范围</h2><p>ADM方法不能够确定架构活动的范围，这必须由企业自己确定。需要限定架构活动范围的原因与以下因素有关：  </p><ul><li>创建架构的团队所具备的组织权力；</li><li>需要在架构中实现的目标和干系人的诉求；</li><li>可利用的人、资金以及其它资源。  </li></ul><p>选定的架构活动范围理论上应该地支持企业中的架构师高效地完成治理和整合工作。这需要一套一致的“架构分区”，确保架构师不会从事重复劳动或冲突的活动。这同样需要定义重用和多个架构分区间的服从关系。下面从四个维度对架构活动范围的限定进行了说明。</p><h3 id="企业范围或焦点"><a href="#企业范围或焦点" class="headerlink" title="企业范围或焦点"></a>企业范围或焦点</h3><ul><li>企业最大的业务范围是什么？其中又有多少是需要架构工作聚焦的？</li><li>许多企业的规模非常大，实际上形成了一个组织单位成员的联盟，每个成员都有自己独立的企业权利。(如事业部或者子公司)</li><li>现代企业越来越突破它的传统界线，包括了一个由供应商、客户和合作伙伴形成的模糊的传统行业企业联盟。</li></ul><h3 id="架构领域"><a href="#架构领域" class="headerlink" title="架构领域"></a>架构领域</h3><p>一个全面的企业架构描述应该包括全部四个架构领域（业务、数据、应用、技术），但是实际的资源和时间约束经常意味着没有充分的时间、资金或其它资源去设计一个自顶而下的、包含全部四个架构领域的架构描述。即使在选定的架构活动范围小于企业整体业务范围时也是这样。</p><h3 id="详述垂直范围或级别"><a href="#详述垂直范围或级别" class="headerlink" title="详述垂直范围或级别"></a>详述垂直范围或级别</h3><ul><li>架构工作应该细化到第几层？怎么样的架构工作才算充分的？</li><li>架构工作和其它相关工作（系统设计、系统工程以及系统开发）的界线是什么？一般是配合的，松散的分工</li></ul><h3 id="时间周期"><a href="#时间周期" class="headerlink" title="时间周期"></a>时间周期</h3><p>架构愿景的准确时间周期是什么？它是否意味着要在这个时间期间内用详细的架构描述填充满？如果不是，那么需要定义多少个中间级别的目标架构，并且它们的时间周期是多少？</p><h1 id="TOGAF方法论系列文章"><a href="#TOGAF方法论系列文章" class="headerlink" title="TOGAF方法论系列文章"></a>TOGAF方法论系列文章</h1><ul><li>系统架构设计方法论-TOGAF-概述: 背景介绍，ADM，以及TOGAF各个阶段的输入输出说明</li><li>TOGAF架构能力框架说明</li><li>各种架构方法论的对比</li></ul><h1 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h1><p><a href="https://segmentfault.com/a/1190000019704801" target="_blank" rel="noopener">https://segmentfault.com/a/1190000019704801</a><br><a href="https://baike.baidu.com/item/TOGAF/9832356?fr=aladdin" target="_blank" rel="noopener">https://baike.baidu.com/item/TOGAF/9832356?fr=aladdin</a><br><a href="https://www.cnblogs.com/xiang--liu/p/9710229.html" target="_blank" rel="noopener">https://www.cnblogs.com/xiang--liu/p/9710229.html</a><br><a href="https://blog.csdn.net/watermelonbig/article/details/77620847" target="_blank" rel="noopener">https://blog.csdn.net/watermelonbig/article/details/77620847</a><br><a href="https://www.jianshu.com/p/0a867fe89e90" target="_blank" rel="noopener">https://www.jianshu.com/p/0a867fe89e90</a><br><a href="https://zhuanlan.zhihu.com/p/83618027" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/83618027</a><br><a href="https://zhuanlan.zhihu.com/p/84110694" target="_blank" rel="noopener">https://zhuanlan.zhihu.com/p/84110694</a></p><p><a href="https://www.visual-paradigm.com/cn/features/togaf-adm-tools/" target="_blank" rel="noopener">https://www.visual-paradigm.com/cn/features/togaf-adm-tools/</a></p><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;一直想要整理架构设计相关的方法论。&lt;/p&gt;
    
    </summary>
    
      <category term="方法论" scheme="http://blog.xiaoyuyu.net/categories/%E6%96%B9%E6%B3%95%E8%AE%BA/"/>
    
    
      <category term="学习笔记" scheme="http://blog.xiaoyuyu.net/tags/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
      <category term="系统架构" scheme="http://blog.xiaoyuyu.net/tags/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/"/>
    
  </entry>
  
  <entry>
    <title>96-盛氏家训</title>
    <link href="http://blog.xiaoyuyu.net/post/5a21bfce.html"/>
    <id>http://blog.xiaoyuyu.net/post/5a21bfce.html</id>
    <published>2020-01-02T14:29:03.000Z</published>
    <updated>2020-07-23T06:08:33.719Z</updated>
    
    <content type="html"><![CDATA[<p>大丈夫在世，当 <strong>修身 养性 齐家 治国 平天下</strong></p><a id="more"></a><h1 id="修身"><a href="#修身" class="headerlink" title="修身"></a>修身</h1><h2 id="尚学"><a href="#尚学" class="headerlink" title="尚学"></a>尚学</h2><ul><li>不可愚蠢且懒惰。</li><li>世界上的事情，只要肯吃苦，一定可以做成。</li><li>多读历史，以史为鉴。</li><li>不要被经验束缚。遇到大事情，八成靠经验，二成靠思考和创新。</li><li>努力，还要有方法。</li><li>应该要多元，应该要拓宽视野，不要有局限性。</li></ul><h2 id="修身-1"><a href="#修身-1" class="headerlink" title="修身"></a>修身</h2><ul><li>顺天应人。</li><li>善于忍耐。大丈夫能屈能伸。</li><li>自我反省，时常总结。</li><li>偶尔回头看看，适当后退。</li><li>严谨果决。</li><li>严于律己。</li></ul><hr><h1 id="养性"><a href="#养性" class="headerlink" title="养性"></a>养性</h1><ul><li>不要轻视任何人。</li><li>弱小和无知从不是生存的障碍，傲慢才是。</li><li>说我好的人未必是好人，说我坏的人未必是坏人。</li><li>立场大于原则。</li><li>做人要厚道。</li><li>不可以玩物丧志。</li><li>不要轻浮，切忌性躁。</li><li>沉稳大气有格局。</li><li>不可穷追不舍，做事要留有余地。</li></ul><hr><h1 id="齐家"><a href="#齐家" class="headerlink" title="齐家"></a>齐家</h1><ul><li>花繁柳密处拨得开，方见手段；风狂雨骤时立得定，才是脚跟。</li><li>守正出奇。</li><li>家里的事情，要通盘考虑，不可偏颇局限。</li><li>保证多元性，不要钻牛角尖，不要给可能性设限。</li><li>良好的规则才能造就良好的家庭。</li><li>长幼有序，疏不间亲。父慈子孝，兄友弟恭。</li><li>一屋不扫何以扫天下，家里要安排的井井有条。</li><li>祖宗虽远，祭祀宜诚；子孙虽愚，诗书须读。</li><li>娶媳求淑女，勿计妆奁；嫁女择佳婿，勿慕富贵。</li><li>家富提携宗族，置义塾与公田；岁饥赈济亲朋，筹仁浆与义粟。</li><li>勤俭为本，自必丰亨；忠厚传家，乃能长久。</li><li>恤寡矜孤，敬老怀幼。</li></ul><hr><h1 id="治国"><a href="#治国" class="headerlink" title="治国"></a>治国</h1><ul><li>信交朋友，惠普乡邻。</li><li>不可色厉胆薄，好谋无断；干大事而惜身，见小利而忘命。</li><li>小人固当远，断不可显为仇敌；君子固当亲，亦不可曲为附和。</li><li>见贤思齐。</li><li>执法如山，守身如玉。</li><li>严以律己，宽以待人。</li><li>走心。</li><li>利在一身勿谋也，利在天下者必谋之；利在一时固谋也，利在万世者更谋之。</li><li>大智兴邦，不过集众思；大愚误国，只为好自用。</li><li>不可用战术的勤奋弥补战略的懒惰。</li><li>最忌愚蠢而勤奋的人。</li><li>聪明睿智，守之以愚；功被天下，守之以让；勇力振世，守之以怯；富有四海，守之以谦。</li><li>庙堂之上，以养正气为先；海宇之内，以养元气为本。</li></ul><hr><h1 id="平天下"><a href="#平天下" class="headerlink" title="平天下"></a>平天下</h1><ul><li>弱小和无知从不是生存的障碍，傲慢才是。</li></ul><p><hr></p><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p><p></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;大丈夫在世，当 &lt;strong&gt;修身 养性 齐家 治国 平天下&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="杂谈" scheme="http://blog.xiaoyuyu.net/categories/%E6%9D%82%E8%B0%88/"/>
    
    
      <category term="术与道" scheme="http://blog.xiaoyuyu.net/tags/%E6%9C%AF%E4%B8%8E%E9%81%93/"/>
    
      <category term="家训" scheme="http://blog.xiaoyuyu.net/tags/%E5%AE%B6%E8%AE%AD/"/>
    
  </entry>
  
  <entry>
    <title>95-2019年度总结-做点什么让自己骄傲</title>
    <link href="http://blog.xiaoyuyu.net/post/598be3fa.html"/>
    <id>http://blog.xiaoyuyu.net/post/598be3fa.html</id>
    <published>2020-01-01T14:09:37.000Z</published>
    <updated>2020-01-02T07:18:55.855Z</updated>
    
    <content type="html"><![CDATA[<p>2019做了很多事情，但是仍然不能称为满意。</p><a id="more"></a><h1 id="目标review"><a href="#目标review" class="headerlink" title="目标review"></a>目标review</h1><h2 id="工作"><a href="#工作" class="headerlink" title="工作"></a>工作</h2><ul><li>混一下，能够做点自己的事情，工资能提升。</li><li>失去了一号位的位置。其实之前自己没有想清楚。</li></ul><h2 id="生活"><a href="#生活" class="headerlink" title="生活"></a>生活</h2><ul><li>做好一切能做的。</li></ul><h2 id="个人"><a href="#个人" class="headerlink" title="个人"></a>个人</h2><ul><li>齐家治国?修身养性?加薪了，但是没升职。身价提升了。</li><li>时间利用更有效了，只是没有产生质变。有了自己的时间，思考。</li></ul><h2 id="家庭与团队"><a href="#家庭与团队" class="headerlink" title="家庭与团队"></a>家庭与团队</h2><ul><li>有好有坏吧。</li></ul><hr><h1 id="做了哪些事情"><a href="#做了哪些事情" class="headerlink" title="做了哪些事情"></a>做了哪些事情</h1><h2 id="工作-1"><a href="#工作-1" class="headerlink" title="工作"></a>工作</h2><ul><li>一份工作。一个还算大厂的背景。</li><li>把土带了一下。</li><li>写了一个机器人。相当于尝试了两个方向，打基础。</li><li>做了一个量化交易平台。</li><li>AI入门了。</li><li>别的没有了。</li><li>review了一下2017年的总结，其实更多的在退步。在这里拿出来，警示一下自己。<pre>  * 大局观  * 补位  * 持续集成卓有成效  * 安全管理方案  * Scrum团队管理  * 团队几次危机和风险应对  * 各种流程，恰到好处  * 自动化测试，白盒黑盒压力测试  * springboot的基础架构  * 推动力&执行力  * 客户端各种奇技淫巧&版本管理  * 前端的可行性方案&基础架构&技术栈梳理  * Devops技术栈梳理  * 团队里打鸡血和最苛刻的人  * 成功的团队招聘。面试了超过300人。几个技术骨干。ygy,lyf,xwq,wqq,lch,yzx和另外一些合适的人。  * 品质管理各种流程控制  * 几个亮点项目  * 一整套数据分析，实施方法论。  * 数据库玩的更熟了  * 分析&解决节奏</pre></li></ul><hr><h2 id="生活-1"><a href="#生活-1" class="headerlink" title="生活"></a>生活</h2><ul><li>铁蛋有了一些改进。</li><li>读了更多的书。今年读完大约了10本。</li><li>给家里建立了图书馆，需要靠后续引导了。</li><li>开始做喜马拉雅主播，锻炼语法能力。</li><li>PPT做的包装的更好了，但是没有干货提升。</li><li>铁蛋的培养体系，包括知识体系和书单。</li><li>优化了投资策略，存下了钱。</li><li>本来就是慢下来，让自己有机会走的慢一点。更加恰如其分。</li><li>但是之前的种种，其实没有进步。之前已经做了的。<ul><li>精力分配的思维导图。</li><li>家庭食谱。</li><li>财务预算决算。</li><li>家庭资金分配。</li><li>家庭生活的思维导图。包括投资等。</li><li>保险规划。</li><li>工作机会评估模型。</li></ul></li></ul><h2 id="个人-1"><a href="#个人-1" class="headerlink" title="个人"></a>个人</h2><ul><li>自己想要维护的产品列表:<ul><li>博客,后续拓展到微信公众号，头条，博客，和土一起维护。</li><li>音乐推荐网站。</li><li>对话机器人。加AI的整个基础体系。</li><li>量化交易平台。</li><li>比特币定投平台。(第一个可见的可以生产化的的产品)</li></ul></li><li>身体:<ul><li>健身了至少，全年跑了100公里。健身时间增加了。 </li></ul></li></ul><h2 id="家庭和团队"><a href="#家庭和团队" class="headerlink" title="家庭和团队"></a>家庭和团队</h2><ul><li>失去了一号位的定位。明年要重建。</li><li>带了学弟和他们公司，继续做顾问。</li><li>给南京的团队帮了忙，其实性价比极其低下。这些事情三年前都是看不上的。</li><li>父母的关系恶化，其实是极大的打击。</li><li>目前养下来的人，其实只是权宜之计。</li><li>花在家里的时间增加了。</li><li>组织了6次线下聚餐，但是没有转化为收益。</li><li>去旅游了一次。还回家了一次。</li></ul><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><p>没想到了。</p><hr><h1 id="有哪些做得好的"><a href="#有哪些做得好的" class="headerlink" title="有哪些做得好的"></a>有哪些做得好的</h1><ul><li>真的是在退步的一年。可能好处就是身体和心理压力减少了。但是主要是多赚了钱，给了土一个还可以的位置。</li></ul><hr><h1 id="有哪些做的不好的"><a href="#有哪些做的不好的" class="headerlink" title="有哪些做的不好的?"></a>有哪些做的不好的?</h1><ul><li>再想想。</li></ul><hr><h1 id="2020的目标"><a href="#2020的目标" class="headerlink" title="2020的目标"></a>2020的目标</h1><ul><li>天津买房。</li><li>铁蛋的教育。</li><li>坚定地执行可控的投资策略。定投+理财。即便是数字货币和股票也坚决定投。保守主义。</li><li>模型思维，全部学一下。读10本书单上的书。</li><li>帮几个人的工作稳固一下，培养自己的人，尤其是土。</li><li>重归一号位，想办法攒一个事情，养活1个全职(下半年)+3个兼职的人，争取一年发出去6万工资,并且公司能取得对应的利润。搭建一套靠谱的框架便于接项目。</li><li>继续组织6次线下聚餐。更靠谱的给两家公司做顾问，不求多。</li><li>和土的博客写出10篇高质量的文章。</li><li>升职。</li><li>对话机器人+定投平台产品化。</li><li>学会游泳。</li><li>给自己+土和铁蛋制定调养+健身计划。自己全年跑完100公里(20次5公里,其中争取像今年一样奥森10次)，游泳10公里,跳绳2万次。爬山5次。其他热身10小时。</li><li>其他计划能完成。包括预算，保险，投资，食谱等。<p><!--<span id="busuanzi_container_page_pv"> 阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;2019做了很多事情，但是仍然不能称为满意。&lt;/p&gt;
    
    </summary>
    
      <category term="杂谈" scheme="http://blog.xiaoyuyu.net/categories/%E6%9D%82%E8%B0%88/"/>
    
    
      <category term="年度总结" scheme="http://blog.xiaoyuyu.net/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    
      <category term="2019" scheme="http://blog.xiaoyuyu.net/tags/2019/"/>
    
  </entry>
  
  <entry>
    <title>94-neo4j基础教程</title>
    <link href="http://blog.xiaoyuyu.net/post/84a86b35.html"/>
    <id>http://blog.xiaoyuyu.net/post/84a86b35.html</id>
    <published>2019-11-29T02:52:55.000Z</published>
    <updated>2020-06-13T17:41:43.339Z</updated>
    
    <content type="html"><![CDATA[<h1 id="概览"><a href="#概览" class="headerlink" title="概览"></a>概览</h1><p>知识图谱（Knowledge Graph），在图书情报界称为知识域可视化或知识领域映射地图，是显示知识发展进程与结构关系的一系列各种不同的图形，用 可视化技术描述知识资源及其载体，挖掘、分析、 构建、绘制和显示知识及它们之间的相互联系。 知识图谱是通过将应用数学、 图形学、信息可视化技术、 信息科学等学科的理论与方法与计量学引文分析、共现分析等方法结合，并利用可视化的图谱形象地展示学科的核心结构、发展历史、 前沿领域以及整体知识架构达到多学科融合目的的现代理论。它能为学科研究提供切实的、有价值的参考。而Neo4j是目前比较主流的构建知识图谱的存储方式。</p><a id="more"></a><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>官网 <a href="https://neo4j.com/" target="_blank" rel="noopener">https://neo4j.com/</a> 下载并且解压：/Users/shengl/2-sys-ai/neo4j-3.5.12</p><blockquote><p>进入目录/Users/shengl/2-sys-ai/neo4j-3.5.12/bin/<br>./neo4j start  来运行 </p></blockquote><pre>Active database: officialdemo.dbDirectories in use:  home:         /Users/shengl/2-sys-ai/neo4j-3.5.12  config:       /Users/shengl/2-sys-ai/neo4j-3.5.12/conf  logs:         /Users/shengl/2-sys-ai/neo4j-3.5.12/logs  plugins:      /Users/shengl/2-sys-ai/neo4j-3.5.12/plugins  import:       /Users/shengl/2-sys-ai/neo4j-3.5.12/import  data:         /Users/shengl/2-sys-ai/neo4j-3.5.12/data  certificates: /Users/shengl/2-sys-ai/neo4j-3.5.12/certificates  run:          /Users/shengl/2-sys-ai/neo4j-3.5.12/run</pre><h1 id="基本操作"><a href="#基本操作" class="headerlink" title="基本操作"></a>基本操作</h1><h2 id="进入运行时环境"><a href="#进入运行时环境" class="headerlink" title="进入运行时环境"></a>进入运行时环境</h2><blockquote><p>访问 <a href="http://127.0.0.1:7474/browser/" target="_blank" rel="noopener">http://127.0.0.1:7474/browser/</a><br>默认账号密码是neo4j<br>登录后的界面如下:  </p></blockquote><p><img src="/img/2020/2020-06-14-01.jpg" alt></p><blockquote><p>neo4j提供了类似SQL的声明式命令，用户可以通过命令对neo4j进行基本操作，如<br>创建、更新、删除节点和关系<br>通过模式匹配来查询和修改节点和关系<br>管理索引和约束等。<br>neo4j的核心是节点而不是数据条目。</p></blockquote><h2 id="创建节点"><a href="#创建节点" class="headerlink" title="创建节点"></a>创建节点</h2><ul><li>语法说明： CREATE创建操作，Person是标签,代表节点的类型。{}括号里面代表节点的属性。</li></ul><blockquote><p>CREATE (n:Person {name:’姚明’}) RETURN n<br>创建一个标签为Person的节点，该节点有一个属性name，这个属性的值是姚明；执行后，可以看到创建成功的节点。</p></blockquote><ul><li>继续创建节点。  </li></ul><blockquote><p>CREATE (n:Person {name:’特雷西·麦克格雷迪’}) RETURN n<br>CREATE (n:Person {name:’易建联’}) RETURN n<br>CREATE (n:Person {name:’叶莉’}) RETURN n<br>CREATE (n:Person {name:’杰夫·范甘迪’}) RETURN n<br>CREATE (n:Person {name:’路易斯·斯科拉’}) RETURN n<br>CREATE (n:Person {name:’大卫·斯特恩’}) RETURN n<br>CREATE (n:Person {name:’莱斯利·亚历山大’}) RETURN n   </p></blockquote><ul><li>插入之后的效果:</li></ul><p><img src="/img/2020/2020-06-14-02.jpg" alt></p><h2 id="创建地区节点"><a href="#创建地区节点" class="headerlink" title="创建地区节点"></a>创建地区节点</h2><blockquote><p>CREATE (n:Location {city:’休斯顿’, country:’USA’})<br>CREATE (n:Location {city:’上海’, country:’CHINA’})<br>CREATE (n:Location {city:’广州’, country:’CHINA’})<br>CREATE (n:Location {city:’纽约’, country:’USA’})  </p></blockquote><ul><li>插入之后的效果:</li></ul><p><img src="/img/2020/2020-06-14-03.jpg" alt></p><h2 id="创建关系"><a href="#创建关系" class="headerlink" title="创建关系"></a>创建关系</h2><ul><li>注意箭头是有方向的。</li></ul><blockquote><p>MATCH (a:Person {name:’姚明’}),  (b:Person {name:’特雷西·麦克格雷迪’}) MERGE (a)-[:FRIENDS]-&gt;(b)<br>MATCH (a:Person {name:’姚明’}),  (b:Person {name:’特雷西·麦克格雷迪’}) MERGE (b)-[:FRIENDS]-&gt;(a)</p></blockquote><ul><li>关系可以增加属性:比如姚明和斯科拉2006年开始成为队友。  </li></ul><blockquote><p>MATCH (a:Person {name:’姚明’}), (b:Person {name:’路易斯·斯科拉’}) MERGE (a)-[:TEAMATE {since:2006}]-&gt;(b)<br>MATCH (a:Person {name:’姚明’}), (b:Person {name:’路易斯·斯科拉’}) MERGE (b)-[:TEAMATE {since:2006}]-&gt;(a)  </p></blockquote><h2 id="建立人物和地点之间的关系"><a href="#建立人物和地点之间的关系" class="headerlink" title="建立人物和地点之间的关系"></a>建立人物和地点之间的关系</h2><ul><li>姚明1980年出生于上海。</li></ul><blockquote><p>MATCH (a:Person {name:’姚明’}), (b:Location {city:’上海’}) MERGE (a)-[:BORN_IN {year:1980}]-&gt;(b)</p></blockquote><ul><li>插入之后的效果:<br><img src="/img/2020/2020-06-14-04.jpg" alt></li></ul><h2 id="查询"><a href="#查询" class="headerlink" title="查询"></a>查询</h2><ul><li>查询下所有在上海出生的人物,按照目前的关系数据，只能查到姚明。</li></ul><blockquote><p>MATCH (a:Person)-[:BORN_IN]-&gt;(b:Location {city:’上海’}) RETURN a,b</p></blockquote><ul><li>查询所有有对外关系的节点: 可以查出姚明，麦迪和斯科拉。</li></ul><blockquote><p>MATCH (a)–&gt;() RETURN a</p></blockquote><ul><li>反过来，可以查询到姚明，麦迪，斯科拉，和上海:</li></ul><blockquote><p>MATCH (a)&lt;–() RETURN a</p></blockquote><ul><li>查询所有有关系的节点，同上面一样。</li></ul><blockquote><p>MATCH (a)–() RETURN a</p></blockquote><ul><li>查询所有对外有关系的节点，以及关系类型</li></ul><blockquote><p>MATCH (a)-[r]-&gt;() RETURN a.name, type(r)</p></blockquote><p>效果如下图:<br><img src="/img/2020/2020-06-14-05.jpg" alt></p><h2 id="创建节点的时候就创建好关系"><a href="#创建节点的时候就创建好关系" class="headerlink" title="创建节点的时候就创建好关系"></a>创建节点的时候就创建好关系</h2><blockquote><p>CREATE (a:Person {name:’刘翔’})-[r:FRIENDS]-&gt;(b:Person {name:’姚明’})</p></blockquote><h2 id="关联查询"><a href="#关联查询" class="headerlink" title="关联查询:"></a>关联查询:</h2><ul><li>查询麦迪的朋友姚明的队友</li></ul><blockquote><p>MATCH (a:Person {name:’特雷西·麦克格雷迪’})-[r1:FRIENDS]-()-[r2:TEAMATE]-(teamate_of_a_friend) RETURN teamate_of_a_friend.name AS tofName</p></blockquote><h2 id="增加-amp-修改节点属性"><a href="#增加-amp-修改节点属性" class="headerlink" title="增加&amp;修改节点属性"></a>增加&amp;修改节点属性</h2><ul><li>这里的SET表示修改操作</li></ul><blockquote><p>MATCH (a:Person {name:’姚明’}) SET a.age=40<br>MATCH (a:Person {name:’斯科拉’}) SET a.age=45<br>MATCH (a:Person {name:’姚明’}) SET a.age=44  </p></blockquote><ul><li>删除节点属性:删除属性操作主要通过REMOVE  </li></ul><blockquote><p>MATCH (a:Person {name:’姚明’}) SET a.role=’中国篮协主席’<br>MATCH (a:Person {name:’姚明’}) REMOVE a.role  </p></blockquote><h2 id="删除节点"><a href="#删除节点" class="headerlink" title="删除节点"></a>删除节点</h2><blockquote><p>MATCH (a:Location {city:’休斯顿’}) DELETE a</p></blockquote><ul><li>删除有关系的节点</li></ul><blockquote><p>MATCH (a:Person {name:’刘翔’})-[rel]-(b:Person) DELETE a,b,rel</p></blockquote><ul><li><p>删除前的效果:<br><img src="/img/2020/2020-06-14-06.jpg" alt></p></li><li><p>删除后的效果:<br><img src="/img/2020/2020-06-14-07.jpg" alt></p><p><!--<span id="busuanzi_container_page_pv"> 阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;概览&quot;&gt;&lt;a href=&quot;#概览&quot; class=&quot;headerlink&quot; title=&quot;概览&quot;&gt;&lt;/a&gt;概览&lt;/h1&gt;&lt;p&gt;知识图谱（Knowledge Graph），在图书情报界称为知识域可视化或知识领域映射地图，是显示知识发展进程与结构关系的一系列各种不同的图形，用 可视化技术描述知识资源及其载体，挖掘、分析、 构建、绘制和显示知识及它们之间的相互联系。 知识图谱是通过将应用数学、 图形学、信息可视化技术、 信息科学等学科的理论与方法与计量学引文分析、共现分析等方法结合，并利用可视化的图谱形象地展示学科的核心结构、发展历史、 前沿领域以及整体知识架构达到多学科融合目的的现代理论。它能为学科研究提供切实的、有价值的参考。而Neo4j是目前比较主流的构建知识图谱的存储方式。&lt;/p&gt;
    
    </summary>
    
      <category term="术业专攻" scheme="http://blog.xiaoyuyu.net/categories/%E6%9C%AF%E4%B8%9A%E4%B8%93%E6%94%BB/"/>
    
    
      <category term="知识图谱" scheme="http://blog.xiaoyuyu.net/tags/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1/"/>
    
      <category term="neo4j" scheme="http://blog.xiaoyuyu.net/tags/neo4j/"/>
    
      <category term="图数据库" scheme="http://blog.xiaoyuyu.net/tags/%E5%9B%BE%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
      <category term="AI" scheme="http://blog.xiaoyuyu.net/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>93-数据库设计指南</title>
    <link href="http://blog.xiaoyuyu.net/post/17a93bf0.html"/>
    <id>http://blog.xiaoyuyu.net/post/17a93bf0.html</id>
    <published>2019-11-22T03:53:21.000Z</published>
    <updated>2020-01-01T14:13:05.525Z</updated>
    
    <content type="html"><![CDATA[<p>干货来了, 数据库设计最佳实践.</p><a id="more"></a><h1 id="基础部分"><a href="#基础部分" class="headerlink" title="基础部分"></a>基础部分</h1><ul><li>表存储引擎必须使用InnoDB。</li><li>表字符集默认使用utf8，必要时候使用utf8mb4。</li><li>数据库，表，字段字符集一定要统一，统一字符集可以避免由于字符集转换产生的乱码。</li><li>不允许使用存储过程，视图，触发器，Event。</li><li>禁止在数据库中存储大文件，例如照片，可以将大文件存储在对象存储系统，数据库中存储访问路径。</li><li>禁止在线上环境做数据库压力测试。各个环境的数据库应该隔离。</li><li>事物尽可能的小，不要在代码层面直接一个大的transaction。</li><li>我们不删除记录，我们总是用删除标记(软删除)来进行”删除”操作。</li><li>UUID ()，USER () 这样的 MySQL INSIDE 函数对于复制来说是很危险的，会导致主备数据不一致，所以请不要使用。如果一定要使用 UUID 作为主键，让应用程序来产生。</li><li>控制单表数据量，最佳实践是在500万条以下，应该在一开始就考虑： 可以用历史数据归档（应用于日志数据），分库分表（应用于业务数据）等手段来控制数据量大小。</li><li>字段约束和索引应该分开来设计。</li></ul><h1 id="命名规范"><a href="#命名规范" class="headerlink" title="命名规范"></a>命名规范</h1><ul><li>库名，表名，列名必须用小写，采用下划线分隔。因为默认情况下，mysql对大小写敏感，mysql数据库本质上是linux系统下的一个文件，而linux系统是大小写敏感的。</li><li>库名，表名，列名必须见名知义，长度不要超过32字符</li><li>建议: 字典表以 ${domain缩写<em>dict</em>}为前缀。如 cm_dict_,  关联表以${domain缩写<em>relation</em>}为前缀。</li><li>有数据库对象名称禁止使用mysql保留关键字。</li><li>所有存储相同数据的列名和列类型必须一致，比如user表中的id和order表中的user_id。</li></ul><h1 id="字段设计及约束"><a href="#字段设计及约束" class="headerlink" title="字段设计及约束"></a>字段设计及约束</h1><ul><li>禁止对数据库表字段进行删除和修改的操作。</li><li>不要使用联合主键，目前我们规范中推荐的是使用业务无关的自增主键。</li><li>在设计时尽量包含两个日期字段:create_time (创建日期),update_time (修改日期) 且 非空，对表的记录进行更新的时候，必须包含对 update_time 字段的更新。</li><li>建议将大字段，访问频度低的字段拆分到单独的表中存储，分离冷热数据。</li><li>设计表时尽量用“小数据类型”，比如尽量避免text，blob,如果必须使用，应该在单独的表中进行存储,实际上更应该存储到别的存储系统并且在mysql中保存链接即可。</li><li>禁止使用外键，如果要保证完整性，应由代码来实现。</li><li>根据业务区分使用tinyint/int/bigint，分别会占用1/4/8字节。</li><li>字段长度比较固定，或者长度近似的业务场景，适合使用char，能够减少碎片，查询性能高。</li><li>字段长度相差较大，或者更新较少的业务场景，适合使用varchar(n)，能够减少空间。其中n表示字符数而不是字节数。</li><li>建议: 必须把字段定义为NOT NULL并设默认值。</li><li>使用varchar(20)存储手机号，不要使用整数。或者char(20)。</li><li>使用INT UNSIGNED存储IPv4，不要用char(15)。</li><li>使用TINYINT来代替ENUM。</li><li>不要在表中建立预留字段，新增字段的代价并不是很大。</li><li>对于非负型的数据（如自增ID、整型IP）来说，要优先使用无符号整型来存储。</li><li>同财务相关的金额类数据必须使用decimal类型,可以保证不出现精度丢失。</li><li>手机号，身份证号等可以作为索引，可以建立唯一约束，但是不要作为主键。</li></ul><h1 id="索引规范"><a href="#索引规范" class="headerlink" title="索引规范"></a>索引规范</h1><ul><li>在select，delete，update的where从句中的列,包含在order by，group by，distinct字段中的列和多表join的关联列建立索引</li><li>唯一索引使用uniq_[字段名]来命名。</li><li>非唯一索引使用idx_[字段名]来命名。</li><li>单张表索引数量建议控制在5个以内。</li><li>索引会影响写的性能。</li><li>异常复杂的查询需求，可以选择ES等更为适合的方式存储。</li><li>区分度最高的放在联合索引的最左侧（区分度=列中不同值的数量/列的总行数）。</li><li>尽量把字段长度小的列放在联合索引的最左侧（因为字段长度越小，一页能存储的数据量越大，IO性能也就越好）。</li><li>使用最频繁的列放到联合索引的左侧（这样可以比较少的建立一些索引）。</li><li>组合索引字段数不建议超过5个。</li><li>不建议在频繁更新的字段上建立索引。</li><li>非必要不要进行JOIN查询，如果要进行JOIN查询，被JOIN的字段必须类型相同，并建立索引</li><li>理解组合索引最左前缀原则，避免重复建设索引，如果建立了(a,b,c)，相当于建立了(a), (a,b), (a,b,c)。</li><li>对于非主键唯一的int类型字段，没有将其单独设置为索引比必要。设置索引后反倒增大了内存的占用，检索时的性能也不见得会有提升。</li><li>对于频繁的查询优先考虑使用覆盖索引(只在必要且数据量较大频繁使用的场景)。覆盖索引：就是包含了所有查询字段(where,select,ordery by,group by包含的字段)的索引。</li></ul><h1 id="SQL语句规范"><a href="#SQL语句规范" class="headerlink" title="SQL语句规范"></a>SQL语句规范</h1><ul><li>禁止使用select *，只获取必要字段。</li><li>insert必须指定字段，禁止使用insert into T values()。指定字段插入，在表结构变更时，能保证对应用程序无影响。</li><li>不允许在where条件列使用函数。</li><li>建议: 不要负向查询以及%开头的模糊查询。</li><li>同一个字段上的OR必须改写为IN，IN的值必须少于50个。</li><li>应用程序必须捕获SQL异常，并且记录日志。</li><li>SQL事物不能设计太大，比如一次性提交10W条insert，一般来说insert事物的话，5K~1W来做批处理就可以了。</li><li>过大的SQL应该拆分成小的，减少锁的时间。同时也更容易运用CPU的性能。</li><li>update时，where语句尽量要走索引，不然会全表扫描，一般情况下1G的数据至少需要10S。</li><li>禁止使用order by rand 进行随机排序。</li></ul><h1 id="操作建议"><a href="#操作建议" class="headerlink" title="操作建议"></a>操作建议</h1><ul><li>进行非查询操作时，尽量使用begin来开启事务。否则可能因为少写了where条件或者其他误操作无法回滚。</li><li>应用程序中的数据库账号应该只赋予所需的最小权限。最佳实践是不分配DELETE的权限。</li><li>禁止从开发环境，测试环境直连生产环境数据库。</li><li>合理使用临时表，备份表，报表，而不是直接操作原有数据表。</li></ul><h1 id="设计checklist"><a href="#设计checklist" class="headerlink" title="设计checklist"></a>设计checklist</h1><ul><li>是否详细定义了数据库的组织结构和内容？</li><li>是否有合理的数据库规范。</li><li>是否按照组件进行了合理的划分。</li><li>是否指出了所用关键的业务规则，并描述其对系统的影响？</li><li>是否有不是必须的实体？</li><li>是否梳理清楚了实体与设计之间的关系。</li><li>基本表的性质: 在有必要的场景，是否设计了合适的结果表(存储统计数据)。</li><li>原子性。基本表中的字段是不可再分解的。</li><li>原始性。基本表中的记录是原始数据（基础数据）的记录。</li><li>演绎性。由基本表与代码表中的数据，可以派生出所有的输出数据。</li><li>稳定性。基本表的结构是相对稳定的，表中的记录是要长期保存的。</li><li>是否在设计范式和性能之间做了良好的权衡,并且在此基础上做了合理的字段冗余。</li><li>是否识别与正确处理多对多的关系。</li><li>E-R图是否满足: 结构清晰、关联简洁、实体个数 适中、属性分配合理、没有低级冗余。</li></ul><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;干货来了, 数据库设计最佳实践.&lt;/p&gt;
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>91-自杀前的13秒</title>
    <link href="http://blog.xiaoyuyu.net/post/1b91a4c6.html"/>
    <id>http://blog.xiaoyuyu.net/post/1b91a4c6.html</id>
    <published>2019-05-01T14:52:26.000Z</published>
    <updated>2019-09-17T02:52:36.350Z</updated>
    
    <content type="html"><![CDATA[<p>其实这个世界虽然充满了黑暗,宇宙的本质也是黑暗与竞争,但是我们仍然需要鼓起巨大的勇气,因为这个世界本来就不完美,不完整。<strong>绝望是由无数细碎的失望聚集而成的。同样,爱也是。</strong> </p><a id="more"></a><p>推荐一篇文章，原文来自<a href="https://mp.weixin.qq.com/s/5hDW8cl6Un_-2ogtB6e2Lw" target="_blank" rel="noopener">便利峰的公众号-《自杀前的13秒。》</a></p><p>因为我们每个个体,组成这个世界的每一个部分,每一个原子都不完美。<strong>你要知道这个世界的局限性。</strong></p><p>但是这个世界,总有一些值得你鼓起勇气去珍惜的地方。</p><p>生命是一场体验,一次修行。所以,不要轻易放弃啊。</p><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p><p></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;其实这个世界虽然充满了黑暗,宇宙的本质也是黑暗与竞争,但是我们仍然需要鼓起巨大的勇气,因为这个世界本来就不完美,不完整。&lt;strong&gt;绝望是由无数细碎的失望聚集而成的。同样,爱也是。&lt;/strong&gt; &lt;/p&gt;
    
    </summary>
    
      <category term="他山之石" scheme="http://blog.xiaoyuyu.net/categories/%E4%BB%96%E5%B1%B1%E4%B9%8B%E7%9F%B3/"/>
    
    
      <category term="读后感" scheme="http://blog.xiaoyuyu.net/tags/%E8%AF%BB%E5%90%8E%E6%84%9F/"/>
    
  </entry>
  
  <entry>
    <title>90-极简主义-我的衣橱只需要这些衣服</title>
    <link href="http://blog.xiaoyuyu.net/post/bf4e01b6.html"/>
    <id>http://blog.xiaoyuyu.net/post/bf4e01b6.html</id>
    <published>2019-04-14T15:31:13.000Z</published>
    <updated>2019-09-17T02:52:36.350Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>之前一直说要极简主义，目前已经在各个维度开始执行和总结。今天又到了搬家的前夕，正好趁着周末把衣服重新整理了一下。</p></blockquote><blockquote><p>有本书叫做《法国人只需要十件衣服》，虽然没有拜读过，但是我自己整理了一个列表。然后依据这个原则，只做替换，不买多余的。控制数量之后，也很容易提升品质，同时可以极大的减少打理衣物所需的时间。</p></blockquote><a id="more"></a><p>#列表：</p><h2 id="杂项"><a href="#杂项" class="headerlink" title="杂项"></a>杂项</h2><ul><li><strong>内裤</strong>: 5 四季共享，但是一般4个月轮换一批。</li><li><strong>袜子</strong>：10 只分厚薄两款即可，也是4个月轮换一批。</li><li><strong>棉裤</strong>： 1 只有过冬最冷的几天需要。很少会用到。</li><li><strong>凉拖</strong>：1 夏天及洗澡时使用。</li><li><strong>棉拖鞋</strong>：1 其他季节使用。</li></ul><h2 id="通用"><a href="#通用" class="headerlink" title="通用"></a>通用</h2><ul><li><strong>保暖内衣</strong>: 3套 半年轮换一次。除了夏天，都可以穿了。</li></ul><h2 id="衣物"><a href="#衣物" class="headerlink" title="衣物"></a>衣物</h2><ul><li><strong>POLO衫</strong>: 2 应付夏天，百搭各种场合。两件轮换。</li><li><strong>圆领衫</strong>: 1 夏天晚上睡觉偶尔穿，也可以运动穿。</li><li><strong>运动T恤</strong> 1 和圆领衫轮换。</li><li><strong>西裤</strong>: 2 日常上班轮换。</li><li><strong>厚牛仔裤</strong>：1 冬天非正式场合。</li><li><strong>薄休闲裤</strong>：1 各种非正式场合，家里及运动时穿。</li><li><strong>毛衣</strong>: 2 厚，薄各一件。</li><li><strong>短袖衬衣</strong>: 3 夏天正装</li><li><strong>长袖衬衣</strong>: 3 春秋正装。里面一般还可以搭配内衣。</li><li><strong>开领卫衣</strong>: 1 卫衣场合。</li><li><strong>正装</strong>: 西服外套1，其他衬衣和西裤复用日常工作装即可</li><li><strong>运动马裤</strong>：1 和短裤一起轮换夏天的场合即可。夏天休闲也可以穿。</li><li><strong>运动短裤</strong>: 1 和马裤一起轮换夏天的场合即可。夏天休闲也可以穿。</li><li><strong>运动长裤</strong>：复用休闲裤 </li><li><strong>厚长羽绒服</strong>：1 北京过冬室外时间也不长。</li><li><strong>短薄羽绒服</strong>：1 轮换用，初冬和初春都可以用。</li><li><strong>风衣</strong>: 1 需要的场合也不是很多。</li></ul><h2 id="鞋"><a href="#鞋" class="headerlink" title="鞋"></a>鞋</h2><ul><li><strong>运动鞋</strong>：1 不会每天锻炼，所以一双足够。</li><li><strong>皮鞋</strong>： 2 轮换，基本3个月换一双。已经是固定搭配。</li><li><strong>冬天御寒鞋</strong>： 1 一双足矣。</li></ul><h2 id="其他配饰"><a href="#其他配饰" class="headerlink" title="其他配饰"></a>其他配饰</h2><ul><li><strong>背包</strong>：1 从来出差的各种场合都希望自己控制在一个包以内。</li><li><strong>皮带</strong>：1 很少需要。</li></ul><h1 id="四季及各种场合搭配"><a href="#四季及各种场合搭配" class="headerlink" title="四季及各种场合搭配:"></a>四季及各种场合搭配:</h1><ul><li><strong>深冬</strong><ul><li><strong>室外</strong> 厚长羽绒服+衬衣+毛衣+保暖内衣,保暖内裤+棉裤+西裤。</li><li><strong>室内</strong> 室外基础上减去羽绒服即可。</li><li><strong>运动休闲</strong> 室内运动为主，和秋天运动一致。</li></ul></li><li><strong>初冬，深秋，初春</strong>：<ul><li><strong>室外</strong> 薄羽绒服+衬衣+保暖内衣, 保暖内裤+西裤。风衣轮换。</li><li><strong>室内</strong> 室外基础上减去羽绒服即可。</li><li><strong>运动休闲</strong> 保暖内衣+卫衣，保暖内裤+休闲裤（运动裤）。</li></ul></li><li><strong>春秋时节</strong>：<ul><li><strong>室外</strong> 衬衣+保暖内衣，保暖内裤+西裤。</li><li><strong>室内</strong> 基本一致。</li><li><strong>运动休闲</strong> 保暖内衣+薄衬衣，保暖内裤+休闲裤（运动裤）。</li></ul></li><li><strong>盛夏</strong>：<ul><li><strong>室外</strong> POLO衫（长短衬衣），西裤。</li><li><strong>室内</strong> 同室外。</li><li><strong>运动休闲</strong> 圆领衫（运动T恤），休闲裤（马裤，短裤）。</li></ul></li></ul><h1 id="如何处理旧衣物呢？"><a href="#如何处理旧衣物呢？" class="headerlink" title="如何处理旧衣物呢？"></a>如何处理旧衣物呢？</h1><ul><li>款式比较新，但是自己已经没法穿的，大件，咸鱼和转转上低价卖好了。  </li><li>质量好，没坏的，款式朴素的捐给小区旧衣物箱。  </li><li>款式不适合捐赠，较新的整理好用单独的袋子，放垃圾箱边上。有需要的会取走。也有论斤收旧衣服的。直接处理也可以。  </li><li>其他已经坏掉的，就直接扔了吧。</li></ul><p><!--<span id="busuanzi_container_page_pv">   阅读量<span id="busuanzi_value_page_pv"></span>次</span>--></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;之前一直说要极简主义，目前已经在各个维度开始执行和总结。今天又到了搬家的前夕，正好趁着周末把衣服重新整理了一下。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;有本书叫做《法国人只需要十件衣服》，虽然没有拜读过，但是我自己整理了一个列表。然后依据这个原则，只做替换，不买多余的。控制数量之后，也很容易提升品质，同时可以极大的减少打理衣物所需的时间。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="术与道" scheme="http://blog.xiaoyuyu.net/categories/%E6%9C%AF%E4%B8%8E%E9%81%93/"/>
    
    
      <category term="极简主义" scheme="http://blog.xiaoyuyu.net/tags/%E6%9E%81%E7%AE%80%E4%B8%BB%E4%B9%89/"/>
    
      <category term="术" scheme="http://blog.xiaoyuyu.net/tags/%E6%9C%AF/"/>
    
  </entry>
  
</feed>
