-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathatom.xml
457 lines (241 loc) · 88.2 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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Asswei's blog</title>
<link href="/atom.xml" rel="self"/>
<link href="https://asswei7.github.io/"/>
<updated>2021-10-09T01:52:28.617Z</updated>
<id>https://asswei7.github.io/</id>
<author>
<name>孙书玮</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>古希腊建筑</title>
<link href="https://asswei7.github.io/2021/09/30/%E5%8F%A4%E5%B8%8C%E8%85%8A%E5%BB%BA%E7%AD%91/%E5%8F%A4%E5%B8%8C%E8%85%8A%E5%BB%BA%E7%AD%91/"/>
<id>https://asswei7.github.io/2021/09/30/%E5%8F%A4%E5%B8%8C%E8%85%8A%E5%BB%BA%E7%AD%91/%E5%8F%A4%E5%B8%8C%E8%85%8A%E5%BB%BA%E7%AD%91/</id>
<published>2021-09-30T02:12:37.000Z</published>
<updated>2021-10-09T01:52:28.617Z</updated>
<content type="html"><![CDATA[<p>古罗马是古希腊的继承者,从爱琴海文明转移到了地中海文明。<br><img src="/images/古希腊建筑/变迁.png" alt></p><p>建筑三原则:坚固、实用、美观</p><h2 id="古希腊柱式"><a href="#古希腊柱式" class="headerlink" title="古希腊柱式"></a>古希腊柱式</h2><p><img src="/images/古希腊建筑/三种柱子.png" alt><br>古希腊更多是前两种柱式:<br>经济原因:成本较低<br>思想原因:中庸克制</p><p>帕台农神庙:黄金比例</p><p>梁柱结构,三角眉式、柱廊</p><p>斯多葛学派(廊下学派):</p><h2 id="哥特式建筑"><a href="#哥特式建筑" class="headerlink" title="哥特式建筑"></a>哥特式建筑</h2><p>哥特式建筑:尖锐高耸</p><p>肋:复杂的肋<br>窗:大彩玻璃窗<br>拱:哥特尖拱<br>壁:飞扶壁<br>墙:薄墙</p><p>中世纪是宗教的时代,希望教堂就是人间的天堂,所以教堂都是封闭的</p><p>以前的教堂:低、胖(墙厚)、暗(窗户小)<br>哥特式教堂:高、瘦、亮</p><p>以线为主体,视觉引导,显得清瘦、高</p>]]></content>
<summary type="html">
<p>古罗马是古希腊的继承者,从爱琴海文明转移到了地中海文明。<br><img src="/images/古希腊建筑/变迁.png" alt></p>
<p>建筑三原则:坚固、实用、美观</p>
<h2 id="古希腊柱式"><a href="#古希腊柱式" class="hea
</summary>
</entry>
<entry>
<title>Linux学习</title>
<link href="https://asswei7.github.io/2021/09/29/Linux%E5%AD%A6%E4%B9%A0/Linux%E5%AD%A6%E4%B9%A0/"/>
<id>https://asswei7.github.io/2021/09/29/Linux%E5%AD%A6%E4%B9%A0/Linux%E5%AD%A6%E4%B9%A0/</id>
<published>2021-09-29T01:02:57.000Z</published>
<updated>2021-09-29T01:04:18.750Z</updated>
<content type="html"><![CDATA[<h2 id="vi的使用"><a href="#vi的使用" class="headerlink" title="vi的使用"></a>vi的使用</h2><p><strong>命令模式:</strong><br>输入i进入编辑模式,输入:进入底线命令模式,输入x类似于[del]删除光标处的字符<br>退出的话,如果没有改动需要:q!退出,改动了:wq退出。<br><strong>输入模式:</strong><br>G:移动到文件的最后一行<br>gg:移动到文件的第一行,相当于1G<br>n<\Enter>: 光标向下移动n行</p><p>/word:向光标之下</p><p>常用的复制粘贴:<br>复制光标这一行:yy</p><p>重复上一个动作:.(小数点)<br>撤销上一个动作:u</p><p>ESC切换到命令模式</p><p><strong>底线命令模式:</strong><br>q退出程序<br>w保存文件<br>按esc进入命令模式</p><p>Swap file “.test927.txt.swp” already exists!<br>使用vim编辑,先复制一份临时文件并映射到内存来编辑,编辑的是临时文件,当执行了:w是保存临时文件到原文件,执行:q后删除临时文件。</p><p>每次启动时会检索是否有临时文件。<br>使用ll -a会显示全部文件,包括一些隐藏文件,以及文件的详细信息。例如.test.txt.swp<br>rm-f删除文件</p><h2 id="服务器报错"><a href="#服务器报错" class="headerlink" title="服务器报错"></a>服务器报错</h2><p>CUDA Version: 11.2<br>pip install torch==1.5.0</p><p>RuntimeError: cuDNN error: CUDNN_STATUS_EXECUTION_FAILED<br>运行报错,原因是cuda和pytorch版本不匹配,服务器上的cuda版本是11.2,而pytorch版本是1.5.0,<br>通过网站<a href="https://pytorch.org/get-started/previous-versions/">https://pytorch.org/get-started/previous-versions/</a><br>可以看到cuda和pytorch对应的版本,对应cuda 9.2/10.1/10.2三个。</p><p>但是import torch, torch.version.cuda,输入版本为10.2</p><p>Traceback (most recent call last):<br> File “main.py”, line 365, in <\module><br> train_gat(args)<br> File “main.py”, line 194, in train_gat<br> torch.LongTensor(current_batch_2hop_indices)).cuda()<br>TypeError: expected torch.LongTensor (got torch.FloatTensor)</p><p>修改了对应文件的代码<br>current_batch_2hop_indices = torch.tensor<br>current_batch_2hop_indices = torch.LongTensor([])<br>tensor默认是float,改成Long应该可以</p><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></pre></td><td class="code"><pre><span class="line">Socket error Event: 32 Error: 10053.</span><br><span class="line">Connection closing...Socket close.</span><br><span class="line"></span><br><span class="line">Connection closed by foreign host.</span><br><span class="line"></span><br><span class="line">Disconnected from remote host(3090) at 01:30:17.</span><br><span class="line"></span><br><span class="line">Type help to learn how to use Xshell prompt.</span><br></pre></td></tr></table></figure><p>cuda:Compute Unified Device Architecture统一计算架构,是nvidia推出的编程环境,包括</p>]]></content>
<summary type="html">
<h2 id="vi的使用"><a href="#vi的使用" class="headerlink" title="vi的使用"></a>vi的使用</h2><p><strong>命令模式:</strong><br>输入i进入编辑模式,输入:进入底线命令模式,输入x类似于[del
</summary>
</entry>
<entry>
<title>transformer</title>
<link href="https://asswei7.github.io/2021/09/28/transformer/transformer/"/>
<id>https://asswei7.github.io/2021/09/28/transformer/transformer/</id>
<published>2021-09-28T00:43:39.000Z</published>
<updated>2021-10-09T01:52:32.852Z</updated>
<content type="html"><![CDATA[<h2 id="位置编码"><a href="#位置编码" class="headerlink" title="位置编码"></a>位置编码</h2><p>由于transformer摒弃RNN结构,需要标记各个字之间的时序和位置关系。</p><p>首先的想法自然是取[0,1]之间的数分配给每个字,这样的问题是句子长度不同,在短句子中接近的两个字差值为0.1,长句子中相隔很远的两个字差值也是0.1.相同的差值,在不同的句子中含义不同,是不合适的。</p><p>另一个想法是线性地给每个时间步分配一个数字,第一个单词为1,第二个为2,这样的问题是1.比字嵌入的值大,会抢了字嵌入的风头。2.最后一个字比第一个字大太多,和字嵌入合并后会出现特征在数值上的倾斜。</p><p><strong>理想的情况:</strong></p><ul><li>为每个字输入唯一的编码,不是一个数字,而是包含句子特定信息的d维向量</li><li>不同长度的句子之间,任何两个字的差值保持一致</li><li>值应该是有界的</li></ul>]]></content>
<summary type="html">
<h2 id="位置编码"><a href="#位置编码" class="headerlink" title="位置编码"></a>位置编码</h2><p>由于transformer摒弃RNN结构,需要标记各个字之间的时序和位置关系。</p>
<p>首先的想法自然是取[0,1]之
</summary>
</entry>
<entry>
<title>参观党史展览馆</title>
<link href="https://asswei7.github.io/2021/09/27/%E5%8F%82%E8%A7%82%E5%85%9A%E5%8F%B2%E5%B1%95%E8%A7%88%E9%A6%86/"/>
<id>https://asswei7.github.io/2021/09/27/%E5%8F%82%E8%A7%82%E5%85%9A%E5%8F%B2%E5%B1%95%E8%A7%88%E9%A6%86/</id>
<published>2021-09-27T06:45:26.000Z</published>
<updated>2021-09-28T06:44:30.145Z</updated>
<content type="html"><![CDATA[<p>9月26日,跟着学校一起去参观了中国共产党历史展览馆,一点钟展览馆开门。我们一行是12.45左右到的,但是已经排起了很长的队伍。排的队分成背包的和没背包的两个队伍,没背包的队伍安检速度会快一点。很快一点钟了,安检的速度很快,虽然排队人很多,但是很快就进去了。<br>里面有公益讲解,内容也是涵盖的很广很全面,从1840年开始,一直到最近的脱贫攻坚。这个展馆最大的特点是,里面的东西我们多多少少地都了解过,都学习过。所以看到一些场面时会有所感触,这或许才是展览馆的意义。</p><p>我们对于一些历史背景或者说艺术流派有了一定的了解,但是没有那种亲眼见证的体会,这时展览馆才能发挥出它最大的价值。我回想起前几天去的故宫,由于每个宫殿都不让进去,从外面看每个宫殿的造型也是大同小异,很快就失去了游玩的兴趣,只看看这个殿是皇上休息的,那个宫是皇上睡觉的,根本体会不到其中的意义。反而是军机处让我留有印象。因为我很喜欢看《雍正王朝》,而中学历史书对雍正的介绍少之又少,夹在了最有名的康乾盛世中间,历史的考点只有一个,他创办了军机处,皇权达到了顶峰。而在雍正王朝中的军机处特别小,让人很难想象,最高级别的几个人讨论最重要的时期,和珅也是军机大臣,却挤在这么小的一间屋子。</p><p>又想到之前去卢浮宫参观,像什么断臂的维纳斯,蒙娜丽莎,一堆人围着,连走近观看都做不到。根本无法理解其中好在哪里。只有课本上的《自由领导人民》是我见过的,而且旁边没啥人,还能看一看,也没看出什么东西来。但看完了西方艺术史,了解了德拉克洛瓦的重要地位,了解了浪漫主义的前因后果,才能理解其的重要意义。</p>]]></content>
<summary type="html">
<p>9月26日,跟着学校一起去参观了中国共产党历史展览馆,一点钟展览馆开门。我们一行是12.45左右到的,但是已经排起了很长的队伍。排的队分成背包的和没背包的两个队伍,没背包的队伍安检速度会快一点。很快一点钟了,安检的速度很快,虽然排队人很多,但是很快就进去了。<br>里面有公
</summary>
</entry>
<entry>
<title>参观党史展览馆</title>
<link href="https://asswei7.github.io/2021/09/27/%E5%8F%82%E8%A7%82%E5%85%9A%E5%8F%B2%E5%B1%95%E8%A7%88%E9%A6%86/%E5%8F%82%E8%A7%82%E5%85%9A%E5%8F%B2%E5%B1%95%E8%A7%88%E9%A6%86/"/>
<id>https://asswei7.github.io/2021/09/27/%E5%8F%82%E8%A7%82%E5%85%9A%E5%8F%B2%E5%B1%95%E8%A7%88%E9%A6%86/%E5%8F%82%E8%A7%82%E5%85%9A%E5%8F%B2%E5%B1%95%E8%A7%88%E9%A6%86/</id>
<published>2021-09-27T06:45:26.000Z</published>
<updated>2021-09-27T06:45:27.003Z</updated>
<summary type="html">
</summary>
</entry>
<entry>
<title>三教极简史</title>
<link href="https://asswei7.github.io/2021/09/25/%E4%B8%89%E6%95%99%E6%9E%81%E7%AE%80%E5%8F%B2/%E4%B8%89%E6%95%99%E6%9E%81%E7%AE%80%E5%8F%B2/"/>
<id>https://asswei7.github.io/2021/09/25/%E4%B8%89%E6%95%99%E6%9E%81%E7%AE%80%E5%8F%B2/%E4%B8%89%E6%95%99%E6%9E%81%E7%AE%80%E5%8F%B2/</id>
<published>2021-09-25T04:49:59.000Z</published>
<updated>2021-10-09T01:52:22.871Z</updated>
<summary type="html">
</summary>
</entry>
<entry>
<title>类库推荐项目</title>
<link href="https://asswei7.github.io/2021/09/24/%E7%B1%BB%E5%BA%93%E6%8E%A8%E8%8D%90%E9%A1%B9%E7%9B%AE/%E7%B1%BB%E5%BA%93%E6%8E%A8%E8%8D%90%E9%A1%B9%E7%9B%AE/"/>
<id>https://asswei7.github.io/2021/09/24/%E7%B1%BB%E5%BA%93%E6%8E%A8%E8%8D%90%E9%A1%B9%E7%9B%AE/%E7%B1%BB%E5%BA%93%E6%8E%A8%E8%8D%90%E9%A1%B9%E7%9B%AE/</id>
<published>2021-09-24T01:27:11.000Z</published>
<updated>2021-09-24T02:31:55.736Z</updated>
<content type="html"><![CDATA[<h2 id="遇到的问题"><a href="#遇到的问题" class="headerlink" title="遇到的问题"></a>遇到的问题</h2><p>python对GitHub的爬虫特别不稳定,因为自己本地访问GitHub就不稳定,爬虫自然也难以稳定。想到了挂梯子,但是挂梯子后会报错:ValueError: check_hostname requires server_hostname</p><p>解决方法:要么取消梯子,要么可以降低requests库版本到2.7.0。<br>用conda命令行,python -m pip install —upgrade requests==2.7.0,但是pip之前还是得取消梯子。<br>成功解决这个问题。</p><h2 id="将表格中的元素变成链接"><a href="#将表格中的元素变成链接" class="headerlink" title="将表格中的元素变成链接"></a>将表格中的元素变成链接</h2><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"><el-table-column</span><br><span class="line">prop="url"</span><br><span class="line">label="Url"></span><br><span class="line"></el-table-column></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><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><el-table-column</span><br><span class="line"> prop="url"</span><br><span class="line"> label="Url"></span><br><span class="line"> <template slot-scope="scope"></span><br><span class="line"> <a :href="scope.row.url" target="_blank" >{{scope.row.url}}</a></span><br><span class="line"> </template></span><br><span class="line"></el-table-column></span><br></pre></td></tr></table></figure></p><h2 id="子组件无法修改父组件传进来的值"><a href="#子组件无法修改父组件传进来的值" class="headerlink" title="子组件无法修改父组件传进来的值"></a>子组件无法修改父组件传进来的值</h2>]]></content>
<summary type="html">
<h2 id="遇到的问题"><a href="#遇到的问题" class="headerlink" title="遇到的问题"></a>遇到的问题</h2><p>python对GitHub的爬虫特别不稳定,因为自己本地访问GitHub就不稳定,爬虫自然也难以稳定。想到了挂梯子,
</summary>
</entry>
<entry>
<title>知识图谱思路</title>
<link href="https://asswei7.github.io/2021/09/23/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1%E6%80%9D%E8%B7%AF/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1%E6%80%9D%E8%B7%AF/"/>
<id>https://asswei7.github.io/2021/09/23/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1%E6%80%9D%E8%B7%AF/%E7%9F%A5%E8%AF%86%E5%9B%BE%E8%B0%B1%E6%80%9D%E8%B7%AF/</id>
<published>2021-09-23T06:48:36.000Z</published>
<updated>2021-09-23T08:25:19.705Z</updated>
<content type="html"><![CDATA[<h1 id="知识图谱与预训练语言模型"><a href="#知识图谱与预训练语言模型" class="headerlink" title="知识图谱与预训练语言模型"></a>知识图谱与预训练语言模型</h1><h1 id="Focal-Loss"><a href="#Focal-Loss" class="headerlink" title="Focal Loss"></a>Focal Loss</h1><p>做机器学习分类问题,难免遇到Biased-Data-Problem, 例如</p><ul><li>CV的目标检测问题: 绝大多数检测框里都是 backgroud</li><li>NLP的异常文本检测: 绝大多数文本都是 normal</li><li>对此,以下套路可以缓解:</li><li>升/降采样, 或者调整样本权重</li><li>换个更鲁棒的loss函数 ,或者加正则</li><li>集成模型: Bagging, RandomForest …</li><li>利于外部先验知识: 预训练+微调</li><li>多任务联合学习</li></ul><p><img src="/images/知识图谱思路/CE.png" alt><br>可以看到如果label是1,p越接近1,损失就越小。</p><p>考前复习的时候,「他不会划重点,对所有知识点 “一视同仁”」。</p><p>如果教科书上有100道例题,包括: 90道加减乘除 + 10道 三角函数。CE同学就会吭哧吭哧的“平均用力”反复练习这100道例题,结果可想而知——他会精通那90道个位数加减乘除题目,然后其他题目基本靠蒙。那10道他不会的题,往往还是分值高的压轴题。</p><p>方法一:分科复习</p><p>每个【科目】的难度是不同的;你要花 30%的精力在四则运算,70%的精力在三角函数。—- 老师告诉CE同学 第一个技巧<br><img src="/images/知识图谱思路/way1.png" alt></p><p>方法二:刷题战术<br><img src="/images/知识图谱思路/way2.png" alt><br>当$p_t$越大,说明准确率越高,观察CE中的$p_t$,它反映了模型对这个样本的识别能力(即 “这个知识点掌握得有多好”);显然,对于$p_t$越大的样本,我们越要打压它对loss的贡献。</p><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></pre></td><td class="code"><pre><span class="line">from keras import backend as K</span><br><span class="line">def focal_loss(alpha=0.75, gamma=2.0):</span><br><span class="line"> """ 参考 https://blog.csdn.net/u011583927/article/details/90716942 """</span><br><span class="line"> def focal_loss_fixed(y_true, y_pred):</span><br><span class="line"> # y_true 是个一阶向量, 下式按照加号分为左右两部分</span><br><span class="line"> # 注意到 y_true的取值只能是 0或者1 (假设二分类问题),可以视为“掩码”</span><br><span class="line"> # 加号左边的 y_true*alpha 表示将 y_true中等于1的槽位置为标量 alpha</span><br><span class="line"> # 加号右边的 (ones-y_true)*(1-alpha) 则是将等于0的槽位置为 1-alpha</span><br><span class="line"> ones = K.ones_like(y_true)</span><br><span class="line"> alpha_t = y_true*alpha + (ones-y_true)*(1-alpha)</span><br><span class="line"></span><br><span class="line"> # 类似上面,y_true仍然视为 0/1 掩码</span><br><span class="line"> # 第1部分 `y_true*y_pred` 表示 将 y_true中为1的槽位置为 y_pred对应槽位的值</span><br><span class="line"> # 第2部分 `(ones-y_true)*(ones-y_pred)` 表示 将 y_true中为0的槽位置为 (1-y_pred)对应槽位的值</span><br><span class="line"> # 第3部分 K.epsilon() 避免后面 log(0) 溢出</span><br><span class="line"> p_t = y_true*y_pred + (ones-y_true)*(ones-y_pred) + K.epsilon()</span><br><span class="line"></span><br><span class="line"> # 就是公式的字面意思</span><br><span class="line"> focal_loss = -alpha_t * K.pow((ones-p_t),gamma) * K.log(p_t)</span><br><span class="line"> return focal_loss_fixed</span><br><span class="line"></span><br><span class="line">model = ...</span><br><span class="line">model.compile(..., loss=focal_loss(gamma=3, alpha=0.5))</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h1 id="知识图谱与预训练语言模型"><a href="#知识图谱与预训练语言模型" class="headerlink" title="知识图谱与预训练语言模型"></a>知识图谱与预训练语言模型</h1><h1 id="Focal-Loss"><a href="#Foc
</summary>
</entry>
<entry>
<title>Nginx</title>
<link href="https://asswei7.github.io/2021/09/23/Nginx/Nginx/"/>
<id>https://asswei7.github.io/2021/09/23/Nginx/Nginx/</id>
<published>2021-09-23T02:05:22.000Z</published>
<updated>2021-09-23T02:14:39.845Z</updated>
<content type="html"><![CDATA[<h1 id="代理"><a href="#代理" class="headerlink" title="代理"></a>代理</h1><p>设计模式中的代理模式:给某个对象提供一个代理对象,并由代理对象控制原对象的引用。</p><p>理解为看房的中介。<br>当使用我们平台的用户越来越多了,并发量慢慢增大了,这时候一台服务器满足不了我们的需求了。于是我们横向扩展,又增加了服务器。这个时候几个项目启动在不同的服务器上,用户要访问,就需要增加一个代理服务器了,通过代理服务器来帮我们转发和处理请求。</p><p>我们希望这个代理服务器可以帮助我们接收用户的请求,然后将用户的请求按照规则帮我们转发到不同的服务器节点之上。这个过程用户是无感知的,用户并不知道是哪个服务器返回的结果,我们还希望他可以按照服务器的性能提供不同的权重选择。<br><img src="/images/Nginx/代理.png" alt></p><h1 id="正向代理"><a href="#正向代理" class="headerlink" title="正向代理"></a>正向代理</h1><p> 这里我再举一个例子:大家都知道,现在国内是访问不了 Google的,那么怎么才能访问 Google呢?我们又想,美国人不是能访问 Google吗(这不废话,Google就是美国的),如果我们电脑的对外公网 IP 地址能变成美国的 IP 地址,那不就可以访问 Google了。你很聪明,VPN 就是这样产生的。我们在访问 Google 时,先连上 VPN 服务器将我们的 IP 地址变成美国的 IP 地址,然后就可以顺利的访问了。</p><p> 这里的 VPN 就是做正向代理的。正向代理服务器位于客户端和服务器之间,为了向服务器获取数据,客户端要向代理服务器发送一个请求,并指定目标服务器,代理服务器将目标服务器返回的数据转交给客户端。这里客户端是要进行一些正向代理的设置的。</p><h1 id="反向代理"><a href="#反向代理" class="headerlink" title="反向代理"></a>反向代理</h1><p>正向和反向的区别在于:<strong>正向代理代理的是客户端,反向代理代理的是服务器</strong>。<br>所以,反向代理对客户端是无感知的,因为客户端不需要任何配置就可以访问。只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,再返回客户端。<br><img src="/images/Nginx/正向.png" alt><br><img src="/images/Nginx/反向.png" alt></p><p>理解这两种代理的关键在于代理服务器所代理的对象是什么,正向代理代理的是客户端,我们需要在客户端进行一些代理的设置。而反向代理代理的是服务器,作为客户端的我们是无法感知到服务器的真实存在的。</p>]]></content>
<summary type="html">
<h1 id="代理"><a href="#代理" class="headerlink" title="代理"></a>代理</h1><p>设计模式中的代理模式:给某个对象提供一个代理对象,并由代理对象控制原对象的引用。</p>
<p>理解为看房的中介。<br>当使用我们平台的用
</summary>
</entry>
<entry>
<title>长征</title>
<link href="https://asswei7.github.io/2021/09/22/%E9%95%BF%E5%BE%81/%E9%95%BF%E5%BE%81/"/>
<id>https://asswei7.github.io/2021/09/22/%E9%95%BF%E5%BE%81/%E9%95%BF%E5%BE%81/</id>
<published>2021-09-22T13:11:48.000Z</published>
<updated>2021-09-23T11:06:55.257Z</updated>
<content type="html"><![CDATA[<p>顾顺章叛变,上海地下党暴露,中共中央的领导转移到了苏区,王明被共产国际指定为中央的主要领导人,认为应该攻击主要城市。然后博古请来了伏龙芝军事学院毕业的李德,认为山沟沟里没有马列主义。</p><p>蒋介石树立碉堡来割裂根据地,李德让红军堡垒对堡垒,引起大家的不满。因为共军的堡垒会被飞机打破。决定派项英、陈毅带领一万六千人留守,其余人进行长征。</p><p>教员在政治上趋于成熟,因为原本经常一个人反对所有人,得罪了好多人。现在决定争取中间派,在路上和洛浦、王稼祥同行,达成了共识:博古不行,没能力带领红军。</p><p>遵义会议:教员指出先纠正军事指挥的错误,不先追究责任。得到了周恩来的支持。</p><p>一开始指挥,为了能够顺利渡过长江,建议在土城附近围歼郭勋奇部,但由于情报有误,没有打过,只能一渡赤水,向西南走。</p><p><img src="/images/长征/一渡赤水.png" alt><br>蒋介石判断红军是想逃到云南,所以想在云南围歼红军。但是却出人意料地二渡赤水,占领娄山关,回到遵义。<br><img src="/images/长征/二渡赤水.png" alt><br>但此时教员的战法与大家不同。原来的方案是按照既定计划,严格执行。教员认为要保存有生力量,不能硬打。</p><p> 红军在鲁班场战役损失惨重,决定经茅台镇三渡赤水。<br> <img src="/images/长征/三渡赤水.png" alt></p><p> 在陈福村召开会议,因为遵义会议后,虽然解除了博古李德的指挥,但是仍有20多人参与决策。陈福村会议后,毛泽东进入领导核心。</p><p> 三渡赤水后,蒋介石判断红军的目的是北上渡江,立即调集兵力于川南。<br> <img src="/images/长征/四渡赤水.png" alt><br> 毛主席带兵原路返回,四渡赤水,直插贵阳的蒋介石。蒋介石让滇军主力迅速来救,教员看到滇军离开云南,便带红军直插昆明,打出标语“打到昆明,活捉龙云”,龙云调附近守军回到昆明。金沙江旁边的守军兵力大幅缩减,于是巧渡金沙江,摆脱了大部分的敌人追击。</p><p>会理会议:林彪不满教员用兵走了很多冤枉路,因为他不知道很多情报,但是周恩来和朱德力挺教员。巩固了毛泽东在党内的地位。<br>红军要飞夺泸定桥,22名突击队员爬着铁索过桥。强渡大渡河。</p><p>然后翻雪山,夹金山。 </p><p>翻过雪山后与四方面军在懋功会师,总兵力达到10多万人。但是张国焘以为中央红军有30多万人,但是中央红军只有2万多人,而且 装备都不如四方面军。张国焘心里不满,公开要权。</p><p>只能继续北上过草地,右路军穿过草地,等着和左路军会合继续北上。但是左路军在张国焘进入草地后,准备退回阿坝。并要求右路军的陈昌浩也向南撤。毛泽东带着中央红军偷偷北上,徐向前和陈昌浩只能抱怨。 </p><p>1936年6月张国焘被迫取消第二中央,与红二、四方面军一起北上,10月到达陕北。</p><p>经过六盘山后,</p>]]></content>
<summary type="html">
<p>顾顺章叛变,上海地下党暴露,中共中央的领导转移到了苏区,王明被共产国际指定为中央的主要领导人,认为应该攻击主要城市。然后博古请来了伏龙芝军事学院毕业的李德,认为山沟沟里没有马列主义。</p>
<p>蒋介石树立碉堡来割裂根据地,李德让红军堡垒对堡垒,引起大家的不满。因为共军的
</summary>
</entry>
<entry>
<title>基准数据集介绍</title>
<link href="https://asswei7.github.io/2021/09/22/%E5%9F%BA%E5%87%86%E6%95%B0%E6%8D%AE%E9%9B%86%E4%BB%8B%E7%BB%8D/%E5%9F%BA%E5%87%86%E6%95%B0%E6%8D%AE%E9%9B%86%E4%BB%8B%E7%BB%8D/"/>
<id>https://asswei7.github.io/2021/09/22/%E5%9F%BA%E5%87%86%E6%95%B0%E6%8D%AE%E9%9B%86%E4%BB%8B%E7%BB%8D/%E5%9F%BA%E5%87%86%E6%95%B0%E6%8D%AE%E9%9B%86%E4%BB%8B%E7%BB%8D/</id>
<published>2021-09-22T06:58:40.000Z</published>
<updated>2021-09-22T07:03:01.964Z</updated>
<content type="html"><![CDATA[<p>NLP主要包括自然语言理解(NLU)和自然语言生成(NLG)。纽约大学和华盛顿大学等创建了一个多任务的NLP的基准和分析平台,即GLUE(general language understanding evaluation).GLUE九项任务涉及到自然语言推断、文本蕴含、情感分析、语义相似等多个任务。</p><p>GLUE共有九个任务,分别是CoLA、SST-2、MRPC、STS-B、QQP、MNLI、QNLI、RTE、WNLI。如下图图2所示,可以分为三类,分别是单句任务,相似性和释义任务.<br><img src="/images/GLUE/tasks.png" alt></p>]]></content>
<summary type="html">
<p>NLP主要包括自然语言理解(NLU)和自然语言生成(NLG)。纽约大学和华盛顿大学等创建了一个多任务的NLP的基准和分析平台,即GLUE(general language understanding evaluation).GLUE九项任务涉及到自然语言推断、文本蕴含、情感
</summary>
</entry>
<entry>
<title>大决战</title>
<link href="https://asswei7.github.io/2021/09/20/%E5%A4%A7%E5%86%B3%E6%88%98/%E5%A4%A7%E5%86%B3%E6%88%98/"/>
<id>https://asswei7.github.io/2021/09/20/%E5%A4%A7%E5%86%B3%E6%88%98/%E5%A4%A7%E5%86%B3%E6%88%98/</id>
<published>2021-09-20T06:52:16.000Z</published>
<updated>2021-09-22T02:01:10.205Z</updated>
<content type="html"><![CDATA[<h1 id="背景知识"><a href="#背景知识" class="headerlink" title="背景知识"></a>背景知识</h1><p>1948年,将全军各地的部队按地域划分为四大野战军。</p><ul><li>西北野战军:彭德怀、张宗逊、习仲勋</li><li>中原野战军:刘伯承、邓小平、李达</li><li>华东野战军:陈毅、粟裕、张云逸</li><li>东北野战军:林彪、罗荣桓、刘亚楼</li></ul><p>1949年,全国即将解放,按照地域划分不合适,西北改为一野,中原改为二野,华东改为三野,东北改为四野,还成立了华北野战军,受中央直接指挥。</p><p>1949年1月15日,中共中央军委下达了《关于野战军番号改按序数排列的决定》,将原西北野战军改编为“第一野战军”,彭德怀任司令员兼政治委员;将原中原野战军改编为“第二野战军”,刘伯承任司令员,邓小平任政治委员;将原华东野战军改编为“第三野战军”,陈毅任司令员兼政治委员,粟裕任副司令员兼第二副政治委员;将原东北野战军改编为“第四野战军”,林彪任司令员,罗荣桓任政治委员。将原华北军区的部队改编为“华北野战军”,受毛泽东、中央军委直接领导和指挥。在人民解放军的序列中,形成了五大野战军:“一野”、“二野”、“三野”、“四野”和“华野”。</p><h1 id="辽沈战役"><a href="#辽沈战役" class="headerlink" title="辽沈战役"></a>辽沈战役</h1><p>当时国民党大军别分割在长春、沈阳、锦州,<br>长春:郑洞国,曾泽生<br>沈阳:卫立煌<br>锦州:范汉杰<br><img src="/images/大决战/东北局势.png" alt><br>美国建议蒋介石撤出东北,这样的话会给华北的解放军带来巨大的压力。所以毛主席指示东野的林罗刘,要把国民党军封闭在东北各个歼灭。</p><p>林彪想法:攻打长春,围点打援<br>主席想法:如果长春守军被歼灭,卫立煌就会放弃东北。而如果攻下锦州,可以关门打狗。<br>但我军主力在哈尔滨,而且补给线需要从北到南,要输送到锦州,经过的铁路沿线可能会被破坏。<br>蒋介石想让卫立煌将主力从沈阳撤到锦州,这样可进可退。卫立煌担心路途中被林彪歼灭,打算居城固守。</p><p>但是攻打长春后,卫立煌并不派兵支援,只能南下。主席让林彪全力打锦州,才能让卫立煌放心来支援。<br>蒋介石部署:东西合击。<br><img src="/images/大决战/东西合力.png" alt></p><p>蒋介石向锦州西部的葫芦岛增兵,林彪感觉压力很大,左边有葫芦岛军队,背后有沈阳长春军队,想回头打长春。<br>最后决定还是按照军委的部署,阻击葫芦岛,攻打锦州,防备沈阳的廖耀湘军团。</p><p>国民党支援锦州打算从塔山路过,沈阳的廖耀湘也决定西边的军队能到达锦州,自己就出兵救援。所以塔山十分重要。<br>守方是四纵,攻方是独立95师,都是王牌部队。塔山受到巨大的威胁,林彪考虑是否把总预备队调上。</p><p>此时,廖耀湘从沈阳出发北进,占领彰武,切断了林彪从北向南运输的大动脉。林彪反而觉得轻松,因为廖耀湘是和前往锦州的相反前进。<br><img src="/images/大决战/彰武.png" alt><br>廖耀湘想法:等着塔山突破,林彪就没有多余的军力来打自己,他和卫立煌都不愿为了锦州的范汉杰损失自己的力量。</p><p>攻打锦州:最主要的是外围的配水池。锦州守军因为有两路援军,还有很强的战斗意志,连续反扑。后来,锦州被攻破,范汉杰被俘虏。<br>蒋介石让长春的郑洞国向东南方向撤退,而城内的六十军军长曾泽生已经起义。郑洞国准备自杀,后来投降。</p><p>四野接下来的目标就是锦西和葫芦岛,然后就是沈阳的廖耀湘。</p><p>蒋介石的方略:以黑山、大虎山进攻,营造向锦州前进的假象,主力经大虎山东南,向营口转进。<br>林彪看出意图,放弃锦西、葫芦岛方案,全力围歼廖耀湘兵团。一方面守住黑山,一方面占领营口。<br>廖耀湘攻击黑山三天,放弃,准备转向营口。独立二师偶遇廖耀湘,将其打退。廖耀湘被包围。廖耀湘向沈阳撤退。</p><h1 id="淮海战役"><a href="#淮海战役" class="headerlink" title="淮海战役"></a>淮海战役</h1><p><img src="/images/大决战/淮海布局.png" alt></p><p>东部战争:先切断李弥兵团和黄百韬兵团的联系,再吃掉黄百韬兵团。<br><img src="/images/大决战/东部战争.png" alt></p><p>西部战争:刘邓攻占郑州,然后直出徐州、蚌埠一线,牵制孙元良、刘汝明。刘伯承牵制左下部队。<br><img src="/images/大决战/西部战局.png" alt></p><p>蒋介石让黄百韬西渡运河,从曹八集撤到徐州。黄百韬等待海州的李延年和44军,使得黄百韬兵团彻底陷入了华野的合围之中。<br>东部的第三绥靖区两个军起义,给华野让出道路,华野抢先占领曹八集,堵住了黄百韬撤退的道路。</p><p>杜聿明计划,调集孙元良、李弥邱清泉先击败刘伯承,再向东击败粟裕。国防部部署,邱、李兵团向东营救黄百韬,黄维兵团向徐州急进,群集一团。<br><img src="/images/大决战/中期局势.png" alt></p><p>南边有李延年、刘汝明兵团,西边有黄维兵团,邱清泉、李弥组成的东援部队也从徐州出发。黄百韬在碾庄也击退了华野的进攻。</p><p>此时,中野要抢占宿县。因为此时孙元良刚刚由南向北到达徐州,而黄维、刘汝明等还在南部。<br>蒋介石称自己部署为长蛇阵,共产党将黄百韬的蛇头掐断,中野机动兵团缠住蛇尾的黄维兵团,中野主力在宿县拦腰截断。孤立徐州的刘峙集团。<br><img src="/images/大决战/宿县.png" alt></p><p>中央决定围歼邱清泉、李弥兵团,但是遭到其后部强烈抵抗,遂撤退。而且黄百韬的部队也难以消灭。于是总前委决定,先消灭黄百韬,补充兵力,再打黄维,最后解决邱、李。主席同意了这个放弃诱奸邱、李的计划,集中优势兵力发起对黄百韬的总攻。</p><p>全力攻击碾庄,在碾庄被攻占后,邱、李兵团距离碾庄还有20里。</p><p>第一阶段复盘:前期很不占优势,虽然吃掉了黄百韬兵团,但是部队损失严重,华野大伤元气。而刘伯承的中野还要面对黄维兵团攻占宿县。</p><p>中野想吃掉黄维兵团,又担心南部的李延年、刘汝明兵团支援。但主席说蒋军防御尚可,不会主动攻击的。<br>主席并派刚歼灭黄百韬的华野抽调一部分兵力支援中野。黄维企图突围,但是110师起义,并堵住了敌人的突围。<br>战后粟裕说,中野人数少、装备差,面对的敌人也是精锐,能歼灭黄维十分不易。</p><p><img src="/images/大决战/黄维兵团.png" alt><br>此时蒋介石的局势:平津的傅作义兵团被包围,胡宗南在西北被彭德怀死死咬住,华中的白崇禧处处掣肘,以李宗仁为首的党内势力蠢蠢欲动。所以蒋介石想保存实力,维持统治。所以想放弃黄维兵团,将主力撤退到蚌埠。</p><p>而此时整个徐州城都知道了撤退的消息,负责殿后的李弥没和杜聿明打招呼,带着自己的军队先跑了,并且爆炸队摧毁了桥梁,导致所有人都知道国军要撤退了。关键就是杜聿明从哪里撤退。杜聿明本来可以撤退,蒋介石又让杜聿明解救黄维兵团,导致其被合围。<br><img src="/images/大决战/二阶段.png" alt><br>第二阶段以黄维兵团被全歼,李延年、刘汝明兵团溃退而结束。中央为了避免蒋介石调傅作义南下,提出先不打杜聿明,然后围歼杜聿明。</p><h1 id="平津战役"><a href="#平津战役" class="headerlink" title="平津战役"></a>平津战役</h1><p>当时美国对蒋介石失去信心,转而扶持地方实力派来维护自己的利益。司徒雷登与“华北王”傅作义商谈,派海军停在青岛,接应傅作义。<br>傅作义想在蒋介石、美国、中共之间斡旋。傅作义的女儿傅冬菊和其丈夫周毅都是共产党。傅作义想缓兵之计,巩固防线。<br><img src="/images/大决战/傅作义三条路.png" alt><br>傅作义三条路:西撤绥远,但是那里物资匮乏,难以长久。东撤塘沽,准备海运南撤。或者固守北平。<br><img src="/images/大决战/军队部署.png" alt><br>西边是自己的嫡系部队,东部是蒋系部队,王牌35军机动部队。</p><p>主席认为切断傅作义回到绥远是重点,而重点就是平张线上的张家口。华北三兵团包围张家口,平津战役开始。杨成武、李天焕是华北三兵团司令和政委。由于傅作义不知道东野入关,决定派35军(军长郭景云)支援张家口。后来,东野(守塔山的程子华)占领密云,引起傅作义的警觉,让35军撤回北平。<br>35军被拖延一段时间,<br><img src="/images/大决战/35军.png" alt><br>由于三个兵团配合不利,没有堵住35军撤回北平的铁路。而且正是东北先遣部队攻占密云才引起傅作义警觉,主席很生气。</p><p>所以堵住35军的只有一个12旅,且背后还有傅作义派去接应的104军。南部的杨得志(罗瑞卿)主力要迅速支援上来。<br>华北二兵团克服困难,六昼夜急行军达到新保安地区,阻挡了35军撤回北平。而且104军也被切断了退路,被解放军歼灭。</p><p>此时蒋介石让傅作义经塘沽南撤。中央指示两个星期不进攻张家口和新保安,一方面拉拢傅作义,一方面给东北野战军入关争取时间,切断傅作义海路南撤的计划。东北野战军走山海关捷径直插天津、塘沽。</p><p>傅作义心存幻想,想三分天下。主席决定先吃掉35军。在新保安歼灭35军。</p><p>然后攻占了张家口,切断了傅作义向西撤退道路。<br><img src="/images/大决战/张家口.png" alt></p><p>傅作义派出周北峰,张东荪作为谈判代表,中央派出林彪、罗荣桓、聂荣臻。傅作义提出军队出城整编,中共要求五天之内做出决定。</p><p>军委决定先打塘沽,再打天津,切断傅作义海上逃跑路线。纵队司令认为先打天津,再打塘沽。老蒋令陈长捷放弃天津,退守塘沽。陈长捷觉得对不起傅作义,没有答应。</p><p>刘亚楼攻击天津。迷惑敌人,攻击方向是城北。从东西进攻,在金汤桥对天津南北拦腰截断。29小时解放天津。</p>]]></content>
<summary type="html">
<h1 id="背景知识"><a href="#背景知识" class="headerlink" title="背景知识"></a>背景知识</h1><p>1948年,将全军各地的部队按地域划分为四大野战军。</p>
<ul>
<li>西北野战军:彭德怀、张宗逊、习仲勋</li>
</summary>
<category term="历史" scheme="https://asswei7.github.io/categories/%E5%8E%86%E5%8F%B2/"/>
</entry>
<entry>
<title>会呼吸的痛</title>
<link href="https://asswei7.github.io/2021/09/20/%E4%BC%9A%E5%91%BC%E5%90%B8%E7%9A%84%E7%97%9B/%E4%BC%9A%E5%91%BC%E5%90%B8%E7%9A%84%E7%97%9B/"/>
<id>https://asswei7.github.io/2021/09/20/%E4%BC%9A%E5%91%BC%E5%90%B8%E7%9A%84%E7%97%9B/%E4%BC%9A%E5%91%BC%E5%90%B8%E7%9A%84%E7%97%9B/</id>
<published>2021-09-20T05:52:21.000Z</published>
<updated>2021-09-21T08:06:29.128Z</updated>
<content type="html"><![CDATA[<blockquote><p>在东京铁塔 第一次眺望<br>看灯火模仿 坠落的星光<br>我终于到达 但却更悲伤<br>一个人完成 我们的梦想<br>你总说 时间还很多 你可以等我<br>以前我不懂得 未必明天 就有以后</p></blockquote><p>结合电影《东京塔》:我从阿姨那儿得知“妈得了癌症,住院去做手术。”手术成功了,不过妈还没痊愈。只有持续用药控制癌细胞。尽管如此妈还是留在那个萧条的乡下打算工作着。为了回避她我到了东京。从十五岁离开她之后又过了十五年,我和妈在东京的杂居大楼,又开始二人生活。妈拿来世世代代继承的米糠,我像从前一样地每天吃着妈煮的饭。不久我的女友和朋友、同事等,为了吃我老妈亲手煮的菜而聚集到我家来。自从来了东京第一次才觉得每天是幸福快乐的。<br>2001年4月1日,樱花盛开的季节却飘起了雪花。透过医院的玻璃窗,我和妈妈遥望着东京塔。</p><blockquote><p>没看你脸上 张扬过哀伤<br>那是种多么 寂寞的倔强<br>你拆了城墙 让我去流浪<br>在原地等我 把自己捆绑<br>你没说 你也会软弱 需要依赖我<br>我就装不晓得 自由移动 自我地过</p><p>我发誓不再说谎了 多爱你就会抱你多紧的<br>我的微笑都假了 灵魂像飘浮着 你在就好了<br>我发誓不让你等候 陪你做想做的无论什么<br>我越来越像贝壳 怕心被人触碰 你回来那就好了<br>能重来那就好了</p></blockquote><p>歌词以“在东京铁塔,第一次眺望……”开头,正是因为原小说主角因父母离异,自小和母亲相依为命,过着困顿生活,但母亲的爱始终不虞匮乏。长大后主角辗转到东京发展小有成绩,约定跟母亲要一起到她向往的东京铁塔一游,但总因自己的各种理由,迟迟未能实现。直到母亲因病过世,主角抱着母亲的骨灰罐登上东京铁塔,才痛哭自己陪母亲的时间太少。 </p>]]></content>
<summary type="html">
<blockquote>
<p>在东京铁塔 第一次眺望<br>看灯火模仿 坠落的星光<br>我终于到达 但却更悲伤<br>一个人完成 我们的梦想<br>你总说 时间还很多 你可以等我<br>以前我不懂得 未必明天 就有以后</p>
</blockquote>
<p>结合电影《东京
</summary>
<category term="音乐" scheme="https://asswei7.github.io/categories/%E9%9F%B3%E4%B9%90/"/>
</entry>
<entry>
<title>图谱实践</title>
<link href="https://asswei7.github.io/2021/09/17/%E5%9B%BE%E8%B0%B1%E5%AE%9E%E8%B7%B5/%E5%9B%BE%E8%B0%B1%E5%AE%9E%E8%B7%B5/"/>
<id>https://asswei7.github.io/2021/09/17/%E5%9B%BE%E8%B0%B1%E5%AE%9E%E8%B7%B5/%E5%9B%BE%E8%B0%B1%E5%AE%9E%E8%B7%B5/</id>
<published>2021-09-17T02:07:52.000Z</published>
<updated>2021-09-23T06:52:44.606Z</updated>
<content type="html"><![CDATA[<h1 id="RDF、RDFS、OWL"><a href="#RDF、RDFS、OWL" class="headerlink" title="RDF、RDFS、OWL"></a>RDF、RDFS、OWL</h1><h3 id="RDF"><a href="#RDF" class="headerlink" title="RDF"></a>RDF</h3><p>Example3 Turtle:</p><p>@prefix person: <a href="http://www.kg.com/person/">http://www.kg.com/person/</a> .<br>@prefix place: <a href="http://www.kg.com/place/">http://www.kg.com/place/</a> .<br>@prefix : <a href="http://www.kg.com/ontology/">http://www.kg.com/ontology/</a> .</p><p>person:1 :chineseName “罗纳尔多·路易斯·纳萨里奥·德·利马”^^string;<br> :career “足球运动员”^^string;<br> :fullName “Ronaldo Luís Nazário de Lima”^^string;<br> :birthDate “1976-09-18”^^date;<br> :height “180”^^int;<br> :weight “98”^^int;<br> :nationality “巴西”^^string;<br> :hasBirthPlace place:10086.<br>place:10086 :address “里约热内卢”^^string;<br> :coordinate “-22.908333, -43.196389”^^string.</p><p>即,将一个实体用一个句子表示(这里的句子指的是一个英文句号“.”)而不是多个句子,属性间用分号隔开。</p><p>RDF的表达能力有限,无法区分类和对象,也无法定义和描述类的关系/属性。我的理解是,RDF是对具体事物的描述,缺乏抽象能力,无法对同一个类别的事物进行定义和描述。就以罗纳尔多这个知识图为例,RDF能够表达罗纳尔多和里约热内卢这两个实体具有哪些属性,以及它们之间的关系。但如果我们想定义罗纳尔多是人,里约热内卢是地点,并且人具有哪些属性,地点具有哪些属性,人和地点之间存在哪些关系,这个时候RDF就表示无能为力了。</p><p>RDFS和OWL这两种技术或者说模式语言/本体语言(schema/ontology language)解决了RDF表达能力有限的困境。</p><h3 id="RDFS"><a href="#RDFS" class="headerlink" title="RDFS"></a>RDFS</h3><p>RDFS/OWL本质上是一些预定义词汇(vocabulary)构成的集合,用于对RDF进行类似的类定义及其属性的定义。</p><p>我们这里只介绍RDFS几个比较重要,常用的词汇:</p><ol><li>rdfs:Class. 用于定义类。</li><li>rdfs:domain. 用于表示该属性属于哪个类别。</li><li>rdfs:range. 用于描述该属性的取值类型。</li><li>rdfs:subClassOf. 用于描述该类的父类。比如,我们可以定义一个运动员类,声明该类是人的子类。</li><li>rdfs:subProperty. 用于描述该属性的父属性。比如,我们可以定义一个名称属性,声明中文名称和全名是名称的子类。</li></ol><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></pre></td><td class="code"><pre><span class="line">@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .</span><br><span class="line">@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .</span><br><span class="line">@prefix : <http://www.kg.com/ontology/> .</span><br><span class="line"></span><br><span class="line">这里我们用词汇rdfs:Class定义了“人”和“地点”这两个类。</span><br><span class="line">:Person rdf:type rdfs:Class.</span><br><span class="line">:Place rdf:type rdfs:Class.</span><br><span class="line">rdfs当中不区分数据属性和对象属性,词汇rdf:Property定义了属性,即RDF的“边”。</span><br><span class="line">:chineseName rdf:type rdf:Property;</span><br><span class="line"> rdfs:domain :Person;</span><br><span class="line"> rdfs:range xsd:string .</span><br><span class="line"></span><br><span class="line">:career rdf:type rdf:Property;</span><br><span class="line"> rdfs:domain :Person;</span><br><span class="line"> rdfs:range xsd:string .</span><br><span class="line"> </span><br><span class="line">:fullName rdf:type rdf:Property;</span><br><span class="line"> rdfs:domain :Person;</span><br><span class="line"> rdfs:range xsd:string .</span><br></pre></td></tr></table></figure><h3 id="OWL"><a href="#OWL" class="headerlink" title="OWL"></a>OWL</h3><p>上面我们提到,RDFS本质上是RDF词汇的一个扩展。后来人们发现RDFS的表达能力还是相当有限,因此提出了OWL。我们也可以把OWL当做是RDFS的一个扩展,其添加了额外的预定义词汇。OWL,即“Web Ontology Language”,语义网技术栈的核心之一。OWL有两个主要的功能:1. 提供快速、灵活的数据建模能力。2. 高效的自动推理。</p><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></pre></td><td class="code"><pre><span class="line">@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .</span><br><span class="line">@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .</span><br><span class="line">@prefix : <http://www.kg.com/ontology/> .</span><br><span class="line">@prefix owl: <http://www.w3.org/2002/07/owl#> .</span><br><span class="line"></span><br><span class="line">这里我们用词汇owl:Class定义了“人”和“地点”这两个类。</span><br><span class="line">:Person rdf:type owl:Class.</span><br><span class="line">:Place rdf:type owl:Class.</span><br><span class="line"></span><br><span class="line">owl区分数据属性和对象属性(对象属性表示实体和实体之间的关系)。词汇owl:DatatypeProperty定义了数据属性,owl:ObjectProperty定义了对象属性。</span><br><span class="line">:chineseName rdf:type owl:DatatypeProperty;</span><br><span class="line"> rdfs:domain :Person;</span><br><span class="line"> rdfs:range xsd:string .</span><br><span class="line"></span><br><span class="line">:career rdf:type owl:DatatypeProperty;</span><br><span class="line"> rdfs:domain :Person;</span><br><span class="line"> rdfs:range xsd:string .</span><br><span class="line"> </span><br><span class="line">:fullName rdf:type owl:DatatypeProperty;</span><br><span class="line"> rdfs:domain :Person;</span><br><span class="line"> rdfs:range xsd:string .</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>描述属性特征的词汇</p><ol><li>owl:TransitiveProperty. 表示该属性具有传递性质。例如,我们定义“位于”是具有传递性的属性,若A位于B,B位于C,那么A肯定位于C。</li><li>owl:SymmetricProperty. 表示该属性具有对称性。例如,我们定义“认识”是具有对称性的属性,若A认识B,那么B肯定认识A。</li><li>owl:FunctionalProperty表示该属性取值的唯一性。例如,我们定义“母亲”是具有唯一性的属性,若A的母亲是B,在其他地方我们得知A的母亲是C,那么B和C指的是同一个人。</li><li>owl:inverseOf. 定义某个属性的相反关系。例如,定义“父母”的相反关系是“子女”,若A是B的父母,那么B肯定是A的子女。</li></ol><p>本体映射词汇(Ontology Mapping)</p><ol><li>owl:equivalentClass. 表示某个类和另一个类是相同的。</li><li>owl:equivalentProperty. 表示某个属性和另一个属性是相同的。</li><li>owl:sameAs. 表示两个实体是同一个实体。</li></ol><p>本体映射主要用在融合多个独立的Ontology(Schema)。举个例子,张三自己构建了一个本体结构,其中定义了Person这样一个类来表示人;李四则在自己构建的本体中定义Human这个类来表示人。当我们融合这两个本体的时候,就可以用到OWL的本体映射词汇。</p><p><strong>推理方面的能力</strong>:基于本体的推理和基于规则的推理<br>如果我们用inversOf来表示hasParent和hasChild互为逆关系,上面的数据可以表示为:<br><img src="/images/图谱实践/reverse.png" alt>绿色的关系表示是我们RDF数据中真实存在的,红色的关系是推理得到的。</p><h1 id="数据准备和实体建模"><a href="#数据准备和实体建模" class="headerlink" title="数据准备和实体建模"></a>数据准备和实体建模</h1><p>本实例数据获取方法:以周星驰为初始入口,获取其出演的所有电影;再获取这些电影的所有参演演员;最后获取所有参演演员所出演的全部电影。经过去重处理,我们得到了505个演员的基本信息和4518部电影的基本信息。数据保存在mysql中,其ER图如下:<br><img src="/images/图谱实践/movie_data.png" alt></p><p>protege字体调大,File-Perference-Renderer-font size即可。<br>首先填写本体资源的IRI。</p><p>然后创建三个类,分别为Genre、Movie、Person</p><p>切换到Object Properties,在此建立三个类之间的关系,”hasActedIn”表示某人参演了某电影,因此我们在右下方的3号矩形框中定义该属性的”domain”是人,4号框定义”range”是电影。这个很好理解,”domain”表示该属性是属于哪个类的,”range”表示该属性的取值范围。2号框表示该属性的逆属性是”hasActor”,即,有了推理机,尽管我们的RDF数据只保存了A出演了B,我们在查询的时候也能得到B的演员有A。</p><p>最后,我们切换到”Data properties”,我们在该界面创建类的属性,即,数据属性。其定义方法和对象属性类似,除了没有这么丰富的描述属性特性的词汇。其实不难理解,这些描述特性的词汇是传递、对称、反对称、自反等,表明其必定有指向其他资源或自身的边,而我们之前提到过,数据属性相当于树的叶子节点,只有入度,而没有出度。</p><p>然后保存成为了owl文件,内容即为之前设置的class、object property、Data property三部分。</p><h1 id="关系数据库到RDF"><a href="#关系数据库到RDF" class="headerlink" title="关系数据库到RDF"></a>关系数据库到RDF</h1><h3 id="从关系数据库映射到RDF的两个标准"><a href="#从关系数据库映射到RDF的两个标准" class="headerlink" title="从关系数据库映射到RDF的两个标准"></a>从关系数据库映射到RDF的两个标准</h3><ul><li><p>direct mapping<br>1.数据库的表作为本体中的类(Class)。比如我们在mysql中保存的数据,一共有5张表。那么通过映射后,我们的本体就有5个类了,而不是我们自己定义的三个类。2. 表的列作为属性(Property)。3. 表的行作为实例/资源。4. 表的单元格值为字面量5. 如果单元格所在的列是外键,那么其值为IRI,或者说实体/资源。</p></li><li><p>R2RML<br>generate-mapping -u root -o kg_demo_movie_mapping.ttl jdbc:mysql:///kg_demo_movie<br>.\d2r-server lsy.ttl<br>生成一个mapping的ttl文件,</p></li></ul><p>把每个表映射成为一个类,每一行是一个资源,每一列就是资源的属性。</p><p><a href="http://www.pizza.com/ontologies/pizza.owl">http://www.pizza.com/ontologies/pizza.owl</a><br>Functional Properties:一一映射,一个输入对应的输出是相同的:<br>比如A的生母是B,也是C,生母关系具有函数性,那么B和C是同一个人。<br>反函数性可以一对多。</p><p>接下来,把默认的映射词汇改为我们本体中的词汇即可。在处理外键的时候要注意当前编辑的属性的domain和range,belongsToClassMap是domain,refersToClassMap是range。<br>1、三个类中,genre__label和genre_genre_id都去掉了<br>2、vocab:xxxx 换成了本体构建时候的术语<br>第一点:我们不需要这两个属性,对我们的系统或者后续应用没有什么帮助。第二点:vocab:xxxx是默认mapping文件定义的转换规则,就是把数据库的字段名和表名直接当成本体。因此要换成我们自己定义的本体。<br>d2rq:property vocab:person_to_movie; ——> d2rq:property :hasActedIn;<br>d2rq:property vocab:person_person_birth_place; ——-> d2rq:property :personBirthPlace;</p><p>.\dump-rdf.bat -o kg_demo_movie.nt .\kg_demo_movie_mapping.ttl<br>将数据转为RDF。</p><p>这样就利用D2RQ完成了从MySQL数据表到RDF格式数据的转换。</p><h1 id="RDF查询语言SPARQL"><a href="#RDF查询语言SPARQL" class="headerlink" title="RDF查询语言SPARQL"></a>RDF查询语言SPARQL</h1><p>查询实例:</p><blockquote><p>周星驰出演了哪些电影:<br>PREFIX : <a href="http://www.kgdemo.com#">http://www.kgdemo.com#</a><br>PREFIX rdf: <a href="http://www.w3.org/1999/02/22-rdf-syntax-ns#">http://www.w3.org/1999/02/22-rdf-syntax-ns#</a><br>PREFIX owl: <a href="http://www.w3.org/2002/07/owl#">http://www.w3.org/2002/07/owl#</a><br>PREFIX xsd: <XML schema><br>PREFIX vocab: <a href="http://localhost:2020/resource/vocab/">http://localhost:2020/resource/vocab/</a><br>PREFIX rdfs: <a href="http://www.w3.org/2000/01/rdf-schema#">http://www.w3.org/2000/01/rdf-schema#</a><br>PREFIX map: <a href="http://localhost:2020/resource/#">http://localhost:2020/resource/#</a><br>PREFIX db: <a href="http://localhost:2020/resource/">http://localhost:2020/resource/</a></XML></p></blockquote><p>SELECT ?n WHERE {<br> ?s rdf:type :Person.<br> ?s :personName ‘周星驰’.<br> ?s :hasActedIn ?o.<br> ?o :movieTitle ?n<br>}</p><blockquote><p>英雄这部电影有哪些演员参演?:<br>SELECT ?n WHERE {<br> ?s rdf:type :Movie.<br> ?s :movieTitle ‘英雄’.<br> ?a :hasActedIn ?s.<br> ?a :personName ?n<br>}</p></blockquote><h1 id="D2RQ来实现查询SPRAQL"><a href="#D2RQ来实现查询SPRAQL" class="headerlink" title="D2RQ来实现查询SPRAQL"></a>D2RQ来实现查询SPRAQL</h1><p>D2RQ以虚拟的RDF的方式来访问关系数据库中的数据,即我们不需要显式地把数据转为RDF形式。通过默认,或者自己定义的mapping文件,我们可以用查询RDF数据的方式来查询关系数据库中的数据。换个说法,D2RQ把SPARQL查询,按照mapping文件,翻译成SQL语句完成最终的查询,然后把结果返回给用户。</p><p>进入d2rq目录,使用下面的命令启动D2R Server:</p><blockquote><p>d2r-server.bat kg_demo_movie_mapping.ttl<br>默认端口是2020,在浏览器输入“<a href="http://localhost:2020/”,可以看到如下界面:">http://localhost:2020/”,可以看到如下界面:</a><br><img src="/images/图谱实践/2020.png" alt><br>点击红色方框2中的链接,进入endpoint.<br><img src="/images/图谱实践/查询示例.png" alt></p></blockquote><p>除了利用浏览器,也可以使用python进行交互。见代码中的MyTest文件。</p><h1 id="Apache-jena-SPARQL-endpoint及推理"><a href="#Apache-jena-SPARQL-endpoint及推理" class="headerlink" title="Apache jena SPARQL endpoint及推理"></a>Apache jena SPARQL endpoint及推理</h1><p>本次实践我们会用到的组件有:TDB、rule reasoner和Fuseki。</p><ol><li>TDB是Jena用于存储RDF的组件,是属于存储层面的技术。在单机情况下,它能够提供非常高的RDF存储性能。目前TDB的最新版本是TDB2,且与TDB1不兼容。</li><li>Jena提供了RDFS、OWL和通用规则推理机。其实Jena的RDFS和OWL推理机也是通过Jena自身的通用规则推理机实现的</li><li>Fuseki是Jena提供的SPARQL服务器,也就是SPARQL endpoint。其提供了四种运行模式:单机运行、作为系统的一个服务运行、作为web应用运行或者作为一个嵌入式服务器运行。</li></ol><p>创建一个目录(我这里命名为“tdb”)用于存放tdb数据。进入“apache-jena-X.X.X”文件夹的bat目录,可以看到很多批处理文件,我们使用“tdbloader.bat”将之前我们的RDF数据以TDB的方式存储。命令如下:</p><blockquote><p>.\tdbloader.bat —loc=”D:\apache jena\tdb” “D:\d2rq\kg_demo_movie.nt”</p></blockquote><p>“—loc”指定tdb存储的位置,即刚才我们创建的文件夹;第二个参数是由Mysql数据转换得到的RDF数据。</p><p>进入入“apache-jena-fuseki-X.X.X”文件夹,运行“fuseki-server.bat”,然后退出。程序会为我们在当前目录自动创建“run”文件夹。将我们的本体文件“ontology.owl”移动到“run”文件夹下的“databases”文件夹中,并将“owl”后缀名改为“ttl”。在“run”文件夹下的“configuration”中,我们创建名为“fuseki_conf.ttl”的文本文件(取名没有要求),加入如下内容:</p><p><strong>报错的话,进入到D:\MMKG\env\apache-jena-3.5.0\tdb目录下,将前缀为prefix的文件全部删除,再次运行即可。</strong><br>再次运行“fuseki-server.bat”,如果出现如下界面表示运行成功:</p><p>进入localhost:3030<br>PREFIX : <a href="http://www.kgdemo.com#">http://www.kgdemo.com#</a><br>PREFIX rdf: <a href="http://www.w3.org/1999/02/22-rdf-syntax-ns#">http://www.w3.org/1999/02/22-rdf-syntax-ns#</a><br>PREFIX rdfs: <a href="http://www.w3.org/2000/01/rdf-schema#">http://www.w3.org/2000/01/rdf-schema#</a></p><p>SELECT * WHERE {<br>?x :movieTitle ‘功夫’.<br>?x ?p ?o.<br>}</p><p>进行如下查询,可以得到hasActor属性,电影的“hasActor”属性是通过OWL推理机得到的,即我们原本的RDF数据里面是没有的。</p><p>在“databases”文件夹下新建一个文本文件“rules.ttl”,填入如下内容:<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></pre></td><td class="code"><pre><span class="line">@prefix : <http://www.kgdemo.com#> .</span><br><span class="line">@prefix owl: <http://www.w3.org/2002/07/owl#> .</span><br><span class="line">@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .</span><br><span class="line">@prefix xsd: <XML Schema> .</span><br><span class="line">@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .</span><br><span class="line"></span><br><span class="line">[ruleComedian: (?p :hasActedIn ?m) (?m :hasGenre ?g) (?g :genreName '喜剧') -> (?p rdf:type :Comedian)]</span><br><span class="line">[ruleInverse: (?p :hasActedIn ?m) -> (?m :hasActor ?p)]</span><br></pre></td></tr></table></figure><br>我们定义了一个名为“ruleComedian”的规则,它的意思是:如果有一个演员,出演了一部喜剧电影,那么他就是一位喜剧演员。修改配置文件“fuseki_conf.ttl”:</p><h1 id="demo实例"><a href="#demo实例" class="headerlink" title="demo实例"></a>demo实例</h1><h2 id="基本流程"><a href="#基本流程" class="headerlink" title="基本流程"></a>基本流程</h2><p>此demo是利用正则表达式来做语义解析。我们需要第三方库来完成初步的自然语言处理(分词、实体识别),然后利用支持词级别正则匹配的库来完成后续的语义匹配。</p><p>分词和实体识别(人名和电影名)我们用jieba来完成。jieba是一个轻量级的中文分词工具,有多种语言的实现版本。对于分词,在实验环境中,jieba还是勉强能用。在我们这个demo当中,有些经常会被使用的词语并不能被正确切分。比如:“喜剧电影”、“恐怖电影”、“科幻电影”、“喜剧演员”、“出生日期”等,在分词的时候,jieba把它们当作一个词来处理,我们需要手动调整词语的频率使得“喜剧电影”能被切分为“喜剧”和“电影”。至于实体识别,jieba对于人名的识别精度尚可接受,但是电影名称的识别精度太低以至于完全不可用。因此,我们直接把数据库中的人名和电影名导出,作为外部词典;使用jieba的时候加载外部词典,这样就能解决实体识别的问题。</p><p>将自然语言转为以词为基础的基本单位后,我们使用REfO(Regular Expressions for Objects)来完成语义匹配。具体实现请参考OpenKG的demo或者本demo的代码。</p><p>匹配成功后,得到其对应的我们预先编写的SPARQL模板,再向Fuseki服务器发送查询,最后将结果打印出来。</p><ul><li>“crawler”文件夹包含的是我们从”The Movie DB”获取数据的脚本。</li><li>“KB_query”文件夹包含的是完成整个问答demo流程所需要的脚本。</li><li>“external_dict”包含的是人名和电影名两个外部词典。csv文件是从mysql-workbench导出的,按照jieba外部词典的格式,我们将csv转为对应的txt。</li><li>“word_tagging”,定义Word类的结构(即我们在REfO中使用的对象);定义”Tagger”类来初始化词典,并实现自然语言到Word对象的方法。</li><li>“jena_sparql_endpoint”,用于完成与Fuseki的交互。</li><li>“question2sparql”,将自然语言转为对应的SPARQL查询。</li><li>“question_temp”,定义SPARQL模板和匹配规则。</li></ul><p>“query_main”,main函数。在运行”query_main”之前,读者需要启动Fuseki服务,具体方法请参考上一篇文章。</p><p>streamlit run streamlit_app.py —server.enableCORS=true<br>终端输入可在浏览器中使用。</p>]]></content>
<summary type="html">
<h1 id="RDF、RDFS、OWL"><a href="#RDF、RDFS、OWL" class="headerlink" title="RDF、RDFS、OWL"></a>RDF、RDFS、OWL</h1><h3 id="RDF"><a href="#RDF" class
</summary>
</entry>
<entry>
<title>面试题</title>
<link href="https://asswei7.github.io/2021/09/16/%E9%9D%A2%E8%AF%95%E9%A2%98/%E9%9D%A2%E8%AF%95%E9%A2%98/"/>
<id>https://asswei7.github.io/2021/09/16/%E9%9D%A2%E8%AF%95%E9%A2%98/%E9%9D%A2%E8%AF%95%E9%A2%98/</id>
<published>2021-09-16T01:53:16.000Z</published>
<updated>2021-09-29T07:45:42.019Z</updated>
<content type="html"><![CDATA[<h2 id="重载和重写"><a href="#重载和重写" class="headerlink" title="重载和重写"></a>重载和重写</h2><h2 id="分布式事务"><a href="#分布式事务" class="headerlink" title="分布式事务"></a>分布式事务</h2><h3 id="什么是分布式事务"><a href="#什么是分布式事务" class="headerlink" title="什么是分布式事务"></a>什么是分布式事务</h3><p>指事务的参与者、支持事务的服务器、资源服务器、事务管理器分别位于不同的分布式系统的不同节点之上。简单说,就是分布式系统中的事务,它的存在是为了保证不同的数据库节点的数据一致性。</p><h3 id="CAP理论"><a href="#CAP理论" class="headerlink" title="CAP理论"></a>CAP理论</h3><ul><li>Consistency:数据在多个副本之间保持一致性。例如一个数据在某个分区节点更新后,在其他分区节点读出来的数据也是更新之后的数据。</li><li>Availability:系统提供的服务必须一直处于可用的状态。对于用户的操作请求总是能在有限的时间内返回结果。</li><li>Partition tolerance分布式系统在遇到任何网络分区故障时,仍然能保证对外提供满足一致性和可用性的服务。</li></ul><h3 id="BASE理论"><a href="#BASE理论" class="headerlink" title="BASE理论"></a>BASE理论</h3><p>是对于AP的一个扩展,牺牲一致性换取系统的<strong>可用性</strong>和<strong>分区容错性</strong>。BASE是Basically Available、soft state、eventually consistent三个短语的缩写。</p><ul><li>基本可用指,通过支持局部故障而不是系统全局故障来实现</li><li>soft state表示状态可以有一段时间不同步</li><li>最终一致,不要求实时保持强一致</li></ul><h2 id="redis"><a href="#redis" class="headerlink" title="redis"></a>redis</h2><p>redis登录<br>auth “password”<br>密码可以在安装目录下的redis.windows.conf里搜索foo得到</p><h3 id="redis类型"><a href="#redis类型" class="headerlink" title="redis类型"></a>redis类型</h3><p>string类型的常用命令,<br>set,get,strlen,exists,dect,incr,setex<br>应用场景:用在需要计数的场景,比如用户的访问次数,热点文章的点赞转发数</p><p>list常⽤命令: rpush,lpop,lpush,rpop,lrangellen 等。<br>应⽤场景: 发布与订阅或者说消息队列、慢查询。</p><h3 id="redis为什么采用单线程"><a href="#redis为什么采用单线程" class="headerlink" title="redis为什么采用单线程"></a>redis为什么采用单线程</h3><p>一开始使用单线程,在4.0版本后抛弃了单线程,其中的原因是什么。<br>因为它是一个内存服务器,处理很多来自外部的网络请求,使用I/O多路复用机制同时监听多个文件描述符的可读和可写状态。一旦收到网络请求就会在内存当中快速处理,由于操作是纯内存的,所以处理速度很快。</p><ul><li>为什么redis服务使用单线程模型处理绝大多数的网络请求</li><li>为什么redis服务增加多个非阻塞的删除操作,例如UNLINK,FLUSHALL ASYNC,FLUSHDB ASYNC。</li></ul><p>使用单线程的好处:</p><ol><li>更好的可维护性,方便开发和调试(多线程需要加锁、同步等很麻烦)</li><li>即使单线程,也能并发地处理客户端的请求(使用I/O多路复用,并发处理来自客户端的多个连接)</li><li>redis服务绝大多数操作的瓶颈不是CPU(多线程的优点是充分利用CPU的计算资源来并发地执行不同的任务,但是redis不是CPU密集型的服务,服务的瓶颈在于网络传输的延时和等待客户端的数据传输,即网络I/O)</li></ol><p>为什么又引用多线程:<br>对于 Redis 中的一些超大键值对,几十 MB 或者几百 MB 的数据并不能在几毫秒的时间内处理完,Redis 可能会需要在释放内存空间上消耗较多的时间,这些操作就会阻塞待处理的任务。然而释放内存空间的工作其实可以由后台线程异步进行处理,这也就是 UNLINK 命令的实现原理,它只会将键从元数据中删除,真正的删除操作会在后台异步执行。</p><h3 id="redis给缓存数据设置过期时间"><a href="#redis给缓存数据设置过期时间" class="headerlink" title="redis给缓存数据设置过期时间"></a>redis给缓存数据设置过期时间</h3><p>因为内存是有限的,如果缓存中的所有数据一直存在,分分钟out of memory。redis自带了给缓存数据设置过期时间的功能。<br>exp key 60 #60s后过期<br>setex key 60 value #设置数据60s之后过期<br>ttl key #查看数据还有多久过期</p><p>除了字符串有独有的设置过期的命令:setex,其余要依靠expire命令来设置过期时间,persist可以移除一个键的过期时间。</p><p>而且很多时候业务场景要求某个数据只在某一个时间段内存在,比如短信验证码只在1分钟内生效,用户登录的token只在1天内有效。</p><h3 id="过期的数据如何删除"><a href="#过期的数据如何删除" class="headerlink" title="过期的数据如何删除"></a>过期的数据如何删除</h3><ol><li>惰性删除:只有在取出key的时候才检查,对CPU友好,但是会造成太多过期key没有被删除</li><li>定期删除:每隔一段时间,抽取一批key执行删除过期key操作。并且,redis底层会通过限定删除操作执行的时长和频率来减少删除操作对CPU的影响。</li></ol><p>定期删除对内存更加友好,惰性删除对CPU友好,redis采用的是定期+惰性。<br>即使如此,还是会有大量key过期堆积在内存,导致out of memory。还要内存淘汰机制。<br>将最近不常使用的key删除</p><h3 id="redis持久化(怎么保证redis挂掉之后再重启,数据能够恢复)"><a href="#redis持久化(怎么保证redis挂掉之后再重启,数据能够恢复)" class="headerlink" title="redis持久化(怎么保证redis挂掉之后再重启,数据能够恢复)"></a>redis持久化(怎么保证redis挂掉之后再重启,数据能够恢复)</h3><p>一种方式是快照,(snapshotting ,RDB),另一种方式的只追加文件,(append-only file AOF)</p><p>创建快照获得存储在内容中数据在某个时间点的副本,对快照备份可以复制到其他服务器,也可以保存本地,下次重启时使用。</p><p>save 900 1 #在900秒(15分钟)之后,如果⾄少有1个key发⽣变化,Redis就会⾃动触发<br>BGSAVE命令创建快照。</p><p>与快照持久化相⽐,AOF 持久化 的实时性更好,因此已成为主流的持久化⽅案。默认情况下<br>Redis 没有开启 AOF(append only file)⽅式的持久化,可以通过 appendonly 参数开启</p><p>开启 AOF 持久化后每执⾏⼀条会更改 Redis 中的数据的命令,Redis 就会将该命令写⼊硬盘中<br>的 AOF ⽂件。AOF ⽂件的保存位置和 RDB ⽂件的位置相同,都是通过 dir 参数设置的,默认的<br>⽂件名是 appendonly.aof。</p><h2 id="多线程"><a href="#多线程" class="headerlink" title="多线程"></a>多线程</h2><p>同类的多个线程共享进程的<strong>堆和方法区资源</strong>,但每个线程有自己的<strong>程序计数器、虚拟机栈和本地方法栈</strong>。<br>Java程序天生是多线程的,一个Java程序的运行是main线程和多个其他线程同时运行。</p><p>[5] Attach Listener //添加事件<br>[4] Signal Dispatcher // 分发处理给 JVM 信号的线程<br>[3] Finalizer //调⽤对象 finalize ⽅法的线程<br>[2] Reference Handler //清除 reference 线程<br>[1] main //main 线程,程序⼊⼝<br><img src="/images/面试题/运行时数据区" alt></p><p>程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。字节码解释器工作时通过改变计数器的值来选取下一条要执行的字节码指令。生命周期随着线程的创建而创建,结束而结束。</p><p>虚拟机栈:主要是局部变量表,</p><h3 id="线程安全"><a href="#线程安全" class="headerlink" title="线程安全"></a>线程安全</h3><p>和线程同步是一个东西,当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的线程不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问。<br>代码所在的进程中有多个线程同时运行,如果每次运行的结果和单线程运行的结果是一致的,就是线程安全。多个线程之间的切换不会导致程序运行结果的二义性,即不需要考虑同步的问题。<br>同步:线程A更改了变量,更改后的结果要同步给线程B才行。</p>]]></content>
<summary type="html">
<h2 id="重载和重写"><a href="#重载和重写" class="headerlink" title="重载和重写"></a>重载和重写</h2><h2 id="分布式事务"><a href="#分布式事务" class="headerlink" title="分布式
</summary>
</entry>
<entry>
<title>idea快捷键</title>
<link href="https://asswei7.github.io/2021/09/16/idea%E5%BF%AB%E6%8D%B7%E9%94%AE/idea%E5%BF%AB%E6%8D%B7%E9%94%AE/"/>
<id>https://asswei7.github.io/2021/09/16/idea%E5%BF%AB%E6%8D%B7%E9%94%AE/idea%E5%BF%AB%E6%8D%B7%E9%94%AE/</id>
<published>2021-09-16T01:34:02.000Z</published>
<updated>2021-09-29T02:40:53.680Z</updated>
<content type="html"><![CDATA[<h2 id="idea快捷键"><a href="#idea快捷键" class="headerlink" title="idea快捷键"></a>idea快捷键</h2><ol><li><p>var声明<br>20.var/ “jack”.var/ new Person().var</p></li><li><p>.nn .null<br>判空,自动添加一个if判断</p></li><li><p>for遍历<br>list.for list.fori</p></li><li>.if .return .cast</li></ol><p>Ctrl+Y:删除光标所在行或选中内容<br>Ctrl+D:复制光标所在行或选中内容,插入到光标下面<br>Ctrl+N:查找类或者文件</p><h2 id="github搜索技巧"><a href="#github搜索技巧" class="headerlink" title="github搜索技巧"></a>github搜索技巧</h2><p><img src="/images/search.jpg" alt></p><p>在pycharm的Project下的Python Interpreter下更改环境</p><p>github中下载单个文件,点击进去,点击raw,然后ctrl+s即可。</p><p>chorm安装插件GitZip for github可以下载单个文件夹或文件。</p><h2 id="jupyter快捷键"><a href="#jupyter快捷键" class="headerlink" title="jupyter快捷键"></a>jupyter快捷键</h2>]]></content>
<summary type="html">
<h2 id="idea快捷键"><a href="#idea快捷键" class="headerlink" title="idea快捷键"></a>idea快捷键</h2><ol>
<li><p>var声明<br>20.var/ “jack”.var/ new Pe
</summary>
</entry>
<entry>
<title>vue学习</title>
<link href="https://asswei7.github.io/2021/09/16/vue%E5%AD%A6%E4%B9%A0/vue%E5%AD%A6%E4%B9%A0/"/>
<id>https://asswei7.github.io/2021/09/16/vue%E5%AD%A6%E4%B9%A0/vue%E5%AD%A6%E4%B9%A0/</id>
<published>2021-09-16T01:32:05.000Z</published>
<updated>2021-09-22T01:46:55.991Z</updated>
<content type="html"><![CDATA[<h3 id="关于VO-view-object-和DTO-data-transfer-object"><a href="#关于VO-view-object-和DTO-data-transfer-object" class="headerlink" title="关于VO(view object)和DTO(data transfer object)"></a>关于VO(view object)和DTO(data transfer object)</h3><p>entity里的每一个字段和数据库相对应。<br>vo里每个字段和HTML页面对应<br>dto是用来转换从entity到vo,或者vo到entity中间的东西。</p><p>举个例子:</p><p>你的html页面上有三个字段,name,pass,age</p><p>你的数据库表里,有两个字段,name,pass , 注意没有 age。</p><p>而你的 vo 里,就应该有下面三个成员变量 ,因为对应 html 页面上三个字段 。<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></pre></td><td class="code"><pre><span class="line">private string name;</span><br><span class="line">private string pass; </span><br><span class="line">private string age;</span><br></pre></td></tr></table></figure><br> 这个时候,你的 entity 里,就应该有两个成员变量 ,因为对应数据库表中的 2 个字段 。<br> <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">private string name;</span><br><span class="line">private string pass; </span><br></pre></td></tr></table></figure><br>到了这里,好了,业务经理让你做这样一个业务“年龄大于 20 的才能存入数据库,这个时候,你就要用到 dto 了,</p><p>1)你要先从页面上拿到 vo,然后判断 vo 中的 age 是不是大于 20。</p><p>2)如果大于 20,就把 vo 中的 name 和 pass 拿出来,放到 dto 中。</p><p>3)然后在把 dto 中的 name 和 pass 原封不动的给 entity,然后根据 entity 的值,在传入数据库。</p><p>这就是他们三个的区别。</p>]]></content>
<summary type="html">
<h3 id="关于VO-view-object-和DTO-data-transfer-object"><a href="#关于VO-view-object-和DTO-data-transfer-object" class="headerlink" title="关于VO(vie
</summary>
</entry>
<entry>
<title></title>
<link href="https://asswei7.github.io/2021/09/16/%E4%BB%A3%E7%A0%81%E9%87%8D%E6%9E%84/%E9%87%8D%E6%9E%84%E6%8A%80%E5%B7%A7/"/>
<id>https://asswei7.github.io/2021/09/16/%E4%BB%A3%E7%A0%81%E9%87%8D%E6%9E%84/%E9%87%8D%E6%9E%84%E6%8A%80%E5%B7%A7/</id>
<published>2021-09-16T01:11:27.398Z</published>
<updated>2021-09-16T01:11:27.398Z</updated>
<summary type="html">
</summary>
</entry>
<entry>
<title></title>
<link href="https://asswei7.github.io/2021/07/16/%E4%B8%80%E6%9D%A1%E6%9C%A8%E5%92%B8%E9%B1%BC/%E7%BA%AA%E6%99%93%E5%B2%9A/"/>
<id>https://asswei7.github.io/2021/07/16/%E4%B8%80%E6%9D%A1%E6%9C%A8%E5%92%B8%E9%B1%BC/%E7%BA%AA%E6%99%93%E5%B2%9A/</id>
<published>2021-07-16T07:45:40.456Z</published>
<updated>2021-07-21T07:07:55.320Z</updated>
<content type="html"><![CDATA[<p>“F:\Nodejs\node_global\node_modules\hexo\README.md”</p>]]></content>
<summary type="html">
<p>“F:\Nodejs\node_global\node_modules\hexo\README.md”</p>
</summary>
</entry>
<entry>
<title>拿破仑</title>
<link href="https://asswei7.github.io/2021/02/27/%E6%8B%BF%E7%A0%B4%E4%BB%91/%E6%8B%BF%E7%A0%B4%E4%BB%91/"/>
<id>https://asswei7.github.io/2021/02/27/%E6%8B%BF%E7%A0%B4%E4%BB%91/%E6%8B%BF%E7%A0%B4%E4%BB%91/</id>
<published>2021-02-27T07:25:35.000Z</published>
<updated>2021-09-21T09:20:15.308Z</updated>
<content type="html"><![CDATA[<ol><li>出生<br><img src="/images/拿破仑/科西嘉岛.png" alt><br>科西嘉岛是地中海的要地,位于意大利西部。1769年出生,拿破仑意大利语为“荒野雄狮”。其父亲本来是意大利贵族,被法国占领后,效忠法国。路易十五也承认他们为法国贵族。其父亲在他不到十岁时,送到法国欧坦的奥顿教会学校学法语。拿破仑仅学习半年,在父亲安排下进入布里埃纳军校学习,由于个子矮小、身份原因、法语不够好,经常受欺负。拿科西嘉的战败嘲笑他。他认为是法国侵占了他的故乡。</li></ol><p>1784年拿破仑毕业,进入巴黎军官学校学习炮兵。这几年,他开始阅读法国名家的著作,开始热爱了法兰西。1785年父亲去世,家庭失去了收入来源。拿破仑不得不提前毕业,进入部队。1789年法国大革命,拿破仑返回家乡,保利返回科西嘉岛,想让科西嘉独立。拿破仑不同意,认为应该归顺法国。与保利闹掰,回到法国。1792年成立法兰西第一共和国,第二年将路易十六杀头。此举引发欧洲各国的恐慌,为了维护封建专制的地位和遏制法国扩张,组成反法同盟。<br><img src="/images/拿破仑/军队等级.png" alt><br>1793年,国内为了反抗雅各宾派专政,马赛、土伦等几座南方沿海城市集体叛乱,邀请英国和西班牙军队入侵。拿破仑取得土伦的军队指挥权,最终获胜。被罗伯斯比尔提升为炮兵准将。<br>1794年,雅各宾派被推翻,罗伯斯比尔被杀头,拿破仑被逮捕调查。由于证据不足,拿破仑出狱。<br>1795年,拿破仑被任命,镇压旺代的起义,但是被编入步兵,而且拿破仑不愿打自己人,拒绝出任。由于热月党统治残暴,巴黎地区落入起义军手中。拿破仑被任命镇压起义军,拿破仑成为国内防军总司令。</p><p>约瑟芬受到拿破仑的追求,两人订婚。</p><p>少时性格孤僻,一个人在家中看书。如果有人欺负他,一定会大打出手。父亲有贵族身份,进入好的学校学习。1789年法国大革命,将皇帝路易十六杀头,欧洲几个国家的皇帝联合反法,拿破仑从军,由于法国军队节节败退,法国出现内乱,土伦是法国南部的重要港口,一旦失守,英国可以从此登陆法国,拿破仑当上了炮兵的指挥官,收复了土伦港口。</p><p>拿破仑打败了意大利、奥地利,击败了第一次反法同盟,保卫了法国的革命果实。</p><ol><li>称帝<br>由于法国是共和国,到处帮助别的国家革命,宣传自己的先进制度。拿破仑组建一个强大的舰队,英国试图阻止,但被狂风卷走搁浅。拿破仑去远征埃及,纳尔逊封锁港口,拿破仑写给老婆的信被英军截获,得知其老婆出轨。1799年拿破仑放弃埃及军队,一个人偷偷返回巴黎,发动雾月政变,法国从共和国变成了帝国,本来该由教皇戴皇冠,但是拿破仑厌恶教皇。<br>1805年,拿破仑把自己加冕为意大利国王,侵犯了奥地利的利益,奥地利联合俄国反法,奥斯特里茨之战,拿破仑派人求和,让沙皇膨胀最终获胜。</li></ol><ol><li>远征俄罗斯<br>1807年,西班牙内乱,影响法国的利益,拿破仑拥立自己哥哥当西班牙国王,西班牙反对,英国联合西班牙反法,奥地利从东线攻打法国,拿破仑从西边撤退打败奥地利,签订《维也纳合约》,法国第一帝国达到了鼎盛。</li></ol><p>1812年拿破仑远征俄罗斯,到处都是荒芜,得不到补给,9月拿破仑到达莫斯科郊外,<br>遭遇顽强抵抗,攻入莫斯科,城市已经被火烧。</p><p>俄国在拿破仑返回途中埋伏,并且被寒冬击败。此时,奥地利和普鲁士对拿破仑出兵,击败三国联军,英国人在西线攻打法国。<br>1814年各国联军进入巴黎,拿破仑被迫退位,流放厄尔巴岛,拿破仑之后逃跑,登录法国,法国皇帝派军攻打拿破仑,却倒戈,拿破仑再次称帝。</p><p>再次反法同盟会战,滑铁卢会战。拿破仑流放到圣赫那拉岛,</p>]]></content>
<summary type="html">
<ol>
<li>出生<br><img src="/images/拿破仑/科西嘉岛.png" alt><br>科西嘉岛是地中海的要地,位于意大利西部。1769年出生,拿破仑意大利语为“荒野雄狮”。其父亲本来是意大利贵族,被法国占领后,效忠法国。路易十五也承认他们为法国贵族。其父亲
</summary>
<category term="历史" scheme="https://asswei7.github.io/tags/%E5%8E%86%E5%8F%B2/"/>
</entry>
</feed>