-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
471 lines (260 loc) · 276 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>DarkCrane</title>
<link href="https://blog.darkcrane.com/atom.xml" rel="self"/>
<link href="https://blog.darkcrane.com/"/>
<updated>2020-05-11T00:07:11.000Z</updated>
<id>https://blog.darkcrane.com/</id>
<author>
<name>THL</name>
</author>
<generator uri="https://hexo.io/">Hexo</generator>
<entry>
<title>共产党宣言</title>
<link href="https://blog.darkcrane.com/posts/f29ed8a2/"/>
<id>https://blog.darkcrane.com/posts/f29ed8a2/</id>
<published>2020-05-11T00:07:11.000Z</published>
<updated>2020-05-11T00:07:11.000Z</updated>
<content type="html"><![CDATA[<p>一个幽灵,共产主义的幽灵,在欧洲游荡。为了对这个幽灵进行神圣的围剿,旧欧洲的一切势力,教皇和沙皇、梅特涅和基佐、法国的激进派和德国的警察,都联合起来了。</p><a id="more"></a><p>有哪一个反对党不被它的当政的敌人骂为共产党呢?又有哪一个反对党不拿共产主义这个罪名去回敬更进步的反对党人和自己的反动敌人呢?</p><p>从这一事实中可以得出两个结论:</p><p>共产主义已经被欧洲的一切势力公认为一种势力;</p><p>现在是共产党人向全世界公开说明自己的观点、自己的目的、自己的意图并且拿党自己的宣言来反驳关于共产主义幽灵的神话的时候了。</p><p>为了这个目的,各国共产党人集会于伦敦,拟定了如下的宣言,用英文、法文、德文、意大利文、弗拉芒文和丹麦文公布于世。</p><h3 id="一、资产者和无产者"><a href="#一、资产者和无产者" class="headerlink" title="一、资产者和无产者"></a>一、资产者和无产者</h3><p>至今一切社会的历史都是阶级斗争的历史。</p><p>自由民和奴隶、贵族和平民、领主和农奴、行会师傅和帮工,一句话,压迫者和被压迫者,始终处于相互对立的地位,进行不断的、有时隐蔽有时公开的斗争,而每一次斗争的结局都是整个社会受到革命改造或者斗争的各阶级同归于尽。</p><p>在过去的各个历史时代,我们几乎到处都可以看到社会完全划分为各个不同的等级,看到社会地位分成多种多样的层次。在古罗马,有贵族、骑士、平民、奴隶,在中世纪,有封建主、臣仆、行会师傅、帮工、农奴,而且几乎在每一个阶级内部又有一些特殊的阶层。</p><p>从封建社会的灭亡中产生出来的现代资产阶级社会并没有消灭阶级对立。它只是用新的阶级、新的压迫条件、新的斗争形式代替了旧的。</p><p>但是,我们的时代,资产阶级时代,却有一个特点:它使阶级对立简单化了。整个社会日益分裂为两大敌对的阵营,分裂为两大相互直接对立的阶级:资产阶级和无产阶级。</p><p>从中世纪的农奴中产生了初期城市的城关市民;从这个市民等级中发展出最初的资产阶级分子。</p><p>美洲的发现、绕过非洲的航行,给新兴的资产阶级开辟了新天地。东印度和中国的市场、美洲的殖民化、对殖民地的贸易、交换手段和一般商品的增加,使商业、航海业和工业空前高涨,因而使正在崩溃的封建社会内部的革命因素迅速发展。</p><p>以前那种封建的或行会的工业经营方式已经不能满足随着新市场的出现而增加的需求了。工场手工业代替了这种经营方式。行会师傅被工业的中间等级排挤掉了;各种行业组织之间的分工随着各个作坊内部的分工的出现而消失了。</p><p>但是,市场总是在扩大,需求总是在增加。甚至工场手工业也不再能满足需要了。于是,蒸汽和机器引起了工业生产的革命。现代大工业代替了工场手工业;工业中的百万富翁,一支一支产业大军的首领,现代资产者,代替了工业的中间等级。</p><p>大工业建立了由美洲的发现所准备好的世界市场。世界市场使商业、航海业和陆路交通得到了巨大的发展。这种发展又反过来促进了工业的扩展。同时,随着工业、商业、航海业和铁路的扩展,资产阶级也在同一程度上得到发展,增加自己的资本,把中世纪遗留下来的一切阶级排挤到后面去。</p><p>由此可见,现代资产阶级本身是一个长期发展过程的产物,是生产方式和交换方式的一系列变革的产物。</p><p>资产阶级的这种发展的每一个阶段,都伴随着相应的政治上的进展。它在封建主统治下是被压迫的等级,在公社里是武装的和自治的团体,在一些地方组成独立的城市共和国,在另一些地方组成君主国中的纳税的第三等级;后来,在工场手工业时期,它是等级君主国或专制君主国中同贵族抗衡的势力,而且是大君主国的主要基础;最后,从大工业和世界市场建立的时候起,它在现代的代议制国家里夺得了独占的政治统治。现代的国家政权不过是管理整个资产阶级的共同事务的委员会罢了。</p><p>资产阶级在历史上曾经起过非常革命的作用。</p><p>资产阶级在它已经取得了统治的地方把一切封建的、宗法的和田园般的关系都破坏了。它无情地斩断了把人们束缚于天然尊长的形形色色的封建羁绊,它使人和人之间除了赤裸裸的利害关系,除了冷酷无情的“现金交易”,就再也没有任何别的联系了。它把宗教虔诚、骑士热忱、小市民伤感这些情感的神圣发作,淹没在利己主义打算的冰水之中。它把人的尊严变成了交换价值,用一种没有良心的贸易自由代替了无数特许的和自力挣得的自由。总而言之,它用公开的、无耻的、直接的、露骨的剥削代替了由宗教幻想和政治幻想掩盖着的剥削。</p><p>资产阶级抹去了一切向来受人尊崇和令人敬畏的职业的神圣光环。它把医生、律师、教士、诗人和学者变成了它出钱招雇的雇佣劳动者。</p><p>资产阶级撕下了罩在家庭关系上的温情脉脉的面纱,把这种关系变成了纯粹的金钱关系。资产阶级揭示了,在中世纪深受反动派称许的那种人力的野蛮使用,是以极端怠惰作为相应补充的。它第一个证明了,人的活动能够取得什么样的成就。它创造了完全不同于埃及金字塔、罗马水道和哥特式教堂的奇迹;它完成了完全不同于民族大迁徙和十字军征讨的远征。</p><p>资产阶级除非对生产工具,从而对生产关系,从而对全部社会关系不断地进行革命,否则就不能生存下去。反之,原封不动地保持旧的生产方式,却是过去的一切工业阶级生存的首要条件。生产的不断变革,一切社会状况不停的动荡,永远的不安定和变动,这就是资产阶级时代不同于过去一切时代的地方。一切固定的僵化的关系以及与之相适应的素被尊崇的观念和见解都被消除了,一切新形成的关系等不到固定下来就陈旧了。一切等级的和固定的东西都烟消云散了,一切神圣的东西都被亵渎了。人们终于不得不用冷静的眼光来看他们的生活地位、他们的相互关系。</p><p>不断扩大产品销路的需要,驱使资产阶级奔走于全球各地。它必须到处落户,到处开发,到处建立联系。</p><p>资产阶级,由于开拓了世界市场,使一切国家的生产和消费都成为世界性的了。使反动派大为惋惜的是,资产阶级挖掉了工业脚下的民族基础。古老的民族工业被消灭了,并且每天都还在被消灭。它们被新的工业排挤掉了,新的工业的建立已经成为一切文明民族的生命攸关的问题;这些工业所加工的,已经不是本地的原料,而是来自极其遥远的地区的原料;它们的产品不仅供本国消费,而且同时供世界各地消费。旧的、靠本国产品来满足的需要,被新的、要靠极其遥远的国家和地带的产品来满足的需要所代替了。过去那种地方的和民族的自给自足和闭关自守状态,被各民族的各方面的互相往来和各方面的互相依赖所代替了。物质的生产是如此,精神的生产也是如此。各民族的精神产品成了公共的财产。民族的片面性和局限性日益成为不可能,于是由许多种民族的和地方的文学形成了一种世界的文学。</p><p>资产阶级,由于一切生产工具的迅速改进,由于交通的极其便利,把一切民族甚至最野蛮的民族都卷到文明中来了。它的商品的低廉价格,是它用来摧毁一切万里长城、征服野蛮人最顽强的仇外心理的重炮。它迫使一切民族——如果它们不想灭亡的话——采用资产阶级的生产方式;它迫使它们在自己那里推行所谓文明,即变成资产者。一句话,它按照自己的面貌为自己创造出一个世界。</p><p>资产阶级使农村屈服于城市的统治。它创立了巨大的城市,使城市人口比农村人口大大增加起来,因而使很大一部分居民脱离了农村生活的愚昧状态。正像它使农村从属于城市一样,它使未开化和半开化的国家从属于文明的国家,使农民的民族从属于资产阶级的民族,使东方从属于西方。</p><p>资产阶级日甚一日地消灭生产资料、财产和人口的分散状态。它使人口密集起来,使生产资料集中起来,使财产聚集在少数人的手里。由此必然产生的结果就是政治的集中。各自独立的、几乎只有同盟关系的、各有不同利益、不同法律、不同政府、不同关税的各个地区,现在已经结合为一个拥有统一的政府、统一的法律、统一的民族阶级利益和统一的关税的统一的民族。</p><p>资产阶级在它的不到一百年的阶级统治中所创造的生产力,比过去一切世代创造的全部生产力还要多,还要大。自然力的征服,机器的采用,化学在工业和农业中的应用,轮船的行驶,铁路的通行,电报的使用,整个整个大陆的开垦,河川的通航,仿佛用法术从地下呼唤出来的大量人口,——过去哪一个世纪料想到在社会劳动里蕴藏有这样的生产力呢?</p><p>由此可见,资产阶级赖以形成的生产资料和交换手段,是在封建社会里造成的。在这些生产资料和交换手段发展的一定阶段上,封建社会的生产和交换在其中进行的关系,封建的农业和工场手工业组织,一句话,封建的所有制关系,就不再适应已经发展的生产力了。这种关系已经在阻碍生产而不是促进生产了。它变成了束缚生产的桎梏。它必须被炸毁,它已经被炸毁了。</p><p>起而代之的是自由竞争以及与自由竞争相适应的社会制度和政治制度、资产阶级的经济统治和政治统治。</p><p>现在,我们眼前又进行着类似的运动。资产阶级的生产关系和交换关系,资产阶级的所有制关系,这个曾经仿佛用法术创造了如此庞大的生产资料和交换手段的现代资产阶级社会,现在像一个魔法师一样不能再支配自己用法术呼唤出来的魔鬼了。几十年来的工业和商业的历史,只不过是现代生产力反抗现代生产关系、反抗作为资产阶级及其统治的存在条件的所有制关系的历史。只要指出在周期性的重复中越来越危及整个资产阶级社会生存的商业危机就够了。在商业危机期间,总是不仅有很大一部分制成的产品被毁灭掉,而且有很大一部分已经造成的生产力被毁灭掉。在危机期间,发生一种在过去一切时代看来都好像是荒唐现象的社会瘟疫,即生产过剩的瘟疫。社会突然发现自己回到了一时的野蛮状态;仿佛是一次饥荒、一场普遍的毁灭性战争,使社会失去了全部生活资料;仿佛是工业和商业全被毁灭了,——这是什么缘故呢?因为社会上文明过度,生活资料太多,工业和商业太发达。社会所拥有的生产力已经不能再促进资产阶级文明和资产阶级所有制关系的发展;相反,生产力已经强大到这种关系所不能适应的地步,它已经受到这种关系的阻碍;而它一着手克服这种障碍,就使整个资产阶级社会陷入混乱,就使资产阶级所有制的存在受到威胁。资产阶级的关系已经太狭窄了,再容纳不了它本身所造成的财富了。——资产阶级用什么办法来克服这种危机呢?一方面不得不消灭大量生产力,另一方面夺取新的市场,更加彻底地利用旧的市场。这究竟是怎样的一种办法呢?这不过是资产阶级准备更全面更猛烈的危机的办法,不过是使防止危机的手段越来越少的办法。</p><p>资产阶级用来推翻封建制度的武器,现在却对准资产阶级自己了。</p><p>但是,资产阶级不仅锻造了置自身于死地的武器;它还产生了将要运用这种武器的人——现代的工人,即无产者。</p><p>随着资产阶级即资本的发展,无产阶级即现代工人阶级也在同一程度上得到发展;现代的工人只有当他们找到工作的时候才能生存,而且只有当他们的劳动增殖资本的时候才能找到工作。这些不得不把自己零星出卖的工人,像其他任何货物一样,也是一种商品,所以他们同样地受到竞争的一切变化、市场的一切波动的影响。</p><p>由于推广机器和分工,无产者的劳动已经失去了任何独立的性质,因而对工人也失去了任何吸引力。工人变成了机器的单纯的附属品,要求他做的只是极其简单、极其单调和极容易学会的操作。因此,花在工人身上的费用,几乎只限于维持工人生活和延续工人后代所必需的生活资料。但是,商品的价格,从而劳动的价格,是同它的生产费用相等的。因此,劳动越使人感到厌恶,工资也就越少。不仅如此,机器越推广,分工越细致,劳动量出就越增加,这或者是由于工作时间的延长,或者是由于在一定时间内所要求的劳动的增加,机器运转的加速,等等。</p><p>现代工业已经把家长式的师傅的小作坊变成了工业资本家的大工厂。挤在工厂里的工人群众就像士兵一样被组织起来。他们是产业军的普通士兵,受着各级军士和军官的层层监视。他们不仅仅是资产阶级的、资产阶级国家的奴隶,他们每日每时都受机器、受监工、首先是受各个经营工厂的资产者本人的奴役。这种专制制度越是公开地把营利宣布为自己的最终目的,它就越是可鄙、可恨和可恶。</p><p>手的操作所要求的技巧和气力越少,换句话说,现代工业越发达,男工也就越受到女工和童工的排挤。对工人阶级来说,性别和年龄的差别再没有什么社会意义了。他们都只是劳动工具,不过因为年龄和性别的不同而需要不同的费用罢了。</p><p>当厂主对工人的剥削告一段落,工人领到了用现钱支付的工资的时候,马上就有资产阶级中的另一部分人——房东、小店主、当铺老板等等向他们扑来。</p><p>以前的中间等级的下层,即小工业家、小商人和小食利者,手工业者和农民——所有这些阶级都降落到无产阶级的队伍里来了,有的是因为他们的小资本不足以经营大工业,经不起较大的资本家的竞争;有的是因为他们的手艺已经被新的生产方法弄得不值钱了。无产阶级就是这样从居民的所有阶级中得到补充的。</p><p>无产阶级经历了各个不同的发展阶段。它反对资产阶级的斗争是和它的存在同时开始的。</p><p>最初是单个的工人,然后是某一工厂的工人,然后是某一地方的某一劳动部门的工人,同直接剥削他们的单个资产者作斗争。他们不仅仅攻击资产阶级的生产关系,而且攻击生产工具本身;他们毁坏那些来竞争的外国商品,捣毁机器,烧毁工厂,力图恢复已经失去的中世纪工人的地位。</p><p>在这个阶段上,工人是分散在全国各地并为竞争所分裂的群众。工人的大规模集结,还不是他们自己联合的结果,而是资产阶级联合的结果,当时资产阶级为了达到自己的政治目的必须而且暂时还能够把整个无产阶级发动起来。因此,在这个阶段上,无产者不是同自己的敌人作斗争,而是同自己的敌人的敌人作斗争,即同专制君主制的残余、地主、非工业资产者和小资产者作斗争。因此,整个历史运动都集中在资产阶级手里;在这种条件下取得的每一个胜利都是资产阶级的胜利。</p><p>但是,随着工业的发展,无产阶级不仅人数增加了,而且它结合成更大的集体,它的力量日益增长,它越来越感觉到自己的力量。机器使劳动的差别越来越小,使工资几乎到处都降到同样低的水平,因而无产阶级内部的利益、生活状况也越来越趋于一致。资产者彼此间日益加剧的竞争以及由此引起的商业危机,使工人的工资越来越不稳定;机器的日益迅速的和继续不断的改良,使工人的整个生活地位越来越没有保障;单个工人和单个资产者之间的冲突越来越具有两个阶级的冲突的性质。工人开始成立反对资产者的同盟;他们联合起来保卫自己的工资。他们甚至建立了经常性的团体,以便为可能发生的反抗准备食品。有些地方,斗争爆发为起义。</p><p>工人有时也得到胜利,但这种胜利只是暂时的。他们斗争的真正成果并不是直接取得的成功,而是工人的越来越扩大的联合。这种联合由于大工业所造成的日益发达的交通工具而得到发展,这种交通工具把各地的工人彼此联系起来。只要有了这种联系,就能把许多性质相同的地方性的斗争汇合成全国性的斗争,汇合成阶级斗争。而一切阶级斗争都是政治斗争。中世纪的市民靠乡间小道需要几百年才能达到的联合,现代的无产者利用铁路只要几年就可以达到了。</p><p>无产者组织成为阶级,从而组织成为政党这件事,不断地由于工人的自相竞争而受到破坏。但是,这种组织总是重新产生,并且一次比一次更强大,更坚固,更有力。它利用资产阶级内部的分裂,迫使他们用法律形式承认工人的个别利益。英国的十小时工作日法案就是一个例子。</p><p>旧社会内部的所有冲突在许多方面都促进了无产阶级的发展。资产阶级处于不断的斗争中:最初反对贵族;后来反对同工业进步有利害冲突的那部分资产阶级;经常反对一切外国的资产阶级。在这一切斗争中,资产阶级都不得不向无产阶级呼吁,要求无产阶级援助,这样就把无产阶级卷进了政治运动。于是,资产阶级自己就把自己的教育因素即反对自身的武器给予了无产阶级。</p><p>其次,我们已经看到,工业的进步把统治阶级的整批成员抛到无产阶级队伍里去,或者至少也使他们的生活条件受到威胁。他们也给无产阶级带来了大量的教育因素。</p><p>最后,在阶级斗争接近决战的时期,统治阶级内部的、整个旧社会内部的瓦解过程,就达到非常强烈、非常尖锐的程度,甚至使得统治阶级中的一小部分人脱离统治阶级而归附于革命的阶级,即掌握着未来的阶级。所以,正像过去贵族中有一部分人转到资产阶级方面一样,现在资产阶级中也有一部分人,特别是已经提高到从理论上认识整个历史运动这一水平的一部分资产阶级思想家,转到无产阶级方面来了。</p><p>在当前同资产阶级对立的一切阶级中,只有无产阶级是真正革命的阶级。其余的阶级都随着大工业的发展而日趋没落和灭亡,无产阶级却是大工业本身的产物。</p><p>中间等级,即小工业家、小商人、手工业者、农民,他们同资产阶级作斗争,都是为了维护他们这种中间等级的生存,以免于灭亡。所以,他们不是革命的,而是保守的。不仅如此,他们甚至是反动的,因为他们力图使历史的车轮倒转。如果说他们是革命的,那是鉴于他们行将转入无产阶级的队伍,这样,他们就不是维护他们目前的利益,而是维护他们将来的利益,他们就离开自己原来的立场,而站到无产阶级的立场上来。</p><p>流氓无产阶级是旧社会最下层中消极的腐化的部分,他们在一些地方也被无产阶级革命卷到运动里来,但是,由于他们的整个生活状况,他们更甘心于被人收买,去干反动的勾当。</p><p>在无产阶级的生活条件中,旧社会的生活条件已经被消灭了。无产者是没有财产的;他们和妻子儿女的关系同资产阶级的家庭关系再没有任何共同之处了;现代的工业劳动,现代的资本压迫,无论在英国或法国,无论在美国或德国,都有是一样的,都使无产者失去了任何民族性。法律、道德、宗教在他们看来全都是资产阶级偏见,隐藏在这些偏见后面的全都是资产阶级利益。</p><p>过去一切阶级在争得统治之后,总是使整个社会服从于它们发财致富的条件,企图以此来巩固它们已获得的生活地位。无产者只有废除自己的现存的占有方式,从而废除全部现存的占有方式,才能取得社会生产力。无产者没有什么自己的东西必须加以保护,他们必须摧毁至今保护和保障私有财产的一切。</p><p>过去的一切运动都是少数人的或者为少数人谋利益的运动。无产阶级的运动是绝大多数人的、为绝大多数人谋利益的独立的运动。无产阶级,现今社会的最下层,如果不炸毁构成官方社会的整个上层,就不能抬起头来,挺起胸来。</p><p>如果不就内容而就形式来说,无产阶级反对资产阶级的斗争首先是一国范围内的斗争。每一个国家的无产阶级当然首先应该打倒本国的资产阶级。</p><p>在叙述无产阶级发展的最一般的阶段的时候,我们循序探讨了现存社会内部或多或少隐蔽着的国内战争,直到这个战争爆发为公开的革命,无产阶级用暴力推翻资产阶级而建立自己的统治。</p><p>我们已经看到,至今的一切社会都是建立在压迫阶级和被压迫阶级的对立之上的。但是,为了有可能压迫一个阶级,就必须保证这个阶级至少有能够勉强维持它的奴隶般的生存的条件。农奴曾经在农奴制度下挣扎到公社成员的地位,小资产者曾经在封建专制制度的束缚下挣扎到资产者的地位。现代的工人却相反,他们并不是随着工业的进步而上升,而是越来越降到本阶级的生存条件以下。工人变成赤贫者,贫困比人口和财富增长得还要快。由此可以明显地看出,资产阶级再不能做社会的统治阶级了,再不能把自己阶级的生存条件当作支配一切的规律强加于社会了。资产阶级不能统治下去了,因为它甚至不能保证自己的奴隶维持奴隶的生活,因为它不得不让自己的奴隶落到不能养活它反而要它来养活的地步。社会再不能在它统治下生存下去了,就是说,它的生存不再同社会相容了。</p><p>资产阶级生存和统治的根本条件,是财富在私人手里的积累,是资本的形成和增殖;资本的条件是雇佣劳动。雇佣劳动完全是建立在工人的自相竞争之上的。资产阶级无意中造成而又无力抵抗的工业进步,使工人通过结社而达到的革命联合代替了他们由于竞争而造成的分散状态。于是,随着大工业的发展,资产阶级赖以生产和占有产品的基础本身也就从它的脚下被挖掉了。它首先生产的是它自身的掘墓人。资产阶级的灭亡和无产阶级的胜利是同样不可避免的。</p><h3 id="二、无产者和共产党人"><a href="#二、无产者和共产党人" class="headerlink" title="二、无产者和共产党人"></a>二、无产者和共产党人</h3><p>共产党人同全体无产者的关系是怎样的呢?</p><p>共产党人不是同其他工人政党相对立的特殊政党。</p><p>他们没有任何同整个无产阶级的利益不同的利益。</p><p>他们不提出任何特殊的原则,用以塑造无产阶级的运动。</p><p>共产党人同其他无产阶级政党不同的地方只是:一方面,在无产者不同的民族的斗争中,共产党人强调和坚持整个无产阶级共同的不分民族的利益;另一方面,在无产阶级和资产阶级的斗争所经历的各个发展阶段上,共产党人始终代表整个运动的利益。</p><p>因此,在实践方面,共产党人是各国工人政党中最坚决的、始终起推动作用的部分;在理论方面,他们胜过其余无产阶级群众的地方在于他们了解无产阶级运动的条件、进程和一般结果。</p><p>共产党人的最近目的是和其他一切无产阶级政党的最近目的一样的:使无产阶级形成为阶级,推翻资产阶级的统治,由无产阶级夺取政权。</p><p>共产党人的理论原理,决不是以这个或那个世界改革家所发明或发现的思想、原则为根据的。</p><p>这些原理不过是现存的阶级斗争、我们眼前的历史运动的真实关系的一般表述。废除先前存在的所有制关系,并不是共产主义所独具的特征。</p><p>一切所有制关系都经历了经常的历史更替、经常的历史变更。</p><p>例如,法国革命废除了封建的所有制,代之以资产阶级的所有制。</p><p>共产主义的特征并不是要废除一般的所有制,而是要废除资产阶级的所有制。</p><p>但是,现代的资产阶级私有制是建立在阶级对立上面、建立在一些人对另一些人的剥削上面的产品生产和占有的最后而又完备的表现。</p><p>从这个意义上说,共产党人可以把自己的理论概括为一句话:消灭私有制。</p><p>有人责备我们共产党人,说我们消灭个人挣得的、自己劳动得来的财产,要消灭构成个人的一切自由、活动和独立的基础的财产。</p><p>好一个劳动得来的、自己挣得的、自己赚来的财产!你们说的是资产阶级财产出现以前的那种小资产阶级、小农的财产吗?那种财产用不着我们去消灭,工业的发展已经把它消灭了,而且每天都在消灭它。</p><p>或者,你们说的是现代的资产阶级的私有财产吧?</p><p>但是,难道雇佣劳动,无产者的劳动,会给无产者创造出财产来吗?没有的事。这种劳动所创造的资本,即剥削雇佣劳动的财产,只有在不断产生出新的雇佣劳动来重新加以剥削的条件下才能增殖的财产。现今的这种财产是在资本和雇佣劳动的对立中运动的。让我们来看看这种对立的两个方面吧。</p><p>做一个资本家,这就是说,他在生产中不仅占有一种纯粹个人的地位,而且占有一种社会地位。资本是集体的产物,它只有通过社会许多成员的共同活动,而且归根到底只有通过社会全体成员的共同活动,才能运动起来。</p><p>因此,资本不是一种个人力量,而是一种社会力量。</p><p>因此,把资本变为公共的、属于社会全体成员的财产,这并不是把个人财产变为社会财产。这里所改变的只是财产的社会性质。它将失掉它的阶级性质。</p><p>现在,我们来看看雇佣劳动。</p><p>雇佣劳动的平均价格是最低限度的工资,即工人为维持其工人的生活所必需的生活资料的数额。因此,雇佣工人靠自己的劳动所占有的东西,只够勉强维持他的生命的再生产。我们决不打算消灭这种供直接生命再生产用的劳动产品的个人占有,这种占有并不会留下任何剩余的东西使人们有可能支配别人的劳动。我们要消灭的只是这种占有的可怜的性质,在这种占有下,工人仅仅为增殖资本而活着,只有在统治阶级的利益需要他活着的时候才能活着。</p><p>在资产阶级社会里,活的劳动只是增殖已经积累起来的劳动的一种手段。在共产主义社会里,已经积累起来的劳动只是扩大、丰富和提高工人的生活的一种手段。</p><p>因此,在资产阶级社会里是过去支配现在,在共产主义社会里是现在支配过去。在资产阶级社会里,资本具有独立性和个性,而活动着的个人却没有独立性和个性。</p><p>而资产阶级却把消灭这种关系说成是消灭个性和自由!说对了。的确,正是要消灭资产者的个性、独立性和自由。</p><p>在现今的资产阶级生产关系的范围内,所谓自由就是自由贸易,自由买卖。</p><p>但是,买卖一消失,自由买卖也就会消失。关于自由买卖的言论,也像我们的资产阶级的其他一切关于自由的大话一样,仅仅对于不自由的买卖来说,对于中世纪被奴役的市民来说,才是有意义的,而对于共产主义要消灭买卖、消灭资产阶级生产关系和资产阶级本身这一点来说,却是毫无意义的。</p><p>我们要消灭私有制,你们就惊慌起来。但是,在你们的现存社会里,私有财产对十分之九的成员来说已经被消灭了;这种私有制这所以存在,正是因为私有财产对十分之九的成员来说已经不存在。可见,你们责备我们,是说我们要消灭那种以社会上的绝大多数人没有财产为必要条件的所有制。</p><p>总而言之,你们责备我们,是说我们要消灭你们的那种所有制。的确,我们是要这样做的。</p><p>从劳动不再能变为资本、货币、地租,一句话,不再能变为可以垄断的社会力量的时候起,就是说,从个人财产不再能变为资产阶级财产的时候起,你们说,个性被消灭了。</p><p>由此可见,你们是承认,你们所理解的个性,不外是资产者、资产阶级私有者。这样的个性确实应当被消灭。</p><p>共产主义并不剥夺任何人占有社会产品的权力,它只剥夺利用这种占有去奴役他人劳动的权力。</p><p>有人反驳说,私有制一消灭,一切活动就会停止,懒惰之风就会兴起。</p><p>这样说来,资产阶级社会早就应该因懒惰而灭亡了,因为在这个社会里劳者不获,获者不劳。所有这些顾虑,都可以归结为这样一个同义反复:一旦没有资本,也就不再有雇佣劳动了。</p><p>所有这些对共产主义的物质产品的占有方式和生产方式的责备,也被扩及到精神产品的占有和生产方面。正如阶级的所有制的终止在资产者看来是生产本身的终止一样,阶级的教育的终止在他们看来就等于一切教育的终止。</p><p>资产者唯恐失去的那种教育,绝大多数人来说是把人训练成机器。</p><p>但是,你们既然用你们资产阶级关于自由、教育、法等等的观念来衡量废除资产阶级所有制的主张,那就请你们不要同我们争论了。你们的观念本身是资产阶级的生产关系和所有制关系的产物,正像你们的法不过是被奉为法律的你们这个阶级的意志一样,而这种意志的内容是由你们这个阶级的物质生活条件决定的。</p><p>你们的利己观念使你们把自己的生产关系和所有制关系从历史的、在生产过程中是暂时的关系变成永恒的自然规律和理性规律,这种利己观念是你们和一切灭亡了的统治阶级所共有的。谈到古代所有制的时候你们所能理解的,谈到封建所有制的时候你们所能理解的,一谈到资产阶级所有制你们就再也不能理解了。</p><p>消灭家庭!连极端的激进派也对共产党人的这种可耻的意图表示愤慨。</p><p>现代的、资产阶级的家庭是建立在什么基础上的呢?是建立在资本上面,建立在私人发财上面的。这种家庭只是在资产阶级那里才以充分发展的形式存在着,而无产者的被迫独居和公开的卖淫则是它的补充。</p><p>资产者的家庭自然会随着它的这种补充的消失而消失,两者都要随着资本的消失而消失。</p><p>你们是责备我们要消灭父母对子女的剥削吗?我们承认这种罪状。</p><p>但是,你们说,我们用社会教育代替家庭教育,就是要消灭人们最亲密的关系。</p><p>而你们的教育不也是由社会决定的吗?不也是由你们进行教育时所处的那种社会关系决定的吗?不也是由社会通过学校等等进行的直接的或间接的干涉决定的吗?共产党人并没有发明社会对教育的作用;他们仅仅是要改变这种作用的性质,要使教育摆脱统治阶级的影响。</p><p>无产者的一切家庭联系越是由于大工业的发展而被破坏,他们的子女越是由于这种发展而被变成单纯的商品和劳动工具,资产阶级关于家庭和教育、关于父母和子女的亲密关系的空话就越是令人作呕。</p><p>但是,你们共产党人是要实行公妻制的啊,——整个资产阶级异口同声地向我们这样叫喊。</p><p>资产者是把自己的妻子看作单纯的生产工具的。他们听说生产工具将要公共使用,自然就不能不想到妇女也会遭到同样的命运。</p><p>他们想也没有想到,问题正在于使妇女不再处于单纯生产工具的地位。</p><p>其实,我们的资产者装得道貌岸然,对所谓的共产党人的正式公妻制表示惊讶,那是再可笑不过了。公妻制无需共产党人来实行,它差不多是一向就有的。</p><p>我们的资产者不以他们的无产者的妻子和女儿受他们支配为满足,正式的卖淫更不必说了,他们还以互相诱奸妻子为最大的享乐。资产阶级的婚姻实际上是公妻制。人们至多只能责备共产党人,说他们想用正式的、公开的公妻制来代替伪善地掩蔽着的公妻制。其实,不言而喻,随着现在的生产关系的消灭,从这种关系中产生的公妻制,即正式的和非正式的卖淫,也就消失了。</p><p>有人还责备共产党人,说他们要取消祖国,取消民族。</p><p>工人没有祖国。决不能剥夺他们所没有的东西。因为无产阶级首先必须取得政治统治,上升为民族的阶级,把自身组织成为民族,所以它本身还是民族的,虽然完全不是资产阶级所理解的那种意思。</p><p>随着资产阶级的发展,随着贸易自由的实现和世界市场的建立,随着工业生产以及与之相适应的生活条件的趋于一致,各国人民之间的民族分隔和对立日益消失。</p><p>无产阶级的统治将使它们更快地消失。联合的行动,至少是各文明国家的联合的行动,是无产阶级获得解放的首要条件之一。</p><p>人对人的剥削一消灭,民族对民族的剥削就会随之消灭。</p><p>民族内部的阶级对立一消失,民族之间的敌对关系就会随之消失。</p><p>从宗教的、哲学的和一切意识形态的观点对共产主义提出的种种责难,都不值得详细讨论了。</p><p>人们的观念、观点和概念,一句话,人们的意识,随着人们的生活条件、人们的社会关系、人们的社会存在的改变而改变,这难道需要经过深思才能了解吗?</p><p>思想的历史除了证明精神生产随着物质生产的改造而改造,还证明了什么呢?任何一个时代的统治思想始终都不过是统治阶级的思想。</p><p>当人们谈到使整个社会革命化的思想时,他们只是表明了一个事实:在旧社会内部已经形成了新社会的因素,旧思想的瓦解是同旧生活条件的瓦解步调一致的。</p><p>当古代世界走向灭亡的时候,古代的各种宗教就被基督教战胜了。当基督教思想在18世纪被启蒙思想击败的时候,封建社会正在同当时革命的资产阶级进行殊死的斗争。信仰自由和宗教自由的思想,不过表明竞争在信仰领域里占统治地位罢了。</p><p>“但是”,有人会说,“宗教的、道德的、哲学的、政治的、法的观念等等在历史发展的进程中固然是不断改变的,而宗教、道德、哲学、政治和法在这种变化中却始终保存着。</p><p>此外,还存在着一切社会状态所共有的永恒真理,如自由、正义等等。但是共产主义要废除永恒真理,它要废除宗教、道德,而不是加以革新,所以共产主义是同至今的全部历史发展相矛盾的。”</p><p>这种责难归结为什么呢?至今的一切社会的历史都是在阶级对立中运动的,而这种对立在不同的时代具有不同的形式。</p><p>但是,不管阶级对立具有什么样的形式,社会上一部分人对另一部分人的剥削却是过去各个世纪所共有的事实。因此,毫不奇怪,各个世纪的社会意识,尽管形形色色、千差万别,总是在某些共同的形式中运动的,这些形式,这些意识形式,只有当阶级对立完全消失的时候才会完全消失。</p><p>共产主义革命就是同传统的所有制关系实行最彻底的决裂;毫不奇怪,它在自己的发展进程中要同传统的观念实行最彻底的决裂。</p><p>不过,我们还是把资产阶级对共产主义的种种责难撇开吧。</p><p>前面我们已经看到,工人革命的第一步就是使无产阶级上升为统治阶级,争得民主。</p><p>无产阶级将利用自己的政治统治,一步一步地夺取资产阶级的全部资本,把一切生产工具集中在国家即组织成为统治阶级的无产阶级手里,并且尽可能快地增加生产力的总量。</p><p>要做到这一点,当然首先必须对所有权和资产阶级生产关系实行强制性的干涉,也就是采取这样一些措施,这些措施在经济上似乎是不够充分的和没有力量的,但是在运动进程中它们会越出本身,而且作为变革全部生产方式的手段是必不可少的。</p><p>这些措施在不同的国家里当然会是不同的。</p><p>但是,最先进的国家几乎都可以采取下面的措施:</p><p>1、剥夺地产,把地租用于国家支出。</p><p>2、征收高额累进税。</p><p>3、废除继承权。</p><p>4、没收一切流亡分子和叛乱分子的财产。</p><p>5、通过拥有国家资本和独享垄断权的国家银行,把信贷集中在国家手里。</p><p>6、把全部运输业集中在国家的手里。</p><p>7、按照总的计划增加国家工厂和生产工具,开垦荒地和改良土壤。</p><p>8、实行普遍劳动义务制,成立产业军,特别是在农业方面。</p><p>9、把农业和工业结合起来,促使城乡对立逐步消灭。</p><p>10、对所有儿童实行公共的和免费的教育。取消现在这种形式的儿童的工厂劳动。把教育同物质生产结合起来,等等。</p><p>当阶级差别在发展进程中已经消失而全部生产集中在联合起来的个人的手里的时候,公共权力就失去政治性质。原来意义上的政治权力,是一个阶级用以压迫另一个阶级的有组织的暴力。如果说无产阶级在反对资产阶级的斗争中一定要联合为阶级,如果说它通过革命使自己成为统治阶级,并以统治阶级的资格用暴力消灭旧的生产关系,那么它在消灭这种生产关系的同时,也就消灭了阶级对立的存在条件,消灭阶级本身的存在条件,从而消灭了它自己这个阶级的统治。</p><p>代替那存在着阶级和阶级对立的资产阶级旧社会的,将是这样一个联合体,在那里,每个人的自由发展是一切人的自由发展的条件。</p><h3 id="三、社会主义的和共产主义的文献"><a href="#三、社会主义的和共产主义的文献" class="headerlink" title="三、社会主义的和共产主义的文献"></a>三、社会主义的和共产主义的文献</h3><h4 id="1、反动的社会主义"><a href="#1、反动的社会主义" class="headerlink" title="1、反动的社会主义"></a>1、反动的社会主义</h4><h5 id="(甲)封建的社会主义"><a href="#(甲)封建的社会主义" class="headerlink" title="(甲)封建的社会主义"></a>(甲)封建的社会主义</h5><p>法国和英国的贵族,按照他们的历史地位所负的使命,就是写一些抨击现代资产阶级社会的作品。在法国的1830年七月革命和英国的改革运动中,他们再一次被可恨的暴发户打败了。从此就再谈不上严重的政治斗争了。他们还能进行的只是文字斗争。但是,即使在文字方面也不可能重弹复辟时期的老调了。为了激起同情,贵族们不得不装模作样,似乎他们已经不关心自身的利益,只是为了被剥削的工人阶级的利益才去写对资产阶级的控诉书。他们用来泄愤的手段是:唱唱诅咒他们的新统治者的歌,并向他叽叽咕咕地说一些或多或少凶险的预言。</p><p>这样就产生了封建的社会主义,半是挽歌,半是谤文,半是过去的回音,半是未来的恫吓;它有时也能用辛辣、俏皮而尖刻的评论剌中资产阶级的心,但是它由于完全不能理解现代历史的进程而总是令人感到可笑。</p><p>为了拉拢人民,贵族们把无产阶级的乞食袋当作旗帜来挥舞。但是,每当人民跟着他们走的时候,都发现他们的臀部带有旧的封建纹章,于是就哈哈大笑,一哄而散。</p><p>一部分法国正统派和“青年英国”,都演过这出戏。</p><p>封建主说,他们的剥削方式和资产阶级的剥削不同,那他们只是忘记了,他们是在完全不同的、目前已经过时的情况和条件下进行剥削的。他们说,在他们的统治下并没有出现过现代的无产阶级,那他们只是忘记了,现代的资产阶级正是他们的社会制度的必然产物。</p><p>不过,他们毫不掩饰自己的批评的反动性质,他们控告资产阶级的主要罪状正是在于:在资产阶级的统治下有一个将把整个旧社会制度炸毁的阶级发展起来。</p><p>他们责备资产阶级,与其说是因为它产生了无产阶级,不如说是因为它产生了革命的无产阶级。</p><p>因此,在政治实践中,他们参与对工人阶级采取的一切暴力措施,在日常生活中,他们违背自己的那一套冠冕堂皇的言词,屈尊拾取金苹果,不顾信义、仁爱和名誉去做羊毛、甜菜和烧酒的买卖。</p><p>正如僧侣总是同封建主携手同行一样,僧侣的社会主义也总是同封建的社会主义携手同行的。</p><p>要给基督教禁欲主义涂上一层社会主义的色彩,是再容易不过了。基督教不是也激烈反对私有财产,反对婚姻,反对国家吗?它不是提倡用行善和求乞、独身和禁欲、修道和礼拜来代替这一切吗?基督教的社会主义,只不过是僧侣用来使贵族的怨愤神圣的圣水罢了。</p><h5 id="(乙)小资产阶级的社会主义"><a href="#(乙)小资产阶级的社会主义" class="headerlink" title="(乙)小资产阶级的社会主义"></a>(乙)小资产阶级的社会主义</h5><p>封建贵族并不是被资产阶级所推翻的、其生活条件在现代资产阶级社会里日益恶化和消失的唯一阶级。中世纪的城关市民和小农等级是现代资产阶级的前身。在工商业不很发达的国家里,这个阶级还在新兴的资产阶级身旁勉强生存着。</p><p>在现代文明已经发展的国家里,形成了一个新的小资产阶级,它摇摆于无产阶级和资产阶级之间,并且作为资产阶级社会的补充部分不断地重新组成。但是,这一阶级的成员经常被竞争抛到无产阶级队伍里去,而且,随着大工业的发展,他们甚至觉察到,他们很快就会完全失去他们作为现代社会中一个独立部分的地位,在商业、工业和农业中很快就会被监工和雇员所代替。</p><p>在农民阶级远远超过人口半数的国家,例如在法国,那些站在无产阶级方面反对资产阶级的著作家,自然是用小资产阶级和小农的尺度去批判资产阶级制度的,是从小资产阶级的立场出发替工人说话的。这样就形成了小资产阶级的社会主义。西斯蒙第不仅对法国而且对英国来说都是这类著作家的首领。</p><p>这种社会主义非常透彻地分析了现代生产关系中的矛盾。它揭穿了经济学家的虚伪的粉饰。它确凿地证明了机器和分工的破坏作用、资本和地产的积聚、生产过剩、危机、小资产者和小农的必然没落、无产阶级的贫困、生产的无政府状态、财富分配的极不平均、各民族之间的毁灭性的工业战争,以及旧风尚、旧家庭关系和旧民族性的解体。</p><p>但是,这种社会主义按其实际内容来说,或者是企图恢复旧的生产资料和交换手段,从而恢复旧的所有制关系和旧的社会,或者是企图重新把现代的生产资料和交换手段硬塞到已被它们突破而且必然被突破的旧的所有制关系的框子里去。它在这两种场合都是反动的,同时又是空想的。</p><p>工业中的行会制度,农业中的宗法经济,——这就是它的结论。</p><p>这一思潮在它以后的发展中变成了一种怯懦的悲叹。</p><h5 id="(丙)德国的或“真正的”社会主义"><a href="#(丙)德国的或“真正的”社会主义" class="headerlink" title="(丙)德国的或“真正的”社会主义"></a>(丙)德国的或“真正的”社会主义</h5><p>法国的社会主义和共产主义的文献是在居于统治地位的资产阶级的压迫下产生的,并且是同这种统治作斗争的文字表现,这种文献被搬到德国的时候,那里的资产阶级才刚刚开始进行反对封建专制制度的斗争。</p><p>德国的哲学家、半哲学家和美文学家,贪婪地抓住了这种文献,不过他们忘记了:在这种著作从法国搬到德国的时候,法国的生活条件却没有同时搬过去。在德国的条件下,法国的文献完全失去了直接实践的意义,而只具有纯粹文献的形式。它必然表现为关于真正的社会、关于实现人的本质的无谓思辨。这样,第一次法国革命的要求,在18世纪的德国哲学家看来,不过是一般“实践理性”的要求,而革命的法国资产阶级的意志的表现,在他们心目中就是纯粹的意志、本来的意志、真正人的意志的规律。</p><p>德国著作家的唯一工作,就是把新的法国的思想同他们的旧的哲学信仰调和起来,或者毋宁说,就是从他们的哲学观点出发去掌握法国的思想。</p><p>这种掌握,就像掌握外国语一样,是通过翻译的。</p><p>大家知道,僧侣们曾经在古代异教经典的手抄本上面写上荒诞的天主教圣徒传。德国著作家对世俗的法国文献采取相反的作法。他们在法国的原著下面写上自己的哲学胡说。例如,他们在法国人对货币关系的批判下面写上“人的本质的外化”,在法国人对资产阶级国家的批判下面写上所谓“抽象普遍物的统治的扬弃”,等等。</p><p>这种在法国人的论述下面塞进自己哲学词句的做法,他们称之为“行动的哲学”、”真正的社会主义”、“德国的社会主义科学”、“社会主义的哲学论证”,等等。</p><p>法国的社会主义和共产主义的文献就这样被完全阉割了。既然这种文献在德国人手里已不再表现一个阶级反对另一个阶级的斗争,于是德国人就认为:他们克服了“法国人的片面性”,他们不代表真实的要求,而代表真理的要求,不代表无产者的利益,而代表人的本质的利益,即一般人的利益,这种人不属于任何阶级,根本不存在于现实界,而只存在于云雾弥漫的哲学幻想的太空。</p><p>这种曾经郑重其事地看待自己那一套拙劣的小学生作业并且大言不惭地加以吹嘘的德国社会主义,现在渐渐失去了它的自炫博学的天真。</p><p>德国的特别是普鲁士的资产阶级反对封建主和专制王朝的斗争,一句话,自由主义运动,越来越严重了。</p><p>于是,“真正的”社会主义就得到了一个好机会,把社会主义的要求同政治运动对立起来,用诅咒异端邪说的传统办法诅咒自由主义,诅咒代议制国家,诅咒资产阶级的竞争、资产阶级的新闻出版自由、资产阶级的法、资产阶级的自由和平等,并且向人民群众大肆宣扬,说什么在这个资产阶级运动中,人民群众非但一无所得,反而会失去一切。德国的社会主义恰好忘记了,法国的批判(德国的社会主义是这种批判的可怜的回声)是以现代的资产阶级社会以及相应的物质生活条件和相当的政治制度为前提的,而这一切前提当时在德国正是尚待争取的。</p><p>这种社会主义成了德意志各邦专制政府及其随从——僧侣、教员、容克和官僚求之不得的、吓唬来势汹汹的资产阶级的稻草人。</p><p>这种社会主义是这些政府用来镇压德国工人起义的毒辣的皮鞭和枪弹的甜蜜的补充。</p><p>既然“真正的”社会主义就这样成了这些政府对付德国资产阶级的武器,那么它也就直接代表了一种反动的利益,即德国小市民的利益。在德国,16世纪遗留下来的、从那时起经常以不同形式重新出现的小资产阶级,是现存制度的真实的社会基础。</p><p>保存这个小资产阶级,就是保存德国的现存制度。这个阶级胆战心惊地从资产阶级的工业统治和政治统治那里等候着无可幸免的灭亡,这一方面是由于资本的积聚,另一方面是由于革命无产阶级的兴起。在它看来,“真正的”社会主义能起一箭双雕的作用。“真正的”社会主义像瘟疫一样流行起来了。</p><p>德国的社会主义者给自己的那几条干瘪的“永恒真理”披上一件用思辨的蛛丝织成的、绣满华丽辞藻的花朵和浸透甜情蜜意的甘露的外衣,这件光彩夺目的外衣只是使他们的货物在这些顾客中间增加销路罢了。</p><p>同时,德国的社会主义也越来越认识到自己的使命就是充当这种小市民的夸夸其谈的代言人。</p><p>它宣布德意志民族是模范的民族,德国小市民是模范的人。它给这些小市民的每一种丑行都加上奥秘的、高尚的、社会主义的意义,使之变成完全相反的东西。它发展到最后,就直接反对共产主义的“野蛮破坏的”倾向,并且宣布自己是不偏不倚地超乎任何阶级斗争之上的。现今在德国流行的一切所谓社会主义和共产主义的著作,除了极少数的例外,都属于这一类卑鄙龌龊的、令人委靡的文献。</p><h4 id="2、保守的或资产阶级的社会主义"><a href="#2、保守的或资产阶级的社会主义" class="headerlink" title="2、保守的或资产阶级的社会主义"></a>2、保守的或资产阶级的社会主义</h4><p>资产阶级中的一部分人想要消除社会的弊病,以便保障资产阶级社会的生存。</p><p>这一部分人包括:经济学家、博爱主义者、人道主义者、劳动阶级状况改善派、慈善事业组织者、动物保护协会会员、戒酒协会发起人以及形形色色的小改良家。这种资产阶级的社会主义甚至被制成一些完整的体系。</p><p>我们可以举蒲鲁东的《贫困的哲学》作为例子。</p><p>社会主义的资产者愿意要现代社会的生存条件,但是不要由这些条件必然产生的斗争和危险。他们愿意要现存的社会,但是不要那些使这个社会革命化和瓦解的因素。他们愿意要资产阶级,但是不要无产阶级。在资产阶级看来,它所统治的世界自然是最美好的世界。资产阶级的社会主义把这种安慰人心的观念制成半套或整套的体系。它要求无产阶级实现它的体系,走进新的耶路撒冷,其实它不过是要求无产阶级停留在现今的社会里,但是要抛弃他们关于这个社会的可恶的观念。</p><p>这种社会主义的另一种不够系统、但是比较实际的形式,力图使工人阶级厌弃一切革命运动,硬说能给工人阶级带来好处的并不是这样或那样的政治改革,而仅仅是物质生活条件即经济关系的改变。但是,这种社会主义所理解的物质生活条件的改变,绝对不是只有通过革命的途径才能实现的资产阶级生产关系的废除,而是一些在这种生产关系的基础上实行的行政上的改良,因而丝毫不会改变资本和雇佣劳动的关系,至多只能减少资产阶级的统治费用和简化它的财政管理。</p><p>资产阶级的社会主义只有在它变成纯粹的演说辞令的时候,才获得自己的适当的表现。</p><p>自由贸易!为了工人阶级的利益;保护关税!为了工人阶级的利益;单身牢房!为了工人阶级的利益。——这才是资产阶级的社会主义唯一认真说出的最后的话。</p><p>资产阶级的社会主义就是这样一个论断:资产者之为资产者,是为了工人阶级的利益。</p><h4 id="3、批判的空想的社会主义和共产主义"><a href="#3、批判的空想的社会主义和共产主义" class="headerlink" title="3、批判的空想的社会主义和共产主义"></a>3、批判的空想的社会主义和共产主义</h4><p>在这里,我们不谈在现代一切大革命中表达过无产阶级要求的文献(巴贝夫等人的著作)。</p><p>无产阶级在普遍激动的时代、在推翻封建社会的时期直接实现自己阶级利益的最初尝试,都不可避免地遭到了失败,这是由于当时无产阶级本身还不够发展,由于无产阶级解放的物质条件还没具备,这些条件只是资产阶级时代的产物。随着这些早期的无产阶级运动而出现的革命文献,就其内容来说必然是反动的。这种文献倡导普遍的禁欲主义和粗陋的平均主义。</p><p>本来意义的社会主义和共产主义的体系,圣西门、傅立叶、欧文等人的体系,是在无产阶级和资产阶级之间的斗争还不发展的最初时期出现的。关于这个时期,我们在前面已经叙述过了(见《资产阶级和无产阶级》)。</p><p>诚然,这些体系的发明家看到了阶级的对立,以及占统治地位的社会本身中的瓦解因素的作用。但是,他们看不到无产阶级方面的任何历史主动性,看不到它所特有的任何政治运动。</p><p>由于阶级对立的发展是同工业的发展步调一致的,所以这些发明家也不可能看到无产阶级解放的物质条件,于是他们就去探求某种社会科学、社会规律,以便创造这些条件。</p><p>社会的活动要由他们个人的发明活动来代替,解放的历史条件要由幻想的条件来代替,无产阶级的逐步组织成为阶级要由一种特意设计出来的社会组织来代替。在他们看来,今后的世界历史不过是宣传和实施他们的社会计划。</p><p>诚然,他们也意识到,他们的计划主要是代表工人阶级这一受苦最深的阶级的利益。在他们心目中,无产阶级只是一个受苦最深的阶级。</p><p>但是,由于阶级斗争不发展,由于他们本身的生活状况,他们就以为自己是高高超乎这种阶级对立之上的。他们要改善社会一切成员的生活状况,甚至生活最优裕的成员也包括在内。因此,他们总是不加区别地向整个社会呼吁,而且主要是向统治阶级呼吁。他们以为,人们只要理解他们的体系,就会承认这种体系是最美好的社会的最美好的计划。</p><p>因此,他们拒绝一切政治行动,特别是一切革命行动;他们想通过和平的途径达到自己的目的,并且企图通过一些小型的、当然不会成功的试验,通过示范的力量来为新的社会福音开辟道路。</p><p>这种对未来社会的幻想的描绘,在无产阶级还很不发展、因而对本身的地位的认识还基于幻想的时候,是同无产阶级对社会普遍改造的最初的本能的渴望相适应的。</p><p>但是,这些社会主义和共产主义的著作也含有批判的成分。这些著作抨击现存社会的全部基础。因此,它们提供了启发工人觉悟的极为宝贵的材料。它们关于未来社会的积极的主张,例如消灭城乡对立,消灭家庭,消灭私人营利,消灭雇佣劳动,提倡社会和谐,把国家变成纯粹的生产管理机构,——所有这些主张都只是表明要消灭阶级对立,而这种阶级对立在当时刚刚开始发展,它们所知道的只是这种对立的早期的、不明显的、不确定的形式。因此,这些主张本身还带有纯粹空想的性质。</p><p>批判的空想的社会主义和共产主义的意义,是同历史的发展成反比的。阶级斗争越发展和越具有确定的形式,这种超乎阶级斗争的幻想,这种反对阶级斗争的幻想,就越失去任何实践意义和任何理论根据。所以,虽然这些体系的创始人在许多方面是革命的,但是他们的信徒总是组成一些反动的宗派。这些信徒无视无产阶级的历史进展,还是死守着老师们的旧观点。因此,他们一贯企图削弱阶级斗争,调和对立。他们还总是梦想用试验的办法来实现自己的社会空想,创办单个的法伦斯泰尔,建立国内移民区,创立小伊加利亚,即袖珍版的新耶路撒冷,——而为了建造这一切空中楼阁,他们就不得不呼吁资产阶级发善心和慷慨解囊。他们逐渐地堕落到上述反动的或保守的社会主义者的一伙中去了,所不同的只是他们更加系统地卖弄学问,狂热地迷信自己那一套社会科学的奇功异效。</p><p>因此,他们激烈地反对工人的一切政治运动,认为这种运动只是由于盲目地不相信新福音才发生的。</p><p>在英国,有欧文主义者反对宪章派,在法国,有傅立叶主义者反对改革派。</p><h3 id="四、共产党人对各种反对党派的态度"><a href="#四、共产党人对各种反对党派的态度" class="headerlink" title="四、共产党人对各种反对党派的态度"></a>四、共产党人对各种反对党派的态度</h3><p>看过第二章之后,就可以了解共产党人同已经形成的工人政党的关系,因而也就可以了解他们同英国宪章派和北美土地改革派的关系。</p><p>共产党人为工人阶级的最近的目的和利益而斗争,但是他们在当前的运动中同时代表运动的未来。在法国,共产党人同社会主义民主党联合起来反对保守的和激进的资产阶级,但是并不因此放弃对那些从革命的传统中承袭下来的空谈和幻想采取批判态度的权利。</p><p>在瑞士,共产党人支持激进派,但是并不忽略这个政党是由互相矛盾的分子组成的,其中一部分是法国式的民主社会主义者,一部分是激进的资产者。</p><p>在波兰人中间,共产党人支持那个把土地革命当作民族解放的条件的政党,即发动过1846年克拉科夫起义的政党。</p><p>在德国,只要资产阶级采取革命的行动,共产党就同它一起去反对专制君主制、封建土地所有制和小市民的反动性。</p><p>但是,共产党一分钟也不忽略教育工人尽可能明确地意识到资产阶级和无产阶级的敌对的对立,以便德国工人能够立刻利用资产阶级统治所必然带来的社会的和政治的条件作为反对资产阶级的武器,以便在推翻德国的反动阶级之后立即开始反对资产阶级本身的斗争。</p><p>共产党人把自己的主要注意力集中在德国,因为德国正处在资产阶级革命的前夜,因为同17世纪的英国和18世纪的法国相比,德国将在整个欧洲文明更进步的条件下,拥有发展得多的无产阶级去实现这个变革,因而德国的资产阶级革命只能是无产阶级革命的直接序幕。</p><p>总之,共产党人到处都支持一切反对现存的社会制度和政治制度的革命运动。</p><p>在所有这些运动中,他们都强调所有制问题是运动的基本问题,不管这个问题的发展程度怎样。</p><p>最后,共产党人到处都努力争取全世界民主政党之间的团结和协调。</p><p>共产党人不屑于隐瞒自己的观点和意图。他们公开宣布:他们的目的只有用暴力推翻全部现存的社会制度才能达到。让统治阶级在共产主义革命面前发抖吧。无产者在这个革命中失去的只是锁链。他们获得的将是整个世界。</p><p>全世界无产者,联合起来!</p>]]></content>
<summary type="html"><p>一个幽灵,共产主义的幽灵,在欧洲游荡。为了对这个幽灵进行神圣的围剿,旧欧洲的一切势力,教皇和沙皇、梅特涅和基佐、法国的激进派和德国的警察,都联合起来了。</p></summary>
<category term="思想" scheme="https://blog.darkcrane.com/categories/%E6%80%9D%E6%83%B3/"/>
<category term="思想" scheme="https://blog.darkcrane.com/tags/%E6%80%9D%E6%83%B3/"/>
<category term="共产党宣言" scheme="https://blog.darkcrane.com/tags/%E5%85%B1%E4%BA%A7%E5%85%9A%E5%AE%A3%E8%A8%80/"/>
</entry>
<entry>
<title>Javaweb文件上传路径兼容问题</title>
<link href="https://blog.darkcrane.com/posts/9969daf0/"/>
<id>https://blog.darkcrane.com/posts/9969daf0/</id>
<published>2020-04-25T09:00:20.000Z</published>
<updated>2020-04-25T09:00:20.000Z</updated>
<content type="html"><![CDATA[<p>最近写Javaweb项目时遇到了一个坑,本地服务器进行测试时没有什么异常,但将war包部署到服务器上并进行文件上传时遇到了一些问题:文件上传后找不到。</p><p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200425170832.png"></p><a id="more"></a><p>仔细检查后我发现原本准备上传至WEB-INF\aaa文件夹下的文件直接在主目录下生成了以文件夹命名的文件。</p><p>原来是因为Windows下的路径用反斜杠“\”表示,而Linux下的路径用斜杠“/”表示,而我的所有路径分隔符都是是用反斜杠表示才产生了这种问题;</p><p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200425170821.png"></p><p>为了解决这个问题可以把“\”全部换成“/”,但这样做的话Windows下又会出现问题。</p><p>为了兼容性考虑Java提供了一个方法<code>File.separator</code>能根据系统的不同获取文件路径的分隔符。将用到分隔符的地方全部替换为<code>File.separator</code>,测试成功。</p><p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200425170826.png"></p><p>完结,撒花!!</p>]]></content>
<summary type="html"><p>最近写Javaweb项目时遇到了一个坑,本地服务器进行测试时没有什么异常,但将war包部署到服务器上并进行文件上传时遇到了一些问题:文件上传后找不到。</p>
<p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200425170832.png"></p></summary>
<category term="学习" scheme="https://blog.darkcrane.com/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="Javaweb" scheme="https://blog.darkcrane.com/categories/%E5%AD%A6%E4%B9%A0/Javaweb/"/>
<category term="学习" scheme="https://blog.darkcrane.com/tags/%E5%AD%A6%E4%B9%A0/"/>
<category term="File" scheme="https://blog.darkcrane.com/tags/File/"/>
<category term="Javaweb" scheme="https://blog.darkcrane.com/tags/Javaweb/"/>
<category term="Java" scheme="https://blog.darkcrane.com/tags/Java/"/>
<category term="坑" scheme="https://blog.darkcrane.com/tags/%E5%9D%91/"/>
<category term="Linux" scheme="https://blog.darkcrane.com/tags/Linux/"/>
<category term="Windows" scheme="https://blog.darkcrane.com/tags/Windows/"/>
</entry>
<entry>
<title>免安装脚本使用B站动态头像教程(已失效)</title>
<link href="https://blog.darkcrane.com/posts/f6f15960/"/>
<id>https://blog.darkcrane.com/posts/f6f15960/</id>
<published>2020-04-14T14:22:05.000Z</published>
<updated>2020-04-14T14:22:05.000Z</updated>
<content type="html"><![CDATA[<h3 id="动态头像要求"><a href="#动态头像要求" class="headerlink" title="动态头像要求"></a>动态头像要求</h3><ul><li><p>准备180x180像素尺寸的动画图片、APNG或者Webp格式、体积1.2MB以下</p></li><li><p>使用以下列出的任何一种浏览器:</p><a id="more"></a></li><li><p>1.Chrome</p></li><li><p>2.Firefox</p></li><li><p>3.Edge</p></li><li><p>4.国产浏览器极速模式</p></li></ul><h3 id="添加代码到收藏书签"><a href="#添加代码到收藏书签" class="headerlink" title="添加代码到收藏书签"></a>添加代码到收藏书签</h3><ol><li><p>新建收藏书签</p></li><li><p>随便添加一个网站到收藏书签、编辑收藏书签</p></li><li><p>书签名称随便写</p></li><li><p>书签网址:把以下代码粘贴替换到网址栏里</p></li><li><p>保存</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">javascript:<span class="keyword">void</span>(<span class="function">()=></span>{<span class="keyword">var</span> mj=<span class="built_in">document</span>.createElement(<span class="string">'script'</span>);mj.src=<span class="string">'https://cdn.jsdelivr.net/gh/youhua38tao/CDN/js/bilipic.js'</span>;<span class="built_in">document</span>.getElementsByTagName(<span class="string">'head'</span>)[<span class="number">0</span>].appendChild(mj);})();</span><br></pre></td></tr></table></figure><p><fancybox><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/%E4%B9%A6%E7%AD%BE%E6%B7%BB%E5%8A%A0.gif" alt="书签添加"><fancybox></p></li></ol><h3 id="到上传头像的页面运行脚本"><a href="#到上传头像的页面运行脚本" class="headerlink" title="到上传头像的页面运行脚本"></a>到上传头像的页面运行脚本</h3><ol><li><p>打开B站头像上传设置页面</p></li><li><p>点击刚才做好的收藏书签</p></li><li><p>等待几秒钟出现一个新的按钮就可以更换动画头像了!</p><p><fancybox><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/%E5%A4%B4%E5%83%8F%E6%9B%B4%E6%8D%A2.gif" alt="头像更换"><fancybox></p></li></ol><blockquote><p><strong>关于Webp格式个人页面上不显示头像如何显示?</strong></p><p>由于B站对Webp图片地址转换错误、导致个人页面的头像图片地址错误而不能正常显示</p><p>这时候只要再点一下书签的脚本、等几秒后就能看到了</p><p>这是脚本帮你修复了个人页面头像的图片地址才显示出来的、作用只有自己看效果而已、没有实际上的修复</p><p>因为是B站的问题、所以没办法只用脚本就能根本修复</p></blockquote><p><fancybox><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/touxiangxianshi.gif" alt="头像显示"><fancybox></p>]]></content>
<summary type="html"><h3 id="动态头像要求"><a href="#动态头像要求" class="headerlink" title="动态头像要求"></a>动态头像要求</h3><ul>
<li><p>准备180x180像素尺寸的动画图片、APNG或者Webp格式、体积1.2MB以下</p>
</li>
<li><p>使用以下列出的任何一种浏览器:</p></summary>
<category term="工具" scheme="https://blog.darkcrane.com/categories/%E5%B7%A5%E5%85%B7/"/>
<category term="工具" scheme="https://blog.darkcrane.com/tags/%E5%B7%A5%E5%85%B7/"/>
<category term="脚本" scheme="https://blog.darkcrane.com/tags/%E8%84%9A%E6%9C%AC/"/>
<category term="折腾" scheme="https://blog.darkcrane.com/tags/%E6%8A%98%E8%85%BE/"/>
<category term="b站" scheme="https://blog.darkcrane.com/tags/b%E7%AB%99/"/>
<category term="bilbili" scheme="https://blog.darkcrane.com/tags/bilbili/"/>
<category term="哔哩哔哩" scheme="https://blog.darkcrane.com/tags/%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9/"/>
<category term="头像" scheme="https://blog.darkcrane.com/tags/%E5%A4%B4%E5%83%8F/"/>
</entry>
<entry>
<title>Android Fragment</title>
<link href="https://blog.darkcrane.com/posts/f0626deb/"/>
<id>https://blog.darkcrane.com/posts/f0626deb/</id>
<published>2020-03-15T09:00:20.000Z</published>
<updated>2020-03-15T09:00:20.000Z</updated>
<content type="html"><![CDATA[<h3 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h3><p>你可以简单的理解为,Fragment是显示在Activity中的Activity。它可以显示在Activity中,然后它也可以显示出一些内容。因为它拥有自己的生命周期,可以接受处理用户的事件,并且你可以在一个Activity中动态的添加,替换,移除不同的Fragment,因此对于信息的展示具有很大的便利性</p><a id="more"></a><p>Fragment,简称碎片,是Android 3.0(API 11)提出的,为了兼容低版本,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6。</p><p>过去support-v4库是一个jar包,24.2.0版本开始,将support-v4库模块化为多个jar包,包含:support-fragment, support-ui, support-media-compat等,这么做是为了减少APK包大小,你需要用哪个模块就引入哪个模块。</p><p>如果想引入整个support-v4库,则<code>compile 'com.android.support:support-v4:24.2.1</code>,如果只想引入support-fragment库,则<code>com.android.support:support-fragment:24.2.1</code>。</p><blockquote><p>因为support库是不断更新的,因此建议使用support库中的android.support.v4.app.Fragment,而不要用系统自带的android.app.Fragment。而如果要使用support库的Fragment,Activity必须要继承FragmentActivity(AppCompatActivity是FragmentActivity的子类)。</p></blockquote><ul><li>Fragment是依赖于Activity的,不能独立存在的。</li><li>一个Activity里可以有多个Fragment。</li><li>一个Fragment可以被多个Activity重用。</li><li>Fragment有自己的生命周期,并能接收输入事件。</li><li>我们能在Activity运行时动态地添加或删除Fragment。</li></ul><h4 id="Fragment优点"><a href="#Fragment优点" class="headerlink" title="Fragment优点"></a>Fragment优点</h4><ul><li>模块化(Modularity):我们不必把所有代码全部写在Activity中,而是把代码写在各自的Fragment中。</li><li>可重用(Reusability):多个Activity可以重用一个Fragment。</li><li>可适配(Adaptability):根据硬件的屏幕尺寸、屏幕方向,能够方便地实现不同的布局,这样用户体验更好。</li></ul><h3 id="Fragment的生命周期"><a href="#Fragment的生命周期" class="headerlink" title="Fragment的生命周期"></a>Fragment的生命周期</h3><p>因为Fragment是依附于Activity存在的,因此它的生命周期收到Activity的生命周期影响。Fragment比Activity多了几个生命周期的回调方法。</p><ul><li><p>onAttach(Activity): 当Fragment与Activity发生关联的时候调用</p></li><li><p>onCreateView(LayoutInflater, ViewGroup, Bundle): 创建该Fragment的视图</p></li><li><p>onActivityCreated(Bundle): 当Activity的onCreated方法返回时调用</p></li><li><p>onDestroyView() 与onCreateView方法相对应,当该Fragment的视图被移除时调用</p></li><li><p>onDetach() 与onAttach方法相对应,当Fragment与Activity取消关联时调用</p></li></ul><blockquote><p>PS:注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现</p></blockquote><p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200305220346.png"></p><h3 id="Fragment的创建和使用"><a href="#Fragment的创建和使用" class="headerlink" title="Fragment的创建和使用"></a>Fragment的创建和使用</h3><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">FirstFragment</span> <span class="keyword">extends</span> <span class="title">Fragment</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Nullable</span></span><br><span class="line"> <span class="comment">//创建加载布局文件</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> View <span class="title">onCreateView</span><span class="params">(<span class="meta">@NonNull</span> LayoutInflater inflater, <span class="meta">@Nullable</span> ViewGroup container,</span></span></span><br><span class="line"><span class="function"><span class="params"> <span class="meta">@Nullable</span> Bundle savedInstanceState)</span> </span>{</span><br><span class="line"> Log.d(<span class="string">"onCreateView"</span>,<span class="string">"onCreateView被执行"</span>);</span><br><span class="line"> View view=inflater.inflate(R.layout.activity_first_fragment,container,<span class="keyword">false</span>);</span><br><span class="line"> <span class="keyword">return</span> view;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//布局已经加载完成</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onViewCreated</span><span class="params">(<span class="meta">@NonNull</span> View view, <span class="meta">@Nullable</span> Bundle savedInstanceState)</span> </span>{</span><br><span class="line"> Log.d(<span class="string">"onViewCreated"</span>,<span class="string">"onViewCreated被执行"</span>);</span><br><span class="line"> <span class="keyword">super</span>.onViewCreated(view, savedInstanceState);</span><br><span class="line"> <span class="comment">//通过view.findViewById(),可以获取fragment控件</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onDetach</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">super</span>.onDetach();</span><br><span class="line"> Log.d(<span class="string">"onDetach"</span>,<span class="string">"onDetach被执行"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onAttach</span><span class="params">(<span class="meta">@NonNull</span> Context context)</span> </span>{</span><br><span class="line"> <span class="keyword">super</span>.onAttach(context);</span><br><span class="line"> Log.d(<span class="string">"onAttach"</span>,<span class="string">"onAttach被执行"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onDestroyView</span><span class="params">()</span> </span>{</span><br><span class="line"> <span class="keyword">super</span>.onDestroyView();</span><br><span class="line"> Log.d(<span class="string">"onDestroyView"</span>,<span class="string">"onDestroyView被执行"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">FragmentActivity</span> <span class="keyword">extends</span> <span class="title">AppCompatActivity</span> </span>{</span><br><span class="line"> <span class="keyword">private</span> Button btn_change;</span><br><span class="line"> <span class="keyword">private</span> FirstFragment firstFragment;<span class="comment">//创建FirstFragment对象</span></span><br><span class="line"> <span class="keyword">private</span> SecondFragment secondFragment;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">(Bundle savedInstanceState)</span> </span>{</span><br><span class="line"> <span class="keyword">super</span>.onCreate(savedInstanceState);</span><br><span class="line"> setContentView(R.layout.activity_fragment);</span><br><span class="line"> btn_change=(Button) findViewById(R.id.btn_change);</span><br><span class="line"> firstFragment=<span class="keyword">new</span> FirstFragment();</span><br><span class="line"></span><br><span class="line"> <span class="comment">//在当前的FragmengActivity添加显示fragment</span></span><br><span class="line"> getSupportFragmentManager().beginTransaction().add(R.id.fl,</span><br><span class="line"> firstFragment).commitAllowingStateLoss();</span><br><span class="line"> <span class="comment">//添加点击事件,用来切换不同的Fragment</span></span><br><span class="line"> btn_change.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(secondFragment==<span class="keyword">null</span>) {</span><br><span class="line"> secondFragment = <span class="keyword">new</span> SecondFragment();</span><br><span class="line"> firstFragment=<span class="keyword">null</span>;</span><br><span class="line"> }</span><br><span class="line"> getSupportFragmentManager().beginTransaction().replace(R.id.fl,</span><br><span class="line"> secondFragment).addToBackStack(<span class="keyword">null</span>).commitAllowingStateLoss();</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></pre></td></tr></table></figure><h3 id="要点"><a href="#要点" class="headerlink" title="要点"></a>要点</h3><h4 id="什么是Fragment的回退栈?【重要】"><a href="#什么是Fragment的回退栈?【重要】" class="headerlink" title="什么是Fragment的回退栈?【重要】"></a>什么是Fragment的回退栈?【重要】</h4><ul><li>Fragment的回退栈是用来保存每一次Fragment事务发生的变化</li><li>如果你将Fragment任务添加到回退栈,当用户点击后退按钮时,将看到上一次的保存</li><li>Fragment。一旦Fragment完全从后退栈中弹出,用户再次点击后退键,则退出当前Activity。</li></ul><h4 id="Fragment与Activity之间的通信【难点】"><a href="#Fragment与Activity之间的通信【难点】" class="headerlink" title="Fragment与Activity之间的通信【难点】"></a>Fragment与Activity之间的通信【难点】</h4><p><strong>Fragment依附于Activity存在,因此与Activity之间的通信可以归纳为以下几点:</strong><br>① 如果你Activity中包含自己管理的Fragment的引用,可以通过引用直接访问所有的Fragment的public方法。<br>② 如果Activity中未保存任何Fragment的引用,那么没关系,每个Fragment都有一个唯一的TAG或者ID,可以通过getFragmentManager.findFragmentByTag()或者findFragmentById()获得任何Fragment实例,然后进行操作。<br>③ Fragment中可以通过getActivity得到当前绑定的Activity的实例,然后进行操作。</p>]]></content>
<summary type="html"><h3 id="基本概念"><a href="#基本概念" class="headerlink" title="基本概念"></a>基本概念</h3><p>你可以简单的理解为,Fragment是显示在Activity中的Activity。它可以显示在Activity中,然后它也可以显示出一些内容。因为它拥有自己的生命周期,可以接受处理用户的事件,并且你可以在一个Activity中动态的添加,替换,移除不同的Fragment,因此对于信息的展示具有很大的便利性</p></summary>
<category term="学习" scheme="https://blog.darkcrane.com/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="Android" scheme="https://blog.darkcrane.com/categories/%E5%AD%A6%E4%B9%A0/Android/"/>
<category term="学习" scheme="https://blog.darkcrane.com/tags/%E5%AD%A6%E4%B9%A0/"/>
<category term="Android" scheme="https://blog.darkcrane.com/tags/Android/"/>
<category term="Fragment" scheme="https://blog.darkcrane.com/tags/Fragment/"/>
<category term="Android碎片" scheme="https://blog.darkcrane.com/tags/Android%E7%A2%8E%E7%89%87/"/>
</entry>
<entry>
<title>Android 数据存储</title>
<link href="https://blog.darkcrane.com/posts/867b5518/"/>
<id>https://blog.darkcrane.com/posts/867b5518/</id>
<published>2020-03-15T09:00:20.000Z</published>
<updated>2020-03-15T09:00:20.000Z</updated>
<content type="html"><![CDATA[<p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200305150839.png" alt="Android数据存储"></p><a id="more"></a><p>Android系统提供了四种存储数据方式。分别为:SharePreferences、SQLite、Content Provider和File。但由于Android系统中,数据基本是私有的,都是存放于”data/data”程序包名目录下,所以要实现数据共享,正确方式是使用Content Provider</p><h3 id="一-、SharePreferences:轻量级数据存储"><a href="#一-、SharePreferences:轻量级数据存储" class="headerlink" title="一 、SharePreferences:轻量级数据存储"></a>一 、SharePreferences:轻量级数据存储</h3><blockquote><p>SharedPreferences是一种数据存储方式,用来存储一些简单的信息,位于android.content包中,以键值对的模式进行存储,键值对(key-value)。对于存储的基本信息,如int,string,boolean,float和long。</p></blockquote><p><strong>获取方式:</strong></p><ol><li>使用getSharedPreferences()方法获取</li><li>使用getPreferences()方法获取</li></ol><p><strong>实现SharedPreferences存储步骤:</strong></p><ol><li>调用SharedPreferences类的edit()方法,获取SharedPreferences.Editor对象</li><li>调用一个SharedPreferences.Editor对象的putXXX()的方法获取数据</li><li>使用commit()方法提交数据</li></ol><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">DataActivity</span> <span class="keyword">extends</span> <span class="title">AppCompatActivity</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> EditText editText;</span><br><span class="line"> <span class="keyword">private</span> Button btn_save;</span><br><span class="line"> <span class="keyword">private</span> Button btn_show;</span><br><span class="line"> <span class="keyword">private</span> TextView textView;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> SharedPreferences sharedPreferences;<span class="comment">//读操作</span></span><br><span class="line"> <span class="keyword">private</span> SharedPreferences.Editor editor;<span class="comment">//写操作</span></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">(Bundle savedInstanceState)</span> </span>{</span><br><span class="line"> <span class="keyword">super</span>.onCreate(savedInstanceState);</span><br><span class="line"> setContentView(R.layout.activity_data);</span><br><span class="line"> editText=findViewById(R.id.et1);</span><br><span class="line"> btn_save=findViewById(R.id.btn_save);</span><br><span class="line"> btn_show=findViewById(R.id.btn_show);</span><br><span class="line"> textView=findViewById(R.id.tv1);</span><br><span class="line"></span><br><span class="line"> sharedPreferences=<span class="keyword">this</span>.getSharedPreferences(<span class="string">"ludainkai"</span>,MODE_PRIVATE);</span><br><span class="line"> editor= sharedPreferences.edit();</span><br><span class="line"> <span class="comment">//读取保存</span></span><br><span class="line"> btn_save.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>{</span><br><span class="line"> editor.putString(<span class="string">"tag"</span>,editText.getText().toString());</span><br><span class="line"> editor.commit();<span class="comment">//或者使用apply()</span></span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> <span class="comment">//显示操作</span></span><br><span class="line"> btn_show.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>{</span><br><span class="line"> textView.setText(sharedPreferences.getString(<span class="string">"tag"</span>,<span class="string">""</span>));</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>使用SharePreferences读写数据,最终生成 的文件</p><p>目录:/data/data/<applicationId>/shared_prefs</p><h3 id="二、File-存储"><a href="#二、File-存储" class="headerlink" title="二、File 存储"></a>二、File 存储</h3><blockquote><p>文件存储是Android中最基本的一种存储方式,和Java中实现I/O的方式,由Context类提供openFileInput()和openFileOutput()方法打开。文件存储主要分两种存储,一种是内部存储,一种是外部存储。<br>内存存储(Internal Storage):使用了FileInputStream类中的openFileInput()方法,用于读取数据;使用了FileOutputStream类中的openFileOutput()方法,用于写入数据。<br>外部存储(External Storage):使用Enviroment类中的getExternalStorageDirectory()方法对外部存储上的文件进行读写。</p></blockquote><p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200305215235.png"></p><p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200305215305.png"></p><p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200305215327.png"></p><p><strong>简化:</strong></p><ul><li>FileOutputStream -> openFileOutput()</li><li>FileInputStream -> openFileInput()</li><li>Environment -> getExternalStorageDirectory()</li></ul><p><strong>一,内部存储的写入文件步骤</strong></p><ol><li>获取文件输出流对象 FileOutputStream</li><li>使用FileOutputStream类的openFileOutput(String name, int mode)方法</li><li>调用FileOutputStream对象的write()方法写入文件</li><li>调用flush()方法,因为write()方法是写入缓冲区的,调用flush()方法将缓冲中的数据写入到文件,清空缓存</li><li>close()方法用于关闭FileOutputStream</li></ol><p><strong>二,内部存储的读取文件步骤</strong></p><ol><li>获取文件输入流对象 FileInputStream</li><li>使用FileInputStream类的openFileInput()方法来实现</li><li>调用FileInputStream对象的read()方法</li><li>调用close()关闭文件输入流对象</li></ol><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">FileActivity</span> <span class="keyword">extends</span> <span class="title">AppCompatActivity</span> </span>{</span><br><span class="line"> <span class="keyword">private</span> Button btn_save;</span><br><span class="line"> <span class="keyword">private</span> Button btn_show;</span><br><span class="line"> <span class="keyword">private</span> TextView textView;</span><br><span class="line"> <span class="keyword">private</span> EditText editText;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">(<span class="keyword">final</span> Bundle savedInstanceState)</span> </span>{</span><br><span class="line"> <span class="keyword">super</span>.onCreate(savedInstanceState);</span><br><span class="line"> setContentView(R.layout.activity_file);</span><br><span class="line"></span><br><span class="line"> editText=findViewById(R.id.et1);</span><br><span class="line"> btn_save=findViewById(R.id.btn_save);</span><br><span class="line"> btn_show=findViewById(R.id.btn_show);</span><br><span class="line"> textView=findViewById(R.id.tv1);</span><br><span class="line"> <span class="comment">//将数据保存在文件</span></span><br><span class="line"> btn_save.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>{</span><br><span class="line"> String str=editText.getText().toString();</span><br><span class="line"> fileSave(str);</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> <span class="comment">//读文件</span></span><br><span class="line"> btn_show.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>{</span><br><span class="line"> String str=fileRead();</span><br><span class="line"> textView.setText(str);</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="comment">//封装一个方法将从控件的内容写到文件中</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">fileSave</span><span class="params">(String str)</span></span>{</span><br><span class="line"> FileOutputStream fileOutputStream=<span class="keyword">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> fileOutputStream=openFileOutput(<span class="string">"day11.txt"</span>,MODE_PRIVATE);</span><br><span class="line"> fileOutputStream.write(str.getBytes());</span><br><span class="line"> fileOutputStream.close();</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//封装一个方法将从文件的内容读到控件中</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">fileRead</span><span class="params">()</span></span>{</span><br><span class="line"> FileInputStream fileInputStream=<span class="keyword">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> fileInputStream=openFileInput(<span class="string">"day11.txt"</span>);</span><br><span class="line"> <span class="keyword">byte</span>[] bytes=<span class="keyword">new</span> <span class="keyword">byte</span>[<span class="number">1024</span>];</span><br><span class="line"> StringBuffer sb=<span class="keyword">new</span> StringBuffer(<span class="string">""</span>);</span><br><span class="line"> <span class="keyword">int</span> len=<span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span>((len=fileInputStream.read(bytes))><span class="number">0</span>){</span><br><span class="line"> sb.append(<span class="keyword">new</span> String(bytes,<span class="number">0</span>,len));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> sb.toString();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (FileNotFoundException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="三、Sqlite-轻量级数据库,适合应用移动端数据存储"><a href="#三、Sqlite-轻量级数据库,适合应用移动端数据存储" class="headerlink" title="三、Sqlite 轻量级数据库,适合应用移动端数据存储"></a>三、Sqlite 轻量级数据库,适合应用移动端数据存储</h3><blockquote><p>SQLite是一款轻量级的关系型数据库,它的运算很快,占用空间小,SQLite不仅有SQL语法支持,独立,还有数据库的ACID事务,SQLite数据库为一种嵌入式数据库。</p><p>SQLiteOpenHelper类,它是SQLiteDatabase的帮助类,用于管理数据库的创建和升级,SQLiteOpenHelper类为抽象类,有两个要重写的方法:<code>onCreate()</code>和<code>onUpgrade()</code>,用于去实现创建和升级数据库。</p><p>在SQLiteOpenHelper类中还需要一个构造方法,这个方法接收四个参数,分别为<code>Context context</code>,<code>String name</code>,<code>CursorFactory factory</code>,<code>int version</code>这四个。第一个是参数context,第二个是数据库名,第三个是自定义Cursor,一般为null,第四个为当前的数据库版本号。</p><p>在SQLiteOpenHelper类中有两个重要的实例方法,为<code>getReadableDatabase()</code>和<code>getWritableDatabase()</code>这两个方法。调用这其中的方法就能够创建数据库了。如果存在数据库就打开,没有就创建。</p><p>SQLiteOpenHelper类是一个SQLite帮助类,实现SQLite的数据操作,创建一个类去继SQLiteOpenHelper。</p></blockquote><p>如何使用Sqlite数据库存储数据操作CRUD的操作 </p><p><strong>使用Sqlite的步骤:</strong></p><blockquote><p>1.编写一个类继承SQLiteOpenHelper<br>2.重写SQLiteOpenHelper 里面的抽象方法<br>3.添加构造方法</p></blockquote><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">DBDataBase</span> <span class="keyword">extends</span> <span class="title">SQLiteOpenHelper</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="comment">/*@param context 上下文对象</span></span><br><span class="line"><span class="comment"> * @param name 数据库的名称</span></span><br><span class="line"><span class="comment"> * @param factory 游标对象</span></span><br><span class="line"><span class="comment"> * @param version 数据库的版本</span></span><br><span class="line"><span class="comment"> * */</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//调整构造函数</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">DBDataBase</span><span class="params">(Context context)</span> </span>{</span><br><span class="line"> <span class="keyword">super</span>(context, Constant.DATABASE_NAME, <span class="keyword">null</span>, Constant.VERSION_CODE);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//这个方法是创建数据库的回调方法</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * onCreate()方法 就是在第一次创建数据库之后的回调,</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> db</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">(SQLiteDatabase db)</span> </span>{</span><br><span class="line"></span><br><span class="line"> Log.d(<span class="string">"onCreate"</span>,<span class="string">"onCreate()被执行"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//创建数据表</span></span><br><span class="line"> String sql=<span class="string">"create table tb_user(id integer ,name varchar(20),password varchar(20),tel varchar(12))"</span>;</span><br><span class="line"> <span class="comment">//创建tb_user</span></span><br><span class="line"> db.execSQL(sql);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//这个方法是用来升级数据库的</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onUpgrade</span><span class="params">(SQLiteDatabase db, <span class="keyword">int</span> oldVersion, <span class="keyword">int</span> newVersion)</span> </span>{</span><br><span class="line"> Log.d(<span class="string">"onUpgrade"</span>,<span class="string">"onUpgrade()被执行"</span>);</span><br><span class="line"> <span class="comment">//添加表字段的sql语句</span></span><br><span class="line"> String sql=<span class="string">"alter table tb_user add address varchar(100)"</span>;</span><br><span class="line"> <span class="comment">//执行sql语句</span></span><br><span class="line"> db.execSQL(sql);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>在 启动SqliteActivity时创建数据</p><figure class="highlight java"><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">public</span> <span class="class"><span class="keyword">class</span> <span class="title">SqliteActivity</span> <span class="keyword">extends</span> <span class="title">AppCompatActivity</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title">onCreate</span><span class="params">(Bundle savedInstanceState)</span> </span>{</span><br><span class="line"> <span class="keyword">super</span>.onCreate(savedInstanceState);</span><br><span class="line"> setContentView(R.layout.activity_sqlite);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//创建数据</span></span><br><span class="line"> DBDataBase helper=<span class="keyword">new</span> DBDataBase(SqliteActivity.<span class="keyword">this</span>);</span><br><span class="line"> <span class="comment">//通过helper对象创建数据</span></span><br><span class="line"> SQLiteDatabase db = helper.getWritableDatabase();</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><blockquote><p> SQLiteDatabase db = helper.getWritableDatabase();<br> SQLiteDatabase db = helper.getReaderableDatabase();<br>这两种创建数据库的区别:<br>getReaderableDatabase()方法如果在创建数据库的时候出现异常,会返回一个可写状态的数据库,getWritableDatabase() 据库的时候出现异常 就会抛出异常</p></blockquote><p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200305152659.png" alt="SQLite"></p><p><strong>向数据库添加数据</strong></p><p>insert()方法,参数一表名,参数二是在未指定添加数据的情况下给某些可为空的列自动赋值为NULL,设置为null即可,参数三是ContentValues对象。</p><figure class="highlight java"><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">SQLiteDatabase db = helper.getWritableDatabase();</span><br><span class="line">ContentValues values = <span class="keyword">new</span> ContentValues();</span><br><span class="line">values.put(<span class="string">"name"</span>,<span class="string">"The Book Name"</span>);</span><br><span class="line">values.put(<span class="string">"author"</span>,<span class="string">"chen"</span>);</span><br><span class="line">values.put(<span class="string">"pages"</span>,<span class="number">100</span>);</span><br><span class="line">values.put(<span class="string">"price"</span>,<span class="number">200</span>);</span><br><span class="line">db.insert(<span class="string">"Book"</span>,<span class="keyword">null</span>,values);</span><br></pre></td></tr></table></figure><p><strong>更新数据库中的数据</strong></p><p>update()方法,参数一是表名,参数二是ContentValues对象,参数三、四是去约束更新某一行或某几行的数据,不指定默认更新所有。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">SQLiteDatabase db = helper.getWritableDatabase();</span><br><span class="line">ContentValues values = <span class="keyword">new</span> ContentValues();</span><br><span class="line">values.put(<span class="string">"price"</span>,<span class="number">120</span>);</span><br><span class="line">db.update(<span class="string">"Book"</span>,values,<span class="string">"name= ?"</span>,<span class="keyword">new</span> String[]{<span class="string">"The Book Name"</span>});</span><br></pre></td></tr></table></figure><p><strong>从数据库中删除数据</strong></p><p>delete()方法,参数一是表名,参数二、三是去约束删除某一行或某几行的数据,不指定默认删除所有。</p><figure class="highlight java"><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">SQLiteDatabase db = helper.getWritableDatabase();</span><br><span class="line">db.delete(<span class="string">"Book"</span>,<span class="string">"pages> ?"</span>,<span class="keyword">new</span> String[]{<span class="string">"100"</span>});</span><br></pre></td></tr></table></figure><p><strong>查询数据库中的数据</strong></p><p>query()方法,参数一是表名,参数二是指定查询哪几列,默认全部,参数三、四是去约束查询某一行或某几行的数据,不指定默认查询所有,参数五是用于指定需要去group by的列,参数六是对group by的数据进一步的过滤,参数七是查询结果的排序方式</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">SQLiteDatabase db = helper.getWritableDatabase();</span><br><span class="line">Cursor cursor = db.query(<span class="string">"Book"</span>,<span class="keyword">null</span>,<span class="keyword">null</span>,<span class="keyword">null</span>,<span class="keyword">null</span>,<span class="keyword">null</span>,<span class="keyword">null</span>);</span><br><span class="line"><span class="keyword">if</span>(cursor.moveToFirst()){</span><br><span class="line"> <span class="keyword">do</span>{</span><br><span class="line"> String name = cursor.getString(cursor.getColumnIndex(<span class="string">"name"</span>);</span><br><span class="line"> String author = cursor.getString(cursor.getColumnIndex(<span class="string">"author"</span>);</span><br><span class="line"> <span class="keyword">int</span> pages = cursor.getString(cursor.getColumnIndex(<span class="string">"pages"</span>);</span><br><span class="line"> <span class="keyword">double</span> price = cursor.getString(cursor.getColumnIndex(<span class="string">"price"</span>);</span><br><span class="line"> }<span class="keyword">while</span>(cursor.moveToNext());</span><br><span class="line">}</span><br><span class="line">cursor.close():</span><br></pre></td></tr></table></figure><p>Cursor游标</p><p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200305155738.png" alt="Cursor"></p><p><strong>使用SQL语句操作数据库</strong></p><figure class="highlight java"><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="comment">//添加数据</span></span><br><span class="line">db.execSQL(<span class="string">"insert into Book(name,author,pages,price) values(?,?,?,?) "</span></span><br><span class="line"> ,<span class="keyword">new</span> String[]{<span class="string">"The Book Name"</span>,<span class="string">"chen"</span>,<span class="number">100</span>,<span class="number">20</span>});</span><br><span class="line"><span class="comment">//更新数据</span></span><br><span class="line">db.execSQL(<span class="string">"update Book set price = ? where name = ?"</span>,<span class="keyword">new</span> String[]</span><br><span class="line"> {<span class="string">"10"</span>,<span class="string">"The Book Name"</span>});</span><br><span class="line"><span class="comment">//删除数据</span></span><br><span class="line">db.execSQL(<span class="string">"delete from Book where pages > ?"</span>,<span class="keyword">new</span> String[]{<span class="string">"100"</span>});</span><br><span class="line"><span class="comment">//查询数据</span></span><br><span class="line">db.execSQL(<span class="string">"select * from Book"</span>,<span class="keyword">null</span>);</span><br></pre></td></tr></table></figure><p><strong>使用事务操作</strong></p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">SQLiteDatabase db = helper.getWritableDatabase();</span><br><span class="line">db.beginTransaction(); <span class="comment">//开启事务</span></span><br><span class="line"><span class="keyword">try</span>{</span><br><span class="line"> ......</span><br><span class="line"> db.insert(<span class="string">"Book"</span>,<span class="keyword">null</span>,values);</span><br><span class="line"> db.setTransactionSuccessful(); <span class="comment">//事务成功执行</span></span><br><span class="line">}<span class="keyword">catch</span>(SQLException e){</span><br><span class="line"> e.printStackTrace();</span><br><span class="line">}<span class="keyword">finally</span>{</span><br><span class="line"> db.endTransaction(); <span class="comment">//结束事务</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><p><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200305150839.png" alt="Android数据存储"></p></summary>
<category term="学习" scheme="https://blog.darkcrane.com/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="Android" scheme="https://blog.darkcrane.com/categories/%E5%AD%A6%E4%B9%A0/Android/"/>
<category term="学习" scheme="https://blog.darkcrane.com/tags/%E5%AD%A6%E4%B9%A0/"/>
<category term="Android" scheme="https://blog.darkcrane.com/tags/Android/"/>
<category term="数据存储" scheme="https://blog.darkcrane.com/tags/%E6%95%B0%E6%8D%AE%E5%AD%98%E5%82%A8/"/>
<category term="SharePreferences" scheme="https://blog.darkcrane.com/tags/SharePreferences/"/>
<category term="SQLite" scheme="https://blog.darkcrane.com/tags/SQLite/"/>
<category term="File" scheme="https://blog.darkcrane.com/tags/File/"/>
<category term="Content Provider" scheme="https://blog.darkcrane.com/tags/Content-Provider/"/>
</entry>
<entry>
<title>Android BroadcastReceiver广播</title>
<link href="https://blog.darkcrane.com/posts/9a3e3673/"/>
<id>https://blog.darkcrane.com/posts/9a3e3673/</id>
<published>2020-03-15T09:00:20.000Z</published>
<updated>2020-03-15T09:00:20.000Z</updated>
<content type="html"><![CDATA[<h3 id="什么是android中的BroadcastReceiver广播"><a href="#什么是android中的BroadcastReceiver广播" class="headerlink" title="什么是android中的BroadcastReceiver广播"></a>什么是android中的BroadcastReceiver广播</h3><p>在 Android 系统中,广播(Broadcast)是在组件之间传播数据的一种机制,这些组件可以位于不同的进程中,起到进程间通信的作用</p><a id="more"></a><p><strong>BroadcastReceiver</strong> 是对发送出来的 <strong>Broadcast</strong> 进行过滤、接受和响应的组件。首先将要发送的消息和用于过滤的信息(Action,Category)装入一个 <strong>Intent</strong> 对象,然后通过调用 <strong>Context.sendBroadcast()</strong> 、 <strong>sendOrderBroadcast()</strong> 方法把 Intent 对象以广播形式发送出去。 广播发送出去后,所以已注册的 BroadcastReceiver 会检查注册时的 <strong>IntentFilter</strong> 是否与发送的 Intent 相匹配,若匹配则会调用 BroadcastReceiver 的 <strong>onReceiver()</strong> 方法</p><p>所以当我们定义一个 BroadcastReceiver 的时候,都需要实现 onReceiver() 方法。BroadcastReceiver 的生命周期很短,在执行 onReceiver() 方法时才有效,一旦执行完毕,该Receiver 的生命周期就结束了</p><h3 id="广播类型"><a href="#广播类型" class="headerlink" title="广播类型"></a>广播类型</h3><p>Android中的广播分为两种类型,<strong>标准广播</strong>和<strong>有序广播</strong></p><ul><li><strong>标准广播</strong><br>标准广播是一种完全异步执行的广播,在广播发出后所有的广播接收器会在同一时间接收到这条广播,之间没有先后顺序,效率比较高,且<strong>无法被截断</strong></li><li><strong>有序广播</strong><br>有序广播是一种同步执行的广播,在广播发出后同一时刻只有一个广播接收器能够接收到, 优先级高的广播接收器会优先接收,当优先级高的广播接收器的 onReceiver() 方法运行结束后,广播才会继续传递,且前面的广播接收器可以选择调用 <code>abortBroadcast()</code>方法<strong>截断广播</strong>,这样后面的广播接收器就无法接收到这条广播了</li></ul><table><thead><tr><th></th><th>一般广播</th><th>有序广播</th></tr></thead><tbody><tr><td><strong>多人接收时是否有序</strong></td><td>无序,都会同时执行</td><td>有序,依据优先级和注册先后顺序依次执行</td></tr><tr><td><strong>是否可以中断</strong></td><td>不可以</td><td>可以,调用了abortBroadcas()方法中断,后面的接收器就接收不了此广播</td></tr></tbody></table><h3 id="如何发送广播"><a href="#如何发送广播" class="headerlink" title="如何发送广播"></a>如何发送广播</h3><h4 id="发送标准广播"><a href="#发送标准广播" class="headerlink" title="发送标准广播"></a>发送标准广播</h4><p>发送标准广播调用的是 <code>sendBroadcast(Intent)</code> 方法</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">btnNormal.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>{</span><br><span class="line"> <span class="comment">//指定action 就是要发送的广播频道</span></span><br><span class="line"> Intent intent=<span class="keyword">new</span> Intent(<span class="string">"app.com.cn"</span>);</span><br><span class="line"> <span class="comment">//在发送广播的时候,向广播接收者发送数据</span></span><br><span class="line"> intent.putExtra(<span class="string">"name"</span>,<span class="string">"大数据.JAVA.Android"</span>);</span><br><span class="line"> <span class="comment">//下面这句代码执行广播的发送</span></span><br><span class="line"> sendBroadcast(intent);</span><br><span class="line"> }</span><br><span class="line">});</span><br></pre></td></tr></table></figure><h4 id="发送有序广播"><a href="#发送有序广播" class="headerlink" title="发送有序广播"></a>发送有序广播</h4><p>发送有序广播调用的是 <code>sendOrderedBroadcast(Intent , String)</code>方法,String 参数值在自定义权限时使用</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">btnOrder.setOnClickListener(<span class="keyword">new</span> View.OnClickListener() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onClick</span><span class="params">(View v)</span> </span>{</span><br><span class="line"> Intent intent=<span class="keyword">new</span> Intent(<span class="string">"app.com.cn"</span>);</span><br><span class="line"> <span class="comment">//发送有序广播</span></span><br><span class="line"> sendOrderedBroadcast(intent,<span class="keyword">null</span>);</span><br><span class="line"> }</span><br><span class="line">});</span><br></pre></td></tr></table></figure><h3 id="如何编写一个广播接收器"><a href="#如何编写一个广播接收器" class="headerlink" title="如何编写一个广播接收器"></a>如何编写一个广播接收器</h3><ol><li><p>写一个类继承于BroadCastReceiver 重写 onReceive()方法</p></li><li><p>要注册广播 (静态注册、动态注册)</p><figure class="highlight java"><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"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyBroadCastReceiver1</span> <span class="keyword">extends</span> <span class="title">BroadcastReceiver</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">MyBroadCastReceiver1</span><span class="params">()</span></span>{</span><br><span class="line"> Log.d(<span class="string">"MyBroadCastReceiver1"</span>,<span class="string">"MyBroadCastReceiver1构造方法被执行"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//这个方法是广播接收器接收到某个广播之后的回调方法</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onReceive</span><span class="params">(Context context, Intent intent)</span> </span>{</span><br><span class="line"> String name=intent.getStringExtra(<span class="string">"name"</span>);</span><br><span class="line"> Log.d(<span class="string">"onReceive"</span>,<span class="string">"onReceive()被执行:"</span>+name);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">OrderReceiver_1</span> <span class="keyword">extends</span> <span class="title">BroadcastReceiver</span> </span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">final</span> String TAG = <span class="string">"OrderReceiver_1"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="title">OrderReceiver_1</span><span class="params">()</span> </span>{</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">onReceive</span><span class="params">(Context context, Intent intent)</span> </span>{</span><br><span class="line"> Log.e(TAG, <span class="string">"OrderReceiver_1被调用了"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//取出Intent当中传递来的数据</span></span><br><span class="line"> String msg = intent.getStringExtra(<span class="string">"Msg"</span>);</span><br><span class="line"> Log.e(TAG, <span class="string">"OrderReceiver_1接收到的值: "</span> + msg);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//向下一优先级的Receiver传递数据</span></span><br><span class="line"> Bundle bundle = <span class="keyword">new</span> Bundle();</span><br><span class="line"> bundle.putString(<span class="string">"Data"</span>, <span class="string">"(Hello)"</span>);</span><br><span class="line"> setResultExtras(bundle);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></li></ol><h3 id="广播接收器的注册方式"><a href="#广播接收器的注册方式" class="headerlink" title="广播接收器的注册方式"></a>广播接收器的注册方式</h3><p>凡是要接收广播的接收者,必须要进行注册: BroadCastReceiver (广播接收器),广播在注册方式上可以分为<strong>动态注册</strong>和<strong>静态注册</strong>两种方式。静态注册即在<strong>清单文件</strong>中为 <strong>BroadcastReceiver</strong> 进行注册,使用**< receiver ><strong>标签声明,并在标签内用 **< intent-filter ></strong> 标签设置过滤器。这种形式的 BroadcastReceiver 的生命周期伴随着整个应用,如果这种方式处理的是系统广播,那么不管应用是否在运行,该广播接收器都能接收到该广播</p><p><strong>动态注册</strong>:指的是在程序代码中进行广播注册的过程</p><p><strong>静态注册</strong>:在<code>AndroidManifest.xml</code>文件进行注册,注册类</p><table><thead><tr><th></th><th>静态注册</th><th>动态注册</th></tr></thead><tbody><tr><td><strong>注册方式</strong></td><td>配置文件(Androidmanifest.xml)</td><td>java代码执行</td></tr><tr><td><strong>注册时间</strong></td><td>应用安装成功/手机开机完成</td><td>执行registerReceiver(reveiver,intent)注册时创建对象</td></tr><tr><td><strong>生命结束的时间(解注册)</strong></td><td>应用卸载(对象执行完onReceiver之后就回收)</td><td>执行unregisterReceiver(receiver),注意activity退出以后必须解注册,解注册后对象被回收</td></tr><tr><td><strong>应用情景</strong></td><td>需要监听的时间为整个应用分的生命周期时间</td><td>只服务于某个Activity或者Service</td></tr></tbody></table><h4 id="静态注册"><a href="#静态注册" class="headerlink" title="静态注册"></a>静态注册</h4><p><strong>在清单文件中注册 BroadcastReceiver</strong></p><p>在清单文件中声明的 BroadcastReceiver ,必须包含值为 <strong>NORMAL_ACTION</strong> 字符串的 <strong>action</strong> 属性,该广播接收器才能收到以下代码中发出的广播</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">receiver</span> <span class="attr">android:name</span>=<span class="string">".NormalReceiver"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">intent-filter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">"app.com.cn"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">intent-filter</span>></span></span><br><span class="line"><span class="tag"></<span class="name">receiver</span>></span></span><br></pre></td></tr></table></figure><p><strong>注册广播优先级的配置:</strong></p><p>在清单文件中对三个 Receiver 进行注册,指定相同的 <strong>action</strong> 属性值,Receiver 之间的优先级使用 <strong>priority</strong> 属性来判定,数值越大,优先级越高</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"> <span class="tag"><<span class="name">receiver</span> <span class="attr">android:name</span>=<span class="string">".MyBroadCastReceiver1"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">intent-filter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">"app.com.cn"</span>></span><span class="tag"></<span class="name">action</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">intent-filter</span>></span></span><br><span class="line"><span class="tag"></<span class="name">receiver</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">receiver</span> <span class="attr">android:name</span>=<span class="string">".MyBroadCastReceiver3"</span> ></span></span><br><span class="line"> <span class="tag"><<span class="name">intent-filter</span> <span class="attr">android:priority</span>=<span class="string">"2000000"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">"app.com.cn"</span> ></span><span class="tag"></<span class="name">action</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">intent-filter</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">receiver</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">receiver</span> <span class="attr">android:name</span>=<span class="string">".MyBroadCastReceiver4"</span> ></span></span><br><span class="line"> <span class="tag"><<span class="name">intent-filter</span> <span class="attr">android:priority</span>=<span class="string">"2147483647"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">"app.com.cn"</span> ></span><span class="tag"></<span class="name">action</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">intent-filter</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">receiver</span>></span></span><br></pre></td></tr></table></figure><h4 id="动态注册"><a href="#动态注册" class="headerlink" title="动态注册"></a>动态注册</h4><p>动态注册 BroadcastReceiver 是在代码中定义并设置好一个 <strong>IntentFilter</strong> 对象,然后在需要注册的地方调用 <strong>Context.registerReceiver()</strong> 方法,调用 <strong>Context.unregisterReceiver()</strong> 方法取消注册,此时就不需要在清单文件中注册 Receiver 了</p><p>这里采用在 Service 中注册广播接收器的形式,分别在<strong>注册广播接收器</strong>、<strong>取消注册广播接受器</strong>和<strong>接收到广播</strong>时输出Log</p><figure class="highlight java"><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></pre></td><td class="code"><pre><span class="line">MyBroadCastReceiver2 myBroadCastReceiver2;</span><br><span class="line"><span class="comment">//动态注册广播接收器</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">reg</span><span class="params">(View view)</span></span>{</span><br><span class="line"> <span class="keyword">if</span>(myBroadCastReceiver2==<span class="keyword">null</span>){</span><br><span class="line"> <span class="comment">//创建要注册的广播接收器</span></span><br><span class="line"> myBroadCastReceiver2=<span class="keyword">new</span> MyBroadCastReceiver2();</span><br><span class="line"> <span class="comment">//创建意图过滤器 指定要接收的频道</span></span><br><span class="line"> IntentFilter intentFilter=<span class="keyword">new</span> IntentFilter(<span class="string">"app.com.cn"</span>);</span><br><span class="line"> <span class="comment">//registerReceiver(要注册的广播接收器,意图过滤器);</span></span><br><span class="line"> registerReceiver(myBroadCastReceiver2,intentFilter);</span><br><span class="line"> <span class="comment">//弹框提示</span></span><br><span class="line"> Toast.makeText(<span class="keyword">this</span>,<span class="string">"给myBroadCastReceiver2动态注册"</span>,Toast.LENGTH_SHORT).show();</span><br><span class="line"></span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> Toast.makeText(<span class="keyword">this</span>,<span class="string">"myBroadCastReceiver2已经被注册过了"</span>,Toast.LENGTH_SHORT).show();</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="comment">//解注册广播接收器</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">unReg</span><span class="params">()</span></span>{</span><br><span class="line"> <span class="keyword">if</span>(myBroadCastReceiver2!=<span class="keyword">null</span>){</span><br><span class="line"> <span class="comment">//解除刚才注册的接收器</span></span><br><span class="line"> unregisterReceiver(myBroadCastReceiver2);</span><br><span class="line"> myBroadCastReceiver2=<span class="keyword">null</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h3 id="相关API"><a href="#相关API" class="headerlink" title="相关API"></a>相关API</h3><blockquote><p>Context</p><p>SendBroadCast(Intent intent);发送一般广播</p><p>SendOrderedBroadCast(Intent intent); 发送有序广播</p><p>registerReceiver(receiver,intentFilter);注册广播接收器</p><p>UnRegisterReceiver(receiver); 解注册广播接收器</p></blockquote><h3 id="Android常见的系统广播"><a href="#Android常见的系统广播" class="headerlink" title="Android常见的系统广播"></a>Android常见的系统广播</h3><p>Android 内置了很多系统级别的广播,我们可以在应用程序里面通过监听这些广播来得到各种系统的状态信息。</p><table><thead><tr><th>广播</th><th>Intent</th></tr></thead><tbody><tr><td>开机广播。这个动作被广播一次(只有一次)</td><td>Intent.ACTION_BOOT_COMPLETED</td></tr><tr><td>重启设备时的广播</td><td>Intent.ACTION_REBOOT;</td></tr><tr><td>屏幕被关闭之后的广播</td><td>Intent.ACTION_SCREEN_OFF;</td></tr><tr><td>屏幕被打开之后的广播</td><td>Intent.ACTION_SCREEN_ON;</td></tr><tr><td>插上外部电源时发出的广播</td><td>Intent.ACTION_POWER_CONNECTED;</td></tr><tr><td>已断开外部电源连接时发出的广播</td><td>Intent.ACTION_POWER_DISCONNECTED;</td></tr><tr><td>表示电池电量低</td><td>Intent.ACTION_BATTERY_LOW;</td></tr><tr><td>表示电池电量充足,即从电池电量低变化到饱满时会发出广播</td><td>Intent.ACTION_BATTERY_OKAY;</td></tr><tr><td>充电状态,只能通过Context.registerReceiver()注册</td><td>Intent.ACTION_BATTERY_CHANGED;</td></tr><tr><td>关闭或打开飞行模式时的广播</td><td>Intent.ACTION_AIRPLANE_MODE_CHANGED;</td></tr><tr><td>设备墙纸已改变时发出的广播</td><td>Intent.ACTION_WALLPAPER_CHANGED;</td></tr><tr><td>设备日期发生改变时会发出此广播</td><td>Intent.ACTION_DATE_CHANGED</td></tr><tr><td>按下照相时的拍照按键(硬件按键)时发出的广播</td><td>Intent.ACTION_CAMERA_BUTTON;</td></tr><tr><td>当屏幕超时进行锁屏时,当用户按下电源按钮,长按或短按(不管有没跳出话框)</td><td>Intent.ACTION_CLOSE_SYSTEM_DIALOGS;</td></tr><tr><td>设备当前设置被改变时发出的广播(包括的改变:界面语言,设备方向,等,请参考Configuration.java)</td><td>Intent.ACTION_CONFIGURATION_CHANGED;</td></tr><tr><td>设备内存不足时发出的广播,此广播只能由系统使用,其它APP不可用</td><td>Intent.ACTION_DEVICE_STORAGE_LOW;</td></tr><tr><td>设备内存从不足到充足时发出的广播,此广播只能由系统使用,其它APP不可用</td><td>Intent.ACTION_DEVICE_STORAGE_OK;</td></tr><tr><td>关闭系统时发出的广播</td><td>Intent.ACTION_SHUTDOWN;</td></tr><tr><td>时区发生改变时发出的广播</td><td>Intent.ACTION_TIMEZONE_CHANGED;</td></tr><tr><td>时间被设置时发出的广播</td><td>Intent.ACTION_TIME_CHANGED;</td></tr><tr><td>移动APP完成之后,发出的广播(移动是指:APP2SD)</td><td>Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE;</td></tr><tr><td>正在移动APP时,发出的广播(移动是指:APP2SD)</td><td>Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE;</td></tr><tr><td>Gtalk已建立连接时发出的广播</td><td>Intent.ACTION_GTALK_SERVICE_CONNECTED;</td></tr><tr><td>Gtalk已断开连接时发出的广播</td><td>Intent.ACTION_GTALK_SERVICE_DISCONNECTED;</td></tr><tr><td>在耳机口上插入耳机时发出的广播</td><td>Intent.ACTION_HEADSET_PLUG;</td></tr><tr><td>改变输入法时发出的广播</td><td>Intent.ACTION_INPUT_METHOD_CHANGED;</td></tr><tr><td>设备当前区域设置已更改时发出的广播</td><td>Intent.ACTION_LOCALE_CHANGED;</td></tr><tr><td>广播:当前时间改变,每分钟都发送,只能通过Context.registerReceiver()方法来注册</td><td>Intent.ACTION_TIME_TICK;</td></tr><tr><td>一个用户ID已经从系统中移除发出的广播</td><td>Intent.ACTION_UID_REMOVED;</td></tr><tr><td>设备已进入USB大容量储存状态时发出的广播</td><td>Intent.ACTION_UMS_CONNECTED;</td></tr><tr><td>设备已从USB大容量储存状态转为正常状态时发出的广播</td><td>Intent.ACTION_UMS_DISCONNECTED;</td></tr><tr><td>表示用户和包管理所承认的低内存状态通知应该开始。</td><td>Intent.ACTION_MANAGE_PACKAGE_STORAGE;</td></tr><tr><td>未正确移除SD卡(正确移除SD卡的方法:设置–SD卡和设备内存–卸载SD卡),但已把SD卡取出来时发出的广播 ,扩展介质(扩展卡)已经从 SD 卡插槽拔出,但是挂载点 (mount point) 还没解除 (unmount)</td><td>Intent.ACTION_MEDIA_BAD_REMOVAL;</td></tr><tr><td>插入SD卡并且已正确安装(识别)时发出的广播, 扩展介质被插入,而且已经被挂载。</td><td>Intent.ACTION_MEDIA_MOUNTED;</td></tr><tr><td>按下”Media Button” 按键时发出的广播,假如有”Media Button” 按键的话(硬件按键)</td><td>Intent.ACTION_MEDIA_BUTTON;</td></tr><tr><td>插入外部储存装置,比如SD卡时,系统会检验SD卡,此时发出的广播?</td><td>Intent.ACTION_MEDIA_CHECKING;</td></tr><tr><td>已拔掉外部大容量储存设备发出的广播(比如SD卡,或移动硬盘),不管有没有正确卸载都会发出此广播, 用户想要移除扩展介质(拔掉扩展卡)。</td><td>Intent.ACTION_MEDIA_EJECT;</td></tr><tr><td>拓展介质存在,但使用不兼容FS(或为空)的路径安装点检查介质包含在Intent.mData领域。</td><td>Intent.ACTION_MEDIA_NOFS;</td></tr><tr><td>外部储存设备已被移除,不管有没正确卸载,都会发出此广播, 扩展介质被移除。</td><td>Intent.ACTION_MEDIA_REMOVED;</td></tr><tr><td>广播:已经扫描完介质的一个目录</td><td>Intent.ACTION_MEDIA_SCANNER_FINISHED;</td></tr><tr><td>请求媒体扫描仪扫描文件并将其添加到媒体数据库。</td><td>Intent.ACTION_MEDIA_SCANNER_SCAN_FILE;</td></tr><tr><td>广播:开始扫描介质的一个目录</td><td>Intent.ACTION_MEDIA_SCANNER_STARTED;</td></tr><tr><td>广播:扩展介质存在,但是还没有被挂载 (mount)</td><td>Intent.ACTION_MEDIA_UNMOUNTED</td></tr><tr><td>广播:扩展介质的挂载被解除 (unmount),因为它已经作为 USB 大容量存储被共享。</td><td>Intent.ACTION_MEDIA_SHARED;</td></tr><tr><td>成功的安装APK之后,设备上新安装了一个应用程序包。</td><td>Intent.ACTION_PACKAGE_ADDED;</td></tr><tr><td>一个已存在的应用程序包已经改变,包括包名</td><td>Intent.ACTION_PACKAGE_CHANGED;</td></tr><tr><td>清除一个应用程序的数据时发出的广播(在设置--应用管理--选中某个应用,之后点清除数据时)</td><td>Intent.ACTION_PACKAGE_DATA_CLEARED;</td></tr><tr><td>触发一个下载并且完成安装时发出的广播,比如在电子市场里下载应用</td><td>Intent.ACTION_PACKAGE_INSTALL;</td></tr><tr><td>成功的删除某个APK之后发出的广播, 一个已存在的应用程序包已经从设备上移除,包括包名(正在被安装的包程序不能接收到这个广播)</td><td>Intent.ACTION_PACKAGE_REMOVED;</td></tr><tr><td>替换一个现有的安装包时发出的广播(不管现在安装的APP比之前的新还是旧,都会发出此广播)</td><td>Intent.ACTION_PACKAGE_REPLACED;</td></tr><tr><td>用户重新开始一个包,包的所有进程将被杀死,所有与其联系的运行时间状态应该被移除,包括包名(重新开始包程序不能接收到这个广播)</td><td>Intent.ACTION_PACKAGE_RESTARTED;</td></tr></tbody></table>]]></content>
<summary type="html"><h3 id="什么是android中的BroadcastReceiver广播"><a href="#什么是android中的BroadcastReceiver广播" class="headerlink" title="什么是android中的BroadcastReceiver广播"></a>什么是android中的BroadcastReceiver广播</h3><p>在 Android 系统中,广播(Broadcast)是在组件之间传播数据的一种机制,这些组件可以位于不同的进程中,起到进程间通信的作用</p></summary>
<category term="学习" scheme="https://blog.darkcrane.com/categories/%E5%AD%A6%E4%B9%A0/"/>
<category term="Android" scheme="https://blog.darkcrane.com/categories/%E5%AD%A6%E4%B9%A0/Android/"/>
<category term="学习" scheme="https://blog.darkcrane.com/tags/%E5%AD%A6%E4%B9%A0/"/>
<category term="Android" scheme="https://blog.darkcrane.com/tags/Android/"/>
<category term="BroadcastReceiver" scheme="https://blog.darkcrane.com/tags/BroadcastReceiver/"/>
</entry>
<entry>
<title>Github+jsDelivr+PicGo 打造稳定快速、高效免费图床</title>
<link href="https://blog.darkcrane.com/posts/f95e7e65/"/>
<id>https://blog.darkcrane.com/posts/f95e7e65/</id>
<published>2020-03-02T14:22:05.000Z</published>
<updated>2020-03-02T14:22:05.000Z</updated>
<content type="html"><![CDATA[<h3 id="–-前言"><a href="#–-前言" class="headerlink" title="– 前言"></a>– 前言</h3><p>图床是个啥东西就不用过多介绍了,先来对比一下各路图床:</p><blockquote><ul><li>微博图床:以前用的人比较多,从2019年4月开始开启了防盗链,凉凉</li><li>SM.MS:运营四年多了,也变得越来越慢了,到了晚上直接打不开图片,速度堪忧</li><li>其他小众图床:随时有挂掉的风险</li><li>Imgur等国外图床:国内访问速度太慢,随时有被墙的风险</li><li>大厂储存服务:例如七牛云、又拍云、腾讯云COS、阿里云OSS等,容量限制,操作繁琐,又是实名认证又是域名备案的,麻烦,而且还要花钱(有钱又不怕麻烦的当我没说)</li></ul></blockquote><a id="more"></a><p>因此,GitHub 图床是个不错的选择,利用 jsDelivr CDN 加速访问(jsDelivr 是一个免费开源的 CDN 解决方案),PicGo 工具一键上传,操作简单高效,GitHub 和 jsDelivr 都是大厂,不用担心跑路问题,不用担心速度和容量问题,而且完全免费,可以说是目前免费图床的最佳解决方案!</p><h3 id="–-新建GitHub仓库"><a href="#–-新建GitHub仓库" class="headerlink" title="– 新建GitHub仓库"></a>– 新建GitHub仓库</h3><p>登录/注册GitHub,新建一个仓库,填写好仓库名,仓库描述,根据需求选择是否为仓库初始化一个README.md描述文件</p><h3 id="–-生成一个Token"><a href="#–-生成一个Token" class="headerlink" title="– 生成一个Token"></a>– 生成一个Token</h3><p>在主页依次选择【Settings】-【Developer settings】-【Personal access tokens】-【Generate new token】,填写好描述,勾选【repo】,然后点击【Generate token】生成一个Token,<yellow>注意这个Token只会显示一次</yellow>,自己先保存下来,或者等后面配置好PicGo后再关闭此网页</p><h3 id="–-配置PicGo"><a href="#–-配置PicGo" class="headerlink" title="– 配置PicGo"></a>– 配置PicGo</h3><p>前往<btn regular><a href="https://github.com/Molunerfinn/picgo/releases">下载PicGo</a><btn>,安装好后开始配置图床</p><p><fancybox><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200302233019.png" alt="PicGo配置"><fancybox></p><ul><li>设定仓库名:按照【用户名/图床仓库名】的格式填写</li><li>设定分支名:【master】</li><li>设定Token:粘贴之前生成的【Token】</li><li>指定存储路径:填写想要储存的路径,如【img/】,这样就会在仓库下创建一个名为 img的文件夹,图片将会储存在此文件夹中</li><li>设定自定义域名:它的作用是,在图片上传后,PicGo 会按照【自定义域名+储存路径+上传的图片名】的方式生成访问链接,并放到粘贴板上,因为我们要使用 jsDelivr 加速访问,所以可以设置为<code>https://cdn.jsdelivr.net/gh/用户名/图床仓库名</code> ,上传完毕后,我们就可以通过<code>https://cdn.jsdelivr.net/gh/用户名/图床仓库名/图片路径</code> 加速访问我们的图片了,比如上图的图片链接为:<code>https://cdn.jsdelivr.net/gh/youhua38tao/blogimghost/img/20200302233019.png</code><btn><a href="https://cdn.jsdelivr.net/gh/youhua38tao/blogimghost/img/20200302233019.png">点击查看</a><btn></li></ul><h3 id="–-进行高效创作"><a href="#–-进行高效创作" class="headerlink" title="– 进行高效创作"></a>– 进行高效创作</h3><p>配置好PicGo后,我们就可以进行高效创作了,将图片拖拽到上传区,将会自动上传并复制访问链接,将链接粘贴到博文中就行了,访问速度杠杠的,此外PicGo还有相册功能,可以对已上传的图片进行删除,修改链接等快捷操作,PicGo还可以生成不同格式的链接、支持批量上传、快捷键上传、自定义链接格式、上传前重命名等,更多功能自己去探索吧!</p><p><fancybox><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200302234005.png" alt="界面"></fancybox></p>]]></content>
<summary type="html"><h3 id="–-前言"><a href="#–-前言" class="headerlink" title="– 前言"></a>– 前言</h3><p>图床是个啥东西就不用过多介绍了,先来对比一下各路图床:</p>
<blockquote>
<ul>
<li>微博图床:以前用的人比较多,从2019年4月开始开启了防盗链,凉凉</li>
<li>SM.MS:运营四年多了,也变得越来越慢了,到了晚上直接打不开图片,速度堪忧</li>
<li>其他小众图床:随时有挂掉的风险</li>
<li>Imgur等国外图床:国内访问速度太慢,随时有被墙的风险</li>
<li>大厂储存服务:例如七牛云、又拍云、腾讯云COS、阿里云OSS等,容量限制,操作繁琐,又是实名认证又是域名备案的,麻烦,而且还要花钱(有钱又不怕麻烦的当我没说)</li>
</ul>
</blockquote></summary>
<category term="图床" scheme="https://blog.darkcrane.com/categories/%E5%9B%BE%E5%BA%8A/"/>
<category term="网站搭建" scheme="https://blog.darkcrane.com/tags/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/"/>
<category term="公益" scheme="https://blog.darkcrane.com/tags/%E5%85%AC%E7%9B%8A/"/>
<category term="图床" scheme="https://blog.darkcrane.com/tags/%E5%9B%BE%E5%BA%8A/"/>
<category term="网站优化" scheme="https://blog.darkcrane.com/tags/%E7%BD%91%E7%AB%99%E4%BC%98%E5%8C%96/"/>
</entry>
<entry>
<title>Hexo优化(lazyload)</title>
<link href="https://blog.darkcrane.com/posts/629b4849/"/>
<id>https://blog.darkcrane.com/posts/629b4849/</id>
<published>2020-03-02T14:22:05.000Z</published>
<updated>2020-03-02T14:22:05.000Z</updated>
<content type="html"><![CDATA[<h3 id="hexo-lazyload-image(图片懒加载插件)"><a href="#hexo-lazyload-image(图片懒加载插件)" class="headerlink" title="hexo-lazyload-image(图片懒加载插件)"></a>hexo-lazyload-image(图片懒加载插件)</h3><p>点击<btn><a href="https://github.com/Troy-Yang/hexo-lazyload-image">这里</a></btn>查看</p><h4 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-lazyload-image --save</span><br></pre></td></tr></table></figure><a id="more"></a><h4 id="用法"><a href="#用法" class="headerlink" title="用法"></a>用法</h4><p>首先从你的hexo项目<code>_config.yml</code>中添加配置。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">lazyload:</span><br><span class="line"> enable: true </span><br><span class="line"> onlypost: false</span><br><span class="line"> loadingImg: # eg ./images/loading.gif</span><br></pre></td></tr></table></figure><p><strong>Onlypost</strong></p><ul><li>如果为true,则仅帖子或页面中的图像将支持懒加载。</li><li>如果为false,则网站的整个图像将使用懒加载,包括与主题距离较远的图像,但不包括CSS样式的背景图像。</li></ul><p><strong>loadingImg</strong></p><ul><li>如果不设置任何值(默认情况下),则它将使用默认的加载图像。</li><li>如果要自定义图像,则需要将加载的图像复制到当前主题图像文件夹,然后更改此路径以找到它。</li></ul><p><strong>为指定图像指定不延迟</strong></p><p>如果同时在markdown或html中的img标签上指定属性,我们也可以禁用图片懒加载</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><img no-lazy src="abc.png" /></span><br></pre></td></tr></table></figure><p>运行hexo命令。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo clean && hexo g</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h3 id="hexo-lazyload-image(图片懒加载插件)"><a href="#hexo-lazyload-image(图片懒加载插件)" class="headerlink" title="hexo-lazyload-image(图片懒加载插件)"></a>hexo-lazyload-image(图片懒加载插件)</h3><p>点击<btn><a href="https://github.com/Troy-Yang/hexo-lazyload-image">这里</a></btn>查看</p>
<h4 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ npm install hexo-lazyload-image --save</span><br></pre></td></tr></table></figure></summary>
<category term="网站搭建" scheme="https://blog.darkcrane.com/categories/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/"/>
<category term="网站搭建" scheme="https://blog.darkcrane.com/tags/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/"/>
<category term="网站优化" scheme="https://blog.darkcrane.com/tags/%E7%BD%91%E7%AB%99%E4%BC%98%E5%8C%96/"/>
<category term="美化" scheme="https://blog.darkcrane.com/tags/%E7%BE%8E%E5%8C%96/"/>
</entry>
<entry>
<title>为自己的网站添加404公益页面</title>
<link href="https://blog.darkcrane.com/posts/32f127a5/"/>
<id>https://blog.darkcrane.com/posts/32f127a5/</id>
<published>2020-02-29T16:22:05.000Z</published>
<updated>2020-02-29T16:22:05.000Z</updated>
<content type="html"><![CDATA[<p>当访问不存在的页面时,会直接出现can’t get xxx或返回默认404页面,所以我添加了腾讯的404公益页面,也算是尽了一份力吧!</p><h3 id="开始折腾"><a href="#开始折腾" class="headerlink" title="开始折腾"></a>开始折腾</h3><a id="more"></a><p>在网站根目录下新建404.html文件:</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><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="meta"><!DOCTYPE <span class="meta-keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>404 - Hello KAYGB<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"icon"</span> <span class="attr">href</span>=<span class="string">"你的icon链接"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">src</span>=<span class="string">"//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">homePageUrl</span>=<span class="string">"自己的主页地址"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">homePageName</span>=<span class="string">"回到我的主页"</span><span class="attr">charset</span>=<span class="string">"utf-8"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure><p>使用hexo的童鞋,你会发现hexo把这个文件也进行了渲染,所以我们要让hexo不渲染这个html文件。找到博客根目录下的_config.yml,打开并修改:</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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="comment"># Directory</span></span><br><span class="line"><span class="attr">source_dir:</span> <span class="string">source</span></span><br><span class="line"><span class="attr">public_dir:</span> <span class="string">public</span></span><br><span class="line"><span class="attr">tag_dir:</span> <span class="string">tags</span></span><br><span class="line"><span class="attr">archive_dir:</span> <span class="string">archives</span></span><br><span class="line"><span class="attr">category_dir:</span> <span class="string">categories</span></span><br><span class="line"><span class="attr">code_dir:</span> <span class="string">downloads/code</span></span><br><span class="line"><span class="attr">i18n_dir:</span> <span class="string">:lang</span></span><br><span class="line"><span class="attr">skip_render:</span> <span class="comment">#如果也有别的页面不需要渲染,直接在下方添加就可以了</span></span><br><span class="line"> <span class="bullet">-</span> <span class="number">404.</span><span class="string">html</span> <span class="comment">#将404.html加进去,【-】之后要有空格隔开</span></span><br></pre></td></tr></table></figure><p>然后:</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo g -d</span><br></pre></td></tr></table></figure><p>访问一下https://你的域名.github.io/404:</p><p><fancybox><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/%E7%88%B1%E5%BF%83404.png" alt="404notfound"></fancybox></p><p>将网站部署到云服务器上的还需要更改服in务器配置,(以ngnix为例)更改nginx监听的网站虚拟主机配置文件,nginx.conf,在server定义区域内增加:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">error_page 404 = /404.html;</span><br></pre></td></tr></table></figure><p>保存,重启nginx服务器,OJBK。</p>]]></content>
<summary type="html"><p>当访问不存在的页面时,会直接出现can’t get xxx或返回默认404页面,所以我添加了腾讯的404公益页面,也算是尽了一份力吧!</p>
<h3 id="开始折腾"><a href="#开始折腾" class="headerlink" title="开始折腾"></a>开始折腾</h3></summary>
<category term="网站搭建" scheme="https://blog.darkcrane.com/categories/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/"/>
<category term="网站搭建" scheme="https://blog.darkcrane.com/tags/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/"/>
<category term="公益" scheme="https://blog.darkcrane.com/tags/%E5%85%AC%E7%9B%8A/"/>
</entry>
<entry>
<title>博客美化</title>
<link href="https://blog.darkcrane.com/posts/560e8e48/"/>
<id>https://blog.darkcrane.com/posts/560e8e48/</id>
<published>2020-01-02T14:22:05.000Z</published>
<updated>2020-01-02T14:22:05.000Z</updated>
<content type="html"><![CDATA[<h3 id="自定义鼠标指针样式"><a href="#自定义鼠标指针样式" class="headerlink" title="自定义鼠标指针样式"></a>自定义鼠标指针样式</h3><p>在 <code>\themes\volantis\source\less\_base.less</code> 文件 body 样式里写入如下代码:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">body {</span><br><span class="line"> cursor: url(https://cdn.jsdelivr.net/gh/TRHX/[email protected]/images/mouse.cur),auto;</span><br><span class="line"> background-color: @theme_background;</span><br><span class="line"> ......</span><br><span class="line"> ......</span><br><span class="line">}</span><br></pre></td></tr></table></figure><a id="more"></a><p>鼠标指针可以用 Axialis CursorWorkshop 这个软件自己制作,不同主题具体放的文件有所不同,确保在博客主体 body 的 CSS 文件中即可,其中的鼠标指针链接可替换成自己的,首先尝试加载 <a href="https://cdn.jsdelivr.net/gh/TRHX/[email protected]/images/mouse.cur">https://cdn.jsdelivr.net/gh/TRHX/[email protected]/images/mouse.cur</a> ,如果该文件不存在或由于其他原因无效,那么 auto 会被使用,也就是自动默认效果,图片格式为.ico、.ani、.cur,建议使用.cur,如果使用.ani或者其他格式无效,原因是浏览器兼容问题,请阅读<a href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property">参考文档</a>或者参考以下兼容表:</p><table><thead><tr><th>浏览器</th><th>最低版本</th><th>格式</th></tr></thead><tbody><tr><td>Internet Explorer</td><td>6.0</td><td>.cur / .ani</td></tr><tr><td>Firefox (Gecko), Windows and Linux</td><td>1.5 (1.8)</td><td>.cur / .png / .gif / .jpg</td></tr><tr><td>Firefox (Gecko)</td><td>4.0 (2.0)</td><td>.cur / .png / .gif / .jpg / .svg</td></tr><tr><td>Opera</td><td>—</td><td>—</td></tr><tr><td>Safari (Webkit)</td><td>3.0 (522-523)</td><td>.cur / .png / .gif / .jpg</td></tr></tbody></table><h3 id="添加鼠标点击爱心效果"><a href="#添加鼠标点击爱心效果" class="headerlink" title="添加鼠标点击爱心效果"></a>添加鼠标点击爱心效果</h3><p>在 <code>\themes\volantis\source\js</code> 下新建文件 love.js,在 love.js 文件中添加以下代码:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">!function(e,t,a){function n(){c(".heart{width: 10px;height: 10px;position: fixed;background: #f00;transform: rotate(45deg);-webkit-transform: rotate(45deg);-moz-transform: rotate(45deg);}.heart:after,.heart:before{content: '';width: inherit;height: inherit;background: inherit;border-radius: 50%;-webkit-border-radius: 500%;-moz-border-radius: 50%;position: fixed;}.heart:after{top: -5px;}.heart:before{left: -5px;}"),o(),r()}function r(){for(var e=0;e<d.length;e++)d[e].alpha<=0?(t.body.removeChild(d[e].el),d.splice(e,1)):(d[e].y--,d[e].scale+=.004,d[e].alpha-=.013,d[e].el.style.cssText="left:"+d[e].x+"px;top:"+d[e].y+"px;opacity:"+d[e].alpha+";transform:scale("+d[e].scale+","+d[e].scale+") rotate(45deg);background:"+d[e].color+";z-index:99999");requestAnimationFrame(r)}function o(){var t="function"==typeof e.onclick&&e.onclick;e.onclick=function(e){t&&t(),i(e)}}function i(e){var a=t.createElement("div");a.className="heart",d.push({el:a,x:e.clientX-5,y:e.clientY-5,scale:1,alpha:1,color:s()}),t.body.appendChild(a)}function c(e){var a=t.createElement("style");a.type="text/css";try{a.appendChild(t.createTextNode(e))}catch(t){a.styleSheet.cssText=e}t.getElementsByTagName("head")[0].appendChild(a)}function s(){return"rgb("+~~(255*Math.random())+","+~~(255*Math.random())+","+~~(255*Math.random())+")"}var d=[];e.requestAnimationFrame=function(){return e.requestAnimationFrame||e.webkitRequestAnimationFrame||e.mozRequestAnimationFrame||e.oRequestAnimationFrame||e.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)}}(),n()}(window,document);</span><br></pre></td></tr></table></figure><p>在 <code>\themes\volantis\layout\layout.ejs</code> 文件末尾添加以下代码:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><!-- 页面点击小红心 --></span><br><span class="line"><script type="text/javascript" src="/js/love.js"></script></span><br></pre></td></tr></table></figure><p>完成以上操作后,当我们点击鼠标的时候就可以看见爱心的特效了</p><p><fancybox><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200303175417.png" alt="点击爱心"></fancybox></p><h3 id="添加鼠标点击显示字体效果"><a href="#添加鼠标点击显示字体效果" class="headerlink" title="添加鼠标点击显示字体效果"></a>添加鼠标点击显示字体效果</h3><p>在 <code>\themes\volantis\source\js</code> 下新建文件 click_show_text.js,在 click_show_text.js 文件中添加以下代码:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> a_idx = <span class="number">0</span>;</span><br><span class="line">jQuery(<span class="built_in">document</span>).ready(<span class="function"><span class="keyword">function</span>(<span class="params">$</span>) </span>{</span><br><span class="line"> $(<span class="string">"body"</span>).click(<span class="function"><span class="keyword">function</span>(<span class="params">e</span>) </span>{</span><br><span class="line"> <span class="keyword">var</span> a = <span class="keyword">new</span> <span class="built_in">Array</span></span><br><span class="line"> (<span class="string">"富强"</span>, <span class="string">"民主"</span>, <span class="string">"文明"</span>, <span class="string">"和谐"</span>, <span class="string">"自由"</span>, <span class="string">"平等"</span>, <span class="string">"公正"</span>, <span class="string">"法治"</span>, <span class="string">"爱国"</span>, <span class="string">"敬业"</span>, <span class="string">"诚信"</span>, <span class="string">"友善"</span>);</span><br><span class="line"> <span class="keyword">var</span> $i = $(<span class="string">"<span/>"</span>).text(a[a_idx]);</span><br><span class="line"> a_idx = (a_idx + <span class="number">1</span>) % a.length;</span><br><span class="line"> <span class="keyword">var</span> x = e.pageX,</span><br><span class="line"> y = e.pageY;</span><br><span class="line"> $i.css({</span><br><span class="line"> <span class="string">"z-index"</span>: <span class="number">5</span>,</span><br><span class="line"> <span class="string">"top"</span>: y - <span class="number">20</span>,</span><br><span class="line"> <span class="string">"left"</span>: x,</span><br><span class="line"> <span class="string">"position"</span>: <span class="string">"absolute"</span>,</span><br><span class="line"> <span class="string">"font-weight"</span>: <span class="string">"bold"</span>,</span><br><span class="line"> <span class="string">"color"</span>: <span class="string">"#FF0000"</span></span><br><span class="line"> });</span><br><span class="line"> $(<span class="string">"body"</span>).append($i);</span><br><span class="line"> $i.animate({</span><br><span class="line"> <span class="string">"top"</span>: y - <span class="number">180</span>,</span><br><span class="line"> <span class="string">"opacity"</span>: <span class="number">0</span></span><br><span class="line"> },</span><br><span class="line"> <span class="number">3000</span>,</span><br><span class="line"> <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>{</span><br><span class="line"> $i.remove();</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> <span class="built_in">setTimeout</span>(<span class="string">'delay()'</span>, <span class="number">2000</span>);</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">delay</span>(<span class="params"></span>) </span>{</span><br><span class="line"> $(<span class="string">".buryit"</span>).removeAttr(<span class="string">"onclick"</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>其中的社会主义核心价值观可以根据你自己的创意替换为其他文字</p><p>如果想要每次点击显示的文字为不同颜色,可以将其中 <code>color</code> 值进行如下更改:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">"color"</span>: <span class="string">"rgb("</span> + ~~(<span class="number">255</span> * <span class="built_in">Math</span>.random()) + <span class="string">","</span> + ~~(<span class="number">255</span> * <span class="built_in">Math</span>.random()) + <span class="string">","</span> + ~~(<span class="number">255</span> * <span class="built_in">Math</span>.random()) + <span class="string">")"</span></span><br></pre></td></tr></table></figure><p>然后在 <code>\themes\volantis\layout\layout.ejs </code>文件末尾添加以下代码:</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!--单击显示文字--></span></span><br><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"/js/click_show_text.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br></pre></td></tr></table></figure><h3 id="添加鼠标点击烟花爆炸效果"><a href="#添加鼠标点击烟花爆炸效果" class="headerlink" title="添加鼠标点击烟花爆炸效果"></a>添加鼠标点击烟花爆炸效果</h3><p>在 <code>\themes\volantis\source\js</code> 目录下新建一个 fireworks.js 的文件,里面写入以下代码:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">"use strict"</span>;<span class="function"><span class="keyword">function</span> <span class="title">updateCoords</span>(<span class="params">e</span>)</span>{pointerX=(e.clientX||e.touches[<span class="number">0</span>].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[<span class="number">0</span>].clientY-canvasEl.getBoundingClientRect().top}<span class="function"><span class="keyword">function</span> <span class="title">setParticuleDirection</span>(<span class="params">e</span>)</span>{<span class="keyword">var</span> t=anime.random(<span class="number">0</span>,<span class="number">360</span>)*<span class="built_in">Math</span>.PI/<span class="number">180</span>,a=anime.random(<span class="number">50</span>,<span class="number">180</span>),n=[<span class="number">-1</span>,<span class="number">1</span>][anime.random(<span class="number">0</span>,<span class="number">1</span>)]*a;<span class="keyword">return</span>{<span class="attr">x</span>:e.x+n*<span class="built_in">Math</span>.cos(t),<span class="attr">y</span>:e.y+n*<span class="built_in">Math</span>.sin(t)}}<span class="function"><span class="keyword">function</span> <span class="title">createParticule</span>(<span class="params">e,t</span>)</span>{<span class="keyword">var</span> a={};<span class="keyword">return</span> a.x=e,a.y=t,a.color=colors[anime.random(<span class="number">0</span>,colors.length<span class="number">-1</span>)],a.radius=anime.random(<span class="number">16</span>,<span class="number">32</span>),a.endPos=setParticuleDirection(a),a.draw=<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,<span class="number">0</span>,<span class="number">2</span>*<span class="built_in">Math</span>.PI,!<span class="number">0</span>),ctx.fillStyle=a.color,ctx.fill()},a}<span class="function"><span class="keyword">function</span> <span class="title">createCircle</span>(<span class="params">e,t</span>)</span>{<span class="keyword">var</span> a={};<span class="keyword">return</span> a.x=e,a.y=t,a.color=<span class="string">"#F00"</span>,a.radius=<span class="number">0.1</span>,a.alpha=<span class="number">0.5</span>,a.lineWidth=<span class="number">6</span>,a.draw=<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,<span class="number">0</span>,<span class="number">2</span>*<span class="built_in">Math</span>.PI,!<span class="number">0</span>),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=<span class="number">1</span>},a}<span class="function"><span class="keyword">function</span> <span class="title">renderParticule</span>(<span class="params">e</span>)</span>{<span class="keyword">for</span>(<span class="keyword">var</span> t=<span class="number">0</span>;t<e.animatables.length;t++){e.animatables[t].target.draw()}}<span class="function"><span class="keyword">function</span> <span class="title">animateParticules</span>(<span class="params">e,t</span>)</span>{<span class="keyword">for</span>(<span class="keyword">var</span> a=createCircle(e,t),n=[],i=<span class="number">0</span>;i<numberOfParticules;i++){n.push(createParticule(e,t))}anime.timeline().add({<span class="attr">targets</span>:n,<span class="attr">x</span>:<span class="function"><span class="keyword">function</span>(<span class="params">e</span>)</span>{<span class="keyword">return</span> e.endPos.x},<span class="attr">y</span>:<span class="function"><span class="keyword">function</span>(<span class="params">e</span>)</span>{<span class="keyword">return</span> e.endPos.y},<span class="attr">radius</span>:<span class="number">0.1</span>,<span class="attr">duration</span>:anime.random(<span class="number">1200</span>,<span class="number">1800</span>),<span class="attr">easing</span>:<span class="string">"easeOutExpo"</span>,<span class="attr">update</span>:renderParticule}).add({<span class="attr">targets</span>:a,<span class="attr">radius</span>:anime.random(<span class="number">80</span>,<span class="number">160</span>),<span class="attr">lineWidth</span>:<span class="number">0</span>,<span class="attr">alpha</span>:{<span class="attr">value</span>:<span class="number">0</span>,<span class="attr">easing</span>:<span class="string">"linear"</span>,<span class="attr">duration</span>:anime.random(<span class="number">600</span>,<span class="number">800</span>)},<span class="attr">duration</span>:anime.random(<span class="number">1200</span>,<span class="number">1800</span>),<span class="attr">easing</span>:<span class="string">"easeOutExpo"</span>,<span class="attr">update</span>:renderParticule,<span class="attr">offset</span>:<span class="number">0</span>})}<span class="function"><span class="keyword">function</span> <span class="title">debounce</span>(<span class="params">e,t</span>)</span>{<span class="keyword">var</span> a;<span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{<span class="keyword">var</span> n=<span class="built_in">this</span>,i=<span class="built_in">arguments</span>;<span class="built_in">clearTimeout</span>(a),a=<span class="built_in">setTimeout</span>(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{e.apply(n,i)},t)}}<span class="keyword">var</span> canvasEl=<span class="built_in">document</span>.querySelector(<span class="string">".fireworks"</span>);<span class="keyword">if</span>(canvasEl){<span class="keyword">var</span> ctx=canvasEl.getContext(<span class="string">"2d"</span>),numberOfParticules=<span class="number">30</span>,pointerX=<span class="number">0</span>,pointerY=<span class="number">0</span>,tap=<span class="string">"mousedown"</span>,colors=[<span class="string">"#FF1461"</span>,<span class="string">"#18FF92"</span>,<span class="string">"#5A87FF"</span>,<span class="string">"#FBF38C"</span>],setCanvasSize=debounce(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{canvasEl.width=<span class="number">2</span>*<span class="built_in">window</span>.innerWidth,canvasEl.height=<span class="number">2</span>*<span class="built_in">window</span>.innerHeight,canvasEl.style.width=<span class="built_in">window</span>.innerWidth+<span class="string">"px"</span>,canvasEl.style.height=<span class="built_in">window</span>.innerHeight+<span class="string">"px"</span>,canvasEl.getContext(<span class="string">"2d"</span>).scale(<span class="number">2</span>,<span class="number">2</span>)},<span class="number">500</span>),render=anime({<span class="attr">duration</span>:<span class="number">1</span>/<span class="number">0</span>,<span class="attr">update</span>:<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{ctx.clearRect(<span class="number">0</span>,<span class="number">0</span>,canvasEl.width,canvasEl.height)}});<span class="built_in">document</span>.addEventListener(tap,<span class="function"><span class="keyword">function</span>(<span class="params">e</span>)</span>{<span class="string">"sidebar"</span>!==e.target.id&&<span class="string">"toggle-sidebar"</span>!==e.target.id&&<span class="string">"A"</span>!==e.target.nodeName&&<span class="string">"IMG"</span>!==e.target.nodeName&&(render.play(),updateCoords(e),animateParticules(pointerX,pointerY))},!<span class="number">1</span>),setCanvasSize(),<span class="built_in">window</span>.addEventListener(<span class="string">"resize"</span>,setCanvasSize,!<span class="number">1</span>)}<span class="string">"use strict"</span>;<span class="function"><span class="keyword">function</span> <span class="title">updateCoords</span>(<span class="params">e</span>)</span>{pointerX=(e.clientX||e.touches[<span class="number">0</span>].clientX)-canvasEl.getBoundingClientRect().left,pointerY=e.clientY||e.touches[<span class="number">0</span>].clientY-canvasEl.getBoundingClientRect().top}<span class="function"><span class="keyword">function</span> <span class="title">setParticuleDirection</span>(<span class="params">e</span>)</span>{<span class="keyword">var</span> t=anime.random(<span class="number">0</span>,<span class="number">360</span>)*<span class="built_in">Math</span>.PI/<span class="number">180</span>,a=anime.random(<span class="number">50</span>,<span class="number">180</span>),n=[<span class="number">-1</span>,<span class="number">1</span>][anime.random(<span class="number">0</span>,<span class="number">1</span>)]*a;<span class="keyword">return</span>{<span class="attr">x</span>:e.x+n*<span class="built_in">Math</span>.cos(t),<span class="attr">y</span>:e.y+n*<span class="built_in">Math</span>.sin(t)}}<span class="function"><span class="keyword">function</span> <span class="title">createParticule</span>(<span class="params">e,t</span>)</span>{<span class="keyword">var</span> a={};<span class="keyword">return</span> a.x=e,a.y=t,a.color=colors[anime.random(<span class="number">0</span>,colors.length<span class="number">-1</span>)],a.radius=anime.random(<span class="number">16</span>,<span class="number">32</span>),a.endPos=setParticuleDirection(a),a.draw=<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,<span class="number">0</span>,<span class="number">2</span>*<span class="built_in">Math</span>.PI,!<span class="number">0</span>),ctx.fillStyle=a.color,ctx.fill()},a}<span class="function"><span class="keyword">function</span> <span class="title">createCircle</span>(<span class="params">e,t</span>)</span>{<span class="keyword">var</span> a={};<span class="keyword">return</span> a.x=e,a.y=t,a.color=<span class="string">"#F00"</span>,a.radius=<span class="number">0.1</span>,a.alpha=<span class="number">0.5</span>,a.lineWidth=<span class="number">6</span>,a.draw=<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{ctx.globalAlpha=a.alpha,ctx.beginPath(),ctx.arc(a.x,a.y,a.radius,<span class="number">0</span>,<span class="number">2</span>*<span class="built_in">Math</span>.PI,!<span class="number">0</span>),ctx.lineWidth=a.lineWidth,ctx.strokeStyle=a.color,ctx.stroke(),ctx.globalAlpha=<span class="number">1</span>},a}<span class="function"><span class="keyword">function</span> <span class="title">renderParticule</span>(<span class="params">e</span>)</span>{<span class="keyword">for</span>(<span class="keyword">var</span> t=<span class="number">0</span>;t<e.animatables.length;t++){e.animatables[t].target.draw()}}<span class="function"><span class="keyword">function</span> <span class="title">animateParticules</span>(<span class="params">e,t</span>)</span>{<span class="keyword">for</span>(<span class="keyword">var</span> a=createCircle(e,t),n=[],i=<span class="number">0</span>;i<numberOfParticules;i++){n.push(createParticule(e,t))}anime.timeline().add({<span class="attr">targets</span>:n,<span class="attr">x</span>:<span class="function"><span class="keyword">function</span>(<span class="params">e</span>)</span>{<span class="keyword">return</span> e.endPos.x},<span class="attr">y</span>:<span class="function"><span class="keyword">function</span>(<span class="params">e</span>)</span>{<span class="keyword">return</span> e.endPos.y},<span class="attr">radius</span>:<span class="number">0.1</span>,<span class="attr">duration</span>:anime.random(<span class="number">1200</span>,<span class="number">1800</span>),<span class="attr">easing</span>:<span class="string">"easeOutExpo"</span>,<span class="attr">update</span>:renderParticule}).add({<span class="attr">targets</span>:a,<span class="attr">radius</span>:anime.random(<span class="number">80</span>,<span class="number">160</span>),<span class="attr">lineWidth</span>:<span class="number">0</span>,<span class="attr">alpha</span>:{<span class="attr">value</span>:<span class="number">0</span>,<span class="attr">easing</span>:<span class="string">"linear"</span>,<span class="attr">duration</span>:anime.random(<span class="number">600</span>,<span class="number">800</span>)},<span class="attr">duration</span>:anime.random(<span class="number">1200</span>,<span class="number">1800</span>),<span class="attr">easing</span>:<span class="string">"easeOutExpo"</span>,<span class="attr">update</span>:renderParticule,<span class="attr">offset</span>:<span class="number">0</span>})}<span class="function"><span class="keyword">function</span> <span class="title">debounce</span>(<span class="params">e,t</span>)</span>{<span class="keyword">var</span> a;<span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{<span class="keyword">var</span> n=<span class="built_in">this</span>,i=<span class="built_in">arguments</span>;<span class="built_in">clearTimeout</span>(a),a=<span class="built_in">setTimeout</span>(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{e.apply(n,i)},t)}}<span class="keyword">var</span> canvasEl=<span class="built_in">document</span>.querySelector(<span class="string">".fireworks"</span>);<span class="keyword">if</span>(canvasEl){<span class="keyword">var</span> ctx=canvasEl.getContext(<span class="string">"2d"</span>),numberOfParticules=<span class="number">30</span>,pointerX=<span class="number">0</span>,pointerY=<span class="number">0</span>,tap=<span class="string">"mousedown"</span>,colors=[<span class="string">"#FF1461"</span>,<span class="string">"#18FF92"</span>,<span class="string">"#5A87FF"</span>,<span class="string">"#FBF38C"</span>],setCanvasSize=debounce(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{canvasEl.width=<span class="number">2</span>*<span class="built_in">window</span>.innerWidth,canvasEl.height=<span class="number">2</span>*<span class="built_in">window</span>.innerHeight,canvasEl.style.width=<span class="built_in">window</span>.innerWidth+<span class="string">"px"</span>,canvasEl.style.height=<span class="built_in">window</span>.innerHeight+<span class="string">"px"</span>,canvasEl.getContext(<span class="string">"2d"</span>).scale(<span class="number">2</span>,<span class="number">2</span>)},<span class="number">500</span>),render=anime({<span class="attr">duration</span>:<span class="number">1</span>/<span class="number">0</span>,<span class="attr">update</span>:<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{ctx.clearRect(<span class="number">0</span>,<span class="number">0</span>,canvasEl.width,canvasEl.height)}});<span class="built_in">document</span>.addEventListener(tap,<span class="function"><span class="keyword">function</span>(<span class="params">e</span>)</span>{<span class="string">"sidebar"</span>!==e.target.id&&<span class="string">"toggle-sidebar"</span>!==e.target.id&&<span class="string">"A"</span>!==e.target.nodeName&&<span class="string">"IMG"</span>!==e.target.nodeName&&(render.play(),updateCoords(e),animateParticules(pointerX,pointerY))},!<span class="number">1</span>),setCanvasSize(),<span class="built_in">window</span>.addEventListener(<span class="string">"resize"</span>,setCanvasSize,!<span class="number">1</span>)};</span><br></pre></td></tr></table></figure><p>然后在<code> \themes\volantis\layout\layout.ejs</code> 文件中写入以下代码:</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">canvas</span> <span class="attr">class</span>=<span class="string">"fireworks"</span> <span class="attr">style</span>=<span class="string">"position: fixed;left: 0;top: 0;z-index: 1; pointer-events: none;"</span> ></span><span class="tag"></<span class="name">canvas</span>></span> </span><br><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"//cdn.bootcss.com/animejs/2.2.0/anime.min.js"</span>></span><span class="tag"></<span class="name">script</span>></span> </span><br><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"/js/fireworks.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br></pre></td></tr></table></figure><h3 id="浏览器网页标题恶搞"><a href="#浏览器网页标题恶搞" class="headerlink" title="浏览器网页标题恶搞"></a>浏览器网页标题恶搞</h3><p>当用户访问你的博客时点击到了其他网页,我们可以恶搞一下网页标题,呼唤用户回来,首先在目录 <code>\themes\volantis\source\js</code> 下新建一个 FunnyTitle.js 文件,在里面填写如下代码:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 浏览器搞笑标题</span></span><br><span class="line"><span class="keyword">var</span> OriginTitle = <span class="built_in">document</span>.title;</span><br><span class="line"><span class="keyword">var</span> titleTime;</span><br><span class="line"><span class="built_in">document</span>.addEventListener(<span class="string">'visibilitychange'</span>, <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>{</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">document</span>.hidden) {</span><br><span class="line"> $(<span class="string">'[rel="icon"]'</span>).attr(<span class="string">'href'</span>, <span class="string">"/funny.ico"</span>);</span><br><span class="line"> <span class="built_in">document</span>.title = <span class="string">'╭(°A°`)╮ 页面崩溃啦 ~'</span>;</span><br><span class="line"> <span class="built_in">clearTimeout</span>(titleTime);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> $(<span class="string">'[rel="icon"]'</span>).attr(<span class="string">'href'</span>, <span class="string">"/favicon.ico"</span>);</span><br><span class="line"> <span class="built_in">document</span>.title = <span class="string">'(ฅ>ω<*ฅ) 噫又好啦 ~'</span> + OriginTitle;</span><br><span class="line"> titleTime = <span class="built_in">setTimeout</span>(<span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>{</span><br><span class="line"> <span class="built_in">document</span>.title = OriginTitle;</span><br><span class="line"> }, <span class="number">2000</span>);</span><br><span class="line"> }</span><br><span class="line">});</span><br></pre></td></tr></table></figure><p>其中 <code>funny.ico</code> 是用户切换到其他标签后你网站的图标,<code>favicon.ico</code> 是正常图标,然后在 \themes\material-x\layout\layout.ejs 文件中添加如下代码:java</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><!--浏览器搞笑标题--></span><br><span class="line"><script type=<span class="string">"text/javascript"</span> src=<span class="string">"/js/FunnyTitle.js"</span>></script></span><br></pre></td></tr></table></figure><p>再次部署博客后就可以看见标题搞笑的效果了:</p><p><fancybox><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200303175825.png" alt="效果"></fancybox></p><h3 id="添加背景代码雨特效"><a href="#添加背景代码雨特效" class="headerlink" title="添加背景代码雨特效"></a>添加背景代码雨特效</h3><p>新建 <code>DigitalRain.js</code>,写入以下代码:</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><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></pre></td><td class="code"><pre><span class="line"><span class="built_in">window</span>.onload = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>{</span><br><span class="line"> <span class="comment">//获取画布对象</span></span><br><span class="line"> <span class="keyword">var</span> canvas = <span class="built_in">document</span>.getElementById(<span class="string">"canvas"</span>);</span><br><span class="line"> <span class="comment">//获取画布的上下文</span></span><br><span class="line"> <span class="keyword">var</span> context =canvas.getContext(<span class="string">"2d"</span>);</span><br><span class="line"> <span class="keyword">var</span> s = <span class="built_in">window</span>.screen;</span><br><span class="line"> <span class="keyword">var</span> W = canvas.width = s.width;</span><br><span class="line"> <span class="keyword">var</span> H = canvas.height;</span><br><span class="line"> <span class="comment">//获取浏览器屏幕的宽度和高度</span></span><br><span class="line"> <span class="comment">//var W = window.innerWidth;</span></span><br><span class="line"> <span class="comment">//var H = window.innerHeight;</span></span><br><span class="line"> <span class="comment">//设置canvas的宽度和高度</span></span><br><span class="line"> canvas.width = W;</span><br><span class="line"> canvas.height = H;</span><br><span class="line"> <span class="comment">//每个文字的字体大小</span></span><br><span class="line"> <span class="keyword">var</span> fontSize = <span class="number">12</span>;</span><br><span class="line"> <span class="comment">//计算列</span></span><br><span class="line"> <span class="keyword">var</span> colunms = <span class="built_in">Math</span>.floor(W /fontSize); </span><br><span class="line"> <span class="comment">//记录每列文字的y轴坐标</span></span><br><span class="line"> <span class="keyword">var</span> drops = [];</span><br><span class="line"> <span class="comment">//给每一个文字初始化一个起始点的位置</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i=<span class="number">0</span>;i<colunms;i++){</span><br><span class="line"> drops.push(<span class="number">0</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//运动的文字</span></span><br><span class="line"> <span class="keyword">var</span> str =<span class="string">"WELCOME TO WWW.ITRHX.COM"</span>;</span><br><span class="line"> <span class="comment">//4:fillText(str,x,y);原理就是去更改y的坐标位置</span></span><br><span class="line"> <span class="comment">//绘画的函数</span></span><br><span class="line"> <span class="function"><span class="keyword">function</span> <span class="title">draw</span>(<span class="params"></span>)</span>{</span><br><span class="line"> context.fillStyle = <span class="string">"rgba(238,238,238,.08)"</span>;<span class="comment">//遮盖层</span></span><br><span class="line"> context.fillRect(<span class="number">0</span>,<span class="number">0</span>,W,H);</span><br><span class="line"> <span class="comment">//给字体设置样式</span></span><br><span class="line"> context.font = <span class="string">"600 "</span>+fontSize+<span class="string">"px Georgia"</span>;</span><br><span class="line"> <span class="comment">//给字体添加颜色</span></span><br><span class="line"> context.fillStyle = [<span class="string">"#33B5E5"</span>, <span class="string">"#0099CC"</span>, <span class="string">"#AA66CC"</span>, <span class="string">"#9933CC"</span>, <span class="string">"#99CC00"</span>, <span class="string">"#669900"</span>, <span class="string">"#FFBB33"</span>, <span class="string">"#FF8800"</span>, <span class="string">"#FF4444"</span>, <span class="string">"#CC0000"</span>][<span class="built_in">parseInt</span>(<span class="built_in">Math</span>.random() * <span class="number">10</span>)];<span class="comment">//randColor();可以rgb,hsl, 标准色,十六进制颜色</span></span><br><span class="line"> <span class="comment">//写入画布中</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">var</span> i=<span class="number">0</span>;i<colunms;i++){</span><br><span class="line"> <span class="keyword">var</span> index = <span class="built_in">Math</span>.floor(<span class="built_in">Math</span>.random() * str.length);</span><br><span class="line"> <span class="keyword">var</span> x = i*fontSize;</span><br><span class="line"> <span class="keyword">var</span> y = drops[i] *fontSize;</span><br><span class="line"> context.fillText(str[index],x,y);</span><br><span class="line"> <span class="comment">//如果要改变时间,肯定就是改变每次他的起点</span></span><br><span class="line"> <span class="keyword">if</span>(y >= canvas.height && <span class="built_in">Math</span>.random() > <span class="number">0.99</span>){</span><br><span class="line"> drops[i] = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> drops[i]++;</span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line"> <span class="function"><span class="keyword">function</span> <span class="title">randColor</span>(<span class="params"></span>)</span>{<span class="comment">//随机颜色</span></span><br><span class="line"> <span class="keyword">var</span> r = <span class="built_in">Math</span>.floor(<span class="built_in">Math</span>.random() * <span class="number">256</span>);</span><br><span class="line"> <span class="keyword">var</span> g = <span class="built_in">Math</span>.floor(<span class="built_in">Math</span>.random() * <span class="number">256</span>);</span><br><span class="line"> <span class="keyword">var</span> b = <span class="built_in">Math</span>.floor(<span class="built_in">Math</span>.random() * <span class="number">256</span>);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"rgb("</span>+r+<span class="string">","</span>+g+<span class="string">","</span>+b+<span class="string">")"</span>;</span><br><span class="line"> }</span><br><span class="line"> draw();</span><br><span class="line"> <span class="built_in">setInterval</span>(draw,<span class="number">35</span>);</span><br><span class="line">};</span><br></pre></td></tr></table></figure><p>在主题文件的相关css文件中(以 Material X 1.2.1 主题为例,在<code>\themes\volantis\source\less\_main.less</code> 文件末尾)添加以下代码:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">canvas {</span><br><span class="line"> position: fixed;</span><br><span class="line"> right: 0px;</span><br><span class="line"> bottom: 0px;</span><br><span class="line"> min-width: 100%;</span><br><span class="line"> min-height: 100%;</span><br><span class="line"> height: auto;</span><br><span class="line"> width: auto;</span><br><span class="line"> z-index: -1;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>然后在主题的 layout.ejs 文件中引入即可:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><!-- 数字雨 --></span><br><span class="line"><canvas id="canvas" width="1440" height="900" ></canvas></span><br><span class="line"><script type="text/javascript" src="/js/DigitalRain.js"></script></span><br></pre></td></tr></table></figure><p>最终效果:<fancybox><img src="https://cdn.jsdelivr.net/gh/youhua38tao/CDN/img/20200303180350.png"></fancybox></p><h3 id="添加网站运行时间"><a href="#添加网站运行时间" class="headerlink" title="添加网站运行时间"></a>添加网站运行时间</h3><p>一个比较好的小功能,可以看见自己的博客运行多久了,时间一天天的增加,成就感也会一天天增加的<br>在 <code>\themes\volantis\layout\_partial\footer.ejs</code> 文件下添加以下代码:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span id="timeDate">载入天数...</span><span id="times">载入时分秒...</span></span><br><span class="line"><script></span><br><span class="line"> var now = new Date(); </span><br><span class="line"> function createtime() { </span><br><span class="line"> var grt= new Date("08/10/2018 17:38:00");//在此处修改你的建站时间,格式:月/日/年 时:分:秒</span><br><span class="line"> now.setTime(now.getTime()+250); </span><br><span class="line"> days = (now - grt ) / 1000 / 60 / 60 / 24; dnum = Math.floor(days); </span><br><span class="line"> hours = (now - grt ) / 1000 / 60 / 60 - (24 * dnum); hnum = Math.floor(hours); </span><br><span class="line"> if(String(hnum).length ==1 ){hnum = "0" + hnum;} minutes = (now - grt ) / 1000 /60 - (24 * 60 * dnum) - (60 * hnum); </span><br><span class="line"> mnum = Math.floor(minutes); if(String(mnum).length ==1 ){mnum = "0" + mnum;} </span><br><span class="line"> seconds = (now - grt ) / 1000 - (24 * 60 * 60 * dnum) - (60 * 60 * hnum) - (60 * mnum); </span><br><span class="line"> snum = Math.round(seconds); if(String(snum).length ==1 ){snum = "0" + snum;} </span><br><span class="line"> document.getElementById("timeDate").innerHTML = "本站已安全运行 "+dnum+" 天 "; </span><br><span class="line"> document.getElementById("times").innerHTML = hnum + " 小时 " + mnum + " 分 " + snum + " 秒"; </span><br><span class="line"> } </span><br><span class="line">setInterval("createtime()",250);</span><br><span class="line"></script></span><br></pre></td></tr></table></figure>]]></content>
<summary type="html"><h3 id="自定义鼠标指针样式"><a href="#自定义鼠标指针样式" class="headerlink" title="自定义鼠标指针样式"></a>自定义鼠标指针样式</h3><p>在 <code>\themes\volantis\source\less\_base.less</code> 文件 body 样式里写入如下代码:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">body &#123;</span><br><span class="line"> cursor: url(https:&#x2F;&#x2F;cdn.jsdelivr.net&#x2F;gh&#x2F;TRHX&#x2F;[email protected]&#x2F;images&#x2F;mouse.cur),auto;</span><br><span class="line"> background-color: @theme_background;</span><br><span class="line"> ......</span><br><span class="line"> ......</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></summary>
<category term="网站搭建" scheme="https://blog.darkcrane.com/categories/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/"/>
<category term="网站搭建" scheme="https://blog.darkcrane.com/tags/%E7%BD%91%E7%AB%99%E6%90%AD%E5%BB%BA/"/>
<category term="网站优化" scheme="https://blog.darkcrane.com/tags/%E7%BD%91%E7%AB%99%E4%BC%98%E5%8C%96/"/>
<category term="美化" scheme="https://blog.darkcrane.com/tags/%E7%BE%8E%E5%8C%96/"/>
</entry>
<entry>
<title>计算机组成原理</title>
<link href="https://blog.darkcrane.com/posts/8d4b7ae1/"/>
<id>https://blog.darkcrane.com/posts/8d4b7ae1/</id>
<published>2019-04-06T14:22:05.000Z</published>
<updated>2019-04-06T14:22:05.000Z</updated>
<content type="html"><![CDATA[<h3 id="第一章-计算机系统概论"><a href="#第一章-计算机系统概论" class="headerlink" title="第一章 计算机系统概论"></a>第一章 计算机系统概论</h3><ul><li><p><strong>1.1 了解计算机的分类</strong></p></li><li><p><strong>1.2 计算机的性能指标</strong></p><p>概念,计算题(CPI,MIPS……)P5例1、例2</p></li><li><p><strong>1.5 计算机系统的层次结构</strong></p><p>简答题 P14图1.8</p><a id="more"></a></li></ul><h3 id="第二章-运算方法与运算器"><a href="#第二章-运算方法与运算器" class="headerlink" title="第二章 运算方法与运算器"></a>第二章 运算方法与运算器</h3><ul><li><p><strong>2.1 数据格式</strong></p><p>P18IEEE754中浮点数的表示(单精度格式、32位)</p><p>二进制与IEEE754的转换 P18例1、例2</p></li><li><p><strong>2.2 定点加减法运算</strong></p><p>注意字长、异常(溢出,使用双符号位法检测)</p></li><li><p><strong>2.5 定点运算器的组成</strong></p><p>超前运算基本概念</p></li><li><p><strong>2.6 浮点运算方法和浮点运算器</strong></p><p>简答题:浮点运算基本步骤(<u>0操作数检查、比较阶码大小并完成对阶、尾数求和运算、结果规格化、舍入处理、溢出处理</u>)</p><p><u>计算题:加减法</u>。</p></li></ul><h3 id="第三章-多层次的存储器"><a href="#第三章-多层次的存储器" class="headerlink" title="第三章 多层次的存储器"></a>第三章 多层次的存储器</h3><ul><li><p><strong>3.1 存储器概述</strong></p><p>存储器的分类、<u>技术指标</u></p></li><li><p><strong>3.2 SRAM存储器</strong></p></li><li><p><strong>3.3 DRAM存储器</strong></p><p><u><em>存储器容量的扩充</em></u>(画出完整电路)</p></li><li><p><strong>3.4 只读存储器和闪速存储器</strong></p></li><li><p><strong>3.5 并行存储器</strong></p><p>了解特点</p></li><li><p><strong>3.6 cache存储器</strong></p><p>参数(计算公式):命中率、平均访问时间、访问效率</p><p>设计:主存与cache地址的映射方式(全相联、直接映射、组相联)、*<u>内存格式设计</u>*</p></li></ul><h3 id="第四章-指令系统"><a href="#第四章-指令系统" class="headerlink" title="第四章 指令系统"></a>第四章 指令系统</h3><ul><li><p><strong>4.1 指令系统的发展与性能要求</strong></p></li><li><p><strong>4.2 指令格式</strong></p><p>P121例1、例2、例3</p></li></ul><h3 id="第五章-中央处理器"><a href="#第五章-中央处理器" class="headerlink" title="第五章 中央处理器"></a>第五章 中央处理器</h3><ul><li><p><strong>5.1 CPU的功能和组成</strong></p></li><li><p><strong>5.2 指令周期</strong></p><p>指令周期、总线周期、时钟周期的对应关系</p></li><li><p><u><strong>5.4 微程序控制器</strong></u></p><p>指令方框图➡微程序</p></li><li><p><strong>5.6 流水CPU</strong></p><p>课后习题13</p></li></ul><h3 id="总线系统"><a href="#总线系统" class="headerlink" title="总线系统"></a>总线系统</h3><p>略略略</p>]]></content>
<summary type="html"><h3 id="第一章-计算机系统概论"><a href="#第一章-计算机系统概论" class="headerlink" title="第一章 计算机系统概论"></a>第一章 计算机系统概论</h3><ul>
<li><p><strong>1.1 了解计算机的分类</strong></p>
</li>
<li><p><strong>1.2 计算机的性能指标</strong></p>
<p>概念,计算题(CPI,MIPS……)P5例1、例2</p>
</li>
<li><p><strong>1.5 计算机系统的层次结构</strong></p>
<p>简答题 P14图1.8</p></summary>
<category term="复习(预习)资料" scheme="https://blog.darkcrane.com/categories/%E5%A4%8D%E4%B9%A0%EF%BC%88%E9%A2%84%E4%B9%A0%EF%BC%89%E8%B5%84%E6%96%99/"/>
<category term="期末复习" scheme="https://blog.darkcrane.com/tags/%E6%9C%9F%E6%9C%AB%E5%A4%8D%E4%B9%A0/"/>
<category term="组原" scheme="https://blog.darkcrane.com/tags/%E7%BB%84%E5%8E%9F/"/>
<category term="计算机组成原理" scheme="https://blog.darkcrane.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86/"/>
</entry>
<entry>
<title>软件工程复习(预习)1</title>
<link href="https://blog.darkcrane.com/posts/71689c93/"/>
<id>https://blog.darkcrane.com/posts/71689c93/</id>
<published>2019-04-06T14:22:05.000Z</published>
<updated>2019-04-06T14:22:05.000Z</updated>
<content type="html"><![CDATA[<p>Q1. 使用软件时提出增加新功能就必须进行( )维护。(单选,1分)</p><p>改正性</p><p>适应性</p><p><strong>完善性</strong></p><p>预防性</p> <a id="more"></a><p>Q2. 类的行为应该基于( )进行测试。(单选,1分)</p><p>数据流图</p><p>用例图</p><p>对象图</p><p><strong>状态图</strong></p><p>Q3. 在软件工程中,软件测试的目的是( )。(单选,1分)</p><p>试验性运行软件</p><p><strong>发现软件的错误</strong></p><p>证明软件是正确的</p><p>找出软件中的全部错误</p><p>Q4. 程序的三种基本控制结构的共同特点是( )。(单选,1分)</p><p>不能嵌套使用</p><p>只能用来写简单程序</p><p>已经用硬件实现</p><p><strong>只有一个入口和一个出口</strong></p><p>Q5. 维护中,因误删除一个标识符而引起的错误是( )副作用。(单选,1分)</p><p>文档</p><p>数据</p><p><strong>编码</strong></p><p>设计</p><p>Q6. 下列描述模型中都属于功能模型的是( )。(单选,1分)</p><p><strong>用例图、数据流图</strong></p><p>实体联系图、数据流图</p><p>状态图、顺序图</p><p>对象图、类图</p><p>Q7. 下列不可用于需求分析的图形工具是 ( )。(单选,1分)</p><p>层次方框图</p><p>Warnier图</p><p><strong>行为图</strong></p><p>判定表</p><p>Q8. 下列不属于软件项目人员的组织形式的是( )。(单选,1分)</p><p>主程序员制小组</p><p>民主制小组</p><p>层次式小组</p><p><strong>协作式小组</strong></p><p>Q9. 下列不是可行性研究的成果的是( )。(单选,1分)</p><p>系统流程图</p><p>数据流图</p><p><strong>Gant图</strong></p><p>数据字典</p><p>Q10. 为提高软件测试的效率,应该( )。(单选,1分)</p><p>随机地选取测试数据</p><p>取一切可能的输入数据作为测试数据</p><p><strong>在完成编码后制定软件测试计划</strong></p><p>选择发现错误可能性大的数据作为测试数据</p><p>Q11. 系统设计阶段的主要成果是( )。 (单选,1分)</p><p>用户的决策方针 </p><p>用户的分析方案</p><p><strong>系统设计说明书</strong> </p><p>系统总体设计方案</p><p>Q12. 一般而言,在软件生存周期中,时间最长的阶段是( )(单选,1分)</p><p>需求分析</p><p>编码</p><p>软件概要设计</p><p><strong>软件维护</strong></p><p>Q13. 软件工程的三要素是指( )。(单选,1分)</p><p><strong>方法、工具和过程</strong></p><p>开发、确认和演进</p><p>分析、设计和测试</p><p>程序、数据和文档</p><p>Q14. 以下哪一项属于白盒技术设计测试用例的方法?( )(单选,1分)</p><p><strong>分支覆盖</strong></p><p>边界值分析</p><p>等价类划分</p><p>因果图</p><p>Q15. 下列属于黑盒测试的是 ( )。</p><p>①等价类划分法 ②边界值分析法 ③ 错误推测法 </p><p>④逻辑覆盖法 ⑤控制结构测试(单选,1分)</p><p>①②④</p><p>①②④⑤</p><p><strong>①②③</strong></p><p>①③④⑤</p><p>Q16. 构件组装模型的基础是( )。(单选,1分)</p><p><strong>面向对象技术</strong></p><p>工序法</p><p>面向过程</p><p>笛卡尔坐标</p><p>Q17. 软件结构使用的图形工具,一般采用的图形工具是( )。(单选,1分)</p><p>数据流程图(DFD)</p><p><strong>系统结构图(SC )</strong></p><p>问题分析图(PAD)</p><p>实体联系图(ERD)</p><p>Q18. 下列不属于项目进度安排主要方法的是( )(单选,1分)</p><p>工程网络图</p><p>Gantt图</p><p><strong>进度结构图</strong></p><p>任务资源表</p><p>Q19. 任何项目都必须精心做好项目管理工作,最常用的计划管理工具是( )。 (单选,1分)</p><p>数据流程图 </p><p>程序结构图 </p><p>因果图</p><p><strong>PERT 图</strong></p><p>Q20. 程序的三种基本控制结构是( )。(单选,1分)</p><p>过程、子程序和分程序</p><p><strong>顺序、选择和重复</strong></p><p>递归、堆栈和队列</p><p>调用、返回和转移</p><p>Q21. ER模型中的基本成分不包含( )。(单选,1分)</p><p>实体</p><p>联系</p><p>属性</p><p><strong>处理</strong></p><p>Q22. 结构化软件设计是( )。(单选,1分)</p><p>面向数据结构的</p><p><strong>面向数据流的</strong></p><p>面向数据库的</p><p>面向对象设计的</p><p>Q23. 以下哪一项不是软件危机的表现( )。(单选,1分)</p><p>开发的软件可维护性差</p><p>经费预算经常被突破</p><p><strong>软件极易被盗版</strong></p><p>开发的软件不能满足用户需求</p><p>Q24. 为了提高测试的效率,应该( )。(单选,1分)</p><p>随机地选取测试数据</p><p>取一切可能的输入数据作为测试数据</p><p>在完成编码以后制定软件的测试计划</p><p><strong>选择发现错误可能性大的数据作为测试数据</strong></p><p>Q25. 程序的三种基本控制结构的共同特点是( )。(单选,1分)</p><p>不能嵌套使用</p><p>只能用来写简单程序</p><p>已经用硬件实现</p><p><strong>只有一个入口和一个出口</strong></p><p>Q26. 程序流程图中的箭头代表( )。(单选,1分)</p><p>数据流</p><p><strong>控制流</strong></p><p>调用关系</p><p>依赖关系</p><p>Q27. 在面向对象测试用例设计时,不采用的方法是( )。(单选,1分)</p><p>利用单类的操作的随机测试</p><p>利用多类间关联消息的随机测试</p><p><strong>利用多类间关联消息的划分测试</strong></p><p>利用单类的状态的状态测试</p><p>Q28. 软件测试时,正确的测试次序是( )。(单选,1分)</p><p><strong>单元测试,集成测试,确认测试</strong></p><p>单元测试,确认测试,集成测试</p><p>集成测试,单元测试,确认测试</p><p>确认测试,单元测试,集成测试</p><p>Q29. 因计算机硬件和软件环境的变化而作出的修改软件的过程称为( )。(单选,1分)</p><p>改正性维护</p><p><strong>适应性维护</strong></p><p>完善性维护</p><p>预防性维护</p><p>Q30. 以下哪个软件生存周期模型是一种风险驱动的模型(单选,1分)</p><p>瀑布模型</p><p>增量模型</p><p><strong>螺旋模型</strong></p><p>喷泉模型</p><p>Q31. 下列几种类型中,耦合性最弱的是( )。(单选,1分)</p><p>内容型</p><p>控制型</p><p>公共型</p><p><strong>数据型</strong></p><p>Q32. 一个只有顺序结构的程序,其圈复杂度是( )。(单选,1分)</p><p>0</p><p><strong>1</strong></p><p>3</p><p>不确定的</p><p>Q33. 对象是OO方法的核心,对象的类型有多种,通常把例如飞行、事故、演出、开会等等,称之为( )(单选,1分)</p><p>有形实体 </p><p>作用 </p><p><strong>事件</strong></p><p>性能说明 </p><p>Q34. 下列各方法中( )不是软件测试方法。(单选,1分)</p><p>白盒法</p><p>黑盒法</p><p>动态测试</p><p><strong>盒图法</strong></p><p>Q35. 软件工程管理是对软件项目的开发管理,即对整个软件的( )活动的管理。(单选,1分)</p><p>软件项目</p><p>生存期</p><p>软件开发计划</p><p><strong>软件开发</strong></p><p>Q36. 若有一个计算类型的程序,它的输入量只有一个X,其范围是[-6.0,6.0],现从输入的角度考虑一组测试用例:-6.001,-6.0,6.0,6.001。设计这组测试用例的方法是( )(单选,1分)</p><p>条件覆盖法</p><p>等价分类法</p><p><strong>边界值分析法</strong></p><p>错误推测法</p><p>Q37. 下列不属于OOA的模型的是( )。(单选,1分)</p><p>对象模型</p><p>功能模型</p><p><strong>消息模型</strong></p><p>动态模型</p><p>Q38. HIPO图是软件工程中的一种描述工具,采用HIPO图进行描述的阶段是( )。(单选,1分)</p><p>可行性分析</p><p>需求分析</p><p><strong>概要设计</strong></p><p>详细设计</p><p>Q39. 软件复杂性度量的参数包括( )(单选,1分)</p><p>程序执行效率</p><p><strong>程序规模</strong></p><p>完整性</p><p>容错性</p><p>Q40. 检查软件产品是否符合需求定义的过程称为( )。(单选,1分)</p><p><strong>确认测试</strong></p><p>集成测试</p><p>单元测试</p><p>系统测试</p><p>Q41. 系统流程图是用来 ( )。(单选,1分)</p><p>描绘程序结构的</p><p>描绘系统的逻辑模型</p><p>表示信息层次结构的图形工具</p><p><strong>描绘物理系统的</strong></p><p>Q42. 面向对象分析的首要工作是建立( )。(单选,1分)</p><p>系统的功能模型</p><p>系统的动态模型</p><p>软件对象类定义</p><p><strong>系统的对象模型</strong></p><p>Q43. 详细设计与概要设计衔接的图形工具是( )。(单选,1分)</p><p>数据流程图(DFD)</p><p><strong>系统结构图</strong>(SC )</p><p>问题分析图(PAD)</p><p>控制流程图(CFG)</p><p>Q44. 用户开发应用系统的主要手段是( )。 (单选,1分)</p><p><strong>生命周期法</strong></p><p>原型法</p><p>第四代语言</p><p>面向对象方法</p><p>Q45. 为了提高软件产品的质量和可靠性,对某些无法避开的差错,使其影响减至最小程度所采用的技术是( )。(单选,1分)</p><p><strong>容错技术</strong></p><p>避开错误技术</p><p>检测技术</p><p>排错技术</p><p>Q46. 结构化技术不常采用的过程模型是( )。(单选,1分)</p><p>瀑布模型</p><p>增量模型</p><p>螺旋模型</p><p><strong>喷泉模型</strong></p><p>Q47. 需求分析的任务不包括( )。(单选,1分)</p><p>问题分析</p><p><strong>系统设计</strong></p><p>需求描述</p><p>需求评审。</p><p>Q48. 可行性研究要进行一次( )需求分析。 (单选,1分)</p><p>详细的 </p><p>全面的</p><p><strong>简化的、压缩的</strong> </p><p>彻底的</p><p>Q49. 提高软件质量和可靠的技术大致可分为两大类:其中一类就是避开错误技术,但避开错误技术无法做到完美无缺和绝无错误,这就需要( )。(单选,1分)</p><p>消除错误</p><p>检测错误</p><p>避开错误</p><p><strong>容错</strong></p><p>Q50. 从下列有关系统结构图的叙述中选出正确的叙述。( )(单选,1分)</p><p>系统结构图中反映的是程序中数据流的情况。</p><p>系统结构图是精确表达程序结构的图形表示法。因此,有时也可将系统结构当作程序流程图使用。</p><p>一个模块的多个下属模块在系统结构图中所处的左右位置是无关紧要的。</p><p><strong>在系统结构图中,上级模块与其下属模块之间的调用关系用有向线段表示。这时,使用斜的线段和水平、垂直的线段具有相同的含义。</strong></p>]]></content>
<summary type="html"><p>Q1. 使用软件时提出增加新功能就必须进行( )维护。(单选,1分)</p>
<p>改正性</p>
<p>适应性</p>
<p><strong>完善性</strong></p>
<p>预防性</p></summary>
<category term="复习(预习)资料" scheme="https://blog.darkcrane.com/categories/%E5%A4%8D%E4%B9%A0%EF%BC%88%E9%A2%84%E4%B9%A0%EF%BC%89%E8%B5%84%E6%96%99/"/>
<category term="复习资料" scheme="https://blog.darkcrane.com/tags/%E5%A4%8D%E4%B9%A0%E8%B5%84%E6%96%99/"/>
<category term="题库" scheme="https://blog.darkcrane.com/tags/%E9%A2%98%E5%BA%93/"/>
<category term="软件工程" scheme="https://blog.darkcrane.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
</entry>
<entry>
<title>软件工程复习(预习)2</title>
<link href="https://blog.darkcrane.com/posts/73a2146f/"/>
<id>https://blog.darkcrane.com/posts/73a2146f/</id>
<published>2019-04-06T14:22:05.000Z</published>
<updated>2019-04-06T14:22:05.000Z</updated>
<content type="html"><![CDATA[<p>Q1. 软件设计中,划分模块的一个准则是( )。(单选,1分)<br>低内聚低耦合<br>低内聚高耦合<br><strong>高内聚低耦合</strong><br>高内聚高耦合</p><a id="more"></a><p>Q2. 一个只有顺序结构的程序,其圈复杂度是( )。(单选,1分)<br>0<br><strong>1</strong><br>3<br>不确定的</p><p>Q3. 软件工程的三要素是指( )。(单选,1分)<br><strong>方法、工具和过程</strong><br>开发、确认和演进<br>分析、设计和测试<br>程序、数据和文档</p><p>Q4. 在整个软件维护阶段所花费的全部工作中,所占比例最大的是( )。(单选,1分)<br>校正性维护<br>适应性维护<br><strong>完善性维护</strong><br>预防性维护</p><p>Q5. 下列不属于软件项目人员的组织形式的是( )。(单选,1分)<br>主程序员制小组<br>民主制小组<br>层次式小组<br><strong>协作式小组</strong></p><p>Q6. 瀑布模型的存在问题是( )(单选,1分)<br>用户容易参与开发<br><strong>缺乏灵活性</strong><br>用户与开发者易沟通<br>适用可变需求</p><p>Q7. 结构化设计方法在软件开发中用于( )。(单选,1分)<br>概要设计<br>详细设计<br><strong>程序设计</strong><br>测试用例设计</p><p>Q8. 一般子系统的划分是在系统( )阶段,根据对系统的功能、数据分析的结果提出的。(单选,1分)<br><strong>需求分析</strong><br>逻辑阶段<br>总体设计<br>详细设计</p><p>Q9. 下列模型属于成本估算方法的有( )(单选,1分)<br><strong>COCOMO模型</strong><br>McCall模型<br>McCabe度量法<br>时间估算法</p><p>Q10. 下列不属于软件过程能力成熟度模型CMM分级的是( )。(单选,1分)<br>初始级、可重复级<br>可定义级<br><strong>可配置级</strong><br>可管理级、可优化级</p><p>Q11. 软件结构使用的图形工具,一般采用的图形工具是( )。(单选,1分)<br>数据流程图(DFD)<br><strong>系统结构图(SC )</strong><br>问题分析图(PAD)<br>实体联系图(ERD)</p><p>Q12. 逆向工程通常用在软件生命周期的( )阶段,它是从源代码或目标代码中提取设计信息。(单选,1分)<br>需求分析<br>软件设计<br>软件测试<br><strong>软件维护</strong></p><p>Q13. 软件开发环境按解决的问题分类包含( )(单选,1分)<br><strong>程序设计环境</strong><br>工具箱环境<br>基于方法的环境<br>以语言为中心的环境</p><p>Q14. 成本效益分析是( )的主要内容。(单选,1分)<br><strong>经济可行性分析</strong><br>项目可行性分析<br>有形效益分析<br>无形效益分析</p><p>Q15. 用于描述对象模型的工具是( )(单选,1分)<br>数据流图<br>结构图<br>状态图<br><strong>对象图</strong></p><p>Q16. 开发软件所需高成本和产品的低质量之间有着尖锐的矛盾,这种现象称做( )。(单选,1分)<br>软件工程<br>软件周期<br><strong>软件危机</strong><br>软件产生</p><p>Q17. 使用白盒测试方法时,确定测试数据应根据( )和指定的覆盖标准。(单选,1分)<br><strong>程序的内部逻辑</strong><br>程序的复杂结构<br>使用说明书<br>程序的功能</p><p>Q18. 在软件质量度量领域,Boehm质量模型度量软件的三个方面,下列不属于Boehm质量模型的是( )。(单选,1分)<br>产品修正(Product REVITIONS)<br>产品运行(Product OPERATIONS)<br><strong>产品维护(Product MAINTATION)</strong><br>产品转移(Product TRANSITION)</p><p>Q19. 下列不是可行性研究的成果的是( )。(单选,1分)<br>系统流程图<br>数据流图<br><strong>Gant图</strong><br>数据字典</p><p>Q20. 只有单重继承的类层次结构是( )层次结构。(单选,1分)<br>网状型<br>星型<br><strong>树型</strong><br>环型</p><p>Q21. 在结构化分析方法中用状态―迁移图表达系统或对象的行为。在状态―迁移图中,由一个状态和一个事件所决定的下一状态可能会有( )个。(单选,1分)<br>1<br>2<br><strong>多个</strong><br>不确定</p><p>Q22. 从下列有关系统结构图的叙述中选出正确的叙述。( )(单选,1分)<br>系统结构图中反映的是程序中数据流的情况。<br>系统结构图是精确表达程序结构的图形表示法。因此,有时也可将系统结构当作程序流程图使用。<br>一个模块的多个下属模块在系统结构图中所处的左右位置是无关紧要的。<br><strong>在系统结构图中,上级模块与其下属模块之间的调用关系用有向线段表示。这时,使用斜的线段和水平、垂直的线段具有相同的含义。</strong></p><p>Q23. 用户开发应用系统的主要手段是( )。 (单选,1分)<br><strong>生命周期法</strong><br>原型法<br>第四代语言<br>面向对象方法</p><p>Q24. 下列( )属于不良的编程习惯。(单选,1分)<br>尽量不使用GOTO语句<br><strong>从来不使用注释</strong><br>每行只写一条语句<br>变量命名尽量直观</p><p>Q25. 软件质量必须在( )加以保证。(单选,1分)<br>实现期间<br>开发之前<br><strong>整个开发期间</strong><br>开发之后</p><p>Q26. 软件文档是信息系统( )的重要依据。 (单选,1分)<br>可理解性<br><strong>可维护性</strong><br>可扩展性<br>可移植性</p><p>Q27. 一般而言,在软件生存周期中,时间最长的阶段是( )(单选,1分)<br>需求分析<br>编码<br>软件概要设计<br><strong>软件维护</strong></p><p>Q28. 为了提高软件产品的质量和可靠性,对某些无法避开的差错,使其影响减至最小程度所采用的技术是( )(单选,1分)<br><strong>容错技术</strong><br>避开错误技术<br>检测技术<br>排错技术</p><p>Q29. 为了满足用户在使用过程中提出的要求,增加或调整系统某些功能而修改软件的过程是( )。(单选,1分)<br>校正性维护<br><strong>完善性维护</strong><br>适应性维护<br>预防性维护</p><p>Q30. 实践表明,确定发生错误的位置和内在原因所需的工作量几乎占整个调试工作量的( )。(单选,1分)<br>30%<br>50%<br>70%<br><strong>90%</strong></p><p>Q31. 以下不属于逻辑覆盖的是( )。(单选,1分)<br>语句覆盖<br>判定覆盖<br>条件覆盖<br><strong>基本路径测试</strong></p><p>Q32. 为了提高软件的可移植性,应注意提高软件的( )。(单选,1分)<br>使用的方便性<br>简洁性<br>可靠性<br><strong>设备独立性</strong></p><p>Q33. 白盒测试方法重视( )的度量。 (单选,1分)<br><strong>测试覆盖率</strong><br>测试数据多少<br>测试费用<br>测试周期 </p><p>Q34. 下列不属于可行性研究任务的是( )。(单选,1分)<br>技术可行性,经济可行性<br>操作可行性,法律与社会可行性<br>经济可行性,人性化可行性<br><strong>国籍可行性,年龄可行性</strong></p><p>Q35. 软件调试技术包括( )(单选,1分)<br><strong>回溯法调试</strong><br>边界值分析调试<br>循环覆盖调试<br>集成测试调试</p><p>Q36. 程序的三种基本控制结构的共同特点是( )。(单选,1分)<br>不能嵌套使用<br>只能用来写简单程序<br>已经用硬件实现<br><strong>只有一个入口和一个出口</strong></p><p>Q37. 在需求分析之前有必要进行( )工作。(单选,1分)<br>程序设计<br><strong>可行性分析</strong><br>E-R分析<br>3NF分析</p><p>Q38. 程序的三种基本控制结构是( )。(单选,1分)<br>过程、子程序和分程序<br><strong>顺序、选择和重复</strong><br>递归、堆栈和队列<br>调用、返回和转移</p><p>Q39. 下列不属于OOA的模型的是( )。(单选,1分)<br>对象模型<br>功能模型<br><strong>消息模型</strong><br>动态模型</p><p>Q40. 下列属于白盒测试的是( )。<br>①等价类划分法 ②边界值分析法 ③ 错误推测法<br>④逻辑覆盖法 ⑤控制结构测试(单选,1分)<br>①②④⑤<br>②③④⑤<br>①②③⑤<br><strong>④⑤</strong></p><p>Q41. 与计算机科学的理论研究不同,软件工程是一门( )。 (单选,1分)<br>理论性学科<br>原理性学科<br><strong>工程性学科</strong><br>心理性学科</p><p>Q42. 自底向上进行集成测试的优点是不必额外设计( )程序。(单选,1分)<br>子<br>被调用<br><strong>桩模块(Stub)</strong><br>驱动模块(Driver)</p><p>Q43. 白盒测试是结构测试,被测对象基本上是源程序,以程序的( )为基础设计测试用例。(单选,1分)<br>应用范围<br>功能<br><strong>内部逻辑</strong><br>输入数据</p><p>Q44. 以下哪一项是软件开发环境中的主要组成部分( )(单选,1分)<br>软件模型<br><strong>软件工具</strong><br>软件工程<br>硬件环境</p><p>Q45. 以下哪一项不是软件危机的表现( )。(单选,1分)<br>开发的软件可维护性差<br>经费预算经常被突破<br><strong>软件极易被盗版</strong><br>开发的软件不能满足用户需求</p><p>Q46. 下列不属于可行性研究任务的是( )。(单选,1分)<br>技术可行性,经济可行性<br>操作可行性,法律与社会可行性<br>经济可行性,人性化可行性<br><strong>国籍可行性,年龄可行性</strong></p><p>Q47. 以下软件生存周期的活动中,要进行软件结构设计的是( )(单选,1分)<br>测试用例设计<br><strong>概要设计</strong><br>程序设计<br>详细设计</p><p>Q48. 软件复杂性度量的参数包括( )(单选,1分)<br>程序执行效率<br><strong>程序规模</strong><br>完整性<br>容错性</p><p>Q49. 以下哪个软件生存周期模型是一种风险驱动的模型(单选,1分)<br>瀑布模型<br>增量模型<br><strong>螺旋模型</strong><br>喷泉模型</p><p>Q50. 软件工程方法的提出起源于软件危机,其主要思想是按( )来组织和规范软件开发过程。(单选,1分)<br>质量保证<br>生产危机<br><strong>工程化的原则和方法</strong><br>开发效率</p>]]></content>
<summary type="html"><p>Q1. 软件设计中,划分模块的一个准则是( )。(单选,1分)<br>低内聚低耦合<br>低内聚高耦合<br><strong>高内聚低耦合</strong><br>高内聚高耦合</p></summary>
<category term="复习(预习)资料" scheme="https://blog.darkcrane.com/categories/%E5%A4%8D%E4%B9%A0%EF%BC%88%E9%A2%84%E4%B9%A0%EF%BC%89%E8%B5%84%E6%96%99/"/>
<category term="复习资料" scheme="https://blog.darkcrane.com/tags/%E5%A4%8D%E4%B9%A0%E8%B5%84%E6%96%99/"/>
<category term="题库" scheme="https://blog.darkcrane.com/tags/%E9%A2%98%E5%BA%93/"/>
<category term="软件工程" scheme="https://blog.darkcrane.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
</entry>
<entry>
<title>软件工程复习(预习)3</title>
<link href="https://blog.darkcrane.com/posts/4a524f9/"/>
<id>https://blog.darkcrane.com/posts/4a524f9/</id>
<published>2019-04-06T14:22:05.000Z</published>
<updated>2019-04-06T14:22:05.000Z</updated>
<content type="html"><![CDATA[<p>Q1. 结构化软件设计是( )。(单选,1分)<br>面向数据结构的<br><strong>面向数据流的</strong><br>面向数据库的<br>面向对象设计的</p><a id="more"></a><p>Q2. 黑盒测试在设计测试用例时,主要需要研究( )。(单选,1分)<br><strong>需求规格说明与概要设计说明</strong><br>详细设计说明<br>项目开发计划<br>概要设计说明与详细设计说明</p><p>Q3. 一个模块的( )是指能直接控制该模块的模块数。(单选,1分)<br>扇出数<br><strong>扇入数</strong><br>宽度<br>深度</p><p>Q4. 软件需求是度量软件质量的基础,不符合需求的软件就不具备( )。(单选,1分)<br>A.软件的特点<br><strong>B.质量</strong><br>C.软件产品<br>D.功能</p><p>Q5. 一个C语言编写的冒泡排序算法程序,其环路复杂度是( )。(单选,1分)<br>0<br>1<br><strong>3</strong><br>不确定的</p><p>Q6. 下面不属于用例图作用的是( )。(单选,1分)<br>展现软件的功能<br>展现软件使用者和软件功能的关系<br><strong>展现软件的特性</strong><br>展现软件功能相互之间的关系</p><p>Q7. 程序流程图中的箭头代表( )。(单选,1分)<br>数据流<br><strong>控制流</strong><br>调用关系<br>依赖关系</p><p>Q8. 从下列有关系统结构图的叙述中选出正确的叙述。( )(单选,1分)<br>系统结构图中反映的是程序中数据流的情况。<br>系统结构图是精确表达程序结构的图形表示法。因此,有时也可将系统结构当作程序流程图使用。<br>一个模块的多个下属模块在系统结构图中所处的左右位置是无关紧要的。<br><strong>在系统结构图中,上级模块与其下属模块之间的调用关系用有向线段表示。这时,使用斜的线段和水平、垂直的线段具有相同的含义。</strong></p><p>Q9. 软件工程管理是对软件项目的开发管理,即对整个软件的( )活动的管理。(单选,1分)<br>软件项目<br>生存期<br>软件开发计划<br><strong>软件开发</strong></p><p>Q10. 在白盒技术测试用例的设计中,以下覆盖标准中发现错误能力最强的是( )。(单选,1分)<br>语句覆盖<br>判定覆盖<br>判定/条件覆盖<br><strong>条件组合覆盖</strong></p><p>Q11. 软件工程的三要素是指( )。(单选,1分)<br><strong>方法、工具和过程</strong><br>开发、确认和演进<br>分析、设计和测试<br>程序、数据和文档</p><p>Q12. 使用白盒测试方法时,确定测试数据应根据( )和指定的覆盖标准。(单选,1分)<br><strong>程序的内部逻辑</strong><br>程序的复杂结构<br>使用说明书<br>程序的功能</p><p>Q13. 结构化技术不常采用的过程模型是( )。(单选,1分)<br>瀑布模型<br>增量模型<br><strong>喷泉模型</strong><br>螺旋模型</p><p>Q14. 自底向上进行集成测试的优点是不必额外设计( )程序。(单选,1分)<br>子<br>被调用<br><strong>桩模块(Stub)</strong><br>驱动模块(Driver)</p><p>Q15. 下列关于编码风格说法错误的是( )。(单选,1分)<br>强调编码风格有助于提高程序的可读性。<br>团队采用一致的编码风格标准有助于提高软件的维护效率。<br>强调编码风格会降低程序的灵活性。<br><strong>有经验的程序员编码风格就是好的编码风格。</strong></p><p>Q16. 软件结构使用的图形工具,一般采用的图形工具是( )。(单选,1分)<br>数据流程图(DFD)<br><strong>系统结构图(SC )</strong><br>问题分析图(PAD)<br>实体联系图(ERD)</p><p>Q17. 下面关于文档的叙述( )。(单选,1分)<br><strong>A.文档是仅用于说明使用软件的操作命令,不包括软件设计和实现细节</strong><br>B.文档是软件产品的一部分,没有文档的软件就不成为软件<br>C.高质量文档对于转让、变更、修改、扩充和使用有重要的意义<br>D.软件文档的编制在软件开发工作中占有突出的地位和相当大的工作量</p><p>Q18. 软件开发过程中,抽取和整理用户需求并建立问题域精确模型的过程叫( )。(单选,1分)<br>生存期<br>面向对象设计<br>面向对象程序设计<br><strong>面向对象分析</strong></p><p>Q19. 下列不属于可行性研究任务的是( )。(单选,1分)<br>技术可行性,经济可行性<br>操作可行性,法律与社会可行性<br>经济可行性,人性化可行性<br><strong>国籍可行性,年龄可行性</strong></p><p>Q20. 程序设计语言的工程特性之一为( )。(单选,1分)<br><strong>软件的可重用性</strong><br>数据结构的描述性<br>抽象类型的描述性<br>数据库的易操作性</p><p>Q21. 某模块的功能是打印录取通知书或不录取通知书,调用模块可通过向此模块传递布尔标志信息决定本次调用哪种通知书的打印,这种模块之间的耦合称为( )。(单选,1分)<br>数据耦合<br>混合耦合<br>公共耦合<br><strong>控制耦合</strong></p><p>Q22. 结构化技术不常采用的过程模型是( )。(单选,1分)<br>瀑布模型<br>增量模型<br>螺旋模型<br><strong>喷泉模型</strong></p><p>Q23. 变更控制是一项最重要的软件配置任务,其中“检出”和( )处理实现了两个重要的变更控制要素,即存取控制和同步控制。(单选,1分)<br><strong>登入</strong><br>管理<br>填写变更要求<br>审查</p><p>Q24. 在软件测试中,首先对每个模块分别进行单元测试,然后再把所有的模块按设计要求装在一起测试,称为( )(单选,1分)<br>确认测试<br>系统测试<br>渐增式测试<br><strong>非渐增式测试</strong></p><p>Q25. 下列不是可行性研究的成果的是( )。(单选,1分)<br>系统流程图<br>数据流图<br><strong>Gant图</strong><br>数据字典</p><p>Q26. 程序的三种基本控制结构是( )。(单选,1分)<br>过程、子程序和分程序<br><strong>顺序、选择和重复</strong><br>递归、堆栈和队列<br>调用、返回和转移</p><p>Q27. 面向对象程序设计中,基于父类创建的子类具有父类的特性(属性和方法),这一特点称为类的( )。(单选,1分)<br>多态性<br>封装性<br><strong>继承性</strong><br>重用性</p><p>Q28. 不适于作为数据流图处理(加工)框名称的是( )。(单选,1分)<br>人工校核工资数据<br><strong>工资支票数据</strong><br>打印工资支票<br>计算职工工资</p><p>Q29. 瀑布模型的存在问题是( )(单选,1分)<br>用户容易参与开发<br><strong>缺乏灵活性</strong><br>用户与开发者易沟通<br>适用可变需求</p><p>Q30. 快速原型模型的主要特点之一是( )。(单选,1分)<br>开发完毕才见到产品<br>及早提供全部完整的软件产品<br>开发完毕后才见到工作软件<br><strong>及早提供工作软件</strong></p><p>Q31. 关于软件概念与软件质量论点错误的是( )。(单选,1分)<br>软件简单地说由程序、文档组成<br><strong>软件设计质量评价的偶然聚合指标要强而功能聚合要弱</strong><br>软件设计质量评价的数据耦合指标要强而内容耦合要弱<br>软件质量由实施技术与管理技术共同提高</p><p>Q32. 风险的三个属性是( ) 。 (单选,1分)<br>风险发生的时间、地点、负责人<br>风险事件、时间、影响<br><strong>风险事件、概率、影响</strong><br>风险数量、风险影响</p><p>Q33. 在需求分析之前有必要进行( )工作。(单选,1分)<br>程序设计<br><strong>可行性分析</strong><br>E-R分析<br>3NF分析</p><p>Q34. 类的行为应该基于( )进行测试。(单选,1分)<br>数据流图<br>用例图<br>对象图<br><strong>状态图</strong></p><p>Q35. 面向对象分析的首要工作是建立( )。(单选,1分)<br>系统的功能模型<br>系统的动态模型<br>软件对象类定义<br><strong>系统的对象模型</strong></p><p>Q36. 下列不属于可行性研究任务的是( )。(单选,1分)<br>技术可行性,经济可行性<br>操作可行性,法律与社会可行性<br>经济可行性,人性化可行性<br><strong>国籍可行性,年龄可行性</strong></p><p>Q37. 一般而言,在软件生存周期中,时间最长的阶段是( )(单选,1分)<br>需求分析<br>编码<br>软件概要设计<br><strong>软件维护</strong></p><p>Q38. 程序的三种基本控制结构的共同特点是( )。(单选,1分)<br>不能嵌套使用<br>只能用来写简单程序<br>已经用硬件实现<br><strong>只有一个入口和一个出口</strong></p><p>Q39. 可维护性的特性中相互促进的是( )。(单选,1分)<br><strong>可理解性和可测试性</strong><br>效率和可移植性<br>效率和可修改性 <br>效率和结构好</p><p>Q40. 软件重用的单位是( )。(单选,1分)<br><strong>软件模块</strong><br>性能<br>过程<br>功能</p><p>Q41. 模块内聚度越高,说明模块内各成分彼此结合的程度越( )。(单选,1分)<br>松散<br><strong>紧密</strong><br>无法判断<br>相等</p><p>Q42. 过程设计语言(PDL),又称为( )(单选,1分)<br><strong>伪码</strong><br>中级程序语言<br>高级程序设计语言<br>低级程序设计语言</p><p>Q43. 下列模型属于成本估算方法的有( )(单选,1分)<br><strong>COCOMO模型</strong><br>McCall模型<br>McCabe度量法<br>时间估算法</p><p>Q44. 使用软件时提出增加新功能就必须进行( )维护。(单选,1分)<br>改正性<br>适应性<br><strong>完善性</strong><br>预防性</p><p>Q45. 原型化方法是用户和设计者之间执行的一种交互构成,适用于( )系统。(单选,1分)<br>需求不确定性高的<br>需求确定的<br>管理信息<br><strong>实时</strong></p><p>Q46. 因计算机硬件和软件环境的变化而作出的修改软件的过程称为( )。(单选,1分)<br>改正性维护<br><strong>适应性维护</strong><br>完善性维护<br>预防性维护</p><p>Q47. 结构化设计方法在软件开发中用于( )。(单选,1分)<br>概要设计<br>详细设计<br><strong>程序设计</strong><br>测试用例设计</p><p>Q48. 软件开发成本估算方法有( )。<br>① 代码行技术 ② 任务分解技术 ③ 专家估算法<br>④ 类推估算法 ⑤ 参数方程法 ⑥ 标准值法(单选,1分)<br>①③④⑤⑥<br>①②④⑤⑥<br>①②③④⑤<br><strong>①②③④⑤⑥</strong></p><p>Q49. 关于软件概念与软件质量论点错误的是( )(单选,1分)<br>软件简单地说由程序、文档组成<br>软件设计质量评价的数据耦合指标要强而内容耦合要弱<br>软件质量由实施技术与管理技术共同提高<br><strong>软件设计质量评价的偶然聚合指标要强而功能聚合要弱</strong></p><p>Q50. 以下软件生存周期的活动中,要进行软件结构设计的是( )(单选,1分)<br>测试用例设计<br><strong>概要设计</strong><br>程序设计<br>详细设计</p>]]></content>
<summary type="html"><p>Q1. 结构化软件设计是( )。(单选,1分)<br>面向数据结构的<br><strong>面向数据流的</strong><br>面向数据库的<br>面向对象设计的</p></summary>
<category term="复习(预习)资料" scheme="https://blog.darkcrane.com/categories/%E5%A4%8D%E4%B9%A0%EF%BC%88%E9%A2%84%E4%B9%A0%EF%BC%89%E8%B5%84%E6%96%99/"/>
<category term="复习资料" scheme="https://blog.darkcrane.com/tags/%E5%A4%8D%E4%B9%A0%E8%B5%84%E6%96%99/"/>
<category term="题库" scheme="https://blog.darkcrane.com/tags/%E9%A2%98%E5%BA%93/"/>
<category term="软件工程" scheme="https://blog.darkcrane.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
</entry>
<entry>
<title>软件工程复习(预习)4</title>
<link href="https://blog.darkcrane.com/posts/9ac1b15a/"/>
<id>https://blog.darkcrane.com/posts/9ac1b15a/</id>
<published>2019-04-06T14:22:05.000Z</published>
<updated>2019-04-06T14:22:05.000Z</updated>
<content type="html"><![CDATA[<p>Q1. 软件的发展经历了( )个发展阶段。(单选,1分)<br>一<br>二<br>三<br><strong>四</strong></p><a id="more"></a><p>Q2. 对象实现了数据和操作的结合,使数据和操作( )于对象的统一体中。(单选,1分)<br>结合<br>隐藏<br><strong>封装</strong><br>抽象</p><p>Q3. 项目经理的职责不包括以下哪项内容( )。(单选,1分)<br>开发计划<br>组织实施<br>项目控制<br><strong>系统支持</strong></p><p>Q4. 下列模型属于成本估算方法的有( )(单选,1分)<br><strong>COCOMO模型</strong><br>McCall模型<br>McCabe度量法<br>时间估算法</p><p>Q5. 白盒测试方法重视( )的度量。 (单选,1分)<br><strong>测试覆盖率</strong><br>测试数据多少<br>测试费用<br>测试周期 </p><p>Q6. 下列不属于可行性研究任务的是( )。(单选,1分)<br>技术可行性,经济可行性<br>操作可行性,法律与社会可行性<br>经济可行性,人性化可行性<br><strong>国籍可行性,年龄可行性</strong></p><p>Q7. 下列描述模型中既可用于结构化技术也可用于面向对象技术的模型是( )。(单选,1分)<br><strong>实体联系图、数据流图</strong><br>用例图、数据流图<br>状态图、顺序图<br>对象图、类图</p><p>Q8. 可行性研究要进行一次( )需求分析。 (单选,1分)<br>详细的 <br>全面的<br><strong>简化的、压缩的</strong> <br>彻底的</p><p>Q9. 每个对象可用它自己的一组属性和它可以执行的一组( )来表征。 (单选,1分)<br>行为<br>功能<br><strong>操作</strong><br>数据</p><p>Q10. 下列属于白盒测试的是( )。<br>①等价类划分法 ②边界值分析法 ③ 错误推测法<br>④逻辑覆盖法 ⑤控制结构测试(单选,1分)<br>①②④⑤<br>②③④⑤<br>①②③⑤<br><strong>④⑤</strong></p><p>Q11. 需求分析的任务不包括( )。(单选,1分)<br>问题分析<br><strong>系统设计</strong><br>需求描述<br>需求评审。</p><p>Q12. 软件产品的开发主要是( )。 (单选,1分)<br>复制<br>再生产<br>拷贝<br><strong>研制</strong> </p><p>Q13. 一个只有顺序结构的程序,其圈复杂度是( )。(单选,1分)<br>0<br><strong>1</strong><br>3<br>不确定的</p><p>Q14. 下列不属于软件项目人员的组织形式的是( )。(单选,1分)<br>主程序员制小组<br>民主制小组<br>层次式小组<br><strong>协作式小组</strong></p><p>Q15. 信息系统开发的结构化方法的一个主要原则是( ) 。(单选,1分)<br><strong>自顶向下原则</strong><br>自底向上原则<br>分步实施原则<br>重点突破原则</p><p>Q16. 下列不属于项目进度安排主要方法的是( )(单选,1分)<br>工程网络图<br>Gantt图<br><strong>进度结构图</strong><br>任务资源表</p><p>Q17. 面向对象方法学的出发点和基本原则是尽可能模拟人类习惯的思维方式,分析、设计和实现一个软件系统的方法和过程,尽可能接近于人类认识世界解决问题的方法和过程。因此面向对象方法有许多特征,如软件系统是由对象组成的;( );对象彼此之间仅能通过传递消息互相联系;层次结构的继承。(单选,1分)<br>开发过程基于功能分析和功能分解<br>强调需求分析重要性<br><strong>把对象划分成类,每个对象类都定义一组数据和方法</strong><br>对既存类进行调整</p><p>Q18. 当模块中包含复杂的条件组合,只有( )能够清晰地表达出各种动作之间的对应关系。(单选,1分)<br><strong>判定表和判定树</strong><br>盒图<br>流程图<br>关系图</p><p>Q19. 下列属于应用软件的是( )。 (单选,1分)<br>计算机辅助教学软件<br><strong>软件测试工具</strong><br>办公自动化软件<br>工程与科学计算软件</p><p>Q20. 软件工程管理是对软件项目的开发管理,即对整个软件的( )活动的管理。(单选,1分)<br>软件项目<br>生存期<br>软件开发计划<br><strong>软件开发</strong></p><p>Q21. 模块中所有成分结合起来完成一项任务,该模块的内聚性是( )。(单选,1分)<br><strong>功能内聚</strong><br>通信内聚<br>顺序内聚<br>逻辑内聚</p><p>Q22. 软件开发成本估算方法有( )。<br>① 代码行技术 ② 任务分解技术 ③ 专家估算法<br>④ 类推估算法 ⑤ 参数方程法 ⑥ 标准值法(单选,1分)<br>①③④⑤⑥<br>①②④⑤⑥<br>①②③④⑤<br><strong>①②③④⑤⑥</strong></p><p>Q23. 软件测试时,正确的测试次序是( )。(单选,1分)<br><strong>单元测试,集成测试,确认测试</strong><br>单元测试,确认测试,集成测试<br>集成测试,单元测试,确认测试<br>确认测试,单元测试,集成测试</p><p>Q24. 下面关于文档的叙述( )。(单选,1分)<br><strong>A.文档是仅用于说明使用软件的操作命令,不包括软件设计和实现细节</strong><br>B.文档是软件产品的一部分,没有文档的软件就不成为软件<br>C.高质量文档对于转让、变更、修改、扩充和使用有重要的意义<br>D.软件文档的编制在软件开发工作中占有突出的地位和相当大的工作量</p><p>Q25. 软件开发环境按解决的问题分类包含( )(单选,1分)<br><strong>程序设计环境</strong><br>工具箱环境<br>基于方法的环境<br>以语言为中心的环境</p><p>Q26. 用于描述对象模型的工具是( )(单选,1分)<br>数据流图<br>结构图<br>状态图<br><strong>对象图</strong></p><p>Q27. 在软件测试中,首先对每个模块分别进行单元测试,然后再把所有的模块按设计要求装在一起测试,称为( )(单选,1分)<br>确认测试<br>系统测试<br>渐增式测试<br><strong>非渐增式测试</strong></p><p>Q28. 不适于作为数据流图处理(加工)框名称的是( )。(单选,1分)<br>人工校核工资数据<br><strong>工资支票数据</strong><br>打印工资支票<br>计算职工工资</p><p>Q29. 下列( )属于压力测试。(单选,1分)<br>通过测试系统的恢复能力,检测其数据恢复、重新启动等是否正常<br>检测系统是否达到性能要求指标<br><strong>设计测试用例,使系统处于异常数量、异常频率、异常条件下,检测系统的承受能力</strong><br>检测系统安全保密的漏洞</p><p>Q30. 维护中,因误删除一个标识符而引起的错误是( )副作用。(单选,1分)<br>文档<br>数据<br><strong>编码</strong><br>设计</p><p>Q31. 任何项目都必须精心做好项目管理工作,最常用的计划管理工具是( )。 (单选,1分)<br>数据流程图<br>程序结构图<br>因果图<br><strong>PERT 图</strong></p><p>Q32. 软件部件的内部实现与外部可访问性的分离,是指软件的( )。 (单选,1分)<br>继承性<br>共享性<br><strong>封装性</strong><br>抽象性 </p><p>Q33. 一般子系统的划分是在系统( )阶段,根据对系统的功能、数据分析的结果提出的。(单选,1分)<br><strong>需求分析</strong><br>逻辑阶段<br>总体设计<br>详细设计</p><p>Q34. 程序的三种基本控制结构的共同特点是( )。(单选,1分)<br>不能嵌套使用<br>只能用来写简单程序<br>已经用硬件实现<br><strong>只有一个入口和一个出口</strong></p><p>Q35. 一个软件的宽度是指其控制的( )。(单选,1分)<br>模块数<br>层数<br><strong>跨度</strong><br>厚度</p><p>Q36. 以下哪一项不是软件危机的表现( )。(单选,1分)<br>开发的软件可维护性差<br>经费预算经常被突破<br><strong>软件极易被盗版</strong><br>开发的软件不能满足用户需求</p><p>Q37. 对于使用原型的建议,下面说法错误的是( )。(单选,1分)<br>开发周期很长的项目,可通过原型开发来缩短开发周期<br>系统的使用可能变化较大,不能相对稳定,而原型模型具有适应变化的机制<br><strong>缺乏开发工具,或对原型的可用工具不了解的时候宜使用原型</strong><br>用户对系统的需求较为模糊,对某种要求缺乏信心时宜使用原型</p><p>Q38. 以下哪个软件生存周期模型是一种风险驱动的模型(单选,1分)<br>瀑布模型<br>增量模型<br><strong>螺旋模型</strong><br>喷泉模型</p><p>Q39. 在软件系统中,一个模块应该具有什么样的功能,这是由( )决定的。(单选,1分)<br>需求分析<br><strong>概要设计</strong><br>详细设计<br>程序设计</p><p>Q40. 面向对象程序设计中,基于父类创建的子类具有父类的特性(属性和方法),这一特点称为类的( )。(单选,1分)<br>多态性<br>封装性<br><strong>继承性</strong><br>重用性</p><p>Q41. 风险的三个属性是( ) 。 (单选,1分)<br>风险发生的时间、地点、负责人<br>风险事件、时间、影响<br><strong>风险事件、概率、影响</strong><br>风险数量、风险影响</p><p>Q42. 为了提高软件产品的质量和可靠性,对某些无法避开的差错,使其影响减至最小程度所采用的技术是( )。(单选,1分)<br><strong>容错技术</strong><br>避开错误技术<br>检测技术<br>排错技术</p><p>Q43. 在结构化分析方法中用状态―迁移图表达系统或对象的行为。在状态―迁移图中,由一个状态和一个事件所决定的下一状态可能会有( )个。(单选,1分)<br>1<br>2<br><strong>多个</strong><br>不确定</p><p>Q44. 从事物的属性侧面来描述事物的方法就是( )的方法。(单选,1分)<br>面向对象<br><strong>面向数据</strong><br>面向过程<br>面向属性</p><p>Q45. 面向对象分析的首要工作是建立( )。(单选,1分)<br>系统的功能模型<br>系统的动态模型<br>软件对象类定义<br><strong>系统的对象模型</strong></p><p>Q46. 在结构化分析方法中,用以表达系统内数据的运动情况的工具有( )。(单选,1分)<br><strong>数据流图</strong><br>数据词典<br>结构化英语<br>判定表与判定树</p><p>Q47. 软件工程方法的提出起源于软件危机,其主要思想是按( )来组织和规范软件开发过程。(单选,1分)<br>质量保证<br>生产危机<br><strong>工程化的原则和方法</strong><br>开发效率</p><p>Q48. 软件重用的单位是( )。(单选,1分)<br><strong>软件模块</strong><br>性能<br>过程<br>功能</p><p>Q49. 检查软件产品是否符合需求定义的过程称为( )。(单选,1分)<br><strong>确认测试</strong><br>集成测试<br>单元测试<br>系统测试</p><p>Q50. 用于描绘软件项目的任务进度的图形工具是( )。(单选,1分)<br><strong>Gantt</strong>图<br>事件跟踪图<br>状态转换图<br>协作图</p>]]></content>
<summary type="html"><p>Q1. 软件的发展经历了( )个发展阶段。(单选,1分)<br>一<br>二<br>三<br><strong>四</strong></p></summary>
<category term="复习(预习)资料" scheme="https://blog.darkcrane.com/categories/%E5%A4%8D%E4%B9%A0%EF%BC%88%E9%A2%84%E4%B9%A0%EF%BC%89%E8%B5%84%E6%96%99/"/>
<category term="复习资料" scheme="https://blog.darkcrane.com/tags/%E5%A4%8D%E4%B9%A0%E8%B5%84%E6%96%99/"/>
<category term="题库" scheme="https://blog.darkcrane.com/tags/%E9%A2%98%E5%BA%93/"/>
<category term="软件工程" scheme="https://blog.darkcrane.com/tags/%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B/"/>
</entry>
<entry>
<title>Hello World</title>
<link href="https://blog.darkcrane.com/posts/4a17b156/"/>
<id>https://blog.darkcrane.com/posts/4a17b156/</id>
<published>2019-03-15T09:00:20.000Z</published>
<updated>2019-03-15T09:00:20.000Z</updated>
<content type="html"><![CDATA[<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><a id="more"></a><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
<summary type="html"><p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2></summary>
</entry>
</feed>