-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
493 lines (277 loc) · 246 KB
/
atom.xml
File metadata and controls
493 lines (277 loc) · 246 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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>wkaanig的个人博客</title>
<subtitle>Hugking</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://blog.wkaanig.cn/"/>
<updated>2020-04-21T16:52:48.119Z</updated>
<id>http://blog.wkaanig.cn/</id>
<author>
<name>wkaanig</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>前端面试知识(Js篇)</title>
<link href="http://blog.wkaanig.cn/post/7ce2f84d.html"/>
<id>http://blog.wkaanig.cn/post/7ce2f84d.html</id>
<published>2020-04-18T08:28:10.000Z</published>
<updated>2020-04-21T16:52:48.119Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h1 id="javascript"><a class="markdownIt-Anchor" href="#javascript"></a> JavaScript</h1><h2 id="原型链"><a class="markdownIt-Anchor" href="#原型链"></a> 原型链</h2><h2 id="事件流"><a class="markdownIt-Anchor" href="#事件流"></a> 事件流</h2><p>事件流描述的是从页面中接收事件的顺序,DOM2级事件流包括下面几个阶段。</p><ul><li><p>事件捕获阶段</p></li><li><p>-处于目标阶段</p></li><li><p>事件冒泡阶段</p></li></ul><p>addEventListener:addEventListener 是DOM2 级事件新增的指定事件处理程序的操作,这个方法接收3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。最后这个布尔值参数如果是true,表示在捕获阶段调用事件处理程序;如果是false,表示在冒泡阶段调用事件处理程序。</p><h2 id="图片的懒加载和预加载"><a class="markdownIt-Anchor" href="#图片的懒加载和预加载"></a> 图片的懒加载和预加载</h2><p>预加载:提前加载图片,当用户需要查看时可直接从本地缓存中渲染。</p><p>懒加载:懒加载的主要目的是作为服务器前端的优化,减少请求数或延迟请求数。</p><p>两种技术的本质:两者的行为是相反的,一个是提前加载,一个是迟缓甚至不加载。<br>懒加载对服务器前端有一定的缓解压力作用,预加载则会增加服务器前端压力。</p><h2 id="改变函数内部this指针的指向函数bindapplycall的区别"><a class="markdownIt-Anchor" href="#改变函数内部this指针的指向函数bindapplycall的区别"></a> 改变函数内部this指针的指向函数(bind,apply,call的区别)</h2><p>通过apply和call改变函数的this指向,他们两个函数的第一个参数都是一样的表示要改变指向的那个对象,第二个参数,apply是数组,而call则是arg1,arg2…这种形式。通过bind改变this作用域会返回一个新的函数,这个函数不会马上执行。</p><h2 id="ajax解决浏览器缓存问题"><a class="markdownIt-Anchor" href="#ajax解决浏览器缓存问题"></a> Ajax解决浏览器缓存问题</h2><p>在ajax发送请求前加上 anyAjaxObj.setRequestHeader(“If-Modified-Since”,“0”)。</p><p>在ajax发送请求前加上 anyAjaxObj.setRequestHeader(“Cache-Control”,“no-cache”)。</p><p>在URL后面加上一个随机数: “fresh=” + Math.random()。</p><p>在URL后面加上时间戳:“nowtime=” + new Date().getTime()。</p><p>如果是使用jQuery,直接这样就可以了 $.ajaxSetup({cache:false})。这样页面的所有ajax都会执行这条语句就是不需要保存缓存记录。</p><h2 id="js的节流和防抖"><a class="markdownIt-Anchor" href="#js的节流和防抖"></a> js的节流和防抖</h2><ul><li>防抖动:防抖技术即是可以把多个顺序地调用合并成一次,也就是在一定时间内,规定事件被触发的次数。</li><li>节流函数:只允许一个函数在 X 毫秒内执行一次,只有当上一次函数执行后过了你规定的时间间隔,才能进行下一次该函数的调用。</li><li>rAF:16.7ms 触发一次 handler,降低了可控性,但是提升了性能和精确度。</li></ul><h2 id="将原生的ajax封装成promise"><a class="markdownIt-Anchor" href="#将原生的ajax封装成promise"></a> 将原生的ajax封装成promise</h2><figure class="highlight javascript"><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="keyword">var</span> myNewAjax=<span class="function"><span class="keyword">function</span>(<span class="params">url</span>)</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function"><span class="keyword">function</span>(<span class="params">resolve,reject</span>)</span>{</span><br><span class="line"> <span class="keyword">var</span> xhr = <span class="keyword">new</span> XMLHttpRequest();</span><br><span class="line"> xhr.open(<span class="string">'get'</span>,url);</span><br><span class="line"> xhr.send(data);</span><br><span class="line"> xhr.onreadystatechange=<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{</span><br><span class="line"> <span class="keyword">if</span>(xhr.status==<span class="string">``</span><span class="number">200</span><span class="string">``</span>&&readyState==<span class="string">``</span><span class="number">4</span><span class="string">``</span>){</span><br><span class="line"> <span class="keyword">var</span> json=<span class="built_in">JSON</span>.parse(xhr.responseText);</span><br><span class="line"> resolve(json)</span><br><span class="line"> } <span class="keyword">else</span> </span><br><span class="line"> <span class="keyword">if</span>(xhr.readyState==<span class="string">``</span><span class="number">4</span><span class="string">``</span>&&xhr.status!=<span class="string">``</span><span class="number">200</span><span class="string">``</span>){</span><br><span class="line"> reject(<span class="string">``</span><span class="string">'error'</span><span class="string">``</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">})</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="job-queue中的执行顺序"><a class="markdownIt-Anchor" href="#job-queue中的执行顺序"></a> Job queue中的执行顺序</h2><p><em><strong>script(主程序代码)—>process.nextTick—>Promises…——>setTimeout——>setInterval——>setImmediate——> I/O——>UI rendering</strong></em></p><p>例1:</p><figure class="highlight js"><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">setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{<span class="built_in">console</span>.log(<span class="number">1</span>)},<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function"><span class="keyword">function</span>(<span class="params">resolve,reject</span>)</span>{</span><br><span class="line"> <span class="built_in">console</span>.log(<span class="number">2</span>);</span><br><span class="line"> setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{resolve()},<span class="number">0</span>)</span><br><span class="line">}).then(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{<span class="built_in">console</span>.log(<span class="number">3</span>)</span><br><span class="line">}).then(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{<span class="built_in">console</span>.log(<span class="number">4</span>)});</span><br><span class="line"></span><br><span class="line">process.nextTick(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{<span class="built_in">console</span>.log(<span class="number">5</span>)});</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(<span class="number">6</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//输出的是 2 6 5 1 3 4</span></span><br></pre></td></tr></table></figure><p>promise的构造中,没有同步的resolve,因此promise.then在当前的执行队列中是不存在的,只有promise从pending转移到resolve,才会有then方法,而这个resolve是在一个setTimout时间中完成的,因此3,4最后输出。</p><p>例2:</p><figure class="highlight js"><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">setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{<span class="built_in">console</span>.log(<span class="number">1</span>)},<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">new</span> <span class="built_in">Promise</span>(<span class="function"><span class="keyword">function</span>(<span class="params">resolve,reject</span>)</span>{</span><br><span class="line"> <span class="built_in">console</span>.log(<span class="number">2</span>);</span><br><span class="line"> resolve();</span><br><span class="line">}).then(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{<span class="built_in">console</span>.log(<span class="number">3</span>)</span><br><span class="line">}).then(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{<span class="built_in">console</span>.log(<span class="number">4</span>)});</span><br><span class="line"></span><br><span class="line">process.nextTick(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{<span class="built_in">console</span>.log(<span class="number">5</span>)});</span><br><span class="line"></span><br><span class="line"><span class="built_in">console</span>.log(<span class="number">6</span>);</span><br><span class="line"><span class="comment">//输出2,6,5,3,4,1</span></span><br></pre></td></tr></table></figure><p>在定义promise的时候,promise构造部分是同步执行的,这样问题就迎刃而解了。</p><!-- rebuild by neat -->]]></content>
<summary type="html">
<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h1 id="javascript"><a class="markdownIt-Anchor" href="#javascript"></a> Ja
</summary>
<category term="前端" scheme="http://blog.wkaanig.cn/categories/%E5%89%8D%E7%AB%AF/"/>
<category term="js" scheme="http://blog.wkaanig.cn/tags/js/"/>
</entry>
<entry>
<title>前端面试知识(Css篇)</title>
<link href="http://blog.wkaanig.cn/post/71c59ada.html"/>
<id>http://blog.wkaanig.cn/post/71c59ada.html</id>
<published>2020-04-17T12:14:48.000Z</published>
<updated>2020-04-21T16:56:47.125Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h1 id="css3"><a class="markdownIt-Anchor" href="#css3"></a> CSS3</h1><h2 id="css-盒模型"><a class="markdownIt-Anchor" href="#css-盒模型"></a> css 盒模型</h2><p>box-sizing(有3个值):border-box,padding-box,content-box.</p><p>标准盒子模型:</p><figure class="image-bubble"><div class="img-lightbox"><div class="overlay"></div><img src="//blog.wkaanig.cn/post/he1.png" alt></div><div class="image-caption"></div></figure><p></p><p>IE盒子模型:</p><figure class="image-bubble"><div class="img-lightbox"><div class="overlay"></div><img src="//blog.wkaanig.cn/post/he2.png" alt></div><div class="image-caption"></div></figure><p></p><h2 id="flex-布局-弹性布局-详见flex"><a class="markdownIt-Anchor" href="#flex-布局-弹性布局-详见flex"></a> flex 布局 (弹性布局 详见<a href="%5Bhttp://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool%EF%BC%88%E8%AF%AD%E6%B3%95%E7%AF%87%EF%BC%89%5D(http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html?utm_source=tuicool%EF%BC%88%E8%AF%AD%E6%B3%95%E7%AF%87%EF%BC%89)">flex</a>)</h2><p>display + position +floato</p><figure class="highlight css"><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="selector-class">.box</span>{</span><br><span class="line"><span class="attribute">display</span>:flex;</span><br><span class="line"> </span><br><span class="line"> <span class="attribute">display</span>: inline-flex;<span class="comment">/*行内元素*/</span></span><br><span class="line"> </span><br><span class="line"> <span class="attribute">display</span>: -webkit-flex; <span class="comment">/* Safari */</span></span><br><span class="line"> <span class="attribute">display</span>: flex;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>容器属性</p><figure class="highlight css"><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="selector-class">.box</span>{</span><br><span class="line"> <span class="attribute">flex-direction</span>:row | row-reverse | column | column-reverse;</span><br><span class="line"> <span class="attribute">flex-wrap</span>: nowrap | wrap | wrap-reverse;</span><br><span class="line"> <span class="attribute">flex-flow</span>: <flex-direction> || <flex-wrap>;</span><br><span class="line"> <span class="attribute">justify-content</span>: flex-start | flex-end | center | space-between | space-around;</span><br><span class="line"> <span class="attribute">align-items</span>: flex-start | flex-end | center | baseline | stretch;</span><br><span class="line"> <span class="attribute">align-content</span>: flex-start | flex-end | center | space-between | space-around | stretch;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>项目属性</p><figure class="highlight css"><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="selector-class">.item</span>{</span><br><span class="line"> <span class="attribute">flex-grow</span>: <number>; <span class="comment">/* default 0 放大*/</span></span><br><span class="line"> <span class="attribute">flex-shrink</span>: <number>; <span class="comment">/* default 1 缩小*/</span></span><br><span class="line"> <span class="attribute">flex-basis</span>: <length> | auto; <span class="comment">/* default auto */</span></span><br><span class="line"> <span class="attribute">flex</span>: none | [ <<span class="string">'flex-grow'</span>> <<span class="string">'flex-shrink'</span>>? || <<span class="string">'flex-basis'</span>> ];<span class="comment">/*一般值为 auto (1 1 auto) 和 none (0 0 auto)*/</span></span><br><span class="line"> <span class="attribute">align-self</span>: auto | flex-start | flex-end | center | baseline | stretch;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="bfc-块级格式化上下文清除浮动防止margin重叠"><a class="markdownIt-Anchor" href="#bfc-块级格式化上下文清除浮动防止margin重叠"></a> BFC (块级格式化上下文,清除浮动,防止margin重叠)</h2><figure class="highlight css"><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="selector-tag">BFC</span>:</span><br><span class="line">根元素</span><br><span class="line"><span class="selector-tag">float</span>不为<span class="selector-tag">none</span>的元素</span><br><span class="line"><span class="selector-tag">position</span>为<span class="selector-tag">fixed</span>和<span class="selector-tag">absolute</span>的元素</span><br><span class="line"><span class="selector-tag">display</span>为<span class="selector-tag">inline-block</span>、<span class="selector-tag">table-cell</span>、<span class="selector-tag">table-caption</span>,<span class="selector-tag">flex</span>,<span class="selector-tag">inline-flex</span>的元素</span><br><span class="line"><span class="selector-tag">overflow</span>不为<span class="selector-tag">visible</span>的元素</span><br></pre></td></tr></table></figure><p>多行元素的文本省略号</p><figure class="highlight css"><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="selector-class">.box</span>{</span><br><span class="line"> <span class="attribute">display</span>: -webkit-box;</span><br><span class="line"> <span class="attribute">-webkit-box-orient</span>:vertical;</span><br><span class="line"> <span class="attribute">-webkit-line-clamp</span>:<span class="number">3</span>;</span><br><span class="line"> <span class="attribute">overflow</span>:hidden;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="浮动清除详见清除浮动"><a class="markdownIt-Anchor" href="#浮动清除详见清除浮动"></a> 浮动清除(详见<a href="https://www.cnblogs.com/ForEvErNoME/p/3383539.html" target="_blank" rel="noopener">清除浮动</a>)</h2><ul><li><ol><li>在浮动元素后使用一个空元素如<div class="clear"></div>,并在CSS中赋予.clear{clear:both;}属性</li></ol></li><li><ol start="2"><li>给浮动元素的容器添加overflow:hidden;或overflow:auto;</li></ol></li><li><ol start="3"><li>给浮动元素的容器也添加上浮动属性即可清除内部浮动</li></ol></li><li><ol start="4"><li>什么都不做,给浮动元素后面的元素添加clear属性</li></ol></li><li><ol start="5"><li>给浮动元素的容器添加一个clearfix的class,然后给这个class添加一个:after伪元素实现元素末尾添加一个看不见的块元素</li></ol></li></ul><h2 id="css3-新特性详见css3"><a class="markdownIt-Anchor" href="#css3-新特性详见css3"></a> CSS3 新特性(详见<a href="https://www.cnblogs.com/xkweb/p/5862612.html" target="_blank" rel="noopener">css3</a>)</h2><p>边框</p><figure class="highlight css"><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="selector-tag">border-radius</span>:<span class="selector-tag">CSS3</span>圆角边框。在 <span class="selector-tag">CSS2</span> 中添加圆角矩形需要技巧,我们必须为每个圆角使用不同的图片,在 <span class="selector-tag">CSS3</span> 中,创建圆角是非常容易的,在 <span class="selector-tag">CSS3</span> 中,<span class="selector-tag">border-radius</span> 属性用于创建圆角。<span class="selector-tag">border</span>:2<span class="selector-tag">px</span> <span class="selector-tag">solid</span>;</span><br><span class="line"><span class="selector-tag">box-shadow</span>:<span class="selector-tag">CSS3</span>边框阴影。在 <span class="selector-tag">CSS3</span> 中,<span class="selector-tag">box-shadow</span> 用于向方框添加阴影。<span class="selector-tag">box-shadow</span><span class="selector-pseudo">:10px</span> 10<span class="selector-tag">px</span> 5<span class="selector-tag">px</span> <span class="selector-id">#888888</span>;</span><br><span class="line"><span class="selector-tag">border-image</span>:<span class="selector-tag">CSS3</span>边框图片。通过 <span class="selector-tag">CSS3</span> 的 <span class="selector-tag">border-image</span> 属性,您可以使用图片来创建边框。<span class="selector-tag">border-image</span>:<span class="selector-tag">url</span>(<span class="selector-tag">border</span><span class="selector-class">.png</span>) 30 30 <span class="selector-tag">round</span>;</span><br></pre></td></tr></table></figure><p>背景</p><figure class="highlight css"><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="selector-tag">background-size</span>: 属性规定背景图片的尺寸</span><br><span class="line"><span class="selector-tag">background-origin</span> :属性规定背景图片的定位区域</span><br></pre></td></tr></table></figure><p>文字</p><figure class="highlight css"><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="selector-tag">text-shadow</span>:在 <span class="selector-tag">CSS3</span> 中,<span class="selector-tag">text-shadow</span> 可向文本应用阴影。<span class="selector-tag">text-shadow</span><span class="selector-pseudo">:5px</span> 5<span class="selector-tag">px</span> 5<span class="selector-tag">px</span> <span class="selector-id">#FFFFFF</span>;</span><br><span class="line"><span class="selector-tag">word-wrap</span> :允许对长单词进行拆分,并换行:<span class="selector-tag">p</span>{<span class="attribute">word-wrap</span>:break-word;}</span><br></pre></td></tr></table></figure><p>2D转换( transform)</p><figure class="highlight css"><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="selector-tag">translate</span>():元素从其当前位置移动,根据给定的 <span class="selector-tag">left</span>(<span class="selector-tag">x</span> 坐标) 和 <span class="selector-tag">top</span>(<span class="selector-tag">y</span> 坐标) 位置参数:<span class="selector-tag">transform</span>:<span class="selector-tag">translate</span>(50<span class="selector-tag">px</span>,100<span class="selector-tag">px</span>);值 <span class="selector-tag">translate</span>(50<span class="selector-tag">px</span>,100<span class="selector-tag">px</span>) 把元素从左侧移动 50 像素,从顶端移动 100 像素。</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">rotate</span>():元素顺时针旋转给定的角度。允许负值,元素将逆时针旋转。<span class="selector-tag">transform</span><span class="selector-pseudo">:rotate(30deg)</span>;值 <span class="selector-tag">rotate</span>(30<span class="selector-tag">deg</span>) 把元素顺时针旋转 30 度。</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">scale</span>():元素的尺寸会增加或减少,根据给定的宽度(<span class="selector-tag">X</span> 轴)和高度(<span class="selector-tag">Y</span> 轴)参数:<span class="selector-tag">transform</span><span class="selector-pseudo">:scale(2</span>,4);值 <span class="selector-tag">scale</span>(2,4) 把宽度转换为原始尺寸的 2 倍,把高度转换为原始高度的 4 倍。</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">skew</span>():元素转动给定的角度,根据给定的水平线(<span class="selector-tag">X</span> 轴)和垂直线(<span class="selector-tag">Y</span> 轴)参数:<span class="selector-tag">transform</span><span class="selector-pseudo">:skew(30deg</span>,20<span class="selector-tag">deg</span>);值 <span class="selector-tag">skew</span>(30<span class="selector-tag">deg</span>,20<span class="selector-tag">deg</span>) 围绕 <span class="selector-tag">X</span> 轴把元素转动 30 度,围绕 <span class="selector-tag">Y</span> 轴转动 20 度。</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">matrix</span>() :</span><br><span class="line"><span class="selector-tag">matrix</span>() 方法把所有 2<span class="selector-tag">D</span> 转换方法组合在一起。</span><br><span class="line"><span class="selector-tag">matrix</span>() 方法需要六个参数,包含数学函数,允许您:旋转、缩放、移动以及倾斜元素。</span><br></pre></td></tr></table></figure><p>3D(rotateX(),rotateY())</p><figure class="highlight css"><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="selector-tag">rotateX</span>():元素围绕其 <span class="selector-tag">X</span> 轴以给定的度数进行旋转。<span class="selector-tag">transform</span>:<span class="selector-tag">rotateX</span>(120<span class="selector-tag">deg</span>);</span><br><span class="line"><span class="selector-tag">rotateY</span>():元素围绕其 <span class="selector-tag">Y</span> 轴以给定的度数进行旋转。<span class="selector-tag">transform</span>:<span class="selector-tag">rotateY</span>(120<span class="selector-tag">deg</span>);</span><br></pre></td></tr></table></figure><p>多列</p><figure class="highlight css"><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="selector-tag">column-count</span>:属性规定元素应该被分隔的列数。</span><br><span class="line"><span class="selector-tag">column-gap</span>:属性规定列之间的间隔。</span><br><span class="line"><span class="selector-tag">column-rule</span> :属性设置列之间的宽度、样式和颜色规则。</span><br></pre></td></tr></table></figure><p>过渡及动画</p><h2 id="元素消失"><a class="markdownIt-Anchor" href="#元素消失"></a> 元素消失</h2><figure class="highlight css"><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">1. <span class="selector-tag">display</span><span class="selector-pseudo">:none</span>; </span><br><span class="line">2. <span class="selector-tag">visibility</span><span class="selector-pseudo">:hidden</span>; </span><br><span class="line">3. <span class="selector-tag">opacity</span>: 0;</span><br><span class="line">4. <span class="selector-tag">position</span>移到外部</span><br><span class="line">5. <span class="selector-tag">z-index</span>涂层遮盖等等</span><br></pre></td></tr></table></figure><h2 id="元素垂直居中"><a class="markdownIt-Anchor" href="#元素垂直居中"></a> 元素垂直居中</h2><figure class="highlight css"><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">1. (margin:auto) 定位为上下左右为0,margin:0/auto可以实现脱离文档流的居中.</span><br><span class="line">2. (margin负值法) position: absolute;top: 50%;left: 50%; 另 transform:translate(-50%,-50%) 或 margin-top:-(高度/2);margin-left:-(高度/2)</span><br><span class="line">3. (table) 父元素display: table-cell布局,子元素设置vertical-align:center/middle;</span><br><span class="line">4. (<span class="selector-tag">flex</span>) 父元素<span class="selector-tag">display</span><span class="selector-pseudo">:flex</span>,<span class="selector-tag">align-items</span><span class="selector-pseudo">:center</span>;<span class="selector-tag">justify-content</span>: <span class="selector-tag">center</span></span><br></pre></td></tr></table></figure><h2 id="05px-的线详见chrome-05px"><a class="markdownIt-Anchor" href="#05px-的线详见chrome-05px"></a> 0.5px 的线(详见<a href="https://segmentfault.com/a/1190000013998884?utm_source=tag-newest" target="_blank" rel="noopener">chrome 0.5px</a>)</h2><figure class="highlight css"><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">1. <span class="selector-tag">viewport</span></span><br><span class="line">2. <span class="selector-tag">boxshadow</span></span><br><span class="line">3. 线性渐变<span class="selector-tag">linear-gradient</span></span><br><span class="line">4. 使用<span class="selector-tag">scale</span>缩放,配合<span class="selector-tag">transform-origin</span>: 50% 100%:</span><br></pre></td></tr></table></figure><h2 id="实现一个两列等高布局讲讲思路"><a class="markdownIt-Anchor" href="#实现一个两列等高布局讲讲思路"></a> 实现一个两列等高布局,讲讲思路</h2><p>为了实现两列等高,可以给每列加上</p><figure class="highlight css"><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="selector-tag">padding-bottom</span><span class="selector-pseudo">:9999px</span>;</span><br><span class="line"><span class="selector-tag">margin-bottom</span><span class="selector-pseudo">:-9999px</span>;</span><br><span class="line">同时父元素设置<span class="selector-tag">overflow</span><span class="selector-pseudo">:hidden</span>;</span><br></pre></td></tr></table></figure><!-- rebuild by neat -->]]></content>
<summary type="html">
<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h1 id="css3"><a class="markdownIt-Anchor" href="#css3"></a> CSS3</h1><h2 i
</summary>
</entry>
<entry>
<title>Ubuntu 部署python项目(python3.7,nginx,Gunicorn)</title>
<link href="http://blog.wkaanig.cn/post/d295b30b.html"/>
<id>http://blog.wkaanig.cn/post/d295b30b.html</id>
<published>2020-04-13T07:40:55.532Z</published>
<updated>2020-04-17T15:50:33.720Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h1 id="1准备所需环境"><a class="markdownIt-Anchor" href="#1准备所需环境"></a> 1.准备所需环境</h1><h2 id="创建非root用户"><a class="markdownIt-Anchor" href="#创建非root用户"></a> 创建非root用户</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 在 root 用户下运行这条命令创建一个新用户newuser</span></span><br><span class="line">root@localhost:~<span class="comment"># useradd -m -s /bin/bash newuser</span></span><br><span class="line"><span class="comment"># 把新创建的用户加入超级权限组</span></span><br><span class="line">root@localhost:~<span class="comment"># usermod -a -G sudo newuser</span></span><br><span class="line"><span class="comment"># 为新用户设置密码</span></span><br><span class="line">root@localhost:~<span class="comment"># passwd newuser</span></span><br><span class="line">root@localhost:~<span class="comment"># su - newuser</span></span><br><span class="line">newuser@localhost:~$</span><br></pre></td></tr></table></figure><h2 id="安装-python3"><a class="markdownIt-Anchor" href="#安装-python3"></a> 安装 python3</h2><p>本文使用较为简单的环境安装,查找了很多博客都是将 python 安装包下载后解压安装,略显麻烦。</p><ol><li>以root用户或具有sudo访问权限的用户身份运行以下命令,以更新软件包列表并安装必备组件:</li></ol><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">sudo apt update <span class="comment">#此处为更新列表,更新软件用这个 sudo apt-get upgrade</span></span><br><span class="line">sudo apt install software-properties-common</span><br></pre></td></tr></table></figure><ol start="2"><li>将deadsnakes PPA添加到系统的来源列表中:</li></ol><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">sudo add-apt-repository ppa:deadsnakes/ppa </span><br><span class="line">sudo apt-get update <span class="comment">#重要,一定要更新</span></span><br><span class="line">sudo apt install python3.7 <span class="comment"># 安装你想使用的版本</span></span><br></pre></td></tr></table></figure><p><em>具体版本在<a href="ps://launchpad.net/~deadsnakes/+archive/ubuntu/ppa" target="_blank" rel="noopener">python版本 PPA</a>查看</em></p><h2 id="安装nginx"><a class="markdownIt-Anchor" href="#安装nginx"></a> 安装nginx</h2><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">sudo apt-get install nginx -y</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># nginx 配置 (位置:/etc/nginx/sites-enabled/你新建的配置)</span></span><br><span class="line">server {</span><br><span class="line"> listen 80;</span><br><span class="line"> server_name api.shop.wkaanig.cn;</span><br><span class="line"> access_log /var/<span class="built_in">log</span>/nginx/access.log;</span><br><span class="line"></span><br><span class="line"> location / {</span><br><span class="line"> proxy_pass http://127.0.0.1:5000;</span><br><span class="line"> proxy_set_header Host <span class="variable">$host</span>;</span><br><span class="line"> proxy_set_header X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="安装mysql"><a class="markdownIt-Anchor" href="#安装mysql"></a> 安装mysql</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></pre></td><td class="code"><pre><span class="line">sudo apt-get install mysql-server</span><br><span class="line">sudo apt-get install mysql-client</span><br><span class="line">sudo apt-get install libmysqlclient-dev</span><br><span class="line">mysql -u root -p <span class="comment">#测试数据库</span></span><br></pre></td></tr></table></figure><h2 id="安装-gunicorn-参数"><a class="markdownIt-Anchor" href="#安装-gunicorn-参数"></a> 安装 gunicorn (<a href="https://www.jianshu.com/p/69e75fc3e08e" target="_blank" rel="noopener">参数</a>)</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">pip install gunicorn</span><br><span class="line"><span class="comment"># -w 4 为 4个进程 </span></span><br><span class="line"><span class="comment"># -b 为 bind 监听端口</span></span><br><span class="line">gunicorn -w 4 -b 0.0.0.0:5000 入口文件名:app</span><br><span class="line"></span><br><span class="line"><span class="comment"># -D 后台运行</span></span><br><span class="line">gunicorn -D -b 0.0.0.0:5000 入口文件名:app</span><br><span class="line"></span><br><span class="line"><span class="comment"># access日志 </span></span><br><span class="line">gunicorn --timeout 20 --access-logfile access.log --error-logfile error.log -D -b 0.0.0.0:5000 入口文件名:app</span><br><span class="line"></span><br><span class="line"><span class="comment"># 查询 gunicorn 进程</span></span><br><span class="line">pstree -ap|grep gunicorn</span><br><span class="line"><span class="comment"># 关闭进程</span></span><br><span class="line"><span class="built_in">kill</span> -9 pid</span><br></pre></td></tr></table></figure><!-- rebuild by neat -->]]></content>
<summary type="html">
在 ubuntu 上准备项目及部署项目上线
</summary>
<category term="Python" scheme="http://blog.wkaanig.cn/categories/Python/"/>
<category term="Flask" scheme="http://blog.wkaanig.cn/tags/Flask/"/>
<category term="Django" scheme="http://blog.wkaanig.cn/tags/Django/"/>
</entry>
<entry>
<title>openCV 安装及代码优化</title>
<link href="http://blog.wkaanig.cn/post/d6084e0f.html"/>
<id>http://blog.wkaanig.cn/post/d6084e0f.html</id>
<published>2020-01-30T06:00:11.850Z</published>
<updated>2020-04-17T15:49:40.586Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><p>要安装OpenCV,只需cmd下的一条指令:</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip <span class="keyword">install</span> opencv-python</span><br></pre></td></tr></table></figure><p>pip是Python的包管理器,如果你还没安装Python,强烈推荐安装Anaconda,它包含了大量的科学计算包,不用后期一个个安装。即使你已经装了Python也没有影响,Anaconda相当于虚拟环境,互不干扰。</p><h1 id="评估代码运行时间性能分析"><a class="markdownIt-Anchor" href="#评估代码运行时间性能分析"></a> 评估代码运行时间(性能分析)</h1><figure class="highlight makefile"><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">import cv2</span><br><span class="line"></span><br><span class="line">start = cv2.getTickCount()</span><br><span class="line"><span class="comment"># 这里写测试代码...</span></span><br><span class="line">end = cv2.getTickCount()</span><br><span class="line">print((end - start) / cv2.getTickFrequency())</span><br></pre></td></tr></table></figure><p>这段代码就是用来测量程序运行时间的(单位:s),其中cv2.getTickCount()函数得到电脑启动以来的时钟周期数,cv2.getTickFrequency()返回你电脑的主频,前后相减再除以主频就是你代码的运行时间(这样解释并不完全准确,但能理解就行)。另外,也可以用Python中的time模块计时:</p><figure class="highlight lua"><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">import <span class="built_in">time</span></span><br><span class="line"></span><br><span class="line">start = <span class="built_in">time</span>.<span class="built_in">clock</span>()</span><br><span class="line"># 这里写测试代码...</span><br><span class="line"><span class="keyword">end</span> = <span class="built_in">time</span>.<span class="built_in">clock</span>()</span><br><span class="line"><span class="built_in">print</span>(<span class="keyword">end</span> - start)</span><br></pre></td></tr></table></figure><h1 id="优化原则"><a class="markdownIt-Anchor" href="#优化原则"></a> 优化原则</h1><p>数据元素少时用Python语法,数据元素多时用Numpy:</p><figure class="highlight ini"><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="attr">x</span> = <span class="number">10</span></span><br><span class="line"><span class="attr">z</span> = np.uint8([<span class="number">10</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment"># 尝试比较下面三句话各自的运行时间</span></span><br><span class="line"><span class="attr">y</span> = x * x * x <span class="comment"># (1.6410249677846285e-06)</span></span><br><span class="line"><span class="attr">y</span> = x**<span class="number">3</span> <span class="comment"># (2.461537451676943e-06)</span></span><br><span class="line"><span class="attr">y</span> = z * z * z <span class="comment"># 最慢 (3.1179474387907945e-05)</span></span><br></pre></td></tr></table></figure><p>所以Numpy的运行速度并不一定比Python本身语法快,元素数量较少时,请用Python本身格式。</p><p>尽量避免使用循环,尤其嵌套循环,因为极其慢!!!<br>优先使用OpenCV/Numpy中封装好的函数<br>尽量将数据向量化,变成Numpy的数据格式<br>尽量避免数组的复制操作</p><!-- rebuild by neat -->]]></content>
<summary type="html">
本教程编写时使用的软件版本是:OpenCV 3.x,Python 3.x。简介与安装(了解安装OpenCV-Python) | 代码性能优化
</summary>
<category term="python" scheme="http://blog.wkaanig.cn/categories/python/"/>
<category term="基础知识" scheme="http://blog.wkaanig.cn/tags/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"/>
</entry>
<entry>
<title>写博客必备神器</title>
<link href="http://blog.wkaanig.cn/post/914428cf.html"/>
<id>http://blog.wkaanig.cn/post/914428cf.html</id>
<published>2019-10-04T06:13:37.721Z</published>
<updated>2020-04-17T15:46:35.665Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><p>完成了博客的搭建之后,接下来就是是内容创作了。而创作的过程中,我们又会有一系列的问题,比如:</p><ul><li>我们用什么工具来编写文章呢?</li><li>怎么才能快速生成格式化的Markdown表格?</li><li>怎么样才能画出一些高逼格的图片呢?</li><li>这些图片的存储和处理怎么办呢?文章中的代码高亮如何实现呢?</li></ul><p>要解决这些问题其实并不难,无非就是引入不同的工具来帮助我们,好的工具可以让我们的创作事半功倍!</p><h2 id="markdown编辑器"><a class="markdownIt-Anchor" href="#markdown编辑器"></a> Markdown编辑器</h2><p>先来推荐一下我们要用的最重要的一个工具:Marddown编辑器。我们需要使用它来完成所有的创作内容,本人尝试了非常多的编辑器,最终锁定在下面这款Typora,因此推荐给大家。</p><ul><li>推荐工具:Typora</li><li>官方地址:<a href="https://www.typora.io/" target="_blank" rel="noopener">https://www.typora.io/</a></li><li>推荐理由:作为一款免费编辑器,可以说是相当的良心,是我目前所知道的最好用的免费编辑器了,没有之一!!!它支持多个主流的操作系统,不论你是Windows用户还是Mac用户,都能轻易的安装和使用它!除此之外,它还有多种不同的主题选择、导出一些常用格式(PDF、Word、HTML)等等非常有用的功能!</li></ul><figure class="image-bubble"><div class="img-lightbox"><div class="overlay"></div><img src="http://ww2.sinaimg.cn/large/006tNc79gy1g5tfro5t1dj30m80ggt9m.jpg" alt="img"></div><div class="image-caption">img</div></figure><h2 id="markdown表格生成器"><a class="markdownIt-Anchor" href="#markdown表格生成器"></a> Markdown表格生成器</h2><p>对于强迫症来说,写Markdown表格是一件很痛苦的事情,在语法对齐的问题上我真的是受尽了折磨,所以强烈推荐一个在线Markdown表格生成工具,它除了能快速生成格式化后的Markdown表格外,还支持导入各种数据,在线编辑,简直强大!</p><ul><li>推荐工具:Table Convert Online</li><li>官方地址:<a href="https://tableconvert.com/" target="_blank" rel="noopener">https://tableconvert.com/</a></li><li>推荐理由:作为一款免费在线工具,支持Excel、JSON、HTML、CSV甚至是从URL中提取HTML表格转为Markdown表格,多功能集一身,并且融合在一个界面,使用非常方便,不需要切换页面。还可以像编辑Excel一样编辑生成各种表格,不愧为表格中的瑞士军刀!</li></ul><figure class="image-bubble"><div class="img-lightbox"><div class="overlay"></div><img src="http://ww2.sinaimg.cn/large/006tNc79gy1g5tfrx6iz5j30yg0kudhs.jpg" alt="img"></div><div class="image-caption">img</div></figure><h2 id="画图工具"><a class="markdownIt-Anchor" href="#画图工具"></a> 画图工具</h2><p>对于我们这些写技术文章的博主来说,画画流程图、架构图是辅助描述文章内容的最佳途径,下面要推荐的ProcessOn就是目前我用得最多的画图工具。</p><ul><li>推荐工具:ProcessOn</li><li>官方地址:<a href="https://www.processon.com/i/55d92963e4b0b89615a284e2" target="_blank" rel="noopener">https://processon.com/</a></li><li>推荐理由:难得的国产在线图片编辑器,支持多人协作。同时,还有大量好看的图标支持,可以让我们的绘图更加生动!</li></ul><figure class="image-bubble"><div class="img-lightbox"><div class="overlay"></div><img src="http://ww1.sinaimg.cn/large/006tNc79gy1g5tfs42rkxj30m80e4wfc.jpg" alt="img"></div><div class="image-caption">img</div></figure><h2 id="图片存储"><a class="markdownIt-Anchor" href="#图片存储"></a> 图片存储</h2><p>可能有人会问,为什么要图片存储呢?我们直接存Wordpress或者Hexo的目录下不就好了吗?实际上,使用这些主要是为了经济性的考虑,随着访问量的增大,图片对于我们的虚拟主机或ECS的空间以及带宽消耗都会造成一定的压力,使用类似图床的平台可以帮我们减轻这些压力。</p><ul><li>推荐工具:外链工厂</li><li>官方地址:<a href="http://www.wailian.work/" target="_blank" rel="noopener">http://www.wailian.work/</a></li><li>推荐理由:简单好用、足够稳定,释放自己虚拟空间或虚拟主机的存储和带宽消耗,但是记得做好备份哦!</li></ul><figure class="image-bubble"><div class="img-lightbox"><div class="overlay"></div><img src="http://ww3.sinaimg.cn/large/006tNc79gy1g5tfseco1wj30m80cj752.jpg" alt="img"></div><div class="image-caption">img</div></figure><h2 id="代码高亮"><a class="markdownIt-Anchor" href="#代码高亮"></a> 代码高亮</h2><p>如果你跟我一样是一名程序猿,那么代码高亮是必备的。大多Hexo的主题中都包含了高亮插件,但是有些并没有,那么我们需要知道鼎鼎大名的hightlight.js。对于一些已经有这个插件的主题,也可以通过官网来做一些定制,没有的直接引入来使用即可。</p><ul><li>推荐工具:hightlight.js</li><li>官方地址:<a href="https://highlightjs.org/" target="_blank" rel="noopener">https://highlightjs.org/</a></li><li>推荐理由:适用于所有主流编程语言,兼容性好,多种多样的预设样式,总有一款适合你!</li></ul><!-- rebuild by neat -->]]></content>
<summary type="html">
完成了博客的搭建之后,接下来就是是内容创作了。而创作的过程中,我们又会有一系列的问题。
</summary>
<category term="杂项" scheme="http://blog.wkaanig.cn/categories/%E6%9D%82%E9%A1%B9/"/>
<category term="个人博客" scheme="http://blog.wkaanig.cn/tags/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/"/>
<category term="工具" scheme="http://blog.wkaanig.cn/tags/%E5%B7%A5%E5%85%B7/"/>
</entry>
<entry>
<title>Docker 远程访问及守护进程的配置和操作(04)</title>
<link href="http://blog.wkaanig.cn/post/82185f4b.html"/>
<id>http://blog.wkaanig.cn/post/82185f4b.html</id>
<published>2019-09-22T07:59:15.433Z</published>
<updated>2020-04-17T15:48:09.647Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h1 id="一-docker守护进程的配置和操作"><a class="markdownIt-Anchor" href="#一-docker守护进程的配置和操作"></a> 一、Docker守护进程的配置和操作</h1><h2 id="1查看守护进程的运行状态2种方式"><a class="markdownIt-Anchor" href="#1查看守护进程的运行状态2种方式"></a> 1.查看守护进程的运行状态(2种方式)</h2><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">1. ps -ef |grep docker </span><br><span class="line">2. sudo service docker status</span><br></pre></td></tr></table></figure><h2 id="2-service-命令管理守护进程"><a class="markdownIt-Anchor" href="#2-service-命令管理守护进程"></a> 2. service 命令管理守护进程</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></pre></td><td class="code"><pre><span class="line">service docker stop</span><br><span class="line">service docker start</span><br><span class="line">service docker restart</span><br></pre></td></tr></table></figure><h2 id="3docker-守护进程的启动选项"><a class="markdownIt-Anchor" href="#3docker-守护进程的启动选项"></a> 3.Docker 守护进程的启动选项</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></pre></td><td class="code"><pre><span class="line">docker -d [OPTIONS]</span><br><span class="line">-D,--debug</span><br><span class="line">-e,--<span class="built_in">exec</span>-driver=<span class="string">"native"</span></span><br><span class="line">-g,--graph=<span class="string">"/var/lib/docker"</span> </span><br><span class="line">--ice=<span class="literal">true</span></span><br><span class="line">-l,--<span class="built_in">log</span>-level=<span class="string">"info"</span> 日志级别</span><br><span class="line">--label=[]</span><br><span class="line">-p,--pidfile=<span class="string">"/var/run/docker.pid"</span></span><br><span class="line">服务器相关</span><br><span class="line">-G,--group=<span class="string">"docker"</span></span><br><span class="line">-H,--host=[] tcp://host:port|unix:///path/to/socket|fd://* or fd://socketfd 默认为:-H unix:///var/run/docker.sock</span><br><span class="line">--tls=<span class="literal">false</span></span><br><span class="line">--tlscacert=<span class="string">"/home/sven/.docker/ca.pem"</span></span><br><span class="line">--tlscert=<span class="string">"/home/sven/.docker/cert.pem"</span></span><br><span class="line">--tlskey=<span class="string">"/home/sven/.docker/key.pem"</span></span><br><span class="line">--tlsverify=<span class="literal">false</span></span><br><span class="line">...</span><br></pre></td></tr></table></figure><h2 id="4修改docker守护进程的启动配置文件"><a class="markdownIt-Anchor" href="#4修改docker守护进程的启动配置文件"></a> 4.修改Docker守护进程的启动配置文件</h2><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">vim /etc/default/docker</span><br><span class="line">DOCKER_OPTS=“启动选项命令”</span><br></pre></td></tr></table></figure><h1 id="二-docker的远程访问"><a class="markdownIt-Anchor" href="#二-docker的远程访问"></a> 二、Docker的远程访问</h1><p><em><strong>环境准备:</strong></em></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">另一台 Docker 的服务器</span><br><span class="line">修改 Docker 守护进程启动选项,区别服务器(即 --lable 参数 DOCKER_OPTS=<span class="string">"--lable name=server_01"</span>)</span><br><span class="line">保证Client API 与 Server API 版本一致</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">vim /etc/default/docker</span><br><span class="line">...</span><br><span class="line">DOCKER_OPTS=<span class="string">"--lable name=server_01 -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"</span> <span class="comment"># 可支持2375端口的远程访问,也可支持本地默认访问 </span></span><br><span class="line">...</span><br><span class="line">service docker restart</span><br></pre></td></tr></table></figure><p>Client 端</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></pre></td><td class="code"><pre><span class="line">vim /etc/default/docker</span><br><span class="line">...</span><br><span class="line">DOCKER_OPTS=<span class="string">"--lable name=server_02"</span></span><br><span class="line">...</span><br><span class="line">service docker restart</span><br><span class="line"><span class="comment"># 链接远程的 docker 服务器</span></span><br><span class="line"><span class="built_in">export</span> DOCKER_HOST=<span class="string">"tcp://Server的ip:2375"</span></span><br><span class="line">docker info</span><br><span class="line"><span class="comment"># 链接本地的 docker 服务器</span></span><br><span class="line"><span class="built_in">export</span> DOCKER_HOST=<span class="string">""</span></span><br><span class="line">docker info</span><br></pre></td></tr></table></figure><h1 id="三-容器的网络连接"><a class="markdownIt-Anchor" href="#三-容器的网络连接"></a> 三、容器的网络连接</h1><h2 id="1-自定义-docker-的网络接口"><a class="markdownIt-Anchor" href="#1-自定义-docker-的网络接口"></a> 1. 自定义 docker 的网络接口</h2><ol><li>安装网桥管理工具</li></ol><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">apt-get install bridge-untils</span><br><span class="line">brctl show</span><br></pre></td></tr></table></figure><ol start="2"><li>添加Linux虚拟网桥</li></ol><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">sudo brctl addbr br0</span><br><span class="line">sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0</span><br></pre></td></tr></table></figure><ol start="3"><li>更改守护进程启动配置</li></ol><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">DOCKER_OPS=<span class="string">"-b=br0"</span></span><br></pre></td></tr></table></figure><h2 id="2-容器之间互联"><a class="markdownIt-Anchor" href="#2-容器之间互联"></a> 2. 容器之间互联</h2><ol><li><p>允许所有容器之间互联<br>方法一:默认互通即 <code>DOCKER_OPS="--icc=true"</code> 无需修改任何配置<br>方法二:docker run link 指令</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">docker run --link=[CONTAINER_NAME]:4w[ALIAS(别名)] [IMAGE] [COMMAND]</span><br></pre></td></tr></table></figure></li><li><p>拒绝容器之间互联</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">DOCKER_OPS=<span class="string">"--icc=false"</span></span><br></pre></td></tr></table></figure></li><li><p>允许特定容器之间互联 (DOCKER_OPS 与 docker run link 配合使用)</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">DOCKER_OPS=<span class="string">"--icc=false --iptables=true"</span></span><br><span class="line">docker run --link=[CONTAINER_NAME]:[ALIAS(别名)] [IMAGE] [COMMAND]</span><br></pre></td></tr></table></figure></li></ol><h2 id="3-docker-外部访问链接"><a class="markdownIt-Anchor" href="#3-docker-外部访问链接"></a> 3. Docker 外部访问链接</h2><ol><li>允许端口映射访问</li></ol><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">ip_forward=<span class="literal">true</span>(默认)</span><br></pre></td></tr></table></figure><ol start="2"><li>限制ip访问容器(iptables 工具)</li></ol><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">sudo iptables -I DOCKER -s 起始ip -d 目标ip -p TCP --dport 80 -j DROP</span><br></pre></td></tr></table></figure><p><em>拓展:</em> <code>iptables</code> 的常用命令</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">sudo iptables -F 清除iptables设置</span><br><span class="line">sudo iptables -L -n 查看iptables的详情</span><br></pre></td></tr></table></figure><!-- rebuild by neat -->]]></content>
<summary type="html">
Docker 学习第四步,进阶网络访问
</summary>
<category term="Docker" scheme="http://blog.wkaanig.cn/categories/Docker/"/>
<category term="Linux" scheme="http://blog.wkaanig.cn/tags/Linux/"/>
</entry>
<entry>
<title>Docker 如何对镜像进行构建查看和删除等操作(03)</title>
<link href="http://blog.wkaanig.cn/post/ebc79fe5.html"/>
<id>http://blog.wkaanig.cn/post/ebc79fe5.html</id>
<published>2019-09-17T09:37:08.817Z</published>
<updated>2020-04-17T15:47:58.126Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h1 id="一-查看和删除镜像"><a class="markdownIt-Anchor" href="#一-查看和删除镜像"></a> 一、查看和删除镜像</h1><p>方法一:一般情况下镜像的存储地址为 <code>/var/lib/docker</code></p><p>方法二:通过<code>docker info</code> 查看镜像信息</p><h2 id="1-列出镜像"><a class="markdownIt-Anchor" href="#1-列出镜像"></a> 1. 列出镜像</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></pre></td><td class="code"><pre><span class="line">docker images [OPTSIONS] [REPOSITORY]</span><br><span class="line">-a ,--all</span><br><span class="line">-f , --filter=[]</span><br><span class="line">--no-trunc(使用截断的方式显示)</span><br><span class="line">-q,--quiet(只显示ID)</span><br></pre></td></tr></table></figure><h2 id="2-镜像标签和仓库"><a class="markdownIt-Anchor" href="#2-镜像标签和仓库"></a> 2. 镜像标签和仓库</h2><p>REPOSITORY 仓库(独立的镜像)<br>RESGISTRY 仓库(镜像存储服务)<br>TAG (ubuntu:14.04 ubuntu:latest)</p><h2 id="3-查看镜像"><a class="markdownIt-Anchor" href="#3-查看镜像"></a> 3. 查看镜像</h2><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">docker inspect [OPTIONS] CONTAINER|IMAGE [ CONTAINER|IMAGE...]</span><br></pre></td></tr></table></figure><h2 id="4-删除镜像"><a class="markdownIt-Anchor" href="#4-删除镜像"></a> 4. 删除镜像</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></pre></td><td class="code"><pre><span class="line">docker rmi [OPTIONS] IMAGE</span><br><span class="line">-f,--force 强制删除</span><br><span class="line">--no-prune (不会删除未打标签的父镜像)</span><br></pre></td></tr></table></figure><p><em><strong>扩展:docker 并没有删除多个镜像的操作</strong></em></p><p>删除所有 ubuntu 镜像 docker rmi $(docker images -q ubuntu)</p><h1 id="二-获取和推送镜像"><a class="markdownIt-Anchor" href="#二-获取和推送镜像"></a> 二、获取和推送镜像</h1><h2 id="1-查找镜像"><a class="markdownIt-Anchor" href="#1-查找镜像"></a> 1. 查找镜像</h2><p>方法一:<a href="https://hub.docker.com/" target="_blank" rel="noopener">Docker Hub</a>(需注册账户)<br>方法二:命令行搜索</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">docker search [OPTIONS] TERM</span><br><span class="line">-- automated (自动化构建镜像)</span><br><span class="line">--no-trunc (截断形式)</span><br><span class="line">-s,--stars=0 (评分)</span><br><span class="line">示例:docker search -s 3 ubuntu(搜索3星以上的 ubuntu 镜像)</span><br></pre></td></tr></table></figure><h2 id="2-拉取镜像"><a class="markdownIt-Anchor" href="#2-拉取镜像"></a> 2. 拉取镜像</h2><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">docker pull [OPTIONS] NAME [:TAG]</span><br><span class="line">-a,--all-tags (所有标记)</span><br></pre></td></tr></table></figure><p>使用–registry-mirror选项,添加国内镜像进行加速</p><ol><li>修改:<code>vim /etc/default/docker</code></li><li>添加:<code>DOCKER_OPTS="--registry-mirror=镜像地址"</code><br>我们这里使用<a href="https://www.daocloud.io" target="_blank" rel="noopener">daocloud</a>(需注册账户),使用加速器生成的链接配置以上的镜像地址</li><li>重新启动 docker 守护进程 <code>service docker restart</code></li><li>查看 docker 状态 <code>ps -ef |grep docker</code></li></ol><h2 id="3-推送镜像"><a class="markdownIt-Anchor" href="#3-推送镜像"></a> 3. 推送镜像</h2><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">docker push [OPTIONS] NAME [:TAG]</span><br></pre></td></tr></table></figure><h1 id="三-构建镜像"><a class="markdownIt-Anchor" href="#三-构建镜像"></a> 三、构建镜像</h1><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><br><span class="line">- 保存对容器的修改,并再次使用</span><br><span class="line">- 自定义镜像的能力</span><br><span class="line">- 以软件的形式打包并分发服务及其运行环境</span><br></pre></td></tr></table></figure><h2 id="方法一"><a class="markdownIt-Anchor" href="#方法一"></a> <strong>方法一</strong>:</h2><p><code>docker commit</code> 通过容器构建镜像</p><figure class="highlight pgsql"><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">docker <span class="keyword">commit</span> [<span class="keyword">OPTIONS</span>] CONTAINER [REPOSITORY]</span><br><span class="line">-a,<span class="comment">--author</span></span><br><span class="line">-m,<span class="comment">--message</span></span><br><span class="line">-p,<span class="comment">--pause (是否暂停正在运行的容器)</span></span><br></pre></td></tr></table></figure><p>示例:(用前面的 <code>web</code> 容器生成 <code>ubuntu/commit_test1</code>镜像,再生成以 <code>ubuntu/commit_test1</code> 镜像为基础的两个 <code>nginx_web</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></pre></td><td class="code"><pre><span class="line">root@wkaanig:~<span class="comment"># docker commit -a 'wkaanig' -m 'nginx' web ubuntu/commit_test1 # 将web容器构建成 ububtu/commit_test1 的镜像文件</span></span><br><span class="line">sha256:27b64732dde89f0f6f466e9dc0da7b06bdc7547cf37a878515b4b42167f2f657</span><br><span class="line">root@wkaanig:~<span class="comment"># docker images # 查看镜像</span></span><br><span class="line">REPOSITORY TAG IMAGE ID CREATED SIZE</span><br><span class="line">ubuntu/commit_test1 latest 27b64732dde8 About a minute ago 206MB</span><br><span class="line">ubuntu latest a2a15febcdf3 4 weeks ago 64.2MB</span><br><span class="line">hello-world latest fce289e99eb9 8 months ago 1.84kB</span><br><span class="line">root@wkaanig:~<span class="comment"># docker run -d --name nginx_web1 ubuntu/commit_test1 nginx -g "daemon off;" # 以前台方式运行镜像到 nginx_web1 的容器中</span></span><br><span class="line">43b432b814019b7e1ba111ef064bb800e986476e38e4947730c189511e7b1d49</span><br><span class="line">root@wkaanig:~<span class="comment"># docker ps</span></span><br><span class="line">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</span><br><span class="line">43b432b81401 ubuntu/commit_test1 <span class="string">"nginx -g 'daemon of…"</span> 6 seconds ago Up 5 seconds 80/tcp nginx_web1</span><br><span class="line">root@wkaanig:~<span class="comment"># docker run -d --name nginx_web2 -p 80 ubuntu/commit_test1 nginx -g "daemon off;" # 以前台方式运行镜像到 nginx_web2 的容器中 指定端口为80</span></span><br><span class="line">3674c7cef4f4f7e9c2d7040fd5dd2d8776f08761d7db3934dca5c23132f2b9af</span><br><span class="line">root@wkaanig:~<span class="comment"># docker ps # 查看镜像</span></span><br><span class="line">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</span><br><span class="line">3674c7cef4f4 ubuntu/commit_test1 <span class="string">"nginx -g 'daemon of…"</span> 8 seconds ago Up 7 seconds 0.0.0.0:32769->80/tcp nginx_web2</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">root@wkaanig:~<span class="comment"># curl http://127.0.0.1:32769 # 测试访问端口</span></span><br><span class="line"><html></span><br><span class="line"><head></span><br><span class="line"> <title>Nginx <span class="keyword">in</span> docker<title></span><br><span class="line"><head> </span><br><span class="line"><body></span><br><span class="line"> <h1>hello Docker</h1></span><br><span class="line"><body></span><br><span class="line"><html></span><br></pre></td></tr></table></figure><h2 id="方法二"><a class="markdownIt-Anchor" href="#方法二"></a> <strong>方法二</strong>:</h2><p><code>docker bulid</code> 通过<code>Dockerfile</code>文件构建</p><h3 id="1写入dockerfile-文件"><a class="markdownIt-Anchor" href="#1写入dockerfile-文件"></a> <strong>(1)写入dockerfile 文件</strong></h3><p><code>Dockerfile</code>文件内容:(基础指令必须存在,其余指令视情况而定)</p><ol><li>基础指令</li></ol><figure class="highlight dockerfile"><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"># 示例:dockerfile_01</span></span><br><span class="line"><span class="comment"># FROM <image>必须是已存在的镜像即基础镜像</span></span><br><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">14.04</span> </span><br><span class="line"></span><br><span class="line"><span class="comment"># MAINTAINER <name>指定镜像的作者信息,包含镜像所有者和联系信息</span></span><br><span class="line"><span class="keyword">MAINTAINER</span> wkaanig <span class="string">"wkaanig721@163.com"</span> </span><br><span class="line"><span class="comment"># RUN 指定当前镜像中运行的命令,有以下两种方式</span></span><br><span class="line"><span class="comment"># 1.RUN <command> (shell 模式 以 /bin/sh -c command 执行命令 例:RUN echo hello )</span></span><br><span class="line"><span class="comment"># 2.RUN["executable","param1","param2"] (exec 模式 例:RUN ["/bin/bash","-c","echo hello"]) </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get update </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get insatll -y nginx</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># EXPOSE <port> [<port>] 指定运行该镜像的容器使用的一个或多个端口 </span></span><br><span class="line"><span class="comment"># 出于安全考虑 docker 并不会打开端口 ,需要在运行中添加对端口的映射,即:-p 80</span></span><br><span class="line"><span class="comment"># 例:docker run -d --name nginx_web1 -p 80 ubuntu/commit_test1 nginx -g </span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">80</span></span><br></pre></td></tr></table></figure><ol start="2"><li>其余指令</li></ol><figure class="highlight dockerfile"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1.在容器执行时运行命令的指令 </span></span><br><span class="line"><span class="comment"># CMD 在容器运行中的指令 不同于RUN RUN在镜像构建中运行,CMD在容器运行中运行,RUN 可以覆盖 CMD</span></span><br><span class="line"><span class="comment"># 1.CMD ["executable","param1","param2"](exec 模式)</span></span><br><span class="line"><span class="comment"># 2.CMD command param1 param2 (shell 模式)</span></span><br><span class="line"><span class="comment"># 3.CMD["param1","param2"](作为ENTERPOINT指令的默认参数)</span></span><br><span class="line"><span class="comment"># 示例:dockerfile_02</span></span><br><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">14.04</span> </span><br><span class="line"><span class="keyword">MAINTAINER</span> wkaanig <span class="string">"wkaanig721@163.com"</span> </span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get update </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get insatll -y nginx</span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">80</span></span><br><span class="line"><span class="keyword">CMD</span><span class="bash"> [<span class="string">"/usr/sbin/nginx"</span>,<span class="string">"-g"</span>,<span class="string">"daemon off;"</span>]</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ENTERYPOINT 不会被docker RUN 命令所覆盖,若想覆盖可以使用docker run --enterpoint 覆盖</span></span><br><span class="line"><span class="comment"># 示例1:dockerfile_03</span></span><br><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">14.04</span> </span><br><span class="line"><span class="keyword">MAINTAINER</span> wkaanig <span class="string">"wkaanig721@163.com"</span> </span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get update </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get insatll -y nginx</span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">80</span></span><br><span class="line">ENTERYPOINT [<span class="string">"/usr/sbin/nginx"</span>,<span class="string">"-g"</span>,<span class="string">"daemon off;"</span>]</span><br><span class="line"><span class="comment"># 示例2:dockerfile_04 ENTERYPOINT 和 CMD 组合命令</span></span><br><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">14.04</span> </span><br><span class="line"><span class="keyword">MAINTAINER</span> wkaanig <span class="string">"wkaanig721@163.com"</span> </span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get update </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get insatll -y nginx</span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">80</span></span><br><span class="line">ENTERYPOINT [<span class="string">"/usr/sbin/nginx"</span>]</span><br><span class="line"><span class="keyword">CMD</span><span class="bash"> [<span class="string">"-g"</span>] <span class="comment"># 可被 docker run 命令覆盖</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 2.设置镜像的目录和文件</span></span><br><span class="line"><span class="comment"># ADD 与 COPY 的区别,ADD 包含类似tar的解压功能。如果单纯复制文件,Docker推荐使用COPY</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ADD <src>...<dest> 来源地址(本地的相对路径(推荐)或URL)和目标地址(镜像中的绝对路径)</span></span><br><span class="line"><span class="comment"># COPY <src>...<dest> 来源地址(本地的相对路径(推荐)或URL)和目标地址(镜像中的绝对路径)</span></span><br><span class="line"><span class="comment"># 示例:dockerfile_05</span></span><br><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">14.04</span> </span><br><span class="line"><span class="keyword">MAINTAINER</span> wkaanig <span class="string">"wkaanig721@163.com"</span> </span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get update </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get insatll -y nginx</span></span><br><span class="line"><span class="keyword">COPY</span><span class="bash"> index.html /usr/share/nginx/html/ <span class="comment"># 通过本地编写的 index.html(在 dockerfile 的同级目录下)替换 nginx 的默认页</span></span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">80</span></span><br><span class="line">ENTERYPOINT [<span class="string">"/usr/sbin/nginx"</span>,<span class="string">"-g"</span>,<span class="string">"daemon off;"</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># VOLUME ["/data"] 添加卷</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 3.镜像构建及容器运行中的环境设置</span></span><br><span class="line"><span class="comment"># WORKDIR /path/to/workdir 设置工作目录,enterpoint和cmd都会在这个目录下执行</span></span><br><span class="line"><span class="comment"># ENV <key>=<value> 指定环境</span></span><br><span class="line"><span class="comment"># USER daemon 指定用户模式</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 4.镜像触发器 </span></span><br><span class="line"><span class="comment"># ONBUILD [INSTRUCTION] 当一个镜像被其他镜像作为基础镜像时执行,在构建过程中插入</span></span><br><span class="line"><span class="comment"># 示例:dockerfile_06</span></span><br><span class="line"><span class="keyword">FROM</span> ubuntu:<span class="number">14.04</span></span><br><span class="line"><span class="keyword">MAINTAINER</span> wkaanig <span class="string">"wkaanig721@163.com"</span> </span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get update </span></span><br><span class="line"><span class="keyword">RUN</span><span class="bash"> apt-get insatll -y nginx</span></span><br><span class="line"><span class="keyword">ONBUILD</span> <span class="keyword">COPY</span><span class="bash"> index.html /usr/share/nginx/html/ <span class="comment"># 通过本地编写的 index.html(在 dockerfile 的同级目录下)替换 nginx 的默认页</span></span></span><br><span class="line"><span class="keyword">EXPOSE</span> <span class="number">80</span></span><br><span class="line">ENTERYPOINT [<span class="string">"/usr/sbin/nginx"</span>,<span class="string">"-g"</span>,<span class="string">"daemon off;"</span>]</span><br><span class="line"><span class="comment"># 注意:示例 dockerfile_06 的 ONBUILD 会在以该镜像为基础镜像构建的子镜像中执行,在本次构建过程中不会执行</span></span><br></pre></td></tr></table></figure><h3 id="2-docker-bulid-构建镜像"><a class="markdownIt-Anchor" href="#2-docker-bulid-构建镜像"></a> <strong>(2) docker bulid 构建镜像</strong></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></pre></td><td class="code"><pre><span class="line">docker bulid [OPTIONS] PATH|URL|- <span class="comment"># PATH和URL指的是dockerfile的路径</span></span><br><span class="line">--force-rm</span><br><span class="line">--no-cache</span><br><span class="line">--pull</span><br><span class="line">-q,--quiet</span><br><span class="line">--rm</span><br><span class="line">-t,--tag</span><br></pre></td></tr></table></figure><p>示例:</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">docker bulid -t=<span class="string">"wkaanig/docker_file_test1"</span> . <span class="comment"># 在当前文件夹下构建名为wkaanig/docker_file_test1 的镜像</span></span><br><span class="line">docker run -p 80 --name cmd_test1 -d wkaanig/docker_file_test1 <span class="comment"># 以 80 端口和守护模式运行该镜像的 cmd_test1 容器</span></span><br></pre></td></tr></table></figure><!-- rebuild by neat -->]]></content>
<summary type="html">
Docker 学习第三步,了解及操作镜像
</summary>
<category term="Docker" scheme="http://blog.wkaanig.cn/categories/Docker/"/>
<category term="Linux" scheme="http://blog.wkaanig.cn/tags/Linux/"/>
</entry>
<entry>
<title>Docker 在容器中部署静态网站(02)</title>
<link href="http://blog.wkaanig.cn/post/603eaf11.html"/>
<id>http://blog.wkaanig.cn/post/603eaf11.html</id>
<published>2019-09-17T08:34:17.888Z</published>
<updated>2020-04-17T15:47:49.184Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h2 id="docker-中-nginx-部署流程"><a class="markdownIt-Anchor" href="#docker-中-nginx-部署流程"></a> Docker 中 Nginx 部署流程</h2><p><em>设置端口映射</em></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">run [-P] [-p]</span><br><span class="line">-P,--publish-all(全部映射)</span><br><span class="line">示例:docker run -P -i -t ubuntu /bin/bash</span><br><span class="line">-p,--publish=[](指定映射)</span><br><span class="line">示例:docker run -p 80 -i -t ubuntu /bin/bash</span><br><span class="line">docker run -p 8080:80 -i -t ubuntu /bin/bash</span><br><span class="line">docker run -p 0.0.0.0:80 -i -t ubuntu /bin/bash</span><br><span class="line">docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash</span><br></pre></td></tr></table></figure><h3 id="1-创建映射-80-端口的交互式容器"><a class="markdownIt-Anchor" href="#1-创建映射-80-端口的交互式容器"></a> 1. 创建映射 80 端口的交互式容器</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">docker run -p 80 --name web -i -t ubuntu /bin/bash</span><br></pre></td></tr></table></figure><h3 id="2-安装-nginx"><a class="markdownIt-Anchor" href="#2-安装-nginx"></a> 2. 安装 Nginx</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">apt-get update(更新源)</span><br><span class="line">apt-get install -y nginx</span><br></pre></td></tr></table></figure><h3 id="3-安装文本编辑器-vim"><a class="markdownIt-Anchor" href="#3-安装文本编辑器-vim"></a> 3. 安装文本编辑器 vim</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">apt-get install -y vim</span><br></pre></td></tr></table></figure><h3 id="4-创建静态页面"><a class="markdownIt-Anchor" href="#4-创建静态页面"></a> 4. 创建静态页面</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></pre></td><td class="code"><pre><span class="line">mkdir -p /var/www/html</span><br><span class="line"><span class="built_in">cd</span> /var/www/html/</span><br><span class="line">vim index.html</span><br></pre></td></tr></table></figure><figure class="highlight html"><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="tag"><<span class="name">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Nginx in docker<span class="tag"><<span class="name">title</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span> </span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">h1</span>></span>hello Docker<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br></pre></td></tr></table></figure><h3 id="5-修改-nginx-配置文件"><a class="markdownIt-Anchor" href="#5-修改-nginx-配置文件"></a> 5. 修改 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></pre></td><td class="code"><pre><span class="line">whereis nginx</span><br><span class="line">ls /etc/nginx/sites-enabled (一般都在这个位置,视具体而定)</span><br><span class="line">vim /etc/nginx/sites-enabled/default</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></pre></td><td class="code"><pre><span class="line">server{</span><br><span class="line"> ...</span><br><span class="line"> root /var/www/html;</span><br><span class="line"> ...</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="6-运行-nginx"><a class="markdownIt-Anchor" href="#6-运行-nginx"></a> 6. 运行 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></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /</span><br><span class="line">nginx</span><br><span class="line">ps -ef (查看nginx运行状态)</span><br></pre></td></tr></table></figure><p>Ctrl+P Ctrl+Q (后台运行)</p><h3 id="7-验证网站访问"><a class="markdownIt-Anchor" href="#7-验证网站访问"></a> 7. 验证网站访问</h3><p>方法一:宿主机端口访问</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></pre></td><td class="code"><pre><span class="line">root@wkaanig:~<span class="comment"># docker port web</span></span><br><span class="line">80/tcp -> 0.0.0.0:32768</span><br><span class="line">root@wkaanig:~<span class="comment"># curl http://127.0.0.1:32768</span></span><br><span class="line"><html></span><br><span class="line"><head></span><br><span class="line"> <title>Nginx <span class="keyword">in</span> docker<title></span><br><span class="line"><head> </span><br><span class="line"><body></span><br><span class="line"> <h1>hello Docker</h1></span><br><span class="line"><body></span><br><span class="line"><html></span><br></pre></td></tr></table></figure><p>方法二:容器ip访问</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">root@wkaanig:~<span class="comment"># docker inspect web </span></span><br><span class="line">查找到 </span><br><span class="line"><span class="string">"Networks"</span>: {</span><br><span class="line">...</span><br><span class="line"> <span class="string">"IPAddress"</span>: <span class="string">"172.17.0.3"</span>,</span><br><span class="line">...</span><br><span class="line"> }</span><br><span class="line">root@wkaanig:~<span class="comment"># curl http://172.17.0.3</span></span><br><span class="line"><html></span><br><span class="line"><head></span><br><span class="line"> <title>Nginx <span class="keyword">in</span> docker<title></span><br><span class="line"><head> </span><br><span class="line"><body></span><br><span class="line"> <h1>hello Docker</h1></span><br><span class="line"><body></span><br><span class="line"><html></span><br></pre></td></tr></table></figure><h3 id="8-完善性测试"><a class="markdownIt-Anchor" href="#8-完善性测试"></a> 8. 完善性测试</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></pre></td><td class="code"><pre><span class="line">docker stop web </span><br><span class="line">docker start -i web</span><br><span class="line">ps -ef (发现nginx并未开启)</span><br><span class="line">docker <span class="built_in">exec</span> web nginx</span><br><span class="line">docker top web</span><br><span class="line">curl IP地址 (注意:此时ip地址及映射地址已经改变,按以上方法重新查看ip)</span><br></pre></td></tr></table></figure><!-- rebuild by neat -->]]></content>
<summary type="html">
Docker 学习第二步,简单的实战
</summary>
<category term="Docker" scheme="http://blog.wkaanig.cn/categories/Docker/"/>
<category term="Linux" scheme="http://blog.wkaanig.cn/tags/Linux/"/>
</entry>
<entry>
<title>Docker 入坑(01)</title>
<link href="http://blog.wkaanig.cn/post/5b3d2e5b.html"/>
<id>http://blog.wkaanig.cn/post/5b3d2e5b.html</id>
<published>2019-09-15T09:52:48.666Z</published>
<updated>2020-04-17T15:47:40.114Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h1 id="一-docker是什么"><a class="markdownIt-Anchor" href="#一-docker是什么"></a> 一、Docker是什么?</h1><p>Docker 依赖unix内核 运行在Linux上的容器不同于虚拟机,Docker 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,便可以实现虚拟化。 Docker改变了虚拟化的方式,使开发者可以直接将自己的成果放入Docker中进行管理。</p><h1 id="二-docker的技术简介"><a class="markdownIt-Anchor" href="#二-docker的技术简介"></a> 二、Docker的技术简介</h1><p><em>(每个容器都单独分配计算机进程、root文件系统、IP地址、cpu、内存等资源)</em></p><p><strong>Namespaces 命名空间</strong></p><ul><li>PID(Process ID)进程隔离</li><li>NET(Network)管理网络接口</li><li>IPC(IntePrcess Communication)管理跨进程通信的访问</li><li>MNT(Mount)挂载点(文件系统)</li><li>UTS(Unix Timesharing System)隔离内核和版本标识</li></ul><p><strong>Unix Control groups 控制组</strong></p><ul><li>资源限制</li><li>优先级设定</li><li>资源计量</li><li>资源控制</li></ul><p><strong>Docker 基于Control groups 分配计算机资源给各个容器,是一个通过联合加载技术形成的只读文件系统</strong>。</p><h1 id="三-安装dockerubuntu"><a class="markdownIt-Anchor" href="#三-安装dockerubuntu"></a> 三、安装Docker(Ubuntu)</h1><p>**方法一:*<em>需要检查 Ubuntu 内核版本是否支持 Docker,官方已经将安装docker的过程写入一个shell脚本中,我们只需要下载并执行这个脚本即可</em></p><ol><li>检查是否安装 curl (若安装可跳过)</li></ol><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">sudo apt-get install -y curl</span><br></pre></td></tr></table></figure><ol start="2"><li>获取脚本并安装(示例:Ubuntu的安装方式)</li></ol><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">curl -fsSL https://get.docker.com | sudo sh</span><br></pre></td></tr></table></figure><p><strong>方法二</strong>:命令行安装</p><ol><li>如果之前安装过docker,执行下面命令删除</li></ol><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">apt-get remove docker docker-engine docker.io</span><br><span class="line">sudo apt-get update</span><br></pre></td></tr></table></figure><ol start="2"><li>安装必要的软件包以允许apt通过HTTPS使用存储库,具体如下:</li></ol><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">sudo apt-get install apt-transport-https ca-certificates curl software-properties-common</span><br></pre></td></tr></table></figure><ol start="3"><li>添加GPG密钥,可以添加官方的和阿里的,我添加的阿里的,国内的快啊</li></ol><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><br><span class="line">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -</span><br><span class="line">// 阿里</span><br><span class="line">curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -</span><br></pre></td></tr></table></figure><p>添加完毕后可以执行以下命令验证:</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">sudo apt-key fingerprint 0EBFCD88</span><br></pre></td></tr></table></figure><p>正常情况下会输出如下内容,说明 Ok,继续:</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">pub rsa4096 2017-02-22 [SCEA]</span><br><span class="line"> 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88</span><br><span class="line">uid [ 未知 ] Docker Release (CE deb) <docker@docker.com></span><br><span class="line">sub rsa4096 2017-02-22 [S]</span><br></pre></td></tr></table></figure><ol start="4"><li>设定稳定仓储库,这一步我被坑了好久,具体参考 docker 配置仓储库时出错:无法安全地用该源进行更新,所以默认禁用该源,也可以不设置,不设置默认使用官方的,具体是:<code>deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable</code>同样可以用阿里 的镜像:设置命令如下:</li></ol><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">sudo add-apt-repository <span class="string">"deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu <span class="variable">$(lsb_release -cs)</span> stable"</span></span><br></pre></td></tr></table></figure><p>*注意:*其中的lsb_release -cs相当于一个函数,直接获取Ubuntu下的最新版本,设置完毕再次执行</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">sudo apt-get update</span><br></pre></td></tr></table></figure><ol start="5"><li>安装docker</li></ol><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">sudo apt-get -y install docker-ce</span><br></pre></td></tr></table></figure><p>也可以指定想安装 的docker版本,执行如下命令命令查看有哪些版本</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">apt-cache madison docker-ce</span><br></pre></td></tr></table></figure><p>输出如下:</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">docker-ce | 5:18.09.0~3-0~ubuntu-bionic | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages</span><br><span class="line">docker-ce | 18.06.1~ce~3-0~ubuntu | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages</span><br><span class="line">docker-ce | 18.06.0~ce~3-0~ubuntu | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages</span><br><span class="line">docker-ce | 18.03.1~ce~3-0~ubuntu | http://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages</span><br></pre></td></tr></table></figure><p>选择要安装的版本,执行</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">sudo apt-get install -y docker-ce=<VERSION></span><br></pre></td></tr></table></figure><p>安装完成 后执行</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">docker -v</span><br></pre></td></tr></table></figure><p>如果正常输出说明安装成功</p><h1 id="四-非root用户使用docker"><a class="markdownIt-Anchor" href="#四-非root用户使用docker"></a> 四、非root用户使用Docker</h1><p><em>非root用户使用docker会异常卡顿,官方推荐了一种非root用户使用的方式</em></p><ol><li>添加docker 用户组</li></ol><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">sudo groupadd docker</span><br></pre></td></tr></table></figure><ol start="2"><li>将当前用户添加到用户组中</li></ol><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">sudo gpasswd -a <span class="string">'你的用户名'</span> docker</span><br></pre></td></tr></table></figure><ol start="3"><li>重启 docker</li></ol><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">sudo service docker restart</span><br></pre></td></tr></table></figure><ol start="4"><li>运行 docker 命令</li></ol><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">docker version</span><br></pre></td></tr></table></figure><p><em>注意:需注销当前用户重新登录,不然会报错(FATA[0000])!</em></p><h1 id="五-容器的基本操作"><a class="markdownIt-Anchor" href="#五-容器的基本操作"></a> 五、 容器的基本操作</h1><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">docker run IMAGE [COMMAND] [ARG..](启动命令格式)</span><br><span class="line">例:docker run ubuntu <span class="built_in">echo</span> <span class="string">'hello world'</span></span><br><span class="line">root@wkaanig:~<span class="comment"># docker run ubuntu echo 'hello world'</span></span><br><span class="line">hello world</span><br></pre></td></tr></table></figure><h2 id="1-启动交互式命令只执行一次"><a class="markdownIt-Anchor" href="#1-启动交互式命令只执行一次"></a> 1. 启动交互式命令(只执行一次)</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></pre></td><td class="code"><pre><span class="line">docker run -i-t IMAGE /bin/bash (启动交互式命令 -i --interactive 标准服务 -t --tty 打开tty终端)</span><br><span class="line">例:docker run -i -t ubantu /bin/bash</span><br><span class="line">root@wkaanig:~<span class="comment"># docker run -i -t ubuntu /bin/bash</span></span><br><span class="line">root@72328d172f8f:/<span class="comment"># ps -ef</span></span><br><span class="line">UID PID PPID C STIME TTY TIME CMD</span><br><span class="line">root 1 0 2 07:40 pts/0 00:00:00 /bin/bash</span><br><span class="line">root 10 1 0 07:40 pts/0 00:00:00 ps -ef</span><br><span class="line">root@72328d172f8f:/<span class="comment"># exit </span></span><br><span class="line"><span class="built_in">exit</span></span><br></pre></td></tr></table></figure><h2 id="2-查看容器"><a class="markdownIt-Anchor" href="#2-查看容器"></a> 2. 查看容器</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></pre></td><td class="code"><pre><span class="line">docker ps [-a] [-l](-a 所有的容器 -l 最新的容器)</span><br><span class="line">docker inspect <span class="string">"你想查询的 CONTAINER ID"</span> (查看详情)</span><br><span class="line">示例:root@wkaanig:~<span class="comment"># docker ps -a</span></span><br><span class="line">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</span><br><span class="line">81046a796b82 ubuntu <span class="string">"echo 'hello world'"</span> 3 minutes ago Exited (0) 3 minutes ago dazzling_hugle</span><br><span class="line">72328d172f8f ubuntu <span class="string">"/bin/bash"</span> 4 minutes ago Exited</span><br></pre></td></tr></table></figure><h2 id="3-自定义容器名"><a class="markdownIt-Anchor" href="#3-自定义容器名"></a> 3. 自定义容器名</h2><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">docker run --name=自定义名 -i -t IMAGE /bin/bash</span><br><span class="line">查询:docker inspect 自定义名</span><br></pre></td></tr></table></figure><h2 id="4-重新启动停止的容器"><a class="markdownIt-Anchor" href="#4-重新启动停止的容器"></a> 4. 重新启动停止的容器</h2><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">docker start [-i] 容器名</span><br></pre></td></tr></table></figure><h2 id="5-删除已停止的容器"><a class="markdownIt-Anchor" href="#5-删除已停止的容器"></a> 5. 删除已停止的容器</h2><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">docker rm 容器名</span><br></pre></td></tr></table></figure><h2 id="小结"><a class="markdownIt-Anchor" href="#小结"></a> 小结</h2><figure class="highlight stylus"><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">docker run -<span class="selector-tag">i</span> -t --name</span><br><span class="line">docker ps -<span class="selector-tag">a</span> -l</span><br><span class="line">docker inspect</span><br><span class="line">docker start -i</span><br><span class="line">docker start -i</span><br><span class="line">docker rm</span><br></pre></td></tr></table></figure><h1 id="六-守护式容器"><a class="markdownIt-Anchor" href="#六-守护式容器"></a> 六、守护式容器</h1><h2 id="1-以守护形式运行容器"><a class="markdownIt-Anchor" href="#1-以守护形式运行容器"></a> 1. 以守护形式运行容器</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></pre></td><td class="code"><pre><span class="line">docker run -i -t IMAGE /bin/bash</span><br><span class="line">Ctrl+P Ctrl+Q (使容器后台运行)</span><br><span class="line">示例:root@wkaanig:~<span class="comment"># docker run -i -t ubuntu /bin/bash</span></span><br><span class="line">root@7b296d75cd4b:/<span class="comment"># root@wkaanig:~# docker ps</span></span><br><span class="line">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</span><br><span class="line">7b296d75cd4b ubuntu <span class="string">"/bin/bash"</span> 15 seconds ago Up 14 seconds busy_boyd</span><br></pre></td></tr></table></figure><h2 id="2-附加到运行中的容器即将-docker-容器放置前台运行"><a class="markdownIt-Anchor" href="#2-附加到运行中的容器即将-docker-容器放置前台运行"></a> 2. 附加到运行中的容器(即将 docker 容器放置前台运行)</h2><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">docker attach 容器名(ID 或 Name)</span><br></pre></td></tr></table></figure><h2 id="3-启动守护式容器以后台的方式"><a class="markdownIt-Anchor" href="#3-启动守护式容器以后台的方式"></a> 3. 启动守护式容器(以后台的方式)</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></pre></td><td class="code"><pre><span class="line">docker run -d IMAGE [COMMAND] [ARG..]</span><br><span class="line">示例:root@wkaanig:~<span class="comment"># docker run --name dc1 -d ubuntu /bin/sh -c "while true;do echo hello word;sleep 1;done"</span></span><br><span class="line">df0b3043010d986371a4a9d94fa72f28fddc4f69a38d89690078ced9cca528cb</span><br><span class="line">root@wkaanig:~<span class="comment"># docker ps</span></span><br><span class="line">CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES</span><br><span class="line">df0b3043010d ubuntu <span class="string">"/bin/sh -c 'while t…"</span> 10 seconds ago Up 9 seconds dc1</span><br></pre></td></tr></table></figure><h2 id="4-查看容器的运行情况即日志"><a class="markdownIt-Anchor" href="#4-查看容器的运行情况即日志"></a> 4. 查看容器的运行情况(即日志)</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></pre></td><td class="code"><pre><span class="line">docker logs [-f] [-t] [--tail] 容器名</span><br><span class="line">-f --follows 跟踪</span><br><span class="line">-t --timestamps 时间戳</span><br><span class="line">--tail=<span class="string">"all"</span> 日志数量</span><br><span class="line">示例:</span><br><span class="line">root@wkaanig:~<span class="comment"># docker logs -ft --tail=0 dc1</span></span><br><span class="line">2019-09-17T08:19:57.987090981Z hello word</span><br><span class="line">2019-09-17T08:19:58.988018019Z hello word</span><br></pre></td></tr></table></figure><h2 id="5-查看容器内进程"><a class="markdownIt-Anchor" href="#5-查看容器内进程"></a> 5. 查看容器内进程</h2><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">docker top 容器名</span><br></pre></td></tr></table></figure><h2 id="6-在运行中的容器内启动新进程"><a class="markdownIt-Anchor" href="#6-在运行中的容器内启动新进程"></a> 6. 在运行中的容器内启动新进程</h2><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">docker <span class="built_in">exec</span> [-d] [-i] [-t] 容器名 [COMMAND] [ARG...]</span><br></pre></td></tr></table></figure><h2 id="7-停止守护式容器"><a class="markdownIt-Anchor" href="#7-停止守护式容器"></a> 7. 停止守护式容器</h2><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">docker stop 容器名</span><br><span class="line">docker <span class="built_in">kill</span> 容器名 (快速停止)</span><br></pre></td></tr></table></figure><h2 id="小结-2"><a class="markdownIt-Anchor" href="#小结-2"></a> 小结</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></pre></td><td class="code"><pre><span class="line">Ctrl+P Ctrl+Q</span><br><span class="line">docker run -d</span><br><span class="line">docker logs</span><br><span class="line">docker top</span><br><span class="line">docker <span class="built_in">exec</span></span><br><span class="line">docker stop/<span class="built_in">kill</span></span><br></pre></td></tr></table></figure><!-- rebuild by neat -->]]></content>
<summary type="html">
Docker 学习第一步,了解 Docker
</summary>
<category term="Docker" scheme="http://blog.wkaanig.cn/categories/Docker/"/>
<category term="Linux" scheme="http://blog.wkaanig.cn/tags/Linux/"/>
</entry>
<entry>
<title>算法分析</title>
<link href="http://blog.wkaanig.cn/post/d68e5e2f.html"/>
<id>http://blog.wkaanig.cn/post/d68e5e2f.html</id>
<published>2019-09-11T12:04:39.628Z</published>
<updated>2020-04-17T15:46:19.658Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h1 id="算法的时间性能分析"><a class="markdownIt-Anchor" href="#算法的时间性能分析"></a> 算法的时间性能分析</h1><p><em>通常有两种衡量算法时间性能的方法</em></p><ul><li>事后统计法</li><li>事前估算法</li></ul><h2 id="算法时间分析复杂度"><a class="markdownIt-Anchor" href="#算法时间分析复杂度"></a> 算法时间分析复杂度</h2><ol><li>计算算法的频度 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>T</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span></span></span></span></li></ol><p>求出算法所有<code>原操作</code>的执行次数。</p><ol start="2"><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>T</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mi mathvariant="normal">用</mi><mi>O</mi><mi mathvariant="normal">表</mi><mi mathvariant="normal">示</mi></mrow><annotation encoding="application/x-tex">T(n)用O表示</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mord cjk_fallback">用</span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mord cjk_fallback">表</span><span class="mord cjk_fallback">示</span></span></span></span><br><em>不同的时间复杂度存在以下关系:</em></li></ol><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo><mo><</mo><mi>O</mi><mo stretchy="false">(</mo><msub><mo><mi>log</mi><mo></mo></mo><mn>2</mn></msub><mi>n</mi><mo stretchy="false">)</mo><mo><</mo><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo><</mo><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><msub><mo><mi>log</mi><mo></mo></mo><mn>2</mn></msub><mi>n</mi><mi mathvariant="normal">)</mi><mo><</mo><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo><mo><</mo><mi>O</mi><mo stretchy="false">(</mo><mn>2</mn><mi>n</mi><mo stretchy="false">)</mo><mo><</mo><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">!</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(1) < O(\log_2n)< O(n) < O(n\log_2n) < O(n^2) < O(2n) < O(n!)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mop"><span class="mop">lo<span style="margin-right:.01389em">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.20696799999999996em"><span style="top:-2.4558600000000004em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.24414em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mop"><span class="mop">lo<span style="margin-right:.01389em">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.20696799999999996em"><span style="top:-2.4558600000000004em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.24414em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord mathdefault">n</span><span class="mord cjk_fallback">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1.1141079999999999em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.8641079999999999em"><span style="top:-3.113em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord">2</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel"><</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">!</span><span class="mclose">)</span></span></span></span></span></p><ol start="3"><li>简化的算法时间复杂度分析<br>找出最深的语句分析频度</li></ol><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>T</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><msup><mi>n</mi><mn>2</mn></msup><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><msup><mi>n</mi><mn>2</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T(n) = n^2=O(n^2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:.8641079999999999em;vertical-align:0"></span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.8641079999999999em"><span style="top:-3.113em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1.1141079999999999em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:.8641079999999999em"><span style="top:-3.113em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><ol start="4"><li>时间复杂度的求和、求积定理<br>为了计算算法的时间复杂度,有以下两个定理。<br><code>求和定理</code>:假设 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mn>1</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T_1(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mn>2</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T_2(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span></span></span></span>是程序段<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>P</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">P_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>、<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>P</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">P_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>的执行时间,并且<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mn>1</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T_1(n)=O(f(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:.10764em">f</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mn>2</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T_2(n)=O(g(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:.03588em">g</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span>,那么先执行<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>P</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">P_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>,再执行<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>P</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">P_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>的总执行时间<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mn>1</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>+</mo><msub><mi>T</mi><mn>2</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>M</mi><mi>A</mi><mi>X</mi><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo separator="true">,</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T_1(n)+T_2(n)=O(MAX(f(n),g(n)))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:.10903em">M</span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:.07847em">X</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:.10764em">f</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:.16666666666666666em"></span><span class="mord mathdefault" style="margin-right:.03588em">g</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span>。<br><code>求积定理</code>:假设 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mn>1</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T_1(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mn>2</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T_2(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span></span></span></span>是程序段<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>P</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">P_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>、<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>P</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">P_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:.83333em;vertical-align:-.15em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span></span></span></span>的执行时间,并且<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mn>1</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T_1(n)=O(f(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:.10764em">f</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mn>2</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T_2(n)=O(g(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:.03588em">g</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span>,那么<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>T</mi><mn>1</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>×</mo><msub><mi>T</mi><mn>2</mn></msub><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>f</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>×</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T_1(n)\times T_2(n)=O(f(n)\times g(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">×</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord"><span class="mord mathdefault" style="margin-right:.13889em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:.30110799999999993em"><span style="top:-2.5500000000000003em;margin-left:-.13889em;margin-right:.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:.10764em">f</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2222222222222222em"></span><span class="mbin">×</span><span class="mspace" style="margin-right:.2222222222222222em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.03588em">g</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span></span></span></span>。</li></ol><h1 id="算法空间性能分析"><a class="markdownIt-Anchor" href="#算法空间性能分析"></a> 算法空间性能分析</h1><p>算法空间复杂度是对一个算法在运行过程中占用的存储空间大小的量度。只需考虑临时空间,不必考虑形参空间,形参空间会在调用该算法的算法中考虑。一般也作为问题的规模n的函数,以数量级形式给出,记作:</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>S</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo>=</mo><mi>O</mi><mo stretchy="false">(</mo><mi>g</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">S(n) = O(g(n))</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.05764em">S</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mspace" style="margin-right:.2777777777777778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:.2777777777777778em"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-.25em"></span><span class="mord mathdefault" style="margin-right:.02778em">O</span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:.03588em">g</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mclose">)</span><span class="mclose">)</span></span></span></span></span></p><!-- rebuild by neat -->]]></content>
<summary type="html">
算法分析就是分析算法占用计算机资源的多少,主要分析算法的时空性能以改进算法。
</summary>
<category term="算法" scheme="http://blog.wkaanig.cn/categories/%E7%AE%97%E6%B3%95/"/>
<category term="基础知识" scheme="http://blog.wkaanig.cn/tags/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"/>
</entry>
<entry>
<title>数据结构是什么?</title>
<link href="http://blog.wkaanig.cn/post/8ca0dce9.html"/>
<id>http://blog.wkaanig.cn/post/8ca0dce9.html</id>
<published>2019-09-11T10:06:19.645Z</published>
<updated>2020-04-17T15:47:14.361Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h1 id="数据结构定义"><a class="markdownIt-Anchor" href="#数据结构定义"></a> 数据结构定义</h1><ol><li>数据的逻辑结构</li><li>数据的存储结构(物理结构)</li><li>数据的运算</li></ol><h2 id="逻辑结构"><a class="markdownIt-Anchor" href="#逻辑结构"></a> 逻辑结构</h2><ul><li>表示<ul><li>图表表示</li><li>二原组表示 B = (D, R)</li></ul></li><li>类型<ul><li>集合</li><li>线性结构</li><li>树形结构</li><li>图形结构</li></ul></li></ul><figure class="highlight c"><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><br><span class="line">B = ( D, R )</span><br><span class="line">D = {a, b, c, d}</span><br><span class="line">R = { r } </span><br><span class="line">r = {<a, b>,<a, c>,<a, d>}</span><br><span class="line"># 图形结构</span><br><span class="line">B = ( D, R )</span><br><span class="line">D = {a, b, c, d}</span><br><span class="line">R = { r } </span><br><span class="line">r = {(a, b),(a, c),(b, c)}</span><br></pre></td></tr></table></figure><h2 id="存储结构"><a class="markdownIt-Anchor" href="#存储结构"></a> 存储结构</h2><ul><li>顺序存储 (dict)</li><li>链式存储 (*next)</li><li>索引存储 (key, address,查找效率高,需建立索引表)</li><li>哈希(散列)存储(哈希函数计算出存储地址,只对数据进行存储,不对逻辑关系存储)</li></ul><h2 id="数据运算"><a class="markdownIt-Anchor" href="#数据运算"></a> 数据运算</h2><p>常用的运算有检索、插入、删除、更新和排序等。</p><table><thead><tr><th style="text-align:center">运算定义</th><th style="text-align:center"></th><th style="text-align:center">运算实现</th></tr></thead><tbody><tr><td style="text-align:center">逻辑结构</td><td style="text-align:center">映射=></td><td style="text-align:center">存储结构</td></tr></tbody></table><h2 id="数据类型和抽象类型"><a class="markdownIt-Anchor" href="#数据类型和抽象类型"></a> 数据类型和抽象类型</h2><ul><li>数据类型<ul><li>C/C++ 常用的数据类型<ul><li>基本数据类型(<code>int</code>, <code>short int</code>, <code>long int</code>, <code>unsigned int</code>, <code>bool</code>, <code>float</code>, <code>double</code>, <code>char</code>)</li><li>指针类型(<code>int i,*p;</code> i 是整型变量,p 是指针变量。<code>&i</code>表示变量 i 的地址,将 p 指向 i 的运算为<code>p=&i</code>。<code>*p</code>是取 p 所指变量的值。)</li><li>数组类型 (<code>int a[10]</code>)</li><li>结构体类型</li><li>共用体类型(共享存储单元)</li></ul></li><li>存储空间分配<ul><li>静态分配方式(<code>int a[10];</code>)</li><li>动态分配方式(用<code>malloc()</code>函数为指针变量分配连续的空间,不需要时用<code>free(p)</code>释放p所指向的空间。)</li></ul></li></ul></li></ul><figure class="highlight c"><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><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Test</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line"> <span class="keyword">int</span> no;</span><br><span class="line"> <span class="keyword">int</span> age;</span><br><span class="line">};</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Test</span> <span class="title">t</span>;</span> </span><br><span class="line">t.no=<span class="number">10</span>;</span><br><span class="line"># 共用体类型</span><br><span class="line"><span class="keyword">union</span> Test1</span><br><span class="line">{</span><br><span class="line"> <span class="keyword">short</span> <span class="keyword">int</span> n;</span><br><span class="line"> <span class="keyword">char</span> ch[<span class="number">2</span>];</span><br><span class="line">};</span><br><span class="line"><span class="keyword">union</span> Test1 u;</span><br><span class="line">u.n = <span class="number">12</span>;</span><br></pre></td></tr></table></figure><figure class="highlight c"><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><br><span class="line"><span class="keyword">char</span> *p;</span><br><span class="line">p = (<span class="keyword">char</span> *)<span class="built_in">malloc</span>(<span class="number">10</span> * <span class="keyword">sizeof</span>(<span class="keyword">char</span>)); <span class="comment">// p 为指针变量属于自动变量由系统自动分配和释放,(char *) 转化为字符指针</span></span><br><span class="line"><span class="built_in">strcpy</span>(p,<span class="string">"China"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%c\n"</span>,*p); <span class="comment">// 输出C</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%s\n"</span>,p); <span class="comment">// 输出China</span></span><br><span class="line"><span class="built_in">free</span>(p);</span><br></pre></td></tr></table></figure><ul><li>抽象类型(Abstract Data Type)<br><em>抽象类型有两个重要特征,数据抽象和数据封装。抽象类型由数据逻辑结构和运算定义两部分组成。</em></li></ul><table><thead><tr><th style="text-align:center">ADT</th><th style="text-align:center"></th><th style="text-align:center">ADT的实现</th></tr></thead><tbody><tr><td style="text-align:center">运算定义</td><td style="text-align:center"></td><td style="text-align:center">运算实现</td></tr><tr><td style="text-align:center">逻辑结构</td><td style="text-align:center">映射=></td><td style="text-align:center">存储结构</td></tr></tbody></table><p><strong>示例</strong></p><figure class="highlight c"><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">ADT 抽象数据类型名(例:Complex)</span><br><span class="line">{数据对象:</span><br><span class="line">D = {e1,e2|e1,e2 均为实数}</span><br><span class="line">数据关系:</span><br><span class="line">R = {<e1,e2>|e1 是实数部分,e2 是虚数部分}</span><br><span class="line">基本运算:</span><br><span class="line">AssingComplex(&z,v1,v2):构造复数 z,实部 v1 、虚部v2。</span><br><span class="line">DestoryComplex(&z):销毁复数</span><br><span class="line">GetReal(z,&real):用 real 返回 z 的实部</span><br><span class="line">GetImag(z,&imag):用 imag 返回 z 的虚部</span><br><span class="line">Add(z1,z2,&sum):用 sum 返回 z1,z2 相加的结果</span><br><span class="line">}</span><br></pre></td></tr></table></figure><!-- rebuild by neat -->]]></content>
<summary type="html">
什么是数据结构?又有哪些用处
</summary>
<category term="数据结构" scheme="http://blog.wkaanig.cn/categories/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
<category term="基础知识" scheme="http://blog.wkaanig.cn/tags/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"/>
</entry>
<entry>
<title>Hexo 新建及发布文章</title>
<link href="http://blog.wkaanig.cn/post/5dd1c26f.html"/>
<id>http://blog.wkaanig.cn/post/5dd1c26f.html</id>
<published>2019-09-10T13:15:36.618Z</published>
<updated>2020-04-17T15:55:24.904Z</updated>
<content type="html"><</span><br><span class="line">需要安装 hexo-asset-image 并改写(有bug)</span><br></pre></td></tr></table></figure><p>详情及解决办法详见<a href="https://blog.csdn.net/xjm850552586/article/details/84101345" target="_blank" rel="noopener">hexo引用本地图片无法显示</a></p><h2 id="关于中自定义-url"><a class="markdownIt-Anchor" href="#关于中自定义-url"></a> 关于中自定义 URL</h2><p>详情看 <a href="https://blog.csdn.net/yanzi1225627/article/details/77761488" target="_blank" rel="noopener">hexo链接持久化终极解决之道</a></p><!-- rebuild by neat -->]]></content>
<summary type="html">
前面已经搭建好了Hexo博客,并成功发布到了Github上面,但是怎么才能把新写的文章发布上去呢?
</summary>
<category term="Hexo" scheme="http://blog.wkaanig.cn/categories/Hexo/"/>
<category term="杂项" scheme="http://blog.wkaanig.cn/tags/%E6%9D%82%E9%A1%B9/"/>
</entry>
<entry>
<title>Hexo Github-Page 搭建及部署个人博客</title>
<link href="http://blog.wkaanig.cn/post/48da8957.html"/>
<id>http://blog.wkaanig.cn/post/48da8957.html</id>
<published>2019-09-10T12:34:53.827Z</published>
<updated>2020-04-17T15:49:07.466Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h2 id="github-仓库"><a class="markdownIt-Anchor" href="#github-仓库"></a> Github 仓库</h2><ul><li><p>首先你必须有一个 github 账号</p></li><li><p>然后新建一个仓库,这一有第一个坑,我之前用了不同于 github 用户名(Hugking)来作为项目名称(<a href="http://wkaanig.github.io" target="_blank" rel="noopener">wkaanig.github.io</a>),一直没能搭建成功,后来看到其他大牛的经验,才发现项目名一定要是用户名(Hugking).github.io 的形式(<a href="http://README.md" target="_blank" rel="noopener">README.md</a> 可选可不选)</p></li><li><p>在 github 中 setting 添加生成页面的选项 Source 选择 master branch</p><p><em>注意:</em><br>如果你之前没有用 git 关联过自己的 github 库,需要配置 SSH 等参数,否则无法成功,这部分搜 git 就有很多相关教程</p></li></ul><h2 id="安装前提"><a class="markdownIt-Anchor" href="#安装前提"></a> 安装前提</h2><p>hexo 有中文的文档,这一点非常方便,但是在安装过程中还是很容易有疏忽的地方,导致安装失败。<br>安装 Hexo 之前,必须保证自己的电脑中已经安装好了 Node.js 和 Git。因为这两个软件我之前都安装过,这里就不重复安装过程了,检验方式如下:</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"><span class="variable">$git</span> --version</span><br><span class="line"><span class="variable">$node</span> --v</span><br></pre></td></tr></table></figure><h2 id="安装-hexo"><a class="markdownIt-Anchor" href="#安装-hexo"></a> 安装 Hexo</h2><p>安装好 node.js 和 git 后,可以通过 npm 来安装 Hexo。</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">npm install -g hexo-cli</span><br><span class="line">hexo v <span class="comment"># 查看版本</span></span><br><span class="line">npm install hexo-deployer-git --save <span class="comment"># 安装 git 插件</span></span><br></pre></td></tr></table></figure><h2 id="初始化"><a class="markdownIt-Anchor" href="#初始化"></a> 初始化</h2><p>之后就可以在电脑里新建一个文件夹来作为存放博客全部内容。我们直接用 hexo 命令来初始化文件夹:</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">hexo init <folder></span><br><span class="line"><span class="built_in">cd</span> <folder></span><br><span class="line">npm install</span><br></pre></td></tr></table></figure><p><code><folder></code>就是文件夹的名字在创建的时候 ,文件夹初始化已经把需要的内容都下载进去了。</p><p><em>注意:</em><br><code><folder></code>必须是一个空的文件夹,否者会创建失败</p><h2 id="本地运行"><a class="markdownIt-Anchor" href="#本地运行"></a> 本地运行</h2><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">hexo s <span class="comment"># 启动服务器,在本地查看内容</span></span><br></pre></td></tr></table></figure><p>在 <code>source->_posts</code> 文件夹下,有一篇 helloworld 的初始化文章,在地址栏中输入http://localhost:4000/<br>我们就可以看到博客内容,我们的博客运行成功啦!!!</p><h2 id="配置"><a class="markdownIt-Anchor" href="#配置"></a> 配置</h2><p>打开配置文档_config.yml,对它做如下修改,repo 后面的内容是 <a href="mailto:git@gitbub.com" target="_blank" rel="noopener">git@gitbub.com</a>:username/库地址的形式</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><span class="line">4</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@github.com:Hugking/Hugking.github.io.git</span></span><br><span class="line"><span class="attr"> branch:</span> <span class="string">master</span></span><br></pre></td></tr></table></figure><p><em>注意:</em><br>属性和内容之间一定要有一个空格,配置文件有自己的格式规范。</p><h2 id="上传项目"><a class="markdownIt-Anchor" href="#上传项目"></a> 上传项目</h2><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">hexo g</span><br><span class="line">hexo d</span><br></pre></td></tr></table></figure><p>第一次部署的时候,我们会重点用到 hexo init 这个命令外,在平时写博客和发布过程中最常用的就是:</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">hexo n <filename> 新建文章</span><br><span class="line">hexo s 启动服务器,在本地查看内容</span><br><span class="line">hexo g 生成静态页面</span><br><span class="line">hexo d 部署到网站</span><br></pre></td></tr></table></figure><p>以上四个步骤。</p><p>其实以上命令我觉得就足够了,文档里还有很多功能,搭建好后我们在https://用户名(Hugking).github.io就可以看到博客内容。</p><h2 id="主题选择"><a class="markdownIt-Anchor" href="#主题选择"></a> 主题选择</h2><p>在 hexo 官网上下载自己喜欢的 theme,点击图片可以预览主题,点击图片下面的文字就可以打开 github 下载链接。</p><p>复制源码的 url,在 git hash 命令窗口下载主题,输入<code>git clone</code> url,注意得手动粘贴,<code>Ctrl+v</code>无效</p><p>接着,将配置文件_config.yml 中的 theme 改为新的主题的名字,记住一定要将下载下来的文件夹放到 themes 文件夹里!</p><h2 id="文件解释"><a class="markdownIt-Anchor" href="#文件解释"></a> 文件解释</h2><p>新建好的文件夹目录如下:</p><figure class="highlight sqf"><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="variable">_config</span>.yml</span><br><span class="line">├── package.json</span><br><span class="line">├── scaffolds</span><br><span class="line">├── source</span><br><span class="line">| ├── <span class="variable">_drafts</span></span><br><span class="line">| └── <span class="variable">_posts</span></span><br><span class="line">└── themes</span><br></pre></td></tr></table></figure><p><strong>_config.yml</strong></p><p>博客的配置文件,博客的名称、关键词、作者、语言、博客主题…设置都在里面。</p><p><strong>package.json</strong></p><p>应用程序信息,新添加的插件内容也会出现在这里面,我们可以不修改这里的内容。</p><p><strong>scaffolds</strong></p><p>scaffolds 就是脚手架的意思,这里放了三个模板文件,分别是新添加博客文章(posts)、新添加博客页(page)和新添加草稿(draft)的目标样式。<br>这部分可以修改的内容是,我们可以在模板上添加比如 categories 等自定义内容</p><p><strong>source</strong></p><p>source 是放置我们博客内容的地方,里面初始只有两个文件夹,一个是 drafts(草稿),一个 posts(文章),但之后我们通过命令新建 tags(标签)还有 categories(分类)页后,这里会相应地增加文件夹。</p><p><strong>themes</strong></p><p>放置主题文件包的地方。Hexo 会根据这个文件来生成静态页面。<br>初始状态下只有 landscape 一个文件夹,后续我们可以添加自己喜欢的。</p><h2 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h2><p>以上为初次使用Hexo的基本步骤,下次我们来说如何创建并发布一篇新文章,作为小白,要走的路还很长,加油吧!</p><!-- rebuild by neat -->]]></content>
<summary type="html">
作为小白想搭建一个个人博客,在网上看了很多的教程,发现大家搭建的博客都挺赏心悦目的,为了节约服务器资源就在 GitHub 上搭建了自己的博客,分享一些踩坑的经验。
</summary>
<category term="Hexo" scheme="http://blog.wkaanig.cn/categories/Hexo/"/>
<category term="杂项" scheme="http://blog.wkaanig.cn/tags/%E6%9D%82%E9%A1%B9/"/>
<category term="个人博客" scheme="http://blog.wkaanig.cn/tags/%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2/"/>
<category term="GitHub-Page" scheme="http://blog.wkaanig.cn/tags/GitHub-Page/"/>
</entry>
<entry>
<title>Git Hook 远程推送至服务器实现自动部署</title>
<link href="http://blog.wkaanig.cn/post/e06b0099.html"/>
<id>http://blog.wkaanig.cn/post/e06b0099.html</id>
<published>2019-09-10T12:34:31.660Z</published>
<updated>2020-04-17T15:48:42.889Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><p><strong>应用场景</strong><br>搭建<code>Git 服务器</code>需要准备一台运行 Linux 的机器,强烈推荐用 Ubuntu 或 Debian ,这样,通过几条简单的 <code>apt</code> 命令就可以完成安装。假设你已经有 <code>sudo</code> 权限的用户账号,下面,正式开始安装。</p><h2 id="1-服务器安装-git"><a class="markdownIt-Anchor" href="#1-服务器安装-git"></a> 1. 服务器安装 <code>git</code></h2><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">$ sudo apt-get install git</span><br></pre></td></tr></table></figure><h2 id="2-创建一个-git-用户用来运行-git-服务"><a class="markdownIt-Anchor" href="#2-创建一个-git-用户用来运行-git-服务"></a> 2. 创建一个 <code>git</code> 用户用来运行 <code>git</code> 服务</h2><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">$ sudo adduser git</span><br></pre></td></tr></table></figure><ul><li>当然你也可以创建你想管理 git 的用户名</li></ul><h2 id="3-创建证书登录"><a class="markdownIt-Anchor" href="#3-创建证书登录"></a> 3. 创建证书登录</h2><p>收集所有需要登录的用户客户端的公钥,就是他们自己的 id_rsa.pub 文件,把所有公钥导入到<code>/home/git/.ssh/authorized_keys</code> 文件里,一行一个,下次你用git时就不需要输入用户名和密码了。</p><h2 id="4-服务器初始化git仓库"><a class="markdownIt-Anchor" href="#4-服务器初始化git仓库"></a> 4. 服务器初始化<code>Git</code>仓库:</h2><p>先选定一个目录作为Git仓库,假定是 <code>/home/git/code/test.git</code> ,在目录下输入命令:</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">$ sudo git init --bare test.git</span><br></pre></td></tr></table></figure><p>Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以 <code>.git</code> 结尾。然后,把 owner 改为 <code>git</code> :</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">$ sudo chown -R git:git test.git</span><br></pre></td></tr></table></figure><p>一个空的git仓库就在服务器上建好了,仓库的地址为(可以本地测试一下 <code>git clone</code> 这个远程仓库):<br><code>ssh://git@你的服务器ip:/home/git/code/test.git</code></p><h2 id="5-网站的根目录-git-clone-服务器仓库"><a class="markdownIt-Anchor" href="#5-网站的根目录-git-clone-服务器仓库"></a> 5. 网站的根目录 <code>git clone</code> 服务器仓库</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></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">cd</span> /var/www/html</span><br><span class="line">$ sudo git <span class="built_in">clone</span> /home/git/code/test.git</span><br><span class="line">$ sudo chmod -R 777 ./<span class="built_in">test</span></span><br></pre></td></tr></table></figure><h2 id="6为远程仓库设置-hook"><a class="markdownIt-Anchor" href="#6为远程仓库设置-hook"></a> 6.为远程仓库设置 <code>hook</code></h2><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="built_in">cd</span> /home/git/code/test.git/hooks</span><br><span class="line">$ vim post-receive</span><br></pre></td></tr></table></figure><p><em>post-receive</em></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></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/sh</span></span><br><span class="line"><span class="built_in">unset</span> GIT_DIR</span><br><span class="line">DeployPath=<span class="string">"/var/www/html/test"</span></span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$DeployPath</span></span><br><span class="line">git pull origin master</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"推送完成"</span></span><br><span class="line"><span class="built_in">exit</span> 0</span><br></pre></td></tr></table></figure><p>为脚本添加可执行权限</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">$ sudo chmod +x post-receive</span><br></pre></td></tr></table></figure><h2 id="7-客户端添加服务器远程仓库"><a class="markdownIt-Anchor" href="#7-客户端添加服务器远程仓库"></a> 7. 客户端添加服务器远程仓库</h2><p>以后往这个服务器远程仓库 <code>push</code> 代码时,就会自动触发上面的脚本。</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">$ git remote add <span class="built_in">test</span> git@你的服务器ip:/home/git/code/test.git //添加远程仓库并命名为 <span class="built_in">test</span></span><br><span class="line">$ git push <span class="built_in">test</span> master</span><br></pre></td></tr></table></figure><h2 id="8-后续代码的更新"><a class="markdownIt-Anchor" href="#8-后续代码的更新"></a> 8. 后续代码的更新:</h2><ol><li><p>github 有更新的时候 <code>pull</code> 更新本地部署仓库</p></li><li><p>然后本地先 <code>push</code> 到测试服务器进行测试</p></li><li><p>测试通过之后 <code>push</code> 到正式服务器进行上线</p></li><li><p>代码的回滚:<br>服务器端回滚:推荐</p></li></ol><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">git reset --hard HEAD^</span><br></pre></td></tr></table></figure><p>本地仓库回滚: 无需登陆服务器即可实现代码回滚</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">git reset HEAD^</span><br></pre></td></tr></table></figure><p>保留代码回滚,然后使用</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">git push remote_name local_branch_name -f <span class="comment">#强制推送</span></span><br></pre></td></tr></table></figure><ol start="5"><li>状态查询命令 <code>git status</code></li></ol><h2 id="9-禁用-shell-登录"><a class="markdownIt-Anchor" href="#9-禁用-shell-登录"></a> 9. 禁用 shell 登录</h2><p>出于安全考虑,第二步创建的 <code>git</code> 用户不允许登录 shell,这可以通过编辑 <code>/etc/passwd</code> 文件完成。找到类似下面的一行:</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">git:x:1001:1001:,,,:/home/git:/bin/bash</span><br></pre></td></tr></table></figure><p>改为:</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">git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell</span><br></pre></td></tr></table></figure><p>这样, <code>git</code> 用户可以正常通过 ssh 使用 git,但无法登录 shell,因为我们为 <code>git</code> 用户指定的 <code>git-shell</code> 每次一登录就自动退出。</p><h2 id="10linux-拓展"><a class="markdownIt-Anchor" href="#10linux-拓展"></a> 10.linux 拓展</h2><h3 id="1-创建证书登录"><a class="markdownIt-Anchor" href="#1-创建证书登录"></a> 1. 创建证书登录</h3><p>默认情况下,用户的 SSH 密钥存储在其 ~/.ssh 目录下。 进入该目录并列出其中内容,你便可以快速确认自己是否已拥有密钥:</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">[root@localhost ~] ls ~/.ssh</span><br><span class="line">authorized_keys id_rsa.pub</span><br></pre></td></tr></table></figure><ul><li><em>在服务器端打开 RSA 认证</em><br>在文件 <code>/etc/ssh/sshd_config</code> 中添加下列三行内容:</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">RSAAuthentication yes</span><br><span class="line">PubkeyAuthentication yes</span><br><span class="line">AuthorizedKeysFile .ssh/authorized_keys</span><br></pre></td></tr></table></figure><ul><li><em>服务器导入 id_rsa.pub</em></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><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[root@localhost ~] <span class="built_in">cd</span> ~git/.ssh</span><br><span class="line">[root@localhost .ssh] cat id_rsa.pub >> authorized_keys</span><br><span class="line">[root@localhost ~] cat authorized_keys</span><br><span class="line">ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCyQ6mcBiyiYiScdh9hBua8cXoOx59VVudyAkA+m+Gc+hUF09oKAyf5LlI1RJkbobX90L3afUexqnHT+hka1oaX4Gu7tfHYu7nJyGVPcteebJ14wNec750kUH0sS+f87U+Sb37Ynmh/FCCTUU+m/goimH5oe/gH8uSh3mFBlA+NKcBPRWCx7W44L5MK4YqcbddmjXsp+JAO6tHaYBn3GnLB3UzLbQHX222AGO6nByHNBmRHMXePaIzH76zWiy/OjiciJzRon/riftO+O+qOA9/+ZoB0KzycA0MeEOwqx5iWwRHzx8WrYufC9PZdvlKe/a4KxSG1XA15y69y0dFfl0CL root@localhost.localdomain</span><br></pre></td></tr></table></figure><h3 id="2linux-上用户创建与删除"><a class="markdownIt-Anchor" href="#2linux-上用户创建与删除"></a> 2.Linux 上用户创建与删除</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></pre></td><td class="code"><pre><span class="line">[root@localhost ~] adduser haha <span class="comment"># 创建用户 haha 是用户名</span></span><br><span class="line">[root@localhost ~] passwd haha <span class="comment"># 为该用户设置密码</span></span><br><span class="line">[root@localhost ~] userdel -r haha <span class="comment"># 完全删除用户</span></span><br><span class="line">[root@localhost ~] find / -name <span class="string">"*haha"</span> <span class="comment"># 再使用 find 命令查看,用户相关文件已经删除。</span></span><br></pre></td></tr></table></figure><!-- rebuild by neat -->]]></content>
<summary type="html">
本地开发的业务代码需要在服务器上测试,之前本人的做法都是将本地代码打包并通过 ftp 传输至服务器解压缩,发现每次都太繁琐了,并且改动不易观察出来,于是便想到了 git 远程仓库,为什么不在服务器上创建一个版本库与本地同步,然后就发现了 `git hooks` ,实现自动部署代码,异常方便,记录下来这个简单的流程。
</summary>
<category term="Git" scheme="http://blog.wkaanig.cn/categories/Git/"/>
<category term="自动部署" scheme="http://blog.wkaanig.cn/tags/%E8%87%AA%E5%8A%A8%E9%83%A8%E7%BD%B2/"/>
</entry>
<entry>
<title>Python-Flask 使用 Sqlacodegen 从数据库表生成model.py</title>
<link href="http://blog.wkaanig.cn/post/7601b0d2.html"/>
<id>http://blog.wkaanig.cn/post/7601b0d2.html</id>
<published>2019-09-10T12:32:49.039Z</published>
<updated>2020-04-17T15:50:48.295Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h2 id="1-安装工具"><a class="markdownIt-Anchor" href="#1-安装工具"></a> 1、安装工具</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></pre></td><td class="code"><pre><span class="line">PS E:\Flask> pip install flask-sqlacodegen</span><br><span class="line">Collecting flask-sqlacodegen</span><br><span class="line"> Downloading https://files.pythonhosted.org/packages/3b/2a/e47611e4fec19e33af5fc90dd57ec2b064056f6c433804742d66e80b2f57/flask_sqlacodegen-1.1.6.1-py2.py3-none-any.whl</span><br><span class="line">Collecting inflect>=0.2.0 (from flask-sqlacodegen)</span><br><span class="line"> Downloading https://files.pythonhosted.org/packages/86/02/e6b11020a9c37d25b4767a1d0af5835629f6e75d6f51553ad07a4c73dc31/inflect-2.1.0-py2.py3-none-any.whl (40kB)</span><br><span class="line"> |████████████████████████████████| 51kB 21kB/s</span><br><span class="line">Requirement already satisfied: SQLAlchemy>=0.6.0 <span class="keyword">in</span> e:\-avpfbmcx\lib\site-packages (from flask-sqlacodegen) (1.2.11)</span><br><span class="line">Installing collected packages: inflect, flask-sqlacodegen</span><br><span class="line">Successfully installed flask-sqlacodegen-1.1.6.1 inflect-2.1.0</span><br></pre></td></tr></table></figure><h2 id="2-生成modelpy文件这里我只生成两个表的模型"><a class="markdownIt-Anchor" href="#2-生成modelpy文件这里我只生成两个表的模型"></a> 2、生成model.py文件(这里我只生成两个表的模型)</h2><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">flask-sqlacodegen <span class="string">'mysql+cymysql://root:password@127.0.0.1/test'</span> --tables goods,goods_attribute --outfile <span class="string">"test.py"</span> --flask</span><br></pre></td></tr></table></figure><h2 id="3-查看文件"><a class="markdownIt-Anchor" href="#3-查看文件"></a> 3、查看文件</h2><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 test.py</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><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># coding: utf-8</span></span><br><span class="line">from sqlalchemy import Column, DateTime, Integer, Numeric, String, Text</span><br><span class="line">from flask_sqlalchemy import SQLAlchemy</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">db = SQLAlchemy()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class Good(db.Model):</span><br><span class="line"> __tablename__ = <span class="string">'goods'</span></span><br><span class="line"></span><br><span class="line"> create_time = db.Column(db.DateTime)</span><br><span class="line"> update_time = db.Column(db.DateTime)</span><br><span class="line"> delete_time = db.Column(db.DateTime)</span><br><span class="line"> id = db.Column(db.Integer, primary_key=True)</span><br><span class="line"> category_id = db.Column(db.Integer, nullable=False, index=True)</span><br><span class="line"> goods_sn = db.Column(db.String(255), nullable=False, index=True)</span><br><span class="line"> name = db.Column(db.String(255), nullable=False)</span><br><span class="line"> brand_id = db.Column(db.Integer, nullable=False, index=True)</span><br><span class="line"> goods_num = db.Column(db.Integer, nullable=False, index=True)</span><br><span class="line"> keywords = db.Column(db.String(255), nullable=False)</span><br><span class="line"> goods_brief = db.Column(db.String(255), nullable=False)</span><br><span class="line"> goods_desc = db.Column(db.Text)</span><br><span class="line"> is_on_sale = db.Column(db.Integer, nullable=False)</span><br><span class="line"> sort_order = db.Column(db.Integer, nullable=False, index=True)</span><br><span class="line"> is_delete = db.Column(db.Integer, nullable=False)</span><br><span class="line"> attribute_category = db.Column(db.Integer, nullable=False, index=True)</span><br><span class="line"> counter_price = db.Column(db.Numeric(10, 2), nullable=False)</span><br><span class="line"> extra_price = db.Column(db.Numeric(10, 2), nullable=False)</span><br><span class="line"> is_new = db.Column(db.Integer, nullable=False)</span><br><span class="line"> goods_unit = db.Column(db.String(255), nullable=False)</span><br><span class="line"> primary_pic_url = db.Column(db.String(255), nullable=False)</span><br><span class="line"> list_pic_url = db.Column(db.String(255), nullable=False)</span><br><span class="line"> retail_price = db.Column(db.Numeric(10, 2), nullable=False)</span><br><span class="line"> sell_volume = db.Column(db.Integer, nullable=False)</span><br><span class="line"> primary_product_id = db.Column(db.Integer, nullable=False)</span><br><span class="line"> unit_price = db.Column(db.Numeric(10, 2), nullable=False)</span><br><span class="line"> promotion_desc = db.Column(db.String(255), nullable=False)</span><br><span class="line"> promotion_tag = db.Column(db.String(255), nullable=False)</span><br><span class="line"> app_exclusive_price = db.Column(db.Numeric(10, 2), nullable=False)</span><br><span class="line"> is_app_exclusive = db.Column(db.Integer, nullable=False)</span><br><span class="line"> is_limited = db.Column(db.Integer, nullable=False)</span><br><span class="line"> is_hot = db.Column(db.Integer, nullable=False)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">class GoodsAttribute(db.Model):</span><br><span class="line"> __tablename__ = <span class="string">'goods_attribute'</span></span><br><span class="line"></span><br><span class="line"> create_time = db.Column(db.DateTime)</span><br><span class="line"> update_time = db.Column(db.DateTime)</span><br><span class="line"> delete_time = db.Column(db.DateTime)</span><br><span class="line"> id = db.Column(db.Integer, primary_key=True)</span><br><span class="line"> goods_id = db.Column(db.Integer, nullable=False, index=True)</span><br><span class="line"> attribute_id = db.Column(db.Integer, nullable=False, index=True)</span><br><span class="line"> values = db.Column(db.Text)</span><br></pre></td></tr></table></figure><h3 id="大功告成"><a class="markdownIt-Anchor" href="#大功告成"></a> 大功告成!</h3><!-- rebuild by neat -->]]></content>
<summary type="html">
sqlacodegen 的详细运用
</summary>
<category term="Python" scheme="http://blog.wkaanig.cn/categories/Python/"/>
<category term="工具" scheme="http://blog.wkaanig.cn/tags/%E5%B7%A5%E5%85%B7/"/>
<category term="Flask" scheme="http://blog.wkaanig.cn/tags/Flask/"/>
</entry>
<entry>
<title>商城系统项目搭建</title>
<link href="http://blog.wkaanig.cn/post/9a26d224.html"/>
<id>http://blog.wkaanig.cn/post/9a26d224.html</id>
<published>2019-09-10T12:32:49.035Z</published>
<updated>2020-04-17T18:22:25.550Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h2 id="准备环境"><a class="markdownIt-Anchor" href="#准备环境"></a> 准备环境</h2><ol><li>使用 python3 创建虚拟环境</li></ol><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">python3 -m venv py3venv <span class="comment">#创建一个py3venv的虚拟环境</span></span><br></pre></td></tr></table></figure><ol start="2"><li>激活虚拟环境</li></ol><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"><span class="built_in">source</span> ./py3venv/bin/activate</span><br></pre></td></tr></table></figure><ol start="3"><li>创建项目目录</li></ol><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">mkdir shop</span><br></pre></td></tr></table></figure><ol start="4"><li>为项目 shop 安装依赖</li></ol><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"><span class="built_in">cd</span> shop</span><br></pre></td></tr></table></figure><ol start="5"><li>安装和卸载包</li></ol><figure class="highlight python"><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">pip install flask <span class="comment"># 安装包</span></span><br><span class="line">pip uinstall flask <span class="comment"># 卸载包</span></span><br></pre></td></tr></table></figure><ol start="6"><li>退出虚拟环境</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">deactivate: 退出虚拟环境</span><br></pre></td></tr></table></figure><ol start="7"><li>初始化环境安装依赖</li></ol><figure class="highlight python"><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">pip freeze >requirements.txt <span class="comment">#生成全部依赖 requirements.txt用来记录项目所有的依赖包和版本号,只需要一个简单的pip命令就能完成。</span></span><br><span class="line">pip install -r requirements.txt <span class="comment">#安装全部依赖</span></span><br></pre></td></tr></table></figure><p><code>requirements.txt</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">flask</span><br><span class="line">flask-sqlalchemy</span><br><span class="line">flask-debugtoolbar</span><br><span class="line">mysqlclient</span><br><span class="line">flask_script</span><br><span class="line">requests</span><br><span class="line">uwsgi <span class="comment">#Linux部署用,window会无法安装</span></span><br></pre></td></tr></table></figure><p><code>环境(application.py)</code></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"><span class="built_in">export</span> ops_config=base <span class="comment">#基本环境</span></span><br></pre></td></tr></table></figure><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"><span class="built_in">export</span> ops_config=<span class="built_in">local</span> <span class="comment">#本地环境</span></span><br></pre></td></tr></table></figure><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"><span class="built_in">export</span> ops_config=production <span class="comment">#生产环境</span></span><br></pre></td></tr></table></figure><h1 id="mysql-踩坑"><a class="markdownIt-Anchor" href="#mysql-踩坑"></a> mysql 踩坑</h1><h3 id="用-vscode-连接-mysql-时出现报错"><a class="markdownIt-Anchor" href="#用-vscode-连接-mysql-时出现报错"></a> <strong>用 vscode 连接 mysql 时出现报错</strong></h3><figure class="highlight plain"><figcaption><span>ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client```</span></figcaption><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><br><span class="line">### **_node 使用 mysql 报错_**</span><br><span class="line"></span><br><span class="line">原因:登录数据库的客户端跟 mysql8.0 不兼容了,mysql8.0 密码认证采用了新的密码格式</span><br><span class="line"></span><br><span class="line">解决办法:在系统 mysql 终端输入下面命令</span><br><span class="line"></span><br><span class="line">```mysql</span><br><span class="line">//password 是你的数据库账户密码,root和host也是</span><br><span class="line">ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';</span><br></pre></td></tr></table></figure><h1 id="搭建项目目录"><a class="markdownIt-Anchor" href="#搭建项目目录"></a> 搭建项目目录</h1><ol><li>创建项目根目录 shop</li></ol><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">mkdir shop</span><br></pre></td></tr></table></figure><ol start="2"><li>在 shop 目录下创建包 config 用来管理配置文件</li></ol><p>通用配置文件<code>config/base_setting.py</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br><span class="line">SERVER_PORT = <span class="number">5000</span></span><br><span class="line">DEBUG = <span class="literal">False</span></span><br><span class="line">SQLALCHEMY_ECHO = <span class="literal">False</span></span><br></pre></td></tr></table></figure><ol start="3"><li>本地配置文件</li></ol><p><code>config/local_setting.py</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br><span class="line">DEBUG = <span class="literal">True</span></span><br><span class="line">SQLALCHEMY_ECHO = <span class="literal">True</span></span><br><span class="line">SQLALCHEMY_DATABASE_URI = <span class="string">'mysql://root:mysql@127.0.0.1/mysql?charset=utf8mb4'</span></span><br><span class="line">SQLALCHEMY_TRACK_MODIFICATIONS = <span class="literal">False</span></span><br><span class="line">SQLALCHEMY_ENCODING = <span class="string">"utf8mb4"</span></span><br></pre></td></tr></table></figure><ol start="4"><li>生产配置文件</li></ol><p><code>config/production_setting.py</code></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br></pre></td></tr></table></figure><ol start="5"><li>在 shop 目录下创建 <a href="http://application.py" target="_blank" rel="noopener">application.py</a> 封装 flask 的全局变量</li></ol><p><code>application.py</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br><span class="line"><span class="keyword">from</span> flask <span class="keyword">import</span> Flask</span><br><span class="line"><span class="keyword">from</span> flask_script <span class="keyword">import</span> Manager</span><br><span class="line"><span class="keyword">from</span> flask_sqlalchemy <span class="keyword">import</span> SQLAlchemy</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Application</span><span class="params">( Flask )</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self,import_name)</span>:</span></span><br><span class="line"> super( Application,self ).__init__( import_name )</span><br><span class="line"> self.config.from_pyfile( <span class="string">'config/base_setting.py'</span> )</span><br><span class="line"> <span class="keyword">if</span> <span class="string">"ops_config"</span> <span class="keyword">in</span> os.environ:</span><br><span class="line"> self.config.from_pyfile( <span class="string">'config/%s_setting.py'</span>%os.environ[<span class="string">'ops_config'</span>] )</span><br><span class="line"></span><br><span class="line"> db.init_app( self )</span><br><span class="line"></span><br><span class="line">db = SQLAlchemy()</span><br><span class="line">app = Application( __name__ )</span><br><span class="line">manager = Manager( app )</span><br></pre></td></tr></table></figure><ol start="6"><li>在 shop 目录下创建 <a href="http://www.py" target="_blank" rel="noopener">www.py</a> 封装 HTTP 相关初始化</li></ol><p><code>www.py</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br><span class="line"><span class="keyword">from</span> application <span class="keyword">import</span> app</span><br><span class="line"><span class="keyword">from</span> web.controllers.index <span class="keyword">import</span> route_index</span><br><span class="line"></span><br><span class="line">app.register_blueprint( route_index,url_prefix = <span class="string">"/"</span> )</span><br></pre></td></tr></table></figure><ol start="7"><li>在 shop 目录下创建 <a href="http://manager.py" target="_blank" rel="noopener">manager.py</a> 启动入口</li></ol><p><code>manager.py</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br><span class="line"><span class="keyword">from</span> application <span class="keyword">import</span> app,manager</span><br><span class="line"><span class="keyword">from</span> flask_script <span class="keyword">import</span> Server</span><br><span class="line"><span class="keyword">import</span> www</span><br><span class="line"></span><br><span class="line"><span class="comment">##web server</span></span><br><span class="line">manager.add_command( <span class="string">"runserver"</span>, Server( host=<span class="string">'0.0.0.0'</span>,port=app.config[<span class="string">'SERVER_PORT'</span>],use_debugger = <span class="literal">True</span> ,use_reloader = <span class="literal">True</span>) )</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">main</span><span class="params">()</span>:</span></span><br><span class="line"> manager.run()</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"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="keyword">import</span> sys</span><br><span class="line"> sys.exit( main() )</span><br><span class="line"> <span class="keyword">except</span> Exception <span class="keyword">as</span> e:</span><br><span class="line"> <span class="keyword">import</span> traceback</span><br><span class="line"> traceback.print_exc()</span><br></pre></td></tr></table></figure><ol start="8"><li>在 shop 目录下创建 <a href="http://readme.md" target="_blank" rel="noopener">readme.md</a></li></ol><p><code>readme.md</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><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></pre></td><td class="code"><pre><span class="line">Python Flask 商城系统</span><br><span class="line">=====================</span><br><span class="line"><span class="comment">##启动</span></span><br><span class="line">* export ops_config=local|production && python manage.py runserver</span><br><span class="line"></span><br><span class="line"><span class="comment">##flask-sqlacodegen</span></span><br><span class="line"></span><br><span class="line"> flask-sqlacodegen <span class="string">'mysql://root:password@127.0.0.1/shop_db'</span> --outfile <span class="string">"common/models/model.py"</span> --flask</span><br><span class="line"> flask-sqlacodegen <span class="string">'mysql://root:password@127.0.0.1/shop_db'</span> --tables user --outfile <span class="string">"common/models/user.py"</span> --flask</span><br><span class="line"></span><br><span class="line"><span class="comment">## 所见即所得编辑器ueditor</span></span><br><span class="line"></span><br><span class="line"> <script src="{{ buildStaticUrl('/plugins/ueditor/ueditor.config.js') }}"></script></span><br><span class="line"> <script src="{{ buildStaticUrl('/plugins/ueditor/ueditor.all.min.js') }}"></script></span><br><span class="line"> <script src="{{ buildStaticUrl('/plugins/ueditor/lang/zh-cn/zh-cn.js') }}"></script></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> UE.getEditor(<span class="string">'editor'</span>,{</span><br><span class="line"> toolbars: [</span><br><span class="line"> [ <span class="string">'undo'</span>, <span class="string">'redo'</span>, <span class="string">'|'</span>,</span><br><span class="line"> <span class="string">'bold'</span>, <span class="string">'italic'</span>, <span class="string">'underline'</span>, <span class="string">'strikethrough'</span>, <span class="string">'removeformat'</span>, <span class="string">'formatmatch'</span>, <span class="string">'autotypeset'</span>, <span class="string">'blockquote'</span>, <span class="string">'pasteplain'</span>, <span class="string">'|'</span>, <span class="string">'forecolor'</span>, <span class="string">'backcolor'</span>, <span class="string">'insertshopedlist'</span>, <span class="string">'insertunshopedlist'</span>, <span class="string">'selectall'</span>, <span class="string">'|'</span>,<span class="string">'rowspacingtop'</span>, <span class="string">'rowspacingbottom'</span>, <span class="string">'lineheight'</span>],</span><br><span class="line"> [ <span class="string">'customstyle'</span>, <span class="string">'paragraph'</span>, <span class="string">'fontfamily'</span>, <span class="string">'fontsize'</span>, <span class="string">'|'</span>,</span><br><span class="line"> <span class="string">'directionalityltr'</span>, <span class="string">'directionalityrtl'</span>, <span class="string">'indent'</span>, <span class="string">'|'</span>,</span><br><span class="line"> <span class="string">'justifyleft'</span>, <span class="string">'justifycenter'</span>, <span class="string">'justifyright'</span>, <span class="string">'justifyjustify'</span>, <span class="string">'|'</span>, <span class="string">'touppercase'</span>, <span class="string">'tolowercase'</span>, <span class="string">'|'</span>,</span><br><span class="line"> <span class="string">'link'</span>, <span class="string">'unlink'</span>],</span><br><span class="line"> [ <span class="string">'imagenone'</span>, <span class="string">'imageleft'</span>, <span class="string">'imageright'</span>, <span class="string">'imagecenter'</span>, <span class="string">'|'</span>,</span><br><span class="line"> <span class="string">'insertimage'</span>, <span class="string">'insertvideo'</span>, <span class="string">'|'</span>,</span><br><span class="line"> <span class="string">'horizontal'</span>, <span class="string">'spechars'</span>,<span class="string">'|'</span>,<span class="string">'inserttable'</span>, <span class="string">'deletetable'</span>, <span class="string">'insertparagraphbeforetable'</span>, <span class="string">'insertrow'</span>, <span class="string">'deleterow'</span>, <span class="string">'insertcol'</span>, <span class="string">'deletecol'</span>, <span class="string">'mergecells'</span>, <span class="string">'mergeright'</span>, <span class="string">'mergedown'</span>, <span class="string">'splittocells'</span>, <span class="string">'splittorows'</span>, <span class="string">'splittocols'</span> ]</span><br><span class="line"></span><br><span class="line"> ],</span><br><span class="line"> enableAutoSave:true,</span><br><span class="line"> saveInterval:<span class="number">60000</span>,</span><br><span class="line"> elementPathEnabled:false,</span><br><span class="line"> zIndex:<span class="number">4</span>,</span><br><span class="line"> serverUrl:common_ops.buildUrl( <span class="string">'/upload/ueditor'</span> )</span><br><span class="line"> });</span><br><span class="line"></span><br><span class="line"><span class="comment">##可参考资料</span></span><br><span class="line">* [python-Flask(jinja2)语法:过滤器](https://www.jianshu.com/p/<span class="number">3127</span>ac233518)</span><br><span class="line">* [SQLAlchemy 各种查询语句写法](https://wxnacy.com/<span class="number">2017</span>/<span class="number">08</span>/<span class="number">14</span>/python<span class="number">-2017</span><span class="number">-08</span><span class="number">-14</span>-sqlalchemy-filter/)</span><br></pre></td></tr></table></figure><ol start="9"><li>在 shop 目录下创建 requirements.txt</li></ol><p><code>requirements.txt</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></pre></td><td class="code"><pre><span class="line">flask</span><br><span class="line">flask-sqlalchemy</span><br><span class="line">flask-debugtoolbar</span><br><span class="line">mysqlclient</span><br><span class="line">flask_script</span><br><span class="line">requests</span><br></pre></td></tr></table></figure><ol start="10"><li>在 shop 目录下创建 common 包 存放公用部分</li></ol><p><code>common/__init__.py</code></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br></pre></td></tr></table></figure><p><code>common/libs/__init__.py</code></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br></pre></td></tr></table></figure><p><code>common/models/__init__.py</code></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br></pre></td></tr></table></figure><ol start="11"><li>在 shop 目录下创建 doc 目录 存放存放文档</li></ol><p><code>doc/mysql.md</code></p><figure class="highlight markdown"><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><br><span class="line">==================</span><br></pre></td></tr></table></figure><ol start="12"><li>在 shop 目录下创建 jobs 包 用来存放一些定时的任务</li></ol><p><code>jobs/__init__.py_</code></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br></pre></td></tr></table></figure><p><code>jobs/task/__init__.py_</code></p><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br></pre></td></tr></table></figure><ol start="13"><li>在 shop 目录下创建 web 包用来存放蓝图</li></ol><p><code>web/__init__.py</code></p><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br></pre></td></tr></table></figure><p><code>web/controllers/index.py</code></p><figure class="highlight py"><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="keyword">from</span> flask <span class="keyword">import</span> Blueprint</span><br><span class="line"></span><br><span class="line">route_index = Blueprint( <span class="string">'index_page'</span>,__name__ )</span><br><span class="line"></span><br><span class="line"><span class="meta">@route_index.route("/")</span></span><br><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">index</span><span class="params">()</span>:</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">'hello'</span></span><br></pre></td></tr></table></figure><p><code>web/controllers/__init__.py</code></p><figure class="highlight py"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -- coding: utf-8 --</span></span><br></pre></td></tr></table></figure><h1 id="简单测试"><a class="markdownIt-Anchor" href="#简单测试"></a> 简单测试</h1><ol><li>在终端添加环境变量</li></ol><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"><span class="built_in">export</span> ops_config=<span class="built_in">local</span></span><br></pre></td></tr></table></figure><ol start="2"><li>启动项目</li></ol><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">python manage.py runserver</span><br></pre></td></tr></table></figure><ol start="3"><li>输入测试 url</li></ol><figure class="highlight dts"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">http:</span><span class="comment">//127.0.0.1:5000/</span></span><br></pre></td></tr></table></figure><!-- rebuild by neat -->]]></content>
<summary type="html">
基于 python flask 开发网上商城详细步骤
</summary>
<category term="Python" scheme="http://blog.wkaanig.cn/categories/Python/"/>
<category term="Flask" scheme="http://blog.wkaanig.cn/tags/Flask/"/>
<category term="商城" scheme="http://blog.wkaanig.cn/tags/%E5%95%86%E5%9F%8E/"/>
</entry>
<entry>
<title>操作系统引论</title>
<link href="http://blog.wkaanig.cn/post/f9a25cd7.html"/>
<id>http://blog.wkaanig.cn/post/f9a25cd7.html</id>
<published>2019-09-10T12:32:49.018Z</published>
<updated>2020-04-17T15:49:52.274Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h2 id="一-操作系统的目标与作用"><a class="markdownIt-Anchor" href="#一-操作系统的目标与作用"></a> 一、操作系统的目标与作用</h2><p>操作系统(Operating System)是配置在计算机硬件上的第一层软件,是对计算机系统的首次扩充。其主要作用是管理好这些设备,提高他们的利用率和系统的吞吐量,并为用户和应用程序提供一个简单的接口,便于用户使用。</p><h3 id="操作系统的目标"><a class="markdownIt-Anchor" href="#操作系统的目标"></a> 操作系统的目标</h3><ul><li><code>方便性</code></li><li><code>有效性</code></li><li><code>可扩充性</code></li><li><code>开放性</code></li></ul><h3 id="操作系统的作用"><a class="markdownIt-Anchor" href="#操作系统的作用"></a> 操作系统的作用</h3><ul><li><code>os作为用户与计算机硬件系统之间的接口</code></li><li><code>os作为计算机系统资源的管理者</code></li><li><code>os实现了对计算机资源的抽象</code></li></ul><h3 id="推动操作系统发展的主要动力"><a class="markdownIt-Anchor" href="#推动操作系统发展的主要动力"></a> 推动操作系统发展的主要动力</h3><ul><li><code>不断提高计算机资源的利用率</code></li><li><code>方便用户</code></li><li><code>器件不断的更新换代</code></li><li><code>计算机体系结构的不断发展</code></li><li><code>不断提出新的应用需求</code></li></ul><h2 id="二-计算机操作系统发展的过程"><a class="markdownIt-Anchor" href="#二-计算机操作系统发展的过程"></a> 二、计算机操作系统发展的过程</h2><h3 id="未配置操作系统的计算机系统"><a class="markdownIt-Anchor" href="#未配置操作系统的计算机系统"></a> 未配置操作系统的计算机系统</h3><p>人工操作方式</p><ul><li><code>脱机输入输出方式</code></li></ul><p>单道批处理系统</p><ul><li><code>单道批处理系统最主要的缺点是系统中的资源得不到充分利用</code></li></ul><p>多道批处理系统的优缺点</p><ul><li><code>资源利用率高。</code></li><li><code>系统吞吐量大能提高系统存储量的主要原因,可归纳为</code><ul><li><code>CPU和其他资源保持忙碌状态</code></li><li><code>仅当作业完成时或运行不下去时才进行切换系统开销小</code></li></ul></li><li><code>平均周转时间长</code></li><li><code>无交互能力</code></li></ul><p>分时系统(time sharing system)</p><ul><li><code>推动分时系统形成和发展的主要动力则是为了满足用户对人机交互的需求,由此形成了一种新型os</code></li></ul><p>实时系统(Real time system)</p><ul><li><code>实时系统最主要的特征是将时间作为关键参数,它必须对所接收到的某些信号作出及时或实时的反应。</code></li></ul><ul><li><code>实时系统的类型</code><ul><li><code>工业武器控制系统</code></li><li><code>信息查询系统</code></li><li><code>多媒体系统。</code></li><li><code>嵌入式系统。</code></li></ul></li></ul><h2 id="三-操作系统的基本特征"><a class="markdownIt-Anchor" href="#三-操作系统的基本特征"></a> 三、操作系统的基本特征</h2><p>并发</p><ul><li><code>并行与并发</code><br><code>并行是指两个或多个事件在同一时刻发生</code><br><code>并发是指两个或多个事件在同一时间间隔内发生</code></li><li><code>引用进程</code><br><code>在一个未引入进程的系统中,在属于同一个应用程序的计算机程序和I/O程序之间只能是顺序执行,既只有在计算机程序执行告一段落后才引起I/o执行,反之在程序执行I/O操作时,计算机程序也不能执行,但在为计算程序和Io程序分别建立一个进程后,两个进程便可并发执行。这样便能极大的提高系统资源的利用率,增加系统的吞吐量。</code></li></ul><p>共享</p><ul><li><code>互斥共享方式。</code></li><li><code>同时访问方式。</code></li></ul><p>虚拟</p><ul><li><code>时分复用技术。</code></li><li><code>空分复用技术。</code></li></ul><p>异步</p><h2 id="四-操作系统的主要功能"><a class="markdownIt-Anchor" href="#四-操作系统的主要功能"></a> 四、操作系统的主要功能</h2><p>处理机管理功能。</p><ul><li><code>进程控制</code></li><li><code>进程同步</code></li><li><code>进程通信</code></li><li><code>调度</code></li></ul><p>存储器管理功能</p><ul><li><code>内存分配,内存保护地址映设内存扩充</code></li></ul><p>设备管理功能。</p><ul><li><code>缓冲管理,设备分配,设备处理。</code></li></ul><p>文件管理功能</p><ul><li><code>文件存储空间的管理</code></li><li><code>目录管理</code></li><li><code>文件读写管理与保护。</code></li></ul><p>操作系统与用户之间的接口</p><ul><li><code>用户接口与程序接口。</code></li></ul><p>现代操作系统的新功能</p><ul><li><code>系统安全</code></li><li><code>网络的功能和服务</code></li><li><code>支持多媒体。</code></li></ul><!-- rebuild by neat -->]]></content>
<summary type="html">
操作系统的基本知识
</summary>
<category term="操作系统" scheme="http://blog.wkaanig.cn/categories/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
<category term="杂项" scheme="http://blog.wkaanig.cn/tags/%E6%9D%82%E9%A1%B9/"/>
</entry>
<entry>
<title>腾讯云 Ubuntu 开启 Root 用户登录并修改系统语言为中文</title>
<link href="http://blog.wkaanig.cn/post/d436f64e.html"/>
<id>http://blog.wkaanig.cn/post/d436f64e.html</id>
<published>2019-09-10T12:32:49.010Z</published>
<updated>2020-04-17T15:50:22.745Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h2 id="一-腾讯讯云主机开启-root-用户登录如下"><a class="markdownIt-Anchor" href="#一-腾讯讯云主机开启-root-用户登录如下"></a> 一、腾讯讯云主机开启 root 用户登录如下:</h2><ul><li>腾讯云主机ubuntu 系统默认用户名为 ubuntu</li></ul><ul><li>1.修改root密码</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><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo passwd root</span><br><span class="line">Enter new UNIX password: // 输入新密码</span><br><span class="line">Retype new UNIX password: // 重复密码</span><br><span class="line">passwd: password updated successfully // 修改成功</span><br></pre></td></tr></table></figure><ul><li>2.修改 sshd_config 配置如下</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><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/ssh/sshd_config</span><br><span class="line"><span class="comment"># Authentication:</span></span><br><span class="line">LoginGraceTime 120</span><br><span class="line">PermitRootLogin yes</span><br><span class="line">StrictModes yes</span><br></pre></td></tr></table></figure><ul><li>3.最后重启下ssh</li></ul><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">sudo service ssh restart</span><br></pre></td></tr></table></figure><h2 id="二-修改系统语言为中文"><a class="markdownIt-Anchor" href="#二-修改系统语言为中文"></a> 二、修改系统语言为中文</h2><ul><li>1.查看当前语言环境</li></ul><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"><span class="built_in">echo</span> <span class="variable">$LANG</span></span><br></pre></td></tr></table></figure><ul><li>2.查看当前系统是否有中文语言包(<code>zh_CN.utf8</code>)</li></ul><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">locale -a</span><br></pre></td></tr></table></figure><ul><li>3.安装中文语言包</li></ul><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">apt install language-pack-zh-hans</span><br></pre></td></tr></table></figure><ul><li>4.再次查看是否有中文语言包</li></ul><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">locale -a</span><br></pre></td></tr></table></figure><ul><li>5.修改系统环境变量</li></ul><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">vi ~/.bashrc</span><br></pre></td></tr></table></figure><p>加入下面这一行:</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">LANG=<span class="string">"zh_CN.utf8"</span></span><br></pre></td></tr></table></figure><ul><li>6.执行修改</li></ul><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"><span class="built_in">source</span> ~/.bashrc</span><br></pre></td></tr></table></figure><p>此时已更改成功</p><h2 id="三-更新系统可选"><a class="markdownIt-Anchor" href="#三-更新系统可选"></a> 三、更新系统(可选)</h2><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">apt-get update </span><br><span class="line">apt-get dist-upgrade</span><br></pre></td></tr></table></figure><!-- rebuild by neat -->]]></content>
<summary type="html">
腾讯云主机 ubuntu 系统默认用户名为 ubuntu,修改文件需要 root 权限太过繁琐,为了方便改成 root 用户登录
</summary>
<category term="Linux" scheme="http://blog.wkaanig.cn/categories/Linux/"/>
<category term="ubuntu" scheme="http://blog.wkaanig.cn/tags/ubuntu/"/>
</entry>
<entry>
<title>Linux 文件常用操作命令</title>
<link href="http://blog.wkaanig.cn/post/61f63005.html"/>
<id>http://blog.wkaanig.cn/post/61f63005.html</id>
<published>2019-09-10T12:32:49.004Z</published>
<updated>2020-04-17T15:49:17.337Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><h2 id="压缩与解压文件"><a class="markdownIt-Anchor" href="#压缩与解压文件"></a> 压缩与解压文件</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></pre></td><td class="code"><pre><span class="line">tar</span><br><span class="line">-c: 建立压缩档案</span><br><span class="line">-x:解压</span><br><span class="line">-t:查看内容</span><br><span class="line">-r:向压缩归档文件末尾追加文件</span><br><span class="line">-u:更新原压缩包中的文件</span><br></pre></td></tr></table></figure><p>这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。</p><p><code>-z:有gzip属性的</code></p><p><code>-j:有bz2属性的</code></p><p><code>-Z:有compress属性的</code></p><p><code>-v:显示所有过程</code></p><p><code>-O:将文件解开到标准输出</code></p><p><strong>下面的参数-f是必须的</strong></p><p><code>-f: 使用档案名字,切记,这个参数是最后一个参数,后面只能接档案名。</code></p><p><em><strong>示例:</strong></em></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">tar -cf all.tar *.jpg</span><br><span class="line">这条命令是将所有.jpg的文件打成一个名为all.tar的包。-c是表示产生新的包,-f指定包的文件名。</span><br><span class="line">tar -rf all.tar *.gif</span><br><span class="line">这条命令是将所有.gif的文件增加到all.tar的包里面去。-r是表示增加文件的意思。</span><br><span class="line">tar -uf all.tar logo.gif</span><br><span class="line">这条命令是更新原来tar包all.tar中logo.gif文件,-u是表示更新文件的意思。</span><br><span class="line">tar -tf all.tar</span><br><span class="line">这条命令是列出all.tar包中所有文件,-t是列出文件的意思</span><br><span class="line">tar -xf all.tar</span><br><span class="line">这条命令是解出all.tar包中所有文件,-t是解开的意思</span><br></pre></td></tr></table></figure><h2 id="压缩"><a class="markdownIt-Anchor" href="#压缩"></a> 压缩</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></pre></td><td class="code"><pre><span class="line">tar -cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg </span><br><span class="line">tar -czf jpg.tar.gz *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz</span><br><span class="line">tar -cjf jpg.tar.bz2 *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2</span><br><span class="line">tar -cZf jpg.tar.Z *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z</span><br><span class="line">rar a jpg.rar *.jpg //rar格式的压缩,需要先下载rar <span class="keyword">for</span> linux</span><br><span class="line">zip jpg.zip *.jpg //zip格式的压缩,需要先下载zip <span class="keyword">for</span> linux</span><br></pre></td></tr></table></figure><h2 id="文件压缩"><a class="markdownIt-Anchor" href="#文件压缩"></a> 文件压缩</h2><p><em><strong>tar -zcvf 打包后生成的文件名全路径 要打包的目录</strong></em></p><p>把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件。</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">tar -zcvf /home/xahot.tar.gz /xahot</span><br></pre></td></tr></table></figure><p><strong><em>zip 压缩方法:压缩当前的文件夹 zip -r ./xahot.zip ./</em> -r表示递归</strong>*</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">zip [参数] [打包后的文件名] [打包的目录路径]</span><br></pre></td></tr></table></figure><h2 id="解压"><a class="markdownIt-Anchor" href="#解压"></a> 解压</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></pre></td><td class="code"><pre><span class="line">tar -xvf file.tar //解压 tar包</span><br><span class="line">tar -xzvf file.tar.gz //解压tar.gz</span><br><span class="line">tar -xjvf file.tar.bz2 //解压 tar.bz2</span><br><span class="line">tar -xZvf file.tar.Z //解压tar.Z</span><br><span class="line">unrar e file.rar //解压rar</span><br><span class="line">unzip file.zip //解压zip</span><br></pre></td></tr></table></figure><h2 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</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></pre></td><td class="code"><pre><span class="line">1、*.tar 用 tar -xvf 解压</span><br><span class="line">2、*.gz 用 gzip -d或者gunzip 解压</span><br><span class="line">3、*.tar.gz和*.tgz 用 tar -xzf 解压</span><br><span class="line">4、*.bz2 用 bzip2 -d或者用bunzip2 解压</span><br><span class="line">5、*.tar.bz2用tar -xjf 解压</span><br><span class="line">6、*.Z 用 uncompress 解压</span><br><span class="line">7、*.tar.Z 用tar -xZf 解压</span><br><span class="line">8、*.rar 用 unrar e解压</span><br><span class="line">9、*.zip 用 unzip 解压</span><br></pre></td></tr></table></figure><p><em><strong>示例:</strong></em></p><p>解压jdk到指定文件夹:</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">tar -xzvf jdk-8u131-linux-x64.tar.gz -C /usr/<span class="built_in">local</span>/java</span><br></pre></td></tr></table></figure><!-- rebuild by neat -->]]></content>
<summary type="html">
记录Linux文件常用操作命令
</summary>
<category term="Linux" scheme="http://blog.wkaanig.cn/categories/Linux/"/>
<category term="命令" scheme="http://blog.wkaanig.cn/tags/%E5%91%BD%E4%BB%A4/"/>
</entry>
<entry>
<title>C# 中常用的类和结构</title>
<link href="http://blog.wkaanig.cn/post/12e9bef1.html"/>
<id>http://blog.wkaanig.cn/post/12e9bef1.html</id>
<published>2019-09-10T12:32:48.967Z</published>
<updated>2020-04-17T15:46:49.002Z</updated>
<content type="html"><![CDATA[<!-- build time:Wed Apr 22 2020 00:58:09 GMT+0800 (GMT+08:00) --><ul><li>String类(C#中 String 与 string 具有相同的含义)</li></ul><ol><li>静态</li></ol><p><code>Compare</code></p><p><code>Concat</code></p><p><code>Format</code></p><ol start="2"><li>非静态方法</li></ol><p><code>Contains</code></p><p><code>CompareTo</code></p><p><code>Equals</code></p><p><code>IndexOf</code></p><p><code>Insert</code></p><p><code>Remove</code></p><p><code>Replace</code></p><p><code>Split</code></p><p><code>Substring</code></p><p><code>Trim</code></p><!-- rebuild by neat -->]]></content>
<summary type="html">
C# 中常用的知识
</summary>
<category term="C#" scheme="http://blog.wkaanig.cn/categories/C/"/>
<category term="基础知识" scheme="http://blog.wkaanig.cn/tags/%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"/>
</entry>
</feed>