-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
481 lines (259 loc) · 112 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>一叶知秋</title>
<subtitle>不迷失,不彷徨</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="https://blog.fomeiherz.top/"/>
<updated>2019-04-03T08:24:40.413Z</updated>
<id>https://blog.fomeiherz.top/</id>
<author>
<name>Fomeiherz</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>Decryptable algorithm for java</title>
<link href="https://blog.fomeiherz.top/2019/04/03/decryptable-algorithm-for-java/"/>
<id>https://blog.fomeiherz.top/2019/04/03/decryptable-algorithm-for-java/</id>
<published>2019-04-03T08:23:40.000Z</published>
<updated>2019-04-03T08:24:40.413Z</updated>
<content type="html"><![CDATA[<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line">public class CrypToUtils {</span><br><span class="line"></span><br><span class="line"> private static final String UNICODE_FORMAT = "UTF8";</span><br><span class="line"> public static final String DESEDE_ENCRYPTION_SCHEME = "DESede";</span><br><span class="line"> private KeySpec ks;</span><br><span class="line"> private SecretKeyFactory skf;</span><br><span class="line"> private Cipher cipher;</span><br><span class="line"> byte[] arrayBytes;</span><br><span class="line"> private String myEncryptionKey;</span><br><span class="line"> private String myEncryptionScheme;</span><br><span class="line"> SecretKey key;</span><br><span class="line"></span><br><span class="line"> public CrypToUtils() throws Exception {</span><br><span class="line"> myEncryptionKey = "kOkzc^qxwJXiUvXvoaps$a3#";</span><br><span class="line"> myEncryptionScheme = DESEDE_ENCRYPTION_SCHEME;</span><br><span class="line"> arrayBytes = myEncryptionKey.getBytes(UNICODE_FORMAT);</span><br><span class="line"> ks = new DESedeKeySpec(arrayBytes);</span><br><span class="line"> skf = SecretKeyFactory.getInstance(myEncryptionScheme);</span><br><span class="line"> cipher = Cipher.getInstance(myEncryptionScheme);</span><br><span class="line"> key = skf.generateSecret(ks);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> public String fixKeyEncode(String unencryptedString) {</span><br><span class="line"> String encryptedString = null;</span><br><span class="line"> try {</span><br><span class="line"> cipher.init(Cipher.ENCRYPT_MODE, key);</span><br><span class="line"> byte[] plainText = unencryptedString.getBytes(UNICODE_FORMAT);</span><br><span class="line"> byte[] encryptedText = cipher.doFinal(plainText);</span><br><span class="line"> encryptedString = new String(Base64.encodeBase64(encryptedText));</span><br><span class="line"> } catch (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> return encryptedString;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> public String fixKeyDecode(String encryptedString) {</span><br><span class="line"> String decryptedText=null;</span><br><span class="line"> try {</span><br><span class="line"> cipher.init(Cipher.DECRYPT_MODE, key);</span><br><span class="line"> byte[] encryptedText = Base64.decodeBase64(encryptedString);</span><br><span class="line"> byte[] plainText = cipher.doFinal(encryptedText);</span><br><span class="line"> decryptedText= new String(plainText);</span><br><span class="line"> } catch (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> return decryptedText;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> public static void main(String[] args) throws Exception {</span><br><span class="line"> CrypToUtils td= new CrypToUtils();</span><br><span class="line"></span><br><span class="line"> String target="16";</span><br><span class="line"> String encrypted=td.fixKeyEncode(target);</span><br><span class="line"> String decrypted=td.fixKeyDecode(encrypted);</span><br><span class="line"></span><br><span class="line"> System.out.println("String To Encrypt: "+ target);</span><br><span class="line"> System.out.println("Encrypted String:" + encrypted);</span><br><span class="line"> System.out.println("Decrypted String:" + decrypted);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class
</summary>
</entry>
<entry>
<title>@Lock缓存设计的流程</title>
<link href="https://blog.fomeiherz.top/2019/04/02/lock-annotation-design/"/>
<id>https://blog.fomeiherz.top/2019/04/02/lock-annotation-design/</id>
<published>2019-04-02T11:28:29.000Z</published>
<updated>2019-04-02T11:29:30.000Z</updated>
<content type="html"><![CDATA[<p>流程图:<br><img src="http://sharefile.fomeiherz.top/image/@Lock%20design.jpg" alt="avatar"></p>]]></content>
<summary type="html">
<p>流程图:<br><img src="http://sharefile.fomeiherz.top/image/@Lock%20design.jpg" alt="avatar"></p>
</summary>
</entry>
<entry>
<title>@Cache缓存设计的流程</title>
<link href="https://blog.fomeiherz.top/2019/04/02/cache-annotation-design/"/>
<id>https://blog.fomeiherz.top/2019/04/02/cache-annotation-design/</id>
<published>2019-04-02T11:24:40.000Z</published>
<updated>2019-04-02T11:27:06.000Z</updated>
<content type="html"><![CDATA[<p>流程图如下:<br><img src="http://sharefile.fomeiherz.top/image/@Cache%20design.jpg" alt="avatar"></p>]]></content>
<summary type="html">
<p>流程图如下:<br><img src="http://sharefile.fomeiherz.top/image/@Cache%20design.jpg" alt="avatar"></p>
</summary>
</entry>
<entry>
<title>How to use postman to bulk insert data in Elasticsearch</title>
<link href="https://blog.fomeiherz.top/2019/03/20/How-to-use-postman-to-bulk-insert-data-in-Elasticsearch/"/>
<id>https://blog.fomeiherz.top/2019/03/20/How-to-use-postman-to-bulk-insert-data-in-Elasticsearch/</id>
<published>2019-03-20T05:08:42.000Z</published>
<updated>2019-03-22T13:36:21.000Z</updated>
<content type="html"><![CDATA[<ul><li>Request method: POST</li><li>Headers: [“Content-Type”: “application/x-ndjson”]</li><li>Body type: raw</li><li>Body content format: Every json String must newline. And per-line json String must has no space.</li><li>Body content example:<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">{"index":{"_index":"schools_","_type":"school","_id":"1"}}</span><br><span class="line">{"name":"Model School","description":"CBSE Affiliation","street":"silk city","city":"Hyderabad","state":"AP","zip":"500030","location":[17.3903703,78.4752129],"fees":200,"tags":["Senior Secondary","beautiful campus"],"rating":"3"}</span><br><span class="line">{"index":{"_index":"schools_","_type":"school","_id":"2"}}</span><br><span class="line">{"name":"Government School","description":"State Board Affiliation","street":"Hinjewadi","city":"Pune","state":"MH","zip":"411057","location":[18.599752,73.6821995],"fees":500,"tags":["Great Sports"],"rating":"4"}</span><br></pre></td></tr></table></figure></li></ul><p>This is an example, click to download and import to postman: <a href="http://sharefile.fomeiherz.top/blog/es_example.postman_collection.json" title="Postman export example" target="_blank" rel="noopener">Postman export example</a></p>]]></content>
<summary type="html">
<ul>
<li>Request method: POST</li>
<li>Headers: [“Content-Type”: “application/x-ndjson”]</li>
<li>Body type: raw</li>
<li>Body content forma
</summary>
</entry>
<entry>
<title>Python3 + Centos7: No module named 'MySQLdb'</title>
<link href="https://blog.fomeiherz.top/2019/03/19/No-module-named-MySQLdb/"/>
<id>https://blog.fomeiherz.top/2019/03/19/No-module-named-MySQLdb/</id>
<published>2019-03-19T09:35:08.000Z</published>
<updated>2019-03-19T10:13:26.000Z</updated>
<content type="html"><![CDATA[<figure class="highlight plain"><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 yum install mariadb-devel </span><br><span class="line">sudo pip3 install mysqlclient</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td>
</summary>
</entry>
<entry>
<title>Apriori Algorithm</title>
<link href="https://blog.fomeiherz.top/2018/07/08/Apriori-Algorithm/"/>
<id>https://blog.fomeiherz.top/2018/07/08/Apriori-Algorithm/</id>
<published>2018-07-07T17:00:29.000Z</published>
<updated>2018-07-07T17:01:35.000Z</updated>
<content type="html"><![CDATA[<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><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></pre></td><td class="code"><pre><span class="line">"""</span><br><span class="line">Apriori exercise.</span><br><span class="line">"""</span><br><span class="line"></span><br><span class="line">def load_dataset():</span><br><span class="line"> return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">'''</span><br><span class="line">输入:源数据</span><br><span class="line">功能:从源数据提取候选项</span><br><span class="line">返回:1item是大小为1的所有候选项集的集合</span><br><span class="line">'''</span><br><span class="line">def create_1item(dataset):</span><br><span class="line"> k_items = []</span><br><span class="line"> for transaction in dataset:</span><br><span class="line"> for item in transaction:</span><br><span class="line"> if [item] not in k_items:</span><br><span class="line"> k_items.append([item])</span><br><span class="line"> k_items.sort()</span><br><span class="line"> return list(map(frozenset, k_items))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">'''</span><br><span class="line">输入:</span><br><span class="line"> 总数据集</span><br><span class="line"> k项的所有组合</span><br><span class="line"> 最小支持度</span><br><span class="line">功能:计算k_items中的项集在数据集中的支持度</span><br><span class="line">输出:</span><br><span class="line"> 满足支持度的候选项</span><br><span class="line"> 各个候选项支持度</span><br><span class="line">'''</span><br><span class="line">def scan_dataset(dataset, k_items, min_support):</span><br><span class="line"> k_item_dict = {}</span><br><span class="line"> for transaction in dataset:</span><br><span class="line"> for k_item in k_items:</span><br><span class="line"> # 对于每一个候选项集k_item,检查是否是transaction的一部分</span><br><span class="line"> if k_item.issubset(transaction):</span><br><span class="line"> k_item_dict[k_item] = k_item_dict.get(k_item, 0) + 1</span><br><span class="line"> # 总记录数</span><br><span class="line"> dataset_count = float(len(dataset))</span><br><span class="line"> result_list = []</span><br><span class="line"> support_dict = {}</span><br><span class="line"> for k_item in k_item_dict:</span><br><span class="line"> # 每个项集的支持度 = 包含该项集的记录 / 总记录</span><br><span class="line"> support = k_item_dict[k_item] / dataset_count</span><br><span class="line"> # 将满足最小支持度的项集,加入retList</span><br><span class="line"> if support >= min_support:</span><br><span class="line"> result_list.insert(0, k_item)</span><br><span class="line"> # 汇总支持度数据</span><br><span class="line"> support_dict[k_item] = support</span><br><span class="line"> return result_list, support_dict</span><br><span class="line"></span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> k_items = create_1item(load_dataset())</span><br><span class="line"> result_tuple = scan_dataset(load_dataset(), k_items, 0.5)</span><br><span class="line"> # print(type(result_tuple))</span><br><span class="line"> print(result_tuple[0])</span><br><span class="line"> print(result_tuple[1])</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class
</summary>
</entry>
<entry>
<title>基于用户的协同过滤算法</title>
<link href="https://blog.fomeiherz.top/2018/07/04/%E5%9F%BA%E4%BA%8E%E7%94%A8%E6%88%B7%E7%9A%84%E5%8D%8F%E5%90%8C%E8%BF%87%E6%BB%A4%E7%AE%97%E6%B3%95/"/>
<id>https://blog.fomeiherz.top/2018/07/04/基于用户的协同过滤算法/</id>
<published>2018-07-04T11:57:19.000Z</published>
<updated>2018-07-07T11:55:33.000Z</updated>
<content type="html"><![CDATA[<p>电影点赞数据:<a href="https://grouplens.org/datasets/movielens/" target="_blank" rel="noopener">https://grouplens.org/datasets/movielens/</a><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><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br></pre></td><td class="code"><pre><span class="line"># -*- coding=utf-8 -*-</span><br><span class="line"></span><br><span class="line">import math</span><br><span class="line">import sys</span><br><span class="line">from texttable import Texttable</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#</span><br><span class="line"># 使用 |A&B|/sqrt(|A||B|)计算余弦距离</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line">def calcCosDistSpe(user1, user2):</span><br><span class="line"> avg_x = 0.0</span><br><span class="line"> avg_y = 0.0</span><br><span class="line"> for key in user1:</span><br><span class="line"> avg_x += key[1]</span><br><span class="line"> avg_x = avg_x / len(user1)</span><br><span class="line"></span><br><span class="line"> for key in user2:</span><br><span class="line"> avg_y += key[1]</span><br><span class="line"> avg_y = avg_y / len(user2)</span><br><span class="line"></span><br><span class="line"> u1_u2 = 0.0</span><br><span class="line"> for key1 in user1:</span><br><span class="line"> for key2 in user2:</span><br><span class="line"> if key1[1] > avg_x and key2[1] > avg_y and key1[0] == key2[0]:</span><br><span class="line"> u1_u2 += 1</span><br><span class="line"> u1u2 = len(user1) * len(user2) * 1.0</span><br><span class="line"> sx_sy = u1_u2 / math.sqrt(u1u2)</span><br><span class="line"> return sx_sy</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#</span><br><span class="line"># 计算余弦距离</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line">def calcCosDist(user1, user2):</span><br><span class="line"> sum_x = 0.0</span><br><span class="line"> sum_y = 0.0</span><br><span class="line"> sum_xy = 0.0</span><br><span class="line"> for key1 in user1:</span><br><span class="line"> for key2 in user2:</span><br><span class="line"> if key1[0] == key2[0]:</span><br><span class="line"> sum_xy += key1[1] * key2[1]</span><br><span class="line"> sum_y += key2[1] * key2[1]</span><br><span class="line"> sum_x += key1[1] * key1[1]</span><br><span class="line"></span><br><span class="line"> if sum_xy == 0.0:</span><br><span class="line"> return 0</span><br><span class="line"> sx_sy = math.sqrt(sum_x * sum_y)</span><br><span class="line"> return sum_xy / sx_sy</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line"># 相似余弦距离</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line">def calcSimlaryCosDist(user1, user2):</span><br><span class="line"> sum_x = 0.0</span><br><span class="line"> sum_y = 0.0</span><br><span class="line"> sum_xy = 0.0</span><br><span class="line"> avg_x = 0.0</span><br><span class="line"> avg_y = 0.0</span><br><span class="line"> for key in user1:</span><br><span class="line"> avg_x += key[1]</span><br><span class="line"> avg_x = avg_x / len(user1)</span><br><span class="line"></span><br><span class="line"> for key in user2:</span><br><span class="line"> avg_y += key[1]</span><br><span class="line"> avg_y = avg_y / len(user2)</span><br><span class="line"></span><br><span class="line"> for key1 in user1:</span><br><span class="line"> for key2 in user2:</span><br><span class="line"> if key1[0] == key2[0]:</span><br><span class="line"> sum_xy += (key1[1] - avg_x) * (key2[1] - avg_y)</span><br><span class="line"> sum_y += (key2[1] - avg_y) * (key2[1] - avg_y)</span><br><span class="line"> sum_x += (key1[1] - avg_x) * (key1[1] - avg_x)</span><br><span class="line"></span><br><span class="line"> if sum_xy == 0.0:</span><br><span class="line"> return 0</span><br><span class="line"> sx_sy = math.sqrt(sum_x * sum_y)</span><br><span class="line"> return sum_xy / sx_sy</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#</span><br><span class="line"># 读取文件</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line">def readFile(file_name):</span><br><span class="line"> contents_lines = []</span><br><span class="line"> f = open(file_name, "r")</span><br><span class="line"> contents_lines = f.readlines()</span><br><span class="line"> f.close()</span><br><span class="line"> return contents_lines</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#</span><br><span class="line"># 解压rating信息,格式:用户id,电影id,用户rating,时间</span><br><span class="line"># 输入:数据集合</span><br><span class="line"># 输出:已经解压的排名信息</span><br><span class="line">#</span><br><span class="line">def getRatingInformation(ratings):</span><br><span class="line"> rates = []</span><br><span class="line"> for line in ratings[1:]:</span><br><span class="line"> rate = line.split(",")</span><br><span class="line"> rates.append([int(rate[0]), int(rate[1]), float(rate[2])])</span><br><span class="line"> return rates</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#</span><br><span class="line"># 生成用户评分的数据结构</span><br><span class="line">#</span><br><span class="line"># 输入:所以数据 [[2,1,5],[2,4,2]...]</span><br><span class="line"># 输出:1.用户打分字典 2.电影字典</span><br><span class="line"># 使用字典,key是用户id,value是用户对电影的评价,</span><br><span class="line"># rate_dic[2]=[(1,5),(4,2)].... 表示用户2对电影1的评分是5,对电影4的评分是2</span><br><span class="line">#</span><br><span class="line">def createUserRankDic(rates):</span><br><span class="line"> user_rate_dic = {}</span><br><span class="line"> item_to_user = {}</span><br><span class="line"> for i in rates:</span><br><span class="line"> user_rank = (i[1], i[2])</span><br><span class="line"> if i[0] in user_rate_dic:</span><br><span class="line"> user_rate_dic[i[0]].append(user_rank)</span><br><span class="line"> else:</span><br><span class="line"> user_rate_dic[i[0]] = [user_rank]</span><br><span class="line"></span><br><span class="line"> if i[1] in item_to_user:</span><br><span class="line"> item_to_user[i[1]].append(i[0])</span><br><span class="line"> else:</span><br><span class="line"> item_to_user[i[1]] = [i[0]]</span><br><span class="line"></span><br><span class="line"> return user_rate_dic, item_to_user</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#</span><br><span class="line"># 计算与指定用户最相近的邻居</span><br><span class="line"># 输入:</span><br><span class="line"># 指定用户ID</span><br><span class="line"># 所有用户数据。用户字典:dic[用户id]=[(电影id,电影评分)...]</span><br><span class="line"># 所有物品数据。电影字典:dic[电影id]=[用户id1,用户id2...]</span><br><span class="line"># 输出:与指定用户最相邻的邻居列表</span><br><span class="line">#</span><br><span class="line">def calcNearestNeighbor(userid, users_dic, item_dic):</span><br><span class="line"> neighbors = []</span><br><span class="line"> # neighbors.append(userid)</span><br><span class="line"> for item in users_dic[userid]:</span><br><span class="line"> for neighbor in item_dic[item[0]]:</span><br><span class="line"> if neighbor != userid and neighbor not in neighbors:</span><br><span class="line"> # 共同喜欢item物品的用户</span><br><span class="line"> neighbors.append(neighbor)</span><br><span class="line"></span><br><span class="line"> neighbors_dist = []</span><br><span class="line"> for neighbor in neighbors:</span><br><span class="line"> # calcSimlaryCosDist calcCosDist calcCosDistSpe</span><br><span class="line"> dist = calcSimlaryCosDist(users_dic[userid], users_dic[neighbor])</span><br><span class="line"> neighbors_dist.append([dist, neighbor])</span><br><span class="line"> neighbors_dist.sort(reverse=True)</span><br><span class="line"> # print neighbors_dist</span><br><span class="line"> return neighbors_dist</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#</span><br><span class="line"># 使用UserFC进行推荐</span><br><span class="line"># 输入:文件名,用户ID,邻居数量</span><br><span class="line"># 输出:推荐的电影ID,输入用户的电影列表,电影对应用户的反序表,邻居列表</span><br><span class="line">#</span><br><span class="line">def recommendByUserFC(file_name, userid, k=5):</span><br><span class="line"> # 读取文件数据</span><br><span class="line"> test_contents = readFile(file_name)</span><br><span class="line"></span><br><span class="line"> # 文件数据格式化成二维数组 List[[用户id,电影id,电影评分]...]</span><br><span class="line"> test_rates = getRatingInformation(test_contents)</span><br><span class="line"></span><br><span class="line"> # 格式化成字典数据</span><br><span class="line"> # 1.用户字典:dic[用户id]=[(电影id,电影评分)...]</span><br><span class="line"> # 2.电影字典:dic[电影id]=[用户id1,用户id2...]</span><br><span class="line"> test_user_dic, test_item_to_user = createUserRankDic(test_rates)</span><br><span class="line"></span><br><span class="line"> # 邻近用户列表:[(和指定用户的距离,用户id)...]</span><br><span class="line"> neighbors = calcNearestNeighbor(userid, test_user_dic, test_item_to_user)[:k]</span><br><span class="line"></span><br><span class="line"> # 推荐列表:{"电影id":"累计推荐得分"...}</span><br><span class="line"> recommend_dic = {}</span><br><span class="line"> for neighbor in neighbors:</span><br><span class="line"> neighbor_user_id = neighbor[1]</span><br><span class="line"> movies = test_user_dic[neighbor_user_id]</span><br><span class="line"> for movie in movies:</span><br><span class="line"> if movie[0] not in recommend_dic:</span><br><span class="line"> recommend_dic[movie[0]] = neighbor[0]</span><br><span class="line"> else:</span><br><span class="line"> # 累计推荐得分</span><br><span class="line"> recommend_dic[movie[0]] += neighbor[0]</span><br><span class="line"></span><br><span class="line"> # 建立推荐列表:[(累计推荐得分,电影id)...]</span><br><span class="line"> recommend_list = []</span><br><span class="line"> for key in recommend_dic:</span><br><span class="line"> # print key</span><br><span class="line"> recommend_list.append([recommend_dic[key], key])</span><br><span class="line"></span><br><span class="line"> # 按得分排序</span><br><span class="line"> recommend_list.sort(reverse=True)</span><br><span class="line"> # 指定用户喜欢的电影列表</span><br><span class="line"> user_movies = [i[0] for i in test_user_dic[userid]]</span><br><span class="line"></span><br><span class="line"> return [i[1] for i in recommend_list], user_movies, test_item_to_user, neighbors</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line"># 获取电影的列表,格式:电影id,电影名,电影发布时间</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line">def getMoviesList(file_name):</span><br><span class="line"> # print sys.getdefaultencoding()</span><br><span class="line"> movies_contents = readFile(file_name)</span><br><span class="line"> movies_info = {}</span><br><span class="line"> for movie in movies_contents[1:]:</span><br><span class="line"> movie_info = movie.split(",")</span><br><span class="line"> movies_info[int(movie_info[0])] = movie_info[1:]</span><br><span class="line"> return movies_info</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"># 主程序</span><br><span class="line"># 输入 : 测试数据集合</span><br><span class="line">if __name__ == '__main__':</span><br><span class="line"> # reload(sys)</span><br><span class="line"> # sys.setdefaultencoding('utf-8')</span><br><span class="line"> movies = getMoviesList("E:\\data_mining\\recommend\\ml-latest-small\\movies.csv")</span><br><span class="line"> # 推荐电影列表:["电影id"...]</span><br><span class="line"> # 指定用户喜欢的电影列表:["电影id"...]</span><br><span class="line"> # 电影字典:dic[电影id]=[用户id1,用户id2...]</span><br><span class="line"> # 邻近用户列表:[(和指定用户的距离,用户id)...]</span><br><span class="line"> recommend_list, user_movie, items_movie, neighbors = recommendByUserFC("E:\\data_mining\\recommend\\ml-latest-small\\ratings.csv", 179, 80)</span><br><span class="line"> # 所有邻近的用户列表:["用户id"...]</span><br><span class="line"> neighbors_id = [i[1] for i in neighbors]</span><br><span class="line"> table = Texttable()</span><br><span class="line"> table.set_deco(Texttable.HEADER)</span><br><span class="line"> # t: text</span><br><span class="line"> # f: float (decimal)</span><br><span class="line"> # e: float (exponent)</span><br><span class="line"> # i: integer</span><br><span class="line"> # a: automatic</span><br><span class="line"> table.set_cols_dtype(['t', 't', 't'])</span><br><span class="line"> # l: left</span><br><span class="line"> # r: right</span><br><span class="line"> # c: center</span><br><span class="line"> table.set_cols_align(["l", "l", "l"])</span><br><span class="line"> rows = []</span><br><span class="line"> rows.append(["movie name", "release", "from userid"])</span><br><span class="line"> # 前20推荐电影id</span><br><span class="line"> for movie_id in recommend_list[:20]:</span><br><span class="line"> from_user = []</span><br><span class="line"> # 喜欢该电影的所有用户id</span><br><span class="line"> for user_id in items_movie[movie_id]:</span><br><span class="line"> # 并且为邻近用户</span><br><span class="line"> if user_id in neighbors_id:</span><br><span class="line"> from_user.append(str(user_id))</span><br><span class="line"> # 取出电影的信息</span><br><span class="line"> rows.append([movies[movie_id][0], movies[movie_id][1], ','.join(from_user)])</span><br><span class="line"> table.add_rows(rows)</span><br><span class="line"> print(table.draw())</span><br></pre></td></tr></table></figure></p>]]></content>
<summary type="html">
<p>电影点赞数据:<a href="https://grouplens.org/datasets/movielens/" target="_blank" rel="noopener">https://grouplens.org/datasets/movielens/</a><b
</summary>
</entry>
<entry>
<title>Funny Website</title>
<link href="https://blog.fomeiherz.top/2018/07/04/Funny-Website/"/>
<id>https://blog.fomeiherz.top/2018/07/04/Funny-Website/</id>
<published>2018-07-04T04:04:06.000Z</published>
<updated>2018-07-04T04:52:01.000Z</updated>
<content type="html"><![CDATA[<p>Sentdex Blog: <a href="https://pythonprogramming.net/" target="_blank" rel="noopener">https://pythonprogramming.net/</a><br>Sentdex Youtube: <a href="https://www.youtube.com/user/sentdex/featured?pbjreload=10" target="_blank" rel="noopener">https://www.youtube.com/user/sentdex/featured?pbjreload=10</a></p><p>WSL(Windows Subsystem for Linux): <a href="https://chocolatey.org/" target="_blank" rel="noopener">https://chocolatey.org/</a></p>]]></content>
<summary type="html">
<p>Sentdex Blog: <a href="https://pythonprogramming.net/" target="_blank" rel="noopener">https://pythonprogramming.net/</a><br>Sentdex Youtu
</summary>
</entry>
<entry>
<title>JaccardSimilarity计算文本相似度</title>
<link href="https://blog.fomeiherz.top/2018/07/03/JaccardSimilarity%E8%AE%A1%E7%AE%97%E6%96%87%E6%9C%AC%E7%9B%B8%E4%BC%BC%E5%BA%A6/"/>
<id>https://blog.fomeiherz.top/2018/07/03/JaccardSimilarity计算文本相似度/</id>
<published>2018-07-02T16:05:12.000Z</published>
<updated>2018-07-02T16:06:37.000Z</updated>
<content type="html"><![CDATA[<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br></pre></td><td class="code"><pre><span class="line"># -*- coding=utf-8 -*-</span><br><span class="line"></span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line"># refer to : https://github.com/wyh267/myCodeLib/blob/master/Src/textDiff/JaccardSimilarity.py</span><br><span class="line">#</span><br><span class="line"># 利用jaccard similarity 计算文本相似度</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line">#</span><br><span class="line"></span><br><span class="line">import os</span><br><span class="line">import time</span><br><span class="line">import progressbar</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#############################################</span><br><span class="line">#</span><br><span class="line"># 读取文件,保存到一个字符串中</span><br><span class="line"># 输入: 文件名完整路径</span><br><span class="line"># 输出: 文件内容</span><br><span class="line">#</span><br><span class="line">#############################################</span><br><span class="line">def read_file(file_name):</span><br><span class="line"> f = open(file_name, "r")</span><br><span class="line"> file_contents = f.read()</span><br><span class="line"> file_contents = file_contents.replace("\t", "")</span><br><span class="line"> file_contents = file_contents.replace("\r", "")</span><br><span class="line"> file_contents = file_contents.replace("\n", "")</span><br><span class="line"> f.close()</span><br><span class="line"> return file_contents</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#############################################</span><br><span class="line">#</span><br><span class="line"># 分割字符串,使用k-shingle方式进行分割</span><br><span class="line"># 输入:字符串,k值</span><br><span class="line"># 输出:分割好的字符串,存入数组中</span><br><span class="line">#</span><br><span class="line">#############################################</span><br><span class="line">def split_contents(content, k=5):</span><br><span class="line"> content_split = []</span><br><span class="line"> for i in range(len(content) - k):</span><br><span class="line"> content_split.append(content[i:i + k])</span><br><span class="line"> return content_split</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#############################################</span><br><span class="line">#</span><br><span class="line"># 将数据保存到hash表中,也就是某个集合</span><br><span class="line"># 输入:已经分隔好的数据</span><br><span class="line"># 输出:hash表</span><br><span class="line">#</span><br><span class="line">#############################################</span><br><span class="line">def hash_contents_list(content_list):</span><br><span class="line"> hash_content = {}</span><br><span class="line"> for i in content_list:</span><br><span class="line"> if i in hash_content:</span><br><span class="line"> hash_content[i] = hash_content[i] + 1</span><br><span class="line"> else:</span><br><span class="line"> hash_content[i] = 1</span><br><span class="line"> return hash_content</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#############################################</span><br><span class="line">#</span><br><span class="line"># 计算交集</span><br><span class="line"># 输入:两个hash表</span><br><span class="line"># 输出:交集的整数</span><br><span class="line">#</span><br><span class="line">#############################################</span><br><span class="line">def calc_intersection(hash_a, hash_b):</span><br><span class="line"> intersection = 0</span><br><span class="line"> if (len(hash_a) <= len(hash_b)):</span><br><span class="line"> hash_min = hash_a</span><br><span class="line"> hash_max = hash_b</span><br><span class="line"> else:</span><br><span class="line"> hash_min = hash_b</span><br><span class="line"> hash_max = hash_a</span><br><span class="line"></span><br><span class="line"> for key in hash_min:</span><br><span class="line"> if key in hash_max:</span><br><span class="line"> if (hash_min[key] <= hash_max[key]):</span><br><span class="line"> intersection = intersection + hash_min[key]</span><br><span class="line"> else:</span><br><span class="line"> intersection = intersection + hash_max[key]</span><br><span class="line"></span><br><span class="line"> return intersection</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#############################################</span><br><span class="line">#</span><br><span class="line"># 计算并集</span><br><span class="line"># 输入:两个hash表</span><br><span class="line"># 输出:并集的整数</span><br><span class="line">#</span><br><span class="line">#############################################</span><br><span class="line">def calc_union_set(hash_a, hash_b, intersection):</span><br><span class="line"> union_set = 0</span><br><span class="line"></span><br><span class="line"> for key in hash_a:</span><br><span class="line"> union_set = union_set + hash_a[key]</span><br><span class="line"> for key in hash_b:</span><br><span class="line"> union_set = union_set + hash_b[key]</span><br><span class="line"></span><br><span class="line"> return union_set - intersection</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#############################################</span><br><span class="line">#</span><br><span class="line"># 计算相似度</span><br><span class="line"># 输入:交集和并集</span><br><span class="line"># 输出:相似度</span><br><span class="line"># </span><br><span class="line">#############################################</span><br><span class="line">def calc_similarity(intersection, union_set):</span><br><span class="line"> if (union_set > 0):</span><br><span class="line"> return float(intersection) / float(union_set)</span><br><span class="line"> else:</span><br><span class="line"> return 0.0</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#############################################</span><br><span class="line">#</span><br><span class="line"># 从某个文本文件获取一个集合,该集合保存了文本中单词的出现频率</span><br><span class="line"># 输入:文件名,k值,默认为5</span><br><span class="line"># 输出:一个词频的hash表</span><br><span class="line">#</span><br><span class="line">#############################################</span><br><span class="line">def get_hash_info_from_file(file_name, k=5):</span><br><span class="line"> content = read_file(file_name)</span><br><span class="line"> content_list = split_contents(content, k)</span><br><span class="line"> hash_content = hash_contents_list(content_list)</span><br><span class="line"> return hash_content</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#############################################</span><br><span class="line">#</span><br><span class="line"># 获取文件列表</span><br><span class="line"># 输入:目录名</span><br><span class="line"># 输出:文件列表,文件名列表</span><br><span class="line">#</span><br><span class="line">############################################# </span><br><span class="line">def collect_file_list(file_path):</span><br><span class="line"> print("获取文件列表....")</span><br><span class="line"> start = time.time()</span><br><span class="line"> file_name_list = []</span><br><span class="line"> file_names = []</span><br><span class="line"> for parent, dirnames, filenames in os.walk(file_path):</span><br><span class="line"> # print filenames</span><br><span class="line"> for file_name in filenames:</span><br><span class="line"> if (file_name[-4:] == ".txt"):</span><br><span class="line"> file_name_list.append(file_path + file_name)</span><br><span class="line"> file_names.append(file_name)</span><br><span class="line"> end = time.time()</span><br><span class="line"> print("获取文件列表结束,用时: " + str(end - start) + u"秒")</span><br><span class="line"> return file_name_list, file_names</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#############################################</span><br><span class="line">#</span><br><span class="line"># 获取每个文件词汇</span><br><span class="line"># 输入:文件列表</span><br><span class="line"># 输出:词汇表列表</span><br><span class="line">#</span><br><span class="line">############################################# </span><br><span class="line">def get_all_files_words_list(file_name_list, file_names, k=5):</span><br><span class="line"> print("获取每个文本的词汇词频表....")</span><br><span class="line"> start = time.time()</span><br><span class="line"> hash_contents = []</span><br><span class="line"> all = float(len(file_name_list))</span><br><span class="line"> pos = 0.0</span><br><span class="line"> pro = progressbar.ProgressBar().start()</span><br><span class="line"> # 获取每个文本的词汇词频表</span><br><span class="line"> for index, file_name in enumerate(file_name_list):</span><br><span class="line"> pos = pos + 1</span><br><span class="line"> rate_num = int(pos / all * 100)</span><br><span class="line"> pro.update(rate_num)</span><br><span class="line"> # time.sleep(0.1)</span><br><span class="line"> hash_contents.append([get_hash_info_from_file(file_name, k), file_names[index]])</span><br><span class="line"></span><br><span class="line"> pro.finish()</span><br><span class="line"> end = time.time()</span><br><span class="line"> print("获取每个文本的词汇词频表结束,用时: " + str(end - start) + u"秒")</span><br><span class="line"> return hash_contents</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#############################################</span><br><span class="line">#</span><br><span class="line"># 计算两两相似度</span><br><span class="line"># 输入:哈希数据列表</span><br><span class="line"># 输出:相似度数组</span><br><span class="line">#</span><br><span class="line">############################################# </span><br><span class="line">def calc_each_similar(hash_contents):</span><br><span class="line"> print("计算所有文本互相之间的相似度....")</span><br><span class="line"> start = time.time()</span><br><span class="line"> similar_list = []</span><br><span class="line"> all = float(len(hash_contents))</span><br><span class="line"> pos = 0.0</span><br><span class="line"> pro = progressbar.ProgressBar().start()</span><br><span class="line"> for index1, v1 in enumerate(hash_contents):</span><br><span class="line"> pos = pos + 1</span><br><span class="line"> rate_num = int(pos / all * 100)</span><br><span class="line"> pro.update(rate_num)</span><br><span class="line"> # time.sleep(0.1)</span><br><span class="line"> # print "%02d" % int(pos/all*100),</span><br><span class="line"> for index2, v2 in enumerate(hash_contents):</span><br><span class="line"> if (v1[1] != v2[1] and index2 > index1):</span><br><span class="line"> intersection = calc_intersection(v1[0], v2[0]) # 计算交集</span><br><span class="line"> union_set = calc_union_set(v1[0], v2[0], intersection) # 计算并集</span><br><span class="line"> similar = calc_similarity(intersection, union_set)</span><br><span class="line"> similar_list.append([similar, v1[1], v2[1]])</span><br><span class="line"> # print v1[1]+ "||||||" + v2[1] + " similarity is : " + str(calcSimilarity(intersection,union_set)) #计算相似度</span><br><span class="line"> pro.finish()</span><br><span class="line"> similar_list.sort()</span><br><span class="line"> similar_list.reverse()</span><br><span class="line"> end = time.time()</span><br><span class="line"> print("计算所有文本互相之间的相似度结束,用时: " + str(end - start) + u"秒")</span><br><span class="line"> return similar_list</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">#############################################</span><br><span class="line">#</span><br><span class="line"># 主程序</span><br><span class="line"># 输入:路径和k-shingle中的k值</span><br><span class="line"># 输出:两两相似度数组</span><br><span class="line">#</span><br><span class="line">#############################################</span><br><span class="line">def calc_similarity_by_words(file_path, k=5):</span><br><span class="line"> # 获取文件列表</span><br><span class="line"> file_name_list, file_names = collect_file_list(file_path)</span><br><span class="line"> # 获取每个文件词汇</span><br><span class="line"> hash_contents = get_all_files_words_list(file_name_list, file_names, k)</span><br><span class="line"> # 计算文件的相似度</span><br><span class="line"> res = calc_each_similar(hash_contents)</span><br><span class="line"> return res</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">print(calc_similarity_by_words("G:\\temp\\"))</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class
</summary>
</entry>
<entry>
<title>个人文档记录</title>
<link href="https://blog.fomeiherz.top/2018/05/24/%E4%B8%AA%E4%BA%BA%E6%96%87%E6%A1%A3%E8%AE%B0%E5%BD%95/"/>
<id>https://blog.fomeiherz.top/2018/05/24/个人文档记录/</id>
<published>2018-05-24T01:48:29.000Z</published>
<updated>2018-05-25T04:11:56.000Z</updated>
<content type="html"><![CDATA[<h5 id="RAP返回信息模板"><a href="#RAP返回信息模板" class="headerlink" title="RAP返回信息模板"></a>RAP返回信息模板</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">{"ret":"","msg":"","data":{}}</span><br></pre></td></tr></table></figure><h5 id="Windows-10-hosts文件位置"><a href="#Windows-10-hosts文件位置" class="headerlink" title="Windows 10 hosts文件位置"></a>Windows 10 hosts文件位置</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">C:\Windows\System32\Drivers\etc\hosts</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h5 id="RAP返回信息模板"><a href="#RAP返回信息模板" class="headerlink" title="RAP返回信息模板"></a>RAP返回信息模板</h5><figure class="highlight plain"><table><tr><t
</summary>
</entry>
<entry>
<title>CopyOnWriteArrayList的原理和方法</title>
<link href="https://blog.fomeiherz.top/2018/05/16/CopyOnWriteArrayList%E7%9A%84%E5%8E%9F%E7%90%86%E5%92%8C%E6%96%B9%E6%B3%95/"/>
<id>https://blog.fomeiherz.top/2018/05/16/CopyOnWriteArrayList的原理和方法/</id>
<published>2018-05-16T00:48:32.000Z</published>
<updated>2018-05-16T00:59:48.000Z</updated>
<content type="html"><![CDATA[<h4 id="对比遍历有更新操作"><a href="#对比遍历有更新操作" class="headerlink" title="对比遍历有更新操作"></a>对比遍历有更新操作</h4><h5 id="ArrayList普通数组"><a href="#ArrayList普通数组" class="headerlink" title="ArrayList普通数组"></a>ArrayList普通数组</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><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></pre></td><td class="code"><pre><span class="line">import java.util.ArrayList;</span><br><span class="line">import java.util.Iterator;</span><br><span class="line">import java.util.List;</span><br><span class="line"></span><br><span class="line">public class CopyOnWriteArrayListTest {</span><br><span class="line"></span><br><span class="line"> static List<Integer> list = new ArrayList(){{add(20);add(30);add(40);}};</span><br><span class="line"> static class Thread1 extends Thread {</span><br><span class="line"> @Override</span><br><span class="line"> public void run() {</span><br><span class="line"> Iterator iterator = list.iterator();</span><br><span class="line"> System.out.print("1 : ");</span><br><span class="line"> // 仅仅打印数组的第一个元素</span><br><span class="line"> if (iterator.hasNext()) {</span><br><span class="line"> System.out.print(iterator.next() + " ");</span><br><span class="line"> }</span><br><span class="line"> System.out.println();</span><br><span class="line"> try {</span><br><span class="line"> sleep(2000);</span><br><span class="line"> } catch (InterruptedException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> // 打印数组剩下的元素</span><br><span class="line"> System.out.print("2 : ");</span><br><span class="line"> while (iterator.hasNext()) {</span><br><span class="line"> System.out.print(iterator.next() + " ");</span><br><span class="line"> }</span><br><span class="line"> System.out.println();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> static class Thread2 extends Thread {</span><br><span class="line"> @Override</span><br><span class="line"> public void run() {</span><br><span class="line"> list.add(50);</span><br><span class="line"> System.out.println("2 : " + list);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> public static void main(String[] args) {</span><br><span class="line"> new Thread1().start();</span><br><span class="line"> new Thread2().start();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>结果抛出异常信息:<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">Exception in thread "Thread-0" 2 : java.util.ConcurrentModificationException</span><br><span class="line"> at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)</span><br><span class="line"> at java.util.ArrayList$Itr.next(ArrayList.java:851)</span><br><span class="line"> at cn.com.xbed.csbapp.service.impl.CopyOnWriteArrayListTest$Thread1.run(CopyOnWriteArrayListTest.java:29)</span><br></pre></td></tr></table></figure></p><h5 id="CopyOnWriteArrayList复制写入数组"><a href="#CopyOnWriteArrayList复制写入数组" class="headerlink" title="CopyOnWriteArrayList复制写入数组"></a>CopyOnWriteArrayList复制写入数组</h5><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><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></pre></td><td class="code"><pre><span class="line">import java.util.Iterator;</span><br><span class="line">import java.util.concurrent.CopyOnWriteArrayList;</span><br><span class="line"></span><br><span class="line">public class CopyOnWriteArrayListTest {</span><br><span class="line"></span><br><span class="line"> static Integer[] os = new Integer[]{20, 30, 40};</span><br><span class="line"> static CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList(os);</span><br><span class="line"> static class Thread1 extends Thread {</span><br><span class="line"> @Override</span><br><span class="line"> public void run() {</span><br><span class="line"> Iterator iterator = list.iterator();</span><br><span class="line"> System.out.print("1 : ");</span><br><span class="line"> // 仅仅打印数组的第一个元素</span><br><span class="line"> if (iterator.hasNext()) {</span><br><span class="line"> System.out.print(iterator.next() + " ");</span><br><span class="line"> }</span><br><span class="line"> System.out.println();</span><br><span class="line"> try {</span><br><span class="line"> sleep(2000);</span><br><span class="line"> } catch (InterruptedException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> // 打印数组剩下的元素</span><br><span class="line"> // 还是初始拿到的数组,更新后的数组不会在这里</span><br><span class="line"> System.out.print("2 : ");</span><br><span class="line"> while (iterator.hasNext()) {</span><br><span class="line"> System.out.print(iterator.next() + " ");</span><br><span class="line"> }</span><br><span class="line"> System.out.println();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> static class Thread2 extends Thread {</span><br><span class="line"> @Override</span><br><span class="line"> public void run() {</span><br><span class="line"> // 复制新数组,再写入,不会影响已遍历的</span><br><span class="line"> list.add(50);</span><br><span class="line"> System.out.println("2 : " + list);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> public static void main(String[] args) {</span><br><span class="line"> new Thread1().start();</span><br><span class="line"> new Thread2().start();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h4 id="对比遍历有更新操作"><a href="#对比遍历有更新操作" class="headerlink" title="对比遍历有更新操作"></a>对比遍历有更新操作</h4><h5 id="ArrayList普通数组"><a href="#ArrayList普通数
</summary>
<category term="高并发" scheme="https://blog.fomeiherz.top/tags/%E9%AB%98%E5%B9%B6%E5%8F%91/"/>
<category term="Java" scheme="https://blog.fomeiherz.top/tags/Java/"/>
</entry>
<entry>
<title>各种排序算法比较</title>
<link href="https://blog.fomeiherz.top/2018/05/11/%E5%90%84%E7%A7%8D%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E6%AF%94%E8%BE%83/"/>
<id>https://blog.fomeiherz.top/2018/05/11/各种排序算法比较/</id>
<published>2018-05-11T07:42:48.000Z</published>
<updated>2019-08-30T03:49:52.197Z</updated>
<content type="html"><![CDATA[<h4 id="各种排序算法比较"><a href="#各种排序算法比较" class="headerlink" title="各种排序算法比较"></a>各种排序算法比较</h4><p><img src="http://sharefile.fomeiherz.top/%E5%90%84%E7%A7%8D%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E6%AF%94%E8%BE%8320180510.png" alt="avata"></p>]]></content>
<summary type="html">
<h4 id="各种排序算法比较"><a href="#各种排序算法比较" class="headerlink" title="各种排序算法比较"></a>各种排序算法比较</h4><p><img src="http://sharefile.fomeiherz.top/%E5%9
</summary>
<category term="排序" scheme="https://blog.fomeiherz.top/tags/%E6%8E%92%E5%BA%8F/"/>
</entry>
<entry>
<title>C语言读写文件详解</title>
<link href="https://blog.fomeiherz.top/2018/05/11/C%E8%AF%AD%E8%A8%80%E8%AF%BB%E5%86%99%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3/"/>
<id>https://blog.fomeiherz.top/2018/05/11/C语言读写文件详解/</id>
<published>2018-05-11T07:11:02.000Z</published>
<updated>2018-05-11T07:11:49.000Z</updated>
<content type="html"><![CDATA[<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">#include <stdio.h></span><br><span class="line"></span><br><span class="line">int main()</span><br><span class="line">{</span><br><span class="line"> // 写入模式</span><br><span class="line"> FILE* writer = fopen("C:\\data.txt", "w");</span><br><span class="line"> if (writer == NULL)</span><br><span class="line"> {</span><br><span class="line"> return 0;</span><br><span class="line"> }</span><br><span class="line"> for (int i = 0; i < 10; i++)</span><br><span class="line"> {</span><br><span class="line"> fprintf(writer, "%d ", i);</span><br><span class="line"> }</span><br><span class="line"> fclose(writer);</span><br><span class="line"></span><br><span class="line"> // 读入模式</span><br><span class="line"> FILE* reader = fopen("C:\\data.txt", "r");</span><br><span class="line"> if (reader == NULL)</span><br><span class="line"> {</span><br><span class="line"> return 0;</span><br><span class="line"> }</span><br><span class="line"> int nums[10] = {0};</span><br><span class="line"> for (int i = 0; i < 10; i++)</span><br><span class="line"> {</span><br><span class="line"> fscanf(reader, "%d ", &nums[i]);</span><br><span class="line"> }</span><br><span class="line"> // 打印保存的值</span><br><span class="line"> for (int i = 0; i < 10; i++)</span><br><span class="line"> {</span><br><span class="line"> printf("%d ", i);</span><br><span class="line"> }</span><br><span class="line"> fclose(reader);</span><br><span class="line"></span><br><span class="line"> return 1;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class
</summary>
<category term="C语言" scheme="https://blog.fomeiherz.top/tags/C%E8%AF%AD%E8%A8%80/"/>
<category term="文件读写" scheme="https://blog.fomeiherz.top/tags/%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99/"/>
</entry>
<entry>
<title>C++文件读写详解</title>
<link href="https://blog.fomeiherz.top/2018/05/11/cplusplus%E6%96%87%E4%BB%B6%E8%AF%BB%E5%86%99%E8%AF%A6%E8%A7%A3/"/>
<id>https://blog.fomeiherz.top/2018/05/11/cplusplus文件读写详解/</id>
<published>2018-05-11T06:29:12.000Z</published>
<updated>2018-05-11T06:48:51.000Z</updated>
<content type="html"><![CDATA[<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">#include <iostream></span><br><span class="line">// 文件流包</span><br><span class="line">#include <fstream></span><br><span class="line">// 读取一行需要存在字符串中</span><br><span class="line">#include <string></span><br><span class="line"></span><br><span class="line">// ifstream是在名称空间std下的,必须引入这个包</span><br><span class="line">using namespace std;</span><br><span class="line"></span><br><span class="line">int main()</span><br><span class="line">{</span><br><span class="line"> ifstream ifs("C:\\test.txt");</span><br><span class="line"> ofstream ofs("C:\\test1.txt");</span><br><span class="line"> string s;</span><br><span class="line"></span><br><span class="line"> // 读写一行数据,直到读写内容为空</span><br><span class="line"> while (getline(ifs, s) != NULL)</span><br><span class="line"> {</span><br><span class="line"> // 写入到文件</span><br><span class="line"> ofs << s << endl;</span><br><span class="line"> }</span><br><span class="line"> ofs.flush();</span><br><span class="line"> ofs.close();</span><br><span class="line"></span><br><span class="line"> ifs.close();</span><br><span class="line"> </span><br><span class="line"> return 0;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class
</summary>
<category term="C++" scheme="https://blog.fomeiherz.top/tags/C/"/>
</entry>
<entry>
<title>队列的链式存储结构</title>
<link href="https://blog.fomeiherz.top/2018/05/10/%E9%98%9F%E5%88%97%E7%9A%84%E9%93%BE%E5%BC%8F%E5%AD%98%E5%82%A8%E7%BB%93%E6%9E%84/"/>
<id>https://blog.fomeiherz.top/2018/05/10/队列的链式存储结构/</id>
<published>2018-05-10T11:01:56.000Z</published>
<updated>2018-05-10T11:03:45.000Z</updated>
<content type="html"><![CDATA[<h4 id="算法实现"><a href="#算法实现" class="headerlink" title="算法实现"></a>算法实现</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br></pre></td><td class="code"><pre><span class="line">// 队头出队;队尾入队</span><br><span class="line">#include <stdio.h></span><br><span class="line">#include <stdlib.h></span><br><span class="line"></span><br><span class="line">#define OK 1</span><br><span class="line">#define OVERFLOW -2</span><br><span class="line">#define ERROR -1</span><br><span class="line"></span><br><span class="line">typedef int Status;</span><br><span class="line">typedef char QElemType;</span><br><span class="line"></span><br><span class="line">// 队列结点</span><br><span class="line">typedef struct QNode</span><br><span class="line">{</span><br><span class="line"> QElemType data;</span><br><span class="line"> struct QNode *next;</span><br><span class="line">} QNode, *QNodePtr;</span><br><span class="line"></span><br><span class="line">// 链式队列</span><br><span class="line">typedef struct </span><br><span class="line">{</span><br><span class="line"> QNodePtr front;</span><br><span class="line"> QNodePtr rear;</span><br><span class="line">} LinkQueue;</span><br><span class="line"></span><br><span class="line">// 初始化队列</span><br><span class="line">Status InitQueue(LinkQueue *L)</span><br><span class="line">{</span><br><span class="line"> // 创建头结点</span><br><span class="line"> QNode *head = (QNodePtr)malloc(sizeof(QNode));</span><br><span class="line"> if (head == NULL)</span><br><span class="line"> {</span><br><span class="line"> return OVERFLOW;</span><br><span class="line"> }</span><br><span class="line"> head->data = ' ';</span><br><span class="line"> head->next = NULL;</span><br><span class="line"> // 同时指向头结点</span><br><span class="line"> L->front = L->rear = head;</span><br><span class="line"></span><br><span class="line"> return OK;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">// 入队</span><br><span class="line">Status EnQueue(LinkQueue *L, QElemType e)</span><br><span class="line">{</span><br><span class="line"> // 创建结点</span><br><span class="line"> QNode* node = (QNodePtr)malloc(sizeof(QNode));</span><br><span class="line"> if (!node) </span><br><span class="line"> {</span><br><span class="line"> return OVERFLOW;</span><br><span class="line"> }</span><br><span class="line"> node->data = e;</span><br><span class="line"> node->next = NULL;</span><br><span class="line"></span><br><span class="line"> // 尾指针指向该节点</span><br><span class="line"> L->rear->next = node;</span><br><span class="line"> L->rear = node;</span><br><span class="line"> </span><br><span class="line"> return OK;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">// 出队</span><br><span class="line">Status DeQueue(LinkQueue *L, QElemType *e)</span><br><span class="line">{</span><br><span class="line"> // 判空</span><br><span class="line"> if (L->front == L->rear)</span><br><span class="line"> {</span><br><span class="line"> return ERROR;</span><br><span class="line"> }</span><br><span class="line"> QNode* p = L->front->next;</span><br><span class="line"> // 保存元素</span><br><span class="line"> (*e) = p->data;</span><br><span class="line"> // 删除元素</span><br><span class="line"> L->front->next = p->next;</span><br><span class="line"></span><br><span class="line"> if (L->rear == p)</span><br><span class="line"> {</span><br><span class="line"> L->rear = L->front;</span><br><span class="line"> }</span><br><span class="line"> free(p);</span><br><span class="line"></span><br><span class="line"> return OK;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">void Traverse(LinkQueue L)</span><br><span class="line">{</span><br><span class="line"> QNode* p = L.front->next;</span><br><span class="line"> // 跳过头结点</span><br><span class="line"> while (p != NULL) </span><br><span class="line"> {</span><br><span class="line"> printf("%c ", p->data);</span><br><span class="line"> p = p->next;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">int main()</span><br><span class="line">{</span><br><span class="line"> LinkQueue L;</span><br><span class="line"> InitQueue(&L);</span><br><span class="line"></span><br><span class="line"> EnQueue(&L, 'X');</span><br><span class="line"> EnQueue(&L, 'Y');</span><br><span class="line"></span><br><span class="line"> QElemType a;</span><br><span class="line"> DeQueue(&L, &a);</span><br><span class="line"></span><br><span class="line"> Traverse(L);</span><br><span class="line"> </span><br><span class="line"> return 0;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h4 id="算法实现"><a href="#算法实现" class="headerlink" title="算法实现"></a>算法实现</h4><figure class="highlight plain"><table><tr><td class="gutter"><pr
</summary>
<category term="C语言" scheme="https://blog.fomeiherz.top/tags/C%E8%AF%AD%E8%A8%80/"/>
<category term="数据结构" scheme="https://blog.fomeiherz.top/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
</entry>
<entry>
<title>关于高并发下的系统设计要点</title>
<link href="https://blog.fomeiherz.top/2018/05/07/%E5%85%B3%E4%BA%8E%E9%AB%98%E5%B9%B6%E5%8F%91%E4%B8%8B%E7%9A%84%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E8%A6%81%E7%82%B9/"/>
<id>https://blog.fomeiherz.top/2018/05/07/关于高并发下的系统设计要点/</id>
<published>2018-05-06T16:02:36.000Z</published>
<updated>2018-05-06T16:12:13.000Z</updated>
<content type="html"><![CDATA[<ol><li>对数据库更新操作。应该按条件查询数据,取出主键,按主键去更新数据。防止update操作进行全表锁定,影响了其他业务。 </li><li>对已经使用了update操作的语句,尽可能给update的查询条件都加上索引,这样在更新时就不会全表锁住了。 </li><li>通过redis实现锁的功能。比如通过redis锁定一张卡券,防止一张卡券被重复使用。 </li><li>通过并发关键字synchronized保证线程的安全。 </li><li>SimpleDateFormat对象为线程不安全的,所以不能静态new对象,应该是各个方法各自new该对象,不能静态共享。</li></ol>]]></content>
<summary type="html">
<ol>
<li>对数据库更新操作。应该按条件查询数据,取出主键,按主键去更新数据。防止update操作进行全表锁定,影响了其他业务。 </li>
<li>对已经使用了update操作的语句,尽可能给update的查询条件都加上索引,这样在更新时就不会全表锁住了。 </li>
</summary>
<category term="高并发" scheme="https://blog.fomeiherz.top/tags/%E9%AB%98%E5%B9%B6%E5%8F%91/"/>
</entry>
<entry>
<title>关于系统重构的步骤梳理</title>
<link href="https://blog.fomeiherz.top/2018/05/06/%E5%85%B3%E4%BA%8E%E7%B3%BB%E7%BB%9F%E9%87%8D%E6%9E%84%E7%9A%84%E6%AD%A5%E9%AA%A4%E6%A2%B3%E7%90%86/"/>
<id>https://blog.fomeiherz.top/2018/05/06/关于系统重构的步骤梳理/</id>
<published>2018-05-06T15:22:39.000Z</published>
<updated>2018-05-06T15:54:43.000Z</updated>
<content type="html"><![CDATA[<h2 id="重构步骤"><a href="#重构步骤" class="headerlink" title="重构步骤"></a>重构步骤</h2><ul><li>删除废弃的接口</li><li>业务功能的简单化和清晰化</li><li>删除数据库废弃的字段</li></ul><h2 id="由影响范围小到影响范围大的方向逐个进行重构"><a href="#由影响范围小到影响范围大的方向逐个进行重构" class="headerlink" title="由影响范围小到影响范围大的方向逐个进行重构"></a>由影响范围小到影响范围大的方向逐个进行重构</h2><p>比如先对某个功能进行重构,然后再对表结构进行更改。</p><h2 id="统计该重构涉及的所有接口和业务功能"><a href="#统计该重构涉及的所有接口和业务功能" class="headerlink" title="统计该重构涉及的所有接口和业务功能"></a>统计该重构涉及的所有接口和业务功能</h2><p>包括调用和被调用之间的所有接口。</p><h2 id="针对该重构的功能写测试案例"><a href="#针对该重构的功能写测试案例" class="headerlink" title="针对该重构的功能写测试案例"></a>针对该重构的功能写测试案例</h2><p>1、对该重构涉及的所有的接口,写对应的测试案例,理论上应该覆盖所有被影响的接口。<br>2、对该重构涉及的所有业务功能,写对应的测试案例。</p><h2 id="从底层系统向上层系统逐一重构"><a href="#从底层系统向上层系统逐一重构" class="headerlink" title="从底层系统向上层系统逐一重构"></a>从底层系统向上层系统逐一重构</h2><p>系统有调用和被调用之间的关系,应该先重构被调用的系统,然后再重构调用系统。并且每重构完一个接口,应该有对应的单元测试覆盖该接口,测试通过后,再重构下一个接口。</p><h2 id="所有业务功能的测试"><a href="#所有业务功能的测试" class="headerlink" title="所有业务功能的测试"></a>所有业务功能的测试</h2><p>系统接口层测试全部完毕后,对业务功能进行整体的测试。</p><h2 id="推送到测试环境"><a href="#推送到测试环境" class="headerlink" title="推送到测试环境"></a>推送到测试环境</h2><p>推送到测试环境,给测试人员进行测试。<br>为了确保重构的可靠性,应该在测试环境跑2个星期没问题后,再推上生产。</p>]]></content>
<summary type="html">
<h2 id="重构步骤"><a href="#重构步骤" class="headerlink" title="重构步骤"></a>重构步骤</h2><ul>
<li>删除废弃的接口</li>
<li>业务功能的简单化和清晰化</li>
<li>删除数据库废弃的字段</li>
<
</summary>
<category term="系统重构" scheme="https://blog.fomeiherz.top/tags/%E7%B3%BB%E7%BB%9F%E9%87%8D%E6%9E%84/"/>
<category term="Refactoring" scheme="https://blog.fomeiherz.top/tags/Refactoring/"/>
</entry>
<entry>
<title>Hexo博客添加站内搜索页</title>
<link href="https://blog.fomeiherz.top/2018/05/04/Hexo%E5%8D%9A%E5%AE%A2%E6%B7%BB%E5%8A%A0%E7%AB%99%E5%86%85%E6%90%9C%E7%B4%A2%E9%A1%B5/"/>
<id>https://blog.fomeiherz.top/2018/05/04/Hexo博客添加站内搜索页/</id>
<published>2018-05-04T02:08:22.000Z</published>
<updated>2018-05-04T02:27:31.000Z</updated>
<content type="html"><![CDATA[<h4 id="安装-hexo-generator-search"><a href="#安装-hexo-generator-search" class="headerlink" title="安装 hexo-generator-search"></a>安装 hexo-generator-search</h4><p>在站点的根目录下执行以下命令:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-generator-search --save</span><br></pre></td></tr></table></figure></p><h4 id="安装-hexo-generator-searchdb"><a href="#安装-hexo-generator-searchdb" class="headerlink" title="安装 hexo-generator-searchdb"></a>安装 hexo-generator-searchdb</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-generator-searchdb --save</span><br></pre></td></tr></table></figure><p>在 blog/source 目录下会有一个新生成search.xml文件。</p><h4 id="创建搜索页面"><a href="#创建搜索页面" class="headerlink" title="创建搜索页面"></a>创建搜索页面</h4><p>在站点的根目录下执行以下命令:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new page "search"</span><br></pre></td></tr></table></figure></p><p>在 blog/source 下会新生成一个新的文件夹search,在该文件夹下会有一个index.md文件。</p><blockquote><p>注意:修改该文件,在文章倒数第2行插入一行<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">type: "search"</span><br></pre></td></tr></table></figure></p></blockquote><h4 id="修改站点配置文件"><a href="#修改站点配置文件" class="headerlink" title="修改站点配置文件"></a>修改站点配置文件</h4><p>修改blog下的_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><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">search:</span><br><span class="line"> path: search.xml</span><br><span class="line"> field: post</span><br><span class="line"> format: html</span><br><span class="line"> limit: 10000</span><br></pre></td></tr></table></figure></p><h4 id="修改-blog-themes-xxx-下的-config-yml文件"><a href="#修改-blog-themes-xxx-下的-config-yml文件" class="headerlink" title="修改 /blog/themes/xxx 下的_config.yml文件"></a>修改 /blog/themes/xxx 下的_config.yml文件</h4><figure class="highlight plain"><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">local_search:</span><br><span class="line"> enable: true</span><br></pre></td></tr></table></figure><h4 id="重新部署,启动"><a href="#重新部署,启动" class="headerlink" title="重新部署,启动"></a>重新部署,启动</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo clean; hexo g; hexo s;</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h4 id="安装-hexo-generator-search"><a href="#安装-hexo-generator-search" class="headerlink" title="安装 hexo-generator-search"></a>安装 hexo-genera
</summary>
</entry>
<entry>
<title>Spring Cloud 整体架构设计介绍</title>
<link href="https://blog.fomeiherz.top/2018/05/03/spring-cloud-start/"/>
<id>https://blog.fomeiherz.top/2018/05/03/spring-cloud-start/</id>
<published>2018-05-03T05:57:04.000Z</published>
<updated>2018-05-11T06:50:14.000Z</updated>
<content type="html"><![CDATA[<p>Spring Cloud 包含组件:Eureka、Ribbon、Hystrix、Zuul、Spring-Cloud-Config</p><p>Spring Cloud 微服务架构图,如下图所示。<br><img src="http://p7240jy2w.bkt.clouddn.com/SpringCloud%E5%BE%AE%E6%9C%8D%E5%8A%A1%E6%9E%B6%E6%9E%84%E6%80%BB%E5%9B%BE.jpg" alt="avata"></p><h4 id="Eureka服务注册与发现"><a href="#Eureka服务注册与发现" class="headerlink" title="Eureka服务注册与发现"></a>Eureka服务注册与发现</h4><p>注册中心。</p><h4 id="Ribbon服务调用端负载均衡"><a href="#Ribbon服务调用端负载均衡" class="headerlink" title="Ribbon服务调用端负载均衡"></a>Ribbon服务调用端负载均衡</h4><p>负责负载均衡的计算。</p><h4 id="Hystrix服务调用端熔断"><a href="#Hystrix服务调用端熔断" class="headerlink" title="Hystrix服务调用端熔断"></a>Hystrix服务调用端熔断</h4><p>Hystrix熔断机制,每一个微服务都有熔断处理。</p><h4 id="Zuul代理机制"><a href="#Zuul代理机制" class="headerlink" title="Zuul代理机制"></a>Zuul代理机制</h4><p>路由规则(路径映射),对名称进行隐藏。</p><h4 id="Spring-Cloud-Config服务配置组件"><a href="#Spring-Cloud-Config服务配置组件" class="headerlink" title="Spring Cloud Config服务配置组件"></a>Spring Cloud Config服务配置组件</h4><p>基于git进行配置的管理。</p><h4 id="Zipkin链路跟踪工具"><a href="#Zipkin链路跟踪工具" class="headerlink" title="Zipkin链路跟踪工具"></a>Zipkin链路跟踪工具</h4><p>作用是监控微服务集群中调用链路的通畅情况。</p>]]></content>
<summary type="html">
<p>Spring Cloud 包含组件:Eureka、Ribbon、Hystrix、Zuul、Spring-Cloud-Config</p>
<p>Spring Cloud 微服务架构图,如下图所示。<br><img src="http://p7240jy2w.bkt.clou
</summary>
<category term="Spring Cloud" scheme="https://blog.fomeiherz.top/tags/Spring-Cloud/"/>
</entry>
<entry>
<title>Lucene全文检索工具</title>
<link href="https://blog.fomeiherz.top/2018/05/03/Lucene%E5%85%A8%E6%96%87%E6%A3%80%E7%B4%A2%E5%B7%A5%E5%85%B7/"/>
<id>https://blog.fomeiherz.top/2018/05/03/Lucene全文检索工具/</id>
<published>2018-05-03T02:22:51.000Z</published>
<updated>2018-05-03T02:39:41.000Z</updated>
<content type="html"><![CDATA[<p>Lucene是基于Java的全文信息检索工具包。</p><h2 id="索引创建与检索"><a href="#索引创建与检索" class="headerlink" title="索引创建与检索"></a>索引创建与检索</h2><h3 id="创建索引"><a href="#创建索引" class="headerlink" title="创建索引"></a>创建索引</h3><ul><li>需要检索的数据(Document)</li><li>分词技术(Analyzer)</li><li>索引创建(Indexer)</li></ul><h3 id="索引检索"><a href="#索引检索" class="headerlink" title="索引检索"></a>索引检索</h3><ul><li>搜索关键词(keywords)</li><li>分词技术 (Analyzer)</li><li>检索索引(Search)</li><li>返回结果</li></ul><h2 id="Lucene文件结构"><a href="#Lucene文件结构" class="headerlink" title="Lucene文件结构"></a>Lucene文件结构</h2><ul><li>索引(Index):一个索引放在一个文件夹中。</li><li>段(Segment):一个索引中可以有很多段,段与段之间是独立的,添加新的文档可以产生新段,不同的段可以合并成一个新段。</li><li>文档(Document):文档是创建索引的基本单位,不同的文档保存在不同的段中,一个段可以包含多个文档。</li><li>域(Field):一个文档包含不同类型的信息,可以拆分开索引。</li><li>词(Term):词是索引的最小单位,是经过词法分析和语言处理后的数据。</li></ul><p>正向信息就是按层次保存了索引一直到词的包含关系:索引 > 段 > 文档 > 域 > 词<br>反向信息:词 > 文档</p><h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><p>Lucene索引查看工具:Luke</p>]]></content>
<summary type="html">
<p>Lucene是基于Java的全文信息检索工具包。</p>
<h2 id="索引创建与检索"><a href="#索引创建与检索" class="headerlink" title="索引创建与检索"></a>索引创建与检索</h2><h3 id="创建索引"><a href
</summary>
<category term="全文检索" scheme="https://blog.fomeiherz.top/tags/%E5%85%A8%E6%96%87%E6%A3%80%E7%B4%A2/"/>
<category term="lucene" scheme="https://blog.fomeiherz.top/tags/lucene/"/>
</entry>
</feed>