<?xml version="1.0" encoding="UTF-8"?> <rss
version="2.0"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:wfw="http://wellformedweb.org/CommentAPI/"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:atom="http://www.w3.org/2005/Atom"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
> <channel><title>懒人窝</title> <atom:link href="http://www.591rmb.info/feed/" rel="self" type="application/rss+xml" /><link>http://www.591rmb.info</link> <description>心有多大，舞台就有多大</description> <lastBuildDate>Mon, 16 Apr 2012 15:31:50 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3.2</generator> <item><title>iPad打电话(phoneitipad破解版)很酷，变成大号iPhone</title><link>http://www.591rmb.info/2012/04/ipad%e6%89%93%e7%94%b5%e8%af%9dphoneitipad%e7%a0%b4%e8%a7%a3%e7%89%88%e5%be%88%e9%85%b7%e5%8f%98%e6%88%90%e5%a4%a7%e5%8f%b7iphone/</link> <comments>http://www.591rmb.info/2012/04/ipad%e6%89%93%e7%94%b5%e8%af%9dphoneitipad%e7%a0%b4%e8%a7%a3%e7%89%88%e5%be%88%e9%85%b7%e5%8f%98%e6%88%90%e5%a4%a7%e5%8f%b7iphone/#comments</comments> <pubDate>Mon, 16 Apr 2012 05:02:03 +0000</pubDate> <dc:creator>591rmb</dc:creator> <category><![CDATA[活在当下]]></category> <category><![CDATA[ipad]]></category> <category><![CDATA[iphone]]></category> <category><![CDATA[itools]]></category> <category><![CDATA[phoneitipad]]></category> <guid
isPermaLink="false">http://www.591rmb.info/?p=333</guid> <description><![CDATA[　　为了实现iPad打电话，周末在家倒腾了一上午，从iOS5.1降级到iOS4.3.3，首次安装PhoneItIpad的失败，到最后禁止iPad联网，最终成功实现了iPad打电话。 　　降级： 　　　　iTools超级方便，可以自动下载保存SHSH文件，开启TSS，可以直接参考自带的在线教程。 　　安装PhoneItIpad： 　　　　1、目前PhoneItIpad已经修正了破解的Bug，所以你直接下载安装包： 　　　　　　a、Phoneitipad for 5.0 deb安装包 　　　　　　b、Phoneitipad for 4.3.3 deb安装包 　　　　2、在安装前，iPad一定要禁用网络(教程里没有提到)，才能安装成功。否则PhoneItIpad会自动连接到服务器验证，导致安装失败。 　　参考教程： 　　　　强烈推荐豆沙大饼的文章，图文并茂。 　　　　1、【豆沙大饼】phoneitipad免费版破解图文版安装教程方法，IPAD免费变IPHONE不是梦了 　　　　 http://www.jd-bbs.com/thread-3487848-1-1.html 　　　　2、太帅了！PhoneItipad破解成功，成功电话、短信！ 　　　　　 http://bbs.weiphone.com/read-htm-tid-3539741.html 　　有图有真相： &#8212;2012/4/16&#8212; iPad 1代，使用iOS5.1后，速度明显变慢，还是iOS4.3比较适合。 —————END————– —————Thx————–]]></description> <content:encoded><![CDATA[<p>　　为了实现iPad打电话，周末在家倒腾了一上午，从iOS5.1降级到iOS4.3.3，首次安装PhoneItIpad的失败，到最后禁止iPad联网，最终成功实现了iPad打电话。<br
/> 　　<strong>降级：</strong><br
/> 　　　　iTools超级方便，可以自动下载保存SHSH文件，开启TSS，可以直接参考自带的在线教程。<br
/> 　　<strong>安装PhoneItIpad：</strong><br
/> 　　　　1、目前PhoneItIpad已经修正了破解的Bug，所以你直接下载安装包：<br
/> 　　　　　　a、<a
href="http://bbs.weiphone.com/read-htm-tid-3547260.html" target="_blank">Phoneitipad for 5.0 deb安装包</a><br
/> 　　　　　　b、<a
href="http://bbs.weiphone.com/read-htm-tid-3547597.html" target="_blank">Phoneitipad for 4.3.3 deb安装包</a><br
/> 　　　　2、在安装前，iPad一定要禁用网络(教程里没有提到)，才能安装成功。否则PhoneItIpad会自动连接到服务器验证，导致安装失败。<br
/> 　　<strong>参考教程：</strong><br
/> 　　　　强烈推荐豆沙大饼的文章，图文并茂。<br
/> 　　　　1、【豆沙大饼】phoneitipad免费版破解图文版安装教程方法，IPAD免费变IPHONE不是梦了<br
/> 　　　　   http://www.jd-bbs.com/thread-3487848-1-1.html<br
/> 　　　　2、太帅了！PhoneItipad破解成功，成功电话、短信！<br
/> 　　　　　 http://bbs.weiphone.com/read-htm-tid-3539741.html<br
/> 　　<strong>有图有真相：</strong><br
/> <a
href="http://www.591rmb.info/wp-content/uploads/2012/04/IMG_1248.jpg"><img
src="http://www.591rmb.info/wp-content/uploads/2012/04/IMG_1248.jpg" alt="PhoneItiPad" title="PhoneItiPad" width="635" class="size-full wp-image-334" /></a></p><p> <a
href="http://www.591rmb.info/wp-content/uploads/2012/04/IMG_00051.png"><img
src="http://www.591rmb.info/wp-content/uploads/2012/04/IMG_00051.png" alt="PhoneItiPad" title="PhoneItiPad" width="635" class="alignnone size-full wp-image-352" /></a></p><p>&#8212;2012/4/16&#8212;<br
/> iPad 1代，使用iOS5.1后，速度明显变慢，还是iOS4.3比较适合。<br
/> —————END————–<br
/> —————Thx————–</p> ]]></content:encoded> <wfw:commentRss>http://www.591rmb.info/2012/04/ipad%e6%89%93%e7%94%b5%e8%af%9dphoneitipad%e7%a0%b4%e8%a7%a3%e7%89%88%e5%be%88%e9%85%b7%e5%8f%98%e6%88%90%e5%a4%a7%e5%8f%b7iphone/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>python实现的ping功能(web.py版)</title><link>http://www.591rmb.info/2012/04/python%e5%ae%9e%e7%8e%b0%e7%9a%84ping%e5%8a%9f%e8%83%bdweb-py%e7%89%88/</link> <comments>http://www.591rmb.info/2012/04/python%e5%ae%9e%e7%8e%b0%e7%9a%84ping%e5%8a%9f%e8%83%bdweb-py%e7%89%88/#comments</comments> <pubDate>Sat, 14 Apr 2012 12:17:32 +0000</pubDate> <dc:creator>591rmb</dc:creator> <category><![CDATA[程序人生]]></category> <category><![CDATA[ping]]></category> <category><![CDATA[python]]></category> <category><![CDATA[web.py]]></category> <guid
isPermaLink="false">http://www.591rmb.info/?p=326</guid> <description><![CDATA[　　最近公司的网络不太给力，导致电话偶尔会出现咔咔的问题，我们的第一反应，查看服务器，得到的答案永远是ping值太大，通过回复同事都是网络不好，要稍等一会。 　　由此引申出一个问题：如果同事能够自己判断就好了，避免经常过来“搔扰”我们。 　　答案是：自动化的显示在后台，让同事查看即可。 　　根据以往对python的简单了解，Google一下ping的python实现，结合web.py，很简单的实现了功能，源码如下： ?View Code PYTHON1 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 [...]]]></description> <content:encoded><![CDATA[<p>　　最近公司的网络不太给力，导致电话偶尔会出现咔咔的问题，我们的第一反应，查看服务器，得到的答案永远是ping值太大，通过回复同事都是网络不好，要稍等一会。<br
/> 　　由此引申出一个<strong>问题</strong>：如果同事能够自己判断就好了，避免经常过来“搔扰”我们。<br
/> 　　答案是：自动化的显示在后台，让同事查看即可。<br
/> 　　根据以往对python的简单了解，Google一下ping的python实现，结合web.py，很简单的实现了功能，源码如下：</p><div
class="wp_codebox_msgheader"><span
class="right"><sup><a
href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span
style="color: #99cc00">?</span></a></sup></span><span
class="left"><a
href="javascript:;" onclick="javascript:showCodeTxt('p326code2'); return false;">View Code</a> PYTHON</span><div
class="codebox_clear"></div></div><div
class="wp_codebox"><table><tr
id="p3262"><td
class="line_numbers"><pre>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
</pre></td><td
class="code" id="p326code2"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#coding:utf-8</span>
<span style="color: #483d8b;">&quot;&quot;&quot;
web.py + ping
www.591rmb.info
ex:
# nohup web_ping.py 9999 &amp;
# curl http://192.168.1.36:9999/192.168.1.86
ping Code，Copy from the following website:
http://www.g-loaded.eu/2009/10/30/python-ping/
&quot;&quot;&quot;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">socket</span>, <span style="color: #dc143c;">select</span>, <span style="color: #dc143c;">time</span>, web, <span style="color: #dc143c;">urllib</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>, <span style="color: #dc143c;">sys</span>, <span style="color: #dc143c;">socket</span>, <span style="color: #dc143c;">struct</span>, <span style="color: #dc143c;">select</span>, <span style="color: #dc143c;">time</span>
&nbsp;
urls = <span style="color: black;">&#40;</span>
    <span style="color: #483d8b;">'/(.*)'</span>, <span style="color: #483d8b;">'Ping'</span>
<span style="color: black;">&#41;</span>
&nbsp;
app = web.<span style="color: black;">application</span><span style="color: black;">&#40;</span>urls, <span style="color: #008000;">globals</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Ping:
    <span style="color: #ff7700;font-weight:bold;">def</span> GET<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, ip<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> verbose_ping<span style="color: black;">&#40;</span>ip, <span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># From /usr/include/linux/icmp.h; your milage may vary.</span>
