Repository navigation
Expand file tree
/
Copy pathatom.xml
More file actions
484 lines (368 loc) · 120 KB
/
Copy pathatom.xml
File metadata and controls
484 lines (368 loc) · 120 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
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
472
473
474
475
476
477
478
479
480
481
482
483
484
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Zinway's Blog</title>
<subtitle>Talk about the Soy Sauce</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://zin.so/"/>
<updated>2016-08-29T05:38:34.000Z</updated>
<id>http://zin.so/</id>
<author>
<name>Zinway</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>交换CapsLock键和Control键</title>
<link href="http://zin.so/2015/05/04/swapping-caps-lock-and-control/"/>
<id>http://zin.so/2015/05/04/swapping-caps-lock-and-control/</id>
<published>2015-05-04T07:33:33.000Z</published>
<updated>2016-08-29T05:38:34.000Z</updated>
<content type="html"><![CDATA[<p>今天终于<strong>狠下心来</strong>交换CapsLock键和Control键,Google了下发现几年前的OSX就已经支持在键盘设置里面直接修改了。<br>具体修改方法如下:<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">系统偏好设置 -> 键盘 -> 修饰键 -> 修改CapsLock键和Control键对应的映射</div></pre></td></tr></table></figure></p>
<p>附一些Unix系统快捷键,这些命令在Vim/BashShell等涉及到文本操作的情景下都可以使用。<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><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">Ctrl+p shell中上一个命令,或者 文本中移动到上一行</div><div class="line">Ctrl+n shell中下一个命令,或者 文本中移动到下一行</div><div class="line">Ctrl+r 往后搜索历史命令</div><div class="line">Ctrl+s 往前搜索历史命令</div><div class="line">Ctrl+f 光标前移</div><div class="line">Ctrl+b 光标后退</div><div class="line">Ctrl+a 到行首</div><div class="line">Ctrl+e 到行尾</div><div class="line">Ctrl+d 删除一个字符,删除一个字符,相当于通常的Delete键</div><div class="line">Ctrl+h 退格删除一个字符,相当于通常的Backspace键</div><div class="line">Ctrl+u 删除到行首</div><div class="line">Ctrl+k 删除到行尾</div><div class="line">Ctrl+l 类似 clear 命令效果</div><div class="line">Ctrl+y 粘贴</div></pre></td></tr></table></figure></p>
]]></content>
<summary type="html">
<p>今天终于<strong>狠下心来</strong>交换CapsLock键和Control键,Google了下发现几年前的OSX就已经支持在键盘设置里面直接修改了。<br>具体修改方法如下:<br><figure class="highlight plain"><table>
</summary>
<category term="Shell" scheme="http://zin.so/categories/Shell/"/>
<category term="Mac OSX" scheme="http://zin.so/tags/Mac-OSX/"/>
<category term="Vim" scheme="http://zin.so/tags/Vim/"/>
</entry>
<entry>
<title>办公室自动翻墙</title>
<link href="http://zin.so/2014/12/22/auto-break-gfw/"/>
<id>http://zin.so/2014/12/22/auto-break-gfw/</id>
<published>2014-12-22T10:28:44.000Z</published>
<updated>2016-08-29T05:38:34.000Z</updated>
<content type="html"><![CDATA[<p>引子:<br>凑巧的是我5月中旬给公司搭了个翻墙环境来加速Google和Gmail的访问速度,然后5月27号Google就开始被封了 Orz ,然后就正好用上了这一套系统,后面就是不断地完善和优化,然后最近有空就Blog出来。</p>
<p>需求:</p>
<ol>
<li>希望能够尽量透明地免设置地实现自动翻墙;</li>
<li>尽量不影响墙内站点的访问速度;</li>
<li>尽可能地便于维护和更新。</li>
</ol>
<p>整个自动翻墙分为这么几块:</p>
<ol>
<li>VPN(翻墙的跳板,我们这边选择了OpenVPN);</li>
<li>路由(定制墙外路由以及NAT,实现“自动”);</li>
<li>DNS(防止DNS污染以及CDN的正确解析)。</li>
</ol>
<h2 id="VPN-Server搭建"><a href="#VPN-Server搭建" class="headerlink" title="VPN Server搭建"></a>VPN Server搭建</h2><p>OpenVPN的搭建可以参考这一篇文章:<a href="http://zin.so/2014/08/21/how-to-install-openvpn-server-on-centos-7/">在CentOS 7上安装OpenVPN Server</a></p>
<h2 id="路由定制及NAT"><a href="#路由定制及NAT" class="headerlink" title="路由定制及NAT"></a>路由定制及NAT</h2><p>使用OpenVPN Server将墙外的IP列表push给Client,在办公室网关上启一个OpenVPN Client并且开转发和NAT。<br>为了便于实现路由表的更新,我们使用了 client-config-dir,也就是 ccd 以及 push-continuation,将需要 push 的路由表放入 ccd 之中,配合 management console, 在更新了ccd 之中的路由表之后在 console 里面kill掉相关的client,这样 client 就会自动重连并且得到新的路由表,client 和 server 均无需重启。<br>翻墙路由表可参考<a href="https://github.com/zinw/VPN" target="_blank" rel="external">GFW 境外列表(部分)</a>。</p>
<h2 id="DNS转发及优化"><a href="#DNS转发及优化" class="headerlink" title="DNS转发及优化"></a>DNS转发及优化</h2><p>为了方便管理和速度上的保证,我们没有直接使用bind,而是用dnsmasq来转发。<br>使用iptables来过滤DNS污染可以参考这一篇文章:<a href="http://zin.so/2014/12/19/anti-dns-poison-with-iptables/">通过iptables去除DNS污染</a><br>dnsmasq默认把DNS丢给OpenDNS,一些CDN域名用dnsmasq.server的配置文件来丢给国内的DNS,一些需要定制IP地址的就用dnsmasq.address配置文件来个性化。</p>
<h2 id="持续维护"><a href="#持续维护" class="headerlink" title="持续维护"></a>持续维护</h2><p>这一套系统我们需要维护2个表:<br>1个墙外路由表(一些个性化的墙外网站的访问需求);<br>1个dnsmasq.server表(主要是CDN域名,这个只能发现以后一点一点加)。</p>
]]></content>
<summary type="html">
<p>引子:<br>凑巧的是我5月中旬给公司搭了个翻墙环境来加速Google和Gmail的访问速度,然后5月27号Google就开始被封了 Orz ,然后就正好用上了这一套系统,后面就是不断地完善和优化,然后最近有空就Blog出来。</p>
<p>需求:</p>
<ol>
<li
</summary>
<category term="Network" scheme="http://zin.so/categories/Network/"/>
<category term="DNS" scheme="http://zin.so/tags/DNS/"/>
<category term="VPN" scheme="http://zin.so/tags/VPN/"/>
<category term="NAT" scheme="http://zin.so/tags/NAT/"/>
</entry>
<entry>
<title>通过iptables去除DNS污染</title>
<link href="http://zin.so/2014/12/19/anti-dns-poison-with-iptables/"/>
<id>http://zin.so/2014/12/19/anti-dns-poison-with-iptables/</id>
<published>2014-12-19T08:26:07.000Z</published>
<updated>2016-08-29T05:38:34.000Z</updated>
<content type="html"><![CDATA[<p><strong>GFW的DNS劫持原理</strong>说起来挺简单,GFW对境外DNS的劫持,是在发现你请求敏感域名的DNS记录时,伪装成你请求的DNS返回一个污染的数据包给你的解析器,但并不会丢弃你向境外DNS的请求,也不会丢弃境外DNS返回的正确解析结果,他只是让错误的数据抢先回来欺骗了你的解析器而已,毕竟他直接从国内给你发污染数据怎么都比国外DNS返回正确数据要快,而解析器在先收到了欺骗数据包之后,就不会再管后面返回的正确数据了,这样你就被DNS劫持了。</p>
<p><strong>一般的解决办法</strong>就是通过VPN通道访问DNS服务器,以获得干净的解析结果。本文的解决方案:我们可以在iptables的防火墙规则中,检测UDP的源端口为53的数据(DNS查询是通过UDP查询服务器的53端口实现的),一旦发现解析数据中包含有被GFW常用的用于DNS污染和劫持的IP,就丢弃这个数据包,对dnsmasq这些解析器来说污染的数据包根本就不会到达(本文涉及的iptables规则会抢先于任何应用先处理网络数据),等正确的境外DNS返回的数据到达后并不会被过滤,这样dnsmasq就获得了正确的DNS解析数据。</p>
<p>首先我们要找到被GFW用于DNS污染和劫持的IP,目前搜集并统计到的无效IP(参考<a href="https://github.com/clowwindy/ChinaDNS/blob/master/iplist.txt" target="_blank" rel="external">clowwindy的iplist.txt</a>)如下:<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><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></pre></td><td class="code"><pre><div class="line">118.5.49.6</div><div class="line">128.121.126.139</div><div class="line">159.106.121.75</div><div class="line">169.132.13.103</div><div class="line">188.5.4.96</div><div class="line">189.163.17.5</div><div class="line">192.67.198.6</div><div class="line">197.4.4.12</div><div class="line">202.106.1.2</div><div class="line">202.181.7.85</div><div class="line">203.161.230.171</div><div class="line">203.98.7.65</div><div class="line">207.12.88.98</div><div class="line">208.56.31.43</div><div class="line">209.145.54.50</div><div class="line">209.220.30.174</div><div class="line">209.36.73.33</div><div class="line">209.85.229.138</div><div class="line">211.94.66.147</div><div class="line">213.169.251.35</div><div class="line">216.221.188.182</div><div class="line">216.234.179.13</div><div class="line">23.89.5.60</div><div class="line">243.185.187.39</div><div class="line">249.129.46.48</div><div class="line">253.157.14.165</div><div class="line">37.61.54.158</div><div class="line">4.36.66.178</div><div class="line">46.82.174.68</div><div class="line">49.2.123.56</div><div class="line">54.76.135.1</div><div class="line">59.24.3.173</div><div class="line">64.33.88.161</div><div class="line">64.33.99.47</div><div class="line">64.66.163.251</div><div class="line">65.104.202.252</div><div class="line">65.160.219.113</div><div class="line">66.45.252.237</div><div class="line">72.14.205.104</div><div class="line">72.14.205.99</div><div class="line">74.125.127.102</div><div class="line">74.125.155.102</div><div class="line">74.125.39.102</div><div class="line">74.125.39.113</div><div class="line">77.4.7.92</div><div class="line">78.16.49.15</div><div class="line">8.7.198.45</div><div class="line">93.46.8.89</div></pre></td></tr></table></figure></p>
<p>后面需要用到这些IP的16进制,本文推荐个转换工具netmask(附<a href="https://github.com/zinw/VPN/raw/master/netmask_2.3.12.tar.gz" target="_blank" rel="external">netmask源码包</a>)。<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><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></pre></td><td class="code"><pre><div class="line"> # netmask --help</div><div class="line">This is netmask, an address netmask generation utility</div><div class="line">Usage: netmask spec [spec ...]</div><div class="line"> -h, --helpPrint a summary of the options</div><div class="line"> -v, --versionPrint the version number</div><div class="line"> -d, --debugPrint status/progress information</div><div class="line"> -s, --standardOutput address/netmask pairs</div><div class="line"> -c, --cidrOutput CIDR format address lists</div><div class="line"> -i, --ciscoOutput Cisco style address lists</div><div class="line"> -r, --rangeOutput ip address ranges</div><div class="line"> -x, --hexOutput address/netmask pairs in hex</div><div class="line"> -o, --octalOutput address/netmask pairs in octal</div><div class="line"> -b, --binaryOutput address/netmask pairs in binary</div><div class="line"> -n, --nodnsDisable DNS lookups for addresses</div><div class="line">Definitions:</div><div class="line"> a spec can be any of:</div><div class="line"> address</div><div class="line"> address:address</div><div class="line"> address:+address</div><div class="line"> address/mask</div><div class="line"> an address can be any of:</div><div class="line"> NULLCMD=decimal number</div><div class="line"> 0Noctal number</div><div class="line"> 0xNhex number</div><div class="line"> N.N.N.Ndotted quad</div><div class="line"> hostname dns domain name</div><div class="line"> a mask is the number of bits set to one from the left</div></pre></td></tr></table></figure></p>
<p>用下面的命令进行点分十进制转十六进制处理:<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">netmask -x `cat iplist.txt` |cut -d/ -f1 |cut -dx -f2</div></pre></td></tr></table></figure></p>
<p>结果如下:<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><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></pre></td><td class="code"><pre><div class="line">042442b2</div><div class="line">0807c62d</div><div class="line">1759053c</div><div class="line">253d369e</div><div class="line">2e52ae44</div><div class="line">31027b38</div><div class="line">364c8701</div><div class="line">3b1803ad</div><div class="line">402158a1</div><div class="line">4021632f</div><div class="line">4042a3fb</div><div class="line">4168cafc</div><div class="line">41a0db71</div><div class="line">422dfced</div><div class="line">480ecd63</div><div class="line">480ecd68</div><div class="line">4a7d2766</div><div class="line">4a7d2771</div><div class="line">4a7d7f66</div><div class="line">4a7d9b66</div><div class="line">4d04075c</div><div class="line">4e10310f</div><div class="line">5d2e0859</div><div class="line">76053106</div><div class="line">80797e8b</div><div class="line">9f6a794b</div><div class="line">a9840d67</div><div class="line">bc050460</div><div class="line">bda31105</div><div class="line">c043c606</div><div class="line">c504040c</div><div class="line">ca6a0102</div><div class="line">cab50755</div><div class="line">cb620741</div><div class="line">cba1e6ab</div><div class="line">cf0c5862</div><div class="line">d0381f2b</div><div class="line">d1244921</div><div class="line">d155e58a</div><div class="line">d1913632</div><div class="line">d1dc1eae</div><div class="line">d35e4293</div><div class="line">d5a9fb23</div><div class="line">d8ddbcb6</div><div class="line">d8eab30d</div><div class="line">f3b9bb27</div><div class="line">f9812e30</div><div class="line">fd9d0ea5</div></pre></td></tr></table></figure></p>
<p>然后就直接用iptables匹配包含这些ip的dns包并进行丢弃:<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">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|042442b2|" --from 60 --to 180 -j DROP</div></pre></td></tr></table></figure></p>
<p>简单解释下,-m string表示启用string模块进行匹配,–algo bm表示启用贝叶(Boyer-Moore)字符串搜索算法,另一种算法是kmp(Knuth-Pratt-Morris),具体应该只是效率和不同应用的区别,算法原理我就不细究了。<br>–hex-string就是要匹配的IP地址的HEX格式了,注意这里前面不要有0x表示16进制了,直接写16进制数据就行,后面跟着的就是IP地址的16进制格式。<br>–from 60 –to 180都是表示搜索的偏置范围(offset),从第60 byte开始到180 byte结束,一般来说DNS返回包的长度很少有超过180字节,而IP值的位置因为协议格式的关系,基本上不可能出现在60字节之前,所以指定这个范围是足够的,同时也可以大大减轻搜索算法的运算压力。如果你担心有什么奇葩DNS返回的结果在这范围之外,删除这两个偏置选项就行了,这样会默认搜索整个字符串,但相应的搜索消耗的CPU资源就更多了。<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><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></pre></td><td class="code"><pre><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|042442b2|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|0807c62d|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|1759053c|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|253d369e|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|2e52ae44|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|31027b38|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|364c8701|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|3b1803ad|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|402158a1|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|4021632f|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|4042a3fb|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|4168cafc|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|41a0db71|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|422dfced|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|480ecd63|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|480ecd68|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|4a7d2766|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|4a7d2771|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|4a7d7f66|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|4a7d9b66|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|4d04075c|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|4e10310f|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|5d2e0859|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|76053106|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|80797e8b|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|9f6a794b|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|a9840d67|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|bc050460|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|bda31105|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|c043c606|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|c504040c|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|ca6a0102|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|cab50755|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|cb620741|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|cba1e6ab|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|cf0c5862|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|d0381f2b|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|d1244921|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|d155e58a|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|d1913632|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|d1dc1eae|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|d35e4293|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|d5a9fb23|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|d8ddbcb6|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|d8eab30d|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|f3b9bb27|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|f9812e30|" --from 60 --to 180 -j DROP</div><div class="line">iptables -t mangle -I PREROUTING -p udp --sport 53 -m string --algo bm --hex-string "|fd9d0ea5|" --from 60 --to 180 -j DROP</div></pre></td></tr></table></figure></p>
<p>每个IP分别写一条这样的规则,然后就用你自己熟悉的方式来处理这些iptables规则。</p>
<hr>
<p><strong>More~</strong><br>iptables过滤空包:<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">iptables -t mangle -I PREROUTING -p udp --sport 53 -m u32 --u32 "0&0x0F000000=0x05000000 && 0>>22&0x3C@8&0x810F=0x8000 && 0>>22&0x3C@12&0xFFFF=0x0000" -j DROP</div></pre></td></tr></table></figure></p>
<p>对关键部分解释下:<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">0>>22&0x3C@8&0x810F=0x8000</div></pre></td></tr></table></figure></p>
<p>“0>>22&0x3C”这部分是很常用的一个规则,你在别的地方也应该经常看到,表示取出IP报文头的长度,后面的@表示跳过这么多长度,也就是跳过IP头到UDP头部分。<br>8表示从第8个字节开始抓4个字节,其中第10个字节的第一位如果是1就表示这是一个响应包,0对应的是查询报,这个我们不用管;<br>第十个字节的最低位是RD位,劫持包的RD位是0;<br>第11个字节的低4位就是Reply Code的位置。<br>将这4个字节和0x810F做与操作就提出了响应标志位,RD位和Reply Code的值,判断出是一个RD=0,Reply Code为无错误的响应包,再继续和下面的规则匹配。<br>这三个条件缺一不可,尤其是对RD位的检查,这几乎是GFW劫持包最重要的特征。</p>
<hr>
<p>参考:</p>
<ul>
<li><a href="http://www.lifetyper.com/2014/06/anti-dns-poison-without-vpn.html" target="_blank" rel="external">无需VPN的OpenWRT DNS防污染方法</a></li>
<li><a href="https://github.com/clowwindy/ChinaDNS-C/blob/master/iplist.txt" target="_blank" rel="external">clowwindy/ChinaDNS-C/iplist.txt</a></li>
<li><a href="https://github.com/hackgfw/openwrt-gfw" target="_blank" rel="external">hackgfw/openwrt-gfw</a></li>
</ul>
]]></content>
<summary type="html">
<p><strong>GFW的DNS劫持原理</strong>说起来挺简单,GFW对境外DNS的劫持,是在发现你请求敏感域名的DNS记录时,伪装成你请求的DNS返回一个污染的数据包给你的解析器,但并不会丢弃你向境外DNS的请求,也不会丢弃境外DNS返回的正确解析结果,他只是让错误
</summary>
<category term="Network" scheme="http://zin.so/categories/Network/"/>
<category term="DNS" scheme="http://zin.so/tags/DNS/"/>
<category term="iptables" scheme="http://zin.so/tags/iptables/"/>
</entry>
<entry>
<title>在CentOS 7上安装OpenVPN Server</title>
<link href="http://zin.so/2014/08/21/how-to-install-openvpn-server-on-centos-7/"/>
<id>http://zin.so/2014/08/21/how-to-install-openvpn-server-on-centos-7/</id>
<published>2014-08-21T09:34:35.000Z</published>
<updated>2016-08-29T05:38:34.000Z</updated>
<content type="html"><![CDATA[<h2 id="安装openvpn"><a href="#安装openvpn" class="headerlink" title="安装openvpn"></a>安装openvpn</h2><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">yum install -y openssl openssl-devel lzo lzo-devel pam pam-devel</div><div class="line">yum install openvpn -y</div></pre></td></tr></table></figure>
<p>*注:yum安装的方式需要有epel源。</p>
<h2 id="安装easy-rsa"><a href="#安装easy-rsa" class="headerlink" title="安装easy-rsa"></a>安装easy-rsa</h2><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></pre></td><td class="code"><pre><div class="line">cd /etc/openvpn</div><div class="line">wget -c https://github.com/OpenVPN/easy-rsa/archive/master.zip</div><div class="line">unzip master.zip</div><div class="line">mv easy-rsa-master easy-rsa</div><div class="line">rm -f master.zip</div></pre></td></tr></table></figure>
<h2 id="初始化pki"><a href="#初始化pki" class="headerlink" title="初始化pki"></a>初始化pki</h2><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">cd /etc/openvpn/easy-rsa/easyrsa3</div><div class="line">./easyrsa init-pki</div><div class="line">./easyrsa build-ca nopass</div><div class="line">./easyrsa gen-req <EntityName> nopass</div><div class="line">./easyrsa sign-req client <EntityName></div><div class="line">./easyrsa gen-dh</div><div class="line">ln -s easy-rsa/easyrsa3/pki /etc/openvpn/pki</div><div class="line">openvpn --genkey --secret /etc/openvpn/pki/ta.key</div></pre></td></tr></table></figure>
<p>*注:easyrsa3的使用方法可以参考<a href="https://github.com/OpenVPN/easy-rsa/blob/master/README.quickstart.md" target="_blank" rel="external">这一篇easyrsa3官方文档</a></p>
<h2 id="配置server-conf"><a href="#配置server-conf" class="headerlink" title="配置server.conf"></a>配置server.conf</h2><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></pre></td><td class="code"><pre><div class="line">cd /etc/openvpn</div><div class="line">cp /usr/share/doc/openvpn-2.3.2/sample/sample-config-files/server.conf .</div><div class="line">vim server.conf</div><div class="line">### 修改下列几项</div><div class="line">ca pki/ca.crt</div><div class="line">cert pki/issued/server.crt</div><div class="line">key pki/private/server.key</div><div class="line">dh pki/dh.pem</div><div class="line">tls-auth pki/ta.key 0</div><div class="line">user nobody</div><div class="line">group nobody</div><div class="line">status /var/log/openvpn/openvpn-status.log</div><div class="line">log /var/log/openvpn/openvpn.log</div><div class="line">log-append /var/log/openvpn/openvpn.log</div><div class="line">### 修改完成</div><div class="line">mkdir /var/log/openvpn</div></pre></td></tr></table></figure>
<h2 id="配置openvpn-service"><a href="#配置openvpn-service" class="headerlink" title="配置openvpn.service"></a>配置openvpn.service</h2><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></pre></td><td class="code"><pre><div class="line">cd /usr/lib/systemd/system/</div><div class="line">mv openvpn@.service openvpn.service</div><div class="line">vim openvpn.service ### 修改pid和conf文件名称</div><div class="line">systemctl enable openvpn.service</div><div class="line">systemctl start openvpn</div></pre></td></tr></table></figure>
<h2 id="配置NAT转发"><a href="#配置NAT转发" class="headerlink" title="配置NAT转发"></a>配置NAT转发</h2><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></pre></td><td class="code"><pre><div class="line">echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf</div><div class="line">sysctl -p</div><div class="line">iptables -A INPUT -p UDP --dport 1194 -j ACCEPT</div><div class="line">iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE</div><div class="line">iptables-save > /etc/sysconfig/iptables</div></pre></td></tr></table></figure>
<h2 id="打包客户端配置文件"><a href="#打包客户端配置文件" class="headerlink" title="打包客户端配置文件"></a>打包客户端配置文件</h2><p>简单写了个打包脚本:<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><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></pre></td><td class="code"><pre><div class="line">#!/bin/bash</div><div class="line">if [ $# != 1 ];then</div><div class="line"> echo "Usage: $0 comName"</div><div class="line"> exit 1</div><div class="line">fi</div><div class="line">comName=$1</div><div class="line">pkiDir=/etc/openvpn/easy-rsa/easyrsa3/pki</div><div class="line">ca_crtFile=$pkiDir/ca.crt</div><div class="line">crtFile=$pkiDir/issued/$comName.crt</div><div class="line">keyFile=$pkiDir/private/$comName.key</div><div class="line">ta_keyFile=$pkiDir/ta.key</div><div class="line">mkdir ~/$comName\_vpn</div><div class="line">cp $ca_crtFile $crtFile $keyFile $ta_keyFile ~/$comName\_vpn</div><div class="line">cat > ~/$comName\_vpn/$comName.ovpn <<EOF</div><div class="line">client</div><div class="line">remote your.vpn.server</div><div class="line">proto udp</div><div class="line">dev tun</div><div class="line">ca ca.crt</div><div class="line">cert $comName.crt</div><div class="line">key $comName.key</div><div class="line">tls-auth ta.key 1</div><div class="line">comp-lzo</div><div class="line">nobind</div><div class="line">EOF</div><div class="line">cd</div><div class="line">tar czvf $comName\_vpn.tgz $comName\_vpn</div></pre></td></tr></table></figure></p>
<h2 id="连接测试"><a href="#连接测试" class="headerlink" title="连接测试"></a>连接测试</h2><p>客户端连接测试 & trouble shooting</p>
]]></content>
<summary type="html">
<h2 id="安装openvpn"><a href="#安装openvpn" class="headerlink" title="安装openvpn"></a>安装openvpn</h2><figure class="highlight plain"><table><tr><t
</summary>
<category term="Tools" scheme="http://zin.so/categories/Tools/"/>
<category term="VPN" scheme="http://zin.so/tags/VPN/"/>
<category term="NAT" scheme="http://zin.so/tags/NAT/"/>
<category term="OpenVPN" scheme="http://zin.so/tags/OpenVPN/"/>
<category term="CentOS 7" scheme="http://zin.so/tags/CentOS-7/"/>
</entry>
<entry>
<title>在Mac OSX上通过dd命令制作系统启动盘</title>
<link href="http://zin.so/2014/08/18/dd-an-os-startup-disk-on-mac-osx/"/>
<id>http://zin.so/2014/08/18/dd-an-os-startup-disk-on-mac-osx/</id>
<published>2014-08-18T09:21:42.000Z</published>
<updated>2016-08-29T05:38:34.000Z</updated>
<content type="html"><![CDATA[<h2 id="将iso转换成img文件"><a href="#将iso转换成img文件" class="headerlink" title="将iso转换成img文件"></a>将iso转换成img文件</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ hdiutil convert -format UDRW -o <outfile> <path_to_your_iso_file></div></pre></td></tr></table></figure>
<p>*注:该命令会将iso文件转换成dmg文件,而且Mac OSX会默认在“outfile”后面追加一个“.dmg”。</p>
<h2 id="查看U盘的盘符"><a href="#查看U盘的盘符" class="headerlink" title="查看U盘的盘符"></a>查看U盘的盘符</h2><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></pre></td><td class="code"><pre><div class="line">$ diskutil list</div><div class="line">/dev/disk0</div><div class="line"> #: TYPE NAME SIZE IDENTIFIER</div><div class="line"> 0: GUID_partition_scheme *251.0 GB disk0</div><div class="line"> 1: EFI EFI 209.7 MB disk0s1</div><div class="line"> 2: Apple_CoreStorage 250.1 GB disk0s2</div><div class="line"> 3: Apple_Boot Recovery HD 650.0 MB disk0s3</div><div class="line">/dev/disk1</div><div class="line"> #: TYPE NAME SIZE IDENTIFIER</div><div class="line"> 0: Apple_HFS MHD *248.4 GB disk1</div><div class="line"> Logical Volume on disk0s2</div><div class="line"> 04D26A4D-9A6E-448A-9017-8DA1804D4E93</div><div class="line"> Unencrypted</div><div class="line">/dev/disk2</div><div class="line"> #: TYPE NAME SIZE IDENTIFIER</div><div class="line"> 0: GUID_partition_scheme *7.9 GB disk2</div><div class="line"> 1: EFI EFI 209.7 MB disk2s1</div><div class="line"> 2: Apple_HFS Yosemite 7.6 GB disk2s2</div></pre></td></tr></table></figure>
<p>*注:该命令是查看当前系统上挂载的磁盘,其中/dev/disk2是我的U盘。不同的系统disk后面的数字可能不一样,但一般都是diskN的形式。</p>
<h2 id="卸载U盘"><a href="#卸载U盘" class="headerlink" title="卸载U盘"></a>卸载U盘</h2><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">$ diskutil unmountDisk /dev/disk2</div><div class="line">Unmount of all volumes on disk2 was successful</div></pre></td></tr></table></figure>
<p>*注:该命令是卸载U盘挂载的卷,使U盘处于空闲状态。</p>
<h2 id="将dmg镜像写入U盘"><a href="#将dmg镜像写入U盘" class="headerlink" title="将dmg镜像写入U盘"></a>将dmg镜像写入U盘</h2><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ sudo dd if=<outfile.dmg> of=/dev/rdisk2 bs=1m</div></pre></td></tr></table></figure>
<p>*注1:该命令将第一步生成的dmg文件写入到U盘/dev/rdisk2(注意不是/dev/disk2);<br>*注2:该命令需要sudo权限;<br>*注3:关于bs大小单位,BSD的dd要用小写“m、g”等,GNU的dd要用大写“M、G”等。</p>
<h2 id="弹出U盘"><a href="#弹出U盘" class="headerlink" title="弹出U盘"></a>弹出U盘</h2><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">$ diskutil eject /dev/disk2</div><div class="line">Disk /dev/disk2 ejected</div></pre></td></tr></table></figure>
]]></content>
<summary type="html">
<h2 id="将iso转换成img文件"><a href="#将iso转换成img文件" class="headerlink" title="将iso转换成img文件"></a>将iso转换成img文件</h2><figure class="highlight plain"><
</summary>
<category term="Shell" scheme="http://zin.so/categories/Shell/"/>
<category term="dd" scheme="http://zin.so/tags/dd/"/>
<category term="Mac OSX" scheme="http://zin.so/tags/Mac-OSX/"/>
</entry>
<entry>
<title>取模运算和求余运算的区别</title>
<link href="http://zin.so/2014/04/16/diff-mod-rem/"/>
<id>http://zin.so/2014/04/16/diff-mod-rem/</id>
<published>2014-04-16T04:46:59.000Z</published>
<updated>2016-08-29T05:38:34.000Z</updated>
<content type="html"><![CDATA[<p>通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用’%’符号表示取模或者求余运算。在这里要提醒大家要十分注意当前环境下’%’运算符的具体意义,因为在有负数存在的情况下,两者的结果是不一样的。</p>
<p>对于整型数a,b来说,取模运算或者求余运算的方法都是:</p>
<p><span style="color: #0000ff;"><strong>1、求 整数商:c = a/b</strong></span></p>
<p><span style="color: #0000ff;"><strong>2、计算模或者余数:r = a - c*b</strong></span></p>
<p>求模运算和求余运算在第一步不同: <strong><span style="color: #ff0000;">求余运算在取c的值时,向0方向舍入(fix()函数)</span></strong>;</p>
<p>而<strong><span style="color: #ff0000;">取模运算在计算c的值时,向无穷小方向舍入(floor()函数)</span></strong>。</p>
<p>因此,当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。但是当符号不一致的时候,结果不一样。</p>
<p>具体来说,求模运算结果的符号和b一致,求余运算结果的符号和a一致。</p>
<p>在C语言中,%符号表示的是求余运算,在python脚本中,%表示的是取模。(通常取模运算中b不允许是负数,但是在python里面可以在%后面跟负数,因为python语言中除法的结果是向无穷小方向舍入,因此计算结果是取模!)</p>
<p>下面表格是一些典型的取模或者求余的值。</p>
<table>
<thead>
<tr>
<th style="text-align:center">a</th>
<th style="text-align:center">b</th>
<th style="text-align:center">C语言:a%b(求余)</th>
<th style="text-align:center">Python Shell:a%b(取模)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center">-3</td>
<td style="text-align:center">-5</td>
<td style="text-align:center">-3</td>
<td style="text-align:center">-3</td>
</tr>
<tr>
<td style="text-align:center">-3</td>
<td style="text-align:center">4</td>
<td style="text-align:center">-3 = -3 – (0) * 4</td>
<td style="text-align:center">1 = -3 – (-1) * 4</td>
</tr>
<tr>
<td style="text-align:center">-3</td>
<td style="text-align:center">2</td>
<td style="text-align:center">-1 = -3 – (-1) * 2</td>
<td style="text-align:center">1 = -3 – (-2) * 2</td>
</tr>
<tr>
<td style="text-align:center">-1</td>
<td style="text-align:center">6</td>
<td style="text-align:center">-1 = -1 – (0) * 6</td>
<td style="text-align:center">5 = -1 – (-1) * 6</td>
</tr>
<tr>
<td style="text-align:center">-4</td>
<td style="text-align:center">-3</td>
<td style="text-align:center">-1</td>
<td style="text-align:center">-1</td>
</tr>
<tr>
<td style="text-align:center">2</td>
<td style="text-align:center">4</td>
<td style="text-align:center">2</td>
<td style="text-align:center">2</td>
</tr>
<tr>
<td style="text-align:center">5</td>
<td style="text-align:center">3</td>
<td style="text-align:center">2</td>
<td style="text-align:center">2</td>
</tr>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">-7</td>
<td style="text-align:center">4 = 4 – (0) * (-7)</td>
<td style="text-align:center">-3 = 4 – (-1) * (-7)</td>
</tr>
<tr>
<td style="text-align:center">4</td>
<td style="text-align:center">-3</td>
<td style="text-align:center">1 = 4 – (-1) * (-3)</td>
<td style="text-align:center">-2 = 4 – (-2) * (-3)</td>
</tr>
<tr>
<td style="text-align:center">-6</td>
<td style="text-align:center">-5</td>
<td style="text-align:center">-1</td>
<td style="text-align:center">-1</td>
</tr>
</tbody>
</table>
]]></content>
<summary type="html">
<p>通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用’%’符号表示取模或者求余运算。在这里要提醒大家要十分注意当前环境下’%’运算符的具体意义,因为在有负数存在的情况下,两者的结果是不一样的。</p>
<p>对于整型数a,b来说,取模运
</summary>
<category term="Code" scheme="http://zin.so/categories/Code/"/>
<category term="c" scheme="http://zin.so/tags/c/"/>
<category term="Python" scheme="http://zin.so/tags/Python/"/>
<category term="运算" scheme="http://zin.so/tags/%E8%BF%90%E7%AE%97/"/>
</entry>
<entry>
<title>WordPress通过unix socket连接MySQL</title>
<link href="http://zin.so/2014/04/09/using-mysql-socket-in-wordpress/"/>
<id>http://zin.so/2014/04/09/using-mysql-socket-in-wordpress/</id>
<published>2014-04-09T11:14:30.000Z</published>
<updated>2016-08-29T05:38:34.000Z</updated>
<content type="html"><![CDATA[<p>今天在自己server上(/tmp目录下)测试一些东西,测完以后,ls了一下,发现好多临时文件,然后强迫症犯了,手一抖给rm -rf ./* 掉了。删掉以后本blog就报连不上数据库的错了,发现是把 /tmp/mysql.sock 给干掉了。但是在/tmp下面放这么孤零零的一个文件难受呀(强迫症,伤不起),怎么办呢?</p>
<p>后面就去改my.cnf(mysql的配置文件)里面socket的路径,改完重启MySQL以后,发现WordPress还是连不上MySQL,但是socket文件确实已经在磁盘上换地方了。</p>
<p>开WordPress的debug模式(测试完成后记得关闭掉),<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">define('WP_DEBUG', true);</div></pre></td></tr></table></figure></p>
<p>发现WordPress还是去连原来的/tmp/mysql.sock,当然找不到文件了。</p>
<p>Google了下,发现可以直接在wp-config.php里面指定mysql-socket地址。<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">define('DB_HOST', ':/var/run/mysqld/mysqld.sock');</div></pre></td></tr></table></figure></p>
<p>直接指定了socket地址,刷新了下就恢复了。</p>
<hr>
<p>下面总结下WordPress通过unix socket连接MySQL的方法:</p>
<p>1、在my.cnf里面设置socket地址;<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">socket = /var/run/mysqld/mysqld.sock</div></pre></td></tr></table></figure></p>
<p>通过执行下面的SQL查询,你也可以看到当前MySQL的socket位置路径:<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">SHOW VARIABLES LIKE 'socket';</div></pre></td></tr></table></figure></p>
<p>2、在wp-config.php里面设置’DB_HOST’到’:/path/to/mysql.sock’(具体的socket文件路径),下面这几种写法都可以(注意’:’冒号就行);<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></pre></td><td class="code"><pre><div class="line">define('DB_HOST', ':/var/run/mysqld/mysqld.sock');</div><div class="line">define('DB_HOST', 'localhost:/var/run/mysqld/mysqld.sock');</div><div class="line">define('DB_HOST', '127.0.0.1:/var/run/mysqld/mysqld.sock');</div></pre></td></tr></table></figure></p>
<p>3、如果其他地方也不需要使用到3306端口,为了安全起见,可以直接在my.cnf里面禁用掉;<br><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">[mysqld]</div><div class="line">skip-networking</div></pre></td></tr></table></figure></p>
<p>保存,重启下MySQL,netstat -tlnp查看下端口,就会发现3306消失掉了。</p>
]]></content>
<summary type="html">
<p>今天在自己server上(/tmp目录下)测试一些东西,测完以后,ls了一下,发现好多临时文件,然后强迫症犯了,手一抖给rm -rf ./* 掉了。删掉以后本blog就报连不上数据库的错了,发现是把 /tmp/mysql.sock 给干掉了。但是在/tmp下面放这么孤零零的
</summary>
<category term="LNMP Stack" scheme="http://zin.so/categories/LNMP-Stack/"/>
<category term="MySQL" scheme="http://zin.so/tags/MySQL/"/>
</entry>
<entry>
<title>在CentOS6.5上安装HHVM3.0(解决依赖问题)</title>
<link href="http://zin.so/2014/03/25/install-hhvm/"/>
<id>http://zin.so/2014/03/25/install-hhvm/</id>
<published>2014-03-25T15:20:30.000Z</published>
<updated>2016-08-29T05:38:34.000Z</updated>
<content type="html"><![CDATA[<p>前几天(03月21日),Facebook 正式发布专门用于 HHVM 的编程语言 Hack,然后就突然想装个HHVM来跑我的blog玩一下,后面也确实开始折腾了。</p>
<p>03月22日晚上就试水了下,按GitHub上或者是HHVM官网上的教程来的,提示依赖的几个编译环境的版本太低了。然后就去折腾找更新的rpm啊(各种第三方repo,各种Google),发现了一个悲剧的现状:目前CentOS6下还木有现成的高版本的编译环境的rpm,然后那天晚上时间也不早了就放弃了。</p>
<p>03月25日晚上,就又突然想起这个事,然后就又搞起来了。</p>
<p>办法嘛只有1个:那就是用老的(低版本的)编译环境去编译一个新的(高版本的)编译环境。好像有点绕,就拿gcc举个例子,目前是用gcc 4.4.7编译了个gcc 4.8.2,这就是悲催的现实。</p>
<p>低版本的环境:<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">[root@ ~]# type gcc</div><div class="line">gcc is /usr/bin/gcc</div><div class="line">[root@ ~]# gcc -v</div><div class="line">使用内建 specs。</div><div class="line">目标:x86_64-redhat-linux</div><div class="line">配置为:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux</div><div class="line">线程模型:posix</div><div class="line">gcc 版本 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) </div><div class="line">[root@ ~]#</div></pre></td></tr></table></figure></p>
<p>编译完的高版本:<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">[root@ ~]# gcc -v</div><div class="line">使用内建 specs。</div><div class="line">COLLECT_GCC=gcc</div><div class="line">COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.8.2/lto-wrapper</div><div class="line">目标:x86_64-unknown-linux-gnu</div><div class="line">配置为:./configure --enable-checking=release --enable-languages=c,c++ --disable-multilib</div><div class="line">线程模型:posix</div><div class="line">gcc 版本 4.8.2 (GCC) </div><div class="line">[root@ ~]#</div></pre></td></tr></table></figure></p>
<p>上面只是把GCC 4.8.2编译安装了,后面还要替换下系统的链接库:/usr/lib64/libstdc++.so.6</p>
<p>旧版和新版GLIBC支持的对比:<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><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></pre></td><td class="code"><pre><div class="line">[root@ ~]# strings /usr/lib64/libstdc++.so.6.bak |grep GLIBC</div><div class="line">GLIBCXX_3.4</div><div class="line">GLIBCXX_3.4.1</div><div class="line">GLIBCXX_3.4.2</div><div class="line">GLIBCXX_3.4.3</div><div class="line">GLIBCXX_3.4.4</div><div class="line">GLIBCXX_3.4.5</div><div class="line">GLIBCXX_3.4.6</div><div class="line">GLIBCXX_3.4.7</div><div class="line">GLIBCXX_3.4.8</div><div class="line">GLIBCXX_3.4.9</div><div class="line">GLIBCXX_3.4.10</div><div class="line">GLIBCXX_3.4.11</div><div class="line">GLIBCXX_3.4.12</div><div class="line">GLIBCXX_3.4.13</div><div class="line">GLIBC_2.2.5</div><div class="line">GLIBC_2.3</div><div class="line">GLIBC_2.4</div><div class="line">GLIBC_2.3.2</div><div class="line">GLIBCXX_FORCE_NEW</div><div class="line">GLIBCXX_DEBUG_MESSAGE_LENGTH</div><div class="line">[root@ ~]# strings /usr/lib64/libstdc++.so.6 |grep GLIBC</div><div class="line">GLIBCXX_3.4</div><div class="line">GLIBCXX_3.4.1</div><div class="line">GLIBCXX_3.4.2</div><div class="line">GLIBCXX_3.4.3</div><div class="line">GLIBCXX_3.4.4</div><div class="line">GLIBCXX_3.4.5</div><div class="line">GLIBCXX_3.4.6</div><div class="line">GLIBCXX_3.4.7</div><div class="line">GLIBCXX_3.4.8</div><div class="line">GLIBCXX_3.4.9</div><div class="line">GLIBCXX_3.4.10</div><div class="line">GLIBCXX_3.4.11</div><div class="line">GLIBCXX_3.4.12</div><div class="line">GLIBCXX_3.4.13</div><div class="line">GLIBCXX_3.4.14</div><div class="line">GLIBCXX_3.4.15</div><div class="line">GLIBCXX_3.4.16</div><div class="line">GLIBCXX_3.4.17</div><div class="line">GLIBCXX_3.4.18</div><div class="line">GLIBCXX_3.4.19</div><div class="line">GLIBC_2.3</div><div class="line">GLIBC_2.2.5</div><div class="line">GLIBC_2.3.2</div><div class="line">GLIBCXX_FORCE_NEW</div><div class="line">GLIBCXX_DEBUG_MESSAGE_LENGTH</div><div class="line">[root@ ~]#</div></pre></td></tr></table></figure></p>
<p>03月26日,下面类似编译cmake等依赖环境。<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></pre></td><td class="code"><pre><div class="line">[root@ ~]# cmake --version</div><div class="line">cmake version 2.6-patch 4</div><div class="line">[root@ ~]# </div><div class="line">==></div><div class="line">[root@ ~]# cmake --version</div><div class="line">cmake version 2.8.12.2</div><div class="line">[root@ ~]#</div></pre></td></tr></table></figure></p>
<p>截止到03月26日21:44,终于把依赖的环境全编译好了。<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><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><div class="line">170</div><div class="line">171</div><div class="line">172</div><div class="line">173</div><div class="line">174</div><div class="line">175</div><div class="line">176</div><div class="line">177</div><div class="line">178</div><div class="line">179</div><div class="line">180</div><div class="line">181</div><div class="line">182</div><div class="line">183</div><div class="line">184</div><div class="line">185</div><div class="line">186</div><div class="line">187</div><div class="line">188</div><div class="line">189</div><div class="line">190</div><div class="line">191</div><div class="line">192</div><div class="line">193</div><div class="line">194</div><div class="line">195</div><div class="line">196</div><div class="line">197</div><div class="line">198</div><div class="line">199</div><div class="line">200</div><div class="line">201</div><div class="line">202</div><div class="line">203</div><div class="line">204</div><div class="line">205</div><div class="line">206</div><div class="line">207</div><div class="line">208</div><div class="line">209</div><div class="line">210</div><div class="line">211</div><div class="line">212</div><div class="line">213</div><div class="line">214</div><div class="line">215</div><div class="line">216</div><div class="line">217</div><div class="line">218</div><div class="line">219</div><div class="line">220</div><div class="line">221</div><div class="line">222</div><div class="line">223</div><div class="line">224</div><div class="line">225</div><div class="line">226</div><div class="line">227</div><div class="line">228</div><div class="line">229</div><div class="line">230</div><div class="line">231</div><div class="line">232</div><div class="line">233</div><div class="line">234</div><div class="line">235</div><div class="line">236</div><div class="line">237</div><div class="line">238</div><div class="line">239</div><div class="line">240</div><div class="line">241</div><div class="line">242</div><div class="line">243</div><div class="line">244</div><div class="line">245</div><div class="line">246</div><div class="line">247</div><div class="line">248</div><div class="line">249</div><div class="line">250</div><div class="line">251</div><div class="line">252</div></pre></td><td class="code"><pre><div class="line">[root@ hhvm]# cmake .</div><div class="line">Using HPHP_HOME == /root/hhvm_tmp/hhvm</div><div class="line">-- CMAKE_PREFIX_PATH was missing, proceeding anyway</div><div class="line">-- Boost version: 1.55.0</div><div class="line">-- Found the following Boost libraries:</div><div class="line">-- system</div><div class="line">-- program_options</div><div class="line">-- filesystem</div><div class="line">-- regex</div><div class="line">-- Found LibMagicWand: /usr/lib64/libMagickWand.so </div><div class="line">-- MySQL Include dir: /usr/include/mysql library dir: /usr/lib64/mysql</div><div class="line">-- MySQL client libraries: mysqlclient_r</div><div class="line">-- Found PCRE: /usr/lib64/libpcre.so </div><div class="line">-- Found libevent: /usr/lib64/libevent.so</div><div class="line">-- Looking for evhttp_bind_socket_with_fd</div><div class="line">-- Looking for evhttp_bind_socket_with_fd - not found</div><div class="line">-- Could NOT find LibUODBC (missing: LIBODBC_LIBRARIES LIBODBC_INCLUDE_DIRS) </div><div class="line">-- Found LibJpeg: /usr/lib64/libjpeg.so </div><div class="line">-- Found LibPng: /usr/lib64/libpng.so </div><div class="line">-- Found PkgConfig: /usr/bin/pkg-config (found version "0.23") </div><div class="line">-- Found Freetype: /usr/lib64/libfreetype.so </div><div class="line">-- Found CURL: /usr/lib64/libcurl.so (found version "7.37.0-DEV") </div><div class="line">-- Looking for curl_multi_select</div><div class="line">-- Looking for curl_multi_select - not found</div><div class="line">-- Looking for curl_multi_wait</div><div class="line">-- Looking for curl_multi_wait - not found</div><div class="line">-- Found LibXml2: /usr/lib64/libxml2.so (found version "2.7.6") </div><div class="line">-- Found LibXslt: /usr/lib64/libxslt.so (found version "1.1.26") </div><div class="line">-- Found EXPAT: /usr/lib64/libexpat.so (found version "2.0.1") </div><div class="line">-- Found ICU header files in /usr/include</div><div class="line">-- Found ICU libraries: /usr/lib64/libicuuc.so</div><div class="line">-- Performing Test JEMALLOC_VERSION_3</div><div class="line">-- Performing Test JEMALLOC_VERSION_3 - Success</div><div class="line">-- Found jemalloc: /usr/lib64/libjemalloc.so</div><div class="line">-- Found Intel TBB</div><div class="line">-- Found mcrypt: /usr/lib64/libmcrypt.so</div><div class="line">-- Found OpenSSL: /usr/lib64/libssl.so;/usr/lib64/libcrypto.so (found version "1.0.1e") </div><div class="line">-- Found ZLIB: /usr/lib64/libz.so (found version "1.2.3") </div><div class="line">-- Found BZip2: /usr/lib64/libbz2.so (found version "1.0.5") </div><div class="line">-- Looking for BZ2_bzCompressInit in /usr/lib64/libbz2.so</div><div class="line">-- Looking for BZ2_bzCompressInit in /usr/lib64/libbz2.so - found</div><div class="line">-- Found ONIGURUMA: /usr/lib64/libonig.so </div><div class="line">-- Found ldap: /usr/lib64/libldap.so;/usr/lib64/liblber.so</div><div class="line">-- Found LIBPTHREAD: /usr/lib64/libpthread.so </div><div class="line">-- Found Readline: /usr/include </div><div class="line">-- Could NOT find Editline (missing: EDITLINE_LIBRARIES EDITLINE_INCLUDE_DIRS) </div><div class="line">-- Found LibElf: /usr/lib64/libelf.so </div><div class="line">-- Performing Test ELF_GETSHDRSTRNDX</div><div class="line">-- Performing Test ELF_GETSHDRSTRNDX - Success</div><div class="line">-- Found LibDwarf: /usr/lib64/libdwarf.so </div><div class="line">-- Looking for dwarf_encode_leb128</div><div class="line">-- Looking for dwarf_encode_leb128 - found</div><div class="line">Generating Release build</div><div class="line">-- Performing Test FOLLY_IFUNC</div><div class="line">-- Performing Test FOLLY_IFUNC - Failed</div><div class="line">-- Looking for clock_gettime</div><div class="line">-- Looking for clock_gettime - found</div><div class="line">-- Looking for arpa/inet.h</div><div class="line">-- Looking for arpa/inet.h - found</div><div class="line">-- Looking for netinet/in.h</div><div class="line">-- Looking for netinet/in.h - found</div><div class="line">-- Looking for stddef.h</div><div class="line">-- Looking for stddef.h - found</div><div class="line">-- Looking for stdint.h</div><div class="line">-- Looking for stdint.h - found</div><div class="line">-- Looking for string.h</div><div class="line">-- Looking for string.h - found</div><div class="line">-- Looking for sys/socket.h</div><div class="line">-- Looking for sys/socket.h - found</div><div class="line">-- Looking for sys/time.h</div><div class="line">-- Looking for sys/time.h - found</div><div class="line">-- Looking for unistd.h</div><div class="line">-- Looking for unistd.h - found</div><div class="line">-- Looking for sys/types.h</div><div class="line">-- Looking for sys/types.h - found</div><div class="line">-- Looking for stdint.h</div><div class="line">-- Looking for stdint.h - found</div><div class="line">-- Looking for stddef.h</div><div class="line">-- Looking for stddef.h - found</div><div class="line">-- Check size of size_t</div><div class="line">-- Check size of size_t - done</div><div class="line">-- Check size of ssize_t</div><div class="line">-- Check size of ssize_t - done</div><div class="line">-- Check size of uint32_t</div><div class="line">-- Check size of uint32_t - done</div><div class="line">-- Check size of uint8_t</div><div class="line">-- Check size of uint8_t - done</div><div class="line">-- Looking for AF_LOCAL</div><div class="line">-- Looking for AF_LOCAL - found</div><div class="line">-- Looking for PF_LOCAL</div><div class="line">-- Looking for PF_LOCAL - found</div><div class="line">-- Looking for memset</div><div class="line">-- Looking for memset - found</div><div class="line">-- Looking for socket</div><div class="line">-- Looking for socket - found</div><div class="line">-- Looking for strerror</div><div class="line">-- Looking for strerror - found</div><div class="line">-- Found libevent: /usr/lib64/libevent.so</div><div class="line">-- Looking for event_get_version_number</div><div class="line">-- Looking for event_get_version_number - not found</div><div class="line">-- Performing Test HAVE_LIBEVENT_145</div><div class="line">-- Performing Test HAVE_LIBEVENT_145 - Success</div><div class="line">-- Found libevent 1.4.5+</div><div class="line">-- Looking for include file stdlib.h</div><div class="line">-- Looking for include file stdlib.h - found</div><div class="line">-- Looking for include file assert.h</div><div class="line">-- Looking for include file assert.h - found</div><div class="line">-- Looking for strcasecmp</div><div class="line">-- Looking for strcasecmp - found</div><div class="line">-- Looking for strchr</div><div class="line">-- Looking for strchr - found</div><div class="line">-- Looking for include file sys/stat.h</div><div class="line">-- Looking for include file sys/stat.h - found</div><div class="line">-- Looking for include file stdlib.h</div><div class="line">-- Looking for include file stdlib.h - found</div><div class="line">-- Looking for include file string.h</div><div class="line">-- Looking for include file string.h - found</div><div class="line">-- Looking for include file memory.h</div><div class="line">-- Looking for include file memory.h - found</div><div class="line">-- Looking for include file strings.h</div><div class="line">-- Looking for include file strings.h - found</div><div class="line">-- Looking for include file inttypes.h</div><div class="line">-- Looking for include file inttypes.h - found</div><div class="line">-- Looking for include file unistd.h</div><div class="line">-- Looking for include file unistd.h - found</div><div class="line">-- Looking for include file dlfcn.h</div><div class="line">-- Looking for include file dlfcn.h - found</div><div class="line">-- Looking for fdatasync</div><div class="line">-- Looking for fdatasync - found</div><div class="line">-- Looking for usleep</div><div class="line">-- Looking for usleep - found</div><div class="line">-- Looking for fullfsync</div><div class="line">-- Looking for fullfsync - not found</div><div class="line">-- Looking for localtime_r</div><div class="line">-- Looking for localtime_r - found</div><div class="line">-- Looking for gmtime_r</div><div class="line">-- Looking for gmtime_r - found</div><div class="line">-- Looking for pthread_create in pthread</div><div class="line">-- Looking for pthread_create in pthread - found</div><div class="line">-- Check if the system is big endian</div><div class="line">-- Searching 16 bit integer</div><div class="line">-- Check size of unsigned short</div><div class="line">-- Check size of unsigned short - done</div><div class="line">-- Using unsigned short</div><div class="line">-- Check if the system is big endian - little endian</div><div class="line">-- Looking for include file locale.h</div><div class="line">-- Looking for include file locale.h - found</div><div class="line">-- Looking for include file limits.h</div><div class="line">-- Looking for include file limits.h - found</div><div class="line">-- Check size of int32_t</div><div class="line">-- Check size of int32_t - done</div><div class="line">-- Looking for strtoll</div><div class="line">-- Looking for strtoll - found</div><div class="line">-- Looking for atoll</div><div class="line">-- Looking for atoll - found</div><div class="line">-- Looking for strftime</div><div class="line">-- Looking for strftime - found</div><div class="line">-- Looking for setlocale</div><div class="line">-- Looking for setlocale - found</div><div class="line">-- Boost version: 1.55.0</div><div class="line">-- Found the following Boost libraries:</div><div class="line">-- system</div><div class="line">-- program_options</div><div class="line">-- filesystem</div><div class="line">-- regex</div><div class="line">-- Looking for _close</div><div class="line">-- Looking for _close - not found</div><div class="line">-- Looking for _dup</div><div class="line">-- Looking for _dup - not found</div><div class="line">-- Looking for _fdopen</div><div class="line">-- Looking for _fdopen - not found</div><div class="line">-- Looking for _fileno</div><div class="line">-- Looking for _fileno - not found</div><div class="line">-- Looking for _open</div><div class="line">-- Looking for _open - not found</div><div class="line">-- Looking for _snprintf</div><div class="line">-- Looking for _snprintf - not found</div><div class="line">-- Looking for _strdup</div><div class="line">-- Looking for _strdup - not found</div><div class="line">-- Looking for _stricmp</div><div class="line">-- Looking for _stricmp - not found</div><div class="line">-- Looking for fseeko</div><div class="line">-- Looking for fseeko - found</div><div class="line">-- Looking for ftello</div><div class="line">-- Looking for ftello - found</div><div class="line">-- Looking for open</div><div class="line">-- Looking for open - found</div><div class="line">-- Looking for mkstemp</div><div class="line">-- Looking for mkstemp - found</div><div class="line">-- Looking for snprintf</div><div class="line">-- Looking for snprintf - found</div><div class="line">-- Looking for strdup</div><div class="line">-- Looking for strdup - found</div><div class="line">-- Looking for MoveFileExA</div><div class="line">-- Looking for MoveFileExA - not found</div><div class="line">-- Looking for include file sys/types.h</div><div class="line">-- Looking for include file sys/types.h - found</div><div class="line">-- Looking for include file inttypes.h</div><div class="line">-- Looking for include file inttypes.h - found</div><div class="line">-- Looking for include file stdint.h</div><div class="line">-- Looking for include file stdint.h - found</div><div class="line">-- Check size of __int8</div><div class="line">-- Check size of __int8 - failed</div><div class="line">-- Check size of int8_t</div><div class="line">-- Check size of int8_t - done</div><div class="line">-- Check size of uint8_t</div><div class="line">-- Check size of uint8_t - done</div><div class="line">-- Check size of __int16</div><div class="line">-- Check size of __int16 - failed</div><div class="line">-- Check size of int16_t</div><div class="line">-- Check size of int16_t - done</div><div class="line">-- Check size of uint16_t</div><div class="line">-- Check size of uint16_t - done</div><div class="line">-- Check size of __int32</div><div class="line">-- Check size of __int32 - failed</div><div class="line">-- Check size of int32_t</div><div class="line">-- Check size of int32_t - done</div><div class="line">-- Check size of uint32_t</div><div class="line">-- Check size of uint32_t - done</div><div class="line">-- Check size of __int64</div><div class="line">-- Check size of __int64 - failed</div><div class="line">-- Check size of int64_t</div><div class="line">-- Check size of int64_t - done</div><div class="line">-- Check size of uint64_t</div><div class="line">-- Check size of uint64_t - done</div><div class="line">-- Check size of short</div><div class="line">-- Check size of short - done</div><div class="line">-- Check size of int</div><div class="line">-- Check size of int - done</div><div class="line">-- Check size of long</div><div class="line">-- Check size of long - done</div><div class="line">-- Check size of long long</div><div class="line">-- Check size of long long - done</div><div class="line">-- Check size of off_t</div><div class="line">-- Check size of off_t - done</div><div class="line">-- Check size of size_t</div><div class="line">-- Check size of size_t - done</div><div class="line">-- Check size of ssize_t</div><div class="line">-- Check size of ssize_t - done</div><div class="line">-- Boost version: 1.55.0</div><div class="line">-- Found the following Boost libraries:</div><div class="line">-- thread</div><div class="line">-- system</div><div class="line">-- Boost version: 1.55.0</div><div class="line">-- Found the following Boost libraries:</div><div class="line">-- thread</div><div class="line">-- system</div><div class="line">-- OCaml not found, will not build Hack typechecker</div><div class="line">-- Configuring done</div><div class="line">-- Generating done</div><div class="line">-- Build files have been written to: /root/hhvm_tmp/hhvm</div><div class="line">[root@ hhvm]#</div></pre></td></tr></table></figure></p>
<p>下一步就是跑HHVM的make。</p>
<p>03月27日21:30</p>
<p>我去,HHVM的编译卡在imagick了:<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><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></pre></td><td class="code"><pre><div class="line">[ 51%] Building CXX object hphp/runtime/CMakeFiles/hphp_runtime_static.dir/ext/imagick/ext_imagick.cpp.o</div><div class="line">[ 51%] Building CXX object hphp/runtime/CMakeFiles/hphp_runtime_static.dir/ext/imagick/constants.cpp.o</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp: 在函数‘void HPHP::loadImagickConstants()’中:</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:760:52: 错误:‘ModulusAddCompositeOp’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_COMPOSITE_MODULUSADD, ModulusAddCompositeOp);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:762:28: 错误:‘ModulusSubtractCompositeOp’在此作用域中尚未声明</div><div class="line"> ModulusSubtractCompositeOp);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:809:43: 错误:‘JincFilter’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_FILTER_JINC, JincFilter);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:810:47: 错误:‘SincFastFilter’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_FILTER_SINCFAST, SincFastFilter);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:811:47: 错误:‘RobidouxFilter’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_FILTER_ROBIDOUX, RobidouxFilter);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:812:51: 错误:‘LanczosSharpFilter’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_FILTER_LANCZOSSHARP, LanczosSharpFilter);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:813:47: 错误:‘Lanczos2Filter’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_FILTER_LANCZOS2, Lanczos2Filter);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:814:52: 错误:‘Lanczos2SharpFilter’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_FILTER_LANCZOS2SHARP, Lanczos2SharpFilter);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:864:48: 错误:‘ZipSCompression’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_COMPRESSION_ZIPS, ZipSCompression);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:865:47: 错误:‘PizCompression’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_COMPRESSION_PIZ, PizCompression);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:866:49: 错误:‘Pxr24Compression’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_COMPRESSION_PXR24, Pxr24Compression);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:867:47: 错误:‘B44Compression’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_COMPRESSION_B44, B44Compression);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:868:48: 错误:‘B44ACompression’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_COMPRESSION_B44A, B44ACompression);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:869:48: 错误:‘LZMACompression’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_COMPRESSION_LZMA, LZMACompression);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:944:44: 错误:‘SyncChannels’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_CHANNEL_SYNC, SyncChannels);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:1006:45: 错误:‘MeanEvaluateOperator’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_EVALUATE_MEAN, MeanEvaluateOperator);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:1007:44: 错误:‘AbsEvaluateOperator’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_EVALUATE_ABS, AbsEvaluateOperator);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:1009:28: 错误:‘ExponentialEvaluateOperator’在此作用域中尚未声明</div><div class="line"> ExponentialEvaluateOperator);</div><div class="line"> ^</div><div class="line">/root/hhvm/hphp/runtime/ext/imagick/constants.cpp:1010:47: 错误:‘MedianEvaluateOperator’在此作用域中尚未声明</div><div class="line"> registerImagickConstants(s_EVALUATE_MEDIAN, MedianEvaluateOperator);</div><div class="line"> ^</div><div class="line">make[2]: *** [hphp/runtime/CMakeFiles/hphp_runtime_static.dir/ext/imagick/constants.cpp.o] 错误 1</div><div class="line">make[1]: *** [hphp/runtime/CMakeFiles/hphp_runtime_static.dir/all] 错误 2</div><div class="line">make: *** [all] 错误 2</div><div class="line">➜</div></pre></td></tr></table></figure></p>
<p>靠,果然是被yum默认装的ImageMagick-devel给坑了:<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><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">IMAGEMAGICK_BINARY_PATH:PATH=/usr/bin</div><div class="line">IMAGEMAGICK_COMPOSITE_EXECUTABLE:FILEPATH=/usr/bin/composite</div><div class="line">IMAGEMAGICK_CONVERT_EXECUTABLE:FILEPATH=/usr/bin/convert</div><div class="line">IMAGEMAGICK_IMPORT_EXECUTABLE:FILEPATH=/usr/bin/import</div><div class="line">IMAGEMAGICK_MOGRIFY_EXECUTABLE:FILEPATH=/usr/bin/mogrify</div><div class="line">IMAGEMAGICK_MONTAGE_EXECUTABLE:FILEPATH=/usr/bin/montage</div><div class="line">ImageMagick_EXECUTABLE_DIR:PATH=/usr/bin</div><div class="line">ImageMagick_MagickCore_INCLUDE_DIR:PATH=/usr/include/ImageMagick</div><div class="line">ImageMagick_MagickCore_LIBRARY:FILEPATH=/usr/lib64/libMagickCore.so</div><div class="line">ImageMagick_MagickWand_INCLUDE_DIR:PATH=/usr/include/ImageMagick</div><div class="line">ImageMagick_MagickWand_LIBRARY:FILEPATH=/usr/lib64/libMagickWand.so</div></pre></td></tr></table></figure></p>
<p>怒删之。</p>
<p>03月29日凌晨01:08</p>
<p>终于在CentOS 6.5上把HHVM3.0编译出来了,来回折腾了小7个晚上。</p>
<p>(各种环境版本问题,还有”/usr/lib64”和”/usr/lib”的问题等等,坑死~)<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><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></pre></td><td class="code"><pre><div class="line">[ 93%] Building CXX object hphp/runtime/ext_hhvm/CMakeFiles/ext_hhvm_static.dir/ext_hhvm_infotabs.cpp.o</div><div class="line">Linking CXX static library libext_hhvm.a</div><div class="line">[ 93%] Built target ext_hhvm_static</div><div class="line">[ 97%] Built target hphp_util</div><div class="line">[ 98%] Built target vixl</div><div class="line">[ 98%] Built target hphp_zend</div><div class="line">[ 98%] Generating systemlib.php</div><div class="line">[ 98%] Built target systemlib</div><div class="line">Scanning dependencies of target hhvm</div><div class="line">[ 98%] Building CXX object hphp/hhvm/CMakeFiles/hhvm.dir/main.cpp.o</div><div class="line">[ 99%] Building CXX object hphp/hhvm/CMakeFiles/hhvm.dir/process-init.cpp.o</div><div class="line">[ 99%] Building CXX object hphp/hhvm/CMakeFiles/hhvm.dir/global-variables.cpp.o</div><div class="line">Linking CXX executable hhvm</div><div class="line">Embedding php in hhvm</div><div class="line">[ 99%] Built target hhvm</div><div class="line">Scanning dependencies of target test</div><div class="line">[ 99%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_ext_memcached.cpp.o</div><div class="line">[ 99%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/main.cpp.o</div><div class="line">[ 99%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_util.cpp.o</div><div class="line">[ 99%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_logger.cpp.o</div><div class="line">[ 99%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_base.cpp.o</div><div class="line">[ 99%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_parser.cpp.o</div><div class="line">[ 99%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_server.cpp.o</div><div class="line">[ 99%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_parser_stmt.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_code_error.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_all.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_ext_server.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_cpp_base.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_fastcgi.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_ext_apc.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_parser_expr.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_ext_mysql.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_fastcgi_protocol.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_code_run.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/ext/test_cpp_ext.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/__/hhvm/process-init.cpp.o</div><div class="line">[100%] Building CXX object hphp/test/CMakeFiles/test.dir/__/hhvm/global-variables.cpp.o</div><div class="line">Linking CXX executable test</div><div class="line">Embedding php in test</div><div class="line">[100%] Built target test</div><div class="line">➜ hhvm git:(HHVM-3.0) ✗</div></pre></td></tr></table></figure></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><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></pre></td><td class="code"><pre><div class="line">➜ hhvm git:(HHVM-3.0) ✗ make install</div><div class="line">[ 2%] Built target folly</div><div class="line">[ 2%] Built target double-conversion</div><div class="line">[ 3%] Built target gen-class-map</div><div class="line">[ 3%] Built target gen-ext-hhvm</div><div class="line">[ 3%] Built target gen-infotabs</div><div class="line">[ 3%] Built target afdt</div><div class="line">[ 8%] Built target mbfl</div><div class="line">[ 8%] Built target sqlite3</div><div class="line">[ 9%] Built target timelib</div><div class="line">[ 9%] Built target lz4</div><div class="line">[ 15%] Built target zip_shared</div><div class="line">[ 21%] Built target zip_static</div><div class="line">[ 23%] Built target hphp_thrift</div><div class="line">[ 23%] Built target hphp_proxygen</div><div class="line">[ 23%] Built target hphp_system</div><div class="line">[ 23%] Built target hphp_parser</div><div class="line">[ 30%] Built target hphp_analysis</div><div class="line">[ 32%] Built target hphp_hhbbc</div><div class="line">[ 33%] Built target neo</div><div class="line">[ 68%] Built target hphp_runtime_static</div><div class="line">[ 96%] Built target ext_hhvm_static</div><div class="line">[100%] Built target hphp_util</div><div class="line">[100%] Built target vixl</div><div class="line">[100%] Built target hphp_zend</div><div class="line">[100%] Generating systemlib.php</div><div class="line">[100%] Built target systemlib</div><div class="line">Linking CXX executable hhvm</div><div class="line">Embedding php in hhvm</div><div class="line">[100%] Built target hhvm</div><div class="line">Install the project...</div><div class="line">-- Install configuration: ""</div><div class="line">-- Installing: /usr/lib/libzip.a</div><div class="line">-- Installing: /usr/lib/libzip.so</div><div class="line">-- Removed runtime path from "/usr/lib/libzip.so"</div><div class="line">-- Installing: /usr/include/zipconf.h</div><div class="line">-- Installing: /usr/include/zip.h</div><div class="line">-- Installing: /usr/bin/hhvm</div><div class="line">-- Installing: /usr/bin/hphpize</div><div class="line">➜ hhvm git:(HHVM-3.0) ✗</div></pre></td></tr></table></figure>
<p>来,下面就是HHVM的测试了。</p>
<p>首先看下–version和–help<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><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></pre></td><td class="code"><pre><div class="line">➜ ~ hhvm --version</div><div class="line">HipHop VM 3.0.1 (rel)</div><div class="line">Compiler: tags/HHVM-3.0.1-0-g1da451b79f40686de6472d23cf90fdd09fa4dc23</div><div class="line">Repo schema: 11f0d546efba889ced1f9b92d9c9249f494d0b84</div><div class="line">➜ ~ hhvm --help</div><div class="line">Usage:</div><div class="line"> hhvm [-m <mode>] [<options>] [<arg1>] [<arg2>] ...</div><div class="line">Options:</div><div class="line"> --help display this message</div><div class="line"> --version display version number</div><div class="line"> --php emulate the standard php command line</div><div class="line"> --compiler-id display the git hash for the compiler</div><div class="line"> --repo-schema display the repository schema id</div><div class="line"> -m [ --mode ] arg (=run) run | debug (d) | server (s) | daemon |</div><div class="line"> replay | translate (t)</div><div class="line"> -a [ --interactive ] Shortcut for --mode debug</div><div class="line"> -c [ --config ] arg load specified config file</div><div class="line"> -v [ --config-value ] arg individual configuration string in a </div><div class="line"> format of name=value, where name can be</div><div class="line"> any valid configuration for a config </div><div class="line"> file</div><div class="line"> -p [ --port ] arg (=-1) start an HTTP server at specified port</div><div class="line"> --port-fd arg (=-1) use specified fd instead of creating a </div><div class="line"> socket</div><div class="line"> --ssl-port-fd arg (=-1) use specified fd for SSL instead of </div><div class="line"> creating a socket</div><div class="line"> --admin-port arg (=-1) start admin listener at specified port</div><div class="line"> --debug-config arg load specified debugger config file</div><div class="line"> -h [ --debug-host ] [=arg(=localhost)]</div><div class="line"> connect to debugger server at specified</div><div class="line"> address</div><div class="line"> --debug-port arg (=-1) connect to debugger server at specified</div><div class="line"> port</div><div class="line"> --debug-extension arg PHP file that extends y command</div><div class="line"> --debug-cmd arg executes this debugger command and </div><div class="line"> returns its output in stdout</div><div class="line"> --debug-sandbox arg (=default) initial sandbox to attach to when </div><div class="line"> debugger is started</div><div class="line"> -u [ --user ] arg run server under this user account</div><div class="line"> -f [ --file ] arg executing specified file</div><div class="line"> -l [ --lint ] arg lint specified file</div><div class="line"> -w [ --show ] arg output specified file and do nothing </div><div class="line"> else</div><div class="line"> --temp-file file specified is temporary and removed</div><div class="line"> after execution</div><div class="line"> --count arg (=1) how many times to repeat execution</div><div class="line"> --no-safe-access-check arg (=0) whether to ignore safe file access </div><div class="line"> check</div><div class="line"> --arg arg arguments</div><div class="line"> --extra-header arg extra-header to add to log lines</div><div class="line"> --build-id arg unique identifier of compiled server </div><div class="line"> code</div><div class="line"> --instance-id arg unique identifier of server instance</div><div class="line"> --xhprof-flags arg (=0) Set XHProf flags</div><div class="line">➜ ~</div></pre></td></tr></table></figure></p>
<p>1、CPU密集型测试<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><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></pre></td><td class="code"><pre><div class="line">➜ hhvm_test cat t1.php </div><div class="line"><?php</div><div class="line">function fib($n)</div><div class="line">{</div><div class="line"> if ($n <= 2)</div><div class="line"> return 1;</div><div class="line"> else</div><div class="line"> return fib($n-1) + fib($n-2);</div><div class="line">}</div><div class="line">$n = 36;</div><div class="line">printf("fib(%d) = %d\n", $n, fib($n, 2));</div><div class="line">?></div><div class="line">➜ hhvm_test time php t1.php </div><div class="line">fib(36) = 14930352</div><div class="line">php t1.php 10.04s user 0.02s system 99% cpu 10.072 total</div><div class="line">➜ hhvm_test time hhvm t1.php </div><div class="line">fib(36) = 14930352</div><div class="line">hhvm t1.php 0.52s user 0.12s system 52% cpu 1.226 total</div><div class="line">➜ hhvm_test</div></pre></td></tr></table></figure></p>
<p>2、内存密集型测试<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><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></pre></td><td class="code"><pre><div class="line">➜ hhvm_test cat t2.php </div><div class="line"><?php</div><div class="line">ini_set('memory_limit','1024M');</div><div class="line">$arr = array();</div><div class="line">for($i = 0; $i < 2000000 ; $i++) {</div><div class="line"> $arr[$i] = $i; </div><div class="line">}</div><div class="line">$arr2 = array();</div><div class="line">foreach($arr as $val){</div><div class="line"> $arr2[] = $val . $val;</div><div class="line">}</div><div class="line">?></div><div class="line">➜ hhvm_test time php t2.php </div><div class="line">php t2.php 2.29s user 1.13s system 99% cpu 3.427 total</div><div class="line">➜ hhvm_test time hhvm t2.php </div><div class="line">hhvm t2.php 1.60s user 0.73s system 79% cpu 2.934 total</div><div class="line">➜ hhvm_test</div></pre></td></tr></table></figure></p>
<p>从上面2个测试可以看出,CPU的消耗明显减少。</p>
<hr>
<p>最后,这边安装HHVM的目的就是想要用HHVM来跑WordPress(nginx -> fastcgi -> hhvm),按照官方的教程(<a href="https://github.com/facebook/hhvm/wiki/fastcgi)来配置了FastCGI" target="_blank" rel="external">https://github.com/facebook/hhvm/wiki/fastcgi)来配置了FastCGI</a> ,但是因为本blog是跑在ssl/(https)上的,测试下来有证书问题。</p>
<p>正在研究HHVM SSL证书问题。</p>
<p>(未完待续)</p>
]]></content>
<summary type="html">
<p>前几天(03月21日),Facebook 正式发布专门用于 HHVM 的编程语言 Hack,然后就突然想装个HHVM来跑我的blog玩一下,后面也确实开始折腾了。</p>
<p>03月22日晚上就试水了下,按GitHub上或者是HHVM官网上的教程来的,提示依赖的几个编译环
</summary>
<category term="LNMP Stack" scheme="http://zin.so/categories/LNMP-Stack/"/>
<category term="HHVM" scheme="http://zin.so/tags/HHVM/"/>
</entry>
<entry>
<title>本blog上的Drawing特效</title>
<link href="http://zin.so/2014/03/25/drawing/"/>
<id>http://zin.so/2014/03/25/drawing/</id>
<published>2014-03-25T09:24:40.000Z</published>
<updated>2016-08-29T05:38:34.000Z</updated>
<content type="html"><![CDATA[<p>用本篇文章来发布研究drawing.js的一些log</p>
<p>PS:其实这个js是以前从Sivan的blog( <a href="http://lightcss.com/" target="_blank" rel="external">http://lightcss.com/</a> )上“偷”来的。</p>
<p>源码GitHub地址:<a href="https://github.com/Zinway-Liu/drawing" title="Drawing" target="_blank" rel="external">https://github.com/Zinway-Liu/drawing</a></p>
<p> </p>
]]></content>
<summary type="html">
<p>用本篇文章来发布研究drawing.js的一些log</p>
<p>PS:其实这个js是以前从Sivan的blog( <a href="http://lightcss.com/" target="_blank" rel="external">http://lightcss.
</summary>
<category term="JavaScript" scheme="http://zin.so/categories/JavaScript/"/>
<category term="js" scheme="http://zin.so/tags/js/"/>
</entry>
<entry>
<title>首页refresh重定向</title>
<link href="http://zin.so/2014/03/19/meta-refresh/"/>
<id>http://zin.so/2014/03/19/meta-refresh/</id>
<published>2014-03-19T06:20:32.000Z</published>
<updated>2016-08-29T05:38:34.000Z</updated>
<content type="html"><![CDATA[<p>昨天评估了半天,想用前端的方式来实现类似nginx rewrite这样一个重定向的效果,主要是想80重定向到443。<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></pre></td><td class="code"><pre><div class="line">server {</div><div class="line"> listen 80;</div><div class="line"> server_name zinway.me;</div><div class="line"> rewrite ^(.\*) https://$server_name$1 permanent;</div><div class="line">}</div></pre></td></tr></table></figure></p>
<p>看到“baidu.com”首页有这样一个通过meta refresh的方式来重定向到“www.baidu.com”的案例。<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><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">➜ ~ curl -vv baidu.com</div><div class="line">\* Adding handle: conn: 0x7f8261004400</div><div class="line">\* Adding handle: send: 0</div><div class="line">\* Adding handle: recv: 0</div><div class="line">\* Curl_addHandleToPipeline: length: 1</div><div class="line">\* - Conn 0 (0x7f8261004400) send_pipe: 1, recv_pipe: 0</div><div class="line">\* About to connect() to baidu.com port 80 (#0)</div><div class="line">\* Trying 220.181.111.85...</div><div class="line">\* Connected to baidu.com (220.181.111.85) port 80 (#0)</div><div class="line">> GET / HTTP/1.1</div><div class="line">> User-Agent: curl/7.30.0</div><div class="line">> Host: baidu.com</div><div class="line">> Accept: \*/\*</div><div class="line">></div><div class="line">< HTTP/1.1 200 OK</div><div class="line">< Date: Wed, 19 Mar 2014 04:28:24 GMT</div><div class="line">\* Server Apache is not blacklisted</div><div class="line">< Server: Apache</div><div class="line">< Cache-Control: max-age=86400</div><div class="line">< Expires: Thu, 20 Mar 2014 04:28:24 GMT</div><div class="line">< Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT</div><div class="line">< ETag: "51-4b4c7d90"</div><div class="line">< Accept-Ranges: bytes</div><div class="line">< Content-Length: 81</div><div class="line">< Connection: Keep-Alive</div><div class="line">< Content-Type: text/html</div><div class="line"><</div><div class="line"><html></div><div class="line"><meta http-equiv="refresh" content="0;url=http://www.baidu.com/"></div><div class="line"></html></div><div class="line">\* Connection #0 to host baidu.com left intact</div><div class="line">➜ ~</div></pre></td></tr></table></figure></p>
<p>这种方法把重定向丢给浏览器来处理,某种程度上减少了server端的开销,感觉不错。</p>
<p>但是我想实现的更复杂一些,通过前端的方式获取URL里面域名后面的参数(pathname,search,hash等),然后进行相应的重定向 。或许可以通过JS location.replace()来刷新。<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></pre></td><td class="code"><pre><div class="line"><script></div><div class="line">document.location.replace(document.location.toString().replace("http:","https:"))</div><div class="line"></script></div></pre></td></tr></table></figure></p>
<p>URL字符串的处理,我这边的需求只要把”http:”替换成”https:”就行了。</p>
<p>最后,突然也想到前端是只要处理下URL字符串就行了,但是后端还是需要做个“<span style="color: #ff0000;"> * </span>”匹配到上面这个“index.html”的文件,server端还是会有一定的开销(跑一遍正则,然后丢给index.html,不亚于跑一遍rewrite)。</p>
<p>总结:貌似这样子搞下来,相比于server端直接用nginx rewrite一下有点得不偿失的感觉,特别是相比于只对首页进行meta refresh。而且一般重定向的话,也都是首页用到的多,具体的文档重定向倒是少见。</p>
<p>所以目前最后评估下来的方案是:要么就用meta refresh到首页;要么就用nginx的rewrite。折腾不来 ╮(╯▽╰)╭</p>
]]></content>
<summary type="html">
<p>昨天评估了半天,想用前端的方式来实现类似nginx rewrite这样一个重定向的效果,主要是想80重定向到443。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div cla
</summary>
<category term="LNMP Stack" scheme="http://zin.so/categories/LNMP-Stack/"/>
<category term="refresh" scheme="http://zin.so/tags/refresh/"/>
<category term="rewrite" scheme="http://zin.so/tags/rewrite/"/>
</entry>
<entry>
<title>Git常用命令别名</title>
<link href="http://zin.so/2014/03/18/git-alias/"/>
<id>http://zin.so/2014/03/18/git-alias/</id>
<published>2014-03-18T06:22:47.000Z</published>
<updated>2016-08-29T05:38:34.000Z</updated>
<content type="html"><![CDATA[<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><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></pre></td><td class="code"><pre><div class="line"># Aliases</div><div class="line">alias g='git'</div><div class="line">alias gst='git status'</div><div class="line">alias gd='git diff'</div><div class="line">alias gdc='git diff --cached'</div><div class="line">alias gl='git pull'</div><div class="line">alias gup='git pull --rebase'</div><div class="line">alias gp='git push'</div><div class="line">alias gd='git diff'</div><div class="line">alias gc='git commit -v'</div><div class="line">alias gc!='git commit -v --amend'</div><div class="line">alias gca='git commit -v -a'</div><div class="line">alias gca!='git commit -v -a --amend'</div><div class="line">alias gcmsg='git commit -m'</div><div class="line">alias gco='git checkout'</div><div class="line">alias gcm='git checkout master'</div><div class="line">alias gr='git remote'</div><div class="line">alias grv='git remote -v'</div><div class="line">alias grmv='git remote rename'</div><div class="line">alias grrm='git remote remove'</div><div class="line">alias grset='git remote set-url'</div><div class="line">alias grup='git remote update'</div><div class="line">alias grbi='git rebase -i'</div><div class="line">alias grbc='git rebase --continue'</div><div class="line">alias grba='git rebase --abort'</div><div class="line">alias gb='git branch'</div><div class="line">alias gba='git branch -a'</div><div class="line">alias gcount='git shortlog -sn'</div><div class="line">alias gcl='git config --list'</div><div class="line">alias gcp='git cherry-pick'</div><div class="line">alias glg='git log --stat --max-count=10'</div><div class="line">alias glgg='git log --graph --max-count=10'</div><div class="line">alias glgga='git log --graph --decorate --all'</div><div class="line">alias glo='git log --oneline'</div><div class="line">alias gss='git status -s'</div><div class="line">alias ga='git add'</div><div class="line">alias gm='git merge'</div><div class="line">alias grh='git reset HEAD'</div><div class="line">alias grhh='git reset HEAD --hard'</div><div class="line">alias gclean='git reset --hard &amp;&amp; git clean -dfx'</div><div class="line">alias gwc='git whatchanged -p --abbrev-commit --pretty=medium'</div></pre></td></tr></table></figure>
]]></content>
<summary type="html">
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</di
</summary>
<category term="Shell" scheme="http://zin.so/categories/Shell/"/>
<category term="alias" scheme="http://zin.so/tags/alias/"/>
<category term="git" scheme="http://zin.so/tags/git/"/>
</entry>
</feed>