-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
471 lines (374 loc) · 91.7 KB
/
atom.xml
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
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>YiHao's Blog</title>
<link href="/atom.xml" rel="self"/>
<link href="http://yoursite.com/"/>
<updated>2016-09-02T10:02:11.000Z</updated>
<id>http://yoursite.com/</id>
<author>
<name>yihao</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>临时启动一个http Server传送文件</title>
<link href="http://yoursite.com/2016/09/02/%E4%B8%B4%E6%97%B6%E5%90%AF%E5%8A%A8%E4%B8%80%E4%B8%AAhttp-Server%E4%BC%A0%E9%80%81%E6%96%87%E4%BB%B6/"/>
<id>http://yoursite.com/2016/09/02/临时启动一个http-Server传送文件/</id>
<published>2016-09-02T09:40:31.000Z</published>
<updated>2016-09-02T10:02:11.000Z</updated>
<content type="html"><h4 id="查看端口有没有使用:"><a href="#查看端口有没有使用:" class="headerlink" title="查看端口有没有使用:"></a>查看端口有没有使用:</h4><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">netstat -natpl|grep 端口号</div></pre></td></tr></table></figure>
<h4 id="目标机打开个http服务:"><a href="#目标机打开个http服务:" class="headerlink" title="目标机打开个http服务:"></a>目标机打开个http服务:</h4><p>有些机器上会出现<code>No module named SimpleHTTPServe</code>, 重新装python吧! 在python 3.x 中, </p>
<p>在 python 2.x 中 </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">python -m SimpleHTTPServe port</div></pre></td></tr></table></figure>
<p>在 python 3.x 中 </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">python -m http.server port</div></pre></td></tr></table></figure>
<h4 id="接收机下载文件:"><a href="#接收机下载文件:" class="headerlink" title="接收机下载文件:"></a>接收机下载文件:</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">wget http://目标机ip:端口号/文件名(wget限速:wget --limit-rate=nM)</div></pre></td></tr></table></figure></content>
<summary type="html">
<h4 id="查看端口有没有使用:"><a href="#查看端口有没有使用:" class="headerlink" title="查看端口有没有使用:"></a>查看端口有没有使用:</h4><p>可以没有这一步,这里只是确认一下你预服务的端口没有被其他服务占用</p>
<
</summary>
</entry>
<entry>
<title>ansible小试牛刀</title>
<link href="http://yoursite.com/2016/09/02/ansible%E5%B0%8F%E8%AF%95%E7%89%9B%E5%88%80/"/>
<id>http://yoursite.com/2016/09/02/ansible小试牛刀/</id>
<published>2016-09-02T09:21:22.000Z</published>
<updated>2016-09-02T09:33:40.000Z</updated>
<content type="html"><p>1 先产生本地公钥<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ssh-keygen -t rsa</div></pre></td></tr></table></figure></p>
<p>2 公钥拷贝到到到各个机器上</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">ssh-copy-id -i ~/.ssh/id_rsa.pub hostnam</div></pre></td></tr></table></figure>
<p>3 然后设置ansible 配置文件</p>
<p> 在/etc/ansible文件下 分别创建文件hosts 和ansible.cfg(如果没有该文件夹ansible,自行创建)</p>
<p><strong>在hosts进行相应分组</strong><br><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></pre></td><td class="code"><pre><div class="line">[group1]</div><div class="line">hostname1</div><div class="line">hostname2</div><div class="line">[group2]</div><div class="line">hostnamex</div><div class="line">hostnamey</div></pre></td></tr></table></figure></p>
<p><strong>在ansible.cfg 文件中填写一些默认配置</strong><br><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></pre></td><td class="code"><pre><div class="line">[defaults]</div><div class="line">host_key_checking = False</div><div class="line"></div><div class="line">sudo_user = root</div><div class="line"></div><div class="line">remote_user = 远程机器上你默认的用户名</div></pre></td></tr></table></figure></p>
<p>如果在想在远程用root 执行命令, 则可以把hosts配置成这样,<br><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">[group1]</div><div class="line">xxx.xxx.xxx.xxx ansible_ssh_user=test ansible_ssh_pass=xxx ansible_su_pass=xxxxx</div><div class="line">xxx.xxx.xxx.xxx ansible_ssh_user=test ansible_ssh_pass=xxx ansible_su_pass=xxxxx</div><div class="line">xxx.xxx.xxx.xxx ansible_ssh_user=test ansible_ssh_pass=xxx ansible_su_pass=xxxxxx</div></pre></td></tr></table></figure></p>
<p>4 测试是否能用</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">ansible group1 -a &apos;who&apos; // 用配置文件默认的用户在远程机器上执行命令 `who`</div><div class="line">ansible group2 -a &apos;who&apos; --sudo --ask-sudo-pass // 用root 身份执行 `who`</div><div class="line"></div><div class="line">ansible group1 -m copy -a &quot;src=/Users/fdafda/test.txt dest=/usr/local/&quot; --sudo --ask-sudo-pass // 把本地文件拷贝到group1机器下的/usr/local文件下</div></pre></td></tr></table></figure>
<p>5 对于涉及过程比较多远程执行, 可以用ansible-playbook<br> <strong>编写playbook.yml 文件, 试例如下:</strong><br> <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></pre></td><td class="code"><pre><div class="line">- hosts: group1</div><div class="line"> become: yes</div><div class="line">become_user: root</div><div class="line">tasks:</div><div class="line"> - name: updatefile</div><div class="line"> shell: wget xxxxx/idgen/idgen_s</div><div class="line"> register: out1</div><div class="line"> - debug: msg=&quot;&#123;&#123; out1.stdout &#125;&#125;&quot;</div><div class="line"> -</div></pre></td></tr></table></figure></p>
<p> 执行该命令</p>
<p> <strong>然后执行如下命令</strong></p>
<pre><code><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ansible-playbook playbook.yml</div></pre></td></tr></table></figure>
</code></pre></content>
<summary type="html">
<p>1 先产生本地公钥<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><p
</summary>
</entry>
<entry>
<title>读取文件,出现了编码错误</title>
<link href="http://yoursite.com/2016/07/07/%E8%AF%BB%E5%8F%96%E6%96%87%E4%BB%B6%EF%BC%8C%E5%87%BA%E7%8E%B0%E4%BA%86%E7%BC%96%E7%A0%81%E9%94%99%E8%AF%AF/"/>
<id>http://yoursite.com/2016/07/07/读取文件,出现了编码错误/</id>
<published>2016-07-07T11:07:18.000Z</published>
<updated>2016-07-07T11:30:30.000Z</updated>
<content type="html"><blockquote>
<p> 用scala读取本地文本文件, 出现了错误, 特此记录</p>
</blockquote>
<ul>
<li>源程序</li>
</ul>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">import scala.io.Source</div><div class="line">Source.fromFile(&quot;logExample.txt&quot;).foreach(print)</div></pre></td></tr></table></figure>
<ul>
<li><p>错误现象</p>
<p>文本在打印过程中出现下面的错误输出 </p>
</li>
</ul>
<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">java.nio.charset.MalformedInputException: Input length = 1</div><div class="line">at java.nio.charset.CoderResult.throwException(CoderResult.java:277)</div><div class="line">at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:337)</div><div class="line">at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:176)</div><div class="line">at java.io.InputStreamReader.read(InputStreamReader.java:184)</div><div class="line">at java.io.BufferedReader.fill(BufferedReader.java:153)</div><div class="line">at java.io.BufferedReader.read(BufferedReader.java:174)</div><div class="line">``` </div><div class="line">- 解决方法</div><div class="line"> </div><div class="line"> 貌似好多人在平时开发中也遇到这样的错误,网上也有各种解决方法。有人尝试这样的解决方法, 貌似有人居然也解决了问题,初步猜想是,默认编码方式错误。</div></pre></td></tr></table></figure>
<p> import scala.io.Source<br> Source.fromFile(“logExample.txt”)(“UTF-8”).foreach(print)<br> <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"></div><div class="line">通用的的解决方法</div><div class="line"></div><div class="line">**解决思路**: 检测出illegal UTF-8 byte sequence, 然后替换掉。 由于中文字符使用3个字节或者4个,所以可能被分开, 导致读取失败</div></pre></td></tr></table></figure></p>
<pre><code> import scala.io.Source
import scala.io.Codec
import java.nio.charset.CodingErrorAction
...
</code></pre><p> implicit val codec = Codec(“UTF-8”)<br> codec.onMalformedInput(CodingErrorAction.REPLACE)<br> codec.onUnmappableCharacter(CodingErrorAction.REPLACE)<br> Source.fromFile(“logExample.txt”).foreach(print)</p>
<p> ```</p>
</content>
<summary type="html">
<blockquote>
<p> 用scala读取本地文本文件, 出现了错误, 特此记录</p>
</blockquote>
<ul>
<li>源程序</li>
</ul>
<figure class="highlight plain"><table><tr><td class=
</summary>
</entry>
<entry>
<title>tiker与其他channel共用时问题</title>
<link href="http://yoursite.com/2016/07/04/tiker%E4%B8%8E%E5%85%B6%E4%BB%96channel%E5%85%AC%E7%94%A8%E6%97%B6%E9%97%AE%E9%A2%98/"/>
<id>http://yoursite.com/2016/07/04/tiker与其他channel公用时问题/</id>
<published>2016-07-04T08:38:34.000Z</published>
<updated>2016-07-04T14:20:17.000Z</updated>
<content type="html"><h4 id="ticker与其他channel共用时的问题"><a href="#ticker与其他channel共用时的问题" class="headerlink" title="ticker与其他channel共用时的问题"></a>ticker与其他channel共用时的问题</h4><p>见代码</p>
<figure class="highlight golang"><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></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> main</div><div class="line"></div><div class="line"><span class="keyword">import</span> (</div><div class="line"> <span class="string">"fmt"</span></div><div class="line"> <span class="string">"runtime"</span></div><div class="line"> <span class="string">"time"</span></div><div class="line">)</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">func</span> <span class="title">init</span><span class="params">()</span></span> &#123;</div><div class="line"> runtime.GOMAXPROCS(runtime.NumCPU())</div><div class="line"></div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</div><div class="line"> ch := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">int</span>, <span class="number">1024</span>)</div><div class="line"></div><div class="line"> <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">(ch <span class="keyword">chan</span> <span class="keyword">int</span>)</span></span> &#123;</div><div class="line"> <span class="keyword">for</span> &#123;</div><div class="line"> val := &lt;-ch</div><div class="line"> fmt.Printf(<span class="string">"val:%d\n"</span>, val)</div><div class="line"> &#125;</div><div class="line"> &#125;(ch)</div><div class="line"> tick := time.NewTicker(<span class="number">1</span> * time.Second)</div><div class="line"> <span class="keyword">for</span> i := <span class="number">0</span>; i &lt; <span class="number">20</span>; i++ &#123;</div><div class="line"> <span class="keyword">select</span> &#123;</div><div class="line"> <span class="keyword">case</span> ch &lt;- i:</div><div class="line"> <span class="keyword">case</span> &lt;-tick.C:</div><div class="line"> fmt.Printf(<span class="string">"%d: case &lt;-tick.C\n"</span>, i)</div><div class="line"> &#125;</div><div class="line"> time.Sleep(<span class="number">200</span> * time.Millisecond)</div><div class="line"> &#125;</div><div class="line"> <span class="built_in">close</span>(ch)</div><div class="line"> tick.Stop()</div><div class="line"></div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h4 id="代码结果"><a href="#代码结果" class="headerlink" title="代码结果"></a>代码结果</h4><figure class="highlight golang"><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></pre></td><td class="code"><pre><div class="line">val:<span class="number">0</span></div><div class="line">val:<span class="number">1</span></div><div class="line">val:<span class="number">2</span></div><div class="line">val:<span class="number">3</span></div><div class="line">val:<span class="number">4</span></div><div class="line">val:<span class="number">5</span></div><div class="line">val:<span class="number">6</span></div><div class="line">val:<span class="number">7</span></div><div class="line">val:<span class="number">8</span></div><div class="line">val:<span class="number">9</span></div><div class="line"><span class="number">10</span>: <span class="keyword">case</span> &lt;-tick.C</div><div class="line">val:<span class="number">11</span></div><div class="line">val:<span class="number">12</span></div><div class="line">val:<span class="number">13</span></div><div class="line">val:<span class="number">14</span></div><div class="line">val:<span class="number">15</span></div><div class="line"><span class="number">16</span>: <span class="keyword">case</span> &lt;-tick.C</div><div class="line">val:<span class="number">17</span></div><div class="line">val:<span class="number">18</span></div><div class="line">val:<span class="number">19</span></div></pre></td></tr></table></figure>
<p>从结果中可以看出,作者本意是要输出0~19, 却不想被打断..</p>
<h4 id="出现问题的代码"><a href="#出现问题的代码" class="headerlink" title="出现问题的代码"></a>出现问题的代码</h4><figure class="highlight golang"><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></pre></td><td class="code"><pre><div class="line"><span class="keyword">select</span> &#123;</div><div class="line"><span class="keyword">case</span> ch &lt;- i:</div><div class="line"><span class="keyword">case</span> &lt;-tick.C:</div><div class="line"> fmt.Printf(<span class="string">"%d: case &lt;-tick.C\n"</span>, i)</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<blockquote>
<p>注意: 当两个case条件都满足的时候,运行时系统会通过一个伪随机的算法决定哪个case将会被执行<br>所以当tick.C条件满足的那个循环,有某种概率造成ch&lt;-i没有发送(虽然通道两端没有阻塞,满足发送条件)</p>
</blockquote>
<h4 id="解决方案一"><a href="#解决方案一" class="headerlink" title="解决方案一"></a>解决方案一</h4><p>一旦tick.C随机的case被随机到,就多执行一次ch&lt;-i, 很显然,这个方法比较牵强,而且在i比较多的时候,很麻烦, 所以pass</p>
<figure class="highlight golang"><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></pre></td><td class="code"><pre><div class="line"><span class="keyword">select</span> &#123;</div><div class="line"> <span class="keyword">case</span> ch &lt;- i:</div><div class="line"> <span class="keyword">case</span> &lt;-tick.C:</div><div class="line"> fmt.Printf(<span class="string">"%d: case &lt;-tick.C\n"</span>, i)</div><div class="line"> ch &lt;- i</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h4 id="解决方法二"><a href="#解决方法二" class="headerlink" title="解决方法二"></a>解决方法二</h4><p>将tick.C的case单独放到一个select里面,并加入一个default(保证不阻塞), 这种处理方法就优雅的多。(这是参考网友的思路)<br><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></pre></td><td class="code"><pre><div class="line">select &#123;</div><div class="line">case ch &lt;- i:</div><div class="line">&#125;</div><div class="line">select &#123;</div><div class="line">case &lt;-tick.C:</div><div class="line"> fmt.Printf(&quot;%d: case &lt;-tick.C\n&quot;, i)</div><div class="line"> default:</div><div class="line">&#125;</div></pre></td></tr></table></figure></p>
</content>
<summary type="html">
<h4 id="ticker与其他channel共用时的问题"><a href="#ticker与其他channel共用时的问题" class="headerlink" title="ticker与其他channel共用时的问题"></a>ticker与其他channel共用时的
</summary>
</entry>
<entry>
<title>golang超时处理</title>
<link href="http://yoursite.com/2016/07/04/golang%E8%B6%85%E6%97%B6%E5%A4%84%E7%90%86/"/>
<id>http://yoursite.com/2016/07/04/golang超时处理/</id>
<published>2016-07-04T06:52:54.000Z</published>
<updated>2016-07-04T07:20:31.000Z</updated>
<content type="html"><p> 超时对于程序操作外部资源或者管理自身程序执行时间非常重要。在 Go 语言中,因为channel与select,所以实现超时非常容易与优雅。</p>
<h4 id="案例程序一"><a href="#案例程序一" class="headerlink" title="案例程序一"></a>案例程序一</h4><figure class="highlight golang"><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></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> main</div><div class="line"></div><div class="line"><span class="keyword">import</span> <span class="string">"time"</span></div><div class="line"></div><div class="line"><span class="keyword">import</span> <span class="string">"fmt"</span></div><div class="line"></div><div class="line"><span class="function"><span class="keyword">func</span> <span class="title">main</span><span class="params">()</span></span> &#123;</div><div class="line"> c1 := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>)</div><div class="line"> <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</div><div class="line"> time.Sleep(time.Second * <span class="number">2</span>)</div><div class="line"> c1 &lt;- <span class="string">"result 1"</span></div><div class="line"></div><div class="line"> &#125;()</div><div class="line"></div><div class="line"> <span class="keyword">select</span> &#123;</div><div class="line"></div><div class="line"> <span class="keyword">case</span> res := &lt;-c1:</div><div class="line"></div><div class="line"> fmt.Println(res)</div><div class="line"></div><div class="line"> <span class="keyword">case</span> &lt;-time.After(time.Second * <span class="number">1</span>):</div><div class="line"></div><div class="line"> fmt.Println(<span class="string">"timeout 1"</span>)</div><div class="line"></div><div class="line"> &#125;</div><div class="line"></div><div class="line"> c2 := <span class="built_in">make</span>(<span class="keyword">chan</span> <span class="keyword">string</span>)</div><div class="line"></div><div class="line"> <span class="keyword">go</span> <span class="function"><span class="keyword">func</span><span class="params">()</span></span> &#123;</div><div class="line"></div><div class="line"> time.Sleep(time.Second * <span class="number">2</span>)</div><div class="line"></div><div class="line"> c2 &lt;- <span class="string">"result 2"</span></div><div class="line"></div><div class="line"> &#125;()</div><div class="line"></div><div class="line"> <span class="keyword">select</span> &#123;</div><div class="line"></div><div class="line"> <span class="keyword">case</span> res := &lt;-c2:</div><div class="line"></div><div class="line"> fmt.Println(res)</div><div class="line"></div><div class="line"> <span class="keyword">case</span> &lt;-time.After(time.Second * <span class="number">3</span>):</div><div class="line"></div><div class="line"> fmt.Println(<span class="string">"timeout 2"</span>)</div><div class="line"></div><div class="line"> &#125;</div><div class="line"></div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h4 id="运行结果"><a href="#运行结果" class="headerlink" title="运行结果"></a>运行结果</h4><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></pre></td><td class="code"><pre><div class="line">timeout 1</div><div class="line"></div><div class="line">result 2</div></pre></td></tr></table></figure>
<h4 id="程序分析"><a href="#程序分析" class="headerlink" title="程序分析"></a>程序分析</h4><p>分析结果:主程序首先阻塞在 select中,如果在time.second <em> 1内收不到channel 发送过来的信号, 由于groutine 睡眠了time.second </em> 2了, 则select 超时,下面的程序也是按照这个逻辑运行。</p>
<h4 id="案例程序二"><a href="#案例程序二" class="headerlink" title="案例程序二"></a>案例程序二</h4><figure class="highlight golang"><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">fmt.Println(<span class="string">"hello"</span>)</div><div class="line">&lt;-time.After(<span class="number">2</span> * time.Second)</div><div class="line">fmt.Println(<span class="string">"world"</span>)</div></pre></td></tr></table></figure>
<h4 id="程序运行结果"><a href="#程序运行结果" class="headerlink" title="程序运行结果"></a>程序运行结果</h4><p>程序首先打印出 hello, 间隔 2*time.Second 后打印出world。</p>
<h4 id="结果分析"><a href="#结果分析" class="headerlink" title="结果分析"></a>结果分析</h4><p>如果把&lt;-time.After(2 <em> time.Second)改成 time.After(2 </em> time.Second),则 程序会立刻打印出hello及world</p>
</content>
<summary type="html">
<p> 超时对于程序操作外部资源或者管理自身程序执行时间非常重要。在 Go 语言中,因为channel与select,所以实现超时非常容易与优雅。</p>
<h4 id="案例程序一"><a href="#案例程序一" class="headerlink" title="案例
</summary>
</entry>
<entry>
<title>golang的byte和int之间的转换</title>
<link href="http://yoursite.com/2016/07/04/golang%E7%9A%84byte%E5%92%8Cint%E4%B9%8B%E9%97%B4%E7%9A%84%E8%BD%AC%E6%8D%A2/"/>
<id>http://yoursite.com/2016/07/04/golang的byte和int之间的转换/</id>
<published>2016-07-04T06:47:12.000Z</published>
<updated>2016-07-04T06:49:19.000Z</updated>
<content type="html"><p>golang的byte 和int的转换</p>
<p>在使用golang做数据传输的时候,会经常遇到byte与int的互转,但golang并没有现成的方法,因此只能通过binary包来解决<br>所以,需要 :<code>import “encoding/binary”</code>,又因为是byte的转换,所以还涉及到了bytes:<code>import “bytes”</code></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><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></pre></td><td class="code"><pre><div class="line">package main</div><div class="line"></div><div class="line">import (</div><div class="line"> &quot;bytes&quot;</div><div class="line"> &quot;encoding/binary&quot;</div><div class="line"> &quot;fmt&quot;</div><div class="line"> &quot;strings&quot;</div><div class="line">)</div><div class="line"></div><div class="line">func main() &#123;</div><div class="line"> b := []byte&#123;0x00, 0x00, 0x03, 0xe8&#125;</div><div class="line"> b_buf := bytes.NewBuffer(b)</div><div class="line"> var x int32</div><div class="line"> binary.Read(b_buf, binary.BigEndian, &amp;x)</div><div class="line"> fmt.Println(x)</div><div class="line"></div><div class="line"> fmt.Println(strings.Repeat(&quot;-&quot;, 100)) // string的一个函数</div><div class="line"></div><div class="line"> x = 1000</div><div class="line"> b_buf = bytes.NewBuffer([]byte&#123;&#125;) // 可以直接为空进行初始化,</div><div class="line"> binary.Write(b_buf, binary.BigEndian, x)</div><div class="line"> fmt.Println(b_buf.Bytes())</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</content>
<summary type="html">
<p>golang的byte 和int的转换</p>
<p>在使用golang做数据传输的时候,会经常遇到byte与int的互转,但golang并没有现成的方法,因此只能通过binary包来解决<br>所以,需要 :<code>import “encoding/binary”</
</summary>
</entry>
<entry>
<title>time_wait过多分析</title>
<link href="http://yoursite.com/2016/07/04/time-wait%E8%BF%87%E5%A4%9A%E5%88%86%E6%9E%90/"/>
<id>http://yoursite.com/2016/07/04/time-wait过多分析/</id>
<published>2016-07-04T03:48:34.000Z</published>
<updated>2016-07-04T07:01:10.000Z</updated>
<content type="html"><blockquote>
<p> 最近DBA发现Atlas和mysql之间存在大量处于time-waiter状态的connect,。 这个现象很不合理,因为Atlas是复用connect, 也就是说:当前端有一个请求过来的时候, Atlas会在当前线程的连接池中取一个可用连接,并且在处理完该请求后,会把该connect放回到连接池中,当然对于需要维持session的请求(事务、在server端处理的prepare()),只有当客户显式调用close的时候,才会把该connect放回到连接池中。因此想找找原因, 之前觉得对`time_wait` 理解的还行,但具体过程也淡忘了, 之后看到了某作者写的这篇文章, 觉得写的挺详细的, 特别转载以方便以后查询。</p>
</blockquote>
<p>[转载文章如下]</p>
<p><strong>TIME_WAIT的产生原因</strong></p>
<p>因为TCP连接是双向的,所以在关闭连接的时候,两个方向各自都需要关闭。先发FIN包的一方执行的是主动关闭;后发FIN包的一方执行的是被动关闭。主动关闭的一方会进入TIME_WAIT状态,并且在此状态停留两倍的<br><a href="http://en.wikipedia.org/wiki/Maximum_Segment_Lifetime" target="_blank" rel="external">MSL</a>时长。</p>
<p><a href="http://www.zuoqin.me/wp-content/uploads/2015/08/3675218771011332995.png" target="_blank" rel="external"><img src="http://upload-images.jianshu.io/upload_images/1968185-2cf093f636d180b4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="3675218771011332995"></a></p>
<p>MSL指的是报文段的最大生存时间,如果报文段在网络活动了MSL时间,还没有被接收,那么会被丢弃。关于MSL的大小,<a href="http://tools.ietf.org/search/rfc793" target="_blank" rel="external">RFC 793</a>协议中给出的建议是两分钟,不过实际上不同的操作系统可能有不同的设置,以Linux为例,通常是半分钟,两倍的MSL就是一分钟,也就是60秒,并且这个数值是硬编码在<a href="https://github.com/torvalds/linux/blob/master/include/net/tcp.h" target="_blank" rel="external">内核</a>中的,也就是说除非你重新编译内核,否则没法修改它。</p>
<p><strong>TIME_WAIT的产生原因</strong></p>
<p>因为TCP连接是双向的,所以在关闭连接的时候,两个方向各自都需要关闭。先发FIN包的一方执行的是主动关闭;后发FIN包的一方执行的是被动关闭。主动关闭的一方会进入TIME_WAIT状态,并且在此状态停留两倍的MSL时长。TIME_WAIT问题小结 – 网易杭州QA – 网易杭州 QA TeamMSL指的是报文段的最大生存时间,如果报文段在网络活动了MSL时间,还没有被接收,那么会被丢弃。关于MSL的大小,RFC 793协议中给出的建议是两分钟,不过实际上不同的操作系统可能有不同的设置,以Linux为例,通常是半分钟,两倍的MSL就是一分钟,也就是60秒,并且这个数值是硬编码在内核中的,也就是说除非你重新编译内核,否则没法修改它。TIME_WAIT状态存在的必要性。为什么主动关闭的一端不直接进入closed状态,而是要先进入time_wait并且停留两倍的MSL时长呢?这是因为TCP是建立在不可靠网络上的可靠协议。如果主动关闭的一端收到被动关闭一端的发出的FIN包后,返回ACK包,同时进入TIME_WAIT,但是由于网络的原因,主动关闭一端发送的ACK包可能会延迟,从而触发被动关闭一方重传FIN包,这样一来一回极端情况正好是2MSL。如果主动关闭的一端直接close或者不到两倍MSL时间就关闭,那么被动关闭发出重传FIN包到达,可能出现的问题是:旧的连接不存在,系统只能返回RST包;新的TCP连接已经建立,延迟包可能会干扰新连接。这都可能导致TCP不可靠。</p>
<p><strong>TIME_WAIT过多的危害</strong></p>
<p>在生产过程中,如果服务器使用短连接,那么完成一次请求后会主动断开连接,就会造成大量time_wait状态。因此我们常常在系统中会采用长连接,减少建立连接的消耗,同时也减少TIME_WAIT的产生,但实际上即使使用长连接配置不当时,当TIME_WAIT的生产速度远大于其消耗速度时,系统仍然会累计大量的TIME_WAIT状态的连接。TIME_WAIT状态连接过多就会造成一些问题。如果客户端的TIME_WAIT连接过多,同时它还在不断产生,将会导致客户端端口耗尽,新的端口分配不出来,出现错误。如果服务器端的TIME_WAIT连接过多,可能会导致客户端的请求连接失败,这在接下来举例说明。</p>
<p><strong>TIME_WAIT**</strong>问题定位**</p>
<p><strong>案例一:</strong></p>
<p>将nginx作为反向代理时,后连tomcat等服务器。测试中不同并发压力下多次、反复出现nginx服务器端口资源耗尽的问题。表现为nginx服务器出现大量time_wait状态连接,端口资源耗尽(nginx报错:cannot assign requested address )。首先检查nginx开启了长连接keepalive,但是系统仍然出现了大量的TIME_WAIT,这就和之前提到的当系统产生TIME_WAIT的速度大于其消耗速度时,就会累计TIME_WAIT。原因是:keepalive取配置太小,将其增大后问题得以解决。(PS:nginx总的keepalive连接池大小 = keepalive取值 * nginx worker数)</p>
<p><strong>案例二:</strong></p>
<p>某应用其中一层系统架构Nginx+Tomcat,客户端发出的请求为HTTP HEAD,客户端TPS有段时间接近为0,返回Connection time out错误。<br><a href="http://www.zuoqin.me/wp-content/uploads/2015/08/6597301763611814346.png" target="_blank" rel="external"><img src="http://upload-images.jianshu.io/upload_images/1968185-a7019b821123b1c1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="6597301763611814346"></a></p>
<p>观察大部分错误请求响应时间刚好是30s,这正好是nginx的连接超时时间配置,Tomcat没有收到这些错误请求,这意味着请求Nginx连接Tomcat都没有成功。这是为什么呢?Tomcat的连接池不够用吗? 实际上Tomcat work线程不到200个,远小于MaxThread(1024)的值,同时还观察到Tomcat上的TIME_WAIT连接数量不正常,达到了近两万个。<br><a href="http://www.zuoqin.me/wp-content/uploads/2015/08/736338539175571363.png" target="_blank" rel="external"><img src="http://upload-images.jianshu.io/upload_images/1968185-3b6513ad036215e5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="736338539175571363"></a><br>系统是设置了长连接的,为什么还有这么多TIME_WAIT,难道长连接没有生效吗?<br>Nginx作为反向代理,长连接配置主要有三项,upstream中的keepalive设置单个worker最大请求数,参数proxy_http_version 1.1强制转换为http1.1协议(默认支持长连接),proxy_set_header Connection将请求头部connection为空(http1.0请求默认connection头部为close)<br>upstream backend_nosfs {<br>server 10.10.10.10:8185;<br>keepalive 1024;<br> keepalive_requests;<br>}<br>proxy_http_version 1.1;<br>proxy_set_header Connection “”;<br>Tomcat端增加配置maxKeepAliveRequests=“10000”,表示一个连接上最大请求数达到10000才会断开。<br>定位长连接问题,最简单直接的方法就是抓包,通过wireshark分析Nginx和Tomcat直接连接果然没有生效,一条连接只处理了一个请求。</p>
<p><a href="http://www.zuoqin.me/wp-content/uploads/2015/08/796011234238224070.png" target="_blank" rel="external"><img src="http://upload-images.jianshu.io/upload_images/1968185-65b6b099d0c154e3.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="796011234238224070"></a></p>
<p>为什么设置了长连接相关的配置,还是没有生效呢?经过排查发现,proxy_http_version 1.1;<br>proxy_set_header Connection “”这两项配置放在Nginx的Http域中,实际上他们要放在server域才会生效,将其位置修改后,长连接生效了,所有问题都解决了。但是我们不禁会尝试疑问TIME_WAIT出现在Tomcat而不是在Nginx上?从抓包可以看出Nginx发送给Tomcat包头部Connection为close,所以Tomcat在处理完head请求后就主动关闭,所以TIME_WAIT出现在Tomcat服务器。 配置修改后,问题解决了,TPS也上去了,之前出现的连接失败问题也没有了。<br><a href="http://www.zuoqin.me/wp-content/uploads/2015/08/3196992785579897494.png" target="_blank" rel="external"><img src="http://upload-images.jianshu.io/upload_images/1968185-61f87a3264e0372f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="3196992785579897494"></a></p>
<p>但是为什么Tomcat服务器上的TIME_WAIT过多会导致Nginx连接失败呢?理论上说,服务器只监听在一个端口,但是会new出很多socket去处理请求,难道是socket不够用吗?再观察资源使用发现虽然TIME_WAIT连接数多,但是句柄数并不多,而socket的数量是受制于句柄数。那真正的原因是什么呢?在系统TIME_WAIT较多时,Dmesg系统出错日志为:</p>
<p><strong>nf_conntrack: table full, dropping packet</strong></p>
<p>真相大白了,Conntrack表用于记录每个连接的状态,在tcp协议中用源ip/port+目的ip/port唯一标识一个连接。记录TCP连接状态的表满了导致请求失败。查看系统ip_contrack_max配置为65536,在极端的情况下超出了其配置所有导致连接失败。<br><a href="http://www.zuoqin.me/wp-content/uploads/2015/08/1808476725466247815.png" target="_blank" rel="external"><img src="http://upload-images.jianshu.io/upload_images/1968185-8f50d819fd54826d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="1808476725466247815"></a><br><strong>如何控制TIME_WAIT**</strong>的数量**</p>
<p>通过以上的TIME_WAIT问题,我们可以看到TIME_WAIT这个状态不存在不行,但是过多就对系统会造成困扰。那么我们应该如何控制TIME_WAIT的数量呢?</p>
<p><strong>长连接</strong></p>
<p>对于反向代理和应用服务器,最好是要配置成支持keepalive长连接,否则在系统并发增加时会导致一系列的连接问题。对于nginx+tomcat长连接的配置前面有一些介绍可以参考,其它服务器一般也是提供支持长连接配置的,设置后建议抓包测试验证。<br>一般来说长连接设置正确了TIME_WAIT数量不会暴涨,但是长连接最大请求数也是有效的,但如果应用的处理速度很快导致TIME_WAIT的产生的速度远快于TIME_WAIT的消耗速度时系统就会累计TIME_WAIT状态连接。这时候可能就要修改一些系统配置了。</p>
<p><strong>ip_conntrack</strong></p>
<p>用于跟踪TCP连接。一旦激活了此模块,就能在系统参数里发现很多用来控制网络连接状态超时的设置,其中自然也包括TIME_WAIT,默认ip_conntrack_max最大为65536,可以将其设置得更大一些。一般不建议此模块,如果系统安装使用iptable会启动该模块。</p>
<p><strong>tcp_tw_recycle</strong></p>
<p>在网上搜索TIME_WAIT问题的解决方法,大多都会提到这个参数,不过官方网站上不建议开启这个参数,原因是会导致一些安全问题。例如,当多个客户端通过NAT方式联网并与服务端交互时,服务端看到的是同一个IP,由于这些客户端的时间戳可能存在差异,所以从服务端的视角看,便可能出现时间戳错乱的现象,进而直接导致时间戳小的数据包被丢弃。</p>
<p><strong>tcp_tw_reuse</strong></p>
<p>当创建新连接的时候,如果可能的话会考虑复用相应的TIME_WAIT连接。官方文档里提到的是如果从协议视角看它是安全的,那么就可以使用。这个很难判定这个参数是否应该开启,不到万不得已的时候,即使我们要开启这个参数复用连接,也应该在连接的发起方使用,而不能在被连接方使用。</p>
<p><strong>tcp_max_tw_buckets</strong></p>
<p>用于控制TIME_WAIT总数。这个选项是为了阻止一些简单的DoS攻击,平常不要人为的降低它。如果TIME_WAIT已经成为最棘手的问题,那么即便此时并不是DoS攻击的场景,也可以尝试通过设置它来减少TIME_WAIT数量。</p>
</content>
<summary type="html">
<blockquote>
<p> 最近DBA发现Atlas和mysql之间存在大量处于time-waiter状态的connect,。 这个现象很不合理,因为Atlas是复用connect, 也就是说:当前端有一个请求过来的时候, Atlas会在当前线程的连接池中取一个可用连接,
</summary>
</entry>
<entry>
<title>常用的几个正则</title>
<link href="http://yoursite.com/2016/06/30/%E5%B8%B8%E7%94%A8%E7%9A%84%E5%87%A0%E4%B8%AA%E6%AD%A3%E5%88%99/"/>
<id>http://yoursite.com/2016/06/30/常用的几个正则/</id>
<published>2016-06-30T10:36:04.000Z</published>
<updated>2016-07-04T06:25:41.000Z</updated>
<content type="html"><h4 id="20多个正则表达式"><a href="#20多个正则表达式" class="headerlink" title="20多个正则表达式"></a>20多个正则表达式</h4><p>熟练应用正则表达式,能够快速实现一个非常复杂的义务逻辑。 在日常开发中也非常重要, 看到网上的一些资料,整理了一下,方便以后查询。</p>
<p>正则表达式经常被用于字段或任意字符串的校验,如下面这段校验基本日期格式的<br><code>JavaScript</code>代码:</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></pre></td><td class="code"><pre><div class="line">var reg = /^(\\d&#123;1,4&#125;)(-|\\/)(\\d&#123;1,2&#125;)\\2(\\d&#123;1,2&#125;)$/; </div><div class="line">var r = fieldValue.match(reg); </div><div class="line">if(r==null)alert(&apos;Date format error!&apos;);r</div></pre></td></tr></table></figure>
<p>下面是网友整理的,在前端开发中经常使用到的20个正则表达式。</p>
<p>1 . 校验密码强度<br>密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。</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">^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).&#123;8,10&#125;$</div></pre></td></tr></table></figure>
<p>2 . 校验中文</p>
<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">^[\\u4e00-\\u9fa5]&#123;0,&#125;$</div></pre></td></tr></table></figure>
<p>3 . 由数字、26个英文字母或下划线组成的字符串</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">^\\w+$</div></pre></td></tr></table></figure>
<p>4 . 校验E-Mail 地址<br>同密码一样,下面是E-mail地址合规性的正则检查语句。</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">[\\w!#$%&amp;&apos;*+/=?^_`&#123;|&#125;~-]+(?:\\.[\\w!#$%&amp;&apos;*+/=?^_`&#123;|&#125;~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?</div></pre></td></tr></table></figure>
<p>5 . 校验身份证号码 </p>
<p>下面是身份证号码的正则校验。15 或 18位。</p>
<p>15位:</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">^[1-9]\\d&#123;7&#125;((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d&#123;3&#125;$</div></pre></td></tr></table></figure>
<p>18位:</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">^[1-9]\\d&#123;5&#125;[1-9]\\d&#123;3&#125;((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d&#123;3&#125;([0-9]|X)$</div></pre></td></tr></table></figure>
<p>6 . 校验日期<br>“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。</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">^(?:(?!0000)[0-9]&#123;4&#125;-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]&#123;2&#125;(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$</div></pre></td></tr></table></figure>
<p>7 . 校验金额<br>金额校验,精确到2位小数。</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">^[0-9]+(.[0-9]&#123;2&#125;)?$</div></pre></td></tr></table></figure>
<p>8 . 校验手机号<br>下面是国内 13、15、18开头的手机号正则表达式。</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">^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d&#123;8&#125;$</div></pre></td></tr></table></figure>
<p>9 . 判断IE的版本<br>IE目前还没被完全取代,很多页面还是需要做版本兼容,下面是IE版本检查的表达式。</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">^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$</div></pre></td></tr></table></figure>
<p>10 . 校验IP-v4地址<br>IP4 正则语句。</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">\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.)&#123;3&#125;(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b</div></pre></td></tr></table></figure>
<p>11 . 校验IP-v6地址<br>IP6 正则语句。</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">(([0-9a-fA-F]&#123;1,4&#125;:)&#123;7,7&#125;[0-9a-fA-F]&#123;1,4&#125;|([0-9a-fA-F]&#123;1,4&#125;:)&#123;1,7&#125;:|([0-9a-fA-F]&#123;1,4&#125;:)&#123;1,6&#125;:[0-9a-fA-F]&#123;1,4&#125;|([0-9a-fA-F]&#123;1,4&#125;:)&#123;1,5&#125;(:[0-9a-fA-F]&#123;1,4&#125;)&#123;1,2&#125;|([0-9a-fA-F]&#123;1,4&#125;:)&#123;1,4&#125;(:[0-9a-fA-F]&#123;1,4&#125;)&#123;1,3&#125;|([0-9a-fA-F]&#123;1,4&#125;:)&#123;1,3&#125;(:[0-9a-fA-F]&#123;1,4&#125;)&#123;1,4&#125;|([0-9a-fA-F]&#123;1,4&#125;:)&#123;1,2&#125;(:[0-9a-fA-F]&#123;1,4&#125;)&#123;1,5&#125;|[0-9a-fA-F]&#123;1,4&#125;:((:[0-9a-fA-F]&#123;1,4&#125;)&#123;1,6&#125;)|:((:[0-9a-fA-F]&#123;1,4&#125;)&#123;1,7&#125;|:)|fe80:(:[0-9a-fA-F]&#123;0,4&#125;)&#123;0,4&#125;%[0-9a-zA-Z]&#123;1,&#125;|::(ffff(:0&#123;1,4&#125;)&#123;0,1&#125;:)&#123;0,1&#125;((25[0-5]|(2[0-4]|1&#123;0,1&#125;[0-9])&#123;0,1&#125;[0-9])\\.)&#123;3,3&#125;(25[0-5]|(2[0-4]|1&#123;0,1&#125;[0-9])&#123;0,1&#125;[0-9])|([0-9a-fA-F]&#123;1,4&#125;:)&#123;1,4&#125;:((25[0-5]|(2[0-4]|1&#123;0,1&#125;[0-9])&#123;0,1&#125;[0-9])\\.)&#123;3,3&#125;(25[0-5]|(2[0-4]|1&#123;0,1&#125;[0-9])&#123;0,1&#125;[0-9]))</div></pre></td></tr></table></figure>
<p>12 . 检查URL的前缀<br>应用开发中很多时候需要区分请求是HTTPS还是HTTP,通过下面的表达式可以取出一个url的前缀然后再逻辑判断。</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">if (!s.match(/^[a-zA-Z]+:\\/\\//))</div><div class="line">&#123;</div><div class="line"> s = &apos;http://&apos; + s;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>13 . 提取URL链接<br>下面的这个表达式可以筛选出一段文本中的URL。</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">^(f|ht)&#123;1&#125;(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&amp;=]*)?</div></pre></td></tr></table></figure>
<p>14 . 文件路径及扩展名校验<br>验证文件路径和扩展名</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">^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?&quot;&lt;&gt;|]+\\.txt(l)?$</div></pre></td></tr></table></figure>
<p>15 . 提取Color Hex Codes<br>有时需要抽取网页中的颜色代码,可以使用下面的表达式。</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">\\#([a-fA-F]|[0-9])&#123;3,6&#125;</div></pre></td></tr></table></figure>
<p>16 . 提取网页图片<br>假若你想提取网页中所有图片信息,可以利用下面的表达式。</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">\\&lt; *[img][^\\&gt;]*[src] *= *[\\&quot;\\&apos;]&#123;0,1&#125;([^\\&quot;\\&apos;\\ &gt;]*)</div></pre></td></tr></table></figure>
<p>17 . 提取页面超链接<br>提取html中的超链接。</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">(&lt;a\\s*(?!.*\\brel=)[^&gt;]*)(href=&quot;https?://)((?!(?:(?:www\\.)?&apos;.implode(&apos;|(?:www\\.)?&apos;, $follow_list).&apos;))[^&quot;]+)&quot;((?!.*\\brel=)[^&gt;]*)(?:[^&gt;]*)&gt;</div></pre></td></tr></table></figure>
<p>18 . 精炼CSS<br>通过下面的表达式,可以搜索相同属性值的CSS,从而达到精炼代码的目的。</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">^\\s*[a-zA-Z\\-]+\\s*[:]&#123;1&#125;\\s[a-zA-Z0-9\\s.#]+[;]&#123;1&#125;</div></pre></td></tr></table></figure>
<p>19 . 抽取注释<br>如果你需要移除HMTL中的注释,可以使用如下的表达式。</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">&lt;!--(.*?)--&gt;</div></pre></td></tr></table></figure>
<p>20 . 匹配HTML标签 </p>
<p>通过下面的表达式可以匹配出HTML中的标签。</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">&lt;/?\\w+((\\s+\\w+(\\s*=\\s*(?:&quot;.*?&quot;|&apos;.*?&apos;|[\\^&apos;&quot;&gt;\\s]+))?)+\\s*|\\s*)/?&gt;</div></pre></td></tr></table></figure>
<blockquote>
<p>note: regex101是一个非常不错的正则表达式在线测试工具,你可以直接在线测试你的正则表达式哦。</p>
</blockquote>
</content>
<summary type="html">
<h4 id="20多个正则表达式"><a href="#20多个正则表达式" class="headerlink" title="20多个正则表达式"></a>20多个正则表达式</h4><p>熟练应用正则表达式,能够快速实现一个非常复杂的义务逻辑。 在日常开发中也非常重要,
</summary>
</entry>
<entry>
<title>Golang的数组和切片</title>
<link href="http://yoursite.com/2016/06/30/Golang%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C%E5%88%87%E7%89%87/"/>
<id>http://yoursite.com/2016/06/30/Golang的数组和切片/</id>
<published>2016-06-30T07:08:27.000Z</published>
<updated>2016-06-30T07:26:06.000Z</updated>
<content type="html"><h3 id="数组Arrays"><a href="#数组Arrays" class="headerlink" title="数组Arrays"></a>数组Arrays</h3><p> 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的下标索引访问元素值。在初始化后长度是固定的,无法修改其长度。当作为方法的入参传入时将复制一份数组而不是引用同一指针。数组的长度也是其类型的一部分,通过内置函数len(array)获取其长度。</p>
<h4 id="数组初始化"><a href="#数组初始化" class="headerlink" title="数组初始化"></a>数组初始化</h4><p>[5]int {1,2,3,4,5}<br> 长度为5的数组,其元素值依次为:1,2,3,4,5</p>
<p>[5] int {1,2}长度为5的数组,其元素值依次为:1,2,0,0,0 。在初始化时没有指定初值的元素将会赋值为其元素类型int的默认值0,string的默认值是””</p>
<p>[…] int {1,2,3,4,5} 长度为5的数组,其长度是根据初始化时指定的元素个数决定的</p>
<p>[5]int{ 2:1,3:2,4:3} 长度为5的数组,key:value,其元素值依次为:0,0,1,2,3。在初始化时指定了2,3,4索引中对应的值:1,2,3</p>
<p>[…] int {2:1,4:3} 长度为5的数组,起元素值依次为:0,0,1,0,3。由于指定了最大索引4对应的值3,根据初始化的元素个数确定其长度为5</p>
<h3 id="切片Slices"><a href="#切片Slices" class="headerlink" title="切片Slices"></a>切片Slices</h3><p>数组的长度不可改变,在特定场景中这样的集合就不太适用,Go中提供了一种灵活,功能强悍的内置类型Slices切片,与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。切片中有两个概念:一是len长度,二是cap容量,长度是指已经被赋过值的最大下标+1,可通过内置函数len()获得。容量是指切片目前可容纳的最多元素个数,可通过内置函数cap()获得。切片是引用类型,因此在当传递切片时将引用同一指针,修改值将会影响其他的对象。</p>
<h4 id="切片初始化"><a href="#切片初始化" class="headerlink" title="切片初始化"></a>切片初始化</h4><p>切片可以通过数组来初始化,也可以通过内置函数make()初始化 .初始化时len=cap,在追加元素时如果容量cap不足时将按len的2倍扩容 查看示例代码,在线运行示例代码</p>
<p>s :=[] int {1,2,3}</p>
<p>直接初始化切片,[]表示是切片类型,{1,2,3}初始化值依次是1,2,3.其cap=len=3</p>
<p>s := arr[:] </p>
<p>初始化切片s,是数组arr的引用</p>
<p>s := arr[startIndex:endIndex] </p>
<p>将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片</p>
<p>s := arr[startIndex:] </p>
<p>缺省endIndex时将表示一直到arr的最后一个元素</p>
<p>s := arr[:endIndex] </p>
<p>缺省startIndex时将表示从arr的第一个元素开始</p>
<p>s1 := s[startIndex:endIndex] </p>
<p>通过切片s初始化切片s1</p>
<p>s :=make([]int,len,cap) </p>
<p>通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片<br>赋值与使用</p>
<p>切片是引用类型,在使用时需要注意其操作。查看示例代码 ,在线运行示例代码 切片可以通过内置函数append(slice []Type,elems …Type)追加元素,elems可以是一排type类型的数据,也可以是slice,因为追加的一个一个的元素,因此如果将一个slice追加到另一个slice中需要带上”…”,这样才能表示是将slice中的元素依次追加到另一个slice中。另外在通过下标访问元素时下标不能超过len大小,如同数组的下标不能超出len范围一样。</p>
<h4 id="切片的一种特殊用法"><a href="#切片的一种特殊用法" class="headerlink" title="切片的一种特殊用法"></a>切片的一种特殊用法</h4><p>s :=append(s,1,2,3,4)<br>s :=append(s,s1…) // 这个是把S1切片中的都追加到切片s中</p>
<blockquote>
<p>note: 注意<strong>切片传递的是引用</strong></p>
</blockquote>
</content>
<summary type="html">
<h3 id="数组Arrays"><a href="#数组Arrays" class="headerlink" title="数组Arrays"></a>数组Arrays</h3><p> 数组是内置(build-in)类型,是一组同类型数据的集合,它是值类型,通过从0开始的
</summary>
</entry>
<entry>
<title>locate/whereis/which等区别</title>
<link href="http://yoursite.com/2016/06/30/locate-whereis-which%E7%AD%89%E5%8C%BA%E5%88%AB/"/>
<id>http://yoursite.com/2016/06/30/locate-whereis-which等区别/</id>
<published>2016-06-30T07:00:29.000Z</published>
<updated>2016-06-30T07:04:38.000Z</updated>
<content type="html"><p><strong>locate</strong> 其实是<code>find -name</code>的别称</p>
<p><strong>whereis</strong> 命令只能用于程序名的搜索</p>
<p><strong>which</strong> 在PATH 变量的路径中, 搜索某个系统命令的位置,并且返回第一个搜索结果, 也就是说,使用which命令, 就可以看到某个命令是否存在,以及执行的到底是哪一个位置的命令</p>
<p><strong>type</strong> 用来区分某一个命令到底是shell 自带的, 还是由一个外部独立的二进制文件提供的, 如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于<code>which</code>命令.</p>
<p><strong>trap</strong> 是一个shell内建命令,它用来在脚本中指定信号如何处理。比如,按Ctrl+C会使脚本终止执行,实际上系统发送了SIGINT信号给脚本进程,SIGINT信号的默认处理方式就是退出程序。如果要在Ctrl+C不退出程序,那么就得使用trap命令来指定一下SIGINT的处理方式了。trap命令不仅仅处理Linux信号,还能对脚本退出(EXIT)、调试(DEBUG)、错误(ERR)、返回(RETURN)等情况指定处理方式。</p>
</content>
<summary type="html">
<p><strong>locate</strong> 其实是<code>find -name</code>的别称</p>
<p><strong>whereis</strong> 命令只能用于程序名的搜索</p>
<p><strong>which</strong> 在PATH 变量
</summary>
</entry>
<entry>
<title>mesos_install</title>
<link href="http://yoursite.com/2016/06/30/mesos_install/"/>
<id>http://yoursite.com/2016/06/30/mesos_install/</id>
<published>2016-06-30T02:39:26.000Z</published>
<updated>2016-06-30T02:44:24.000Z</updated>
<content type="html"><blockquote>
<p>为了使用spark 的基于mesos的集群方式, 需要安装mesos, 网上教程很多,但感觉有些繁琐,其实说起来也就几步而已。 </p>
</blockquote>
<ul>
<li><p>下载mvn, 并建立软连接<br> <code>wget http://mirror.nexcess.net/apache/maven/maven-3/3.0.5/binaries/apache-maven-3.0.5-bin.tar.gz</code><br> <code>sudo tar -zxf apache-maven-3.0.5-bin.tar.gz -C /opt/</code><br> <code>sudo ln -s /opt/apache-maven-3.0.5/bin/mvn /usr/bin/mvn</code></p>
</li>
<li><p>yum直接安装各种依耐包<br> <code>sudo yum install -y python-devel java-1.7.0-openjdk-devel zlib-devel libcurl-devel openssl-devel cyrus-sasl-devel cyrus-sasl-md5 apr-devel subversion-devel apr-util-devel gcc-g++</code></p>
</li>
<li>下载mesos源码包<br><code>http://archive.apache.org/dist/mesos/0.21.0/mesos-0.21.0.tar.gz (下载这个版本主要是为了匹配spark 1.6.1)</code></li>
<li>解压该源码包并执行编译、安装(在编译阶段会去下载大量的包, 整个过程 一般得20~30 分钟)</li>
</ul>
</content>
<summary type="html">
<blockquote>
<p>为了使用spark 的基于mesos的集群方式, 需要安装mesos, 网上教程很多,但感觉有些繁琐,其实说起来也就几步而已。 </p>
</blockquote>
<ul>
<li><p>下载mvn, 并建立软连接<br> <code>wget
</summary>
</entry>
<entry>
<title>使用ipython+pyspark</title>
<link href="http://yoursite.com/2016/06/30/first/"/>
<id>http://yoursite.com/2016/06/30/first/</id>
<published>2016-06-30T02:09:38.000Z</published>
<updated>2016-06-30T02:28:16.000Z</updated>
<content type="html"><p><em>ipython 启动时找不到spark</em><br>ipython notebook –profile=pytest<br>在启动spark 可以这样设置<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></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> findspark</div><div class="line">findspark.init()</div><div class="line">spark_home = os.environ.get(<span class="string">'SPARK_HOME'</span>, <span class="keyword">None</span>)</div><div class="line">sc = pyspark.SparkContext(appName=<span class="string">"myAppName"</span>)</div><div class="line">text_file = sc.textFile(spark_home + <span class="string">"/README.md"</span>) </div><div class="line">word_counts = text_file.flatMap(<span class="keyword">lambda</span> line: line.split()).map(<span class="keyword">lambda</span> word: (word, <span class="number">1</span>)).reduceByKey(<span class="keyword">lambda</span> a, b: a + b)</div><div class="line">word_counts.collect()</div></pre></td></tr></table></figure></p>
<p>pyspark在启动的时候,可以指定相应的集群名称,比如 local, 或者 mesos的集群什么的</p>
</content>
<summary type="html">
<p><em>ipython 启动时找不到spark</em><br>ipython notebook –profile=pytest<br>在启动spark 可以这样设置<br><figure class="highlight python"><table><tr><td cl
</summary>
</entry>
<entry>
<title>Hello World</title>
<link href="http://yoursite.com/2016/06/30/hello-world/"/>
<id>http://yoursite.com/2016/06/30/hello-world/</id>
<published>2016-06-30T01:49:12.000Z</published>
<updated>2016-06-30T01:49:12.000Z</updated>
<content 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.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>
</feed>