ICMP_ECHO_REQUEST = <span style="color: #ff4500;">8</span> <span style="color: #808080; font-style: italic;"># Seems to be the same on Solaris.</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> checksum<span style="color: black;">&#40;</span>source_string<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;
    I'm not too confident that this is right but testing seems
    to suggest that it gives the same answers as in_cksum in ping.c
    &quot;&quot;&quot;</span>
    <span style="color: #008000;">sum</span> = <span style="color: #ff4500;">0</span>
    countTo = <span style="color: black;">&#40;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>source_string<span style="color: black;">&#41;</span>/<span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">*</span><span style="color: #ff4500;">2</span>
    count = <span style="color: #ff4500;">0</span>
    <span style="color: #ff7700;font-weight:bold;">while</span> count<span style="color: #66cc66;">&lt;</span>countTo:
        thisVal = <span style="color: #008000;">ord</span><span style="color: black;">&#40;</span>source_string<span style="color: black;">&#91;</span>count + <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: #66cc66;">*</span><span style="color: #ff4500;">256</span> + <span style="color: #008000;">ord</span><span style="color: black;">&#40;</span>source_string<span style="color: black;">&#91;</span>count<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">sum</span> = <span style="color: #008000;">sum</span> + thisVal
        <span style="color: #008000;">sum</span> = <span style="color: #008000;">sum</span> <span style="color: #66cc66;">&amp;</span> 0xffffffff <span style="color: #808080; font-style: italic;"># Necessary?</span>
        count = count + <span style="color: #ff4500;">2</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> countTo<span style="color: #66cc66;">&lt;</span>len<span style="color: black;">&#40;</span>source_string<span style="color: black;">&#41;</span>:
        <span style="color: #008000;">sum</span> = <span style="color: #008000;">sum</span> + <span style="color: #008000;">ord</span><span style="color: black;">&#40;</span>source_string<span style="color: black;">&#91;</span><span style="color: #008000;">len</span><span style="color: black;">&#40;</span>source_string<span style="color: black;">&#41;</span> - <span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">sum</span> = <span style="color: #008000;">sum</span> <span style="color: #66cc66;">&amp;</span> 0xffffffff <span style="color: #808080; font-style: italic;"># Necessary?</span>
&nbsp;
    <span style="color: #008000;">sum</span> = <span style="color: black;">&#40;</span><span style="color: #008000;">sum</span> <span style="color: #66cc66;">&gt;&gt;</span> <span style="color: #ff4500;">16</span><span style="color: black;">&#41;</span>  +  <span style="color: black;">&#40;</span><span style="color: #008000;">sum</span> <span style="color: #66cc66;">&amp;</span> 0xffff<span style="color: black;">&#41;</span>
    <span style="color: #008000;">sum</span> = <span style="color: #008000;">sum</span> + <span style="color: black;">&#40;</span><span style="color: #008000;">sum</span> <span style="color: #66cc66;">&gt;&gt;</span> <span style="color: #ff4500;">16</span><span style="color: black;">&#41;</span>
    answer = ~<span style="color: #008000;">sum</span>
    answer = answer <span style="color: #66cc66;">&amp;</span> 0xffff
&nbsp;
    <span style="color: #808080; font-style: italic;"># Swap bytes. Bugger me if I know why.</span>
    answer = answer <span style="color: #66cc66;">&gt;&gt;</span> <span style="color: #ff4500;">8</span> | <span style="color: black;">&#40;</span>answer <span style="color: #66cc66;">&lt;&lt;</span> <span style="color: #ff4500;">8</span> <span style="color: #66cc66;">&amp;</span> 0xff00<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">return</span> answer
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> receive_one_ping<span style="color: black;">&#40;</span>my_socket, ID, timeout<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;
    receive the ping from the socket.
    &quot;&quot;&quot;</span>
    timeLeft = timeout
    <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
        startedSelect = <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        whatReady = <span style="color: #dc143c;">select</span>.<span style="color: #dc143c;">select</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span>my_socket<span style="color: black;">&#93;</span>, <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>, <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>, timeLeft<span style="color: black;">&#41;</span>
        howLongInSelect = <span style="color: black;">&#40;</span><span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - startedSelect<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> whatReady<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>: <span style="color: #808080; font-style: italic;"># Timeout</span>
            <span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
        timeReceived = <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        recPacket, addr = my_socket.<span style="color: black;">recvfrom</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1024</span><span style="color: black;">&#41;</span>
        icmpHeader = recPacket<span style="color: black;">&#91;</span><span style="color: #ff4500;">20</span>:<span style="color: #ff4500;">28</span><span style="color: black;">&#93;</span>
        <span style="color: #008000;">type</span>, <span style="color: #dc143c;">code</span>, checksum, packetID, sequence = <span style="color: #dc143c;">struct</span>.<span style="color: black;">unpack</span><span style="color: black;">&#40;</span>
            <span style="color: #483d8b;">&quot;bbHHh&quot;</span>, icmpHeader
        <span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> packetID == ID:
            bytesInDouble = <span style="color: #dc143c;">struct</span>.<span style="color: black;">calcsize</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;d&quot;</span><span style="color: black;">&#41;</span>
            timeSent = <span style="color: #dc143c;">struct</span>.<span style="color: black;">unpack</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;d&quot;</span>, recPacket<span style="color: black;">&#91;</span><span style="color: #ff4500;">28</span>:<span style="color: #ff4500;">28</span> + bytesInDouble<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">return</span> timeReceived - timeSent
&nbsp;
        timeLeft = timeLeft - howLongInSelect
        <span style="color: #ff7700;font-weight:bold;">if</span> timeLeft <span style="color: #66cc66;">&lt;</span>= <span style="color: #ff4500;">0</span>:
            <span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> send_one_ping<span style="color: black;">&#40;</span>my_socket, dest_addr, ID<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;
    Send one ping to the given &gt;dest_addr&lt;.
    &quot;&quot;&quot;</span>
    dest_addr  =  <span style="color: #dc143c;">socket</span>.<span style="color: black;">gethostbyname</span><span style="color: black;">&#40;</span>dest_addr<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Header is type (8), code (8), checksum (16), id (16), sequence (16)</span>
    my_checksum = <span style="color: #ff4500;">0</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Make a dummy heder with a 0 checksum.</span>
    header = <span style="color: #dc143c;">struct</span>.<span style="color: black;">pack</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;bbHHh&quot;</span>, ICMP_ECHO_REQUEST, <span style="color: #ff4500;">0</span>, my_checksum, ID, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
    bytesInDouble = <span style="color: #dc143c;">struct</span>.<span style="color: black;">calcsize</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;d&quot;</span><span style="color: black;">&#41;</span>
    data = <span style="color: black;">&#40;</span><span style="color: #ff4500;">192</span> - bytesInDouble<span style="color: black;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #483d8b;">&quot;Q&quot;</span>
    data = <span style="color: #dc143c;">struct</span>.<span style="color: black;">pack</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;d&quot;</span>, <span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> + data
&nbsp;
    <span style="color: #808080; font-style: italic;"># Calculate the checksum on the data and the dummy header.</span>
    my_checksum = checksum<span style="color: black;">&#40;</span>header + data<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Now that we have the right checksum, we put that in. It's just easier</span>
    <span style="color: #808080; font-style: italic;"># to make up a new header than to stuff it into the dummy.</span>
    header = <span style="color: #dc143c;">struct</span>.<span style="color: black;">pack</span><span style="color: black;">&#40;</span>
        <span style="color: #483d8b;">&quot;bbHHh&quot;</span>, ICMP_ECHO_REQUEST, <span style="color: #ff4500;">0</span>, <span style="color: #dc143c;">socket</span>.<span style="color: black;">htons</span><span style="color: black;">&#40;</span>my_checksum<span style="color: black;">&#41;</span>, ID, <span style="color: #ff4500;">1</span>
    <span style="color: black;">&#41;</span>
    packet = header + data
    my_socket.<span style="color: black;">sendto</span><span style="color: black;">&#40;</span>packet, <span style="color: black;">&#40;</span>dest_addr, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># Don't know about the 1</span>
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> do_one<span style="color: black;">&#40;</span>dest_addr, timeout<span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;
    Returns either the delay (in seconds) or none on timeout.
    &quot;&quot;&quot;</span>
    icmp = <span style="color: #dc143c;">socket</span>.<span style="color: black;">getprotobyname</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;icmp&quot;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        my_socket = <span style="color: #dc143c;">socket</span>.<span style="color: #dc143c;">socket</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">socket</span>.<span style="color: black;">AF_INET</span>, <span style="color: #dc143c;">socket</span>.<span style="color: black;">SOCK_RAW</span>, icmp<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">error</span>, <span style="color: black;">&#40;</span><span style="color: #dc143c;">errno</span>, msg<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">errno</span> == <span style="color: #ff4500;">1</span>:
            <span style="color: #808080; font-style: italic;"># Operation not permitted</span>
            msg = msg + <span style="color: black;">&#40;</span>
                <span style="color: #483d8b;">&quot; - Note that ICMP messages can only be sent from processes&quot;</span>
                <span style="color: #483d8b;">&quot; running as root.&quot;</span>
            <span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">error</span><span style="color: black;">&#40;</span>msg<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">raise</span> <span style="color: #808080; font-style: italic;"># raise the original error</span>
&nbsp;
    my_ID = <span style="color: #dc143c;">os</span>.<span style="color: black;">getpid</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&amp;</span> 0xFFFF
&nbsp;
    send_one_ping<span style="color: black;">&#40;</span>my_socket, dest_addr, my_ID<span style="color: black;">&#41;</span>
    delay = receive_one_ping<span style="color: black;">&#40;</span>my_socket, my_ID, timeout<span style="color: black;">&#41;</span>
&nbsp;
    my_socket.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> delay
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> verbose_ping<span style="color: black;">&#40;</span>dest_addr, timeout = <span style="color: #ff4500;">2</span>, count = <span style="color: #ff4500;">4</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;
    Send &gt;count&lt; ping to &gt;dest_addr&lt; with the given &gt;timeout&lt; and display
    the result.
    &quot;&quot;&quot;</span>
    result = <span style="color: #483d8b;">''</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span>count<span style="color: black;">&#41;</span>:
        result = <span style="color: #483d8b;">&quot;ping &quot;</span> + dest_addr
        <span style="color: #ff7700;font-weight:bold;">try</span>:
            delay  =  do_one<span style="color: black;">&#40;</span>dest_addr, timeout<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #dc143c;">socket</span>.<span style="color: black;">gaierror</span>, e:
            result += <span style="color: #483d8b;">&quot; failed. (socket error: '%s')&quot;</span> <span style="color: #66cc66;">%</span> e<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">break</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">if</span> delay  ==  <span style="color: #008000;">None</span>:
            result += <span style="color: #483d8b;">&quot; failed. (timeout within %ssec.)&quot;</span> <span style="color: #66cc66;">%</span> timeout
        <span style="color: #ff7700;font-weight:bold;">else</span>:
            delay  =  delay <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">1000</span>
            result += <span style="color: #483d8b;">&quot; =&gt; %dms&quot;</span> <span style="color: #66cc66;">%</span> delay
    <span style="color: #ff7700;font-weight:bold;">return</span> result
