-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
366 lines (290 loc) · 77 KB
/
atom.xml
File metadata and controls
366 lines (290 loc) · 77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Horbie Blog</title>
<subtitle>Record Mind</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://blog.codeme.site/"/>
<updated>2017-07-26T08:53:31.000Z</updated>
<id>http://blog.codeme.site/</id>
<author>
<name>Horbie Huo</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>d3 V4 树形结构 不完全demo</title>
<link href="http://blog.codeme.site/2017/07/26/d3-V4-%E6%A0%91%E5%BD%A2%E7%BB%93%E6%9E%84-%E4%B8%8D%E5%AE%8C%E5%85%A8demo/"/>
<id>http://blog.codeme.site/2017/07/26/d3-V4-树形结构-不完全demo/</id>
<published>2017-07-26T08:46:11.000Z</published>
<updated>2017-07-26T08:53:31.000Z</updated>
<content type="html"><![CDATA[<ul>
<li><p>首先贴个小图<br><img src="http://oh14x29vm.bkt.clouddn.com/d3_tree.jpg" alt="d3_tree" title="d3_tree"></p>
</li>
<li><p>下面是显示上面图片的部分代码</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div><div class="line">165</div><div class="line">166</div><div class="line">167</div><div class="line">168</div><div class="line">169</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"/admin/lib/d3/d3.v4.min.js"</span>></span><span class="undefined"></span><span class="tag"></<span class="name">script</span>></span></div><div class="line"><span class="tag"><<span class="name">style</span>></span><span class="undefined"></span></div><div class="line"> .node circle {</div><div class="line"> fill: #fff;</div><div class="line"> stroke: steelblue;</div><div class="line"> stroke-width: 1.5px;</div><div class="line"> }</div><div class="line"></div><div class="line"> .node {</div><div class="line"> font: 12px sans-serif;</div><div class="line"> }</div><div class="line"></div><div class="line"> .link {</div><div class="line"> fill: none;</div><div class="line"> stroke: #ccc;</div><div class="line"> stroke-width: 1.5px;</div><div class="line"> }</div><div class="line"><span class="tag"></<span class="name">style</span>></span></div><div class="line"><span class="tag"><<span class="name">body</span>></span></div><div class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"auth_body"</span>></span><span class="tag"></<span class="name">div</span>></span></div><div class="line"><span class="tag"></<span class="name">body</span>></span></div><div class="line"></div><div class="line"><span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span>></span><span class="undefined"></span></div><div class="line"> var width = 500,</div><div class="line"> height = 500;</div><div class="line"></div><div class="line"> var tree = d3.tree()</div><div class="line"> .size([width, height - 200])</div><div class="line"> .separation(function (a, b) {</div><div class="line"> return (a.parent == b.parent ? 1 : 2);</div><div class="line"> });</div><div class="line"></div><div class="line"> var svg = d3.select("#auth_body").append("svg")</div><div class="line"> .attr("width", width)</div><div class="line"> .attr("height", height)</div><div class="line"> .append("g")</div><div class="line"> .attr("transform", "translate(40,0)");</div><div class="line"></div><div class="line"></div><div class="line"> var root = {</div><div class="line"> "name": "中国",</div><div class="line"> "children": [{</div><div class="line"> "name": "浙江",</div><div class="line"> "children": [{</div><div class="line"> "name": "杭州"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "宁波"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "温州"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "绍兴"</div><div class="line"> }</div><div class="line"> ]</div><div class="line"> },</div><div class="line"></div><div class="line"> {</div><div class="line"> "name": "广西",</div><div class="line"> "children": [{</div><div class="line"> "name": "桂林",</div><div class="line"> "children": [{</div><div class="line"> "name": "秀峰区"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "叠彩区"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "象山区"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "七星区"</div><div class="line"> }</div><div class="line"> ]</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "南宁"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "柳州"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "防城港"</div><div class="line"> }</div><div class="line"> ]</div><div class="line"> },</div><div class="line"></div><div class="line"> {</div><div class="line"> "name": "黑龙江",</div><div class="line"> "children": [{</div><div class="line"> "name": "哈尔滨"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "齐齐哈尔"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "牡丹江"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "大庆"</div><div class="line"> }</div><div class="line"> ]</div><div class="line"> },</div><div class="line"></div><div class="line"> {</div><div class="line"> "name": "新疆",</div><div class="line"> "children": [{</div><div class="line"> "name": "乌鲁木齐"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "克拉玛依"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "吐鲁番"</div><div class="line"> },</div><div class="line"> {</div><div class="line"> "name": "哈密"</div><div class="line"> }</div><div class="line"> ]</div><div class="line"> }</div><div class="line"> ]</div><div class="line"> }</div><div class="line"> var hierarchy = d3.hierarchy(root);</div><div class="line"> tree(hierarchy);</div><div class="line"></div><div class="line"> function diagonal(d) {</div><div class="line"> if (d.parent === hierarchy.descendants[0]) {</div><div class="line"> return "M" + d.y + "," + d.x +</div><div class="line"> " " + d.parent.y + "," + d.parent.x</div><div class="line"> } else {</div><div class="line"> return "M" + d.y + "," + d.x +</div><div class="line"> "C" + (d.parent.y + 100) + "," + d.x +</div><div class="line"> " " + (d.parent.y + 100) + "," + d.parent.x +</div><div class="line"> " " + d.parent.y + "," + d.parent.x;</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> var link = svg.selectAll(".link")</div><div class="line"> .data(hierarchy.descendants().slice(1))</div><div class="line"> .enter()</div><div class="line"> .append("path")</div><div class="line"> .attr("class", "link")</div><div class="line"> .attr("d", diagonal);</div><div class="line"></div><div class="line"> var node = svg.selectAll(".node")</div><div class="line"> .data(hierarchy.descendants())</div><div class="line"> .enter()</div><div class="line"> .append("g")</div><div class="line"> .attr("class", "node")</div><div class="line"> .attr("transform", function (d) {</div><div class="line"> return "translate(" + d.y + "," + d.x + ")";</div><div class="line"> })</div><div class="line"></div><div class="line"> node.append("circle")</div><div class="line"> .attr("r", 4.5);</div><div class="line"></div><div class="line"> node.append("text")</div><div class="line"> .attr("dx", function (d) {</div><div class="line"> return d.children ? -8 : 8;</div><div class="line"> })</div><div class="line"> .attr("dy", 3)</div><div class="line"> .style("text-anchor", function (d) {</div><div class="line"> return d.children ? "end" : "start";</div><div class="line"> })</div><div class="line"> .text(function (d) {</div><div class="line"> return d.data.name;</div><div class="line"> });</div><div class="line"><span class="tag"></<span class="name">script</span>></span></div></pre></td></tr></table></figure></li>
</ul>
]]></content>
<summary type="html">
<ul>
<li><p>首先贴个小图<br><img src="http://oh14x29vm.bkt.clouddn.com/d3_tree.jpg" alt="d3_tree" title="d3_tree"></p>
</li>
<li><p>下面是显示上面图片的部分代码
</summary>
<category term="d3" scheme="http://blog.codeme.site/tags/d3/"/>
</entry>
<entry>
<title>fluentd+elasticsearch+kibana 收集 flask 日志</title>
<link href="http://blog.codeme.site/2017/06/07/fluentd-elasticsearch-kibana-%E6%94%B6%E9%9B%86%E6%97%A5%E5%BF%97/"/>
<id>http://blog.codeme.site/2017/06/07/fluentd-elasticsearch-kibana-收集日志/</id>
<published>2017-06-07T08:41:54.000Z</published>
<updated>2017-06-08T08:55:25.000Z</updated>
<content type="html"><![CDATA[<p>部署的机器是ubuntu 14.04 内存 2G</p>
<ol>
<li><p>首先是 elasticsearch 安装</p>
<ul>
<li>elasticsearch版本是5.4.1,<a href="https://www.elastic.co/downloads/elasticsearch" target="_blank" rel="external">官网地址</a></li>
<li>需要安装java环境,新版 5.4.1 需要的是jdk1.8,安装步骤如下(ubuntu 14.04):<ul>
<li>sudo add-apt-repository ppa:openjdk-r/ppa</li>
<li>sudo apt-get update</li>
<li>sudo apt-get install openjdk-8-jdk</li>
<li>如果有多个java版本,可能需要切换<ul>
<li>sudo update-alternatives –config java #查看并选择java的版本</li>
<li>sudo update-alternatives –config javac #配置javac的版本</li>
</ul>
</li>
<li>java -version #查看java版本</li>
</ul>
</li>
<li>解压文件,并放置在特定的目录,<strong>建议创建一个system用户,用来管理和启动相关的程序,后面kibana也要用到</strong></li>
<li><p>使用supervisor启动elasticsearch</p>
<ul>
<li><p>配置文件</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">[program:elasticsearch]</div><div class="line">command=/var/log_collecter/elasticsearch-5.4.1/bin/elasticsearch -s -E path.data=/data/es -E indices.fielddata.cache.size=1gb</div><div class="line">directory=/var/log_collecter/elasticsearch-5.4.1</div><div class="line">environment=ES_JAVA_OPTS="-Xms1g -Xmx1536m"</div><div class="line">numprocs=1</div><div class="line">user=log_collecter</div><div class="line">autostart=true</div><div class="line">autorestart=true</div><div class="line">redirect_stderr=true</div><div class="line">stdout_logfile=/var/log/supervisor/%(program_name)s.log</div><div class="line">stdout_logfile_maxbytes=100MB</div><div class="line">stdout_logfile_backups=10</div></pre></td></tr></table></figure>
</li>
<li><p>其中 ES_JAVA_OPTS 的配置主要是机器的内存小才用到的,两个参数均是jvm使用的参数, -Xms配置jvm最小堆内存,-Xmx配置jvm最大堆内存,<a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html" target="_blank" rel="external">详细解释参考elasticsearch文档</a></p>
</li>
<li><strong>sudo ln -s /var/log_collecter/elasticsearch-5.4.1/supervisor_es.conf /etc/supervisor/conf.d/, 创建配置文件软连接到 /etc/supervisor/conf.d</strong></li>
<li>sudo supervisorctl update, 更新启动程序</li>
</ul>
</li>
<li>以上elasticsearch和java的安装只是参考,安装的方法有很多种,只要能保证elasticsearch正常运行即可,curl <a href="http://127.0.0.1:9200" target="_blank" rel="external">http://127.0.0.1:9200</a> 能正常访问即可</li>
</ul>
</li>
<li><p>fluentd 安装</p>
<ul>
<li><p>安装前需要可能需要配置一下系统,<a href="http://docs.fluentd.org/v0.12/articles/before-install" target="_blank" rel="external">官方安装前说明</a></p>
<ul>
<li><p>文件描述符限制,ulimit -n 可以查看,最好大于 65536,如果是 1024等较小的数字,修改方法是编辑 /etc/security/limits.conf ,添加下面的配置,重启机器</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">root soft nofile 65536</div><div class="line">root hard nofile 65536</div><div class="line">* soft nofile 65536</div><div class="line">* hard nofile 65536</div></pre></td></tr></table></figure>
</li>
<li><p>网络相关的内核参数的修改,本次没有修改,有需要,请参考<a href="http://docs.fluentd.org/v0.12/articles/before-install" target="_blank" rel="external">官方安装前说明</a></p>
</li>
</ul>
</li>
<li>使用官网提供的命令安装(Trusty 版本),curl -L <a href="https://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh" target="_blank" rel="external">https://toolbelt.treasuredata.com/sh/install-ubuntu-trusty-td-agent2.sh</a> | sh</li>
<li><strong>查看ubuntu版本命令 lsb_release -a, 详细的安装过程请参考<a href="http://docs.fluentd.org/v0.12/articles/install-by-deb" target="_blank" rel="external">官网ubuntu安装指导</a>,本次安装没有踩坑,所以此处较为省略</strong></li>
</ul>
</li>
<li><p>kibana 安装</p>
<ul>
<li>下载kibana-5.4.1,注意版本,一定要和之前elasticsearch兼容,<a href="https://www.elastic.co/downloads/kibana" target="_blank" rel="external">下载网页</a></li>
<li>解压文件,并放置在特定的目录,<strong>建议创建一个system用户,用来管理和启动相关的程序</strong></li>
<li><p>使用supervisor启动 kibana</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">[program:kibana]</div><div class="line">command=/var/log_collecter/kibana-5.4.1/bin/kibana -e http://127.0.0.1:9200 -q</div><div class="line">directory=/var/log_collecter/kibana-5.4.1</div><div class="line">numprocs=1</div><div class="line">user=log_collecter</div><div class="line">autostart=true</div><div class="line">autorestart=true</div><div class="line">redirect_stderr=true</div><div class="line">stdout_logfile=/var/log/supervisor/%(program_name)s.log</div><div class="line">stdout_logfile_maxbytes=100MB</div><div class="line">stdout_logfile_backups=10</div></pre></td></tr></table></figure>
</li>
<li><p><strong>sudo ln -s /var/log_collecter/kibana-5.4.1/supervisor_kibana.conf /etc/supervisor/conf.d/, 创建配置文件软连接到 /etc/supervisor/conf.d</strong></p>
</li>
<li>sudo supervisorctl update, 更新启动程序</li>
<li>同样这里使用supervisor等方式也只是一种启动的方式,像 systemctl 等方式也可以实现相同的作用</li>
</ul>
<p>至此,日志收集的工具都已经安装齐全。</p>
</li>
<li><p>修改 fluentd 的配置文件,只收集指定的日志, 建议只绑定到特定的内部地址,不要使用默认的端口号,注释掉原来默认的 @type forward 配置</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"><source></div><div class="line"> @type forward</div><div class="line"> bind 10.10.10.10</div><div class="line"> port 10000</div><div class="line"></source></div><div class="line"><match lifemg.**></div><div class="line"> type elasticsearch</div><div class="line"> host 127.0.0.1</div><div class="line"> port 9200</div><div class="line"> include_tag_key true</div><div class="line"> tag_key @log_name</div><div class="line"> logstash_format true</div><div class="line"> flush_interval 10s</div><div class="line"></match></div></pre></td></tr></table></figure>
</li>
<li><p>flask 相关的配置</p>
<ul>
<li>安装 fluentd 的第三方包 fluent</li>
<li>配置相关的log<figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> logging</div><div class="line"><span class="keyword">import</span> fluent.handler</div><div class="line"></div><div class="line"><span class="comment">#class FilterObject(logging.Filter):</span></div><div class="line"><span class="comment"># def __init__(self, filterFunc):</span></div><div class="line"><span class="comment"># self.filterFunc = filterFunc</span></div><div class="line"></div><div class="line"><span class="comment"># def filter(self, record):</span></div><div class="line"><span class="comment"># return self.filterFunc(record)</span></div><div class="line"></div><div class="line">logger = logging.getLogger(<span class="string">"log_prefix"</span>)</div><div class="line">fluentHandler = fluent.handler.FluentHandler(</div><div class="line"> <span class="string">"log_prefix"</span>,</div><div class="line"> host=self.fluent_host,</div><div class="line"> port=self.fluent_port</div><div class="line">)</div><div class="line">fluent_format = {</div><div class="line"> <span class="string">'host'</span>: <span class="string">'%(hostname)s'</span>,</div><div class="line"> <span class="string">'where'</span>: <span class="string">'%(filename)s.%(lineno)d'</span>, <span class="comment">#具体到文件、函数</span></div><div class="line"> <span class="string">'type'</span>: <span class="string">'%(levelname)s'</span>,</div><div class="line"> <span class="string">'func'</span>: <span class="string">'%(funcName)s'</span>,</div><div class="line"> <span class="string">'stack_trace'</span>: <span class="string">'%(exc_text)s'</span>,</div><div class="line"> <span class="string">'real_log_name'</span>:<span class="string">'%(name)s'</span>,</div><div class="line"> <span class="string">'process_id'</span>:<span class="string">'%(process)d'</span>,</div><div class="line">}</div><div class="line">fluentHandler.setFormatter(fluent.handler.FluentRecordFormatter(fluent_format))</div><div class="line"><span class="comment">#fluentHandler.addFilter(FilterObject(</span></div><div class="line"><span class="comment"># lambda x: self.fluent_host and self.fluent_port</span></div><div class="line"><span class="comment">#))</span></div><div class="line">logger.addHandler(fluentHandler)</div><div class="line">logger.propagate = <span class="keyword">False</span></div></pre></td></tr></table></figure>
</li>
</ul>
</li>
<li><p>启动flask程序,打开kibana地址,就可以看到收集到的log</p>
</li>
</ol>
<p>最后,贴上一张 kibana 界面的图片<br><img src="http://oh14x29vm.bkt.clouddn.com/kibana.png" alt="kibana" title="kibana"></p>
]]></content>
<summary type="html">
<p>部署的机器是ubuntu 14.04 内存 2G</p>
<ol>
<li><p>首先是 elasticsearch 安装</p>
<ul>
<li>elasticsearch版本是5.4.1,<a href="https://www.elastic.co/download
</summary>
</entry>
<entry>
<title>python 使用 logging</title>
<link href="http://blog.codeme.site/2017/06/01/python-%E4%BD%BF%E7%94%A8-logging/"/>
<id>http://blog.codeme.site/2017/06/01/python-使用-logging/</id>
<published>2017-06-01T04:12:53.000Z</published>
<updated>2017-06-01T04:17:15.000Z</updated>
<content type="html"><![CDATA[<p>首先是json格式的配置文件, 其中配置的有 DatagramHandler ,udp形式的日志<br><figure class="highlight json"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div></pre></td><td class="code"><pre><div class="line">{</div><div class="line"> <span class="attr">"version"</span>: <span class="number">1</span>,</div><div class="line"> <span class="attr">"disable_existing_loggers"</span>: <span class="literal">false</span>,</div><div class="line"> <span class="attr">"formatters"</span>: {</div><div class="line"> <span class="attr">"simple"</span>: {</div><div class="line"> <span class="attr">"format"</span>: <span class="string">"%(asctime)s - %(name)s - %(levelname)s - %(message)s"</span></div><div class="line"> }</div><div class="line"> },</div><div class="line"></div><div class="line"> <span class="attr">"handlers"</span>: {</div><div class="line"> <span class="attr">"console"</span>: {</div><div class="line"> <span class="attr">"class"</span>: <span class="string">"logging.StreamHandler"</span>,</div><div class="line"> <span class="attr">"level"</span>: <span class="string">"DEBUG"</span>,</div><div class="line"> <span class="attr">"formatter"</span>: <span class="string">"simple"</span>,</div><div class="line"> <span class="attr">"stream"</span>: <span class="string">"ext://sys.stdout"</span></div><div class="line"> },</div><div class="line"></div><div class="line"> <span class="attr">"info_file_handler"</span>: {</div><div class="line"> <span class="attr">"class"</span>: <span class="string">"logging.handlers.RotatingFileHandler"</span>,</div><div class="line"> <span class="attr">"level"</span>: <span class="string">"INFO"</span>,</div><div class="line"> <span class="attr">"formatter"</span>: <span class="string">"simple"</span>,</div><div class="line"> <span class="attr">"filename"</span>: <span class="string">"info.log"</span>,</div><div class="line"> <span class="attr">"maxBytes"</span>: <span class="number">10485760</span>,</div><div class="line"> <span class="attr">"backupCount"</span>: <span class="number">20</span>,</div><div class="line"> <span class="attr">"encoding"</span>: <span class="string">"utf8"</span></div><div class="line"> },</div><div class="line"></div><div class="line"> <span class="attr">"error_file_handler"</span>: {</div><div class="line"> <span class="attr">"class"</span>: <span class="string">"logging.handlers.RotatingFileHandler"</span>,</div><div class="line"> <span class="attr">"level"</span>: <span class="string">"ERROR"</span>,</div><div class="line"> <span class="attr">"formatter"</span>: <span class="string">"simple"</span>,</div><div class="line"> <span class="attr">"filename"</span>: <span class="string">"errors.log"</span>,</div><div class="line"> <span class="attr">"maxBytes"</span>: <span class="number">10485760</span>,</div><div class="line"> <span class="attr">"backupCount"</span>: <span class="number">20</span>,</div><div class="line"> <span class="attr">"encoding"</span>: <span class="string">"utf8"</span></div><div class="line"> },</div><div class="line"></div><div class="line"> <span class="attr">"udp_handler"</span>: {</div><div class="line"> <span class="attr">"class"</span>: <span class="string">"logging.handlers.DatagramHandler"</span>,</div><div class="line"> <span class="attr">"level"</span>: <span class="string">"INFO"</span>,</div><div class="line"> <span class="attr">"formatter"</span>: <span class="string">"simple"</span>,</div><div class="line"> <span class="attr">"host"</span>: <span class="string">"localhost"</span>,</div><div class="line"> <span class="attr">"port"</span>: <span class="number">11111</span></div><div class="line"> }</div><div class="line"> },</div><div class="line"></div><div class="line"> <span class="attr">"loggers"</span>: {</div><div class="line"> <span class="attr">"lifemg"</span>: {</div><div class="line"> <span class="attr">"level"</span>: <span class="string">"INFO"</span>,</div><div class="line"> <span class="attr">"handlers"</span>: [<span class="string">"udp_handler"</span>],</div><div class="line"> <span class="attr">"propagate"</span>: <span class="string">"no"</span></div><div class="line"> }</div><div class="line"> },</div><div class="line"></div><div class="line"> <span class="attr">"root"</span>: {</div><div class="line"> <span class="attr">"level"</span>: <span class="string">"INFO"</span>,</div><div class="line"> <span class="attr">"handlers"</span>: [<span class="string">"console"</span>]</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>程序中配置log,并使用<br><figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> json</div><div class="line"><span class="keyword">import</span> logging</div><div class="line"><span class="keyword">import</span> logging.config</div><div class="line"><span class="keyword">import</span> os</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">def</span> <span class="title">setup_logging</span><span class="params">(</span></span></div><div class="line"> default_path=<span class="string">'logging.json'</span>, </div><div class="line"> default_level=logging.INFO,</div><div class="line"> env_key=<span class="string">'LOG_CFG'</span></div><div class="line">):</div><div class="line"> <span class="string">"""Setup logging configuration</span></div><div class="line"></div><div class="line"> """</div><div class="line"> path = default_path</div><div class="line"> value = os.getenv(env_key, <span class="keyword">None</span>)</div><div class="line"> <span class="keyword">if</span> value:</div><div class="line"> path = value</div><div class="line"> <span class="keyword">if</span> os.path.exists(path):</div><div class="line"> <span class="keyword">with</span> open(path, <span class="string">'rt'</span>) <span class="keyword">as</span> f:</div><div class="line"> config = json.load(f)</div><div class="line"> logging.config.dictConfig(config)</div><div class="line"> <span class="keyword">else</span>:</div><div class="line"> logging.basicConfig(level=default_level)</div><div class="line"></div><div class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</div><div class="line"> setup_logging()</div><div class="line"> logger = logging.getLogger(<span class="string">"lifemg"</span>)</div><div class="line"> logger.debug(<span class="string">"this is a debugmsg!"</span>)</div><div class="line"> logger.info(<span class="string">"this is a infomsg!"</span>)</div><div class="line"> logger.warn(<span class="string">"this is a warn msg!"</span>)</div><div class="line"> logger.error(<span class="string">"this is a error msg!"</span>)</div><div class="line"> logger.critical(<span class="string">"this is a critical msg!"</span>)</div></pre></td></tr></table></figure></p>
<p>udp的服务端接受log, 只是接收,并未做任何处理<br><figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> socket </div><div class="line"></div><div class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</div><div class="line"> address = (<span class="string">'localhost'</span>, <span class="number">11111</span>) </div><div class="line"> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) </div><div class="line"> s.bind(address) </div><div class="line"> <span class="keyword">print</span> <span class="string">"start udp: localhost:11111"</span></div><div class="line"> <span class="keyword">while</span> <span class="keyword">True</span>:</div><div class="line"> data, addr = s.recvfrom(<span class="number">2048</span>)</div><div class="line"> <span class="keyword">if</span> <span class="keyword">not</span> data: </div><div class="line"> <span class="keyword">print</span> <span class="string">"client has exist"</span> </div><div class="line"> <span class="keyword">break</span> </div><div class="line"> <span class="keyword">print</span> <span class="string">"received:"</span>, len(data), <span class="string">"from"</span>, addr, <span class="string">"type:"</span>, type(data)</div><div class="line"> </div><div class="line"> s.close()</div></pre></td></tr></table></figure></p>
]]></content>
<summary type="html">
<p>首先是json格式的配置文件, 其中配置的有 DatagramHandler ,udp形式的日志<br><figure class="highlight json"><table><tr><td class="gutter"><pre><div class="line">1
</summary>
</entry>
<entry>
<title>Hello World</title>
<link href="http://blog.codeme.site/2017/05/25/hello-world/"/>
<id>http://blog.codeme.site/2017/05/25/hello-world/</id>
<published>2017-05-25T01:24:50.000Z</published>
<updated>2017-05-25T01:24:50.000Z</updated>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="external">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="external">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="external">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="external">GitHub</a>.</p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo new <span class="string">"My New Post"</span></div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="external">Writing</a></p>
<h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo server</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="external">Server</a></p>
<h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo generate</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="external">Generating</a></p>
<h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hexo deploy</div></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="external">Deployment</a></p>
]]></content>
<summary type="html">
<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="external">Hexo</a>! This is your very first post. Check <a href="https://hexo.
</summary>
</entry>
<entry>
<title>Dockerfile demo</title>
<link href="http://blog.codeme.site/2017/05/19/Dockerfile-demo/"/>
<id>http://blog.codeme.site/2017/05/19/Dockerfile-demo/</id>
<published>2017-05-19T08:13:49.000Z</published>
<updated>2017-05-25T01:24:50.000Z</updated>
<content type="html"><![CDATA[<p>一个简单的Dockerfile的demo</p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">FROM</span> python:<span class="number">2.7</span>-slim</div><div class="line"><span class="keyword">MAINTAINER</span> XX <XX@yy.com></div><div class="line"></div><div class="line"><span class="keyword">RUN</span> apt-get update && \</div><div class="line"> apt-get install -y supervisor \</div><div class="line"> libmysqlclient-dev unzip libaio1 \</div><div class="line"> build-essential libssl-dev libffi-dev curl && \</div><div class="line"> apt-get clean && \</div><div class="line"> rm -rf /var/lib/apt/lists/* \</div><div class="line"> /tmp/* \</div><div class="line"> /var/tmp/*</div><div class="line"></div><div class="line"><span class="keyword">ENV</span> MYSQL_DATABASE tmp</div><div class="line"><span class="keyword">ENV</span> MYSQL_USER tmp</div><div class="line"><span class="keyword">ENV</span> MYSQL_PASSWORD tmp</div><div class="line"><span class="keyword">ENV</span> MYSQL_HOST mysql_db</div><div class="line"><span class="keyword">ENV</span> MYSQL_PORT <span class="number">3306</span></div><div class="line"><span class="keyword">ENV</span> HOST_IP <span class="string">'127.0.0.1'</span></div><div class="line"><span class="keyword">ENV</span> HOST_PORT <span class="number">5000</span></div><div class="line"><span class="keyword">ENV</span> GIT_BRANCH_NAME <span class="string">'UNKOWN'</span></div><div class="line"><span class="keyword">ENV</span> ES_HOST es_db</div><div class="line"><span class="keyword">ENV</span> ES_PORT <span class="number">9200</span></div><div class="line"><span class="keyword">ENV</span> REDIS_HOST redis_db</div><div class="line"><span class="keyword">ENV</span> REDIS_PORT <span class="number">6379</span></div><div class="line"><span class="keyword">ENV</span> FLASK_ENV docker</div><div class="line"></div><div class="line"><span class="keyword">WORKDIR</span> /opt/oracle/</div><div class="line"><span class="keyword">ADD</span> instantclient-basic-linux.x64-12.2.0.1.0.zip .</div><div class="line"><span class="keyword">ADD</span> instantclient-sdk-linux.x64-12.2.0.1.0.zip .</div><div class="line"><span class="keyword">RUN</span> unzip instantclient-basic-linux.x64-12.2.0.1.0.zip && \</div><div class="line"> unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip && \</div><div class="line"> rm instantclient-basic-linux.x64-12.2.0.1.0.zip && \</div><div class="line"> rm instantclient-sdk-linux.x64-12.2.0.1.0.zip && \</div><div class="line"> cd instantclient_12_2 && \</div><div class="line"> ln -s libclntsh.so.12.1 libclntsh.so && \</div><div class="line"> ln -s libocci.so.12.1 libocci.so</div><div class="line"></div><div class="line"><span class="keyword">ENV</span> ORACLE_HOME <span class="string">"/opt/oracle/instantclient_12_2"</span></div><div class="line"><span class="keyword">ENV</span> DYLD_LIBRARY_PATH <span class="string">"$ORACLE_HOME:$ORACLE_HOME/sdk/oracle/ott:$DYLD_LIBRARY_PATH"</span></div><div class="line"><span class="keyword">ENV</span> LD_LIBRARY_PATH <span class="string">"$ORACLE_HOME/sdk/include:$LD_LIBRARY_PATH"</span></div><div class="line"></div><div class="line"><span class="keyword">RUN</span> curl https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh -o - | bash && \</div><div class="line"> export NVM_DIR="/root/.nvm" && . "$NVM_DIR/nvm.sh" && \</div><div class="line"> nvm install v0.12.7 && \</div><div class="line"> nvm use v0.12.7 && \</div><div class="line"> npm config set user 0 && npm config set unsafe-perm true && \</div><div class="line"> npm install -g fis && \</div><div class="line"> npm install -g fis-postprocessor-require-async && \</div><div class="line"> npm install -g fis-parser-ejs && \</div><div class="line"> npm install -g fis-parser-sass && \</div><div class="line"> npm install -g fis-postpackager-autoload</div><div class="line"></div><div class="line"><span class="keyword">WORKDIR</span> /opt/lifemg</div><div class="line"><span class="keyword">ADD</span> requirements.txt .</div><div class="line"><span class="keyword">RUN</span> pip --no-cache-dir --disable-pip-version-check install -r requirements.txt</div><div class="line"></div><div class="line"><span class="keyword">ADD</span> manage.py .</div><div class="line"><span class="keyword">ADD</span> scripts scripts</div><div class="line"><span class="keyword">ADD</span> configs configs</div><div class="line"><span class="keyword">ADD</span> lws lws</div><div class="line"></div><div class="line"><span class="keyword">RUN</span> ls -l && pybabel compile -d ./lws/translations && \</div><div class="line"> export NVM_DIR="/root/.nvm" && . "$NVM_DIR/nvm.sh" && \</div><div class="line"> nvm use v0.12.7 && \</div><div class="line"> fis release --root ./lws/frontend/ -pcmd ./lws/ && \</div><div class="line"> rm -rf $NVM_DIR</div><div class="line"></div><div class="line"><span class="comment"># RUN ln -s ./configs/supervisor_docker_app.conf /etc/supervisor/conf.d/supervisor_docker_app.conf</span></div><div class="line"></div><div class="line"><span class="keyword">EXPOSE</span> <span class="number">443</span></div><div class="line"><span class="keyword">EXPOSE</span> <span class="number">80</span></div><div class="line"></div><div class="line"><span class="comment"># CMD supervisorctl start lifemg && tail -f /dev/null</span></div><div class="line"><span class="keyword">CMD</span> gunicorn -w 2 -b 0.0.0.0:80 -k sync --log-level debug manage:app && tail -f /dev/null</div></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>一个简单的Dockerfile的demo</p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="lin
</summary>
</entry>
<entry>
<title>docker中安装cx-Oracle</title>
<link href="http://blog.codeme.site/2017/05/17/docker%E4%B8%AD%E5%AE%89%E8%A3%85cx-Oracle/"/>
<id>http://blog.codeme.site/2017/05/17/docker中安装cx-Oracle/</id>
<published>2017-05-17T00:31:31.000Z</published>
<updated>2017-05-25T01:24:50.000Z</updated>
<content type="html"><![CDATA[<ol>
<li><p>下载下面两个压缩文件 <a href="http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html" target="_blank" rel="external">地址</a></p>
<ul>
<li>instantclient-basic-linux.x64-12.2.0.1.0.zip</li>
<li>instantclient-sdk-linux.x64-12.2.0.1.0.zip </li>
</ul>
</li>
<li><p>将下载的两个压缩包放至Dockerfile所在目录,或者镜像构建时可以访问的其他目录</p>
</li>
<li><p>docker 构建时使用的命令(部分)</p>
<figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">RUN</span> apt-get update && \</div><div class="line"> apt-get install -y unzip libaio1 && \</div><div class="line"> apt-get clean && \</div><div class="line"> rm -rf /var/lib/apt/lists/* \</div><div class="line"> /tmp/* \</div><div class="line"> /var/tmp/*</div><div class="line"><span class="keyword">WORKDIR</span> /opt/oracle/</div><div class="line"><span class="keyword">ADD</span> instantclient-basic-linux.x64-12.2.0.1.0.zip .</div><div class="line"><span class="keyword">ADD</span> instantclient-sdk-linux.x64-12.2.0.1.0.zip .</div><div class="line"><span class="keyword">RUN</span> unzip instantclient-basic-linux.x64-12.2.0.1.0.zip && \</div><div class="line"> unzip instantclient-sdk-linux.x64-12.2.0.1.0.zip && \</div><div class="line"> cd instantclient_12_2 && \</div><div class="line"> ln -s libclntsh.so.12.1 libclntsh.so && \</div><div class="line"> ln -s libocci.so.12.1 libocci.so</div><div class="line"></div><div class="line"><span class="keyword">ENV</span> ORACLE_HOME <span class="string">"/opt/oracle/instantclient_12_2"</span></div><div class="line"><span class="keyword">ENV</span> DYLD_LIBRARY_PATH <span class="string">"$ORACLE_HOME:$ORACLE_HOME/sdk/oracle/ott:$DYLD_LIBRARY_PATH"</span></div><div class="line"><span class="keyword">ENV</span> LD_LIBRARY_PATH <span class="string">"$ORACLE_HOME/sdk/include:$LD_LIBRARY_PATH"</span></div></pre></td></tr></table></figure>
</li>
<li><p>至此,在使用pip安装python中的cx-Oracle就正常了</p>
</li>
</ol>
<p><strong> 在oracle的文件下载页面也有相关设置的说明 </strong></p>
]]></content>
<summary type="html">
<ol>
<li><p>下载下面两个压缩文件 <a href="http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html" target="_blank" rel="external">地址</a><
</summary>
</entry>
<entry>
<title>etcd配置</title>
<link href="http://blog.codeme.site/2017/05/04/etcd%E9%85%8D%E7%BD%AE/"/>
<id>http://blog.codeme.site/2017/05/04/etcd配置/</id>
<published>2017-05-04T03:04:09.000Z</published>
<updated>2017-05-25T01:24:50.000Z</updated>
<content type="html"><![CDATA[<p>下载和解压etcd的相关文件,略过</p>
<p>不输的文件夹是 /var/lib/etcd,其中 etcd 和 etcdctl 需要在 /usr/bin/ 下创建相关软连接,以便后续的service文件使用,也可以修改service文件</p>
<p>启动 etcd 服务的命令是 sudo systemctl start etcd<br>启动后检查,curl <a href="http://127.0.0.1:2379/v2/members" target="_blank" rel="external">http://127.0.0.1:2379/v2/members</a> 或者使用其他工具请求这个链接,IP地址为部署的任意机器的IP<br><figure class="highlight json"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div></pre></td><td class="code"><pre><div class="line">{</div><div class="line"> <span class="attr">"members"</span>: [</div><div class="line"> {</div><div class="line"> <span class="attr">"id"</span>: <span class="string">"5b123c0b90e015"</span>,</div><div class="line"> <span class="attr">"name"</span>: <span class="string">"etcd01"</span>,</div><div class="line"> <span class="attr">"peerURLs"</span>: [</div><div class="line"> <span class="string">"http://192.168.56.101:2380"</span></div><div class="line"> ],</div><div class="line"> <span class="attr">"clientURLs"</span>: [</div><div class="line"> <span class="string">"http://192.168.56.101:2379"</span></div><div class="line"> ]</div><div class="line"> },</div><div class="line"> {</div><div class="line"> <span class="attr">"id"</span>: <span class="string">"b082d7cebafd0896"</span>,</div><div class="line"> <span class="attr">"name"</span>: <span class="string">"etcd02"</span>,</div><div class="line"> <span class="attr">"peerURLs"</span>: [</div><div class="line"> <span class="string">"http://192.168.56.102:2380"</span></div><div class="line"> ],</div><div class="line"> <span class="attr">"clientURLs"</span>: [</div><div class="line"> <span class="string">"http://192.168.56.102:2379"</span></div><div class="line"> ]</div><div class="line"> },</div><div class="line"> {</div><div class="line"> <span class="attr">"id"</span>: <span class="string">"ea85a2410887d0cd"</span>,</div><div class="line"> <span class="attr">"name"</span>: <span class="string">"etcd03"</span>,</div><div class="line"> <span class="attr">"peerURLs"</span>: [</div><div class="line"> <span class="string">"http://192.168.56.103:2380"</span></div><div class="line"> ],</div><div class="line"> <span class="attr">"clientURLs"</span>: [</div><div class="line"> <span class="string">"http://192.168.56.103:2379"</span></div><div class="line"> ]</div><div class="line"> }</div><div class="line"> ]</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>etcdctl 查看所有集群成员, 命令:etcdctl member list<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">5b123c0b90e015: name=etcd01 peerURLs=http://192.168.56.101:2380 clientURLs=http://192.168.56.101:2379 isLeader=<span class="literal">true</span></div><div class="line">b082d7cebafd0896: name=etcd02 peerURLs=http://192.168.56.102:2380 clientURLs=http://192.168.56.102:2379 isLeader=<span class="literal">false</span></div><div class="line">ea85a2410887d0cd: name=etcd03 peerURLs=http://192.168.56.103:2380 clientURLs=http://192.168.56.103:2379 isLeader=<span class="literal">false</span></div></pre></td></tr></table></figure></p>
<hr>
<p>etcd使用的配置文件内容,位置:/var/lib/etcd/etcd.conf<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div></pre></td><td class="code"><pre><div class="line"><span class="comment"># node-1</span></div><div class="line">ETCD_NAME=etcd01</div><div class="line">ETCD_DATA_DIR=<span class="string">"/var/lib/etcd/data"</span></div><div class="line">ETCD_LISTEN_PEER_URLS=<span class="string">"http://192.168.56.101:2380"</span></div><div class="line">ETCD_LISTEN_CLIENT_URLS=<span class="string">"http://192.168.56.101:2379,http://127.0.0.1:2379"</span></div><div class="line">ETCD_INITIAL_ADVERTISE_PEER_URLS=<span class="string">"http://192.168.56.101:2380"</span></div><div class="line">ETCD_ADVERTISE_CLIENT_URLS=<span class="string">"http://192.168.56.101:2379"</span></div><div class="line">ETCD_INITIAL_CLUSTER_STATE=<span class="string">"new"</span></div><div class="line">ETCD_INITIAL_CLUSTER_TOKEN=<span class="string">"etcd-cluster1"</span></div><div class="line">ETCD_INITIAL_CLUSTER=<span class="string">"etcd01=http://192.168.56.101:2380,etcd02=http://192.168.56.102:2380,etcd03=http://192.168.56.103:2380"</span></div><div class="line"></div><div class="line"><span class="comment"># node-2</span></div><div class="line">ETCD_NAME=etcd02</div><div class="line">ETCD_DATA_DIR=<span class="string">"/var/lib/etcd/data"</span></div><div class="line">ETCD_LISTEN_PEER_URLS=<span class="string">"http://192.168.56.102:2380"</span></div><div class="line">ETCD_LISTEN_CLIENT_URLS=<span class="string">"http://192.168.56.102:2379,http://127.0.0.1:2379"</span></div><div class="line">ETCD_INITIAL_ADVERTISE_PEER_URLS=<span class="string">"http://192.168.56.102:2380"</span></div><div class="line">ETCD_ADVERTISE_CLIENT_URLS=<span class="string">"http://192.168.56.102:2379"</span></div><div class="line">ETCD_INITIAL_CLUSTER_STATE=<span class="string">"new"</span></div><div class="line">ETCD_INITIAL_CLUSTER_TOKEN=<span class="string">"etcd-cluster1"</span></div><div class="line">ETCD_INITIAL_CLUSTER=<span class="string">"etcd01=http://192.168.56.101:2380,etcd02=http://192.168.56.102:2380,etcd03=http://192.168.56.103:2380"</span></div><div class="line"></div><div class="line"><span class="comment"># node-3</span></div><div class="line">ETCD_NAME=etcd03</div><div class="line">ETCD_DATA_DIR=<span class="string">"/var/lib/etcd/data"</span></div><div class="line">ETCD_LISTEN_PEER_URLS=<span class="string">"http://192.168.56.103:2380"</span></div><div class="line">ETCD_LISTEN_CLIENT_URLS=<span class="string">"http://192.168.56.103:2379,http://127.0.0.1:2379"</span></div><div class="line">ETCD_INITIAL_ADVERTISE_PEER_URLS=<span class="string">"http://192.168.56.103:2380"</span></div><div class="line">ETCD_ADVERTISE_CLIENT_URLS=<span class="string">"http://192.168.56.103:2379"</span></div><div class="line">ETCD_INITIAL_CLUSTER_STATE=<span class="string">"new"</span></div><div class="line">ETCD_INITIAL_CLUSTER_TOKEN=<span class="string">"etcd-cluster1"</span></div><div class="line">ETCD_INITIAL_CLUSTER=<span class="string">"etcd01=http://192.168.56.101:2380,etcd02=http://192.168.56.102:2380,etcd03=http://192.168.56.103:2380"</span></div></pre></td></tr></table></figure></p>
<p>首先贴一个etcd使用的service文件,使用systemctl启动使用的,文件位置(ubuntu 16.04) /lib/systemd/system/etcd.service<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div></pre></td><td class="code"><pre><div class="line">[Unit]</div><div class="line">Description=Etcd Server</div><div class="line">After=network.target</div><div class="line">After=network-online.target</div><div class="line">Wants=network-online.target</div><div class="line"></div><div class="line">[Service]</div><div class="line">Type=notify</div><div class="line">WorkingDirectory=/var/lib/etcd/</div><div class="line">EnvironmentFile=-/var/lib/etcd/etcd.conf</div><div class="line">User=life</div><div class="line"><span class="comment"># set GOMAXPROCS to number of processors</span></div><div class="line">ExecStart=/bin/bash -c <span class="string">"GOMAXPROCS=<span class="variable">$(nproc)</span> /usr/bin/etcd --name=\"<span class="variable">${ETCD_NAME}</span>\" --data-dir=\"<span class="variable">${ETCD_DATA_DIR}</span>\" --listen-client-urls=\"<span class="variable">${ETCD_LISTEN_CLIENT_URLS}</span>\" --listen-peer-urls=\"<span class="variable">${ETCD_LISTEN_PEER_URLS}</span>\" --advertise-client-urls=\"<span class="variable">${ETCD_ADVERTISE_CLIENT_URLS}</span>\" --initial-cluster-token=\"<span class="variable">${ETCD_INITIAL_CLUSTER_TOKEN}</span>\" --initial-cluster=\"<span class="variable">${ETCD_INITIAL_CLUSTER}</span>\" --initial-cluster-state=\"<span class="variable">${ETCD_INITIAL_CLUSTER_STATE}</span>\" "</span></div><div class="line">Restart=on-failure</div><div class="line">LimitNOFILE=65536</div><div class="line"></div><div class="line">[Install]</div><div class="line">WantedBy=multi-user.target</div></pre></td></tr></table></figure></p>
]]></content>
<summary type="html">
<p>下载和解压etcd的相关文件,略过</p>
<p>不输的文件夹是 /var/lib/etcd,其中 etcd 和 etcdctl 需要在 /usr/bin/ 下创建相关软连接,以便后续的service文件使用,也可以修改service文件</p>
<p>启动 etcd 服务
</summary>
</entry>
<entry>
<title>git使用问题记录</title>
<link href="http://blog.codeme.site/2017/04/28/git%E4%BD%BF%E7%94%A8%E9%97%AE%E9%A2%98%E8%AE%B0%E5%BD%95/"/>
<id>http://blog.codeme.site/2017/04/28/git使用问题记录/</id>
<published>2017-04-28T03:00:01.000Z</published>
<updated>2017-05-25T01:24:50.000Z</updated>
<content type="html"><![CDATA[<ol>
<li><p>git pull 失败 ,提示:fatal: refusing to merge unrelated histories<br> <em>本地使用git init命令初始化后,并关联了远程仓库,本地和远程均有commit,首次推送出现的问题</em><br> 解决方法: <strong>git pull origin master –allow-unrelated-histories</strong></p>
</li>
<li><p>本地仓库关联远程仓库<br> 命令:<strong>git remote add origin remote-url</strong></p>
</li>
</ol>
]]></content>
<summary type="html">
<ol>
<li><p>git pull 失败 ,提示:fatal: refusing to merge unrelated histories<br> <em>本地使用git init命令初始化后,并关联了远程仓库,本地和远程均有commit,首次推送出现的问题</em><br
</summary>
</entry>
<entry>
<title>多表连接查询统计sql示例</title>
<link href="http://blog.codeme.site/2017/04/27/%E5%A4%9A%E8%A1%A8%E8%BF%9E%E6%8E%A5%E6%9F%A5%E8%AF%A2%E7%BB%9F%E8%AE%A1sql%E7%A4%BA%E4%BE%8B/"/>
<id>http://blog.codeme.site/2017/04/27/多表连接查询统计sql示例/</id>
<published>2017-04-27T00:49:44.000Z</published>
<updated>2017-05-25T01:24:50.000Z</updated>
<content type="html"><![CDATA[<p><strong>背景:</strong> 一个电商类似的项目,这个是后台统计使用的sql,之前使用的sqlalchemy ,但是运行的时间太长,400条记录,运行时间在1分钟左右,使用sql后运行时间在3秒左右</p>
<p>下面是示例的sql语句<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">SELECT</span> </div><div class="line">table_1.id <span class="keyword">AS</span> table_1_id, </div><div class="line">table_1.item_id <span class="keyword">AS</span> table_1_item_id, </div><div class="line">table_1.sku_no <span class="keyword">AS</span> table_1_sku_no, </div><div class="line">table_1.sku_name <span class="keyword">AS</span> table_1_sku_name, </div><div class="line">table_1.MDM_code <span class="keyword">AS</span> table_1_MDM_code,</div><div class="line">table_1.created_at <span class="keyword">AS</span> table_1_created_at, </div><div class="line">table_1.created_by <span class="keyword">AS</span> table_1_created_by, </div><div class="line">table_2.id <span class="keyword">AS</span> item_id, </div><div class="line">table_2.name <span class="keyword">AS</span> item_name, </div><div class="line">table_2.item_no <span class="keyword">AS</span> item_item_no, </div><div class="line">table_2.item_type <span class="keyword">AS</span> item_item_type, </div><div class="line">table_2.price <span class="keyword">AS</span> item_price, </div><div class="line"><span class="keyword">count</span>(<span class="keyword">DISTINCT</span> table_3.id) <span class="keyword">AS</span> browse_times, <span class="comment">/*用 DISTINCT 去重,统计数量*/</span></div><div class="line"><span class="keyword">count</span>(<span class="keyword">DISTINCT</span> table_4.id) <span class="keyword">AS</span> like_times, </div><div class="line"><span class="keyword">count</span>(<span class="keyword">DISTINCT</span> table_5.id) <span class="keyword">AS</span> item_share_times, </div><div class="line"><span class="keyword">count</span>(<span class="keyword">DISTINCT</span> table_6.id) <span class="keyword">AS</span> add_cart_times, </div><div class="line"><span class="keyword">count</span>(<span class="keyword">DISTINCT</span> table_7.id) <span class="keyword">AS</span> table_7_times, </div><div class="line"><span class="keyword">count</span>(<span class="keyword">DISTINCT</span> table_8.id) <span class="keyword">AS</span> comment_times, </div><div class="line"><span class="keyword">count</span>(<span class="keyword">DISTINCT</span> table_9.id) <span class="keyword">AS</span> table_9_order_count,</div><div class="line"><span class="keyword">sum</span>(table_9.cnt)/(<span class="keyword">count</span>(table_9.order_id)/<span class="keyword">count</span>(<span class="keyword">distinct</span> table_9.order_id)) <span class="keyword">AS</span> table_9_sku_count,</div><div class="line"><span class="keyword">sum</span>(table_9.cnt * table_9.price)/(<span class="keyword">count</span>(table_9.order_id)/<span class="keyword">count</span>(<span class="keyword">distinct</span> table_9.order_id)) <span class="keyword">AS</span> table_9_total_price</div><div class="line"><span class="comment">/* sum算总和的时候除掉重复的次数,目前没有找到什么更好的办法来解决 */</span></div><div class="line"></div><div class="line"><span class="keyword">FROM</span> table_1 <span class="keyword">JOIN</span> table_2 <span class="keyword">ON</span> table_1.item_id = table_2.id</div><div class="line"></div><div class="line"><span class="keyword">LEFT</span> <span class="keyword">OUTER</span> <span class="keyword">JOIN</span> table_3 <span class="keyword">ON</span> table_3.detail = table_1.item_id <span class="keyword">AND</span> table_3.act_time <span class="keyword">BETWEEN</span> <span class="string">'1487981301.0'</span> <span class="keyword">AND</span> <span class="string">'1493165301.0'</span> </div><div class="line"><span class="keyword">LEFT</span> <span class="keyword">OUTER</span> <span class="keyword">JOIN</span> table_4 <span class="keyword">ON</span> table_4.detail = table_1.item_id <span class="keyword">AND</span> table_4.act_time <span class="keyword">BETWEEN</span> <span class="string">'1487981301.0'</span> <span class="keyword">AND</span> <span class="string">'1493165301.0'</span> </div><div class="line"><span class="keyword">LEFT</span> <span class="keyword">OUTER</span> <span class="keyword">JOIN</span> table_5 <span class="keyword">ON</span> table_5.detail = table_1.item_id <span class="keyword">AND</span> table_5.act_time <span class="keyword">BETWEEN</span> <span class="string">'1487981301.0'</span> <span class="keyword">AND</span> <span class="string">'1493165301.0'</span> </div><div class="line"><span class="keyword">LEFT</span> <span class="keyword">OUTER</span> <span class="keyword">JOIN</span> table_6 <span class="keyword">ON</span> table_6.detail = table_1.item_id <span class="keyword">AND</span> table_6.act_time <span class="keyword">BETWEEN</span> <span class="string">'1487981301.0'</span> <span class="keyword">AND</span> <span class="string">'1493165301.0'</span> </div><div class="line"><span class="keyword">LEFT</span> <span class="keyword">OUTER</span> <span class="keyword">JOIN</span> table_8 <span class="keyword">ON</span> table_8.item_id = table_1.item_id <span class="keyword">AND</span> table_8.created_at <span class="keyword">BETWEEN</span> <span class="string">'2017-02-25 08:08:21'</span> <span class="keyword">AND</span> <span class="string">'2017-04-26 08:08:21'</span> </div><div class="line"><span class="keyword">LEFT</span> <span class="keyword">OUTER</span> <span class="keyword">JOIN</span> table_7 <span class="keyword">ON</span> table_7.sku_id = table_1.id <span class="keyword">AND</span> table_7.created_at <span class="keyword">BETWEEN</span> <span class="string">'2017-02-25 08:08:21'</span> <span class="keyword">AND</span> <span class="string">'2017-04-26 08:08:21'</span> </div><div class="line"><span class="keyword">LEFT</span> <span class="keyword">OUTER</span> <span class="keyword">JOIN</span> table_9 <span class="keyword">ON</span> table_9.sku_id = table_1.id <span class="keyword">AND</span> table_9.order_id <span class="keyword">in</span> </div><div class="line"> (<span class="keyword">select</span> table_10.id <span class="keyword">from</span> table_10 <span class="keyword">WHERE</span> table_10.created_at <span class="keyword">BETWEEN</span> <span class="string">'2017-02-25 08:08:21'</span> <span class="keyword">AND</span> <span class="string">'2017-04-26 08:08:21'</span>)</div><div class="line"></div><div class="line"><span class="keyword">GROUP</span> <span class="keyword">BY</span> table_1.id;</div></pre></td></tr></table></figure></p>
]]></content>
<summary type="html">
<p><strong>背景:</strong> 一个电商类似的项目,这个是后台统计使用的sql,之前使用的sqlalchemy ,但是运行的时间太长,400条记录,运行时间在1分钟左右,使用sql后运行时间在3秒左右</p>
<p>下面是示例的sql语句<br><figure c
</summary>
</entry>
<entry>
<title>Hexo搭建博客</title>
<link href="http://blog.codeme.site/2017/01/06/Hexo%E6%90%AD%E5%BB%BA%E5%8D%9A%E5%AE%A2/"/>
<id>http://blog.codeme.site/2017/01/06/Hexo搭建博客/</id>
<published>2017-01-06T13:48:17.000Z</published>
<updated>2017-05-25T01:24:50.000Z</updated>
<content type="html"><![CDATA[<h2 id="Hexo-搭建个人博客"><a href="#Hexo-搭建个人博客" class="headerlink" title="Hexo 搭建个人博客"></a>Hexo 搭建个人博客</h2><hr>
<p>Hexo是基于nodejs的工具,需要先安装nodejs</p>
<ol>
<li>windows下自己接下载nodejs的安装包,安装即可。</li>
<li>nodejs自带npm工具。</li>
<li><p>使用npm安装Hexo。</p>
<figure class="highlight sh"><figcaption><span>install-hexo</span></figcaption><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">npm install -g hexo-cli</div></pre></td></tr></table></figure>
</li>
<li><p>初始化博客的目录</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">hexo init [directory]</div></pre></td></tr></table></figure>
</li>
<li><p>添加文章</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">hexo new name</div></pre></td></tr></table></figure>
</li>
<li><p>部署</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">hexo deploy --generate</div></pre></td></tr></table></figure>
</li>
</ol>
<p>写在最后的问题:</p>
<ul>
<li>绑定域名,使用的是二级域名<ol>
<li>购买域名,略过</li>
<li>添加 CNAME 文件到github的项目,内容写自己的域名即可</li>
<li>在域名解析中添加一条cmane的记录,指向 <strong>[name].github.io</strong>, name替换为自己的名字,即可</li>
</ol>
</li>
</ul>
]]></content>
<summary type="html">
<h2 id="Hexo-搭建个人博客"><a href="#Hexo-搭建个人博客" class="headerlink" title="Hexo 搭建个人博客"></a>Hexo 搭建个人博客</h2><hr>
<p>Hexo是基于nodejs的工具,需要先安装nodejs<
</summary>
</entry>
</feed>