-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
448 lines (342 loc) · 78.9 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>answerwa</title>
<link href="/atom.xml" rel="self"/>
<link href="https://answerwa.github.io/"/>
<updated>2017-08-31T14:12:39.099Z</updated>
<id>https://answerwa.github.io/</id>
<author>
<name>Zhao Junchi</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>记一次 system() 引起的端口抢占</title>
<link href="https://answerwa.github.io/2017/08/30/%E8%AE%B0%E4%B8%80%E6%AC%A1%20system()%20%E5%BC%95%E8%B5%B7%E7%9A%84%E7%AB%AF%E5%8F%A3%E6%8A%A2%E5%8D%A0/"/>
<id>https://answerwa.github.io/2017/08/30/记一次 system() 引起的端口抢占/</id>
<published>2017-08-30T14:12:17.000Z</published>
<updated>2017-08-31T14:12:39.099Z</updated>
<content type="html"><![CDATA[<h2 id="写在前面"><a href="#写在前面" class="headerlink" title="写在前面"></a>写在前面</h2><p>在写代码时,难免需要调用别的命令获取一些信息,这时可以用<code>popen()</code>拿到需要的信息;有时又需要启动其他服务,这时可能会用<code>system()</code>直接调用启动该服务的命令。这次要说的,就是用<code>system()</code>函数调用 daemon 进程可能会引起的问题。</p>
<h2 id="现象描述"><a href="#现象描述" class="headerlink" title="现象描述"></a>现象描述</h2><p>最近在项目中加入了一个程序A,监听 5081 端口,用于设备间通信。当收到特定的消息时,就会通过 rsync 将指定设备的一些文件拷贝到本机,再重启一些进程。有时就会发现,在重启这些进程的时候,5081 端口可能就会被 B,C,D 进程占用(不是必现,但是很容易复现,而且一定是这几个进程占用)。开始怀疑可能是进程A挂了,被monitor(系统中一个监控各进程生死的脚本)重启了,但是多次发现后确认进程A自始至终没有挂过。还有一个情况是进程 B,C,D 的代码中,并没有监听 5081 端口,有的是监听别的已指定的端口,有的根本则不需要监听端口。而且当进程 A 被杀掉后 B,C,D 必然会监听 5081 端口。</p>
<h2 id="问题分析"><a href="#问题分析" class="headerlink" title="问题分析"></a>问题分析</h2><p>发现问题后,也没什么眉目,和大家讨论了不少,大家觉得最不可思议的就是,A进程既然没有挂,为何B,C,D进程就能抢到A进程已经监听的端口,而且B,C,D进程在代码中并未去监听 5081 端口。后来在走查代码时发现在程序A中用<code>system()</code>调用了一个脚本,而在这个脚本中重启了 B,C,D 进程。这才想到会不会和这个<code>system()</code>有关系。</p>
<h3 id="关于-system"><a href="#关于-system" class="headerlink" title="关于 system()"></a>关于 system()</h3><p>通过 manpage 我们可以了解<code>system()</code>函数的实现原理:</p>
<blockquote>
<p>The system() library function uses fork(2) to create a child process that executes the shell command specified in command using execl(3) as follows:</p>
<p> execl(“/bin/sh”, “sh”, “-c”, command, (char *) 0);</p>
<p> system() returns after the command has been completed.</p>
</blockquote>
<p>可见,<code>system()</code>函数首先调用<code>fork()</code>创建出一个子进程,再在子进程中调用<code>execl()</code>执行参数中的命令。而关于<code>execl()</code>函数,我们同样可以通过 manpage 了解:</p>
<blockquote>
<p>The exec() family of functions replaces the current process image with a new process image.</p>
</blockquote>
<p><code>execl()</code>函数是属于<code>exec()</code>族的,它会用参数中的新程序替换当前的进程。</p>
<h3 id="关于-fork"><a href="#关于-fork" class="headerlink" title="关于 fork()"></a>关于 fork()</h3><p>大家都知道,<code>fork()</code>产生的子进程,会拷贝父进程的数据段、堆栈等资源(Copy-On-Write),当然也包括打开的socket,既然今天说的是端口抢占,那么肯定和socket相关。在 manpage 中,我们同样可以看到以下信息:</p>
<blockquote>
<p>The child inherits copies of the parent’s set of open file descriptors. Each file descriptor in the child refers to the same open file description(see open(2)) as the corresponding file descriptor in the parent. This means that the two descriptors share open file status flags, current file offset, and signal-driven I/O attributes (see the description of F_SETOWN and F_SETSIG in fcntl(2)).</p>
</blockquote>
<h3 id="结论"><a href="#结论" class="headerlink" title="结论"></a>结论</h3><p>通过上面关于<code>system()</code>和<code>fork()</code>的分析,可以知道,问题产生的原因,就是我在A进程中打开了 5081 端口的 socket,然后在通过<code>system()</code>重启B,C,D进程的时候,B,C,D进程作为A进程的子进程,复制了 5081 端口的 socket,因此可能会发生抢占 5081 端口的情况。</p>
<h3 id="问题复现"><a href="#问题复现" class="headerlink" title="问题复现"></a>问题复现</h3><p>写了两个小程序 process_A 和 process_B,在 process_A 中监听了 5081 端口,然后通过<code>system()</code>调用 process_B,这时查看 process_B 如果拥有和 process_A 同样的 socket 就可以验证上述结论。然后再杀掉 process_A 如果此时 process_B 抢占 5081 端口则进一步验证上述结论。</p>
<p>需分别编译成 process_A 和 process_B。</p>
<p>process_A代码如下:</p>
<figure class="highlight c"><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></pre></td><td class="code"><pre><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdlib.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><unistd.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><sys/socket.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><sys/types.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><signal.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><arpa/inet.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><strings.h></span></span></div><div class="line"></div><div class="line"><span class="meta">#<span class="meta-keyword">define</span> SYNC_SERVER_PORT 5081</span></div><div class="line"></div><div class="line"><span class="keyword">static</span> <span class="keyword">int</span> g_sockfd;</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">int</span> <span class="title">init_socket</span><span class="params">()</span></span></div><div class="line"><span class="function"></span>{</div><div class="line"> <span class="class"><span class="keyword">struct</span> <span class="title">sockaddr_in</span> <span class="title">server</span>;</span></div><div class="line"> <span class="keyword">int</span> sockfd;</div><div class="line"></div><div class="line"> sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);</div><div class="line"> <span class="keyword">if</span> (sockfd < <span class="number">0</span>) {</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"Creating socket failed.\n"</span>);</div><div class="line"> <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> bzero(&server, <span class="keyword">sizeof</span>(server));</div><div class="line"> server.sin_family = AF_INET;</div><div class="line"> server.sin_port = htons(SYNC_SERVER_PORT);</div><div class="line"> server.sin_addr.s_addr = htonl(INADDR_ANY);</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (bind(sockfd, (struct sockaddr *)&server, <span class="keyword">sizeof</span>(struct sockaddr))\</div><div class="line"> == <span class="number">-1</span>) {</div><div class="line"></div><div class="line"> <span class="built_in">printf</span>(<span class="string">"Bind error.\n"</span>);</div><div class="line"> <span class="keyword">goto</span> error;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">return</span> sockfd;</div><div class="line"></div><div class="line">error:</div><div class="line"> close(sockfd);</div><div class="line"> <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line">}</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">void</span> <span class="title">process_exit</span><span class="params">(<span class="keyword">int</span> signal)</span></span></div><div class="line"><span class="function"></span>{</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"process exit.\n"</span>);</div><div class="line"> <span class="keyword">if</span>(g_sockfd > <span class="number">0</span>) {</div><div class="line"> close(g_sockfd);</div><div class="line"> }</div><div class="line"> <span class="built_in">exit</span>(<span class="number">0</span>);</div><div class="line">}</div><div class="line"></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span> **argv)</span></span></div><div class="line"><span class="function"></span>{</div><div class="line"> g_sockfd = init_socket();</div><div class="line"> <span class="keyword">if</span>(g_sockfd < <span class="number">0</span>) {</div><div class="line"> <span class="built_in">printf</span>(<span class="string">"init socket failed.\n"</span>);</div><div class="line"> <span class="keyword">return</span> <span class="number">-1</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> signal(SIGKILL,&process_exit);</div><div class="line"> signal(SIGINT,&process_exit);</div><div class="line"></div><div class="line"> system(<span class="string">"./process_B &"</span>);</div><div class="line"></div><div class="line"> <span class="keyword">while</span>(<span class="number">1</span>) {</div><div class="line"> sleep(<span class="number">10</span>);</div><div class="line"> }</div><div class="line"> </div><div class="line"> <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">}</div></pre></td></tr></table></figure>
<p>process_B代码如下:</p>
<figure class="highlight c"><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></pre></td><td class="code"><pre><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><unistd.h></span></span></div><div class="line"></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span> **argv)</span></span></div><div class="line"><span class="function"></span>{</div><div class="line"> <span class="keyword">while</span>(<span class="number">1</span>) {</div><div class="line"> sleep(<span class="number">10</span>);</div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> <span class="number">0</span>;</div><div class="line">}</div></pre></td></tr></table></figure>
<p>验证过程如下:</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line">root@ubuntu:~<span class="comment"># ps -ef | grep process </span></div><div class="line">root 1704 1646 0 08:16 pts/8 00:00:00 ./process_A</div><div class="line">root 1706 1 0 08:16 pts/8 00:00:00 ./process_B</div><div class="line">root 1722 1707 0 08:16 pts/9 00:00:00 grep --color=auto process</div><div class="line">root@ubuntu:~<span class="comment"># netstat -anp | grep 5081</span></div><div class="line">udp 0 0 0.0.0.0:5081 0.0.0.0:* 1704/process_A </div><div class="line">root@ubuntu:~<span class="comment"># ls -al /proc/1704/fd</span></div><div class="line">total 0</div><div class="line">dr-x------ 2 root root 0 Aug 29 08:16 .</div><div class="line">dr-xr-xr-x 9 root root 0 Aug 29 08:16 ..</div><div class="line">lrwx------ 1 root root 64 Aug 29 08:16 0 -> /dev/pts/8</div><div class="line">lrwx------ 1 root root 64 Aug 29 08:16 1 -> /dev/pts/8</div><div class="line">lrwx------ 1 root root 64 Aug 29 08:16 2 -> /dev/pts/8</div><div class="line">lrwx------ 1 root root 64 Aug 29 08:16 3 -> socket:[21710]</div><div class="line">root@ubuntu:~<span class="comment"># ls -al /proc/1706/fd</span></div><div class="line">total 0</div><div class="line">dr-x------ 2 root root 0 Aug 29 08:16 .</div><div class="line">dr-xr-xr-x 9 root root 0 Aug 29 08:16 ..</div><div class="line">lr-x------ 1 root root 64 Aug 29 08:16 0 -> /dev/null</div><div class="line">lrwx------ 1 root root 64 Aug 29 08:16 1 -> /dev/pts/8</div><div class="line">lrwx------ 1 root root 64 Aug 29 08:16 2 -> /dev/pts/8</div><div class="line">lrwx------ 1 root root 64 Aug 29 08:16 3 -> socket:[21710]</div><div class="line">root@ubuntu:~<span class="comment"># kill -9 1704</span></div><div class="line">root@ubuntu:~<span class="comment"># netstat -anp | grep 5081</span></div><div class="line">udp 0 0 0.0.0.0:5081 0.0.0.0:* 1706/process_B </div><div class="line">root@ubuntu:~<span class="comment">#</span></div></pre></td></tr></table></figure>
<h3 id="解决办法"><a href="#解决办法" class="headerlink" title="解决办法"></a>解决办法</h3><p>既然找到了问题的根本原因,那么解决问题的办法,就很多了。我的做法是在收到特定消息后,先<code>fork()</code>出子进程,在子进程中关闭了 5081 的 socket,然后再去做 rsync 以及后续的重启操作,同时在父进程中调用<code>waitpid()</code>接收子进程的返回。</p>
<p>至此,端口抢占的问题得到解决。</p>
<h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><p>在调查关于<code>system()</code>的问题时,随手翻了一下APUE,在书中还提到了关于用户权限的一个安全性漏洞。书上的举例是程序X具有s权限,在程序X中用<code>system()</code>调用程序Y,这时在Y中打印出<code>geteuid()</code>,会发现 euid 为 0,也就是说Y从X中继承了s权限。其实继承权限和继承fd,也就是同样的问题,所以解决的办法也是相同的。</p>
]]></content>
<summary type="html">
<h2 id="写在前面"><a href="#写在前面" class="headerlink" title="写在前面"></a>写在前面</h2><p>在写代码时,难免需要调用别的命令获取一些信息,这时可以用<code>popen()</code>拿到需要的信息;有时又需要启
</summary>
<category term="总结" scheme="https://answerwa.github.io/tags/%E6%80%BB%E7%BB%93/"/>
</entry>
<entry>
<title>网络知识记录</title>
<link href="https://answerwa.github.io/2015/05/04/network/"/>
<id>https://answerwa.github.io/2015/05/04/network/</id>
<published>2015-05-04T09:12:14.000Z</published>
<updated>2017-05-28T04:08:06.232Z</updated>
<content type="html"><![CDATA[<p>这段时间接触到了好多网络方面的知识,都是些基础知识,不知道就是不知道,因此不得不在平时多多补充网络方面的知识。</p>
<p>现在把平时新学到的知识记录在这里。</p>
<h2 id="域名和别名"><a href="#域名和别名" class="headerlink" title="域名和别名"></a>域名和别名</h2><p><a href="http://baike.baidu.com/link?url=r5FtzXC7Mtd2D46xtLMrrA3e0iVyjN7Q9oyAxQBJsHqHzMt_bVmrVRr9vZvivK3R#5" target="_blank" rel="external">百度百科</a>有个简单的解释。<br>按照我的理解就是: </p>
<p>假设有一台服务器的ip是192.168.1.1,它可以有www.web1.com,www.web2.com,www.web3.com三个域名;也可以有www.web1.com一个域名,同时有www.web2.com,www.web3.com两个作为www.web1.com这个域名的别名。<br>这两种情况相同的地方是,访问这三个url,都是访问192.168.1.1这台服务器。不同点是如果服务器的ip变成了192.168.1.2,那么第一种情况,需要修改web1,web2,web3,三个域名都需要更改;而第二种情况就只需修改web1就行了。</p>
<p>第一种情况就相当于是三个(web1,web2,web3)指向同一地址的指针;第二种情况是一个(web1)指向地址的指针和两个(web2,web3)指向指针的指针。</p>
<h2 id="VLAN相关"><a href="#VLAN相关" class="headerlink" title="VLAN相关"></a>VLAN相关</h2><p>此小节参考<a href="http://blog.csdn.net/phunxm/article/details/9498829" target="_blank" rel="external">VLAN原理详解</a></p>
<h3 id="VLAN概念"><a href="#VLAN概念" class="headerlink" title="VLAN概念"></a>VLAN概念</h3><p>VLAN(Virtual LAN)即虚拟局域网,也就是一个广播域,<a href="http://baike.baidu.com/link?url=NBT9oo8h3CI4GRV3tjLoGK6_wCbagdz0o-vwH1rUNAOyEBZYBKx70oJZUEgfoU7lRBVdwmlAG6NoWjxPjTa7wK" target="_blank" rel="external">广播域</a>是指能过直接通信的范围。广播域的划分,可以根据子网掩码来计算。<br>按照目前我的理解来看,如果子网掩码是255.255.255.0,那么192.168.1.0~192.168.1.255是一个广播域,192.168.2.0~192.168.2.255是另外一个广播域;<br>如果子网掩码是255.255.255.224,那么ip每隔32(256-224)为一个广播域,即192.168.1.0~192.168.1.31,是一个广播域,192.168.1.32~192.168.1.63。<br>一个广播域内,第一个地址(192.168.1.0)是网络地址,最后一个地址(192.168.1.31)是广播地址。</p>
<p>VLAN间的通信需要经过路由。</p>
<h3 id="路由"><a href="#路由" class="headerlink" title="路由"></a>路由</h3><p><a href="http://baike.baidu.com/link?url=e8vwGyZKeqEpfqH-pSSUerDJFtOSUfWQh2SV6o72lmVWB5p6CuPQvDg_3qlKYj60T91sAuGrVRs-KlX9ZTek8aZ8c41n6625E1icOwl0EGK#1" target="_blank" rel="external">路由</a>就是将一个接口的数据包转发到另一个接口的过程,工作在OSI模型的第三层(网络层)。包括:</p>
<blockquote>
<p>确定最佳路径<br>通过网络传输信息</p>
</blockquote>
<h3 id="VLAN链接"><a href="#VLAN链接" class="headerlink" title="VLAN链接"></a>VLAN链接</h3><p>VLAN间的链接分为:</p>
<blockquote>
<p>访问链接(Access Link)<br>汇聚链接(Trunk Link)</p>
</blockquote>
<h4 id="Access-Link(访问链接)"><a href="#Access-Link(访问链接)" class="headerlink" title="Access Link(访问链接)"></a>Access Link(访问链接)</h4><p>同一台交换机,分为静态VLAN和动态VLAN。<br>静态VLAN是通过设置交换机的不同端口为不同的VLAN。 如下图(图片均是盗用参考链接处):<br><img src="http://img.blog.csdn.net/20130726174909406" alt="access_link_port" title="access_link_port"><br>动态VLAN是根据客户端的MAC或ip或用户名设置为不同的VLAN。如下图(图片均是盗用参考链接处):</p>
<p>基于mac:<br><img src="http://img.blog.csdn.net/20130726174941218" alt="access_link_mac" title="access_link_mac"> </p>
<p>基于ip:<br><img src="http://img.blog.csdn.net/20130726175015406" alt="access_link_ip" title="access_link_ip"></p>
<p>至于基于用户,就是根据连上的用户的用户名判断属于哪个VLAN。</p>
<h4 id="Trunk-Link(汇聚链接)"><a href="#Trunk-Link(汇聚链接)" class="headerlink" title="Trunk Link(汇聚链接)"></a>Trunk Link(汇聚链接)</h4><p>交换机间设置相同的VLAN。<br>交换机间用一个端口设定为汇聚链接,也就是用来传输VLAN的信息。其它端口设置具体的VLAN号。<br><img src="http://img.blog.csdn.net/20130726175217593" alt="trunk_link" title="trunk_link"></p>
<h3 id="VLAN间通信"><a href="#VLAN间通信" class="headerlink" title="VLAN间通信"></a>VLAN间通信</h3><p>参考文章中写得很详细,这边就按照我自己的理解来阐述一下:<br><img src="http://img.blog.csdn.net/20130726175659000" alt="vlan_communication" title="vlan_communication"><br>比如要从A发送信息到C。 </p>
<ol>
<li>A从目标ip中判断C不在同一网段,因此会通过<a href="http://baike.baidu.com/link?url=v4lWRw5HOygXoig4vh67Yp71bkgv6w5nYxv4D8g_FXEDO5EHwM1QoV_V81RUJrD5jQ6GSTYK_7bkDXTwyOQw_rpGy-7tc21QzBpP0vrLz5S" title="ARP" target="_blank" rel="external">ARP</a>获取路由器的MAC地址。再将包含源MAC、源IP及目标IP的数据发送到路由器。交换机1口收到后,转到6口(汇聚链路),附上红色的VLAN识别信息(比如VLAN10),发送给路由器。 </li>
<li>路由器收到数据帧后,确认VLAN的识别信息,交由属于红色VLAN的子接口接收。 </li>
<li>由内部的<strong>路由表</strong>及目标IP,判断向哪里中继。交由蓝色VLAN子接口转发,附上蓝色的VLAN识别信息,并将目标MAC改为C的MAC(现在的目标MAC是路由器的MAC),发送到交换机。 </li>
<li>交换机收到数据帧后,通过VLAN识别信息判断是蓝色VLAN,通过目标MAC判断为3口,因此将VLAN识别信息去掉后,发送到3口,这样C就收到了A的数据。</li>
</ol>
]]></content>
<summary type="html">
<p>这段时间接触到了好多网络方面的知识,都是些基础知识,不知道就是不知道,因此不得不在平时多多补充网络方面的知识。</p>
<p>现在把平时新学到的知识记录在这里。</p>
<h2 id="域名和别名"><a href="#域名和别名" class="headerlink" t
</summary>
<category term="network" scheme="https://answerwa.github.io/tags/network/"/>
</entry>
<entry>
<title>2015年3月终总结</title>
<link href="https://answerwa.github.io/2015/04/07/201503-annual-summary/"/>
<id>https://answerwa.github.io/2015/04/07/201503-annual-summary/</id>
<published>2015-04-07T10:15:37.000Z</published>
<updated>2017-05-28T04:08:06.179Z</updated>
<content type="html"><![CDATA[<p>今天离职了,没有像想象中那么开心,毕竟是离开了一个熟悉的环境。虽然是打算回家乡发展,但是心里面还是有些不舍。和前一个离职的同事聊天的时候,她问我有没有不舍,说她离职的时候也很舍不得,都快哭了。我说 <em>挺舍不得的,但是应该不是舍不得这个公司,而是因为从熟悉的环境变动到陌生的环境,心里有些抵触</em> 。现在真正离开公司了,一个人待在床上,想想看,真的是这样吗。我也不知道。</p>
<p>回想一年多前,从大学来到公司,大家在校园别离时,满是不舍。但是当踏上火车后,却是满心激动,终于是走出校园,进入社会了,对未来有着无限的憧憬。现在跳槽了,心中却满是疑惑。 </p>
<p>今天从公司办完离职手续出门,狂风大雨,我就在怀疑自己是不是真的做对了。不过这个就算交给时间,也没办法验证了,因为不可能同时能够知道,5年后或者10年后,我待在现在的公司是怎样,去了新公司又是怎样。姑且就自认为我是个怀旧、伤感的人,所以在离开的时候,才会有这么多的感慨吧。 </p>
<p>昨天看了方励在<a href="http://yixi.tv/" target="_blank" rel="external">一席</a>的一个演讲–<a href="http://www.letv.com/ptv/vplay/21524422.html" target="_blank" rel="external">感谢你给我机会上场</a>,说每个人都应该做能让自己得到快的工作,无论你能挣再多的钱,如果工作不能带给你快乐,那么每天都会浪费点8个小时,上班就是在浪费生命。我还是比较同意这种观点的,不过很遗憾,我现在依然不是很清楚我究竟想干什么事。站在他自己的角度,他已经脱离对物质方面的追求了,通俗来讲,就是他已经吃穿不愁了。他每天只需要思考怎样让自己过得开心。自己想做什么事业,就做什么事业。但是我不一样,我还处于而且应该会暂时长期处于物质的追求期。虽然不至于说吃了这顿没下顿,但是我也希望能有自己的房子,自己的车子,口袋鼓鼓的,随时都可以来一场说走就走的旅行。所以现在选工作的时候,还是暂时先考虑稳定性和薪资吧。 </p>
<p>啰嗦了很多,也确实是有感而发。这两个月还是比较忙了,年前在愁跳不跳,年后开始愁找工作(不过工作找的还是挺顺利),现在在愁去哪家(基本已经定了,还有些犹豫)。我就是这么一个纠结的人,也是和拖延症有点关系么。。。。大概吧。</p>
]]></content>
<summary type="html">
<p>今天离职了,没有像想象中那么开心,毕竟是离开了一个熟悉的环境。虽然是打算回家乡发展,但是心里面还是有些不舍。和前一个离职的同事聊天的时候,她问我有没有不舍,说她离职的时候也很舍不得,都快哭了。我说 <em>挺舍不得的,但是应该不是舍不得这个公司,而是因为从熟悉的环境变动到陌
</summary>
<category term="总结" scheme="https://answerwa.github.io/tags/%E6%80%BB%E7%BB%93/"/>
</entry>
<entry>
<title>linux_cron</title>
<link href="https://answerwa.github.io/2015/03/05/linux-cron/"/>
<id>https://answerwa.github.io/2015/03/05/linux-cron/</id>
<published>2015-03-05T12:28:19.000Z</published>
<updated>2017-05-28T04:08:06.208Z</updated>
<content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>前段时间由于工作需要,所以比较系统的调查了一下cron,现在总结分享一下。</p>
<h2 id="crond简介"><a href="#crond简介" class="headerlink" title="crond简介"></a>crond简介</h2><p>crond是linux用来定期执行程序的服务。当安装完成操作系统之后,默认便会启动此服务。crond每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。而linux任务调度的工作主要分为以下两类:</p>
<ul>
<li>系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存。 </li>
<li>个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置。</li>
</ul>
<p>特别说明一下:系统执行的工作是放在/etc/crontab中,而个人执行的工作是放在/var/spool/cron/user中。<br>另外说明一下:crond是linux的服务,crontab是命令。</p>
<p>安装crontab:<br>yum install crontabs<br>服务操作说明: </p>
<blockquote>
<p>/sbin/service crond start //启动服务<br>/sbin/service crond stop //关闭服务<br>/sbin/service crond restart //重启服务<br>/sbin/service crond reload //重新载入配置<br>/sbin/service crond status //查看服务状态 </p>
</blockquote>
<h2 id="使用权限"><a href="#使用权限" class="headerlink" title="使用权限"></a>使用权限</h2><p>控制crond的使用权限,主要是两个文件: </p>
<ul>
<li>/etc/cron.allow </li>
<li>/etc/cron.deny </li>
</ul>
<p>cron.allow的优先级比cron.deny的优先级高。也就是说当两个文件都存在时,首先根据cron.allow的内容进行判断。<br>当cron.allow存在时,要想使用crond服务,user必须在该文件中列出;当cron.allow不存在而cron.deny存在时,要想使用crond服务,user不能出现在该文件中;若两个文件都不存在,则只有root能使用crond服务。<br>因此,一般的使用情况是,不要cron.allow文件,放一个空的cron.deny文件在/etc下,这样所有用户都可以使用crond服务,若需要禁止某个用户使用,则可以直接在cron.deny文件中添加。</p>
<h2 id="crontab命令详解"><a href="#crontab命令详解" class="headerlink" title="crontab命令详解"></a>crontab命令详解</h2><blockquote>
<p>crontab [-u user] file (use file install user’s crontab)<br>crontab [-u user] -e (edit user’s crontab)<br>crontab [-u user] -l (list user’s crontab)<br>crontab [-u user] -r (delete user’s crontab)<br>crontab [-u user] -i (prompt before deleting user’s crontab)<br>crontab [-u user] -s (selinux context) </p>
</blockquote>
<p>说明一下:当普通用户使用crontab命令时,是不需要也不能加[-u user]的,这个是给root使用的,root可以通过[-u user]操作其他用户的crontab。root用户查看自己的crontab也是不用加[-u root]的,当然你非要加也是可以的。</p>
<h2 id="crontab具体使用-个人执行"><a href="#crontab具体使用-个人执行" class="headerlink" title="crontab具体使用(个人执行)"></a>crontab具体使用(个人执行)</h2><p>用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:</p>
<p>minute hour day month week command</p>
<p>具体说明一下:</p>
<p>首先各个字段用空格隔开。</p>
<blockquote>
<p>minute: 表示分钟,可以是从0到59之间的任何整数。<br>hour:表示小时,可以是从0到23之间的任何整数。<br>day:表示日期,可以是从1到31之间的任何整数。<br>month:表示月份,可以是从1到12之间的任何整数,当然也可以是英文缩写Jan、Feb等。<br>week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日,必须也可以是单词缩写Sun、Mon等。<br>command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。 </p>
</blockquote>
<p>在这里,很有必要盗用一张图片,很形象。</p>
<p><img src="http://images.cnitblog.com/blog/34483/201301/08090352-4e0aa3fe4f404b3491df384758229be1.png" alt="cron.png" title="cron"></p>
<p>举一个例子吧,比如要在每个月的15号和18号的早上7点到晚上23点之间,每隔两小时列出/etc目录下的文件: </p>
<blockquote>
<p>* 7-23/2 <em> </em> * ls /etc </p>
<p>分析一下: </p>
<p>* 表示忽略,也就是都所有值都匹配<br>7-23/2 表示从23点到7点,每隔两小时<br>15,18 表示每个月的15号和18 </p>
</blockquote>
<h3 id="添加crontab文件"><a href="#添加crontab文件" class="headerlink" title="添加crontab文件"></a>添加crontab文件</h3><p> 一般情况下使用crontab -e这个命令,会通过编辑器打开crontab文件,然后按照上面提到的格式输入,一行代表一个周期性指令(ps:编辑器由环境变量$EDITOR指定)。</p>
<p> 另外一个比较常用的方法是将想要写入crontab中的内容先写入另外一个文件中(比如cronfile),再使用crontab cronfile,就能将cronfile中的内容替换到之前提到的/var/spool/cron/user中。</p>
<p> 上面两个是比较常用的方法,再说说不太常用的方法:<br> 既然crontab的文件是/var/spool/cron/user,那么我们可以直接echo “<em> 23-7/2 </em> <em> </em> ls /etc” > /var/spool/cron/user,当然,必须使用root权限才可以。</p>
<p> 另外,还有一种方法就是echo “<em> 7-23/2 </em> <em> </em> ls /etc” | crontab,这种方法的原理其实与crontab cronfile相同。</p>
<h3 id="列出crontab文件"><a href="#列出crontab文件" class="headerlink" title="列出crontab文件"></a>列出crontab文件</h3><p> 直接使用crontab -l,就能输出当前用户的crontab中的内容。顺带提一下,有时候,可能需要部分修改crontab中的内容,这时可以使用crontab -l > cronfile,在cronfile中做出对应的修改,再使用crontab cronfile添加crontab文件。</p>
<h3 id="删除crontab文件"><a href="#删除crontab文件" class="headerlink" title="删除crontab文件"></a>删除crontab文件</h3><p> 直接使用crontab -r,就能删除当前用户的crontab。</p>
<h2 id="其它一些想说的"><a href="#其它一些想说的" class="headerlink" title="其它一些想说的"></a>其它一些想说的</h2><h3 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h3><p> 除了上面说的$EDITOR是用来指定打开crontab的编辑器以外,还想提到的是在crontab中执行脚本的问题。</p>
<p>有时候想要在crontab中固定时间执行某个自己编写的脚本,可能会发现执行不成功,但是自己手动执行又是可以的,这个时候多半就是环境变量的问题了,需要修改一下crontab中的内容,在想要执行的脚本前,加上source ~/.bashrc,比如想要执行的脚本名为script,那么在crontab中就可以写为<em> 7-23/2 </em> <em> </em> source ~/.bashrc && script</p>
<h3 id="系统执行crontab"><a href="#系统执行crontab" class="headerlink" title="系统执行crontab"></a>系统执行crontab</h3><p> 前面也说的,crontab有系统执行和个人执行之分,文件存放的位置也不同,当然,写法有些差别,可以看看系统执行的crontab,也就是/etc/crontab。<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">SHELL=/bin/bash</div><div class="line">PATH=/sbin:/bin:/usr/sbin:/usr/bin</div><div class="line">MAILTO=root</div><div class="line">HOME=/</div><div class="line"></div><div class="line"><span class="comment"># run-parts</span></div><div class="line">01 * * * * root run-parts /etc/cron.hourly</div><div class="line">02 4 * * * root run-parts /etc/cron.daily</div><div class="line">22 4 * * 0 root run-parts /etc/cron.weekly</div><div class="line">42 4 1 * * root run-parts /etc/cron.monthly</div></pre></td></tr></table></figure></p>
<p> 与个人执行的crontab不同的是,首先指定了一些环境变量,其次多了root和run-parts两项。先说root,因为个人执行的crontab肯定是自己使用,因此不用指定这一项,而系统执行的crontab,需要指定是通过哪个用户来执行后面的指令的;对于run-parts,这个参数是执行后面指定的文件夹中的所有脚本,个人执行的crontab中,也是可以使用的。</p>
<h3 id="邮件相关"><a href="#邮件相关" class="headerlink" title="邮件相关"></a>邮件相关</h3><p> 每次crontab执行完毕,系统都会将任务输出信息通过电子邮件的形式发送给当前系统用户,这样日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。</p>
]]></content>
<summary type="html">
<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>前段时间由于工作需要,所以比较系统的调查了一下cron,现在总结分享一下。</p>
<h2 id="crond简介"><a href="#c
</summary>
<category term="linux" scheme="https://answerwa.github.io/tags/linux/"/>
<category term="cron" scheme="https://answerwa.github.io/tags/cron/"/>
</entry>
<entry>
<title>linux_ntp</title>
<link href="https://answerwa.github.io/2015/03/05/linux-ntp/"/>
<id>https://answerwa.github.io/2015/03/05/linux-ntp/</id>
<published>2015-03-05T12:08:16.000Z</published>
<updated>2017-05-28T04:08:06.213Z</updated>
<content type="html"><![CDATA[<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>通过设置本地的ntpd服务,实现本地与服务器时间的同步。<br>此文仅简单说明环境的搭建</p>
<h2 id="NTP简介"><a href="#NTP简介" class="headerlink" title="NTP简介"></a>NTP简介</h2><p>NTP(Network Time Protocol)是一种网络时间协议。是以封包交换把两台电脑的时钟同步化的网络协议。NTP使用UDP端口123作为传输层。它是用作抵销可变延迟的影响。</p>
<p>简单说明一下:NTP是一种协议;ntpd是系统中的服务,在linux下可以通过/sbin/service ntpd status或/etc/init.d/ntpd status来查看此服务的状态;ntpdate,ntpq,ntptrace等是一系列与ntp相关的命令。</p>
<p>安装NTP: yum install ntp<br>一般系统上都会有ntp的包,可以提前通过rpm -qa | grep ntp查看机器上是否已经安装ntp。<br>服务操作说明: </p>
<blockquote>
<p>/sbin/service ntpd start //启动服务<br>/sbin/service ntpd stop //关闭服务<br>/sbin/service ntpd restart //重启服务<br>/sbin/service ntpd status //查看服务状态 </p>
</blockquote>
<h2 id="ntpd服务设置"><a href="#ntpd服务设置" class="headerlink" title="ntpd服务设置"></a>ntpd服务设置</h2><p>ntpd服务的相关设置文件有以下5个:<br>1)/etc/ntp.conf<br>这个是NTP daemon的主要设文件,也是 NTP 唯一的设定文件。<br>2)/usr /share/zoneinfo/<br>在这个目录下的文件其实是规定了各主要时区的时间设定文件,例如北京地区的时区设定文件在/usr/share/zoneinfo/Asia/Beijing 就是了。这个目录里面的文件与底下要谈的两个文件(clock 与localtime)是有关系的。<br>3)/etc/sysconfig/clock<br>这个文件其实也不包含在NTP 的 daemon 当中,因为这个是 linux 的主要时区设定文件。每次开机后,Linux 会自动的读取这个文件来设定自己系统所默认要显示的时间。<br>4)/etc /localtime<br>这个文件就是“本地端的时间配置文件”。刚刚那个clock 文件里面规定了使用的时间设置文件(ZONE) 为 /usr/share/zoneinfo/Asia/Beijing ,所以说,这就是本地端的时间了,此时, Linux系统就会将Beijing那个文件另存为一份 /etc/localtime文件,所以未来我们的时间显示就会以Beijing那个时间设定文件为准。<br>5)/etc/timezone<br>系统时区文件</p>
<p>其实主要用到的就只有/etc/ntp.conf,其它文件知道就行了。下面简单说一下/etc/ntp.conf文件的简单写法。<br>1)上层主机设定<br>server [IP | hostname] [prefer]<br>上层主机就是通过server来设定的,设定好上层主机,并保持ntpd服务处于启动状态,这样就能让本机与上层主机保持时间同步了。prefer参数是指当有多个上层主机时,主要通过指定了prefer的上层主机进行时间同步。<br>另外可以通过driftfile来指定用于记录与上层服务器联系时所花费的时间,默认为driftfile /var/lib/ntp/drift。<br>2)权限设定<br>权限设定主要是通过restrict来设定的,语法为:<br>restrict IP mask netmask_IP parameter<br>其中IP可以使具体值,也可以是ip段。netmask_IP是子网掩码。parameter有以下选项: </p>
<blockquote>
<p>ignore:关闭所有的 NTP 联机服务<br>nomodify:表示 Client 端不能更改 Server 端的时间参数,不过,Client 端仍然可以透过 Server 端来进行网络校时。<br>notrust :该 Client 除非通过认证,否则该 Client 来源将被视为不信任网域<br>noquery :不提供 Client 端的时间查询<br>notrap :不提供trap这个远程事件登入 </p>
</blockquote>
<p>ps:如果 paramter 完全没有设定,那就表示该 IP (或网域)“没有任何限制”<br>例如:<br>restrict 127.0.0.1 #允许本机任意操作。<br>restrict 192.168.0.1 mask 255.255.255.0 nomodify #局域网段内可以通过这台NTP Server进行时间同步,但是不能修改服务器时间。 </p>
<p>另外还有一个fudge,具体如下:<br>fudge IP stratum number,这个设定一般是将自身作为服务器,因此IP一般为127段stratum后的number为服务器层数,最大为16。<br>默认为fudge 127.127.1.0 stratum 10</p>
<p>其它设置值,建议保持系统默认值。</p>
<h2 id="ntp时间同步"><a href="#ntp时间同步" class="headerlink" title="ntp时间同步"></a>ntp时间同步</h2><p>从ntpd服务设置中可以知道,设置好ntp.conf文件后,保持ntpd服务处于启动状态,机器就会与上层服务器进行时间同步了。现在主要介绍一些时间同步的命令。特别说明一下,想要通过命令进行时间同步时,需关闭ntpd服务。</p>
<p>1)ntpdate IP<br>直接通过ntpdate加上想要进行时间同步的服务器IP,就能获得服务器上的时间,并设置到本机系统中。<br>2)rdate -s IP<br>与ntpdate类似,也是获得服务器上的时间,并设置到本机系统中。如果不加-s则仅是打印出服务器时间。 </p>
<p>说明一下,这两条命令以及上面通过ntpd的时间同步,仅仅是将时间设置到了系统中,如果想要设置到硬件时钟中,还需要hwclock。<br>因此,如果想要设置本机的时间同步,可以将命令写入到crontab中,这样系统就会定期执行这两条命令实现时间同步了。不过通过查看网上资料,说是通过ntpdate来调节时间,时间会产生跃变,而通过ntpd服务来进行时间同步,是通过调节时钟频率渐变调节时间的。因此不推荐使用ntpdate + crontab来做时间同步。不过,在我测试时发现,ntpd服务进行时间同步时,也是通过跃变调节时间的。也有可能是我的设置有些问题(后来调查得知,需要在文件/etc/sysconfig/ntpd中加入-x 参数,变成: OPTIONS=”-U ntp -x -p /var/run/ntpd.pid”,这样ntpd就能实现渐变调整时间)。</p>
<h2 id="其它"><a href="#其它" class="headerlink" title="其它"></a>其它</h2><p>关于ntp的环境搭建是一件很复杂的事情,我也没有完全搞懂。这篇文章只是介绍了一些最简单的设置方法,通过这些设置,能够实现本地机器与服务器的时间同步。</p>
]]></content>
<summary type="html">
<h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><p>通过设置本地的ntpd服务,实现本地与服务器时间的同步。<br>此文仅简单说明环境的搭建</p>
<h2 id="NTP简介"><a hre
</summary>
<category term="linux" scheme="https://answerwa.github.io/tags/linux/"/>
<category term="ntp" scheme="https://answerwa.github.io/tags/ntp/"/>
</entry>
<entry>
<title>《断舍离》读后感</title>
<link href="https://answerwa.github.io/2015/03/04/something-20150304/"/>
<id>https://answerwa.github.io/2015/03/04/something-20150304/</id>
<published>2015-03-04T13:08:27.000Z</published>
<updated>2017-05-28T04:08:06.248Z</updated>
<content type="html"><![CDATA[<p>在知乎上看到有人推荐这本书,所以就去下了个pdf(额额~~应该尊重作者,注意版权),塞进pad,每天中午休息的时候随便看看。这一类的书看多少遍都是没用的,关键还是要自己行动起来,“整理”东西(这里的整理打引号是因为作者在书中重新定义了整理二字)。<br>书中说有三种扔不掉东西的人:逃避现实型,执着过去型,担忧未来型。如果非要把我分到这三类中的一种,我估计就算是担忧未来型吧。因为我经常不扔东西的原因就是觉得以后它还能用得着。还记得大学毕业收拾东西的时候,从最下面的柜子里搜出来好多塑料袋,每次一有塑料袋,我就放在里面,结果都没怎么用上。。。。。<br>这本书有点罗嗦,说来说去都在讲一定要扔东西,买真正需要的东西。不过看完了书以后,确实在平时都会下个狠心多扔点不需要的东西,而且平时也会多加注意一下收拾好自己的空间。书中的观点是,当下会用到的东西才是有用的东西;而且还有一个概念是:要将自己作为主体,看这件物品是不是对你有用。因为对于物品来说肯定是有用的。但是对你有没有用,就不得而知了。<br>书中还有一个观点是说通过整理自己的房间,扔掉不需要的垃圾,同时也会扔掉心中的垃圾。书中有个例子是一名丈夫过世十几年的女士,正是因为断舍离,扔掉了丈夫的假牙,才接受了丈夫去世的痛苦,从而走出了这十几年的痛苦生活。<br>ps:表述能力略差啊~不知道该写些什么</p>
]]></content>
<summary type="html">
<p>在知乎上看到有人推荐这本书,所以就去下了个pdf(额额~~应该尊重作者,注意版权),塞进pad,每天中午休息的时候随便看看。这一类的书看多少遍都是没用的,关键还是要自己行动起来,“整理”东西(这里的整理打引号是因为作者在书中重新定义了整理二字)。<br>书中说有三种扔不掉东
</summary>
<category term="读后感" scheme="https://answerwa.github.io/tags/%E8%AF%BB%E5%90%8E%E6%84%9F/"/>
</entry>
<entry>
<title>su和su -</title>
<link href="https://answerwa.github.io/2015/02/03/linux-su-su/"/>
<id>https://answerwa.github.io/2015/02/03/linux-su-su/</id>
<published>2015-02-03T14:39:22.000Z</published>
<updated>2017-05-28T04:08:06.226Z</updated>
<content type="html"><![CDATA[<p>今天晚上突然发现,用普通用户通过putty登陆后,su到root,好多命令没有。。。而且切换到/root目录下source .bashrc和.bash_profile都没有用。<br><figure class="highlight c"><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">[zhaojc@centos ~]$ su</div><div class="line">口令:</div><div class="line">[root@centos zhaojc]<span class="meta"># useradd</span></div><div class="line">bash: useradd: command <span class="keyword">not</span> found</div><div class="line">[root@centos zhaojc]<span class="meta"># cd ~</span></div><div class="line">[root@centos ~]<span class="meta"># source .bashrc</span></div><div class="line">[root@centos ~]<span class="meta"># source .bash_profile</span></div><div class="line">[root@centos ~]<span class="meta"># useradd</span></div><div class="line">bash: useradd: command <span class="keyword">not</span> found</div><div class="line">[root@centos ~]<span class="meta"># echo $PATH</span></div><div class="line">/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/zhaojc/bin:/root/bin</div></pre></td></tr></table></figure></p>
<p>网上查了一下,才发现su是所谓的半切换,切换后,还是会保留原用户的环境(细心的话,会发现,su后,还在/home/zhaojc目录下)。至于为什么source /root下的两个文件也没用,我想可能是因为root相关环境配置接在了原用户的后面,比如PATH的话,/home/zhaojc/bin在/root/bin前面(个人猜想,没有依据)。<br>真正的切换用户应该是su -,这样会重新配置用户的环境。<br><figure class="highlight c"><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">[zhaojc@centos ~]$ su -</div><div class="line">口令:</div><div class="line">[root@centos ~]<span class="meta"># groupadd</span></div><div class="line">Usage: groupadd [options] group</div><div class="line"></div><div class="line">Options:</div><div class="line"> -f, --force force <span class="built_in">exit</span> with success status <span class="keyword">if</span> the specified</div><div class="line"> group already exists</div><div class="line"> -r, create system account</div><div class="line"> -g, --gid GID use GID <span class="keyword">for</span> the <span class="keyword">new</span> group</div><div class="line"> -h, --help display <span class="keyword">this</span> help message <span class="keyword">and</span> <span class="built_in">exit</span></div><div class="line"> -K, --key KEY=VALUE overrides /etc/login.defs defaults</div><div class="line"> -o, --non-unique allow create group with duplicate</div><div class="line"> (non-unique) GID</div><div class="line"></div><div class="line">[root@centos ~]# echo $PATH</div><div class="line">/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin</div></pre></td></tr></table></figure></p>
<p>可以看到,用su -切换后,PATH中没有了/home/zhaojc/bin,说明我之前的猜想,还是有点沾边的。`(<em>∩_∩</em>)′</p>
]]></content>
<summary type="html">
<p>今天晚上突然发现,用普通用户通过putty登陆后,su到root,好多命令没有。。。而且切换到/root目录下source .bashrc和.bash_profile都没有用。<br><figure class="highlight c"><table><tr><td cl
</summary>
<category term="linux" scheme="https://answerwa.github.io/tags/linux/"/>
<category term="su" scheme="https://answerwa.github.io/tags/su/"/>
</entry>
<entry>
<title>2015年1月终总结</title>
<link href="https://answerwa.github.io/2015/02/01/201501-annual-summary/"/>
<id>https://answerwa.github.io/2015/02/01/201501-annual-summary/</id>
<published>2015-02-01T14:33:10.000Z</published>
<updated>2017-05-28T04:08:06.172Z</updated>
<content type="html"><![CDATA[<p>没想到一月份也这么快过去了。从新年开始写让自己学会总结,把平时的学到的,想到的,都要及时记录下来。确实现在也认识到这个问题了,不管是学习,工作还是生活,总结确实是很难,但是真正收获最多的,就是在自己总结的时候。 </p>
<h2 id="学习"><a href="#学习" class="headerlink" title="学习"></a>学习</h2><p>这个月学习方面确实耽搁了不少,晚上回来没有怎么学习,总是有些烦躁,莫名的压力。以前不明白为什么那些人会有压力,现在自己感受到了,但是也还是不知道为什么。中午休息的时候,抽时间看了一下张德芬老师的《遇见未知的自己》,文艺点说就是,做了一次心灵的旅行。其实是第一次接触这一类唯心的理论,怎么说呢,求同存异吧,也确实让我自己内心平静了下来。</p>
<h2 id="工作"><a href="#工作" class="headerlink" title="工作"></a>工作</h2><p>这个月,工作上突然出现了莫名的压力。这个倒是从来没有过的。我一直都是把工作独立分得比较开的。只在工作的时候考虑工作的事,但是前段时间,不只是工作的八小时觉得压力大,而且每天下班回家也特别愁,所以晚上也不想学习,看书。而且居然有一天早上起床的时候直接就头晕了。。。起不了床。说实话,真的自己也被吓到了。还好后来工作上稍微好点了,身体也调整过来了。还是需要自己及时调整。</p>
<h2 id="生活"><a href="#生活" class="headerlink" title="生活"></a>生活</h2><p>一个月没有踢球了,一到周末就在家打游戏。但是前两个礼拜终于忍不住了,周末还是会出去到处逛逛,毕竟还有公园年卡,南京毕竟也是六朝古都,有这么多历史,因此就去逛了六朝博物馆,南京博物院,总统府,明孝陵。<br>最近也一直都在想,什么才是想要的生活,或者活着是为了什么。正好看<strong>奇葩说</strong>也看到一个辩题是,小城房还是大城床以及稳定工作还是追寻梦想。这是个难题,还是慢慢来吧。</p>
]]></content>
<summary type="html">
<p>没想到一月份也这么快过去了。从新年开始写让自己学会总结,把平时的学到的,想到的,都要及时记录下来。确实现在也认识到这个问题了,不管是学习,工作还是生活,总结确实是很难,但是真正收获最多的,就是在自己总结的时候。 </p>
<h2 id="学习"><a href="#学习"
</summary>
<category term="总结" scheme="https://answerwa.github.io/tags/%E6%80%BB%E7%BB%93/"/>
</entry>
<entry>
<title>linux_pipe</title>
<link href="https://answerwa.github.io/2015/01/28/linux-pipe/"/>
<id>https://answerwa.github.io/2015/01/28/linux-pipe/</id>
<published>2015-01-28T13:26:55.000Z</published>
<updated>2017-05-28T04:08:06.218Z</updated>
<content type="html"><![CDATA[<h2 id="函数介绍"><a href="#函数介绍" class="headerlink" title="函数介绍"></a>函数介绍</h2><h3 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h3><p>create pipe,创建管道,包含在头文件 unistd.h 中,定义如下:<br><figure class="highlight c"><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"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><unistd.h></span></span></div><div class="line"><span class="function"><span class="keyword">int</span> <span class="title">pipe</span><span class="params">(<span class="keyword">int</span> pipefd[<span class="number">2</span>])</span></span>;</div></pre></td></tr></table></figure></p>
<h3 id="参数"><a href="#参数" class="headerlink" title="参数"></a>参数</h3><p>创建管道后,将文件描述词由参数pipefd数组返回。<br>pipefd[0]为管道的读取端;<br>pipefd[1]为管道的写入端。 </p>
<h3 id="返回值"><a href="#返回值" class="headerlink" title="返回值"></a>返回值</h3><p>成功创建后,返回0,错误则返回-1,并将错误原因写入errno中。</p>
<h2 id="测试代码"><a href="#测试代码" class="headerlink" title="测试代码"></a>测试代码</h2><figure class="highlight c"><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></pre></td><td class="code"><pre><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><sys/wait.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><assert.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdio.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><stdlib.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><unistd.h></span></span></div><div class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string"><string.h></span></span></div><div class="line"></div><div class="line"><span class="keyword">int</span></div><div class="line">main(<span class="keyword">int</span> argc, <span class="keyword">char</span> *argv[])</div><div class="line">{</div><div class="line"> <span class="keyword">int</span> pipefd[<span class="number">2</span>];</div><div class="line"> <span class="keyword">pid_t</span> cpid;</div><div class="line"> <span class="keyword">char</span> buf;</div><div class="line"></div><div class="line"> assert(argc == <span class="number">2</span>);</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (pipe(pipefd) == <span class="number">-1</span>) {</div><div class="line"> perror(<span class="string">"pipe"</span>);</div><div class="line"> <span class="built_in">exit</span>(EXIT_FAILURE);</div><div class="line"> }</div><div class="line"></div><div class="line"> cpid = fork();</div><div class="line"> <span class="keyword">if</span> (cpid == <span class="number">-1</span>) {</div><div class="line"> perror(<span class="string">"fork"</span>);</div><div class="line"> <span class="built_in">exit</span>(EXIT_FAILURE);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (cpid == <span class="number">0</span>) { <span class="comment">/* Child reads from pipe */</span></div><div class="line"> close(pipefd[<span class="number">1</span>]); <span class="comment">/* Close unused write end */</span></div><div class="line"></div><div class="line"> <span class="keyword">while</span> (read(pipefd[<span class="number">0</span>], &buf, <span class="number">1</span>) > <span class="number">0</span>)</div><div class="line"> write(STDOUT_FILENO, &buf, <span class="number">1</span>);</div><div class="line"></div><div class="line"> write(STDOUT_FILENO, <span class="string">"\n"</span>, <span class="number">1</span>);</div><div class="line"> close(pipefd[<span class="number">0</span>]);</div><div class="line"> _exit(EXIT_SUCCESS);</div><div class="line"></div><div class="line"> } <span class="keyword">else</span> { <span class="comment">/* Parent writes argv[1] to pipe */</span></div><div class="line"> close(pipefd[<span class="number">0</span>]); <span class="comment">/* Close unused read end */</span></div><div class="line"> write(pipefd[<span class="number">1</span>], argv[<span class="number">1</span>], <span class="built_in">strlen</span>(argv[<span class="number">1</span>]));</div><div class="line"> close(pipefd[<span class="number">1</span>]); <span class="comment">/* Reader will see EOF */</span></div><div class="line"> wait(<span class="literal">NULL</span>); <span class="comment">/* Wait for child */</span></div><div class="line"> <span class="built_in">exit</span>(EXIT_SUCCESS);</div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<p>补充说明一下:由于wait函数本身是有缺陷的,因此换成<strong>waitpid(cpid, NULL, 0)</strong>比较合适(此代码为manpage中例)。</p>
]]></content>
<summary type="html">
<h2 id="函数介绍"><a href="#函数介绍" class="headerlink" title="函数介绍"></a>函数介绍</h2><h3 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h
</summary>
<category term="linux" scheme="https://answerwa.github.io/tags/linux/"/>
<category term="pipe" scheme="https://answerwa.github.io/tags/pipe/"/>
</entry>
<entry>
<title>《遇见未知的自己》读后感</title>
<link href="https://answerwa.github.io/2015/01/20/something-20150120/"/>
<id>https://answerwa.github.io/2015/01/20/something-20150120/</id>
<published>2015-01-20T15:02:40.000Z</published>
<updated>2017-05-28T04:08:06.243Z</updated>
<content type="html"><![CDATA[<p>花了大概一个礼拜时间,每天中午休息的时候把这本书看完了,怎么说呢,第一次接触这一类的书。感觉是比较唯心的。主张我们应该注重自己的内心,找到真我。书中一些看法还是比较认同的,大概说一下看完之后的印象吧。另外补充一点,现在愈发得觉得看电子书更方便了,在看到一些好的句子时,可以直接就勾画下来了。</p>
<h2 id="对待事件"><a href="#对待事件" class="headerlink" title="对待事件"></a>对待事件</h2><p>事件本身来说是中立的,而由于每个人对待同一件事件的态度是不一样的,因此产生了不同的结果。<br>书中举的例子是:当儿媳妇回家看到婆婆脸色不好,这时就要看这个儿媳妇对婆婆的态度了。如果这个儿媳妇以前就认为这个婆婆不喜欢她,那么肯定就会认为婆婆是给她脸色看;否则应该就会认为婆婆可能是身体不好。这是一个简单的例子,但是确实也说明了一些道理。我自己还是比较认同。</p>
<h2 id="对待事情"><a href="#对待事情" class="headerlink" title="对待事情"></a>对待事情</h2><p>书中主张将事情分为三种:老天的事,别人的事,自己的事。我们只需管好自己的事就好了。这个理论乍一看会觉得有一些自私。但是这一点我确实是很有感触的。<br>我记得高中的时候,老是喜欢去说教别人,学习上,生活上都是。从出发点来说,其实是关心别人,但是结果是,别人可能会觉得你装,而且不领情。所以后来我也一直坚持的一个观点就是,我首先做好我自己的事,别人的事,如果别人没让自己帮忙,就尽量不干涉。后来上大学了,看到宿舍就有人看到别人不学习,就去教育,结果两人还吵架,于是更加坚定自己的观点。因此这次看到书中这样写,就很有感触。<br>书中举的例子是女主人公去干涉老公的生活习惯,结果两人吵了一架。两人在一起其实也要注意交流方式。</p>
<h2 id="对待后果"><a href="#对待后果" class="headerlink" title="对待后果"></a>对待后果</h2><p>对待已经发生的事情,最好的选择就是<strong>臣服</strong>,确实也是这样的,事情发生就不要再去纠结了,好好想想弥补的方法。虽然这本书是唯心的理论,但是这个主张,还是很理智的。 </p>
<h2 id="其它"><a href="#其它" class="headerlink" title="其它"></a>其它</h2><p>其实书中还有一个心想事成的理论,就是说,当你特别想得到某种东西,只要是你的能量足够大,那么宇宙中的能量就会和你产生共振,将这个东西带到你身边。这个就不是很认同了。不过书中也说了,也不可能说你什么都不干,每天空想就能得到什么。总是感觉有那么点别扭。其实我觉得看书也是这样的,不可能说全都接受书中的观点,也要选择性接受嘛。<br>另外,书中也多次提到要使用<strong>腹式呼吸</strong>,练习了半天,发现我平时就是用的这种呼吸方式嘛,汗~~~</p>
]]></content>
<summary type="html">
<p>花了大概一个礼拜时间,每天中午休息的时候把这本书看完了,怎么说呢,第一次接触这一类的书。感觉是比较唯心的。主张我们应该注重自己的内心,找到真我。书中一些看法还是比较认同的,大概说一下看完之后的印象吧。另外补充一点,现在愈发得觉得看电子书更方便了,在看到一些好的句子时,可以直
</summary>
<category term="读后感" scheme="https://answerwa.github.io/tags/%E8%AF%BB%E5%90%8E%E6%84%9F/"/>
</entry>
<entry>
<title>python3和python2的差别</title>
<link href="https://answerwa.github.io/2015/01/13/python3-python2-difference/"/>
<id>https://answerwa.github.io/2015/01/13/python3-python2-difference/</id>
<published>2015-01-13T15:21:46.000Z</published>
<updated>2017-05-28T04:08:06.238Z</updated>
<content type="html"><![CDATA[<p>学习python已经有段时间了,断断续续的,但是基本上每天也会多多少少看看。<br>由于学的是python3,因此经常都会遇到一些兼容性的问题。其实也不可能说一直盯着官方文档看完,所以还是遇到问题后再解决,但是好多都是当时遇到查一下,解决了就忘了,今天新开一篇博客,以后遇到了,可以记录一下。<br>推荐一下<a href="http://www.liaoxuefeng.com/" title="廖学峰" target="_blank" rel="external">廖学峰老师的网站</a>,git和python都是在这个网站学习的。本篇博客可能会引用部分代码。</p>
<h2 id="print"><a href="#print" class="headerlink" title="print"></a>print</h2><p>从python3开始,print变成了一个函数,因此最直观的说明就是,在使用它时,需要加括号了。<br><figure class="highlight python"><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">str = <span class="string">'there are test code'</span></div><div class="line">print(str)</div></pre></td></tr></table></figure></p>
<p>格式化输出也是同样的。<br><figure class="highlight python"><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">i = <span class="number">3</span></div><div class="line">print(<span class="string">'this is the %dth blog'</span> % i)</div></pre></td></tr></table></figure></p>
<p>ps:其实,简单说来,就是在python2的基础上,用括号把它包起来(个人理解)。</p>
<h2 id="bytes-str"><a href="#bytes-str" class="headerlink" title="bytes str"></a>bytes str</h2><p>这是在学习socket时遇到的一个问题。主要是由于在python3中对文本和二进制数据作了明确的区分,文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。<br>在python2中,connect后,send时,是发送的字符串,代码如下:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> socket</div><div class="line">s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)</div><div class="line">s.connect((<span class="string">'www.sina.com.cn'</span>, <span class="number">80</span>))</div><div class="line">s.send(<span class="string">'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n'</span>)</div></pre></td></tr></table></figure></p>
<p>而在python3中,send时,需要发送bytes(<a href="https://docs.python.org/3/library/socket.html" title="socket" target="_blank" rel="external">socket.send(bytes[, flags])</a>),代码修改起来也比较简单,将’abc’改为b’abc’就可以了,代码如下:<br><figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">import</span> socket</div><div class="line">s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)</div><div class="line">s.connect((<span class="string">'www.sina.com.cn'</span>, <span class="number">80</span>))</div><div class="line">s.send(<span class="string">b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n'</span>)</div></pre></td></tr></table></figure></p>
<p>当然,正规的方法肯定不是这样的,str与bytes的转换关系如下:</p>
<blockquote>
<p>str—–encode()—>bytes<br>bytes—decode()—>str </p>
</blockquote>
<figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"><span class="meta">>>> </span>by1 = <span class="string">b'test'</span></div><div class="line"><span class="meta">>>> </span>type(by1)</div><div class="line"><<span class="class"><span class="keyword">class</span> '<span class="title">bytes</span>'></span></div><div class="line">>>> str1 = by1.decode('utf-8')</div><div class="line"><span class="meta">>>> </span>str1</div><div class="line"><span class="string">'test'</span></div><div class="line"><span class="meta">>>> </span>type(str1)</div><div class="line"><<span class="class"><span class="keyword">class</span> '<span class="title">str</span>'></span></div><div class="line">>>> by2 = str1.encode('utf-8')</div><div class="line"><span class="meta">>>> </span>by2</div><div class="line"><span class="string">b'test'</span></div><div class="line"><span class="meta">>>> </span>type(by2)</div><div class="line"><<span class="class"><span class="keyword">class</span> '<span class="title">bytes</span>'></span></div></pre></td></tr></table></figure>
<p>另外拓展一个<a href="http://www.ituring.com.cn/article/61192" target="_blank" rel="external">链接</a>吧。</p>
<h2 id="图形编程-tkinter"><a href="#图形编程-tkinter" class="headerlink" title="图形编程 tkinter"></a>图形编程 tkinter</h2><p>这个目前用的不多,单纯记录一下:</p>
<blockquote>
<p>Tkinter → tkinter<br>tkMessageBox → tkinter.messagebox<br>tkColorChooser → tkinter.colorchooser<br>tkFileDialog → tkinter.filedialog<br>tkCommonDialog → tkinter.commondialog<br>tkSimpleDialog → tkinter.simpledialog<br>tkFont → tkinter.font<br>Tkdnd → tkinter.dnd<br>ScrolledText → tkinter.scrolledtext<br>Tix → tkinter.tix<br>ttk → tkinter.ttk </p>
</blockquote>
]]></content>
<summary type="html">
<p>学习python已经有段时间了,断断续续的,但是基本上每天也会多多少少看看。<br>由于学的是python3,因此经常都会遇到一些兼容性的问题。其实也不可能说一直盯着官方文档看完,所以还是遇到问题后再解决,但是好多都是当时遇到查一下,解决了就忘了,今天新开一篇博客,以后遇到
</summary>
<category term="python" scheme="https://answerwa.github.io/tags/python/"/>
</entry>
<entry>
<title>2014年终总结</title>
<link href="https://answerwa.github.io/2015/01/04/2014-annual-summary/"/>
<id>https://answerwa.github.io/2015/01/04/2014-annual-summary/</id>
<published>2015-01-04T02:15:18.000Z</published>
<updated>2017-05-28T04:08:06.167Z</updated>
<content type="html"><![CDATA[<p>2014已经悄悄过去了,是时候对这一年做个总结了。<br>2014年是崭新的一年,是毕业后第一个完整的工作年,在这一年里,许多想法都在发生着改变,也在尝试去接触许多新的知识。 </p>
<p>##读书<br>今年从8月份开始突然有了读书的习惯,看了许多书,但是却没有写过读书笔记,以后要养成写读书笔记的习惯。现在把今年读过的书简单罗列一下:</p>
<ul>
<li><a href="http://www.duokan.com/book/45261" title="1984" target="_blank" rel="external">《1984》</a><br>这本书在网上火得一塌糊涂,豆瓣评分也特别高,因此不得不尝试着去看看。说实话,看到大概一半的时候,我确实都不知道在讲些什么, 感觉一直是在营造一种比较黑暗,恐怖的氛围。看到温斯顿被洗脑时,那种无助,直到最后他也变得麻木起来。确实有些瘆得慌。</li>
<li><a href="http://www.duokan.com/book/426" title="三国演义" target="_blank" rel="external">《三国演义》</a><br>这本书没什么好说的,以前一直想看,尝试了三次,都半途而废了,这次总算是看完了,算是如愿了。 <strong>夫英雄者,胸怀大志,腹有良谋,有包藏宇宙之机,吞吐天地之志者也。</strong></li>
<li><a href="http://www.duokan.com/book/73061" title="一句顶一万句" target="_blank" rel="external">《一句顶一万句》</a><br>这本书是在看 <strong>青年中国说</strong> 时,撒贝宁推荐的。讲了一些很简单的故事,刻画人物的心理。只能说是感同身受。也让我愈发坚定自己的想法,不管是交朋友,还是找对象,一定不能将就,一定要找对人。</li>
<li><a href="http://book.douban.com/subject/10561367" title="head first python" target="_blank" rel="external">《head first python》</a><br>这本书适合python入门后看。不过后小半部分的东西感觉讲的不是很清楚。 </li>
<li><a href="http://book.douban.com/subject/21317828/" title="征服C指针" target="_blank" rel="external">《征服C指针》</a></li>
<li><a href="http://billie66.github.io/TLCL/book/zh/" title="TLCL" target="_blank" rel="external">《the linux command line》</a><br>这两本书都没看完。。。</li>
</ul>
<p>##语言<br>今年新学了python,学得还是挺起劲的,因此准备长期学习下去,同时也接触了django,但是由于从来都没有接触过这方面的知识,因此学习起来有些不太明白,<a href="http://docs.30c.org/djangobook2/" title="2.0" target="_blank" rel="external">djangobook</a>看了好几遍,现在总算是有点眉目了。<br>另外也零零散散的学习了一些html,css,javascript。毕竟现在互联网行业这么火热,多接触一些这方面的只是总是没错的。</p>
<p>##憧憬<br>目标就不定了,总是觉得自己给自己的压力太大了,还是随性点。目前的状态还是挺好的,对于游戏也不是那么着迷,闲下来的时候还是会主动想看看书,学习学习。不一定非得做那1%,剩下的99%其实也挺好的。</p>
<p>##最后<br>第一次尝试着写总结,写得比较乱,感觉都是些零碎的东西。打算从新的一年开始,每个月做一次简单的总结,平时学习到的东西也简单的总结,记录在这里,以后回头看看,说不定是另外一种体会。</p>
]]></content>
<summary type="html">
<p>2014已经悄悄过去了,是时候对这一年做个总结了。<br>2014年是崭新的一年,是毕业后第一个完整的工作年,在这一年里,许多想法都在发生着改变,也在尝试去接触许多新的知识。 </p>
<p>##读书<br>今年从8月份开始突然有了读书的习惯,看了许多书,但是却没有写过读
</summary>
<category term="总结" scheme="https://answerwa.github.io/tags/%E6%80%BB%E7%BB%93/"/>
</entry>
</feed>