&nbsp;
&nbsp;
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> void<span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span>: <span style="color: #ff7700;font-weight:bold;">pass</span>
    app.<span style="color: black;">run</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div><p>&#8212;&#8212;&#8212;&#8212;&#8212;END&#8212;&#8212;&#8212;&#8212;&#8211;<br
/> &#8212;&#8212;&#8212;&#8212;&#8212;Thx&#8212;&#8212;&#8212;&#8212;&#8211;</p> ]]></content:encoded> <wfw:commentRss>http://www.591rmb.info/2012/04/python%e5%ae%9e%e7%8e%b0%e7%9a%84ping%e5%8a%9f%e8%83%bdweb-py%e7%89%88/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>BeansEye安装配置</title><link>http://www.591rmb.info/2012/04/beanseye%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae/</link> <comments>http://www.591rmb.info/2012/04/beanseye%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae/#comments</comments> <pubDate>Sun, 01 Apr 2012 03:19:55 +0000</pubDate> <dc:creator>591rmb</dc:creator> <category><![CDATA[网站架构]]></category> <category><![CDATA[beansdb]]></category> <category><![CDATA[beanseye]]></category> <category><![CDATA[douban]]></category> <category><![CDATA[proxy]]></category> <category><![CDATA[豆瓣]]></category> <guid
isPermaLink="false">http://www.591rmb.info/?p=302</guid> <description><![CDATA[BeansEye是豆瓣(douban.com)出品的beansdb的proxy，使用Go语言开发，可以根据后端存储节点的数据情况自动做数据路由和负载均衡，并且增加了可视化的集群的管理，可以方便的查看集群中各个节点的信息。 在文章开始前，我要感谢BeansDB的开发人员Davies Liu，他非常的热心，我也一直关注BeansDB，早前也有Email往来，当BeansEye发布后，他也第一时间的告诉了我，并且在安装中遇到的问题，也及时的回复我，感激不尽。 服务器环境： 　系统：CentOS 　安装包下载目录：/usr/local/soft 安装步骤： 一、安装hg： 　网上hg的安装教程很多，我这里就不介绍了； 二、安装Go语言的weekly的发布版本： ?View Code SHELL1 2 3 4 5 6 # hg clone -u release https://go.googlecode.com/hg/ go # cd go/src # hg pull # hg update weekly # ./src/all.bash # mv /usr/local/soft/go /usr/local/ 将下面的内容追加到/root/.bashrc ： ?View Code SHELL1 2 3 4 5 6 7 # vi /root/.bashrc [...]]]></description> <content:encoded><![CDATA[<p><a
href="https://github.com/douban/beanseye" target="_blank">BeansEye</a>是豆瓣(douban.com)出品的beansdb的proxy，使用Go语言开发，可以根据后端存储节点的数据情况自动做数据路由和负载均衡，并且增加了可视化的集群的管理，可以方便的查看集群中各个节点的信息。</p><p>在文章开始前，我要感谢BeansDB的开发人员<span
class="gD">Davies Liu</span>，他非常的热心，我也一直关注BeansDB，早前也有Email往来，当BeansEye发布后，他也第一时间的告诉了我，并且在安装中遇到的问题，也及时的回复我，感激不尽。</p><p><strong>服务器环境：</strong><br
/> 　系统：CentOS<br
/> 　安装包下载目录：/usr/local/soft<br
/> <strong>安装步骤：</strong><br
/> <strong>一、安装hg：</strong><br
/> 　网上hg的安装教程很多，我这里就不介绍了；<br
/> <strong>二、安装Go语言的weekly的发布版本：</strong></p><div
class="wp_codebox_msgheader"><span
class="right"><sup><a
href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span
style="color: #99cc00">?</span></a></sup></span><span
class="left"><a
href="javascript:;" onclick="javascript:showCodeTxt('p302code7'); return false;">View Code</a> SHELL</span><div
class="codebox_clear"></div></div><div
class="wp_codebox"><table><tr
id="p3027"><td
class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td
class="code" id="p302code7"><pre class="shell" style="font-family:monospace;">#  hg clone -u release https://go.googlecode.com/hg/ go
#  cd go/src
#  hg pull
#  hg update weekly
#  ./src/all.bash
#  mv /usr/local/soft/go /usr/local/</pre></td></tr></table></div><p>将下面的内容追加到/root/.bashrc ：</p><div
class="wp_codebox_msgheader"><span
class="right"><sup><a
href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span
style="color: #99cc00">?</span></a></sup></span><span
class="left"><a
href="javascript:;" onclick="javascript:showCodeTxt('p302code8'); return false;">View Code</a> SHELL</span><div
class="codebox_clear"></div></div><div
class="wp_codebox"><table><tr
id="p3028"><td
class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td
class="code" id="p302code8"><pre class="shell" style="font-family:monospace;"># vi /root/.bashrc
export GOROOT=/usr/local/go
export GOARCH=amd64
export GOOS=linux
export GOBIN=$GOROOT/bin/
export PATH=.:$PATH:$GOBIN
# source /root/.bashrc</pre></td></tr></table></div><p><strong>三、安装BeansEye：</strong><br
/> 1、下载BeansEye：https://github.com/douban/beanseye<br
/> 2、下载goconfig：https://github.com/kless/goconfig/，并保存至src目录。否则会出现以下错误：<br
/> src/proxy/proxy.go:19:5: import “github.com/kless/goconfig/config”: cannot find package</p><p>开始安装：</p><div
class="wp_codebox_msgheader"><span
class="right"><sup><a
href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span
style="color: #99cc00">?</span></a></sup></span><span
class="left"><a
href="javascript:;" onclick="javascript:showCodeTxt('p302code9'); return false;">View Code</a> SHELL</span><div
class="codebox_clear"></div></div><div
class="wp_codebox"><table><tr
id="p3029"><td
class="line_numbers"><pre>1
2
3
</pre></td><td
class="code" id="p302code9"><pre class="shell" style="font-family:monospace;"># cd beanseye
# go install proxy
# mv /usr/local/soft/beanseye /usr/local/</pre></td></tr></table></div><p>目录结构：<br
/> <img
src="http://www.591rmb.info/wp-content/uploads/beanseye_dir.png" alt="beanseye目录结构" width="464" height="122" /><br
/> <strong>四、配置：</strong><br
/> 在conf创建my.ini文件：<br
/> <img
src="http://www.591rmb.info/wp-content/uploads/beanseye_config.jpg" alt="beanseye配置文件" width="511" height="224" /></p><p>介绍N W R：<br
/> N:表示写操作时它主动发起的写的节点数<br
/> W 表示最少要写成功的次数<br
/> R   表示最少要读成功的次数<br
/> 据Davies Liu介绍，douban设定的是 N=3, W=2，尽量保证数据的可靠性。</p><p><strong>五、启动BeansEye:</strong></p><div
class="wp_codebox_msgheader"><span
class="right"><sup><a
href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span
style="color: #99cc00">?</span></a></sup></span><span
class="left"><a
href="javascript:;" onclick="javascript:showCodeTxt('p302code10'); return false;">View Code</a> SHELL</span><div
class="codebox_clear"></div></div><div
class="wp_codebox"><table><tr
id="p30210"><td
class="line_numbers"><pre>1
</pre></td><td
class="code" id="p302code10"><pre class="shell" style="font-family:monospace;"># ./bin/proxy -conf=conf/myconf.ini</pre></td></tr></table></div><p><strong>六：BeansEye集群管理：</strong></p><p>http://localhost:7908/</p><p><img
style="width: 645px; height: 526px;" src="http://www.591rmb.info/wp-content/uploads/beanseye_monitor_jpg.png" alt="beanseye监控" /></p><p>&#8212;&#8212;&#8212;&#8212;&#8212;END&#8212;&#8212;&#8212;&#8212;&#8211;<br
/> &#8212;&#8212;&#8212;&#8212;&#8212;Thx&#8212;&#8212;&#8212;&#8212;&#8211;</p> ]]></content:encoded> <wfw:commentRss>http://www.591rmb.info/2012/04/beanseye%e5%ae%89%e8%a3%85%e9%85%8d%e7%bd%ae/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>使用Nginx的proxy_cache缓存取代Varnish</title><link>http://www.591rmb.info/2011/06/%e4%bd%bf%e7%94%a8nginx%e7%9a%84proxy_cache%e7%bc%93%e5%ad%98%e5%8f%96%e4%bb%a3varnish/</link> <comments>http://www.591rmb.info/2011/06/%e4%bd%bf%e7%94%a8nginx%e7%9a%84proxy_cache%e7%bc%93%e5%ad%98%e5%8f%96%e4%bb%a3varnish/#comments</comments> <pubDate>Tue, 28 Jun 2011 12:02:17 +0000</pubDate> <dc:creator>591rmb</dc:creator> <category><![CDATA[网站架构]]></category> <category><![CDATA[nginx]]></category> <category><![CDATA[proxy_cache]]></category> <category><![CDATA[varnish]]></category> <guid
isPermaLink="false">http://www.591rmb.info/?p=291</guid> <description><![CDATA[&#160;&#160;&#160;&#160; 鉴于网站的图片过多，而且大部分都是缩略图，文件又非常小，非常容易造成NFS机的压力很大，很纠结。 &#160;&#160;&#160;&#160; 刚开始使用过Varnish V2.1.5，上线后，负载很低，但是图片显示时，会出现延迟的情况，经常出现叉烧包的问题，调整过相应的参数，还是无效，最终只能放弃（如有童鞋知道原因，欢迎与我联络，非常感谢）。 &#160;&#160;&#160;&#160; Nginx作为强大的Web服务器，我们一直在用，值得依赖。然而对于缓存部分，却了解太少，这次正好使用了它的proxy_cache模块，非常好用，下面简单的介绍一下配置： &#160;&#160; &#160;&#160; 一、下载 ngx_cache_purge &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ngx_cache_purge模块，用于清除指定 URL的缓存，非常实用。 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; # wget http://labs.frickle.com/files/ngx_cache_purge-1.3.tar.gz &#160; &#160; &#160; &#160; &#160;&#160; # tar zxvf ngx_cache_purge-1.3.tar.gz&#160; &#160; &#160; 二、重新编译Nginx（根据实际情况而定） &#160; &#160; &#160; &#160; &#160; # cd nginx-0.8.52 &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; # ./configure &#8211;prefix=/usr/local/nginx &#8211;user=acc &#8211;group=acc &#8211;add-module=../ngx_cache_purge-1.3 &#8211;with-http_ssl_module - -with-http_sub_module &#8211;with-http_dav_module &#8211;with-http_flv_module &#8211;with-http_gzip_static_module &#8211;with-http_stub_status_module &#8211; http-proxy-temp-path=/var/nginx/proxy &#8211;http-fastcgi-temp-path=/var/nginx/fastcgi [...]]]></description> <content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; 鉴于网站的图片过多，而且大部分都是缩略图，文件又非常小，非常容易造成NFS机的压力很大，很纠结。<br
/> &nbsp;&nbsp;&nbsp;&nbsp; 刚开始使用过Varnish V2.1.5，上线后，负载很低，但是图片显示时，会出现延迟的情况，经常出现叉烧包的问题，调整过相应的参数，还是无效，最终只能放弃（如有童鞋知道原因，欢迎与我联络，非常感谢）。<br
/> &nbsp;&nbsp;&nbsp;&nbsp; Nginx作为强大的Web服务器，我们一直在用，值得依赖。然而对于缓存部分，却了解太少，这次正好使用了它的proxy_cache模块，非常好用，下面简单的介绍一下配置：<br
/> &nbsp;&nbsp; &nbsp;&nbsp; <strong>一、下载 ngx_cache_purge</strong><br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ngx_cache_purge模块，用于清除指定 URL的缓存，非常实用。</p><blockquote><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # wget http://labs.frickle.com/files/ngx_cache_purge-1.3.tar.gz<br
/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp; # tar zxvf ngx_cache_purge-1.3.tar.gz&nbsp;</p></blockquote><p><strong>&nbsp; &nbsp; 二、重新编译Nginx（根据实际情况而定）</strong></p><blockquote><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # cd nginx-0.8.52<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # ./configure &#8211;prefix=/usr/local/nginx &#8211;user=acc &#8211;group=acc &#8211;add-module=../ngx_cache_purge-1.3 &#8211;with-http_ssl_module -<br
/> -with-http_sub_module &#8211;with-http_dav_module &#8211;with-http_flv_module &#8211;with-http_gzip_static_module &#8211;with-http_stub_status_module &#8211;<br
/> http-proxy-temp-path=/var/nginx/proxy &#8211;http-fastcgi-temp-path=/var/nginx/fastcgi &#8211;http-client-body-temp-path=/var/nginx/client &#8211;w<br
/> ith-debug&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # make<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx-old<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # cp objs/nginx /usr/local/nginx/sbin/</p></blockquote><p><strong>&nbsp;&nbsp;&nbsp; 三、创建文件夹</strong></p><blockquote><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # mkdir /tmp/proxy_temp_dir<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # mkdir /tmp/proxy_cache_dir<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # chmod 777 /tmp/proxy_temp_dir /tmp/proxy_cache_dir</p></blockquote><p><strong>&nbsp;&nbsp;&nbsp; 四、修改Nginx配置文件</strong></p><blockquote><p># vi /usr/local/nginx/conf/nginx.conf<br
/> user addcn addcn;<br
/> # 8核CPU<br
/> worker_processes&nbsp; 8;<br
/> worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;</p><p> error_log&nbsp; logs/error.log;</p><p> pid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; logs/nginx.pid;</p><p> worker_rlimit_nofile 65535;<br
/> events {<br
/> &nbsp;&nbsp;&nbsp; use epoll;<br
/> &nbsp;&nbsp;&nbsp; worker_connections&nbsp; 65535;<br
/> }</p><p> http {<br
/> &nbsp;&nbsp;&nbsp; include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mime.types;<br
/> &nbsp;&nbsp;&nbsp; default_type&nbsp; application/octet-stream;</p><p> &nbsp;&nbsp;&nbsp; access_log&nbsp; logs/access.log&nbsp; main;</p><p> &nbsp;&nbsp;&nbsp; server_names_hash_bucket_size 128;<br
/> &nbsp;&nbsp;&nbsp; client_header_buffer_size 32k;<br
/> &nbsp;&nbsp;&nbsp; large_client_header_buffers 4 32k;<br
/> &nbsp;&nbsp;&nbsp; client_max_body_size 8m;</p><p> &nbsp;&nbsp;&nbsp; sendfile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on;<br
/> &nbsp;&nbsp;&nbsp; tcp_nopush&nbsp;&nbsp;&nbsp;&nbsp; on;<br
/> &nbsp;&nbsp;&nbsp; server_tokens off;</p><p> &nbsp;&nbsp;&nbsp; keepalive_timeout&nbsp; 60;<br
/> &nbsp;&nbsp;&nbsp; fastcgi_intercept_errors on;</p><p> &nbsp;&nbsp;&nbsp; client_body_buffer_size&nbsp; 512k;<br
/> &nbsp;&nbsp;&nbsp; proxy_connect_timeout&nbsp;&nbsp;&nbsp; 10;<br
/> &nbsp;&nbsp;&nbsp; proxy_read_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60;<br
/> &nbsp;&nbsp;&nbsp; proxy_send_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10;<br
/> &nbsp;&nbsp;&nbsp; proxy_buffer_size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16k;<br
/> &nbsp;&nbsp;&nbsp; proxy_buffers&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 64k;<br
/> &nbsp;&nbsp;&nbsp; proxy_busy_buffers_size 128k;<br
/> &nbsp;&nbsp;&nbsp; proxy_temp_file_write_size 128k;</p><p> &nbsp;&nbsp;&nbsp; # fastcgi<br
/> &nbsp;&nbsp;&nbsp; fastcgi_connect_timeout 300;<br
/> &nbsp;&nbsp;&nbsp; fastcgi_send_timeout 300;<br
/> &nbsp;&nbsp;&nbsp; fastcgi_read_timeout 300;<br
/> &nbsp;&nbsp;&nbsp; fastcgi_buffer_size 64k;<br
/> &nbsp;&nbsp;&nbsp; fastcgi_buffers 4 64k;<br
/> &nbsp;&nbsp;&nbsp; fastcgi_busy_buffers_size 128k;<br
/> &nbsp;&nbsp;&nbsp; fastcgi_temp_file_write_size 128k;</p><p> &nbsp;&nbsp;&nbsp; # gzip<br
/> &nbsp;&nbsp;&nbsp; gzip&nbsp; on;<br
/> &nbsp;&nbsp;&nbsp; gzip_min_length&nbsp; 1k;<br
/> &nbsp;&nbsp;&nbsp; gzip_buffers&nbsp;&nbsp;&nbsp;&nbsp; 4 16k;<br
/> &nbsp;&nbsp;&nbsp; gzip_http_version 1.0;<br
/> &nbsp;&nbsp;&nbsp; gzip_comp_level 2;<br
/> &nbsp;&nbsp;&nbsp; gzip_types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text/plain application/x-javascript text/css application/xml;<br
/> &nbsp;&nbsp;&nbsp; gzip_vary on;<br
/> &nbsp;&nbsp;&nbsp; # proxy_temp_path和proxy_cache_path指定的路径必须在同一分区<br
/> &nbsp;&nbsp;&nbsp; proxy_temp_path&nbsp;&nbsp; /tmp/proxy_temp_dir;<br
/> &nbsp;&nbsp;&nbsp; # 设置Web缓存区名称为cache_one，内存缓存空间大小为1000MB，3天清理一次缓存，硬盘缓存空间大小为100GB。<br
/> &nbsp;&nbsp;&nbsp; proxy_cache_path&nbsp; /tmp/proxy_cache_dir&nbsp; levels=1:2&nbsp;&nbsp; keys_zone=cache_one:1000m inactive=3d max_size=100g;<br
/> &nbsp;&nbsp;&nbsp; #&nbsp; 后台请求服务器<br
/> &nbsp;&nbsp;&nbsp; upstream backend_server {<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server&nbsp;&nbsp; 192.168.1.2:8000 weight=1 max_fails=2 fail_timeout=30s;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server&nbsp;&nbsp; 192.168.1.3:8000 weight=1 max_fails=2 fail_timeout=30s;<br
/> &nbsp;&nbsp;&nbsp; }</p><p> server {<br
/> &nbsp;&nbsp;&nbsp; # listen port<br
/> &nbsp;&nbsp;&nbsp; listen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8000;</p><p> &nbsp;&nbsp;&nbsp; server_name&nbsp; img.591rmb.info<br
/> &nbsp;&nbsp;&nbsp; charset utf-8;</p><p> &nbsp;&nbsp;&nbsp; # root<br
/> &nbsp;&nbsp;&nbsp; include&nbsp;&nbsp;&nbsp;&nbsp; /usr/local/nginx/conf/module/path_params.conf;<br
/> &nbsp;&nbsp;&nbsp; root&nbsp;&nbsp; /var/www/<br
/> &nbsp;&nbsp;&nbsp; index&nbsp; index.html index.htm;</p><p> &nbsp;&nbsp;&nbsp; # blocked<br
/> &nbsp;&nbsp;&nbsp; location ~ .*\.(gif|jpg|png|jpeg|bmp|swf)$ {<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_next_upstream http_502 http_504 error timeout invalid_header;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_cache cache_one;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_cache_valid&nbsp; 200 304 30d;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_cache_key $host$uri$is_args$args;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_set_header Host&nbsp; $host;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_set_header X-Forwarded-For&nbsp; $remote_addr;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_pass http://backend_server;</p><p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expires max;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; access_log off;<br
/> &nbsp;&nbsp;&nbsp; }<br
/> &nbsp;&nbsp;&nbsp;#用于清除缓存，假设一个URL为http://192.168.8.42/test.txt，通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存<br
/> &nbsp;&nbsp;&nbsp;&nbsp;location ~ /purge(/.*)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;{<br
/> &nbsp;&nbsp;&nbsp;&nbsp; #设置只允许指定的IP或IP段才可以清除URL缓存。<br
/> &nbsp;&nbsp;&nbsp;&nbsp; allow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;127.0.0.1;<br
/> &nbsp;&nbsp;&nbsp;&nbsp; allow&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;192.168.0.0/16;<br
/> &nbsp;&nbsp;&nbsp;&nbsp; deny&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;all;<br
/> &nbsp;&nbsp;&nbsp;&nbsp; proxy_cache_purge&nbsp;&nbsp;&nbsp;&nbsp;cache_one&nbsp;&nbsp; $host$1$is_args$args;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;}&nbsp; <br
/> }</p></blockquote><p><strong>　五、启动Nginx</strong></p><blockquote><p>&nbsp;&nbsp;&nbsp; # /usr/local/nginx/sbin/nginx -t<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configuration file /usr/local/nginx/conf/nginx.conf test is successful<br
/> &nbsp;&nbsp;&nbsp; # /usr/local/nginx/sbin/nginx</p></blockquote><p>&nbsp;&nbsp;&nbsp; <strong>六、参考文献：</strong><br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a
href="http://blog.s135.com/nginx_cache" target="_blank">使用Nginx的proxy_cache缓存功能取代Squid[原创] </a>( <a
href="http://blog.s135.com/nginx_cache" target="_blank">http://blog.s135.com/nginx_cache</a> )</p><p> &nbsp;&nbsp; <strong>总结：</strong><br
/> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; Varnish3最新版还没有试用，后续找时间试一下，使用proxy_cache后，图片访问一切正常^-^。</p> ]]></content:encoded> <wfw:commentRss>http://www.591rmb.info/2011/06/%e4%bd%bf%e7%94%a8nginx%e7%9a%84proxy_cache%e7%bc%93%e5%ad%98%e5%8f%96%e4%bb%a3varnish/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>Python导入MSN联系人(web.py方式)</title><link>http://www.591rmb.info/2011/06/python%e5%af%bc%e5%85%a5msn%e8%81%94%e7%bb%9c%e4%ba%baweb-py%e6%96%b9%e5%bc%8f/</link> <comments>http://www.591rmb.info/2011/06/python%e5%af%bc%e5%85%a5msn%e8%81%94%e7%bb%9c%e4%ba%baweb-py%e6%96%b9%e5%bc%8f/#comments</comments> <pubDate>Mon, 27 Jun 2011 12:38:38 +0000</pubDate> <dc:creator>591rmb</dc:creator> <category><![CDATA[程序人生]]></category> <category><![CDATA[msn]]></category> <category><![CDATA[msn联系人]]></category> <category><![CDATA[msn联络人]]></category> <category><![CDATA[python]]></category> <guid
isPermaLink="false">http://www.591rmb.info/?p=261</guid> <description><![CDATA[　　导入MSN联络人，在各大网站是个很常见的功能，Google了一下，使用PHP导入MSN联络人的代码也是大把大把，然而在开发过程中，却是一波三折，我们分别使用了PHP的两个类库，都不同程序存在问题，令我们头痛不已： 　　1、MSN.getAddressList 　　　　部分联络人无法获取，可以正常显示MSN名称 　　2、PHPMSNCLASS 　　　　可以获取所有的联络人，部分联络人的MSN名称不显示 　　显然这两个PHP的类库都无法满足我们的要求，通过访问Sina微博、饭否，都是可以正常获取所有联络人及显示MSN名称，走投无路时，忽然想起可以使用其他语言来处理，也就是Python，以前也学习实战过，这次正好可以派上用场了。 　　msnlib，MSN的客户端软件，还自带了python的类库。 　　使用web.py，实现http协议，采用POST方式，返回JSON格式的联络人信息。 　　具体实现方法如下： 　　一、下载并安装msnlib： # wget http://blitiri.com.ar/p/msnlib/files/3.8/msnlib-3.8.tar.gz # tar zxvf msnlib-3.8.tar.gz # cd msnlib-3.8 # ./install # msnsetup # msn 　　PS: 执行msnsetup后，会请你输入账号与密码，然后执行msn，就自动登录了。 　　二、安装web.py： # wget http://webpy.org/static/web.py-0.35.tar.gz # tar zxvf web.py-0.35.tar.gz # cd web.py-0.35 # python setup.py install 　　三、msn.py 　　　有代码，有真相： #coding:utf-8 import socket, select, time, msnlib, msncb, web, urllib urls [...]]]></description> <content:encoded><![CDATA[<p>　　导入MSN联络人，在各大网站是个很常见的功能，<a
href="http://www.google.com.hk/#hl=zh-CN&amp;source=hp&amp;q=php+msn+&amp;oq=php+msn+&amp;aq=f&amp;aqi=g6&amp;aql=undefined&amp;gs_sm=e&amp;gs_upl=1516l3267l0l10l7l0l0l0l0l446l712l2-1.0.1l3&amp;fp=30e4162f3b4a74e7&amp;biw=1432&amp;bih=700" target="_blank">Google</a>了一下，使用PHP导入MSN联络人的代码也是大把大把，然而在开发过程中，却是一波三折，我们分别使用了PHP的两个类库，都不同程序存在问题，令我们头痛不已： <strong><br
/> 　　1、MSN.getAddressList</strong> <br
/> 　　　　部分联络人无法获取，可以正常显示MSN名称 <strong><br
/> 　　2、PHPMSNCLASS</strong> <br
/> 　　　　可以获取所有的联络人，部分联络人的MSN名称不显示 <br
/> 　　显然这两个PHP的类库都无法满足我们的要求，通过访问<a
href="http://weibo.com/" target="_blank">Sina微博</a>、<a
href="http://fanfou.com" target="_blank">饭否</a>，都是可以正常获取所有联络人及显示MSN名称，走投无路时，忽然想起可以使用其他语言来处理，也就是Python，以前也学习实战过，这次正好可以派上用场了。 <br
/> 　　<a
href="http://blitiri.com.ar/p/msnlib/">msnlib</a>，MSN的客户端软件，还自带了python的类库。 <br
/> 　　使用<a
href="http://webpy.org/" target="_blank">web.py</a>，实现http协议，采用POST方式，返回JSON格式的联络人信息。 <br
/> 　　具体实现方法如下：<br
/> 　　<strong>一、下载并安装msnlib：</strong></p><blockquote><p># wget http://blitiri.com.ar/p/msnlib/files/3.8/msnlib-3.8.tar.gz <br
/> # tar zxvf msnlib-3.8.tar.gz <br
/> # cd msnlib-3.8 <br
/> # ./install <br
/> # msnsetup <br
/> # msn</p></blockquote><p><strong>　　PS:</strong> 执行msnsetup后，会请你输入账号与密码，然后执行msn，就自动登录了。 <br
/> <strong>　　二、安装web.py：</strong></p><blockquote><p># wget http://webpy.org/static/web.py-0.35.tar.gz <br
/> # tar zxvf web.py-0.35.tar.gz <br
/> # cd web.py-0.35 <br
/> # python setup.py install</p></blockquote><p><strong>　　三、msn.py</strong> <br
/> 　　　有代码，有真相：</p><blockquote><p>#coding:utf-8<br
/> import socket, select, time, msnlib, msncb, web, urllib</p><p> urls = (<br
/> &nbsp;&nbsp;&nbsp; &#39;/&#39;, &#39;hello&#39;<br
/> )</p><p> web.config.debug = False<br
/> app = web.application(urls, globals())</p><p> class hello:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br
/> &nbsp;&nbsp;&nbsp; def POST(self):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = web.input()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result = get_friend_list(i.username, i.pwd)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if result is None:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return &#39;{status:false}&#39;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http_result = &#39;{status:true, body:[&#39;;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for k, v in result.iteritems():<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http_result = http_result + &#39;{name:&quot;&#39; + v.decode(&quot;utf-8&quot;, &quot;ignore&quot;) + &#39;&quot;,email:&quot;&#39; + k + &#39;&quot;},&#39;<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http_result = http_result[0:-1] + &#39;]}&#39;;</p><p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return http_result</p><p> def get_friend_list(email, password):<br
/> &nbsp;&nbsp;&nbsp; m = msnlib.msnd()<br
/> &nbsp;&nbsp;&nbsp; m.cb = msncb.cb()</p><p> &nbsp;&nbsp;&nbsp; m.email = email.strip()<br
/> &nbsp;&nbsp;&nbsp; m.pwd = password.strip()<br
/> &nbsp;&nbsp;&nbsp; m.encoding = &#39;utf-8&#39;<br
/> &nbsp;&nbsp;&nbsp; try:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.login()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.sync()<br
/> &nbsp;&nbsp;&nbsp; except:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<br
/> &nbsp;&nbsp;&nbsp; m.change_status(&#39;invisible&#39;)</p><p> &nbsp;&nbsp;&nbsp; begin_time = time.time()</p><p> &nbsp;&nbsp;&nbsp; users = set()<br
/> &nbsp;&nbsp;&nbsp; while True:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fds = m.pollable()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; infd = fds[0]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outfd = fds[1]</p><p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fds = select.select(infd, outfd, [], 0)</p><p> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in fds[0] + fds[1]:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.read(i)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except (&#39;SocketError&#39;, socket.error), err:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if i != m:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m.close(i)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; merge_users = users|set(m.users.keys())<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if len(users) == len(merge_users):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end_time = time.time()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if len(users):<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if end_time-begin_time &gt;= 2:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elif end_time-begin_time &gt;= 3:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time.sleep(0.05)<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; users = merge_users<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin_time = time.time()<br
/> &nbsp;&nbsp;&nbsp; result = {}<br
/> &nbsp;&nbsp;&nbsp; for i in users:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nick = m.users[i].nick<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i_lower = i.lower()<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if nick.lower() == i_lower:<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nick = nick.split(&quot;@&quot;, 1)[0]<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; result[i_lower] = nick<br
/> &nbsp;&nbsp;&nbsp; m.disconnect();<br
/> &nbsp;&nbsp;&nbsp; return result</p><p> if __name__ == &quot;__main__&quot;:<br
/> &nbsp;&nbsp;&nbsp; msnlib.debug = msncb.debug = void</p><p> &nbsp;&nbsp;&nbsp; app.run()<br
/> &nbsp;</p></blockquote><p><strong>　　</strong><strong>四、执行msn.py程式，并指定端口为8888：</strong></p><blockquote><p># python msn.py 8888</p></blockquote><p><strong>　　</strong><strong>五、参考文献：</strong><br
/> &nbsp;&nbsp;&nbsp;&nbsp; <strong>　　</strong> <a
href="http://kanrs.com/4_0.html" target="_blank">导入MSN联系人</a>（<a
href="http://kanrs.com/4_0.html" target="_blank">http://kanrs.com/4_0.html</a>）</p><p><strong>　　</strong><strong>总结：<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong><strong>　　</strong><strong>遇到难点时，可以跳出PHP世界，你就会发现不一样的美。<br
/> </strong></p> ]]></content:encoded> <wfw:commentRss>http://www.591rmb.info/2011/06/python%e5%af%bc%e5%85%a5msn%e8%81%94%e7%bb%9c%e4%ba%baweb-py%e6%96%b9%e5%bc%8f/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> <item><title>实战GeoIP</title><link>http://www.591rmb.info/2011/05/%e5%ae%9e%e6%88%98geoip/</link> <comments>http://www.591rmb.info/2011/05/%e5%ae%9e%e6%88%98geoip/#comments</comments> <pubDate>Tue, 31 May 2011 14:16:23 +0000</pubDate> <dc:creator>591rmb</dc:creator> <category><![CDATA[程序人生]]></category> <category><![CDATA[geoip]]></category> <category><![CDATA[php]]></category> <guid
isPermaLink="false">http://www.591rmb.info/?p=235</guid> <description><![CDATA[　　大名鼎鼎的GeoIP，是一个非常強大的IP库，提供了对应IP的国家、省市、经纬度，街道等信息，值得称赞的是，GeoIP也提供了免费(GeoLite)的版本，并且收费版本，也不贵。 　　GeoIP的API几乎涵盖了所有的主流开发语言，如C、PHP、Java、Perl、Ruby等等，也提供 Web Services的应用。 　　在PHP中，提供了GeoIP PECL库，以及PHP代码直接读取，还有Nginx的GeoIP的插件。 　　本文简单的介绍一下在PHP代码直接读取的方式。 　　一、下载GeoLiteCity.dat # wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz # gunzip GeoLiteCity.dat.gz # ls GeoLiteCity.dat 　　二、下载PHP的GeoIP的类文件和演示文件： 　　　　网址： http://geolite.maxmind.com/download/geoip/api/php/ 　　　　本站下载，点我 　　三、修改sample_city.php文件 　　　　将GeoIPCity.dat的文件路径，指向实际的路径，以及获取客户端的IP地址： $gi = geoip_open(“./GeoLiteCity.dat”,GEOIP_STANDARD); $record = geoip_record_by_addr($gi, getenv(&#8216;REMOTE_ADDR&#8217;)); 　　四、完成 　　　　执行sample_city.php，就可以看到你的实际位置了，单击下面的网址查看你的位置吧！ 　　　　http://www.591rmb.info/geoip/]]></description> <content:encoded><![CDATA[<p>　　大名鼎鼎的<a
href="http://www.maxmind.com/app/geolitecity" target="_blank">GeoIP</a>，是一个非常強大的IP库，提供了对应IP的国家、省市、经纬度，街道等信息，值得称赞的是，GeoIP也提供了免费(GeoLite)的版本，并且收费版本，也不贵。<br
/> 　　GeoIP的API几乎涵盖了所有的主流开发语言，如<a
href="http://www.maxmind.com/app/c" target="_blank">C</a>、<a
href="http://www.maxmind.com/app/php" target="_blank">PHP</a>、<a
href="http://www.maxmind.com/app/java" target="_blank">Java</a>、<a
href="http://www.maxmind.com/app/perl" target="_blank">Perl</a>、<a
href="http://www.maxmind.com/app/ruby" target="_blank">Ruby</a>等等，也提供	Web Services的应用。<br
/> 　　在PHP中，提供了<a
href="http://pecl.php.net/package/geoip" target="_blank">GeoIP PECL</a>库，以及PHP代码直接读取，还有Nginx的<a
href="http://wiki.nginx.org/HttpGeoIPModule" target="_blank">GeoIP</a>的插件。<br
/> 　　本文简单的介绍一下在PHP代码直接读取的方式。<br
/> 　　<strong>一、下载GeoLiteCity.dat</strong></p><blockquote><p> # wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz<br
/> # gunzip GeoLiteCity.dat.gz<br
/> # ls<br
/> GeoLiteCity.dat</p></blockquote><p>　　<strong>二、下载PHP的GeoIP的类文件和演示文件：</strong><br
/> 　　　　网址： <a
href="http://geolite.maxmind.com/download/geoip/api/php/">http://geolite.maxmind.com/download/geoip/api/php/</a><br
/> 　　　　<a
href='http://www.591rmb.info/wp-content/uploads/2011/05/geoip.zip'>本站下载，点我</a><br
/> 　　<strong>三、修改sample_city.php文件 </strong><br
/> 　　　　将GeoIPCity.dat的文件路径，指向实际的路径，以及获取客户端的IP地址：<br
/><blockquote> $gi = geoip_open(“./GeoLiteCity.dat”,GEOIP_STANDARD);<br
/> $record = geoip_record_by_addr($gi, getenv(&#8216;REMOTE_ADDR&#8217;));</p></blockquote><p>　　<strong>四、完成</strong><br
/> 　　　　执行sample_city.php，就可以看到你的实际位置了，单击下面的网址查看你的位置吧！<br
/> 　　　　<a
href="http://www.591rmb.info/geoip/">http://www.591rmb.info/geoip/</a></p> ]]></content:encoded> <wfw:commentRss>http://www.591rmb.info/2011/05/%e5%ae%9e%e6%88%98geoip/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>博客启用网页划词功能</title><link>http://www.591rmb.info/2011/05/bing_dict/</link> <comments>http://www.591rmb.info/2011/05/bing_dict/#comments</comments> <pubDate>Mon, 30 May 2011 13:23:15 +0000</pubDate> <dc:creator>591rmb</dc:creator> <category><![CDATA[互联星空]]></category> <category><![CDATA[必应bin云词典]]></category> <category><![CDATA[爱词霸]]></category> <category><![CDATA[译言网]]></category> <guid
isPermaLink="false">http://www.591rmb.info/?p=197</guid> <description><![CDATA[　　在“译言网”逗留着，发现他们使用的”必应”网页划词功能挺不错的，还包含拼音、速度也飞快的。 　　Baidu一下，发现金山的“爱词霸”也挺不错的，功能也很强，以下我就简单的介绍一下各自的使用方法： 　　一、爱词霸( http://web.iciba.com/partner/jhjy04.shtml )： 　　爱词霸提供了网页插件、浏览器插件、客户端插件，还提供了开放平台API，可以自定义查询，真是很强大。　　把代码放置footer.php，调用代码如下： &#60;script type=”text/javascript”&#62; var iciba_param =new Array(); iciba_param['skin'] = 1;// 皮肤 iciba_param['searchInputDisplay'] = &#8216;block&#8217;;// 搜索框是否显示 默认是” 当为 &#8216;none&#8217;的时候不显示 iciba_param['searchInputWidth'] =210;////输入框长度 当iciba_param['searchInputDisplay'] !=&#8217;none&#8217;的时候起作用 iciba_param['isCanDraw'] = &#8217;1&#8242;;//是否能拖动？0表示不可以拖动 默认为1可拖动 iciba_param['selfDeter'] =&#8217;1&#8242;;//是否自己划词自己？0 表示不可以 iciba_param['width'] = &#8217;325&#8242;; // 宽度 iciba_param['height'] = &#8217;200&#8242;;  // 内容高度 iciba_param['isPopIcon'] =&#8217;0&#8242;;//是否需要 小icon 需要为1 不需要为0 iciba_param['isInputCan'] =&#8217;0&#8242;;//是否能在文本域输入框内划词 默认不可以 只有&#8217;1&#8242;的时候才能起作用 iciba_param['context']=[['Dict',''],['Love',''],['Fy',''],['Tf',''],['Dj',''],['Enen',''],['NetDict','']];//词典功能 &#60;/script&#62; [...]]]></description> <content:encoded><![CDATA[<p>　　在“<a
href="http://www.yeeyan.org/" target="_blank">译言网</a>”逗留着，发现他们使用的”<a
href="http://www.bing.com" target="_blank">必应</a>”网页划词功能挺不错的，还包含拼音、速度也飞快的。</p><p>　　Baidu一下，发现金山的“爱词霸”也挺不错的，功能也很强，以下我就简单的介绍一下各自的使用方法：</p><p>　　<strong>一、</strong><a
href="http://web.iciba.com/partner/jhjy04.shtml" target="_blank"><strong>爱词霸</strong></a>( <a
href="http://web.iciba.com/partner/jhjy04.shtml" target="_blank">http://web.iciba.com/partner/jhjy04.shtml</a> )：</p><p>　　<a
href="http://web.iciba.com/partner/jhjy04.shtml" target="_blank">爱词霸</a>提供了网页插件、浏览器插件、客户端插件，还提供了开放平台API，可以自定义查询，真是很强大。<br
/>　　把代码放置footer.php，调用代码如下：</p><blockquote><p>&lt;script type=”text/javascript”&gt;<br
/> var iciba_param =new Array();<br
/> iciba_param['skin'] = 1;// 皮肤<br
/> iciba_param['searchInputDisplay'] = &#8216;block&#8217;;// 搜索框是否显示 默认是” 当为 &#8216;none&#8217;的时候不显示<br
/> iciba_param['searchInputWidth'] =210;////输入框长度 当iciba_param['searchInputDisplay'] !=&#8217;none&#8217;的时候起作用<br
/> iciba_param['isCanDraw'] = &#8217;1&#8242;;//是否能拖动？0表示不可以拖动 默认为1可拖动<br
/> iciba_param['selfDeter'] =&#8217;1&#8242;;//是否自己划词自己？0 表示不可以<br
/> iciba_param['width'] = &#8217;325&#8242;; // 宽度<br
/> iciba_param['height'] = &#8217;200&#8242;;  // 内容高度<br
/> iciba_param['isPopIcon'] =&#8217;0&#8242;;//是否需要 小icon 需要为1 不需要为0<br
/> iciba_param['isInputCan'] =&#8217;0&#8242;;//是否能在文本域输入框内划词 默认不可以 只有&#8217;1&#8242;的时候才能起作用<br
/> iciba_param['context']=[['Dict',''],['Love',''],['Fy',''],['Tf',''],['Dj',''],['Enen',''],['NetDict','']];//词典功能<br
/> &lt;/script&gt;<br
/> &lt;script type=”text/javascript” src=”http://dict-co.iciba.com/ui.php” charset=”UTF-8&#8243;&gt;&lt;/script&gt;</p></blockquote><p>　　<a
href="http://www.591rmb.info/wp-content/uploads/2011/05/1.png"><img
class="alignnone size-full wp-image-205" title="爱词霸" src="http://www.591rmb.info/wp-content/uploads/2011/05/1.png" alt="" width="368" height="352" /></a></p><p>&nbsp;</p><p>　　<strong>二、</strong><a
href="http://dict.bing.com.cn/cloudwidget/Default.aspx" target="_blank"><strong>必应云词典</strong></a>（ <a
href="http://dict.bing.com.cn/cloudwidget/Default.aspx" target="_blank">http://dict.bing.com.cn/cloudwidget/Default.aspx</a> ）<br
/> 　　<a
href="http://dict.bing.com.cn/cloudwidget/Default.aspx" target="_blank">必应云词典</a> 很简洁，还可以针对句子进行翻译，”爱词霸”没有此功能，我很喜欢它显示拼音及音调的功能，调用代码也很简单：</p><blockquote><p>&lt;script type=”text/javascript” src=”http://dict.bing.com.cn/cloudwidget/Scripts/Generated/BingTranslate_Hover_Phrase_Selection_ShowIcon.js”&gt;&lt;/script&gt;<br
/> &lt;script type=”text/javascript”&gt;<br
/> BingCW.Init({<br
/> AppID:”www.591rmb.info”,      // 换成你博客的网址即可。<br
/> MachineTranslation:true,<br
/> WebDefinition:true<br
/> })&lt;/script&gt;</p></blockquote><p>　　<a
href="http://www.591rmb.info/wp-content/uploads/2011/05/2.png"><img
class="alignnone size-full wp-image-208" title="bing云词典" src="http://www.591rmb.info/wp-content/uploads/2011/05/2.png" alt="" width="367" height="215" /></a><br
/> 　　<a
href="http://www.591rmb.info/wp-content/uploads/2011/05/3.png"><img
class="alignnone size-full wp-image-209" title="bing云词典" src="http://www.591rmb.info/wp-content/uploads/2011/05/3.png" alt="" width="293" height="132" /></a></p><p>&nbsp;</p><p><strong>结束语：</strong><br
/> 　　<strong>两款工具各有千秋，根据自己的需求而定，最后我决定支持国产的“<a
href="http://web.iciba.com/partner/jhjy04.shtml" target="_blank">爱词霸</a>”^-^</strong></p> ]]></content:encoded> <wfw:commentRss>http://www.591rmb.info/2011/05/bing_dict/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>MooseFS分布式文件系统简介</title><link>http://www.591rmb.info/2011/04/moosefs%e5%88%86%e5%b8%83%e5%bc%8f%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e7%ae%80%e4%bb%8b/</link> <comments>http://www.591rmb.info/2011/04/moosefs%e5%88%86%e5%b8%83%e5%bc%8f%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e7%ae%80%e4%bb%8b/#comments</comments> <pubDate>Sat, 30 Apr 2011 07:58:32 +0000</pubDate> <dc:creator>591rmb</dc:creator> <category><![CDATA[网站架构]]></category> <category><![CDATA[moosefs]]></category> <category><![CDATA[nfs]]></category> <guid
isPermaLink="false">http://www.591rmb.info/?p=187</guid> <description><![CDATA[简单介绍了Moosefs的优势，欢迎拍砖。 Moosefs 总结： &#160;&#160;&#160; &#160;&#160; 初步了解MooseFS后，感觉如果有更好的HA，以及跨机房备份问题，那就非常适合我们了^-^。]]></description> <content:encoded><![CDATA[<p>简单介绍了Moosefs的优势，欢迎拍砖。</p><div
id="__ss_7785049" style="width: 425px;"><strong
style="display: block; margin: 12px 0pt 4px;"><a
href="http://www.slideshare.net/phpcleps/moosefs" title="Moosefs">Moosefs</a></strong><object
height="355" id="__sse7785049" width="425"><param
name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=moosefs-110430025353-phpapp02&amp;stripped_title=moosefs&amp;userName=phpcleps" /><param
name="wmode" value="transparent" /><param
name="allowFullScreen" value="true" /><param
name="allowScriptAccess" value="always" /><embed
allowfullscreen="true" allowscriptaccess="always" height="481" name="__sse7785049" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=moosefs-110430025353-phpapp02&amp;stripped_title=moosefs&amp;userName=phpcleps" type="application/x-shockwave-flash" width="576" wmode="transparent"></embed></object></div><p> <strong>总结：</strong><br
/> &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; 初步了解MooseFS后，感觉如果有更好的HA，以及跨机房备份问题，那就非常适合我们了^-^。</p> ]]></content:encoded> <wfw:commentRss>http://www.591rmb.info/2011/04/moosefs%e5%88%86%e5%b8%83%e5%bc%8f%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e7%ae%80%e4%bb%8b/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>NFS服务器采用DRBD实时备份</title><link>http://www.591rmb.info/2011/04/nfs%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%87%87%e7%94%a8drbd%e5%ae%9e%e6%97%b6%e5%a4%87%e4%bb%bd/</link> <comments>http://www.591rmb.info/2011/04/nfs%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%87%87%e7%94%a8drbd%e5%ae%9e%e6%97%b6%e5%a4%87%e4%bb%bd/#comments</comments> <pubDate>Sat, 30 Apr 2011 07:36:30 +0000</pubDate> <dc:creator>591rmb</dc:creator> <category><![CDATA[网站架构]]></category> <category><![CDATA[drbd]]></category> <category><![CDATA[moosefs]]></category> <category><![CDATA[nfs]]></category> <category><![CDATA[sersync]]></category> <guid
isPermaLink="false">http://www.591rmb.info/?p=172</guid> <description><![CDATA[&#160;&#160;&#160;&#160;&#160; NFS （Network File System Server）文件服务器，我们一直用它，值得依赖。然而我们不得不面临一个难题，文件如何备份？从最初的使用Rsync，Glusterfs(性能很差，适用于大型存储)，到Serync，随着目录和文件数目不断增长，我们开启Sersync后，负载直接飙升到20，让我们不得不思考使用其他方式进行备份。 &#160;&#160;&#160;&#160;&#160; Moosefs在国内使用的人很多，采用C语言开发，经过测试，效率很高，元数据服务器也有单点故障，虽然可以使用log服务器解决，不过还是不保险，网上建议使用DRBD进行备份元数据，不能使用跨机房备份。考虑到自身网站的易用性，服务数量、跨机房备份等因素，没有尽善尽美的方案，适合自己才是最好的，综合考量下，准备采用DRBD进行文件备份。 &#160;&#160;&#160;&#160; DRBD(Distributed Replicated Block Device) 号称是 &#34;网络 RAID&#34;，当数据写入本地文件系统时，会发送到另一台主机上，本地与远程主机的数据可以保证实时同步，当本地系统出现故障时，远程主机上还会保留有一份相同的数据，可以继续使用，通常都是配合Keepalived或者HeartBeat使用，使用网站的高可用性（HA: High Availability）方案，网上有非常多的成功案例，其中，MySQL 几种高可用解决方案中，使用HeartBeat+DRBD可以达到99.9%可用性级别，那是非常高的。 &#160;&#160;&#160;&#160; 本文主要是讲述DRBD的配置和使用，以后会讲述HeartBeat+DRBD的方案。 一、环境： VMware下测试 CentOS 5.2 /dev/sdb1 设备 192.168.192.129 nfs1 (Primary主节点) 192.168.192.131 nfs2 (Secondary备份节点) 1）设定hosts文件，修改两台机器： # vi /etc/hosts 192.168.192.129 nfs1 192.168.192.131 nfs2 2）、 修改主机名，分别在两台机器设定，注意nfs1和nfs2主机名不相同： # vi /etc/sysconfig/network &#160; HOSTNAME=nfs1 # service network restart 查看主机名，是否为nfs1或nfs2 # hostname [...]]]></description> <content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NFS （Network File System Server）文件服务器，我们一直用它，值得依赖。然而我们不得不面临一个难题，文件如何备份？从最初的使用Rsync，Glusterfs(性能很差，适用于大型存储)，到Serync，随着目录和文件数目不断增长，我们开启Sersync后，负载直接飙升到20，让我们不得不思考使用其他方式进行备份。<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Moosefs在国内使用的人很多，采用C语言开发，经过测试，效率很高，元数据服务器也有单点故障，虽然可以使用log服务器解决，不过还是不保险，网上建议使用DRBD进行备份元数据，不能使用跨机房备份。考虑到自身网站的易用性，服务数量、跨机房备份等因素，没有尽善尽美的方案，适合自己才是最好的，综合考量下，准备采用DRBD进行文件备份。<br
/> &nbsp;&nbsp;&nbsp;&nbsp; <span
class="byline"><a
href="http://www.drbd.org/">DRBD</a>(Distributed Replicated Block Device) 号称是 &quot;网络 RAID&quot;，</span>当数据写入本地文件系统时，会发送到另一台主机上，本地与远程主机的数据可以保证实时同步，当本地系统出现故障时，远程主机上还会保留有一份相同的数据，可以继续使用，通常都是配合Keepalived或者HeartBeat使用，使用网站的高可用性（HA: High Availability）方案，网上有非常多的成功案例，其中，MySQL 几种高可用解决方案中，使用<strong>HeartBeat+DRBD</strong>可以达到<strong>99.9%</strong>可用性级别，那是非常高的。<br
/> &nbsp;&nbsp;&nbsp;&nbsp; 本文主要是讲述DRBD的配置和使用，以后会讲述HeartBeat+DRBD的方案。<br
/> <strong>一、环境：</strong><br
/> VMware下测试<br
/> CentOS 5.2<br
/> /dev/sdb1 设备<br
/> 192.168.192.129 nfs1 (Primary主节点)<br
/> 192.168.192.131 nfs2 (Secondary备份节点)<br
/> <strong>1）设定hosts文件，修改两台机器：</strong><br
/> # vi /etc/hosts<br
/> 192.168.192.129 nfs1<br
/> 192.168.192.131 nfs2<br
/> <strong><br
/> 2）、 修改主机名，分别在两台机器设定，注意nfs1和nfs2主机名不相同：</strong><br
/> # vi /etc/sysconfig/network<br
/> &nbsp; HOSTNAME=nfs1<br
/> # service network restart<br
/> 查看主机名，是否为nfs1或nfs2<br
/> # hostname<br
/> &nbsp; &nbsp; nfs1<br
/> <strong><br
/> 二、安装DRBD设置（两台机器相同的配置）</strong><br
/> <strong>1）使用yum安装</strong><br
/> # yum -y install drbd83 kmod-drbd83<br
/> <strong>2）加载DRBD模块</strong><br
/> 安装完成后，需要加载DRBD模块<br
/> # lsmod | grep drbd<br
/> # modprobe drbd<br
/> # lsmod | grep drbd<br
/> <strong>3）自动加载DRBD模块</strong><br
/> 修改/etc/rc.local，添加 modprobe drbd<br
/> <strong>4）修改/etc/drbd.conf配置文件：</strong><br
/> 配置资源 r0，可重命名。<br
/> # vi /etc/drbd.conf</p><blockquote><p>global {<br
/> &nbsp; usage-count yes;<br
/> }</p><p> resource r0 {&nbsp;&nbsp;&nbsp;&nbsp; <br
/> &nbsp; protocol C;&nbsp;&nbsp; <br
/> &nbsp; startup {<br
/> &nbsp;&nbsp;&nbsp; wfc-timeout 0;<br
/> &nbsp;&nbsp;&nbsp; degr-wfc-timeout 120;<br
/> &nbsp; }</p><p> &nbsp; disk {<br
/> &nbsp;&nbsp;&nbsp; on-io-error&nbsp;&nbsp; detach;<br
/> &nbsp;&nbsp;&nbsp; # no-disk-flushes;<br
/> &nbsp;&nbsp;&nbsp; # no-md-flushes<br
/> &nbsp;&nbsp;&nbsp; # size 1G;<br
/> &nbsp;&nbsp; }</p><p> &nbsp; net {<br
/> &nbsp;&nbsp; }</p><p> on nfs1 {<br
/> &nbsp;&nbsp; device&nbsp;&nbsp;&nbsp; /dev/drbd0;<br
/> &nbsp;&nbsp; disk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /dev/sdb1;<br
/> &nbsp;&nbsp; address&nbsp;&nbsp; 192.168.192.129:7789;<br
/> &nbsp;&nbsp; meta-disk internal;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br
/> &nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p> on nfs2 {<br
/> &nbsp;&nbsp; device&nbsp;&nbsp;&nbsp; /dev/drbd0;<br
/> &nbsp;&nbsp; disk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /dev/sdb1;<br
/> &nbsp;&nbsp; address&nbsp;&nbsp; 192.168.192.131:7789;<br
/> &nbsp;&nbsp; meta-disk internal;<br
/> &nbsp; }<br
/> }</p></blockquote><p><strong>5）建立资源r0（两台机执行）：</strong><br
/> [root@localhost ~]# drbdadm create-md r0<br
/> Writing meta data&#8230;<br
/> initializing activity log<br
/> NOT initialized bitmap<br
/> New drbd meta data block successfully created.<br
/> <strong>6）启动DRBD（两台机执行）</strong><br
/> [root@localhost ~]# service drbd start<br
/> Starting DRBD resources: [ <br
/> r0<br
/> Found valid meta data in the expected location, 1069248512 bytes into /dev/sdb1.<br
/> d(r0) n(r0) ].<br
/> <strong>7）设定主节点 nfs1 ，nfs2不需要操作：</strong><br
/> 定义为主节点<br
/> # drbdsetup /dev/drbd0 primary -o<br
/> 格式化<br
/> # mkfs.ext3 /dev/drbd0<br
/> 挂载到/data目录<br
/> # mkdir /data<br
/> # mount /dev/drbd0 /data&nbsp; <br
/> <strong>8）查看状态nfs1：</strong><br
/> # cat /proc/drbd<br
/> version: 8.3.8 (api:88/proto:86-94)<br
/> GIT-hash: d78846e52224fd00562f7c225bcc25b2d422321d build by mockbuild@builder10.centos.org, 2010-06-04 08:04:16<br
/> &nbsp;0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r&#8212;-<br
/> &nbsp;&nbsp;&nbsp; ns:39028 nr:0 dw:33216 dr:5933 al:13 bm:1 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:1007200<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [&gt;....................] sync&#39;ed:&nbsp; 4.0% (1007200/1044124)K delay_probe: 25141<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finish: 0:41:57 speed: 360 (2,172) K/sec<br
/> UpToDate/Inconsistent 代表，数据正在同步中<br
/> 如果是 UpToDate/Update 则代表，数据已经同步完成。</p><p> <strong>三、维护</strong><br
/> <strong>1) DRBD的主备机切换</strong></p><p> 有时,你需要将DRBD的主备机互换一下.可以执行下面的操作:<br
/> 在主机上,先要卸载掉DRBD设备:<br
/> # umount /data</p><p> 将主机降级为&rdquo;备机&rdquo;.<br
/> # drbdadm secondary r0<br
/> 可看到两台机都是secondary状态<br
/> # cat /proc/drbd<br
/> drbdadm primary r0<br
/> 就将从机升级为主机了。</p><p> <strong>总结：</strong><br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目前准备小范围的进行线上测试，如果一切顺利的话，也会用Mysql的HA中，有网友测试，会损耗5%的性能，这个还是可以接受的。<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文内容来自源于笔记，下次配置DRBD，再把图片等内容补上。</p><p> &nbsp;</p> ]]></content:encoded> <wfw:commentRss>http://www.591rmb.info/2011/04/nfs%e6%9c%8d%e5%8a%a1%e5%99%a8%e9%87%87%e7%94%a8drbd%e5%ae%9e%e6%97%b6%e5%a4%87%e4%bb%bd/feed/</wfw:commentRss> <slash:comments>3</slash:comments> </item> <item><title>PHPExcel和Spreadsheet_Excel_Writer对比</title><link>http://www.591rmb.info/2011/03/phpexcel%e7%ae%80%e4%bb%8b/</link> <comments>http://www.591rmb.info/2011/03/phpexcel%e7%ae%80%e4%bb%8b/#comments</comments> <pubDate>Thu, 31 Mar 2011 15:08:34 +0000</pubDate> <dc:creator>591rmb</dc:creator> <category><![CDATA[程序人生]]></category> <guid
isPermaLink="false">http://www.591rmb.info/?p=136</guid> <description><![CDATA[&#160;&#160;&#160;&#160; PHPExcel是一个非常强大的操作Excel文件的PHP类库，可以生成复杂的Excel文件，phpMyAdmin的导出Excel就是使用的PHPExcel。 &#160;&#160;&#160;&#160; 具体的使用方法，可以参考 http://www.zeali.net/entry/556 ，这里有详细的介绍。 &#160;&#160;&#160;&#160; 目前，我使用过PHPExcel和Spreadsheet_Excel_Writer，Excel2007可支持1048576行，而低版本只支持65536行，在这里说说各自优缺点： &#160;&#160;&#160;&#160;&#160; PHPExcel： &#160; &#160; &#160;&#160;&#160; 1、可以生成相当复杂的Excel文档，可以添加图片； &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 2、可导出低版本格式，Excel 2007格式； &#160;&#160;&#160;&#160;&#160;&#160;&#160; 3、包含转换为PDF文件的类； &#160;&#160;&#160;&#160;&#160;&#160;&#160; 4、可以修改Excel文件； &#160;&#160;&#160;&#160;&#160;&#160;&#160; 4、内存消耗相当大。 &#160;&#160;&#160;&#160;&#160; Spreadsheet_Excel_Writer优缺点： &#160;&#160;&#160;&#160;&#160;&#160;&#160; 1、不能导出Excel 2007格式； &#160;&#160;&#160;&#160;&#160;&#160;&#160; 2、不能修改Excel文件。 &#160;&#160;&#160;&#160;&#160;&#160;&#160; 3、内存消耗比较少。 &#160;&#160;&#160;&#160;&#160; 测试数据，查看内存消耗量： &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; 使用PHPExcel和Spreadsheet_Excel_Writer导出7万笔记录，26个字段。 &#160; 名称 内存 结果 PHPExcel &#62;2G 失败，电脑上报内存不足 Spreadsheet_Excel_Writer 700M 成功 &#160; 总结： &#160;&#160;&#160;&#160;&#160;&#160;&#160; 可根据自身的需求，而进行选择，如果数据量非常大时，可以采用Excel 2003的XML格式。]]></description> <content:encoded><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; PHPExcel是一个非常强大的操作Excel文件的PHP类库，可以生成复杂的Excel文件，phpMyAdmin的导出Excel就是使用的PHPExcel。<br
/> &nbsp;&nbsp;&nbsp;&nbsp; 具体的使用方法，可以参考 http://www.zeali.net/entry/556 ，这里有详细的介绍。<br
/> &nbsp;&nbsp;&nbsp;&nbsp; 目前，我使用过PHPExcel和Spreadsheet_Excel_Writer，Excel2007可支持<font
size="-1">1048576行</font>，而低版本只支持65536行，在这里说说各自优缺点：<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PHPExcel：<br
/> &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; 1、可以生成相当复杂的Excel文档，可以添加图片；<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、可导出低版本格式，Excel 2007格式；<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、包含转换为PDF文件的类；<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、可以修改Excel文件；<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、内存消耗相当大。<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Spreadsheet_Excel_Writer优缺点：<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、不能导出Excel 2007格式；<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、不能修改Excel文件。<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、内存消耗比较少。<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 测试数据，查看内存消耗量：<br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用PHPExcel和Spreadsheet_Excel_Writer导出7万笔记录，26个字段。<br
/> &nbsp;</p><table
border="1" cellpadding="1" cellspacing="1" style="width: 358px; height: 63px;"><tbody><tr><td>名称</td><td>内存</td><td>结果</td></tr><tr><td>PHPExcel</td><td>&gt;2G</td><td>失败，电脑上报内存不足</td></tr><tr><td>Spreadsheet_Excel_Writer</td><td>700M</td><td>成功</td></tr></tbody></table><p>&nbsp;</p><p><strong>总结：</strong><br
/> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可根据自身的需求，而进行选择，如果数据量非常大时，可以采用Excel 2003的XML格式。</p> ]]></content:encoded> <wfw:commentRss>http://www.591rmb.info/2011/03/phpexcel%e7%ae%80%e4%bb%8b/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> </channel> </rss>
