-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
532 lines (366 loc) · 40.1 KB
/
index.html
File metadata and controls
532 lines (366 loc) · 40.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
<!DOCTYPE HTML>
<html>
<head><meta name="generator" content="Hexo 3.8.0">
<meta charset="utf-8">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<title>Tony Blog</title>
<meta name="author" content="Tony">
<meta name="description" content="code">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta property="og:site_name" content="Tony Blog">
<meta property="og:image" content="">
<link href="/favicon.png" rel="icon">
<link rel="stylesheet" href="/css/bootstrap.min.css" media="screen" type="text/css">
<link rel="stylesheet" href="/css/font-awesome.css" media="screen" type="text/css">
<link rel="stylesheet" href="/css/style.css" media="screen" type="text/css">
<link rel="stylesheet" href="/css/responsive.css" media="screen" type="text/css">
<link rel="stylesheet" href="/css/highlight.css" media="screen" type="text/css">
<link rel="stylesheet" href="/css/google-fonts.css" media="screen" type="text/css">
<!--[if lt IE 9]><script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
<script src="/js/jquery-2.0.3.min.js"></script>
<!-- analytics -->
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-70812759-1', 'auto');
ga('send', 'pageview');
</script>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "//hm.baidu.com/hm.js?cb5448498d7169c668b07c2b255d62c1";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</head>
</html>
<body>
<nav id="main-nav" class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container">
<button type="button" class="navbar-header navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/">Tony Blog</a>
<div class="collapse navbar-collapse nav-menu">
<ul class="nav navbar-nav">
<li>
<a href="/archives" title="All the articles.">
<i class=""></i>Archives
</a>
</li>
<li>
<a href="/categories" title="All the categories.">
<i class=""></i>Categories
</a>
</li>
<li>
<a href="/tags" title="All the tags.">
<i class=""></i>Tags
</a>
</li>
<li>
<a href="/about" title="About me.">
<i class=""></i>About
</a>
</li>
</ul>
</div>
</div> <!-- container -->
</nav>
<div class="clearfix"></div>
<div class="container">
<div class="content">
<div class="page-header logo">
<h1>Tony Blog<span class="blink-fast">∎</span></h1>
</div>
<div class="row page">
<div class="col-md-9">
<div class="slogan">
<i class="fa fa-heart blink-slow"></i>
好记忆不如烂键盘
</div>
<div id="top_search"></div>
<div class="mypage">
<!-- title and entry -->
<!-- display as entry -->
<div class="row">
<div class="col-md-8">
<h3 class="title">
<a href="/2019/03/31/KMPAlgorithm/">KMP算法</a>
</h3>
</div>
<div class="col-md-4">
<div class="date">post @ 2019-03-31 </div>
</div>
</div>
<div class="entry">
<div class="row">
<p>KMP的精髓在于构造pa的前缀和后缀相同数组(next数组),跳过相同的字符串对比。如<br>果匹配串没有相同的后缀和和前缀,那这个算法也就和BF算法差不多。</p>
<p>next数组的含义,后缀记录匹配串的前缀最后一个字符的后一个字符的下标,方便寻找<br>下一个匹配位置。</p>
<p>没有图说什么都没用,这里有个阿三讲解教学视频:<br><a href="https://www.bilibili.com/video/av3246487" target="_blank" rel="noopener">汪都能听懂的KMP字符串匹配算法(双语字幕)</a></p>
<h1 id="参考源代码:"><a href="#参考源代码:" class="headerlink" title="参考源代码:"></a>参考源代码:</h1><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><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">KMP</span><span class="params">(<span class="built_in">string</span> str,<span class="built_in">string</span> pa)</span></span>{</span><br><span class="line"> <span class="keyword">int</span> len=pa.length();</span><br><span class="line"> <span class="keyword">int</span> next[len]={<span class="number">0</span>};</span><br><span class="line"> <span class="keyword">int</span> i=<span class="number">0</span>,j=<span class="number">1</span>;</span><br><span class="line"> <span class="comment">//构造前缀和后缀数组(next)</span></span><br><span class="line"> <span class="keyword">while</span>(j<len){</span><br><span class="line"> <span class="keyword">if</span>(pa[i]==pa[j]){</span><br><span class="line"> next[j]=++i;</span><br><span class="line"> j++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span>{</span><br><span class="line"> <span class="comment">//字符不相等,并且i不为零,i等于next前一个数值</span></span><br><span class="line"> <span class="keyword">if</span>(i){</span><br><span class="line"> i=next[--i];</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> j++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//开始匹配</span></span><br><span class="line"> i=<span class="number">0</span>,j=<span class="number">0</span>;</span><br><span class="line"> len=str.length();</span><br><span class="line"> <span class="keyword">while</span>(i<len){</span><br><span class="line"> <span class="keyword">if</span>(str[i+j]==pa[j]){</span><br><span class="line"> <span class="comment">//当j等于模式串长度-1时候,就是说明匹配成功</span></span><br><span class="line"> <span class="keyword">if</span>(j==pa.length()<span class="number">-1</span>)</span><br><span class="line"> <span class="keyword">return</span> i;</span><br><span class="line"> j++;</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> <span class="comment">//当j不为0时才取next数组的j前一个的数</span></span><br><span class="line"> <span class="keyword">if</span>(j)</span><br><span class="line"> j=next[j<span class="number">-1</span>];</span><br><span class="line"> i+=j+<span class="number">1</span>;</span><br><span class="line"> <span class="comment">//当i大于主串的长度减去匹配串的长度,就不用匹配</span></span><br><span class="line"> <span class="keyword">if</span>(i>len-pa.length())</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>有错误可以联系我或者github上留言(虽然知道没有人联系和留言,哈哈哈哈)</p>
<p>推荐看下同样的匹配算法:<a href="https://blog.csdn.net/q547550831/article/details/51860017" target="_blank" rel="noopener">Sunday算法</a></p>
</div>
<a type="button" href="/2019/03/31/KMPAlgorithm/#more" class="btn btn-default more">Read More</a>
</div>
<!-- display as entry -->
<div class="row">
<div class="col-md-8">
<h3 class="title">
<a href="/2019/03/30/ProblemOfTemplateClass/">问题:模板类声明与实现</a>
</h3>
</div>
<div class="col-md-4">
<div class="date">post @ 2019-03-30 </div>
</div>
</div>
<div class="entry">
<div class="row">
<p>在做单链表结构时发现模板类的声明与实现不能像一般类一样把它分成.h和.cpp文件,<br>不然会链接失败。</p>
<p>可是我不想写在一起,就是想分离,怎么办?<br>最后找到以下方法:</p>
<h1 id="方法一:在主文件中引入-cpp文件"><a href="#方法一:在主文件中引入-cpp文件" class="headerlink" title="方法一:在主文件中引入.cpp文件"></a>方法一:在主文件中引入.cpp文件</h1><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 class="comment">//这是A.h</span></span><br><span class="line">tamplate<<span class="class"><span class="keyword">class</span> <span class="title">T</span>></span></span><br><span class="line"><span class="class"><span class="title">class</span> <span class="title">A</span>{</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function">T <span class="title">show</span><span class="params">()</span></span>{};</span><br><span class="line"> <span class="comment">//一堆A类的声明...</span></span><br><span class="line">};</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 class="comment">//这是A.cpp</span></span><br><span class="line">include<span class="string">"A.h"</span></span><br><span class="line"><span class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">T</span>></span></span><br><span class="line"><span class="class"><span class="title">T</span> <span class="title">A</span><T>:</span>:show(){</span><br><span class="line"><span class="comment">//balabala一堆</span></span><br><span class="line">}</span><br><span class="line"><span class="comment">//一堆A类的实现...</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></pre></td><td class="code"><pre><span class="line"><span class="comment">//这是主文件main.cpp</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">"A.cpp"</span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span>{}</span><br></pre></td></tr></table></figure>
<p>正常的类是在主文件中引入A.h,模板类需要引入A.cpp</p>
<p>究其原因,模板类的实现在找不到调用时,默认是不编译的,编译器会根据模板类的调<br>用类型分别编译成几个.O二进制文件,例如模板用到int和char,编译器会生成一个int<br>的.o文件和一个char的.o文件。所以只在主文件中引入.h文件(编译器就找不到实现),<br>编译器就不会编译它的实现(.cpp文件),那么在链接的时候就会出错(找不到实现函<br>数)</p>
<h1 id="方法二:在-h文件的底部引入-cpp"><a href="#方法二:在-h文件的底部引入-cpp" class="headerlink" title="方法二:在.h文件的底部引入.cpp"></a>方法二:在.h文件的底部引入.cpp</h1><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></pre></td><td class="code"><pre><span class="line"><span class="comment">//这是A.h</span></span><br><span class="line">tamplate<<span class="class"><span class="keyword">class</span> <span class="title">T</span>></span></span><br><span class="line"><span class="class"><span class="title">class</span> <span class="title">A</span>{</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function">T <span class="title">show</span><span class="params">()</span></span>{};</span><br><span class="line"> <span class="comment">//一堆A类的声明...</span></span><br><span class="line">};</span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">"A.cpp"</span></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 class="comment">//这是A.cpp</span></span><br><span class="line">include<span class="string">"A.h"</span></span><br><span class="line"><span class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">T</span>></span></span><br><span class="line"><span class="class"><span class="title">T</span> <span class="title">A</span><T>:</span>:show(){</span><br><span class="line"><span class="comment">//balabala一堆</span></span><br><span class="line">}</span><br><span class="line"><span class="comment">//一堆A类的实现...</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></pre></td><td class="code"><pre><span class="line"><span class="comment">//这是主文件main.cpp</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">"A.h"</span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span>{}</span><br></pre></td></tr></table></figure>
<p>其实这两种方法都是换汤不换药。</p>
<p>方法二的原理,主要与预编译include语句和.h文件不编译有关。看下下面的例子:<br><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//state.h文件</span></span><br><span class="line"><span class="keyword">int</span> abc</span><br></pre></td></tr></table></figure></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></pre></td><td class="code"><pre><span class="line"><span class="comment">//主文件</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string"><iostream></span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span>{</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">"state.h"</span></span></span><br><span class="line"> =<span class="number">50</span>;</span><br><span class="line"> <span class="built_in">std</span>::<span class="built_in">cout</span><<abc;</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>这种奇葩写法居然可以编译通过,并正常运行。。</p>
<p>在我的理解里,include是把.h文件以文本插入了主文件,所以说方法二是相当于把声明与实现写在同一个文件了</p>
<h1 id="总结一下:"><a href="#总结一下:" class="headerlink" title="总结一下:"></a>总结一下:</h1><ol>
<li>编译器默认编译所有.cpp文件,不编译.h文件(当然你也可以指定编译),但不编<br>译包含了模板的而又不找不到调用.cpp文件。</li>
<li>.h文件的声明只是让你编译通过,告诉编译器我有实现函数,模板实现函数却没有<br>编译(没有引入就找不到调用,没有调用就没有编译),导致链接失败。</li>
</ol>
</div>
<a type="button" href="/2019/03/30/ProblemOfTemplateClass/#more" class="btn btn-default more">Read More</a>
</div>
<!-- display as entry -->
<div class="row">
<div class="col-md-8">
<h3 class="title">
<a href="/2019/03/29/differ-temp/">问题:用typedef定义模板别名</a>
</h3>
</div>
<div class="col-md-4">
<div class="date">post @ 2019-03-29 </div>
</div>
</div>
<div class="entry">
<div class="row">
<p>在上机课做LinkList的时候,用到模板结构体,就想着用typedef来定义一个结构体的指针:<br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">template</span> <<span class="class"><span class="keyword">class</span> <span class="title">DT</span>></span></span><br><span class="line"><span class="class"><span class="title">typedef</span> <span class="title">struct</span> <span class="title">Node</span>{</span></span><br><span class="line"> DT data;</span><br><span class="line"> Node<DT>* next;</span><br><span class="line">}*PNode<DT>;</span><br></pre></td></tr></table></figure></p>
<p>竟然编译不通过。。。</p>
<p>最后改了下:<br><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 class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">DT</span>></span></span><br><span class="line"><span class="class"><span class="title">struct</span> <span class="title">Node</span>{</span></span><br><span class="line"> DT data;</span><br><span class="line"> Node<DT>* next;</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">DT</span>></span></span><br><span class="line"><span class="class"><span class="title">typedef</span> <span class="title">Node</span><DT> *<span class="title">PNode</span>;</span></span><br><span class="line"></span><br><span class="line">PNode<<span class="keyword">int</span>> pnode;</span><br></pre></td></tr></table></figure></p>
<p>O了?!</p>
<p>但回到宿舍,用GCC编译失败,,,最后找到解决办法使用using代替typedef:<br><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 class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">DT</span>></span></span><br><span class="line"><span class="class"><span class="title">struct</span> <span class="title">Node</span>{</span></span><br><span class="line"> DT data;</span><br><span class="line"> Node<DT>* next;</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">template</span><<span class="class"><span class="keyword">class</span> <span class="title">DT</span>></span></span><br><span class="line"><span class="class"><span class="title">using</span> <span class="title">PNode</span> =<span class="title">Node</span><DT>*;</span></span><br><span class="line"></span><br><span class="line">PNode<<span class="keyword">int</span>> pnode;</span><br></pre></td></tr></table></figure></p>
<p>其实导致上述错误是因为C++标准不同,上机课用的编译器是上古VC6.0,用的是古老的C++98标准,GCC编译器用的是C++11标准,C++11淘汰了typedef的用法。</p>
<p>至于为什么typedef的用法被淘汰了,可以参考以下链接:</p>
<p><a href="https://zhuanlan.zhihu.com/p/21264013" target="_blank" rel="noopener">Effective Modern C++ Note</a></p>
</div>
<a type="button" href="/2019/03/29/differ-temp/#more" class="btn btn-default more">Read More</a>
</div>
<!-- display as entry -->
<div class="row">
<div class="col-md-8">
<h3 class="title">
<a href="/2018/12/09/LibAssigement/">实验室任务</a>
</h3>
</div>
<div class="col-md-4">
<div class="date">post @ 2018-12-09 </div>
</div>
</div>
<div class="entry">
<div class="row">
<p>任务要求: 抓取学校教务系统的个人信息和课表,做成网站访问。<br>工具: <strong>python</strong>(request,beautifulsoap,django),<strong>css</strong>,<strong>js</strong>,<strong>jquery</strong>,<strong>html</strong>,<strong>bootstrap</strong>(做UI)<br>具体过程: 用python的request库获取学生信息,再beautifulsoap解析,提取出学生信息,做成一个<strong>StudentInfo</strong>类。接下来用django搭建动态网站,用StudentInfo类代替数据库,在网页中用ajax获取数据,js加载布局。</p>
<p>效果如下:<br><img src="mainpage.png" alt="首页"><br><img src="infopage.jpg" alt="学生信息"></p>
<hr>
<p>唉,说一下做的过程中遇到的坑。</p>
<ul>
<li><h2 id="登录不上"><a href="#登录不上" class="headerlink" title="登录不上"></a>登录不上</h2><p>刚开始我把数据直接提交到登录url,登录不上,以为教务系统有识别爬虫的功能,于是把浏览器的请求头都添加上,但还是不行。看浏览器抓包,登录首页时,教务系统给了一个cookie,后来登录就要提交这个cookie。所以只要登录的时候,用request的session的请求一下首页,拿一下cookie就搞定了。</p>
</li>
<li><h2 id="解析信息"><a href="#解析信息" class="headerlink" title="解析信息"></a>解析信息</h2><p>python做信息字典的时候,忘了键值相同,会覆盖其值。。这个问题纳闷了几天。</p>
</li>
<li><h2 id="偷官网首页"><a href="#偷官网首页" class="headerlink" title="偷官网首页"></a>偷官网首页</h2><p>唉,偷首页还是不要偷上js,弄出一个ui,搞css和图片就好了。</p>
</li>
<li><h2 id="用mysql还是缓存?"><a href="#用mysql还是缓存?" class="headerlink" title="用mysql还是缓存?"></a>用mysql还是缓存?</h2><p>刚开始用mysql保存学生信息,最后决定用缓存保存学生信息。用mysql做代理网站太麻烦了,网站更新速度快,而且信息多,加上这些信息并不用保存太久。而一个StudentInfo类就保存全部,岂不美滋滋。</p>
</li>
</ul>
<hr>
<p>大学的第一个项目,用时大概一个月,由python学起,学到django的使用,后来发现即学即用效率是最高的,beatifulsoap,request,css,html,js,jquery都没有经过系统的学习,即学即用。<br>写这篇博客纪念一下,写完了,可以回去补高数了。</p>
<p>项目:<a href="https://github.com/TonyGuy/CrawlProject/" target="_blank" rel="noopener">盗版教务系统</a></p>
</div>
<a type="button" href="/2018/12/09/LibAssigement/#more" class="btn btn-default more">Read More</a>
</div>
<!-- display as entry -->
<div class="row">
<div class="col-md-8">
<h3 class="title">
<a href="/2018/11/14/FirstHW/">第一次C++程序作业</a>
</h3>
</div>
<div class="col-md-4">
<div class="date">post @ 2018-11-14 </div>
</div>
</div>
<div class="entry">
<div class="row">
<h3 id="身份证验证"><a href="#身份证验证" class="headerlink" title="身份证验证"></a>身份证验证</h3><p><a href="https://github.com/TonyGuy/HomeWork/blob/master/src/idCheck.cpp" target="_blank" rel="noopener">idCheck.cpp</a></p>
<h3 id="进制转换"><a href="#进制转换" class="headerlink" title="进制转换"></a>进制转换</h3><p><a href="https://github.com/TonyGuy/HomeWork/blob/master/src/hexConv.cpp" target="_blank" rel="noopener">hexConv.cpp</a></p>
<h3 id="字符统计"><a href="#字符统计" class="headerlink" title="字符统计"></a>字符统计</h3><p><a href="https://github.com/TonyGuy/HomeWork/blob/master/src/countText.cpp" target="_blank" rel="noopener">hexConv.cpp</a></p>
<h3 id="藏数游戏"><a href="#藏数游戏" class="headerlink" title="藏数游戏"></a>藏数游戏</h3><p><a href="https://github.com/TonyGuy/HomeWork/blob/master/src/hideNum.cpp" target="_blank" rel="noopener">hideNum.cpp</a></p>
<p>后面的两个程序有点水,不太严谨。如有改进的地方,可以在我的<a href="https://github.com/TonyGuy/HomeWork" target="_blank" rel="noopener">GitHub</a>上留言</p>
</div>
<a type="button" href="/2018/11/14/FirstHW/#more" class="btn btn-default more">Read More</a>
</div>
<!-- display as entry -->
<div class="row">
<div class="col-md-8">
<h3 class="title">
<a href="/2018/10/11/HexoInstall/">安装Hexo和部署到Github</a>
</h3>
</div>
<div class="col-md-4">
<div class="date">post @ 2018-10-11 </div>
</div>
</div>
<div class="entry">
<div class="row">
<p>安装前先上一张流程图<br><img src="flow.png" alt="流程图" title="流程图"></p>
<h2 id="前提"><a href="#前提" class="headerlink" title="前提"></a>前提</h2><p>我用的系统是<strong>Debian</strong>,Windows、Macos的玩家可以上Hexo官网的<a href="https://hexo.io/docs/" target="_blank" rel="noopener">文档</a>查看教程,还有Centos,Redhat等系列的玩家虽然同属于Linux,但安装过程可能会有些不同,请自行<a href="https://www.baidu.com" target="_blank" rel="noopener">百度</a></p>
<h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p>Hexo是一个用node.js框架编写的博客应用服务器,所以需提前安装好node.js。<br>Github是一个源码托管平台,用Hexo生成的静态网页文件部署到Gihub上,供外网的人访问(这样的发布方法不能被搜索引擎找到)。</p>
<hr>
<h2 id="开始安装"><a href="#开始安装" class="headerlink" title="开始安装"></a>开始安装</h2><h3 id="安装node-js"><a href="#安装node-js" class="headerlink" title="安装node.js"></a>安装node.js</h3><p>用curl或者wget获得安装器<br><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 -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash</span><br></pre></td></tr></table></figure></p>
<p>或<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash</span><br></pre></td></tr></table></figure></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">$ nvm install stable</span><br></pre></td></tr></table></figure>
<p>若无意外,到这里已经安装完成</p>
<h3 id="安装Hexo"><a href="#安装Hexo" class="headerlink" title="安装Hexo"></a>安装Hexo</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">$ npm install -g hexo-cli</span><br></pre></td></tr></table></figure>
<h3 id="初始化一个博客"><a href="#初始化一个博客" class="headerlink" title="初始化一个博客"></a>初始化一个博客</h3><p>最好新建一个博客目录,摆放合理才是一个程序猿应有的规范<br><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>
<p>初始化完成后,该目录会出现以下目录和文件<br><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><br><span class="line">├── _config.yml</span><br><span class="line">├── package.json</span><br><span class="line">├── scaffolds</span><br><span class="line">├── <span class="built_in">source</span></span><br><span class="line">| ├── _drafts</span><br><span class="line">| └── _posts</span><br><span class="line">└── themes</span><br></pre></td></tr></table></figure></p>
<h3 id="运行服务器"><a href="#运行服务器" class="headerlink" title="运行服务器"></a>运行服务器</h3><p>在博客文件夹中运行<br><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 server</span><br></pre></td></tr></table></figure></p>
<p>访问localhost:4000,能正常访问,说明运行Hexo成功<br>接下来准备GitHub</p>
<h3 id="配置GitHub"><a href="#配置GitHub" class="headerlink" title="配置GitHub"></a>配置GitHub</h3><p>这里默认看客注册了Github帐号,没注册的<a href="https://www.github.com" target="_blank" rel="noopener">点这里</a><br>在Github上面创建一个新的repository,Repository name为 <strong>用户名</strong>.github.io。这是一个约定的Repository名,访问这个名字可以访问到当前Repository的静态网页(学生党福利),最后在该Repository的右上方有个绿色按钮Clone or download,复制里面的 <strong>SSH</strong> 链接!<br><img src="Git_Clone.png" alt="如图"></p>
<p>配置Github有两种方法:<strong>ssh帐号密码</strong> 和 <strong>ssh密钥</strong></p>
<h4 id="通过ssh帐号密码配置Github"><a href="#通过ssh帐号密码配置Github" class="headerlink" title="通过ssh帐号密码配置Github"></a>通过ssh帐号密码配置Github</h4><p>进入到博客文件中,修改_config.yml,一般在最后一行<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">deploy:</span><br><span class="line"> type: git</span><br><span class="line"> repo: 用户名:密码@github.com:用户名/用户名.github.io.git</span><br><span class="line"> branch: master</span><br></pre></td></tr></table></figure></p>
<p>repo的链接为刚刚复制的链接,按照上面修改</p>
<h4 id="通过ssh密钥配置Github"><a href="#通过ssh密钥配置Github" class="headerlink" title="通过ssh密钥配置Github"></a>通过ssh密钥配置Github</h4><p>生成密钥<br><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">$ ssh-keygen -t rsa -C <span class="string">"youremail@example.com"</span></span><br></pre></td></tr></table></figure></p>
<p>-C 后面指定的是你注册GitHub的邮箱<br>回车之后,有三个输入,第一个输入是ssh密钥放置的路径(默认是目录下的.ssh)不输入即默认,第二个输入是密钥的密码,第三个确认密码。</p>
<p>进入家目录/.ssh/下,把公钥复制<br><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> ~/.ssh</span><br><span class="line">$ cat id_rsa.pub</span><br><span class="line">$ 一堆英文字符输出,复制这一堆东西</span><br></pre></td></tr></table></figure></p>
<p>上Github主页找到账户的Setting,把它复制到如下图,添加即可<br><img src="SSHkey.png" alt="如图"></p>
<p>添加完成后可以测试是否配置git完毕<br><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">$ ssh git@github.com</span><br></pre></td></tr></table></figure></p>
<p>返回信息为Hi的话,则配置成功</p>
<h3 id="部署到Github上"><a href="#部署到Github上" class="headerlink" title="部署到Github上"></a>部署到Github上</h3><p>进入到hexo目录下,添加github的nodejs插件<br><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">$ npm install hexo-deployer-git --save</span><br></pre></td></tr></table></figure></p>
<p>最后生成静态文件和部署到github上<br><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 g -d</span><br></pre></td></tr></table></figure></p>
<p>完成后,访问一下: <strong>用户名</strong>.github.io,正常访问就ok啦<br>若有其他疑问,请访问<a href="https://hexo.io/docs/deployment.html" target="_blank" rel="noopener">Hexo</a>官网</p>
<hr>
<p>买了一个域名,以后可以通过<a href="http://www.tonyguy.online" target="_blank" rel="noopener">www.tonyguy.online</a>访问该博客</p>
</div>
<a type="button" href="/2018/10/11/HexoInstall/#more" class="btn btn-default more">Read More</a>
</div>
</div>
<!-- pagination -->
<div>
<center>
<div class="pagination">
</div>
</center>
</div>
</div> <!-- col-md-9 -->
<div class="col-md-3">
<div id="sidebar">
<div id="site_search">
<div class="form-group">
<input type="text" id="local-search-input" name="q" results="0" placeholder="Search" class="st-search-input st-default-search-input form-control">
</div>
<div id="local-search-result"></div>
</div>
<div class="widget">
<h4>Tag Cloud</h4>
<ul class="tag_box inline list-unstyled">
<li><a href="/tags/HomeWork/">HomeWork<span>2</span></a></li>
<li><a href="/tags/Hexo/">Hexo<span>1</span></a></li>
<li><a href="/tags/tips/">tips<span>2</span></a></li>
<li><a href="/tags/C/">C++<span>3</span></a></li>
<li><a href="/tags/教程/">教程<span>1</span></a></li>
<li><a href="/tags/Algorithm/">Algorithm<span>1</span></a></li>
</ul>
</div>
<div class="widget">
<h4>Recent Posts</h4>
<ul class="entry list-unstyled">
<li>
<a href="/2019/03/31/KMPAlgorithm/"><i class="fa fa-file-o"></i>KMP算法</a>
</li>
<li>
<a href="/2019/03/30/ProblemOfTemplateClass/"><i class="fa fa-file-o"></i>问题:模板类声明与实现</a>
</li>
<li>
<a href="/2019/03/29/differ-temp/"><i class="fa fa-file-o"></i>问题:用typedef定义模板别名</a>
</li>
<li>
<a href="/2018/12/09/LibAssigement/"><i class="fa fa-file-o"></i>实验室任务</a>
</li>
<li>
<a href="/2018/11/14/FirstHW/"><i class="fa fa-file-o"></i>第一次C++程序作业</a>
</li>
</ul>
</div>
<div class="widget">
<h4>Links</h4>
<ul class="blogroll list-unstyled">
<li><i class="fa fa-github"></i><a href="http://www.github.com/TonyGuy" title="My Github account." target="_blank" ]);"="">Github</a></li>
<li><i class="fa fa-github"></i><a href="http://github.com/TonyGuy/HomeWork" title="HomeWork" target="_blank" ]);"="">HomeWork</a></li>
<li><i class="fa fa-heart"></i><a href="http://love.tonyguy.online" title="LOVE" target="_blank" ]);"="">.</a></li>
</ul>
</div>
</div> <!-- sidebar -->
</div> <!-- col-md-3 -->
</div> <!-- row-fluid -->
</div>
</div>
<div class="container-narrow">
<footer> <p>
© 2019 Tony
with help from <a href="http://hexo.io/" target="_blank">Hexo</a>,<a href="http://github.com/wzpan/hexo-theme-freemind/">Freemind</a>,<a href="http://getbootstrap.com/" target="_blank">Twitter Bootstrap</a> and <a href="http://getbootstrap.com/" target="_blank">BOOTSTRA.386</a>.
<br> Theme by <a href="http://github.com/wzpan/hexo-theme-freemind/">Freemind.386</a>.
</p>
</footer>
</div> <!-- container-narrow -->
<a id="gotop" href="#">
<span>⬆︎TOP</span>
</a>
<script src="/js/jquery.imagesloaded.min.js"></script>
<script src="/js/gallery.js"></script>
<script src="/js/bootstrap.min.js"></script>
<script src="/js/main.js"></script>
<script src="/js/search.js"></script>
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css" media="screen" type="text/css">
<script src="/fancybox/jquery.fancybox.pack.js"></script>
<script type="text/javascript">
(function($){
$('.fancybox').fancybox();
})(jQuery);
</script>
<script type="text/javascript">
var search_path = "search.xml";
if (search_path.length == 0) {
search_path = "search.xml";
}
var path = "/" + search_path;
searchFunc(path, 'local-search-input', 'local-search-result');
</script>
</body>
</html>