-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
626 lines (359 loc) · 228 KB
/
atom.xml
File metadata and controls
626 lines (359 loc) · 228 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>ITABAS</title>
<subtitle>Technical Blog</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="https://tech.itabas.com/"/>
<updated>2020-01-13T14:46:01.599Z</updated>
<id>https://tech.itabas.com/</id>
<author>
<name>itabas016</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>2019总结</title>
<link href="https://tech.itabas.com/2020/01/01/life/event-2019/"/>
<id>https://tech.itabas.com/2020/01/01/life/event-2019/</id>
<published>2019-12-31T16:00:00.000Z</published>
<updated>2020-01-13T14:46:01.599Z</updated>
<content type="html"><![CDATA[<blockquote><p>今年的元旦虽然过的跟平常的日子几乎一样,但总觉得这个 20 世纪 10 年代赋予了它深刻的意义,就像说的 2019 年是往年来最差的一年,但却是未来十年最好的一年。这谁又知道呢?总结还是要一如既往的回顾一下,才能打鸡血冲向未来,你说不是吗?</p></blockquote><a id="more"></a><p>言归正传,翻着这一年做的笔记,看看做的这些项目,遇到的这些人,碰到的这些事,一个人的日子多少有些凄凉,生活照旧多少有点让人焦虑。</p><h3 id="Technical-stuff"><a href="#Technical-stuff" class="headerlink" title="Technical stuff"></a>Technical stuff</h3><p>年初又买了新域名 - <a href="https://www.homeless.group" target="_blank" rel="noopener">homeless.group</a>, 当时很想着做点有用的事情,后面一忙就搁置了,后面有了些时间就搞了一下。</p><ul><li>Timeline</li></ul><blockquote><p>购买新域名 homeless.group<br>自学 Vue/React 前端<br>搞了 PVE, 玩转虚拟机<br>申请到了免费的 Oracle Cloud<br>双十一购买了良心云<br>因云服务器购买新域名 ebanbox.com<br>第一次备案<br>试运行一个完整的项目</p></blockquote><ul><li>Missed</li></ul><blockquote><p>以前的同事介绍的项目放弃了<br>撸了一段时间 Golang,但没深入<br>Flutter 没开始<br>云服务器吃灰</p></blockquote><h3 id="Mess-up-of-my-life"><a href="#Mess-up-of-my-life" class="headerlink" title="Mess up of my life"></a>Mess up of my life</h3><ul><li>Timeline</li></ul><p>年初定下来的很多目标今年都没有实现,很是惭愧。</p><blockquote><p>老爸二度来上海<br>交大自考的 CET-4 顺利过关<br>徽杭古道之行<br>买花盆开始种花(最后只有薄荷,秋葵活了下来)<br>空心户外之行<br>交大顺利毕业<br>GOT LAST SEASON<br>有段时间沉迷于 PKart<br>尝试剃了次“光头”(2-3mm)<br>朋友介绍的对象,还没开始就结束了<br>返乡祭祖<br>年底了锤子还摔了<br>今年入的装备 - DELL2417M, PVE Host, Smartisan R1<br>今年很是养生了隔三岔五的熬粥打豆浆吃素菜</p></blockquote><ul><li>Missed</li></ul><blockquote><p>吉他放弃了<br>骑行放弃了<br>徒步旅行没有坚持下来<br>野营没有踏出门<br>社交放弃了<br>玩游戏上瘾了<br>以前的坏毛病一样没有改掉</p></blockquote><h3 id="Plan"><a href="#Plan" class="headerlink" title="Plan"></a>Plan</h3><blockquote><p>中小型架构一把梭<br>想合伙搞个产品/合伙人?<br>学车<br>死瘦宅能脱单吗?</p></blockquote>]]></content>
<summary type="html">
<blockquote>
<p>今年的元旦虽然过的跟平常的日子几乎一样,但总觉得这个 20 世纪 10 年代赋予了它深刻的意义,就像说的 2019 年是往年来最差的一年,但却是未来十年最好的一年。这谁又知道呢?总结还是要一如既往的回顾一下,才能打鸡血冲向未来,你说不是吗?</p>
</blockquote>
</summary>
<category term="Life" scheme="https://tech.itabas.com/categories/Life/"/>
<category term="life" scheme="https://tech.itabas.com/tags/life/"/>
<category term="2019" scheme="https://tech.itabas.com/tags/2019/"/>
<category term="2020" scheme="https://tech.itabas.com/tags/2020/"/>
</entry>
<entry>
<title>2017总结</title>
<link href="https://tech.itabas.com/2018/01/21/life/event-2017/"/>
<id>https://tech.itabas.com/2018/01/21/life/event-2017/</id>
<published>2018-01-20T16:00:00.000Z</published>
<updated>2020-01-02T12:52:36.191Z</updated>
<content type="html"><![CDATA[<blockquote><p>前两天正好赶上新公司的年会,自己去年的总结一直没有写,到现在才开始写。去年一年有点像空白,年龄一大脑袋不太记事儿了。。。</p></blockquote><a id="more"></a><p>Many times focus on personal stuff that some small and simple projects, meanwhile, about these project demos, I didn’t make well, I wish I will do well and keep going on it in 2018.</p><h3 id="Work-Things"><a href="#Work-Things" class="headerlink" title="Work Things"></a>Work Things</h3><ul><li>Projects</li></ul><blockquote><p>[Work]Change work team(Performance -> Panda)(Apr)<br>[Work]projects on MNC and Support<br>Host a wiki site project(Apr) - <a href="https://wiki.itabas.com/" target="_blank" rel="noopener">Base on Simiki</a><br>Change new version for personal site nav(Jun) - <a href="https://itabas.com/" target="_blank" rel="noopener">iNav</a><br>Change theme even for tech project(Aug) - <a href="https://tech.itabas.com/">Tech</a><br>Question2Answer cover project(Aug) - q2a<br>Bing wallpaper simple project(Sep) - <a href="https://github.com/itabas016/bing-wallpaper-cli" target="_blank" rel="noopener">wallpaper</a><br>Simple Chat room(Aug) - <a href="https://github.com/itabas016/chat" target="_blank" rel="noopener">Chat</a><br>doc & wiki(Sphinx) roadmap(Oct) - <code>progress: 20%</code><br>Vote project(Aug) - <code>progress: 10%</code><br>memories project(Oct) - <code>progress: 10%</code><br>vocab project(Jul) - <code>progres: 5%</code><br>bing wallpaper web version(Nov) - <code>progress: 0%</code><br>upload file(like: sm) share cloud(Oct) - <code>progress: 0%</code><br>Land Game base on Java(Nov) - <code>progress: 0%</code></p></blockquote><ul><li>Python</li></ul><blockquote><p>Python trip is done!<br>new plan, continue and go on<br>2018 part on flask, celery and django</p></blockquote><ul><li><p>Java</p><blockquote><p>go through Spring framework and such as other Integration framework.<br>tutorial - big data? android?<br>Kotlin, groovy(2018)<br>many many tasks in 2018</p></blockquote></li><li><p>Scripts</p><blockquote><p>Space-Vim(Dec)<br>Zsh(Dec)<br>work fun with chromebook<br>customize ide?</p></blockquote></li></ul><h3 id="Life-Things"><a href="#Life-Things" class="headerlink" title="Life Things"></a>Life Things</h3><ul><li>Timeline</li></ul><blockquote><p>guitar cover(few songs) - <a href="http://www.meipai.com/user/22093459" target="_blank" rel="noopener">Meipai</a><br>TeamBuilding - Disney(Jan)<br>English wallstreet training(Aug-Sep)<br>biking(Apr-Jul)</p><ul><li><a href="http://www.imxingzhe.com/xing/24540083/" target="_blank" rel="noopener">周庄锦溪</a></li><li><a href="http://www.imxingzhe.com/im/GJmYetoZidm/" target="_blank" rel="noopener">潇信风</a><br>hiking plan - <code>progress 0%</code><br>running plan - <code>stopped</code><br>tour - <code>removed</code><br>mom’s stuff(May-Aug)<br>Nexus6p relive(Sep)<br>Leave Hsn(Nov)<br>FreeTime(Nov-Dec)<br>nowhere<br>sports<br>library<br>interview<br>Join TCSoft(Jan)</li></ul></blockquote><ul><li>List</li></ul><blockquote><p>Smartsain Pro1(18th Jun)<br>Chromebook Samsung Plus(Black Friday)<br>Bluetooth earphone(bose)?<br>New Dell Screen?<br>Bike?</p></blockquote>]]></content>
<summary type="html">
<blockquote>
<p>前两天正好赶上新公司的年会,自己去年的总结一直没有写,到现在才开始写。去年一年有点像空白,年龄一大脑袋不太记事儿了。。。</p>
</blockquote>
</summary>
<category term="Life" scheme="https://tech.itabas.com/categories/Life/"/>
<category term="life" scheme="https://tech.itabas.com/tags/life/"/>
<category term="2017" scheme="https://tech.itabas.com/tags/2017/"/>
<category term="2018" scheme="https://tech.itabas.com/tags/2018/"/>
</entry>
<entry>
<title>再安利一款命令行下载工具</title>
<link href="https://tech.itabas.com/2017/11/27/tools/youget-download-tool/"/>
<id>https://tech.itabas.com/2017/11/27/tools/youget-download-tool/</id>
<published>2017-11-26T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.382Z</updated>
<content type="html"><![CDATA[<p>流媒体视频下载号称覆盖各大主流网站<code>Youtube</code>,<code>Twitter</code>, <code>TED</code>,<code>Bilibili</code>,<code>iQIYI</code>等等。<a href="https://you-get.org/#supported-sites" target="_blank" rel="noopener">Supported-sites</a><br>拿当前的几个网站测试玩玩~</p><a id="more"></a><h2 id="Install-安装"><a href="#Install-安装" class="headerlink" title="Install(安装)"></a>Install(安装)</h2><p>我是Windows下使用,需要<code>python3</code>,<code>FFmpeg</code>(转码)和<code>VLC</code>(播放器)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 通过choco来安装 FFmpeg, vlc</span></span><br><span class="line">choco install ffmpeg vlc -y</span><br><span class="line"></span><br><span class="line">pip install you-get</span><br></pre></td></tr></table></figure><p><strong>PS: <code>choco</code>第三方安装包参照<a href="https://chocolatey.org/installs" target="_blank" rel="noopener">这里</a></strong></p><h2 id="Command-命令"><a href="#Command-命令" class="headerlink" title="Command(命令)"></a>Command(命令)</h2><p>使用很简单,<code>you-get [params] <url></code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">$ you-get -h</span><br><span class="line">you-get: version 0.4.964, a tiny downloader that scrapes the web.</span><br><span class="line">usage: you-get [OPTION]... URL...</span><br><span class="line"></span><br><span class="line">A tiny downloader that scrapes the web</span><br><span class="line"></span><br><span class="line">optional arguments:</span><br><span class="line"> -V, --version Print version and <span class="built_in">exit</span></span><br><span class="line"> -h, --<span class="built_in">help</span> Print this <span class="built_in">help</span> message and <span class="built_in">exit</span></span><br><span class="line"></span><br><span class="line">Dry-run options:</span><br><span class="line"> (no actual downloading)</span><br><span class="line"></span><br><span class="line"> -i, --info Print extracted information</span><br><span class="line"> -u, --url Print extracted information with URLs</span><br><span class="line"> --json Print extracted URLs <span class="keyword">in</span> JSON format</span><br><span class="line"></span><br><span class="line">Download options:</span><br><span class="line"> -n, --no-merge Do not merge video parts</span><br><span class="line"> --no-caption Do not download captions (subtitles, lyrics, danmaku,</span><br><span class="line"> ...)</span><br><span class="line"> -f, --force Force overwriting existing files</span><br><span class="line"> -F STREAM_ID, --format STREAM_ID</span><br><span class="line"> Set video format to STREAM_ID</span><br><span class="line"> -O FILE, --output-filename FILE</span><br><span class="line"> Set output filename</span><br><span class="line"> -o DIR, --output-dir DIR</span><br><span class="line"> Set output directory</span><br><span class="line"> -p PLAYER, --player PLAYER</span><br><span class="line"> Stream extracted URL to a PLAYER</span><br><span class="line"> -c COOKIES_FILE, --cookies COOKIES_FILE</span><br><span class="line"> Load cookies.txt or cookies.sqlite</span><br><span class="line"> -t SECONDS, --timeout SECONDS</span><br><span class="line"> Set socket timeout</span><br><span class="line"> -d, --debug Show traceback and other debug info</span><br><span class="line"> -I FILE, --input-file FILE</span><br><span class="line"> Read non-playlist URLs from FILE</span><br><span class="line"> -P PASSWORD, --password PASSWORD</span><br><span class="line"> Set video visit password to PASSWORD</span><br><span class="line"> -l, --playlist Prefer to download a playlist</span><br><span class="line"></span><br><span class="line">Proxy options:</span><br><span class="line"> -x HOST:PORT, --http-proxy HOST:PORT</span><br><span class="line"> Use an HTTP proxy <span class="keyword">for</span> downloading</span><br><span class="line"> -y HOST:PORT, --extractor-proxy HOST:PORT</span><br><span class="line"> Use an HTTP proxy <span class="keyword">for</span> extracting only</span><br><span class="line"> --no-proxy Never use a proxy</span><br><span class="line"> -s HOST:PORT, --socks-proxy HOST:PORT</span><br><span class="line"> Use an SOCKS5 proxy <span class="keyword">for</span> downloading</span><br></pre></td></tr></table></figure><p>测试结果: 家里是20M移动,外网挂代理速度还是很不错,国内的几个站点,速度不是太理想,爱奇艺下都下不完,难道姿势不对?不过就这样吧。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># youtube test result(use proxy, download quality 1280x720)</span></span><br><span class="line">$ you-get --itag=247 <span class="string">'https://www.youtube.com/watch?v=cECkQWunAro'</span> -x 127.0.0.1:1080</span><br><span class="line">site: YouTube</span><br><span class="line">title: LEE Chong Wei vs CHEN Long 2017 Hong Kong Open Final</span><br><span class="line">stream:</span><br><span class="line"> - itag: 247</span><br><span class="line"> container: webm</span><br><span class="line"> quality: 1280x720</span><br><span class="line"> size: 250.7 MiB (262915265 bytes)</span><br><span class="line"> <span class="comment"># download-with: you-get --itag=247 [URL]</span></span><br><span class="line"></span><br><span class="line">Downloading LEE Chong Wei vs CHEN Long 2017 Hong Kong Open Final.webm ...</span><br><span class="line"> 100% (250.7/250.7MB) ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒[2/2] 2 MB/s</span><br><span class="line">Merging video parts... Merged into LEE Chong Wei vs CHEN Long 2017 Hong Kong Open Final.webm</span><br><span class="line"></span><br><span class="line">Saving LEE Chong Wei vs CHEN Long 2017 Hong Kong Open Final.en.srt ... Done.</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># TED test result</span></span><br><span class="line">$ you-get <span class="string">'https://www.ted.com/talks/mandy_len_catron_a_better_way_to_talk_about_love'</span> -x 127.0.0.1:1080</span><br><span class="line">Site: TED.com</span><br><span class="line">Title: A better way to talk about love</span><br><span class="line">Type: MPEG-4 video (video/mp4)</span><br><span class="line">Size: 101.95 MiB (106899473 Bytes)</span><br><span class="line"></span><br><span class="line">Downloading A better way to talk about love.mp4 ...</span><br><span class="line"> 100% (101.9/101.9MB) ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒[1/1] 2 MB/s</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Bilibili test</span></span><br><span class="line">$ you-get --format=mp4 <span class="string">'https://bangumi.bilibili.com/anime/5977/play#103970'</span></span><br><span class="line">site: Bilibili</span><br><span class="line">title: ▒▒Ŀ▒▒▒▒▒▒ ½ [7 ▒▒▒ֵĶ▒▒▒]</span><br><span class="line">stream:</span><br><span class="line"> - format: mp4</span><br><span class="line"> container: mp4</span><br><span class="line"> size: 98.3 MiB (103063182 bytes)</span><br><span class="line"> <span class="comment"># download-with: you-get --format=mp4 [URL]</span></span><br><span class="line"></span><br><span class="line">Downloading ▒▒Ŀ▒▒▒▒▒▒ ½ (7 ▒▒▒ֵĶ▒▒▒).mp4 ...</span><br><span class="line"> 100% ( 98.3/ 98.3MB) ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒[1/1] 755 kB/s</span><br><span class="line"></span><br><span class="line">Downloading ▒▒Ŀ▒▒▒▒▒▒ ½ (7 ▒▒▒ֵĶ▒▒▒).cmt.xml ...</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># iQIYI test</span></span><br><span class="line">$ you-get --format=TD <span class="string">'http://www.iqiyi.com/v_19rrok801k.html'</span></span><br><span class="line">ffmpeg version 3.4 Copyright (c) 2000-2017 the FFmpeg developers</span><br><span class="line"> built with gcc 7.2.0 (GCC)</span><br><span class="line"> configuration: --<span class="built_in">enable</span>-gpl --<span class="built_in">enable</span>-version3 --<span class="built_in">enable</span>-sdl2 --<span class="built_in">enable</span>-bzlib --<span class="built_in">enable</span>-fontconfig --<span class="built_in">enable</span>-gnutls --<span class="built_in">enable</span>-iconv --<span class="built_in">enable</span>-libass --<span class="built_in">enable</span>-libbluray --<span class="built_in">enable</span>-libfreetype --<span class="built_in">enable</span>-libmp3lame --<span class="built_in">enable</span>-libopenjpeg --<span class="built_in">enable</span>-libopus --<span class="built_in">enable</span>-libshine --<span class="built_in">enable</span>-libsnappy --<span class="built_in">enable</span>-libsoxr --<span class="built_in">enable</span>-libtheora --<span class="built_in">enable</span>-libtwolame --<span class="built_in">enable</span>-libvpx --<span class="built_in">enable</span>-libwavpack --<span class="built_in">enable</span>-libwebp --<span class="built_in">enable</span>-libx264 --<span class="built_in">enable</span>-libx265 --<span class="built_in">enable</span>-libxml2 --<span class="built_in">enable</span>-libzimg --<span class="built_in">enable</span>-lzma --<span class="built_in">enable</span>-zlib --<span class="built_in">enable</span>-gmp --<span class="built_in">enable</span>-libvidstab --<span class="built_in">enable</span>-libvorbis --<span class="built_in">enable</span>-cuda --<span class="built_in">enable</span>-cuvid --<span class="built_in">enable</span>-d3d11va --<span class="built_in">enable</span>-nvenc --<span class="built_in">enable</span>-dxva2 --<span class="built_in">enable</span>-avisynth --<span class="built_in">enable</span>-libmfx</span><br><span class="line"> libavutil 55. 78.100 / 55. 78.100</span><br><span class="line"> libavcodec 57.107.100 / 57.107.100</span><br><span class="line"> libavformat 57. 83.100 / 57. 83.100</span><br><span class="line"> libavdevice 57. 10.100 / 57. 10.100</span><br><span class="line"> libavfilter 6.107.100 / 6.107.100</span><br><span class="line"> libswscale 4. 8.100 / 4. 8.100</span><br><span class="line"> libswresample 2. 9.100 / 2. 9.100</span><br><span class="line"> libpostproc 54. 7.100 / 54. 7.100</span><br><span class="line">[hls,applehttp @ 000002603fea2460] Opening <span class="string">'http://dx.data.video.qiyi.com/videos/v0/20160531/72/41/8f1463dced2d029eb624aa8357863660.ts?qdv=1&qypid=385577300_04022000001000000000_4&start=0&end=1774490&hsize=1894&tag=0&v=&contentlength=1375784&qd_uid=&qd_vip=0&qd_src=3_31_312&qd_tm=1511792844379&qd_ip=b7c177e5&qd_p=b7c177e5&qd_k=0ce99ea79e7124c9adf063c9ec40cecc&qd_sc=818a00f02607bad3fcf841a2cb399f22'</span> <span class="keyword">for</span> reading</span><br><span class="line">Input <span class="comment">#0, hls,applehttp, from 'http://cache.m.iqiyi.com/mus/202861101/21e7451d956c0102975c361c8c6f1d10/afbe8fd3d73448c9//20160531/72/41/bbaf27dca1cc5742c13a761e67a82ade.m3u8?qd_originate=tmts_py&tvid=385577300&bossStatus=0&qd_vip=0&px=&qd_src=3_31_312&prv=&previewType=&previewTime=&from=&qd_time=1511792843835&qd_p=b7c177e5&qd_asc=b23206a0facb3fcc3854c89ca63fda45&qypid=385577300_04022000001000000000_4&qd_k=0ce99ea79e7124c9adf063c9ec40cecc&isdol=0&code=2&qd_s=otv&vf=2c976281fee262e999cd40862078c8ff&np_tag=nginx_part_tag':</span></span><br><span class="line"> Duration: 00:23:25.00, start: 0.000000, bitrate: N/A</span><br><span class="line"> Program 0</span><br><span class="line"> Metadata:</span><br><span class="line"> variant_bitrate : 0</span><br><span class="line"> Stream <span class="comment">#0:0: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709), 1280x720, 23.98 fps, 23.98 tbr, 90k tbn, 47.95 tbc</span></span><br><span class="line"> Metadata:</span><br><span class="line"> variant_bitrate : 0</span><br><span class="line"> Stream <span class="comment">#0:1: Audio: aac (LC) ([15][0][0][0] / 0x000F), 44100 Hz, stereo, fltp</span></span><br><span class="line"> Metadata:</span><br><span class="line"> variant_bitrate : 0</span><br><span class="line">Output <span class="comment">#0, mp4, to '航海王第312集.mp4':</span></span><br><span class="line"> Metadata:</span><br><span class="line"> encoder : Lavf57.83.100</span><br><span class="line"> Stream <span class="comment">#0:0: Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709), 1280x720, q=2-31, 23.98 fps, 23.98 tbr, 90k tbn, 90k tbc</span></span><br><span class="line"> Metadata:</span><br><span class="line"> variant_bitrate : 0</span><br><span class="line"> Stream <span class="comment">#0:1: Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp</span></span><br><span class="line"> Metadata:</span><br><span class="line"> variant_bitrate : 0</span><br><span class="line">Stream mapping:</span><br><span class="line"> Stream <span class="comment">#0:0 -> #0:0 (copy)</span></span><br><span class="line"> Stream <span class="comment">#0:1 -> #0:1 (copy)</span></span><br><span class="line">Press [q] to stop, [?] <span class="keyword">for</span> <span class="built_in">help</span></span><br><span class="line">[mp4 @ 000002603fee37a0] Timestamps are <span class="built_in">unset</span> <span class="keyword">in</span> a packet <span class="keyword">for</span> stream 0. This is deprecated and will stop working <span class="keyword">in</span> the future. Fix your code to <span class="built_in">set</span> the timestamps properly</span><br><span class="line">[mp4 @ 000002603fee37a0] pts has no valueB time=00:00:02.96 bitrate= 0.1kbits/s speed=0.778x</span><br><span class="line">[http @ 000002603feb3ac0] Stream ends prematurely at 681976, should be 1375784s/s speed=0.162x</span><br><span class="line">[hls,applehttp @ 000002603fea2460] Opening <span class="string">'http://dx.data.video.qiyi.com/videos/v0/20160531/72/41/8f1463dced2d029eb624aa8357863660.ts?qdv=1&qypid=385577300_04022000001000000000_4&start=614670&end=1885760&hsize=1894&tag=1&v=&contentlength=468120&qd_uid=&qd_vip=0&qd_src=3_31_312&qd_tm=1511792844379&qd_ip=b7c177e5&qd_p=b7c177e5&qd_k=0ce99ea79e7124c9adf063c9ec40cecc&qd_sc=818a00f02607bad3fcf841a2cb399f22'</span> <span class="keyword">for</span> reading</span><br><span class="line">[mpegts @ 000002603ffee840] PES packet size mismatch</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>流媒体视频下载号称覆盖各大主流网站<code>Youtube</code>,<code>Twitter</code>, <code>TED</code>,<code>Bilibili</code>,<code>iQIYI</code>等等。<a href="https://you-get.org/#supported-sites" target="_blank" rel="noopener">Supported-sites</a><br>拿当前的几个网站测试玩玩~</p>
</summary>
<category term="Tools" scheme="https://tech.itabas.com/categories/Tools/"/>
<category term="Linux" scheme="https://tech.itabas.com/tags/Linux/"/>
<category term="Command Line" scheme="https://tech.itabas.com/tags/Command-Line/"/>
<category term="Download" scheme="https://tech.itabas.com/tags/Download/"/>
<category term="Tools" scheme="https://tech.itabas.com/tags/Tools/"/>
<category term="You-Get" scheme="https://tech.itabas.com/tags/You-Get/"/>
<category term="流媒体" scheme="https://tech.itabas.com/tags/%E6%B5%81%E5%AA%92%E4%BD%93/"/>
<category term="下载" scheme="https://tech.itabas.com/tags/%E4%B8%8B%E8%BD%BD/"/>
</entry>
<entry>
<title>安利一款百度云盘下载工具</title>
<link href="https://tech.itabas.com/2017/11/25/tools/baidu-pan-download-tool/"/>
<id>https://tech.itabas.com/2017/11/25/tools/baidu-pan-download-tool/</id>
<published>2017-11-24T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.376Z</updated>
<content type="html"><![CDATA[<p>首先这款工具是在找<code>Aira2-RPC</code>网盘下载时才发现的,原来的chrome插件<a href="https://github.com/acgotaku/BaiduExporter" target="_blank" rel="noopener">BaiduExporter</a>,去年用过一段时间,我自己感觉不是很好,不知道是不是用法不对还是怎么,<code>Aria2</code>老半天才弹出来,现在大家普遍反应百度云对此类连接做了限制,所以找了找其它的就发现了这个。初步试了试感觉还不错,可以继续把百度云上的东西搬到自己的<code>NAS</code>上。一来摆脱百度云盘这个毒瘤应用程序,二来在<code>Rasp</code>上直接搞就行了。</p><a id="more"></a><h2 id="Install-安装"><a href="#Install-安装" class="headerlink" title="Install(安装)"></a>Install(安装)</h2><ul><li>支持多线程下载和下载时断点续传。</li><li>支持快速上传和多线程分片上传。</li><li>支持线程限速。具体查看<code>pcs set</code>和<code>pcs context</code>命令的说明。</li><li>支持<code>AES-CBC-128</code>, <code>AES-CBC-192</code>, <code>AES-CBC-256</code>加密。</li></ul><p>工具地址-><a href="https://github.com/GangZhuo/BaiduPCS" target="_blank" rel="noopener">BaiduPCS</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 我用的`Debian`, 作者说程序依赖 libcurl</span></span><br><span class="line">sudo apt-get install build-essential libcurl4-openssl-dev libssl-dev</span><br><span class="line"></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/GangZhuo/BaiduPCS.git ~/Programs/pan</span><br><span class="line"></span><br><span class="line"><span class="comment"># Make</span></span><br><span class="line"><span class="built_in">cd</span> ~/Programs/pan</span><br><span class="line">./configure && make</span><br><span class="line"></span><br><span class="line">sudo cp ./baidupcs /usr/bin</span><br></pre></td></tr></table></figure><p>如果是路由器层(如果刷的是Openwrt)可以参照<a href="https://github.com/GangZhuo/BaiduPCS#编译-openwrt" target="_blank" rel="noopener">作者教科书Openwrt</a>。</p><h2 id="Command-命令"><a href="#Command-命令" class="headerlink" title="Command(命令)"></a>Command(命令)</h2><p>先来看一下help:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line">pi@raspberrypi:~ $ baidupcs -h</span><br><span class="line">pcs v0.3.1 (API v1.1.5)baidupcs</span><br><span class="line"></span><br><span class="line">Usage: baidupcs <span class="built_in">command</span> [options] [arg1|arg2...]</span><br><span class="line"></span><br><span class="line">Description:</span><br><span class="line"> The baidupcs is client of baidu net disk. It supplied many <span class="built_in">functions</span>,</span><br><span class="line"> <span class="built_in">which</span> can manage baidu net disk on terminal, such as ls, cp, rm,</span><br><span class="line"> mv, rename, download, upload, search and so on.</span><br><span class="line"> The baidupcs provided AES encryption, <span class="built_in">which</span> can protected your data.</span><br><span class="line"> The baidupcs is open <span class="built_in">source</span>, and published on MIT.</span><br><span class="line"> Please see https://github.com/GangZhuo/baidupcs.</span><br><span class="line"></span><br><span class="line">Options:</span><br><span class="line"> --context=<file path> Specify context.</span><br><span class="line"></span><br><span class="line">Commands:</span><br><span class="line"> cat Print the file content</span><br><span class="line"> <span class="built_in">cd</span> Change the work directory</span><br><span class="line"> copy Copy the file|directory</span><br><span class="line"> compare Print the differents between <span class="built_in">local</span> and net disk</span><br><span class="line"> context Print the context</span><br><span class="line"> download Download the file</span><br><span class="line"> <span class="built_in">echo</span> Write the text into net disk file</span><br><span class="line"> encode Encrypt/decrypt the file</span><br><span class="line"> fix Fix file base md5 and scrap</span><br><span class="line"> <span class="built_in">help</span> Print the usage</span><br><span class="line"> list List the directory</span><br><span class="line"> login Login</span><br><span class="line"> <span class="built_in">logout</span> Logout</span><br><span class="line"> meta Print the file|directory meta information</span><br><span class="line"> mkdir Make a new directory</span><br><span class="line"> move Move the file|directory into other file|directory</span><br><span class="line"> <span class="built_in">pwd</span> Print the current work directory</span><br><span class="line"> quota Print the quota</span><br><span class="line"> remove Remove the file|directory</span><br><span class="line"> rename Rename the file|directory</span><br><span class="line"> <span class="built_in">set</span> Change the context, you can <span class="built_in">print</span> the context by <span class="string">'context'</span> <span class="built_in">command</span></span><br><span class="line"> search Search the files <span class="keyword">in</span> the specify directory</span><br><span class="line"> synch Synch between <span class="built_in">local</span> and net disk. You can <span class="string">'compare'</span> first.</span><br><span class="line"> upload Upload the file</span><br><span class="line"> version Print the version</span><br><span class="line"> who Print the current user</span><br><span class="line">Use <span class="string">'baidupcs <command> -h'</span> to <span class="built_in">print</span> <span class="built_in">command</span> usage.</span><br><span class="line">Sample:</span><br><span class="line"> baidupcs <span class="built_in">help</span></span><br><span class="line"> baidupcs <span class="built_in">help</span> cat</span><br><span class="line"> baidupcs cat -h</span><br><span class="line"> baidupcs cat /note.txt</span><br><span class="line"> baidupcs <span class="built_in">cd</span> /temp</span><br><span class="line"> baidupcs cat /note.txt --context=/home/gang/.pcs_context</span><br></pre></td></tr></table></figure><p>下面我就列几个我常用的几个:<code>login</code>, <code>context</code>, <code>list</code>, <code>cat</code>, <code>compare</code>, <code>download</code>, <code>mkdir</code>, <code>synch</code>, <code>search</code>其它的命令都可参照help文档。<br><code>context</code>里面存储是登陆后的<code>cookie</code>和其它一些基本配置信息(下载线程数,磁盘缓存等),目前都是使用的默认值。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># login</span></span><br><span class="line">baidupcs login [--username=<username>] [--password=<password>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># login success, current directory is /</span></span><br><span class="line">baidupcs <span class="built_in">pwd</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># check drive list, default directory is /</span></span><br><span class="line">baidupcs list [dir]</span><br><span class="line"></span><br><span class="line"><span class="comment"># cat single file content</span></span><br><span class="line">baidupcs cat /Document/README.md</span><br><span class="line"></span><br><span class="line"><span class="comment"># 下面是比较常用的命令同步,下载和比较</span></span><br><span class="line"><span class="comment"># sync folder local <-> remote</span></span><br><span class="line"><span class="comment"># -c compare, -d download -u upload, -r recursive(递归目录)</span></span><br><span class="line"><span class="comment"># -n only print DONT execute down/upload, -e print same file/folder</span></span><br><span class="line">baidupcs synch [-cdenru] <<span class="built_in">local</span> path> <remote path></span><br><span class="line"></span><br><span class="line"><span class="comment"># 我的同步文件夹命令[目前只有下载,考虑下载限速后面可能不会再上传百度云]</span></span><br><span class="line">baidupcs synch -cdr /media/pi/ITABAS/Image /Image</span><br><span class="line"></span><br><span class="line"><span class="comment"># 单个文件的下载或上传(单个文件不包括目录)</span></span><br><span class="line"><span class="comment"># -f force(强制替换)</span></span><br><span class="line">baidupcs download [-f] <remote file> <<span class="built_in">local</span> file></span><br><span class="line"></span><br><span class="line"><span class="comment"># 文件查找</span></span><br><span class="line"><span class="comment"># search -r recursive dir to search</span></span><br><span class="line">baidupcs search [-r] [dir] <key></span><br><span class="line">pi@raspberrypi:~ $ baidupcs search -r /Music 刘德华</span><br><span class="line">D Size Modify Date Time File Name</span><br><span class="line">------------------------------------------------------------------------------</span><br><span class="line">- 10463262 2014-04-24 21:54:04 /Music/国语老歌/国语老歌·男人篇/16 忘情水(刘德华).mp3</span><br><span class="line">------------------------------------------------------------------------------</span><br><span class="line">Total: 9.98MB, File Count: 1, Directory Count: 0</span><br></pre></td></tr></table></figure><p>下面配图两张: 下载速度刚开始还不错,时间长了百度云也限速[摊手~]<br><img src="../../../../../screenshots/baidupcs.jpg" alt="baidupan"><br><img src="../../../../../screenshots/baidupcs-1.jpg" alt="baidupan-1"></p><p>另外还有一个问题没解决,就是在下载单个大文件(size>2G)时会报磁盘空间不足,后面会试着看看能不能解决,下载大文件速度是个问题。<br><a href="https://github.com/GangZhuo/BaiduPCS/issues/201" target="_blank" rel="noopener">在32位Linux平台上无法下载大文件 #201</a></p><p><strong>Tips:运行时间较长的任务使用<code>tmux</code>或<code>screen</code>命令</strong></p>]]></content>
<summary type="html">
<p>首先这款工具是在找<code>Aira2-RPC</code>网盘下载时才发现的,原来的chrome插件<a href="https://github.com/acgotaku/BaiduExporter" target="_blank" rel="noopener">BaiduExporter</a>,去年用过一段时间,我自己感觉不是很好,不知道是不是用法不对还是怎么,<code>Aria2</code>老半天才弹出来,现在大家普遍反应百度云对此类连接做了限制,所以找了找其它的就发现了这个。初步试了试感觉还不错,可以继续把百度云上的东西搬到自己的<code>NAS</code>上。一来摆脱百度云盘这个毒瘤应用程序,二来在<code>Rasp</code>上直接搞就行了。</p>
</summary>
<category term="Tools" scheme="https://tech.itabas.com/categories/Tools/"/>
<category term="Raspberry" scheme="https://tech.itabas.com/tags/Raspberry/"/>
<category term="树莓派" scheme="https://tech.itabas.com/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
<category term="Linux" scheme="https://tech.itabas.com/tags/Linux/"/>
<category term="Command Line" scheme="https://tech.itabas.com/tags/Command-Line/"/>
<category term="Download" scheme="https://tech.itabas.com/tags/Download/"/>
<category term="BaiduYun" scheme="https://tech.itabas.com/tags/BaiduYun/"/>
<category term="Tools" scheme="https://tech.itabas.com/tags/Tools/"/>
<category term="百度云盘" scheme="https://tech.itabas.com/tags/%E7%99%BE%E5%BA%A6%E4%BA%91%E7%9B%98/"/>
<category term="网盘" scheme="https://tech.itabas.com/tags/%E7%BD%91%E7%9B%98/"/>
</entry>
<entry>
<title>Raspberry Pi3 打造无线中继服务器</title>
<link href="https://tech.itabas.com/2017/11/13/raspberry/raspberry-pi3-wireless-repeater-server/"/>
<id>https://tech.itabas.com/2017/11/13/raspberry/raspberry-pi3-wireless-repeater-server/</id>
<published>2017-11-12T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.375Z</updated>
<content type="html"><![CDATA[<p>既然rasp又活了一开始想着用它来搞个WIFI中继。之前对这个原理不是很懂,也不知道具体是怎么实现的,这次搞一搞。</p><p>后来摸索着不妨就单开个热点做梯子用,其实中继模式和桥接模式很类似,表面上看可以简单的说只是无线SSID广播不同的信号,实际在实现上还是有诸多区别,这里就记一下所趟的坑。</p><a id="more"></a><h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><p>主要参考了网上的教程</p><p>我的是一个板子(包含内置的有线网卡eth0和无线网卡wlan0),一根网线,一个无线网卡wlan1(用来做梯子用)。</p><h3 id="Static-IP"><a href="#Static-IP" class="headerlink" title="Static IP"></a>Static IP</h3><p>之前已经准备好了eth0静态ip, wlan0动态获取。主要是有线网卡比较稳定适合用静态ip。</p><p>静态ip设置参照<a href="https://tech.itabas.com/2016/06/10/raspberry/raspberry-pi3-config/#Configure-static-IP-amp-WIFI">这里</a></p><p>后面修改 <code>/etc/network/interfaces</code> 和 <code>/etc/dhcpcd.conf</code> 分别添加以下配置:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># modify /etc/network/interfaces</span></span><br><span class="line">sudo vim /etc/network/interfaces</span><br><span class="line"></span><br><span class="line"><span class="comment"># add wlan1 configuration</span></span><br><span class="line">allow-hotplug wlan1</span><br><span class="line">auto wlan1</span><br><span class="line">iface wlan1 inet manual</span><br><span class="line"></span><br><span class="line"><span class="comment"># modify /etc/dhcpcd.conf</span></span><br><span class="line">sudo vim /etc/dhcpcd.conf</span><br><span class="line"></span><br><span class="line"><span class="comment"># add wlan1 dhcp configuration</span></span><br><span class="line">interface wlan1</span><br><span class="line">static ip_address=192.168.20.1/24</span><br><span class="line">static routers=192.168.11.1</span><br><span class="line">static domain_name_servers=114.114.114.114 119.29.29.29</span><br></pre></td></tr></table></figure><h3 id="DNS"><a href="#DNS" class="headerlink" title="DNS"></a>DNS</h3><p>然后修改 <code>/etc/dnsmasq.conf</code>配置wlan1网段(192.168.20.0/24):</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># modify /etc/dnsmasq.conf</span></span><br><span class="line">sudo vim /etc/dnsmasq.conf</span><br><span class="line"></span><br><span class="line"><span class="comment"># uncomments add configuration</span></span><br><span class="line">no-resolv</span><br><span class="line">server=202.38.93.153</span><br><span class="line">server=202.141.162.123</span><br><span class="line">server=114.114.114.114</span><br><span class="line">server=119.29.29.29</span><br><span class="line"></span><br><span class="line">listen-address=127.0.0.1,192.168.20.1</span><br><span class="line">dhcp-range=192.168.20.50,192.168.20.150,12h</span><br></pre></td></tr></table></figure><h3 id="Forward"><a href="#Forward" class="headerlink" title="Forward"></a>Forward</h3><p>开启包转发 <code>sudo vim /etc/sysctl.conf</code> </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># uncomment</span></span><br><span class="line">net.ipv4.ip_forward=1</span><br><span class="line"></span><br><span class="line"><span class="comment"># run</span></span><br><span class="line">sudo sysctl -p</span><br><span class="line"></span><br><span class="line"><span class="comment"># add iptables rule (nat rule for wlan0)</span></span><br><span class="line">sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE</span><br></pre></td></tr></table></figure><p><strong>PS.Tips:</strong> 使用<code>iptables-persistent</code>将防火墙rules保存至<code>/etc/iptables/rules.v4</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># save current rules</span></span><br><span class="line">sudo service netfilter-persistent save</span><br><span class="line"><span class="comment">#read current rules</span></span><br><span class="line">sudo service netfilter-persistent reload</span><br><span class="line"></span><br><span class="line"><span class="comment"># reload rules when restart rasp</span></span><br><span class="line">sudo vim /etc/rc.local</span><br><span class="line"><span class="comment"># add configuration</span></span><br><span class="line">iptables-restore < /etc/iptables/rules.v4</span><br></pre></td></tr></table></figure><h3 id="Hostapd"><a href="#Hostapd" class="headerlink" title="Hostapd"></a>Hostapd</h3><p>首先需要确保当前网卡wlan1是否具有APmode或用来做中继或桥接的功能。<code>iw list|grep -A10 'Supported interface modes'</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># install hostapd</span></span><br><span class="line">sudo apt-get install hostapd</span><br><span class="line"></span><br><span class="line"><span class="comment"># check wlan adapter support current driver</span></span><br><span class="line">lsusb</span><br><span class="line"></span><br><span class="line"><span class="comment"># currently, my driver need use r8712u</span></span><br><span class="line"><span class="comment"># Bus 001 Device 005: ID 0bda:8171 Realtek Semiconductor Corp. RTL8188SU 802.11n WLAN Adapter</span></span><br><span class="line"><span class="comment"># if hostapd doesn't support current dirver, need find driver related hostapd and manually make it</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># modify hostapd configuration</span></span><br><span class="line">sudo /etc/hostapd/hostapd.conf</span><br><span class="line"></span><br><span class="line"><span class="comment"># add configuration</span></span><br><span class="line">interface=wlan1</span><br><span class="line">driver=r8712udrv</span><br><span class="line">ssid=My_SSID_Name</span><br><span class="line">channel=10</span><br><span class="line">wmm_enabled=1</span><br><span class="line">wpa=2</span><br><span class="line">wpa_passphrase=MYPASSWORD</span><br><span class="line">wpa_key_mgmt=WPA-PSK</span><br><span class="line">wpa_pairwise=TKIP</span><br><span class="line">rsn_pairwise=CCMP</span><br><span class="line">auth_algs=1</span><br><span class="line">macaddr_acl=0</span><br><span class="line"></span><br><span class="line"><span class="comment"># test hostadp </span></span><br><span class="line">sudo hostapd -d /etc/hostapd/hostapd.conf</span><br><span class="line"></span><br><span class="line"><span class="comment"># change DAEMON_CONF path</span></span><br><span class="line">sudo /etc/default/hostapd</span><br><span class="line"></span><br><span class="line">DAEMON_CONF=<span class="string">"/etc/hostapd/hostapd.conf"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># start SSID</span></span><br><span class="line">sudo service hostapd start</span><br></pre></td></tr></table></figure><h2 id="梯子部分"><a href="#梯子部分" class="headerlink" title="梯子部分"></a>梯子部分</h2><h3 id="Shadowsocks"><a href="#Shadowsocks" class="headerlink" title="Shadowsocks"></a>Shadowsocks</h3><p>使用<code>redsocks + shadowsocks</code>, 直接<code>sudo pip install shadowsocks</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># create shadowsocks json configuration</span></span><br><span class="line">sudo vim /etc/shadowsocks.json</span><br><span class="line"></span><br><span class="line"><span class="comment"># add json content</span></span><br><span class="line">{</span><br><span class="line"> <span class="string">"server"</span>:<span class="string">"xxx.xxx.xxx.xxx"</span>,</span><br><span class="line"> <span class="string">"server_port"</span>:8989,</span><br><span class="line"> <span class="string">"local_address"</span>:<span class="string">"0.0.0.0"</span>,</span><br><span class="line"> <span class="string">"local_port"</span>:1080,</span><br><span class="line"> <span class="string">"password"</span>:<span class="string">"password"</span>,</span><br><span class="line"> <span class="string">"timeout"</span>:600,</span><br><span class="line"> <span class="string">"method"</span>:<span class="string">"aes-256-cfb"</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"># test</span></span><br><span class="line">sudo sslocal -c /etc/shadowsocks.json -d start</span><br><span class="line"></span><br><span class="line"><span class="comment"># add autostart</span></span><br><span class="line">sudo sh -c <span class="string">"sslocal -c /etc/shadowsocks.conf -d start >> /etc/rc.local"</span></span><br></pre></td></tr></table></figure><h3 id="Redsocks"><a href="#Redsocks" class="headerlink" title="Redsocks"></a>Redsocks</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># install</span></span><br><span class="line">sudo apt-get install redsocks</span><br><span class="line"></span><br><span class="line"><span class="comment"># modify /etc/redsocks.conf</span></span><br><span class="line">sudo vim /etc/redsocks.conf</span><br><span class="line"></span><br><span class="line">redsocks { </span><br><span class="line"> local_ip = 0.0.0.0;</span><br><span class="line"> local_port = 12345; </span><br><span class="line"> ip = 127.0.0.1;</span><br><span class="line"> port = 1080;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"># start</span></span><br><span class="line">sudo service redsocks start</span><br></pre></td></tr></table></figure><h3 id="IPset-Rule"><a href="#IPset-Rule" class="headerlink" title="IPset Rule"></a>IPset Rule</h3><p><em>凡是国外ip都采用shadowsocks</em>, 其实这条规则有点大,如果下载BT的话风险会很大。目前先按<a href="https://story.tonylee.name" target="_blank" rel="noopener">tony1016</a>的配置来。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># execute command</span></span><br><span class="line">curl <span class="string">'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest'</span> | grep ipv4 | grep CN | awk -F\| <span class="string">'{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }'</span> > chnroute.txt </span><br><span class="line"></span><br><span class="line"><span class="comment"># export ip to ipset</span></span><br><span class="line">sudo ipset create chnroute <span class="built_in">hash</span>:net </span><br><span class="line">cat chnroute.txt | sudo xargs -I ip ipset add chnroute ip </span><br><span class="line"></span><br><span class="line"><span class="comment"># set autostart</span></span><br><span class="line">sudo sh -c <span class="string">"ipset save chnroute > /etc/chnroute.ipset"</span></span><br><span class="line"></span><br><span class="line">sudo vim /etc/rc.local</span><br><span class="line"><span class="comment"># add configuration</span></span><br><span class="line">iptables-restore < /etc/iptables/rules.v4</span><br></pre></td></tr></table></figure><h3 id="Firewall-Rule"><a href="#Firewall-Rule" class="headerlink" title="Firewall Rule"></a>Firewall Rule</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># general rule for wlan0 wlan1</span></span><br><span class="line">sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE</span><br><span class="line">sudo iptables -A FORWARD -i wlan0 -o wlan1 -m state --state RELATED,ESTABLISHED -j ACCEPT</span><br><span class="line">sudo iptables -A FORWARD -i wlan1 -o wlan0 -j ACCEPT</span><br><span class="line"></span><br><span class="line"><span class="comment"># shadowsocks rule</span></span><br><span class="line">sudo iptables -t nat -N SHADOWSOCKS</span><br><span class="line">sudo iptables -t nat -A SHADOWSOCKS -d 67.216.202.107 -j RETURN</span><br><span class="line">sudo iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN</span><br><span class="line">sudo iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN</span><br><span class="line">sudo iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN</span><br><span class="line">sudo iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN</span><br><span class="line">sudo iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN</span><br><span class="line">sudo iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN</span><br><span class="line">sudo iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN</span><br><span class="line">sudo iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN</span><br><span class="line">sudo iptables -t nat -A SHADOWSOCKS -m <span class="built_in">set</span> --match-set chnroute dst -j RETURN</span><br><span class="line">sudo iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345</span><br><span class="line">sudo iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS</span><br><span class="line">sudo iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS</span><br><span class="line"></span><br><span class="line"><span class="comment"># save rules to /etc/iptables/rules.v4</span></span><br><span class="line">sudo sh -c <span class="string">"iptables-save > /etc/iptables/rules.v4"</span></span><br></pre></td></tr></table></figure><p>Reference: </p><p><a href="https://story.tonylee.name/2016/03/31/yong-shu-mei-pai-da-zao-wu-xian-zhong-ji-ke-xue-shang-wang-lu-you-qi/" target="_blank" rel="noopener">用树莓派打造无线中继科学上网路由器</a><br><a href="https://wangye.org/blog/archives/845/" target="_blank" rel="noopener">将树莓派Raspberry Pi设置为无线路由器(WiFi热点AP,RTL8188CUS芯片)</a><br><a href="https://www.tongfu.info/build-wireless-router-cross-china-firewall-use-raspberrypi-and-realtek-8192cu-usb-dongle/" target="_blank" rel="noopener">树莓派打造科学上网无线路由器(基于Realtek 8192cu网卡)</a></p>]]></content>
<summary type="html">
<p>既然rasp又活了一开始想着用它来搞个WIFI中继。之前对这个原理不是很懂,也不知道具体是怎么实现的,这次搞一搞。</p>
<p>后来摸索着不妨就单开个热点做梯子用,其实中继模式和桥接模式很类似,表面上看可以简单的说只是无线SSID广播不同的信号,实际在实现上还是有诸多区别,这里就记一下所趟的坑。</p>
</summary>
<category term="Raspberry" scheme="https://tech.itabas.com/categories/Raspberry/"/>
<category term="Raspberry" scheme="https://tech.itabas.com/tags/Raspberry/"/>
<category term="树莓派" scheme="https://tech.itabas.com/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
<category term="Wireless" scheme="https://tech.itabas.com/tags/Wireless/"/>
<category term="Wireless Repeater" scheme="https://tech.itabas.com/tags/Wireless-Repeater/"/>
<category term="Wireless Bridger" scheme="https://tech.itabas.com/tags/Wireless-Bridger/"/>
<category term="Router" scheme="https://tech.itabas.com/tags/Router/"/>
<category term="无线中继" scheme="https://tech.itabas.com/tags/%E6%97%A0%E7%BA%BF%E4%B8%AD%E7%BB%A7/"/>
</entry>
<entry>
<title>Raspberry Pi3 有趣玩法</title>
<link href="https://tech.itabas.com/2017/11/10/raspberry/raspberry-pi3-funny-service/"/>
<id>https://tech.itabas.com/2017/11/10/raspberry/raspberry-pi3-funny-service/</id>
<published>2017-11-09T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.374Z</updated>
<content type="html"><![CDATA[<p>前两天又看到了用树莓派可以做FM射频广播,感觉挺好玩的。另外简单的还有网络音频播放器,如果实现语音播报功能的话,类似的可以实现正点报时,闹钟提醒还有智能语音对话,当然咯这些的实现后面有时间的话一个一个来玩~</p><a id="more"></a><h2 id="FM射频广播"><a href="#FM射频广播" class="headerlink" title="FM射频广播"></a>FM射频广播</h2><p><a href="https://github.com/ma6174/fmpi" target="_blank" rel="noopener">项目来源参照</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># download package</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/ma6174/fmpi.git ~/Programs/fmpi</span><br><span class="line"></span><br><span class="line"><span class="comment"># setup.sh have duplicate step</span></span><br><span class="line"><span class="comment"># manually install dependency</span></span><br><span class="line">sudo apt-get install python-setuptools mpg123 -y</span><br><span class="line">sudo easy_install web.py</span><br><span class="line">sudo easy_install wsgilog</span><br><span class="line"></span><br><span class="line"><span class="comment"># copy main application</span></span><br><span class="line"><span class="built_in">cd</span> fmpi-master</span><br><span class="line">sudo cp pifm /usr/bin/</span><br><span class="line"></span><br><span class="line"><span class="comment"># run start.sh</span></span><br><span class="line">. start.sh</span><br></pre></td></tr></table></figure><p>源程序<code>fmpi.py</code>主要是豆瓣FM,后期可以介入网易云或喜马拉雅电台。</p><h2 id="网络播放器"><a href="#网络播放器" class="headerlink" title="网络播放器"></a>网络播放器</h2><p><a href="https://github.com/yaphone/RasWxNeteaseMusic" target="_blank" rel="noopener">项目来源参照</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># download source code</span></span><br><span class="line">git <span class="built_in">clone</span> https://github.com/yaphone/RasWxNeteaseMusic.git ~/Programs/pi-netease</span><br><span class="line"></span><br><span class="line"><span class="comment"># install dependency</span></span><br><span class="line">sudo apt-get install python-dev</span><br><span class="line">sudo pip install requests future crypto bs4 pycrypto</span><br><span class="line"></span><br><span class="line"><span class="comment"># run</span></span><br><span class="line"><span class="built_in">cd</span> ~/Programs/pi-netease</span><br><span class="line">python run.py</span><br></pre></td></tr></table></figure><p>数据源采用网易云音乐,微信二维码扫描登陆,测试结果并不理想。</p>]]></content>
<summary type="html">
<p>前两天又看到了用树莓派可以做FM射频广播,感觉挺好玩的。另外简单的还有网络音频播放器,如果实现语音播报功能的话,类似的可以实现正点报时,闹钟提醒还有智能语音对话,当然咯这些的实现后面有时间的话一个一个来玩~</p>
</summary>
<category term="Raspberry" scheme="https://tech.itabas.com/categories/Raspberry/"/>
<category term="Raspberry" scheme="https://tech.itabas.com/tags/Raspberry/"/>
<category term="树莓派" scheme="https://tech.itabas.com/tags/%E6%A0%91%E8%8E%93%E6%B4%BE/"/>
<category term="FM射频" scheme="https://tech.itabas.com/tags/FM%E5%B0%84%E9%A2%91/"/>
<category term="网络播放器" scheme="https://tech.itabas.com/tags/%E7%BD%91%E7%BB%9C%E6%92%AD%E6%94%BE%E5%99%A8/"/>
<category term="网易云音乐" scheme="https://tech.itabas.com/tags/%E7%BD%91%E6%98%93%E4%BA%91%E9%9F%B3%E4%B9%90/"/>
</entry>
<entry>
<title>Python - 实例方法,类方法,静态方法和抽象方法区别</title>
<link href="https://tech.itabas.com/2017/09/23/python/difference-with-various-methods/"/>
<id>https://tech.itabas.com/2017/09/23/python/difference-with-various-methods/</id>
<published>2017-09-22T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.368Z</updated>
<content type="html"><![CDATA[<p>Python的<code>instance</code>方法,<code>class</code>方法,<code>static</code>方法和<code>abstract</code>方法。<br>实例方法的声明只需将第一个参数指定为<code>self</code>, 静态方法无参数要求。而类方法需将第一个参数指定为类<code>cls</code>。抽象方法是定义在基类中的一种方法,不提供任何实现。</p><a id="more"></a><p>下面来看方法实现:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Material</span><span class="params">(object)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, cheese=<span class="string">''</span>, vegetables=<span class="string">''</span>, meat=<span class="string">''</span>)</span>:</span></span><br><span class="line"> self.cheese = cheese</span><br><span class="line"> self.vegetables = vegetables</span><br><span class="line"> self.meat = meat</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_cheese</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.cheese</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_vegetables</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.vegetables</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_meat</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.meat</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Pizza</span><span class="params">(object)</span>:</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, size)</span>:</span></span><br><span class="line"> self.size = size</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_size</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.size</span><br><span class="line"></span><br><span class="line"><span class="meta"> @staticmethod</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">pure_material</span><span class="params">(x)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">'Pure Pizza: %s'</span> % x</span><br><span class="line"></span><br><span class="line"><span class="meta"> @staticmethod</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">mix_material</span><span class="params">(x, y)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">'Mix Pizza: %s + %s'</span> % (x, y)</span><br><span class="line"></span><br><span class="line"><span class="meta"> @classmethod</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">cook_vegetable</span><span class="params">(cls, material)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> cls.pure_material(material.get_vegetables())</span><br><span class="line"></span><br><span class="line"><span class="meta"> @classmethod</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">cook_meat</span><span class="params">(cls, material)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> cls.mix_material(material.get_cheese(), material.get_meat())</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">material = Material(<span class="string">'Cheese'</span>, <span class="string">'Tomatoes'</span>, <span class="string">'Beaf'</span>)</span><br><span class="line">p = Pizza(<span class="number">30</span>)</span><br><span class="line"></span><br><span class="line">print(<span class="string">'Pizza size'</span>, p.get_size())</span><br><span class="line">print(Pizza.cook_vegetable(material))</span><br><span class="line">print(Pizza.cook_meat(material))</span><br><span class="line"></span><br><span class="line">Output:</span><br><span class="line">Pizza size <span class="number">30</span></span><br><span class="line">Pure Pizza: Tomatoes</span><br><span class="line">Mix Pizza: Cheese + Beaf</span><br></pre></td></tr></table></figure><p>抽象方法,我们可以通过一个<code>BasePizza</code>来实现。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> abc</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">BasePizza</span><span class="params">(object)</span>:</span></span><br><span class="line"> </span><br><span class="line"> __abstract__ = <span class="literal">True</span></span><br><span class="line"> __metaclass__ = abc.ABCMeta</span><br><span class="line"></span><br><span class="line"> default_material = [<span class="string">'wheat'</span>]</span><br><span class="line"></span><br><span class="line"><span class="meta"> @classmethod</span></span><br><span class="line"><span class="meta"> @abc.abstractmethod</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_material</span><span class="params">(cls)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> cls.default_material</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">AdvancePizza</span><span class="params">(BasePizza)</span>:</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, size)</span>:</span></span><br><span class="line"> self.size = size</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_size</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self.size</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">get_material</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> [<span class="string">'egg'</span>] + [<span class="string">'meat'</span>] + [<span class="string">'friut'</span>] + super(AdvancePizza, self).get_material()</span><br><span class="line"></span><br><span class="line">p = AdvancePizza(<span class="number">30</span>)</span><br><span class="line">print(p.get_material())</span><br></pre></td></tr></table></figure><p>References:</p><p><a href="https://julien.danjou.info/blog/2013/guide-python-static-class-abstract-methods" target="_blank" rel="noopener">The definitive guide on how to use static, class or abstract methods in Python</a></p>]]></content>
<summary type="html">
<p>Python的<code>instance</code>方法,<code>class</code>方法,<code>static</code>方法和<code>abstract</code>方法。<br>实例方法的声明只需将第一个参数指定为<code>self</code>, 静态方法无参数要求。而类方法需将第一个参数指定为类<code>cls</code>。抽象方法是定义在基类中的一种方法,不提供任何实现。</p>
</summary>
<category term="Python" scheme="https://tech.itabas.com/categories/Python/"/>
<category term="Python" scheme="https://tech.itabas.com/tags/Python/"/>
<category term="静态方法" scheme="https://tech.itabas.com/tags/%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95/"/>
<category term="类方法" scheme="https://tech.itabas.com/tags/%E7%B1%BB%E6%96%B9%E6%B3%95/"/>
<category term="抽象方法" scheme="https://tech.itabas.com/tags/%E6%8A%BD%E8%B1%A1%E6%96%B9%E6%B3%95/"/>
</entry>
<entry>
<title>Python - 迭代器和生成器区别(Iterator vs Generator)</title>
<link href="https://tech.itabas.com/2017/09/17/python/iterator-difference-with-generator/"/>
<id>https://tech.itabas.com/2017/09/17/python/iterator-difference-with-generator/</id>
<published>2017-09-16T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.369Z</updated>
<content type="html"><![CDATA[<p>下面简单说一下迭代器和生成器的区别:</p><p>通常生成器是通过调用一个或多个<code>yield</code>表达式构成的函数。每个生成器都是迭代器。<br>而迭代器是一个抽象的概念,包括了<code>iterable</code>和<code>iterator</code>这两种实现。</p><a id="more"></a><h3 id="Iterator-amp-Generator"><a href="#Iterator-amp-Generator" class="headerlink" title="Iterator & Generator"></a>Iterator & Generator</h3><ul><li><code>iterable</code>: 它表示了一个可以重复迭代的对象,判断一个对象是否可以<code>iterable</code>, 是否可以<code>for</code>循环, 是否定义了<code>__getitem__</code>方法, 是否定义了<code>__iter__</code>方法返回一个<code>iterator</code> </li><li><code>iterator</code>: 特殊之处是只能迭代一次,判断一个对象是否是<code>iterator</code>,是否定义了<code>__iter__</code>方法,并且必须返回自身,是否定义了<code>__next__</code>方法</li></ul><p><strong>PS. <code>str</code>和<code>list</code>都是典型的<code>iterable</code>而不是<code>iterator</code></strong></p><p>用一个公交车的例子再来看一遍:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Bus</span><span class="params">(object)</span>:</span> <span class="comment"># 只是iterable而不是iterator</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, *args)</span>:</span></span><br><span class="line"> self.stops = list(args)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__iter__</span><span class="params">(self)</span>:</span> <span class="comment"># 并没有返回自身</span></span><br><span class="line"> <span class="keyword">return</span> BusStopIterator(self)</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">BusStopIterator</span><span class="params">(object)</span>:</span> <span class="comment"># iterator</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, bus)</span>:</span></span><br><span class="line"> self.stops = bus.stops</span><br><span class="line"> self.index = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__iter__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">return</span> self</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__next__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> self.index == len(self.stops):</span><br><span class="line"> <span class="keyword">raise</span> StopIteration</span><br><span class="line"> stop = self.stops[self.index]</span><br><span class="line"> self.index += <span class="number">1</span></span><br><span class="line"> <span class="keyword">return</span> stop</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> bus = Bus(<span class="string">'XinZhuang RailWay Station'</span>, <span class="string">'WaiHuan Road'</span>, <span class="string">'LianHua Road'</span>, <span class="string">'JinJiangLeYuan'</span>)</span><br><span class="line"> <span class="keyword">for</span> stop <span class="keyword">in</span> bus:</span><br><span class="line"> print(stop)</span><br></pre></td></tr></table></figure><ul><li><code>generator</code>: 看如下表达式,两者是等价的。</li></ul><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">squares</span><span class="params">(length)</span>:</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(length):</span><br><span class="line"> <span class="keyword">yield</span> i*i</span><br><span class="line"></span><br><span class="line">squares = [i**<span class="number">2</span> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">10</span>)]</span><br></pre></td></tr></table></figure><p>用<code>yield</code>实现斐波那契数列:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fibonacci</span><span class="params">()</span>:</span></span><br><span class="line"> a=b=<span class="number">1</span></span><br><span class="line"> <span class="keyword">yield</span> a</span><br><span class="line"> <span class="keyword">yield</span> b</span><br><span class="line"> <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> a,b = b,a+b</span><br><span class="line"> <span class="keyword">yield</span> b</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<p>下面简单说一下迭代器和生成器的区别:</p>
<p>通常生成器是通过调用一个或多个<code>yield</code>表达式构成的函数。每个生成器都是迭代器。<br>而迭代器是一个抽象的概念,包括了<code>iterable</code>和<code>iterator</code>这两种实现。</p>
</summary>
<category term="Python" scheme="https://tech.itabas.com/categories/Python/"/>
<category term="Python" scheme="https://tech.itabas.com/tags/Python/"/>
<category term="Iterator" scheme="https://tech.itabas.com/tags/Iterator/"/>
<category term="Generator" scheme="https://tech.itabas.com/tags/Generator/"/>
</entry>
<entry>
<title>Python 之旅 - 开篇</title>
<link href="https://tech.itabas.com/2017/09/09/python/python-tutorial/"/>
<id>https://tech.itabas.com/2017/09/09/python/python-tutorial/</id>
<published>2017-09-08T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.370Z</updated>
<content type="html"><![CDATA[<p>Python基础还是照着<a href="https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000" target="_blank" rel="noopener">廖雪峰的教程</a>撸了一遍。<br>教程的学习路线开始太过平缓,后期直线上升很容易扯着蛋~</p><a id="more"></a><h2 id="基础-趟一遍"><a href="#基础-趟一遍" class="headerlink" title="基础(趟一遍)"></a>基础(趟一遍)</h2><p><strong>PS. Basic on python 3.5</strong> (所有源码 –> <a href="https://github.com/itabas016/PythonTrip/tree/master/course_liao" target="_blank" rel="noopener">source code</a>)</p><h3 id="Func-函数"><a href="#Func-函数" class="headerlink" title="Func(函数)"></a>Func(函数)</h3><ul><li>递归函数 [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/function/recur_func.py" target="_blank" rel="noopener">recur_func.py</a>]</li><li>Map/Reduce [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/function/map_reduce.py" target="_blank" rel="noopener">map_reduce.py</a>]</li><li>过滤器 [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/function/filter.py" target="_blank" rel="noopener">filter.py</a>]</li><li>排序 [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/function/sorted.py" target="_blank" rel="noopener">sorted.py</a>]</li><li>格式化 [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/function/format_input.py" target="_blank" rel="noopener">format_input.py</a>]</li><li>装饰器 [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/function/decorator.py" target="_blank" rel="noopener">decorator.py</a>]</li><li>偏函数 [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/function/partial_func.py" target="_blank" rel="noopener">partial_func.py</a>]</li><li>高阶函数 - 迭代器 [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/advance/ex_iterator.py" target="_blank" rel="noopener">ex_iterator.py</a>]</li><li>高阶函数 - 生成器 [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/advance/ex_generator.py" target="_blank" rel="noopener">ex_generator.py</a>]</li><li>高阶函数 - 切片与列表 [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/advance/ex_slice.py" target="_blank" rel="noopener">ex_slice.py</a>, <a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/advance/ex_list.py" target="_blank" rel="noopener">ex_list.py</a>]</li></ul><h4 id="Decorator"><a href="#Decorator" class="headerlink" title="Decorator"></a>Decorator</h4><p>如上面的例子,装饰如果嵌套太多容易混。没有参数的装饰器比较容易理解,但是有参数的比如一个函数参数是一个返回函数然后这个函数返回结果做为参数传递给另一个函数。<code>Fun(A)(p1=Func(B)(p2=Func(C)(p3='')))</code><br>装饰器函数也可以简单理解成闭包。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> functools</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">log</span><span class="params">(text)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">decorator</span><span class="params">(func)</span>:</span></span><br><span class="line"><span class="meta"> @functools.wraps(func)</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">wrapper</span><span class="params">(*args, **kw)</span>:</span></span><br><span class="line"> print(<span class="string">'%s %s():'</span> % (text, func.__name__))</span><br><span class="line"> <span class="keyword">return</span> func(*args, **kw)</span><br><span class="line"> <span class="keyword">return</span> wrapper</span><br><span class="line"> <span class="keyword">return</span> decorator</span><br></pre></td></tr></table></figure><h3 id="OOP"><a href="#OOP" class="headerlink" title="OOP"></a>OOP</h3><p><code>Class</code>: [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/oop/ex_element.py" target="_blank" rel="noopener">ex_element.py</a>], <code>Instance</code>: [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/oop/ex_instance.py" target="_blank" rel="noopener">ex_instance.py</a>], <code>Property</code>: [<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/oop/ex_property.py" target="_blank" rel="noopener">ex_property.py</a>]以及类的初始化,封装继承[<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/oop/ex_extend.py" target="_blank" rel="noopener">ex_extend.py</a>]与多态。</p><p><strong>PS:</strong> <code>__init__</code>初始化的第一个参数永远是<code>self</code>,表示创建的实例本身。如果属性的变量名是以<code>__</code>开头,那么这是一个私有(private)变量,只允许类内部访问。如果获取一个对象的所有属性和方法,使用<code>dir()</code>函数,判断对象是哪种类型使用<code>isinstance(object, Type)</code></p><h3 id="IO-文件操作和序列化"><a href="#IO-文件操作和序列化" class="headerlink" title="IO(文件操作和序列化)"></a>IO(文件操作和序列化)</h3><p>文件操作<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/io/operation_file.py" target="_blank" rel="noopener">operation_file.py</a>, 引入<code>with</code>的好处是默认调用<code>close</code>方法,因为实现<code>try...finally</code>语句块,无论文件操作出现任何异常最后都能关闭文件操作。</p><p>序列化简单用<code>pickle</code>模块<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/io/ex_pickle.py" target="_blank" rel="noopener">ex_pickle.py</a>和<code>json</code>模块<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/io/ex_json.py" target="_blank" rel="noopener">ex_json.py</a></p><p><strong>PS:</strong> <code>pickle</code>主要用于Python特定二进制格式之间的转换,<code>json</code>对象反序列化成<code>instance</code>对象,编写转换函数(见上述例子)即可实现。后面会介绍其它的反序列化方法。</p><h3 id="Thread-线程"><a href="#Thread-线程" class="headerlink" title="Thread(线程)"></a>Thread(线程)</h3><p>首先python的多线程多适用于<code>IO</code>密集型,如果是<code>CPU</code>密集型,python的多线程不如单线程效率高。如果在<code>CPU</code>密集型中使用<code>concurrent</code>需要导入<code>multiprocessing</code>库,这个库是基于<code>multi process</code>实现了类<code>multi thread</code>的API接口,并且用<code>pickle</code>部分地实现了变量共享。</p><p>基本用法:[<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/thread/ex_thread.py" target="_blank" rel="noopener">ex_thread.py</a>]<br>进程:[<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/thread/ex_process.py" target="_blank" rel="noopener">ex_process.py</a>]<br>队列及锁:[<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/thread/ex_queue.py" target="_blank" rel="noopener">ex_queue.py</a>, <a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/thread/ex_lock.py" target="_blank" rel="noopener">ex_lock.py</a>]<br>分布式进程:[<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/thread/task_master.py" target="_blank" rel="noopener">task_master.py</a>, <a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/thread/task_worker.py" target="_blank" rel="noopener">task_worker.py</a>]</p><h3 id="Async-异步"><a href="#Async-异步" class="headerlink" title="Async(异步)"></a>Async(异步)</h3><p>异步<code>IO</code>的核心是协程(Coroutine),协程没有线程的安全问题,一个进程可以同时存在多个协程,但同时只有一个协程是激活的,而且协程的激活和休眠又通过程序来控制,而不是操作系统控制的。<br>并且最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,因此没有线程切换的开销,和多线程比线程数量越多,协程的性能优势就越明显。<br>第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。</p><p>通常用法是多进程+协程,生产者-消费者模型:[<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/async/coroutine.py" target="_blank" rel="noopener">coroutine.py</a>]</p><p><code>asynicio</code>类库是python3.4支持异步IO的标准库。教程里有两个简单例子[<a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/async/async_hello.py" target="_blank" rel="noopener">async_hello.py</a>, <a href="https://github.com/itabas016/PythonTrip/blob/master/course_liao/async/async_wget.py" target="_blank" rel="noopener">async_wget.py</a>]需要重点理解下<code>@asyncio.coroutine</code>, 另外在python3.5后引入了<code>async</code>和<code>await</code>等价于<code>@asyncio.coroutine <=> async</code>, <code>yield from <=> await</code></p><p>线程和异步这一块,看的时候就头大,后面还会再研究~</p><p>References:<br><a href="http://www.dabeaz.com/coroutines/index.html" target="_blank" rel="noopener">A Curious Course on Coroutines and Concurrency</a><br><a href="http://www.jianshu.com/p/0e4ff7c856d3" target="_blank" rel="noopener">python多线程</a><br><a href="https://www.zhihu.com/question/23474039" target="_blank" rel="noopener">为什么有人说 Python 的多线程是鸡肋呢?</a></p>]]></content>
<summary type="html">
<p>Python基础还是照着<a href="https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000" target="_blank" rel="noopener">廖雪峰的教程</a>撸了一遍。<br>教程的学习路线开始太过平缓,后期直线上升很容易扯着蛋~</p>
</summary>
<category term="Python" scheme="https://tech.itabas.com/categories/Python/"/>
<category term="Python" scheme="https://tech.itabas.com/tags/Python/"/>
<category term="Iterator" scheme="https://tech.itabas.com/tags/Iterator/"/>
<category term="Generator" scheme="https://tech.itabas.com/tags/Generator/"/>
<category term="Decorator" scheme="https://tech.itabas.com/tags/Decorator/"/>
</entry>
<entry>
<title>Vps开启bbr加速</title>
<link href="https://tech.itabas.com/2017/08/29/vps/vps_bbr/"/>
<id>https://tech.itabas.com/2017/08/29/vps/vps_bbr/</id>
<published>2017-08-29T15:06:12.000Z</published>
<updated>2020-01-01T14:00:11.386Z</updated>
<content type="html"><![CDATA[<h2 id="One-Step"><a href="#One-Step" class="headerlink" title="One-Step"></a>One-Step</h2><blockquote><p>Quick installation(懒人一键安装)</p></blockquote><a id="more"></a><p><strong>PS:</strong> Requirments</p><ul><li>OS: CentOS 6+,Debian 7+,Ubuntu 12+</li><li>Virtual platform: Except OpenVZ, such as KVM, Xen, VMware etc.</li><li>Memory: ≥128M</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh</span><br><span class="line">chmod +x bbr.sh</span><br><span class="line">./bbr.sh</span><br></pre></td></tr></table></figure><h2 id="Check-BBR"><a href="#Check-BBR" class="headerlink" title="Check-BBR"></a>Check-BBR</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># check linux kernel version</span></span><br><span class="line">[root@vps<span class="_">-d</span> ~]<span class="comment"># uname -a</span></span><br><span class="line">Linux vps<span class="_">-d</span> 4.10.4-1.el7.elrepo.x86_64 <span class="comment">#1 SMP Sat Mar 18 12:50:10 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># check network info</span></span><br><span class="line">[root@vps<span class="_">-d</span> ~]<span class="comment"># sysctl net.ipv4.tcp_available_congestion_control</span></span><br><span class="line">net.ipv4.tcp_available_congestion_control = bbr cubic reno</span><br><span class="line">[root@vps<span class="_">-d</span> ~]<span class="comment"># sysctl net.ipv4.tcp_congestion_control</span></span><br><span class="line">net.ipv4.tcp_congestion_control = bbr</span><br><span class="line">[root@vps<span class="_">-d</span> ~]<span class="comment"># sysctl net.core.default_qdisc</span></span><br><span class="line">net.core.default_qdisc = fq</span><br><span class="line"></span><br><span class="line"><span class="comment"># check bbr module is load</span></span><br><span class="line">[root@vps<span class="_">-d</span> ~]<span class="comment"># lsmod | grep bbr</span></span><br><span class="line">tcp_bbr 16384 24</span><br></pre></td></tr></table></figure><p><strong>PS:</strong> If the kernel version less than 4.12, you need upgrade.</p><h2 id="Upgrade-Kernel"><a href="#Upgrade-Kernel" class="headerlink" title="Upgrade-Kernel##"></a>Upgrade-Kernel##</h2><p>Sample with CentOS 7:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># add repo and install</span></span><br><span class="line">rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org</span><br><span class="line">rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm</span><br><span class="line">yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel -y</span><br><span class="line"></span><br><span class="line"><span class="comment"># check kernel install</span></span><br><span class="line">rpm -qa | grep kernel</span><br><span class="line"></span><br><span class="line"><span class="comment"># update grub system</span></span><br><span class="line">egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \<span class="string">'</span></span><br><span class="line"><span class="string"># default 0</span></span><br><span class="line"><span class="string"># Run by the first core(表示第一个内核设置为默认运行)</span></span><br><span class="line"><span class="string">grub2-set-default 0</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"><span class="string"># restart</span></span><br><span class="line"><span class="string">reboot</span></span><br></pre></td></tr></table></figure><p>Reference: </p><p><a href="https://github.com/iMeiji/shadowsocks_install/wiki/%E5%BC%80%E5%90%AFTCP-BBR%E6%8B%A5%E5%A1%9E%E6%8E%A7%E5%88%B6%E7%AE%97%E6%B3%95" target="_blank" rel="noopener">开启TCP BBR拥塞控制算法</a></p><p><a href="https://teddysun.com/489.html" target="_blank" rel="noopener">一键安装最新内核并开启 BBR 脚本</a></p>]]></content>
<summary type="html">
<h2 id="One-Step"><a href="#One-Step" class="headerlink" title="One-Step"></a>One-Step</h2><blockquote>
<p>Quick installation(懒人一键安装)</p>
</blockquote>
</summary>
<category term="Vps" scheme="https://tech.itabas.com/categories/Vps/"/>
<category term="Tools" scheme="https://tech.itabas.com/tags/Tools/"/>
<category term="Vps" scheme="https://tech.itabas.com/tags/Vps/"/>
<category term="Wiki" scheme="https://tech.itabas.com/tags/Wiki/"/>
<category term="Vps BBR" scheme="https://tech.itabas.com/tags/Vps-BBR/"/>
<category term="加速" scheme="https://tech.itabas.com/tags/%E5%8A%A0%E9%80%9F/"/>
</entry>
<entry>
<title>Vps性能检测</title>
<link href="https://tech.itabas.com/2017/08/27/vps/vps_performance-check/"/>
<id>https://tech.itabas.com/2017/08/27/vps/vps_performance-check/</id>
<published>2017-08-27T13:19:01.000Z</published>
<updated>2020-01-01T14:00:11.387Z</updated>
<content type="html"><![CDATA[<blockquote><p>折腾了两天Vps, 真可恨呢~</p></blockquote><p>几个月前挂了个hello-world在gce上, 也忘记关了. 今天一看账单扣了我60多刀, 我滴个神呢. 白花花的银子就这么没了. </p><p>可是手贱又把gcp的内存从1.7改成了0.6, 想着能省就省点吧. 鬼知道重新分配了个ip, 原来直联日本, 现在搞得要绕美国了, 延迟老高了. 哎~</p><a id="more"></a><p><img src="../../../../../screenshots/wiki/vps-trace-detail-1.png" alt="detail-trace"></p><p><img src="../../../../../screenshots/wiki/vps-trace-detail-2.png" alt="trace-gui"></p><blockquote><p>不管怎么说gcp好是好,可还是太贵了, 于是又想着以前的Bandwagon Vps内存256还是OVZ的, 反正也快到期了, 要不换一个大点内存的. 就选了个年付LA直联中国的.</p></blockquote><blockquote><p>鬼知道测试下来的指标太不满意了. 广大同胞们都把Bandwagon玩坏了. 哎~</p></blockquote><p><img src="../../../../../screenshots/wiki/vps-d-trace-detail-3.png" alt="detail-trace"></p><p><img src="../../../../../screenshots/wiki/vps-d-trace-detail-4.png" alt="trace-gui"></p><h2 id="Vps-指标"><a href="#Vps-指标" class="headerlink" title="Vps 指标"></a>Vps 指标</h2><h3 id="Bench-Detail"><a href="#Bench-Detail" class="headerlink" title="Bench Detail"></a>Bench Detail</h3><p>直接用<a href="https://teddysun.com/444.html" target="_blank" rel="noopener">秋水逸冰</a>的<a href="https://github.com/teddysun/across/blob/master/bench.sh" target="_blank" rel="noopener">bench.sh</a>脚本跑出的结果很是一般:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">wget -qO- bench.sh | bash</span><br><span class="line"></span><br><span class="line">or</span><br><span class="line">curl -Lso- bench.sh | bash</span><br></pre></td></tr></table></figure><p><img src="../../../../../screenshots/wiki/vps-d-bench-detail.png" alt="bench-detail"></p><p>于是又单独查看了Cpu, Memory, Disk等各项参数, swap也没开, 硬盘读写简直了…</p><h3 id="Cpu"><a href="#Cpu" class="headerlink" title="Cpu"></a>Cpu</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /proc/cpuinfo</span><br></pre></td></tr></table></figure><p><img src="../../../../../screenshots/wiki/vps-d-cpu.png" alt="vps-d-cpu"></p><h3 id="Disk-IO"><a href="#Disk-IO" class="headerlink" title="Disk IO"></a>Disk IO</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dd <span class="keyword">if</span>=/dev/zero of=<span class="built_in">test</span> bs=64k count=4k oflag=dsync</span><br><span class="line">dd <span class="keyword">if</span>=/dev/zero of=<span class="built_in">test</span> bs=8k count=256k conv=fdatasync</span><br></pre></td></tr></table></figure><p><img src="../../../../../screenshots/wiki/vps-d-io.png" alt="vps-d-io"></p><p>相比之前的vps简直差太多了, LA机房直联中国严重超售了: </p><p><img src="../../../../../screenshots/wiki/vps-io.png" alt="vps-io"></p><h3 id="Network"><a href="#Network" class="headerlink" title="Network"></a>Network</h3><p>首先测试vps的download和upload, <a href="https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py" target="_blank" rel="noopener">speedtest.py</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">wget --no-check-certificate https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py</span><br><span class="line">chmod +x speedtest.py</span><br><span class="line">./speedtest.py</span><br></pre></td></tr></table></figure><p><img src="../../../../../screenshots/wiki/vps-d-speedtest.png" alt="vps-d-speedtest"></p><p>然后用mtr分别测试联通和电信:</p><p><img src="../../../../../screenshots/wiki/vps-d-mtr.png" alt="vps-d-mtr"></p><h3 id="Unix-Bench-Score"><a href="#Unix-Bench-Score" class="headerlink" title="Unix Bench Score"></a>Unix Bench Score</h3><p>最后用<a href="https://teddysun.com/245.html" target="_blank" rel="noopener">秋水逸冰</a>的<a href="https://github.com/teddysun/across/raw/master/unixbench.sh" target="_blank" rel="noopener">unixbench.sh</a>脚本跑分测试了一下:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">wget --no-check-certificate https://github.com/teddysun/across/raw/master/unixbench.sh</span><br><span class="line">chmod +x unixbench.sh</span><br><span class="line">./unixbench.sh</span><br></pre></td></tr></table></figure><p><img src="../../../../../screenshots/wiki/vps-d-unix-bench.png" alt="vps-d-unix-bench"></p><p>跑分倒还可以,只是这个磁盘读写不能让人满意. 现在倒是不知道该如何取舍了~</p>]]></content>
<summary type="html">
<blockquote>
<p>折腾了两天Vps, 真可恨呢~</p>
</blockquote>
<p>几个月前挂了个hello-world在gce上, 也忘记关了. 今天一看账单扣了我60多刀, 我滴个神呢. 白花花的银子就这么没了. </p>
<p>可是手贱又把gcp的内存从1.7改成了0.6, 想着能省就省点吧. 鬼知道重新分配了个ip, 原来直联日本, 现在搞得要绕美国了, 延迟老高了. 哎~</p>
</summary>
<category term="Vps" scheme="https://tech.itabas.com/categories/Vps/"/>
<category term="Tools" scheme="https://tech.itabas.com/tags/Tools/"/>
<category term="Vps" scheme="https://tech.itabas.com/tags/Vps/"/>
<category term="Wiki" scheme="https://tech.itabas.com/tags/Wiki/"/>
<category term="Vps Performance" scheme="https://tech.itabas.com/tags/Vps-Performance/"/>
<category term="性能" scheme="https://tech.itabas.com/tags/%E6%80%A7%E8%83%BD/"/>
</entry>
<entry>
<title>用Google Drive备份Vps数据</title>
<link href="https://tech.itabas.com/2017/08/26/tools/gdrive_backup/"/>
<id>https://tech.itabas.com/2017/08/26/tools/gdrive_backup/</id>
<published>2017-08-26T13:40:12.000Z</published>
<updated>2020-01-01T14:00:11.378Z</updated>
<content type="html"><![CDATA[<p>Recently, I have a plan to order a new vps service, but some data need migration and backup to google drive. So I found a tool <a href="https://github.com/prasmussen/gdrive" target="_blank" rel="noopener">gdrive</a>, Let’s begin!</p><a id="more"></a><h2 id="Install-GDrive-Client"><a href="#Install-GDrive-Client" class="headerlink" title="Install GDrive Client"></a>Install GDrive Client</h2><p>This tool can be used across multiple platform, Linux, Raspberry pi, Windows…</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget -O https://docs.google.com/uc?id=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA&<span class="built_in">export</span>=download</span><br></pre></td></tr></table></figure><p><strong>PS: Find a client from <a href="https://github.com/prasmussen/gdrive#downloads" target="_blank" rel="noopener">here</a>, I used CentOS x64, select <a href="https://docs.google.com/uc?id=0B3X9GlR6EmbnQ0FtZmJJUXEyRTA&export=download" target="_blank" rel="noopener">gdrive-linux-x64 v2.1.0</a></strong></p><p>Then, executable cli script</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod +x gdrive</span><br></pre></td></tr></table></figure><p>And move scipt <code>mv gdrive /usr/local/bin/</code></p><h2 id="Access-Google-Token"><a href="#Access-Google-Token" class="headerlink" title="Access Google Token"></a>Access Google Token</h2><p>Run command <code>gdrive about</code>, If this is your first run gdrive command, it prompt you to link your google drive account and acess token, so copy link to any browser(Chrome) login to your account. It will return a string like <code>Enter verification code: 4/9hsRWERSTsds17gGHS12dpoSJhhslkNMsnkSk41se1gxfB</code>, this token will store <code>~/.gdrive/</code>.</p><h2 id="Backup-Data"><a href="#Backup-Data" class="headerlink" title="Backup Data"></a>Backup Data</h2><p>Totally basic on your bussiness, if you want backup database data, or your website source file or some environment configurations, all of these can be write a script to do this work.</p><p><em>Below, it’s a sample:</em></p><h3 id="Backup-Docker-Data"><a href="#Backup-Docker-Data" class="headerlink" title="Backup Docker Data"></a>Backup Docker Data</h3><p>Create a bash script <code>backup-docker.sh</code>:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">cd</span> /var/docker/compose</span><br><span class="line"></span><br><span class="line"><span class="comment"># stop the containers</span></span><br><span class="line">docker-compose stop</span><br><span class="line"></span><br><span class="line"><span class="comment"># if you are not install p7zip, you can first run yum install p7zip, whether you can use tar command to compress</span></span><br><span class="line"><span class="comment"># zip them up encrypted (yes, the password has to be after the -p switch with no space)</span></span><br><span class="line">yum install p7zip</span><br><span class="line">7za a -t7z -mx2 -pPassword1234!@<span class="comment">#$ /tmp/docker-backup-$(date '+%Y-%m-%d').7z /var/docker/</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># start the containers</span></span><br><span class="line">docker-compose start</span><br><span class="line"></span><br><span class="line"><span class="comment"># upload to google drive, if you upload to parent folder must add [-p | --parent] id set</span></span><br><span class="line">gdrive upload -f /tmp/docker-backup-$(date <span class="string">'+%Y-%m-%d'</span>).7z -p 09KVkjJK83exTfkQ3cEJKFDSkjvadkdghJKDGKnRGJKVD932jkaknvKDVR28 --delete /tmp/docker-backup-$(date <span class="string">'+%Y-%m-%d'</span>).7z</span><br><span class="line"></span><br><span class="line"><span class="built_in">exit</span> 0</span><br></pre></td></tr></table></figure><p>If you use <code>tar</code> command, other part is same:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment"># tar the dokuwiki directory</span></span><br><span class="line">tar -zcf <span class="string">"docker-backup-<span class="variable">$(date '+%Y-%m-%d')</span>.tar.gz"</span> /var/docker/</span><br><span class="line"><span class="comment"># encrypt the tar</span></span><br><span class="line">openssl aes-256-cbc -a -salt -<span class="keyword">in</span> <span class="string">"docker-backup-<span class="variable">$(date '+%Y-%m-%d')</span>.tar.gz"</span> -out <span class="string">"docker-backup-<span class="variable">$(date '+%Y-%m-%d')</span>.tar.gz.enc"</span> -pass <span class="string">'pass:Password1234!@#$'</span></span><br></pre></td></tr></table></figure><p>Then, create a <code>crontab</code> job:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">chmod +x backup-docker.sh</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"0 1 * * * root ~/backup-docker.sh"</span> >> /etc/crontab</span><br></pre></td></tr></table></figure><h3 id="Backup-Database-Data"><a href="#Backup-Database-Data" class="headerlink" title="Backup Database Data"></a>Backup Database Data</h3><p>See the dump sql script(eg. use mysqldump):</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># dump all databases</span></span><br><span class="line">mysqldump --all-databases > /tmp/dump.sql</span><br><span class="line"></span><br><span class="line"><span class="comment"># dump only specify databases</span></span><br><span class="line">mysqldump --databases blog wordpress q2a > /tmp/dump.sql</span><br><span class="line"></span><br><span class="line"><span class="comment"># dump specify tables from database</span></span><br><span class="line">mysqldump blog bg_user bg_post bg_comment > /tmp/dump.sql</span><br></pre></td></tr></table></figure><p>Then, compress dump file and encrypt file:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">tar -zcf /tmp/mysql-backup-$(date <span class="string">'+%Y-%m-%d'</span>).tar.gz /tmp/dump.sql</span><br><span class="line">openssl aes-256-cbc -a -salt -<span class="keyword">in</span> /tmp/mysql-backup-$(date <span class="string">'+%Y-%m-%d'</span>).tar.gz -out /tmp/mysql-backup-$(date <span class="string">'+%Y-%m-%d'</span>).tar.gz.enc -pass <span class="string">'pass:Password1234!@#$'</span></span><br></pre></td></tr></table></figure><p>In the end, run gdrive upload:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gdrive upload -f /tmp/mysql-backup-$(date <span class="string">'+%Y-%m-%d'</span>).tar.gz.enc -p 09KVkjJK83exTfkQ3cEJKFDSkjvadkdghJKDGKnRGJKVD932jkaknvKDVR28 --delete /tmp/mysql-backup-$(date <span class="string">'+%Y-%m-%d'</span>).tar.gz</span><br></pre></td></tr></table></figure><h2 id="Upload-File"><a href="#Upload-File" class="headerlink" title="Upload File"></a>Upload File</h2><p>From the sample, you know how to use upload command, It’s very simple, the detail command parameter see <a href="#gdrive-command">here</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gdrive upload -f /var/www/html/*</span><br></pre></td></tr></table></figure><h2 id="Download-File"><a href="#Download-File" class="headerlink" title="Download File"></a>Download File</h2><p>First, run <code>gdrive list</code>, it will show GDrive file list:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Id Title Size Created</span><br><span class="line">0B-Jkp8Bk3zNcTkQxeGxZaFRiMzA vps-backup-2017-08-26.tar.gz.enc 55.3 MB 2017-08-26 10:36:15</span><br><span class="line">0B-Jkp8Bk3zNcMXJBQ0tUdk5XOVU tools 0.0 B 2017-08-26 09:21:40</span><br><span class="line">0B-Jkp8Bk3zNcQnozOWV5OFRyNWs temp 0.0 B 2017-08-26 09:21:25</span><br><span class="line">0B-Jkp8Bk3zNcc3RhcnRlcl9maWxl Getting started 1.6 MB 2016-03-30 01:48:28</span><br></pre></td></tr></table></figure><p>And then, select your file <code>Id</code> and run download command, thats it!</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gdrive download -i 0B-Jkp8Bk3zNcc3RhcnRlcl9maWxl</span><br></pre></td></tr></table></figure><h2 id="Share-File"><a href="#Share-File" class="headerlink" title="Share File"></a>Share File</h2><p>It’s simliar with download command <code>gdrive share -i 0B-Jkp8Bk3zNcc3RhcnRlcl9maWxl</code></p><h2 id="GDrive-Commands"><a href="#GDrive-Commands" class="headerlink" title="GDrive Commands"></a>GDrive Commands</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br></pre></td><td class="code"><pre><span class="line">Usage: gdrive [global options] <verb> [verb options]</span><br><span class="line"></span><br><span class="line">Global options:</span><br><span class="line"> -a, --advanced Advanced Mode -- lets you specify your own oauth client id and secret on setup</span><br><span class="line"> -c, --config Set application path <span class="built_in">where</span> config and token is stored. Defaults to ~/.gdrive</span><br><span class="line"> -v, --version Print version</span><br><span class="line"> -h, --<span class="built_in">help</span> Show this <span class="built_in">help</span></span><br><span class="line"></span><br><span class="line">Verbs:</span><br><span class="line"> delete:</span><br><span class="line"> -i, --id File Id (*)</span><br><span class="line"> download:</span><br><span class="line"> -i, --id File Id (*)</span><br><span class="line"> --format Download file <span class="keyword">in</span> a specified format (needed <span class="keyword">for</span> google docs)</span><br><span class="line"> -s, --stdout Write file content to stdout</span><br><span class="line"> --force Overwrite existing file</span><br><span class="line"> --pop Download latest file, and remove it from google drive</span><br><span class="line"> folder:</span><br><span class="line"> -t, --title Folder to create (*)</span><br><span class="line"> -p, --parent Parent Id of the folder</span><br><span class="line"> --share Share created folder</span><br><span class="line"> info:</span><br><span class="line"> -i, --id File Id (*)</span><br><span class="line"> --bytes Show size <span class="keyword">in</span> bytes</span><br><span class="line"> list:</span><br><span class="line"> -m, --max Max results</span><br><span class="line"> --include-docs Include google docs <span class="keyword">in</span> listing</span><br><span class="line"> -t, --title Title filter</span><br><span class="line"> -q, --query Query (see https://developers.google.com/drive/search-parameters)</span><br><span class="line"> -s, --shared Show shared status (Note: this will generate 1 http req per file)</span><br><span class="line"> -n, --noheader Do not show the header</span><br><span class="line"> --bytes Show size <span class="keyword">in</span> bytes</span><br><span class="line"> quota:</span><br><span class="line"> --bytes Show size <span class="keyword">in</span> bytes</span><br><span class="line"> share:</span><br><span class="line"> -i, --id File Id (*)</span><br><span class="line"> unshare:</span><br><span class="line"> -i, --id File Id (*)</span><br><span class="line"> upload:</span><br><span class="line"> -f, --file File or directory to upload (*)</span><br><span class="line"> -s, --stdin Use stdin as file content (*)</span><br><span class="line"> -t, --title Title to give uploaded file. Defaults to filename</span><br><span class="line"> -p, --parent Parent Id of the file</span><br><span class="line"> --share Share uploaded file</span><br><span class="line"> --mimetype The MIME <span class="built_in">type</span> (default will try to figure it out)</span><br><span class="line"> --convert File will be converted to Google Docs format</span><br><span class="line"> -C, --chunksize Set chunk size <span class="keyword">in</span> bytes. Minimum is 262144, default is 4194304. Recommended to be a power of two.</span><br><span class="line"> url:</span><br><span class="line"> -i, --id File Id (*)</span><br><span class="line"> -p, --preview Generate preview url (default)</span><br><span class="line"> -d, --download Generate download url</span><br></pre></td></tr></table></figure><p>Reference:</p><p><a href="https://timothy-quinn.com/backing-up-files-to-google-drive-via-the-cli/" target="_blank" rel="noopener">Backing up Files to Google Drive via the CLI</a></p><p><a href="http://bashworkz.com/google-drive-linux-client-upload-download-share-a-file/" target="_blank" rel="noopener">Install Gdrive Google Drive Linux Client – Upload/Download/Share a file</a></p>]]></content>
<summary type="html">
<p>Recently, I have a plan to order a new vps service, but some data need migration and backup to google drive. So I found a tool <a href="https://github.com/prasmussen/gdrive" target="_blank" rel="noopener">gdrive</a>, Let’s begin!</p>
</summary>
<category term="Tools" scheme="https://tech.itabas.com/categories/Tools/"/>
<category term="Tools" scheme="https://tech.itabas.com/tags/Tools/"/>
<category term="Google Drive" scheme="https://tech.itabas.com/tags/Google-Drive/"/>
<category term="Drive" scheme="https://tech.itabas.com/tags/Drive/"/>
<category term="Vps" scheme="https://tech.itabas.com/tags/Vps/"/>
</entry>
<entry>
<title>Git command补漏</title>
<link href="https://tech.itabas.com/2017/04/08/tools/git_tips/"/>
<id>https://tech.itabas.com/2017/04/08/tools/git_tips/</id>
<published>2017-04-08T14:11:04.000Z</published>
<updated>2020-01-01T14:00:11.379Z</updated>
<content type="html"><![CDATA[<h2 id="Git容易忘的command"><a href="#Git容易忘的command" class="headerlink" title="Git容易忘的command"></a>Git容易忘的command</h2><a id="more"></a><h3 id="git-xxx-–bare"><a href="#git-xxx-–bare" class="headerlink" title="git xxx –bare"></a>git xxx –bare</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># git init empty repo only with .git element</span></span><br><span class="line">git init --bare</span><br><span class="line"></span><br><span class="line"><span class="comment"># git clone repo with all the git related revision history</span></span><br><span class="line">git <span class="built_in">clone</span> --bare wiki wiki.git</span><br><span class="line"></span><br><span class="line"><span class="comment"># previous step git clone with bare equals the below command</span></span><br><span class="line">cp -Rf wiki/.git wiki.git</span><br></pre></td></tr></table></figure><h3 id="git-remote-xxx"><a href="#git-remote-xxx" class="headerlink" title="git remote xxx"></a>git remote xxx</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># git remote add new repo address with specific port</span></span><br><span class="line">git remote add origin ssh://git@mydomain.com:12345/home/git/repo.git/</span><br></pre></td></tr></table></figure><h3 id="git-diff-xxx"><a href="#git-diff-xxx" class="headerlink" title="git diff xxx"></a>git diff xxx</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># git diff [<options>] [<commit> [<commit>]] [--] [<path>...]</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># various ways to check working tree</span></span><br><span class="line">git diff</span><br><span class="line">git diff --cached</span><br><span class="line">git diff HEAD</span><br><span class="line"></span><br><span class="line"><span class="comment"># comparing with arbitrary commits</span></span><br><span class="line">git diff <span class="built_in">test</span></span><br><span class="line">git diff HEAD -- ./<span class="built_in">test</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># comparing branches</span></span><br><span class="line">git diff xxbranch master</span><br><span class="line">git diff xxbranch..master</span><br><span class="line">git diff xxbranch...master</span><br></pre></td></tr></table></figure><h3 id="git-tag-xxx"><a href="#git-tag-xxx" class="headerlink" title="git tag xxx"></a>git tag xxx</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># create tag</span></span><br><span class="line">git tag -a v1.0 -m <span class="string">"tag message detail"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># show someone tag</span></span><br><span class="line">git show v1.0</span><br><span class="line"></span><br><span class="line"><span class="comment"># push local tags to origin branch</span></span><br><span class="line"><span class="comment"># just one tag</span></span><br><span class="line">git push origin v1.0</span><br><span class="line"><span class="comment"># all the local tags</span></span><br><span class="line">git push origin --tags</span><br></pre></td></tr></table></figure><h3 id="git-merge-xxx"><a href="#git-merge-xxx" class="headerlink" title="git merge xxx"></a>git merge xxx</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># git merge [<options>] [<commit>...]</span></span><br><span class="line"><span class="comment"># or: git merge [<options>] <msg> HEAD <commit></span></span><br><span class="line"></span><br><span class="line">git merge hotfix</span><br><span class="line">git merge fixes enhancements</span><br><span class="line">git merge --no-commit tempbranch</span><br><span class="line"></span><br><span class="line"><span class="comment"># if has conflict, use mergetool command</span></span><br><span class="line">git mergetool</span><br><span class="line">git <span class="built_in">log</span> --merge -p<path></span><br><span class="line">git show :1:filename</span><br></pre></td></tr></table></figure><h3 id="git-reset-xxx"><a href="#git-reset-xxx" class="headerlink" title="git reset xxx"></a>git reset xxx</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [<commit>]</span></span><br><span class="line"><span class="comment"># or: git reset [-q] <tree-ish> [--] <paths>...</span></span><br><span class="line"><span class="comment"># or: git reset --patch [<tree-ish>] [--] [<paths>...]</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># reset work tree to the last commit</span></span><br><span class="line">git reset --bard HEAD</span><br><span class="line"></span><br><span class="line"><span class="comment"># just reset specific files</span></span><br><span class="line">git chechout -- <specific.flie></span><br><span class="line"></span><br><span class="line"><span class="comment"># How to fix the issue when after you commit</span></span><br><span class="line"><span class="comment"># The better way is create new commit to cover issue use revert</span></span><br><span class="line">git revert HEAD</span><br><span class="line"></span><br><span class="line"><span class="comment"># if reset next-to-last commit</span></span><br><span class="line">git revert HEAD^</span><br></pre></td></tr></table></figure><h3 id="git-commit-xxx"><a href="#git-commit-xxx" class="headerlink" title="git commit xxx"></a>git commit xxx</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -a parameter contains git add and git commit</span></span><br><span class="line">git commit -a</span><br><span class="line"></span><br><span class="line"><span class="comment"># -v parameter will display all the diff messages</span></span><br><span class="line">git commit -v</span><br><span class="line"></span><br><span class="line"><span class="comment"># --amend will use the latest commit instead before commit</span></span><br><span class="line">git commit --amend -m <span class="string">"the latest commit with forgot files"</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="Git容易忘的command"><a href="#Git容易忘的command" class="headerlink" title="Git容易忘的command"></a>Git容易忘的command</h2>
</summary>
<category term="Tools" scheme="https://tech.itabas.com/categories/Tools/"/>
<category term="Tools" scheme="https://tech.itabas.com/tags/Tools/"/>
<category term="Git" scheme="https://tech.itabas.com/tags/Git/"/>
<category term="Wiki" scheme="https://tech.itabas.com/tags/Wiki/"/>
<category term="Tips" scheme="https://tech.itabas.com/tags/Tips/"/>
</entry>
<entry>
<title>SSH Key相关问题</title>
<link href="https://tech.itabas.com/2017/04/08/tools/ssh_key/"/>
<id>https://tech.itabas.com/2017/04/08/tools/ssh_key/</id>
<published>2017-04-08T03:32:53.000Z</published>
<updated>2020-01-01T14:00:11.381Z</updated>
<content type="html"><![CDATA[<h2 id="Summary"><a href="#Summary" class="headerlink" title="Summary"></a>Summary</h2><p>SSH Key分公钥和私钥, 私钥请自己妥善保管, 不要外泄。<br>另外采用ssh public key authentication是提升服务器安全与快捷措施之一。</p><a id="more"></a><h3 id="Generate-ssh-key"><a href="#Generate-ssh-key" class="headerlink" title="Generate ssh key"></a>Generate ssh key</h3><p>以github为例使用ssh-keygen生成相对应的key</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># please make sure .ssh folder is exist</span></span><br><span class="line"><span class="built_in">cd</span> ~/</span><br><span class="line">mkdir .ssh</span><br><span class="line"><span class="built_in">cd</span> /.ssh</span><br><span class="line"></span><br><span class="line"><span class="comment"># use ssh-keygen generate key</span></span><br><span class="line"><span class="comment"># if you want sign key name please add -f parameter, default is id_rsa</span></span><br><span class="line">ssh-keygen -t rsa -b 4096 -C <span class="string">"your_email@example.com"</span></span><br><span class="line">Generating public/private rsa key pair.</span><br><span class="line">Enter file <span class="keyword">in</span> <span class="built_in">which</span> to save the key (/home/git/.ssh/id_rsa):</span><br><span class="line"></span><br><span class="line"><span class="comment"># please input your password for private key, default is empty</span></span><br><span class="line">Enter passphrase (empty <span class="keyword">for</span> no passphrase):</span><br><span class="line">Enter same passphrase again:</span><br></pre></td></tr></table></figure><h3 id="Configure-public-key-to-Server"><a href="#Configure-public-key-to-Server" class="headerlink" title="Configure public key to Server"></a>Configure public key to Server</h3><p>上传公钥到server有很多种方式了, 推荐使用<code>ssh-copy-id</code></p><ul><li><code>ssh-copy-id -i ~/.ssh/id_rsa.pub git@ip -p xx</code></li></ul><p>有可能会遇到一些问题比如说: <code>Permission denied (publickey).</code> 或者<code>bash: ssh-copy-id: command not found</code></p><p>If it’s permission problem, please check current user whether has execute privilege to <code>.ssh</code> folder</p><p>Else if you use windows command line, maybe you didn’t install this tiny script, please execute the below script:</p><p>Maybe is works, good luck for you!</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">GET_ID=<span class="string">"cat <span class="variable">${ID_FILE}</span>"</span></span><br><span class="line">{ <span class="built_in">eval</span> <span class="string">"<span class="variable">$GET_ID</span>"</span> ; } | ssh <span class="variable">${1%:}</span> <span class="string">"umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys"</span> || <span class="built_in">exit</span> 1</span><br></pre></td></tr></table></figure><ul><li><code>scp ~/.ssh/ ~/.ssh/id_rsa.pub -p xx user@ip:</code></li></ul><p>Attention please <code>:</code>, then login server execute:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys</span><br><span class="line">rm ~/.ssh/id_rsa.pub</span><br><span class="line">chmod 600 ~/.ssh/authorized_keys</span><br></pre></td></tr></table></figure><h3 id="Keep-safe-authorized-keys"><a href="#Keep-safe-authorized-keys" class="headerlink" title="Keep safe authorized_keys"></a>Keep safe authorized_keys</h3><p>为了保证安全,您应该阻止其他用户添加新的公钥。<br>将 authorized_keys 的权限设置为对拥有者只读,其他用户没有任何权限:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">chmod 400 ~/.ssh/authorized_keys</span><br></pre></td></tr></table></figure><h3 id="Disable-password-authentication"><a href="#Disable-password-authentication" class="headerlink" title="Disable password authentication"></a>Disable password authentication</h3><p>采用公钥登录server后, 最好禁用密码登录.</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">vim /etc/ssh/sshd_config</span><br><span class="line"><span class="comment"># set PasswordAuthentication value is no</span></span><br><span class="line">RSAAuthentication yes</span><br><span class="line">AuthorizedKeysFile .ssh/authorized_keys</span><br><span class="line">PasswordAuthentication no</span><br><span class="line">ChallengeResponseAuthentication no</span><br><span class="line"></span><br><span class="line"><span class="comment"># restart sshd service</span></span><br><span class="line">service sshd restart</span><br></pre></td></tr></table></figure><h3 id="How-to-use-in-the-tool"><a href="#How-to-use-in-the-tool" class="headerlink" title="How to use in the tool"></a>How to use in the tool</h3><ul><li>使用 alias</li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ cat ~/.bash_profile</span><br><span class="line"><span class="built_in">alias</span> ssh vps-gce =<span class="string">'ssh itabas016@xxx.xxx.xxx.xxx'</span></span><br></pre></td></tr></table></figure><ul><li>在 ssh client端import public key,这个就比较简单了。常用的客户端比如Putty, SecureCRT, XShell, Mobile client推荐JuiceSSH</li></ul>]]></content>
<summary type="html">
<h2 id="Summary"><a href="#Summary" class="headerlink" title="Summary"></a>Summary</h2><p>SSH Key分公钥和私钥, 私钥请自己妥善保管, 不要外泄。<br>另外采用ssh public key authentication是提升服务器安全与快捷措施之一。</p>
</summary>
<category term="Tools" scheme="https://tech.itabas.com/categories/Tools/"/>
<category term="Tools" scheme="https://tech.itabas.com/tags/Tools/"/>
<category term="Vps" scheme="https://tech.itabas.com/tags/Vps/"/>
<category term="Wiki" scheme="https://tech.itabas.com/tags/Wiki/"/>
<category term="SSH" scheme="https://tech.itabas.com/tags/SSH/"/>
<category term="SSH key" scheme="https://tech.itabas.com/tags/SSH-key/"/>
</entry>
<entry>
<title>Git Hooks快捷使用</title>
<link href="https://tech.itabas.com/2017/04/06/tools/git_hooks/"/>
<id>https://tech.itabas.com/2017/04/06/tools/git_hooks/</id>
<published>2017-04-06T15:05:01.000Z</published>
<updated>2020-01-01T14:00:11.379Z</updated>
<content type="html"><![CDATA[<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><p>通过git hooks快速将blog push到vps, 懒人必备。</p><a id="more"></a><h3 id="Prepare-vps"><a href="#Prepare-vps" class="headerlink" title="Prepare vps"></a>Prepare vps</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># add git user and grant sudo</span></span><br><span class="line">addusr git</span><br><span class="line"></span><br><span class="line"><span class="comment"># if your OS is debian/ubuntu</span></span><br><span class="line">gpasswd -a git sudo</span><br><span class="line"></span><br><span class="line"><span class="comment"># else centos (precondition: enable wheel group have sudo privileges)</span></span><br><span class="line">usermod -aG wheel git</span><br><span class="line"></span><br><span class="line"><span class="comment"># upload your ssh key</span></span><br><span class="line">ssh-copy-id -i ~/.ssh/id_rsa.pub git@ip(xxx.xxx.xxx.xxx)</span><br><span class="line"></span><br><span class="line"><span class="comment"># prepare git and nginx env</span></span><br><span class="line">sudo apt-get install git-core nginx</span><br></pre></td></tr></table></figure><h3 id="Configure-repo"><a href="#Configure-repo" class="headerlink" title="Configure repo"></a>Configure repo</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># configure git repo</span></span><br><span class="line">mkdir /home/git/wiki.git</span><br><span class="line"><span class="built_in">cd</span> /home/git/wiki.git/</span><br><span class="line">git init --bare</span><br><span class="line"></span><br><span class="line"><span class="comment"># configure wiki site</span></span><br><span class="line">mkdir /var/www/wiki</span><br><span class="line"></span><br><span class="line"><span class="comment"># chown folder owner to git</span></span><br><span class="line">chown git:git -R /var/www/wiki</span><br></pre></td></tr></table></figure><h3 id="Configure-git-hooks"><a href="#Configure-git-hooks" class="headerlink" title="Configure git hooks"></a>Configure git hooks</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># vim post-receive file</span></span><br><span class="line"><span class="built_in">cd</span> /home/git/wiki.git/hooks</span><br><span class="line">vim post-receive</span><br><span class="line"></span><br><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">GIT_REPO=/home/git/wiki.git</span><br><span class="line">TMP_GIT_CLONE=/tmp/wiki</span><br><span class="line">PUBLIC_WWW=/var/www/wiki</span><br><span class="line">rm -rf <span class="variable">${TMP_GIT_CLONE}</span></span><br><span class="line">git <span class="built_in">clone</span> <span class="variable">$GIT_REPO</span> <span class="variable">$TMP_GIT_CLONE</span></span><br><span class="line">rm -rf <span class="variable">${PUBLIC_WWW}</span>/*</span><br><span class="line">cp -rf <span class="variable">${TMP_GIT_CLONE}</span>/* <span class="variable">${PUBLIC_WWW}</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># grant execute privileges</span></span><br><span class="line">chmod +x post-receive</span><br></pre></td></tr></table></figure><h3 id="Configure-nginx"><a href="#Configure-nginx" class="headerlink" title="Configure nginx"></a>Configure nginx</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/nginx/conf.d/wiki.conf</span><br><span class="line">server {</span><br><span class="line"> listen 80 ;</span><br><span class="line"> root /var/www/wiki;</span><br><span class="line"> server_name wiki.itabas.com;</span><br><span class="line"> access_log /var/<span class="built_in">log</span>/nginx/wiki_access.log;</span><br><span class="line"> error_log /var/<span class="built_in">log</span>/nginx/wiki_error.log;</span><br><span class="line"> location ~* ^.+\.(ico|gif|jpg|jpeg|png)$ {</span><br><span class="line"> root /var/www/wiki;</span><br><span class="line"> access_log off;</span><br><span class="line"> expires 1d;</span><br><span class="line"> }</span><br><span class="line"> location ~* ^.+\.(css|js|txt|xml|swf|wav)$ {</span><br><span class="line"> root /var/www/wiki;</span><br><span class="line"> access_log off;</span><br><span class="line"> expires 10m;</span><br><span class="line"> }</span><br><span class="line"> location / {</span><br><span class="line"> root /var/www/wiki;</span><br><span class="line"> <span class="keyword">if</span> (-f <span class="variable">$request_filename</span>) {</span><br><span class="line"> rewrite ^/(.*)$ /<span class="variable">$1</span> <span class="built_in">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="Restart-service"><a href="#Restart-service" class="headerlink" title="Restart service"></a>Restart service</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">service nginx restart</span><br></pre></td></tr></table></figure><h3 id="Configure-blog-yml"><a href="#Configure-blog-yml" class="headerlink" title="Configure blog yml"></a>Configure blog yml</h3><p>无论你使用哪个静态博客框架, 基本上都支持一键部署, 详细参数参照<code>_config.yml</code></p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">deploy:</span></span><br><span class="line"> <span class="attr">type:</span> <span class="string">git</span></span><br><span class="line"> <span class="attr">repo:</span> <span class="string">git@wiki.itabas.com:wiki.git</span></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><p>通过git hooks快速将blog push到vps, 懒人必备。</p>
</summary>
<category term="Tools" scheme="https://tech.itabas.com/categories/Tools/"/>
<category term="Tools" scheme="https://tech.itabas.com/tags/Tools/"/>
<category term="Shortcut" scheme="https://tech.itabas.com/tags/Shortcut/"/>
<category term="Git" scheme="https://tech.itabas.com/tags/Git/"/>
<category term="Git Hooks" scheme="https://tech.itabas.com/tags/Git-Hooks/"/>
<category term="Wiki" scheme="https://tech.itabas.com/tags/Wiki/"/>
</entry>
<entry>
<title>2016大事记</title>
<link href="https://tech.itabas.com/2016/12/31/life/event-2016/"/>
<id>https://tech.itabas.com/2016/12/31/life/event-2016/</id>
<published>2016-12-30T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.368Z</updated>
<content type="html"><![CDATA[<blockquote><p>转眼间2016就结束了,这一年发生了太多的事。有些感慨就写下来做个纪念吧。</p></blockquote><a id="more"></a><h3 id="技术那点事"><a href="#技术那点事" class="headerlink" title="技术那点事"></a>技术那点事</h3><blockquote><p>我是一个容易冲动的人,经常会冒出来一些奇怪的想法。但是随着时间的增长,如果现在不去做将来可能就没有机会再去做了。<br>简单盘点一下:</p></blockquote><blockquote><ul><li><strong>我与RaspberryPi</strong><br>搭建自己的NAS server, 共享硬盘的文件云,虽然中间断断续续碰到了好多的小插曲,所用的技术可能不是当下最新潮的,诸如外网穿透、云端下载、自建VPN, WebServer, GitServer, FileServer, 但是学习了很多。</li><li><strong>我与Vps</strong><br>这个梯子15年的时候就买了,当时脑袋还一热,还买了域名,可就一直放着了,太懒了什么都没弄。后来有了些时间,又想折腾一下,到目前为止仍然没有发挥最大的作用,明年继续搞起。<br>准备让webServer实现HTTPS, 空闲的硬盘想写个Spider script爬些资源, 有时间可以再搞一个梯子流量的后台系统。并且现在由Hexo驱动的blog是GitHub在托管,还没有想好是不是hook到Vps上,目前WordPress blog server快搭完了。</li><li><strong>我与Web负载均衡</strong><br>可以说是工作原因才能接触到HAProxy, 虽然会用Nginx做反向代理和负载均衡,但是时间久了还得要重新拾起来,顺便一起温故了一遍。</li><li><strong>我与Python</strong><br>说起Python就很惭愧,入门很简单,可断断续续写了那么多小脚本,可还是只会一些皮毛,没做过实战,很多项目因为偷懒,Python不熟又怕遇到问题,所以都直接用C#解决了。明年一定要朝这个方向继续努力!!!做一个真正的pythoner~</li><li><strong>我与.NetCore</strong><br>这是一个没有完成的任务,虽然是自学的.Net开发,因为windows平台开发的局限性,起初想转Java,毕竟还是很相似的。但如今.NetCore横空出世,我相信搞定这个以后跨平台开发游刃有余~</li><li><strong>我与AngularJS</strong><br>可以说这也是工作的原因,新项目用到了AngularJS并且还是比较坑的1.x,但是就自己而言,JavaScript根本是一窍不通,还有Css, 通过项目算是入门了,后面会后续自学下其它的框架吧,当前最火的React还有Vue, 还有一批数不胜数的小众框架~</li><li><strong>我与Hexo</strong><br>Blog系统这是一直想搞好久的东西了,一直懒得要死,碰到点问题就搁那了,可以说这是一块心病了。本来我就比较喜欢记录自己的一些事情,杂七杂八的地方,东一点西一点。后来凡是技术相关的全都用Evernote来维护了,虽然Hexo前几年就知道了说静态博客多么的轻,多么的火,那会又沉迷于游戏哪有这个功夫折腾这个,哎~<br>现在Hexo驱动的blog就做技术博客,有机会可以尝试下Jekyll还有Simiki。虽然WordPress很冗余,但是没有真正上手过,现在正通过Vps做这件事~</li><li><strong>我与CI</strong><br>也是因为入坑前端,才了解了除了TeamCity还有Travis, Appveyor, Circle等CI管理工具,公司的CI是用的企业版TeamCity, 断断续续的把自己的几个项目都搞了下,自我感觉还不错~</li><li><strong>我与Redis</strong><br>Nosql接触的倒是蛮早的,差不多12 13年,那会只是用来做缓存,并且还不是很精通,当然Memcached完全可以替代Redis,但是到后来的项目一些新的需求才意识到redis的真正强大和便捷之处。并且最早的时候用的是2.3.x的版本,目前4.x的版本都已快release, 一些新的功能都不怎么了解,诸如集群,主从互备,哨兵模式…所以技术真是学到老,用到老。</li><li><strong>我与DBA</strong><br>可以说开发者一直会与database打交道,但是距离真正的DBA真是相差太多,因team变动, 工作JD转变为Engineer&DBA当然这是一件好事,对于目前的自己,这一块也正是自己欠缺的一大部分,明年撸起袖子,为自己的全栈之行铺平道路~</li></ul></blockquote><h3 id="项目"><a href="#项目" class="headerlink" title="项目"></a>项目</h3><blockquote><ul><li><strong>Stack Skills</strong> - tutorialspoint<br>Next step follow: Python, Golang, Flask, React, Docker…</li><li><strong>.Net Core</strong> - zablo<br>Such of APIs: life, post, song, task…</li><li><strong>Public WeChat ID</strong><br>Add new solution, like a robot, example - ItChat<br>And mainly source part from spider or web API.</li><li><strong>Framework</strong> - onepiece<br>Next step want to support .net core, and make a demo blog system base on this.</li><li><strong>Spider</strong> - scrapy-examples<br>Crawl data such as douban, zhihu and collect to rasp or vps.</li><li><strong>Pythonic</strong> - pythontrip<br>Have a algorithm trip on leecode</li></ul></blockquote><h3 id="我的生活"><a href="#我的生活" class="headerlink" title="我的生活"></a>我的生活</h3><blockquote><p>幸好年初去南非的出差搁浅,外面太乱不想出去<br>去livehouse看了李志的巡演<br>木吉他有所小成,准备入坑指弹<br>太湖迷笛,迷上了rock<br>谈了对象,最后吹了~<br>嘉盛外汇爆仓,错过了英镑黑天鹅<br>开始了上海交大继续深造<br>里约奥运会基本看满了游泳和羽毛球赛事,明年想学会游泳<br>合租换了两个室友,找新房客真是一件麻烦的事<br>东海音乐节没去成,遗憾<br>追完了GameOfTheThrone共 7 seasons<br>迷上了桶哥, Buckethead the king of guitar solo<br>English learning<br>人生第一次大病,左耳差点废掉,还没有改掉熬夜的坏习惯<br>黄山之行搁浅<br>今年入的装备 - XboxOne,Nexus6P,AKG K450,Filco,VT-10DGX</p></blockquote><blockquote><p>Contribution - </p><blockquote><p>A day 10000 steps, A week 3 times running, A week 2 times badminton<br>Totally 11 times cut hair by myself this year<br>Just one time Midi Festival and frist time camping<br>3 times livehouse concert by favioute singers<br>guitar cover 20 songs<br>first archery</p></blockquote></blockquote><blockquote><p>Plan - </p><blockquote><p>Climbing or hiking each 2-3 months in 2-3 years<br>口琴/手鼓<br>MBP?</p></blockquote></blockquote>]]></content>
<summary type="html">
<blockquote>
<p>转眼间2016就结束了,这一年发生了太多的事。有些感慨就写下来做个纪念吧。</p>
</blockquote>
</summary>
<category term="Life" scheme="https://tech.itabas.com/categories/Life/"/>
<category term="life" scheme="https://tech.itabas.com/tags/life/"/>
</entry>
<entry>
<title>Oracle - Session, Users, Profiles Management</title>
<link href="https://tech.itabas.com/2016/12/20/database/oralce-script-maintaince/"/>
<id>https://tech.itabas.com/2016/12/20/database/oralce-script-maintaince/</id>
<published>2016-12-19T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.366Z</updated>
<content type="html"><![CDATA[<blockquote><p>This article is about oracle daily maintaince, mainly contains <code>dba_users</code>, <code>v$session</code> and <code>dba_profiles</code> the three parts.</p></blockquote><a id="more"></a><h3 id="Manage-oracle-users"><a href="#Manage-oracle-users" class="headerlink" title="Manage oracle users"></a>Manage oracle users</h3><blockquote><p>Each Oracle database has a list of valid database users. To access a database, a user must run a database application and connect to the database instance using a valid user name defined in the database.</p></blockquote><blockquote><p>See the below example:</p></blockquote><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">DEFINE USERNAME = 'BD_ROGER'</span><br><span class="line"></span><br><span class="line"><span class="comment">-- drop user completely</span></span><br><span class="line"><span class="keyword">DROP</span> <span class="keyword">USER</span> &USERNAME <span class="keyword">CASCADE</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- create user completely</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">USER</span> &USERNAME</span><br><span class="line"> <span class="keyword">IDENTIFIED</span> <span class="keyword">BY</span> &USERNAME</span><br><span class="line"> <span class="keyword">DEFAULT</span> <span class="keyword">TABLESPACE</span> DATAUSR</span><br><span class="line"> <span class="keyword">TEMPORARY</span> <span class="keyword">TABLESPACE</span> TEMP</span><br><span class="line"> PROFILE <span class="keyword">DEFAULT</span></span><br><span class="line"> <span class="keyword">ACCOUNT</span> <span class="keyword">UNLOCK</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 2 Roles for &USERNAME </span></span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">RESOURCE</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">CONNECT</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">ALTER</span> <span class="keyword">USER</span> &USERNAME <span class="keyword">DEFAULT</span> <span class="keyword">ROLE</span> <span class="keyword">ALL</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 12 System Privileges for &USERNAME </span></span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">CREATE</span> <span class="keyword">ANY</span> <span class="keyword">TABLE</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">CREATE</span> <span class="keyword">ANY</span> <span class="keyword">INDEX</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">LOCK</span> <span class="keyword">ANY</span> <span class="keyword">TABLE</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">CREATE</span> <span class="keyword">ANY</span> <span class="keyword">TRIGGER</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">CREATE</span> <span class="keyword">SEQUENCE</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">CREATE</span> <span class="keyword">VIEW</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> MANAGE <span class="keyword">TABLESPACE</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">UNLIMITED</span> <span class="keyword">TABLESPACE</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">CREATE</span> JOB <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">SELECT</span> <span class="keyword">ANY</span> <span class="keyword">TABLE</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">DROP</span> <span class="keyword">ANY</span> <span class="keyword">TABLE</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">ALTER</span> <span class="keyword">ANY</span> <span class="keyword">TABLE</span> <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 2 Object Privileges for &USERNAME </span></span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">EXECUTE</span> <span class="keyword">ON</span> SYS.DBMS_CRYPTO <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">EXECUTE</span> <span class="keyword">ON</span> SYS.DBMS_REDEFINITION <span class="keyword">TO</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">EXECUTE</span> <span class="keyword">on</span> DBMS_AQADM <span class="keyword">to</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">EXECUTE</span> <span class="keyword">on</span> DBMS_AQ <span class="keyword">to</span> &USERNAME;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">CREATE</span> <span class="keyword">MATERIALIZED</span> <span class="keyword">VIEW</span> <span class="keyword">to</span> &USERNAME;</span><br></pre></td></tr></table></figure><h3 id="Users-and-Profiles-overview"><a href="#Users-and-Profiles-overview" class="headerlink" title="Users and Profiles overview"></a>Users and Profiles overview</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">TABLE NAME DESCRIPTION</span><br><span class="line">-------------------------------------------------------</span><br><span class="line">DBA_USERSDescribes all users of the database</span><br><span class="line">ALL_USERSLists users visible to the current user, but does not describe them</span><br><span class="line">USER_USERSDescribes only the current user</span><br><span class="line">DBA_TS_QUOTAS/USER_TS_QUOTASDescribes tablespace quotas for users</span><br><span class="line">USER_PASSWORD_LIMITSDescribes the password profile parameters that are assigned to the user</span><br><span class="line">USER_RESOURCE_LIMITSDisplays the resource limits for the current user</span><br><span class="line">DBA_PROFILESDisplays all profiles and their limits</span><br><span class="line">RESOURCE_COSTLists the cost for each resource</span><br><span class="line">V$SESSIONLists session information for each current session, includes user name</span><br><span class="line">V$SESSTATLists user session statistics</span><br><span class="line">V$STATNAMEDisplays decoded statistic names for the statistics shown in the V$SESSTAT view</span><br><span class="line">PROXY_USERSDescribes users who can assume the identity of other users</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">--list all users with account status and profile</span></span><br><span class="line"><span class="keyword">SELECT</span> USERNAME, PROFILE, ACCOUNT_STATUS <span class="keyword">FROM</span> DBA_USERS;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- list expired user and combine sql to execute</span></span><br><span class="line"><span class="keyword">select</span> <span class="string">'alter user '</span> || username || <span class="string">' identified by '</span> || username || <span class="string">' account unlock;'</span> </span><br><span class="line"><span class="keyword">from</span> dba_users </span><br><span class="line"><span class="keyword">where</span> account_status <span class="keyword">like</span> <span class="string">'%EXPIRED%'</span> <span class="keyword">and</span> Username <span class="keyword">like</span> <span class="string">'%ROGER'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- list currently database profiles</span></span><br><span class="line"><span class="keyword">select</span> profile, resource_name, resource_type, <span class="keyword">limit</span> <span class="keyword">from</span> dba_profiles;</span><br><span class="line"></span><br><span class="line">PROFILE RESOURCE NAMETYPE LIMIT</span><br><span class="line"><span class="comment">---------------------------------------------------</span></span><br><span class="line">DEFAULTCOMPOSITE_LIMITKERNELUNLIMITED</span><br><span class="line">DEFAULTSESSIONS_PER_USERKERNELUNLIMITED</span><br><span class="line">DEFAULTCPU_PER_SESSIONKERNELUNLIMITED</span><br><span class="line">DEFAULTCPU_PER_CALLKERNELUNLIMITED</span><br><span class="line">DEFAULTLOGICAL_READS_PER_SESSIONKERNELUNLIMITED</span><br><span class="line">DEFAULTLOGICAL_READS_PER_CALLKERNELUNLIMITED</span><br><span class="line">DEFAULTIDLE_TIMEKERNELUNLIMITED</span><br><span class="line">DEFAULTCONNECT_TIMEKERNELUNLIMITED</span><br><span class="line">DEFAULTPRIVATE_SGAKERNELUNLIMITED</span><br><span class="line">DEFAULTFAILED_LOGIN_ATTEMPTSPASSWORD10</span><br><span class="line">DEFAULTPASSWORD_LIFE_TIMEPASSWORDUNLIMITED</span><br><span class="line">DEFAULTPASSWORD_REUSE_TIMEPASSWORDUNLIMITED</span><br><span class="line">DEFAULTPASSWORD_REUSE_MAXPASSWORDUNLIMITED</span><br><span class="line">DEFAULTPASSWORD_VERIFY_FUNCTIONPASSWORDNULL</span><br><span class="line">DEFAULTPASSWORD_LOCK_TIMEPASSWORD1</span><br><span class="line">DEFAULTPASSWORD_GRACE_TIMEPASSWORD7</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- PS. EXPIRED(GRACE) - 宽限期限已过期</span></span><br><span class="line"><span class="comment">-- modify profile password never expired</span></span><br><span class="line"><span class="keyword">ALTER</span> PROFILE <span class="keyword">DEFAULT</span> <span class="keyword">LIMIT</span> PASSWORD_LIFE_TIME <span class="keyword">UNLIMITED</span>;</span><br></pre></td></tr></table></figure><blockquote><p>see the example:</p></blockquote><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Profile Resource Limits</span></span><br><span class="line"><span class="keyword">CREATE</span> PROFILE app_user <span class="keyword">LIMIT</span> </span><br><span class="line"> <span class="keyword">SESSIONS_PER_USER</span> <span class="keyword">UNLIMITED</span> </span><br><span class="line"> <span class="keyword">CPU_PER_SESSION</span> <span class="keyword">UNLIMITED</span> </span><br><span class="line"> <span class="keyword">CPU_PER_CALL</span> <span class="number">3000</span> </span><br><span class="line"> <span class="keyword">CONNECT_TIME</span> <span class="number">45</span> </span><br><span class="line"> LOGICAL_READS_PER_SESSION <span class="keyword">DEFAULT</span> </span><br><span class="line"> <span class="keyword">LOGICAL_READS_PER_CALL</span> <span class="number">1000</span> </span><br><span class="line"> <span class="keyword">PRIVATE_SGA</span> <span class="number">15</span>K</span><br><span class="line"> <span class="keyword">COMPOSITE_LIMIT</span> <span class="number">5000000</span>; </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- Profile Password Limits</span></span><br><span class="line"><span class="keyword">CREATE</span> PROFILE app_user2 <span class="keyword">LIMIT</span></span><br><span class="line"> <span class="keyword">FAILED_LOGIN_ATTEMPTS</span> <span class="number">5</span></span><br><span class="line"> PASSWORD_LIFE_TIME <span class="number">60</span></span><br><span class="line"> <span class="keyword">PASSWORD_REUSE_TIME</span> <span class="number">60</span></span><br><span class="line"> <span class="keyword">PASSWORD_REUSE_MAX</span> <span class="number">5</span></span><br><span class="line"> <span class="keyword">PASSWORD_VERIFY_FUNCTION</span> verify_function</span><br><span class="line"> <span class="keyword">PASSWORD_LOCK_TIME</span> <span class="number">1</span>/<span class="number">24</span></span><br><span class="line"> <span class="keyword">PASSWORD_GRACE_TIME</span> <span class="number">10</span>;</span><br></pre></td></tr></table></figure><h3 id="Sessions"><a href="#Sessions" class="headerlink" title="Sessions"></a>Sessions</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- list all session with status, os run user, machine name, and which program</span></span><br><span class="line"><span class="keyword">select</span> <span class="keyword">sid</span>, <span class="built_in">serial</span><span class="comment">#, username, status, osuser, machine, program, module from v$session;</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- kill session by sid & serial# value</span></span><br><span class="line"><span class="keyword">ALTER</span> <span class="keyword">SYSTEM</span> <span class="keyword">KILL</span> <span class="keyword">SESSION</span> <span class="string">'6, 16409'</span> <span class="keyword">IMMEDIATE</span>;</span><br></pre></td></tr></table></figure><h3 id="Privilege-and-Role-overview"><a href="#Privilege-and-Role-overview" class="headerlink" title="Privilege and Role overview"></a>Privilege and Role overview</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Table Name - Description</span></span><br><span class="line"></span><br><span class="line">DBA_COL_PRIVS</span><br><span class="line">ALL_COL_PRIVS</span><br><span class="line">USER_COL_PRIVS</span><br><span class="line"><span class="comment"># DBA view describes all column object grants in the database. </span></span><br><span class="line"><span class="comment"># ALL view describes all column object grants for which the current user or PUBLIC is the object owner, grantor, or grantee. # USER view describes column object grants for which the current user is the object owner, grantor, or grantee.</span></span><br><span class="line"></span><br><span class="line">ALL_COL_PRIVS_MADE</span><br><span class="line">USER_COL_PRIVS_MADE</span><br><span class="line"><span class="comment"># ALL view lists column object grants for which the current user is object owner or grantor. </span></span><br><span class="line"><span class="comment"># USER view describes column object grants for which the current user is the grantor.</span></span><br><span class="line"></span><br><span class="line">ALL_COL_PRIVS_RECD</span><br><span class="line">USER_COL_PRIVS_RECD</span><br><span class="line"><span class="comment"># ALL view describes column object grants for which the current user or PUBLIC is the grantee. </span></span><br><span class="line"><span class="comment"># USER view describes column object grants for which the current user is the grantee.</span></span><br><span class="line"></span><br><span class="line">DBA_TAB_PRIVS</span><br><span class="line">ALL_TAB_PRIVS</span><br><span class="line">USER_TAB_PRIVS</span><br><span class="line"><span class="comment"># DBA view lists all grants on all objects in the database. </span></span><br><span class="line"><span class="comment"># ALL view lists the grants on objects where the user or PUBLIC is the grantee. </span></span><br><span class="line"><span class="comment"># USER view lists grants on all objects where the current user is the grantee.</span></span><br><span class="line"></span><br><span class="line">ALL_TAB_PRIVS_MADE</span><br><span class="line">USER_TAB_PRIVS_MADE</span><br><span class="line"><span class="comment"># ALL view lists the all object grants made by the current user or made on the objects owned by the current user. </span></span><br><span class="line"><span class="comment"># USER view lists grants on all objects owned by the current user.</span></span><br><span class="line"></span><br><span class="line">ALL_TAB_PRIVS_RECD</span><br><span class="line">USER_TAB_PRIVS_RECD</span><br><span class="line"><span class="comment"># ALL view lists object grants for which the user or PUBLIC is the grantee. </span></span><br><span class="line"><span class="comment"># USER view lists object grants for which the current user is the grantee.</span></span><br><span class="line"></span><br><span class="line">DBA_ROLES</span><br><span class="line"><span class="comment"># This view lists all roles that exist in the database.</span></span><br><span class="line"></span><br><span class="line">DBA_ROLE_PRIVS</span><br><span class="line">USER_ROLE_PRIVS</span><br><span class="line"><span class="comment"># DBA view lists roles granted to users and roles. </span></span><br><span class="line"><span class="comment"># USER view lists roles granted to the current user.</span></span><br><span class="line"></span><br><span class="line">DBA_SYS_PRIVS</span><br><span class="line">USER_SYS_PRIVS</span><br><span class="line"><span class="comment"># DBA view lists system privileges granted to users and roles. </span></span><br><span class="line"><span class="comment"># USER view lists system privileges granted to the current user.</span></span><br><span class="line"></span><br><span class="line">ROLE_ROLE_PRIVS</span><br><span class="line"><span class="comment"># This view describes roles granted to other roles. </span></span><br><span class="line"><span class="comment"># Information is provided only about roles to which the user has access.</span></span><br><span class="line"></span><br><span class="line">ROLE_SYS_PRIVS</span><br><span class="line"><span class="comment"># This view contains information about system privileges granted to roles. </span></span><br><span class="line"><span class="comment"># Information is provided only about roles to which the user has access.</span></span><br><span class="line"></span><br><span class="line">ROLE_TAB_PRIVS</span><br><span class="line"><span class="comment"># This view contains information about object privileges granted to roles. </span></span><br><span class="line"><span class="comment"># Information is provided only about roles to which the user has access.</span></span><br><span class="line"></span><br><span class="line">SESSION_PRIVS</span><br><span class="line"><span class="comment"># This view lists the privileges that are currently enabled for the user.</span></span><br><span class="line"></span><br><span class="line">SESSION_ROLES</span><br><span class="line"><span class="comment"># This view lists the roles that are currently enabled to the user.</span></span><br></pre></td></tr></table></figure><blockquote><p>Resources:<br><a href="http://kannan-oracle.blogspot.com/2012/06/how-to-show-user-profile-and-change-its.html" target="_blank" rel="noopener">http://kannan-oracle.blogspot.com/2012/06/how-to-show-user-profile-and-change-its.html</a></p></blockquote>]]></content>
<summary type="html">
<blockquote>
<p>This article is about oracle daily maintaince, mainly contains <code>dba_users</code>, <code>v$session</code> and <code>dba_profiles</code> the three parts.</p>
</blockquote>
</summary>
<category term="Database" scheme="https://tech.itabas.com/categories/Database/"/>
<category term="DataBase" scheme="https://tech.itabas.com/tags/DataBase/"/>
</entry>
<entry>
<title>Oracle - Restore Point & Flash Back</title>
<link href="https://tech.itabas.com/2016/12/12/database/oracle-script-restore-point-flash-back/"/>
<id>https://tech.itabas.com/2016/12/12/database/oracle-script-restore-point-flash-back/</id>
<published>2016-12-11T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.365Z</updated>
<content type="html"><![CDATA[<blockquote><p>Sometimes, varity business data need create restore point for differ performance test. So how to manange restore point and how to flashback, see the below -></p></blockquote><a id="more"></a><h3 id="Restore-Point"><a href="#Restore-Point" class="headerlink" title="Restore Point"></a>Restore Point</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#Login sqlplus use sysdba</span></span><br><span class="line">Sqlplus / as sysdba</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">--list all restore points:</span></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">NAME</span>, <span class="keyword">SCN</span>, <span class="built_in">TIME</span>, DATABASE_INCARNATION<span class="comment">#, GUARANTEE_FLASHBACK_DATABASE, STORAGE_SIZE </span></span><br><span class="line"><span class="keyword">FROM</span> V$RESTORE_POINT;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- also simple syntax</span></span><br><span class="line"><span class="keyword">select</span> <span class="keyword">scn</span>, GUARANTEE_FLASHBACK_DATABASE,<span class="built_in">TIME</span>,<span class="keyword">name</span> <span class="keyword">from</span> v$restore_point;</span><br><span class="line"></span><br><span class="line"><span class="comment">--drop old restore point:</span></span><br><span class="line"><span class="keyword">DROP</span> <span class="keyword">RESTORE</span> POINT ICC_20160824;</span><br><span class="line"></span><br><span class="line"><span class="comment">--create new restore point:</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">RESTORE</span> POINT ICC_20160830 <span class="keyword">GUARANTEE</span> <span class="keyword">FLASHBACK</span> <span class="keyword">DATABASE</span>;</span><br></pre></td></tr></table></figure><h3 id="Flash-Back"><a href="#Flash-Back" class="headerlink" title="Flash Back"></a>Flash Back</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- flashback.sql</span></span><br><span class="line"></span><br><span class="line">spool flashback.log</span><br><span class="line">startup mount;</span><br><span class="line">flashback database to <span class="keyword">restore</span> point <span class="string">"ICC_20161014"</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">database</span> <span class="keyword">open</span> <span class="keyword">resetlogs</span>;</span><br><span class="line">spool off</span><br><span class="line">exit</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># file name: flashback.sh</span></span><br><span class="line"><span class="comment"># author: itabas</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"></span><br><span class="line">ORACLE_UNQNAME=perfcli</span><br><span class="line">ORACLE_SID=perfcli2</span><br><span class="line"><span class="built_in">echo</span> stopping RAC database</span><br><span class="line">srvctl stop database -d perfcli</span><br><span class="line">srvctl status database -d perfcli</span><br><span class="line">rm -f flashback.log</span><br><span class="line"><span class="built_in">echo</span> starting sqlplus</span><br><span class="line">sqlplus <span class="string">"/ as sysdba"</span> @flashback.sql</span><br><span class="line">cat flashback.log</span><br><span class="line">srvctl start instance -d perfcli -i <span class="string">"perfcli1"</span></span><br><span class="line">srvctl status database -d perfcli</span><br><span class="line"><span class="built_in">echo</span> stopping oracle services</span><br><span class="line">srvctl stop service -d perfcli</span><br><span class="line"><span class="built_in">echo</span> starting oracle services</span><br><span class="line">srvctl start service -d perfcli</span><br><span class="line">srvctl status service -d perfcli</span><br></pre></td></tr></table></figure><blockquote><p>Of course, if your oracle is ASM cluster, maybe have many instances, just modify related instance script, will be all right.</p></blockquote><h4 id="other-node-example"><a href="#other-node-example" class="headerlink" title="other node example"></a>other node example</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># file name: flashback.sh</span></span><br><span class="line"><span class="comment"># author: itabas</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#Node1:</span></span><br><span class="line">ORACLE_UNQNAME=perfcdb</span><br><span class="line">ORACLE_SID=perfcdb1</span><br><span class="line"><span class="built_in">echo</span> `date`</span><br><span class="line"><span class="built_in">echo</span> stopping RAC database</span><br><span class="line">srvctl stop database -d perfcdb</span><br><span class="line">srvctl status database -d perfcdb</span><br><span class="line">rm -f flashback.log</span><br><span class="line"><span class="built_in">echo</span> starting sqlplus</span><br><span class="line">sqlplus <span class="string">"/ as sysdba"</span> @flashback.sql</span><br><span class="line">cat flashback.log</span><br><span class="line"><span class="built_in">echo</span> starting instance 2</span><br><span class="line">srvctl start instance -d perfcdb -i <span class="string">"perfcdb2"</span></span><br><span class="line">srvctl status database -d perfcdb</span><br><span class="line"><span class="built_in">echo</span> stopping oracle services</span><br><span class="line">srvctl stop service -d perfcdb</span><br><span class="line"><span class="built_in">echo</span> starting oracle services</span><br><span class="line">srvctl start service -d perfcdb</span><br><span class="line">srvctl status service -d perfcdb</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#Node2:</span></span><br><span class="line">ORACLE_UNQNAME=perfcdb</span><br><span class="line">ORACLE_SID=perfcdb2</span><br><span class="line"><span class="built_in">echo</span> stopping RAC database</span><br><span class="line">srvctl stop database -d perfcdb</span><br><span class="line">srvctl status database -d perfcdb</span><br><span class="line">rm -f flashback.log</span><br><span class="line"><span class="built_in">echo</span> starting sqlplus</span><br><span class="line">sqlplus <span class="string">"/ as sysdba"</span> @flashback.sql</span><br><span class="line">cat flashback.log</span><br><span class="line">srvctl start instance -d perfcdb -i <span class="string">"perfcdb1"</span></span><br><span class="line">srvctl status database -d perfcdb</span><br><span class="line"><span class="built_in">echo</span> stopping oracle services</span><br><span class="line">srvctl stop service -d perfcdb</span><br><span class="line"><span class="built_in">echo</span> starting oracle services</span><br><span class="line">srvctl start service -d perfcdb</span><br><span class="line">srvctl status service -d perfcdb</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<blockquote>
<p>Sometimes, varity business data need create restore point for differ performance test. So how to manange restore point and how to flashback, see the below -&gt;</p>
</blockquote>
</summary>
<category term="Database" scheme="https://tech.itabas.com/categories/Database/"/>
<category term="Oracle" scheme="https://tech.itabas.com/tags/Oracle/"/>
<category term="Script" scheme="https://tech.itabas.com/tags/Script/"/>
</entry>
<entry>
<title>Oracle - ILM</title>
<link href="https://tech.itabas.com/2016/11/09/database/oracle-kt-ilm/"/>
<id>https://tech.itabas.com/2016/11/09/database/oracle-kt-ilm/</id>
<published>2016-11-08T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.363Z</updated>
<content type="html"><![CDATA[<blockquote><p><code>ILM</code> is mean Information Lifecycle Management. It’s practice of applying policies for effective management of information throughout its useful life.</p></blockquote><blockquote><p><strong>Implementing ILM Using Oracle Database</strong><br>The offical documentation see <strong><a href="https://docs.oracle.com/cd/B28359_01/server.111/b32024/part_lifecycle.htm" target="_blank" rel="noopener">here</a></strong></p></blockquote><a id="more"></a><blockquote><p>And mainly four steps:</p></blockquote><blockquote><ul><li><code>Define the Data Classes</code></li><li><code>Create Storage Tiers for the Data Classes</code></li><li><code>Create Data Access and Migration Policies</code></li><li><code>Define and Enforce Compliance Policies</code></li></ul></blockquote><blockquote><p>In fact, in our production, I need to handle a unpartition table to <code>ILM</code>, so I should <code>archive data</code> and <code>create partition</code> and <code>add customize policy</code>.<br>See the below steps:</p></blockquote><h3 id="Archive-Database"><a href="#Archive-Database" class="headerlink" title="Archive Database"></a>Archive Database</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">@IBSArch.par</span><br><span class="line"><span class="keyword">set</span> serveroutput <span class="keyword">on</span>;</span><br><span class="line"><span class="keyword">set</span> <span class="keyword">verify</span> <span class="keyword">off</span>;</span><br><span class="line"></span><br><span class="line">spool IBSArchive.log</span><br><span class="line"></span><br><span class="line">prompt</span><br><span class="line">prompt Attempting to <span class="keyword">create</span> the <span class="keyword">user</span> used <span class="keyword">for</span> <span class="keyword">archived</span> <span class="keyword">data</span> ....</span><br><span class="line">@@scripts/createarchuser</span><br><span class="line"></span><br><span class="line"><span class="keyword">prompt</span></span><br><span class="line"><span class="keyword">prompt</span> <span class="keyword">Create</span> objects <span class="keyword">in</span> BD <span class="keyword">schema</span></span><br><span class="line">@@scripts/createBDobjects</span><br><span class="line"></span><br><span class="line"><span class="keyword">prompt</span></span><br><span class="line"><span class="keyword">prompt</span> Attempting <span class="keyword">to</span> <span class="keyword">create</span> <span class="keyword">private</span> synonyms <span class="keyword">for</span> BD <span class="keyword">database</span> objects <span class="keyword">in</span> the arch <span class="keyword">schema</span></span><br><span class="line">@@scripts/createsynonyms</span><br><span class="line"></span><br><span class="line"><span class="keyword">prompt</span></span><br><span class="line"><span class="keyword">prompt</span> Attempting <span class="keyword">to</span> <span class="keyword">add</span> <span class="keyword">new</span> DSN <span class="keyword">for</span> <span class="keyword">archived</span> <span class="keyword">data</span></span><br><span class="line"><span class="comment">--create new DSN for archived data</span></span><br><span class="line">@@scripts/createDSN</span><br><span class="line"></span><br><span class="line"><span class="keyword">prompt</span></span><br><span class="line"><span class="keyword">prompt</span> Attempting <span class="keyword">to</span> <span class="keyword">create</span> a scheduler job <span class="keyword">to</span> run the partitioning <span class="keyword">of</span> Businessdata</span><br><span class="line"><span class="comment">--create new DSN for archived data</span></span><br><span class="line">@@scripts/createPartitionJob</span><br><span class="line"></span><br><span class="line">spool <span class="keyword">off</span>;</span><br><span class="line">exit;</span><br></pre></td></tr></table></figure><h3 id="VPD-Virtual-Private-Database"><a href="#VPD-Virtual-Private-Database" class="headerlink" title="VPD - Virtual Private Database"></a>VPD - Virtual Private Database</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">@IBSArch.par</span><br><span class="line"><span class="keyword">set</span> serveroutput <span class="keyword">on</span>;</span><br><span class="line"><span class="keyword">set</span> <span class="keyword">verify</span> <span class="keyword">off</span>;</span><br><span class="line"></span><br><span class="line">spool IBSVPD.log</span><br><span class="line"></span><br><span class="line">prompt</span><br><span class="line">prompt Attempting to <span class="keyword">create</span> the VPD <span class="keyword">profiles</span></span><br><span class="line">@@scripts/createvpdprofiles</span><br></pre></td></tr></table></figure><blockquote><p>These resource files see <a href="https://github.com/itabas016/ilm-script" target="_blank" rel="noopener">here</a>.</p></blockquote>]]></content>
<summary type="html">
<blockquote>
<p><code>ILM</code> is mean Information Lifecycle Management. It’s practice of applying policies for effective management of information throughout its useful life.</p>
</blockquote>
<blockquote>
<p><strong>Implementing ILM Using Oracle Database</strong><br>The offical documentation see <strong><a href="https://docs.oracle.com/cd/B28359_01/server.111/b32024/part_lifecycle.htm" target="_blank" rel="noopener">here</a></strong></p>
</blockquote>
</summary>
<category term="Database" scheme="https://tech.itabas.com/categories/Database/"/>
<category term="Oracle" scheme="https://tech.itabas.com/tags/Oracle/"/>
<category term="KT" scheme="https://tech.itabas.com/tags/KT/"/>
</entry>
<entry>
<title>Oracle - Materialized View</title>
<link href="https://tech.itabas.com/2016/11/09/database/oracle-kt-materialized-view/"/>
<id>https://tech.itabas.com/2016/11/09/database/oracle-kt-materialized-view/</id>
<published>2016-11-08T16:00:00.000Z</published>
<updated>2020-01-01T14:00:11.364Z</updated>
<content type="html"><![CDATA[<blockquote><p>A <code>materialized view</code>, or <code>snapshot</code> as they were previously known, is a table segment whose contents are periodically refreshed based on a query, either against a local or remote table. Using materialized views against remote tables is the simplest way to achieve replication of data between sites.</p></blockquote><a id="more"></a><h3 id="Overview"><a href="#Overview" class="headerlink" title="Overview"></a>Overview</h3><blockquote><p>Oracle uses <code>materialized views</code> (also known as <strong>snapshots</strong> in prior releases) to replicate data to non-master sites in a replication environment and to cache <strong>expensive queries</strong> in a data warehouse environment. </p></blockquote><blockquote><p>A <code>materialized view</code> is a replica of a target master from a <strong>single point</strong> in time. The master can be either a master table at a master site or a master materialized view at a materialized view site. Whereas in multi-master replication tables are continuously updated by other master sites, materialized views are updated from one or more masters through individual batch updates, known as a refreshes, from a single master site or master materialized view site.<br><img src="/../../../../ref/oracle-mv-view.png" alt="oracle-mv-view.png"></p></blockquote><h3 id="Create-Materialized-View"><a href="#Create-Materialized-View" class="headerlink" title="Create Materialized View"></a>Create Materialized View</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Master Database Site</span></span><br><span class="line"><span class="keyword">SELECT</span> * <span class="keyword">FROM</span> DBA_MVIEW_LOGS <span class="keyword">WHERE</span> <span class="keyword">MASTER</span>=<span class="string">'<BASE TABLE NAME>'</span>,</span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">MATERIALIZED</span> <span class="keyword">VIEW</span> <span class="keyword">LOG</span> <span class="keyword">ON</span> <BASE <span class="keyword">TABLE</span>> <span class="keyword">TABLESPACE</span> <<span class="keyword">TABLESPACE</span> <span class="keyword">NAME</span>> <span class="keyword">WITH</span> <PRIMARY <span class="keyword">KEY</span>>/<<span class="keyword">ROWID</span>>;</span><br><span class="line"><span class="keyword">DROP</span> <span class="keyword">MATERIALIZED</span> <span class="keyword">VIEW</span> <span class="keyword">LOG</span> <span class="keyword">ON</span> <<span class="keyword">Schema</span>>.<Table_Name>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- MView Database Site</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">DATABASE</span> <span class="keyword">LINK</span> <<span class="keyword">NAME</span>> <span class="keyword">CONNECT</span> <span class="keyword">TO</span> <<span class="keyword">Master</span> DB <span class="keyword">Schema</span> <span class="keyword">Name</span>> </span><br><span class="line"><span class="keyword">IDENTIFIED</span> <span class="keyword">BY</span> < <span class="keyword">Master</span> DB <span class="keyword">Schema</span> <span class="keyword">Password</span>> <span class="keyword">USING</span> <span class="string">'<Master DB TNS>'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">MATERIALIZED</span> <span class="keyword">VIEW</span> <span class="string">"USERNAME"</span>.<span class="string">"MVIEW_NAME"</span></span><br><span class="line"><span class="keyword">ORGANIZATION</span> <span class="keyword">HEAP</span> PCTFREE <span class="number">10</span> <span class="keyword">PCTUSED</span> <span class="number">0</span> <span class="keyword">INITRANS</span> <span class="number">2</span> <span class="keyword">MAXTRANS</span> <span class="number">255</span> <span class="keyword">NOCOMPRESS</span> NOLOGGING</span><br><span class="line"><span class="keyword">STORAGE</span>(<span class="keyword">INITIAL</span> <span class="number">1048576</span> <span class="keyword">NEXT</span> <span class="number">1048576</span> <span class="keyword">MINEXTENTS</span> <span class="number">1</span> <span class="keyword">MAXEXTENTS</span> <span class="number">2147483645</span></span><br><span class="line"><span class="keyword">PCTINCREASE</span> <span class="number">0</span> <span class="keyword">FREELISTS</span> <span class="number">1</span> <span class="keyword">FREELIST</span> <span class="keyword">GROUPS</span> <span class="number">1</span> <span class="keyword">BUFFER_POOL</span> <span class="keyword">DEFAULT</span>)</span><br><span class="line"><span class="keyword">TABLESPACE</span> <span class="string">"<Tablespace Name>"</span></span><br><span class="line"><span class="keyword">BUILD</span> <span class="keyword">IMMEDIATE</span></span><br><span class="line"><span class="keyword">USING</span> <span class="keyword">INDEX</span> PCTFREE <span class="number">10</span> <span class="keyword">INITRANS</span> <span class="number">2</span> <span class="keyword">MAXTRANS</span> <span class="number">255</span></span><br><span class="line"><span class="keyword">STORAGE</span>(<span class="keyword">INITIAL</span> <span class="number">1048576</span> <span class="keyword">NEXT</span> <span class="number">1048576</span> <span class="keyword">MINEXTENTS</span> <span class="number">1</span> <span class="keyword">MAXEXTENTS</span> <span class="number">2147483645</span></span><br><span class="line"><span class="keyword">PCTINCREASE</span> <span class="number">0</span> <span class="keyword">FREELISTS</span> <span class="number">1</span> <span class="keyword">FREELIST</span> <span class="keyword">GROUPS</span> <span class="number">1</span> <span class="keyword">BUFFER_POOL</span> <span class="keyword">DEFAULT</span>)</span><br><span class="line"><span class="keyword">TABLESPACE</span> <span class="string">""</span><<span class="keyword">Tablespace</span> <span class="keyword">Name</span>><span class="string">"</span></span><br><span class="line"><span class="string">REFRESH FAST ON DEMAND START WITH sysdate+0 NEXT TRUNC(SYSDATE+1)+6/24 -- Morning 6 AM</span></span><br><span class="line"><span class="string">-- REFRESH FAST ON DEMAND START WITH sysdate+0 NEXT SYSDATE + 5/(60*24) -- Every 5 Mins</span></span><br><span class="line"><span class="string">-- REFRESH COMPLETE ON DEMAND START WITH sysdate+0 NEXT SYSDATE + 30/(60*24) -- Every 30 Mins</span></span><br><span class="line"><span class="string">-- REFRESH COMPLETE ON DEMAND START WITH sysdate+0 NEXT SYSDATE + 1</span></span><br><span class="line"><span class="string">WITH PRIMARY KEY USING DEFAULT LOCAL ROLLBACK SEGMENT</span></span><br><span class="line"><span class="string">DISABLE QUERY REWRITE</span></span><br><span class="line"><span class="string">--WITH ROWID USING DEFAULT LOCAL ROLLBACK SEGMENT</span></span><br><span class="line"><span class="string">DISABLE QUERY REWRITE</span></span><br><span class="line"><span class="string">AS SELECT</span></span><br><span class="line"><span class="string">COLUMN_1 Col_Alias_Name ,</span></span><br><span class="line"><span class="string">COLUMN_2 Col_Alias_Name,</span></span><br><span class="line"><span class="string">COLUMN_3 Col_Alias_Name,</span></span><br><span class="line"><span class="string">--NULL Col_Alias_Name,,</span></span><br><span class="line"><span class="string">--CAST(NULL as varchar2(1)) Col_Alias_Name,,</span></span><br><span class="line"><span class="string">FROM <Master Schema>.<Master Base Table>@<DB_LINK Name>;</span></span><br></pre></td></tr></table></figure><h3 id="ALTER-DROP-Materialized-View"><a href="#ALTER-DROP-Materialized-View" class="headerlink" title="ALTER/DROP Materialized View"></a>ALTER/DROP Materialized View</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ALTER</span> <span class="keyword">MATERIALIZED</span> <span class="keyword">VIEW</span> <MVIEW_NAME></span><br><span class="line"><span class="keyword">REFRESH</span> <span class="keyword">COMPLETE</span> <span class="keyword">ON</span> <span class="keyword">DEMAND</span> <span class="keyword">START</span> <span class="keyword">WITH</span> <span class="keyword">sysdate</span>+<span class="number">0</span> <span class="keyword">NEXT</span> <span class="keyword">SYSDATE</span> + <span class="number">30</span>/(<span class="number">60</span>*<span class="number">24</span>);</span><br><span class="line"><span class="keyword">DROP</span> <span class="keyword">MATERIALIZED</span> <span class="keyword">VIEW</span> <span class="keyword">LOG</span> <span class="keyword">ON</span> <MVIEW_NAME>;</span><br></pre></td></tr></table></figure><h3 id="Query-Materialized-View"><a href="#Query-Materialized-View" class="headerlink" title="Query Materialized View"></a>Query Materialized View</h3><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- Find All JOBs/MViews Related to Master DB</span></span><br><span class="line">col JOB FOR 9999</span><br><span class="line">col OWNER for a8</span><br><span class="line">col MASTER_LINK for a15</span><br><span class="line">col HOST for a10</span><br><span class="line">col FAST_REFRESHABLE for a8</span><br><span class="line">col STALENESS for a9</span><br><span class="line">col COMPILE_STATE for a8</span><br><span class="line">col MVIEW_NAME for a20</span><br><span class="line">col "REFRH MOD-METHOD BLD_MOD" for a22</span><br><span class="line">col INTERVAL FOR a24</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> </span><br><span class="line"> JOB</span><br><span class="line"> ,a.OWNER,MVIEW_NAME</span><br><span class="line"> ,UPDATABLE</span><br><span class="line"> ,REWRITE_ENABLED</span><br><span class="line"> ,MASTER_LINK</span><br><span class="line"> ,c.HOST</span><br><span class="line"> ,REFRESH_MODE||<span class="string">'-'</span>||REFRESH_METHOD||<span class="string">'-'</span>||BUILD_MODE <span class="string">"REFRH MOD-METHOD BLD_MOD"</span></span><br><span class="line"> ,FAST_REFRESHABLE</span><br><span class="line"> ,LAST_REFRESH_TYPE</span><br><span class="line"> ,to_char(LAST_REFRESH_DATE,<span class="string">'dd-Mon-yy hh24:mi:ss'</span>) LAST_REFRESH_DATE</span><br><span class="line"> ,COMPILE_STATE</span><br><span class="line"> ,<span class="built_in">INTERVAL</span></span><br><span class="line"> ,USE_NO_INDEX</span><br><span class="line"><span class="keyword">FROM</span> DBA_MVIEWS a, DBA_REFRESH_CHILDREN b, DBA_DB_LINKS c</span><br><span class="line"><span class="keyword">WHERE</span> a.MVIEW_NAME=b.NAME</span><br><span class="line"><span class="keyword">AND</span> a.OWNER=b.OWNER</span><br><span class="line"><span class="keyword">And</span> MASTER_LINK <span class="keyword">in</span> (<span class="keyword">SELECT</span> <span class="string">'@'</span>||DB_LINK <span class="keyword">from</span> dba_db_links <span class="keyword">where</span> <span class="keyword">UPPER</span>(HOST) =<span class="string">'<Master DB Name>'</span>)</span><br><span class="line"><span class="keyword">AND</span> <span class="keyword">SUBSTR</span>(a.MASTER_LINK,<span class="number">2</span>) = c.DB_LINK</span><br><span class="line"><span class="keyword">AND</span> <span class="keyword">UPPER</span>(c.HOST) =<span class="string">'<Master DB Name>'</span></span><br><span class="line"><span class="keyword">Order</span> <span class="keyword">by</span> MASTER_LINK, MVIEW_NAME;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- Query Materialized View Log in Master DB Site</span></span><br><span class="line"><span class="keyword">SELECT</span> * <span class="keyword">FROM</span> DBA_MVIEW_LOGS <span class="keyword">WHERE</span> <span class="keyword">MASTER</span>=<span class="string">'<BASE TABLE NAME>'</span>;</span><br></pre></td></tr></table></figure><blockquote><p>Resources:<br><a href="http://durga-kar.blogspot.com/2015/02/materialized-view.html" target="_blank" rel="noopener">http://durga-kar.blogspot.com/2015/02/materialized-view.html</a></p></blockquote>]]></content>
<summary type="html">
<blockquote>
<p>A <code>materialized view</code>, or <code>snapshot</code> as they were previously known, is a table segment whose contents are periodically refreshed based on a query, either against a local or remote table. Using materialized views against remote tables is the simplest way to achieve replication of data between sites.</p>
</blockquote>
</summary>
<category term="Database" scheme="https://tech.itabas.com/categories/Database/"/>
<category term="Oracle" scheme="https://tech.itabas.com/tags/Oracle/"/>
<category term="KT" scheme="https://tech.itabas.com/tags/KT/"/>
</entry>
</feed>