This repository has been archived by the owner on Dec 10, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
atom.xml
440 lines (234 loc) · 261 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
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>ZHYCarge的博客</title>
<subtitle>旧平台,已不再维护,请点击下方链接转至新平台访问</subtitle>
<link href="https://zhycarge.github.io/OLD_BLOG/atom.xml" rel="self"/>
<link href="https://zhycarge.github.io/OLD_BLOG/"/>
<updated>2024-12-09T14:17:49.000Z</updated>
<id>https://zhycarge.github.io/OLD_BLOG/</id>
<author>
<name>ZHYCarge</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>尾声&新生</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2024/12/08/%E5%B0%BE%E5%A3%B0&%E6%96%B0%E7%94%9F/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2024/12/08/%E5%B0%BE%E5%A3%B0&%E6%96%B0%E7%94%9F/</id>
<published>2024-12-08T10:55:51.000Z</published>
<updated>2024-12-09T14:17:49.000Z</updated>
<content type="html"><![CDATA[<h1 id="从“新”出发"><a href="#从“新”出发" class="headerlink" title="从“新”出发"></a>从“新”出发</h1><span id="more"></span><p>距今本博客平台已经存在了3年了。从对技术懵懵懂懂,一无所知,到现在勉勉强强,从完全稚嫩的文笔,到现在稍显稚嫩的文笔,这个平台陪我成长了许多。。。</p><p>但是,天下没有不散的宴席。由于当时自身技术知识的薄弱(回首看平台的部署历程苦不堪言。。博客采用的插件也从未更新过。。),加上对博文分类(哪里来的奇奇怪怪分类)、内容撰写的十分混乱(甚至博客平台内的图片图床都包含了三四个平台),导致对这个博客网站内容仿佛屎山,重构起来十分困难(还有<code>Next</code>主题发生过<a href="https://github.com/next-theme/hexo-theme-next/issues/4#issuecomment-626205848">仓库更换事件</a>)。</p><p>因此,打算对此博客平台进行一次系统化的重构,并将使用<code>GitHub</code>的仓库存档功能对这个博客平台进行封存,留作纪念。</p><p>准备进行的工作如下:</p><ul><li><p>仓库封存。将该博客平台重命名并列入<code>GitHub</code>的存档仓库进行封存</p></li><li><p>重新开始。删除所有博文,重构规范(包括但不限于完善分组分类,确定统一书写格式)。</p></li><li><p>更换留言平台。更换<code>Valine</code>评论平台变成<code>Waline</code>。<strong>据本博文发出后,<code>Valine</code>评论平台随时可能会被移除</strong></p></li><li><p>整合插件。更新相关插件、主题等,并做好定时更新,做好现有插件的记录(U1S1我都不知道这个平台已经存在过什么插件了。。。)</p></li><li><p>新增友人帐功能。</p></li><li><p>抢救“垃圾”。(从“垃圾堆”里翻找一下还能用的部分,对老旧博文进行更新后重新发布)</p></li></ul><p>至此,博客平台改造可能会持续一个礼拜到两个礼拜,该博客平台内的所有照片信息不再保证链接有效性。</p><p>更新后,为保证后续还要从里面翻找“垃圾”,会将该博客平台用到的大部分照片一同保存到存档仓库中,方便后续查看。</p><p>如果对该博客平台中相关博文仍存在疑问,请通过邮件与我联系:<a href="mailto:[email protected]">[email protected]</a></p><p>向前走,初心不泯。</p><center>二〇二四年十二月</center>]]></content>
<summary type="html"><h1 id="从“新”出发"><a href="#从“新”出发" class="headerlink" title="从“新”出发"></a>从“新”出发</h1></summary>
<category term="Announce" scheme="https://zhycarge.github.io/OLD_BLOG/tags/Announce/"/>
</entry>
<entry>
<title>毕设问题汇总</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2023/03/14/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2023/03/14/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1%E9%97%AE%E9%A2%98%E6%B1%87%E6%80%BB/</id>
<published>2023-03-14T09:46:29.000Z</published>
<updated>2023-03-14T09:47:48.000Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="好像密码不正确呢?再试试吧" data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="15a5f05c7fa09b59a76dee481914e95ad5b91f523eea6e6a327e170e6b775bf0">9863e730576695b52e0649b599751ab4544977e71ef33a71ead5b64f72966bec79f3d96bc0c710efd0b98b7606e9dae297fb584a90886a94eadccfda05934a64302c5e76ce3af2775f5b130d1b42f3661e84d0ab3c1157cc022eeffc11b39bab37d8df14d8253dc860fbff7bbe1742bbbaa42a835df7b85ae8bcc0cea98c52b0040593f12643cb1bef34d696764e75db87b3b1111a0f65255050ac82c0cea8a1b49fb1a0374b706599729932e2312c17d563419d1d206bd8830b73c4fe2c26ff5845b1e6ae675b5b6be64befb91880b66eb0a75dbb4af029a25380346b1985b4c6c257b1b3e1c8c78dc9fecf50501f7bcb7d5192bc6ccc25c1d6dae83729e9222a9290a042cf1125e6e86fb918428ba5cd43a40c54ba213c1d9357c1941699dadae0913dfc167e0246569e8aceab9629873c61287b6f2588e7f68e6c5cde1ec2db656963b6371200bd1d7794c98b5c667ca2bc1da1d02313f89d3da506bfffe397d62af532fd33090caec0c65a38a499bd7433a1aae28a3c7e186d97b665d18350e8f6ab01123ecffb5c1e328a8cfdc8ce536dd090387d3ba7e55977916c72b13550cc0319949a80094016508651e5da9a01e5e7eec1d50e24a3fe3a8744493cea3dff4c227a46af54cb618bd5a0ea060cf5816fac40d0fe107fe382e55865b3ba2f7f5a21b6b599c44911a15848bf85</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-wave"> <input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-wave">输入正确密码查看正确文章</span> </label> <svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none"> <path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path> </svg> </div> </div></div><script data-pjax src="/OLD_BLOG/lib/hbe.js"></script><link href="/OLD_BLOG/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">此处存放毕设的相关问题汇总信息</summary>
<category term="毕设" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E6%AF%95%E8%AE%BE/"/>
</entry>
<entry>
<title>国考之常识推理</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2023/01/03/%E5%9B%BD%E8%80%83%E4%B9%8B%E5%B8%B8%E8%AF%86%E6%8E%A8%E7%90%86/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2023/01/03/%E5%9B%BD%E8%80%83%E4%B9%8B%E5%B8%B8%E8%AF%86%E6%8E%A8%E7%90%86/</id>
<published>2023-01-03T09:24:32.000Z</published>
<updated>2023-01-04T03:31:50.000Z</updated>
<content type="html"><![CDATA[<h1 id="国考之常识推理"><a href="#国考之常识推理" class="headerlink" title="国考之常识推理"></a>国考之常识推理</h1><h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>记录整理网络中如何快速判断常识答案的蒙题技巧</p><span id="more"></span><h1 id="第一种方法"><a href="#第一种方法" class="headerlink" title="第一种方法"></a>第一种方法</h1><h2 id="题干分析法"><a href="#题干分析法" class="headerlink" title="题干分析法"></a>题干分析法</h2><p>主体一致。抓住定语、约束范围的词语</p><p>例1:</p><p>日前,习近平主席在亚太经合组织工商领导人峰会上表示,新常态将给中国带来新的发展机遇。下列关于我国经济发展“新常态”的主要特点描述正确的一项是(C)。</p><p>A.从高速增长转为低速增长</p><p>B.从投资驱动转向要素驱动</p><p>C.经济结构不断优化升级</p><p>D.面临的挑战趋于常态化</p><p>由于表示是<code>新常态</code>,A:低速增长不为<code>新</code>,排除;B:无法体现<code>新的感觉</code>;C:优化升级可以体现<code>新的、好处的发展趋势</code>;D:挑战常态化,表示不出来<code>新的东西</code>。因此选<code>C</code></p><h2 id="绝对表述排除法"><a href="#绝对表述排除法" class="headerlink" title="绝对表述排除法"></a>绝对表述排除法</h2><p>绝对化表述内容不选。例如:一定、完全、所有、任何、必须、最、绝对、唯一,一般用于选非题</p><p>例:</p><p>关于我国的水资源与水能,下列说法错误的是:(A)</p><p>A.我国水能大部分分布在西南地区,按河流统计以雅鲁藏布江水系最多</p><p>B.我国水能资源理论蕴藏量居世界首位</p><p>C.我国已经被联合国列为13个贫水国家之一</p><p>D.我国是一-个水资源短缺、水灾频繁的国家</p><p>由于在A选项中出现了 <code>最</code>字,因此优先排除</p><h2 id="逻辑分析法"><a href="#逻辑分析法" class="headerlink" title="逻辑分析法"></a>逻辑分析法</h2><p>选项是否出现矛盾关系</p><p>例:</p><p>下列与我国军事国防相关的说法错误的是:(A)</p><p>A.大力发展军民融合是维护国家主权和安全的战略基石</p><p>B.新形势下我军的军事战略方针是积极防御</p><p>C.中国位于海洋地缘战略区和欧亚大陆地缘战略区的交接处</p><p>D.维护地区和世界和平是我国军队担负的主要战略任务之一</p><p>军民融合对安全起不到作用</p><h2 id="法律常识推理"><a href="#法律常识推理" class="headerlink" title="法律常识推理"></a>法律常识推理</h2><p>核心内容:</p><ul><li>人身安全高于财产安全</li><li>不能让人“不爽”</li><li>维护社会公平</li><li>保护弱者、受害者</li></ul><p>例:</p><p>下列关于行政许可的表述中,错误的是:(C)</p><p>A.实施行政许可,应当遵循便民的原则,提高办事效率,提供优质服务</p><p>B.公民、法人或者其他组织依法取得的行政许可受法律保护,行政机关不得擅自改变已经生效的行政许可</p><p>C.行政许可的实施和结果,除涉及国家秘密的外,应当公开</p><p>D.公民、法人或者其他组织对行政机关实施行政许可,享有陈述权、申辩权</p><p>由于在实际执行过程中,除国家秘密外,还可能包含企业、个人的个人隐私,因此需要进行保密——<code>不能让人“不爽”</code></p><h1 id="第二种方法"><a href="#第二种方法" class="headerlink" title="第二种方法"></a>第二种方法</h1><h2 id="心中有党"><a href="#心中有党" class="headerlink" title="心中有党"></a>心中有党</h2><p>选项中涉及到习近平总书记的要进行选择,有国家领导人的一般都不选</p><p>例:</p><p>“四个全面”是新一届党的领导集体治国理政的战略布局。下列与“四个全面”有关的说法正确的是:(d)</p><p>A.党的十八大通过了《中共中央关于全面深化改革若干重大问题的决定》</p><p>B.十八届三中全会通过了《中共中央关于全面推进依法治国若干重大问题的决定》</p><p>C.十八届四中全会提出了“全面建成小康社会”的战略目标</p><p>D.习近平总书记在江苏调研时将“从严治党”首次提升到“全面从严”的高度</p><h2 id="公平正义"><a href="#公平正义" class="headerlink" title="公平正义"></a>公平正义</h2><p>可以与<a href="#%E6%B3%95%E5%BE%8B%E5%B8%B8%E8%AF%86%E6%8E%A8%E7%90%86">法律常识推理</a>一起判断</p><p>例:</p><p>甲于2010年3月1日开始使用“红红太阳”牌商标,乙同年4月1日开始使用相同商标。商标局于2011年5月10日同一天收到甲、乙关于“红红太阳”商标的申请文件,但甲的文件是5月8日寄出的,乙的文件是5月5日寄出的。商标局应初步审定公告谁的申请?(A)</p><p>A.公告甲的申请,因甲、乙虽同时申请,但甲使用在先</p><p>B.同时公告,因甲、乙申请日期相同</p><p>C.公告乙的申请,因乙申请在先</p><p>D.可以由商标局自由裁定.</p><h2 id="字斟句酌"><a href="#字斟句酌" class="headerlink" title="字斟句酌"></a>字斟句酌</h2><p>例:</p><p>下列情形中,甲和乙只需承担双方责任,无需承担共同责任的是:(A)</p><p>A.甲养的羊误入乙的菜地,乙发现后不管不问导致损失扩大</p><p>B.甲乙共同实施了故意伤害行为</p><p>C.甲乙合伙办了一家快递企业,乙在运输过程中丢失包裹</p><p>D.甲与乙协商共同买下一套房屋,二人约定各欠卖方十万元房款</p><h1 id="第三种方法"><a href="#第三种方法" class="headerlink" title="第三种方法"></a>第三种方法</h1><h2 id="正确选项积极向上,常和党性在一起"><a href="#正确选项积极向上,常和党性在一起" class="headerlink" title="正确选项积极向上,常和党性在一起"></a>正确选项积极向上,常和党性在一起</h2><p>与<a href="#%E5%BF%83%E4%B8%AD%E6%9C%89%E5%85%9A">心中有党</a>类似</p><h2 id="矛盾选项和稀泥,你不会就要选其一"><a href="#矛盾选项和稀泥,你不会就要选其一" class="headerlink" title="矛盾选项和稀泥,你不会就要选其一"></a>矛盾选项和稀泥,你不会就要选其一</h2><p>与<a href="#%E9%80%BB%E8%BE%91%E5%88%86%E6%9E%90%E6%B3%95">逻辑分析法</a>类似</p><p>例:</p><p>掩星是一种天文现象,指一个天体在另一个天体与观测者之间通过而产生 的遮蔽现象。<br>科学家经常借助观察这一现象来判断星体是否有大气层。当行星掩过 遥远恒星,如果恒星<br>变得模糊之后才消失,那么可以认为:(B)<br>A.该恒星有稠密的大气层<br>B.该行星有稠密的大气层<br>C.该恒星无大气层或大气层稀薄<br>D.该行星无大气层或大气层稀薄</p><h2 id="小心数字,数字经常迷惑你"><a href="#小心数字,数字经常迷惑你" class="headerlink" title="小心数字,数字经常迷惑你"></a>小心数字,数字经常迷惑你</h2><p>在判断不出来的时候,包含数字的项往往是错误的</p><p>例:</p><p>关于丝绸之路经济带,下列说法不正确的是:(C)<br>A.东接亚太经济圈,西系欧洲经济圈<br>B.被认为是世界上最长、最具有发展潜力的经济大走廊<br>C.以温带季风气候为主,年平均降水量在 800 毫米左右<br>D.是国家主席习近平在哈萨克斯坦纳扎尔巴耶夫大学演讲时提出的</p><h2 id="诗词哲学题不会,找关键词定主体"><a href="#诗词哲学题不会,找关键词定主体" class="headerlink" title="诗词哲学题不会,找关键词定主体"></a>诗词哲学题不会,找关键词定主体</h2><p>找关键词与内容相关即可与<a href="#%E9%A2%98%E5%B9%B2%E5%88%86%E6%9E%90%E6%B3%95">题干分析法</a>类似</p><p>例1:</p><p>我国古代用 “金”“石”“丝”“竹”指代不同材质、类别的乐器。下列诗词涉及 “竹”的是:(C)<br>A.珠帘夕殿闻钟磬,白日秋天忆鼓鼙<br>B.主人有酒欢今夕,请奏鸣琴广陵客<br>C.深秋帘幕千家雨,落日楼台一笛风<br>D.哀筝一弄湘江曲,声声写尽湘波绿</p><p>看选项可知,笛子一般都是使用竹子做的,其它乐器与竹子无关</p><p>例2:</p><p>对下列对联依次所指的文学家,判断正确的一项是:(C)<br>①哀怨托离骚,生而独开诗赋立;孤忠报楚国,余风波及汉湘人。<br>②兵甲富于胸中,一代功名高宋室;忧乐关乎天下,千秋俎豆重苏台。<br>③质而绮,真而醇,自可传之千古;樽中酒,篱下诗,岂甘了此一生。<br>④笔诤时政,心在苍生,万户争传新乐府;堤建西湖,神归东洛,千秋永祀老诗翁。<br>A.孔子 李白 李煜 陆游<br>B.屈原 陶潜 李煜 白居易<br>C.屈原 范仲淹 陶潜 白居易<br>D.孔子 李白 白居易 范仲淹</p><p>第一句:<code>离骚</code>,能判断出是屈原;第二句:<code>忧乐</code>,能想到范仲淹;第三句:<code>篱下</code>,能想到陶渊明;第四句:<code>新乐府</code>、<code>西湖</code>,能想到白居易</p><h2 id="太绝对要提高警惕,不符合中庸语气"><a href="#太绝对要提高警惕,不符合中庸语气" class="headerlink" title="太绝对要提高警惕,不符合中庸语气"></a>太绝对要提高警惕,不符合中庸语气</h2><p>与<a href="#%E7%BB%9D%E5%AF%B9%E8%A1%A8%E8%BF%B0%E6%8E%92%E9%99%A4%E6%B3%95">绝对表述排除法</a>类似,答案一定是比较模糊的、摸棱两可的,若出现过于绝对的内容,则一般是错误的</p><p>例:</p><p>关于地质年代与地层,下列说法错误的是:(D)<br>A.当岩层之间有切割现象时,被切割的岩层比切割的岩层古老<br>B.发现大量三叶虫化石的岩层比发现大量鱼类化石的岩层古老<br>C.放射性同位素方法可用来测定岩层的形成年代<br>D.在全球范围内,形成于同一地质时期的岩层岩性都是相同的</p><p>选项太过于绝对</p><h2 id="包含关系,选择最概括的"><a href="#包含关系,选择最概括的" class="headerlink" title="包含关系,选择最概括的"></a>包含关系,选择最概括的</h2><p>选择包含面最广的,涉及内容最多的</p><p>例:</p><p>下列关于我国脱贫攻坚工作说法准确的是:(D)<br>A.强化行政一把手负总责的责任制<br>B.坚持先扶志,再扶智,后扶技的顺序<br>C.坚持中央统筹省负总责县乡抓落实的工作机制<br>D.动员全党全国全社会力量,坚持精准扶贫,精准脱贫</p><h2 id="本质出发点落脚点,实在不行选民意"><a href="#本质出发点落脚点,实在不行选民意" class="headerlink" title="本质出发点落脚点,实在不行选民意"></a>本质出发点落脚点,实在不行选民意</h2><p>看到人民群众,基本都是正确的</p><p>例1:</p><p>“中国共产党必须始终代表中国先进生产力的发展要求,代表中国先进文化的前进方向,代表中国最广大人民的根本利益。”这是对“三个 代表”重要思想的集中概括。“三个代表”重要思想的根本出发点和落脚点是:(A)<br>A.实现人民的愿望、满足人民的需要、维护人民的利益<br>B.大力促进先进生产力的发展<br>C.大力发展社会主义先进文化<br>D.不断增强社会主义国家的综合国力</p><p>例2:</p><p>习近平总书记指出,体育强国的基础在于( A),要通过举办北京冬奥会、冬残奥会,把我国冰雪运动特别是雪上运动搞上去,在 3 亿人中更好推广冰雪运动。</p><p>A.群众体育<br>B.竞技体育<br>C.体育文化<br>D.体育产业</p><h2 id="四个选项三个同,选择存异选项"><a href="#四个选项三个同,选择存异选项" class="headerlink" title="四个选项三个同,选择存异选项"></a>四个选项三个同,选择存异选项</h2><p>选择与其它选项不同的</p><p>例:</p><p>下列关于武器装备的说法中错误的是:(C)<br>A.尼米兹级航母是美军装备的核动力航空母舰<br>B.S300 导弹是俄罗斯生产的高空防空导弹<br>C.枭龙是我国生产的性能优良的无人机<br>D.F-22 是美军装备的先进的隐身战机</p><p>由于其它四个选项都在说国外,因此选C</p><h2 id="正确选项常辨证说,错误选项脱离实际"><a href="#正确选项常辨证说,错误选项脱离实际" class="headerlink" title="正确选项常辨证说,错误选项脱离实际"></a>正确选项常辨证说,错误选项脱离实际</h2><p>选项内容要符合实际情况</p><p>例:</p><p>下列关于农业的说法正确的是:(A)<br>A.花生、大豆、向日葵和芝麻都属于油料作物<br>B.农药在夏天中午气温较高时喷洒灭虫效果最好<br>C.有机农作物通常种在便于运输的交通主干线附近<br>D.追肥是农闲时期为调节土地所含养分而施用的肥料</p><h1 id="第四种方法"><a href="#第四种方法" class="headerlink" title="第四种方法"></a>第四种方法</h1><p>第四种方法内容与其它内容有一定重合,这里只记录不一样的地方</p><h2 id="关键词中庸"><a href="#关键词中庸" class="headerlink" title="关键词中庸"></a>关键词中庸</h2><p>答案出现在选项中最多相同或相反的关键词中。若多个选项含有相同关健词,答案越容易被遮蔽,不易被发现,符合中庸之道。 某一个选项含有最多的关健词语,那么这个选项最容易隐藏自己,最符合中庸之道, 就是正确选项。</p><p>例:</p><p>下列表述不正确的是(B)。 </p><p>A.自然界中的金属在常温下一般呈固态 </p><p>B.惰性气体不与其他物质发生化学反应 </p><p>C.天然气是一种无色无味无毒的气体燃料 </p><p>D.钢是铁和碳按照一定比例加工而成的合金<br>由于B C 选项中都有关键词气体。所以答案在 B C 选项中,进一步分析,选B</p><h2 id="判断选项长短"><a href="#判断选项长短" class="headerlink" title="判断选项长短"></a>判断选项长短</h2><p>原则一 如果题干要选正确的 那么答案在长度最中庸的选项中即长度不长不短的选项是答案<br>原则二 如果题干要选错误的 那么答案在长度最不中庸的选项中即长度最长或者最短的选项便是答案</p><p>例1:</p><p>下列关于国家主权及国防地理的表述,不正确的是:(A)<br>A. 主权是联合国赋予国家的最基本的权利<br>B. 一国的领海和领空都是其领土的组成部分<br>C. 我国南海四大群岛是东沙、西沙、中沙和南沙群岛<br>D. 我国与越南、缅甸、吉尔吉斯斯坦等十几个国家接壤<br>首先,要选错误的。根据原则二 A 选项最短 D 选项最长,所以排除 B C,进一步分析则选A</p><p>例2:</p><p>关于欧洲主权债务危机的原因,下列说法不正确的是?(A)<br>A.欧元升值<br>B.欧元区经济低迷<br>C.巨额财政赤字<br>D.财政政策与货币政策的不协调<br>首先,要选不正确的。根据原则二 A 选项最短 D 选项最长,所以排除 B C。又根 据<a href="#%E5%85%B3%E9%94%AE%E8%AF%8D%E4%B8%AD%E5%BA%B8">关键词中庸</a>原则,直接选 A。</p><h2 id="答案体现民族自豪感"><a href="#答案体现民族自豪感" class="headerlink" title="答案体现民族自豪感"></a>答案体现民族自豪感</h2><p>体现中国好的是正确的,反之是错误的。命题者必须积极弘扬中国的强大。</p><p>注意:民族自豪感会表现的比较隐蔽</p><p>例:</p><p>下列关于我国经济发展现状的表达,不正确的是:(C)<br>A、人均国民生产总值已超过 3000 美元<br>B、黄金储备量已超过 1000 吨<br>C、对石油进口的依存度已接近 30%<br>D、第三产业增加值已接近第二产业<br>我们看到每个选项都有数字,不能用规律一了。这时,我们仔细观察人均生产总值突破了,黄金储量超过了,第三产业增加值接近了,全部是说的我国强大的一面。只有 C 选项说的是我国的依存度问题,不能积极反应我国的强大。所以答案是C。 </p><h2 id="年份最近的常是答案"><a href="#年份最近的常是答案" class="headerlink" title="年份最近的常是答案"></a>年份最近的常是答案</h2><p>出题者喜欢考最近年份的知识</p><p>下列关于我国人大代表选举的表述,不正确的是:(D)<br>A、1953 年通过的选举法规定,全国人大代表的选举,各省按每 80 万人选代表 1人, 直辖市和人口在 50 万以上的直辖市按每 10 万人选代表 1 人<br>B、1979 年修订的选举法规定。自治州、县、自治县人大代表中,农村每一代表的人 口数 4 倍于镇每一代表所代表的人口数、省、自治区人大为 5:1,全国人大为8:1<br>C、1995 年修改的选举法规定,省、自治区和全国人大代表中,农村每一代表与城市每一代表所代表的人口数为 4:1,自治州、县、自治县仍是 4:1<br>D、2010 年修改的选举法规定,全国人民代表大会代表名额,按照每一代表所代表的城乡人口数 2: 1 的原则,以及保证各地区、各民族、各方面都有适当数量代表的 要求进行分配</p><p>由于2010年距离最近,则选择D</p>]]></content>
<summary type="html"><h1 id="国考之常识推理"><a href="#国考之常识推理" class="headerlink" title="国考之常识推理"></a>国考之常识推理</h1><h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p>记录整理网络中如何快速判断常识答案的蒙题技巧</p></summary>
<category term="国考" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E5%9B%BD%E8%80%83/"/>
</entry>
<entry>
<title>国考之资料分析</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/12/30/%E5%9B%BD%E8%80%83%E4%B9%8B%E8%B5%84%E6%96%99%E5%88%86%E6%9E%90/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/12/30/%E5%9B%BD%E8%80%83%E4%B9%8B%E8%B5%84%E6%96%99%E5%88%86%E6%9E%90/</id>
<published>2022-12-30T10:27:55.000Z</published>
<updated>2023-01-03T09:23:58.000Z</updated>
<content type="html"><![CDATA[<h1 id="国考之资料分析"><a href="#国考之资料分析" class="headerlink" title="国考之资料分析"></a>国考之资料分析</h1><p><a href="https://doi.org/10.5281/zenodo.7500772"><img src="https://zenodo.org/badge/DOI/10.5281/zenodo.7500772.svg" alt="DOI"></a></p><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在此处记录一下资料分析的相关知识点,内容来自于花生十三</p><span id="more"></span><p>在花生十三这里,有几个数据需要记录:</p><ul><li>B:现期值</li><li>A:基期值</li><li>R:增长率</li><li>X:增长量</li></ul><h1 id="四则运算"><a href="#四则运算" class="headerlink" title="四则运算"></a>四则运算</h1><h2 id="高位叠加"><a href="#高位叠加" class="headerlink" title="高位叠加"></a>高位叠加</h2><p>与记忆中的列竖式作加法顺序相反,高位叠加是从高位加起,抓住问题的主要矛盾。非精确求和和没有选项可以参考时可以使用高位叠加</p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20230102153019795.png" alt="image-20230102153019795" style="zoom:50%;" /><p>适合:非精确题目</p><p>适用范围:求比重、合计多少、</p><h2 id="“21”-“12”分段法"><a href="#“21”-“12”分段法" class="headerlink" title="“21” “12”分段法"></a>“21” “12”分段法</h2><p>将三位数的减法分为“21”或者“12”两段,并尽可能保证不需要借位</p><p>如 <code>519-127</code>:</p><p>个位:9>7,百位+十位:51>12;我们可以将减法进行分段计算,百位+十位为一段“2”,个位为一段“1”</p><p>则个位 = 9-7=2;百位+十位 = 51-12=39;将数据回归原位,答案=392</p><h2 id="整数基准值法"><a href="#整数基准值法" class="headerlink" title="整数基准值法"></a>整数基准值法</h2><p>被减数-减数=(被减数-基准值)+(基准值-减数)</p><p>如 <code>632-588</code> :</p><p>十位+个位中的3 2均小于 8 8;因此可以加入基准值,将减数588向上取整为600,则<br>$$<br>632-588 = (632-600)+(600-588) = 44<br>$$</p><h2 id="小分互换"><a href="#小分互换" class="headerlink" title="小分互换"></a>小分互换</h2><p>若乘法中有某个乘数可以近似转化为某个常见分数,我们可以将多位数乘法转华为简单的除法计算</p><p>常见百化分分数:</p><table><thead><tr><th>1/2 = 50%</th><th>1/7=14.3%</th><th>1/12=8.3%</th><th>1/17=5.9%</th></tr></thead><tbody><tr><td>1/3=33.3%</td><td>1/8=12.5%</td><td>1/13=7.7%</td><td>1/18=5.6%</td></tr><tr><td>1/4=25%</td><td>1/9=11.1%</td><td>1/14=7.1%</td><td>1/19=5.3%</td></tr><tr><td>1/5=20%</td><td>1/10=10%</td><td>1/15=6.7%</td><td>2/7=28.6%</td></tr><tr><td>1/6=16.7%</td><td>1/11=9.9%</td><td>1/16=6.3%</td><td>3/7=42.9%</td></tr></tbody></table><p>如 <code>464*25%</code> :<br>$$<br>25%=1/4,则464<em>25%=464/4=116<br>$$<br>如果遇到不是那么整的数值,如$464</em>12.1%$,则可以考虑将$12.1%化为11.1%+1%$之后转成$\frac{464}{9}+4.64\approx56.2$</p><h2 id="凑整拆分"><a href="#凑整拆分" class="headerlink" title="凑整拆分"></a>凑整拆分</h2><p>将乘数拆分为“2或5”等容易计算的数字组成</p><p>如 <code>464*48%</code>:<br>$$<br>464<em>48% = 464</em>(50%-2%) = 464/2-464*2% =232-9.28=222.72<br>$$</p><h2 id="预估拆分法"><a href="#预估拆分法" class="headerlink" title="预估拆分法"></a>预估拆分法</h2><p>将被除数由大到小拆成几部分分别计算,通过逐步分解,从而得到结果。</p><p>例1:</p><p>$\frac{715}{729} = \frac{729-14}{729}=1-\frac{14}{729}\ \ \ \ 由于,\frac{14}{729} =2^-%,\ \ \ \ 因此\frac{715}{729} = 98^+%$</p><p>例2:</p><p>$\frac{247}{532}=\frac{266-19}{532}=50%-4^-%=46^+%$</p><p>例3:</p><p>$\frac{335}{831}\ \ 大体可以看出,约40%,因此40%*831=332,\frac{335}{831}=\frac{332+3}{831}=40%+0.4^-%=40.4^-%$</p><p>使用规则:</p><ul><li>如果分数大小接近1(分子分母相差不大)可以先用100%减去、加上</li><li>如果分子在分母的50%附近,先拆出50%</li><li>如果分子在分母的50%-100%之间且不好预估,先拆出50%,之后继续计算</li><li>如果分母接近500或1000,可以直接根据分子判断分数大约的百分比</li><li>在不满足上述情况下,可以根据首位比值或分子前两位与分母首位比值,拆出其它特殊分数(如:1/3、1/4、1/6、1/7、30%、40%、70%等)</li></ul><h2 id="“415”份数法"><a href="#“415”份数法" class="headerlink" title="“415”份数法"></a>“415”份数法</h2><p>将数量关系转化为份数比例关系,从而简化计算。一般来讲,将现期B和增长率R为已知量的前提下,可以使用415份数法快速获得基期A与变化量X的数值</p><p>例如:增长率为25%($\frac14$),为了方便计算,可以将基期设为4份,变化量X=AR=1份,现期为基期和变化量之和,为5份。则基期、变化量、现期的份数分别为4、1、5</p><p>使用时机:增长率R在一个分数附近</p><p>例:</p><p><em>今年工资456,比去年降低了12.5%,则去年工资是多少?</em></p><p>$-12.5%=-\frac18$,则对于“415”份数来讲,现期为7份,增长量为-1份,基期为8份,$\frac{456}{7} \approx65$,则基期为“7+1”则为$65+456=521$</p><h2 id="假设分配法"><a href="#假设分配法" class="headerlink" title="假设分配法"></a>假设分配法</h2><p>现期、基期、增长量成一定比例,且现期=基期+增长量,通常通过假设基期、增长量来分配现期,多退少补,逐步趋于正确的基期和增长量。</p><p>核心公式:</p><ul><li>B=A+X——剩余分配=B-A-X</li><li>A=B/(1+R)——A:X:B=x:100:100+x</li><li>X=AR<ul><li>R>0——ABX同号,且A<B</li><li>R<0——AB与X异号,且A>B</li></ul></li></ul><p>其结构图大致如下:</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">graph TB</span><br><span class="line">A((现期值))</span><br><span class="line">B((基期值))</span><br><span class="line">C((剩余分配值))</span><br><span class="line">D((增长量))</span><br><span class="line">E((基期值))</span><br><span class="line">F((增长量))</span><br><span class="line">G((剩余分配值))</span><br><span class="line">A-->B</span><br><span class="line">A-->C</span><br><span class="line">A-->D</span><br><span class="line">C-->E</span><br><span class="line">C-->G</span><br><span class="line">C-->F</span><br></pre></td></tr></table></figure><p>左边分支为基期值,右边分支为增长量,中间剩余分配值为基期值与增长量和现期的差(基期和增长量的数值为假定)</p><p>由于大部分情况下知道现期、增长量的值,求基期的情况较多,因此,以下为两个例子</p><h5 id="例1(0-lt-x-lt-10-)"><a href="#例1(0-lt-x-lt-10-)" class="headerlink" title="例1(0<x<10%):"></a>例1(0<x<10%):</h5><p>假设现期量为<code>5362</code>,增长了<code>8%</code>,求基期or增长量:</p><p>假设基期量为<code>5000</code>,其<code>8%</code>为<code>400</code>,<code>5000+400=5400</code>,与<code>5362</code>相差<code>38</code>,因此中间位置写<code>-38</code>,两侧分别写<code>5000</code>和<code>400</code>,之后将<code>-38</code>看作<code>-40</code>,以<code>40*8%=3%</code>,填入右侧,则左侧值为<code>38-3=35</code>。因此基期值为<code>4965</code>,增长量为<code>397</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">graph TB</span><br><span class="line">A((5362))</span><br><span class="line">B((5000))</span><br><span class="line">C([-38])</span><br><span class="line">D((400))</span><br><span class="line">E([-35])</span><br><span class="line">F([-3])</span><br><span class="line"></span><br><span class="line">A-->B</span><br><span class="line">A-->C</span><br><span class="line">A-->D</span><br><span class="line">C-->E</span><br><span class="line">C-->F</span><br></pre></td></tr></table></figure><h5 id="例2(x-gt-10-)"><a href="#例2(x-gt-10-)" class="headerlink" title="例2(x>10%):"></a>例2(x>10%):</h5><p>假设现期量为<code>402</code>,增长了<code>16%</code>,求基期or增长量:</p><p>假设基期量为<code>300</code>,其增长量为<code>300*16%=48</code>,因此可以得到剩余量为<code>402-300-48=54</code>,由于增长量为<code>16%</code>,近似约等于可以看成<code>16.7%</code>,为$\frac16$,则增长一份的量为$\frac{54}{7}\approx8$,则增长量为<code>8</code>,基期量为<code>46</code>。因此基期为<code>346</code>,增长量为<code>56</code></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">graph TB</span><br><span class="line">A((402))</span><br><span class="line">B((300))</span><br><span class="line">C((54))</span><br><span class="line">D((48))</span><br><span class="line">E((46))</span><br><span class="line">F((8))</span><br><span class="line"></span><br><span class="line">A-->B</span><br><span class="line">A-->C</span><br><span class="line">A-->D</span><br><span class="line">C-->E</span><br><span class="line">C-->F</span><br></pre></td></tr></table></figure><p>在第二步的时候使用“415”方法,第一步使用误差较大,可能会导致无法选择合适数据</p><h5 id="例3(x-lt-0)"><a href="#例3(x-lt-0)" class="headerlink" title="例3(x<0):"></a>例3(x<0):</h5><p>假设现期量为456,减少了7%,求基期or增长量:</p><p>假设基期量为500,则增长量为-35,剩余量为456-500-35=-9,之后使用-9*-7%可以得到约等于1,则前面为-10</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">graph TB</span><br><span class="line">A((456))</span><br><span class="line">B((500))</span><br><span class="line">C([-9])</span><br><span class="line">D([-35])</span><br><span class="line">E([-10])</span><br><span class="line">F((1))</span><br><span class="line"></span><br><span class="line">A-->B</span><br><span class="line">A-->C</span><br><span class="line">A-->D</span><br><span class="line">C-->E</span><br><span class="line">C-->F</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h1 id="国考之资料分析"><a href="#国考之资料分析" class="headerlink" title="国考之资料分析"></a>国考之资料分析</h1><p><a href="https://doi.org/10.5281/zenodo.7500772"><img src="https://zenodo.org/badge/DOI/10.5281/zenodo.7500772.svg" alt="DOI"></a></p>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在此处记录一下资料分析的相关知识点,内容来自于花生十三</p></summary>
<category term="国考" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E5%9B%BD%E8%80%83/"/>
</entry>
<entry>
<title>数据挖掘自救指南</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/12/10/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98%E8%87%AA%E6%95%91%E6%8C%87%E5%8D%97/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/12/10/%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98%E8%87%AA%E6%95%91%E6%8C%87%E5%8D%97/</id>
<published>2022-12-10T07:23:41.000Z</published>
<updated>2022-12-20T08:26:08.000Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="好像密码不正确呢?再试试吧" data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="25225cfb0dc4cee2ff3ad6cb81243de6bb8db1482603e27c8d1b1b876375ca69">70ac25c70658097a6e56b7016a426e78044114ad2e347c5b92fe08350a5447b97869926e9fce493537f251adb4c135c9f9e6c8f28a3c3cb09dcb177ab84fa154beee2491faba167a44db55121d0b671f97ff2d4f25fa7d611cebdf8513964703e17f138767c8706bab561841fd0a0ebb9b32f9c93d1b8cc96521293700847bc85d69fb42bedefd3c991aba19fc44bb4085e02c1e97bfbda3dd2a3fa59e0fabe4e8f3fe3b10eb32614f64be52c009e33e13390e785899c602b722f1748da1ebaa3672637ac2dbe2371e06bbb6eadc00a147b4d70b8db51cb175a20561239eb993f7e55fdabdb4a94416e5a6d4e8dde1d6447b4fcc1c37c75a634e2fd658f939cfe5837a116a3247ccba18a7b1b74ddf52d4c37a5a845550c8f1128af94f9e618036f197e66300c0421ce8e4788ebeb05587743ce9d0d3905ffd877b3df9448817cec1981662d91845bae38cb9f4e43ac0b3ded86663ac602e871fa987f24776f78b4c0541983621ca6639bcb21292019d0bda6d9ff6f1c8d5060e44fd2fc4f952beed1c7ec2bb3b07606d5fa0b2a4b445669183cd447ff2a0b8f5226a2acc7a554359e3e7237909c5a7ec50588785b809322b67048f2985b1b13a6c7e84038cf21ec928a65945ddf373ee378b031602f74beb227d855bac7d53d9f92b90035847a011c611e2aa8a4b914ccad5cbac41172589c9e9889c6dfd36f69c09546bb4ec46053e9fc63d631fc791def8d962492ac261a7203128fc1cba8638c4df4fa6dad52ea0216a7263b9bde8c469c6e6ba622d03ddce9989fce43a74aee170a1b73fee866e863bc794e28becfd1645d59034ec5a399360c68a44eea984385632b895f3227c2db05537a41c93931471c85bf493bbefa3fe97be21622b79d31c73571d48feaea0b4e1dc6dbb9760b9865a34861b86270a2683d72f13a571e22eb07e1cec569ab9c2fb0f3eef290e07d7a523973bbfbf0430d3bb9f56d403a4b068eafd90cdbfe2c1d8b15c861d0ed5a8e59d62b0eee079d44f55e9ea08afb1ca9dbb2e38ae6d3d4cff9690310c1cfbe197489f6061b4fd883b3b211e07324adfd249bde0b324d71ac2b4948cac5d7db93f89f51c1154de1a14acdce2625ca7e66d66ca5366cf5d6418cf4fe1ee4bd7b5f8c8a407fbd44e62f0e1b2f016f4edeb1b414dc855b691804df8922b5c3e237e17aad7e7ed4d905dd1486cd41789624a857fe2d65cdf5c50467f344ee68a9d70f389ae30b333496a4afe1b686fa43cbbd25cf207ea9300ab740b1c85e49249364f16af7b380cef8dafbb100d6e77102abda1a15c47efc2207ac4b5b7997ab3bf88442aa290239bd26356a9fa7ae8aabf72c44eb24d4ad6ede5106808c39c726afd84a347aab87d4e7d3516700d3b516bfd1c782183747aada68e425fa8745b144e99bab62ccccfd86de72d00f63e14366e1aa4bf64c1667f48b8ef29639478008cd7c07f22441110da0fe4a7c01eed298aff7b3b122d3ab40b81266dd916bc8ff6c8d1b23d5a18735101107f377db35f5126428d0c8f158dc02f4945532d857563b02a69297796fa35e38c9ed32e74a6cf0c7103a3a953ce63b483e491e9e755b5a41a55e8a552fe0bc9d9b34742c02ccffb4c3542f7702c259370f717c36d5a78738783bc92fceeb6c81ea1f7d7969f8d1827f5072673d4c402152e2bc2abeb60ed8872a342f79640ec7ec8536dc64b2b5e688741a9dbdb044ccdcd4e27e3b2f5a4f36fbc9083a226db7848a19c6e5bad83bb2829f4c4a23fa081f4b0c745570dc406c9726e66e12c3f885476e29f7c3df6d85e490a1094d62afda9caca39a8021a90ac958c84253197e64f27bc7e3a7300f3bccb51969046005574294365666140e67b7c5e8e00a9b26ea54808746d601a0aa82e311109a8df4c475a31972b46befff7a02cfb8faf4b7ea488c644af807ff789b8258e54235349df09718156470fa13ec662f398d320f2088658a9fe6bb363c792aee69e0d3a2712a7c67985ac46291c7ffd6845b1009363e7f4d8ab21838ccba3203a797ea11133b04bfa94c1cfade7a28b67a30c3d65e65b815f49d1f17369e32b6bb17cf082eee3b2e682e9533228ef18cf8b20132729e8b90f0ceca87f72281691d3ff19a560a41ab0fcdcbe3da5b58ef8d410b8bf9905d5137c630b81f3280bdbcf2268a12c83bef87c14378cace141c98e919638f4896d92cf6e9341a1d20018a4fc987114a598524ed289484fbe452abc2fe1b4f7009ba1c0f48b79bc0a0f70c154520029a01104780f54bfa028a46de0579b32622604a83cbb2c6d2cc7a6e0bb0d718c4645525eff7680fa1dfce81948cef5cef4ff6e05455dd5098acaa4091838b6803138a88e54df0ae8d8ffc5baaa89cdbb2c6d763d36da98d8c2388631af5a7151170dc42b3977182bbbddf0ff75989b0c6659852462daf70287543809954ae4c55157f7166bba19ac67cc7351fa7a82f8ac8afb6232f1ca0b098c06a9a3ea30a706cbe3d4105696a8437797d3f7d756f0404a58a5f402f63d69b7e8457be4631f223fe49d1477e24ce94cdf836b192d91ed00eac7c89f2299e85509ed35eb4952f8892af6b50bf7c1a09c6fdbec65cbd7520f88ac5381bfb1f0052d58ce6449fd930752dd4b9f740aa12f5d69fdfccf797b2c0ba51fa205ec582c3ddb476b80dc9e994ec079e0cc8a944608e04bf5de2f35f9f7e6aed192b035804c8e0f162e402dcd9d48c51c4e97873ead8181f01153970f205b559b1266739cc628e58f28b7fe78ff8feb23e6d03bdd974d55339740a3d605bc71fe6369ab47d531fad1cb6f88f939e5290fe89d8409245fa41a74123c20109e183e2a731f65598cb3f84e1d6a5ecff7af107f0e596b022b240ec720332d2a6b47a24f5859415f680d05049b9f13490c50d258bb00d49b63cb53813ac7f3a2c5524a79ae3622181a9fa8ef4bb6797796b680c3f73f967379c627d6fcaa7a7e0762b30abcbd403266b895e16a38d1a2edd219991dd80a810b156457744910cb7b2163cfb5abc82c1d79ac6929a335dbd8e0fac2ac38258983ed43bb261c060e5fdfb245406559b5678a17e101e3973284b1b14d0bc1581899929b9e035fc4ec969c009ffff73230f83d3c42b93ddf611ae879bb713db58de2804d28504779420c142b30f16bee5d9d556b4c3c5ee0830312f4ab88fee051da12b96d5beb220fabf2e0eee72593d59e61827b4ecd4317e9877405878da60f66c769c202a2bd49dba0cd194ad9cbcbffcc43545747205fffcbebc69c8d3aea46610670bfb7cc0cb5713daea19f957ab6523ba62dfe54ee440fe0bb07f137f22158db5bede9140649030f3ce6d31700f023dfc0baae77da321cd5b8478783e85cded651a0ddf28c2772d28e8dfd6e661304ef4bb03b0b6c8786a3bd71162d276d332a44d161f0db4b9d545c634a61088063853e1053322ba9dce1d20d923f5746c7bacfb94eb9b119b5538bcebf02c47a61102bf4abfae6ed016b3b6fa5274ec9a4d89822024ad3b77a151a20e3d8b7c28663cf00f8694097246a03122994572aaf6be2488ca0fd333bd808733a9cc0b02a3b96363eb6530cc30cf87cf261acc76a50512edf24f2fe79d37151c8a8d0569e9303a1ded4eb53c0306ebaf89f9c1128224d7b4ab4abc192af48afa008c49b0eb2fd4e53a9c3c86aa830b2aa99b31b715c06911b1fc3a435fc0f8dd194f39cc109dd5d9b2deb20af09e5024995aeed1f1f80f3c02782be954788bfb6ebd1555008c0ce34a7ffa3d1d044196b469c10b664ffd88c1dc53579ca226cb4e697bc5d903524e2a10b92883022c380c5303257f0fbe9013141964b42c24d3344320578c116f2af3325c0e67c9ee538b778698cecc0aac4ea2a908a65884655eae4c4f01249a4dd69be0e75c42e8662e8dc40948f570176075b14f5fa51c6cd2fecb11492f56795c7a712f902ae894de6928fdbfd9b1ca32639602e8d771005e5a4662352a4f43c23aec7ed1184a1a7631551f95ca7d0680fc570a46fe2c570818c8b1758d25a299b7a679bf03871bf6c444cea3378da1b3df730ee611722994a51a0b79e6ec40e8863f6fe7e8517a04a08cd28db6a846ef90e51907cefb49936255b7c404c926c0774b0c5b4ad89dbf254984e84c05fdc92987c5325c3eeca330e29163e4789fcc709ee818a7a8a2289ec1f08b45821d20e8b9bb5c928606f36d00783c54f8dc06ce6ca1b6c50a162d90ae97e2f7414c03723328ff7d59bdd40dcebbb6e0d28cfb578d690f8ca237ab236d0c31d14712aae825f81d9061565e86004e042f392290bff6470b74a3f19c6cdf69cb4eb8cf00ce690880eb6987ee93533af872bf31ff8de16d8bd4c085e24e96d8d5beb309502dc52608b72f022e0c9a7b65fb7e4fef55f28097faa736186715bc218dcf1d1177ef3a90db55e702c96a1531b06ff05c432f4d1d78789e44fb891b1d44a2bd305cbffe622fdac019d9149213336cef5730456342e29e0fd260fea2779c51399bd84c076e0a8e6338299cd0b84028f3ff4737a8f044a93586f5a76123efe7fc75ae25ce45410bbaac79129d20651c22fb3b473f73ce2cae32a91a11068e9bd44bb60a12fcdee4661a28db97f7d674a1d80c9e151ab1e375c70f89b42669c35b535c13dad1f4090569f42aee4eb815d05363deafc76dcea36246b037b8329051944dae0406310af1811c9aa8ca85ad1887d7e4d36b1aa60a0031d0c35336f7d4643289551767587b60924d2094f0779b2fba327d15289c717f874c2d8ce06d7c206103a2a84ced52ac3548be1b6a7804390b293e469fe0c2448bf6522dd9cfade4bb6a0bcb4084106c67b52ceca2ce94a53830a00bf3cb223f31682f198c58015cb8cd75b2db17b55f4acd255123e6049e9651a6beb76c923c43e6c9e3715f4b1d93f26713ed351791815607ff5af8e05f0436208af6a544ea420b130972c3e9e86a745141607860a804be657634b2c433436ca87684bee8f0abf365e1c2cc07c660e2fa7c3223d3edc7ece5374435a73b24140c08d108de35478aaaba136ef3cbd4190e9e3cf5536a8b2259ec5625ec567bce01928072c34637d5df9463b29ca544a89be842a6d983968949326fee1edb2cca306a91ced40b291e85e5966acf6af919872b3180ea4c7e3f861b9d39a01d9ea366ead08f8721ab3faac60131344f6b67c5455c624c321c27a1bb62e0b18c1757924f7c55ee563287a3fba7e9c022119b4e84eee29813094a34427928874c3aaeeec08a3a3db01d1b3e6093d6efc529159fdb998de7236c1784aa2141a560e065da38153095614778bcd8abbea0c1f00002f7508fd542f8df5bb78e2c4dc0d735039435ef1bc2b8c4c4f654ec3dc6bc14bfe75067f8a3adf18c71180f22f36d2ced673a2002031ab3bb40784a65cfb7a298bb2aa2466901e8d054db38b5ba5edebf1c314ce8a034640e1542aab43f28715be4132291113a46c942bd24f150271fb5ed12c38931d8e3c38684a48e0397ae4f6a2f2e34dd04f54a912743be42f9b08e6e3815983cb36ab1c35abe64e47bd2c33c683bcf6702879e82355531783f13421dd8cb3a0ae5370669c15059acafcbdd4624b42a3995f4cca0217a24c1db9f0b0d8988b5d5d71877b2c89c73228e617119485192f383d18d0286c4e4a962a9521e97a90ce09f70d32712687b85fd0f9dee236b13b08d5bef878bb1e04e34ae86533e54017dfac57f1f5f8dde58aded2e20d099be724ddfa86e769f9374cf5a11a9f8aeda554c60b864fecea0318e5a68f5c1b6b4de61f22fffa16caabd2aa69585f1696b1ee8713ae59c079451af730d87e3e45f242d3ff02b7b6c2300de36b6623ea3306c3891f911873422a9e333a7517cbfb8b34e00313f651b8ccb729e8890fe83bd3518590a4653d10049adb0cbf5b86638e405d4f95e10ad7b79bdfb69e4ef7481a0d42da479297f70723dbddb424bee30c004f79add7ad2751eb55143558c3509a6eb1db04357bf57ea50355fdebdc59e01cdf18424acea3bdc83cc70c66cd49b71ac988ccdaf2f83ff57d593809d95e6b3f4e80e48da33461f4254aef86bc17805d2d2306de2a35a467015e50e76c38a49289d80342906e43072cf591741bc71ebc7c57501048e712828957a12a423e9f702d763fbc9319abefcfd86a30949f5e85448139466663be5124d0b0e4f3ce5f509847369adb35c7e498082d9c190e72b3dd3727c484af0b051c9c572d1b364f8f9049a47eb021dcd701974d67ec228cdee0e1cd014226f43723825b8616778cae9dfb5147f142675eb64e3ec6ae0e4dcfb340e54810232ec6395dbbfd8d1e180903e9413b7b70e12e258095ce3fb496001df03adfdfc4625f177c877b30a7b5790e5170afdfecfca8c1d0e32caf18e8e6b90de6c04b3e8aa05d69c0147d6af050a8e575e2e37a3859878119654e396e45eab0117ec60f72ee4fe897d4cf815f53682bfc2eb5056632286cb6110baa28e8e01c87bd3590a56864f8a0d026e63766319a7985003da569e0704702cb98bcd080416164ecaa84575f7978eeaaa33744d0fe9922963facbdd67fa5b203c45279fcc4f9e144c18bd264999af7ef8d9bfd56431042b112cace75c0f6948846b2c2465c74f2ca3959c7f17ab83b786d53140ec28e4b3defd6115be14867a04d9df3b7f6ee86bbbeb7efcc0f7f83482672e51a1ec491f662ced9956ce1db7867a585ce8f713458513f02f189748669ad9825d07312d3776b53abac2e590254d04a1f97046bc8c416f98bbf214e697b4550e6866a3882d43723a2ce0d04ee7f4577324682e7f0e6fbc12e057ed17721663fc66a809fc2a62eae8824ed8713a04d9c3f475a502cb6f68556a5bc084c93386f4c68b1345f47ca2cdce195a16c6eab58775113d9ae6fb658cbee70e51172b2783ed6293eb79a055173f5bd62519adc98c70e377fe2e063113f62bad7ab6054569371187d97e242e45409ac182dbcb69363c5f9eb75c87858692335ee3a0d9b3d49877c84d62fa3cb77e987128be446d9a835adcee7413824fcc4c518e838ce7281368c7d2443d4430572ef9cc049030c4dbbb8f7dcf1b663efd31e2af256389e1d6286d5b1d3278b55fd20cb5b8acb5719e999e9484e36d7b7bebfcc2d86205465d1899b82427fa265205a09edf81d3fc697dd70837f09194e104b586ba7a9eab994c7e330edf332e14ab5c1062287cb7b072e5147ac8a426576be771de9fabe3e63f9a0abee5d69f6245b17526938625fe3e84626bf250121a90d9dcf7ad96b82ab6d9bddb22a4f02431e815cfe429f7d093e34ac0f551d95fdd795719c316ccfc9209ac3b0242edcd90171e1038b4f6b6f9ca976f854f3dd3a337c5f0c76bf831e097e7cde5f9f171968cb3ad813bf0204a54163a4340e471eeec43f3d65116ef59183b2f5fc79bc7b5187924bad1f45a0bdb8c22e8312ee69b5a5c33dc3a6bc609a834a7288b8e64f0d37011e544b0f4188898d914e362c6426a84ee9b6d440480fff65b340ed3c113962350e22a673b5ac97cf184e9360fd8adaa8b0ef3dcdb31fbd436091688ba2005952c04e2195ecd8692e1fbea2f55e3593aa887810dd8c9557b6394317e04d1d0c80f7772ed34535a10633a6cffc679e2d4ffcfd64caf167d15f5dc3a5d73b76dde8dc0d0cb98be533ca8108e1336452a19a34b1bf9a61b469f2861a364254c28725a6fe152b9a4c130d61d5a9bb92d27b50fad6b92f4091562c14ee6a5ee8799f3e436017ef1d5dc5a3b5962f0f1f85ca366e3542ee2b0796caf78ad21cce30b25b5678d2c7234b566c29f5904ffb20e91d8ed27029fe036f176fca0eaf88a9c55e52749f295368b7e7877c5a5b0f123d8b2f01a53b5dd66138e502b1db3e3f3979f4ea15cfb0264428be618a099f012d670df26687b208d2a01d7bf60e44e026c54ec42ddff16175ed80db356fcf3c7cd534ba8f658ef707f8205cfa0f4583434ffd691b21f8c0bab0d962bf94a84a5ca7782f567df8dd8c2e5d66a16bb8de4c41e4496a6574bd95ba92d4caa10e33e3069b87ae38507569bf58855fb1923147d403df5b4fa186e31e48ccf3ce91b621198b1cd775b98848b4e00756aed8cfba079765b7eef4abb47bb72af92c645b2f13c1de7954322e14c46c147073526df3867925e11a98733175fb2fb7bff02a84331aa3d2672b68dd3c7787fbcebb6dc9695588b2ec473d7a0647593789b0a6eb4d4db7d6b5ec9aaa62ab6516c00193b0f41b700fa7ad2055f35d1f670207fe905f66c508e478bf6f18af6487388214b4d9ee92063db539117244d6f286a45517e2919d6af3a35f29bdafca75c8823b3cec8823423e49f036bae2f5f86ff28be87b214742ddc41ec4c94c1aaddbe86988d576bda83edcfaba021a66c9a12133fa699dde30f65a818f5c675cc918d6f6775ff532636a1e640dc082f497c6ffe8f1dbb37e95ee2af8a42985d45d08bfed19f057a9f0dbed572edd35931ab310d47cdc873db8fa0a27496b217cd2453eead9d39f75d236b2739925309ddae8252f999cf15fa6ec421a0bc879fb9ac191eb4e99c2b01a48529345bdc63754720dca8b59f8ed2e1ccb6cf957f7b30a55c87bd5afc8b11940d932010d022d9b49fb39d4473798d58b9f77dc20b1fe63e94c38f404cda9fa379c8561b57443ae83cc2a517b0266bc94cc73efa81304c33c4f70f8a17a9a505abf0411af5939a11d86f3cc8fba96f312915cacc7aae0944dff64fb27f94d523a2d98886f5030570d01615ac43824275cdb7166f90b23892f7ada458a408e0b519b21b7ffe75964a03940f72d007bb7fcafb74c53971b389dab2f6afa73f71acba987b94da466a4becee0a8b27f35e123ace4c7d1339a69844ab695317222180776dc57f4074e8f0e32f52b39aaaa6e9d6fec5de4e9a90725385a8b9b15dacb3dec5e58bc6703e16e4e31e7d78828a269a6fb17f871ac8ef64b081c8dd74b6b1c79a3c7b79a4f6a1b49570663ea5d4da50015135910a49aca60679ea2bfd8ca06510d567fceac7f47b55cfe18b95dafad9bd8f9acb47d6849d04a295d76f46d8a1b09aa87ea53ef17ef47e64242781035343768eaef975049735b58e44cc8887ca54650bac2700fe8600708a6ed0834bf4a1edabbf0f3dacacce8f53f341f14391a6ed56d38eeac475c9bac7de5efaae8f08070c26c7bd3a6d837b4b3b5b6b1bcf1f72b5e144d4678df492500733988fedb0b04045ea38b0891730f15dac7af215d165854723705f667ab0c23d1b2467b81c33b26f7a758380881263280ae6582529fef7cf69efca02fff34c8b87e27cb02f9f38ca3e9b672be602c8e229f07c02dbc41a3dcc05fb42909c5d7522b58fe37e8eab982a2f038a2ec81751c71756bf5e1bc286750b944b5dcbf5975ca017c82810d9eb7230e88774780af5fb49f219cea0844c2220d3cf12e8a42b44cf2631dae7bebc4e7fb92811b4d0ba880a80efbd7a002e9036638d13ed82b7e3a495378a6395811f8568ef4be90add9e427b951a629143ec0dc84d928a6e885f01c6cd9f4e11edddf423a10083e5beef8b6d1c8f297aa55504a010da7f661d18c0e2c1a6344220fd8165477dba81fbc05c755a258331f971b1ecb31cd63aca3b190dccf5014f5a18575ad8312fc406deec9c9390ec206f3d28283f06e09e81540a7915ca67d55cf0ff95b0662710590b8db20ed31651caf1cea515bf212e5db145dc5f3106ae7dd588aab83c7137b34cebe8127efa4390d1fdaa448371e3938933720a9e1c588ef083c6ae0d445ddc181cb295a322f5993adadf0769139b03bbb6c171490c4352cb600ddba11e77b7637a37619b962f2f2422059fdbbf27887963ca6c63f642cdba6a6838a4e1f8f6fa9f4de582aff846fa3812b44dd5f1548250e5b11dc74769326b3e1440c5978cf2f6a77e004390fc2f552f759759df3c11c71f37051741161baa45ee406ed25c809b4eeeb59fb375d9fc2799e20136a6065b8572744dfd9c4e600c731f5ad6a83227a004ecedabd99c93a0389faa3ffbaef152e93b7776390b2564138b968c7f2021b4c600fc2919bf3961ab9d4a8e699dee71f337c077aa8ba4a8b29ae49738157e4ad3b2c0d3e9e54782111cb313f6ce505ca2e34adf731b05e5ae18571da10667c90399ba5c7ac6c39be3229ac8b56ded8c94e5a7a8821bbe8206160cc6ad873cf0c0ce812a7d9b5715175d475b7cdf1a482df51a94392468eb32a0aadd24739bdd933c42a4b093f121d8ea1a5b5c044b7558d304b8324a45f3e8e40a9ab99b6d31c4348925b63fc5ecc6d0284492184a1621a960f6c64ae8891b9eda27cdca12ab871ea5fed3a1842c3c0513b281a6123cb91cff4467e701e5f25cd5e685f921ed31e35cc535e6da3ca8f97c50e21a4219d324094b211ddb05beafc4811c06c302429fd400aa7c360fa11bd89336df37bba423e62cd8970143be73e033662b7364ea136380ac7b8995c9a843d794c62fe705a105a1ba9a92118586fb45322eac60fed936654798b71acdc8c94d8dd24f7c4aec7ed080be6afb265b25f74e2874448a3551819b3e7dad9be9d5434057b092326027248c99db51a6b5c04c0a483da715c6da61556081dc86b001ed0a329449edb4ade48af3fd77a39ef0f2024213d22ede722923067ed20a0f2cbac6cc0edc36710d7b19bb5e5b5d099d2aa8331c0d98e7fd4fb33970592d065da316e3fd9538d124b14f23d3ecbba7369f234e3bedd3ca6325d404e079898cd0180c0bddb153dbec9e772ae34302cd270491bb734d91d36e0d0b09d448520c03227a45f5cdb0ff8aeb3048d7e2b8990f4058c0d9b8460a58171924e3340cef5110a04ea0732851dd52b1284998388bff0081d13e2d8be64805eb10228586bd0acf1c8bfe015d3e5e99e4631b3b82e7294cdfc089715172cffab28b420c7006e87fb9bbe65c6a753e3be20c6b6e9c93763f52eb476aef0657bcd8797844cd27c9794f7ab2dd3f49a0f5f80bc508638770a41986c38486039259b6a1da89242eeed15cda7282379ddb5b67655660d6f3c59d33f593150ec8bf9c67d5d8862fd0f8fa41ddea409727739867d1758f7d21ae45bc1ce91c2a37aa3124447d7f55871cc0405f7ba49ff9b715eedbe0736f256972a60f6fd9803fffa42b7f4a363ccb53730c12557c999fa48755fd370df48c0070428e557049b3f7bbf230ede0acded52fdbdf636da19131b059ed73b2e7d8444d796148b5e0b328e2f83a825e8f39c22f3d30a6774ee71705e2cba330c4dfdf82668301f16b49e88438d549df7541f1bbaa90983d4cd17e8fe7ce4209a9020261488f7f18c86bb25483ec68d79ede6f4444c6700bee5d1c38d5f2bdc91fde2ef3a3c43b221b70474d2fa15f59ed038c67b76f0065a635d69f2a015d103f2ee6d09eaf72be8d9bab28c746c904ae554dbe3d51dbbeaf5dc375089af92fe30c811a58e9f8e2d904fd8baf177e47419558af7e5130c4368faaed8cde9daa02061db9e1d2981d6280f36e555a7679e2704aedd0b23caf6c5caebb80a9baf50a7e0e7512f0aa4b60cd4f00da3d5b642d291022b85729a3860d7168706728bcf1293ca898442eda71c07a6519822faa2e3a77bba431c07f81a675934b594137e30232d7153140202def4dff5d498292a6d4184312426705fd3dbdf12f81950cc54a2bebda01add18719c51c6e6ef7a77ee5e205e3b5289799659c562752d9240688fb848166ad8869d1d370daa4075bad2c054956cfade6d532d95ec0b604bad6b0f23154bbdbac15e13b6e9f9a404c31f78e68d7466938147b44854c5de104b3d3d9fce6bed484a338885222de04012a9aa3385232f804e64ccb9a6046a07c6f604178418464ee32c3cb82ad6a3417e6cc014fad48376f73c1299b6b2084af9ff60ad1e0d05a91c9f921c77acc6837494b24e50d68ee4398cd28b9cc0dc57cf7262e2caac61217adbfe4572ac13dfccc99269611b24acf356e863861050d83f6386f0b8ac98dacab1166c9318f0fe2fa00f1754328f435f8332125e34bbba87288a51dfa1d25edfcd5cb36e334e5554cd973a54110733d5907f383db7322ce758b6bd11ade6587cd1891c4ef9456f1402bc412f550cb3b40d5418bb80858123ffff5710cbe12366bb3ef3b35f3ad902f49ddf8691fb58a2d6557fd65ecded1f9b14dc52086c49a8761706ad44c87f978b8d3d7a0281f13870e59ec7feace75669e2cd4f1c9528351174f616f0e274a528aba4356a0a79dff7c2d853b64002d9d21174a4aafd81b9662b4e3562e6a3ff82321fd0cf88b5cd60a872f73d954346c2aa61acfc8187557ff13269ad9cdfbbf6934a60acd2031804dc73f8ff41a0d6dbe692f96f781c58eeccd902ef6fc2664a70f585c8ea9b99f069424b8ab39f95c234b87e3ac9725cb5804a8165552a704cbc5b5a36aaac6f562cbbaf45c7b0fbb6835beb46507c26d418011ea3cb1ebbce3147686d573c660c2fd6c20ee88a5651ea54587da7bd581affe9d79dcdaf29c3e87da7b499490f7f1c0200dadec2525943661e9635c58d2f739ee4479048837454739114c5d3efe13f937b4cc0be23de669d8bfb0991ff230dd8202753f4b5800ca8bd8343a8c34fae358ac199b00e2796297202edf2045967350600f2afe13f8c891c6155719a45db64e1107845cfa3494faff024700b7179c26d4706293b7e4fcbe454f023728c09357ba886e0e984fdc99a89222dedf03bc1b37c51b86b1bf2eb1805b90a5a569400f16163fe63f5d33240c3d1567ff45cb557a45b1b0e614d271b3f0bf6fd3240065fba8dc3c3aaf7ebb9f88350ed5a3d8f4679d0d38da9743c27786f68e28e7ffd9be90d64c0479b39d1bec1554630631ffe95b0e3fd345f950adaf83916efbf8fb71c150ce5252c9f20bd39b08b13270fc442a612f175e3e2b459abe9367e49f06bca26d6607e4f79d56a7a067bf789354a51a345339786c2bea5552a9674351bc56d8e2ddcf41b22a312c4711fa8da8f85b6329a7346488dbdd7120bcb7b5957a9507992267e2e3e1ce0b8ce0be14aae0e5c3141d9bf6cd4b94c663b10b574241549866e4d024b0381ee82eb8d88cd39a0982039647a40d63746979f7aa87abc0a600ffad385f6534ff5353c9c6b9c47a005e0bfc3e6bf9ef61dacdd8b5b1e4638e7b11eca5d075e3dc6c439fdc760d9926515b5fdb1c1542cc8ca7928eb4e60d901789063882644bdee93c92b6ec8198d821fbed4de6d3384ac9fd11e501b1a00e819807a9eb5f2a6bd9fa869b30837c802c07858276e8a42cfcbf0c5e7d5f42985057248e68b89401ef7fdfbf8932cc0f8477ba7b55e0d4421f829c6dc29f9ba9e91d45feb399126827f4bece15bac33cdd83d6cbad29b435ebc608a99fb302256fea882aebf9ea462160afbd5a7415bbfd64d8523e9d932be240128ab6cb715cc16eeb3791dff82ec66a5853bb5c9ad6effe9853b119820af015b0d8976709da1106b589125e5643a53a5b5e9b5dcfc5bdf29e145c099dde2b426e9cc8493035209a3d4ef43ba7dd4128cea3681feaf9e7d36d51ea4e394662eff6041540154a25e2a352f80c96353789c26a080c57157db472f11c19bbe30fbe1dc27207ef3fcdfe017f7afd82820016c14ea316caffe38a57d2c84645a437e3860aa4346ae90d6d1b49b9596b26c64df6335d112f7dd363b963429a105bcbcd30329c927a931008c73216e8134f08387f3d3b97a79022df39453bd0639c042b67cc74a9a613706ddecbd6d88a21a9e0b299d7181d6d002d82b5fac0f65873a7306e67dbf3e0cd6e5491f0da7cfa4de7c697313c5ae7505bee44fbb924d31d5de9894f319a54f6272050fbd6d91352a458bca1db61848b76acabd8c0c1a569ef6d378de18d766d03101fc0aab53d23ea7edcb00740c27a34f464f057526c36faa94258cce66e2cb536f0eaa4e40e00328f8c5696540ef7ca0d21b0d09a072cd3c25c21c80edcc6a21626f124ca2c6b7c56d51fd44409a8f5dc25093bead28767558be4378f9b35f0ae7bdb212917d2094f0e774357777d646c18f3b849da826783550f45f2fa522d3d171f7ca581259e80ac852e60b43ff6fbcbba15794ee272e7de0e2ed5f1f53152e59b78ae5c40238845d8d9cf9db35182b240fffbf7782649a0665322387eab974a5a2ca27294a0611bcd51d952cc96c42e1d235008dfbcb60709e699de2cb9b2da4c81bcc52a4b927cee1ba280767feb51aef0ccca6dd9fb56a10981b1f5354dbea9f81b6b8d061be0a29e158d61754837a7fb2dfad2a6bed7032b5668fd22f69ebdc76d8e6c7f947d1878076d000c426249ab2783717b6052b29b29d1af4b978e293ba989730f82e30d7d3e46c1c24e383a9fd39324fb455a23ea4a33e69df4550f4ce6b6f7aafb3d176e079b880f6e35096f2384498747b66d44c97237d184fdff59bf4f1ada6fc31c685a1a2c3bde23cefc4a8252887f4866590e1cee103567ec5f33ca40ef8d43a74b9420c5b8448188d5cbd8b0fa5c20f1e818c16f414c41b75619522b0578dc5f3b4407b88832cc36ef4029f135977a471740ff3dd8d65396dd2e7b002c69a061b56e58d347fd082d60fb4af96a0221ebe6623e7caa481a0c953a2a4a34f425a07e091b744a2aac039c7a94ad92f92ad4aa615faab1e6abe67179a438e0736e08d3537ebc52bcb8af02e3f8b5540cf9a04f5457403bbc92168f29bb22f012e563865a52a0dbd11cda5b6d9b938b2bd444ed9b4580b67ee17eb4ebc567e5a2541243d9af632c5125a353fe88e5bae19d0298fc0293a445cc133e58c67dd3df922e405d6e5a7a6ed3e420ac8b9292a46c50349f9d169d5ac255cbe919adcd7d4deee0c9444c41fe506368c937362bb4a47b925f879112a2e3f6d1af6bb9fdf72939f4dfcef9ec3bd532cb9b9c6e34a763a0a4da142f9aa6dc262388d006a2611b52ec329e69fe3d2a4d8c85aba48eb0f64a4ef6f15f41cf90def0c590e96588303d63ffca028e477220bea582a65a9ddeffd4851ba789cb2d3bd6edeb89ffa6466db2d5de260d53099469a070734f30ec99a5f08e6650842270c03eaf5dd697aa8b98cbcbaad48eaa23ed2441e9977f2eca2f05d54e3832f08ef9e20380c48baad5f69128cde27a3e679fa531b7bddd2b0262c737418371c312ff56d02c67d84478affaa45e39284c39267fdcf0ece7d29aab2a0af1f0a98bdc20b1d0c48016dc0c6684717d90d2b4ecf3a34fb4da40bfb1153752712ef3873cd746510c66289001a6728e434f07d47df778aaa6b245e2500801bdef1df1a666f2e4f65135457f256b8b8474e55e91ad01c1a83d5e65c9926d6e867e9573da8f3a06581cc67b348cbeaec7448b47008466917605b2833bdf4c27a11bd4a8d65fe97dbefbf22de44339ed0dbf0d603040932069a10495d2ba7919697afd42a1424cd84704fc622a6e1e3c926b2e9073ea2880879a1a2a36af77395fb225f50103faaf2001ed30bd8475d918ce21077094dc7723e8547b8e115cbd69d05e882b207408fb9f08606544c712e01d8dcb5883b5f68b4fb488419514051e18c463a1fbbbc2a0526572435f61fd3bede480cef3231c58f3bac50df70bc35c7d460015b0de62abe221fd0eb5434a5f64ac85054b730d9eed7fc038656ca657152b687b6ed66bcde6c2ab29ec96daefa810dc37a7b39dc72a1e155333eb01c67f40efb4693b0686d8bd1ad6be952aeea5b62af05007b864836cc7cd91875fb84cd893a37ee6c19d240dc884561ed5ad75151c72fda6c0a6515222e424a553b173d612ca6781e3059374fe3b1cad5c5f9a864b8bf53dce7fc0f71feb575e2c9e2bc15299836acd9c814b97afc1912d571d870920a4763baf3a127e9b55210d0da4681df63fbc18bd83126a338e14bc52092ef000280b67e0064210ba7cf92126869adeffcc7644012bd9319efc00f2861ade1c6c506129931d28995c6a908e4fb0ac968633f9bc270578e46eaefd3a15ff09ca34d74386f25df0b61ba5eda9bcbd1b7dbd4c32a1439b71ee041be4338fd5380e02036c5e5be976eaec094c35bdb6a4f846bdad8cc5ab45c6550efb97ce09841ae84f034a136897e70cb8c741af8012edc5d21ce9b8da2e1f396badbdb8a3e578866f5a793a21e73c8bfaa86365573365978ab5c2fdfe2d74136d353d90089b315b5899dead154262e5ae2644c0af103f23ae8b499b3585230b9bdf894dfd78def409a9d7f9d5dcae12c412801939325e36facd39149bc2e22bcb48e426975138c9fd3e40a6522b2d710dad476ce7383f1251996e18262d9df161d342c2f240e68c229f06f651f2d931c468d46b7b103530e006380bd6d89a4dfb0d87243461f7576a25427fb2b420ee118843c83367ce9c28c42ed582c3706f1836e8807ebfcd5288409f829e4949db3db0ab5fe44e8b830228022c5e0914d89ba00e2cbc7015982b6fd598a8631fdee06fcb760e49a33885630ee5221d1d4b9e09bea296214c863b4733969a573c970f490325f28b79c12758a697fdb8719d74960b3122733f1d2fba98d19103a1aaf987230a474add9124304f158729a5d826a042db4f7087f7394e4e3b3252a73e8249525fdbb45e6c689a645628c5fa82635e0d6436ae330de8586caaadd26212a6f033861760d098e12c114adc47d7094a8326e2544f322c31ddc50c464058698840eba985f27333e98276251b4e5119a360355dc8946fd22cf8a6014380187c5388dbae9b315a5510219ea36d17e92770fdc06985af25a166923e39e6067b2053d14928a4e6e5fb1ae44ff5fec4b83cc70d44089140b7f7ed7270ff75d0d9b138b6868243303b7b754f6b09cbafb79c2f3c458cd8f45db82dab06166c0abdda037517ac48c963ebc73e17459c285e6ad525e13f2c0bc355d6df1481b70f671543686093bab666402b64b45a9b8b5077b6b455a6b43fa4cfe75a95e674ff51d7cd3fd2b7caec82a01f1427f30ad53f129f46aa9b4619240e6c7e4a1ce7f03650aa2dbf0446a6f08f78c3cef252b1cf4e119cda3824b94f18513b3a075da3c0116d117913190d3380245d64bc634ebd497ca0222c2b7190159995af181b12281765b6658421bb4bea627d11f09caa720c2c0db8b9eac87937d06caa68efee3f9fd0cf586d1f8097dcbe5e2919657235870cf145820761d7b257077af5b25adf9e7afdf7650861a09b63bc3170479f296516fd1cf16fd5255524782c6ba45700f268bf3589d6c0327834250e6f418f3556f2f78eabf47f1b63b8c49be1e1d74a6f64a2a4fc979c26cbb7c5fb7606924b4365231b6e2196490da3ed84a837bb4d0578c3eb127e8769a1f686262ffb579ddad09ed29f68b9b2d851e1e9bc1c8f7c489ca846ba9ee92b56395fbc02cce6bf83754b7be415b13dfdc6bb0a054a7cac2046fff9f1d111a0d1bb99b48a9e19421a4aa224756ad276f011f05b2cf561708a4932169b1da2e0cde348ad17f9ab53b6de50ec89eb622b1caa2c93f4899140df888e3e79b61b14892a841a4acecbb7faa5102703411478db63fb87bb6900ea71e32695e42fd97f4a18c26c0d32074a500a15fa27bde909e4448d27da6a93b1f02f6632f65aea647b6b3bc172965b66d68513ac2eca373ccb500a5fa984c2cc2686e1753d47f94394e7b13cf651140889cd06a2809b7010575506dc1db27d1f6539aef97b8aa553305c306e8195e76329e57675478471df9211e3940d4d7d288dfa8b5bf4ff9a96e37c31329e3cf0082b8f2c8ec93067b4d5d6f298aceae818572868057f8f6ab8b2ffeaa73e37cd730973eb25776b3e237c90ac79b6030cb7ae61bdf462c3b804fbc5c8a0d63b32d70050562f87caeb189291f18e0509d0734aea81d03343950a1f5d7904ac1e8f411f62e8242be27e0cd1402a267f42e47a6835e48be2418ed88f33e949a1451cc3211f76ffc91ba8595911b52717f551c87bf286dc2e738c5e3fe31774502f94b2c087d37e2e01213e2b4130e6b015a4a81a7a75f6227146fa1c4b23055d373c6edcbf64faa7694b96285b20bf4f4acc5dd990effdba76679b51b41fa75758e85d6652197dc2059faf42df4073d9b4805d04542dbdab1498bd032ccc08276edc712df93f67cbe43102d1ea63b39c98f80c8b3e907eb911cfe3f1e59363c00d07ad9bae5a62d328bfb0b8a2663b3021a1a7672690b4a2d1874f2d284ca6ee099c515eb78d3397eaaf6e33c6ea208be2da0b4472c19ef83bf7186670d6f5f5ad2c4e9c4fa2e19f2b0c3c06326a9b0a43370871b3b4c8bd2c651fe2cce4d6ab725fed51bccddd33f4eb9a5b071528e32bc731c1924bae3ee6abc100504654f2c9c1de86c175e20e5626220cc950383af05f088c68716d29e5b372c209cfb467f6fa60485c4c46fe6e07d6941d80f040f46d020041a91bfd904b35cc61a58635f4df38f215c28225230fe0249e63f829e60a319fca3b2a1271ce64628a463a3382220bc1cf87f6331e08a51f6f0bf9399213511b8e1c32e1afe5abb7ed4271d91bff35fc09eae473a6869136192b70879e6e699f1caddef43039f19ec3bd8a5f0fc8d6ee7d865c141021395dc66a490c7fa14a0dca51b210461df46ea2740f16e7444d9b15350f4a22ab80e45362225ce51e946519faa2504b999be6e7461ff9407321a0b8974221fc98f03518984c900069edb36ef926f07f215af50c3c4f2587c8722550b8cc4a44ee7e4978bfdd07714192ece1480ddae7e6c04d3dfa68e2cb923e7b8d6bb1bcb41270e80e14c7f78f1a7ad068382f383a2d34caf3aa40a39aa260b18ca6d177b59b82e0fd896ce95194c21f470108844b584ad62b3df87d50b981f3a5b811daf2a2191d1109231cb976cef13085da53ebce9929d7781eab65c5e7c2f35b6a1f30f9fc389bc3a153aaf93446340a725f467b75f5d4395d88bf540eba7e56a2718aac413d5d7ceb69de512f37b5f4bffbac0658153b38e5ee5c225d2368f955da29a67d1b1ce0ed6928395de01472e47ff295588933e2bd4425119ca10fd09fc041450d01a85a6587a5a6a49de1ae9a9d87e0b708d540563f9d7e420140a670b96793efbe9c3ff3b86f6767681ec96969defbba584247352c379473e7363f7eed562f329f932556ecab9f516af6bbabecd6eb25eea6dc208a86d83c7f1a348796ca4955c9d35e091dd143a027b8898d5f9a26e3fb0d1477c446952ce00e58ca22aaf4bd1e1d6247a0eb03fde88a8e87354981faf786c6bb41113761d35536c69b31ca249c952faac98f5771ec13a3f64833b834713ad9df365f76bedefb163bd2085366cdbb4c634eb2034abc4b38fb0aca07bf624c6e71f55e939de14f69ef255d8cfc99bbbd3599ca0445022fe88c02ec019e73a11c73d8f313dae6c18727762986c9a10cfee175184a4b2771fd373807a1eefa8e7115d3507b1e2c7535d142985c5f53613292a7f2921bfef34ce27973f32a0aaee79bff5a5f4dbc1ee71ea3998632c9cc1500d97ea760f9012e5d30b49fa5d07c933dd555b1f69a9282641b7f6dd687cd809758d68035dc0ece4c0cb7e452bfd3c42e7c87f2b4d8d290a7e071c1240409e36444a28cc65f2017737349516fa7e1675a781dc7511ff5786a997c9babc7d7b7b7c869190d3bc476d058b29a33246a89f6a0c4dd4979b98084d61fdb2bf3de3f934d334c19b4078de3e42a37f60b3b1dde78daf15774e7a138e8776ea4b71a35fd42689cc72fd9730a776d595b707b64067063d08e75299e9e0c313b00ecb56846d55f7abe928eb2b7db7ca44b893c86a46057ada234063b69642bcb41d1f3f8f767d81c6e2b824ae531f67fdfae094e2db5d6277524f53a5ab453df495bf2e19dee3842737f2538e099d090440b290a872d6e8fa1dcf49bfe9ddbedb3972e8aa750a91bcfcc1840e961fde5cf58665529d4a280dd757482364c91df3733c1e56e87281e9a1130d37004ce1a556a65e7ce9fbd5bccaeb4a10d4c33d591f18bcbdf02ea4e827237893d4fd77a9e6b7b42ccf08387f510badf03c7b803c81d2c8408a3109501aeefe36660b7387f9be227e79cf4a46a30227b9504ae68036972cc71bf9e0348682da056e537a3a8605fc56fbaa20f26743f660a0b637e50842f1ac8c6c7f448c9ad557020c080ec8ffca213465a534940063d855ea9f345f892d032330e34b6e18292321547ba5af1dab478aa199c1531618992493c7e9ec9f9e0eae05834d43bcaf6ce75fc26451e8303fcfb78402d42790e00a0f939800c72bce62d3d454772dac1f0d8255abed06b3b7bc37c47b3b0e4c13a15bbbd3f7089f6f69d00bfe64749f7a749999cd3200b5b0401d978237176e0337bc678b30ccb513e6846e312c3b1d36a99101865c22264039f5e79733cb29594d491c77477aa27c78e0a23d4a50abdd4710c02a6c008c935de6d502e5eb3df3086f2f4c928e75d286c3f54c6947f2fff17b1fd82059e6b82aac24cde34b6e08936e9ef3f47df6e8713f1aa5d4641eb3c80b55ec327a8c0167a47ea2c4d9f42d5f18aee65e957701d572880ad7a01762f4b5054ba90b74c3ffa19775d4cea36453670dd3b34938a4dbb0092f9a5b8bf8da61c653fbc86fb40abda35a38e0e931d8eedd0ac7b662c01e1ecad024b0c6e3db7aeeb6cbde6b1febb1aa2685f471a5ac22d4b877f4d033d2c8ebe07f8d3ae254e4456fa73b487c943fd9a5c143955b2659fe299a375d25f12f46c7dedd1ee267f5e006842539e4f1950e098eb88000b88a20aa2275f3056fd468e3b16f965446fcceb0d2d2e49f0b549495eca56708a429a9cc1db4773b5f761f0cf8445497dee7596b85d514dcca60f44dd948da207ee07f0c656290f9405916aafe3a84753bbfac538d27922947391266b31874967003d6644642484c3b33d75e5d0119f4753ba0551918abb57706adbaa8ea6d63166ee27bd538ec54c43d889bad3094a9f8eb5313d6caea779012baf7e174434103a0cbf0a05add7c87c4604a2a70f03adabf6dd83c2c0e96597656f4e842502203398a7ba14ba2ae49348773beee35bb0622d31ab9d22804b60ffcbd0ae61ad152331868a6882bac00914947fea1898063ca54771f5098aa22f4510c1cc34565e887f3c074b37b7e6e8ffdcc047ad30d1aa07a275131d44500df759e390abf727f2e53535ece72cdd7d2835351bcc0c8f942cd5a6b98c9eb9cb847d5cf5160bff585735259fc1d2af49f524c57b23fa0df3ca24b736c0d06d94162b6be23ec8f388abbaeeb0428fddbf85082cfcddaf2cf92651f56d16a626030883ad83d5a999989dbfc8c0785cc138f444a4c8f886756a78d65345fa93c3fcf68672c1801a483edbe49a7cbb8c4c74cdb27f8766dda57adc96994b4dcae51962d2228a2d4aa0acb4c7496c5c8d7966db0e1ebdf96f298765685d921b9a8749bf293348485dd0dcf04e8fbb7501662b1a9aea1913e5e6110e346d4569b5b0814096c0684656d525b51df18b75e45c9a77dbaac11153ebdb06bdee7192886d30ab259547b7be307098f86e4fdfa626730776c7a40fdaffe6255fd91dcae23bee4c48bb98f02bcc22444a1b2d760334e8111e53a1b54e3590f719acff3c0e7db16f0907ea3a9a8193f5d3ee5e2c3add5fe0d4be7852dd801791ba1e1f39874b00f98d6fd20385b7139e3dc7454219b32ed043ccb3737d403e6836b054ad4e761c02ad540ceaa5d64ca97ccb36085520d9b7c9c3c8ace025c61c6ced9096838e4f050214f9bc3958194c4d83bc5631ff386364250d790f5c532d5d1c2164908c54377dbd27da1be35d3cf18613ab90f3a48c16bd96169f130f0079b04a46e57c48afb53ef3fedd74ef061a86a681161b71bbc0af62afe502ef3ce7d801e24b1d409a91550be76ea11f0d9e8f80fb515c2ea2c5204fd30f2421530105c61534bf0a6e7954c87395ebc245de8297896aa0a052c2487cc024a16ac0dfcd697a06e4fac72197420b0de6ab02d9221157c7507b182a049c6fd542d3a1da58ef24962d4626a1934bc1f561161e12150fdfb9cffaf97ac947c2095a0c5fd824f01281ee2a56ce604612143b4b59bfa9cc401d1a270cdbe98061dd843059ce19d416696b137780c0ffe055b27e8982db68dbf223a73b363444f1e0b8758371290370a097ae0d8c2d6d7a1b6a2f4156f5a2298bfa1275da3a41504605c4d007b57a60317105f9eb5251457ac47979593ba6f22094fa401f0600a2cb7c8daf6e5d7dc0a2aa210a5991bbd76298b4807f2bc0854bab41c963c6d4a753b3d1cc839aa45c92302002b9b4f2d4d563fe89f8a0797b7aec5678998b422ecb32ca04e6ad9720ab5ca26e134c315fcb2a4e9debed7d16a19cddfcc8a204a1d115d93d235d2b00fbb300f16db5d01691891dc252b57bffeff54ac120f7df4c79c71023e4a2dff1d1d7e1c4ed9c33d0aa516a75daca6af03609200d23d828e5b3980af4ae0632bc30fa7c9a76a42a2e81f196626ff7bd4352972710f2e627b95337b39fbd7ce301196b36629d98ac9e6d00477a0fa27fd2656c2fc3ba84655e0de470ec6c035f8c788e3997233e6e351f2f2f1342160035f0bd7706b91245d9d7653ce18ea0eb8be2378ef790f5300aec71f8d63fcc68bd1c706112a689a5d59f4daf68a8debaf10ef7e84cdfa9213974e85b20d721cb5690131cf9960b57d9cfa42832670d4e4a89ba8306a7d00bdb3a0b1eb332bb78df124465173d7c69735e3729d0f8b617494d8d304913927b7cedb3e3d293f2d818f6884554edf9ede1c2cc22369afd858d9f7b520e2f435042d2207ba208d726f711ac6ec4b662f252a7ed865acb9276109c296adc9325c1dff811cd515a5f494baffdd97967c4d3fec857cec75cedea3e3b91f11c29f51ed28bfe8de52b2b241326f39c3d7aa64465ccb638852e8799af5367c23c2c7df932f1dc5c6f1db5d3905d91fe84b01ae7ef54f58b776df61433e992bd3257f1eb8f0dfa82bfbebcd4346b408123996e92bccccbd9aebf44ed2d759e10ff76e00627b7b9e3bada0492db2b3d6df3ed0790763904f7b14038609299e29f7df0bcad853308c78a1604b53b55c9bfb3357b0abbf2f36026c3365e0656a1ec6ee874628fbfb58f0e79e175fbf641ca63cca7556038f2f878250f757bcd1f7358d57e1738e5565735bceca363a24b7484d7585f6f3e1fd83b9c748dc939686c7abf05a87c95447f70249c89f279916cb605f1b436d1f01f8676c3933f8512f32a511403e778e23a85843b2171fad741e2edd92e1df11a00c5945046b126a06d00808bbe210324d7639f3cd9b0ba08cb49a22dd756ac81e6b24e9ab49a984ccae6a4f5dc0b3acf65af42fc1e665bd646ba98f9d6bd6f6be46749904d3bff2fd2aa02d8da375adbabf81a7d353ba46e74220d7a610dc18062c6779696d3b741dd98ffc701c09c5d5297b2bc487ed76d580cc4d18773edc6f783c99db232acc07b637075980811095bdbb42afad3befed12ba175ab923acba21ec4605effa0ef15f471935a0a0855277c5fc8b406f0f76323abf349092984eadb115d3e4ba8b52c88330796a7f348f0dd69ac6236396fd0295f3242762c62d2ea6a4980f369a37429a3a27d41e2e4f34bb3ea5f259fd5d134db8f9ad4c6d4cb9a2b218bc2e408d5d3bba22a117ef713bdcf6a5747e0c3f2e90f1157bad7a777638282dc009b266308c9ccf6d63fa3ed3616988e95849e69c4bc8b155ad68c0e8ec429220370abc6da219eb4cbbe7b9ea19b85cc943935f32f82b7bec16eb3474675287b0cbbded466f28bb14a72ba10ff47fd4ea083c8a7c9a1a6343b1636146470ab1bb3075ab2505216287f0722584c1bff28be7f3c16224062d40c9a3d16bd938e02afe9bbf4986836095f678d71e10b9dca3ec14abf8e5db2c60d57a3df3fe107ca1b26941e7a8e3933de52e8292efa65cbc3debddea6ba58d5239d9b5a6bb5259711869038fdba1a1320235a4f27bce81594c6c1f3d6ec6fbd4b01967f7fffc082915017204728c8a55ef1b716259fa5b8de6827d2ec1af69fc2366d99ae64f142505fa009d02fdbf7006b01378606801348fb153a17abc65202b39acda02bade00718900a80c2231bb9e6ebfe7141c07505e3b1ddf0bdf1f344a87e1430423832861232a0f01b5c686aae59e358fad3576de94cc7a8b3f5c46653e4900706300dda1c0e63238def5799f5199b92135c28a5b66ba858f6d595257b601e3f4a8ac6c7442b6c05a4ce568bef76551016aec04c7b560053aa8e0d0baee83d835f3fdaabc1f56d16dfeb108e1a6d3b63abf5fcde67005664dcf4338fcc83187f916f99a927af8f124cea10ac86a1f18b883ab859d7b48631bd682c1b71c775ad93be49b17865951570c2fccd54947c31be1ec0b74615f839ca31d3cca5ac579c283d3372c2f2682104a4eb8537b1d6fed532f901dd9921eb47f8cda037d7d662c18011e9d06a15075f60657b6aa94da1f1993f69a5f3ddf7ca10a27629f8537c47c1e6352fa4c934b10351208b734aa9fc2375c3b762de6bc02c19040e5e4141c42b2efba840a1ec442798e3f45fd4ee1704b7254d43cd36a528854e2cff934030e92ceb15a85184cd1f8670798423d89da4bf45d87a7dae63cb0047ecc25007cef402f27e322f2958813496f45c28efaf1930201dad8bdc01149dd33398bce07ae5054ddf95c38448ac08a1e8c9788e5ad3915f1790e65ef6aba03044f433fd8a1a634f67e80727df9681efbf461a4e3a464a0a5bacf718af5b0be92b5914865f7929facda94e7a3c6cba4057ef3b49c480ee169e4c22d3996ea2da802a63480372f7bf68cfb85ca063e6fc709ee6eaeef4c9c27fd8d1bd493b4ab474cf03ae760d7ce0cc8209950b517708b0d5ac0b5c6e3298f8bdf223f65fce7fc81bd810875d3486c3fe6c5f1bbe1f8167c14a8f69a2642c0971ed512a9091f5387f55142bb556c5db8a34dff046d2246586e01bbcdc2a12ac34b444c2611c017e0e8f62fe2db07b479abc375edae51f09d292eb18c196b8f9d37d7a4076e4d6957d8dc0d96a90735b50cd4edab1dc25a7a24adbb7e9b810354d0156e4d5781a767799d6405249d6dc16635ccd6d2dead5b7e7922ccbc2f6fc585dd23f6d9f5310d304f7b7cb76c2f8bb254b64e3560b03040d4b4226515a31cf68a29fd724b79fc04a8ae7289ddb1b30075ffdc1f0fcbc33aae75a5c93fd3534d5ed63db7d9f54571b43d94daf7e406a6aae2eb3bb601ea062493733a905c0a6775a6ce0d30fa31e422a6d9c0aaa3983a5c6bd3afec0917052c328dfbae740802da589459b6c09c7c8dcf90f465bc3c661ab302d729e47e4b2ec3c1b3df6552a454794f97ada9cc8f5e32fad67ca2c15a15fe2b874cd5f02c7bbdfa386be322cc1a3ad14d54ee271f8a610c4c0f20e0628d0d630733d209f9697989c3ef1c3469bc4b19610bf9e35cf5b0ccf1882fd7f4127932427300e2e818cee4cf7ca9c085b9cf49e55fecc0c4c1e9d11ff476152ff8d83f3ab005759085f5691ad58ab23c21287681a8e90f9dec702e76cb42e8caf45794a53104e95f9654f9d91431b2bcaab4ffb5f5281e67c42614c30016e34a9aeb93b62b1e848032ddb38c5cec0f123d2b2e1b2a9e220bf20ce0620d22101d2fcb425bba49f00687743523f3456f5c9eff8e5919a47b28e4a0429a6077f2989274f02f43f3ed61b28c0cc767add2aedf146fdc8fd37ab153f97d2d599331dad551c0863a31527c49bcb71a6025ec26d4e86689a0ee11f98270329b969fed7358e8b40f9aa2ba1076603b09dbec62a300cc3eae49d0af4c403142dd2b09ab505c2004b4dc2359b020b2e6008e3fc7e66edc7f78b2b46e25e57ef459e9ecc880229123bd08b3f8e63100f38611b325ddde77cd16a9b3b3f482d5609272e015872d59747f92dd3fb01ce05f1f4a8dd09b178dd69963f5905ca553f766a769fe255c5546bfe0c4177f7c6bb461fd9477c36996f01fc9dc2486aebf9bb6ff49b3f5d13760f0c58063343c25d40123a4ccb285af526a84a3a88752c3f41becb4217241bbd590e3cc11a2b2276ee8702a2c278111612ccaba2c900a8ed75358e159705d7fbd88f46d6cee52308f0e3d60d384cfa1e128bde8cbde5ba36d915d93721753f2cc0dbf7f76ddac484a4e3988ec69719fc9c166356a1118dda7fb55106246ada585282a1ee341b185ce0f69b825eb13c47f7eb9e764a33bf397f7292fedb71c752f9de574a661ef76b196eac76846a0055ffd52442aacc92738701894c7edbdb249175df809b65d365ed50a012a990b3e75a9ce024b3cff2180546d9e167e781ae7ef0c00c3c6fe089a6751e67a66acb45d40a508a1b4e472d1720dbe124ca530c7869d868dc6b1ff641e6e378c4730cdccf21428b715495677b7cf3add7513a1ccc9fd51a4101f042449d70016e3b7c5cb73ba3764d0464bccdaff08f31c020e0f483b6eefe27ba016654d875af4db7fd7b039a31910a010c874a7da005447928d012a3006b2748d90f732d98cf65c84c4a39ed9ad52ba740470a50e700301d7e2b2f8c17856a605f3f40c4114aebde80f3e297bd20ef210187c2f36e37730511b2745d77df4bacbaa72708cc7a73a5e3ea4551cd31b790e07225886b132e798aa41c6bb3ff958b3b21edf175aafd4a47faae93bf1041046a08c18b84a692dd3f0eac730709d663737fbee89947394f4a27a1ca176b3175728ffbe5a7625c75be1edc097ab226aaa000ba5cb75349a300d81f0ba06c1571fb1f1b8883fb7526d69042229cbb83950781dc7cb3b243cc19284ba5b41f20b411853502211a7ecf51b4d8de40da72df14ba4686e1a788374eb1a8c0c6594d73f2c823f69d67b45e7c33347e1948f89e3b4ef3297d1bca47c59c81e4ca6226e4ddb36c10d634c2525e8ef21ba70ddaf470418269cda4345638e9a8e783ff53437a45e59df4b35a82f4ecdf8d90f69ff5918c18b361ff91689cb6690b2b0dd097d69d944e5753ec61d60f4bcba3c344081b8a0928274f7686eb0c78f86aaf90854e06cfbe43a0e6aa3f35b606144c7576cd127437b3b58b9848c2b3c5f1487155a8d3dff5d78a49aff2bec37c6ad308d0f98067b12058ae724460c5489f4db29528207cd88548dc192756f4e0bff97575b8a8eca3edaf6d325478ee7e935d99995e001d1c7d854466f66d6ae5e72b023e8373dadaaa4ed0d19ad14cbe29ba0efee5edfe696dc84550d6064a5565d97cceee39e86da3d388dfd9edcc1193ad95f67a00c0a7841aa72fa4482d4c4f6d5782d71016af388e95712ef88d02f4b2bec8c65cc90d85238181fa71a75f13272ac2c97fd9de708ed0932abfee33c95b3b1418544f248465767d7429c79283ca8a96ec794cf2c70b7f6777e54c08ef0c814996ce573da943b628daae1738466a09ffc6879574cf629330fe5de9ce25577e8f400480fbf8285b9acddc08e35ed2e85b91da6d743987d6b7ec89a33ae64a47621db67d0154c14f5aa117029b224a666b8651ba699abbac6a6801aeac9585d586b12b27528ffcaffab1aa9e1720442aa6437e66c5654cf97ba1faa77000d7f9005818d4396a84434d76253f3205ffba74f65c23078095c58973553a6b7fb08e83f0a5dc8f93bc7d0e2cfd43d768d1da6912b61ea526e7dcb93f38edb899291a18a8e82773bc238327aab23f18294923ad54123fc4a0780c59dc328d6959bf8f684639e98bba37b4eb520f1b4d8695c735732bf4930b3dfd53333cf2848b383abdf92a9801b5cd204a3566adb842dcc9b82cd4ca9b378c206bcb34d0e8107f64582bcd1565a306fcf14a8dc4c863181fb3fe087d6a9251d324b19c7024d4e24dbdc2d5ad10e9ca055b7c861f7ac92cd04ad1e18f1eebd482723e8916eb7ed8143c4690f12d81c0c19fab4c427f4416707179bcefe8a979750d5830ae3706638120ba8ad651d1bc4995ce45a01dd4d755d267239af6eaaf1f87bb31363083be5d74fcbd78c6b0bbfd331c2755997884f793e44fede0b6d16e35b8e7c9f38951ae3c7c7b0ff509861cfdf230ad2fcc4f9108cf2faf3a4b88e6249f9d4acf4e7a5868fbdca29a2d20da20354c39b44e7b2fbb6e2d5eed05dd1b178de5c3e459bcfd131f5c39aacd5f3b016943424c0654211578c59c24a74d9378a337a678197217e192b3eb9dfc06877069c3ac1ca36429041a3a5b84b59f93c088666107a35e4ab93edc248008c9374dde598e78d024e1aa49ab245553850cf1fbbd44d392acad2faa5dc2b786ed0780efd566d23f35f55eedf4f3bad0ee6c65f9936456e2f61da91b591198825b5891aba71714f1ab129d0ee5083e9b7fff0da0011c956cad20d099a9601d0b0e33c47dd8c6860752df194b63d528045de7f3e4683ab3450e174bdb6723e5e795018e0420d64af9d0f78d49250e3d091f3bbd0bfe8e34c1d56d9c2f3e25ba4e7b9a794b7a3a35218f5ee7e4e46b283cec90a604294cdb45e837ea362e156ef3dd6a28b08e599f1c33bb0b93ce443f6e4c8b231bff486d7c760f943701b9d225cfbdc69e41ea7a14f0f2de922406a5aa3dd44b67855f311da36f0cbd2ace3dd46f3e37bfd892e80fc57afd3fa1c722d3971bcf32376c70ac61848bc7ba904d5619007eba2e2d3b6a87748d02dad1bbf38ce68f11d7c9049c34ffa0ae1ab64aba4c14a8a7032b9f80a6c60838c952c0d922019a3f9bf35a4e28f1c0c7df2115aceccf7fbc514c79b0718864235e79de7d43dc8573ff6467a262d486f264437db87f2dc4f3beef8c1c26caf239a533ae4923d5c7c1abcee1e98168a6434a43b3b05ec46062f3841de2d0916d6938dd3ffc48eac59572684ef246cabdc18bac8bbb278ef91655cb9e1be4d0fcaa006e2f1b6bfb36cdcb52a8624e20dd70084200c7460f3048d4f09d9f2a7c72abc819604ea4fc32a844195dcc1dd7fccde2caa5c88c0899fa0812d32370c922eff56d569a379b77810d4f5ff803394a2503ccea00349a6ff26b26702d45fc9f9a0c4d43ecee924dd2b89c02dc8fbcd46b26203179f01ece117818bd45a944a4fba4f84e528becd1bb190818f84a618ac3fb4a9e5bc8a1629cbaf58684be36f48730e2697eb4bb9395598bd930fdaa066b35bc4bbe02f5816fa4518f607c7d003b48792f80227a3a0e18de55a9cbf4423e807dfb80b7d2d725ac0f79f15f51874e070859c05ac76c23cd516d2e5b7fa3c38981148c2fdee8d2d19966b2afd2994ff27ff9b6aba892dfa721cd765adf06a8e19f2327f27db48ab2906e90b35303b5a7d2fc38d9a47088fb8136d8a0b49640377f6ebbe5a1307bf24da2c0490a3a2afbde1a616c24b07806c2bc4a7140d58bd4c74c75c94e94feb8a339794ed4a1f1f51ba77ffdf4cafe6e724fd84401462b92ca43139c325d0d66af49c318d1db3bfd20e038cd9880e552e3d5ae477034aa4453eb5a2d5c6321599c9c8cddcebd1d27d528545d395c10e8320d9b5b9a9b543cf771b0010ae142a33280a323ad9cb7e5d60e64ddd59244d7631674a49f39e3afdedc605d82245740a880f7ab9ab871d45d4393e881201f304dc05729715aec49e85d572f5d3a52fdf1dc62384374e095b49ea1ccc5d073448b0ee191332db4595e8f2663890ad092786571acbd06f0590dcafcf031fee0d067edfb3f8cf015cdb086e91cac9bca661467cdef0ef572b48097e8c851c23bd0f38cc950920b8c63990dfc8b6c0043d84ce7d211eec3105c7bfb4ed8a4a7215833efb733eacc9bf9be245d8938d9ed540ad866a3873a0358e266f999b2afabadc278219c377f522f1decce3d938ca92d31dc3317e0782c76356948ec0b411253fdd8892f81b657270554a5d1378b2027d60ac3f56e92343f2bf85bbdd1d9ba7aa6f08f32cd431ca5213bc654df01b85dbfabaade44d95c5b365d79caa20c8ba80b0669132499e580ceaf513b348373298c4c146c0bdec575583f07daf018fd163f0e6f985776e241c802ae2a57dc3de471faa82982cdf8309b2ada51709cd6440815d2c4a3ff712ecd16783b2c8a7336ffce0692e76a9132a3c3c0ddd956d4809d44293883f3ce22be8c6d7c7588786aa5b5a2c95ffd94a68d243f46a73b96c3f3a5d8e24032011d1cdaedc6c91e5f4033bb9a913c236a4dfb9aa63fbe623485fc926be15b05bf2752670cab8640c0e4605365253b8c9c5d3d297af23383fe0b588f54e0066bb0fafb0d8dec85047f9a41958fcdeff13cab985dff878eddffc927b2f19048f0ee713fb65aeb8bdbb7397e554005ca9ab13fcd45721a6c05352bfce630d100340902e1e3c81768819df4864571a7b9072141628ce9933b4cc2aced3e4cee5bc3eeb5abdfa9eeb8531bad3aaed55fbfad21fbcd87ced9fff8125813c304e216b770a93eab306dcd7352999d637377b05141f4db23221a47f12ea43d3ec54783653622cf1919ce0636cd0bb9a65a4e9e6333d8b8bf61a55ca646b498c2f4961a0d07c3a23ff02ef9fead75d0f3385af56504a5ca2b86a0d6912e2486291c962568883ff253beb073b447dddc809d3014746f81b28a40a7d42bb963b7ee797a139f36392c6ca293e5369f9285cb4cdf91f16ae3dbd22837e07063ca8989b7ff2dd5fe9a53bb8288c1138cd41b7d67911484eaa9e7cad3e373229ced3f279a390f07712d2f94f85739a7f298de64b17d24f6c17d812153a95909812b6117fa68076ab0c7c2fa0d90ee97617daf05988a5a8321b7bd72638e7b1de72c99b508cc09f8114d768c174381bf986aa480bd6557c04deb9a1e33d51d44d23cda4c1a8cd2de133d975489ebc6d56bf6aa3fcc9975c3eeb50bfc0ae1d9fe2d2588c61b1f06b30b578757d8f83eab1037a60586e7b9789acaef4b4484876dbb8e82f7cdc0932f993ac77d33b5482a88d87be1cc6e59e2a07f544a1376b815baf856233fbe3cf7a13e7ce09520041694f356d11e49392739ec6e886ae50de4b599244517e635e93fbe3d78fc6af0091ecdce606bced3d7d54a13e7c79e28437de557f97d82f120157160713b2fe284a9aba1156b096bac6076eef3c83fcc8b9935cd81038ff5f311197f3ae7094f67f757589bfb46b7c2abcb6a9375330088ee9612b1d4e63c4d82a0047824471aebce798bee442fd8453ac9098b33fafdf53285f37fea65f72632a259f6845e8e37717ac84d7fd03b4fb76a6390b40a3ea93c2ada1a0950af73467a7ba29946a1191056aadc5a26b80ea8d8eb550e0c865d130a4a16166c6f42211e885a9353477c9cafe1f2dbbde87f0196e8867412697a403b0708e657e7f90878e61a5965ec0847f8483bc7d98ad212d7b36fabc3709489a199772ceab261f3331ad8e57519d7753319bf8b7dd110ccc498a62da81fd3d603417408d9708a5c3e6029132d33aea38c53a5c700486faf8842f127abba70e03919537e6bd14f2ca91db6ecc3d1bf62ac8fd464ea686628c88e23b663dc8e5c7f2310d6b82191c6c6541cbde4db38f4fd6516df5a9b60488ad43630e304149f4bb611b885c118f5300ac6ddb964d0cad000bdb424a164c38e69fc448657252afe2f42710eb0e381b80aa2b470ff4a5cad99a214d5efbbe7d331f4be7520edcb4e35cc8ff7f08efb1f33a41adec39c1c18e66bfdd63a3729f709bdcb57c32b5f4898e789bb68dd72b133089daee013184453f50d6c55f0c305a60744ec7c416e1b760a6d993296e3d0f96dcb71c0d9a48fdc21cd60f42b4c8e2a9c9e552a3d86de63204f7aa4fda5e75556b55223c10990266e7a742b291a6604053def1970b8f4cb22b6cae8457e6990ade709697939ff0136d6ff5cec726002c6ea9123bdbdf7207a0a7b3b8b5bff744c69f49b4075019eceea5e46fbb0df7d8810e10e7c08417fce5b68f9a107d4c1fd961d8cfc3c252aec8f9563122bfd9575b08456bf1e502f16c69f361cc4b60d1da76f5482ed11ac9f9b696ff87dbe8841cb87481f7cde537ba7c1a261654c1f6e41c51a59067e87748ee84b434b7aa79dbd1fd9d75b79aa3e5d9c2645ecc13849f7cfaaa9c44c8f1874d558dbafae69135049e08f7b5e9117f4de4123436ad0c59cd30dabf4b844f09986bdcc258276ed8fc4cb18bc93dc1da59baca99dc887ba9ada5f3a628df3c1d9cfc902c292088b8fe6806e4067f3e43ac3f60563347f6fadc5b679f78b6011a2d71716d35021b2ea9254800992f2eedc04b20305fb1dd2ee3e5fe0ed6e44d13d497bc920a24621350d4941e4207efe0afe6cea3c7239cec23e06e57682b2ad08f7ed686907dbcccf2e39ea1deed0d7e452d49686ab4814f60a9f7a508f02fbce89adeb6984afe5bd67671d1b3fcec098c784c359eaa7bc4d4fd5055f1abbc97650de82ad2f4acb81fff1a972844a45c1ae548639be28bbcbeb0eca3970ac82bc662091d9c468ca283b545f431de3a09c95c822039bba3d8e48161cd0fb366b439b7af70f45c0592efb687d9fdd03168e91cbbfe10d683fd8a3de7d19401f10f17f9f7d3145eb6b4549c8937f55f9789d132d4bdee2249a0f5fae70c2a682f6e7e883217670ae5ce50e8f1392aca92fca771c8d15863cc7a6805d1461c24964bae1db17539d5fee341353dfa77a1df0536acb9a4d95a57e012c7be714737923d7694d09382776d18e9f0092d152e822488b977d132f9d7155929d41fb359e71e601d8229c47e76c7202949b8d347e4479698cad8babe33b4910062ec33da9cc65624cdad020f1676cbd1693596b0a53ab7d0db4b6da38ef3372d668cb1d42581e5453dbb007f79f2691c1679bc12750ebe215e275bbe90889910f1288e55c703fd9389ce32e8f53dffc6f20202f5f5339d590a1c3c1fc2be973933c09ef6d5a331099df289f229e8ffbaeb9a9be4ad31224776b65c1a6f95b5d1d11376ceb485d70bb359b8a0ba2544780379ffdbe0de12ac2d2fbf9f9138c4f1aa80267c47ece3dbb6fe409a980393d43aaa7f4d301f03469d3c6a2444a6f9e7510c8d9c8996211076df5a0fe0c804e69e1d88ecfb3392a61d8750c7027c64bfad3072a130539f4340c1662bb06322e58e00bf7dcc0da505a95b0c0922e410494225fcf7400dfa51062b4346114fe8dd832217f2007b10abdf44ec5996b8d840875704cdc45b3f69e32fb1f07de5b43bdf7db655155e3b2643d968301f17fd38f26b4540acc7e00ea2f8ac7ca2d6687273aca6189e9924ab2f9fd0d8d523c700dd795184c9925c8f56d6e955da52caa8709dfbe17cc0e25f4c8d6451f4a79821c99ccd5443c83ec6a3f45b0209db9d3a54bded2378ddf3870a4e389b5e4eeaa9344b967de9da065d934f63583640a9e63c5708e20cb510fe48c3039bc2825d803598b3b3b04a95f5e84bbf88196e378dba50fac3121b6e224e1540223c78a5e61526070f3bb1f718ae5720e13ab9406b4fc844c032fe5333e2e3f5972e6fa7f7ea2f591f591129098e16f42d48134fdd2ff154e56181fa1820590682fe574fd8f1101c9a6911fff37d443fcfcab74a7ba5f1239cdfecd20d40d2d8a17d902ecb0cc6694f0c5a4161c6367dc0e0af8e94b0a621a956269d89ff89334663c424e3ab3dfe531743a0e5a288c9ed7b7031d29a49c49fc7a2d393309cc6f8ab9db03ab947a059bb8e260270836573df4144a4d1984804781cef96b6ce3cb636a52eb3ca4db8d12c87118af3646ec5ba22ee52b67ff93e362233e7f35606feefa8cf3f24016a7ef8299fa7a6f73ee6c2893fa4956dd9a3431eb153d1fcf434de6d08b4f50b2b8629b209edd15e265c49efbb9e8a60eff4cf1e612fdcb79b7bc4a42e0989e4b7e09ab7cc7ee95744bdea50aa951f6f2ef33ca3701ad18a6d0f1d89ea87db303b7242522b0658e017dea40a91ea374f0dfc901197deae2adc68fae0ece5865f08d2c93c3803f3cf00a742d563a3bde735074ab402c91f4aebdb0ad9b5a63d783cdec5d7e4455a555ac1432dd90fec4db60403b4bf9a656dc0db863e4a6bfcd438a92985764f144a703daf0fc55b2fe5b652b364dba38d2102449c4ac0885983fb63574ab8fbb86fb3bb448844868d5b49ccb700eabec3e7baa99ebbd51f123771f94b20e1e2222cbf7ed4f7138156b94268a578ef619c9c8168923cfcb4f5422783b3cb6e8c7de22b032a2d72febad0a52d077a8587e11d97073aa2f55f4dcf27db15b01c80f7b04983675706bccd2471acdcec69b84808e43d006436262194bc0f20f183709fb051922114c530445534c648aff69677c1427daf5e51592588c07ff63391fa4a5ccbbe4074a87a9c1e0e8c93485aa5817d51da3d20b1d2ac8a6daf76826c63d970b8840660f332ee554a705d5bcf494ab923a1b64d8ce6b32a64a28edfffd2df49a3c9193804e7b2b408c615162a538024e67fecc2c8822deaa465b7f5112d3ef7082cc0a028827cde3c6bea906d7b9a5d643dea6dd4827a8723949dd6ec865ec268c34b55a849b71230e8703156444942588c2c4ce2fe7e20226de068a876affff5a64f8a0b5ee8142c694e2839a927a57207fa51632e06626f3d64672b243c5a063c2570a92ce6b9f0e6aeaca799470b30c0eacda2915f011d8b4810b4fd107e316ed387344fae3ed25438b611215772fb87ffe88c12cb904b569b1a5bc11aaca490c973a583b0a98ec1196557c4eeafd21c567c42fbe6252a117c05f8cc8e2794c36473e222fbb11f7c892c39a3ef417539634c6b5b819db12ac988d081620a76763c9bac42fef2fe8a2e24f167527e22a426e7e1ed8c91fb325584ed154d851f79bee9c3ed70aeb7ab2ec70a589e8cab47397677bf2dcb9bf07e54f1a164ab7a5221a3eaaf4a0b7c4ca367286a201d97965b22b11ed6a529cfa70f525470a1906990f55f4ca493583cfced91b3471b5ce657246cdfb7d5eeb08af1381725d69caac5a825ca917df4c9f0eef6a76047bcce6440339f38bcfbf2c30471ccf57ad6f8a782df8091f7796a1fced72a52339f0925c682dd5b9436971b2e9cd9b16783dfd20fa6cd5bbf945d82355a6e68c506d6e1688167e1be9bab4823fec96639bb3ec05be73cb523465e6c5eee7e927b87336b18d3da5ff4fdae43fa0b40e6cb1930f703a91a3721d9a634d53c6184df86c0322e4d05a0e93fce65f0be536627c8a3d975ad592a1dfa3a0c3448004c9545b278f2faa4f8cfc6d2c291be0c22d1a16cbf4be7226311a07b4312e9cd16f2e2afa0dff301264d39c29a02ccb9828c4ca9ad98a916e49c4352aeb1fcbeed3b296726145ed64874851b9e036ddbc9359dfaea13ddc1b323349112d7300406456b5e56016172afd0b36a18a5de53f6a68a53aa1f1323077f2a1165cf4a2ac715509ea000c1bf10f56949831b0c1d0a99351373ae573852a3d9f8a75fc79cfd7a3ef21f78865b5e1b6b31340842249b6a893f51b41a2d9293a55ae1e1226d2389e0bc748dd7a844cd805f5a216aa6cd7e88ef5eaaa13ebbad1e9b30001127d355c0cc1c3a95442c78d042410bc055c4875749053875ac1b41c97d5ddb374cc836526aaabb0ca28574a03432e075296ffafee7c834d81196dbf7b144821ba2cd00cc201746c5d5ef34baf6091a0e149f11ef7613de548a684e75d3656afd891657ca39fd854e0aaa2f68d0ec72ee1542d9db9cd023f81ed71a993a857078cc7bd83366fe1927db3694d0a337b086c37efc9ff5925595171572a62ec722d8dfd3874a2020d401b197894dd1da8db968b34f3a58aac7e499d3d58f4a576b7a99463ec0c86611a250e040839700de9cd22e2e5b11123311120c744a19a971eaa8b791f2ff7c1432161285ab2577708d303af8e3eb5d33954965668e01e1a219941f8c47c2d4acae530e9599cbe0d9b6e3d9f85d48744b73207bcd3198a8d41b6c004e1d0f7138fe833e9c5629a7725c056a704574eb29f569d530afcd0976cc8a2af762c47fb3512a07cdf00036ee572b269f23cd8641efd9ffc5cbea385ab74a71adf35dc0518ca303b31b1474c241521b958c3347bad334d1d9174a94d375e6d346486ae3cc39e28c2847dde0c7d8309f3d8f0b777913a2e203739858d446349d3e9c47557d0dd02f8a69003edb35d24636ec4cf69ffd3be3e0274e087223b293d6377be9cb9231320c6147f5c84f608df88d62c53553cdbe6b3faa317f9d04c7b0058bbab6c359fcdb2271e4c88da183e62f95e39e2683fc479c16d4d5ce0a34313a4dc0f3dd4296ca8cc3dc31f76b273cc94d40071b7fe0f290265251aa74ebabef31d4ebddd0e9a38c3edd66928dc5f1653b9221b2b3560a2624e329d4e67bb5edf2c2c0ff023a0610944567acd87467846ca835a28316b5829dcda87056160d8b95f1e798ddb550a405d6452cde37124575b02f5f81facd3cb381be91e1ef3cdeab51f68c7fb4aed22b13f46003ee56f47a164599b27384815dd8b757cd412bbbd22806e1145137a51bfde27f019c7d11273e2785e35fba4b76acfce6ebcc46a610dc369eda74cc0152cb7428ad78deaec80062627721bb0f19dfe34e4bcd07e543ed7298933d4da13203c23d35eaeb688f4fa2898be89dd69bd06d7d170972db9d38c56c7f98b471b7d3ac8ef737e744b399365df1f68ead66c6dbe78807f0e9a0ee1d811db40ac98482a04c85adfffc3ed4a63477e6b7bb2ce7f1bb57457a06d3eba8a8e3a72424d2a789be569b331d00f6283fc685b6df5ffcc16c8bf048c77b55d83b9b3e174d1fd0542b6449150210e56264a7014f0e2c54f4cd2eecdab78ec5a4b5bef85669d12fa6421aef4af23cbd025ccfb7b487861262c5afa3df07f17fc8a6166ac82203553303eb31e6e79dbd289f1036475ba158e122062e12a0a7125b3c5d39dc8c6f7eac85fa3704f18278df1ca015794bd9c82d8ddfac2a11637f809dcd5472b1999fa098266e1e4c60547cb5f8e52611d90a2ccab28265f346faa9e0c018d3ee790460545c6b1d3c7de337d0ef6f1620d0f5eb4a12dce12ce39e076d664960cf2e5916ef06bbde7efb557850cf76101705ee492fe423e076e423ff3e5bdb6070053154d26e3e32245490947b20a40467f05108bf3b1ea5d560cf70955d0a5c7438641c8db5f5881a600ce74dd917fa48c4c565349246ae25653d900e5056a7c885ab41cf6e93790283ffbbf892645bf65c647ca8d791412293fa1e5ec3769d9c2fa6b02e1078c056958423d1a6bcbd2bbfb69e0378b1ab11bb954f3efc25e7e80367ab04950cc3fa0cb94582e030796eca992f49799799fa01a1b468d5a60fe9b8cc763b5ed8ccaa7d9114fdd1151b98c7bc3d0c1b7a4dbc2afffc738d5f6e2aecadc056e1f71b01d502314c069fc1dd2cb3130a1681f9c1193ff2ea3ff4c89a2040a709122ba13cfc6845e67adcfe4b1430fe61b946d19bc5274703c1dbe9eae3ee963f39a6f8035e8bbcb5b13642ded57da0b7f4baa45ac6c62a8f73fb5b8843cb2889ac257d5b14388ddbe9a9075213a62ecc25996fc0f2803ff5a7275b6487cbbcb6b6a938155515961cfee7415b778dffa42ff8506841e08547e69f33bae28dd7c8cd475f09af3dbbc3bdcd8f1154d1bf9513a0918d52e8996141ff6338716072b175a0493941171b8aa30c948118b3c32cc7eb7df8d3077b3ca37e5e67110f19f00ddeb6002548dc1098c4b27c01041fd76fbd81ff5f8e4a406723b88cb94537b8ae96b7b0dda3aaec5eb573a178c2ffd18aa8119ecf7aa233108161e4494aee549de2de037b77726d5cc96f8445735aa21810440508c6a829533b3225054d3455feca7a2978ebe350e847af100c82ab6d12f78e9632daf1f3bcdcf16f64004a1703dde9224248da0b5884784382d51bec6b49256cb52bfcd2ed93b4927e3da17639559c4cdf6882f5ffb214d206898746b54a3ab99fd131f828d1bc03ed9a9566bde82b273c6523fe9f49aa0c4e7e90692350254b17f1ecd35666f2cc37cfa5d7f0db67019377dc80815e5e813169a846f79e063b363b49ab8ad54cfdf3235db4d8fcfc0be0d8f5f0c1976fc591b76e9b4ba50985cf30bf6dea95ed292daee92e437bebcc625db98131afeb73fa1c1ce405e865aa9e3e78080542313401b4d371a03752af7c829bb3c6b1fc262030c316eb794d6c50e6561432da639fe2080c7d91aa58929db6fb7360f9cbce9a98e8484ab52957ce45fa0d44a9900a6d33d4f3845ef3d0ef9f274b9b3b44fb1fdebcb0f657fc596d2de09ff92284bf5f4d1628b6dde10994503699cbbac626da86c0e31521469a54100fb3bad61f327d3e8aae73370abe418dd19df77ec832e1ba59c5a02ea4e1e8e0b0005f0e85e331a702a820d11c22519899edbdb8e3e13d55df59d3eede9c356062963bd4aec85e85deec4aaf2d44d9b0d6f502022ad408e7ebe2c496cd5fe79d92c75216ccc54760899092dbb39e65c075c5aa4358a0f51002fef983ee0e1cbb219c99520ca4aeff054174f27ed4c7833a69034b8ddc3e9f58780faeafa77f8a685ecd083549f4e690d9f7cdaec39879f75ad2734185b8268f996b143ff94653f529f24756cb2790c4379cf829bb1bf816ba34efe7e6c864813ac73901fe4c8de2a6c980396c1c74f3e866dc3804133c8aad7b77fc8ffd088babb5a0a70083e66a2ecd2e2bff00ed1e7b6be80b4f9974983aee40133bdc000056a8cf5c8d0adf3b9ab5f34413bc24d9d528cc9be17ac6d51410c3bd9f0ab13c253083ce420e5f7f4a147754656f9493618d10c19ef525e3398a49ae75b7079bad8cd2fdd7a314abdd4079972ec5e1e644ba25a85fe6d3fbc4d73e5a8934c010baa67373eeb853c504961b8ebb587f1ef44b9e70c73588fd2a40962b0bf926b6bd86e23919027838f0ba283ac36a721aff08d6de90b07aee9e259e41407a8a21ecdb407fd42b7419150dad070baa3bd934021718c641cd707a49eaffb609e1f304ec0d5176401f77872396b5e4586f08bf678e4423144d488685a3fe544ee183615fdfa76f3d58fdeb233db1a540dbdf421e45425774deea7561028e014ebe854841370d7a6588c2cd0861987f549afefb637f2cf0e2dfb0d950c75b1df710f9964fcfa8f0e4d2f52a844bf751dc038881b905a6ad35e126d3e82aca96a479c661167d455db9fc317237b241fa00d3e6c19ea699bffa11a9b149d3043f9b36871b1e517d5c03d16a2de0532b7bfdf4b6f8dac4108c233ab21d5cc54c89ce96603cf8dd30ac0d638920a7fe43ab22df7632edc2fd3f94433da44cfb40e79d3eb515b563482d80b4e7489f14d1b8fb75add1cccb1dc836f3a7f7dbfe1fb251b5a1690ac3229de2e24c8916109b8b826c56f96a8e2f70044d68b6a2eba5579cdd5a0725c56acd14b502112f969d7e020962bc3583a3a2c3004684c9ebb828b54ffccc4e8645bf6ab08da7a53f1e8fc5169bc3f4cec0f6395a071b6ddd2cfdad0a0f9f8da59e29fcc443b2d040b81d6f87baf98e355862c88334020f977be54cb69a420aaf1b831f3bf7f5b3c0e7501c0452b5f25b46d8801cd138913b3c1d933213a032e9f29a115be53c1bb664f20a2d5ba71e14dbb475525cc2122f8af18b08a9bd9d9f6edf984a1682fe5e9022ed717ab4f3383cf17bbb19cd69f48f5a614450b4a5c9cd19f74285cb7aafd9fb5b56394aea91da8be6a169d07ee611bf8a4f992db27b0ab9075b59fcb664a2b4859961cb80624ce9dce639eb69f228b77d5458e778b5815a8b592140aedec9cf50cf4795e8bf57466fe00ffc3d329f09bc222cbd4d825538df924f34a077faa9c5f87f59e3f15d5680905e60f0ff2994af81c8de5140a2159e25ed52e041e24465e3227fc07a3e4ef36ddefde86bec71c3f712e96de6c5329a5cb248086131f07f936c0d9d23af0cb46b97a13d64e50c3c051b5d54136182149c2b2f64f1530da36bb4c33972a98fabeae0b2e7f6b4cc746c25f7044af6dc25e724e3200f5a44778ee417f6be26d4f2e4d9ec5e7cfd33d805f01e562b38c4d1d07812a66345e2368256e6c8783f2a65daadaf50f97873a235ccdbc486271d4137fdf7bfc067186c9e96b802cbac4bfccd39db9ad3dbebcbd3999a0eec9b1b8730721d169f7aa976eb76a8b725a23f8d0429844b868062b3f99fc5e045e108d4f459a7730fde4038620135958909e346a8a529d0ef5afa22d924382398121192bb6790d0b0cc528c0bc2674ad23ab8ab575f6966aa1a9fe55e66dd9fe512200f0cc3ad0550c5c62105e478ff663bcec475678266018f787f5eb33e2834becfc90c22b5caba247251729c89167aa25411b84537fb90b18735881f198015de6f2bd93c89ffa9e4f36f21f3f62a65a38a0898ae7f66bf48404f22b930fb1c4e0ed71515c6f9c37bb049be715d877585f66c85b96c24c79548f735574cc24006d8cd2c78c7d8edf006699da813ec790bbcac28a41ac9abaf6896e2a92f8111db3968111bc2214909b86c7383c17bcc2b1fc06442529b6cdf3058fa7ff01fc311b26793211c6f8fc042f38c07cd442c3aff094c967cdcb5dfd5f49202367938630b81c94e596e34b5b22b814550b4b496335f5383fe70fa7dafa9bfc2a479214b6400957c1e6515acc6482de7ff7666588489b0843b26ac08be33682f79b8e37c5db502db35d7ff3d11c229c76ddaf6c7c84a7873b1839bf12a79a3eaa2586e60acb09845b705ab5e1e505c6342d122de771b1ef1b41bb34cd19713dc995bed31ca17725a1b46c89a335b6df745257f673b36dadad3bf6395ca120cb8507b9964df4ace9d3322cbc8697626bd43b85bf0da471918d4c57d02d7c5d626ba694b9f4fcd11a5af54b9cd21da8b303d4df8832cd8de661c008633b7e671df20e30ec4f7893a096b9e07d0d61dff43fefeb50300ef1158459eb2922bda64a40a267792697ac63bca79914d02224e91ffc749b855c59d88cb346a8adc862103b271f12f5046433696b8b042f938b60aa818b70709d47944d26cc298f21afc9361e718696ef63d47f148fe9ab5e27d3542ac5f4d5ca4a11fc669e20ac92fa3d7ffcfca0af14e9d358468c9e2f3082d0300c946b46558f7fdcd36cc03b36c7ff9805145b3b8908f524c9d743b1b1819ef777185701ad6d3673e1d6867cac28e3a45cb5fb89675c4c58cdcbd4c91e8a2adb179a2a179b27264f6ee9549ca4c21730589eae23a2fdbdae6a8bcda1a48cf556c5d67681a6f014e1238a82711fbd687f9bede580a93f3a570298de737bb47cbcbab5888793aaadd7e9e3bdbb95056f20fabfe12939af8bf0bf0278ea798eaabac6c7c31e52674512c2e4486de83ae91e64d4cd9940591d64b5eebb441d006828525298deba38b65cc27a27be119b453ce71d2e8daea605384274227f78baa816664c26d656b2aa66b22875f7b33f5292676aeb3cc412e86183779ba63dfe2f1a0f6bcc27c1410ca838169f18708415ec5b918be4e0017d0fd72fea62c8eda4ccc1e716bf0772dffbbc1064f06c0c81898feccba3779307e2c275471202780d4fa01470d1660ba77aaa33f96427dd78b8d0c831d2eb8a957f5c2aada95411afd58da7bd040f3de45a5a3ac0ea35ed1a95a16158c0e57fba854eef9d6b2ae0421f57fecbf9aadba2518352d5a1c391f26cc8fc08c3b2e005dc589546d0532ec1378f6434357ef8f7a8e0f9a4202a57ec669e5818b6203a2bc23397ea6044a904e0c5548cffed573125c4afbf27e95b020ba1f279efef71e474bfcb0ea0ddeb34dcf66bc9e4f3231d9f38243c408c1a7d5c0c25fdea66f05e70bfef4e711e5f95dbb1f2e33ad018ed189f4c29aaea1544f5dff4a14ced50031186d1a232df364232e99387c3f1fadd90bfb292621216366fe0fc967dc4959548962af4c8d65842c37153dfd47c50a44dbcfb8e5046a8b23d03c00d15a054ed0bbefa88818f4f4077572e08b4b03a4b9b51579b9c9b1e4fe570637ec29794e31cbba4e7b3224d43607d55778be829dea00f584815e3f9e82697b2926b91c484b69a6ae84d3d771c4c70df9e8ca3435638c3d037b1633952ef08f7d2b7c33fbbcbde43304c0e812361fbdde5568bec1a935c8a5b143ae3d2679567ad1d07c1a1ef2bb0da863eb422cf7dba0a3eb310a02fe362e8dc083ae51b74bdf79e6d19940e6e5672b0ef7c0ac2be07b320a709b981a345b376d96ab7436f9d9edcfb59cb01c8b12c7661c8774eb1ddb7206e450f6ceb8e5c17c4dddaf3bfa0b7e24ed76b2e8903bb73a8ec5f6807cb181d77c2a572464fe98fad09964ccb6ca9879c427929af49cf45ed98ae0dfc89cb5c3ace0f420acff8539c0f36e82ab346fb7d958b4c2a24371b644a30d4a636a8005c152b71291aa23e956da40cfd475d7ed0eda6a2a3f67a199ab4928dc47968d309b864327c0cc497ae02ebc99804f2fe0b4aebceb0a12bf953be959ecd41ce7f52b225d35d7ca52160ad57b208d868c456e0f332064393abd503fc1b8bd647d13c9b18ee8bfd0d18062de1a2154ed6c0c7f8cd8f6682d669bbdc84e693eb19daa1325c4460941bd13a77109a2c86e09becc0d58b7a79bfd33e509ddea0bc3fbdeba7223568a4f3e377cb07e1cdabc1406f2e5165a4f39a9ee5921852125fab0cbfb10211dbe1777562568af203c27cfde775339f372e8ac8c0df12cd69f81a63856b32b0860c088d42895df40e15b5c295e1bf64d201cfc5a70a0da7ab98dcc6ee5319655049228782398713c95c5bd684e7da93b5ccdf1253373167223cf86f4e61654045424ff3dca3972e0dc3bfc40d8df00afd55f09df50f37ed3a9ef4eb859c1a289b178cda7d7024d2223ca201095b92ed91d5d41e6dd7ecc9b53f90493328a338bbfc6412b6fcaad156b02dcab60a468b92eb6406a80074f9351072fcfa0dcdcf75f83c5b767955fd585884e75d15854bf3d11654ec2f81f98b6bbb78862ad8645b010e1d0cf563c3963acdb26874ed2145cd5c0f7c2c5111cf9c9d3f8f72be58a6d2d2e0ab718e0940026647c293bac755f2bda7fd3e7b83c19cab8db7ee7937b2f9c6481c9a4ba5a6f04aa66c0a37347ebdd3e6a9b4851920309305b5c5d86d9bebcae1e4fbb00bd559ee46d3d57ee4237138f1f5b8a7013a61abc2cd088cb197039ed9c6b705dc0dd763d9cf8aaf47d4779775f754da519bd3396162ab28d05b7c2d94a23f6461da878a040d9112f265de45cc3cbd344d04db2f485e42f3900853f92ab7ddcc68c6e831837fde2da37ba96cc1ee62e8af39679c3ae6407322cff73d2e641b1fc32b5de4d2f4dd4e66c06ee5fc0a26a8b2129b75f9322304b585f302bd78014e5ae41cc30d0f277d00300c336c484cc196d12b453863a3fca9f9d3dbc574b34afa725eb0743f56edf42f25846bb4cf756d2d15163ab5f245a298ce46648efdeb6f20a69799ab32d9e06289792ae91a68c1cedf359db5e7e013b1e3860eedf3cd589d4d50f688b99e752c0b9ec62e04b2cb24567d86ae596a19f0b875f303b5bc584901f059183a082035fc45df2253b2a79bcf9b1e7b995974c7354af401aba6863c9133de94ff54279ede505ca6a56d1722ba2655176181e84fc9ee718df3e4803e0f20f294631e7c9d177720a2dbb383ea636f5c38fc302fca017b6efddb7b888e0b229c49a19961df5fb8947e2964a1e77b6f13cd4af2912c343e14452e07fc29617dcc52b0a9d8eaf1a810b832647bda33fcc8f904a406c58d204277d3136a9bf65b9db459b6755b21306694a7319a6164601c2792a3d6cfd5976cc674814fdbcde19d51a9c8584a2da3c9cce12432b93a7f1a41633d3246e91d5b612f022e9302b9e488a6c76aa68edf10077924712b076744e23af3b3b607b49854dc5350a59638ec31ac10580b4c6a8ecda5d80a6bdfb47559b8844d56f3c40cf21ac06b4a71ddd188f88538d72a89de27a82945cfa2d3fb8d1635c307d750ba688f9df95c82fbfa4fb0465482eafd18f551a36ca6d7468c1c3e739f55afd2eac3e3fd72dfb9d9f0e275679682111775d2e3e6f126a44c716d10963eb16842512e10c9e874d225940fc25cd1847deebbede0efb06356e29d6491d755c6d8f823aeb8332e309c3e10b497f7cace3ea28348248f05e9447725284120f93d49824aee18c87a00eceafdf6832e36c52e55b28e188b65f2fe241d0e032fefea95901e07bfdd766c9d348714877c2d1a2ffbbc5b275bb5ee99cfce33d76620cd904e19e9b4c2171b86d56faa1ec36dcc8726004cd184b7065b7017d45129b7af17f52c781cde1101a9aec9a7e919ef6fad0496b69806d6e713770bd0da20e94b6c8991e4350c5343962e9b1234c1c25bdabbbc8fb694c8fe43d7d829a14c4719dae38230a56b6b0f1780ce7a946eaf225b37c308607060964a1079c018b76b676c3a718d41c55c86c7373a8ba80ccb2158c606b6347237f49714a9ddf8dd01806cf95b4483488032a3322aaccf91c6940791689e0e9f702b99e359cf372a6f2271ca2e2e40405a3aa6874f8011b4749f863456896f14042f4029c58494ab3fc7691a5f65fb93870c7104627f310687364c2d4fb1381e34307e031d5d433885792ccfad2fba71c9a7aa098450768f182adc7ed081f8192758b8cb5650c33c931a7eb9ef99713d06ef117b347d49cb7b319d63de8cb80f8fe36bbd3a0876d19dc76da5ee343653e8cda20cfc732925613784a7c27996f6d11e0b3aa3ae581fd9e27c8cf8167e68fd0c448ebd1f1b691bde9c4e7bb12cac5d4b1ef11c658af4be84f40f0103716cc5483ffefce806a47c9538a644c4fb321adc05bb001689fa4fdb046816d224b8577d520e6548cbc03fdb3518654302b85403768c572fcafdc30a16972d35ef8f7e917e69035f25ed9c37c3e1fb7ce1a4ef66da38430f04dac36b9f683ee92282f70b91300e68869c105eafe88beaf42884d29286097d96926c33551d20639bdfa19dab1b36f1f036b942a9a763ee3f0d358fea9a6b1dc336715b4566bc94b341890ab6b0d5ac0a7c99ba6d5605b688690f2d0f8188810663fce62f33425b0017fc8b3bd5882e3af7d60bc957cd6b3a4bda44004f8547b5009d93105b5ee5cfbb10d6907406c3b443cc08cad35602d1bee2a8f243b6bb647c4002d9f5601c15f0c4854c4905ecf0beb97829ca1201798e098c516714a97fea1fcd18bd3dc38303c5e9c1daae6324fca34a8a25f029e4d2bc573abed4c3d492c3b3988186e919ba86aa3d726a7f749ffd56403e99c7d7b861d855c21f8aaf91027545a061159ffbb6ba328ea6d5ba15a94e7a9fb00d08c146d182fa2fccf593839fac23d15e6026c180c1329702fb9f100701d6db29b8e7b00dca4846c5e47a3bf1e9592f3f3b3b424570a4407ce21d52f74a17beb9b32ae0e3b2fd1ecaa1f75561c02d0f40f0030514a697977a2272169d604cf6f70a8d4fbc2cc1d471aeff54a24edcaa0132bfa75caf214203ff24aefc26c4d7a80a94b4fab378a116f5c30c4bf657e8f6cb3719f7a276b99daf96a505c090eaf317a4e4d90ed2ebdff0e681e3e675976eb4b11146449b470f3feb4d9fc32dda725bf125d4ca8178e6a699aae306063b3260b780687890e2543e9d7b38458a7a33973f6ad0b5e2c97caeb5fef1782f6d81f7660aedad4d57ce29b9a645306035a597611112485d063656111e954012a9c09c8ae31e7874457b00c0ec5c85b9f4543115fe0b274b6b7fd3083a3d884598b727400bc04fab08fe0908b776d4e21ba4dd0319e6a5f21ac53d98d0c86c855cd520c5f55ea724b343f61954d1274f364fc321a7b9e1330617472516f0d677235a112904ab5ae4cf04b2df230decf7427a97c17cd970ced8a361ab787f0e2272ca3a425a3d77760b65964e7427d175751156fbdd4b67eb87a8315153e9ad5c3ad390747864d4a6a42f376fbe3f82901efc16c958b275890ef1c351b961ec6b378b7d782775e408fe445f848fcd2e8b22ea6581b5b8a2fba44615ccdff4ecc003f6d02ef11d375452011d80be465ec7b43e84a3d91d8084dd5b6e083a5761a0bb206483c540ab3c75b17173d710377f4155d54cbce36e35fd42b7ea7083a7712603881c230809d112af55956d3afe976e0ff0d47ee80ce9cfedc47b662a9334eda3c68a8625e69fc3a7d66e0cb8285c2ffe3b84ac4b57592cc36843289bacf20842fd2731507709b95bc66ce8b7cac0b17572ee4264281bfadd0d75843fb554394114e23da664cf94a2f4542c367da02fd435e17879ae44dd2cbb871133d5c619507549ade855e9261de65c0e6dd1db67b81d3a0adb29df922e6134c8d9513074e0b687b615bdcd1bed71b5853ad2af042db98c5dc001e8ef985c35781aabca75a73c0ff0b7a2aaee77573c8c9d2e9617fb6431a12a1b02da1189229422905c11685f2acdaafc88be5ae2cbe59fa9643e3eb039d02645a755ec5b9b91f9ccad8f46655114f9e1e57b9a977da9288897bb39ae83a748e1e1ad9e10389312e361c9aad7c13e11587379b1b1d3093d3d87ce201e5018156785f7319cd130a7153062779b41cf7dd5f4cb7a6c8bbb9415b165bd4b9a62f96e00fe22d1c9cc4eadac340a91e587275bdfd461ab6f4e2cfbb7802afc8f5831a558cdf70270c68678bb6a493d9e0defdfc6d4335cf02661e924399737f306c4460511e9d85751450f02cb75f4e0049abe78944a0684a806cb97a4efb11a8d0f9744f73d15f67da4f93c94d4e98a4c0ab48a00a7ac68d7d2cedbe1c1e765b3c6a93ee5bbaa47c4070231d52b637a6b1a5243a1c6f04a01e94fd2b9a86bb3a23b1ce28beac4b71f8bffff7da9110dfb85d47ef198d2cb7a1495439ad145d2707b168d8edc761ed56da318728318fbd0724011c5012ca836c3b4a06d2a8f6837dfcc550ff4bbc91145701cd2dfd1e40facce5bfd61ad9d3b3fd366864676cd3225aea3aa955c464a77a4f88</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-wave"> <input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-wave">输入正确密码查看正确文章</span> </label> <svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none"> <path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path> </svg> </div> </div></div><script data-pjax src="/OLD_BLOG/lib/hbe.js"></script><link href="/OLD_BLOG/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">考试已经结束了,如果需要查看这篇文章,请与博主联系</summary>
<category term="学校课程" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E5%AD%A6%E6%A0%A1%E8%AF%BE%E7%A8%8B/"/>
</entry>
<entry>
<title>如何在PyPI上发布自己开发的包</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/11/28/%E5%A6%82%E4%BD%95%E5%9C%A8PyPI%E4%B8%8A%E5%8F%91%E5%B8%83%E8%87%AA%E5%B7%B1%E5%BC%80%E5%8F%91%E7%9A%84%E5%8C%85/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/11/28/%E5%A6%82%E4%BD%95%E5%9C%A8PyPI%E4%B8%8A%E5%8F%91%E5%B8%83%E8%87%AA%E5%B7%B1%E5%BC%80%E5%8F%91%E7%9A%84%E5%8C%85/</id>
<published>2022-11-28T09:23:00.000Z</published>
<updated>2022-11-28T11:35:09.000Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于发现python的第三方包中没有自己想要用的一款,所以打算自己手写一个,顺便放在上面(为开源做贡献</p><span id="more"></span><h2 id="Need"><a href="#Need" class="headerlink" title="Need"></a>Need</h2><ul><li>python 3.7</li><li>一个能写python的IDE</li><li>一个PyPI账户</li><li>没了</li></ul><h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><h2 id="文件路径"><a href="#文件路径" class="headerlink" title="文件路径"></a>文件路径</h2><p>一下内容以 <code>sister_xie</code>这个包名为例:</p><p>由于此项目是一个简单的示例项目,因此它的文件路径为:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Z:. </span><br><span class="line">│ setup.py </span><br><span class="line">│ </span><br><span class="line">└─sister_xie</span><br><span class="line"> __init__.py</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>其中,文件夹下的 <code>sister_xie</code>名字要与后面安装文件中 <code>name</code>保持一致</p><h2 id="配置安装文件"><a href="#配置安装文件" class="headerlink" title="配置安装文件"></a>配置安装文件</h2><p>其中,<code>setup.py</code>为python的安装文件,在使用pip安装的时候,会使用到这个文件。文件配置以及详细说明如下:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/usr/bin/env python</span></span><br><span class="line"><span class="comment"># coding: utf-8</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> setuptools <span class="keyword">import</span> setup</span><br><span class="line"></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">"README.rst"</span>, <span class="string">"r"</span>) <span class="keyword">as</span> f:</span><br><span class="line"> long_description = f.read()</span><br><span class="line">setup(</span><br><span class="line"> name=<span class="string">'sister_xie'</span>, <span class="comment"># 软件名称</span></span><br><span class="line"> version=<span class="string">'0.0.1'</span>, <span class="comment"># 软件版本号</span></span><br><span class="line"> author=<span class="string">'ZHYCarge'</span>, <span class="comment"># 软件作者</span></span><br><span class="line"> long_description = long_description, <span class="comment"># 长描述,显示在pypi上的介绍</span></span><br><span class="line"> author_email=<span class="string">'[email protected]'</span>, <span class="comment"># 作者的联系方式</span></span><br><span class="line"> url=<span class="string">'https://github.com/ZHYCarge/sister_xie'</span>, <span class="comment"># 软件的源地址</span></span><br><span class="line"> description=<span class="string">u'写给妹妹的一个小软件(确信)'</span>, <span class="comment"># 软件说明</span></span><br><span class="line"> packages=[<span class="string">'sister_xie'</span>], <span class="comment"># 指定最终发布的包中要包含的packages</span></span><br><span class="line"> install_requires=[], <span class="comment"># 需要使用到的前置库</span></span><br><span class="line">)</span><br></pre></td></tr></table></figure><h2 id="编写主要代码"><a href="#编写主要代码" class="headerlink" title="编写主要代码"></a>编写主要代码</h2><p>在 <code>sister_xie</code>文件夹中的 <code>__init__.py</code>文件进行编写即可</p><h2 id="测试"><a href="#测试" class="headerlink" title="测试"></a>测试</h2><p>为防止代码编写过程中出现相关问题,因此可以使用 <code>python setup.py check</code>命令进行检查</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">(base) PS Z:\test_python> python .\setup.py check</span><br><span class="line">running check</span><br><span class="line">(base) PS Z:\test_python> </span><br></pre></td></tr></table></figure><p>当出现如上内容代表检查无误</p><h2 id="打包与发布"><a href="#打包与发布" class="headerlink" title="打包与发布"></a>打包与发布</h2><p>之后使用<code>python setup.py sdist build</code>命令进行打包,成功打包之后会在当前目录的dist文件夹下,创建你的包名</p><p>然后输入 <code>pip install twine</code>下载 <code>twine</code>来将你文件上传到PyPI中。</p><p>安装完成 <code>twine</code>后,输入<code>twine upload dist/*</code>来将你的打包文件进行上传,其中会要求你输入用户名和密码</p><p>最后会显示上传成功,并返回一个地址:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Uploading sister_xie-0.0.1.tar.gz</span><br><span class="line">100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.9/3.9 kB • 00:00 • ?</span><br><span class="line"></span><br><span class="line">View at:</span><br><span class="line">https://pypi.org/project/sister-xie/0.0.1/</span><br><span class="line">(base) PS Z:\test_python> </span><br></pre></td></tr></table></figure><p>至此,项目便成功发布到PyPI上面</p><h1 id="尾言"><a href="#尾言" class="headerlink" title="尾言"></a>尾言</h1><p>由于操作问题,在PyPI上面包名更改为 <code>xyqsister</code>,如需了解此项目可以直接点击<a href="https://pypi.org/project/xyqsister/0.0.1/">此处</a></p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://zhuanlan.zhihu.com/p/26159930">如何将自己的程序发布到 PyPI</a></li><li><a href="https://cloud.tencent.com/developer/article/1757852">实战教程:如何将自己的Python包发布到PyPI上</a></li><li><a href="https://packaging.python.org/en/latest/tutorials/packaging-projects/">PyPI官方教程</a></li></ul><blockquote><p> 排名不分先后</p></blockquote>]]></content>
<summary type="html"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于发现python的第三方包中没有自己想要用的一款,所以打算自己手写一个,顺便放在上面(为开源做贡献</p></summary>
<category term="python" scheme="https://zhycarge.github.io/OLD_BLOG/tags/python/"/>
</entry>
<entry>
<title>matplotlib中文字体的显示问题</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/10/19/matplotlib%E4%B8%AD%E6%96%87%E5%AD%97%E4%BD%93%E7%9A%84%E6%98%BE%E7%A4%BA%E9%97%AE%E9%A2%98/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/10/19/matplotlib%E4%B8%AD%E6%96%87%E5%AD%97%E4%BD%93%E7%9A%84%E6%98%BE%E7%A4%BA%E9%97%AE%E9%A2%98/</id>
<published>2022-10-19T12:11:03.000Z</published>
<updated>2022-10-19T13:00:33.000Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在实际使用 <code>matplotlib</code>这个库的时候,发现如果使用中文字体,会造成方块字的显示,因此尝试修复此类问题</p><span id="more"></span><h2 id="出现方式"><a href="#出现方式" class="headerlink" title="出现方式"></a>出现方式</h2><p>使用阿里云天池的<code>DSW</code>用上述库会出现此类问题</p><h1 id="解决方式"><a href="#解决方式" class="headerlink" title="解决方式"></a>解决方式</h1><h2 id="使用原生字体"><a href="#使用原生字体" class="headerlink" title="使用原生字体"></a>使用原生字体</h2><p>使用以下命令去查看在<code>matplotlib</code>中已经默认识别好的相关字体</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> font_manager</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> font <span class="keyword">in</span> font_manager.fontManager.ttflist:</span><br><span class="line"> <span class="comment"># 查看字体名以及对应的字体文件名</span></span><br><span class="line"> <span class="built_in">print</span>(font.name, <span class="string">'-'</span>, font.fname)</span><br></pre></td></tr></table></figure><p>然后找到你认识的能使用中文的字体名称,如下图的:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20221019205305064.png" alt="image-20221019205305064"></p><p>之后使用<code>plt.rcParams['font.sans-serif'] = 'AR PL UKai CN'</code>即可将全局文字进行替换(<code>Ubuntu20.04</code>好像自带此款字体,但是 <code>matplotlib</code>并不会初始使用此款字体 )</p><h2 id="使用第三方字体"><a href="#使用第三方字体" class="headerlink" title="使用第三方字体"></a>使用第三方字体</h2><p>如果在上述命令中你并未发现能够有识别中文的字体文件,则可以临时注册将一个第三方字体来传入到 <code>matplotlib</code>中进行使用</p><p>以 <code>SimSun.ttf</code>字体为例</p><ol><li><p>首先获取该字体文件,可以使用我的文件<a href="https://github.com/ZHYCarge/SundryBox/blob/main/font/SimSun.ttf">点我获取</a></p></li><li><p>使用 <code>matplotlib</code>自带的 <code>font_manager.fontManager.addfont()</code>方法进行注册字体:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> font_manager</span><br><span class="line">font_manager.fontManager.addfont(<span class="string">'../数据挖掘/SimSun.ttf'</span>)</span><br></pre></td></tr></table></figure></li><li><p>确认字体文件已经被加载到字体库中:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> font_manager</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> font <span class="keyword">in</span> font_manager.fontManager.ttflist:</span><br><span class="line"> <span class="comment"># 查看字体名以及对应的字体文件名</span></span><br><span class="line"> <span class="keyword">if</span> font.fname.split(<span class="string">'/'</span>)[-<span class="number">1</span>] == <span class="string">'SimSun.ttf'</span>:</span><br><span class="line"> <span class="built_in">print</span>(font.name, <span class="string">'-'</span>, font.fname)</span><br></pre></td></tr></table></figure><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20221019204156443.png" alt="image-20221019204156443"></p></li><li><p>输入显示最前面的字体名称进行导入并输出测试文字进行测试:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line">plt.rcParams[<span class="string">'font.sans-serif'</span>] = <span class="string">'SimSun'</span></span><br><span class="line">plt.text(<span class="number">0</span>,<span class="number">0</span>,<span class="string">'数据挖掘'</span>,fontsize=<span class="number">60</span>)</span><br></pre></td></tr></table></figure><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20221019204524564.png" alt="image-20221019204524564"></p></li></ol><p>为了解决保存图像是负号’-‘显示为方块的问题,最好添加下方的代码:</p><p><code>plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题</code></p><p>整体实现代码如下(字体文件为:<code>SimSun.ttf</code>,路径为:<code>../数据挖掘/SimSun.ttf</code>):</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> matplotlib <span class="keyword">import</span> font_manager</span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line">font_manager.fontManager.addfont(<span class="string">'../数据挖掘/SimSun.ttf'</span>)</span><br><span class="line">plt.rcParams[<span class="string">'font.sans-serif'</span>] = <span class="string">'SimSun'</span></span><br><span class="line">plt.text(<span class="number">0</span>,<span class="number">0</span>,<span class="string">'数据挖掘'</span>,fontsize=<span class="number">60</span>)</span><br><span class="line">plt.rcParams[<span class="string">'axes.unicode_minus'</span>] = <span class="literal">False</span> <span class="comment"># 解决保存图像是负号'-'显示为方块的问题</span></span><br></pre></td></tr></table></figure><p> </p><h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://cloud.tencent.com/developer/article/1761532">matplotlib字体设置看这一篇就够了</a></li></ul>]]></content>
<summary type="html"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在实际使用 <code>matplotlib</code>这个库的时候,发现如果使用中文字体,会造成方块字的显示,因此尝试修复此类问题</p></summary>
<category term="matplotlib" scheme="https://zhycarge.github.io/OLD_BLOG/tags/matplotlib/"/>
</entry>
<entry>
<title>由于CI引起的博文更新异常</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/10/16/%E7%94%B1%E4%BA%8ECI%E5%BC%95%E8%B5%B7%E7%9A%84%E5%8D%9A%E6%96%87%E6%9B%B4%E6%96%B0%E5%BC%82%E5%B8%B8/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/10/16/%E7%94%B1%E4%BA%8ECI%E5%BC%95%E8%B5%B7%E7%9A%84%E5%8D%9A%E6%96%87%E6%9B%B4%E6%96%B0%E5%BC%82%E5%B8%B8/</id>
<published>2022-10-16T13:27:32.000Z</published>
<updated>2022-10-17T01:30:39.000Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于在进行 <code>CI</code>的时候,会将仓库下所有的博文全部拉去到存储区 ,导致<code>HEXO</code>默认所有博文全部进行了修改,从而个人博客的博文的更新日期失常</p><span id="more"></span><h1 id="产生原因"><a href="#产生原因" class="headerlink" title="产生原因"></a>产生原因</h1><p>在了解到<a href="https://mrseawave.github.io/blogs/articles/2021/01/07/ci-hexo-update-time/">这篇博文</a>之后,参考我自身的 <code>GitHub Actions</code>的相关设置,发现了这个错误,并且得知可以根据以下内容对 <code>GitHub Actions</code>进行修改来防止错误产生</p><h1 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h1><p>在<code>yml</code>文件中将<code>checkout</code>命令更新成:</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">uses:</span> <span class="string">actions/checkout@v3</span></span><br><span class="line"><span class="attr">with:</span></span><br><span class="line"> <span class="attr">fetch-depth:</span> <span class="number">0</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Restore</span> <span class="string">file</span> <span class="string">modification</span> <span class="string">time</span> <span class="comment"># 更新所有文件为最后修改时间</span></span><br><span class="line"><span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">cd</span> <span class="string">source/_post/</span></span><br><span class="line"> <span class="string">git</span> <span class="string">ls-files</span> <span class="string">-z</span> <span class="string">|</span> <span class="string">while</span> <span class="string">read</span> <span class="string">-d</span> <span class="string">''</span> <span class="string">path;</span> <span class="string">do</span> <span class="string">touch</span> <span class="string">-d</span> <span class="string">"$(git log -1 --format="</span><span class="string">@%ct"</span> <span class="string">"$path"</span><span class="string">)"</span> <span class="string">"$path"</span><span class="string">;</span> <span class="string">done</span></span><br><span class="line"> <span class="string">cd</span> <span class="string">../..</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p>即可</p><p>由于在实际过程中,如果仅仅使用了<code>git</code>的相关命令会导致它会获取全部的内容。由于<code>Hexo</code>以及<code>Next</code>的相关代码更新久远,会极大的延长<code>Actions</code>的运行处理时间,因此这里仅进入到文章界面进行更改</p>]]></content>
<summary type="html"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于在进行 <code>CI</code>的时候,会将仓库下所有的博文全部拉去到存储区 ,导致<code>HEXO</code>默认所有博文全部进行了修改,从而个人博客的博文的更新日期失常</p></summary>
<category term="about" scheme="https://zhycarge.github.io/OLD_BLOG/tags/about/"/>
</entry>
<entry>
<title>Python RSA文件加密系列——生成公私钥、文件签名</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/09/25/Python%20RSA%E6%96%87%E4%BB%B6%E5%8A%A0%E5%AF%86%E7%B3%BB%E5%88%97%E2%80%94%E2%80%94%E7%94%9F%E6%88%90%E5%85%AC%E7%A7%81%E9%92%A5%E3%80%81%E6%96%87%E4%BB%B6%E7%AD%BE%E5%90%8D/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/09/25/Python%20RSA%E6%96%87%E4%BB%B6%E5%8A%A0%E5%AF%86%E7%B3%BB%E5%88%97%E2%80%94%E2%80%94%E7%94%9F%E6%88%90%E5%85%AC%E7%A7%81%E9%92%A5%E3%80%81%E6%96%87%E4%BB%B6%E7%AD%BE%E5%90%8D/</id>
<published>2022-09-25T13:00:00.000Z</published>
<updated>2022-09-25T12:53:45.000Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>个人认为后续工作中可能需要涉及到相关信息的唯一性以及相关信息传输的保密性,因此尝试现阶段学习一下相关加密技术(呜呜呜应该复习考公的)</p><span id="more"></span><h2 id="需要"><a href="#需要" class="headerlink" title="需要"></a>需要</h2><ul><li>python环境(感觉什么都可以)</li><li>第三方库:<code>rsa</code></li></ul><h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><h2 id="生成公私钥"><a href="#生成公私钥" class="headerlink" title="生成公私钥"></a>生成公私钥</h2><p>使用函数: <code>rsa.newkeys(num)</code>,其中:</p><ul><li><p><code>num</code>:必要参数,存储<code>n=q*p</code>所需要的位数</p></li><li><p><code>accurate</code>:可选参数,默认是<code>True</code></p><p>当它为真时,上述参数中的 <code>n</code>必定为你所需要的位数(创建速度会慢)</p><p>当它为假时,上述参数中的 <code>n</code>的数值可能会小(处理速度快)</p></li><li><p><code>poolsize</code>:可选参数,默认是 <code>1</code></p><p>用于生成素数的进程数 数字。如果设置为大于 <code>1</code> 的数字,将使用并行算法。 这需要 <code>Python 2.6</code> 或更高版本。</p></li><li><p><code>exponent</code>:可选参数,默认<code>65537</code></p><p> 他是密钥的指数;更改它的时候你要对此有极大的了解,因为指数会影响破解私钥的难度。</p></li></ul><p>它会返回一个公钥和私钥,因此需要创建一个元组去接值</p><p>整体代码:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> rsa</span><br><span class="line"></span><br><span class="line">(pubkey, privkey) = rsa.newkeys(<span class="number">2048</span>)</span><br><span class="line">pub = pubkey.save_pkcs1()</span><br><span class="line">pubfile = <span class="built_in">open</span>(<span class="string">'public.pem'</span>, <span class="string">'wb'</span>)</span><br><span class="line">pubfile.write(pub)</span><br><span class="line">pubfile.close()</span><br><span class="line"></span><br><span class="line">pri = privkey.save_pkcs1()</span><br><span class="line">prifile = <span class="built_in">open</span>(<span class="string">'private.pem'</span>, <span class="string">'wb'</span>)</span><br><span class="line">prifile.write(pri)</span><br><span class="line">prifile.close()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建一个公钥和私钥到你本地目录下</span></span><br></pre></td></tr></table></figure><h2 id="读取公私钥"><a href="#读取公私钥" class="headerlink" title="读取公私钥"></a>读取公私钥</h2><p>这里仅贴代码仅供参考</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 加载公私钥</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'public.pem'</span>, <span class="string">'r'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> pubkey = rsa.PublicKey.load_pkcs1(f.read().encode())</span><br><span class="line">f.close()</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'private.pem'</span>, <span class="string">'r'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> privkey = rsa.PrivateKey.load_pkcs1(f.read().encode())</span><br><span class="line">f.close()</span><br></pre></td></tr></table></figure><h2 id="生成签名"><a href="#生成签名" class="headerlink" title="生成签名"></a>生成签名</h2><p>当你要给别人发消息时候,需要确保消息的真实性,不会被别人所截获,因此会需要使用到私钥对你的数据进行签名,到对方手上的时候,对方可以使用你所给的公钥进行验签,这里讲解如何实现签名的生成</p><p>此处使用函数:<code>rsa.sign()</code>,其中:</p><ul><li><p><code>message</code>:必要参数,要签名的消息。</p><p>可以是 8 位字符串或类似文件 目的。如果 <code>message</code> 有 <code>read()</code> 方法,它被假定为 类文件对象。</p></li><li><p> <code>priv_key</code>:必要参数,使用的私钥信息。</p></li></ul><p> 需要先加载私钥信息才可使用</p><ul><li><p><code>hash_method</code>:必要参数,所使用的哈希算法。</p><p>通常参数为:<code>MD5</code>、<code>SHA-1</code>、<code>SHA-224</code>、<code>SHA-256</code>、<code>SHA-384</code>、<code>SHA-512</code></p><blockquote><p>具体参数优劣请自行查询其他文档</p></blockquote></li></ul><p>可能会出现的异常信息: <code>OverflowError</code>:如果私钥信息过小,可能无法包含相关信息</p><p>可选函数:<code>base64.b64encode(你需要编码的信息)</code>,使用其将上述信息进行二次编码,方便后续传输</p><p>部分代码如下:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">sign_by</span>(<span class="params">data: <span class="built_in">str</span>, privkey: rsa.PrivateKey</span>):</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> 私钥加密,使用此函数对相应信息进行加密</span></span><br><span class="line"><span class="string"> :param data: 所需要加密的信息,字符串格式</span></span><br><span class="line"><span class="string"> :param privkey: 私钥信息,已经读取好的</span></span><br><span class="line"><span class="string"> :return: 返回私钥签名好的信息</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> sign = rsa.sign(data.encode(), privkey, <span class="string">'SHA-256'</span>)</span><br><span class="line"> sign = base64.b64encode(sign)</span><br><span class="line"> <span class="keyword">return</span> sign</span><br></pre></td></tr></table></figure><h2 id="验证签名"><a href="#验证签名" class="headerlink" title="验证签名"></a>验证签名</h2><p>当对方拿到你发的信息以及所生成的签名之后,他需要使用公钥对其进行判断,确保在传输过程中没有信息有所损失。</p><p>使用函数:<code>rsa.verify()</code>,其中:</p><ul><li><code>message</code>:必要参数。需要验证的信息内容(需要字节流信息)</li><li><code>signature</code>:必要参数。拿到的签名信息</li><li><code>pub_key</code>:必要参数。你手上的公钥信息</li></ul><p>可能会出现的异常信息:<code>rsa.VerificationError</code>:当验证签名信息失败的时候进行抛出,否则返回的是所使用的签名算法名称</p><p>部分代码片段(为方便,用try函数判定是否出现,并返回布尔型数据):</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">checkout_sign</span>(<span class="params">data: <span class="built_in">str</span>, sign: <span class="built_in">bytes</span>, pubkey</span>):</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> 使用公钥验证签名信息</span></span><br><span class="line"><span class="string"> :param data: 需要检验的信息</span></span><br><span class="line"><span class="string"> :param sign: 签名信息,base64编码格式文件</span></span><br><span class="line"><span class="string"> :param pubkey: 公钥信息,已经读取好的</span></span><br><span class="line"><span class="string"> :return: 根据是否验签成功,如果检验成功则返回True,如果不成功则返回False</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> sign = base64.b64decode(sign)</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> rsa.verify(data.encode(), sign, pubkey)</span><br><span class="line"> <span class="keyword">except</span> rsa.VerificationError:</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">True</span></span><br></pre></td></tr></table></figure><h2 id="整体代码"><a href="#整体代码" class="headerlink" title="整体代码"></a>整体代码</h2><p>增加了一丢丢代码之后的内容:</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># -*- coding: utf-8 -*-</span></span><br><span class="line"><span class="comment"># @Time : 2022/9/25 19:23</span></span><br><span class="line"><span class="comment"># @Author : ZHYCarge</span></span><br><span class="line"><span class="comment"># @Email : [email protected]</span></span><br><span class="line"><span class="comment"># @File : 生成签名.py</span></span><br><span class="line"><span class="comment"># @Brief :使用私钥生成签名以获得一个概览信息</span></span><br><span class="line"><span class="keyword">import</span> base64</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> rsa</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">message = <span class="string">'Tmq2JoRvPCfvVKUhC2pjaiEu5c9EZxu5NlC7wGw6jl766r1Aqv/7I/Cmi2vIT15Icye/TiwArV0NNG4XqGP40oTebkfaCLfU5R91QnJFgUFnXAHLWO62ehWXcigmt5mSo4DojwfvmlMbzbuEZ0Qdj0XoVdqn96qEPvFGLAixzG/9+4KzBjgIKr3N4iQwBz3TIWM6iQU4TIxTZqJv9CvRQBZye1exj5PPB1ppWtNqsa5zx39FFwZdRXKfiUNGcSoNVAjXP3TU76cuWsCPIe7HLqDdtV4hTmjTvJ2trQ2SWne4p+SzvzsOUHGRLCIob1l2w4+EB6FvEvFhOjagwd0ieQ=='</span></span><br><span class="line"><span class="comment"># 加载公私钥</span></span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'public.pem'</span>, <span class="string">'r'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> pubkey = rsa.PublicKey.load_pkcs1(f.read().encode())</span><br><span class="line">f.close()</span><br><span class="line"><span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">'private.pem'</span>, <span class="string">'r'</span>) <span class="keyword">as</span> f:</span><br><span class="line"> privkey = rsa.PrivateKey.load_pkcs1(f.read().encode())</span><br><span class="line">f.close()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">sign_by</span>(<span class="params">data: <span class="built_in">str</span>, privkey: rsa.PrivateKey</span>):</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> 私钥加密,使用此函数对相应信息进行加密</span></span><br><span class="line"><span class="string"> :param data: 所需要加密的信息,字符串格式</span></span><br><span class="line"><span class="string"> :param privkey: 私钥信息,已经读取好的</span></span><br><span class="line"><span class="string"> :return: 返回私钥签名好的信息</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> sign = rsa.sign(data.encode(), privkey, <span class="string">'SHA-256'</span>)</span><br><span class="line"> sign = base64.b64encode(sign)</span><br><span class="line"> <span class="keyword">return</span> sign</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">checkout_sign</span>(<span class="params">data: <span class="built_in">str</span>, sign: <span class="built_in">bytes</span>, pubkey</span>):</span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> 使用公钥验证签名信息</span></span><br><span class="line"><span class="string"> :param data: 需要检验的信息</span></span><br><span class="line"><span class="string"> :param sign: 签名信息,base64编码格式文件</span></span><br><span class="line"><span class="string"> :param pubkey: 公钥信息,已经读取好的</span></span><br><span class="line"><span class="string"> :return: 根据是否验签成功,如果检验成功则返回True,如果不成功则返回False</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> sign = base64.b64decode(sign)</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> rsa.verify(data.encode(), sign, pubkey)</span><br><span class="line"> <span class="keyword">except</span> rsa.VerificationError:</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> filename = sys.argv[<span class="number">1</span>]</span><br><span class="line"> method = sys.argv[<span class="number">2</span>]</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"操作2:进行验签,返回True或者False\n"</span></span><br><span class="line"> <span class="string">"操作1:进行签名,将数据进行签名"</span>)</span><br><span class="line"> methods = <span class="built_in">input</span>(<span class="string">"请输入你所需要操作的文件以及需要的操作(用空格进行分开)"</span>)</span><br><span class="line"> methods = methods.split(<span class="string">" "</span>)</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> filename = methods[<span class="number">0</span>]</span><br><span class="line"> method = methods[<span class="number">1</span>]</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"输入的信息格式错误,请重新输入!"</span>)</span><br><span class="line"> <span class="keyword">if</span> method == <span class="string">"2"</span>:</span><br><span class="line"> sign = <span class="built_in">input</span>(<span class="string">"请输入签名信息:"</span>)</span><br><span class="line"> <span class="built_in">print</span>(checkout_sign(message, sign.encode(), pubkey))</span><br><span class="line"> <span class="keyword">elif</span> method == <span class="string">"1"</span>:</span><br><span class="line"> sign = sign_by(message, privkey)</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"签名信息如下,请保存:"</span>)</span><br><span class="line"> <span class="built_in">print</span>(<span class="built_in">str</span>(sign)[<span class="number">2</span>:-<span class="number">1</span>])</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="built_in">print</span>(<span class="string">"你所输入的信息不满足,进程已停止"</span>)</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>个人认为后续工作中可能需要涉及到相关信息的唯一性以及相关信息传输的保密性,因此尝试现阶段学习一下相关加密技术(呜呜呜应该复习考公的)</p></summary>
<category term="Study" scheme="https://zhycarge.github.io/OLD_BLOG/categories/Study/"/>
<category term="笔记" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="Python" scheme="https://zhycarge.github.io/OLD_BLOG/tags/Python/"/>
</entry>
<entry>
<title>如何高效友好的提出一个技术性问题</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/09/11/%E5%A6%82%E4%BD%95%E9%AB%98%E6%95%88%E5%8F%8B%E5%A5%BD%E7%9A%84%E6%8F%90%E5%87%BA%E4%B8%80%E4%B8%AA%E6%8A%80%E6%9C%AF%E6%80%A7%E9%97%AE%E9%A2%98/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/09/11/%E5%A6%82%E4%BD%95%E9%AB%98%E6%95%88%E5%8F%8B%E5%A5%BD%E7%9A%84%E6%8F%90%E5%87%BA%E4%B8%80%E4%B8%AA%E6%8A%80%E6%9C%AF%E6%80%A7%E9%97%AE%E9%A2%98/</id>
<published>2022-09-11T02:00:00.000Z</published>
<updated>2022-09-14T11:10:20.000Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><h2 id="为什么要规范问题格式?"><a href="#为什么要规范问题格式?" class="headerlink" title="为什么要规范问题格式?"></a>为什么要规范问题格式?</h2><p>因为在实际的学习中,总会遇到许许多多的问题提问方式,有些提问方式会显得更加高效率,而有些提问会极大的延长回复问题的时间,因此制作一个 <code>关于技术性问题的提问模板</code>,就会显得比较重要</p><span id="more"></span><p>如果不想看那么多,只想获得一个模板格式,<a href="##%E6%A1%86%E6%9E%B6%E5%86%85%E5%AE%B9">点我</a></p><h2 id="这样做对我有什么好处?"><a href="#这样做对我有什么好处?" class="headerlink" title="这样做对我有什么好处?"></a>这样做对我有什么好处?</h2><p>对于每个人来讲,更加规范更加优秀的提问会极大的促进问答两个人之间的沟通效率,因此如何高效而又有效的问答,则是每个人需要学会的一件事。规范了问答格式,会让大家更倾向于去解决你的问题</p><h1 id="提问的智慧"><a href="#提问的智慧" class="headerlink" title="提问的智慧"></a>提问的智慧</h1><p>这个标题最早来自于GitHub的一个开源仓库,由于其中内容介绍的十分中肯,因此也是受到了许多同行们的fork以及star,因此如果有时间可以去阅读一下他的文章,<a href="https://github.com/GUET-EETB/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md">文章链接</a></p><p>对于其中的一些问题,我做了一部分的节选(该章节其余内容来源于其文章内容):</p><h3 id="话不在多而在精"><a href="#话不在多而在精" class="headerlink" title="话不在多而在精"></a>话不在多而在精</h3><p>你需要提供精确有内容的信息。这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中。如果你有庞大而复杂的测试样例能重现程序挂掉的情境,尽量将它剪裁得越小越好。</p><p>这样做的用处至少有三点。 第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加; 第二,简化问题使你更有可能得到<strong>有用</strong>的答案; 第三,在精炼你的 bug 报告的过程中,你很可能就自己找到了解决方法或权宜之计。</p><h3 id="描述目标而不是过程"><a href="#描述目标而不是过程" class="headerlink" title="描述目标而不是过程"></a>描述目标而不是过程</h3><p>如果你想弄清楚如何做某事(而不是报告一个 Bug),在开头就描述你的目标,然后才陈述重现你所卡住的特定步骤。</p><p>经常寻求技术帮助的人在心中有个更高层次的目标,而他们在自以为能达到目标的特定道路上被卡住了,然后跑来问该怎么走,但没有意识到这条路本身就有问题。结果要费很大的劲才能搞定。</p><p><strong>蠢问题</strong></p><blockquote><p>我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值?</p></blockquote><p><strong>聪明问题</strong></p><blockquote><p>我正试着用替换一幅图片的色码(color table)成自己选定的色码,我现在知道的唯一方法是编辑每个色码区块(table slot), 但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值。</p></blockquote><p>第二种提问法比较聪明,你可能得到像是<code>建议采用另一个更合适的工具</code>的回复。</p><h3 id="清楚明确的表达你的问题以及需求"><a href="#清楚明确的表达你的问题以及需求" class="headerlink" title="清楚明确的表达你的问题以及需求"></a>清楚明确的表达你的问题以及需求</h3><p>漫无边际的提问是近乎无休无止的时间黑洞。最有可能给你有用答案的人通常也正是最忙的人(他们忙是因为要亲自完成大部分工作)。这样的人对无节制的时间黑洞相当厌恶,所以他们也倾向于厌恶那些漫无边际的提问。</p><p>如果你明确表述需要回答者做什么(如提供指点、发送一段代码、检查你的补丁、或是其他等等),就最有可能得到有用的答案。因为这会定出一个时间和精力的上限,便于回答者能集中精力来帮你。这么做很棒。</p><p>要理解专家们所处的世界,请把专业技能想像为充裕的资源,而回复的时间则是稀缺的资源。你要求他们奉献的时间越少,你越有可能从真正专业而且很忙的专家那里得到解答。</p><p>所以,界定一下你的问题,使专家花在辨识你的问题和回答所需要付出的时间减到最少,这技巧对你有用答案相当有帮助 —— 但这技巧通常和简化问题有所区别。因此,问<code>我想更好地理解 X,可否指点一下哪有好一点说明?</code>通常比问<code>你能解释一下 X 吗?</code>更好。如果你的代码不能运作,通常请别人看看哪里有问题,比要求别人替你改正要明智得多。</p><h3 id="别把自己家庭作业的问题贴上来"><a href="#别把自己家庭作业的问题贴上来" class="headerlink" title="别把自己家庭作业的问题贴上来"></a>别把自己家庭作业的问题贴上来</h3><p>黑客们很擅长分辨哪些问题是家庭作业式的问题;因为我们中的大多数都曾自己解决这类问题。同样,这些问题得由<strong>你</strong>来搞定,你会从中学到东西。你可以要求给点提示,但别要求得到完整的解决方案。</p><p>如果你怀疑自己碰到了一个家庭作业式的问题,但仍然无法解决,试试在用户群组,论坛或(最后一招)在项目的<strong>用户</strong>邮件列表或论坛中提问。尽管黑客们<strong>会</strong>看出来,但一些有经验的用户也许仍会给你一些提示。</p><h3 id="问题解决后,加个简短的补充说明"><a href="#问题解决后,加个简短的补充说明" class="headerlink" title="问题解决后,加个简短的补充说明"></a>问题解决后,加个简短的补充说明</h3><p>问题解决后,向所有帮助过你的人发个说明,让他们知道问题是怎样解决的,并再一次向他们表示感谢。如果问题在新闻组或者邮件列表中引起了广泛关注,应该在那里贴一个说明比较恰当。</p><p>最理想的方式是向最初提问的话题回复此消息,并在标题中包含<code>已修正</code>,<code>已解决</code>或其它同等含义的明显标记。在人来人往的邮件列表里,一个看见讨论串<code>问题 X</code>和<code>问题 X - 已解决</code>的潜在回复者就明白不用再浪费时间了(除非他个人觉得<code>问题 X</code>的有趣),因此可以利用此时间去解决其它问题。</p><p>补充说明不必很长或是很深入;简单的一句<code>你好,原来是网线出了问题!谢谢大家 – Bill</code>比什么也不说要来的好。事实上,除非结论真的很有技术含量,否则简短可爱的小结比长篇大论更好。说明问题是怎样解决的,但大可不必将解决问题的过程复述一遍。</p><p>对于有深度的问题,张贴调试记录的摘要是有帮助的。描述问题的最终状态,说明是什么解决了问题,在此<strong>之后</strong>才指明可以避免的盲点。避免盲点的部分应放在正确的解决方案和其它总结材料之后,而不要将此信息搞成侦探推理小说。列出那些帮助过你的名字,会让你交到更多朋友。</p><p>除了有礼貌和有内涵以外,这种类型的补充也有助于他人在邮件列表/新闻群组/论坛中搜索到真正解决你问题的方案,让他们也从中受益。</p><p>至少,这种补充有助于让每位参与协助的人因问题的解决而从中得到满足感。如果你自己不是技术专家或者黑客,那就相信我们,这种感觉对于那些你向他们求助的大师或者专家而言,是非常重要的。问题悬而未决会让人灰心;黑客们渴望看到问题被解决。好人有好报,满足他们的渴望,你会在下次提问时尝到甜头。</p><p>思考一下怎样才能避免他人将来也遇到类似的问题,自问写一份文件或加个常见问题(FAQ)会不会有帮助。如果是的话就将它们发给维护者。</p><p>在黑客中,这种良好的后继行动实际上比传统的礼节更为重要,也是你如何透过善待他人而赢得声誉的方式,这是非常有价值的资产。</p><h1 id="那我应该使用什么方式进行提问?"><a href="#那我应该使用什么方式进行提问?" class="headerlink" title="那我应该使用什么方式进行提问?"></a>那我应该使用什么方式进行提问?</h1><p>由于每个问题都会对应不同的提问框架,但是对于一般的技术性问题来讲,你大抵可以使用以下此类框架:</p><h2 id="使用框架前你需要明确:"><a href="#使用框架前你需要明确:" class="headerlink" title="使用框架前你需要明确:"></a>使用框架前你需要明确:</h2><ul><li>我已经阅读完毕 <a href="https://zhycarge.github.io/2022/09/11/%E5%A6%82%E4%BD%95%E9%AB%98%E6%95%88%E5%8F%8B%E5%A5%BD%E7%9A%84%E6%8F%90%E5%87%BA%E4%B8%80%E4%B8%AA%E6%8A%80%E6%9C%AF%E6%80%A7%E9%97%AE%E9%A2%98/">如何高效友好的提出一个技术性问题</a>,并保证自己会遵守里面的<a href="https://zhycarge.github.io/2022/09/11/%E5%A6%82%E4%BD%95%E9%AB%98%E6%95%88%E5%8F%8B%E5%A5%BD%E7%9A%84%E6%8F%90%E5%87%BA%E4%B8%80%E4%B8%AA%E6%8A%80%E6%9C%AF%E6%80%A7%E9%97%AE%E9%A2%98/##%E4%BD%BF%E7%94%A8%E6%A1%86%E6%9E%B6%E5%89%8D%E4%BD%A0%E9%9C%80%E8%A6%81%E6%98%8E%E7%A1%AE">相关要求</a></li><li>在你提出这个问题之前,你已经去查证在论坛或者其他你可以搜索到的地方没有人提出了相关问题</li><li>如果本文并未有效的帮助你更好的精简你的语言,我应该去看看 <a href="https://github.com/GUET-EETB/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md">提问的智慧</a></li><li>我接下来要上传的内容不包含个人敏感信息(在上传日志、代码截图之前,我已经有效的处理好我的个人敏感信息)</li><li>如果我的问题并没有遵循相关要求,但是我还是提出了这个问题,那么我的问题会被无条件关闭或者被管理者拒绝回答</li></ul><h2 id="框架内容"><a href="#框架内容" class="headerlink" title="框架内容"></a>框架内容</h2><p>如有需要,请将下方内容复制粘贴到你需要的地方即可</p><p>此处内容采用协议 <a href="https://creativecommons.org/publicdomain/mark/1.0/">Public Domain</a></p><h3 id="框架1"><a href="#框架1" class="headerlink" title="框架1"></a>框架1</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 在开始之前</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> [<span class="string"> </span>] 我已经阅读完毕并遵守[<span class="string">如何高效友好的提出一个技术性问题</span>](<span class="link">https://zhycarge.github.io/2022/09/11/%E5%A6%82%E4%BD%95%E9%AB%98%E6%95%88%E5%8F%8B%E5%A5%BD%E7%9A%84%E6%8F%90%E5%87%BA%E4%B8%80%E4%B8%AA%E6%8A%80%E6%9C%AF%E6%80%A7%E9%97%AE%E9%A2%98/</span>)里面的内容</span><br><span class="line"></span><br><span class="line"><span class="section"># 我当前使用的系统环境是</span></span><br><span class="line"></span><br><span class="line">写上你的个人系统环境信息,如Windows10,python3.7 使用了什么第三方库 etc.</span><br><span class="line"></span><br><span class="line"><span class="section"># 重现步骤</span></span><br><span class="line"></span><br><span class="line">你是通过什么操作出现了这个问题,是否这个问题在你再次尝试之后再次出现</span><br><span class="line">在此处可以使用markdown代码框贴出你的代码部分(已脱敏),方便我们进行复现或者重试</span><br><span class="line"></span><br><span class="line"><span class="section"># 我的预期成果是什么?</span></span><br><span class="line"></span><br><span class="line">比如我需要1+1=2</span><br><span class="line"></span><br><span class="line"><span class="section"># 但是实际输出时什么</span></span><br><span class="line"></span><br><span class="line">但是输出了1+1=3</span><br><span class="line"></span><br><span class="line"><span class="section"># 如果有日志(报错),那么日志(报错)记录了什么?</span></span><br><span class="line"></span><br><span class="line">如果有信息,请截全</span><br><span class="line"></span><br><span class="line"><span class="section"># 有什么需要向我们进行补充的?</span></span><br><span class="line"></span><br><span class="line">可选信息</span><br></pre></td></tr></table></figure><h3 id="框架2"><a href="#框架2" class="headerlink" title="框架2"></a>框架2</h3><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 在开始之前</span></span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> [<span class="string"> </span>] 我已经阅读完毕并遵守[<span class="string">如何高效友好的提出一个技术性问题</span>](<span class="link">https://zhycarge.github.io/2022/09/11/%E5%A6%82%E4%BD%95%E9%AB%98%E6%95%88%E5%8F%8B%E5%A5%BD%E7%9A%84%E6%8F%90%E5%87%BA%E4%B8%80%E4%B8%AA%E6%8A%80%E6%9C%AF%E6%80%A7%E9%97%AE%E9%A2%98/</span>)里面的内容</span><br><span class="line"></span><br><span class="line"><span class="section"># 我的预期成果是什么?</span></span><br><span class="line"></span><br><span class="line">比如我需要1+1=2</span><br><span class="line"></span><br><span class="line"><span class="section"># 但是实际输出时什么</span></span><br><span class="line"></span><br><span class="line">但是输出了1+1=3</span><br><span class="line"></span><br><span class="line"><span class="section"># 为解决这个问题我尝试做了什么?</span></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 class="section"># 你还有什么需要补充的吗?</span></span><br></pre></td></tr></table></figure><h1 id="结尾"><a href="#结尾" class="headerlink" title="结尾"></a>结尾</h1><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://github.com/GUET-EETB/How-To-Ask-Questions-The-Smart-Way/blob/main/README-zh_CN.md">提问的智慧</a></li><li><a href="https://github.com/GUET-EETB/How-To-Create-A-Issue">How-To-Create-A-Issue</a></li></ul><h2 id="本文协议"><a href="#本文协议" class="headerlink" title="本文协议"></a>本文协议</h2><p><a rel="license" href="http://creativecommons.org/licenses/by/4.0/"><img alt="Creative Commons License" style="border-width:0" src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br />This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>.</p>]]></content>
<summary type="html"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><h2 id="为什么要规范问题格式?"><a href="#为什么要规范问题格式?" class="headerlink" title="为什么要规范问题格式?"></a>为什么要规范问题格式?</h2><p>因为在实际的学习中,总会遇到许许多多的问题提问方式,有些提问方式会显得更加高效率,而有些提问会极大的延长回复问题的时间,因此制作一个 <code>关于技术性问题的提问模板</code>,就会显得比较重要</p></summary>
<category term="Education" scheme="https://zhycarge.github.io/OLD_BLOG/categories/Education/"/>
<category term="Education" scheme="https://zhycarge.github.io/OLD_BLOG/tags/Education/"/>
</entry>
<entry>
<title>如何使用公开图床优化文档撰写</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/09/08/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%85%AC%E5%BC%80%E5%9B%BE%E5%BA%8A%E4%BC%98%E5%8C%96%E6%96%87%E6%A1%A3%E6%92%B0%E5%86%99/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/09/08/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E5%85%AC%E5%BC%80%E5%9B%BE%E5%BA%8A%E4%BC%98%E5%8C%96%E6%96%87%E6%A1%A3%E6%92%B0%E5%86%99/</id>
<published>2022-09-08T02:00:00.000Z</published>
<updated>2022-09-08T02:31:33.000Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在网上,只要你用 <code>免费图床</code>字眼进行搜索,一定会搜索出来许多的资源,例如这篇博客:<a href="https://zhuanlan.zhihu.com/p/81713842">超好用:免费的图床</a>其中不乏有一些很适合新手小白在一开始什么也不知道的情况下帮助你更好的完成博文撰写工作的相关免费图床网站,本篇文章以 <a href="https://imgse.com/">路过图床</a>为基础,浅浅介绍一下如何使用免费图床来帮助你更好的进行文章撰写。</p><span id="more"></span><p>在使用之前,推荐阅读每一个免费图床的使用公告,例如 <a href="https://imgse.com/page/tos">服务条款-路过图床</a></p><p>作为一个计算机学子,在使用每一款产品之前,希望可以有时间阅读好每一款的使用说明,虽然可能很枯燥,但是往往会避免出现很多不必要的错误。</p><h1 id="如何使用免费图床"><a href="#如何使用免费图床" class="headerlink" title="如何使用免费图床"></a>如何使用免费图床</h1><h2 id="NO-1-注册一个账户"><a href="#NO-1-注册一个账户" class="headerlink" title="NO.1 注册一个账户"></a>NO.1 注册一个账户</h2><p>为了更好的记录你的身份,因此在使用前你需要注册一个图床账户:</p><p><img src="https://s1.ax1x.com/2022/09/08/vb6IQe.png" alt="vb6IQe.png"></p><p>这很简单,直接注册就好</p><h2 id="NO-2-将你的照片放置到图床上"><a href="#NO-2-将你的照片放置到图床上" class="headerlink" title="NO.2 将你的照片放置到图床上"></a>NO.2 将你的照片放置到图床上</h2><p>经测试,在使用的时候只要在网站内使用<kbd>Ctrl</kbd>+<kbd>V</kbd>即可激活它的上传功能,显示出如下内容:</p><p><img src="https://s1.ax1x.com/2022/09/08/vb6HeA.md.png" alt="vb6HeA.md.png"></p><p>其中,图片格式要求为 <code>JPG</code>or <code>PNG</code>,并且照片大小不能大于<code>10MB</code></p><p>之后会让你选择你存放的图库名称,以及是否进行上传,图库的话可以选择对访客开放,这样无论是谁通过什么渠道都可以看到你上传的照片:</p><p><a href="https://imgse.com/i/vbcQT1"><img src="https://s1.ax1x.com/2022/09/08/vbcQT1.md.png" alt="vbcQT1.md.png"></a></p><h2 id="使用你在图床上的照片"><a href="#使用你在图床上的照片" class="headerlink" title="使用你在图床上的照片"></a>使用你在图床上的照片</h2><p>如果进行顺利的话,它会上传完毕并且会跳转到你图片网页,并在下方附有如下内容:</p><p><a href="https://imgse.com/i/vbcCes"><img src="https://s1.ax1x.com/2022/09/08/vbcCes.md.png" alt="vbcCes.md.png"></a></p><p>你可以直接在这选择 <code>Markdown代码</code>的链接信息来复制到你的编辑器中,你的编辑器会自动识别它的格式并且进行加载图片(应该吧看你编辑器了2333)</p><p>之后这样操作就完成了</p><h2 id="如何查看我上传的照片"><a href="#如何查看我上传的照片" class="headerlink" title="如何查看我上传的照片"></a>如何查看我上传的照片</h2><p>这很简单,右上角点击个人ID找到我的图片即可,你上传过的所有照片均在此处,点进去一张照片后,你可以选择删除或者下载图片等操作。</p><p><a href="https://imgse.com/i/vbcW0s"><img src="https://s1.ax1x.com/2022/09/08/vbcW0s.png" alt="vbcW0s.png"></a></p><h1 id="Others"><a href="#Others" class="headerlink" title="Others"></a>Others</h1><p>请注意,虽然是免费图床,并且都宣传其很安全,但是请<strong>不要将自己的个人信息以及个人隐私上传到图床中</strong>,容易造成隐私泄露等风险</p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://imgse.com/">路过图床</a></li><li><a href="https://zhuanlan.zhihu.com/p/81713842">超好用:免费的图床</a></li></ul>]]></content>
<summary type="html"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>在网上,只要你用 <code>免费图床</code>字眼进行搜索,一定会搜索出来许多的资源,例如这篇博客:<a href="https://zhuanlan.zhihu.com/p/81713842">超好用:免费的图床</a>其中不乏有一些很适合新手小白在一开始什么也不知道的情况下帮助你更好的完成博文撰写工作的相关免费图床网站,本篇文章以 <a href="https://imgse.com/">路过图床</a>为基础,浅浅介绍一下如何使用免费图床来帮助你更好的进行文章撰写。</p></summary>
<category term="Education" scheme="https://zhycarge.github.io/OLD_BLOG/categories/Education/"/>
<category term="Education" scheme="https://zhycarge.github.io/OLD_BLOG/tags/Education/"/>
</entry>
<entry>
<title>Arch Linux删除多余软件缓存包</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/07/10/Arch%20Linux%E5%88%A0%E9%99%A4%E5%A4%9A%E4%BD%99%E8%BD%AF%E4%BB%B6%E7%BC%93%E5%AD%98%E5%8C%85/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/07/10/Arch%20Linux%E5%88%A0%E9%99%A4%E5%A4%9A%E4%BD%99%E8%BD%AF%E4%BB%B6%E7%BC%93%E5%AD%98%E5%8C%85/</id>
<published>2022-07-10T16:20:00.000Z</published>
<updated>2022-07-10T16:36:57.000Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>为了进一步给我电脑<code>Linux</code>增加内存,经过查询之后,发现如下方法可以清除多余的安装包缓存 ,从而给我电脑腾出空间</p><span id="more"></span><h1 id="内容"><a href="#内容" class="headerlink" title="内容"></a>内容</h1><h2 id="我为什么需要清除?"><a href="#我为什么需要清除?" class="headerlink" title="我为什么需要清除?"></a>我为什么需要清除?</h2><p>由于在日常的实际使用过程中,我们会经常更新相关的软件安装包,但是在<code>Arch Linux</code>中,其 <code>pacman</code>与<code>yay</code>软件安装工具对软件进行安装的过程中通常会将安装的软件缓存包一同保存到电脑中,与其他<code>Linux</code>发行版不同,其不会自行删除软件缓存包,因此在使用一段时间之后,电脑存储空间可能会被相关软件缓存占据大概 <code>40G</code>的使用空间(我自己),因此,清除缓存空间刻不容缓2333</p><h2 id="我需要怎么做"><a href="#我需要怎么做" class="headerlink" title="我需要怎么做"></a>我需要怎么做</h2><h3 id="使用pacman进行清除"><a href="#使用pacman进行清除" class="headerlink" title="使用pacman进行清除"></a>使用<code>pacman</code>进行清除</h3><p>在其<a href="https://man.archlinux.org/man/pacman.8">官网</a>中其实也有所提醒过,对于软件缓存包的清除,可以使用<code>sudo pacman -Sc</code>对其进行清除</p><blockquote><p>请注意:清除安装包之后,所有的软件再次安装需要重新去下载,因此在删除前推荐对其进行安装</p></blockquote><h3 id=""><a href="#" class="headerlink" title=""></a></h3><h3 id="使用paccache进行清除"><a href="#使用paccache进行清除" class="headerlink" title="使用paccache进行清除"></a>使用<code>paccache</code>进行清除</h3><p>在使用上文所提到的方法时,会删除所有的缓存包,但是由于<code>arch</code>的特性,在大多数情况下不应该删除那么多的缓存包,往往想要留下一部分,因此可以安装<code>paccache</code>进行辅助卸载,其官网和安装方式如下:</p><p><a href="https://man.archlinux.org/man/paccache.8">官网</a></p><p><code>sudo pacman -Syu pacman-contrib</code></p><p>安装之后使用<code>sudo paccache -ruk0</code>删除缓存包,其中 <code>0</code>代表的是为每个缓存包留出多少个前置版本,如果参数为0则全部删除</p><h3 id="使用yay进行清除"><a href="#使用yay进行清除" class="headerlink" title="使用yay进行清除"></a>使用<code>yay</code>进行清除</h3><p>在大多数情况,我们也会使用<code>yay</code>命令去安装软件,但是yay使用的大多都是第三方<code>AUR</code>库中的内容,其与<code>pacman</code>的安装缓存位置不同,因此需要使用不同的方法进行清除,在<a href="https://github.com/Jguer/yay">其<code>Github</code></a>中给出的方式为:<code>yay -c</code>即可清除。或者使用<code>yay -Yc</code>清除不需要用到的依赖包。</p><h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://bynss.com/linux/471439.html">使用Pacman和Paccache回收Arch Linux上的存储空间 | 月灯依旧</a></li><li><a href="https://bynss.com/linux/696422.html">怎样在 Arch Linux 中清除包缓存 | 月灯依旧</a></li><li><a href="https://man.archlinux.org/man/pacman.8">pacman(8) — Arch manual pages</a></li><li><a href="https://man.archlinux.org/man/paccache.8">paccache(8) — Arch manual pages</a></li><li><a href="https://github.com/Jguer/yay">GitHub - Jguer/yay: Yet another Yogurt - An AUR Helper written in Go</a></li></ul>]]></content>
<summary type="html"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>为了进一步给我电脑<code>Linux</code>增加内存,经过查询之后,发现如下方法可以清除多余的安装包缓存 ,从而给我电脑腾出空间</p></summary>
<category term="学校课程" scheme="https://zhycarge.github.io/OLD_BLOG/categories/%E5%AD%A6%E6%A0%A1%E8%AF%BE%E7%A8%8B/"/>
<category term="笔记" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="water" scheme="https://zhycarge.github.io/OLD_BLOG/tags/water/"/>
<category term="Arch Linux" scheme="https://zhycarge.github.io/OLD_BLOG/tags/Arch-Linux/"/>
</entry>
<entry>
<title>安装pyspark</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/06/23/%E5%AE%89%E8%A3%85pyspark/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/06/23/%E5%AE%89%E8%A3%85pyspark/</id>
<published>2022-06-23T12:00:00.000Z</published>
<updated>2022-07-05T08:55:26.000Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>听说spark为了支持python全面研发出一款专门调用api的工具叫做<code>pyspark</code>,因此,本着学习的目的,尝试安装一下<code>pyspark</code></p><span id="more"></span><h2 id="已有基础"><a href="#已有基础" class="headerlink" title="已有基础"></a>已有基础</h2><ul><li>ubuntu 18.04</li><li>anaconda 4.20</li><li>python 3.8</li></ul><h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><p><a href="https://spark.apache.org/docs/latest/api/python/getting_started/install.html?highlight=installed#:~:text=Python%203.7%20and%20above.">官网中强调</a>了,要想安装<code>pyspark</code>则最先确保自身的<code>python</code>版本要大于等于<code>3.7</code>,因此,在开始本次教程之前,需要确保自身的<code>python>=3.7</code></p><p>在官网中提出了多种方式去安装 <code>pyspark</code>,其中本文将使用<code>conda</code>的方式去进行安装</p><h2 id="创建并进入conda虚拟环境"><a href="#创建并进入conda虚拟环境" class="headerlink" title="创建并进入conda虚拟环境"></a>创建并进入conda虚拟环境</h2><p>使用命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">conda create --name pyspark python=3.8</span><br><span class="line">conda activate pyspark</span><br></pre></td></tr></table></figure><p>创建一个名为<code>pyspark</code> ,<code>python</code>版本为<code>3.8</code>的环境,并进入到环境当中</p><h2 id="安装-JAVA"><a href="#安装-JAVA" class="headerlink" title="安装 JAVA"></a>安装 <code>JAVA</code></h2><p>由于在运行过程中,<code>spark</code>使用的是<code>java</code>语言,因此需要安装<code>java</code>环境</p><p>安装教程在另一篇博文中有写,请参考:<a href="https://zhycarge.github.io/2021/09/23/Hadoop%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%90%AD%E5%BB%BA/#:~:text=%E4%B9%8B%E5%90%8E%E5%A6%82%E4%B8%8B%E6%98%BE%E7%A4%BA%EF%BC%9A-,%E5%AE%89%E8%A3%85%E4%BB%A5%E5%8F%8A%E9%85%8D%E7%BD%AEJava,-%E5%AE%89%E8%A3%85openjdk%2D8">安装及配置java模块进行安装</a></p><h2 id="安装pyspark"><a href="#安装pyspark" class="headerlink" title="安装pyspark"></a>安装<code>pyspark</code></h2><p>输入命令:</p><p><code>conda install pyspark </code></p><p>进行安装</p><h2 id="使用-pyspark"><a href="#使用-pyspark" class="headerlink" title="使用 pyspark"></a>使用 <code>pyspark</code></h2><p>直接终端输入 <code>pyspark</code>即可看到如下界面:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220623202503071.png" alt="image-20220623202503071"></p><p>使用 <code>exit()</code>便可退出</p><h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1><h2 id="测试demo"><a href="#测试demo" class="headerlink" title="测试demo"></a>测试demo</h2><p>有待更新</p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://spark.apache.org/docs/latest/api/python/user_guide/python_packaging.html#using-conda">官网【使用conda安装pyspark】</a></li><li><a href="https://spark.apache.org/docs/latest/api/python/getting_started/install.html">官网【安装pyspark】</a></li></ul>]]></content>
<summary type="html"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>听说spark为了支持python全面研发出一款专门调用api的工具叫做<code>pyspark</code>,因此,本着学习的目的,尝试安装一下<code>pyspark</code></p></summary>
<category term="study" scheme="https://zhycarge.github.io/OLD_BLOG/categories/study/"/>
<category term="Linux" scheme="https://zhycarge.github.io/OLD_BLOG/tags/Linux/"/>
<category term="pyspark" scheme="https://zhycarge.github.io/OLD_BLOG/tags/pyspark/"/>
</entry>
<entry>
<title>Ubuntu安装anaconda</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/06/23/Ubuntu%E5%AE%89%E8%A3%85anaconda/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/06/23/Ubuntu%E5%AE%89%E8%A3%85anaconda/</id>
<published>2022-06-23T09:00:00.000Z</published>
<updated>2022-06-23T10:38:13.000Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>想拿自己的云服务器跑Python脚本,为了防止环境导致后续出现问题,因此尝试安装Linux的Anaconda</p><span id="more"></span><h2 id="系统配置"><a href="#系统配置" class="headerlink" title="系统配置"></a>系统配置</h2><ul><li>Ubuntu 18.04</li><li>2核2G</li><li>python3.69</li></ul><h1 id="过程"><a href="#过程" class="headerlink" title="过程"></a>过程</h1><h2 id="更新自身包"><a href="#更新自身包" class="headerlink" title="更新自身包"></a>更新自身包</h2><p><code>sudo apt update && sudo apt upgrade</code></p><h2 id="下载curl软件"><a href="#下载curl软件" class="headerlink" title="下载curl软件"></a>下载<code>curl</code>软件</h2><p><code>sudo apt install curl</code></p><h2 id="进入到-tmp目录下"><a href="#进入到-tmp目录下" class="headerlink" title="进入到 /tmp目录下"></a>进入到 <code>/tmp</code>目录下</h2><p>这步可选,(存到<code>/tmp</code>目录下方便关机的时候自动给你删掉,安装包没啥用2333)</p><p><code>cd /tmp</code></p><h2 id="下载anaconda安装包"><a href="#下载anaconda安装包" class="headerlink" title="下载anaconda安装包"></a>下载<code>anaconda</code>安装包</h2><p>从<a href="https://www.anaconda.com/products/distribution#Downloads">官网</a>上找到属于你自己的anaconda安装包,如图:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220623175613105.png" alt="image-20220623175613105"></p><p><code>https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh</code></p><p>右键链接复制链接之后,在终端中输入:</p><p><code>curl -O 你复制的链接</code></p><p>例子: <code>curl -O https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh</code></p><p>等待下载完毕</p><h2 id="【可选】验证安装包的有效及完整性"><a href="#【可选】验证安装包的有效及完整性" class="headerlink" title="【可选】验证安装包的有效及完整性"></a>【可选】验证安装包的有效及完整性</h2><p>以自身为例:</p><p>输入命令</p><p><code>sha256sum Anaconda3-2022.05-Linux-x86_64.sh </code>来生成一段sha256验证密钥,通过<a href="https://docs.anaconda.com/anaconda/install/hashes/lin-3-64/">官网链接</a>找到属于自己的版本sha256密钥</p><p>如<a href="https://docs.anaconda.com/anaconda/install/hashes/Anaconda3-2022.05-Linux-x86_64.sh-hash/">此链接</a>对应的便是上文的密钥链接,将两段sha256密钥进行比对,一致即可</p><h2 id="安装anaconda"><a href="#安装anaconda" class="headerlink" title="安装anaconda"></a>安装anaconda</h2><p>输入命令</p><p><code>bash Anaconda3-2022.05-Linux-x86_64.sh</code>即可安装,</p><p>期间会让你确定安装目录\阅读许可等相关操作 </p><p>直到后面会出现安装成功提醒</p><p>之后在命令行中输入 <code>source ~/.bashrc</code></p><blockquote><p>注意:此处如果在fish中输入,会报错,因此需要先退出fish,或者直接先bash,再输入此命令</p></blockquote><h2 id="是否在每个会话中启用conda"><a href="#是否在每个会话中启用conda" class="headerlink" title="是否在每个会话中启用conda"></a>是否在每个会话中启用conda</h2><p>默认此选项是开启的,如果需要更改,输入如下命令:</p><p><code>conda config --set auto_activate_base False</code> 取消每个<code>shell</code>中使用</p><p><strong>请注意:此命令使用前提为需要在shell中提前使用 <code>conda init</code></strong></p><h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1><h2 id="conda环境配置到fish中"><a href="#conda环境配置到fish中" class="headerlink" title="conda环境配置到fish中"></a>conda环境配置到fish中</h2><p>在<code>bash</code>中输入:</p><p><code>conda init fish</code></p><p>即可</p><h2 id="出现错误-Variables-may-not-be-used-as-commands-In-fish-please-define-a-function-or-use-39-eval-CONDA-EXE-39"><a href="#出现错误-Variables-may-not-be-used-as-commands-In-fish-please-define-a-function-or-use-39-eval-CONDA-EXE-39" class="headerlink" title="出现错误:Variables may not be used as commands. In fish, please define a function or use'eval $CONDA_EXE'. "></a>出现错误:<code>Variables may not be used as commands. In fish, please define a function or use'eval $CONDA_EXE'. </code></h2><p>经过面向Google编程之后发现,在<code>fish</code>版本小于 <code>3.0.0</code>时会出现这个问题:<a href="https://github.com/conda/conda/issues/11079">问题链接</a>,因此,需要通过执行<a href="https://github.com/conda/conda/issues/11079#:~:text=on%2013%20Jan-,I%20also%20came%20across%20this%20error.,-I%20solved%20it">下面命令</a>,将fish更新到最新版本来解决此类问题</p><p><code>sudo apt-add-repository ppa:fish-shell/release-3</code></p><p><code>apt update</code></p><p><code>sudo apt install fish</code></p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li><a href="https://docs.anaconda.com/anaconda/install/linux/">官网教程</a></li><li><a href="https://phoenixnap.com/kb/how-to-install-anaconda-ubuntu-18-04-or-20-04">国外博客[<strong>How to Install Anaconda on Ubuntu 18.04 and 20.04</strong>]</a></li><li><a href="https://github.com/conda/conda/issues/11079">Github[fish使用conda报错]</a></li></ul>]]></content>
<summary type="html"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>想拿自己的云服务器跑Python脚本,为了防止环境导致后续出现问题,因此尝试安装Linux的Anaconda</p></summary>
<category term="study" scheme="https://zhycarge.github.io/OLD_BLOG/categories/study/"/>
<category term="Linux" scheme="https://zhycarge.github.io/OLD_BLOG/tags/Linux/"/>
</entry>
<entry>
<title>配置Tensorflow环境</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/05/24/%E9%85%8D%E7%BD%AETensorflow%E7%8E%AF%E5%A2%83/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/05/24/%E9%85%8D%E7%BD%AETensorflow%E7%8E%AF%E5%A2%83/</id>
<published>2022-05-24T03:00:00.000Z</published>
<updated>2022-07-05T08:55:26.000Z</updated>
<content type="html"><![CDATA[<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于机器学习课程需要制作一款基于机器学习的程序代码,因此需要安装 <code>Tensorflow-gpu</code>来进行跑代码,众所周知, <code>Tensorflow</code>环境以难配而出名,因此本文作为记录,浅踩坑</p><span id="more"></span><ul><li><a href="#Linux">Linux配置</a></li><li><a href="#Windows">Windows配置</a></li></ul><h2 id="所需"><a href="#所需" class="headerlink" title="所需"></a>所需</h2><ul><li>一台支持GPU算力的机器</li><li><code>anconda</code>环境</li></ul><p>请注意:在执行下面代码的前提为:你要确定你电脑的<code>CUDA</code>版本信息,由于 <code>tensorflow</code>版本管理相当苛责,因此版本不对可能会<strong>导致无法运行</strong>.因此在开始整个教程前,你需要找好自己的配置文件</p><h1 id="Linux"><a href="#Linux" class="headerlink" title="Linux"></a>Linux</h1><h2 id="查找自己的CUDA版本"><a href="#查找自己的CUDA版本" class="headerlink" title="查找自己的CUDA版本"></a>查找自己的CUDA版本</h2><p>使用命令:<code>nvidia-smi</code></p><p>部分截图如下:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220524135128485.png" alt="image-20220524135128485"></p><p>如上对应的便是你的<code>CUDA</code>版本</p><h2 id="创建一个虚拟环境"><a href="#创建一个虚拟环境" class="headerlink" title="创建一个虚拟环境"></a>创建一个虚拟环境</h2><p><code>conda create --name 你的环境名称 python=3.7</code></p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220524104957676.png" alt="image-20220524104957676"></p><p>输入<code>y</code>进行安装,出现如下提示代表安装完成,虚拟环境配置成功</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220524105024850.png" alt="image-20220524105024850"></p><h2 id="进入虚拟环境"><a href="#进入虚拟环境" class="headerlink" title="进入虚拟环境"></a>进入虚拟环境</h2><p><code>conda activate 你的环境名称</code></p><p>当前面括号内显示的是你的环境名称,则代表进入成功</p><h2 id="安装-cudatoolkit"><a href="#安装-cudatoolkit" class="headerlink" title="安装 cudatoolkit"></a>安装 <code>cudatoolkit</code></h2><p>根据自己的GPU对应的<code>CUDA</code>进行配置,具体对应关系详见: <a href="https://tensorflow.google.cn/install/source_windows#gpu">对应关系</a></p><p>这里以我电脑为例,安装 <code>cudatoolkit=10.1</code>(这里图文版本对应不匹配,原因看<a href="#cudnn%E5%8C%85%E9%97%AE%E9%A2%98">其他->cudnn包问题</a>):</p><p><code>conda install cudatoolkit=10.1</code></p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220524105959190.png" alt="image-20220524105959190"></p><p>出现以下信息表示安装完成</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220524112427875.png" alt="image-20220524112427875"></p><h2 id="安装-cudnn"><a href="#安装-cudnn" class="headerlink" title="安装 cudnn"></a>安装 <code>cudnn</code></h2><p>也是要从官网上查询相关安装指南,具体对应关系详见: <a href="https://tensorflow.google.cn/install/source_windows#gpu">对应关系</a></p><p>这里以我电脑为例,安装 <code>cudnn=7.6</code></p><p><code>conda install cudnn=7.6</code></p><p>安装结果如下:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220524121940510.png" alt="image-20220524121940510"></p><h2 id="安装-Tensorflow-gpu-2-3"><a href="#安装-Tensorflow-gpu-2-3" class="headerlink" title="安装 Tensorflow-gpu=2.3"></a>安装 <code>Tensorflow-gpu=2.3</code></h2><p>输入命令:</p><p><code>pip install tensorflow-gpu==2.3.0</code></p><h1 id="Windows"><a href="#Windows" class="headerlink" title="Windows"></a>Windows</h1><p>与Linux安装方式基本相同,这里不在进行多余赘述,仅加入在windows下如何判断自己的<code>CUDA</code>版本</p><h2 id="判断自己的CUDA版本"><a href="#判断自己的CUDA版本" class="headerlink" title="判断自己的CUDA版本"></a>判断自己的<code>CUDA</code>版本</h2><p>在桌面右键,打开 <code>NVIDIA控制面板</code>,点击左下角的 <code>系统信息</code></p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220524111959441.png" alt="image-20220524111959441"></p><p>点击 <code>组件</code>然后看 <code>3D设置</code>中的 <code>NVCUDA64.DLL</code> 后面的 <code>产品名称</code>中<code>CUDA</code>版本便为你的版本信息,如下图所示,我的<code>CUDA</code>版本便是<code>11.1.70</code></p><p>寻找的时候对应的便是 <code>11.1</code>(其实个人实践可以向下兼容2333)</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220524112056943.png" alt="image-20220524112056943"></p><p>剩余的配置过程与Linux一致,直接参考Linux便可</p><h1 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h1><h2 id="Conda更换镜像-转载"><a href="#Conda更换镜像-转载" class="headerlink" title="Conda更换镜像|转载|"></a>Conda更换镜像|<a href="https://blog.csdn.net/qq_45688354/article/details/108014189">转载</a>|</h2><p>在国内访问相关国外网站使用原本的资源会显得很慢(尤其在学校实验室中),因此可以通过换源或者使用”科学”的方式进行访问,<strong>这里不对第二种方式进行讨论</strong>,仅讨论如何更换镜像源</p><blockquote><p>由于我使用的是科学方式,因此对于换源方式成功性不做评价</p></blockquote><ul><li><p>显示之前的镜像源</p><p><code>conda config --show</code></p></li><li><p>添加镜像源</p><p><code>conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/</code><br><code>conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/</code><br><code>conda config --set show_channel_urls yes</code></p></li><li><p>清除之前的缓存</p><p><code>conda clean -i</code></p></li><li><p>删除指定的镜像源</p><p><code>conda config --remove channels 你想移除的指定镜像路径</code></p></li><li><p>恢复默认镜像源</p><p><code>conda config --remove-key channels</code></p></li></ul><h2 id="cudnn包问题"><a href="#cudnn包问题" class="headerlink" title="cudnn包问题"></a>cudnn包问题</h2><p>由于在安装的过程中,发现报错</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220524120302807.png" alt="image-20220524120302807"></p><p>后面查询相关知识了解到一个<a href="https://github.com/conda/conda/issues/8293">issue</a> ,因此推断可能是镜像源问题,所以更换成默认镜像源,然后发现更换了报错信息:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220524120404556.png" alt="image-20220524120404556"></p><p>根据相关指引,去官方库中进行搜索,发现:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220524120519754.png" alt="image-20220524120519754"></p><p>特喵的! <code>cudnn</code>包并没有 <code>8.0</code>版本,如果想自行配置<code>8.0</code>版本,时间开销可能过大,因此选择已有的<code>7.6</code>版本,与其匹配的是 <code>Tensorflow-2.3.0</code>版本,因此上面部分信息可能图文不符,<strong>以文字描述为主</strong>(主要是懒不想删照片重新截图2333)</p><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><blockquote><p>排名不分先后</p></blockquote><ul><li><a href="https://tensorflow.google.cn/install?hl=zh-cn">Tensorflow官网安装教程</a></li><li><a href="https://blog.csdn.net/qq_45688354/article/details/108014189">Conda换源教程</a></li><li><a href="https://tensorflow.google.cn/install/source_windows?hl=zh-cn#gpu">Tensorflow版本对应关系</a></li><li><a href="https://www.anaconda.com/">Anconda官网</a></li></ul>]]></content>
<summary type="html"><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>由于机器学习课程需要制作一款基于机器学习的程序代码,因此需要安装 <code>Tensorflow-gpu</code>来进行跑代码,众所周知, <code>Tensorflow</code>环境以难配而出名,因此本文作为记录,浅踩坑</p></summary>
<category term="Study" scheme="https://zhycarge.github.io/OLD_BLOG/categories/Study/"/>
<category term="Tensorflow" scheme="https://zhycarge.github.io/OLD_BLOG/tags/Tensorflow/"/>
</entry>
<entry>
<title>数字图像处理笔记——第五章</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/05/20/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E7%AC%94%E8%AE%B0(%E7%AC%AC%E4%BA%94%E7%AB%A0)/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/05/20/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E7%AC%94%E8%AE%B0(%E7%AC%AC%E4%BA%94%E7%AB%A0)/</id>
<published>2022-05-20T07:00:00.000Z</published>
<updated>2022-05-20T08:52:35.000Z</updated>
<content type="html"><![CDATA[<h1 id="图像复原与重建"><a href="#图像复原与重建" class="headerlink" title="图像复原与重建"></a>图像复原与重建</h1><span id="more"></span><blockquote><p>请注意:文章中的[^123]标码,代表数字图像处理——冈萨雷斯版图书的指定页码部分</p></blockquote><h2 id="复原与重建相关关系"><a href="#复原与重建相关关系" class="headerlink" title="复原与重建相关关系"></a>复原与重建相关关系</h2><p>图像增强主要为主观处理,图像复原很大程度为客观处理</p><p>图像复原是利用退化现象的先验知识来复原已经退化的图像,因此主要是对退化建模并且应用逆过程来复原图像</p><h2 id="图像退化-复原的一个模型"><a href="#图像退化-复原的一个模型" class="headerlink" title="图像退化/复原的一个模型"></a>图像退化/复原的一个模型</h2><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220520160201551.png" alt="image-20220520160201551"></p><h2 id="常见的复原算法"><a href="#常见的复原算法" class="headerlink" title="常见的复原算法"></a>常见的复原算法</h2><h3 id="只存在噪声的复原——空间滤波"><a href="#只存在噪声的复原——空间滤波" class="headerlink" title="只存在噪声的复原——空间滤波"></a>只存在噪声的复原——空间滤波</h3><h4 id="均值滤波器"><a href="#均值滤波器" class="headerlink" title="均值滤波器"></a>均值滤波器</h4><h5 id="算术平均滤波器-227"><a href="#算术平均滤波器-227" class="headerlink" title="算术平均滤波器[^227]"></a>算术平均滤波器[^227]</h5><p>使用大小$m*n$的一个空间核来实现,核的所有系数都是 $1/mn$均值滤波平滑图像中的局部变化,会降低图像中的噪声,但会模糊图像</p><h5 id="几何均值滤波器-227"><a href="#几何均值滤波器-227" class="headerlink" title="几何均值滤波器[^227]"></a>几何均值滤波器[^227]</h5><p>几何均值滤波器实现的平滑可与算数平均滤波器相比,但损失的图像细节会更少</p><h5 id="谐波平均滤波器"><a href="#谐波平均滤波器" class="headerlink" title="谐波平均滤波器"></a>谐波平均滤波器</h5><p>其滤波器既能处理盐粒噪声,又能处理类似于高斯噪声的其他噪声,但是不能处理胡椒噪声</p><h5 id="反谐波平均滤波器-227"><a href="#反谐波平均滤波器-227" class="headerlink" title="反谐波平均滤波器[^227]"></a>反谐波平均滤波器[^227]</h5><p>适用于降低或消除椒盐噪声,$Q$为正值时可以消除胡椒噪声,$Q$为负值时,可以消除椒盐噪声,但是</p><p><strong>不可以同时消除以上两种噪声</strong></p><p>$Q=0$时,反谐波平均滤波器简化为算术平均滤波器</p><p>$Q=-1$时,简化为谐波平均滤波器</p><h3 id="统计排序滤波器"><a href="#统计排序滤波器" class="headerlink" title="统计排序滤波器"></a>统计排序滤波器</h3><p>统计排序滤波器为空间滤波器,基于滤波器所围邻域中的像素值的顺序,结果决定了滤波器的响应。</p><h4 id="中值滤波器-229"><a href="#中值滤波器-229" class="headerlink" title="中值滤波器[^229]"></a>中值滤波器[^229]</h4><p>使用预定义的像素邻域的灰度中值来代替像素的值</p><p>可以有效的降低某些随机噪声,并且模糊度要小得多,对于单极或双极冲激噪声,中值滤波器效果更好</p><h4 id="最大值滤波器和最小值滤波器-230"><a href="#最大值滤波器和最小值滤波器-230" class="headerlink" title="最大值滤波器和最小值滤波器[^230]"></a>最大值滤波器和最小值滤波器[^230]</h4><p>最常使用的统计排序滤波器,但不是唯一使用的滤波器。</p><p>最大值滤波器可以找到图像中的最亮点或者用于削弱与明亮区域相邻的暗色区域</p><p>最大值滤波器可以降低胡椒噪声;</p><p>最小值滤波器可以找到图像中最暗点,或者用于削弱与暗色区域相邻的明亮区域</p><p>可以降低椒盐噪声</p><h4 id="中点滤波器-230"><a href="#中点滤波器-230" class="headerlink" title="中点滤波器[^230]"></a>中点滤波器[^230]</h4><p>统计排序滤波器和平均滤波器的结合,最适合用于处理随机分布的噪声,如:高斯噪声、均匀噪声</p><h4 id="修正阿尔法均值滤波器-230"><a href="#修正阿尔法均值滤波器-230" class="headerlink" title="修正阿尔法均值滤波器[^230]"></a>修正阿尔法均值滤波器[^230]</h4><p>适合处理多种混合噪声,如高斯噪声和椒盐噪声</p><h3 id="自适应滤波器"><a href="#自适应滤波器" class="headerlink" title="自适应滤波器"></a>自适应滤波器</h3><p>自适应滤波器的性能要优于前面讨论的所有滤波器,但增大了其复杂度</p><h4 id="自适应局部降噪滤波器-233"><a href="#自适应局部降噪滤波器-233" class="headerlink" title="自适应局部降噪滤波器[^233]"></a>自适应局部降噪滤波器[^233]</h4><p>均值为计算平均值区域上的平均灰度</p><p>方差是该区域上的图像对比度</p><h4 id="自适应中值滤波器-234"><a href="#自适应中值滤波器-234" class="headerlink" title="自适应中值滤波器[^234]"></a>自适应中值滤波器[^234]</h4><p>若椒盐噪声的空间密度较低,则使用中值滤波器滤波效果性能更好。</p><p>自适应中值滤波器可以处理更大概率的噪声</p><p>优点:可以在保留图像细节的同时平滑非冲激噪声</p><h2 id="使用频率域滤波器降低周期噪声"><a href="#使用频率域滤波器降低周期噪声" class="headerlink" title="使用频率域滤波器降低周期噪声"></a>使用频率域滤波器降低周期噪声</h2><p>频率域技术可以有效分析并滤除周期噪声</p><h3 id="陷波滤波深入介绍-236"><a href="#陷波滤波深入介绍-236" class="headerlink" title="陷波滤波深入介绍[^236]"></a>陷波滤波深入介绍[^236]</h3><h3 id="最优陷波滤波-239"><a href="#最优陷波滤波-239" class="headerlink" title="最优陷波滤波[^239]"></a>最优陷波滤波[^239]</h3><h3 id="线性位置不变退化-243"><a href="#线性位置不变退化-243" class="headerlink" title="线性位置不变退化[^243]"></a>线性位置不变退化[^243]</h3><h2 id="估计退化函数"><a href="#估计退化函数" class="headerlink" title="估计退化函数"></a>估计退化函数</h2><p>估计图像复原中退化函数主要有三种:</p><ul><li>观察法</li><li>试验法</li><li>数学建模法</li></ul><h3 id="采取观察法估计退化函数-245"><a href="#采取观察法估计退化函数-245" class="headerlink" title="采取观察法估计退化函数[^245]"></a>采取观察法估计退化函数[^245]</h3><p>应用:复原一幅具有历史价值的老照片</p><h3 id="采取试验法估计退化函数-245"><a href="#采取试验法估计退化函数-245" class="headerlink" title="采取试验法估计退化函数[^245]"></a>采取试验法估计退化函数[^245]</h3><h3 id="采用建模法估计退化函数-245"><a href="#采用建模法估计退化函数-245" class="headerlink" title="采用建模法估计退化函数[^245]"></a>采用建模法估计退化函数[^245]</h3><h2 id="逆滤波"><a href="#逆滤波" class="headerlink" title="逆滤波"></a>逆滤波</h2><p>直接逆滤波的性能一般较差,一般改进之后进行运算</p><h2 id="最小均方误差(维纳)滤波"><a href="#最小均方误差(维纳)滤波" class="headerlink" title="最小均方误差(维纳)滤波"></a>最小均方误差(维纳)滤波</h2><p>此算法基础:将图像和噪声视为随机变量</p><h2 id="约束最小二乘方滤波-252"><a href="#约束最小二乘方滤波-252" class="headerlink" title="约束最小二乘方滤波[^252]"></a>约束最小二乘方滤波[^252]</h2><h2 id="几何均值滤波-255"><a href="#几何均值滤波-255" class="headerlink" title="几何均值滤波[^255]"></a>几何均值滤波[^255]</h2><h2 id="由投影重建图像"><a href="#由投影重建图像" class="headerlink" title="由投影重建图像"></a>由投影重建图像</h2>]]></content>
<summary type="html"><h1 id="图像复原与重建"><a href="#图像复原与重建" class="headerlink" title="图像复原与重建"></a>图像复原与重建</h1></summary>
<category term="学校课程" scheme="https://zhycarge.github.io/OLD_BLOG/categories/%E5%AD%A6%E6%A0%A1%E8%AF%BE%E7%A8%8B/"/>
<category term="笔记" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="数字图像处理" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/"/>
</entry>
<entry>
<title>数字图像处理笔记——第六章</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/05/19/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E7%AC%94%E8%AE%B0%EF%BC%88%E7%AC%AC%E5%85%AD%E7%AB%A0%EF%BC%89/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/05/19/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E7%AC%94%E8%AE%B0%EF%BC%88%E7%AC%AC%E5%85%AD%E7%AB%A0%EF%BC%89/</id>
<published>2022-05-19T07:00:00.000Z</published>
<updated>2022-05-19T08:00:05.000Z</updated>
<content type="html"><![CDATA[<h1 id="彩色图像处理"><a href="#彩色图像处理" class="headerlink" title="彩色图像处理"></a>彩色图像处理</h1><span id="more"></span><h2 id="彩色模型"><a href="#彩色模型" class="headerlink" title="彩色模型"></a>彩色模型</h2><ul><li><p>目的、作用</p><p>使用某种标准来方便的规定颜色</p></li><li><p>本质规定</p><ul><li>坐标系</li><li>坐标系内子空间</li></ul></li><li><p>面向</p><ul><li><p>面向应用的</p><ul><li><p>HSI(色调、饱和度、亮度)</p><p>针对人们描述和解释颜色的方式</p></li></ul></li><li><p>面向硬件的</p><ul><li>RGB(红、绿、蓝)模型</li><li>CMY(青色、深红色、黄色)</li><li>CMYK(青色、深红色、黄色、黑色)</li></ul></li></ul></li></ul><h3 id="GRB色彩模型"><a href="#GRB色彩模型" class="headerlink" title="GRB色彩模型"></a>GRB色彩模型</h3><p>以红、绿、蓝三种光谱成分表示,根据笛卡尔坐标系建立</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519150532414.png" alt="image-20220519150532414"></p><p>其中,每个像素所用的比特数称为像素深度</p><p>术语全彩图像通常用于表达一幅24比特的RGB彩色图像</p><p>对于数字图像,立方体值域已被标定为图像中比特数表示的数字</p><p>若原色为8比特,则值域为[0,255]</p><h3 id="CMY与CMYK彩色模型"><a href="#CMY与CMYK彩色模型" class="headerlink" title="CMY与CMYK彩色模型"></a>CMY与CMYK彩色模型</h3><p>青色、深红色、黄色是二次元色,为颜料颜色。大多数在纸上淀积色彩的设备,都会要求进行RGB->CMY的转换,或直接输入CMY数据,转换方式如下:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519151131011.png" alt="image-20220519151131011"></p><p>式子中将所有的彩色值统一归化到区间[0,1]之间,并且RGB值可以用$1-CMY$值来获得</p><p>在实际过程中,CMY所对应的颜色并不是纯色的,组合颜色会产生模糊的棕色,因此引用黑色(用K来表示)</p><p>提出 CMYK彩色模型。其转换模型如下(CMK转换为CMYK):</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519151443907.png" alt="image-20220519151443907"></p><h3 id="HSI色彩模型"><a href="#HSI色彩模型" class="headerlink" title="HSI色彩模型"></a>HSI色彩模型</h3><p>上述彩色系统适合硬件实现,但并不能很好的描述人类实际解释的颜色,并且并不会认为彩色图像是由3副原色图像合成的单幅图像。</p><p>通常观察物体时,会用色调、饱和度、亮度来表述这个物体,因此HSI模型会分离彩色图像中亮度成分和所携带的色彩的信息,会更自然和直观的彩色描述来开放图像处理算法的有用工具。RGB对图像彩色生成是理想的,但对于颜色描述有许多局限性。下图为基于彩色三角形和圆形的HSI模型:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519151902509.png" alt="image-20220519151902509"></p><h4 id="RGB到HSI的彩色变换"><a href="#RGB到HSI的彩色变换" class="headerlink" title="RGB到HSI的彩色变换"></a>RGB到HSI的彩色变换</h4><p>公式内容,详见书P288</p><h2 id="假彩色图像处理"><a href="#假彩色图像处理" class="headerlink" title="假彩色图像处理"></a>假彩色图像处理</h2><p>假彩色图像处理指按照规定的准则对灰度值赋予颜色的处理.</p><ul><li><p>假彩色</p><ul><li><p>介绍</p><p>用于区分对单色图像赋予彩色的处理或对真彩色图像赋予彩色的处理</p></li><li><p>主要应用</p><p>可视化和解释单幅图像或一序列图像中的灰度事件</p></li></ul></li></ul><h3 id="灰度分层和彩色编码"><a href="#灰度分层和彩色编码" class="headerlink" title="灰度分层和彩色编码"></a>灰度分层和彩色编码</h3><p>灰度分层和彩色编码技术是假彩色图像处理最简单、最早期的例子。</p><p>分层方法是先平行于图像坐标平面放置一个平面,然后让每个平面”切割“相交的区域</p><p>下图显示用 $f(x,y)=I_i$处的一个平面将图像灰度函数切割为两部分的例子:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519152728656.png" alt="image-20220519152728656"></p><p>灰度级在该平面上的像素编码为一种颜色,灰度级在平面下的一种像素编码为另一种颜色。平面上的灰度级本身可以赋予两种颜色的任意一种,也可以赋予第三种颜色来突出这一级别的像素。</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519153049962.png" alt="image-20220519153049962"></p><h3 id="灰度到彩色的变换"><a href="#灰度到彩色的变换" class="headerlink" title="灰度到彩色的变换"></a>灰度到彩色的变换</h3><p>通过对输入像素的灰度执行三个独立的变换,然后将三个结果分别输入彩色显示器中的红色、绿色和蓝色通道,通过这种方法来生成一幅合成图像,图像颜色由变换函数的性质调控</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519153259571.png" alt="image-20220519153259571"></p><p>此处使用灰度级分段线性函数来产生颜色</p><h2 id="全彩色图像处理基础"><a href="#全彩色图像处理基础" class="headerlink" title="全彩色图像处理基础"></a>全彩色图像处理基础</h2><p>分类如下:</p><ul><li><p>分别处理每幅图像的灰度分量图像,然后将处理后端各幅分量图像合成一幅彩色图像</p></li><li><p>直接处理彩色像素</p><p>因为全彩色图像至少有三个分量,因此彩色像素是向量</p><p>在RGB系统中,每个彩色点都可以使用RGB坐标系从原点延伸到该点的一个向量来解释:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519153742654.png" alt="image-20220519153742654"></p></li></ul><p>一对空间坐标$(x,y)$确定了所有三幅分量图像中的同一个像素位置:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519153900803.png" alt="image-20220519153900803"></p><p>在式(6.37)描述了一个向量,其分量为空间变量x与y,由于可能会混淆,因此可以引入一个因子来让我们处理彩色图像,使用标准的灰度图像处理方法但单独处理彩色图像中的每幅分量图像,在处理完成之后需要使用直接处理彩色点元素的方法,当这些点有两个及以上的成分时,称其为<strong>体素</strong>;在指一幅以上的二维图像时,会交替使用术语向量、点和体素。</p><p>每幅分量图像处理等价于基于向量的处理,需满足:</p><ul><li>处理必须同时适用于向量和标量</li><li>对向量(体素)的每个分量的运算,必须独立于其他分量</li></ul>]]></content>
<summary type="html"><h1 id="彩色图像处理"><a href="#彩色图像处理" class="headerlink" title="彩色图像处理"></a>彩色图像处理</h1></summary>
<category term="学校课程" scheme="https://zhycarge.github.io/OLD_BLOG/categories/%E5%AD%A6%E6%A0%A1%E8%AF%BE%E7%A8%8B/"/>
<category term="笔记" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="数字图像处理" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/"/>
</entry>
<entry>
<title>近日小记(2022-5-19)</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/05/19/2022-5-19%E8%BF%91%E6%9C%9F%E5%B0%8F%E4%BA%8B/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/05/19/2022-5-19%E8%BF%91%E6%9C%9F%E5%B0%8F%E4%BA%8B/</id>
<published>2022-05-19T02:00:00.000Z</published>
<updated>2022-10-16T16:32:28.000Z</updated>
<content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="好像密码不正确呢?再试试吧" data-whm="OOPS, these decrypted content may changed, but you can still have a look."> <script id="hbeData" type="hbeData" data-hmacdigest="27414a7b98ceb497efc6255d099b4f1e3c2a369cc740bad63eea01846a5f0c77">4630436162ade97ba2718b7d0c4b3b63cb3a3f659c5ca08b4bca0f584592818641b49054f4424d6eaa072c3306d840e4975cba159072463d0b294b5cd2cd901a2a9bc920fdacaf2d96b572471462444dcbdcc85eddb1c09ce3d9a4f9ad8989dcadcac8fd64a1b05a9003290fe28caf8db154ffbfd9a91858d42106081f66499eaef2083ce97e5bc12ad8b8decf8db62520a3d0cf23ad0a8a27564e4ccdd4d18f2e5d9d64e7d9fad9d1f4cb0ae9b88b2054b0954a8255cc8b39c51a103e94e7096383c34b3fce029140a7760fd79caa56b43c504e89756a6895d4792d31f923bfa28bfb793059ad47738a555ee2bb4593ec24b903b832eb582edefad57523c69d8efa0feb02cdd8fade6f854dc5be7a68469b8b3f4f91907459e77176fe0cc07e35b09443e710bc86d71c6ea89bf92461a82cff5cce69f39f317ebf76bcb098d880c4a7f39b8ddd91005d380ef4f9987e7bd74f60d6b946c17229d0c04fbf68e5a038ba2999dff2150dc9a3b96dd56e49232d0deddfc8d39d7b3f550247f6ab61d583f85146426728b6b00aba1c8fb3dba7bc778aed61450c9c7ce076586add3bae6a2030ea8fe5a2585256daa6f75c520fd477ae781268a21adf3bcf92756974affea5091404778c147815ecccc710942fd371075f0d4ec9c9edfd310ced10eee54a7d9dcf745882ba0a8a77c571a3035d3e785693627af7393264bb389af657a2b532861ad1afee5b2413ec496428d897bb6d98600351ac3b475bf8997ca374ffc0f0aa167c7321c74c0e05ea5f2035233f0e1e547cffb8b63f684e60494d95211c342def01a411466435a0e9d95ad27aecff977000da126e34aaaea551431fc5851215de1cface029d44d6939c297422bdbbd627ad0bd7eb42f83697ae8c88ba6fae499f420500e7caa95bbdf39d928fd9cfdc4f56dae95b84717ed3e9a039e49aaf78432d3a5127b3269b15231e7d5fbbd793014653f6ea318073705d6ab8bfce7caac8883cb649d43ff9eae92ff3efbb80d126514952619365542f992f5eb0de08ef2d8f1a8b8d7a86f0b0ef0b05d282c7b46db02ac32241d646b405f60a7889c6801cd0bc9ce7a60dfc71f13ed073d893694a0ab0da4e8c5794851b37c5c547d3798c5fe3a107cb3e130a14f7e115e643ca442a742fd13bca5f09afc72db9ae5a6235b393fffb1a67b498fdd573014518eacb312d4212bb4f7a69107da2e347bece1b9ed8d2ac0be8bad7bb2b4e8d096f6f5640c56b8750559fb6b92aa2e8241bae175268321018409202e59bea9bd993d2f91d9162ff9d36ba4669c1a0cf90316e1cd041c9fb08b0448d2c35e8cb4b04ae272f438a750f4b0ea6c735792e0a4e0950f0b76cc2d9c8f6b764b5f6a4b08ca598d54d247ff5b6df053744b6768b11023155c66c9d3371ea32a32975a3e6b3621b5d9e6aadc670cd37e24019daa7e63feda7a655059966eaf58dfd65fbf34b78c86fc3d899a8d4900e0b6d902623fa5ce4141a5db743e94fb881d567950ae35886d52d8585395714e8b47d57b7887a351bf42469dc39d55be6e4866a94ac246ff321dddbc4995e0164929029f2b49a900d8432dd8afc55cac847429a0a0414ff2b40b223efbb61865215f3f04f2e35ef6505e93fb1030953342c053c32e9d82a69e03c735b04bdf175f2b615c055fe4a22999f48dc7469e73f05aa62b01872e2899eec384b1ed310b36a709834086169e8800dfd369228464fd833e55847c458c9ae4945bdea82d2350352f090db08cb6f15c1a0797ef45ecf216570c58738380d7c69cde6137640c7e01fe1eaf91e889bc7ca7b47d0472a453835cde8a2fc564317a5916588a64f097b86c62ce68102403ca28f2bc376fb665c191af1d62c005e9423b5132fc549fedcbde5c85b4b7d9648d325094ba77811a84ea079bb24c0b71299a4fb30eb117cd11850eafdbea3cdca75c7789c236f51a6707f0bb20c6be4036fcd47edcfa76f6bd223e1c04263e45a966824092968c88b61dc429240a79d42dfcaf95adb3a8df38d26bcdcdfa598dc6f3a4111cd110c98b94db222853fe71891c7b3d2c3e00f9c1287a73e767e17c4c769bacb695607660791cd8e28b716c160dbc13c8e7280c59f778dd6f9c9d47cac02fcbfdab6d02a1fc43cd4d4157104d596eb601c324ae0f6e6d92f2dbe9779a5d0f7bc1004a884b12aad480783bc3525f279ae430c17f9538839bcb9c556d970455d71c2a30d4c797586b7973c4a1a0f3d721c35cc7996b7059ec609a1f5e53e90078d0b7c54d45c65dac45acb92a903471d96c27f0c513279bdc301b8115ddf08640af093ace53b6e2bdcd09179c0b0ff5fdcd170824335aa7980bbba84d6ac34439bf8834ac428f837b813a98d11096a7f55c63bff458339730b66b8d5ed9282f371836f6db20590b55f33ac97359c1bb5acf54cf7034a8201d6259b9bf630a3b47d352e7d030882cc79492ff32a5706674124d62e595429854686bba0674ce5f33e31a07e1b56550570ca6df4a9c7e2f02018b1675c292bb9880669dbf94312bc9569ab0795db29fa54c49759962e4f44a30f414f5578134b0abb40e5b53327eef51dfab9effbf8c5003108ffdad0b7842d594a6d4beae0bbd86e0868278f2a319c4538b2ff79372eb47cd8222f595332d1a8a27fc9871987a589f19fdf53f8031f5ba31e876020bc4a0bdae092d096270765dd0580d2064a133d798de42aa2df6ef0cfe82917aa9ea865222e1f00f7b4eb253c36d27440ae5a5eee1c3a4a5f2ad4350e73ced90fe088b874cd015097d89fc09c86a548d3fb92d98b187204b67022e562cefe4f5cd4496e006b95b28cd9ea42cfd41da9896e19a9d224a105a2e024c1fa3cea8c7d6059f131e575369b7b00b080452719036f74db9d91a7bf02ac8a5ce21d69a8475fbc5e8a2970c71422849da22fc0a6e15f33e5881b892b8ba5a6781baa518b85920d2570d71346fbb4ae01fa3c108e85e7444f6cad504feb3eec8162757c248938716597247eb6e54f925d9bb34c62ef862586aa135cb0dbd631988e79053b7621f4e3159f110105a41d7b07490415aef31086ba25e1f0a94d5edc85e17874cda6c9d6433a287f63fe069cf751576a28d84fe4ae4c68ed421f9ce057ed517d8c411fc7a8cfb1cadd79d1757664e993beb01aaa8e78f8a0eb4973054e3e62d3bb0dbb1638cad5a44a2349818c9c77183670e3f1f0be2f06c3e1958474afabf05d9db41bf3f9df683e74e09a26753e5925f9f99f9e6ca817d311d279a0b858ada38cddd9ec4292c5f2aedbf7d507f2adf782aa0ad9ce0f3f6516c5e4bea5edf3c82b110db7cba2e2aa4418c696b28f65afa94a8781fdafae46bcc7109eaaeff82fb8b700af7d3e397df23c7e66c02e42ecb61c334579ca934f0e1f0824abec376cb2b45200f38c8be59d38eca6b89134d232c0746459ec33ae542b6ab785d6b0fa75bdbcb3fab63a9e5e00d124d4893aa24b1694d220a21ab5f566975482a0144908177be09af50491e72b1a935a7c598ae3cb0f5c4443fa1d41562d418179551a4babbfc71c0e565a259fdb6ac42c58f17f41e1e47a89a5a8520c91fdd13f28bcfeb92820a1f638be82daff10f000cae627bb234ee606885586a1f99ffa26803a1277fe4ff3b871180007ef13e0ff869e2145f07914ba9a2b3233815caf9ba0bf021410348e3357e75ad225d4fda41974c88643f20e375fdffc9a12404f6d6458ff4d2d906c1b13126a830ea30f0f860574207fcae6b0f1ea138d4144a9aa0c972ec06ddd54085c440dbadbe5f7e9518c63f5f98e58600906bce676791bae48dab5e4ec84d7ce77fc6a4abde6d57709352937e617bdeafac78188d6e177001f6a9284226b5da4718cb0d77c03049c249498af5c90a729149b918a733a24018d5011eb5e004b603d06d8d4fb84d3e233de606afeef49e5a7b1cad6de4d014746561743d22c51943b153276c69ff7b2102e1a1b6344ecd9d622c42d11ff0abebd0e0061b2038b447fb5d767b089950025d4348607cbc11b41791b52cb9671221b41389d9f4d5b2c97dd92aaca4846c9d7c8e7031ac36cc4290ba7703cf649024898ef4c50b44d61d1859b695a9813af82696b753dbd4fa2aabcdb81f14b6e018b5615363e7996c130978c32d967a0c7b9d4e22f6289e15f76fa4a479051abe5ae82b00dafdd73b121b9cca40fc28d484c7dc291e134184532611397df9db9f6ecbaf28029c81b13f252d161dd2eb315c5ede3eacb2afeb6b08cc18fb699b8b668b05636ca47838c65327be35f32d3da0204dd442eb7e957e9350a7fe6196a861db71f044303708cfc3aa17503b195729892d2ca3daaaa5a3e312fc09937bbcfb299e1774b7208d247f98fee508167df943c7fdf01f13a7b9fb7e93e00fd6a791df3e4224b0c74b653bf93f5184af8523b769ddfd297840eec4545f55d913b14de27b12a960cf369207a07656c46780ed3e3bf11c846c400f943fe132f5da053108a7c61e02c68c7f3026dedd51edc1649dfa7c8db16d4251374374be4fdcaded430f82bef3e9ec2de52ce30787e1c34347ff10b11eeb4eafe3321ad516d82016cabe0a1b107e11934e8830a485cf1ec844ff8264c569873e6c308e66cff0bc5e1faaf5910283cfbab773f146c10549b530b50f7493e875392cdd7d5506959b20801e9c682a373a5644bcc6bad0965a6c0c30979fdc1536a90c4f5f9222015078428392517a41c1aa818f650d89e1762ce4818580c24bedb9820287e22115bb7168be5484d0576a8fcda16def6519c3e3fcf6e176e107975ea4f7d1b7dbc5ef0fa7094b6e2db30661da1ebe94413c6d02a313895eb12fae56a0dc99c67ecce46eb234deff0f6c21c065c03664f3843729de3a7a50a6030dd2f8db1fa266986318c6f0919d5e564a98fc581c7003de66b0a2ca0d494a45907cf87c8427b9f0fd69d2164cbf9f8d1d7e15c4bfbd2014006d4627adcbbd3a2eb12857cb0ca05a9dc820bbf06cbbb7c013f69f75bdb4d3459545c64d06e04cc8af5556b071368b487b68e1f23a5a993533494229a3d2cda956b051b6f524118055f1ac9c83680fb0aaaf85a77113b5d5da1d2520323b67e283f433a0ff5c52741acb0617d87cd839c74166d1600ae6e7810e45fdffec3e11245494ed1b1fd6132256ba27f7638f3051b4564b81fafaef22b0e076becb3c6bde45850f486cd8aa56261b79be305180117eb9d5ecbe0d970141681c35bab8495380944c9f74213c631d396f5439011f2b0e75e13c73430d8e84d539bee7b18a4bea21b1e4e382d2993cf639c67e7308eaeff7393d58db8e557d3ca37e9092f5723828e654c4364e6b2deb573832b5111d8ca9822304b0cdcf4e129ab2623f92338ba5314119fb360edb513f6cfbd6ffb4fe9646a6c5b978b6e9d47811f5d6939087d3b3874554b821d5b23dd68a3dc24bd7000a9e80b349c3056c63b48c9aaf9447328b04058cf2ee79c2ed3d4445c367000381298c383ca4445600241c8d1629615949723e397ff950d5d63fffd9b00221eb8d4b04ccd9d73b2ca399c8053ad626d463c780a95ff9d979df5424fe5945ab5a82e38f2b3b9c898474ec6b62bb239492cefd1b3511f3855e5ef4cebefcacf0f7c127d62f6c77a03b8ad76309be87d7c91600e01720722a226acec1eb594d8c2e46ffde6bf3620f6df2994417c97227b3589989a32ade52503ce53867ca6033deb9155fe06e3f196c5816485840918919f796ce9b00e07aa38aa74a7821d23fd7cd1fae7526a3c6a2cfe12cef4fb972c73bedd6aacb017e840aa19f266e45292cefc2cf1f841711c052bdfd8ab5f59b975cdeb53527736304b7c85a7655aa3b31dc1a1fb0cb735286fa7df704a0e35e0be40ddb8dae3bf47052bd68a6486c366c4176c3100dc7edfe6db9058e10e71fbc3009875a780ed6ad2620eb0579aac9f1588151d19a36938233cb47308619edfcd53ae5de350373c234a6a5b1a5e84b41a36fe263064bb3d34c66f1411b2e4abe74ac843bb50adeaa1ed9b4ee77aded01e22595d6f68a92663c7e5eef9f243065924ba86b9d5e5713c10472878c059e4ccc9edf2f5e7a3c22f4debdac6918c8b4eef01930b2b5e4735c644101ecd727f015a76ae684dd6bda35e03ccea9c2e3c895ab615212705031c1623ee49ce42e145785387e43aadb9a0b80836e7fc27a54a4d62cd08cdd8bbd923e0ecfd62f3d7d683e4f3aefbf5801c8390caa0c317ccbc0e14a0031693074a13d193ea23b0dc57614a989e32fa84e3c7efaf194b314ae557fddb209cfb8b5d4ba0e4ad2b86c538cffeae6e4e21e5fb9e9309b37eb59f9e9c96680b9a7c115e0525636c529f7c2c386923606c5b620bb35fc36760bb80e0961cea5a25acbc0ef8edd628bee8662fc3dbdab800a98b1b019749e69efdaa77bb7da337aef8782c72d77c91506ee2ba4ea5ba7b19aa077fbe0c5baa76210bef16b962e930d28046cf9e7c477ff5ff8d56903acfe5bba617ff7e6e84eaec1642bebb85934a098072065d7e15deadc5d107a069bf5a626900c74c6ae873482f167df8cacc16f1e7da2bdb574a4a6b0ede527097d9c964ec02d12ad9ac5c199b23daa5fdb0d310200f3d535a83fc296a657cc4ccb62c847b5401a8b20c91f3371fc5171edeac0280d2614fc477b90ead3a30d11005d09a671d77f1abff3a1967c287999ff11148e0d6f2702d9bad966b601fdec82c13001cbc236ed0635db8872f981f9c5e023b259d88bcbb5d6ce077af4393c6ee55ee4fda66005fe451ae7d0c54d085d4aefe48776bc519e91105357af11e305bbeffe2b0c77200b4e853e66a03a68b34b1566248d5c6b036e8225c0d5ae89542df6f161524a44cdde2efe67ae8b6189c612bb8a1430467f0c776d25cf99fc10899b7ffb766961a2026fda270b790c6b4fca5f1a55e143ceb209206c71b773d4333e3a804d253747ed1d9de61707cb07a4db68a6e1967dad2bd98a7d95247d885ced159e5dbcc078b043e80b93f95662de85de8effbf5b0eef20d8e689193a2f637d992f6a5c8f77338e325c020187422bf366bb0a8c5060f15e6057b8e49914410c55dbe7b676fc4dac9ab9b98a0ff4f56fcd615057af8375c837a60b9a03301996229a62fc82dff3d8a22559a8b7b2e7a97009a769620f9a5b37fea1c6eca593b63a67ccf4d51641cbfdeb5541fd8fe929e9efccc115b1d40df4fe0e80b39cecb09ffc6d3f072b2c27605567dd45ee71355a2e2cc283e2fa3470828f68aaeecc99d7a693d846632a22f9ba58bddd5c1128749c4add0fbee0f502b215cc460836a867cca47ebdf96e04d3df5f77615b8daf3efa746997a3dc74ac3a8d4aec4d61fe647eeb6fdd4a3ffc6b84fdbf05c32ccbe54804960d66169502ce04b1783ea7648e52d84e0703efc54bfe3acd1e5da87e57b33952137b3cbfe79743703cfa0397b01df5f3c069023eeb5c27d16b593e14544f18af17623a6406e90b4c62a390edc96c63fc1f06e7fc47e545d2c30fcd62a806bc934527a13b53442b1d0eef56adeda2b56d646aa14e90c22dfa2a59e2207ab76fe1da44a3e1d8b63398bb204324eb29e41ba96873772d4cbed37d201e767a54d53db0c0273252b608983cf1063f3b2a9b7580c8b38cb52e33b4f316f8f83b8e3cca53f77c08c8fe7019ab2d7b2455b422e9d81dfa6383d2e0c74e486fafa92ca5b9fb914e2b7cd6c6df5127e725dc79bcc055bdeb44c609a72493206086c86aee23e986d653c70b76532da4eb89b2951334bc37726acd50a2e82d3e76a309d93190707287e2ba909a3cad124f1fd26a71e692d94906228644f5fc398cd904b028a0943ef5fbc953182d36225cedb9be430479c97969aff6dcf3f744445b53f07336d4c382eecad4733c775a3cdc79a224eb8daf6e542b27a14b5acec06d30dc5f4fee61255c7f539a10ae38d0616376d1a7427c4f3e27402965d8344cdedbfefc2c1061820cf30aa78f4aef04ff7e90a5e1ca3d53efa492d7f66728cbe6f07dbfc23d1fda5a50eef3be4aea17a2dfd9e6045222787fb3ce7517bd96437e8bf71e181d97c2eaf9fd3e55b94943da79dc207829b39695ee371171a3c0556b89e2cb2c107d7aa416058eb3822b9fee7c15021873756452606be126b4e097b8e3c90f210ebc69435d1dd1c62f7c14a9e74c04615167c5dd4b9206534e5e1ef32606d98a004316bf1c7d68bfe9e8ecf69033060b7aa7585b61abdaf1fd0eee891116af4e0a9d5d02fe6451abdbe75d6e2b1dd248d2d26de7524c8c4daef3a885e97a0c6c8ca7c71014c1d38c6493474618b7adc80fab8c87a5093829e2212155e69a867fc0437b1fff3ab7f1d80aac52d6dc0c36afb07e94dac4a9533cbb62946b52e5030f85b7a9cab0902c4cacf6a9d070bfec81c5f3c7413a84a73ebdba3b45be9e46fa16b095a21404162a5a7a5b1d99097a53f99451da8937777e7e85e90d499a07d56eb10c8f35b0185349dbb017cd6cb3f8356724736ddb97a4bc5cff7a95f27559ca5668e3f444ff7766dbd9a5e8fafd598a8655e18c7daf2f04c993a3e14ee2d0d93dc34d53ed616ff0784a1d6aa3346a81d1919163c5411cd7d949708a780b7ce0a33eae0e3147ec6376c7f3c4e3bec0c80bea07d36f4202a18778d6d43ce6ef62f8cd6934db9b89b7eab0f814f2ca2c3ff93f0eac83206d47943282d8f983ac9189d900cd855a555f540ac652aa3ba986f285a40b21567613361bbe9e42c5fa6c310f870cbac5b19b214d2ee8dbc7884ea115e18edfe81ed04931d40e11c5465c69c65813f029beab975a970e1e903bafcc0cf0f25493b2de00b125e6bdfe06c94d9e79e20af36dafa8211aada804134aaf847477443df56b754f79b198f9118e739aa3397d1ef918ff49bb6b4c1bc6847c7d34e6270edb20091333b9554ddfc27143212cd3b09568f21d17acb224c51c7a396c978d2c355643e4a3581b1b66042812d93342160f3a7031d9b15a291191f96e168a6ce16f236b77bd4fd6ff9f2b295c425cce75c8fa4ff11a508f16cdeee9946d74a640a2cf7e76f15ba8c8c9fa958bd159cbebc740ec1c43d0dfc6987fb9ea4290f6016a067517c47a1d65438121377a8fc1ec7c67e4930906af1cd1755c949666e074081ffc13e125d1a08929dd33678aca665a1a5779a8953e67dff62bd374e7352362af83a3939f5b6e24cffb91b84f3cb46a34b84474ac5cd7412bc13c0b9bc45a2fcfd3422cf6c9ad13fd6a3f2f21ec15f1f24399553726bda6a6544558eb592016a4114b7a1f9440b3fd8abe3c956eeadfc93bbb4e51c22437d5aad46011907368984e9bd252b05f4c903693e010c7b324086e3660b9c91adbaed78f9979f628ef0aac3a6706b6674e8e88e928b48b6a7f9856fb251622bdb54f62c01a1e98607fa924567563399475e4a198ab828c154c79ba3decbbd03f16cb5684279c55a4e86e2153346702aa80bbf15b28bb9c749040998c2348a7bb88349d2d64b77febfee75097958c3ac63f2b6a9f839da2837b2b4a6dc0483c5201fe1bb853fcb85cc978ed21f177a2b4755a742973f701b1ee9c3a5b940051603a6865ffffaebbf429eec68e178d891f6e6b2ec092d0d7698fe7f5f1db400e06f703c44f3b957e831c33e38dd17b09253a0e75a5b07a5d6a0681ab38bc2170b0789493de20e77b32e75ac36b45243a7bfccd03b1d60001010fe1f1172cd289f70aa0b5d9bc170254e04b59e0d7399d19550b6a32c960bb41b06e80ab1f0c368f416c703a50e75bb6c17a380f7c4b99a26a2bc67d5d74b66d150ca646bc830d9d26d857d6c0c1786f824fddc66470beed79dc5b7876a7dd417fefb2c87ae3f70ec7898f352e0d0cc06873dd53dcbd5cc1ff9d869803da12c010f951cae985b54830e28fea13d96e14d66e95590da3c01073bc79c2064aad3590cf249dc0657286b7d4ecd7f3c7fb28c75ca3426be3904e2c0866b84b86426f0f1b217f34a7915b024b73e29f74c9972f65bd4d7d8f2e38e9425335f471c1e5f08e2eec37429e8c027fe1c68fcdbdd7bb246830672378061a5af90e35819bafbcc1c4ef4dd6cd008788428903bd27431ab23b108b8fa12365530b4f7696d15c3fe0b9b4ac1d2c3d050c3d5902d711dfd707976b1fa58809e8efd80c58d1fa0a35362d579e914a69ad68078b9fedb6b35ec2b296a76dbb8f98ecd09535c1dad8d204126b79bf5e1b9c3bdeb62b06bbccf35dd7d9e7113465d9a81687a6e784482de992067a09a006dc2599115c4212c4168020f6d6fe52bda162cb666b0b1e79aa9d3e1b3d5143ca97ab4a8f114</script> <div class="hbe hbe-content"> <div class="hbe hbe-input hbe-input-wave"> <input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass"> <label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass"> <span class="hbe hbe-input-label-content hbe-input-label-content-wave">输入正确密码查看正确文章</span> </label> <svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none"> <path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path> </svg> </div> </div></div><script data-pjax src="/OLD_BLOG/lib/hbe.js"></script><link href="/OLD_BLOG/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
<summary type="html">由于gitee部分技术原因,此文章进行加密处理,如需访问请留言给我</summary>
<category term="日常" scheme="https://zhycarge.github.io/OLD_BLOG/categories/%E6%97%A5%E5%B8%B8/"/>
<category term="近期" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E8%BF%91%E6%9C%9F/"/>
</entry>
<entry>
<title>数字图像处理笔记——第四章</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/05/18/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E7%AC%94%E8%AE%B0%EF%BC%88%E7%AC%AC%E5%9B%9B%E7%AB%A0%EF%BC%89/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/05/18/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E7%AC%94%E8%AE%B0%EF%BC%88%E7%AC%AC%E5%9B%9B%E7%AB%A0%EF%BC%89/</id>
<published>2022-05-18T07:00:00.000Z</published>
<updated>2022-05-19T08:17:44.000Z</updated>
<content type="html"><![CDATA[<h1 id="频率域滤波"><a href="#频率域滤波" class="headerlink" title="频率域滤波"></a>频率域滤波</h1><span id="more"></span><h2 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h2><h3 id="复数"><a href="#复数" class="headerlink" title="复数"></a>复数</h3><p>复数的定义为:<br>$$<br>C = R+jI<br>$$<br>其共轭复数为:<br>$$<br>C^* = R-jI<br>$$</p><h3 id="傅里叶级数"><a href="#傅里叶级数" class="headerlink" title="傅里叶级数"></a>傅里叶级数</h3><p>具有周期T的连续变量t的函数f(t)可被描述为乘以适当系数的正弦和/或余弦和</p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517175553626.png" alt="image-20220517175553626" /><p>其中,系数 $C_n$为:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517175855013.png" alt="image-20220517175855013"></p><h3 id="冲激函数及其取样(筛选)性质"><a href="#冲激函数及其取样(筛选)性质" class="headerlink" title="冲激函数及其取样(筛选)性质"></a>冲激函数及其取样(筛选)性质</h3><p>连续变量$t$在$t=0$处的单位冲激为$\delta (t)$,定义如下,且满足第二个式子。物理上把t看成时间,则一个冲激可理解为幅度无限、持续时间为0,拥有单位面积的尖峰信号</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517180131123.png" alt="image-20220517180131123"></p><p>其中,若将t解释为时间时,冲激就可以被是为幅度无限、持续时间为0,并且具有单位面积的尖峰信号。其具有关于积分的取样性质:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517202341057.png" alt="image-20220517202341057"></p><p>若假设, $f(t)$在 $t=0$处是连续的,位于任意一点的 $t_0$的冲激表示为 $ \delta(t-t_0)$,取样特性在冲激位置 $t_0$处得到函数值</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517202658701.png" alt="image-20220517202658701"></p><p>离散形式:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517204112997.png" alt="image-20220517204112997"></p><p>冲击串:无穷多个冲激 $\Delta T$的单位之和</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517204304188.png" alt="image-20220517204304188"></p><h3 id="连续单变量函数的傅里叶变换"><a href="#连续单变量函数的傅里叶变换" class="headerlink" title="连续单变量函数的傅里叶变换"></a>连续单变量函数的傅里叶变换</h3><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519144754319.png" alt="image-20220519144754319" style="zoom:130%;" /><p>其中,式(4.20)与式(4.21)共同构成傅里叶变换对,通常表示为:$f(t)\Leftrightarrow F(\mu)$</p><p>根据相关公式,我们可以将式(4.20)改写成为</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519145244866.png" alt="image-20220519145244866"></p><h1 id="有待补充"><a href="#有待补充" class="headerlink" title="有待补充"></a>有待补充</h1>]]></content>
<summary type="html"><h1 id="频率域滤波"><a href="#频率域滤波" class="headerlink" title="频率域滤波"></a>频率域滤波</h1></summary>
<category term="学校课程" scheme="https://zhycarge.github.io/OLD_BLOG/categories/%E5%AD%A6%E6%A0%A1%E8%AF%BE%E7%A8%8B/"/>
<category term="笔记" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="数字图像处理" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/"/>
</entry>
<entry>
<title>数字图像处理笔记——第三章</title>
<link href="https://zhycarge.github.io/OLD_BLOG/2022/05/12/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E7%AC%94%E8%AE%B0%EF%BC%88%E7%AC%AC%E4%B8%89%E7%AB%A0%EF%BC%89/"/>
<id>https://zhycarge.github.io/OLD_BLOG/2022/05/12/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86%E7%AC%94%E8%AE%B0%EF%BC%88%E7%AC%AC%E4%B8%89%E7%AB%A0%EF%BC%89/</id>
<published>2022-05-12T12:00:00.000Z</published>
<updated>2022-05-20T08:54:31.000Z</updated>
<content type="html"><![CDATA[<h1 id="第三章-灰度变换与空间滤波"><a href="#第三章-灰度变换与空间滤波" class="headerlink" title="第三章 灰度变换与空间滤波"></a>第三章 灰度变换与空间滤波</h1><span id="more"></span><h2 id="背景"><a href="#背景" class="headerlink" title="背景"></a>背景</h2><h3 id="灰度变换和空间滤波基础"><a href="#灰度变换和空间滤波基础" class="headerlink" title="灰度变换和空间滤波基础"></a>灰度变换和空间滤波基础</h3><p>空间域处理基于表达式<br>$$<br>g(x,y)=T[f(x,y)]<br>$$<br>其中, $f(x,y)$是输入图像, $g(x,y)$是输出图像, $T$是在点 $(x,y)$的一个领域上定义针对 $f$的算子</p><p>灰度变换函数:<br>$$<br>s=T(r)<br>$$<br>简单起见,使用 $s$或者 $r$ 分别表示$g$和 $f$在任意点 $(x,y)$的灰度</p><h2 id="一些基本的灰度变换函数"><a href="#一些基本的灰度变换函数" class="headerlink" title="一些基本的灰度变换函数"></a>一些基本的灰度变换函数</h2><h3 id="图像反转"><a href="#图像反转" class="headerlink" title="图像反转"></a>图像反转</h3><p>灰度级在区间 $[0,L-1]$的反转图像形式为<br>$$<br>s = L-1-r<br>$$<br>使用这种方式反转图像的灰度级,会有一种类似于照片底片的结果。</p><p>可用于增强图像暗色区域的白色或者灰色细节,若暗色区域的尺寸很大这种增强效果会更好</p><h3 id="对数变换"><a href="#对数变换" class="headerlink" title="对数变换"></a>对数变换</h3><p>对数变换的通式为<br>$$<br>s = clog(1+r)<br>$$<br>c是一个常数,并且 $r\geq0 $</p><p>此变换会将输入中范围较窄的低灰度值映射为输出中范围较宽的灰度级,输入中的高灰度值则会被映射为输出中范围较窄的灰度级,使用此方法来扩展图像中的暗像素值。反对数变换的作用与此相反</p><h3 id="幂律-伽马-变换"><a href="#幂律-伽马-变换" class="headerlink" title="幂律(伽马)变换"></a>幂律(伽马)变换</h3><p>通过压缩或者扩展图像的灰度级来增强图像对比度</p><p>表达式为:<br>$$<br>s=cr^\gamma<br>$$<br>其中$c$ 和 $\gamma$ 均为正常数,若考虑到偏移情况,即输入为0的时候的一个可度量输出,有时公式也会为:$s=c(r+\epsilon)^\gamma$但偏移往往会是校准问题,因此可忽略不计</p><h3 id="分段线性变换函数"><a href="#分段线性变换函数" class="headerlink" title="分段线性变换函数"></a>分段线性变换函数</h3><p>与前面函数相比的优点为:其形式可以任意复杂;缺点是会要求用户输入很多参数。</p><ul><li><p>对比度拉伸</p><p>通过扩展图像的灰度级范围,使其覆盖记录介质或者显示设备的整个理想灰度范围</p></li><li><p>灰度级分层:突出图像中特定灰度范围的亮度</p><p>突出图像的特定灰度区间,有如下两种基本方法的变体:</p><ul><li>将感兴趣范围内所有的灰度值显示为一个值(如白色),其他灰度值显示另外一个值(如黑色),产生一幅二值图像</li><li>使期望的灰度范围变亮(或变暗),但保持图像的其他灰度级不变</li></ul></li><li><p>比特平面分层</p><p>像素值是由比特组成的整数。如在256级灰度图像中,图像值是由8比特组成的,其中平面1包含图像中所有像素的最低有效比特,平面8则包含所有像素最高有效比特。</p><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220503153448475.png" alt="image-20220503153448475"></p><p>将图像分解成各个比特平面对分析图像每个比特的相对重要性使有用的,可以确定量化图像所用比特的充分性。</p><p>突出特定比特。四个高阶比特平面包含视觉上重要的大多数数据,低阶比特平面贡献了更精细的灰度细节。原图像中任意一个像素的值可以由比特平面中对应的二进制像素值来重建,可以用于减少存储量</p></li></ul><h2 id="直方图处理"><a href="#直方图处理" class="headerlink" title="直方图处理"></a>直方图处理</h2><p>令 $r_k , k=0,1,2,……,L-1$表示一副 $L$级回复数字图像 $f(x,y)$的灰度。 $f$的非归一化直方图定义为<br>$$<br>h(r_k)=n_k \ \ \ \ k=0,1,2,……,L-1<br>$$<br>其中, $n_k$是 $f$中灰度为 $r_k$的像素的数量。类似的, $f$的归一化直方图定义为<br>$$<br>p(r_k) = \frac{h(r_k)}{MN} = \frac{n_k}{MN}<br>$$<br>其中, MN分别是图像的行和列。多数情况下处理的是归一化直方图,简称为直方图或者图像直方图</p><p>若像素占据整个灰度级范围并且均匀分布的图像,将具有高对比度的外观和多种灰色调。</p><h3 id="直方图基本灰度特征"><a href="#直方图基本灰度特征" class="headerlink" title="直方图基本灰度特征"></a>直方图基本灰度特征</h3><p>Q:直方图相同的图像,是否为同一个图像?</p><p>A:是同一个图像</p><h4 id="四个直方图灰度级特征"><a href="#四个直方图灰度级特征" class="headerlink" title="四个直方图灰度级特征"></a>四个直方图灰度级特征</h4><ul><li><p>暗图像</p><p>大多数直方图容器集中在灰度级比较低的区域</p></li><li><p>亮图像</p><p>大多数直方图容器集中在灰度级的高端</p></li><li><p>低对比度图像</p><p>直方图容器基本位于灰度级的中间,对于单色图像来讲,意味着暗淡的灰色外观</p></li><li><p>高对比度的图像</p><p>直方图容器覆盖了较宽的灰度级,并且像素分布较为均匀,容器高度基本相同</p></li></ul><p>图片如下:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519174659940.png" alt="image-20220519174659940"></p><p>直觉上,我们可以得到如下内容:</p><p><strong>像素占据整个灰度级范围并且均匀分布的图像,将具有高对比度的外观和多种灰色调</strong></p><h3 id="累计直方图CDF"><a href="#累计直方图CDF" class="headerlink" title="累计直方图CDF"></a>累计直方图CDF</h3><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220519174414505.png" alt="image-20220519174414505"></p><h3 id="直方图均衡化【相关知识点:书P87】"><a href="#直方图均衡化【相关知识点:书P87】" class="headerlink" title="直方图均衡化【相关知识点:书P87】"></a>直方图均衡化【相关知识点:书P87】</h3><p><del>假设灰度值最初是连续的,令变量 $r$表示待处理的图像灰度。 $r \in [0,L-1]$ , $r=0$表示黑色, $r=L-1$表示白色。对于这些满足条件的 r,重点关注如下形式的灰度映射:</del><br>$$<br>s = T(r), \ \ \ 0\leq r \leq L-1<br>$$</p><h4 id="题目1"><a href="#题目1" class="headerlink" title="题目1"></a>题目1</h4><p> 一幅大小为(64*64)的灰度图像,共有8个灰度级,其灰度级分布见下表,现要求对其进行均衡化处理</p><table><thead><tr><th><strong>序号</strong></th><th><strong>运算</strong></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody><tr><td>1</td><td>列出原始灰度级f</td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr><tr><td>2</td><td>列出原始直方图</td><td>0.12</td><td>0.01</td><td>0.14</td><td>0.09</td><td>0.44</td><td>0.09</td><td>0.08</td><td>0.03</td></tr><tr><td>3</td><td>累计直方图</td><td>0.12</td><td>0.13</td><td>0.27</td><td>0.36</td><td>0.8</td><td>0.89</td><td>0.97</td><td>1</td></tr><tr><td>4</td><td>累计直方图*7</td><td>0.84</td><td>0.91</td><td>1.89</td><td>2.52</td><td>5.6</td><td>6.23</td><td>6.79</td><td>7</td></tr><tr><td>4</td><td>四舍五入取整g</td><td>1</td><td>1</td><td>2</td><td>3</td><td>6</td><td>6</td><td>7</td><td>7</td></tr><tr><td>5</td><td>确定映射关系f->g</td><td>0->1</td><td>1->1</td><td>2->2</td><td>3->3</td><td>4->6</td><td>5->6</td><td>6->7</td><td>7->7</td></tr><tr><td>6</td><td>新直方图$n_k/n$</td><td>0</td><td>0.13</td><td>0.14</td><td>0.09</td><td>0</td><td>0</td><td>0.53</td><td>0.11</td></tr></tbody></table><p><strong>解题思路:</strong></p><ul><li><p><code>累计直方图</code>:其为原始直方图相加得到:</p><table><thead><tr><th>列出原始直方图</th><th>0.12</th><th>0.01</th><th>0.14</th><th>0.09</th><th>0.44</th><th>0.09</th><th>0.08</th><th>0.03</th></tr></thead><tbody><tr><td>累计直方图</td><td>0.12</td><td>0.12+0.01</td><td>0.12+0.01+0.14</td><td>0.12+0.0.1+0.14+0.09</td><td>……</td><td>……</td><td>……</td><td>1</td></tr></tbody></table></li><li><p><code>累计直方图*7</code>:其为累计直方图值*7所得:</p><table><thead><tr><th>累计直方图</th><th>0.12</th><th>0.13</th><th>0.27</th><th>0.36</th><th>0.8</th><th>0.89</th><th>0.97</th><th>1</th></tr></thead><tbody><tr><td>累计直方图*7</td><td>0.12*7</td><td>0.13*7</td><td>……</td><td>……</td><td>……</td><td>……</td><td>……</td><td>7</td></tr></tbody></table></li><li><p><code>四舍五入取整g </code>:其为对<code>累计直方图*7</code>进行取整可得:</p><table><thead><tr><th>累计直方图*7</th><th>0.84</th><th>0.91</th><th>1.89</th><th>2.52</th><th>5.6</th><th>6.23</th><th>6.79</th><th>7</th></tr></thead><tbody><tr><td>四舍五入取整g</td><td>1</td><td>1</td><td>2</td><td>3</td><td>6</td><td>6</td><td>7</td><td>7</td></tr></tbody></table></li><li><p><code>确定映射关系f->g </code>:则是对获得的g与最开始的 <code>列出原始灰度级f </code>进行比较,看其与哪一个值进行对应:</p><table><thead><tr><th>列出原始灰度级f</th><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th></tr></thead><tbody><tr><td>四舍五入取整g</td><td>1</td><td>1</td><td>2</td><td>3</td><td>6</td><td>6</td><td>7</td><td>7</td></tr><tr><td>确定映射关系f->g</td><td>0->1</td><td>1->1</td><td>2->2</td><td>3->3</td><td>4->6</td><td>5->6</td><td>6->7</td><td>7->7</td></tr></tbody></table></li><li><p>新直方图$n_k/n$:便是将所对应的映射关系进行对应的原始直方图数据进行重合累加:</p><table><thead><tr><th>列出原始灰度级f</th><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th></tr></thead><tbody><tr><td>列出原始直方图</td><td>0.12</td><td>0.01</td><td>0.14</td><td>0.09</td><td>0.44</td><td>0.09</td><td>0.08</td><td>0.03</td></tr><tr><td>确定映射关系f->g</td><td>0->1</td><td>1->1</td><td>2->2</td><td>3->3</td><td>4->6</td><td>5->6</td><td>6->7</td><td>7->7</td></tr><tr><td>新直方图$n_k/n$</td><td>0</td><td>0.12+0.01</td><td>0.14</td><td>0.09</td><td>0</td><td>0</td><td>0.44+0.09</td><td>0.08+0.03</td></tr></tbody></table></li></ul><p>至此题目做完。</p><h3 id="直方图匹配化-规定化-【相关知识点书P92】"><a href="#直方图匹配化-规定化-【相关知识点书P92】" class="headerlink" title="直方图匹配化(规定化)【相关知识点书P92】"></a>直方图匹配化(规定化)【相关知识点书P92】</h3><h4 id="题目1-1"><a href="#题目1-1" class="headerlink" title="题目1"></a>题目1</h4><p>一幅大小为(64*64)的灰度图像,共有8个灰度级,其灰度级分布见下表,现要求对其按照给定的图像r的直方图进行匹配化处理</p><table><thead><tr><th><strong>序号</strong></th><th><strong>运算</strong></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th><th></th></tr></thead><tbody><tr><td>1</td><td>列出原始灰度级f</td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr><tr><td>2</td><td>列出原始直方图PDF(f)</td><td>0.12</td><td>0.01</td><td>0.14</td><td>0.09</td><td>0.44</td><td>0.09</td><td>0.08</td><td>0.03</td></tr><tr><td>3</td><td>原始图像的累计直方图CDF(f)</td><td>0.12</td><td>0.13</td><td>0.27</td><td>0.36</td><td>0.8</td><td>0.89</td><td>0.97</td><td>1</td></tr><tr><td>4</td><td>原始图像的累计直方图*7</td><td>0.84</td><td>0.91</td><td>1.89</td><td>2.52</td><td>5.6</td><td>6.23</td><td>6.79</td><td>7</td></tr><tr><td>5</td><td>原始图像的累计直方图四舍五入取整g</td><td>1</td><td>1</td><td>2</td><td>3</td><td>6</td><td>6</td><td>7</td><td>7</td></tr><tr><td>6</td><td>参考直方图PDF(r)</td><td>0</td><td>0</td><td>0</td><td>0.15</td><td>0.2</td><td>0.45</td><td>0.2</td><td>0</td></tr><tr><td>7</td><td>参考直方图CDF(r)</td><td>0</td><td>0</td><td>0</td><td>0.15</td><td>0.35</td><td>0.8</td><td>1</td><td>1</td></tr><tr><td>8</td><td>参考直方图CDF(r)*7</td><td>0</td><td>0</td><td>0</td><td>1.05</td><td>2.45</td><td>5.6</td><td>7</td><td>7</td></tr><tr><td>9</td><td>参考直方图CDF(r)*7,四舍五入取整</td><td>0</td><td>0</td><td>0</td><td>1</td><td>2</td><td>6</td><td>7</td><td>7</td></tr><tr><td>10</td><td>完成规定化需要的映射</td><td>0-3</td><td>1-3</td><td>2-4</td><td>3-4</td><td>4-5</td><td>5-5</td><td>6-6</td><td>7-6</td></tr><tr><td>11</td><td>新直方图</td><td>0</td><td>0</td><td>0</td><td>0.13</td><td>0.23</td><td>0.53</td><td>0.11</td><td>0</td></tr></tbody></table><p><strong>解题思路:</strong></p><p>序号1-9与上文基本一样,因此不在赘述;</p><ul><li><p><code>完成规定化需要的映射</code> :将 <code>原始图像的累计直方图四舍五入取整g </code>与 <code>参考直方图CDF(r)*7,四舍五入取整 </code>进行对比,如果不存在一一对应关系则就近划分,将后续比对的值与 <code>列出原始灰度级f</code>进行对应,即:</p><table><thead><tr><th>列出原始灰度级f</th><th>0</th><th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th></tr></thead><tbody><tr><td>原始图像的累计直方图四舍五入取整g</td><td>1</td><td>1</td><td>2</td><td>3</td><td>6</td><td>6</td><td>7</td><td>7</td></tr><tr><td>参考直方图CDF(r)*7,四舍五入取整</td><td>0</td><td>0</td><td>0</td><td>1</td><td>2</td><td>6</td><td>7</td><td>7</td></tr><tr><td>完成规定化需要的映射</td><td>0-3</td><td>1-3</td><td>2-4</td><td>3-4</td><td>4-5</td><td>5-5</td><td>6-6</td><td>7-6</td></tr></tbody></table></li></ul><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220503162748957.png" alt="image-20220503162748957"></p><p>后续操作与上文一致,不在进行过多赘述。</p><h2 id="空间滤波基础"><a href="#空间滤波基础" class="headerlink" title="空间滤波基础"></a>空间滤波基础</h2><p>滤波:通过、修改或者抑制图像的规定频率分量。例如通过低频的滤波器为低通滤波器(模糊图像来平滑图像),可以直接对图像本身进行类似平滑处理。使用空间滤波器可以直接对图像本身进行类似的平滑处理。</p><p>空间滤波将每个像素值替换该像素何其邻域的函数值来修改图像。若是线性的,则为线性空间滤波器,否则为非线性滤波器</p><h3 id="线性空间滤波原理"><a href="#线性空间滤波原理" class="headerlink" title="线性空间滤波原理"></a>线性空间滤波原理</h3><p>线性空间滤波器在图像 $f$和滤波器核 $w$之间执行乘积之和运算,其中核是一个阵列,其大小代表了需要运算的邻域大小,其系数决定着该滤波器的性质。</p><p>下图是以 $3*3$核进行线性空间滤波的原理:</p><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/20191023162000652.png" alt="图片"></p><p>一般来讲,大小为 $m<em>n$的核对应大小为 $M</em>N$的图像的线性空间滤波器可以表示为:<br>$$<br>g(x,y) = \sum_{s=-a}^a \sum_{t=-b}^b w(s,t)f(x+s,y+t)<br>$$</p><h3 id="空间相关与卷积"><a href="#空间相关与卷积" class="headerlink" title="空间相关与卷积"></a>空间相关与卷积</h3><ul><li><p>相关</p><p>滤波器模板移过图像并计算每个位置的乘积之和</p></li><li><p>单位离散冲激</p><p>包含一个 <code>1</code>而其余项都是 <code>0</code>的函数</p><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220517092647615.png" alt="image-20220517092647615"></p></li><li><p>卷积</p><p>预先将滤波器旋转180°,执行与相关相同的滑动乘积求和操作</p><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220517092746134.png" alt="image-20220517092746134"></p></li></ul><blockquote><p>下面的内容直接给出公式,详情解释在第四版教材的P104-P105</p></blockquote><ul><li><p>冲激</p><p>坐标 $(x_0,y_0)$处的离散冲激强度(振幅)A 定义为:<br>$$<br>\delta(x-x_0,y-y_0)=\begin{cases}A,x_0=x 和 y_0 =y\0,其他\end{cases}<br>$$</p></li><li><p>卷积相关</p></li><li><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220517094437043.png" alt="image-20220517094437043"></p></li><li><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220517094606855.png" alt="image-20220517094606855"></p></li></ul><h3 id="空间域滤波和频率域滤波的一些重要比较"><a href="#空间域滤波和频率域滤波的一些重要比较" class="headerlink" title="空间域滤波和频率域滤波的一些重要比较"></a>空间域滤波和频率域滤波的一些重要比较</h3><ul><li>卷积是空间域滤波的基础,它等效于频率域中的乘法,反之亦然</li><li>空间域中振幅为A的冲激,是频率域中值为A的一个常数,反之亦然</li></ul><h3 id="如何构建空间滤波器核"><a href="#如何构建空间滤波器核" class="headerlink" title="如何构建空间滤波器核"></a>如何构建空间滤波器核</h3><p>有三种方法可以对其进行构建</p><ul><li><p>根据数学性质</p><p>计算邻域平均值滤波器会模糊图像,计算平均值会类似于积分;计算图像局部导数的滤波器会锐化图像</p></li><li><p>对形状具有所需性质的二维空间函数进行取样</p><p>使用高斯函数样本可以构建加权平均滤波器</p></li><li><p>设计具有规定频率响应的空间滤波器</p><p>数字滤波器设计范畴</p></li></ul><h2 id="平滑(低通空间滤波器)"><a href="#平滑(低通空间滤波器)" class="headerlink" title="平滑(低通空间滤波器)"></a>平滑(低通空间滤波器)</h2><p>用于降低灰度的极具过渡,由于随机噪声通常由灰度的极具过渡组成,因此其最明显的一个应用便是降噪。</p><ul><li>应用<ul><li>减少图像之间的无关细节</li><li>平滑因灰度级数量级不足导致的伪轮廓</li></ul></li></ul><h3 id="盒式滤波器"><a href="#盒式滤波器" class="headerlink" title="盒式滤波器"></a>盒式滤波器</h3><p>最简单的可分离低通滤波器核是盒式核,其系数通常相同(通常为1)下图为一个大小为<code>3*3</code>的盒式滤波器</p><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220517102327225.png" alt="image-20220517102327225"></p><p>一般来讲,其前面有一个归1化的系数,其值为1除以系数值之和(当所有系数为1时,值为 $1/mn$),有两个目的:</p><ul><li>一个恒定灰度区域的灰度平均值将等于滤波后的图像灰度值</li><li>采用这种方式归一化之后,可防止在滤波过程中引入偏差</li></ul><h3 id="低通高斯滤波器核"><a href="#低通高斯滤波器核" class="headerlink" title="低通高斯滤波器核"></a>低通高斯滤波器核</h3><p>有待添加</p><h3 id="统计排序(非线性)滤波器"><a href="#统计排序(非线性)滤波器" class="headerlink" title="统计排序(非线性)滤波器"></a>统计排序(非线性)滤波器</h3><p>以滤波器包围的图像区域中所包含的像素的排序为基础,使用统计排序结果决定的值代替中心像素的值</p><p>中值滤波器,将像素邻域内灰度的中值代替该像素的值,比相同尺寸的线性平滑滤波器的模糊程度低,对处理脉冲噪声(椒盐噪声)非常有效。主要功能是使拥有不同灰度的点看起来更接近其相邻点,用于去除相对于其邻域像素更亮或更暗且其区域小于 $m^2/2$(滤波器区域的一半)的孤立像素族</p><p>其为目前数字图像处理最有用的统计排序滤波器</p><h3 id="锐化(高通)空间滤波器"><a href="#锐化(高通)空间滤波器" class="headerlink" title="锐化(高通)空间滤波器"></a>锐化(高通)空间滤波器</h3><p>锐化作用时突出灰度中的过渡,</p><p>平滑通常为低通滤波,锐化通常为高通滤波</p><p>作用:</p><ul><li>突出灰度的过渡部分,可由空间微分实现</li><li>微分算子的响应程度与图像在用算子操作这一点的突变成正比</li><li>图像微分增强边缘和其他突变(如噪声),削弱灰度变换缓慢的区域</li></ul><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/2019102416022050.png" alt="2019102416022050"></p><h3 id="使用二阶微分进行图像锐化——拉普拉斯"><a href="#使用二阶微分进行图像锐化——拉普拉斯" class="headerlink" title="使用二阶微分进行图像锐化——拉普拉斯"></a>使用二阶微分进行图像锐化——拉普拉斯</h3><p>定义一个二阶微分的离散公式,并基于此构造一个基于该公式的滤波器模板</p><ul><li><p>最简单的各项同性微分算子是线性的</p></li><li><p>二维图像函数 $f(x,y)$的拉普拉斯算子定义:</p><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220517110732982.png" alt="image-20220517110732982"></p></li></ul><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220517110748694.png" alt="image-20220517110748694"></p><p>因此,其对应的滤波模板为:</p><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220517110757873.png" alt="image-20220517110757873"></p><ul><li><p>使用拉普拉斯算子对图像增强的基本方法</p><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220517114147549.png" alt="image-20220517114147549"></p></li></ul><p>强调图像中灰度的突变,不强调灰度级缓慢变换的区域</p><p>由于在拉普拉斯图像中既有正值,又有负值,并且所有负值在显示时都修剪成0,所以图像大多都是黑色的</p><p>一个典型的标定拉普拉斯图像的方法是对其最小值加一个新的0代替最小值,然后将结果标定到整个灰度范围$[0-L-1]$中</p><h3 id="钝化掩蔽和高提升滤波"><a href="#钝化掩蔽和高提升滤波" class="headerlink" title="钝化掩蔽和高提升滤波"></a>钝化掩蔽和高提升滤波</h3><p>从原图像中减去一幅非锐化(平滑过的)版本</p><p>步骤如下:</p><ol><li>模糊原图像</li><li>从原图像中减去模糊图像(产生的差值图像称为模板)</li><li>将模板加到原图像上</li></ol><p><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/image-20220517114643764.png" alt="image-20220517114643764"></p><p>如上图所示,式中包含一个权值$K,k\geq 0$</p><ul><li>当$k=1$时,为钝化掩蔽</li><li>当 $k>1$时,这个过程为高提升滤波</li><li>若选择 $k<1$时可以减少钝化模板的贡献</li></ul><p>钝化掩蔽原理如下图所示,其:</p><ul><li>强调了锐化后信号中出现灰度斜率变换的点</li><li>如果原图像有任何零值,或如果选择的k值大到足以使模板峰值大于原信号中的最小值时,最终的结果可能会存在负灰度。</li><li>负值将导致边缘周围有暗的晕轮。如果k足够大,将产生不好的结果。</li></ul><img src="https://fastly.jsdelivr.net/gh/ZHYCarge/photo/20191024152917362.png" alt="20191024152917362" style="zoom:67%;" /><h3 id="使用一阶导数锐化图像——梯度"><a href="#使用一阶导数锐化图像——梯度" class="headerlink" title="使用一阶导数锐化图像——梯度"></a>使用一阶导数锐化图像——梯度</h3><p>图像 $f$在 $(x,y)$中的梯度被定义为二维列向量,其重要几何性质为指向了 $f$最大变换率的方向</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517172237793.png" alt="image-20220517172237793"></p><p>其中,</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517172549059.png" alt="image-20220517172549059"></p><p>以下的两个3*3的算子为 <code>slobe算子</code>(如下图),其中心系数为2是通过突出中心点来进行平滑处理,其所有核系数均为0,表明其灰度恒定区域的响应为0,因此可用于边缘增强</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517173334056.png" alt="image-20220517173334056"></p><h2 id="低通、高通、带阻和带通滤波器"><a href="#低通、高通、带阻和带通滤波器" class="headerlink" title="低通、高通、带阻和带通滤波器"></a>低通、高通、带阻和带通滤波器</h2><p>其传递函数如下图所示:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517173824668.png" alt="image-20220517173824668"></p><p>其所对应的相关空间核如下图所示:</p><p><img src="https://npicture.oss-cn-beijing.aliyuncs.com/Picgo/image-20220517174039177.png" alt="image-20220517174039177"></p><h2 id="组合使用空间增强方法"><a href="#组合使用空间增强方法" class="headerlink" title="组合使用空间增强方法"></a>组合使用空间增强方法</h2><p>将多种图像增强方法结合起来,完成图像增强任务</p>]]></content>
<summary type="html"><h1 id="第三章-灰度变换与空间滤波"><a href="#第三章-灰度变换与空间滤波" class="headerlink" title="第三章 灰度变换与空间滤波"></a>第三章 灰度变换与空间滤波</h1></summary>
<category term="学校课程" scheme="https://zhycarge.github.io/OLD_BLOG/categories/%E5%AD%A6%E6%A0%A1%E8%AF%BE%E7%A8%8B/"/>
<category term="笔记" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E7%AC%94%E8%AE%B0/"/>
<category term="数字图像处理" scheme="https://zhycarge.github.io/OLD_BLOG/tags/%E6%95%B0%E5%AD%97%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/"/>
</entry>
</feed>