-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
1104 lines (712 loc) · 787 KB
/
atom.xml
File metadata and controls
1104 lines (712 loc) · 787 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>寻沫小栈 | 风澈</title>
<subtitle>关注开发、技术、互联网</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://inplus.top/"/>
<updated>2023-02-24T03:13:49.072Z</updated>
<id>http://inplus.top/</id>
<author>
<name>风澈vio</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>CentOS 7 下Tomcat启动超慢的原因及解决方案</title>
<link href="http://inplus.top/archives/tomcat-start-slow-random/"/>
<id>http://inplus.top/archives/tomcat-start-slow-random/</id>
<published>2019-01-24T19:25:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<h3 id="现象"><a href="#现象" class="headerlink" title="现象"></a>现象</h3><p>CentOS 7系统中安装好openjdk和Tomcat后,启动过程很慢,长达数分钟,日志如下:<br><figure class="highlight stylus"><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="number">17</span>:<span class="number">27</span>:<span class="number">53.596</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.core</span><span class="selector-class">.StandardEngine</span><span class="selector-class">.startInternal</span> Starting Servlet Engine: Apache Tomcat/<span class="number">8.5</span>.<span class="number">38</span></span><br><span class="line"><span class="number">17</span>:<span class="number">27</span>:<span class="number">53.644</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/docs]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.001</span> WARNING [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.util</span><span class="selector-class">.SessionIdGeneratorBase</span><span class="selector-class">.createSecureRandom</span> Creation of SecureRandom instance <span class="keyword">for</span> session ID generation using [SHA1PRNG] took [<span class="number">276</span>,<span class="number">660</span>] milliseconds.</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.022</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/docs] has finished <span class="keyword">in</span> [<span class="number">277</span>,<span class="number">378</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.022</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/manager]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.101</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/manager] has finished <span class="keyword">in</span> [<span class="number">79</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.101</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/examples]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.509</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/examples] has finished <span class="keyword">in</span> [<span class="number">408</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.510</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/host-manager]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.559</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/host-manager] has finished <span class="keyword">in</span> [<span class="number">49</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.559</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/ROOT]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.576</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/ROOT] has finished <span class="keyword">in</span> [<span class="number">17</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.605</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.coyote</span><span class="selector-class">.AbstractProtocol</span><span class="selector-class">.start</span> Starting ProtocolHandler [<span class="string">"http-nio-8080"</span>]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.660</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.coyote</span><span class="selector-class">.AbstractProtocol</span><span class="selector-class">.start</span> Starting ProtocolHandler [<span class="string">"ajp-nio-8009"</span>]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.662</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.Catalina</span><span class="selector-class">.start</span> Server startup <span class="keyword">in</span> <span class="number">278084</span> ms</span><br></pre></td></tr></table></figure></p><a id="more"></a><p>tomcat启动耗时278084ms折合278秒,对于刚刚安装的干净tomcat,这肯定是不对劲的。<br>其中有一条日志引起了笔者的注意:<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">17:32:31.001 <span class="builtin-name">WARNING</span> [localhost-startStop-1] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom<span class="built_in"> instance </span><span class="keyword">for</span> session ID generation using [SHA1PRNG] took [276,660] milliseconds.</span><br></pre></td></tr></table></figure></p><p>显然tomcat执行到这里时出问题了,google了一下,经过一番搜索明白了其中的缘由。</p><h3 id="原因"><a href="#原因" class="headerlink" title="原因"></a>原因</h3><p>在tomcat官方wiki文档的<em><a href="https://wiki.apache.org/tomcat/HowTo/FasterStartUp" target="_blank" rel="noopener">HowToFasterStartUp</a></em>章节中,Entropy Source部分有一段这样的说明:</p><blockquote><p>Tomcat 7+严重依赖SecureRandom类为其sessionID和其他地方提供随机值。如果用于初始化SecureRandom的熵源缺少熵,则可能会在启动期间导致延迟,具体取决于您的JRE。发生这种情况时,您会在日志中看到警告,例如:<br><strong><date> org.apache.catalina.util.SessionIdGenerator createSecureRandom<br>INFO: Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [5172] milliseconds.</date></strong><br>有一种方法可以通过设置以下系统属性来配置JRE以使用非阻塞熵源:<br><strong>-Djava.security.egd = file:/dev/./urandom</strong><br>另请注意,使用非阻塞源替换阻塞熵源实际上会降低安全性,因为您获得的随机数据较少。</p></blockquote><p>从这里我们得知Tocmat的Session ID是通过SHA1PRNG算法计算得到的,计算Session ID的时候必须有一个密钥,为了提高安全性Tomcat在启动的时候会通过随机生成一个密钥,它强依赖于获取熵池中的随机数来进行创建。<br>那么什么是<strong>/dev/random</strong>?什么是<strong>熵池</strong>?</p><p><strong>/dev/random</strong><br>从维基百科得知,在UNIX操作系统(包括类UNIX系统)中,<code>/dev/random</code>是一个特殊的设备文件,可以用作随机数生成器或伪随机数生成器。<br>Linux内核中的是第一个以<code>背景噪声</code>产生真正的随机数产生的实现,它允许程序访问来自设备驱动程序或其它来源的背景噪声。<br>Linux上有两个通用的随机设备:<code>/dev/random</code>和<code>/dev/urandom</code>。其中<code>/dev/random</code>的随机性最好,因为它是一个阻塞的设备。而<code>/dev/random</code>的一个副本是<code>/dev/urandom</code>(“unblocked”,非阻塞的随机数生成器),它会重复使用熵池中的数据以产生伪随机数据。这表示对<code>/dev/urandom</code>的读取操作不会产生阻塞,但其输出的熵可能小于<code>/dev/random</code>的。所以它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。</p><p><strong>熵池</strong><br>熵池本质上是若干字节,<code>/proc/sys/kernel/random/entropy_avail</code>中存储了熵池现在的大小,<code>/proc/sys/kernel/random/poolsize</code>是熵池的最大容量,单位都是bit。如果<code>entropy_avail</code>的值小于要产生的随机数bit数,那么<code>/dev/random</code>就会堵塞。</p><p><strong>为什么熵池不够用?</strong></p><p>熵池实际上是从各种noice source中获取数据,noice source可能是键盘事件、鼠标事件、设备时钟中等。linux内核从2.4升级到2.6时,处于安全性的考虑,废弃了一些source。source减少了,熵池补给的速度当然也变慢,进而不够用。<br>其实,通过消耗熵池,可以构造DDOS攻击。原理很简单,熵池空了,依赖随机数的业务(SSL,加密等)就不能正常进行。</p><p>通过以上信息,笔者得知该问题是由于熵池不足导致的。<strong>怎么解决?</strong></p><h3 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h3><h5 id="方法一、降低熵生成的随机性要求"><a href="#方法一、降低熵生成的随机性要求" class="headerlink" title="方法一、降低熵生成的随机性要求"></a>方法一、降低熵生成的随机性要求</h5><p><strong>使用非阻塞性的生成器<code>/dev/urandom</code>代替<code>/dev/random</code>。</strong></p><p><strong>1、可在JVM环境中配置</strong><br>通过配置发生器指定熵收集守护进程<br>修改<code>$JAVA_PATH/jre/lib/security/java.security</code>中参数<code>securerandom.source</code>为:<br><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">securerandom.<span class="keyword">source</span>=<span class="keyword">file</span>:<span class="regexp">/dev/</span>.<span class="regexp">/urandom</span></span><br></pre></td></tr></table></figure></p><p><strong>2、也可在Tomcat环境中配置</strong><br>通过配置JRE使用非阻塞的Entropy Source获取熵<br>在<code>$TOMCAT_HOME/bin/catalina.sh</code>中加入:<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> [[ <span class="string">"<span class="variable">$JAVA_OPTS</span>"</span> != *-Djava.security.<span class="attribute">egd</span>=* ]]; then</span><br><span class="line"> <span class="attribute">JAVA_OPTS</span>=<span class="string">"<span class="variable">$JAVA_OPTS</span> -Djava.security.egd=file:/dev/./urandom"</span></span><br><span class="line">fi</span><br></pre></td></tr></table></figure></p><p>这个系统属性egd表示熵收集守护进程(entropy gathering daemon)。</p><h5 id="方法二、使用熵生成器补充熵池(推荐)"><a href="#方法二、使用熵生成器补充熵池(推荐)" class="headerlink" title="方法二、使用熵生成器补充熵池(推荐)"></a>方法二、使用熵生成器补充熵池(推荐)</h5><p><strong>1、[硬件随机数生成器]安装并使用rng-tools作为额外的熵随机数生成器(推荐)</strong><br><figure class="highlight vala"><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="meta"># 安装rng-tools</span></span><br><span class="line">yum install rng-tools -y</span><br><span class="line"><span class="meta"># 测试rngd</span></span><br><span class="line">rngd -f</span><br><span class="line"><span class="meta"># 启动rngd</span></span><br><span class="line">systemctl start rngd</span><br><span class="line"><span class="meta"># 设置自启动</span></span><br><span class="line">systemctl enable rngd</span><br><span class="line"><span class="meta"># 查看自启动列表</span></span><br><span class="line">systemctl list-unit-files</span><br></pre></td></tr></table></figure></p><p><code>cat /dev/random</code>命令会消耗熵池,<code>rngd</code>守护进程会补充熵池,可使用如下命令来测试随机数生成的情况:<br><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">cat</span> <span class="string">/dev/random</span> <span class="string">|</span> <span class="string">rngtest</span> <span class="string">-c</span> <span class="number">100</span></span><br><span class="line"><span class="comment"># 测试结果</span></span><br><span class="line"><span class="string">rngtest</span> <span class="number">6</span></span><br><span class="line"><span class="string">Copyright</span> <span class="string">(c)</span> <span class="number">2004</span> <span class="string">by</span> <span class="string">Henrique</span> <span class="string">de</span> <span class="string">Moraes</span> <span class="string">Holschuh</span></span><br><span class="line"><span class="string">This</span> <span class="string">is</span> <span class="string">free</span> <span class="string">software;</span> <span class="string">see</span> <span class="string">the</span> <span class="string">source</span> <span class="string">for</span> <span class="string">copying</span> <span class="string">conditions.</span> <span class="string">There</span> <span class="string">is</span> <span class="literal">NO</span> <span class="string">warranty;</span> <span class="string">not</span> <span class="string">even</span> <span class="string">for</span> <span class="string">MERCHANTABILITY</span> <span class="string">or</span> <span class="string">FITNESS</span> <span class="string">FOR</span> <span class="string">A</span> <span class="string">PARTICULAR</span> <span class="string">PURPOSE.</span></span><br><span class="line"></span><br><span class="line"><span class="attr">rngtest:</span> <span class="string">starting</span> <span class="string">FIPS</span> <span class="string">tests...</span></span><br><span class="line"><span class="attr">rngtest: bits received from input:</span> <span class="number">2000032</span></span><br><span class="line"><span class="attr">rngtest: FIPS 140-2 successes:</span> <span class="number">100</span></span><br><span class="line"><span class="attr">rngtest: FIPS 140-2 failures:</span> <span class="number">0</span></span><br><span class="line"><span class="attr">rngtest:</span> <span class="string">FIPS</span> <span class="number">140</span><span class="number">-2</span><span class="string">(2001-10-10)</span> <span class="attr">Monobit:</span> <span class="number">0</span></span><br><span class="line"><span class="attr">rngtest:</span> <span class="string">FIPS</span> <span class="number">140</span><span class="number">-2</span><span class="string">(2001-10-10)</span> <span class="attr">Poker:</span> <span class="number">0</span></span><br><span class="line"><span class="attr">rngtest:</span> <span class="string">FIPS</span> <span class="number">140</span><span class="number">-2</span><span class="string">(2001-10-10)</span> <span class="attr">Runs:</span> <span class="number">0</span></span><br><span class="line"><span class="attr">rngtest:</span> <span class="string">FIPS</span> <span class="number">140</span><span class="number">-2</span><span class="string">(2001-10-10)</span> <span class="attr">Long run:</span> <span class="number">0</span></span><br><span class="line"><span class="attr">rngtest:</span> <span class="string">FIPS</span> <span class="number">140</span><span class="number">-2</span><span class="string">(2001-10-10)</span> <span class="attr">Continuous run:</span> <span class="number">0</span></span><br><span class="line"><span class="attr">rngtest: input channel speed:</span> <span class="string">(min=13.823;</span> <span class="string">avg=42.721;</span> <span class="string">max=10761.019)Kibits/s</span></span><br><span class="line"><span class="attr">rngtest: FIPS tests speed:</span> <span class="string">(min=93.041;</span> <span class="string">avg=129.531;</span> <span class="string">max=136.239)Mibits/s</span></span><br><span class="line"><span class="attr">rngtest: Program run time:</span> <span class="number">45733452</span> <span class="string">microseconds</span></span><br></pre></td></tr></table></figure></p><p><strong>2、[软件随机数生成器]在rng-tools仍不满足的情况下,可使用haveged作为额外的熵随机数生成器</strong></p><blockquote><p>haveged项目的目的是提供一个简单易用的不可预测随机数生成器,基于HAVEGE算法。Haveged可以解决在某些情况下,系统熵过低的问题。此程序无法保证熵的质量,如果对安全要求较高,请考虑使用硬件随机数生成器rng-tools。</p></blockquote><p>要检查是否需要 Haveged,可使用下面命令查看当前收集到的熵:<br><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat <span class="regexp">/proc/</span>sys<span class="regexp">/kernel/</span>random<span class="regexp">/entropy_avail</span></span><br></pre></td></tr></table></figure></p><p>如果结果比较低 (<1000),建议安装 haveged,否则加密程序会处于等待状态,直到系统有足够的熵。<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装haveged</span></span><br><span class="line">yum <span class="keyword">install</span> haveged -y</span><br><span class="line"><span class="comment"># 启动haveged</span></span><br><span class="line">systemctl <span class="keyword">start</span> haveged</span><br><span class="line"><span class="comment"># 设置自启动</span></span><br><span class="line">systemctl <span class="keyword">enable</span> haveged</span><br></pre></td></tr></table></figure></p><p>安装 haveged 之后,可以再次查看系统熵看下有无提升。</p><hr><p>因为方法一存在一定的不安全性,且需要对环境进行配置,为了满足熵的需要,这里笔者选择了第二种方法,使用rng-tools作为额外的熵随机数生成器,同以上操作后顺利解决了问题。</p><p>操作后重启tomcat日志如下,启动速度快了两个数量级:<br><figure class="highlight stylus"><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="number">17</span>:<span class="number">58</span>:<span class="number">07.068</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.core</span><span class="selector-class">.StandardEngine</span><span class="selector-class">.startInternal</span> Starting Servlet Engine: Apache Tomcat/<span class="number">8.5</span>.<span class="number">38</span></span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">07.088</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/docs]</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">07.740</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/docs] has finished <span class="keyword">in</span> [<span class="number">652</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">07.740</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/manager]</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">07.815</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/manager] has finished <span class="keyword">in</span> [<span class="number">75</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">07.816</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/examples]</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">08.241</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/examples] has finished <span class="keyword">in</span> [<span class="number">425</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">08.241</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/host-manager]</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">08.268</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/host-manager] has finished <span class="keyword">in</span> [<span class="number">27</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">08.269</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/ROOT]</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">08.306</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/ROOT] has finished <span class="keyword">in</span> [<span class="number">37</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">08.335</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.coyote</span><span class="selector-class">.AbstractProtocol</span><span class="selector-class">.start</span> Starting ProtocolHandler [<span class="string">"http-nio-8080"</span>]</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">08.424</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.coyote</span><span class="selector-class">.AbstractProtocol</span><span class="selector-class">.start</span> Starting ProtocolHandler [<span class="string">"ajp-nio-8009"</span>]</span><br><span class="line"><span class="number">17</span>:<span class="number">58</span>:<span class="number">08.429</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.Catalina</span><span class="selector-class">.start</span> Server startup <span class="keyword">in</span> <span class="number">1411</span> ms</span><br></pre></td></tr></table></figure></p><hr><p>参考文档:<br><a href="https://stackoverflow.com/questions/40383430/tomcat-takes-too-much-time-to-start-java-securerandom" target="_blank" rel="noopener">https://stackoverflow.com/questions/40383430/tomcat-takes-too-much-time-to-start-java-securerandom</a><br><a href="https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6202721" target="_blank" rel="noopener">https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6202721</a><br><a href="http://openjdk.java.net/jeps/123" target="_blank" rel="noopener">http://openjdk.java.net/jeps/123</a><br><a href="https://zh.wikipedia.org/zh-hans//dev/random" target="_blank" rel="noopener">https://zh.wikipedia.org/zh-hans//dev/random</a><br><a href="https://wiki.apache.org/tomcat/HowTo/FasterStartUp" target="_blank" rel="noopener">https://wiki.apache.org/tomcat/HowTo/FasterStartUp</a><br><a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-encryption-using_the_random_number_generator" target="_blank" rel="noopener">https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-encryption-using_the_random_number_generator</a><br><a href="https://wiki.archlinux.org/index.php/Rng-tools" target="_blank" rel="noopener">https://wiki.archlinux.org/index.php/Rng-tools</a><br><a href="https://wiki.archlinux.org/index.php/Haveged" target="_blank" rel="noopener">https://wiki.archlinux.org/index.php/Haveged</a><br><a href="https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged" target="_blank" rel="noopener">https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged</a></p>]]></content>
<summary type="html">
<h3 id="现象"><a href="#现象" class="headerlink" title="现象"></a>现象</h3><p>CentOS 7系统中安装好openjdk和Tomcat后,启动过程很慢,长达数分钟,日志如下:<br><figure class="highlight stylus"><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="number">17</span>:<span class="number">27</span>:<span class="number">53.596</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.core</span><span class="selector-class">.StandardEngine</span><span class="selector-class">.startInternal</span> Starting Servlet Engine: Apache Tomcat/<span class="number">8.5</span>.<span class="number">38</span></span><br><span class="line"><span class="number">17</span>:<span class="number">27</span>:<span class="number">53.644</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/docs]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.001</span> WARNING [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.util</span><span class="selector-class">.SessionIdGeneratorBase</span><span class="selector-class">.createSecureRandom</span> Creation of SecureRandom instance <span class="keyword">for</span> session ID generation using [SHA1PRNG] took [<span class="number">276</span>,<span class="number">660</span>] milliseconds.</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.022</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/docs] has finished <span class="keyword">in</span> [<span class="number">277</span>,<span class="number">378</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.022</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/manager]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.101</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/manager] has finished <span class="keyword">in</span> [<span class="number">79</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.101</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/examples]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.509</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/examples] has finished <span class="keyword">in</span> [<span class="number">408</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.510</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/host-manager]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.559</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/host-manager] has finished <span class="keyword">in</span> [<span class="number">49</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.559</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deploying web application directory [/opt/tomcat_8_5_38/webapps/ROOT]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.576</span> INFO [localhost-startStop-<span class="number">1</span>] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.HostConfig</span><span class="selector-class">.deployDirectory</span> Deployment of web application directory [/opt/tomcat_8_5_38/webapps/ROOT] has finished <span class="keyword">in</span> [<span class="number">17</span>] ms</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.605</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.coyote</span><span class="selector-class">.AbstractProtocol</span><span class="selector-class">.start</span> Starting ProtocolHandler [<span class="string">"http-nio-8080"</span>]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.660</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.coyote</span><span class="selector-class">.AbstractProtocol</span><span class="selector-class">.start</span> Starting ProtocolHandler [<span class="string">"ajp-nio-8009"</span>]</span><br><span class="line"><span class="number">17</span>:<span class="number">32</span>:<span class="number">31.662</span> INFO [main] org<span class="selector-class">.apache</span><span class="selector-class">.catalina</span><span class="selector-class">.startup</span><span class="selector-class">.Catalina</span><span class="selector-class">.start</span> Server startup <span class="keyword">in</span> <span class="number">278084</span> ms</span><br></pre></td></tr></table></figure></p>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<category term="tomcat" scheme="http://inplus.top/tags/tomcat/"/>
</entry>
<entry>
<title>python3爬虫之有道翻译(下)</title>
<link href="http://inplus.top/archives/youdao-spider-bottom/"/>
<id>http://inplus.top/archives/youdao-spider-bottom/</id>
<published>2018-08-10T22:01:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/youdao-spider-bottom/youdao-spider-bottom-0.jpg" class="img-center-slider"><br> 上一篇我们讲到分析有道翻译接口请求,并利用python3构造参数爬取接口。在本篇中,我将会针对有道翻译接口进行图形化界面的设计。</p><h4 id="一、器欲尽其能,必先得其法。"><a href="#一、器欲尽其能,必先得其法。" class="headerlink" title="一、器欲尽其能,必先得其法。"></a>一、器欲尽其能,必先得其法。</h4><p> 像java中的<code>AWT</code>和<code>Swing</code>一样,在python3中也自带了GUI工具包,利用其中的<code>Tkinter</code>组件,我们可以方便快捷的设计我们的图形界面。</p><p>PS:需要注意的是,在python2和python3中其导入方式存在差异。<br><figure class="highlight capnproto"><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"><span class="comment"># Python2.x:</span></span><br><span class="line"><span class="keyword">from</span> Tkinter <span class="keyword">import</span> *</span><br><span class="line"><span class="comment"># Python3.x:</span></span><br><span class="line"><span class="keyword">from</span> tkinter <span class="keyword">import</span> *</span><br></pre></td></tr></table></figure></p><a id="more"></a><h4 id="二、操千曲而后晓声,观千剑而后识器。"><a href="#二、操千曲而后晓声,观千剑而后识器。" class="headerlink" title="二、操千曲而后晓声,观千剑而后识器。"></a>二、操千曲而后晓声,观千剑而后识器。</h4><p> 那么该如何使用该模块呢,通过下面一个Hello World程序我们可以对<code>tkinter</code>有一个简单的认识。<br><figure class="highlight ruby"><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></pre></td><td class="code"><pre><span class="line">import tkinter as tk</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Application</span>(<span class="title">tk</span>.<span class="title">Frame</span>):</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(<span class="keyword">self</span>, master=None)</span></span><span class="symbol">:</span></span><br><span class="line"> <span class="keyword">super</span>().__init_<span class="number">_</span>(master)</span><br><span class="line"> <span class="keyword">self</span>.master = master</span><br><span class="line"> <span class="keyword">self</span>.pack()</span><br><span class="line"> <span class="keyword">self</span>.create_widgets()</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">create_widgets</span><span class="params">(<span class="keyword">self</span>)</span></span><span class="symbol">:</span></span><br><span class="line"> <span class="keyword">self</span>.hi_there = tk.Button(<span class="keyword">self</span>)</span><br><span class="line"> <span class="keyword">self</span>.hi_there[<span class="string">"text"</span>] = <span class="string">"你好\n(点击我)"</span></span><br><span class="line"> <span class="keyword">self</span>.hi_there[<span class="string">"command"</span>] = <span class="keyword">self</span>.say_hi</span><br><span class="line"> <span class="keyword">self</span>.hi_there.pack(side=<span class="string">"top"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">self</span>.quit = tk.Button(<span class="keyword">self</span>, text=<span class="string">"退出"</span>, fg=<span class="string">"red"</span>,</span><br><span class="line"> command=<span class="keyword">self</span>.master.destroy)</span><br><span class="line"> <span class="keyword">self</span>.quit.pack(side=<span class="string">"bottom"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">say_hi</span><span class="params">(<span class="keyword">self</span>)</span></span><span class="symbol">:</span></span><br><span class="line"> print(<span class="string">"大家好!"</span>)</span><br><span class="line"></span><br><span class="line">root = tk.Tk()</span><br><span class="line">app = Application(master=root)</span><br><span class="line">app.mainloop()</span><br></pre></td></tr></table></figure></p><h4 id="三、只要功夫深,铁杵磨成针"><a href="#三、只要功夫深,铁杵磨成针" class="headerlink" title="三、只要功夫深,铁杵磨成针"></a>三、只要功夫深,铁杵磨成针</h4><p>对<code>tkinter</code>有了简单的了解后,首先我们在面板上添加文本区组件和按钮组件,将主要功能展示出来<br><img src="/assets/blogImg/youdao-spider-bottom/youdao-spider-bottom-1.png" class="img-center-normal"></p><p>其次,我们针对不同的语言增加翻译选项<br><img src="/assets/blogImg/youdao-spider-bottom/youdao-spider-bottom-2.png" class="img-center-normal"></p><p>重新调整组件和布局<br><img src="/assets/blogImg/youdao-spider-bottom/youdao-spider-bottom-3.png" class="img-center-normal"></p><p>这样,一个简单的GUI界面就实现了,好像有点丑,一股浓浓的windows经典风格。。。</p><h4 id="四、不畏浮云遮望眼,只缘身在最高层。"><a href="#四、不畏浮云遮望眼,只缘身在最高层。" class="headerlink" title="四、不畏浮云遮望眼,只缘身在最高层。"></a>四、不畏浮云遮望眼,只缘身在最高层。</h4><p> 我们前面都是直接使用<code>tkinter</code>模块下的 GUI 组件,这些组件看上去特别复(chou)古(lou),仿佛将我门带回了20年前。为了更好的视觉效果,<code>Tkinter</code>后来引入了一个<code>ttk</code>组件作为补充(主要就是简单包装、美化一下),并使用功能更强大的Combobox取代了原来的Listbox,且新增了 LabeledScale(带标签的 Scale)、Notebook(多文档窗口)、Progressbar(进度条)、Treeview(树)等组件。ttk作为一个模块被放在tkinter包下,使用ttk组件与使用普通的Tkinter组件并没有多大的区别,只要导入ttk模块即可。<br> 其实,tkinter中还存在一个进阶组件ttk,tk带有17个小部件,其中11个已经存在于tkinter中:Button,Checkbutton,Entry,Frame,Label,LabelFrame,Menubutton,PanedWindow,Radiobutton,Scale和Scrollbar。 6个新的窗口小部件类是:Combobox,Notebook,Progressbar,Separator,Sizegrip和Treeview。所有这些类都是Widget的子类。<br>导入方式如下:<br><figure class="highlight capnproto"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Python2.x:</span></span><br><span class="line"><span class="keyword">from</span> Tkinter <span class="keyword">import</span> *</span><br><span class="line"><span class="comment"># 导入ttk</span></span><br><span class="line"><span class="keyword">from</span> ttk <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line"><span class="comment"># Python3.x:</span></span><br><span class="line"><span class="keyword">from</span> tkinter <span class="keyword">import</span> *</span><br><span class="line"><span class="comment"># 导入ttk</span></span><br><span class="line"><span class="keyword">from</span> tkinter <span class="keyword">import</span> ttk</span><br></pre></td></tr></table></figure></p><p>然后我们利用<code>ttk</code>模块,对组件样式进行优化,并且利用<code>pyperclip</code>模块对剪贴板进行相应的读写操作。<br><img src="/assets/blogImg/youdao-spider-bottom/youdao-spider-bottom-4.png" class="img-center-normal"></p><p>还可利用<code>Progressbar</code>进度条组件,增加进度条显示<br><img src="/assets/blogImg/youdao-spider-bottom/youdao-spider-bottom-5.png" class="img-center-normal"></p><p>以及菜单、多标签和弹出窗体的实现</p><p><img src="/assets/blogImg/youdao-spider-bottom/youdao-spider-bottom-6.png" class="img-center-normal"></p><p><img src="/assets/blogImg/youdao-spider-bottom/youdao-spider-bottom-7.png" class="img-center-normal"></p><p><img src="/assets/blogImg/youdao-spider-bottom/youdao-spider-bottom-8.png" class="img-center-normal"></p><p>我们还可利用<code>pyinstaller</code>将程序打包成exe在windows平台上进行方便的使用,这样我们利用python的GUI就完成了有道词典的图形界面制作。</p><p>最后,附上完整代码:<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># -*- coding:utf-8 -*-</span></span><br><span class="line">import time</span><br><span class="line">import threading</span><br><span class="line">import tkinter as tk</span><br><span class="line"><span class="keyword">from</span> tkinter import ttk</span><br><span class="line"><span class="keyword">from</span> tkinter import messagebox as mBox</span><br><span class="line">import hashlib</span><br><span class="line">import json</span><br><span class="line">import random</span><br><span class="line">import pyperclip</span><br><span class="line">import webbrowser</span><br><span class="line">import base64</span><br><span class="line">import os</span><br><span class="line"><span class="keyword">from</span> urllib import parse</span><br><span class="line"><span class="keyword">from</span> urllib import request</span><br><span class="line"></span><br><span class="line"><span class="string">""</span><span class="string">"</span></span><br><span class="line"><span class="string">类说明:有道词典翻译的类</span></span><br><span class="line"><span class="string">"</span><span class="string">""</span></span><br><span class="line">class YOUDAO:</span><br><span class="line"> </span><br><span class="line"> def _quit(self):</span><br><span class="line"> self.exitFlag = <span class="literal">False</span></span><br><span class="line"> mBox.showinfo(<span class="attribute">title</span>=<span class="string">'小y温馨提示'</span>, <span class="attribute">message</span>=<span class="string">'感谢您的使用~'</span>)</span><br><span class="line"> self.root.quit()</span><br><span class="line"> self.root.destroy()</span><br><span class="line"><span class="comment"># exit()</span></span><br><span class="line"> </span><br><span class="line"> def _progressGo(self):</span><br><span class="line"> self.proBar.grid(<span class="attribute">row</span>=0, <span class="attribute">column</span>=0)</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(100):</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.exitFlag:</span><br><span class="line"> return</span><br><span class="line"> self.proBar[<span class="string">"value"</span>] = i + 1</span><br><span class="line"> self.root.update()</span><br><span class="line"> time.sleep(0.06)</span><br><span class="line"> self.proBar.grid_forget()</span><br><span class="line"></span><br><span class="line"> def __init__(self, <span class="attribute">width</span>=500, <span class="attribute">height</span>=300):</span><br><span class="line"> self.w = width</span><br><span class="line"> self.h = height</span><br><span class="line"> self.title = <span class="string">'有道词典(特别开心版)'</span></span><br><span class="line"> self.root = tk.Tk(<span class="attribute">className</span>=self.title)</span><br><span class="line"> # 绑定关闭窗口为自定义函数</span><br><span class="line"> self.root.protocol(<span class="string">"WM_DELETE_WINDOW"</span>, self._quit)</span><br><span class="line"> </span><br><span class="line"> self.radio = tk.StringVar()</span><br><span class="line"> self.radio.<span class="builtin-name">set</span>(<span class="string">'AUTO'</span>)</span><br><span class="line"> self.exitFlag = <span class="literal">True</span></span><br><span class="line"> self.errorFlag = 0</span><br><span class="line"> self.nextFlag = 0</span><br><span class="line"></span><br><span class="line"> # 创建tabControl</span><br><span class="line"> tabControl = ttk.Notebook(self.root)</span><br><span class="line"> # 创建tab</span><br><span class="line"> tab1 = ttk.Frame(tabControl)</span><br><span class="line"> tabControl.<span class="builtin-name">add</span>(tab1, <span class="attribute">text</span>=<span class="string">'O(∩_∩)O~'</span>)</span><br><span class="line"> tabControl.pack(<span class="attribute">expand</span>=1, <span class="attribute">fill</span>=<span class="string">"both"</span>)</span><br><span class="line"> </span><br><span class="line"> tab2 = ttk.Frame(tabControl)</span><br><span class="line"> tabControl.<span class="builtin-name">add</span>(tab2, <span class="attribute">text</span>=<span class="string">'点我点我'</span>)</span><br><span class="line"> tabControl.pack(<span class="attribute">expand</span>=1, <span class="attribute">fill</span>=<span class="string">"both"</span>)</span><br><span class="line"> ttk.Label(tab2, <span class="attribute">text</span>=<span class="string">"作者长得帅"</span>).pack(pady=100)</span><br><span class="line"> </span><br><span class="line"> # 创建Frame空间</span><br><span class="line"> # pack控件布局</span><br><span class="line"> frame1 = ttk.Frame(tab1)</span><br><span class="line"> frame2 = ttk.LabelFrame(tab1, <span class="attribute">text</span>=<span class="string">'翻译区'</span>)</span><br><span class="line"> frame3 = ttk.Frame(tab1)</span><br><span class="line"> </span><br><span class="line"> # 创建MenuBar</span><br><span class="line"> menuBar = tk.Menu(self.root)</span><br><span class="line"> self.root.config(<span class="attribute">menu</span>=menuBar)</span><br><span class="line"> # 创建menu</span><br><span class="line"> menu1 = tk.Menu(menuBar, <span class="attribute">tearoff</span>=0)</span><br><span class="line"> menuBar.add_cascade(<span class="attribute">label</span>=<span class="string">'菜单'</span>, <span class="attribute">menu</span>=menu1)</span><br><span class="line"> # 添加菜单项</span><br><span class="line"> menu1.add_command(<span class="attribute">label</span>=<span class="string">'关于作者'</span>, <span class="attribute">command</span>=lambda:webbrowser.open('http://inplus.top'))</span><br><span class="line"> menu1.add_separator()</span><br><span class="line"> menu1.add_command(<span class="attribute">label</span>=<span class="string">'退出'</span>, <span class="attribute">command</span>=self._quit)</span><br><span class="line"> </span><br><span class="line"> toLangDictList = [{<span class="string">'自动'</span>:<span class="string">'AUTO'</span>}, {<span class="string">'汉->日'</span>:<span class="string">'ja'</span>}, {<span class="string">'汉->韩'</span>:<span class="string">'ko'</span>}, {<span class="string">'汉->法'</span>:<span class="string">'fr'</span>}, {<span class="string">'汉->俄'</span>:<span class="string">'ru'</span>}, {<span class="string">'汉->西班牙'</span>:<span class="string">'es'</span>}, {<span class="string">'汉->葡萄牙'</span>:<span class="string">'pt'</span>}, {<span class="string">'汉->越'</span>:<span class="string">'vi'</span>}]</span><br><span class="line"></span><br><span class="line"> # 控件内容设置</span><br><span class="line"> # 使用grid布局需要填写行列</span><br><span class="line"> # 使用pack的side布局方式可以依次排开</span><br><span class="line"> # ipadx控制左右内边距,ipady控制上下内边距</span><br><span class="line"> # padx控制左右外边距,padx控制上下外边距</span><br><span class="line"> # row控制行数,column控制列数</span><br><span class="line"> # rowspan控制占据行数,columnspan控制占据列数</span><br><span class="line"> # sticky控制位置,W、N、S、E、W+N等等八个方位</span><br><span class="line"> ttk.Label(frame1, <span class="attribute">text</span>=<span class="string">"模式:"</span>).pack(side=tk.LEFT)</span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(len(toLangDictList)):</span><br><span class="line"> textKey = list(toLangDictList[i].keys())[0]</span><br><span class="line"> textValue = list(toLangDictList[i].values())[0]</span><br><span class="line"> # Radiobutton的indicatoron默认为1,当设置成0时,则其外观是Sunken</span><br><span class="line"> tk.Radiobutton(frame1, <span class="attribute">text</span>=textKey, <span class="attribute">variable</span>=self.radio, <span class="attribute">value</span>=textValue, <span class="attribute">command</span>=lambda:self.text_translateAnsy(1), <span class="attribute">indicatoron</span>=0).pack(side=tk.LEFT)</span><br><span class="line"> label1 = ttk.Label(frame2, <span class="attribute">text</span>=<span class="string">"请输入要翻译的文本:"</span>)</span><br><span class="line"> self.text1 = tk.Text(frame2, <span class="attribute">height</span>=6, <span class="attribute">width</span>=35)</span><br><span class="line"> translateButton1 = ttk.Button(frame2, <span class="attribute">text</span>=<span class="string">"翻译▼"</span>, <span class="attribute">command</span>=lambda:self.text_translateAnsy(1))</span><br><span class="line"> translateButton3 = ttk.Button(frame2, <span class="attribute">text</span>=<span class="string">"从剪贴板翻译"</span>, <span class="attribute">command</span>=self.pasteAndExecute)</span><br><span class="line"> label2 = ttk.Label(frame2, <span class="attribute">text</span>=<span class="string">"翻译结果:"</span>)</span><br><span class="line"> self.text2 = tk.Text(frame2, <span class="attribute">height</span>=6, <span class="attribute">width</span>=35)</span><br><span class="line"> translateButton2 = ttk.Button(frame2, <span class="attribute">text</span>=<span class="string">"自动▲"</span>, <span class="attribute">command</span>=lambda:self.text_translateAnsy(2))</span><br><span class="line"> translateButton4 = ttk.Button(frame2, <span class="attribute">text</span>=<span class="string">"复制结果到剪贴板"</span>, <span class="attribute">command</span>=lambda:pyperclip.copy(self.text2.get(1.0, tk.END)[:-1]))</span><br><span class="line"> </span><br><span class="line"> self.proBar = ttk.Progressbar(frame3, <span class="attribute">length</span>=200, <span class="attribute">mode</span>=<span class="string">"determinate"</span>, <span class="attribute">orient</span>=tk.HORIZONTAL)</span><br><span class="line"> self.proBar[<span class="string">"maximum"</span>] = 100</span><br><span class="line"> self.proBar[<span class="string">"value"</span>] = 0</span><br><span class="line"> # ttk需要使用style</span><br><span class="line"> style = ttk.Style()</span><br><span class="line"> style.configure(<span class="string">"BW.TLabel"</span>, <span class="attribute">foreground</span>=<span class="string">'red'</span>, font=(<span class="string">'楷体'</span>, 12, <span class="string">'bold'</span>))</span><br><span class="line"> label_tip = ttk.Label(frame3, <span class="attribute">text</span>=<span class="string">'作者:风澈'</span>, <span class="attribute">style</span>=<span class="string">"BW.TLabel"</span>)</span><br><span class="line"></span><br><span class="line"> frame1.pack(<span class="attribute">pady</span>=10)</span><br><span class="line"> frame2.pack()</span><br><span class="line"> frame3.pack()</span><br><span class="line"> </span><br><span class="line"> label1.grid(<span class="attribute">row</span>=2, <span class="attribute">column</span>=0)</span><br><span class="line"> self.text1.grid(<span class="attribute">row</span>=2, <span class="attribute">column</span>=1, <span class="attribute">rowspan</span>=2)</span><br><span class="line"> translateButton1.grid(<span class="attribute">row</span>=3, <span class="attribute">column</span>=2)</span><br><span class="line"> translateButton3.grid(<span class="attribute">row</span>=3, <span class="attribute">column</span>=0, <span class="attribute">padx</span>=5)</span><br><span class="line"> label2.grid(<span class="attribute">row</span>=4, <span class="attribute">column</span>=0)</span><br><span class="line"> self.text2.grid(<span class="attribute">row</span>=4, <span class="attribute">column</span>=1, <span class="attribute">rowspan</span>=2)</span><br><span class="line"> translateButton2.grid(<span class="attribute">row</span>=4, <span class="attribute">column</span>=2)</span><br><span class="line"> translateButton4.grid(<span class="attribute">row</span>=5, <span class="attribute">column</span>=0, <span class="attribute">padx</span>=5)</span><br><span class="line"> </span><br><span class="line"> label_tip.grid(<span class="attribute">row</span>=1, <span class="attribute">column</span>=0)</span><br><span class="line"></span><br><span class="line"> <span class="string">""</span><span class="string">"</span></span><br><span class="line"><span class="string"> 创建线程,异步调用</span></span><br><span class="line"><span class="string"> "</span><span class="string">""</span></span><br><span class="line"> def text_translateAnsy(self, mode):</span><br><span class="line"> <span class="keyword">if</span> self.nextFlag == 1:</span><br><span class="line"> return</span><br><span class="line"> translateT = threading.Thread(<span class="attribute">target</span>=self.text_translate, args=(mode,))</span><br><span class="line"> translateT.setDaemon(<span class="literal">True</span>)</span><br><span class="line"> translateT.start()</span><br><span class="line"> self.progressT = threading.Thread(<span class="attribute">target</span>=self._progressGo(), args=(mode,))</span><br><span class="line"> self.progressT.start()</span><br><span class="line"></span><br><span class="line"> <span class="string">""</span><span class="string">"</span></span><br><span class="line"><span class="string"> 函数说明:执行翻译</span></span><br><span class="line"><span class="string"> "</span><span class="string">""</span></span><br><span class="line"> def text_translate(self, mode):</span><br><span class="line"> self.nextFlag = 1</span><br><span class="line"> # 主通道</span><br><span class="line"> urlMain = <span class="string">'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'</span></span><br><span class="line"> # 备用通道</span><br><span class="line"> urlBak = <span class="string">'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'</span></span><br><span class="line"> # text1翻译至text2</span><br><span class="line"> <span class="keyword">if</span> mode == 1:</span><br><span class="line"> textGet = self.text1</span><br><span class="line"> textSet = self.text2</span><br><span class="line"> toLang = self.radio.<span class="builtin-name">get</span>()</span><br><span class="line"> # text2翻译至text1</span><br><span class="line"> <span class="keyword">if</span> mode == 2:</span><br><span class="line"> textGet = self.text2</span><br><span class="line"> textSet = self.text1</span><br><span class="line"> toLang = <span class="string">'AUTO'</span></span><br><span class="line"> <span class="keyword">if</span> self.errorFlag == 1:</span><br><span class="line"> urlMain = urlBak</span><br><span class="line"> # 获取将要源text的值,并剔除最后一个字符,即text自带的一个换行符</span><br><span class="line"> contentWord = textGet.<span class="builtin-name">get</span>(1.0, tk.END)[:-1]</span><br><span class="line"> # 因为有道网页是textarea,识别\r\n但不识别\n,在此做替换 </span><br><span class="line"> contentWord.replace(<span class="string">'\n'</span>, <span class="string">'\r\n'</span>)</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> contentWord:</span><br><span class="line"> self.nextFlag = 0</span><br><span class="line"> self.proBar.grid_forget()</span><br><span class="line"> return</span><br><span class="line"> translateResults = self.conn(urlMain, contentWord, <span class="string">'AUTO'</span> , toLang)</span><br><span class="line"> # 找到翻译结果</span><br><span class="line"> try:</span><br><span class="line"> <span class="keyword">if</span> translateResults[<span class="string">"errorCode"</span>] == 0:</span><br><span class="line"> newResult = <span class="string">''</span></span><br><span class="line"> <span class="keyword">for</span> translateResult <span class="keyword">in</span> translateResults[<span class="string">"translateResult"</span>]:</span><br><span class="line"> newResult += translateResult[0][<span class="string">'tgt'</span>] + <span class="string">'\n'</span></span><br><span class="line"></span><br><span class="line"> elif translateResults[<span class="string">"errorCode"</span>] == 40:</span><br><span class="line"> newResult = <span class="string">'输入个汉语呗~~'</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> mBox.showerror(<span class="attribute">title</span>=<span class="string">'小y温馨提示'</span>, <span class="attribute">message</span>=<span class="string">'网络连接异常'</span>)</span><br><span class="line"> self.nextFlag = 0</span><br><span class="line"> self.proBar.grid_forget()</span><br><span class="line"> return</span><br><span class="line"> except:</span><br><span class="line"> # 异常时启用备用地址翻译</span><br><span class="line"> <span class="keyword">if</span> self.errorFlag == 0:</span><br><span class="line"> self.errorFlag = 1</span><br><span class="line"> return self.text_translate(mode)</span><br><span class="line"> mBox.showerror(<span class="attribute">title</span>=<span class="string">'小y温馨提示'</span>, <span class="attribute">message</span>=<span class="string">'网络连接异常'</span>)</span><br><span class="line"> self.nextFlag = 0</span><br><span class="line"> self.proBar.grid_forget()</span><br><span class="line"> return</span><br><span class="line"> # 结束前设置进度条100,显得更符合逻辑</span><br><span class="line"> self.proBar[<span class="string">"value"</span>] = 100</span><br><span class="line"> self.root.update()</span><br><span class="line"> textSet.delete(1.0, tk.END)</span><br><span class="line"> textSet.insert(tk.INSERT, newResult[:-1])</span><br><span class="line"> self.nextFlag = 0</span><br><span class="line"> self.proBar.grid_forget()</span><br><span class="line"> </span><br><span class="line"> <span class="string">""</span><span class="string">"</span></span><br><span class="line"><span class="string"> 函数说明:连接服务器执行翻译</span></span><br><span class="line"><span class="string"> "</span><span class="string">""</span></span><br><span class="line"> def conn(self, url, contentWord, fromLang, toLang):</span><br><span class="line"> # 构造有道的加密参数</span><br><span class="line"> <span class="built_in"> client </span>= <span class="string">"fanyideskweb"</span></span><br><span class="line"> ts = int(time.time() * 1000)</span><br><span class="line"> salt = str(ts + random.randint(1, 10))</span><br><span class="line"> flowerStr = <span class="string">"p09@Bn{h02_BIEe]<span class="variable">$P</span>^nG"</span></span><br><span class="line"> sign = hashlib.md5((client + contentWord + salt + flowerStr).encode(<span class="string">'utf-8'</span>)).hexdigest()</span><br><span class="line"> bv = <span class="string">'9deb57d53879cce82ff92bccf83a3e4c'</span></span><br><span class="line"> # 创建Form_Data字典,存储请求体</span><br><span class="line"> Form_Data = {}</span><br><span class="line"> # 需要翻译的文字</span><br><span class="line"> Form_Data[<span class="string">'i'</span>] = contentWord</span><br><span class="line"> # 下面这些都先按照我们之前抓包获取到的数据</span><br><span class="line"> Form_Data[<span class="string">'from'</span>] = fromLang</span><br><span class="line"> Form_Data[<span class="string">'to'</span>] = toLang</span><br><span class="line"> Form_Data[<span class="string">'smartresult'</span>] = <span class="string">'dict'</span></span><br><span class="line"> Form_Data[<span class="string">'client'</span>] = client</span><br><span class="line"> Form_Data[<span class="string">'salt'</span>] = salt</span><br><span class="line"> Form_Data[<span class="string">'sign'</span>] = sign</span><br><span class="line"> Form_Data[<span class="string">'ts'</span>] = ts</span><br><span class="line"> Form_Data[<span class="string">'bv'</span>] = bv</span><br><span class="line"> Form_Data[<span class="string">'doctype'</span>] = <span class="string">'json'</span></span><br><span class="line"> Form_Data[<span class="string">'version'</span>] = <span class="string">'2.1'</span></span><br><span class="line"> Form_Data[<span class="string">'keyfrom'</span>] = <span class="string">'fanyi.web'</span></span><br><span class="line"> Form_Data[<span class="string">'action'</span>] = <span class="string">'FY_BY_REALTIME'</span></span><br><span class="line"> Form_Data[<span class="string">'typoResult'</span>] = <span class="string">'false'</span></span><br><span class="line"> # 对数据进行字节流编码处理</span><br><span class="line"> data = parse.urlencode(Form_Data).encode(<span class="string">'utf-8'</span>)</span><br><span class="line"> # 创建Request对象</span><br><span class="line"> req = request.Request(<span class="attribute">url</span>=url, <span class="attribute">data</span>=data, <span class="attribute">method</span>=<span class="string">'POST'</span>)</span><br><span class="line"> # 写入header信息</span><br><span class="line"> req.add_header(<span class="string">'User-Agent'</span>, <span class="string">'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'</span>)</span><br><span class="line"> req.add_header(<span class="string">'cookie'</span>, <span class="string">'OUTFOX_SEARCH_USER_ID=-1626129620@10.168.8.63'</span>)</span><br><span class="line"> req.add_header(<span class="string">'Referer'</span>, <span class="string">'http://fanyi.youdao.com/'</span>)</span><br><span class="line"> # 传入创建好的Request对象</span><br><span class="line"> try:</span><br><span class="line"> # 超时时间设置3秒</span><br><span class="line"> response = request.urlopen(req, <span class="attribute">timeout</span>=3)</span><br><span class="line"> except:</span><br><span class="line"> return</span><br><span class="line"> # 读取信息并解码</span><br><span class="line"> html = response.read().decode(<span class="string">'utf-8'</span>)</span><br><span class="line"> # 使用JSON</span><br><span class="line"> return json.loads(html)</span><br><span class="line"></span><br><span class="line"> <span class="string">''</span><span class="string">'</span></span><br><span class="line"><span class="string">从剪贴板粘贴并执行翻译</span></span><br><span class="line"><span class="string"> '</span><span class="string">''</span></span><br><span class="line"> def pasteAndExecute(self):</span><br><span class="line"> self.text1.delete(1.0, tk.END)</span><br><span class="line"> self.text1.insert(tk.INSERT, pyperclip.paste())</span><br><span class="line"> self.text_translateAnsy(1)</span><br><span class="line"> </span><br><span class="line"> <span class="string">""</span><span class="string">"</span></span><br><span class="line"><span class="string"> 函数说明:tkinter窗口居中</span></span><br><span class="line"><span class="string"> "</span><span class="string">""</span></span><br><span class="line"> def center(self):</span><br><span class="line"> ws = self.root.winfo_screenwidth()</span><br><span class="line"> hs = self.root.winfo_screenheight()</span><br><span class="line"> x = int((ws / 2) - (self.w / 2))</span><br><span class="line"> y = int((hs / 2) - (self.h / 2))</span><br><span class="line"> self.root.geometry(<span class="string">'{}x{}+{}+{}'</span>.format(self.w, self.h, x, y))</span><br><span class="line"></span><br><span class="line"> <span class="string">""</span><span class="string">"</span></span><br><span class="line"><span class="string"> 函数说明:loop等待用户事件</span></span><br><span class="line"><span class="string"> "</span><span class="string">""</span></span><br><span class="line"> def loop(self):</span><br><span class="line"> # 禁止修改窗口大小</span><br><span class="line"> self.root.resizable(<span class="literal">False</span>, <span class="literal">False</span>)</span><br><span class="line"> # 窗口居中</span><br><span class="line"> self.center()</span><br><span class="line"> # 设置图标</span><br><span class="line"> self.root.iconbitmap(r<span class="string">'resource\youdao.ico'</span>)</span><br><span class="line"> # 光标焦点</span><br><span class="line"> self.text1.focus()</span><br><span class="line"> self.root.mainloop()</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line"> app = YOUDAO() # 实例化APP对象</span><br><span class="line"> app.loop() # loop等待用户事件</span><br></pre></td></tr></table></figure></p><p>通过此篇文章,你学会了吗?</p><hr><p>参考资料:<br><a href="https://docs.python.org/3/library/tkinter.html" target="_blank" rel="noopener">https://docs.python.org/3/library/tkinter.html</a><br><a href="https://wiki.python.org/moin/TkInter" target="_blank" rel="noopener">https://wiki.python.org/moin/TkInter</a><br><a href="https://docs.python.org/3/library/tkinter.ttk.html" target="_blank" rel="noopener">https://docs.python.org/3/library/tkinter.ttk.html</a><br><a href="https://cloud.tencent.com/developer/section/1372347" target="_blank" rel="noopener">https://cloud.tencent.com/developer/section/1372347</a><br><a href="https://cloud.tencent.com/developer/section/1372352" target="_blank" rel="noopener">https://cloud.tencent.com/developer/section/1372352</a><br><a href="https://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html" target="_blank" rel="noopener">https://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/youdao-spider-bottom/youdao-spider-bottom-0.jpg" class="img-center-slider"><br> 上一篇我们讲到分析有道翻译接口请求,并利用python3构造参数爬取接口。在本篇中,我将会针对有道翻译接口进行图形化界面的设计。</p>
<h4 id="一、器欲尽其能,必先得其法。"><a href="#一、器欲尽其能,必先得其法。" class="headerlink" title="一、器欲尽其能,必先得其法。"></a>一、器欲尽其能,必先得其法。</h4><p> 像java中的<code>AWT</code>和<code>Swing</code>一样,在python3中也自带了GUI工具包,利用其中的<code>Tkinter</code>组件,我们可以方便快捷的设计我们的图形界面。</p>
<p>PS:需要注意的是,在python2和python3中其导入方式存在差异。<br><figure class="highlight capnproto"><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"><span class="comment"># Python2.x:</span></span><br><span class="line"><span class="keyword">from</span> Tkinter <span class="keyword">import</span> *</span><br><span class="line"><span class="comment"># Python3.x:</span></span><br><span class="line"><span class="keyword">from</span> tkinter <span class="keyword">import</span> *</span><br></pre></td></tr></table></figure></p>
</summary>
<category term="python" scheme="http://inplus.top/tags/python/"/>
<category term="爬虫" scheme="http://inplus.top/tags/%E7%88%AC%E8%99%AB/"/>
</entry>
<entry>
<title>python3爬虫之有道翻译(上)</title>
<link href="http://inplus.top/archives/youdao-spider-top/"/>
<id>http://inplus.top/archives/youdao-spider-top/</id>
<published>2018-07-27T19:25:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-0.jpg" class="img-center-slider"><br> 平时偶尔会用到翻译工具,其中最常用的就是有道翻译了,web端的有道翻译,在早期是直接可以爬到接口来使用的,但自从有道翻译推出他的API服务的时候,就对这个接口做了反爬虫的机制,从而来推广他的付费接口服务。这个反爬虫机制在爬虫领域算是一个非常经典的技术手段,今天我们就来对它一探究竟吧。</p><a id="more"></a><h4 id="一、莫听穿林打叶声,何妨吟啸且徐行。"><a href="#一、莫听穿林打叶声,何妨吟啸且徐行。" class="headerlink" title="一、莫听穿林打叶声,何妨吟啸且徐行。"></a>一、莫听穿林打叶声,何妨吟啸且徐行。</h4><p>首先我们使用chrome浏览器打开有道翻译的链接:<a href="http://fanyi.youdao.com" target="_blank" rel="noopener">http://fanyi.youdao.com</a><br>然后使用<code>F12</code>或<code>ctrl+shift+i</code>唤起“开发者工具”,鼠标右键点击<code>检查</code>一样,也就是审查元素,选择<code>Network</code>网络监听窗口,如下图所示,之后页面中所有的请求都会在这里显示出来:<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-1.png" class="img-center-normal"></p><p>接着我们在左侧翻译的窗口输入我们需要翻译的文字,比如输入“你好”,然后浏览器就会向有道发起异步ajax请求,在下面就可以看到所有的请求:<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-2.png" class="img-center-normal"></p><p>我们点开第一条请求,在<code>Headers</code>可以看到,在进行翻译的时候,发送的请求就是图中<code>Request URL</code>后的URL:<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-3.png" class="img-center-normal"></p><p>接着我们滚动到最下面,可以看到有一个<code>Form Data</code>的地方,这是请求时所携带的参数,这些数据就是在翻译的时候浏览器给服务器发送的数据:<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-4.png" class="img-center-normal"><br><em>Tip:在我们请求多次后,发现每次翻译时有些参数固定不变,而有些参数会动态变化,这就是我们破解有道反爬虫机制的关键点,后面会讲到。</em></p><p>然后再点击<code>Response</code>,这里就是接口返回的结果:<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-5.png" class="img-center-normal"></p><p>最后我们选择<code>Application</code>应用窗口,点击左侧<code>Storage</code>-<code>Cookies</code>,选择有道翻译的域名,这里存储的是cookie信息,cookie校验也是反爬虫的常见手段,这也是我们后面需要注意的:<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-6.png" class="img-center-normal"></p><h4 id="二、工欲善其事,必先利其器。"><a href="#二、工欲善其事,必先利其器。" class="headerlink" title="二、工欲善其事,必先利其器。"></a>二、工欲善其事,必先利其器。</h4><blockquote><p>运行平台:Windows<br>Python版本:Python3.x<br>IDE:Eclipse + PyDev插件</p></blockquote><p>到现在为止,我们得到了url和入参,我们就可以简单写一个爬虫,去调用有道翻译的接口了,我们选用python3来进行爬虫编写。<br>这里使用的是Python3自带的网络请求库urllib,也伪造一下包括cookie在内的请求头,相关代码如下:<br><figure class="highlight routeros"><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">import json</span><br><span class="line"><span class="keyword">from</span> urllib import parse</span><br><span class="line"><span class="keyword">from</span> urllib import request</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 等待用户输入需要翻译的单词</span></span><br><span class="line">i = input(<span class="string">'请输入需要翻译的句子:'</span>)</span><br><span class="line"><span class="comment"># 有道翻译的url链接</span></span><br><span class="line">url = <span class="string">'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'</span></span><br><span class="line"><span class="comment"># 创建Form_Data字典,存储请求体</span></span><br><span class="line">Form_Data = {}</span><br><span class="line"><span class="comment"># 需要翻译的文字</span></span><br><span class="line">Form_Data[<span class="string">'i'</span>] = i</span><br><span class="line"><span class="comment"># 下面这些都先按照我们之前抓包获取到的数据</span></span><br><span class="line">Form_Data[<span class="string">'from'</span>] = <span class="string">'AUTO'</span></span><br><span class="line">Form_Data[<span class="string">'to'</span>] = <span class="string">'AUTO'</span></span><br><span class="line">Form_Data[<span class="string">'smartresult'</span>] = <span class="string">'dict'</span></span><br><span class="line">Form_Data[<span class="string">'client'</span>] = <span class="string">'fanyideskweb'</span></span><br><span class="line">Form_Data[<span class="string">'salt'</span>] = <span class="string">'15326858088180'</span></span><br><span class="line">Form_Data[<span class="string">'sign'</span>] = <span class="string">'4805445cac590750301ad08319a79675'</span></span><br><span class="line">Form_Data[<span class="string">'ts'</span>] = <span class="string">'1532685808818'</span></span><br><span class="line">Form_Data[<span class="string">'bv'</span>] = <span class="string">'9deb57d53879cce82ff92bccf83a3e4c'</span></span><br><span class="line">Form_Data[<span class="string">'doctype'</span>] = <span class="string">'json'</span></span><br><span class="line">Form_Data[<span class="string">'version'</span>] = <span class="string">'2.1'</span></span><br><span class="line">Form_Data[<span class="string">'keyfrom'</span>] = <span class="string">'fanyi.web'</span></span><br><span class="line">Form_Data[<span class="string">'action'</span>] = <span class="string">'FY_BY_REALTIME'</span></span><br><span class="line">Form_Data[<span class="string">'typoResult'</span>] = <span class="string">'false'</span></span><br><span class="line"><span class="comment"># 对数据进行字节流编码处理</span></span><br><span class="line">data = parse.urlencode(Form_Data).encode(<span class="string">'utf-8'</span>)</span><br><span class="line"><span class="comment"># 创建Request对象</span></span><br><span class="line">req = request.Request(<span class="attribute">url</span>=url, <span class="attribute">data</span>=data, <span class="attribute">method</span>=<span class="string">'POST'</span>)</span><br><span class="line"><span class="comment"># 写入header信息</span></span><br><span class="line">req.add_header(<span class="string">'User-Agent'</span>, <span class="string">'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'</span>)</span><br><span class="line">req.add_header(<span class="string">'cookie'</span>, <span class="string">'OUTFOX_SEARCH_USER_ID=-1626129620@10.168.8.63'</span>)</span><br><span class="line">req.add_header(<span class="string">'Referer'</span>, <span class="string">'http://fanyi.youdao.com/'</span>)</span><br><span class="line"><span class="comment"># 传入创建好的Request对象</span></span><br><span class="line">response = request.urlopen(req, <span class="attribute">timeout</span>=5)</span><br><span class="line"><span class="comment"># 读取信息并进行字节流解码</span></span><br><span class="line">html = response.read().decode(<span class="string">'utf-8'</span>)</span><br><span class="line"><span class="comment"># 把返回来的json字符串解析成字典</span></span><br><span class="line">translate_results = json.loads(html)</span><br><span class="line"><span class="comment"># 打印返回信息</span></span><br><span class="line"><span class="builtin-name">print</span>(<span class="string">"返回的结果是:%s"</span> % translate_results)</span><br></pre></td></tr></table></figure></p><p>我们运行这个文件后,当我们输入的是“你好”的时候,我们可以得到“hello”的这个正确的翻译结果。而当我们输入其他需要翻译的字符串的时候,比如输入“我爱你”,那么就会得到一个错误代码<code>{'errorCode': 50}</code>,这就是有道词典的反爬虫机制,接下来我们就来一步一步破解它。</p><h4 id="三、横看成岭侧成峰,远近高低各不同。"><a href="#三、横看成岭侧成峰,远近高低各不同。" class="headerlink" title="三、横看成岭侧成峰,远近高低各不同。"></a>三、横看成岭侧成峰,远近高低各不同。</h4><p>我们刚才有讲到,在有道翻译web页面尝试进行了多次翻译,并且每次翻译后都去查看相应的网络请求入参,比较每次请求的<code>Form Data</code>的值,我们注意到,除<code>i</code>代表翻译的源字符串以外,<code>salt</code>和<code>sign</code>以及<code>ts</code>这三个参数是动态变化的,其他的参数都是固定值。<br>这里我分别用“great”和“date”两个单词翻译时候<code>Form Data</code>的数据进行比较:<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-7.png" class="img-center-normal"></p><p>经过多次变换语种等尝试,观察键值的变化,我们可以对请求携带的参数有如下猜测:</p><ul><li>i:需要进行翻译的字符串</li><li>from:源语言的语种</li><li>to:翻译后的语种</li><li>smartresult:智能结果,固定值</li><li>client:客户端,固定值</li><li>salt:加密用到的盐,待定</li><li>sign:签名字符串,待定</li><li>ts:毫秒时间戳</li><li>bv:未知的md5值,固定值</li><li>doctype:文档类型,固定值</li><li>version:版本,固定值</li><li>keyfrom:键来源,固定值</li><li>action:操作动作,固定值</li><li>typoResult:是否打印错误,固定值</li></ul><p>那么这三个动态参数的值是怎么产生的呢?这里我们可以分析一下,这三个值在每次请求的时候都不一样,只有两种情况:<br>第一是每次翻译的时候,浏览器会从有道服务器获取这三个值。这样可以达到每次翻译的时候值不同的需求。<br>第二是在本地,用js代码按照一定的规则生成的。<br>那么我们首先来看第一个情况,我们可以看到在每次发送翻译请求的时候,并没有一个请求是专门用来获取这几个值的:<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-8.png" class="img-center-normal"></p><p>所以就可以排除了第一种情况。就只剩下一种可能,那就是在本地自己生成的,如果是在本地自己生成的,那么规则是什么呢?</p><h4 id="四、欲穷千里目,更上一层楼。"><a href="#四、欲穷千里目,更上一层楼。" class="headerlink" title="四、欲穷千里目,更上一层楼。"></a>四、欲穷千里目,更上一层楼。</h4><p>这里我们点击<code>Elements</code>审查元素,查看网页源代码,查找所有的js文件,找到一个<code>fanyi.min.js</code>:<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-9.png" class="img-center-normal"></p><p>同样,我们在<code>Sources</code>-<code>Page</code>中也可以看到该js文件:<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-10.png" class="img-center-normal"></p><p>打开该js文件,可以看到该js是被压缩过的,我们复制出来使用在线格式化工具对齐进行格式化,然后把格式化后的代码,复制下来,用编辑器打开,然后搜索<code>salt</code>,可以找到相关的代码片段:<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-11.jpg" class="img-center-normal"></p><p>这里我们就可以发现动态值的生成原理了:</p><ul><li>i:需要进行翻译的字符串的前5000字</li><li>salt:当前毫秒时间戳与10以内随机数字字符串的拼接</li><li>sign:”fanyideskweb”+i+salt+”p09@Bn{h02_BIEe]$P^nG”的md5值</li><li>ts:当前毫秒时间戳</li></ul><p>在得到<code>salt</code>和<code>sign</code>以及<code>ts</code>的生成原理后,我们就可以开始进一步改写Python代码,来对接有道的接口了:<br><figure class="highlight routeros"><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></pre></td><td class="code"><pre><span class="line">import json</span><br><span class="line">import random</span><br><span class="line">import time</span><br><span class="line">import hashlib</span><br><span class="line"><span class="keyword">from</span> urllib import parse</span><br><span class="line"><span class="keyword">from</span> urllib import request</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 等待用户输入需要翻译的单词</span></span><br><span class="line">i = input(<span class="string">'请输入需要翻译的句子:'</span>)</span><br><span class="line"><span class="comment"># 有道翻译的url链接</span></span><br><span class="line">url = <span class="string">'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'</span></span><br><span class="line"><span class="comment"># 构造有道的加密参数</span></span><br><span class="line">client = <span class="string">"fanyideskweb"</span></span><br><span class="line">ts = int(time.time() * 1000)</span><br><span class="line">salt = str(ts + random.randint(1, 10))</span><br><span class="line">flowerStr = <span class="string">"p09@Bn{h02_BIEe]<span class="variable">$P</span>^nG"</span></span><br><span class="line">sign = hashlib.md5((client + i + salt + flowerStr).encode(<span class="string">'utf-8'</span>)).hexdigest()</span><br><span class="line">bv = <span class="string">'9deb57d53879cce82ff92bccf83a3e4c'</span></span><br><span class="line"><span class="comment"># 创建Form_Data字典,存储请求体</span></span><br><span class="line">Form_Data = {}</span><br><span class="line"><span class="comment"># 需要翻译的文字</span></span><br><span class="line">Form_Data[<span class="string">'i'</span>] = i</span><br><span class="line"><span class="comment"># 下面这些都先按照我们之前抓包获取到的数据</span></span><br><span class="line">Form_Data[<span class="string">'from'</span>] = <span class="string">'AUTO'</span></span><br><span class="line">Form_Data[<span class="string">'to'</span>] = <span class="string">'AUTO'</span></span><br><span class="line">Form_Data[<span class="string">'smartresult'</span>] = <span class="string">'dict'</span></span><br><span class="line">Form_Data[<span class="string">'client'</span>] = client</span><br><span class="line">Form_Data[<span class="string">'salt'</span>] = salt</span><br><span class="line">Form_Data[<span class="string">'sign'</span>] = sign</span><br><span class="line">Form_Data[<span class="string">'ts'</span>] = ts</span><br><span class="line">Form_Data[<span class="string">'bv'</span>] = bv</span><br><span class="line">Form_Data[<span class="string">'doctype'</span>] = <span class="string">'json'</span></span><br><span class="line">Form_Data[<span class="string">'version'</span>] = <span class="string">'2.1'</span></span><br><span class="line">Form_Data[<span class="string">'keyfrom'</span>] = <span class="string">'fanyi.web'</span></span><br><span class="line">Form_Data[<span class="string">'action'</span>] = <span class="string">'FY_BY_REALTIME'</span></span><br><span class="line">Form_Data[<span class="string">'typoResult'</span>] = <span class="string">'false'</span></span><br><span class="line"><span class="comment"># 对数据进行字节流编码处理</span></span><br><span class="line">data = parse.urlencode(Form_Data).encode(<span class="string">'utf-8'</span>)</span><br><span class="line"><span class="comment"># 创建Request对象</span></span><br><span class="line">req = request.Request(<span class="attribute">url</span>=url, <span class="attribute">data</span>=data, <span class="attribute">method</span>=<span class="string">'POST'</span>)</span><br><span class="line"><span class="comment"># 写入header信息</span></span><br><span class="line">req.add_header(<span class="string">'User-Agent'</span>, <span class="string">'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'</span>)</span><br><span class="line">req.add_header(<span class="string">'cookie'</span>, <span class="string">'OUTFOX_SEARCH_USER_ID=-1626129620@10.168.8.63'</span>)</span><br><span class="line">req.add_header(<span class="string">'Referer'</span>, <span class="string">'http://fanyi.youdao.com/'</span>)</span><br><span class="line"><span class="comment"># 传入创建好的Request对象</span></span><br><span class="line">response = request.urlopen(req, <span class="attribute">timeout</span>=5)</span><br><span class="line"><span class="comment"># 读取信息并进行字节流解码</span></span><br><span class="line">html = response.read().decode(<span class="string">'utf-8'</span>)</span><br><span class="line"><span class="comment"># 把返回来的json字符串解析成字典</span></span><br><span class="line">translate_results = json.loads(html)</span><br><span class="line"><span class="comment"># 打印翻译结果</span></span><br><span class="line">translate_result = translate_results[<span class="string">"translateResult"</span>][0][0][<span class="string">'tgt'</span>]</span><br><span class="line"><span class="builtin-name">print</span>(<span class="string">"翻译的结果是:%s"</span> % translate_result)</span><br></pre></td></tr></table></figure></p><p>运行,输入内容,翻译结果,一气呵成,大功告成。<br><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-12.png" class="img-center-normal"></p><h4 id="五、纸上得来终觉浅,绝知此事要躬行。"><a href="#五、纸上得来终觉浅,绝知此事要躬行。" class="headerlink" title="五、纸上得来终觉浅,绝知此事要躬行。"></a>五、纸上得来终觉浅,绝知此事要躬行。</h4><p> 像有道翻译这样,通过用js在本地生成随机字符串的反爬虫机制,是爬虫经常会遇到的一个问题。授人以鱼不如授人以渔,还是但愿大家能多多实践与练习,在编写爬虫的过程中也能学到一些反爬虫的知识为我所用。希望通过以上的讲解,能为大家提供一种思路,以后再碰到这种问题的时候知道该如何解决,这样本篇文章的目的也就达到了。</p><p>写到这里的时候突然又有了新的想法,那就将此篇作为上篇,期待下一篇吧~</p><hr><p>特别感谢<a href="https://blog.csdn.net/c406495762" target="_blank" rel="noopener">@Jack-Cui</a> <a href="https://me.csdn.net/huangyong1314" target="_blank" rel="noopener">@南窗客斯黄</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/youdao-spider-top/youdao-spider-top-0.jpg" class="img-center-slider"><br> 平时偶尔会用到翻译工具,其中最常用的就是有道翻译了,web端的有道翻译,在早期是直接可以爬到接口来使用的,但自从有道翻译推出他的API服务的时候,就对这个接口做了反爬虫的机制,从而来推广他的付费接口服务。这个反爬虫机制在爬虫领域算是一个非常经典的技术手段,今天我们就来对它一探究竟吧。</p>
</summary>
<category term="python" scheme="http://inplus.top/tags/python/"/>
<category term="爬虫" scheme="http://inplus.top/tags/%E7%88%AC%E8%99%AB/"/>
</entry>
<entry>
<title>hello world之等腰三角形命题</title>
<link href="http://inplus.top/archives/helloworld-triangle/"/>
<id>http://inplus.top/archives/helloworld-triangle/</id>
<published>2018-05-02T09:11:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/helloworld-triangle/helloworld-triangle-0.png" class="img-center-logo"><br>铛里个铛,当里个当,闲言碎语不要讲,大家听我嚷一嗓~</p><p> Hello World 中文意思是『你好,世界』。泛指在计算机屏幕上输出“Hello World”这行字符串的计算机程序。一般来说,这是每一种计算机编程语言中最基本、最简单的程序,亦通常是初学者所编写的第一个程序。它还可以用来确定该语言的编译器、程序开发环境,以及运行环境是否已经安装妥当。因为在Brian Kernighan 和Dennis M. Ritchie合著的《The C Programming Language》中使用它做为第一个演示程序,非常著名,所以后来的程序员在学习编程或进行设备调试时延续了这一习惯。</p><p> 时隔 <strong>2 << 9</strong> 年一度的hello world大赛又开始了,本届大赛的命题是使用循环等来输出一个由*组成的等腰三角形,如下:<br><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="code"> *</span></span><br><span class="line"><span class="code"> ***</span></span><br><span class="line"> <span class="strong">*****</span></span><br><span class="line"> <span class="strong">*****</span>**</span><br><span class="line"> <span class="strong">*****</span><span class="emphasis">***</span>*</span><br><span class="line"><span class="strong">*****</span><span class="strong">*****</span>*</span><br></pre></td></tr></table></figure></p><a id="more"></a><p>作为一名有职业素养的码农,当然首先登场的是<em>Write Once, Run Anywhere</em>的来自爪哇的Java语言,让我们来看看他的表现:<br><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></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">Main</span> </span>{</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"><span class="keyword">int</span> n = <span class="number">6</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= n; i++) {</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = n - <span class="number">1</span>; j >= i; j--) {</span><br><span class="line">System.out.print(<span class="string">" "</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">1</span>; k <= i; k++) {</span><br><span class="line">System.out.print(<span class="string">"*"</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> h = <span class="number">1</span>; h < i; h++) {</span><br><span class="line">System.out.print(<span class="string">"*"</span>);</span><br><span class="line">}</span><br><span class="line">System.out.println();</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/helloworld-triangle/helloworld-triangle-1.png" class="img-center-normal"><br>当然,作为一名有职业素养的码农,线性函数少不了,少一个for循环,少一些烦恼~<br><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">Main</span> </span>{</span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"><span class="keyword">int</span> n = <span class="number">6</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i <= n; i++) {</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = n - <span class="number">1</span>; j >= i; j--) {</span><br><span class="line">System.out.print(<span class="string">" "</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">1</span>; k <= <span class="number">2</span> * i - <span class="number">1</span>; k++) {</span><br><span class="line">System.out.print(<span class="string">"*"</span>);</span><br><span class="line">}</span><br><span class="line">System.out.println();</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>老大哥C语言在背后也摩拳擦掌:<br><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><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="meta">#<span class="meta-keyword">include</span><span class="meta-string"><stdio.h></span></span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="keyword">int</span> n = <span class="number">6</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < n; i++) {</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> j = n - <span class="number">1</span>; j > i; j--)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">" "</span>);</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> k = <span class="number">0</span>; k < <span class="number">2</span> * i + <span class="number">1</span>; k++)</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"*"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/helloworld-triangle/helloworld-triangle-2.png" class="img-center-normal"><br>简单点,运行的方式简单点,编译的过程请省略,你又不是脚本语言~<br>给我一个浏览器,我能成就你一个等腰三角形,作为脚本语言,看下JavaScript的表现:<br><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> n = <span class="number">6</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">1</span>; i <= n; i++) {</span><br><span class="line"> <span class="keyword">var</span> str = <span class="string">""</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">var</span> j = n - <span class="number">1</span>; j >= i; j--) {</span><br><span class="line"> str += <span class="string">" "</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">var</span> j = <span class="number">1</span>; j <= <span class="number">2</span> * i - <span class="number">1</span>; j++) {</span><br><span class="line"> str += <span class="string">"*"</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="built_in">console</span>.log(str);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/helloworld-triangle/helloworld-triangle-3.png" class="img-center-normal"><br>当然,作为一名有职业素养的码农,思维当然不能仅仅局限于编程语言中,那么数据库SQL语言呢,以MySQL为例,我们可以利用存储过程来实现<br>MySQL闪亮登场,统统给我闪开:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line">DELIMITER $$</span><br><span class="line"></span><br><span class="line">DROP PROCEDURE IF EXISTS `printStar`$$</span><br><span class="line"></span><br><span class="line">CREATE PROCEDURE `printStar` (IN num INT) </span><br><span class="line">BEGIN</span><br><span class="line"> DECLARE line INT DEFAULT num ;</span><br><span class="line"> DECLARE enter TEXT DEFAULT '\n' ;</span><br><span class="line"> DECLARE star TEXT DEFAULT '*' ;</span><br><span class="line"> DECLARE starTemp TEXT DEFAULT '' ;</span><br><span class="line"> DECLARE blank TEXT DEFAULT ' ' ;</span><br><span class="line"> DECLARE i INT DEFAULT 0 ;</span><br><span class="line"> DECLARE j INT DEFAULT 0 ;</span><br><span class="line"> DECLARE k INT DEFAULT 0 ;</span><br><span class="line"> WHILE i < line DO </span><br><span class="line"> SET i = i + 1 ;</span><br><span class="line"> SET j = 0 ;</span><br><span class="line"> SET k = line - 1 ;</span><br><span class="line"> WHILE k >= i DO</span><br><span class="line">SET k = k - 1 ;</span><br><span class="line">SET starTemp = CONCAT(starTemp, blank) ;</span><br><span class="line"> END WHILE ;</span><br><span class="line"> WHILE j < 2 * i - 1 DO</span><br><span class="line">SET j = j + 1 ;</span><br><span class="line">SET starTemp = CONCAT(starTemp, star) ;</span><br><span class="line"> END WHILE ;</span><br><span class="line"> SET starTemp = CONCAT(starTemp, enter) ;</span><br><span class="line"> END WHILE ;</span><br><span class="line"> SELECT starTemp ;</span><br><span class="line">END $$</span><br><span class="line">DELIMITER ;</span><br><span class="line"></span><br><span class="line">CALL printStar(6);</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/helloworld-triangle/helloworld-triangle-4.png" class="img-center-normal"><br>啊啊啊~<br>SQLServer、Oracle等SQL家族还在场下蠢蠢欲动,没想到半路杀出个python,看到MySQL那冗长的存储过程,python3表示短小精悍才是硬道理:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">n = 6</span><br><span class="line">for i in range(1, n + 1):</span><br><span class="line"> for j in range(n - i):</span><br><span class="line"> print(' ', end='')</span><br><span class="line"> for k in range(2 * i - 1):</span><br><span class="line"> print('*', end='')</span><br><span class="line"> print()</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/helloworld-triangle/helloworld-triangle-5.png" class="img-center-normal"><br>咦~咦~咦~(场下嘘声一片),看起来传说中的python也没简洁到哪嘛!<br>只见他的嘴角微微一笑,<br>当然,我还可以这样:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">n = 6</span><br><span class="line">for i in range(1, n + 1):</span><br><span class="line"> print(' ' * (n - i), '*' * (2 * i - 1))</span><br></pre></td></tr></table></figure></p><p>python默默的挥了挥衣袖,只留下众人痴呆的表情,胶水语言不发威还真以为我是hello world。。。</p><hr><p>人生苦短,我用派森</p><p>以上</p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/helloworld-triangle/helloworld-triangle-0.png" class="img-center-logo"><br>铛里个铛,当里个当,闲言碎语不要讲,大家听我嚷一嗓~</p>
<p> Hello World 中文意思是『你好,世界』。泛指在计算机屏幕上输出“Hello World”这行字符串的计算机程序。一般来说,这是每一种计算机编程语言中最基本、最简单的程序,亦通常是初学者所编写的第一个程序。它还可以用来确定该语言的编译器、程序开发环境,以及运行环境是否已经安装妥当。因为在Brian Kernighan 和Dennis M. Ritchie合著的《The C Programming Language》中使用它做为第一个演示程序,非常著名,所以后来的程序员在学习编程或进行设备调试时延续了这一习惯。</p>
<p> 时隔 <strong>2 &lt;&lt; 9</strong> 年一度的hello world大赛又开始了,本届大赛的命题是使用循环等来输出一个由*组成的等腰三角形,如下:<br><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="code"> *</span></span><br><span class="line"><span class="code"> ***</span></span><br><span class="line"> <span class="strong">*****</span></span><br><span class="line"> <span class="strong">*****</span>**</span><br><span class="line"> <span class="strong">*****</span><span class="emphasis">***</span>*</span><br><span class="line"><span class="strong">*****</span><span class="strong">*****</span>*</span><br></pre></td></tr></table></figure></p>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
</entry>
<entry>
<title>windows环境搭建hadoop伪集群</title>
<link href="http://inplus.top/archives/windows-hadoop/"/>
<id>http://inplus.top/archives/windows-hadoop/</id>
<published>2018-03-19T23:11:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/windows-hadoop/windows-hadoop-0.png" class="img-center-logo"><br> 在当前日益兴盛的大数据(big data)时代,hadoop和它的生态体系从中脱颖问出,因为我们开发环境大多在windows上,但因安全策略限制等原因不方便用虚拟机运行Linux和租用云服务器怎么办,不要慌,windows同样可以完美搭建起来hadoop的环境。</p><h3 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h3><p>windows 7-64bit<br>jdk-1.8.0_161<br>hadoop-2.7.1</p><a id="more"></a><h3 id="操作步骤"><a href="#操作步骤" class="headerlink" title="操作步骤"></a>操作步骤</h3><h4 id="一、下载并安装jdk"><a href="#一、下载并安装jdk" class="headerlink" title="一、下载并安装jdk"></a>一、下载并安装jdk</h4><p>下载和安装的过程就不多说了,需要注意的是记得设置好JAVA_HOME系统环境变量,因为hadoop的配置文件中用到了这个参数。</p><blockquote><p>我采用的jdk是1.8的,配置JAVA_HOME,如果默认安装,会安装在<code>C:\Program Files\Java\jdk1.8.0_161</code>。此目录存在空格,启动hadoop时将报错,<code>JAVA_HOME is incorrect ...</code>。建议安装在<code>D:\Java\jdk1.8.0_161</code>,如果已经安装过了,也不用怕,此时只需要将环境变量JAVA_HOME值中的<code>Program Files</code>替换为<code>Progra~1</code>。如:<code>C:\Progra~1\Java\jdk1.8.0_161</code>。</p></blockquote><h4 id="二、安装配置hadoop"><a href="#二、安装配置hadoop" class="headerlink" title="二、安装配置hadoop"></a>二、安装配置hadoop</h4><h5 id="1、下载"><a href="#1、下载" class="headerlink" title="1、下载"></a>1、下载</h5><p><a href="http://hadoop.apache.org/" target="_blank" rel="noopener">http://hadoop.apache.org/</a><br><a href="https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common" target="_blank" rel="noopener">https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common</a><br>官网和各镜像站提供了最新版本的各个下载包<br><a href="http://archive.apache.org/dist/hadoop/core" target="_blank" rel="noopener">http://archive.apache.org/dist/hadoop/core</a><br>这边我从归档站下载了hadoop-2.7.1的tar包</p><h5 id="2、解压并配置环境变量"><a href="#2、解压并配置环境变量" class="headerlink" title="2、解压并配置环境变量"></a>2、解压并配置环境变量</h5><p>复制到D盘根目录直接解压,出来一个目录<code>D:\hadoop-2.7.1</code>,配置到环境变量<code>HADOOP_HOME</code>中,在PATH里加上<code>%HADOOP_HOME%\bin;</code></p><h5 id="3、下载windows专用二进制文件和工具类依赖库"><a href="#3、下载windows专用二进制文件和工具类依赖库" class="headerlink" title="3、下载windows专用二进制文件和工具类依赖库"></a>3、下载windows专用二进制文件和工具类依赖库</h5><p>hadoop在windows上运行需要winutils支持和hadoop.dll等文件<br><a href="https://github.com/steveloughran/winutils" target="_blank" rel="noopener">https://github.com/steveloughran/winutils</a><br>在github仓库中找到对应版本的二进制库<code>hadoop.dll</code>和<code>winutils.exe</code>文件,然后把文件拷贝到<code>D:\hadoop-2.7.1\bin</code>目录中去</p><blockquote><p>注意hadoop.dll等文件不要与hadoop冲突,若出现依赖性错误可以将<code>hadoop.dll</code>放到<code>C:\Windows\System32</code>下一份。</p></blockquote><h5 id="4、hadoop环境测试"><a href="#4、hadoop环境测试" class="headerlink" title="4、hadoop环境测试"></a>4、hadoop环境测试</h5><p>启动windows cmd命令行窗口执行<code>hadoop version</code>,显示如下:<br><img src="/assets/blogImg/windows-hadoop/windows-hadoop-1.png" class="img-center-normal"></p><h5 id="5、最小化配置hadoop伪集群"><a href="#5、最小化配置hadoop伪集群" class="headerlink" title="5、最小化配置hadoop伪集群"></a>5、最小化配置hadoop伪集群</h5><p>去<code>D:\hadoop-2.7.1\etc\hadoop</code>找到下面4个文件并按如下最小配置粘贴上去:</p><p><strong>core-site.xml</strong><br><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></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">configuration</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>fs.defaultFS<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">value</span>></span>hdfs://localhost:9000<span class="tag"></<span class="name">value</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">property</span>></span> </span><br><span class="line"><span class="tag"></<span class="name">configuration</span>></span></span><br></pre></td></tr></table></figure></p><p><strong>hdfs-site.xml</strong> (将value的路径改为自己的路径,盘符<code>/d:/</code>的前后都有正斜杠)<br><figure class="highlight dts"><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="params"><configuration></span></span><br><span class="line"> <span class="params"><property></span></span><br><span class="line"> <span class="params"><name></span>dfs.replication<span class="params"></name></span></span><br><span class="line"> <span class="params"><value></span><span class="number">1</span><span class="params"></value></span></span><br><span class="line"> <span class="params"></property></span></span><br><span class="line"> <span class="params"><property></span> </span><br><span class="line"> <span class="params"><name></span>dfs.namenode.name.dir<span class="params"></name></span> </span><br><span class="line"> <span class="params"><value></span>/d:/hadoop<span class="number">-2.7</span><span class="number">.1</span><span class="meta-keyword">/data/</span>dfs/namenode<span class="params"></value></span> </span><br><span class="line"> <span class="params"></property></span> </span><br><span class="line"> <span class="params"><property></span> </span><br><span class="line"> <span class="params"><name></span>dfs.datanode.data.dir<span class="params"></name></span> </span><br><span class="line"> <span class="params"><value></span>/d:/hadoop<span class="number">-2.7</span><span class="number">.1</span><span class="meta-keyword">/data/</span>dfs/datanode<span class="params"></value></span> </span><br><span class="line"> <span class="params"></property></span></span><br><span class="line"><span class="params"></configuration></span></span><br></pre></td></tr></table></figure></p><p><strong>mapred-site.xml</strong> (拷贝<code>mapred-site.xml.template</code>并改名)<br><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></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">configuration</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>mapreduce.framework.name<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">value</span>></span>yarn<span class="tag"></<span class="name">value</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">property</span>></span></span><br><span class="line"><span class="tag"></<span class="name">configuration</span>></span></span><br></pre></td></tr></table></figure></p><p><strong>yarn-site.xml</strong><br><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></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">configuration</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>yarn.nodemanager.aux-services<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">value</span>></span>mapreduce_shuffle<span class="tag"></<span class="name">value</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>yarn.nodemanager.aux-services.mapreduce.shuffle.class<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">value</span>></span>org.apache.hadoop.mapred.ShuffleHandler<span class="tag"></<span class="name">value</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">property</span>></span></span><br><span class="line"><span class="tag"></<span class="name">configuration</span>></span></span><br></pre></td></tr></table></figure></p><h5 id="6、格式化namenode并启动hadoop"><a href="#6、格式化namenode并启动hadoop" class="headerlink" title="6、格式化namenode并启动hadoop"></a>6、格式化namenode并启动hadoop</h5><p>启动windows cmd命令行窗口执行<code>hdfs namenode -format</code>,待执行完毕没有报错即可,不需要重复format:</p><p><img src="/assets/blogImg/windows-hadoop/windows-hadoop-2.png" class="img-center-normal"></p><p>执行完毕后hadoop目录会多出<code>data</code>文件夹:</p><p><img src="/assets/blogImg/windows-hadoop/windows-hadoop-3.png" class="img-center-normal"></p><p>格式化完成后到hadoop的<code>sbin</code>目录下执行<code>start-all.cmd</code>启动hadoop</p><p><img src="/assets/blogImg/windows-hadoop/windows-hadoop-4.png" class="img-center-normal"></p><p>再启动一个新的windows cmd命令行窗口执行<code>jps</code></p><p><img src="/assets/blogImg/windows-hadoop/windows-hadoop-5.png" class="img-center-normal"></p><p>通过<code>jps</code>命令可以看到ResourceManager、NameNode、NodeManager、DataNode这4个进程都拉起来了,到这里hadoop的安装启动已经完成了。</p><p>接着我们可以用浏览器<br>到<code>localhost:8088</code>看mapreduce任务<br><img src="/assets/blogImg/windows-hadoop/windows-hadoop-6.png" class="img-center-normal"></p><p>到<code>localhost:50070</code> –> <code>Utilites</code> –> <code>Browse the file system</code>看hdfs文件。<br><img src="/assets/blogImg/windows-hadoop/windows-hadoop-7.png" class="img-center-normal"></p><p>如果需要重启hadoop无需再格式化<code>namenode</code>,只要<code>stop-all.cmd</code>再<code>start-all.cmd</code>就可以了。</p><hr><p>参考文档:<br><a href="https://wiki.apache.org/hadoop/Hadoop2OnWindows" target="_blank" rel="noopener">https://wiki.apache.org/hadoop/Hadoop2OnWindows</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/windows-hadoop/windows-hadoop-0.png" class="img-center-logo"><br> 在当前日益兴盛的大数据(big data)时代,hadoop和它的生态体系从中脱颖问出,因为我们开发环境大多在windows上,但因安全策略限制等原因不方便用虚拟机运行Linux和租用云服务器怎么办,不要慌,windows同样可以完美搭建起来hadoop的环境。</p>
<h3 id="环境"><a href="#环境" class="headerlink" title="环境"></a>环境</h3><p>windows 7-64bit<br>jdk-1.8.0_161<br>hadoop-2.7.1</p>
</summary>
<category term="hadoop" scheme="http://inplus.top/tags/hadoop/"/>
<category term="大数据" scheme="http://inplus.top/tags/%E5%A4%A7%E6%95%B0%E6%8D%AE/"/>
</entry>
<entry>
<title>NoSQL之闻名遐迩Redis</title>
<link href="http://inplus.top/archives/nosql-redis/"/>
<id>http://inplus.top/archives/nosql-redis/</id>
<published>2018-01-25T09:11:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/nosql-redis/nosql-redis-0.png" class="img-center-logo"></p><h3 id="一、NoSQL简介"><a href="#一、NoSQL简介" class="headerlink" title="一、NoSQL简介"></a>一、NoSQL简介</h3><p> NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。<br> NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入,NoSQL的非关系特性助力大型Web2.0网站的再次起飞,使其成为了后Web2.0时代的宠儿。<br><a id="more"></a></p><h4 id="单机时代模型"><a href="#单机时代模型" class="headerlink" title="单机时代模型"></a>单机时代模型</h4><p><img src="/assets/blogImg/nosql-redis/nosql-redis-1.png" class="img-center-normal"><br> 如果每次存储成千上万条数据,这样很会导致mysql的性能很差,存储以及读取速度很慢,然后就演变成缓存+mysql+垂直拆分的方式。</p><h4 id="Cache作为中间缓存"><a href="#Cache作为中间缓存" class="headerlink" title="Cache作为中间缓存"></a>Cache作为中间缓存</h4><p><img src="/assets/blogImg/nosql-redis/nosql-redis-2.png" class="img-center-normal"><br> 将所有的数据先保存到缓存中,然后再存入mysql中,减小数据库压力,提高效率。<br> 但是当数据再次增加到又一个量级,上面的方式也不能满足需求,由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。 </p><h4 id="主从分离模式"><a href="#主从分离模式" class="headerlink" title="主从分离模式"></a>主从分离模式</h4><p><img src="/assets/blogImg/nosql-redis/nosql-redis-3.png" class="img-center-normal"><br> 在redis的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。 </p><h4 id="分表分库模式"><a href="#分表分库模式" class="headerlink" title="分表分库模式"></a>分表分库模式</h4><p><img src="/assets/blogImg/nosql-redis/nosql-redis-4.png" class="img-center-normal"><br> 将变化小的、业务相关的放在一个数据库,变化多的,不相关的数据放在一个数据库。</p><h3 id="二、NoSQL的风声水起"><a href="#二、NoSQL的风声水起" class="headerlink" title="二、NoSQL的风声水起"></a>二、NoSQL的风声水起</h3><p><img src="/assets/blogImg/nosql-redis/nosql-redis-5.png" class="img-center-normal"><br> 随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题:</p><h5 id="1-对数据库高并发读写的需求"><a href="#1-对数据库高并发读写的需求" class="headerlink" title="1. 对数据库高并发读写的需求"></a>1. 对数据库高并发读写的需求</h5><p> 网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。</p><h5 id="2-对海量数据的高效率存储和访问的需求"><a href="#2-对海量数据的高效率存储和访问的需求" class="headerlink" title="2. 对海量数据的高效率存储和访问的需求"></a>2. 对海量数据的高效率存储和访问的需求</h5><p> 对于大型的SNS网站,每天用户产生海量的用户动态,以国外的Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。</p><h5 id="3-对数据库的高可扩展性和高可用性的需求"><a href="#3-对数据库的高可扩展性和高可用性的需求" class="headerlink" title="3. 对数据库的高可扩展性和高可用性的需求"></a>3. 对数据库的高可扩展性和高可用性的需求</h5><p> 在基于Web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像Web服务器和应用服务器那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供7*24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?</p><p> 在上面提到的“三高”的需求面前,关系数据库遇到了难以克服的障碍,而对于Web2.0网站来说,关系数据库的很多主要特性却往往无用武之地,例如:</p><h5 id="1-数据库事务一致性需求"><a href="#1-数据库事务一致性需求" class="headerlink" title="1. 数据库事务一致性需求"></a>1. 数据库事务一致性需求</h5><p> 很多Web实时系统并不要求严格的数据库事务,对读一致性的要求很低,有些场合对写一致性要求也不高。因此数据库事务管理成了数据库高负载下一个沉重的负担。</p><h5 id="2-数据库的写实时性和读实时性需求"><a href="#2-数据库的写实时性和读实时性需求" class="headerlink" title="2. 数据库的写实时性和读实时性需求"></a>2. 数据库的写实时性和读实时性需求</h5><p> 对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的。并不要求这么高的实时性。</p><h5 id="3-对复杂的SQL查询,特别是多表关联查询的需求"><a href="#3-对复杂的SQL查询,特别是多表关联查询的需求" class="headerlink" title="3. 对复杂的SQL查询,特别是多表关联查询的需求"></a>3. 对复杂的SQL查询,特别是多表关联查询的需求</h5><p> 任何大数据量的Web系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的复杂SQL报表查询,特别是SNS类型的网站,从需求以及产品设计角度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。</p><blockquote><p>而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。<br><img src="/assets/blogImg/nosql-redis/nosql-redis-6.png" class="img-center-normal"></p></blockquote><h3 id="三、NoSQL无与伦比的特点"><a href="#三、NoSQL无与伦比的特点" class="headerlink" title="三、NoSQL无与伦比的特点"></a>三、NoSQL无与伦比的特点</h3><p>在大数据存取上具备关系型数据库无法比拟的性能优势,例如:</p><h5 id="1-易扩展"><a href="#1-易扩展" class="headerlink" title="1. 易扩展"></a>1. 易扩展</h5><p> NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。</p><h5 id="2-大数据量,高性能"><a href="#2-大数据量,高性能" class="headerlink" title="2. 大数据量,高性能"></a>2. 大数据量,高性能</h5><p> NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。</p><h5 id="3-多样灵活的数据模型"><a href="#3-多样灵活的数据模型" class="headerlink" title="3. 多样灵活的数据模型"></a>3. 多样灵活的数据模型</h5><p> 在NoSQL中不仅可以存储String,hash,set、Zset等数据类型,还可以保存javaBean以及多种复杂的数据类型。NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。这点在大数据量的Web2.0时代尤其明显。</p><h5 id="4-高可用"><a href="#4-高可用" class="headerlink" title="4. 高可用"></a>4. 高可用</h5><p> NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如Cassandra,HBase模型,通过复制模型也能实现高可用。</p><h3 id="四、Redis的脱颖而出"><a href="#四、Redis的脱颖而出" class="headerlink" title="四、Redis的脱颖而出"></a>四、Redis的脱颖而出</h3><p><img src="/assets/blogImg/nosql-redis/nosql-redis-7.png" class="img-center-logo"></p><h4 id="1、redis简介"><a href="#1、redis简介" class="headerlink" title="1、redis简介"></a>1、redis简介</h4><p> redis是NoSQL数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型,类似于Java中的map)。Redis基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSql数据库之一,也被人们称为数据结构服务器。</p><h4 id="2、redis特点"><a href="#2、redis特点" class="headerlink" title="2、redis特点"></a>2、redis特点</h4><ol><li>速度快<br>Redis是用C语言实现的;<br>Redis的所有数据存储在内存中。 </li><li>持久化<br>Redis的所有数据存储在内存中,对数据的更新将异步地保存到磁盘上。 </li><li>支持多种数据结构<br>Redis支持五种数据结构:String、List、Set、Hash、Zset </li><li>支持多种编程语言<br>Java、php、Python、Ruby、Lua、Node.js </li><li>功能丰富<br>除了支持五种数据结构之外,还支持事务、流水线、发布/订阅、消息队列等功能。 </li><li>源码简单<br>约23000行C语言源代码。 </li><li>主从复制<br>主服务器(master)执行添加、修改、删除,从服务器执行查询。 </li><li>高可用及分布式<br>Redis-Sentinel(v2.8)支持高可用<br>Redis-Cluster(v3.0)支持分布式</li></ol><p> 和Memcached类似,Redis支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set –有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步(数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。)。<br> 因此,Redis的出现,很大程度补偿了Memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。</p><h4 id="3、如何使用redis"><a href="#3、如何使用redis" class="headerlink" title="3、如何使用redis?"></a>3、如何使用redis?</h4><p> 你一定要知道的是:redis的key名要区分大小写,在redis中除了 和空格外,其他的字符都可以做为key名,且长度不做限制,不过为了性能考虑,一般key名不要设置的太长。redis功能强大,支持数据类型丰富,以下是redis操作命令大全,基本上涵盖了redis所有的命令!</p><h5 id="1、redis命令基本篇"><a href="#1、redis命令基本篇" class="headerlink" title="1、redis命令基本篇"></a>1、redis命令基本篇</h5><ul><li>【 set key value 】 存入一个key和值。如:set myname reson</li><li>【 get key 】 读取一个key的值。</li><li>【 del key 】 删除一个key。</li><li>【 del key1 key2 … keyN 】 删除多个key。如:del myname1 myname2</li><li>【 exists key 】 判断一个key是否存在。</li><li>【 type key 】 查看key的类型。</li><li>【 rename key keyNew 】 重命名key名。如:rename myname myname2</li><li>【 dbsize 】 查看当前库中的key的条数。</li><li>【 expire key time 】 指定key的过期时间,单位为秒。如:expire myname 9(设置9秒后过期)</li><li>【 ttl key 】 查看redis有多长时间过期,单位为秒。</li><li>【 keys * 】 列出当前库中所有的key名。</li><li>【 keys a* 】 列出当前库中所有以字符串“a”开头的key。</li><li>【 select db-index 】 选择一个数据库,如选择第一个数据库:select 0;选择第二个 select 1;默认有16个数据库,这个值可以在redis.conf中配置。</li><li>【 flushdb 】 清掉当前库中所有的key(生产环境下需谨慎操作)。</li><li>【 flushall 】 清掉所有库中全部的key(生产环境下需谨慎操作)。</li><li>【 mset key1 value1 key2 value2 … keyN valueN 】 一次性存入多个key和值。</li><li>【 mget key1 key2 … keyN 】 一次性读取多个key。</li><li>【 incr key 】 可以对key类型+1的操作(相当于编程语言里面的++),只能操作number型,操作字符串会报错。可对新值进行操作。</li><li>【 decr key 】 可以对key类型-1的操作(相当于编程语言里面的–),只能操作number型,操作字符串会报错。</li><li>【 incrby key num 】 同incr,对key的值加num,比如 incrby aa 10,对aa+10。</li><li>【 decrby key num 】 同上,对key的值减num。</li><li>【 append key value 】 对指定key的字符串进行追加,如果key为整形,会被转为字符串。如aa的值为9,执行append aa 10后,会变成910。 </li><li>【 substr key start end 】 对key进行截取start到end个字符。如aa的值为:abcdef,执行substr aa 2 3后,返回“cd”。</li></ul><h5 id="2、redis链表类型(list)命令"><a href="#2、redis链表类型(list)命令" class="headerlink" title="2、redis链表类型(list)命令"></a>2、redis链表类型(list)命令</h5><ul><li>【 lpush key value 】 往队列头部插入一个元素</li><li>【 rpush key value 】 从尾部插入一个元素</li><li>【 lpop key 】 从队列头部删掉一个元素</li><li>【 rpop key 】 从队列尾部删掉一个元素,并返回被删除元素的值</li><li>【 llen 】 返回队列的长度,即里面有多少个元素。不存在key返回0,不为队列类型的key会返回报错。</li><li>【 lrange key start end 】 返回队列从start到end之间的元素信息。</li><li>【 ltrim key start end 】 截取一个队列,只保留指定区间内的元素。</li></ul><h5 id="3、redis无序集合set类型命令"><a href="#3、redis无序集合set类型命令" class="headerlink" title="3、redis无序集合set类型命令"></a>3、redis无序集合set类型命令</h5><ul><li>【 sadd key vaule 】 往集合中插入一个元素,如果value值已存在集合中,则返回0,不会被重复插入。</li><li>【 sinter key1 key2 … keyN 】 取出n个key之间的交集。比如 key1里面有值a,b,c,d,e,key2里面有d,e,f,sinter key1 key2返回d,e。</li><li>【 sunion key1 key2 … keyN 】 取出n个key之间的并集。比如 key1里面有值a,b,c,d,e,key2里面有d,e,f,sunion key1 key2返回a,b,c,d,e,f。</li><li>【 sdiff key1 key2 】 取出n个key之间的差集。比如 key1里面有值a,b,c,d,e,key2里面有d,e,f,sdiff key1 key2返回a,b,c;反过来sdiff key2 key1返回f。</li><li>【 smembers key 】 返回key集合中所有的元素,结果是无序的。</li><li>【 sismember key value 】 查看value这个值是否在key集合中。存在返回1,不存在返回0。</li><li>【 scard key 】 返回集合中有多少个元素。</li><li>【 smove key1 key2 value 】 把value从key1中移到key2中去。</li><li>【 srem key value1 value2 … valueN 】 从key集合中删掉某些元素。</li></ul><h5 id="4、redis有序集合sorted-set命令"><a href="#4、redis有序集合sorted-set命令" class="headerlink" title="4、redis有序集合sorted set命令"></a>4、redis有序集合sorted set命令</h5><ul><li>【 zadd key v k 】 往key中添加一个元素,k为键,v为值。如:zadd artHits 99 12表示id为12的文章点击量为99次。</li><li>【 zrange key start end 】 根据v的值由小到大进行排序来获得start到end之间的元素。<br>注:0表示第一个元素,-1表示最后一个元素,-2表示倒数第二个元素,以此类推,如果要获取第一个到倒数第三个之间的元素,命令为:zrange key 0 -3。</li><li>【 zrevrange key start end 】 同上,根据v的值由大到小进行排序来获得start到end之间的元素。可以轻松取出点击量最高的前n篇文章。</li><li>【 zremrangebyrank key start end 】 删除集合中的元素。排序的方式为按照v由小到大的顺序,如果要删除key集合中的第一个值,则运行 zremrangebyrank artHits 0 0;删除前3个值:zremrangebyrank artHits 0 2。</li><li>【 zcard 】 返回key集合中元素的个数。</li><li>【 zrank key k 】 返回值k在集合key中排第几位,是按照v由小到大的顺序。排第一名返回0,第二返回1,以此类推。</li><li>【 zrevrank key k 】 同上,不同的是,按照v由大到小的顺序。可以轻松取出点击量最高的文章。</li><li>【 zscore key k 】 取出集合key中键为k对应的值v。</li><li>【 zrem key k 】 删除集合中指定元素。</li><li>【 zincrby key num k 】 给集合key中的元素k加上num,值针对整型。比如 zincrby artHits 3 12,给id为12的文章加上3个点击量。此时zscore artHits 12的结果是99+3为102。</li></ul><h5 id="5、redis哈希hash类型命令"><a href="#5、redis哈希hash类型命令" class="headerlink" title="5、redis哈希hash类型命令"></a>5、redis哈希hash类型命令</h5><ul><li>【 hset key field value 】 设置hash field为指定值,如果key不存在,则先创建。</li><li>【 hmset key field1 value1 … fieldN valueN 】 同时设置多个值。</li><li>【 hget key field 】 获取指定的hash field</li><li>【 hmget key field1 field1 … fieldN 】 获取指定的多个hash field</li><li>【 hincrby key field num 】 将指定的hash field加上指定的值。</li><li>【 hexists key field 】 查看指定field是否存在。</li><li>【 hdel key field 】 删除指定的hash field。</li><li>【 hlen key 】 返回指定hash中field的数量。</li><li>【 hkeys key 】 返回hash所有的field。</li><li>【 hvals 】 返回hash中所有的value。</li><li>【 hgetall key 】 返回hash中所有的field和value。</li></ul>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/nosql-redis/nosql-redis-0.png" class="img-center-logo"></p>
<h3 id="一、NoSQL简介"><a href="#一、NoSQL简介" class="headerlink" title="一、NoSQL简介"></a>一、NoSQL简介</h3><p> NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。<br> NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入,NoSQL的非关系特性助力大型Web2.0网站的再次起飞,使其成为了后Web2.0时代的宠儿。<br>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<category term="Redis" scheme="http://inplus.top/tags/Redis/"/>
<category term="NoSQL" scheme="http://inplus.top/tags/NoSQL/"/>
</entry>
<entry>
<title>JVM的内存区域划分</title>
<link href="http://inplus.top/archives/jvm-memory-division/"/>
<id>http://inplus.top/archives/jvm-memory-division/</id>
<published>2017-11-09T09:11:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/jvm-memory-division/jvm-memory-division-0.png" class="img-center-logo"><br> 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?<br> 由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。</p><a id="more"></a><p> 在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程:<br><img src="/assets/blogImg/jvm-memory-division/jvm-memory-division-1.jpg" class="img-center-normal"><br> 如上图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)。<br> 在知道了JVM内存是什么东西之后,下面我们就来讨论一下这段空间具体是如何划分区域的,是不是也像C语言中一样也存在栈和堆呢?</p><h3 id="一、运行时数据区包括哪几部分?"><a href="#一、运行时数据区包括哪几部分?" class="headerlink" title="一、运行时数据区包括哪几部分?"></a>一、运行时数据区包括哪几部分?</h3><p> 根据《Java虚拟机规范》的规定,运行时数据区通常包括这几个部分:程序计数器(Program Counter Register)、Java栈(VM Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)。<br><img src="/assets/blogImg/jvm-memory-division/jvm-memory-division-2.jpg" class="img-center-normal"><br> 如上图所示,JVM中的运行时数据区应该包括这些部分。在JVM规范中虽然规定了程序在执行期间运行时数据区应该包括这几部分,但是至于具体如何实现并没有做出规定,不同的虚拟机厂商可以有不同的实现方式。</p><h3 id="二、运行时数据区的每部分到底存储了哪些数据?"><a href="#二、运行时数据区的每部分到底存储了哪些数据?" class="headerlink" title="二、运行时数据区的每部分到底存储了哪些数据?"></a>二、运行时数据区的每部分到底存储了哪些数据?</h3><p> 下面我们来了解一下运行时数据区的每部分具体用来存储程序执行过程中的哪些数据。</p><h4 id="1、程序计数器"><a href="#1、程序计数器" class="headerlink" title="1、程序计数器"></a>1、程序计数器</h4><p> 程序计数器(Program Counter Register),也有称作为PC寄存器。想必学过汇编语言的朋友对程序计数器这个概念并不陌生,在汇编语言中,程序计数器是指CPU中的寄存器,它保存的是程序当前执行的指令的地址(也可以说保存下一条指令的所在存储单元的地址),当CPU需要执行指令时,需要从程序计数器中得到当前需要执行的指令所在存储单元的地址,然后根据得到的地址获取到指令,在得到指令之后,程序计数器便自动加1或者根据转移指针得到下一条指令的地址,如此循环,直至执行完所有的指令。<br> 虽然JVM中的程序计数器并不像汇编语言中的程序计数器一样是物理概念上的CPU寄存器,但是JVM中的程序计数器的功能跟汇编语言中的程序计数器的功能在逻辑上是等同的,也就是说是用来指示 执行哪条指令的。<br> 由于在JVM中,多线程是通过线程轮流切换来获得CPU执行时间的,因此,在任一具体时刻,一个CPU的内核只会执行一条线程中的指令,因此,为了能够使得每个线程都在线程切换后能够恢复在切换之前的程序执行位置,每个线程都需要有自己独立的程序计数器,并且不能互相被干扰,否则就会影响到程序的正常执行次序。因此,可以这么说,程序计数器是每个线程所私有的。<br> 在JVM规范中规定,如果线程执行的是非native方法,则程序计数器中保存的是当前需要执行的指令的地址;如果线程执行的是native方法,则程序计数器中的值是undefined。<br> 由于程序计数器中存储的数据所占空间的大小不会随程序的执行而发生改变,因此,对于程序计数器是不会发生内存溢出现象(OutOfMemory)的。</p><h4 id="2、Java栈"><a href="#2、Java栈" class="headerlink" title="2、Java栈"></a>2、Java栈</h4><p> Java栈也称作虚拟机栈(Java Vitual Machine Stack),也就是我们常常所说的栈,跟C语言的数据段中的栈类似。事实上,Java栈是Java方法执行的内存模型。为什么这么说呢?下面就来解释一下其中的原因。<br> Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,在栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、指向当前方法所属的类的运行时常量池(运行时常量池的概念在方法区部分会谈到)的引用(Reference to runtime constant pool)、方法返回地址(Return Address)和一些额外的附加信息。当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。讲到这里,大家就应该会明白为什么 在 使用 递归方法的时候容易导致栈内存溢出的现象了以及为什么栈区的空间不用程序员去管理了(当然在Java中,程序员基本不用关系到内存分配和释放的事情,因为Java有自己的垃圾回收机制),这部分空间的分配和释放都是由系统自动实施的。对于所有的程序设计语言来说,栈这部分空间对程序员来说是不透明的。下图表示了一个Java栈的模型:<br><img src="/assets/blogImg/jvm-memory-division/jvm-memory-division-3.jpg" class="img-center-normal"><br> 局部变量表,顾名思义,想必不用解释大家应该明白它的作用了吧。就是用来存储方法中的局部变量(包括在方法中声明的非静态变量以及函数形参)。对于基本数据类型的变量,则直接存储它的值,对于引用类型的变量,则存的是指向对象的引用。局部变量表的大小在编译器就可以确定其大小了,因此在程序执行期间局部变量表的大小是不会改变的。<br> 操作数栈,想必学过数据结构中的栈的朋友想必对表达式求值问题不会陌生,栈最典型的一个应用就是用来对表达式求值。想想一个线程执行方法的过程中,实际上就是不断执行语句的过程,而归根到底就是进行计算的过程。因此可以这么说,程序中的所有计算过程都是在借助于操作数栈来完成的。<br> 指向运行时常量池的引用,因为在方法执行的过程中有可能需要用到类中的常量,所以必须要有一个引用指向运行时常量。<br> 方法返回地址,当一个方法执行完毕之后,要返回之前调用它的地方,因此在栈帧中必须保存一个方法返回地址。<br> 由于每个线程正在执行的方法可能不同,因此每个线程都会有一个自己的Java栈,互不干扰。</p><h4 id="3、本地方法栈"><a href="#3、本地方法栈" class="headerlink" title="3、本地方法栈"></a>3、本地方法栈</h4><p> 本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。在JVM规范中,并没有对本地方发展的具体实现方法以及数据结构作强制规定,虚拟机可以自由实现它。在HotSopt虚拟机中直接就把本地方法栈和Java栈合二为一。</p><h4 id="4、堆"><a href="#4、堆" class="headerlink" title="4、堆"></a>4、堆</h4><p> 在C语言中,堆这部分空间是唯一一个程序员可以管理的内存区域。程序员可以通过malloc函数和free函数在堆上申请和释放空间。那么在Java中是怎么样的呢?<br> Java中的堆是用来存储对象本身的以及数组(当然,数组引用是存放在Java栈中的)。只不过和C语言中的不同,在Java中,程序员基本不用去关心空间释放的问题,Java的垃圾回收机制会自动进行处理。因此这部分空间也是Java垃圾收集器管理的主要区域。另外,堆是被所有线程共享的,在JVM中只有一个堆。</p><h4 id="5、方法区"><a href="#5、方法区" class="headerlink" title="5、方法区"></a>5、方法区</h4><p> 方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。<br> 在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。<br> 在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。<br> 在JVM规范中,没有强制要求方法区必须实现垃圾回收。很多人习惯将方法区称为“永久代”,是因为HotSpot虚拟机以永久代来实现方法区,从而JVM的垃圾收集器可以像管理堆区一样管理这部分区域,从而不需要专门为这部分设计垃圾回收机制。不过自从JDK7之后,Hotspot虚拟机便将运行时常量池从永久代移除了。</p><hr><p>特别感谢<a href="http://www.cnblogs.com/dolphin0520/" target="_blank" rel="noopener">@海子</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/jvm-memory-division/jvm-memory-division-0.png" class="img-center-logo"><br> 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?<br> 由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。</p>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<category term="Java" scheme="http://inplus.top/tags/Java/"/>
</entry>
<entry>
<title>抓取数据包Packet Capture v1.4.7汉化精简版</title>
<link href="http://inplus.top/archives/packetcapture/"/>
<id>http://inplus.top/archives/packetcapture/</id>
<published>2017-11-05T18:43:32.000Z</published>
<updated>2017-02-09T17:29:20.000Z</updated>
<content type="html"><![CDATA[<p><img src="http://img.inplus.top/packetcapture-0.png-logo" alt></p><p>Packet Capture – 一款依托安卓系统自身VPN来达到免Root抓取数据包的应用程序。</p><p> Packet Capture一个使用SSL网络解密的 捕获数据包/网络嗅探 工具,虽然它的功能并不丰富,但是当你开发一个应用时,却不得不说它是一款强大的工具。Packet Capture通过自建一个vpn达到无root,通过中间人方便调试加密流量,流量还区分应用一目了然,这大概是目前最方便的抓包应用了吧。<br><a id="more"></a></p><p><strong>功能特点:</strong></p><ul><li>捕获网络数据包并记录下来</li><li>使用中间人技术进行SSL解密</li><li>无需root</li><li>方便快捷</li><li>以十六进制或文本来显示数据包</li></ul><p><img src="http://img.inplus.top/packetcapture-1.png-screenshot" alt> <img src="http://img.inplus.top/packetcapture-2.png-screenshot" alt></p><p><img src="http://img.inplus.top/packetcapture-3.png-screenshot" alt> <img src="http://img.inplus.top/packetcapture-4.png-screenshot" alt><br><strong>国际惯例:介绍截图没有更新</strong></p><figure class="highlight css"><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><br><span class="line"><span class="selector-tag">v1</span><span class="selector-class">.4</span><span class="selector-class">.7</span></span><br><span class="line"><span class="selector-tag">-</span> <span class="selector-tag">Added</span> <span class="selector-tag">image</span> <span class="selector-tag">decoder</span></span><br><span class="line"><span class="selector-tag">-</span> <span class="selector-tag">Minor</span> <span class="selector-tag">bug</span> <span class="selector-tag">fix</span></span><br><span class="line"><span class="selector-tag">v1</span><span class="selector-class">.3</span><span class="selector-class">.3</span></span><br><span class="line"><span class="selector-tag">Reduce</span> <span class="selector-tag">memory</span> <span class="selector-tag">usage</span> <span class="selector-tag">to</span> <span class="selector-tag">prevent</span> <span class="selector-tag">out</span> <span class="selector-tag">of</span> <span class="selector-tag">memory</span> <span class="selector-tag">crash</span>.</span><br><span class="line"><span class="selector-tag">v1</span><span class="selector-class">.2</span><span class="selector-class">.3</span>:</span><br><span class="line"><span class="selector-tag">UI</span> <span class="selector-tag">improvements</span>.</span><br><span class="line"><span class="selector-tag">-</span> <span class="selector-tag">Show</span> <span class="selector-tag">size</span> <span class="selector-tag">of</span> <span class="selector-tag">the</span> <span class="selector-tag">packet</span> <span class="selector-tag">dump</span> <span class="selector-tag">file</span>.</span><br><span class="line"><span class="selector-tag">-</span> <span class="selector-tag">Hide</span> <span class="selector-tag">packet</span> <span class="selector-tag">from</span> <span class="selector-tag">this</span> <span class="selector-tag">app</span> <span class="selector-tag">by</span> <span class="selector-tag">default</span>.</span><br></pre></td></tr></table></figure><p>Google Play:<br><a href="https://play.google.com/store/apps/details?id=app.greyshirts.sslcapture" target="_blank" rel="noopener">https://play.google.com/store/apps/details?id=app.greyshirts.sslcapture</a></p><hr><p><strong>修改说明:</strong></p><ol><li>极致精简,全包仅2.6M </li><li>完美简体汉化并剔除无用语言包</li><li>去除广告</li><li><del>更改包文本框属性,可直接复制报文文本(新版已自带)</del></li><li>剥离Google sdk</li><li>剥离Fabric sdk</li><li>剥离Crashlytics,禁用隐私统计</li><li>剥离LeakCanary,禁用内存泄漏统计</li><li>apk包体积优化</li><li>Zipalign对齐优化</li></ol><p><strong>修改人员:<a href>风澈vio</a>(转载必须注明出处)</strong></p><p><strong>下载地址:<a href="https://pan.baidu.com/s/1bpKdJ1l" target="_blank" rel="noopener">百度网盘</a> 密码:1024</strong></p><ul><li>注意:</li><li>使用者由此程序所造成的损失修改者不承担任何责任。</li><li>最终版权归原作者所有。</li><li>请在法律允许的范围内合理使用本程序。</li></ul>]]></content>
<summary type="html">
<p><img src="http://img.inplus.top/packetcapture-0.png-logo" alt></p>
<p>Packet Capture – 一款依托安卓系统自身VPN来达到免Root抓取数据包的应用程序。</p>
<p> Packet Capture一个使用SSL网络解密的 捕获数据包/网络嗅探 工具,虽然它的功能并不丰富,但是当你开发一个应用时,却不得不说它是一款强大的工具。Packet Capture通过自建一个vpn达到无root,通过中间人方便调试加密流量,流量还区分应用一目了然,这大概是目前最方便的抓包应用了吧。<br>
</summary>
<category term="App" scheme="http://inplus.top/tags/App/"/>
</entry>
<entry>
<title>照片编辑器Photo Editor Pro v2.8特别精简版</title>
<link href="http://inplus.top/archives/photoeditor/"/>
<id>http://inplus.top/archives/photoeditor/</id>
<published>2017-11-05T12:10:20.000Z</published>
<updated>2016-12-28T17:29:20.000Z</updated>
<content type="html"><![CDATA[<p><img src="http://img.inplus.top/photoeditor-0.png-logo" alt><br>Photo Editor Pro – 一款轻量级简单易用的照片处理应用程序。</p><p>调整照片的颜色,旋转、裁剪、调整大小、添加效果、相框,并可在照片上涂鸦。颜色调整选项包括色相、饱和度、对比度、和亮度。此外,Photo Editor为您的照片提供了各种各样的效果,包括伽玛校正、自动对比度、自动色阶、模糊、锐化、油性涂料、素描、黑 & 白高对比度、深棕,等等。</p><p><strong>功能特点:</strong></p><ul><li>调整照片的颜色,旋转、裁剪、调整大小、添加效果、相框,并可在照片上涂鸦。</li><li>使用曲线微调颜色。</li><li>涂鸦模式,添加文本或图片。</li><li>轻松旋转,剪裁或调整照片大小。</li></ul><a id="more"></a><ul><li>使用触摸和双指绽放界面轻松编辑照片。</li><li>从图库或相机载入照片。</li><li>保存照片为JPEG和PNG格式。灵活控制 JPEG品质。</li><li>查看、编辑或删除EXIF数据。</li><li>保存你的最终成果到图库或SD卡,或将其设置为壁纸。</li></ul><p><img src="http://img.inplus.top/photoeditor-1.png-screenshot" alt> <img src="http://img.inplus.top/photoeditor-2.png-screenshot" alt></p><p><img src="http://img.inplus.top/photoeditor-3.png-screenshot" alt> <img src="http://img.inplus.top/photoeditor-4.png-screenshot" alt><br><strong>国际惯例:介绍截图没有更新</strong></p><figure class="highlight mathematica"><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><br><span class="line">v2<span class="number">.8</span></span><br><span class="line">• Android Oreo(<span class="number">8.0</span>) support</span><br><span class="line">• Tools: GIF, <span class="keyword">PDF</span> improvements</span><br><span class="line">• ICC improvements</span><br><span class="line">• Bug fixes</span><br><span class="line">v2<span class="number">.4</span>:</span><br><span class="line">• <span class="keyword">Text</span>/<span class="keyword">Image</span>: <span class="keyword">Gradient</span> improvements</span><br><span class="line">• <span class="keyword">Text</span>/<span class="keyword">Image</span>: <span class="keyword">Background</span> round</span><br><span class="line">• Bug fixes</span><br><span class="line">v2<span class="number">.3</span>:</span><br><span class="line">• <span class="keyword">Text</span>/<span class="keyword">Image</span>: <span class="keyword">Image</span> background & padding</span><br><span class="line">• Tools: <span class="keyword">PDF</span> Capture (Lollipop+)</span><br><span class="line">• Bug fixes</span><br></pre></td></tr></table></figure><p>来源:<a href="https://www.iudesk.com" target="_blank" rel="noopener">https://www.iudesk.com</a><br>Google Play:<br><a href="https://play.google.com/store/apps/details?id=com.iudesk.android.photo.editor" target="_blank" rel="noopener">https://play.google.com/store/apps/details?id=com.iudesk.android.photo.editor</a></p><hr><p><strong>修改说明:</strong></p><ol><li>极致精简,全包仅1.9M,不影响稳定性</li><li>去除广告,解锁专业版</li><li>剔除无用菜单项,7栏变4栏 / <del>8宫变7宫</del> / 8宫变6宫</li><li>精简语言并剔除相关选项</li><li>彻底剔除Google sdk,告别Google服务检查和notify提醒</li><li>剔除无用权限 (保留网页截图所需要的联网权限)</li><li>去除第三方市场检测更新</li><li>apk包体积优化</li><li>Zipalign对齐优化</li><li><del>TinyPNG算法优化</del></li></ol><p><strong>修改人员:<a href>风澈vio</a>(转载必须注明出处)</strong></p><p><strong>下载地址:<a href="http://pan.baidu.com/s/1sleZW4X" target="_blank" rel="noopener">百度网盘</a> 密码:1024</strong></p><ul><li>注意:</li><li>使用者由此程序所造成的损失修改者不承担任何责任。</li><li>最终版权归原作者所有。</li><li>请在法律允许的范围内合理使用本程序。</li></ul>]]></content>
<summary type="html">
<p><img src="http://img.inplus.top/photoeditor-0.png-logo" alt><br>Photo Editor Pro – 一款轻量级简单易用的照片处理应用程序。</p>
<p>调整照片的颜色,旋转、裁剪、调整大小、添加效果、相框,并可在照片上涂鸦。颜色调整选项包括色相、饱和度、对比度、和亮度。此外,Photo Editor为您的照片提供了各种各样的效果,包括伽玛校正、自动对比度、自动色阶、模糊、锐化、油性涂料、素描、黑 &amp; 白高对比度、深棕,等等。</p>
<p><strong>功能特点:</strong></p>
<ul>
<li>调整照片的颜色,旋转、裁剪、调整大小、添加效果、相框,并可在照片上涂鸦。</li>
<li>使用曲线微调颜色。</li>
<li>涂鸦模式,添加文本或图片。</li>
<li>轻松旋转,剪裁或调整照片大小。</li>
</ul>
</summary>
<category term="App" scheme="http://inplus.top/tags/App/"/>
</entry>
<entry>
<title>多线程下载器ADM Pro v6.1.7特别修改版</title>
<link href="http://inplus.top/archives/adm/"/>
<id>http://inplus.top/archives/adm/</id>
<published>2017-10-05T19:18:32.000Z</published>
<updated>2017-03-17T15:18:32.000Z</updated>
<content type="html"><![CDATA[<p><img src="http://img.inplus.top/adm-0.png-logo" alt></p><p>ADM Pro – 一款强大的多线程下载神器。</p><p> PC端的IDM是众所周知的多线程下载利器,那么ADM Pro可以说是安卓设备上最强大的下载器了,ADM Pro,全名Advanced Download Manager Pro,是一款专业的多线程下载工具,提供下载文件的自动分类保存,下载完成后“关机/打开文件/退出程序”的计划下载任务,多线程同步下载,自定义UA标识以及智能限速功能,还可以设置同时下载的任务数,以及很多自带的工具,如内置浏览器和编辑器,代理端口。可谓是各种妙用,体积小巧却功能强大。</p><a id="more"></a><p><strong>功能特点:</strong></p><ul><li>强大的下载器</li><li>多线程下载</li><li>干净的界面</li><li>扩展通知</li><li>计划任务</li><li>智能限速</li><li>快速访问的内置浏览器</li><li>简单快捷控制的下载列表</li><li>更的高级下载管理器</li></ul><p><img src="http://img.inplus.top/adm-1.png-screenshot" alt> <img src="http://img.inplus.top/adm-2.png-screenshot" alt></p><p><img src="http://img.inplus.top/adm-3.png-screenshot" alt> <img src="http://img.inplus.top/adm-4.png-screenshot" alt><br><strong>国际惯例:介绍截图没有更新</strong></p><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">更新日志:</span><br><span class="line">Toolbar <span class="keyword">with</span> commands <span class="keyword">in</span> Editor</span><br><span class="line"><span class="keyword">Advanced</span> options <span class="keyword">in</span> Editor (<span class="keyword">path</span>, speed, etc.)</span><br><span class="line"><span class="keyword">Start</span>/<span class="keyword">Stop</span> <span class="keyword">in</span> <span class="keyword">context</span> menu, <span class="built_in">Interval</span> (<span class="keyword">select</span> <span class="keyword">all</span> <span class="keyword">between</span> two), Properties (see <span class="keyword">all</span> details)</span><br><span class="line">Editor <span class="keyword">and</span> Properties support batch <span class="keyword">mode</span> (<span class="keyword">select</span> downloads <span class="keyword">and</span> <span class="keyword">scroll</span> <span class="keyword">Left</span>/<span class="keyword">Right</span>, <span class="keyword">use</span> <span class="keyword">Settings</span> <span class="keyword">to</span> <span class="keyword">on</span>/<span class="keyword">off</span> visibility options)</span><br><span class="line">SD-Card <span class="keyword">in</span> <span class="keyword">Path</span> <span class="keyword">for</span> Editor <span class="keyword">and</span> Site Manager</span><br><span class="line">Send <span class="keyword">in</span> Automation - <span class="keyword">After</span> finished</span><br><span class="line"><span class="keyword">Quick</span> selection via <span class="string">"three-point"</span></span><br><span class="line"><span class="keyword">Select</span> <span class="keyword">all</span> <span class="keyword">in</span> menu <span class="keyword">List</span></span><br></pre></td></tr></table></figure><p>Google Play:<br><a href="https://play.google.com/store/apps/details?id=com.dv.adm.pay" target="_blank" rel="noopener">https://play.google.com/store/apps/details?id=com.dv.adm.pay</a></p><hr><p><strong>修改说明:</strong></p><ol><li>修改线程数上限为64<del>(2048双版齐发)</del></li><li>修改同时下载任务数上限为30</li><li><del>内置PC百度云UA(2048版)</del></li><li>默认搜索引擎从Google替换为Baidu</li><li>剔除无用语言</li><li>修正并补全部分汉化信息</li><li>更改应用名为ADM Pro+</li><li>apk包体积优化</li><li>Zipalign对齐优化</li></ol><p><strong>修改人员:<a href>风澈vio</a>(转载必须注明出处)</strong></p><p><strong>下载地址:</strong>※<a href="https://viosay.ctfile.com/dir/15555077-25339144-91a214/" target="_blank" rel="noopener">城通网盘</a>(进入下载列表-最下方普通低速单线程下载)※**</p><ul><li>注意:</li><li>使用者由此程序所造成的损失修改者不承担任何责任。</li><li>最终版权归原作者所有。</li><li>请在法律允许的范围内合理使用本程序。</li></ul>]]></content>
<summary type="html">
<p><img src="http://img.inplus.top/adm-0.png-logo" alt></p>
<p>ADM Pro – 一款强大的多线程下载神器。</p>
<p> PC端的IDM是众所周知的多线程下载利器,那么ADM Pro可以说是安卓设备上最强大的下载器了,ADM Pro,全名Advanced Download Manager Pro,是一款专业的多线程下载工具,提供下载文件的自动分类保存,下载完成后“关机/打开文件/退出程序”的计划下载任务,多线程同步下载,自定义UA标识以及智能限速功能,还可以设置同时下载的任务数,以及很多自带的工具,如内置浏览器和编辑器,代理端口。可谓是各种妙用,体积小巧却功能强大。</p>
</summary>
<category term="App" scheme="http://inplus.top/tags/App/"/>
</entry>
<entry>
<title>微软远程桌面RD Client v8.1.56.294汉化特别版</title>
<link href="http://inplus.top/archives/msrdclient/"/>
<id>http://inplus.top/archives/msrdclient/</id>
<published>2017-10-03T22:51:32.000Z</published>
<updated>2023-02-24T03:13:49.076Z</updated>
<content type="html"><![CDATA[<p><img src="http://img.inplus.top/msrdclient-0.png-logo" alt></p><p>Microsoft Remote Desktop – 一款微软官方发布的RDP远程桌面控制工具,方便在手机上控制电脑或服务器。</p><p><strong>功能特点:</strong></p><ul><li>通过远程桌面网关访问远程资源</li><li>远程桌面协议(RDP)和RemoteFX的支持Windows手势丰富的多点触控体验</li><li>安全连接到您的数据和突破网络层的认证申请(NLA)技术</li><li>从连接中心对所有远程连接进行简单的管理</li><li>高品质的视频和音频流媒体与改进的压缩和带宽使用</li><li>对Azure的RemoteApp的支持</li></ul><a id="more"></a><p><img src="http://img.inplus.top/msrdclient-1.png-screenshot" alt> <img src="http://img.inplus.top/msrdclient-2.png-screenshot" alt></p><p><img src="http://img.inplus.top/msrdclient-3.png-screenshot" alt> <img src="http://img.inplus.top/msrdclient-4.png-screenshot" alt></p><figure class="highlight routeros"><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">We fixed an issue <span class="keyword">for</span> Android O Preview<span class="built_in"> users </span>that caused graphics <span class="keyword">to</span> appear distorted when you connected <span class="keyword">to</span> a Windows PC <span class="keyword">or</span> server.</span><br></pre></td></tr></table></figure><p>来源:<a href="https://go.microsoft.com/fwlink/p/?LinkId=324281" target="_blank" rel="noopener">https://go.microsoft.com/fwlink/p/?LinkId=324281</a><br>Google Play:<br><a href="https://play.google.com/store/apps/details?id=com.microsoft.rdc.android" target="_blank" rel="noopener">https://play.google.com/store/apps/details?id=com.microsoft.rdc.android</a></p><hr><p><strong>修改说明:</strong></p><ol><li>简体中文汉化,嵌入式汉化</li><li>精简多余语言包</li><li>arm架构包体积精简</li><li>zipalign对齐优化</li></ol><p><strong>修改人员:<a href>风澈vio</a>(转载必须注明出处)</strong></p><p><strong>下载地址:<br><em>tip:使用城通网盘下载一次相当于赞助楼楼2分钱~</em><br><a href="https://viosay.ctfile.com/dir/15555077-25340458-fbaadd/" target="_blank" rel="noopener">城通网盘</a>(进入下载列表-最下方普通低速单线程下载)<br><a href="https://pan.baidu.com/s/1kUCpGWn" target="_blank" rel="noopener">百度网盘</a> 密码:1024</strong><br><strong>※ 链接失效或无法下载请联系我 ※</strong></p><ul><li>注意:</li><li>使用者由此程序所造成的损失修改者不承担任何责任。</li><li>最终版权归原作者所有。</li><li>请在法律允许的范围内合理使用本程序。</li></ul>]]></content>
<summary type="html">
<p><img src="http://img.inplus.top/msrdclient-0.png-logo" alt></p>
<p>Microsoft Remote Desktop – 一款微软官方发布的RDP远程桌面控制工具,方便在手机上控制电脑或服务器。</p>
<p><strong>功能特点:</strong></p>
<ul>
<li>通过远程桌面网关访问远程资源</li>
<li>远程桌面协议(RDP)和RemoteFX的支持Windows手势丰富的多点触控体验</li>
<li>安全连接到您的数据和突破网络层的认证申请(NLA)技术</li>
<li>从连接中心对所有远程连接进行简单的管理</li>
<li>高品质的视频和音频流媒体与改进的压缩和带宽使用</li>
<li>对Azure的RemoteApp的支持</li>
</ul>
</summary>
<category term="App" scheme="http://inplus.top/tags/App/"/>
</entry>
<entry>
<title>SourceTree 免登录跳过初始设置的方法</title>
<link href="http://inplus.top/archives/sourcetreeskipsetting/"/>
<id>http://inplus.top/archives/sourcetreeskipsetting/</id>
<published>2017-09-03T16:36:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/sourcetree/sourcetree-0.png" class="img-center-logo"><br> 由于 svn 时期 “小乌龟” 根深蒂固的影响力,我们通常用到的 git 可视化版本控制工具恐怕要属 <code>Tortoisegit</code> 多一些了。<br> 而 <code>SourceTree</code> 是 Windows 和 Mac OS X 下免费的 Git 和 Hg 客户端管理工具,同时也是 <code>Mercurial</code> 和 <code>Subversion</code> 版本控制系统工具。支持创建、克隆、提交、push、pull 和合并等操作。<code>SourceTree</code> 拥有一个精美简洁的界面,大大简化了开发者与代码库之间的Git操作方式,这对于那些不熟悉Git命令的开发者来说非常实用。</p><blockquote><p><code>SourceTree</code> 安装之后需要使用账号登陆授权以后才可以使用,以前是可以不登陆的,但是现在是强制登陆。虽然是免费授权,但是不知道是什么原因,登陆经常会失败,翻墙也不行,这里就分享一下跳过下图这个初始化界面的步骤。</p></blockquote><a id="more"></a><p><img src="/assets/blogImg/sourcetree/sourcetree-1.png" class="img-center-normal"></p><hr><h3 id="Windows版-SourceTree-免登录跳过初始设置的方法"><a href="#Windows版-SourceTree-免登录跳过初始设置的方法" class="headerlink" title="Windows版 SourceTree 免登录跳过初始设置的方法"></a>Windows版 SourceTree 免登录跳过初始设置的方法</h3><ul><li><p>首先,安装完 <code>SourceTree</code> 以后先运行一次,弹出初始化登录页面后退出。</p></li><li><p>打开 <code>我的电脑</code>,在最上方的地址栏直接输入以下地址:</p><figure class="highlight taggerscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">%LocalAppData%</span><span class="symbol">\A</span>tlassian<span class="symbol">\S</span>ourceTree\</span><br></pre></td></tr></table></figure></li></ul><p><strong>如图:</strong><br><img src="/assets/blogImg/sourcetree/sourcetree-2.png" class="img-center-normal"></p><ul><li><p>在这个目录下新建一个名为 <code>accounts.json</code> 的文件。</p></li><li><p>使用 <code>记事本</code> 打开这个文件,将以下内容复制到其中后保存。</p><figure class="highlight json"><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></pre></td><td class="code"><pre><span class="line">[</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">"$id"</span>: <span class="string">"1"</span>,</span><br><span class="line"> <span class="attr">"$type"</span>: <span class="string">"SourceTree.Api.Host.Identity.Model.IdentityAccount, SourceTree.Api.Host.Identity"</span>,</span><br><span class="line"> <span class="attr">"Authenticate"</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">"HostInstance"</span>: {</span><br><span class="line"> <span class="attr">"$id"</span>: <span class="string">"2"</span>,</span><br><span class="line"> <span class="attr">"$type"</span>: <span class="string">"SourceTree.Host.Atlassianaccount.AtlassianAccountInstance, SourceTree.Host.AtlassianAccount"</span>,</span><br><span class="line"> <span class="attr">"Host"</span>: {</span><br><span class="line"> <span class="attr">"$id"</span>: <span class="string">"3"</span>,</span><br><span class="line"> <span class="attr">"$type"</span>: <span class="string">"SourceTree.Host.Atlassianaccount.AtlassianAccountHost, SourceTree.Host.AtlassianAccount"</span>,</span><br><span class="line"> <span class="attr">"Id"</span>: <span class="string">"atlassian account"</span></span><br><span class="line"> },</span><br><span class="line"> <span class="attr">"BaseUrl"</span>: <span class="string">"https://id.atlassian.com/"</span></span><br><span class="line"> },</span><br><span class="line"> <span class="attr">"Credentials"</span>: {</span><br><span class="line"> <span class="attr">"$id"</span>: <span class="string">"4"</span>,</span><br><span class="line"> <span class="attr">"$type"</span>: <span class="string">"SourceTree.Model.BasicAuthCredentials, SourceTree.Api.Account"</span>,</span><br><span class="line"> <span class="attr">"Username"</span>: <span class="string">""</span>,</span><br><span class="line"> <span class="attr">"Email"</span>: <span class="literal">null</span></span><br><span class="line"> },</span><br><span class="line"> <span class="attr">"IsDefault"</span>: <span class="literal">false</span></span><br><span class="line"> }</span><br><span class="line">]</span><br></pre></td></tr></table></figure></li></ul><p><strong>文件保存成功后的样子如图:</strong><br><img src="/assets/blogImg/sourcetree/sourcetree-3.png" class="img-center-normal"></p><ul><li>再次打开 <code>SourceTree</code> 就可以直接跳过登录进入软件页面了。</li></ul><p><strong>注意:</strong> <code>Windows</code> 系统文件后缀是默认隐藏的,需要先显示文件的后缀名,然后随便新建一个 <code>文本文档</code> ,将文件全名改为 <code>accounts.json</code> 即可。</p><p><strong>显示文件后缀名的方法:</strong></p><p>打开 <code>我的电脑</code> ,点击 <code>工具</code> 菜单中的 <code>文件夹选项</code> 。</p><p><strong>如图:</strong><br><img src="/assets/blogImg/sourcetree/sourcetree-4.png" class="img-center-normal"></p><ul><li>弹出 <code>文件夹选项</code> ,在 <code>查看</code>选项卡中,将 <code>隐藏已知文件类型的扩展名</code> 选项取消选中后点击 <code>确定</code> 即可。</li></ul><p><strong>如图:</strong><br><img src="/assets/blogImg/sourcetree/sourcetree-5.png" class="img-center-normal"></p><blockquote><p>方法就是这样,<code>Mac</code> 版的 <code>SourceTree</code> 暂时还不知道怎么跳过,还是老老实实翻墙注册登录吧~</p></blockquote><hr><p>特别感谢<a href="https://www.jianshu.com/u/63659e722f3b" target="_blank" rel="noopener">@Jonzzs</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/sourcetree/sourcetree-0.png" class="img-center-logo"><br> 由于 svn 时期 “小乌龟” 根深蒂固的影响力,我们通常用到的 git 可视化版本控制工具恐怕要属 <code>Tortoisegit</code> 多一些了。<br> 而 <code>SourceTree</code> 是 Windows 和 Mac OS X 下免费的 Git 和 Hg 客户端管理工具,同时也是 <code>Mercurial</code> 和 <code>Subversion</code> 版本控制系统工具。支持创建、克隆、提交、push、pull 和合并等操作。<code>SourceTree</code> 拥有一个精美简洁的界面,大大简化了开发者与代码库之间的Git操作方式,这对于那些不熟悉Git命令的开发者来说非常实用。</p>
<blockquote>
<p><code>SourceTree</code> 安装之后需要使用账号登陆授权以后才可以使用,以前是可以不登陆的,但是现在是强制登陆。虽然是免费授权,但是不知道是什么原因,登陆经常会失败,翻墙也不行,这里就分享一下跳过下图这个初始化界面的步骤。</p>
</blockquote>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<category term="git" scheme="http://inplus.top/tags/git/"/>
</entry>
<entry>
<title>CentOS 7简单的利用yum源安装Nginx</title>
<link href="http://inplus.top/archives/centosnginx/"/>
<id>http://inplus.top/archives/centosnginx/</id>
<published>2017-08-25T01:20:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/centosnginx/centosnginx-0.png" class="img-center-logo"><br> 小伙伴的项目需求要使用80端口部署静态html5的官网,为了稳定高效和后续的扩充,故使用轻巧又强大的Nginx来作80端口的服务器,也方便后续进行反向代理和负载均衡。<br> 下面就简单介绍一下简单的利用yum源安装Nginx,并进行响应配置。</p><blockquote><p>安装环境:CentOS7 64位 Minimal版(VMware)</p></blockquote><a id="more"></a><h3 id="配置网卡"><a href="#配置网卡" class="headerlink" title="配置网卡"></a>配置网卡</h3><p>使用桥接,开启网卡并设置:静态ip、网关、子网掩码、DNS<br><figure class="highlight awk"><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">vi <span class="regexp">/etc/</span>sysconfig<span class="regexp">/network-scripts/i</span>fcfg-eno16777736</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/centosnginx/centosnginx-1.png" class="img-center-normal"><br><figure class="highlight ini"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">TYPE</span>=Ethernet</span><br><span class="line"><span class="attr">BOOTPROTO</span>=static</span><br><span class="line"><span class="attr">IPADDR</span>=<span class="number">192.168</span>.<span class="number">0.200</span></span><br><span class="line"><span class="attr">GATEWAY</span>=<span class="number">192.168</span>.<span class="number">0.1</span></span><br><span class="line"><span class="attr">NETMASK</span>=<span class="number">255.255</span>.<span class="number">255.0</span></span><br><span class="line"><span class="attr">DNS1</span>=<span class="number">192.168</span>.<span class="number">0.1</span></span><br><span class="line"><span class="attr">DEFROUTE</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">PEERDNS</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">PEERROUTES</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV4_FAILURE_FATAL</span>=<span class="literal">no</span></span><br><span class="line"><span class="attr">IPV6INIT</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV6_AUTOCONF</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV6_DEFROUTE</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV6_PEERDNS</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV6_PEERROUTES</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV6_FAILURE_FATAL</span>=<span class="literal">no</span></span><br><span class="line"><span class="attr">NAME</span>=eno16777736</span><br><span class="line"><span class="attr">UUID</span>=<span class="number">11</span>b992a7-<span class="number">1630</span>-<span class="number">4</span>a26-bd62-<span class="number">8</span>ce65e3e5c78</span><br><span class="line"><span class="attr">DEVICE</span>=eno16777736</span><br><span class="line"><span class="attr">ONBOOT</span>=<span class="literal">yes</span></span><br></pre></td></tr></table></figure></p><figure class="highlight nginx"><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="attribute">systemctl</span> restart network</span><br></pre></td></tr></table></figure><figure class="highlight routeros"><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"># 查看ip</span></span><br><span class="line">ip addr</span><br></pre></td></tr></table></figure><h3 id="配置防火墙"><a href="#配置防火墙" class="headerlink" title="配置防火墙"></a>配置防火墙</h3><p>http协议默认端口为80端口,SSL加密的https协议的默认端口为443端口。<br>远程访问,需要打开防火墙。CentOS 7 中默认防火墙是firewalld,默认为关闭状态。<br><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 启动Firewall</span></span><br><span class="line">systemctl start firewalld</span><br><span class="line"><span class="comment"># 设置开机自启动</span></span><br><span class="line">systemctl enable firewalld</span><br><span class="line"><span class="comment"># 开放http80端口</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --permanent --add-port=80/tcp</span></span><br><span class="line"><span class="comment"># 开放https443端口</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --permanent --add-port=443/tcp</span></span><br><span class="line"><span class="comment"># 重载防火墙配置使其生效</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --reload</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看所有已开放端口</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --list-ports</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 移除某端口</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --permanent --remove-port=端口名/tcp</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 若无firewall-cmd命令则先安装firewalld</span></span><br><span class="line">yum install firewalld -y</span><br></pre></td></tr></table></figure></p><h3 id="1、添加源"><a href="#1、添加源" class="headerlink" title="1、添加源"></a>1、添加源</h3><p>默认情况Centos7中无Nginx的yum源,最近发现Nginx官网提供了Centos的源地址。因此可以在<a href="http://nginx.org/en/linux_packages.html#stable" target="_blank" rel="noopener">http://nginx.org/en/linux_packages.html#stable</a>找到链接,并执行如下命令添加源:<br><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rpm -ivh http:<span class="regexp">//</span>nginx.org<span class="regexp">/packages/</span>centos<span class="regexp">/7/</span>noarch<span class="regexp">/RPMS/</span>nginx-release-centos-<span class="number">7</span>-<span class="number">0</span>.el7.ngx.noarch.rpm</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/centosnginx/centosnginx-2.png" class="img-center-normal"></p><h3 id="2、安装Nginx"><a href="#2、安装Nginx" class="headerlink" title="2、安装Nginx"></a>2、安装Nginx</h3><p>查看源是否已经添加成功:<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">yum search nginx</span></span><br></pre></td></tr></table></figure></p><p>查看源信息:<br><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">yum</span> <span class="literal">info</span> nginx</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/centosnginx/centosnginx-3.png" class="img-center-normal"></p><p>检查源已经添加源成功,执行下列命令进行安装:<br><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum <span class="keyword">install</span> -y nginx</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/centosnginx/centosnginx-4.png" class="img-center-normal"></p><h3 id="3、启动Nginx"><a href="#3、启动Nginx" class="headerlink" title="3、启动Nginx"></a>3、启动Nginx</h3><p>安装完成后nginx就已经启动了,可以查看进程:<br><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">ps</span> -ef | <span class="keyword">grep</span> nginx</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/centosnginx/centosnginx-5.png" class="img-center-normal"></p><p>若未启动则执行命令进行启动Nginx:<br><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="literal">start</span> nginx</span><br></pre></td></tr></table></figure></p><p>如果一切进展顺利的话,现在你可以通过你的域名或IP来访问你的Web页面来预览一下Nginx的默认页面</p><p><img src="/assets/blogImg/centosnginx/centosnginx-6.png" class="img-center-normal"></p><p>如果看到这个页面,那么说明你的CentOS 7 中 web服务器已经正确安装。</p><p>如果不能连接到Nginx,原因很多,但是可以先检查:<br>①Nginx服务是否真的运行起来了。<br>②服务器防火墙是否放行80端口。</p><h3 id="4、其他配置"><a href="#4、其他配置" class="headerlink" title="4、其他配置"></a>4、其他配置</h3><p>开机自启:<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="builtin-name">enable</span> nginx</span><br></pre></td></tr></table></figure></p><p>Nginx配置信息<br><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 网站文件存放默认目录</span></span><br><span class="line"><span class="regexp">/usr/</span>share<span class="regexp">/nginx/</span>html</span><br><span class="line"><span class="comment"># 网站默认站点配置</span></span><br><span class="line"><span class="regexp">/etc/</span>nginx<span class="regexp">/conf.d/</span>default.conf</span><br><span class="line"><span class="comment"># 自定义Nginx站点配置文件存放目录</span></span><br><span class="line"><span class="regexp">/etc/</span>nginx<span class="regexp">/conf.d/</span></span><br><span class="line"><span class="comment"># Nginx全局配置</span></span><br><span class="line"><span class="regexp">/etc/</span>nginx<span class="regexp">/nginx.conf</span></span><br></pre></td></tr></table></figure></p><p>修改配置后无缝重载:<br><figure class="highlight jboss-cli"><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">systemctl <span class="keyword">reload</span> nginx</span><br><span class="line">或</span><br><span class="line">nginx -s <span class="keyword">reload</span></span><br></pre></td></tr></table></figure></p><p>指定配置文件启动:<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">nginx</span> <span class="selector-tag">-c</span> <span class="selector-tag">nginx</span><span class="selector-class">.conf</span></span><br></pre></td></tr></table></figure></p><p>这样你可以改变配置使Nginx像守护进程一样运行,Nginx运行进程的数量等等。</p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/centosnginx/centosnginx-0.png" class="img-center-logo"><br> 小伙伴的项目需求要使用80端口部署静态html5的官网,为了稳定高效和后续的扩充,故使用轻巧又强大的Nginx来作80端口的服务器,也方便后续进行反向代理和负载均衡。<br> 下面就简单介绍一下简单的利用yum源安装Nginx,并进行响应配置。</p>
<blockquote>
<p>安装环境:CentOS7 64位 Minimal版(VMware)</p>
</blockquote>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<category term="nginx" scheme="http://inplus.top/tags/nginx/"/>
</entry>
<entry>
<title>CentOS 7 MySQL自动备份shell脚本</title>
<link href="http://inplus.top/archives/centosmysqlautobak/"/>
<id>http://inplus.top/archives/centosmysqlautobak/</id>
<published>2017-08-11T10:20:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/centosmysqlautobak/centosmysqlautobak-0.png" class="img-center-logo"><br> 在数据库的日常维护工作中,除了保证业务的正常运行以外,就是要对数据库进行备份,以免造成数据库的丢失,从而给企业带来重大经济损失。<br> 通常备份可以按照备份时数据库状态分为热备和冷备,按照备份数据库文件的大小分为增量备份、差异备份和全量备份。<br> 这里,我们讲解一种全量备份的方法,来实现定时备份数据到mysql脚本文件,并且支持过期删除。<br><a id="more"></a></p><blockquote><p><strong>系统环境:</strong><br>CentOS7 64位 Minimal版(VMware)<br>MySQL5.7</p></blockquote><blockquote><p><strong>原理与工具:</strong><br>shell脚本<br>mysqldump程序<br>crontab命令</p></blockquote><hr><h3 id="1、新建shell脚本"><a href="#1、新建shell脚本" class="headerlink" title="1、新建shell脚本"></a>1、新建shell脚本</h3><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">vi</span> /<span class="keyword">opt</span>/mysqlBackup.<span class="keyword">sh</span></span><br></pre></td></tr></table></figure><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#!/bin/bash</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 以下配置信息请自己修改</span></span><br><span class="line"><span class="attribute">mysql_user</span>=<span class="string">"USER"</span> #MySQL备份用户</span><br><span class="line"><span class="attribute">mysql_password</span>=<span class="string">"PASSWORD"</span> #MySQL备份用户的密码</span><br><span class="line"><span class="attribute">mysql_host</span>=<span class="string">"localhost"</span></span><br><span class="line"><span class="attribute">mysql_port</span>=<span class="string">"3306"</span></span><br><span class="line"><span class="attribute">mysql_charset</span>=<span class="string">"utf8"</span> #MySQL编码</span><br><span class="line">backup_db_arr=(<span class="string">"db1"</span> <span class="string">"db2"</span>) #要备份的数据库名称,多个用空格分开隔开 如(<span class="string">"db1"</span> <span class="string">"db2"</span> <span class="string">"db3"</span>)</span><br><span class="line"><span class="attribute">backup_location</span>=/opt/mysql #备份数据存放位置,末尾请不要带<span class="string">"/"</span>,此项可以保持默认,程序会自动创建文件夹</span><br><span class="line"><span class="attribute">expire_backup_delete</span>=<span class="string">"ON"</span> #是否开启过期备份删除 ON为开启 OFF为关闭</span><br><span class="line"><span class="attribute">expire_days</span>=3 #过期时间天数 默认为三天,此项只有在expire_backup_delete开启时有效</span><br><span class="line"></span><br><span class="line"><span class="comment"># 本行开始以下不需要修改</span></span><br><span class="line"><span class="attribute">backup_time</span>=`date +%Y%m%d%H%M` #定义备份详细时间</span><br><span class="line"><span class="attribute">backup_Ymd</span>=`date +%Y-%m-%d` #定义备份目录中的年月日时间</span><br><span class="line"><span class="attribute">backup_3ago</span>=`date -d <span class="string">'3 days ago'</span> +%Y-%m-%d` #3天之前的日期</span><br><span class="line"><span class="attribute">backup_dir</span>=<span class="variable">$backup_location</span>/$backup_Ymd #备份文件夹全路径</span><br><span class="line"><span class="attribute">welcome_msg</span>=<span class="string">"Welcome to use MySQL backup tools!"</span> #欢迎语</span><br><span class="line"></span><br><span class="line"><span class="comment"># 判断MYSQL是否启动,mysql没有启动则备份退出</span></span><br><span class="line"><span class="attribute">mysql_ps</span>=`ps -ef |grep mysql |wc -l`</span><br><span class="line"><span class="attribute">mysql_listen</span>=`netstat -an |grep LISTEN |grep <span class="variable">$mysql_port</span>|wc -l`</span><br><span class="line"><span class="keyword">if</span> [ [<span class="variable">$mysql_ps</span> == 0] -o [<span class="variable">$mysql_listen</span> == 0] ]; then</span><br><span class="line"> echo <span class="string">"ERROR:MySQL is not running! backup stop!"</span></span><br><span class="line"> exit</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"> echo <span class="variable">$welcome_msg</span></span><br><span class="line">fi</span><br><span class="line"></span><br><span class="line"><span class="comment"># 连接到mysql数据库,无法连接则备份退出</span></span><br><span class="line">mysql -h<span class="variable">$mysql_host</span> -P<span class="variable">$mysql_port</span> -u<span class="variable">$mysql_user</span> -p<span class="variable">$mysql_password</span> <<end</span><br><span class="line">use mysql;</span><br><span class="line">select host,user <span class="keyword">from</span><span class="built_in"> user </span>where <span class="attribute">user</span>=<span class="string">'root'</span> <span class="keyword">and</span> <span class="attribute">host</span>=<span class="string">'localhost'</span>;</span><br><span class="line">exit</span><br><span class="line">end</span><br><span class="line"></span><br><span class="line"><span class="attribute">flag</span>=`echo $?`</span><br><span class="line"><span class="keyword">if</span> [ <span class="variable">$flag</span> != <span class="string">"0"</span> ]; then</span><br><span class="line"> echo <span class="string">"ERROR:Can't connect mysql server! backup stop!"</span></span><br><span class="line"> exit</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line"> echo <span class="string">"MySQL connect ok! Please wait......"</span></span><br><span class="line"> # 判断有没有定义备份的数据库,如果定义则开始备份,否则退出备份</span><br><span class="line"> <span class="keyword">if</span> [ <span class="string">"<span class="variable">$backup_db_arr</span>"</span> != <span class="string">""</span> ];then</span><br><span class="line"> #<span class="attribute">dbnames</span>=$(cut -d <span class="string">','</span> -f1-5 <span class="variable">$backup_database</span>)</span><br><span class="line"> #echo <span class="string">"arr is (<span class="variable">${backup_db_arr[@]}</span>)"</span></span><br><span class="line"> <span class="keyword">for</span> dbname <span class="keyword">in</span> <span class="variable">${backup_db_arr[@]}</span></span><br><span class="line"> <span class="keyword">do</span></span><br><span class="line"> echo <span class="string">"database <span class="variable">$dbname</span> backup start..."</span></span><br><span class="line"> `mkdir -p <span class="variable">$backup_dir</span>`</span><br><span class="line"> `mysqldump -h<span class="variable">$mysql_host</span> -P<span class="variable">$mysql_port</span> -u<span class="variable">$mysql_user</span> -p<span class="variable">$mysql_password</span> <span class="variable">$dbname</span> <span class="attribute">--default-character-set</span>=<span class="variable">$mysql_charset</span> | gzip > <span class="variable">$backup_dir</span>/<span class="variable">$dbname</span>-<span class="variable">$backup_time</span>.sql.gz`</span><br><span class="line"> <span class="attribute">flag</span>=`echo $?`</span><br><span class="line"> <span class="keyword">if</span> [ <span class="variable">$flag</span> == <span class="string">"0"</span> ];then</span><br><span class="line"> echo <span class="string">"database <span class="variable">$dbname</span> success backup to <span class="variable">$backup_dir</span>/<span class="variable">$dbname</span>-<span class="variable">$backup_time</span>.sql.gz"</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> echo <span class="string">"database <span class="variable">$dbname</span> backup fail!"</span></span><br><span class="line"> fi</span><br><span class="line"> </span><br><span class="line"> done</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> echo <span class="string">"ERROR:No database to backup! backup stop"</span></span><br><span class="line"> exit</span><br><span class="line"> fi</span><br><span class="line"> # 如果开启了删除过期备份,则进行删除操作</span><br><span class="line"> <span class="keyword">if</span> [ <span class="string">"<span class="variable">$expire_backup_delete</span>"</span> == <span class="string">"ON"</span> -a <span class="string">"<span class="variable">$backup_location</span>"</span> != <span class="string">""</span> ];then</span><br><span class="line"> #`<span class="builtin-name">find</span> <span class="variable">$backup_location</span>/ -type d -o -type f -ctime +<span class="variable">$expire_days</span> -exec rm -rf {} \;`</span><br><span class="line"> `<span class="builtin-name">find</span> <span class="variable">$backup_location</span>/ -type d -mtime +<span class="variable">$expire_days</span> | xargs rm -rf`</span><br><span class="line"> echo <span class="string">"Expired backup data delete complete!"</span></span><br><span class="line"> fi</span><br><span class="line"> echo <span class="string">"All database backup success! Thank you!"</span></span><br><span class="line"> exit</span><br><span class="line">fi</span><br></pre></td></tr></table></figure><blockquote><p><strong>注意:如果这个sh文件是在win下编辑的,需要用编辑器转换为unix格式,否则sh会执行不成功,如图:</strong></p></blockquote><p><img src="/assets/blogImg/centosmysqlautobak/centosmysqlautobak-1.png"></p><h3 id="2、修改shell脚本属性,赋予执行权限"><a href="#2、修改shell脚本属性,赋予执行权限" class="headerlink" title="2、修改shell脚本属性,赋予执行权限"></a>2、修改shell脚本属性,赋予执行权限</h3><figure class="highlight vim"><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">chmod <span class="number">600</span> /<span class="keyword">opt</span>/mysqlBackup.<span class="keyword">sh</span></span><br><span class="line">chmod +<span class="keyword">x</span> /<span class="keyword">opt</span>/mysqlBackup.<span class="keyword">sh</span></span><br></pre></td></tr></table></figure><h3 id="3、定时执行脚本"><a href="#3、定时执行脚本" class="headerlink" title="3、定时执行脚本"></a>3、定时执行脚本</h3><h5 id="方式一:"><a href="#方式一:" class="headerlink" title="方式一:"></a>方式一:</h5><p>执行<code>crontab -e</code>命令,创建当前用户级别的定时任务<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">crontab -e</span></span><br></pre></td></tr></table></figure></p><p>输入以下内容,设置每天凌晨3:00定时自动备份<br><figure class="highlight basic"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">00 </span><span class="number">03</span> * * * /opt/mysqlBackup.sh</span><br></pre></td></tr></table></figure></p><p>生成的配置文件位于<code>/var/spool/cron/root</code></p><p>日志记录在<code>/var/spool/mail/root</code>中,可查看日志记录<br><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi <span class="regexp">/var/</span>spool<span class="regexp">/mail/</span>root</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/centosmysqlautobak/centosmysqlautobak-2.png"></p><hr><blockquote><p><strong>crontab文件概要:</strong><br>用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:<br>minute hour day month week command<br> 分 时 日 月 周 命令<br>其中:<br>minute: 表示分钟,可以是从0到59之间的任何整数。(每分钟可用*或者*/1表示)<br>hour:表示小时,可以是从0到23之间的任何整数。(0表示0点)<br>day:表示日期,可以是从1到31之间的任何整数。<br>month:表示月份,可以是从1到12之间的任何整数。<br>week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。<br>command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。<br>在以上各个字段中,还可以使用以下特殊字符:<br>星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。<br>逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”<br>中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”<br>正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。</p></blockquote><p><img src="/assets/blogImg/centosmysqlautobak/centosmysqlautobak-3.png"></p><h5 id="方式二:"><a href="#方式二:" class="headerlink" title="方式二:"></a>方式二:</h5><p>配置全局定时任务文件<br><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi <span class="regexp">/etc/</span>crontab</span><br></pre></td></tr></table></figure></p><p>在<code>etc</code>中加入如下内容,让其每天凌晨3:00自动执行任务。<br><figure class="highlight basic"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">00 </span><span class="number">03</span> * * * root /opt/mysqlBackup.sh</span><br></pre></td></tr></table></figure></p><p>全局定时任务配置相比于用户级别的任务配置多了一项执行用户<code>user-name</code></p><p><img src="/assets/blogImg/centosmysqlautobak/centosmysqlautobak-4.png"></p><p>日志记录在<code>/var/log/cron</code>中</p><h3 id="4、MySQL恢复"><a href="#4、MySQL恢复" class="headerlink" title="4、MySQL恢复"></a>4、MySQL恢复</h3><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">mysql</span> <span class="selector-tag">-u</span> <span class="selector-tag">username</span> <span class="selector-tag">-p</span> <span class="selector-tag">databse</span> < <span class="selector-tag">backup</span><span class="selector-class">.sql</span></span><br></pre></td></tr></table></figure><p>特别感谢 <a href="https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/12.4.md" target="_blank" rel="noopener">@astaxie</a> <a href="http://www.opsers.org/base/crontab-linux-system-tasks-and-examples-of-projects.html" target="_blank" rel="noopener">@羽飞</a> <a href="https://www.vpsrr.com/crontab-command/" target="_blank" rel="noopener">@vpsrr</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/centosmysqlautobak/centosmysqlautobak-0.png" class="img-center-logo"><br> 在数据库的日常维护工作中,除了保证业务的正常运行以外,就是要对数据库进行备份,以免造成数据库的丢失,从而给企业带来重大经济损失。<br> 通常备份可以按照备份时数据库状态分为热备和冷备,按照备份数据库文件的大小分为增量备份、差异备份和全量备份。<br> 这里,我们讲解一种全量备份的方法,来实现定时备份数据到mysql脚本文件,并且支持过期删除。<br>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<category term="mysql" scheme="http://inplus.top/tags/mysql/"/>
</entry>
<entry>
<title>CentOS 7/8 JavaWeb 环境安装与配置(YUM)</title>
<link href="http://inplus.top/archives/centosjavaweb/"/>
<id>http://inplus.top/archives/centosjavaweb/</id>
<published>2017-07-18T10:20:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/centosjavaweb/centosjavaweb-0.png" class="img-center-logo"><br> 小伙伴近日项目上线,向我询问部署相关知识。这里再重新总结一下Linux下部署环境的配置,使用VMware虚拟机使用CentOS 7.2 x64位系统,在有网络的情况下,最大程度使用YUM进行快速安装。</p><blockquote><p>安装环境:CentOS7 64位 Minimal版(VMware),安装MySQL5.7,Java1.8,Tomcat8.5,Redis3.2</p></blockquote><a id="more"></a><h3 id="配置网卡"><a href="#配置网卡" class="headerlink" title="配置网卡"></a>配置网卡</h3><p>使用桥接,开启网卡并设置:静态ip、网关、子网掩码、DNS<br><figure class="highlight awk"><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">vi <span class="regexp">/etc/</span>sysconfig<span class="regexp">/network-scripts/i</span>fcfg-eno16777736</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/centosjavaweb/centosjavaweb-1.png"><br><figure class="highlight ini"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">TYPE</span>=Ethernet</span><br><span class="line"><span class="attr">BOOTPROTO</span>=static</span><br><span class="line"><span class="attr">IPADDR</span>=<span class="number">192.168</span>.<span class="number">0.200</span></span><br><span class="line"><span class="attr">GATEWAY</span>=<span class="number">192.168</span>.<span class="number">0.1</span></span><br><span class="line"><span class="attr">NETMASK</span>=<span class="number">255.255</span>.<span class="number">255.0</span></span><br><span class="line"><span class="attr">DNS1</span>=<span class="number">192.168</span>.<span class="number">0.1</span></span><br><span class="line"><span class="attr">DEFROUTE</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">PEERDNS</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">PEERROUTES</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV4_FAILURE_FATAL</span>=<span class="literal">no</span></span><br><span class="line"><span class="attr">IPV6INIT</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV6_AUTOCONF</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV6_DEFROUTE</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV6_PEERDNS</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV6_PEERROUTES</span>=<span class="literal">yes</span></span><br><span class="line"><span class="attr">IPV6_FAILURE_FATAL</span>=<span class="literal">no</span></span><br><span class="line"><span class="attr">NAME</span>=eno16777736</span><br><span class="line"><span class="attr">UUID</span>=<span class="number">11</span>b992a7-<span class="number">1630</span>-<span class="number">4</span>a26-bd62-<span class="number">8</span>ce65e3e5c78</span><br><span class="line"><span class="attr">DEVICE</span>=eno16777736</span><br><span class="line"><span class="attr">ONBOOT</span>=<span class="literal">yes</span></span><br></pre></td></tr></table></figure></p><figure class="highlight nginx"><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="attribute">systemctl</span> restart network</span><br></pre></td></tr></table></figure><figure class="highlight routeros"><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"># 查看ip</span></span><br><span class="line">ip addr</span><br></pre></td></tr></table></figure><h3 id="配置防火墙"><a href="#配置防火墙" class="headerlink" title="配置防火墙"></a>配置防火墙</h3><p>MySQL默认端口为3306端口,Tomcat 默认端口为8080端口,Redis默认端口为6379端口。<br>远程访问,需要打开防火墙。CentOS 7 中默认防火墙是firewalld,默认为关闭状态。<br><figure class="highlight dockerfile"><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="comment"># 启动Firewall</span></span><br><span class="line">systemctl start firewalld</span><br><span class="line"><span class="comment"># 设置开机自启动</span></span><br><span class="line">systemctl enable firewalld</span><br><span class="line"><span class="comment"># 开放mysql3306端口</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --permanent --add-port=3306/tcp</span></span><br><span class="line"><span class="comment"># 开放tomcat8080端口</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --permanent --add-port=8080/tcp</span></span><br><span class="line"><span class="comment"># 开放redis6379端口</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --permanent --add-port=6379/tcp</span></span><br><span class="line"><span class="comment"># 重载防火墙配置</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --reload</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 查看所有已开放端口</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --list-ports</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 移除某端口</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --permanent --remove-port=端口名/tcp</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 若无firewall-cmd命令则先安装firewalld</span></span><br><span class="line">yum install firewalld -y</span><br></pre></td></tr></table></figure></p><h3 id="一、安装配置MySQL"><a href="#一、安装配置MySQL" class="headerlink" title="一、安装配置MySQL"></a>一、安装配置MySQL</h3><p><img src="/assets/blogImg/centosjavaweb/centosjavaweb-2.png" class="img-left-logo"></p><h4 id="1-配置YUM源"><a href="#1-配置YUM源" class="headerlink" title="1. 配置YUM源"></a>1. 配置YUM源</h4><p>在<a href="http://lib.csdn.net/base/14" target="_blank" rel="noopener">MySQL</a>官网中下载YUM源rpm安装包:<a href="http://dev.mysql.com/downloads/repo/yum/" target="_blank" rel="noopener">http://dev.mysql.com/downloads/repo/yum/</a> </p><p><img src="/assets/blogImg/centosjavaweb/centosjavaweb-3.png"></p><figure class="highlight awk"><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"># 下载mysql源安装包</span></span><br><span class="line">wget http:<span class="regexp">//</span>dev.mysql.com<span class="regexp">/get/my</span>sql57-community-release-el7-<span class="number">11</span>.noarch.rpm</span><br></pre></td></tr></table></figure><figure class="highlight cmake"><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"># 没wget的话先安装wget</span></span><br><span class="line">yum <span class="keyword">install</span> wget -y</span><br></pre></td></tr></table></figure><figure class="highlight css"><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="selector-tag">mysql</span>源</span><br><span class="line"><span class="selector-tag">yum</span> <span class="selector-tag">localinstall</span> <span class="selector-tag">mysql57-community-release-el7-11</span><span class="selector-class">.noarch</span><span class="selector-class">.rpm</span> <span class="selector-tag">-y</span></span><br></pre></td></tr></table></figure><h4 id="2-安装MySQL"><a href="#2-安装MySQL" class="headerlink" title="2. 安装MySQL"></a>2. 安装MySQL</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum <span class="keyword">install</span> mysql-community-<span class="keyword">server</span> -y</span><br></pre></td></tr></table></figure><figure class="highlight crystal"><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"># 如果是CentOS8还需要先禁用mysql模块,否则可能会提示 No match for argument: mysql-community-server</span></span><br><span class="line">yum <span class="class"><span class="keyword">module</span> <span class="title">disable</span> <span class="title">mysql</span></span></span><br></pre></td></tr></table></figure><h4 id="3-启动MySQL服务"><a href="#3-启动MySQL服务" class="headerlink" title="3. 启动MySQL服务"></a>3. 启动MySQL服务</h4><figure class="highlight sql"><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"><span class="comment"># 启动服务</span></span><br><span class="line">systemctl <span class="keyword">start</span> mysqld</span><br><span class="line"><span class="comment"># 查看启动状态</span></span><br><span class="line">systemctl <span class="keyword">status</span> mysqld</span><br></pre></td></tr></table></figure><h4 id="4-配置开机启动"><a href="#4-配置开机启动" class="headerlink" title="4. 配置开机启动"></a>4. 配置开机启动</h4><figure class="highlight routeros"><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">systemctl <span class="builtin-name">enable</span> mysqld</span><br><span class="line">systemctl daemon-reload</span><br></pre></td></tr></table></figure><h4 id="5-修改root默认密码"><a href="#5-修改root默认密码" class="headerlink" title="5. 修改root默认密码"></a>5. 修改root默认密码</h4><p>mysql安装完成之后,在<code>/var/log/mysqld.log</code>文件中给root生成了一个默认密码。通过下面的方式找到root默认密码,然后登录mysql进行修改:<br><figure class="highlight lasso"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">grep <span class="string">'temporary password'</span> /<span class="built_in">var</span>/<span class="keyword">log</span>/mysqld.<span class="keyword">log</span></span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/centosjavaweb/centosjavaweb-4.png"><br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 登录mysql</span></span><br><span class="line">mysql -uroot -p</span><br><span class="line"><span class="comment"># 修改密码</span></span><br><span class="line">ALTER<span class="built_in"> USER </span><span class="string">'root'</span>@<span class="string">'localhost'</span> IDENTIFIED BY <span class="string">'Root000!'</span>; </span><br><span class="line"><span class="comment"># 或者</span></span><br><span class="line"><span class="builtin-name">set</span> password <span class="keyword">for</span> <span class="string">'root'</span>@<span class="string">'localhost'</span>=password(<span class="string">'Root000!'</span>);</span><br></pre></td></tr></table></figure></p><p>注意:mysql5.7默认安装了密码安全检查插件(validate_password),默认密码检查策略要求密码必须包含:大小写字母、数字和特殊符号,并且长度不能少于8位。否则会提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements错误。</p><p>通过msyql环境变量可以查看密码策略的相关信息:<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">show</span> <span class="keyword">variables</span> <span class="keyword">like</span> <span class="string">'%password%'</span>;</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/centosjavaweb/centosjavaweb-5.png"><br>validate_password_policy:密码策略,默认为MEDIUM策略<br>validate_password_dictionary_file:密码策略文件,策略为STRONG才需要<br>validate_password_length:密码最少长度<br>validate_password_mixed_case_count:大小写字符长度,至少1个<br>validate_password_number_count :数字至少1个<br>validate_password_special_char_count:特殊字符至少1个<br>上述参数是默认策略MEDIUM的密码检查规则。</p><p>共有以下几种密码策略:</p><table><thead><tr><th>策略</th><th>检查规则</th></tr></thead><tbody><tr><td>0 or LOW</td><td>Length</td></tr><tr><td>1 or MEDIUM</td><td>Length; numeric, lowercase/uppercase, and special characters</td></tr><tr><td>2 or STRONG</td><td>Length; numeric, lowercase/uppercase, and special characters; dictionary file</td></tr></tbody></table><p>MySQL官网密码策略详细说明:<a href="http://dev.mysql.com/doc/refman/5.7/en/validate-password-options-variables.html#sysvar_validate_password_policy" target="_blank" rel="noopener">http://dev.mysql.com/doc/refman/5.7/en/validate-password-options-variables.html#sysvar_validate_password_policy</a></p><p>修改密码策略:<br>在<code>/etc/my.cnf</code>文件添加<code>validate_password_policy</code>配置,指定密码策略<br><figure class="highlight lsl"><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="number">0</span>(LOW),<span class="number">1</span>(MEDIUM),<span class="number">2</span>(STRONG)其中一种,选择<span class="number">2</span>需要提供密码字典文件</span><br><span class="line">validate_password_policy=<span class="number">0</span></span><br></pre></td></tr></table></figure></p><p>如果不需要密码策略,添加my.cnf文件中添加如下配置禁用即可:<br><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">validate_password</span> = <span class="literal">off</span></span><br></pre></td></tr></table></figure></p><p>重新启动mysql服务使配置生效:<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">systemctl restart mysqld</span></span><br></pre></td></tr></table></figure></p><h4 id="6-添加远程登录用户"><a href="#6-添加远程登录用户" class="headerlink" title="6. 添加远程登录用户"></a>6. 添加远程登录用户</h4><p>默认只允许root帐户在本地登录,如果要在其它机器上连接mysql,必须修改root允许远程连接,或者添加一个允许远程连接的帐户,为了安全起见,我添加一个新的帐户:<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">GRANT</span> <span class="keyword">ALL</span> <span class="keyword">PRIVILEGES</span> <span class="keyword">ON</span> *.* <span class="keyword">TO</span> <span class="string">'testuser'</span>@<span class="string">'%'</span> <span class="keyword">IDENTIFIED</span> <span class="keyword">BY</span> <span class="string">'Test000!'</span> <span class="keyword">WITH</span> <span class="keyword">GRANT</span> <span class="keyword">OPTION</span>;</span><br><span class="line"><span class="comment"># 如果是MySQL8上述命令会报错,因为要先创建用户再进行赋权,不能同时进行,按以下语句分开执行</span></span><br><span class="line"><span class="keyword">CREATE</span> <span class="keyword">USER</span> <span class="string">'testuser'</span>@<span class="string">'%'</span> <span class="keyword">IDENTIFIED</span> <span class="keyword">BY</span> <span class="string">'Test000!'</span>;</span><br><span class="line"><span class="keyword">GRANT</span> <span class="keyword">ALL</span> <span class="keyword">PRIVILEGES</span> <span class="keyword">ON</span> *.* <span class="keyword">TO</span> <span class="string">'testuser'</span>@<span class="string">'%'</span> <span class="keyword">WITH</span> <span class="keyword">GRANT</span> <span class="keyword">OPTION</span>;</span><br><span class="line"><span class="comment"># 刷新用户权限表,立即生效</span></span><br><span class="line"><span class="keyword">flush</span> <span class="keyword">privileges</span>;</span><br></pre></td></tr></table></figure></p><h4 id="7-配置默认编码为utf8"><a href="#7-配置默认编码为utf8" class="headerlink" title="7. 配置默认编码为utf8"></a>7. 配置默认编码为utf8</h4><p>修改<code>/etc/my.cnf</code>配置文件,在<code>[mysqld]</code>下添加编码配置,如下所示:<br><figure class="highlight ini"><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="section">[mysqld]</span></span><br><span class="line"><span class="attr">character_set_server</span>=utf8</span><br><span class="line"><span class="attr">init_connect</span>=<span class="string">'SET NAMES utf8'</span></span><br></pre></td></tr></table></figure></p><figure class="highlight nginx"><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"># 重新启动mysql服务使配置生效</span></span><br><span class="line"><span class="attribute">systemctl</span> restart mysqld</span><br></pre></td></tr></table></figure><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">show</span> <span class="keyword">variables</span> <span class="keyword">like</span> <span class="string">'%character%'</span>;</span><br></pre></td></tr></table></figure><p>查看数据库默认编码如下所示:<br><img src="/assets/blogImg/centosjavaweb/centosjavaweb-6.png"><br><strong>默认配置文件路径</strong>:<br>配置文件:/etc/my.cnf<br>日志文件:/var/log//var/log/mysqld.log<br>服务启动脚本:/usr/lib/systemd/system/mysqld.service<br>socket文件:/var/run/mysqld/mysqld.pid</p><h3 id="二、安装JAVA"><a href="#二、安装JAVA" class="headerlink" title="二、安装JAVA"></a>二、安装JAVA</h3><p><img src="/assets/blogImg/centosjavaweb/centosjavaweb-7.png" class="img-left-logo"></p><p>安装Tomcat 前,需要提前安装JRE环境,如已安装,此步可以跳过。<br>在CentOS中,JRE包名是<code>java-$(version)-openjdk</code><br>在这里,我安装是1.8的openjdk版本<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">yum</span> <span class="selector-tag">install</span> <span class="selector-tag">java-1</span><span class="selector-class">.8</span><span class="selector-class">.0-openjdk</span> <span class="selector-tag">-y</span></span><br></pre></td></tr></table></figure></p><p>ps:特别注意的是,<code>java-1.8.0-openjdk</code>仅包含jre,如果需要使用jdk包则应为<code>java-1.8.0-openjdk-devel</code><br>安装完成后,验证一下:<br><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">java -<span class="built_in">version</span></span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/centosjavaweb/centosjavaweb-8.png"></p><h3 id="三、安装配置Tomcat"><a href="#三、安装配置Tomcat" class="headerlink" title="三、安装配置Tomcat"></a>三、安装配置Tomcat</h3><p><img src="/assets/blogImg/centosjavaweb/centosjavaweb-9.png" class="img-left-logo"><br>首先,下载最新版的Tomcat8,下载地址 <a href="http://tomcat.apache.org/download-80.cgi" target="_blank" rel="noopener">http://tomcat.apache.org/download-80.cgi</a> 下载安装包到<code>/tmp</code>目录。<br><figure class="highlight jboss-cli"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">cd</span> <span class="string">/tmp</span></span><br><span class="line">wget http:<span class="string">//mirror.bit.edu.cn/apache/tomcat/tomcat-8/v8.5.16/bin/apache-tomcat-8.5.16.tar.gz</span></span><br></pre></td></tr></table></figure></p><p>然后,解压安装包到/opt目录,更改目录名为tomcat:<br><figure class="highlight lsl"><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">cd /opt</span><br><span class="line">tar -zxvf /tmp/apache-tomcat<span class="number">-8.5</span><span class="number">.16</span>.tar.gz</span><br><span class="line">mv apache-tomcat<span class="number">-8.5</span><span class="number">.16</span> tomcat</span><br></pre></td></tr></table></figure></p><p>如果使用tomcat8之前的版本,还需要配置默认编码<br><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">cd</span> /<span class="keyword">opt</span>/tomcat/<span class="keyword">conf</span></span><br><span class="line"><span class="keyword">vi</span> server.xml</span><br></pre></td></tr></table></figure></p><p>在下面两句末尾加上<code>URIEncoding="UTF-8"</code><br><figure class="highlight routeros"><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"><Connector <span class="attribute">port</span>=<span class="string">"8080"</span> <span class="attribute">protocol</span>=<span class="string">"HTTP/1.1"</span> <span class="attribute">connectionTimeout</span>=<span class="string">"20000"</span> <span class="attribute">redirectPort</span>=<span class="string">"8443"</span> <span class="attribute">URIEncoding</span>=<span class="string">"UTF-8"</span>/></span><br><span class="line"></span><br><span class="line"><Connector <span class="attribute">port</span>=<span class="string">"8009"</span> <span class="attribute">protocol</span>=<span class="string">"AJP/1.3"</span> <span class="attribute">redirectPort</span>=<span class="string">"8443"</span> <span class="attribute">URIEncoding</span>=<span class="string">"UTF-8"</span>/></span><br></pre></td></tr></table></figure></p><p>建立自启动服务<br>配置完成,接下来需要建立系统服务文件。<br><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi <span class="regexp">/etc/</span>systemd<span class="regexp">/system/</span>tomcat.service</span><br></pre></td></tr></table></figure></p><p>文件内容如下:<br><figure class="highlight ini"><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="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=Apache Tomcat <span class="number">8</span></span><br><span class="line"><span class="attr">After</span>=syslog.target network.target</span><br><span class="line"></span><br><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">Type</span>=forking</span><br><span class="line"><span class="attr">User</span>=root</span><br><span class="line"><span class="attr">Group</span>=root</span><br><span class="line"></span><br><span class="line"><span class="attr">Environment</span>=JAVA_HOME=/usr/lib/jvm/jre-<span class="number">1.8</span>.<span class="number">0</span>-openjdk-<span class="number">1.8</span>.<span class="number">0.131</span>-<span class="number">3</span>.b12.el<span class="number">7_3</span>.x<span class="number">86_64</span></span><br><span class="line"><span class="attr">Environment</span>=CATALINA_PID=/opt/tomcat/temp/tomcat.pid</span><br><span class="line"><span class="attr">Environment</span>=CATALINA_HOME=/opt/tomcat</span><br><span class="line"><span class="attr">Environment</span>=CATALINA_BASE=/opt/tomcat</span><br><span class="line"><span class="attr">Environment</span>=<span class="string">'CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC'</span></span><br><span class="line"><span class="attr">Environment</span>=<span class="string">'JAVA_OPTS=-Djava.awt.headless=true -Djava.security.egd=file:/dev/./urandom'</span></span><br><span class="line"></span><br><span class="line"><span class="attr">ExecStart</span>=/opt/tomcat/bin/startup.sh</span><br><span class="line"><span class="attr">ExecStop</span>=/bin/kill -<span class="number">15</span> <span class="variable">$MAINPID</span></span><br><span class="line"></span><br><span class="line"><span class="section">[Install]</span></span><br><span class="line"><span class="attr">WantedBy</span>=multi-user.target</span><br></pre></td></tr></table></figure></p><p>配置文件中需要注意,JAVA_HOME变量的配置,需要按实际情况而定。<br>保存文件然后按以下命令执行服务并配置自动启动。<br><figure class="highlight routeros"><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">systemctl daemon-reload</span><br><span class="line">systemctl start tomcat</span><br><span class="line">systemctl <span class="builtin-name">enable</span> tomcat</span><br></pre></td></tr></table></figure></p><p>然后浏览器中打开,测试是否成功。<br><img src="/assets/blogImg/centosjavaweb/centosjavaweb-10.png"></p><h3 id="四、安装配置Redis"><a href="#四、安装配置Redis" class="headerlink" title="四、安装配置Redis"></a>四、安装配置Redis</h3><p><img src="/assets/blogImg/centosjavaweb/centosjavaweb-11.png" class="img-left-logo"></p><h4 id="1-下载Redis"><a href="#1-下载Redis" class="headerlink" title="1. 下载Redis"></a>1. 下载Redis</h4><p>首先,下载Redis,我这里用的3.2.9,下载地址 <a href="https://redis.io/download" target="_blank" rel="noopener">https://redis.io/download</a> 下载安装包到<code>/tmp</code>目录。<br><figure class="highlight jboss-cli"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">cd</span> <span class="string">/tmp</span></span><br><span class="line">wget http:<span class="string">//download.redis.io/releases/redis-3.2.9.tar.gz</span></span><br><span class="line"><span class="comment"># 源地址在国外,存在不稳定的情况。若无法连接,请用p2p工具下载后ftp上传。</span></span><br></pre></td></tr></table></figure></p><p>然后,解压安装包到<code>/opt</code>目录,更改目录名为<code>redis</code><br><figure class="highlight lsl"><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">cd /opt</span><br><span class="line">tar -zxvf /tmp/redis<span class="number">-3.2</span><span class="number">.9</span>.tar.gz</span><br><span class="line">mv redis<span class="number">-3.2</span><span class="number">.9</span> redis</span><br></pre></td></tr></table></figure></p><h4 id="2-编译安装"><a href="#2-编译安装" class="headerlink" title="2. 编译安装"></a>2. 编译安装</h4><figure class="highlight dts"><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">cd <span class="meta-keyword">/opt/</span>redis/src</span><br><span class="line">make</span><br><span class="line"><span class="meta"># 错误提示:<span class="string">"gcc:命令未找到"</span>、<span class="string">"cc: 未找到命令"</span></span></span><br><span class="line"><span class="meta"># 编译需要安装gcc,用yum安装gcc</span></span><br><span class="line">yum install gcc -y</span><br><span class="line"><span class="meta"># 错误提示:<span class="string">"致命错误:jemalloc/jemalloc.h:没有那个文件或目录"</span></span></span><br><span class="line"><span class="meta"># 需要加上参数,不然linux下会报错</span></span><br><span class="line">make MALLOC=libc</span><br></pre></td></tr></table></figure><p>提示<code>Hint: It's a good idea to run 'make test' ;)</code>编译完成</p><p><code>make</code>完成之后,进行<code>make install</code>,默认安装路径为<code>/usr/local/bin</code>下<br><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make <span class="keyword">install</span></span><br></pre></td></tr></table></figure></p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 如下提示则安装完成</span></span><br><span class="line"><span class="keyword">INSTALL</span> <span class="keyword">install</span></span><br><span class="line"><span class="keyword">INSTALL</span> <span class="keyword">install</span></span><br><span class="line"><span class="keyword">INSTALL</span> <span class="keyword">install</span></span><br><span class="line"><span class="keyword">INSTALL</span> <span class="keyword">install</span></span><br><span class="line"><span class="keyword">INSTALL</span> <span class="keyword">install</span></span><br></pre></td></tr></table></figure><h4 id="3-创建redis服务"><a href="#3-创建redis服务" class="headerlink" title="3. 创建redis服务"></a>3. 创建redis服务</h4><p>运行<code>utils</code>目录下的<code>install_server.sh</code>脚本,运行后会询问你几个问题,包括<br>指定redis的端口号<br>指定redis的配置文件<br>指定redis的日志文件<br>指定redis的数据目录文件<br>指定redis的可执行目录文件</p><p>均默认回车即可<br><figure class="highlight jboss-cli"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">cd</span> <span class="string">/opt/redis</span></span><br><span class="line"><span class="string">./utils/install_server.sh</span></span><br></pre></td></tr></table></figure></p><p>提示<code>Installation successful!</code>则安装完成。<br>完成之后,<code>redis</code>的服务就添加完毕了,服务名为<code>redis_6379</code></p><h4 id="4-修改配置"><a href="#4-修改配置" class="headerlink" title="4. 修改配置"></a>4. 修改配置</h4><p>查看redis的配置文件<code>/etc/redis/6379.conf</code></p><p>其中主要的参数:<br>bind:绑定的ip地址<br>port:监听端口号<br>pidfile:pid文件名<br>dir:数据文件目录<br>logfile:日志文件地址<br>requirepass:设置密码<br>protected-mode:保护模式<br>daemonize:守护进程<br><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">vi</span> /etc/redis/<span class="number">6379</span>.<span class="keyword">conf</span></span><br><span class="line"># <span class="keyword">vi</span>编辑器可在命令模式下使用<span class="keyword">set</span> <span class="keyword">nu</span>开启行号</span><br><span class="line"># 使用/xx命令来查找xx。n下一个,<span class="keyword">N</span>上一个。</span><br></pre></td></tr></table></figure></p><p>注释掉ip绑定,开启远程连接<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"># <span class="selector-tag">bind</span> 127<span class="selector-class">.0</span><span class="selector-class">.0</span><span class="selector-class">.1</span></span><br></pre></td></tr></table></figure></p><p>解开requirepass的注释,设置一个访问密码<br><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">requirepass</span> xx123</span><br></pre></td></tr></table></figure></p><p>然后即可使用使用<code>redis-cli</code>连接redis<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 输入密码</span></span><br><span class="line">auth xx123</span><br><span class="line"><span class="comment"># set一个key value expire</span></span><br><span class="line"><span class="keyword">set</span> <span class="keyword">test</span> <span class="number">123</span> <span class="number">100</span></span><br><span class="line"><span class="comment"># 获取一个get key</span></span><br><span class="line"><span class="keyword">get</span> <span class="keyword">test</span></span><br><span class="line"><span class="comment"># 更新生存时间expire key seconds</span></span><br><span class="line"><span class="keyword">expire</span> <span class="keyword">test</span> <span class="number">-1</span></span><br></pre></td></tr></table></figure></p><p>若出现异常可在配置文件中关闭protected-mode保护模式,并且把daemonize设为yes作为守护进程在后台跑。<br><figure class="highlight yaml"><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="string">protected-mode</span> <span class="literal">no</span></span><br><span class="line"><span class="string">daemonize</span> <span class="literal">yes</span></span><br></pre></td></tr></table></figure></p><h3 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h3><p>至此,基于CentOS 7 的MySQL+Tomcat+Redis的JavaWeb环境已安装配置完毕。<br><figure class="highlight sql"><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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 开启服务</span></span><br><span class="line">systemctl <span class="keyword">start</span> tomcat</span><br><span class="line">systemctl <span class="keyword">start</span> mysqld</span><br><span class="line">systemctl <span class="keyword">start</span> redis_6379</span><br><span class="line"><span class="comment"># 停止服务</span></span><br><span class="line">systemctl <span class="keyword">stop</span> tomcat</span><br><span class="line">systemctl <span class="keyword">stop</span> mysqld</span><br><span class="line">systemctl <span class="keyword">stop</span> redis_6379</span><br><span class="line"><span class="comment"># 重启服务</span></span><br><span class="line">systemctl restart tomcat</span><br><span class="line">systemctl restart mysqld</span><br><span class="line">systemctl restart redis_6379</span><br><span class="line"><span class="comment"># 查看服务状态</span></span><br><span class="line">systemctl <span class="keyword">status</span> tomcat</span><br><span class="line">systemctl <span class="keyword">status</span> mysqld</span><br><span class="line">systemctl <span class="keyword">status</span> redis_6379</span><br></pre></td></tr></table></figure></p><h3 id="最最后:"><a href="#最最后:" class="headerlink" title="最最后:"></a>最最后:</h3><p>基于安全管理的前提条件下,每个程序最好都单独建立系统账号和组用于自身的运行。</p><blockquote><p><strong>例如</strong>:安装Tomcat前,单独建立系统帐号和组用于运行Tomcat。<br>首先,创建一个新的tomcat组:<br>groupadd tomcat<br>然后,创建一个新的tomcat用户,指定home目录 /opt/tomcat ,并将tomcat用户加入tomcat组:<br>useradd -M -s /bin/nologin -g tomcat -d /opt/tomcat tomcat<br>接下来,配置目录的归属:<br>chown -R tomcat:tomcat /opt/tomcat</p></blockquote>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/centosjavaweb/centosjavaweb-0.png" class="img-center-logo"><br> 小伙伴近日项目上线,向我询问部署相关知识。这里再重新总结一下Linux下部署环境的配置,使用VMware虚拟机使用CentOS 7.2 x64位系统,在有网络的情况下,最大程度使用YUM进行快速安装。</p>
<blockquote>
<p>安装环境:CentOS7 64位 Minimal版(VMware),安装MySQL5.7,Java1.8,Tomcat8.5,Redis3.2</p>
</blockquote>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<category term="Java" scheme="http://inplus.top/tags/Java/"/>
</entry>
<entry>
<title>终端JuiceSSH v2.1.3特别破解版</title>
<link href="http://inplus.top/archives/juicessh/"/>
<id>http://inplus.top/archives/juicessh/</id>
<published>2017-06-25T16:51:32.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="http://img.inplus.top/juicessh-0.png-logo" alt></p><p>JuiceSSH – 比<a href="https://play.google.com/store/apps/details?id=org.connectbot" target="_blank" rel="noopener">ConnectBot</a>更强大的:一款专为Android打造的支持SSH、LocalShell、Mosh和Telnet的终端客户端。</p><p><strong>功能特点:</strong></p><ul><li>全色彩的终端/SSH 客户端</li><li>突出式的键盘上有着所有有用而又难以找到的字符</li><li>使用音量键快速调整字体大小</li><li>支持使用外接键盘</li><li>支持在 irssi,weechat,tmux 和 screen 中使用手势</li><li>社区和第三方开发的插件</li><li>正式支持 <a href="http://mosh.mit.edu" target="_blank" rel="noopener">mosh</a></li><li>支持 Telnet</li><li>支持 Android 本地 Shell</li></ul><a id="more"></a><ul><li>支持暗色,亮色,80’s hacker,Molokai,Solarized 暗色 和 Solarized 暗色 等终端配色</li><li>点击链接以在浏览器中打开</li><li>在会话中复制和粘帖</li><li>保存和分享 SSH 副本到 Dropbox/Evernote/Email 和 SD 卡</li><li>支持 UTF-8 字符</li><li>通过分组来便捷的管理连接</li><li>在后台保持多个 SSH 会话的连接</li><li>通过其他 SSH 连接代理连接</li><li>打开应用便能快速访问常用的连接</li><li>支持 IPv6</li><li>支持密码和 OpenSSH 私钥(ECDSA,RSA 和 DSA)</li><li>RSA 密钥生成器(支持加密)</li><li>SSH 密钥转发代理</li><li>支持二次认证(比如:Google Authenticator)</li><li>独立于连接的认证管理(用户/密码/密钥)。不必在修改密码时更新每个连接,直接更新认证信息即可,任何使用该认证的连接都会使用新的密码和密钥。</li><li>支持 zlib 压缩,从而优化 SSH 会话在高延迟时的表现</li><li>快速方便的通过应用或桌面挂件连接端口转发,还可以自动打开浏览器。</li><li>集成了对 Amazon AWS / EC2 的支持,自动根据分类和安全组来同步连接和分组。</li><li>通过加密的方式安全地在多台设备之间同步</li><li>自动地备份连接和设置,并使用 AES-256 加密</li><li>通过美观的桌面挂件快速访问常用的连接,或者是某组连接(Android 3.0+)。</li><li>团队合作。与你的团队成员共享某组连接,开始一起工作而不是各自为战。</li><li>通过代码片段库来便捷的使用常用命令</li><li>安全锁机制能自动在一段时间不使用后锁定 JuiceSSH</li></ul><p><img src="http://img.inplus.top/juicessh-1.png-screenshot" alt> <img src="http://img.inplus.top/juicessh-2.png-screenshot" alt></p><p><img src="http://img.inplus.top/juicessh-3.png-screenshot" alt> <img src="http://img.inplus.top/juicessh-4.png-screenshot" alt></p><figure class="highlight armasm"><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><br><span class="line"><span class="number">2</span>.<span class="number">1</span>.<span class="number">3</span></span><br><span class="line">- Fixed Performance Monitor plugin on <span class="keyword">Android </span>N+</span><br><span class="line">- New Material theme for Performance Monitor plugin (thanks hwding)</span><br><span class="line">- Fixed a few <span class="keyword">bad </span><span class="keyword">Italian </span>translations</span><br></pre></td></tr></table></figure><p>来源:<a href="https://juicessh.com" target="_blank" rel="noopener">https://juicessh.com</a><br>Google Play:<br><a href="https://play.google.com/store/apps/details?id=com.sonelli.juicessh" target="_blank" rel="noopener">https://play.google.com/store/apps/details?id=com.sonelli.juicessh</a></p><hr><p><strong>修改说明:</strong></p><ol><li>破解完整高级功能</li><li>精简多余语言包</li><li>arm架构包体积精简</li><li>精简部分无用菜单项</li><li>精简bash、mosh_client、telnet架构库</li><li>补全部分汉化</li><li>zipalign对齐优化</li></ol><p><strong>修改人员:<a href>风澈vio</a>(转载必须注明出处)</strong></p><p><strong>下载地址:<a href="https://pan.baidu.com/s/1geVvu3T" target="_blank" rel="noopener">百度网盘</a> 密码:1024</strong></p><ul><li>注意:</li><li>使用者由此程序所造成的损失修改者不承担任何责任。</li><li>最终版权归原作者所有。</li><li>请在法律允许的范围内合理使用本程序。</li></ul>]]></content>
<summary type="html">
<p><img src="http://img.inplus.top/juicessh-0.png-logo" alt></p>
<p>JuiceSSH – 比<a href="https://play.google.com/store/apps/details?id=org.connectbot" target="_blank" rel="noopener">ConnectBot</a>更强大的:一款专为Android打造的支持SSH、LocalShell、Mosh和Telnet的终端客户端。</p>
<p><strong>功能特点:</strong></p>
<ul>
<li>全色彩的终端/SSH 客户端</li>
<li>突出式的键盘上有着所有有用而又难以找到的字符</li>
<li>使用音量键快速调整字体大小</li>
<li>支持使用外接键盘</li>
<li>支持在 irssi,weechat,tmux 和 screen 中使用手势</li>
<li>社区和第三方开发的插件</li>
<li>正式支持 <a href="http://mosh.mit.edu" target="_blank" rel="noopener">mosh</a></li>
<li>支持 Telnet</li>
<li>支持 Android 本地 Shell</li>
</ul>
</summary>
<category term="App" scheme="http://inplus.top/tags/App/"/>
</entry>
<entry>
<title>一次Chrome滑稽之路...</title>
<link href="http://inplus.top/archives/chromeeggs/"/>
<id>http://inplus.top/archives/chromeeggs/</id>
<published>2017-06-11T23:20:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p> 应该有不少人知道Chrome的离线小彩蛋,当你的电脑或手机无法连接网络的时候,Chrome会有下面这段提示:</p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-1.png"></p><p>而此时如果你敲一下空格键(手机用户则是按一下触摸屏),就会激活这个彩蛋啦。<br>小恐龙开始在广阔无垠的大地上奔跑起来~</p><a id="more"></a><p><img src="/assets/blogImg/chromeeggs/chromeeggs-2.png"></p><p>而游戏其实很简单,类似简易版超级马里奥,不停敲击空格或者↑键跳起来避开障碍物,按↓键可以下蹲。</p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-3.png"></p><p>如果是暂时的断网,这个小游戏用来消磨下时间已经足够。</p><p>相信很多人随随便便也都能玩上两三百分,仔细玩一下便发现了这个游戏的有趣之处。</p><p>当你每获得100分,就会有个提示音出来表扬一下。</p><p>游戏速度也会越来越快。</p><p>而当你玩到400分以后,便有会飞的翼龙出现,阻挡你的前进步伐!</p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-4.png"></p><p>这时的小恐龙将会时长使用超能力:下蹲!<br>用来躲过飞得不太高但又无法跳过的翼龙。</p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-5.png"></p><p>当你奔跑到大概700分,天会突然暗下来,开始了黑夜中的孤独奔跑。</p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-6.png"></p><p>相信很多玩到700分以后的高手都了解以上游戏流程,在此之后随着分数变化,开始黑夜与白天的交替,我们孤独的小恐龙在仙人掌和翼龙的阻挠下,顽强奔跑在荒芜的大地上,不知疲倦地经历了无数个日日夜夜……</p><p>接着便是恢复网络开始正常上网,<br>或者因为体力不支游戏重新来过……</p><p>很少有人能坚持玩到3600分,</p><p>在一个没有网络的世界,<br>面对着黑白两色的像素块独自坐上一上午甚至一整天,<br>这该是多么的寂寞啊……</p><hr><figure class="highlight actionscript"><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><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">所以我们需要做一些有意思的事情...</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line">↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓</span><br></pre></td></tr></table></figure><hr><p>Chrome的这个小游戏可能是为了断网的时候提供消遣的小插曲。</p><p>实际上你不需要断网,使用<a href="chrome://network-error/-106" target="_blank" rel="noopener">chrome://network-error/-106</a>即可以使用它,因为这是一个chrome定义的网络错误,Google工程师也会使用这种方式来测试而不是断网。可以通过<a href="chrome://network-errors" target="_blank" rel="noopener">chrome://network-errors</a>来查看所有的网络错误。</p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-7.png"></p><p>仔细研究一下这个彩蛋,Ctrl+Shift+i查看网络访问资源,我们可以从网页中找到这样的图像。</p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-8.png"></p><p>究其根本,其实游戏中几乎所有的图片都裁剪于这幅图。<br>(把游戏真正底层的东西拿出来会发现很让人失望,但是正是这些“冰冷的规则”如同我们不忍直视的内脏器官一样支持了表面的光鲜亮丽)。</p><p>我们进入调试界面来验证一下。</p><p>F12,然后选中 console</p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-9.png"></p><p>我事先做好了一张“完美”的脑补图。。。</p><p>下面我们输入命令将图片改成这个(请确保这个时候连着网以便加载图片,即使用之前不需断网的方法):</p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-10.png"></p><figure class="highlight coffeescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">document</span>.getElementById(<span class="string">"offline-resources-1x"</span>).src=<span class="string">"https://ooo.0o0.ooo/2017/05/30/592d2daed3309.png"</span></span><br></pre></td></tr></table></figure><p>即</p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-11.png"></p><p>于是再次玩的时候就变成了这个样子</p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-12.png"></p><p><img src="/assets/blogImg/chromeeggs/chromeeggs-13.png"></p><p>其实我们还可以实现很多脑补的效果,例如:<br> 我们设置15秒后执行刚才的命令,然后立刻开始游戏:<br> <figure class="highlight coffeescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">setTimeout(<span class="function"><span class="params">()</span>=></span>{<span class="built_in">document</span>.getElementById(<span class="string">"offline-resources-2x"</span>).src=<span class="string">"https://ooo.0o0.ooo/2017/05/30/592d2daed3309.png"</span>}, <span class="number">15000</span>)</span><br></pre></td></tr></table></figure></p><p>这样大约15秒后会突然滑稽。。。</p><p>一切毫无违和感。</p><hr><p>特别感谢<a href="https://suquark.github.io/" target="_blank" rel="noopener">@庄思源</a></p>]]></content>
<summary type="html">
<p> 应该有不少人知道Chrome的离线小彩蛋,当你的电脑或手机无法连接网络的时候,Chrome会有下面这段提示:</p>
<p><img src="/assets/blogImg/chromeeggs/chromeeggs-1.png"></p>
<p>而此时如果你敲一下空格键(手机用户则是按一下触摸屏),就会激活这个彩蛋啦。<br>小恐龙开始在广阔无垠的大地上奔跑起来~</p>
</summary>
<category term="宇宙之大" scheme="http://inplus.top/tags/%E5%AE%87%E5%AE%99%E4%B9%8B%E5%A4%A7/"/>
</entry>
<entry>
<title>在MySQL中实现Rank高级排名函数</title>
<link href="http://inplus.top/archives/mysqlrank/"/>
<id>http://inplus.top/archives/mysqlrank/</id>
<published>2017-06-06T14:35:06.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p> MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名。尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名效果。</p><p>在这里我用一个简单例子来实现排名的查询:</p><p>首先我们先创建一个我们需要进行高级排名查询的<code>players</code>表,<br><a id="more"></a></p><figure class="highlight sql"><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">CREATE</span> <span class="keyword">TABLE</span> <span class="string">`players`</span> (</span><br><span class="line"> <span class="string">`pid`</span> <span class="built_in">int</span>(<span class="number">2</span>) <span class="keyword">NOT</span> <span class="literal">NULL</span> AUTO_INCREMENT,</span><br><span class="line"> <span class="string">`name`</span> <span class="built_in">varchar</span>(<span class="number">50</span>) <span class="keyword">NOT</span> <span class="literal">NULL</span>,</span><br><span class="line"> <span class="string">`age`</span> <span class="built_in">int</span>(<span class="number">2</span>) <span class="keyword">NOT</span> <span class="literal">NULL</span>,</span><br><span class="line"> PRIMARY <span class="keyword">KEY</span> (<span class="string">`pid`</span>),</span><br><span class="line"> <span class="keyword">UNIQUE</span> <span class="keyword">KEY</span> <span class="string">`name`</span> (<span class="string">`name`</span>)</span><br><span class="line">) <span class="keyword">ENGINE</span>=<span class="keyword">InnoDB</span> <span class="keyword">DEFAULT</span> <span class="keyword">CHARSET</span>=latin1;</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> <span class="string">`players`</span> (<span class="string">`pid`</span>, <span class="string">`name`</span>, <span class="string">`age`</span>) <span class="keyword">VALUES</span></span><br><span class="line">(<span class="number">1</span>, <span class="string">'Samual'</span>, <span class="number">25</span>),</span><br><span class="line">(<span class="number">2</span>, <span class="string">'Vino'</span>, <span class="number">20</span>),</span><br><span class="line">(<span class="number">3</span>, <span class="string">'John'</span>, <span class="number">20</span>),</span><br><span class="line">(<span class="number">4</span>, <span class="string">'Andy'</span>, <span class="number">22</span>),</span><br><span class="line">(<span class="number">5</span>, <span class="string">'Brian'</span>, <span class="number">21</span>),</span><br><span class="line">(<span class="number">6</span>, <span class="string">'Dew'</span>, <span class="number">24</span>),</span><br><span class="line">(<span class="number">7</span>, <span class="string">'Kris'</span>, <span class="number">25</span>),</span><br><span class="line">(<span class="number">8</span>, <span class="string">'William'</span>, <span class="number">26</span>),</span><br><span class="line">(<span class="number">9</span>, <span class="string">'George'</span>, <span class="number">23</span>),</span><br><span class="line">(<span class="number">10</span>, <span class="string">'Peter'</span>, <span class="number">19</span>),</span><br><span class="line">(<span class="number">11</span>, <span class="string">'Tom'</span>, <span class="number">20</span>),</span><br><span class="line">(<span class="number">12</span>, <span class="string">'Andre'</span>, <span class="number">20</span>);</span><br></pre></td></tr></table></figure><h3 id="1、在MySQL中实现Rank普通排名函数"><a href="#1、在MySQL中实现Rank普通排名函数" class="headerlink" title="1、在MySQL中实现Rank普通排名函数"></a>1、在MySQL中实现Rank普通排名函数</h3><p>在这里,我们希望获得一个排名字段的列,以及<code>age</code>的升序排列。所以我们的查询语句将是:<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> pid, <span class="keyword">name</span>, age, @curRank := @curRank + <span class="number">1</span> <span class="keyword">AS</span> <span class="keyword">rank</span></span><br><span class="line"><span class="keyword">FROM</span> players p, (</span><br><span class="line"><span class="keyword">SELECT</span> @curRank := <span class="number">0</span></span><br><span class="line">) q</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> age</span><br></pre></td></tr></table></figure></p><figure class="highlight gherkin"><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="string"> PID </span>|<span class="string"> NAME </span>|<span class="string"> AGE </span>|<span class="string"> RANK </span>|</span><br><span class="line">|<span class="string">-----</span>|<span class="string">---------</span>|<span class="string">-----</span>|<span class="string">------</span>|</span><br><span class="line">|<span class="string"> 10 </span>|<span class="string"> Peter </span>|<span class="string"> 19 </span>|<span class="string"> 1 </span>|</span><br><span class="line">|<span class="string"> 12 </span>|<span class="string"> Andre </span>|<span class="string"> 20 </span>|<span class="string"> 2 </span>|</span><br><span class="line">|<span class="string"> 2 </span>|<span class="string"> Vino </span>|<span class="string"> 20 </span>|<span class="string"> 3 </span>|</span><br><span class="line">|<span class="string"> 3 </span>|<span class="string"> John </span>|<span class="string"> 20 </span>|<span class="string"> 4 </span>|</span><br><span class="line">|<span class="string"> 11 </span>|<span class="string"> Tom </span>|<span class="string"> 20 </span>|<span class="string"> 5 </span>|</span><br><span class="line">|<span class="string"> 5 </span>|<span class="string"> Brian </span>|<span class="string"> 21 </span>|<span class="string"> 6 </span>|</span><br><span class="line">|<span class="string"> 4 </span>|<span class="string"> Andy </span>|<span class="string"> 22 </span>|<span class="string"> 7 </span>|</span><br><span class="line">|<span class="string"> 9 </span>|<span class="string"> George </span>|<span class="string"> 23 </span>|<span class="string"> 8 </span>|</span><br><span class="line">|<span class="string"> 6 </span>|<span class="string"> Dew </span>|<span class="string"> 24 </span>|<span class="string"> 9 </span>|</span><br><span class="line">|<span class="string"> 7 </span>|<span class="string"> Kris </span>|<span class="string"> 25 </span>|<span class="string"> 10 </span>|</span><br><span class="line">|<span class="string"> 1 </span>|<span class="string"> Samual </span>|<span class="string"> 25 </span>|<span class="string"> 11 </span>|</span><br><span class="line">|<span class="string"> 8 </span>|<span class="string"> William </span>|<span class="string"> 26 </span>|<span class="string"> 12 </span>|</span><br></pre></td></tr></table></figure><p>要在mysql中声明一个变量,你必须在变量名之前使用<code>@</code>符号。FROM子句中的<code>(@curRank := 0)</code>部分允许我们进行变量初始化,而不需要单独的<code>SET</code>命令。当然,也可以使用<code>SET</code>,但它会处理两个查询:<br><figure class="highlight sql"><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"><span class="keyword">SET</span> @curRank := <span class="number">0</span>;</span><br><span class="line"><span class="keyword">SELECT</span> pid, <span class="keyword">name</span>, age, @curRank := @curRank + <span class="number">1</span> <span class="keyword">AS</span> <span class="keyword">rank</span></span><br><span class="line"><span class="keyword">FROM</span> players</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> age</span><br></pre></td></tr></table></figure></p><hr><h3 id="2、查询以降序排列"><a href="#2、查询以降序排列" class="headerlink" title="2、查询以降序排列"></a>2、查询以降序排列</h3><p>首要按age的降序排列,其次按name进行排列,只需修改查询语句加上<code>ORDER BY</code>和 <code>DESC</code>以及列名即可。<br><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> pid, <span class="keyword">name</span>, age, @curRank := @curRank + <span class="number">1</span> <span class="keyword">AS</span> <span class="keyword">rank</span></span><br><span class="line"><span class="keyword">FROM</span> players p, (</span><br><span class="line"><span class="keyword">SELECT</span> @curRank := <span class="number">0</span></span><br><span class="line">) q</span><br><span class="line"><span class="keyword">ORDER</span> <span class="keyword">BY</span> age <span class="keyword">DESC</span>, <span class="keyword">name</span></span><br></pre></td></tr></table></figure></p><figure class="highlight gherkin"><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="string"> PID </span>|<span class="string"> NAME </span>|<span class="string"> AGE </span>|<span class="string"> RANK </span>|</span><br><span class="line">|<span class="string">-----</span>|<span class="string">---------</span>|<span class="string">-----</span>|<span class="string">------</span>|</span><br><span class="line">|<span class="string"> 8 </span>|<span class="string"> William </span>|<span class="string"> 26 </span>|<span class="string"> 1 </span>|</span><br><span class="line">|<span class="string"> 7 </span>|<span class="string"> Kris </span>|<span class="string"> 25 </span>|<span class="string"> 2 </span>|</span><br><span class="line">|<span class="string"> 1 </span>|<span class="string"> Samual </span>|<span class="string"> 25 </span>|<span class="string"> 3 </span>|</span><br><span class="line">|<span class="string"> 6 </span>|<span class="string"> Dew </span>|<span class="string"> 24 </span>|<span class="string"> 4 </span>|</span><br><span class="line">|<span class="string"> 9 </span>|<span class="string"> George </span>|<span class="string"> 23 </span>|<span class="string"> 5 </span>|</span><br><span class="line">|<span class="string"> 4 </span>|<span class="string"> Andy </span>|<span class="string"> 22 </span>|<span class="string"> 6 </span>|</span><br><span class="line">|<span class="string"> 5 </span>|<span class="string"> Brian </span>|<span class="string"> 21 </span>|<span class="string"> 7 </span>|</span><br><span class="line">|<span class="string"> 12 </span>|<span class="string"> Andre </span>|<span class="string"> 20 </span>|<span class="string"> 8 </span>|</span><br><span class="line">|<span class="string"> 3 </span>|<span class="string"> John </span>|<span class="string"> 20 </span>|<span class="string"> 9 </span>|</span><br><span class="line">|<span class="string"> 11 </span>|<span class="string"> Tom </span>|<span class="string"> 20 </span>|<span class="string"> 10 </span>|</span><br><span class="line">|<span class="string"> 2 </span>|<span class="string"> Vino </span>|<span class="string"> 20 </span>|<span class="string"> 11 </span>|</span><br><span class="line">|<span class="string"> 10 </span>|<span class="string"> Peter </span>|<span class="string"> 19 </span>|<span class="string"> 12 </span>|</span><br></pre></td></tr></table></figure><hr><h3 id="3、在MySQL中实现Rank普通并列排名函数"><a href="#3、在MySQL中实现Rank普通并列排名函数" class="headerlink" title="3、在MySQL中实现Rank普通并列排名函数"></a>3、在MySQL中实现Rank普通并列排名函数</h3><p>现在,如果我们希望为并列数据的行赋予相同的排名,则意味着那些在排名比较列中具有相同值的行应在MySQL中计算排名时保持相同的排名(例如在我们的例子中的<code>age</code>)。为此,我们使用了一个额外的变量。<br><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">SELECT</span> <span class="selector-tag">pid</span>, <span class="selector-tag">name</span>, <span class="selector-tag">age</span>, </span><br><span class="line"><span class="selector-tag">CASE</span> </span><br><span class="line"><span class="keyword">WHEN</span> <span class="variable">@prevRank</span> = age THEN <span class="variable">@curRank</span> </span><br><span class="line"><span class="keyword">WHEN</span> <span class="variable">@prevRank</span> := age THEN <span class="variable">@curRank</span> := <span class="variable">@curRank</span> + <span class="number">1</span></span><br><span class="line">END AS rank</span><br><span class="line">FROM players p, </span><br><span class="line">(SELECT <span class="variable">@curRank</span> :=<span class="number">0</span>, <span class="variable">@prevRank</span> := NULL) r</span><br><span class="line">ORDER BY age</span><br></pre></td></tr></table></figure></p><figure class="highlight gherkin"><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="string"> PID </span>|<span class="string"> NAME </span>|<span class="string"> AGE </span>|<span class="string"> RANK </span>|</span><br><span class="line">|<span class="string">-----</span>|<span class="string">---------</span>|<span class="string">-----</span>|<span class="string">------</span>|</span><br><span class="line">|<span class="string"> 10 </span>|<span class="string"> Peter </span>|<span class="string"> 19 </span>|<span class="string"> 1 </span>|</span><br><span class="line">|<span class="string"> 12 </span>|<span class="string"> Andre </span>|<span class="string"> 20 </span>|<span class="string"> 2 </span>|</span><br><span class="line">|<span class="string"> 2 </span>|<span class="string"> Vino </span>|<span class="string"> 20 </span>|<span class="string"> 2 </span>|</span><br><span class="line">|<span class="string"> 3 </span>|<span class="string"> John </span>|<span class="string"> 20 </span>|<span class="string"> 2 </span>|</span><br><span class="line">|<span class="string"> 11 </span>|<span class="string"> Tom </span>|<span class="string"> 20 </span>|<span class="string"> 2 </span>|</span><br><span class="line">|<span class="string"> 5 </span>|<span class="string"> Brian </span>|<span class="string"> 21 </span>|<span class="string"> 3 </span>|</span><br><span class="line">|<span class="string"> 4 </span>|<span class="string"> Andy </span>|<span class="string"> 22 </span>|<span class="string"> 4 </span>|</span><br><span class="line">|<span class="string"> 9 </span>|<span class="string"> George </span>|<span class="string"> 23 </span>|<span class="string"> 5 </span>|</span><br><span class="line">|<span class="string"> 6 </span>|<span class="string"> Dew </span>|<span class="string"> 24 </span>|<span class="string"> 6 </span>|</span><br><span class="line">|<span class="string"> 7 </span>|<span class="string"> Kris </span>|<span class="string"> 25 </span>|<span class="string"> 7 </span>|</span><br><span class="line">|<span class="string"> 1 </span>|<span class="string"> Samual </span>|<span class="string"> 25 </span>|<span class="string"> 7 </span>|</span><br><span class="line">|<span class="string"> 8 </span>|<span class="string"> William </span>|<span class="string"> 26 </span>|<span class="string"> 8 </span>|</span><br></pre></td></tr></table></figure><p>如上所示,具有相同数据和排行的两行或多行,它们都会获得相同的排名。玩家Andre, Vino, John 和Tom都有相同的age,所以他们排名并列第二。下一个最高age的玩家(Brian)排名第3。这个查询相当于MSSQL和ORACLE 中的<strong>DENSE_RANK()</strong>函数。</p><hr><h3 id="4、在MySQL中实现Rank高级并列排名函数"><a href="#4、在MySQL中实现Rank高级并列排名函数" class="headerlink" title="4、在MySQL中实现Rank高级并列排名函数"></a>4、在MySQL中实现Rank高级并列排名函数</h3><p>当使用RANK()函数时,如果两个或以上的行排名并列,则相同的行都会有相同的排名,但是实际排名中存在有关系的差距。<br><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">SELECT</span> <span class="selector-tag">pid</span>, <span class="selector-tag">name</span>, <span class="selector-tag">age</span>, <span class="selector-tag">rank</span> <span class="selector-tag">FROM</span></span><br><span class="line">(SELECT pid, name, age,</span><br><span class="line"><span class="variable">@curRank</span> := IF(<span class="variable">@prevRank</span> = age, <span class="variable">@curRank</span>, <span class="variable">@incRank</span>) AS rank, </span><br><span class="line"><span class="variable">@incRank</span> := <span class="variable">@incRank</span> + <span class="number">1</span>, </span><br><span class="line"><span class="variable">@prevRank</span> := age</span><br><span class="line">FROM players p, (</span><br><span class="line">SELECT <span class="variable">@curRank</span> :=<span class="number">0</span>, <span class="variable">@prevRank</span> := NULL, <span class="variable">@incRank</span> := <span class="number">1</span></span><br><span class="line">) r </span><br><span class="line">ORDER BY age) <span class="selector-tag">s</span></span><br></pre></td></tr></table></figure></p><p>这是一个查询中的子查询。我们使用三个变量(@incRank,@prevRank,@curRank)来计算关系的情况下,在查询结果中我们已经补全了因为并列而导致的排名空位。我们已经封闭子查询到查询。这个查询相当于MSSQL和ORACLE中的<strong>RANK()</strong>函数。<br><figure class="highlight gherkin"><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="string"> PID </span>|<span class="string"> NAME </span>|<span class="string"> AGE </span>|<span class="string"> RANK </span>|</span><br><span class="line">|<span class="string">-----</span>|<span class="string">---------</span>|<span class="string">-----</span>|<span class="string">------</span>|</span><br><span class="line">|<span class="string"> 10 </span>|<span class="string"> Peter </span>|<span class="string"> 19 </span>|<span class="string"> 1 </span>|</span><br><span class="line">|<span class="string"> 12 </span>|<span class="string"> Andre </span>|<span class="string"> 20 </span>|<span class="string"> 2 </span>|</span><br><span class="line">|<span class="string"> 2 </span>|<span class="string"> Vino </span>|<span class="string"> 20 </span>|<span class="string"> 2 </span>|</span><br><span class="line">|<span class="string"> 3 </span>|<span class="string"> John </span>|<span class="string"> 20 </span>|<span class="string"> 2 </span>|</span><br><span class="line">|<span class="string"> 11 </span>|<span class="string"> Tom </span>|<span class="string"> 20 </span>|<span class="string"> 2 </span>|</span><br><span class="line">|<span class="string"> 5 </span>|<span class="string"> Brian </span>|<span class="string"> 21 </span>|<span class="string"> 6 </span>|</span><br><span class="line">|<span class="string"> 4 </span>|<span class="string"> Andy </span>|<span class="string"> 22 </span>|<span class="string"> 7 </span>|</span><br><span class="line">|<span class="string"> 9 </span>|<span class="string"> George </span>|<span class="string"> 23 </span>|<span class="string"> 8 </span>|</span><br><span class="line">|<span class="string"> 6 </span>|<span class="string"> Dew </span>|<span class="string"> 24 </span>|<span class="string"> 9 </span>|</span><br><span class="line">|<span class="string"> 7 </span>|<span class="string"> Kris </span>|<span class="string"> 25 </span>|<span class="string"> 10 </span>|</span><br><span class="line">|<span class="string"> 1 </span>|<span class="string"> Samual </span>|<span class="string"> 25 </span>|<span class="string"> 10 </span>|</span><br><span class="line">|<span class="string"> 8 </span>|<span class="string"> William </span>|<span class="string"> 26 </span>|<span class="string"> 12 </span>|</span><br></pre></td></tr></table></figure></p><p>在这里我们可以看到,Andre,Vino,John和Tom都有相同的age,所以他们排名并列第二。下一个最高年龄的球员(Brian)排名第6,而不是第3,因为有4个人并列排名在第2。</p><p>好的,我希望在这些例子后,能让你了解RANK()和DENSE_RANK()之间的区别,并且知道在哪里应使用哪个查询来获取MySQL中的rank函数。谢谢。<br> <br> <br> <br>via <a href="http://fellowtuts.com/mysql/query-to-obtain-rank-function-in-mysql" target="_blank" rel="noopener">http://fellowtuts.com/mysql/query-to-obtain-rank-function-in-mysql</a></p>]]></content>
<summary type="html">
<p> MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名。尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名效果。</p>
<p>在这里我用一个简单例子来实现排名的查询:</p>
<p>首先我们先创建一个我们需要进行高级排名查询的<code>players</code>表,<br>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<category term="mysql" scheme="http://inplus.top/tags/mysql/"/>
</entry>
<entry>
<title>Android逆向之smali语法宝典</title>
<link href="http://inplus.top/archives/android-reverse-smali/"/>
<id>http://inplus.top/archives/android-reverse-smali/</id>
<published>2017-05-02T23:47:09.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>Android采用的是java语言进行开发,但是Android系统有自己的虚拟机Dalvik和ART,代码编译最终不是采用的java的class,而是使用的smali。我们反编译得到的代码,jar的话可能很多地方无法正确的解释出来,如果我们反编译的是smali则可以正确的理解程序的意思。因此,我们有必要熟悉smali语法。<br><a id="more"></a></p><h4 id="关键字"><a href="#关键字" class="headerlink" title="关键字"></a>关键字</h4><p>.field private isFlag:z — 定义变量<br>.method — 方法<br>.parameter — 方法参数<br>.prologue — 方法开始<br>.line 12 — 此方法位于第12行<br>invoke-super — 调用父函数<br>const/high16 v0, 0x7fo3 — 把0x7fo3赋值给v0<br>invoke-direct — 调用函数<br>return-void — 函数返回void<br>.end method — 函数结束<br>new-instance — 创建实例<br>iput-object — 对象赋值<br>iget-object — 调用对象<br>invoke-static — 调用静态函数</p><h4 id="数据类型"><a href="#数据类型" class="headerlink" title="数据类型"></a>数据类型</h4><p>java里面包含两种数据类型,基本数据类型和引用类型(包括对象),同时映射到smali也是有这两大类型。</p><p><strong>基本数据类型</strong></p><ul><li>B — byte</li><li>C — char</li><li>D — double (64 bits)</li><li>F — float</li><li>I — int</li><li>J — long (64 bits)</li><li>S — short</li><li>V — void 只能用于返回值类型</li><li>Z — boolean</li></ul><p><strong>对象类型</strong></p><ul><li>Lxxx/yyy/zzz; — object</li></ul><blockquote><p><code>L</code>表示这是一个对象类型<br><code>xxx/yyy</code>是该对象所在的包<br><code>zzz</code>是对象名称<br><code>;</code>标识对象名称的结束</p></blockquote><p><strong>数组类型</strong></p><ul><li>[XXX — array</li></ul><blockquote><p><code>[I</code>表示一个int型的一维数组,相当于<code>int[]</code><br>增加一个维度增加一个<code>[</code>,如<code>[[I</code>表示<code>int[][]</code><br>数组每一个维度最多255个;<br>对象数组表示也是类似,如String数组的表示是<code>[Ljava/lang/String</code></p></blockquote><h4 id="寄存器与变量"><a href="#寄存器与变量" class="headerlink" title="寄存器与变量"></a>寄存器与变量</h4><p>java中变量都是存放在内存中的,android为了提高性能,变量都是存放在寄存器中的,寄存器为32位,可以支持任何类型,其中long和double是64为的,需要使用两个寄存器保存。<br>寄存器采用v和p来命名<br>v表示本地寄存器,p表示参数寄存器,关系如下<br>如果一个方法有两个本地变量,有三个参数</p><blockquote><p><code>v0</code>第一个本地寄存器<br><code>v1</code>第二个本地寄存器<br><code>v2 p0</code>(this)<br><code>v3 p1</code>第一个参数<br><code>v4 p2</code>第二个参数<br><code>v5 p3</code>第三个参数</p></blockquote><p>当然,如果是静态方法的话就只有5个寄存器了,不需要存this了。<br><code>.registers</code>使用这个指令指定方法中寄存器的总数<br><code>.locals</code>使用这个指定表明方法中非参寄存器的总数,放在方法的第一行。</p><h4 id="方法和字段"><a href="#方法和字段" class="headerlink" title="方法和字段"></a>方法和字段</h4><p><strong>方法签名</strong><br>methodName(III)Lpackage/name/ObjectName;<br>如果做过ndk开发的对于这样的签名应该很熟悉的,就是这样来标识一个方法的。上面methodName标识方法名,III表示三个整形参数,Lpackage/name/ObjectName;表示返回值的类型。</p><p><strong>方法的表示</strong><br>Lpackage/name/ObjectName;——>methodName(III)Z<br>即 package.name.ObjectName中的 function boolean methondName(int a, int b, int c) 类似这样子</p><p><strong>字段的表示</strong><br>Lpackage/name/ObjectName;——>FieldName:Ljava/lang/String;<br>即表示: 包名,字段名和各字段类型</p><p><strong>方法的定义</strong><br>比如下面的一个方法<br><figure class="highlight cpp"><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="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">int</span> <span class="title">sum</span><span class="params">(<span class="keyword">int</span> a, <span class="keyword">int</span> b)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> a+b;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>使用编译后是这样<br><figure class="highlight smali"><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="keyword">.method</span><span class="keyword"> private</span><span class="keyword"> static</span> sum(II)I</span><br><span class="line"><span class="keyword"> .locals</span> 4 <span class="comment">#表示需要申请4个本地寄存器</span></span><br><span class="line"><span class="keyword"> .parameter</span></span><br><span class="line"><span class="keyword"> .parameter</span> <span class="comment">#这里表示有两个参数</span></span><br><span class="line"><span class="keyword"> .prologue</span></span><br><span class="line"><span class="keyword"> .line</span> 27 </span><br><span class="line"> <span class="built_in"> move </span>v0, p0</span><br><span class="line"><span class="keyword"> .local</span> v0, a:I</span><br><span class="line"> <span class="built_in"> move </span>v1, p1</span><br><span class="line"><span class="keyword"> .local</span> v1, b:I</span><br><span class="line"> <span class="built_in"> move </span>v2, v0</span><br><span class="line"> <span class="built_in"> move </span>v3, v1</span><br><span class="line"> <span class="built_in"> add-int/2addr </span>v2, v3</span><br><span class="line"> <span class="built_in"> move </span>v0, v2</span><br><span class="line"><span class="keyword"> .end local</span> v0 <span class="comment">#a:I</span></span><br><span class="line"> <span class="built_in"> return </span>v0</span><br><span class="line"><span class="keyword">.end method</span></span><br></pre></td></tr></table></figure></p><p>从上面可以看到函数声明使用.method开始 .end method结束,java中的关键词private,static 等都可以使用,同时使用签名来表示唯一的方法,这里是sum(II)I。</p><p><strong>声明成员</strong><br>.field private name:Lpackage/name/ObjectName;<br>比如:private TextView mTextView;表示就是<br>.field private mTextView:Landroid/widget/TextView;<br>private int mCount;<br>.field private mCount:I</p><h4 id="指令执行"><a href="#指令执行" class="headerlink" title="指令执行"></a>指令执行</h4><p>smali字节码是类似于汇编的,如果你有汇编基础,理解起来是非常容易的。<br>比如:<br>move v0, v3 #把v3寄存器的值移动到寄存器v0上.<br>const v0, 0x1 #把值0x1赋值到寄存器v0上。<br>invoke-static {v4, v5}, Lme/isming/myapplication/MainActivity;->sum(II)I #执行方法sum(),v4,v5的值分别作为sum的参数。</p><h4 id="条件跳转分支"><a href="#条件跳转分支" class="headerlink" title="条件跳转分支"></a>条件跳转分支</h4><p>“if-eq vA, vB, :cond_x” — 如果vA等于vB则跳转到:cond_x<br>“if-ne vA, vB, :cond_x” — 如果vA不等于vB则跳转到:cond_x<br>“if-lt vA, vB, :cond_x” — 如果vA小于vB则跳转到:cond_x<br>“if-ge vA, vB, :cond_x” — 如果vA大于等于vB则跳转到:cond_x<br>“if-gt vA, vB, :cond_x” — 如果vA大于vB则跳转到:cond_x<br>“if-le vA, vB, :cond_x” — 如果vA小于等于vB则跳转到:cond_x<br>“if-eqz vA, :cond_x” — 如果vA等于0则跳转到:cond_x<br>“if-nez vA, :cond_x” — 如果vA不等于0则跳转到:cond_x<br>“if-ltz vA, :cond_x” — 如果vA小于0则跳转到:cond_x<br>“if-gez vA, :cond_x” — 如果vA大于等于0则跳转到:cond_x<br>“if-gtz vA, :cond_x” — 如果vA大于0则跳转到:cond_x<br>“if-lez vA, :cond_x” — 如果vA小于等于0则跳转到:cond_x</p><h4 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h4><p>最后附上一些参考资料:<br><a href="http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html" target="_blank" rel="noopener">http://pallergabor.uw.hu/androidblog/dalvik_opcodes.html</a><br><a href="https://code.google.com/p/smali/w/list" target="_blank" rel="noopener">https://code.google.com/p/smali/w/list</a><br><a href="http://blog.csdn.net/lpohvbe/article/details/7981386" target="_blank" rel="noopener">http://blog.csdn.net/lpohvbe/article/details/7981386</a><br><a href="http://blog.csdn.net/lpohvbe/article/details/7983907" target="_blank" rel="noopener">http://blog.csdn.net/lpohvbe/article/details/7983907</a></p><hr><p>特别感谢<a href="http://blog.isming.me/" target="_blank" rel="noopener">@Sam</a></p>]]></content>
<summary type="html">
<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>Android采用的是java语言进行开发,但是Android系统有自己的虚拟机Dalvik和ART,代码编译最终不是采用的java的class,而是使用的smali。我们反编译得到的代码,jar的话可能很多地方无法正确的解释出来,如果我们反编译的是smali则可以正确的理解程序的意思。因此,我们有必要熟悉smali语法。<br>
</summary>
<category term="Android" scheme="http://inplus.top/tags/Android/"/>
<category term="逆向札记" scheme="http://inplus.top/tags/%E9%80%86%E5%90%91%E6%9C%AD%E8%AE%B0/"/>
</entry>
<entry>
<title>3D桌球Pool Break Pro v2.7.2汉化特别版</title>
<link href="http://inplus.top/archives/poolbreak/"/>
<id>http://inplus.top/archives/poolbreak/</id>
<published>2017-04-23T21:00:20.000Z</published>
<updated>2016-12-05T17:29:20.000Z</updated>
<content type="html"><![CDATA[<p><img src="http://img.inplus.top/poolbreak-0.png-logo" alt><br>Pool Break是一套具有多种台球玩法,包括八球,九球,斯诺克,克朗棋和加拿大棋等十余种台球的一套游戏,其逼真的物理逻辑系数和图形渲染效果以及方便快捷的操作方式均有可圈可点之处。更值得一提的是, 其不仅可以人机对战, 且支持联网对战。</p><p><strong>功能特点:</strong></p><ul><li>十余种桌球游戏合一</li><li>支持多国语言</li><li>在线跨平台多人游戏</li><li>在线聊天</li><li>有四个难度级别的电脑对手</li></ul><a id="more"></a><ul><li>单机多人轮流模式</li><li>逼真的桌球物理效果</li><li>多种形状球台</li><li>扎杆和偏杆</li><li>可视化的用户界面</li><li>竖屏和横屏双模式</li><li>内置帮助手册</li></ul><p><img src="http://img.inplus.top/poolbreak-1.png-screenshot" alt> <img src="http://img.inplus.top/poolbreak-2.png-screenshot" alt></p><p><img src="http://img.inplus.top/poolbreak-3.png-screenshot" alt> <img src="http://img.inplus.top/poolbreak-4.png-screenshot" alt><br><strong>国际惯例:介绍截图没有更新</strong></p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">更新日志:</span><br><span class="line"></span><br><span class="line">Version 2.7.2:</span><br><span class="line">• Choose <span class="keyword">from</span> 15 different Cue Textures</span><br><span class="line">• Option <span class="keyword">to</span> match opponents with identical aiming lines</span><br><span class="line">• Chat window fixes</span><br><span class="line">• Stability improvements</span><br><span class="line">• Fixed ball going through rail <span class="keyword">in</span> Circular<span class="built_in"> Pool </span>games</span><br><span class="line">Version 2.7.0:</span><br><span class="line">• Circular tables added <span class="keyword">for</span><span class="built_in"> Pool </span><span class="keyword">and</span> Snooker</span><br><span class="line">• New Game: Karambol - Carrom Billiards with <span class="literal">no</span> cushion requirements</span><br><span class="line">• Place-n-Shoot mode <span class="keyword">for</span> pocketless billiards games</span><br><span class="line">• Chat dialog updated</span><br><span class="line">• Fixed color ball spotting rules <span class="keyword">in</span> Snooker</span><br><span class="line">• Other minor improvements <span class="keyword">and</span> stability fixes</span><br><span class="line">Version 2.6.5:</span><br><span class="line">• Allows replay of winning shot after game over</span><br><span class="line">• Stability improvements <span class="keyword">and</span> bug fixes</span><br><span class="line">Version 2.6.4:</span><br><span class="line">• Added Leaderboards <span class="keyword">and</span> Achievements</span><br><span class="line">• Fixed Spanish translation issues</span><br><span class="line">• Minor bug fixes</span><br></pre></td></tr></table></figure><p>来源:<a href="http://www.kineticbytes.com" target="_blank" rel="noopener">http://www.kineticbytes.com</a><br>Google Play:<br><a href="https://play.google.com/store/apps/details?id=com.kb.Carrom3DFull" target="_blank" rel="noopener">https://play.google.com/store/apps/details?id=com.kb.Carrom3DFull</a></p><hr><p><strong>修改说明:</strong></p><ol><li>破解正版验证,修复闪退</li><li>修正并补全简体中文汉化</li><li>增加了相关帮助信息和文档的汉化</li><li>精简语言并剔除相关选项</li><li>zipalign对齐优化</li></ol><p><strong>修改人员:<a href>风澈vio</a>(转载必须注明出处)</strong></p><p><strong>※下载地址:<a href="https://viosay.ctfile.com/fs/15555077-327030714" target="_blank" rel="noopener">城通网盘</a>(进入下载列表-最下方普通低速单线程下载)※</strong></p><ul><li>注意:</li><li>使用者由此程序所造成的损失修改者不承担任何责任。</li><li>最终版权归原作者所有。</li><li>请在法律允许的范围内合理使用本程序。</li></ul>]]></content>
<summary type="html">
<p><img src="http://img.inplus.top/poolbreak-0.png-logo" alt><br>Pool Break是一套具有多种台球玩法,包括八球,九球,斯诺克,克朗棋和加拿大棋等十余种台球的一套游戏,其逼真的物理逻辑系数和图形渲染效果以及方便快捷的操作方式均有可圈可点之处。更值得一提的是, 其不仅可以人机对战, 且支持联网对战。</p>
<p><strong>功能特点:</strong></p>
<ul>
<li>十余种桌球游戏合一</li>
<li>支持多国语言</li>
<li>在线跨平台多人游戏</li>
<li>在线聊天</li>
<li>有四个难度级别的电脑对手</li>
</ul>
</summary>
<category term="App" scheme="http://inplus.top/tags/App/"/>
</entry>
<entry>
<title>input[file]标签点击选择文件响应很慢的解决办法</title>
<link href="http://inplus.top/archives/inputfiletime/"/>
<id>http://inplus.top/archives/inputfiletime/</id>
<published>2017-03-30T09:02:40.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p>input[file]标签的accept属性可用于指定上传文件的<a href="http://www.iana.org/assignments/media-types/media-types.xhtml#image" target="_blank" rel="noopener">MIME类型</a>。<br>例如,想要实现默认上传图片文件的代码,代码可如下:<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><input <span class="attribute">type</span>=<span class="string">"file"</span> <span class="attribute">name</span>=<span class="string">"file"</span> <span class="attribute">class</span>=<span class="string">"element"</span> <span class="attribute">accept</span>=<span class="string">"image/*"</span>></span><br></pre></td></tr></table></figure></p><p>效果如下图所示,默认过滤掉所有非图片文件:<br><a id="more"></a></p><p><img src="/assets/blogImg/inputfiletime/inputfiletime-1.png" class="img-center-normal"></p><p><strong>但是!</strong></p><p>这段代码在Chrome和Safari等Webkit浏览器下却出现了响应滞慢的问题,可能要等 6~10s 才能弹出文件选择对话框。简直不能忍呀。</p><p>在IE和Firefox中使用<code>accept="image/*"</code>属性则没有发现响应延迟的问题。</p><p>于是几经尝试后,发现是<code>accept="image/*"</code>属性的问题,删掉它或者将<code>*</code>通配符修改为指定的MIME类型,就可以解决Webkit浏览器下的对话框显示滞慢的问题。</p><p>解决办法如下:<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><input <span class="attribute">type</span>=<span class="string">"file"</span> <span class="attribute">accept</span>=<span class="string">"image/gif,image/jpeg,image/jpg,image/png"</span>></span><br></pre></td></tr></table></figure></p><p><code>accept="image/*"</code>属性会对每一个文件都遍历一次所有的<code>"image/*"</code>文件类型,当文件较多时,文件的检验时间较长,这可能是Webkit的底层实现的bug。</p><p>另外,</p><p><code>accept="audio/*"</code>和<code>accept="video/*"</code>属性 在 Webkit浏览器下也会有同样的响应延迟的问题。同理,通过将<code>*</code>通配符 修改成指定的MIME类型就可解决。</p><p>需要注意的是:<br>当form表单含有file文件类型的话,需要将form表单的属性加上<code>enctype="multipart/form-data"</code></p><p><img src="/assets/blogImg/inputfiletime/inputfiletime-2.png" class="img-center-normal"></p><hr><p>特别感谢<a href="http://www.dengzhr.com/" target="_blank" rel="noopener">@子匠_Zijor</a></p>]]></content>
<summary type="html">
<p>input[file]标签的accept属性可用于指定上传文件的<a href="http://www.iana.org/assignments/media-types/media-types.xhtml#image" target="_blank" rel="noopener">MIME类型</a>。<br>例如,想要实现默认上传图片文件的代码,代码可如下:<br><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;input <span class="attribute">type</span>=<span class="string">"file"</span> <span class="attribute">name</span>=<span class="string">"file"</span> <span class="attribute">class</span>=<span class="string">"element"</span> <span class="attribute">accept</span>=<span class="string">"image/*"</span>&gt;</span><br></pre></td></tr></table></figure></p>
<p>效果如下图所示,默认过滤掉所有非图片文件:<br>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
</entry>
<entry>
<title>再回首-百度高精度IP定位服务</title>
<link href="http://inplus.top/archives/baiduip/"/>
<id>http://inplus.top/archives/baiduip/</id>
<published>2017-03-18T22:56:40.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/baiduip/baiduip-1.png" class="img-center-normal"><br>如上图,就是现在打开下面的百度高精度IP定位服务的API首页的提示。<br><del>API首页:<a href="http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip" target="_blank" rel="noopener">http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip</a></del></p><h3 id="ip定位历史"><a href="#ip定位历史" class="headerlink" title="ip定位历史"></a>ip定位历史</h3><p>关于IP定位,最早是通过运营商实现,每个运营商申请到的ip段,在某个范围内使用。<br>因此早期只能是国家为单位的基础数据。<br>对于比较大的国家,就进一步划分,比如,中国某通讯公司(不打广告),固定将某些ip分配某些机房使用,而这些机房则具备地域属性,因此就可以知道某些ip的位置是哪个省市区。<br>在进一步,网上有种测算路由的方式进行定位,就是由大范围逐个跳转,跟踪路由。从而对比找出ip所在的小范围。<br><a id="more"></a></p><h3 id="前提条件"><a href="#前提条件" class="headerlink" title="前提条件"></a>前提条件</h3><p>如今,网络铺设已经有个相当多的特性,比如:<br>A.国内的某大运营商,ip资源够用,直接给用户分配公网ip。我以前就在这种网络下用动态域名工具玩过网站。<br>B.部分运营上为了缓解ip资源不足问题,某个大范围使用代理转发方式,给到用户的是私网ip,用户最终用代理的ip池的ip访问公网。<br>C.电话运营商,ip资源利用率过低,几乎是一个省份用一个ip池进行代理给用户的手机网络上网</p><h3 id="延伸价值"><a href="#延伸价值" class="headerlink" title="延伸价值"></a>延伸价值</h3><p>随着<a href="http://lib.csdn.net/base/hadoop" target="_blank" rel="noopener">大数据</a>的发展,百度做了大数据匿名收集数据,数据实时分析。因此可以将手机收集到的精准GPS数据和当前所用IP数据成对上报给后端服务器,运算过之后,就可以得出某个IP的分布范围数据。<br>误差说明:<br>对于上述A的情况,精确度可以达到几十米<br>对于上述B的情况,可能得覆盖一个城市的范围<br>对于上述C的情况,往往是一个省份的误差程度<br>因此,对于有线宽带用户,分配了相对固定的公网IP,用户在这个线路下有放置了wifi无线路由器,wifi下有接入了手机用户,手机里运行了百度的服务,比如百度地图,或者百度地图SDK。<br>其定位精度就可以达到几十米范围。对于这种数据,只有bat这种大头才能实现的了这个规模的数据手机,因此准确度几乎无法被超越,更大的互联网公司除外</p><h3 id="定位分析"><a href="#定位分析" class="headerlink" title="定位分析"></a>定位分析</h3><p>目前百度定位提供了WIFI,基站,GPS等多种定位方式,适用于室内、室外多种定位场景,具有出色的定位性能:定位精度高(其实我是想吐槽的)、覆盖率广、网络定位请求流量小、定位速度快。<br><img src="/assets/blogImg/baiduip/baiduip-2.png" class="img-center-normal"><br>众所周知,通过IP地址我们只能查到某一个市级城市的宽带服务商所在地。<br>但是,百度高精度定位却能产生近乎30m内的定位精度,这是为什么呢?</p><h3 id="百度高精度定位产生"><a href="#百度高精度定位产生" class="headerlink" title="百度高精度定位产生"></a>百度高精度定位产生</h3><p>百度官方文档显示:2016年8月26日,高精度IP定位服务API正式上线。</p><p> 百度高精度IP定位服务,其根本来源于百度匿名收集服务,它的源头则是:手机位置服务。当然,不排除百度其他应用的sdk,百度的其他应用如百度地图,也进行了这个匿名收集服务,至少百度收集这些数据并非出于泄露隐私目的,毕竟这项数据单方面来说是脱敏的,就好比是网络上一张盖住脸的裸体照片。但是,大数据发展导致我们可以用各个数据源去拼凑一个完整画像,有意无意导致一个泄露隐私的结果。<br> 因此百度在接到投诉后,首先将高精度 IP 定位接口的配额大幅下调,其次,很快就关停了新用户开通这项服务。<br> 在百度高精度IP定位服务刚上线的 2016 年 9 月、10月,那时候百度给的的配额还相对较高,公开申请:<br>认证企业开发者10W 次 /天,认证个人开发者1W 次 /天,非认证用户通过手机验证1k 次 /天。<br> 但是不确定在10月份或11月份某一天,百度直接下调到:<br>认证企业开发者300次/天,认证个人开发者100次/天,非认证用户数据不详。<br> 然而在12月10号前百度撤销了官方api文档,并停止了该服务的ak权限的申请,之前已经申请了的权限的ak仍可继续使用。推测原因是这项功能推出后,被太多人用来达成不良目的所导致(例如定位QQ,微信,陌陌等社交账号所在位置)。然而像类似于任天堂《Pokemon Go》这款LBS-AR游戏并没有很好地去使用这一服务。</p><h3 id="何去何从"><a href="#何去何从" class="headerlink" title="何去何从"></a>何去何从</h3><p> 针对现状来看,百度的这项服务,目前推测有2个方向:<br>1,关停(停止新接入或者整个服务对外关停)。<br>2,整顿权限(以更严格的审核方式对外提供)<br><strong>更新:2017年7月起,开发者陆续收到百度终止高精度IP定位服务API的通知邮件。<br>至此,百度高精度定位服务正式退出历史舞台。<br>原文:</strong></p><blockquote><p>亲爱的开发者,您好!<br> 我们很抱歉的通知您,目前您正在使用的「高精度IP定位服务API,后文简称本服务」,由于国家《网络安全法》等法律法规的要求,及出于保护用户权益和安全性的考量,我们将终止您对「本服务」的使用权限。具体终止时间为2017年7月28日。如有疑问,可发送邮件到<a href="mailto:mapapi@baidu.com" target="_blank" rel="noopener">mapapi@baidu.com</a> 咨询。<br> 如果您在自身业务中已使用「本服务」,为避免业务受损,请在2017年7月28日前迁移到其他服务使用;如果您从未使用过「本服务」,请忽略本通告的内容。<br> 如果您同时还使用了百度地图开放平台所提供的其他服务,请不用担心,「本服务」的使用权限终止不会影响您对其他服务的使用。<br> 最后,再次感谢您对百度地图开放平台长期以来的信赖与支持!</p></blockquote><h3 id="百度高精度ip定位API"><a href="#百度高精度ip定位API" class="headerlink" title="百度高精度ip定位API"></a>百度高精度ip定位API</h3><p>下面提供了百度高精度ip定位的API供参考<br><img src="/assets/blogImg/baiduip/baiduip-3.jpg" class="img-center-normal"></p><h4 id="1、申请百度账号,创建应用,获取密钥-AK"><a href="#1、申请百度账号,创建应用,获取密钥-AK" class="headerlink" title="1、申请百度账号,创建应用,获取密钥(AK)"></a>1、申请百度账号,创建应用,获取密钥(AK)</h4><p><a href="http://lbsyun.baidu.com/apiconsole/key" target="_blank" rel="noopener">http://lbsyun.baidu.com/apiconsole/key</a><br><img src="/assets/blogImg/baiduip/baiduip-4.jpg" class="img-center-normal"><br><strong>启用服务:</strong>可以根据自己需求来钩选,这里先全选了。<br><strong>请求校验方式:</strong>IP白名单校验/SN检验,这里选择IP白名单校验。即在下面填上你访问机器的IP地址。如(114.114.114.114)。<br>单击提交,获得AK<br><img src="/assets/blogImg/baiduip/baiduip-5.jpg" class="img-center-normal"></p><h4 id="2、详细API:"><a href="#2、详细API:" class="headerlink" title="2、详细API:"></a>2、详细API:</h4><p>服务地址:<br><a href="http://api.map.baidu.com/highacciploc/v1" target="_blank" rel="noopener">http://api.map.baidu.com/highacciploc/v1</a><br> <a href="https://api.map.baidu.com/highacciploc/v1" target="_blank" rel="noopener">https://api.map.baidu.com/highacciploc/v1</a><br>参数:<br><strong>qcip</strong>待定位IP 可选 如果为空则针对定位服务的IP进行定位<br><strong>ak</strong>开发者密钥,即前面申请的东西<br><strong>extensions</strong>返回结果扩展设定(可选):<br><code>0</code>:只返回基础定位结果(默认)<br><code>1</code>:返回基础定位结果+地址信息<br><code>2</code>:返回基础定位结果+周边POI信息<br><code>3</code>:返回基础定位结果+地址信息+POI信息<br>这里我们用1<br><strong>coord</strong>返回坐标类型(可选):<br><code>bd09</code>百度墨卡托坐标(默认)<br><code>bd09ll</code>百度经纬度坐标<br><code>gcj02</code>国测局经纬度坐标</p><p>完整调用:<br>在浏览器地址栏输入以下网址<br><a href="https://api.map.baidu.com/highacciploc/v1?qcip=220.181.38.113&ak=你申请的AK&extensions=1&coord=bd09ll" target="_blank" rel="noopener">https://api.map.baidu.com/highacciploc/v1?qcip=220.181.38.113&ak=你申请的AK&extensions=1&coord=bd09ll</a></p><p>获取结果如下:<br><img src="/assets/blogImg/baiduip/baiduip-6.png" class="img-center-normal"></p><p>返回值说明:<br>这里默认用的是返回json格式的数据。<br><img src="/assets/blogImg/baiduip/baiduip-7.png" class="img-center-normal"></p><hr><p>特别感谢<a href="http://blog.csdn.net/cuitang1031" target="_blank" rel="noopener">@季雨林</a> <a href="https://www.opengps.cn" target="_blank" rel="noopener">@openGPS</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/baiduip/baiduip-1.png" class="img-center-normal"><br>如上图,就是现在打开下面的百度高精度IP定位服务的API首页的提示。<br><del>API首页:<a href="http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip" target="_blank" rel="noopener">http://lbsyun.baidu.com/index.php?title=webapi/high-acc-ip</a></del></p>
<h3 id="ip定位历史"><a href="#ip定位历史" class="headerlink" title="ip定位历史"></a>ip定位历史</h3><p>关于IP定位,最早是通过运营商实现,每个运营商申请到的ip段,在某个范围内使用。<br>因此早期只能是国家为单位的基础数据。<br>对于比较大的国家,就进一步划分,比如,中国某通讯公司(不打广告),固定将某些ip分配某些机房使用,而这些机房则具备地域属性,因此就可以知道某些ip的位置是哪个省市区。<br>在进一步,网上有种测算路由的方式进行定位,就是由大范围逐个跳转,跟踪路由。从而对比找出ip所在的小范围。<br>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
</entry>
<entry>
<title>相片处理VSCO Cam v20.1全滤镜+v3.7经典版</title>
<link href="http://inplus.top/archives/vsco/"/>
<id>http://inplus.top/archives/vsco/</id>
<published>2017-03-13T22:51:32.000Z</published>
<updated>2017-02-06T15:43:32.000Z</updated>
<content type="html"><![CDATA[<p><img src="http://img.inplus.top/vsco-0.png-logo" alt></p><p>VSCO Cam – 一款依托强大滤镜功能的相片处理应用程序。</p><p> VSCO Cam来自VSCO(Visual Supply Co.的简写),在移动应用领域取得成功之前,该公司就一直从事数码照片美化工作,其为Adobe Lightroom 和苹果Aperture开发的著名色彩插件VSCO Film非常受欢迎。其iOS版也曾在苹果的App Store中排名榜首,现在VSCO Cam安卓版的推出将让更多的用户领略到这款软件的魅力。<br> 与普通照片拍摄加后期处理的软件不同,VSCO Cam的滤镜能够将拍摄的照片呈现出最接近传统胶片的效果。VSCO Cam几乎包含了VSCO Film的全部胶片色彩风格,利用它处理过的照片照片文艺范十足。<br><a id="more"></a><br> 如果说Instagram的目的是让手机拍出好看好看的照片,那VSCO Cam寻求的就是真实感,并逼真的模仿出胶片的风格和色彩效果,比如柯达Porta,逼真的再现了胶片的拍摄风格和色彩。<br> 使用任何一款VSCO的滤镜,都能够使照片模拟出不同胶片拍出来的效果。比如,C3滤镜通过使用拥有鲜亮活泼的色彩对比和绿色色调模仿富士生胶底片的效果;LV1滤镜则能够模仿经典幻灯片的效果。</p><p><strong>功能特点:</strong></p><ul><li>创作<br>利用出众的移动预设和高级相机控制功能,拍照并编辑图像。<br>发布图片或在您的 VSCO 个人资料中精心展出其他作品。</li><li>发现<br>探索关注对象发表的作品、来自社区的精选作品以及来自 VSCO Originals 的独家编辑内容。</li><li>交流<br>加入 VSCO 社区。查找并关注好友以及世界各地的用户。</li></ul><p><img src="http://img.inplus.top/vsco-1.jpg-screenshot" alt> <img src="http://img.inplus.top/vsco-2.jpg-screenshot" alt></p><p><img src="http://img.inplus.top/vsco-3.jpg-screenshot" alt> <img src="http://img.inplus.top/vsco-4.jpg-screenshot" alt><br><strong>国际惯例:介绍截图没有更新</strong></p><figure class="highlight subunit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">更新日志:</span><br><span class="line">每次更新都是什么鬼:</span><br><span class="line">• 没有日志!</span><br><span class="line">• 我任性!</span><br><span class="line">• <span class="string">+1</span>s</span><br><span class="line">• <span class="string">+2</span>s</span><br></pre></td></tr></table></figure><p>来源:<a href="http://vsco.co" target="_blank" rel="noopener">http://vsco.co</a><br>Google Play:<br><a href="https://play.google.com/store/apps/details?id=com.vsco.cam" target="_blank" rel="noopener">https://play.google.com/store/apps/details?id=com.vsco.cam</a></p><hr><p><strong>修改说明:</strong></p><ol><li>免Root直装,解锁120余款收费滤镜</li><li>精简多余语言包</li><li>armv7a架构精简</li><li>apk包体积优化</li><li>Zipalign对齐优化</li><li>去除第三方市场检测更新</li></ol><p><strong>修改人员:<a href>风澈vio</a>(转载必须注明出处)</strong></p><p><strong>下载地址:<a href="https://pan.baidu.com/s/1i4Mwwnj" target="_blank" rel="noopener">百度网盘</a> 密码:1024</strong></p><ul><li>注意:</li><li>使用者由此程序所造成的损失修改者不承担任何责任。</li><li>最终版权归原作者所有。</li><li>请在法律允许的范围内合理使用本程序。</li></ul>]]></content>
<summary type="html">
<p><img src="http://img.inplus.top/vsco-0.png-logo" alt></p>
<p>VSCO Cam – 一款依托强大滤镜功能的相片处理应用程序。</p>
<p> VSCO Cam来自VSCO(Visual Supply Co.的简写),在移动应用领域取得成功之前,该公司就一直从事数码照片美化工作,其为Adobe Lightroom 和苹果Aperture开发的著名色彩插件VSCO Film非常受欢迎。其iOS版也曾在苹果的App Store中排名榜首,现在VSCO Cam安卓版的推出将让更多的用户领略到这款软件的魅力。<br> 与普通照片拍摄加后期处理的软件不同,VSCO Cam的滤镜能够将拍摄的照片呈现出最接近传统胶片的效果。VSCO Cam几乎包含了VSCO Film的全部胶片色彩风格,利用它处理过的照片照片文艺范十足。<br>
</summary>
<category term="App" scheme="http://inplus.top/tags/App/"/>
</entry>
<entry>
<title>没有比打Emoji台球更惬意的事了(gif)</title>
<link href="http://inplus.top/archives/poolmoji/"/>
<id>http://inplus.top/archives/poolmoji/</id>
<published>2017-01-30T23:20:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p>当数字艺术家jean-baptiste le divelec在工作中发现一个新的台球桌,他决定和他的一群朋友做一些有意思的事情——创造一些特殊的台球。借鉴时下无处不在的emoji表情符,他的团队手绘了15颗emoji台球,称之为“poolmoji”,并拍下gif动图,比起台球运动本身,它们则更生动可爱,十分有趣,让我们来看看吧~</p><hr><p>我不想死~<br><img src="https://ooo.0o0.ooo/2017/02/07/5899e1ae1582c.gif" alt><br><a id="more"></a></p><hr><p>好折磨啊~<br><img src="https://ooo.0o0.ooo/2017/02/07/5899e1ba3ea93.gif" alt></p><hr><p>哎哟哟~<br><img src="https://ooo.0o0.ooo/2017/02/07/5899e1b6e3874.gif" alt></p><hr><p>明天见~<br><img src="https://ooo.0o0.ooo/2017/02/07/5899e1c8d4b55.gif" alt></p><hr><p>别别别别别~别碰我<br><img src="https://ooo.0o0.ooo/2017/02/07/5899e1c10cd85.gif" alt></p><hr><p>等等我呀~<br><img src="https://ooo.0o0.ooo/2017/02/07/5899e1c560d4e.gif" alt></p><hr><p>不准再这样了~<br><img src="https://ooo.0o0.ooo/2017/02/07/5899e1c2bec68.gif" alt></p><hr><p>啊哦~<br><img src="https://ooo.0o0.ooo/2017/02/07/5899e18d0f323.gif" alt></p><hr><p>爆头一击~<br><img src="https://ooo.0o0.ooo/2017/02/07/5899e1bba633c.gif" alt></p><hr><p>同志们辛苦啦~<br><img src="/assets/blogImg/poolmoji/poolmoji-10.jpg"></p><hr><p>张小明,出列!<br><img src="/assets/blogImg/poolmoji/poolmoji-11.jpg"></p><hr><p>谁能体会单身狗的悲伤T T<br><img src="/assets/blogImg/poolmoji/poolmoji-12.jpg"></p><hr><p>终于解散了~<br><img src="/assets/blogImg/poolmoji/poolmoji-13.jpg"></p><hr><p>你瞅啥~<br><img src="/assets/blogImg/poolmoji/poolmoji-14.jpg"></p><hr><p>同桌你好~<br><img src="/assets/blogImg/poolmoji/poolmoji-15.jpg"></p><hr><p>幕后制作<br><img src="/assets/blogImg/poolmoji/poolmoji-16.jpg"></p><hr><p><img src="/assets/blogImg/poolmoji/poolmoji-17.jpg"></p><hr><p>Winigreeni正在认真工作<br><img src="/assets/blogImg/poolmoji/poolmoji-18.jpg"></p><hr><p>Emoji 完成中…<br><img src="/assets/blogImg/poolmoji/poolmoji-19.jpg"></p><hr><p><img src="/assets/blogImg/poolmoji/poolmoji-20.jpg"></p><hr><p>via <a href="http://www.boredpanda.com/hand-painted-emoji-pool-set-poolmoji-sonali-ranjit/" target="_blank" rel="noopener">boredpanda</a>,<a href="http://www.designboom.com/art/poolmoji-emoji-painted-billiard-balls-jean-baptiste-le-divelec-06-22-2016/" target="_blank" rel="noopener">designboom</a></p>]]></content>
<summary type="html">
<p>当数字艺术家jean-baptiste le divelec在工作中发现一个新的台球桌,他决定和他的一群朋友做一些有意思的事情——创造一些特殊的台球。借鉴时下无处不在的emoji表情符,他的团队手绘了15颗emoji台球,称之为“poolmoji”,并拍下gif动图,比起台球运动本身,它们则更生动可爱,十分有趣,让我们来看看吧~</p>
<hr>
<p>我不想死~<br><img src="https://ooo.0o0.ooo/2017/02/07/5899e1ae1582c.gif" alt><br>
</summary>
<category term="宇宙之大" scheme="http://inplus.top/tags/%E5%AE%87%E5%AE%99%E4%B9%8B%E5%A4%A7/"/>
</entry>
<entry>
<title>利用IDA简单过so签名校验</title>
<link href="http://inplus.top/archives/idasignature/"/>
<id>http://inplus.top/archives/idasignature/</id>
<published>2017-01-16T18:36:09.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><strong>核心:破解安卓NDK端native方法动态JNI反射的so文件签名校验</strong></p><p>分析之前,关于Android的签名机制就略过啦,先简单恶补一下Android签名校验的方式,方便小白理解。</p><p>在讲签名校验的方式前,需要先明确dex文件校验和签名校验:<br>1、将apk以压缩包的形式打开删除原签名后,再签名,安装能够正常打开,但是用IDE工具反编译(classes.dex)后再二次打包,却出现非正常情况的,如:闪退/弹出非正版提示框。可以确定是dex文件校验。<br>2、将apk以压缩包的形式打开删除原签名再签名,安装之后打开异常的,则基本可以断定是签名检验。如果在断网的情况下同样是会出现异常,则是本地的签名检验。如果首先出现的是提示网络没有连接,则是服务器端的签名校验。</p><a id="more"></a><p>对于Android编程我们知道分为SDK编程和NDK编程,当然Android签名校验也都是通过SDK或NDK来实现的。SDK编程也就是我们通常所说的java端的即编译出来的classes.dex静态校验,NDK编程也就是C / C++端的即编译出来的*.so动态加载的校验。</p><p>总之,<br>Java层一般通过getPackageManager().getPackageInfo.signatures来获取签名信息。<br>NDK层一般调用Native方法/DLL/Lua脚本等通过获取Java的context/Activity对象,动态JNI反射调用getPackageInfo等来获取签名。</p><p>好了,话不多说,切入正题。</p><p>群里聊天,小伙伴找我去除某款图像处理软件的广告,介于此软件已一年未更新,且互联网上出现的修改版均无法使用。。。。那么。。开搞。。。。</p><p>apk重签名,闪退,断定有签名校验。<br>直接拖入AndroidKiller大法,一段等待之后反编译完毕。</p><p>因为没有错误提示,那么对整个项目搜索<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">signatures</span></span><br></pre></td></tr></table></figure></p><p>或<br><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[Landroid<span class="regexp">/content/</span>pm<span class="regexp">/Signature</span></span><br></pre></td></tr></table></figure></p><p>或<br><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Landroid<span class="regexp">/content/</span>pm<span class="regexp">/PackageInfo;->signatures:[Landroid/</span>content<span class="regexp">/pm/</span>Signature</span><br></pre></td></tr></table></figure></p><p>或<br><figure class="highlight xl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">L<span class="function"><span class="title">java</span>/security/Signature;-></span>verify([B)Z</span><br></pre></td></tr></table></figure></p><p>等一系列可能调用或者判断签名的方法<br><img src="/assets/blogImg/idasignature/idasignature-1.png"><br>我们基本找到四处可能为签名对比函数的验证,我们让其强制返回true。<br><img src="/assets/blogImg/idasignature/idasignature-2.png"></p><p>满心欢喜的回编译,安装。。。。。<br>结果。。依旧闪退。。。内心无数匹你懂得马奔驰而过。。。。</p><p>看到\lib目录和\assets\lib目录下的.so文件,我倒是有些怀疑悬疑在.so动态文件中。</p><p>继续对整个项目搜索<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">loadLibrary</span></span><br></pre></td></tr></table></figure></p><p>或<br><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Ljava<span class="regexp">/lang/</span>System;->loadLibrary(Ljava<span class="regexp">/lang/</span>String;)V</span><br></pre></td></tr></table></figure></p><p>等一系列读取.so文件的方法<br><img src="/assets/blogImg/idasignature/idasignature-3.png"><br>我们得到了三个结果,前两个是图像处理的lib,第三个嘛。。。别急啊!先等等。。。</p><p>以armeabi-v7a架构为例,我们把所有lib都弄到一起,用EditPlus或者UltraEdit呀notepad++呀之类的编辑器来全局搜索<code>signature</code></p><p>看看我们得到了什么~<br><img src="/assets/blogImg/idasignature/idasignature-4.png"><br>我的天哪,有戏啊!</p><p>说时迟那时快,我的IDA已经饥渴难耐。</p><p>New-Open-Ok一气呵成!</p><p>打开文本查找:<br><img src="/assets/blogImg/idasignature/idasignature-5.png"></p><p>搜索<code>signature</code> 勾选上<code>Find all occurences</code><br><img src="/assets/blogImg/idasignature/idasignature-6.png"></p><p>搜索完毕,没什么说的,妥妥的在5个Function中找到<br><img src="/assets/blogImg/idasignature/idasignature-7.png"></p><p>双击第一个Function跳过去<br><img src="/assets/blogImg/idasignature/idasignature-8.png"></p><p>右键选择<code>Graph view</code>切换图形视图<br><img src="/assets/blogImg/idasignature/idasignature-9.png"></p><p>通过视图,我们找到了一个关键跳转(可以通过Ctrl+鼠标滑轮来调整视图缩放)<br><img src="/assets/blogImg/idasignature/idasignature-10.png"></p><p>右键选择<code>Text view</code>切换回文本视图<br><img src="/assets/blogImg/idasignature/idasignature-11.png"></p><p>其对应的就是文本视图界面中的<br><img src="/assets/blogImg/idasignature/idasignature-12.png"></p><p>F5看一下C语言代码(这样做的前提是,你的IDA Pro必须支持F5功能)<br><img src="/assets/blogImg/idasignature/idasignature-13.png"></p><p>通过分析C代码我们得知这里将获取到的签名信息进行判断,<br>由此我们得知BEQ指令就是问是不是不相等,不相等那么为真的意思。而查阅之后印证了我们的判断:</p><blockquote><p>BEQ指令是“相等(或为0)跳转指令”,<br>BNE指令是“不相等(或不为0)跳转指令”,<br>B指令是“无条件跳转指令”,<br>CBZ 指令是“比较,为零则跳转”,<br>CBNZ指令是“比较,为非零则跳转”。</p></blockquote><p>通过工具,我们发现:</p><blockquote><p>BNE跳转指令对应的HEX机器码是D1,<br>BEQ跳转指令对应的HEX机器码是D0,<br>CBZ跳转指令对应的HEX机器码是B1,<br>CBNZ跳转指令对应的HEX机器码是B9。</p></blockquote><p>回过头来,简单的看一下指令流程,BEQ下面是exit方法,则说明不能跳转指令为签名验证失败,反向逻辑一下,把BEQ指令改为相反的BNE指令即可。</p><p>修改方式一:我们可以在HEX界面右键<code>Edit</code>将D0改为D1,再右键<code>Apply changes</code>来保存修改,需要注意的是,在IDA中的修改仅仅是为了验证我们修改的正确与否,源文件并不会改变,我们可以定位修改位置后再利用010Editor、UltraEdit等编辑器来对源文件进行修改。</p><p><img src="/assets/blogImg/idasignature/idasignature-14.png"></p><p><img src="/assets/blogImg/idasignature/idasignature-15.png"></p><p>验证发现BEQ已经修改为BNE<br><img src="/assets/blogImg/idasignature/idasignature-16.png"></p><p>修改方式二:当然,强大的IDA怎么可能没有修改后保存的功能呢。我们可以使用Edit->Patch Program菜单来方便的进行修改保存。<br>(需要注意的是,Patch Program菜单是GUI版本的IDA的一项隐藏功能,用户需要编辑idagui.cfg配置文件才能激活该菜单, 编辑IDA配置文件cfg目录下的idagui.cfg,修改DISPLAY_PATCH_SUBMENU=YES,重启IDA即可)</p><p>首先我们在IDA View 中显示十六进制机器码, Options -> General -> Disassembly -> Number of opcode bytes = 8<br><img src="/assets/blogImg/idasignature/idasignature-17.png"></p><p>然后Edit->Patch Program->Change byte<br><img src="/assets/blogImg/idasignature/idasignature-18.png"></p><p>将D0改为D1,OK<br><img src="/assets/blogImg/idasignature/idasignature-19.png"></p><p>然后Edit->Patch Program->Apple patches to input file<br><img src="/assets/blogImg/idasignature/idasignature-20.png"></p><p>OK即可<br><img src="/assets/blogImg/idasignature/idasignature-21.png"></p><p>同理,我们找到其他方法中的跳转点来进行反向逻辑,保存so文件,覆盖原文件,回编译,安装。完美运行~</p><p>具体去广告过程不是本次重点所以就不再过多陈述,另外说一点sdk23以上的权限请求问题,当过完签名校验并去除广告后,当要读取图库照片来进行处理时,原本应该进行文件存储的权限请求,但是此时却FC了,当我手动给予权限后才正常。想想就苦恼,让人安装后边还得手动给权限。。。。</p><p>不行,我们得解决了它。我们知道如果APP运行在Android 6.0或以上版本的手机,并且target sdk>=23,那么在使用一些相对敏感的权限时,需要征求用户的许可。比如读写sdcard,摄像,联系人信息等。 这是Android 6.0,在原有的AndroidManifest.xml声明权限的基础上,新增了运行时权限动态检测。不过为了兼容性,Android为targetSdkVersion小于23的应用默认授予了所申请的所有权限,所以如果你以前的APP设置的targetSdkVersion低于23,也能正常使用。等于或者大于23,则必须 request permission,否则会崩溃闪退。</p><p>当我们用apktool反编译后破坏了complierSdkversion的值,我们可以在apktool.yml中的sdkInfo中添加<code>complierSdkversion: '23'</code>,或者干脆我们索性将<code>targetSdkVersion</code>设置为<code>22</code>,默认给它权限就好了。(complierSdkversion的值和targetSdkVersion的值一定要统一,不然会出错)</p><p>修改apktool.yml文件完美解决~<br><img src="/assets/blogImg/idasignature/idasignature-22.png"></p><p><strong>步骤回顾:<br>1、反编译apk<br>2、利用关键词查找签名调用<br>3、IDA静态调试分析<br>4、了解arm指令详情作用<br>5、修改逻辑跳转绕过签名校验</strong></p><p><strong>总结:<br>本文主要介绍破解安卓NDK端native方法动态JNI反射so文件签名校验的方法。</strong></p>]]></content>
<summary type="html">
<p><strong>核心:破解安卓NDK端native方法动态JNI反射的so文件签名校验</strong></p>
<p>分析之前,关于Android的签名机制就略过啦,先简单恶补一下Android签名校验的方式,方便小白理解。</p>
<p>在讲签名校验的方式前,需要先明确dex文件校验和签名校验:<br>1、将apk以压缩包的形式打开删除原签名后,再签名,安装能够正常打开,但是用IDE工具反编译(classes.dex)后再二次打包,却出现非正常情况的,如:闪退/弹出非正版提示框。可以确定是dex文件校验。<br>2、将apk以压缩包的形式打开删除原签名再签名,安装之后打开异常的,则基本可以断定是签名检验。如果在断网的情况下同样是会出现异常,则是本地的签名检验。如果首先出现的是提示网络没有连接,则是服务器端的签名校验。</p>
</summary>
<category term="Android" scheme="http://inplus.top/tags/Android/"/>
<category term="逆向札记" scheme="http://inplus.top/tags/%E9%80%86%E5%90%91%E6%9C%AD%E8%AE%B0/"/>
</entry>
<entry>
<title>图片处理Pixlr Express v3.0.3独家去广告破解版</title>
<link href="http://inplus.top/archives/pixlr/"/>
<id>http://inplus.top/archives/pixlr/</id>
<published>2017-01-14T22:58:20.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="http://img.inplus.top/pixlr-0.png-logo" alt><br>Pixlr Express – 一款适合每个人的照片编辑器:不论您是从未编辑过照片的新人,还是一名专业人士,Pixlr 均可提供您需要的所有工具和特效。</p><p>Pixlr Express图片处理是Autodesk推出的一款免费安卓图片处理软件,内置600多种特效及滤镜,包含了优秀免费修图软体常见的特效滤镜套用、曝光对比调整、相框与特殊光线外挂等等,但又更进一步的,加入了像是去除红眼、去除特定颜色、去除噪点或锐利化、加上白光、移轴镜等等功能,而且每种功能、每个特效都提供了细部调整,让一般用户也能简单把特效变得更专业。</p><p><strong>功能特点:</strong></p><ul><li>通过各种布局、背景和间距选项,创建照片拼贴。</li><li>借助“自动修复”,轻松单击一下即可平衡颜色。</li><li>使用“双重曝光”逐层放置多张照片并将其混合在一起,以获得独特的外观。</li></ul><a id="more"></a><ul><li>对图像进行样式化,使其看起来像是铅笔画、水墨草图、海报,等等。</li><li>使用简单的工具去除污点和红眼或者对牙齿进行美白,使您的自拍照看起来很漂亮。</li><li>使用“局部彩色”专注于某一颜色,或使用“焦点模糊”添加效果。</li><li>从一系列特效包中进行选择,为图像添加所需的外观和感觉。</li><li>利用叠加调整照片感受效果 – 增强色调、降低色调或增加梦幻般的提亮。</li><li>使用字幕为照片设置遮罩效果,或者用多种字体的文本叠加图像。</li><li>使用右侧边框完成编辑过程 – 选取适合您的样式。</li><li>利用我们不断增长的其他特效、叠加和边框包目录,保持新鲜感。</li><li>使用“收藏夹”按钮跟踪您收藏的特效和叠加。 </li><li>在编辑后快速、灵活地调整图像大小。</li><li>通过社交媒体或电子邮件,直接与朋友分享您的照片。</li></ul><p><img src="http://img.inplus.top/pixlr-1.png-screenshot" alt> <img src="http://img.inplus.top/pixlr-2.png-screenshot" alt></p><p><img src="http://img.inplus.top/pixlr-3.png-screenshot" alt> <img src="http://img.inplus.top/pixlr-4.png-screenshot" alt></p><figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">更新日志:</span><br><span class="line"></span><br><span class="line">v3.0.3</span><br><span class="line">- Better Android 6.0 support: ripple, doze & runtime permission check</span><br><span class="line">- Bug fixes</span><br><span class="line">v3.0.2</span><br><span class="line">- Improved the performance of the<span class="built_in"> double </span>exposure<span class="built_in"> and </span>eraser tools.</span><br><span class="line">- Fixed a crash with collage when re-selecting images.</span><br><span class="line">- We also squashed a few bugs in this release.</span><br></pre></td></tr></table></figure><p>来源:<a href="http://pixlr.com" target="_blank" rel="noopener">http://pixlr.com</a><br>Google Play:<br><a href="https://play.google.com/store/apps/details?id=com.pixlr.express" target="_blank" rel="noopener">https://play.google.com/store/apps/details?id=com.pixlr.express</a></p><hr><p><strong>修改说明:</strong></p><ol><li>破解NDK动态JNI反射签名校验。</li><li>解锁专业版,去除广告。</li><li>禁用mixpanel隐私统计。</li><li>精简语言包,剔除无用设置项。</li><li>zipalign对齐优化、apk包体积优化。</li></ol><p><strong>修改人员:<a href>风澈vio</a>(转载必须注明出处)</strong></p><p><strong>下载地址:<a href="http://pan.baidu.com/s/1i5fYa81" target="_blank" rel="noopener">百度网盘</a> 密码:1024</strong></p><ul><li>注意:</li><li>使用者由此程序所造成的损失修改者不承担任何责任。</li><li>最终版权归原作者所有。</li><li>请在法律允许的范围内合理使用本程序。</li></ul>]]></content>
<summary type="html">
<p><img src="http://img.inplus.top/pixlr-0.png-logo" alt><br>Pixlr Express – 一款适合每个人的照片编辑器:不论您是从未编辑过照片的新人,还是一名专业人士,Pixlr 均可提供您需要的所有工具和特效。</p>
<p>Pixlr Express图片处理是Autodesk推出的一款免费安卓图片处理软件,内置600多种特效及滤镜,包含了优秀免费修图软体常见的特效滤镜套用、曝光对比调整、相框与特殊光线外挂等等,但又更进一步的,加入了像是去除红眼、去除特定颜色、去除噪点或锐利化、加上白光、移轴镜等等功能,而且每种功能、每个特效都提供了细部调整,让一般用户也能简单把特效变得更专业。</p>
<p><strong>功能特点:</strong></p>
<ul>
<li>通过各种布局、背景和间距选项,创建照片拼贴。</li>
<li>借助“自动修复”,轻松单击一下即可平衡颜色。</li>
<li>使用“双重曝光”逐层放置多张照片并将其混合在一起,以获得独特的外观。</li>
</ul>
</summary>
<category term="App" scheme="http://inplus.top/tags/App/"/>
</entry>
<entry>
<title>克隆相机Clone Camera v2.2/v2.3精简破解版</title>
<link href="http://inplus.top/archives/clonecamera/"/>
<id>http://inplus.top/archives/clonecamera/</id>
<published>2016-12-15T22:29:20.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="http://img.inplus.top/clonecamera-0.png-logo" alt><br>Clone Camera – 一款方便快捷克隆物体制作炫酷照片的应用。</p><p>Clone Camera是一款趣味照相应用,通过这款应用,我们可以将照片中的人或物体复制,在同个场景中创造最多四个相同的影像。而使用者不需要懂得复杂的P图技巧,只需要简单的几步,就可以制作出富有创意的摄影作品。</p><p><strong>功能特点:</strong></p><ul><li>无比震撼的克隆照片</li><li>增强型自拍功能</li><li>众多滤镜可供选择</li><li>帮助你首次尝试的入门指南</li><li>支持高质量照片</li></ul><a id="more"></a><p><img src="http://img.inplus.top/clonecamera-1.png-screenshot" alt> <img src="http://img.inplus.top/clonecamera-2.png-screenshot" alt></p><p><img src="http://img.inplus.top/clonecamera-3.png-screenshot" alt> <img src="http://img.inplus.top/clonecamera-4.png-screenshot" alt></p><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">更新日志:</span><br><span class="line"></span><br><span class="line"><span class="symbol">Version</span> <span class="number">2</span>.<span class="number">2</span>:</span><br><span class="line">· <span class="keyword">Added </span>Special tutorials</span><br><span class="line">· Support Chinese</span><br><span class="line">· Support more devices.</span><br><span class="line">· Minor <span class="keyword">bug </span>fixes.</span><br></pre></td></tr></table></figure><p>来源:<a href="http://www.peta-vision.com" target="_blank" rel="noopener">http://www.peta-vision.com</a><br>Google Play:<br><a href="https://play.google.com/store/apps/details?id=com.petavision.clonecameraplaystore" target="_blank" rel="noopener">https://play.google.com/store/apps/details?id=com.petavision.clonecameraplaystore</a></p><hr><p><strong>修改说明:</strong></p><ol><li>精简多余代码文件和资源文件</li><li>破解完整功能,激活全部图文教程</li><li>去除广告,剔除无用信息</li><li>去除MiGameCenterSDKService</li><li>补全汉化信息</li><li>修复部分闪退</li><li>优化算法,精简体积</li><li>zipalign对齐优化</li></ol><p><strong>修改人员:<a href>风澈vio</a>(转载必须注明出处)</strong></p><p><strong>下载地址:<a href="http://pan.baidu.com/s/1kURDzHd" target="_blank" rel="noopener">百度网盘</a> 密码:1024</strong></p><ul><li>注意:</li><li>使用者由此程序所造成的损失修改者不承担任何责任。</li><li>最终版权归原作者所有。</li><li>请在法律允许的范围内合理使用本程序。</li></ul>]]></content>
<summary type="html">
<p><img src="http://img.inplus.top/clonecamera-0.png-logo" alt><br>Clone Camera – 一款方便快捷克隆物体制作炫酷照片的应用。</p>
<p>Clone Camera是一款趣味照相应用,通过这款应用,我们可以将照片中的人或物体复制,在同个场景中创造最多四个相同的影像。而使用者不需要懂得复杂的P图技巧,只需要简单的几步,就可以制作出富有创意的摄影作品。</p>
<p><strong>功能特点:</strong></p>
<ul>
<li>无比震撼的克隆照片</li>
<li>增强型自拍功能</li>
<li>众多滤镜可供选择</li>
<li>帮助你首次尝试的入门指南</li>
<li>支持高质量照片</li>
</ul>
</summary>
<category term="App" scheme="http://inplus.top/tags/App/"/>
</entry>
<entry>
<title>使用渐进式 JPEG 来提升用户体验</title>
<link href="http://inplus.top/archives/optimizejpeg/"/>
<id>http://inplus.top/archives/optimizejpeg/</id>
<published>2016-12-01T01:56:40.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p> 网络上那些色色的照片都是<code>.jpg</code>格式的(“色色”指的是色彩斑斓的意思 /手动抠鼻/)。不知诸位有没有注意到,这些<code>.jpg</code>格式的图片在呈现的时候,有两种方式,一种是自上而下扫描式的,还有一种就是先是全部的模糊图片,然后逐渐清晰(就像GIF格式的交错显示)。</p><p> JPEG文件有两种保存方式,分别是<em>Baseline JPEG(基准式)</em>和<em>Progressive JPEG(渐进式)</em>。两种格式有相同尺寸以及图像数据,它们的扩展名也是相同的,唯一的区别是二者显示的方式不同。<br><a id="more"></a><br><strong>Baseline JPEG</strong><br> 这种类型的JPEG文件存储方式是按从上到下的扫描方式,把每一行顺序的保存在JPEG文件中。打开这个文件显示它的内容时,数据将按照存储时的顺序从上到下一行一行的被显示出来,直到所有的数据都被读完,就完成了整张图片的显示。如果文件较大或者网络下载速度较慢,那么就会看到图片被一行行加载的效果,这种格式的JPEG没有什么优点,因此,一般都推荐使用<em>Progressive JPEG</em>。<br><img src="/assets/blogImg/optimizejpeg/optimizejpeg-1.gif"></p><p><strong>Progressive JPEG</strong><br> 和<em>Baseline JPEG</em>一遍扫描不同,<em>Progressive JPEG</em>文件包含多次扫描,这些扫描顺寻的存储在JPEG文件中。打开文件过程中,会先显示整个图片的模糊轮廓,随着扫描次数的增加,图片变得越来越清晰。这种格式的主要优点是在网络较慢的情况下,可以看到图片的轮廓知道正在加载的图片大概是什么。在一些网站打开较大图片时,你就会注意到这种技术。<br><img src="/assets/blogImg/optimizejpeg/optimizejpeg-2.gif"></p><p>#####让我们来对比一下:<br> 渐进式图片带来的好处是可以让用户在没有下载完图片就可以看到最终图像的大致轮廓,一定程度上可以提升用户体验。(瀑布流的网站建议还是使用基准式的)<br><img src="/assets/blogImg/optimizejpeg/optimizejpeg-3.jpg"><br> 另外渐进式的图片的大小并不会和基本的图片大小相差很多,有时候可能会比基本图片更小。渐进式的图片的缺点就是吃用户的CPU和内存,不过对于现在的电脑来说这点图片的计算并不算什么。</p><p><strong>下载呈现速度</strong><br> 一个名叫<a href="http://htmlhive.com/" target="_blank" rel="noopener">Ann Robson</a>的人,最近对各个浏览器下渐进式图片呈现做了测试。<br>下图为FireFox浏览器下呈现速度的对比图:<br><img src="/assets/blogImg/optimizejpeg/optimizejpeg-4.jpg"><br> 当大图轮廓加载OK的时候,小图最后一个乳猪还没有出世面;而基准式乳猪图还没有开始加载!显然,罗伯森是想告诉我们,渐进式JPEG下载更快。</p><p>下表为其在各个浏览器下测试的结果:<br><img src="/assets/blogImg/optimizejpeg/optimizejpeg-5.jpg"></p><p>结论很简单,Chrome + Firefox + IE9浏览器下,渐进式图片加载更快,而且是快很多,至于其他浏览器,与基准式图片的加载一致,至少不会拖后腿。</p><p><a href="http://www.webmonkey.com/author/luxagraf/" target="_blank" rel="noopener">Scott Gilbertson</a>对渐进式图片有其他的补充:<br>1.你永不知道基准式图片内容,除非他完全加载出来。<br>2.渐进式图片一开始大小框架就定好,不会像基准式图片一样,由于尺寸未设定而造成回流——提高的渲染性能。<br>3.渐进式图片也有不足,就是吃CPU吃内存。<br>ps: png图片也是可以渐进式呈现的</p><p>内容就是这些,权衡使用在你手。一般而言,大尺寸图片建议使用渐进式JPEG。</p><p>#####那么怎么将图片保存为或者转化为Progressive JPEG呢?<br>方法如下:</p><p><strong>1、PhotoShop</strong><br>在photoshop中有“存储为web所用格式”,打开后选择“连续”就是渐进式JPEG。<br><img src="/assets/blogImg/optimizejpeg/optimizejpeg-6.jpg"></p><p><strong>2、Linux</strong><br>检测是否为<em>progressive jpeg</em>: identify -verbose filename.jpg | grep Interlace<br>(如果输出 None 说明不是progressive jpeg;如果输出 Plane 说明是 progressive jpeg。)<br>将<em>basic jpeg</em>转换成<em>progressive jpeg</em>:> convert infile.jpg -interlace Plane outfile.jpg</p><p><strong>3、PHP</strong><br>使用<a href="http://php.net/manual/en/function.imageinterlace.php" target="_blank" rel="noopener">imageinterlace</a>和<a href="http://www.php.net/manual/en/function.imagejpeg.php" target="_blank" rel="noopener">imagejpeg</a>函数我们可以轻松解决转换问题。<br><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"><?php</span></span><br><span class="line"> $im = imagecreatefromjpeg(<span class="string">'pic.jpg'</span>);</span><br><span class="line"> imageinterlace($im, <span class="number">1</span>);</span><br><span class="line"> imagejpeg($im, <span class="string">'./php_interlaced.jpg'</span>, <span class="number">100</span>);</span><br><span class="line"> imagedestroy($im);</span><br><span class="line"><span class="meta">?></span></span><br></pre></td></tr></table></figure></p><p><strong>4、Python</strong><br><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> PIL</span><br><span class="line"><span class="keyword">from</span> exceptions <span class="keyword">import</span> IOError</span><br><span class="line"></span><br><span class="line">img = PIL.Image.open(<span class="string">"c:\\users\\biaodianfu\\pictures\\in.jpg"</span>)</span><br><span class="line">destination = <span class="string">"c:\\users\\biaodianfu\\pictures\\test.jpeg"</span></span><br><span class="line"><span class="keyword">try</span>:</span><br><span class="line"> img.save(destination, <span class="string">"JPEG"</span>, quality=<span class="number">80</span>, optimize=<span class="literal">True</span>, progressive=<span class="literal">True</span>)</span><br><span class="line"><span class="keyword">except</span> IOError:</span><br><span class="line"> PIL.ImageFile.MAXBLOCK = img.size[<span class="number">0</span>] * img.size[<span class="number">1</span>]</span><br><span class="line"> img.save(destination, <span class="string">"JPEG"</span>, quality=<span class="number">80</span>, optimize=<span class="literal">True</span>, progressive=<span class="literal">True</span>)</span><br></pre></td></tr></table></figure></p><p><strong>5、jpegtran</strong><br><code>jpegtran -copy none -progressive <inputfile> <outputfile></code></p><p><strong>6、C#</strong><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">using (Image source = Image.FromFile(@"D:\temp\test2.jpg")) { </span><br><span class="line"> ImageCodecInfo codec = ImageCodecInfo.GetImageEncoders().First(c => c.MimeType == "image/jpeg"); </span><br><span class="line"> EncoderParameters parameters = new EncoderParameters(3);</span><br><span class="line"> parameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);</span><br><span class="line"> parameters.Param[1] = new EncoderParameter(System.Drawing.Imaging.Encoder.ScanMethod, (int)EncoderValue.ScanMethodInterlaced);</span><br><span class="line"> parameters.Param[2] = new EncoderParameter(System.Drawing.Imaging.Encoder.RenderMethod, (int)EncoderValue.RenderProgressive); </span><br><span class="line"> source.Save(@"D:\temp\saved.jpg", codec, parameters);</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><hr><p>特别感谢<a href="https://www.biaodianfu.com" target="_blank" rel="noopener">@标点符</a> <a href="http://www.zhangxinxu.com/" target="_blank" rel="noopener">@张鑫旭</a></p>]]></content>
<summary type="html">
<p> 网络上那些色色的照片都是<code>.jpg</code>格式的(“色色”指的是色彩斑斓的意思 /手动抠鼻/)。不知诸位有没有注意到,这些<code>.jpg</code>格式的图片在呈现的时候,有两种方式,一种是自上而下扫描式的,还有一种就是先是全部的模糊图片,然后逐渐清晰(就像GIF格式的交错显示)。</p>
<p> JPEG文件有两种保存方式,分别是<em>Baseline JPEG(基准式)</em>和<em>Progressive JPEG(渐进式)</em>。两种格式有相同尺寸以及图像数据,它们的扩展名也是相同的,唯一的区别是二者显示的方式不同。<br>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
</entry>
<entry>
<title>后期对焦AfterFocus Pro v2.1.0独家汉化破解版</title>
<link href="http://inplus.top/archives/afterfocus/"/>
<id>http://inplus.top/archives/afterfocus/</id>
<published>2016-11-15T01:29:20.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="http://img.inplus.top/afterfocus-0.png-logo" alt><br>AfterFocus Pro – 一款可将照片后期调教出背景虚化、焦点景物突出的单反效果,还可进行光圈控制、使用滤镜等一系列操作的Android应用。</p><p> 通过AfterFocus Pro,你可以通过简单地选择对焦区域创建DSLR风格的背景虚化的照片。此外,多种滤镜效果为您创造最自然,逼真的照片。更精确地选择一个对焦领域,可以实现更加自然和专业的照片。只需标记你想要对焦的地方,AfterFocus Pro将自动精确识别对焦区域中复杂形状的物体。这种自动功能可以让你在智能手机的小屏幕上更快捷方便的修片。另外,AfterFocus Pro的背景虚化效果使相片背景的边缘和焦点区域之间呈现更逼真的外观。</p><p>通过滤镜效果,您将享受拍摄和照片编辑,并在社交平台轻松分享。<br><a id="more"></a><br><strong>功能特点:</strong></p><ol><li>智能选择对焦区域<br>在对焦区域和背景区域内简单地画一些线条,然后AfterFocus Pro会自动识别对焦区域。也可以手动涂抹选择对焦区域。</li><li>背景虚化效果<br>你可以创建各种风格的光圈,就像数码单反相机最现实的虚化效果。<br>需要注意的是,对于某些运动的物体,也可使用运动模糊和放大的虚化效果。</li><li>滤镜效果<br>AfterFocus Pro提供从基本效果到像专业的大师拍摄的效果。<br>此外,您还可以突出使用背景虚化效果的背景聚光灯。</li><li>易于分享<br>您可以通过电子邮件和社交平台方便快捷分享。</li></ol><p><img src="http://img.inplus.top/afterfocus-1.png-screenshot" alt> <img src="http://img.inplus.top/afterfocus-2.png-screenshot" alt></p><p><img src="http://img.inplus.top/afterfocus-3.png-screenshot" alt> <img src="http://img.inplus.top/afterfocus-4.png-screenshot" alt></p><figure class="highlight routeros"><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><br><span class="line"></span><br><span class="line">Version 2.1.0</span><br><span class="line"><span class="number">*1</span>. Crash fix</span><br><span class="line"><span class="number">*2</span>. Adds brush-size<span class="built_in"> tool </span><span class="keyword">in</span><span class="built_in"> manual </span>focusing</span><br><span class="line">Version 2.0.3</span><br><span class="line"><span class="number">*1</span>. Can save image <span class="keyword">in</span> original size</span><br><span class="line"><span class="number">*2</span>. Adds Zoom blur</span><br><span class="line"><span class="number">*3</span>. Keeps image quality after saving <span class="keyword">for</span> the large image</span><br><span class="line"><span class="number">*4</span>. Focus selection<span class="built_in"> tool </span>Improvements</span><br><span class="line"><span class="number">*5</span>. Overall UI improvements</span><br><span class="line">Version 1.7.2</span><br><span class="line"><span class="number">*1</span>. Fix slow responsiveness <span class="keyword">for</span> small<span class="built_in"> screen </span>device</span><br><span class="line"><span class="number">*2</span>. Fix crash when app brings <span class="keyword">to</span> foreground <span class="keyword">from</span> background</span><br></pre></td></tr></table></figure><p>来源:<a href="http://appm1.com/afterfocus" target="_blank" rel="noopener">http://appm1.com/afterfocus</a><br>Google Play:<br><a href="https://play.google.com/store/apps/details?id=com.motionone.afterfocus_pro" target="_blank" rel="noopener">https://play.google.com/store/apps/details?id=com.motionone.afterfocus_pro</a></p><hr><p><strong>修改说明:</strong></p><ol><li>破解Google授权验证、NDK签名逻辑验证</li><li>精简语言</li><li>汉化为简体中文</li><li>arm架构精简</li><li>Zipalign对齐优化</li></ol><p><strong>修改人员:<a href>风澈vio</a>(转载必须注明出处)</strong></p><p><strong>※<a href="https://viosay.ctfile.com/fs/15555077-327033532" target="_blank" rel="noopener">城通网盘</a>(进入下载列表-最下方普通低速单线程下载)※</strong></p><ul><li>注意:</li><li>使用者由此程序所造成的损失修改者不承担任何责任。</li><li>最终版权归原作者所有。</li><li>破解版仅供学习研究使用,严禁用于商业用途,请在下载后24小时内删除。</li><li>请在法律允许的范围内合理使用本程序。</li></ul>]]></content>
<summary type="html">
<p><img src="http://img.inplus.top/afterfocus-0.png-logo" alt><br>AfterFocus Pro – 一款可将照片后期调教出背景虚化、焦点景物突出的单反效果,还可进行光圈控制、使用滤镜等一系列操作的Android应用。</p>
<p> 通过AfterFocus Pro,你可以通过简单地选择对焦区域创建DSLR风格的背景虚化的照片。此外,多种滤镜效果为您创造最自然,逼真的照片。更精确地选择一个对焦领域,可以实现更加自然和专业的照片。只需标记你想要对焦的地方,AfterFocus Pro将自动精确识别对焦区域中复杂形状的物体。这种自动功能可以让你在智能手机的小屏幕上更快捷方便的修片。另外,AfterFocus Pro的背景虚化效果使相片背景的边缘和焦点区域之间呈现更逼真的外观。</p>
<p>通过滤镜效果,您将享受拍摄和照片编辑,并在社交平台轻松分享。<br>
</summary>
<category term="App" scheme="http://inplus.top/tags/App/"/>
</entry>
<entry>
<title>Mifare Classic Tool(MCT)2.1.0汉化特别版</title>
<link href="http://inplus.top/archives/mifareclassictool/"/>
<id>http://inplus.top/archives/mifareclassictool/</id>
<published>2016-10-19T17:29:20.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="http://img.inplus.top/MCT-0.png-logo" alt><br>Mifare Classic Tool (MCT) – 一款用来读取、写入、分析Mifare Classic RFID卡片的Android NFC应用。</p><p><strong>功能特点:</strong></p><ul><li>读取Mifare Classic卡片</li><li>编辑并保存卡片的数据</li><li>写入Mifare Classic卡片</li><li>复制Mifare Classic卡片(从一张卡片写入数据文件到一张新卡;不包括第一区块)</li><li>字典暴力破解</li><li>格式化标签至出厂状态</li></ul><a id="more"></a><ul><li>写特殊的Mifare Classic卡片制造商块</li><li>创建、编辑、保存和共享密钥文件(字典)</li><li>编码解码Mifare Classic价值块</li><li>编码解码Mifare Classic的访问条件</li><li>比较转储(比对工具)</li><li>显示卡片属性信息</li><li>高亮显示卡片十六进制数据</li><li>显示卡片数据为7-Bit US-ASCII码</li><li>以表来显示Mifare Classic访问条件</li><li>显示Mifare Classic值块为整数</li><li>应用内(离线)帮助和其它信息</li><li>它是个开源项目(GPLv3)</li></ul><p><img src="http://img.inplus.top/MCT-1.png-screenshot" alt> <img src="http://img.inplus.top/MCT-2.png-screenshot" alt></p><p><img src="http://img.inplus.top/MCT-3.png-screenshot" alt> <img src="http://img.inplus.top/MCT-4.png-screenshot" alt></p><figure class="highlight applescript"><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></pre></td><td class="code"><pre><span class="line">更新日志:</span><br><span class="line"></span><br><span class="line">Version <span class="number">2.1</span><span class="number">.0</span>:</span><br><span class="line"> * Set custom sector <span class="built_in">count</span> (<span class="built_in">read</span>/<span class="built_in">write</span> MIFARE Classic <span class="number">2</span>k).</span><br><span class="line"> * Check BCC <span class="keyword">before</span> writing.</span><br><span class="line"> * Added BCC calculator tool.</span><br><span class="line"> * Added more well known keys <span class="keyword">to</span> <span class="keyword">the</span> extended key <span class="built_in">file</span>.</span><br><span class="line"> (Remove <span class="keyword">the</span> old <span class="keyword">and</span> restart MCT <span class="keyword">to</span> <span class="keyword">get</span> <span class="keyword">the</span> new key <span class="built_in">file</span>.)</span><br><span class="line"> * Added Chinese translation.</span><br><span class="line"> * Changed <span class="string">"Mifare"</span> <span class="keyword">to</span> <span class="string">"MIFARE"</span> <span class="keyword">to</span> comply <span class="keyword">with</span> NXP's registered trademark.</span><br><span class="line"> * Added multiple devices <span class="keyword">to</span> <span class="keyword">the</span> <span class="built_in">list</span> <span class="keyword">of</span> incompatible devices.</span><br><span class="line"> * Some minor bug fixes.</span><br><span class="line"></span><br><span class="line">Version <span class="number">2.0</span><span class="number">.7</span>:</span><br><span class="line"> * Bugfix: Request permissions <span class="keyword">on</span> Android <span class="number">6.</span>x devices <span class="keyword">to</span> <span class="built_in">read</span>/<span class="built_in">write</span></span><br><span class="line"> <span class="keyword">the</span> external storage. Thanks <span class="keyword">to</span> Mislav Jurinić.</span><br></pre></td></tr></table></figure><p>源码:<a href="https://github.com/ikarus23/MifareClassicTool" target="_blank" rel="noopener">https://github.com/ikarus23/MifareClassicTool</a><br>来源:<a href="http://www.proxmark.org/forum/viewtopic.php?id=1535" target="_blank" rel="noopener">http://www.proxmark.org/forum/viewtopic.php?id=1535</a><br>Google Play:<br><a href="https://play.google.com/store/apps/details?id=de.syss.MifareClassicTool" target="_blank" rel="noopener">https://play.google.com/store/apps/details?id=de.syss.MifareClassicTool</a></p><hr><p><strong>修改说明:</strong></p><ol><li>修正官方汉化</li><li>精简语言</li><li>独家汉化帮助文档</li><li>zipalign对齐优化</li></ol><p><strong>修改人员:<a href>风澈vio</a>(转载必须注明出处)</strong></p><p><strong>下载地址:<a href="http://pan.baidu.com/s/1bo79BZL" target="_blank" rel="noopener">百度网盘</a> 密码:1024</strong></p><ul><li>注意:</li><li>使用者由此程序所造成的损失修改者不承担任何责任。</li><li>最终版权归原作者所有。</li><li>请在法律允许的范围内合理使用本程序。</li></ul>]]></content>
<summary type="html">
<p><img src="http://img.inplus.top/MCT-0.png-logo" alt><br>Mifare Classic Tool (MCT) – 一款用来读取、写入、分析Mifare Classic RFID卡片的Android NFC应用。</p>
<p><strong>功能特点:</strong></p>
<ul>
<li>读取Mifare Classic卡片</li>
<li>编辑并保存卡片的数据</li>
<li>写入Mifare Classic卡片</li>
<li>复制Mifare Classic卡片(从一张卡片写入数据文件到一张新卡;不包括第一区块)</li>
<li>字典暴力破解</li>
<li>格式化标签至出厂状态</li>
</ul>
</summary>
<category term="App" scheme="http://inplus.top/tags/App/"/>
</entry>
<entry>
<title>多说评论下篇之个性化评论框</title>
<link href="http://inplus.top/archives/duoshuothree/"/>
<id>http://inplus.top/archives/duoshuothree/</id>
<published>2016-10-07T15:27:17.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/duoshuothree/duoshuothree-0.png" class="img-center-logo"></p><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p> 上面两篇我们详细介绍了多说评论自定义CSS头像和显示UA信息和博主。但是仍然感觉评论框十分不协调,并且有些杂乱,接下来我们就要谈论我们的多说评论框<strong>下篇</strong>之个性化评论框,话不多说,切入正题~<br><a id="more"></a></p><h2 id="多说自定义CSS"><a href="#多说自定义CSS" class="headerlink" title="多说自定义CSS"></a>多说自定义CSS</h2><blockquote><p>扩展阅读<br>多说docs:<a href="http://dev.duoshuo.com/docs/4ff1cfd0397309552c000017" target="_blank" rel="noopener">http://dev.duoshuo.com/docs/4ff1cfd0397309552c000017</a></p></blockquote><h5 id="1、-评论框左右边距"><a href="#1、-评论框左右边距" class="headerlink" title="1、 评论框左右边距"></a>1、 评论框左右边距</h5><p>如果你的评论框左右边距过小(评论框太宽),输入下列代码调整宽度,直到页面上评论框宽度显示合适:<br>方式一:<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> {<span class="attribute">padding</span>:<span class="number">24px</span>;}</span><br></pre></td></tr></table></figure></p><p>方式二:<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> {<span class="attribute">margin</span>:<span class="number">24px</span>;}</span><br></pre></td></tr></table></figure></p><p>如果你的评论框太窄,可能是宽度被设定了不合适的值,输入下列代码让宽度自动拉伸:<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> {<span class="attribute">width</span>:auto;}</span><br></pre></td></tr></table></figure></p><h5 id="2、评论框背景色"><a href="#2、评论框背景色" class="headerlink" title="2、评论框背景色"></a>2、评论框背景色</h5><p>多说评论会采用主题的背景色作为整体评论框的背景,这样可能导致评论本身不是很显眼。你可以输入下列代码来更改整体评论框的背景颜色:<br>方式一:<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> {<span class="attribute">background</span>: <span class="number">#ffffff</span>;}</span><br></pre></td></tr></table></figure></p><p>方式二:<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-textarea-wrapper</span> { <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, .<span class="number">5</span>);}</span><br></pre></td></tr></table></figure></p><p>这个评论背景的边角默认是直角,如果想改成圆角,请输入下列代码(仅在firefox,chrome及高版本ie浏览器下有效,ie6,7,8将仍然为直角显示):<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span>{ <span class="attribute">border-radius</span>: <span class="number">5px</span>;}</span><br></pre></td></tr></table></figure></p><p>注意:其中的<code>#ffffff</code>可以被替换为你希望的颜色,以便于评论文字相适应。</p><h5 id="3、高亮字体的颜色"><a href="#3、高亮字体的颜色" class="headerlink" title="3、高亮字体的颜色"></a>3、高亮字体的颜色</h5><p>高亮字体包括“n条评论”,“n条微博”,评论者名字的颜色,想修改它的显示颜色(在大多数情况下默认是红色),输入下列代码:<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-highlight</span>{<span class="attribute">color</span>: <span class="number">#ffffff</span> <span class="meta">!important</span>;}</span><br></pre></td></tr></table></figure></p><h5 id="4、定义评论框内字体和颜色"><a href="#4、定义评论框内字体和颜色" class="headerlink" title="4、定义评论框内字体和颜色"></a>4、定义评论框内字体和颜色</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-textarea-wrapper</span> <span class="selector-tag">textarea</span>, <span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-textarea-wrapper</span> <span class="selector-class">.ds-hidden-text</span> {<span class="attribute">font-family</span>: ‘微软雅黑’ ‘Microsoft Yahei’<span class="meta">!important</span>;<span class="attribute">font-size</span>:<span class="number">12px</span>;<span class="attribute">letter-spacing</span>:<span class="number">1px</span>;}</span><br></pre></td></tr></table></figure><p>这个好像是定义评论框内输入的文字字体的,嗯,好像是。 想修改评论正文的字体颜色,请输入下列代码:<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comment-body</span> <span class="selector-tag">p</span> {<span class="attribute">color</span>: <span class="number">#ffffff</span>;}</span><br></pre></td></tr></table></figure></p><p>当您在修改一部分上面未示例的标签样式时,遇到无效的情况,请尝试增加:<code>!important</code></p><h5 id="5、评论框背景图片"><a href="#5、评论框背景图片" class="headerlink" title="5、评论框背景图片"></a>5、评论框背景图片</h5><p>url换成你自己想要的图片地址就行了,最好使用绝对路径。<br>方式一:<br><figure class="highlight css"><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="selector-class">.ds-textarea-wrapper</span><span class="selector-class">.ds-rounded-top</span>{</span><br><span class="line"><span class="attribute">background</span>: <span class="number">#ffffff</span> <span class="built_in">url</span>(你想设置的图片地址) no-repeat right bottom <span class="meta">!important</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>方式二:<br><figure class="highlight css"><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="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-textarea-wrapper</span> <span class="selector-tag">textarea</span> {</span><br><span class="line"><span class="attribute">background</span>:<span class="built_in">url</span>(你的图片地址) center no-repeat;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><p>方式三:<br><figure class="highlight css"><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="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-textarea-wrapper</span> <span class="selector-tag">textarea</span> {</span><br><span class="line"><span class="attribute">background</span>: <span class="built_in">url</span>(<span class="string">"你的图片地址"</span>) bottom right no-repeat;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></p><h5 id="6、将评论框底部的分享到微博QQ空间什么的隐藏起来"><a href="#6、将评论框底部的分享到微博QQ空间什么的隐藏起来" class="headerlink" title="6、将评论框底部的分享到微博QQ空间什么的隐藏起来"></a>6、将评论框底部的分享到微博QQ空间什么的隐藏起来</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.ds-sync</span>{<span class="attribute">display</span>:none <span class="meta">!important</span>;}</span><br></pre></td></tr></table></figure><h5 id="7、隐藏评论框底部渐变背景"><a href="#7、隐藏评论框底部渐变背景" class="headerlink" title="7、隐藏评论框底部渐变背景"></a>7、隐藏评论框底部渐变背景</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-gradient-bg</span>{<span class="attribute">background</span>:none <span class="meta">!important</span>;}</span><br></pre></td></tr></table></figure><p>话说渐变色什么的虽然立体感较强但是和主题整体风格不融洽,隐藏之,这样底部就是透明的了。</p><h5 id="8、定义发布按钮字体,以及渐变色背景"><a href="#8、定义发布按钮字体,以及渐变色背景" class="headerlink" title="8、定义发布按钮字体,以及渐变色背景"></a>8、定义发布按钮字体,以及渐变色背景</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-post-button</span>{<span class="attribute">font-family</span>: ‘微软雅黑’‘Microsoft Yahei’<span class="meta">!important</span>;<span class="attribute">font-weight</span>: bold;<span class="attribute">font-size</span>:<span class="number">12px</span>;<span class="attribute">background</span>:none <span class="meta">!important</span>;<span class="attribute">color</span>:<span class="number">#49976b</span> <span class="meta">!important</span>;}</span><br></pre></td></tr></table></figure><h5 id="9、隐藏评论右上方-最热-最新排序按钮"><a href="#9、隐藏评论右上方-最热-最新排序按钮" class="headerlink" title="9、隐藏评论右上方 最热 最新排序按钮"></a>9、隐藏评论右上方 最热 最新排序按钮</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-sort</span> {<span class="attribute">display</span>:none;}</span><br></pre></td></tr></table></figure><h5 id="10、隐藏评论左上方-评论总数背景色及边框"><a href="#10、隐藏评论左上方-评论总数背景色及边框" class="headerlink" title="10、隐藏评论左上方 评论总数背景色及边框"></a>10、隐藏评论左上方 评论总数背景色及边框</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">li</span><span class="selector-class">.ds-tab</span> <span class="selector-tag">a</span><span class="selector-class">.ds-current</span>{<span class="attribute">background</span>:none;<span class="attribute">border</span>:none;}</span><br></pre></td></tr></table></figure><h5 id="11、隐藏底部多说版权"><a href="#11、隐藏底部多说版权" class="headerlink" title="11、隐藏底部多说版权"></a>11、隐藏底部多说版权</h5><p>很多朋友在找这个代码。不过不建议用。毕竟显示版权信息还是比较好。<br>方式一:<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-powered-by</span>{<span class="attribute">display</span>:none;}</span><br></pre></td></tr></table></figure></p><p>方式二:<br><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-class">.ds-powered-by</span> {<span class="attribute">display</span>: none;}</span><br></pre></td></tr></table></figure></p><h5 id="12、定义各种文字高亮颜色,以及浮动窗口的高亮颜色,配合模板颜色把以下色值统一设置即可。"><a href="#12、定义各种文字高亮颜色,以及浮动窗口的高亮颜色,配合模板颜色把以下色值统一设置即可。" class="headerlink" title="12、定义各种文字高亮颜色,以及浮动窗口的高亮颜色,配合模板颜色把以下色值统一设置即可。"></a>12、定义各种文字高亮颜色,以及浮动窗口的高亮颜色,配合模板颜色把以下色值统一设置即可。</h5><figure class="highlight css"><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/*定义高亮字体颜色*/</span></span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-highlight</span>{<span class="attribute">color</span>:<span class="number">#49976b</span> <span class="meta">!important</span>;}</span><br><span class="line"><span class="comment">/*定义评论框内其他高亮颜色*/</span></span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-id">#ds-bubble</span> <span class="selector-tag">a</span>{<span class="attribute">color</span>: <span class="number">#49976b</span> <span class="meta">!important</span>;}</span><br><span class="line"><span class="comment">/*定义评论框内其他高亮颜色*/</span></span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-id">#ds-bubble</span> {<span class="attribute">color</span>: <span class="number">#49976b</span> <span class="meta">!important</span>;}</span><br><span class="line"><span class="comment">/*定义评论框内其他高亮颜色*/</span></span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-id">#ds-ctx</span> <span class="selector-class">.ds-ctx-entry</span> <span class="selector-class">.ds-ctx-head</span> <span class="selector-tag">a</span>{<span class="attribute">color</span>: <span class="number">#49976b</span> <span class="meta">!important</span>;}</span><br><span class="line"><span class="comment">/*定义评论框内其他高亮颜色*/</span></span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">a</span><span class="selector-class">.ds-comment-context</span><span class="selector-pseudo">:hover</span>{<span class="attribute">color</span>: <span class="number">#49976b</span> <span class="meta">!important</span>;}</span><br><span class="line"><span class="comment">/*定义评论框内其他高亮颜色*/</span></span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">a</span><span class="selector-class">.ds-comment-context</span>{<span class="attribute">color</span>: <span class="number">#49976b</span> <span class="meta">!important</span>;}</span><br></pre></td></tr></table></figure><h5 id="13、喜欢按钮样式:透明度,背景,边框等样式调整。"><a href="#13、喜欢按钮样式:透明度,背景,边框等样式调整。" class="headerlink" title="13、喜欢按钮样式:透明度,背景,边框等样式调整。"></a>13、喜欢按钮样式:透明度,背景,边框等样式调整。</h5><figure class="highlight css"><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="selector-class">.ds-meta</span> {</span><br><span class="line"> <span class="attribute">opacity</span>: .<span class="number">5</span>;</span><br><span class="line"> }</span><br><span class="line"><span class="selector-class">.ds-meta</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">a</span><span class="selector-class">.ds-like-thread-button</span> {</span><br><span class="line"> <span class="attribute">background-image</span>: none;</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="number">#fee2d3</span>;</span><br><span class="line"> <span class="attribute">border</span>: none;</span><br><span class="line"> <span class="attribute">text-shadow</span>: none;</span><br><span class="line"> <span class="attribute">font-family</span>: inherit;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h5 id="14、社交账号登陆透明度"><a href="#14、社交账号登陆透明度" class="headerlink" title="14、社交账号登陆透明度"></a>14、社交账号登陆透明度</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-login-buttons</span> {</span><br><span class="line"> <span class="attribute">opacity</span>: .<span class="number">5</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-login-buttons</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h5 id="15、评论、文本框字体:默认字体偏小,稍作调整。"><a href="#15、评论、文本框字体:默认字体偏小,稍作调整。" class="headerlink" title="15、评论、文本框字体:默认字体偏小,稍作调整。"></a>15、评论、文本框字体:默认字体偏小,稍作调整。</h5><figure class="highlight css"><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="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comment-body</span> <span class="selector-tag">p</span>, <span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-textarea-wrapper</span> <span class="selector-tag">textarea</span> {</span><br><span class="line"> <span class="attribute">font-size</span>: <span class="number">1.15em</span>;</span><br><span class="line"> <span class="attribute">color</span>: <span class="number">#717171</span>;</span><br><span class="line"> <span class="attribute">font-family</span>: inherit;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure><h5 id="16、用户名等超链接颜色"><a href="#16、用户名等超链接颜色" class="headerlink" title="16、用户名等超链接颜色"></a>16、用户名等超链接颜色</h5><figure class="highlight css"><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="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-highlight</span> {</span><br><span class="line"> <span class="attribute">color</span>: <span class="number">#ef7c6c</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="17、未登录用户名字颜色:颜色与其他登陆用户保持一致"><a href="#17、未登录用户名字颜色:颜色与其他登陆用户保持一致" class="headerlink" title="17、未登录用户名字颜色:颜色与其他登陆用户保持一致"></a>17、未登录用户名字颜色:颜色与其他登陆用户保持一致</h5><figure class="highlight css"><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="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-user-name</span> {</span><br><span class="line"> <span class="attribute">color</span>: <span class="number">#ef7c6c</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="18、工具栏背景"><a href="#18、工具栏背景" class="headerlink" title="18、工具栏背景"></a>18、工具栏背景</h5><figure class="highlight css"><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="selector-id">#ds-reset</span> <span class="selector-class">.ds-gradient-bg</span> {</span><br><span class="line"> <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, .<span class="number">5</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="19、“发布”按钮背景:去掉背景图,修改底色,去掉文字阴影。"><a href="#19、“发布”按钮背景:去掉背景图,修改底色,去掉文字阴影。" class="headerlink" title="19、“发布”按钮背景:去掉背景图,修改底色,去掉文字阴影。"></a>19、“发布”按钮背景:去掉背景图,修改底色,去掉文字阴影。</h5><figure class="highlight css"><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="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-post-button</span> {</span><br><span class="line"> <span class="attribute">background-image</span>: none;</span><br><span class="line"> <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">136</span>, <span class="number">172</span>, <span class="number">219</span>, .<span class="number">2</span>);</span><br><span class="line"> <span class="attribute">text-shadow</span>: none;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="20、评论列表背景"><a href="#20、评论列表背景" class="headerlink" title="20、评论列表背景"></a>20、评论列表背景</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">li</span><span class="selector-class">.ds-post</span> {</span><br><span class="line"> <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, .<span class="number">2</span>);</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">li</span><span class="selector-class">.ds-post</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"> <span class="attribute">background-color</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, .<span class="number">6</span>) <span class="meta">!important</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="21、评论数标签"><a href="#21、评论数标签" class="headerlink" title="21、评论数标签"></a>21、评论数标签</h5><figure class="highlight css"><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="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">li</span><span class="selector-class">.ds-tab</span> <span class="selector-tag">a</span><span class="selector-class">.ds-current</span> {</span><br><span class="line"> <span class="attribute">background</span>: <span class="built_in">rgba</span>(<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>, .<span class="number">2</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>都是一些现成的CSS代码,直接复制就可以用了。当然里面的颜色或者是其他属性什么的你们自己修改就可以了。照样可以实现你想要的效果。</strong></p><h2 id="手动获取css标签信息"><a href="#手动获取css标签信息" class="headerlink" title="手动获取css标签信息"></a>手动获取css标签信息</h2><p>当然,这些个性化信息并不能全覆盖我们自己想要达到的效果,那么在具体使用中,我们怎样知道多说的某一个按钮,某一条线,使用的是哪一个css标签呢?(像<code>#ds-thread #ds-reset .ds-highlight</code>),下面提供一个在google chrome下查看的简单办法:</p><ol><li><p>在页面元素上方点击【鼠标右键】,选择【审查元素】<br><img src="/assets/blogImg/duoshuothree/duoshuothree-1.jpg"></p></li><li><p>将鼠标悬浮在相应元素的代码上方,页面中也会显示出选中效果。点击代码之后,右侧子窗口会显示相应标签。<br><img src="/assets/blogImg/duoshuothree/duoshuothree-2.jpg"></p></li><li><p>没错,如果你想要控制喜欢按钮的颜色,只需在多说的自定义css里,添加并调整color的颜色值即可</p></li></ol><figure class="highlight css"><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="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">a</span><span class="selector-class">.ds-like-thread-button</span> <span class="selector-tag">span</span> {</span><br><span class="line"> <span class="attribute">color</span>: <span class="number">#F00</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><p>特别感谢:<a href="http://shenchaofei.cn/" target="_blank" rel="noopener">@沈超飞</a> <a href="http://moxfive.xyz/" target="_blank" rel="noopener">@MOxFIVE</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/duoshuothree/duoshuothree-0.png" class="img-center-logo"></p>
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p> 上面两篇我们详细介绍了多说评论自定义CSS头像和显示UA信息和博主。但是仍然感觉评论框十分不协调,并且有些杂乱,接下来我们就要谈论我们的多说评论框<strong>下篇</strong>之个性化评论框,话不多说,切入正题~<br>
</summary>
<category term="Hexo" scheme="http://inplus.top/tags/Hexo/"/>
</entry>
<entry>
<title>多说评论中篇之显示UA信息和博主</title>
<link href="http://inplus.top/archives/duoshuotwo/"/>
<id>http://inplus.top/archives/duoshuotwo/</id>
<published>2016-10-05T15:27:17.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/duoshuotwo/duoshuotwo-0.png" class="img-center-logo"></p><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p> 上篇我们详细介绍了多说评论自定义CSS头像。为了彰显极(zhuang)客(bi)范儿,单单炫酷的头像动画可是不够的。接下来我们就要谈论我们的多说评论框<strong>中篇</strong>之显示UA(User Agent)信息和博主,话不多说,切入正题~<br><a id="more"></a></p><h2 id="多说添加UA-User-Agent-等个性化信息"><a href="#多说添加UA-User-Agent-等个性化信息" class="headerlink" title="多说添加UA(User Agent)等个性化信息"></a>多说添加UA(User Agent)等个性化信息</h2><h4 id="本地化embed-js"><a href="#本地化embed-js" class="headerlink" title="本地化embed.js"></a>本地化embed.js</h4><h6 id="1、下载embed-js"><a href="#1、下载embed-js" class="headerlink" title="1、下载embed.js"></a>1、下载embed.js</h6><p>多说官方 - <a href="http://static.duoshuo.com/embed.js" target="_blank" rel="noopener">http://static.duoshuo.com/embed.js</a></p><h6 id="2、上传embed-js"><a href="#2、上传embed-js" class="headerlink" title="2、上传embed.js"></a>2、上传embed.js</h6><p>我的做法上传到GitHub,其它类似七牛或者云主机的方法都可以<br><a href="http://viosay.github.io/assets/js/embed.js" target="_blank" rel="noopener">http://viosay.github.io/assets/js/embed.js</a></p><h6 id="3、修改多说调用地址"><a href="#3、修改多说调用地址" class="headerlink" title="3、修改多说调用地址"></a>3、修改多说调用地址</h6><p>在Hexo的主题中的<code>duoshuo.ejs</code>文件中修改调用地址,其它平台以此类推,我自己的做法<br><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">ds.src</span> = <span class="string">'/assets/js/embed.js'</span><span class="comment">;</span></span><br></pre></td></tr></table></figure></p><h4 id="修改embed-js"><a href="#修改embed-js" class="headerlink" title="修改embed.js"></a>修改embed.js</h4><h6 id="1、获取多说ID"><a href="#1、获取多说ID" class="headerlink" title="1、获取多说ID"></a>1、获取多说ID</h6><p>方法一:在文章下方登录后评论点击头像可获取多说ID<br>方法二:访问多说后台,<a href="http://duoshuo.com/settings/" target="_blank" rel="noopener">http://duoshuo.com/settings/</a> ,点击你的用户名,地址栏中会出现如如下的ID地址<a href="http://duoshuo.com/profile/6223597840313090818/" target="_blank" rel="noopener">http://duoshuo.com/profile/6223597840313090818/</a></p><h6 id="2、添加个性化信息到embed-js文件"><a href="#2、添加个性化信息到embed-js文件" class="headerlink" title="2、添加个性化信息到embed.js文件"></a>2、添加个性化信息到embed.js文件</h6><p>在embed.js的最上面添加以下代码:<br>(注意修改e.user_id多说ID,可以自定义ssk前端显示昵称)<br> <figure class="highlight scala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//移动客户端判断开始</span></span><br><span class="line">function checkMobile() {</span><br><span class="line"> <span class="keyword">var</span> isiPad = navigator.userAgent.<span class="keyword">match</span>(/iPad/i) != <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">if</span> (isiPad) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">var</span> isMobile = navigator.userAgent.<span class="keyword">match</span>(/iphone|android|phone|mobile|wap|netfront|x11|java|opera mobi|opera mini|ucweb|windows ce|symbian|symbianos|series|webos|sony|blackberry|dopod|nokia|samsung|palmsource|xda|pieplus|meizu|midp|cldc|motorola|foma|docomo|up.browser|up.link|blazer|helio|hosin|huawei|novarra|coolpad|webos|techfaith|palmsource|alcatel|amoi|ktouch|nexian|ericsson|philips|sagem|wellcom|bunjalloo|maui|smartphone|iemobile|spice|bird|zte-|longcos|pantech|gionee|portalmmm|jig browser|hiptop|benq|haier|^lct|<span class="number">320</span>x320|<span class="number">240</span>x320|<span class="number">176</span>x220/i) != <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">if</span> (isMobile) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">//移动客户端判断结束</span></span><br><span class="line"><span class="comment">//管理员判断开始</span></span><br><span class="line">function sskadmin(e) {</span><br><span class="line"> <span class="keyword">var</span> ssk = '';</span><br><span class="line"> <span class="keyword">if</span> (e.user_id == <span class="number">6223597840313090818</span>) {</span><br><span class="line"> <span class="keyword">if</span> (checkMobile()) {</span><br><span class="line"> ssk = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua"</span>><span <span class="class"><span class="keyword">class</span></span>=<span class="string">"sskadmin"</span>>☆博主☆</span></span><br><br>';</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> ssk = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua"</span>><span <span class="class"><span class="keyword">class</span></span>=<span class="string">"sskadmin"</span>>☆博主☆</span></span>';</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">if</span> (checkMobile()) {</span><br><span class="line"> ssk = '<br><br>';</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> ssk;</span><br><span class="line">}</span><br><span class="line"><span class="comment">//管理员判断结束</span></span><br><span class="line"><span class="comment">//显UA开始</span></span><br><span class="line">function ua(e) {</span><br><span class="line"> <span class="keyword">var</span> r = <span class="keyword">new</span> <span class="type">Array</span>;</span><br><span class="line"> <span class="keyword">var</span> outputer = '';</span><br><span class="line"> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">FireFox</span>\/([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_firefox"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">Mozilla</span> <span class="type">FireFox</span>' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">Maxthon</span>([\d]*)\/([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_maxthon"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">Maxthon</span>' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">BIDUBrowser</span>([\d]*)\/([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_ucweb"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> 百度浏览器' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">UBrowser</span>([\d]*)\/([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_ucweb"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">UCBrowser</span>' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">UCBrowser</span>([\d]*)\/([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_ucweb"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">UCBrowser</span>' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">MetaSr</span>/ig)) {</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_sogou"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> 搜狗浏览器'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="number">2345</span>Explorer/ig)) {</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_2345explorer"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="number">2345</span>王牌浏览器'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="number">2345</span>chrome/ig)) {</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_2345chrome"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="number">2345</span>加速浏览器'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">LBBROWSER</span>/ig)) {</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_lbbrowser"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> 猎豹安全浏览器'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">MicroMessenger</span>\/([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_qq"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-weixin"</span>></i> 微信' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> <span class="comment">/*.split('/')[0]*/</span></span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">QQBrowser</span>\/([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_qq"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">QQ</span>浏览器' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> <span class="comment">/*.split('/')[0]*/</span></span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">QQ</span>\/([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_qq"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">QQ</span>浏览器' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> <span class="comment">/*.split('/')[0]*/</span></span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">MiuiBrowser</span>\/([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_mi"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">Miui</span>浏览器' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> <span class="comment">/*.split('/')[0]*/</span></span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">Chrome</span>([\d]*)\/([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_chrome"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">Chrome</span>' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> <span class="comment">/*.split('.')[0]*/</span></span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/safari\/([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_apple"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">Apple</span> <span class="type">Safari</span>' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">Opera</span>[\s|\/]([^\s]+)/ig)) {</span><br><span class="line"> <span class="keyword">var</span> r1 = r[<span class="number">0</span>].split(<span class="string">"/"</span>);</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_opera"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">Opera</span>' + ' ' + r1[<span class="number">1</span>]</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">Trident</span>\/<span class="number">7.0</span>/gi)) {</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_ie"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">Internet</span> <span class="type">Explorer</span> <span class="number">11</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (r = e.<span class="keyword">match</span>(/<span class="type">MSIE</span>\s([^\s|;]+)/gi)) {</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_ie"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> <span class="type">Internet</span> <span class="type">Explorer</span>' + ' ' + r[<span class="number">0</span>]</span><br><span class="line"> <span class="comment">/*.replace('MSIE', '').split('.')[0]*/</span></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> outputer = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"ua_other"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-globe"</span>></i> 其它浏览器'</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (checkMobile()) {</span><br><span class="line"> <span class="type">Mobile</span> = '<br><br>';</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="type">Mobile</span> = '';</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> outputer + <span class="string">"</span>"</span> + <span class="type">Mobile</span>;</span><br><span class="line">}</span><br><span class="line">function os(e) {</span><br><span class="line"> <span class="keyword">var</span> os = '';</span><br><span class="line"> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/win/ig)) {</span><br><span class="line"> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/nt <span class="number">5.1</span>/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_xp"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> <span class="type">Windows</span> <span class="type">XP</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/nt <span class="number">6.1</span>/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_7"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> <span class="type">Windows</span> <span class="number">7</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/nt <span class="number">6.2</span>/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_8"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> <span class="type">Windows</span> <span class="number">8</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/nt <span class="number">6.3</span>/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_8_1"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> <span class="type">Windows</span> <span class="number">8.1</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/nt <span class="number">10.0</span>/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_8_1"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> <span class="type">Windows</span> <span class="number">10</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/nt <span class="number">6.0</span>/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_vista"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> <span class="type">Windows</span> <span class="type">Vista</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/nt <span class="number">5</span>/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_2000"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> <span class="type">Windows</span> <span class="number">2000</span>'</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_windows"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> <span class="type">Windows</span>'</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/android/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_android"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-android"</span>></i> <span class="type">Android</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/ubuntu/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_ubuntu"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> <span class="type">Ubuntu</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/linux/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_linux"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-linux"</span>></i> <span class="type">Linux</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/mac/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_mac"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> <span class="type">Mac</span> <span class="type">OS</span> <span class="type">X</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/unix/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_unix"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> <span class="type">Unix</span>'</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (e.<span class="keyword">match</span>(/symbian/ig)) {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_nokia"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-mobile"</span>></i> <span class="type">Nokia</span> <span class="type">SymbianOS</span>'</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> os = '<span <span class="class"><span class="keyword">class</span></span>=<span class="string">"os_other"</span>><i <span class="class"><span class="keyword">class</span></span>=<span class="string">"fa fa-desktop"</span>></i> 其它操作系统'</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> os + <span class="string">"</span>"</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">//显UA结束</span></span><br></pre></td></tr></table></figure></p><h6 id="3、增加调用"><a href="#3、增加调用" class="headerlink" title="3、增加调用"></a>3、增加调用</h6><p>添加完以上代码后,在编辑器中搜索:<br><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">data-qqt-account=<span class="string">"'+(r.qqt_account||"</span><span class="string">")+'"</span>>'+u(r.<span class="built_in">name</span>)+<span class="string">"</span>"</span>),</span><br></pre></td></tr></table></figure></p><p>在后面添加:<br><figure class="highlight lsl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">t+=<span class="string">"<span class=<span class="subst">\"</span>ua<span class="subst">\"</span>>"</span> + sskadmin(s.author) + <span class="string">"</span><span class=<span class="subst">\"</span>ua<span class="subst">\"</span>>"</span> + ua(s.agent) +<span class="string">"</span><span class=<span class="subst">\"</span>ua<span class="subst">\"</span>>"</span>+ os(s.agent) + <span class="string">"</span>"</span>,</span><br></pre></td></tr></table></figure></p><p>(如果搜索不到的话就减小点搜索范围,如:<code>data-qqt-account="'+</code>)</p><h4 id="多说后台自定义CSS"><a href="#多说后台自定义CSS" class="headerlink" title="多说后台自定义CSS"></a>多说后台自定义CSS</h4><p>请参考上篇方法加入多说自定义CSS<br><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">/*多说UA开始*/</span></span><br><span class="line"><span class="selector-tag">span</span><span class="selector-class">.this_ua</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#ccc</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">4px</span>;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">0</span> <span class="number">5px</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">margin</span>: <span class="number">0</span> <span class="number">1px</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#BBB</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#fff</span>;</span><br><span class="line"><span class="comment">/*text-transform: Capitalize!important;</span></span><br><span class="line"><span class="comment">float: right!important;</span></span><br><span class="line"><span class="comment">line-height: 18px!important;*/</span></span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.platform</span><span class="selector-class">.Windows</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#39b3d7</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#46b8da</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.platform</span><span class="selector-class">.Linux</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#3A3A3A</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#1F1F1F</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.platform</span><span class="selector-class">.Ubuntu</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#DD4814</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#DD4814</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.platform</span><span class="selector-class">.Mac</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#666666</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#666666</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.platform</span><span class="selector-class">.Android</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#98C13D</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#98C13D</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.platform</span><span class="selector-class">.iOS</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#666666</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#666666</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.browser</span><span class="selector-class">.Chrome</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#EE6252</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#EE6252</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.browser</span><span class="selector-class">.Chromium</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#EE6252</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#EE6252</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.browser</span><span class="selector-class">.Firefox</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#f0ad4e</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#eea236</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.browser</span><span class="selector-class">.IE</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#428bca</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#357ebd</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.browser</span><span class="selector-class">.Edge</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#428bca</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#357ebd</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.browser</span><span class="selector-class">.Opera</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#d9534f</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#d43f3a</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.browser</span><span class="selector-class">.Maxthon</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#7373B9</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#7373B9</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.browser</span><span class="selector-class">.Safari</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#666666</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#666666</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.this_ua</span><span class="selector-class">.sskadmin</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#00a67c</span><span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-color</span>: <span class="number">#00a67c</span><span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/*UA End*/</span></span><br><span class="line"><span class="comment">/*Head Start*/</span></span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">ul</span><span class="selector-class">.ds-comments-tabs</span> <span class="selector-tag">li</span><span class="selector-class">.ds-tab</span> <span class="selector-tag">a</span><span class="selector-class">.ds-current</span> {</span><br><span class="line"><span class="attribute">border</span>: <span class="number">0px</span>;</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#6D6D6B</span>;</span><br><span class="line"><span class="attribute">text-shadow</span>: none;</span><br><span class="line"><span class="attribute">background</span>: <span class="number">#F3F3F3</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-highlight</span> {</span><br><span class="line"><span class="attribute">font-family</span>: Microsoft YaHei, <span class="string">"Helvetica Neue"</span>, Helvetica, Arial, Sans-serif;</span><br><span class="line">;<span class="attribute">font-size</span>: <span class="number">100%</span>;</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#6D6D6B</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">ul</span><span class="selector-class">.ds-comments-tabs</span> <span class="selector-tag">li</span><span class="selector-class">.ds-tab</span> <span class="selector-tag">a</span><span class="selector-class">.ds-current</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#696a52</span>;</span><br><span class="line"><span class="attribute">background</span>: <span class="number">#F2F2F2</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">a</span><span class="selector-class">.ds-highlight</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#696a52</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> {</span><br><span class="line"><span class="attribute">padding-left</span>: <span class="number">15px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">li</span><span class="selector-class">.ds-post</span>,<span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-id">#ds-hot-posts</span> {</span><br><span class="line"><span class="attribute">overflow</span>: visible;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-post-self</span> {</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">10px</span> <span class="number">0</span> <span class="number">10px</span> <span class="number">10px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">li</span><span class="selector-class">.ds-post</span>,<span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-post-self</span> {</span><br><span class="line"><span class="attribute">border</span>: <span class="number">0</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span>, <span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">ul</span><span class="selector-class">.ds-children</span> <span class="selector-class">.ds-avatar</span> {</span><br><span class="line"><span class="attribute">top</span>: <span class="number">15px</span>;</span><br><span class="line"><span class="attribute">left</span>: -<span class="number">20px</span>;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">5px</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">36px</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">36px</span>;</span><br><span class="line"><span class="attribute">box-shadow</span>: -<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> rgba(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,.<span class="number">15</span>) inset;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">46px</span>;</span><br><span class="line"><span class="attribute">background</span>: <span class="number">#FAFAFA</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">a</span> {</span><br><span class="line"><span class="attribute">display</span>: inline-block;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">1px</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">32px</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">32px</span>;</span><br><span class="line"><span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#b9baa6</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#fff</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-class">.ds-avatar</span> > <span class="selector-tag">img</span> {</span><br><span class="line"><span class="attribute">margin</span>: <span class="number">2px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-replybox</span> {</span><br><span class="line"><span class="attribute">box-shadow</span>: none;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">ul</span><span class="selector-class">.ds-children</span> <span class="selector-class">.ds-replybox</span><span class="selector-class">.ds-inline-replybox</span> <span class="selector-tag">a</span><span class="selector-class">.ds-avatar</span>,</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-replybox</span><span class="selector-class">.ds-inline-replybox</span> <span class="selector-tag">a</span><span class="selector-class">.ds-avatar</span> {</span><br><span class="line"><span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">background</span>: none;</span><br><span class="line"><span class="attribute">box-shadow</span>: none;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-replybox</span><span class="selector-class">.ds-inline-replybox</span> <span class="selector-tag">a</span><span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> {</span><br><span class="line"><span class="attribute">width</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-replybox</span> <span class="selector-tag">a</span><span class="selector-class">.ds-avatar</span>,</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-replybox</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> {</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">5px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> {</span><br><span class="line"><span class="attribute">width</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">32px</span>;</span><br><span class="line"><span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">1px</span> <span class="number">3px</span> rgba(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.22</span>);</span><br><span class="line">-webkit-<span class="attribute">transition</span>: .<span class="number">8s</span> all ease-in-out;</span><br><span class="line">-moz-<span class="attribute">transition</span>: .<span class="number">4s</span> all ease-in-out;</span><br><span class="line">-o-<span class="attribute">transition</span>: .<span class="number">4s</span> all ease-in-out;</span><br><span class="line">-ms-<span class="attribute">transition</span>: .<span class="number">4s</span> all ease-in-out;</span><br><span class="line"><span class="attribute">transition</span>: .<span class="number">4s</span> all ease-in-out;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.ds-post-self</span><span class="selector-pseudo">:hover</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> {</span><br><span class="line">-webkit-<span class="attribute">transform</span>: rotateX(<span class="number">360deg</span>);</span><br><span class="line">-moz-<span class="attribute">transform</span>: rotate(<span class="number">360deg</span>);</span><br><span class="line">-o-<span class="attribute">transform</span>: rotate(<span class="number">360deg</span>);</span><br><span class="line">-ms-<span class="attribute">transform</span>: rotate(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">transform</span>: rotate(<span class="number">360deg</span>);</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comment-body</span> {</span><br><span class="line">-webkit-<span class="attribute">transition-delay</span>: initial;</span><br><span class="line">-webkit-<span class="attribute">transition-duration</span>: <span class="number">0.4s</span>;</span><br><span class="line">-webkit-<span class="attribute">transition-property</span>: all;</span><br><span class="line">-webkit-<span class="attribute">transition-timing-function</span>: initial;</span><br><span class="line"><span class="attribute">background</span>: <span class="number">#F7F7F7</span>;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">15px</span> <span class="number">15px</span> <span class="number">15px</span> <span class="number">47px</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">5px</span>;</span><br><span class="line"><span class="attribute">box-shadow</span>: <span class="number">#B8B9B9</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">3px</span>;</span><br><span class="line"><span class="attribute">border</span>: white <span class="number">1px</span> solid;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">ul</span><span class="selector-class">.ds-children</span> <span class="selector-class">.ds-comment-body</span> {</span><br><span class="line"><span class="attribute">padding-left</span>: <span class="number">15px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comment-body</span> <span class="selector-tag">p</span> {</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#787968</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comments</span> {</span><br><span class="line"><span class="attribute">border-bottom</span>: <span class="number">0px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-powered-by</span> {</span><br><span class="line"><span class="attribute">display</span>: none;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comments</span> <span class="selector-tag">a</span><span class="selector-class">.ds-user-name</span> {</span><br><span class="line"><span class="attribute">font-weight</span>: normal;</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#3D3D3D</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comments</span> <span class="selector-tag">a</span><span class="selector-class">.ds-user-name</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#D32</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-id">#ds-bubble</span> {</span><br><span class="line"><span class="attribute">display</span>: none <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-id">#ds-hot-posts</span> {</span><br><span class="line"><span class="attribute">border</span>: <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-id">#ds-hot-posts</span> <span class="selector-class">.ds-gradient-bg</span> {</span><br><span class="line"><span class="attribute">background</span>: none;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comment-body</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#F1F1F1</span>;</span><br><span class="line">-webkit-<span class="attribute">transition-delay</span>: initial;</span><br><span class="line">-webkit-<span class="attribute">transition-duration</span>: <span class="number">0.4s</span>;</span><br><span class="line">-webkit-<span class="attribute">transition-property</span>: all;</span><br><span class="line">-webkit-<span class="attribute">transition-timing-function</span>: initial;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/*多说UA结束*/</span></span><br></pre></td></tr></table></figure></p><p><strong>至此,在多说评论框中添加ua显示与博主标示步骤就全部做完了</strong><br><img src="/assets/blogImg/duoshuotwo/duoshuotwo-1.png"></p><h2 id="更多"><a href="#更多" class="headerlink" title="更多"></a>更多</h2><p>评论框添加的UA前加上小图标<br><a href="http://ssk.91txh.com/209" target="_blank" rel="noopener">http://ssk.91txh.com/209</a><br>评论框添加 站长回复 标记<br><a href="http://ssk.91txh.com/207" target="_blank" rel="noopener">http://ssk.91txh.com/207</a><br>多说不本地化embed.js评论显示UA<br><a href="http://easun.org/blog/archives/make_duoshuo_show_ua.html" target="_blank" rel="noopener">http://easun.org/blog/archives/make_duoshuo_show_ua.html</a><br>多说UA插件<br><a href="http://gerald.top/code/duoshuo-ua" target="_blank" rel="noopener">http://gerald.top/code/duoshuo-ua</a><br>ua-parser-js<br><a href="https://github.com/faisalman/ua-parser-js" target="_blank" rel="noopener">https://github.com/faisalman/ua-parser-js</a></p><hr><p>特别感谢:<a href="http://wsgzao.github.io" target="_blank" rel="noopener">@wsgzao</a> <a href="https://myhloli.com" target="_blank" rel="noopener">@萝莉社</a> <a href="http://ssk.91txh.com/" target="_blank" rel="noopener">@我的那些事-搜索客</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/duoshuotwo/duoshuotwo-0.png" class="img-center-logo"></p>
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p> 上篇我们详细介绍了多说评论自定义CSS头像。为了彰显极(zhuang)客(bi)范儿,单单炫酷的头像动画可是不够的。接下来我们就要谈论我们的多说评论框<strong>中篇</strong>之显示UA(User Agent)信息和博主,话不多说,切入正题~<br>
</summary>
<category term="Hexo" scheme="http://inplus.top/tags/Hexo/"/>
</entry>
<entry>
<title>多说评论上篇之自定义CSS头像</title>
<link href="http://inplus.top/archives/duoshuoone/"/>
<id>http://inplus.top/archives/duoshuoone/</id>
<published>2016-10-01T15:27:17.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/duoshuoone/duoshuoone-0.png" class="img-center-logo"></p><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p> 多说是一款社会化评论系统,它改变了网站与用户之间,用户与用户之间的互动方式。当然Disqus在大家心目中可能更加具有影响力,而多说“接地气的本地化评论托管服务”则让人眼前一亮。<br> 在WordPress和GitHub+Hexo搭建的静态Blog我们常常使用多说、畅言等评论系统,但是官方的配色和布局往往和我们的网站不太融合,所以我们要对其进行适当的美化。<br><a id="more"></a><br> 接下来我们就要谈论我们的多说评论框<strong>上篇</strong>之自定义CSS头像,话不多说,切入正题~</p><h2 id="多说自定义CSS"><a href="#多说自定义CSS" class="headerlink" title="多说自定义CSS"></a>多说自定义CSS</h2><p>以下是整理出来的十种头像特效,各种效果都以GIF动态图呈现,可以很直观的看到效果。毕竟是图片,实际效果当然会更好的多。代码在最下面</p><p>效果一</p><h2 id><a href="#" class="headerlink" title></a><img src="/assets/blogImg/duoshuoone/duoshuoone-1.gif"></h2><p>效果二</p><h2 id="-1"><a href="#-1" class="headerlink" title></a><img src="/assets/blogImg/duoshuoone/duoshuoone-2.gif"></h2><p>效果三</p><h2 id="-2"><a href="#-2" class="headerlink" title></a><img src="/assets/blogImg/duoshuoone/duoshuoone-3.gif"></h2><p>效果四</p><h2 id="-3"><a href="#-3" class="headerlink" title></a><img src="/assets/blogImg/duoshuoone/duoshuoone-4.gif"></h2><p>效果五</p><h2 id="-4"><a href="#-4" class="headerlink" title></a><img src="/assets/blogImg/duoshuoone/duoshuoone-5.gif"></h2><p>效果六</p><h2 id="-5"><a href="#-5" class="headerlink" title></a><img src="/assets/blogImg/duoshuoone/duoshuoone-6.gif"></h2><p>效果七</p><h2 id="-6"><a href="#-6" class="headerlink" title></a><img src="/assets/blogImg/duoshuoone/duoshuoone-7.gif"></h2><p>效果八</p><h2 id="-7"><a href="#-7" class="headerlink" title></a><img src="/assets/blogImg/duoshuoone/duoshuoone-8.gif"></h2><p>效果九</p><h2 id="-8"><a href="#-8" class="headerlink" title></a><img src="/assets/blogImg/duoshuoone/duoshuoone-9.gif"></h2><p>效果十</p><h2 id="-9"><a href="#-9" class="headerlink" title></a><img src="/assets/blogImg/duoshuoone/duoshuoone-10.gif"></h2><p>效果十一<br><img src="/assets/blogImg/duoshuoone/duoshuoone-11.gif"></p><h2 id="附录:CSS代码"><a href="#附录:CSS代码" class="headerlink" title="附录:CSS代码"></a>附录:CSS代码</h2><hr><p>代码在下面(请用非IE浏览器看),设置步骤超级简单,登录多说后台->设置->基本设置->自定义CSS,将代码粘贴自定义CSS 里,刷新即可看到效果。<br><em>ps:代码都是共通的,不局限于多说,应用在别的效果上也是可以的。</em></p><h5 id="头像效果一"><a href="#头像效果一" class="headerlink" title="头像效果一"></a>头像效果一</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span>,<span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-moz-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-ms-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-o-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">1s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">1s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">1s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">1s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">1s</span>; </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> rotateInDownLeft { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-webkit-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(-<span class="number">90deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-webkit-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> rotateInDownLeft { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-moz-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(-<span class="number">90deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-moz-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-o-keyframes</span> rotateInDownLeft { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-o-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(-<span class="number">90deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-o-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@keyframes</span> rotateInDownLeft { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">90deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: rotateInDownLeft; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: rotateInDownLeft; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: rotateInDownLeft; </span><br><span class="line"> <span class="attribute">animation-name</span>: rotateInDownLeft; </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: rotateOutDownLeft; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: rotateOutDownLeft; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: rotateOutDownLeft; </span><br><span class="line"> <span class="attribute">animation-name</span>: rotateOutDownLeft; </span><br><span class="line">} </span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> rotateOutDownLeft { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-webkit-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-webkit-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(<span class="number">90deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> rotateOutDownLeft { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-moz-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-moz-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(<span class="number">90deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-o-keyframes</span> rotateOutDownLeft { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-o-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-o-transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(<span class="number">90deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@keyframes</span> rotateOutDownLeft { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">transform-origin</span>: left bottom; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">90deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="头像效果二"><a href="#头像效果二" class="headerlink" title="头像效果二"></a>头像效果二</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span>,<span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-moz-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-ms-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-o-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> bounceIn { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">scale</span>(.<span class="number">3</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 50% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">scale</span>(<span class="number">1.05</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 70% { </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">scale</span>(.<span class="number">9</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> bounceIn { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">scale</span>(.<span class="number">3</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 50% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">scale</span>(<span class="number">1.05</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 70% { </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">scale</span>(.<span class="number">9</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-o-keyframes</span> bounceIn { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">scale</span>(.<span class="number">3</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 50% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">scale</span>(<span class="number">1.05</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 70% { </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">scale</span>(.<span class="number">9</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@keyframes</span> bounceIn { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">scale</span>(.<span class="number">3</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 50% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.05</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 70% { </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">scale</span>(.<span class="number">9</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> { </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: bounceIn; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: bounceIn; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: bounceIn; </span><br><span class="line"> <span class="attribute">animation-name</span>: bounceIn; </span><br><span class="line">} </span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> bounceOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 25% { </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">scale</span>(.<span class="number">95</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 50% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">scale</span>(.<span class="number">3</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> bounceOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 25% { </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">scale</span>(.<span class="number">95</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 50% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">scale</span>(.<span class="number">3</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-o-keyframes</span> bounceOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 25% { </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">scale</span>(.<span class="number">95</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 50% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">scale</span>(.<span class="number">3</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@keyframes</span> bounceOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 25% { </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">scale</span>(.<span class="number">95</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 50% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">scale</span>(.<span class="number">3</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: bounceOut; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: bounceOut; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: bounceOut; </span><br><span class="line"> <span class="attribute">animation-name</span>: bounceOut; </span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="头像效果三"><a href="#头像效果三" class="headerlink" title="头像效果三"></a>头像效果三</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span>,<span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-moz-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-ms-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-o-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> rotateIn { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-webkit-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(-<span class="number">150deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-webkit-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> rotateIn { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-moz-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(-<span class="number">150deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-moz-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"><span class="keyword">@-o-keyframes</span> rotateIn { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-o-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(-<span class="number">150deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-o-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"><span class="keyword">@keyframes</span> rotateIn { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">150deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: rotateIn; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: rotateIn; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: rotateIn; </span><br><span class="line"> <span class="attribute">animation-name</span>: rotateIn; </span><br><span class="line">} </span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> rotateOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-webkit-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-webkit-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(<span class="number">150deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> rotateOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-moz-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-moz-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(<span class="number">150deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-o-keyframes</span> rotateOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">-o-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">-o-transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(<span class="number">150deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@keyframes</span> rotateOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">transform-origin</span>: center center; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">150deg</span>); </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: rotateOut; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: rotateOut; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: rotateOut; </span><br><span class="line"> <span class="attribute">animation-name</span>: rotateOut; </span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="头像效果四"><a href="#头像效果四" class="headerlink" title="头像效果四"></a>头像效果四</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span>,<span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-moz-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-ms-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-o-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> rollIn { </span><br><span class="line"> 0% { <span class="attribute">opacity</span>: <span class="number">0</span>; <span class="attribute">-webkit-transform</span>: <span class="built_in">translateX</span>(-<span class="number">100%</span>) <span class="built_in">rotate</span>(-<span class="number">120deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">opacity</span>: <span class="number">1</span>; <span class="attribute">-webkit-transform</span>: <span class="built_in">translateX</span>(<span class="number">0px</span>) <span class="built_in">rotate</span>(<span class="number">0deg</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> rollIn { </span><br><span class="line"> 0% { <span class="attribute">opacity</span>: <span class="number">0</span>; <span class="attribute">-moz-transform</span>: <span class="built_in">translateX</span>(-<span class="number">100%</span>) <span class="built_in">rotate</span>(-<span class="number">120deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">opacity</span>: <span class="number">1</span>; <span class="attribute">-moz-transform</span>: <span class="built_in">translateX</span>(<span class="number">0px</span>) <span class="built_in">rotate</span>(<span class="number">0deg</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-o-keyframes</span> rollIn { </span><br><span class="line"> 0% { <span class="attribute">opacity</span>: <span class="number">0</span>; <span class="attribute">-o-transform</span>: <span class="built_in">translateX</span>(-<span class="number">100%</span>) <span class="built_in">rotate</span>(-<span class="number">120deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">opacity</span>: <span class="number">1</span>; <span class="attribute">-o-transform</span>: <span class="built_in">translateX</span>(<span class="number">0px</span>) <span class="built_in">rotate</span>(<span class="number">0deg</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@keyframes</span> rollIn { </span><br><span class="line"> 0% { <span class="attribute">opacity</span>: <span class="number">0</span>; <span class="attribute">transform</span>: <span class="built_in">translateX</span>(-<span class="number">100%</span>) <span class="built_in">rotate</span>(-<span class="number">120deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">opacity</span>: <span class="number">1</span>; <span class="attribute">transform</span>: <span class="built_in">translateX</span>(<span class="number">0px</span>) <span class="built_in">rotate</span>(<span class="number">0deg</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: rollIn; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: rollIn; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: rollIn; </span><br><span class="line"> <span class="attribute">animation-name</span>: rollIn; </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> rollOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">translateX</span>(<span class="number">0px</span>) <span class="built_in">rotate</span>(<span class="number">0deg</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">translateX</span>(<span class="number">100%</span>) <span class="built_in">rotate</span>(<span class="number">120deg</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> rollOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">translateX</span>(<span class="number">0px</span>) <span class="built_in">rotate</span>(<span class="number">0deg</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">translateX</span>(<span class="number">100%</span>) <span class="built_in">rotate</span>(<span class="number">120deg</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-o-keyframes</span> rollOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">translateX</span>(<span class="number">0px</span>) <span class="built_in">rotate</span>(<span class="number">0deg</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">-o-transform</span>: <span class="built_in">translateX</span>(<span class="number">100%</span>) <span class="built_in">rotate</span>(<span class="number">120deg</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@keyframes</span> rollOut { </span><br><span class="line"> 0% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">1</span>; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">translateX</span>(<span class="number">0px</span>) <span class="built_in">rotate</span>(<span class="number">0deg</span>); </span><br><span class="line"> } </span><br><span class="line"> </span><br><span class="line"> 100% { </span><br><span class="line"> <span class="attribute">opacity</span>: <span class="number">0</span>; </span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">translateX</span>(<span class="number">100%</span>) <span class="built_in">rotate</span>(<span class="number">120deg</span>); </span><br><span class="line"> } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: rollOut; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: rollOut; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: rollOut; </span><br><span class="line"> <span class="attribute">animation-name</span>: rollOut; </span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="头像效果五"><a href="#头像效果五" class="headerlink" title="头像效果五"></a>头像效果五</h5><figure class="highlight css"><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></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span>,<span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-moz-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-ms-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-o-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> swing { </span><br><span class="line"> 20%, 40%, 60%, 80%, 100% { <span class="attribute">-webkit-transform-origin</span>: top center; } </span><br><span class="line"> 20% { <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(<span class="number">15deg</span>); } </span><br><span class="line"> 40% { <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(-<span class="number">10deg</span>); } </span><br><span class="line"> 60% { <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(<span class="number">5deg</span>); } </span><br><span class="line"> 80% { <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(-<span class="number">5deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">-webkit-transform</span>: <span class="built_in">rotate</span>(<span class="number">0deg</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> swing { </span><br><span class="line"> 20% { <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(<span class="number">15deg</span>); } </span><br><span class="line"> 40% { <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(-<span class="number">10deg</span>); } </span><br><span class="line"> 60% { <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(<span class="number">5deg</span>); } </span><br><span class="line"> 80% { <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(-<span class="number">5deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">-moz-transform</span>: <span class="built_in">rotate</span>(<span class="number">0deg</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-o-keyframes</span> swing { </span><br><span class="line"> 20% { <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(<span class="number">15deg</span>); } </span><br><span class="line"> 40% { <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(-<span class="number">10deg</span>); } </span><br><span class="line"> 60% { <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(<span class="number">5deg</span>); } </span><br><span class="line"> 80% { <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(-<span class="number">5deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">-o-transform</span>: <span class="built_in">rotate</span>(<span class="number">0deg</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@keyframes</span> swing { </span><br><span class="line"> 20% { <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">15deg</span>); } </span><br><span class="line"> 40% { <span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">10deg</span>); } </span><br><span class="line"> 60% { <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">5deg</span>); } </span><br><span class="line"> 80% { <span class="attribute">transform</span>: <span class="built_in">rotate</span>(-<span class="number">5deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">transform</span>: <span class="built_in">rotate</span>(<span class="number">0deg</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-transform-origin</span>: top center; </span><br><span class="line"> <span class="attribute">-moz-transform-origin</span>: top center; </span><br><span class="line"> <span class="attribute">-o-transform-origin</span>: top center; </span><br><span class="line"> <span class="attribute">transform-origin</span>: top center; </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: swing; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: swing; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: swing; </span><br><span class="line"> <span class="attribute">animation-name</span>: swing; </span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="头像效果六"><a href="#头像效果六" class="headerlink" title="头像效果六"></a>头像效果六</h5><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span>,<span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-moz-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-ms-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-o-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> pulse { </span><br><span class="line"> 0% { <span class="attribute">-webkit-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); } </span><br><span class="line"> 50% { <span class="attribute">-webkit-transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>); } </span><br><span class="line"> 100% { <span class="attribute">-webkit-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); } </span><br><span class="line">} </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> pulse { </span><br><span class="line"> 0% { <span class="attribute">-moz-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); } </span><br><span class="line"> 50% { <span class="attribute">-moz-transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>); } </span><br><span class="line"> 100% { <span class="attribute">-moz-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); } </span><br><span class="line">} </span><br><span class="line"><span class="keyword">@-o-keyframes</span> pulse { </span><br><span class="line"> 0% { <span class="attribute">-o-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); } </span><br><span class="line"> 50% { <span class="attribute">-o-transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>); } </span><br><span class="line"> 100% { <span class="attribute">-o-transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); } </span><br><span class="line">} </span><br><span class="line"><span class="keyword">@keyframes</span> pulse { </span><br><span class="line"> 0% { <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); } </span><br><span class="line"> 50% { <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1.1</span>); } </span><br><span class="line"> 100% { <span class="attribute">transform</span>: <span class="built_in">scale</span>(<span class="number">1</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span> { </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: pulse; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: pulse; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: pulse; </span><br><span class="line"> <span class="attribute">animation-name</span>: pulse; </span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="头像效果七"><a href="#头像效果七" class="headerlink" title="头像效果七"></a>头像效果七</h5><figure class="highlight css"><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></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span>,<span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-moz-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-ms-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-o-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0.7s</span>; </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-webkit-keyframes</span> wobble { </span><br><span class="line"> 0% { <span class="attribute">-webkit-transform</span>: <span class="built_in">translateX</span>(<span class="number">0%</span>); } </span><br><span class="line"> 15% { <span class="attribute">-webkit-transform</span>: <span class="built_in">translateX</span>(-<span class="number">25%</span>) <span class="built_in">rotate</span>(-<span class="number">5deg</span>); } </span><br><span class="line"> 30% { <span class="attribute">-webkit-transform</span>: <span class="built_in">translateX</span>(<span class="number">20%</span>) <span class="built_in">rotate</span>(<span class="number">3deg</span>); } </span><br><span class="line"> 45% { <span class="attribute">-webkit-transform</span>: <span class="built_in">translateX</span>(-<span class="number">15%</span>) <span class="built_in">rotate</span>(-<span class="number">3deg</span>); } </span><br><span class="line"> 60% { <span class="attribute">-webkit-transform</span>: <span class="built_in">translateX</span>(<span class="number">10%</span>) <span class="built_in">rotate</span>(<span class="number">2deg</span>); } </span><br><span class="line"> 75% { <span class="attribute">-webkit-transform</span>: <span class="built_in">translateX</span>(-<span class="number">5%</span>) <span class="built_in">rotate</span>(-<span class="number">1deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">-webkit-transform</span>: <span class="built_in">translateX</span>(<span class="number">0%</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> wobble { </span><br><span class="line"> 0% { <span class="attribute">-moz-transform</span>: <span class="built_in">translateX</span>(<span class="number">0%</span>); } </span><br><span class="line"> 15% { <span class="attribute">-moz-transform</span>: <span class="built_in">translateX</span>(-<span class="number">25%</span>) <span class="built_in">rotate</span>(-<span class="number">5deg</span>); } </span><br><span class="line"> 30% { <span class="attribute">-moz-transform</span>: <span class="built_in">translateX</span>(<span class="number">20%</span>) <span class="built_in">rotate</span>(<span class="number">3deg</span>); } </span><br><span class="line"> 45% { <span class="attribute">-moz-transform</span>: <span class="built_in">translateX</span>(-<span class="number">15%</span>) <span class="built_in">rotate</span>(-<span class="number">3deg</span>); } </span><br><span class="line"> 60% { <span class="attribute">-moz-transform</span>: <span class="built_in">translateX</span>(<span class="number">10%</span>) <span class="built_in">rotate</span>(<span class="number">2deg</span>); } </span><br><span class="line"> 75% { <span class="attribute">-moz-transform</span>: <span class="built_in">translateX</span>(-<span class="number">5%</span>) <span class="built_in">rotate</span>(-<span class="number">1deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">-moz-transform</span>: <span class="built_in">translateX</span>(<span class="number">0%</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-o-keyframes</span> wobble { </span><br><span class="line"> 0% { <span class="attribute">-o-transform</span>: <span class="built_in">translateX</span>(<span class="number">0%</span>); } </span><br><span class="line"> 15% { <span class="attribute">-o-transform</span>: <span class="built_in">translateX</span>(-<span class="number">25%</span>) <span class="built_in">rotate</span>(-<span class="number">5deg</span>); } </span><br><span class="line"> 30% { <span class="attribute">-o-transform</span>: <span class="built_in">translateX</span>(<span class="number">20%</span>) <span class="built_in">rotate</span>(<span class="number">3deg</span>); } </span><br><span class="line"> 45% { <span class="attribute">-o-transform</span>: <span class="built_in">translateX</span>(-<span class="number">15%</span>) <span class="built_in">rotate</span>(-<span class="number">3deg</span>); } </span><br><span class="line"> 60% { <span class="attribute">-o-transform</span>: <span class="built_in">translateX</span>(<span class="number">10%</span>) <span class="built_in">rotate</span>(<span class="number">2deg</span>); } </span><br><span class="line"> 75% { <span class="attribute">-o-transform</span>: <span class="built_in">translateX</span>(-<span class="number">5%</span>) <span class="built_in">rotate</span>(-<span class="number">1deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">-o-transform</span>: <span class="built_in">translateX</span>(<span class="number">0%</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@keyframes</span> wobble { </span><br><span class="line"> 0% { <span class="attribute">transform</span>: <span class="built_in">translateX</span>(<span class="number">0%</span>); } </span><br><span class="line"> 15% { <span class="attribute">transform</span>: <span class="built_in">translateX</span>(-<span class="number">25%</span>) <span class="built_in">rotate</span>(-<span class="number">5deg</span>); } </span><br><span class="line"> 30% { <span class="attribute">transform</span>: <span class="built_in">translateX</span>(<span class="number">20%</span>) <span class="built_in">rotate</span>(<span class="number">3deg</span>); } </span><br><span class="line"> 45% { <span class="attribute">transform</span>: <span class="built_in">translateX</span>(-<span class="number">15%</span>) <span class="built_in">rotate</span>(-<span class="number">3deg</span>); } </span><br><span class="line"> 60% { <span class="attribute">transform</span>: <span class="built_in">translateX</span>(<span class="number">10%</span>) <span class="built_in">rotate</span>(<span class="number">2deg</span>); } </span><br><span class="line"> 75% { <span class="attribute">transform</span>: <span class="built_in">translateX</span>(-<span class="number">5%</span>) <span class="built_in">rotate</span>(-<span class="number">1deg</span>); } </span><br><span class="line"> 100% { <span class="attribute">transform</span>: <span class="built_in">translateX</span>(<span class="number">0%</span>); } </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{ </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: wobble; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: wobble; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: wobble; </span><br><span class="line"> <span class="attribute">animation-name</span>: wobble; </span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="头像效果八"><a href="#头像效果八" class="headerlink" title="头像效果八"></a>头像效果八</h5><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span>{ </span><br><span class="line"> <span class="attribute">width</span>:<span class="number">54px</span>;<span class="attribute">height</span>:<span class="number">54px</span>; <span class="comment">/*设置图像的长和宽,这里要根据自己的评论框情况更改*/</span> </span><br><span class="line"> <span class="attribute">border-radius</span>: <span class="number">27px</span>;<span class="comment">/*设置图像圆角效果,在这里我直接设置了超过width/2的像素,即为圆形了*/</span> </span><br><span class="line"> -webkit-<span class="attribute">border-radius</span>: <span class="number">27px</span>;<span class="comment">/*圆角效果:兼容webkit浏览器*/</span> </span><br><span class="line"> -moz-<span class="attribute">border-radius</span>:<span class="number">27px</span>; </span><br><span class="line"> <span class="attribute">box-shadow</span>: inset <span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#3333</span>sf;<span class="comment">/*设置图像阴影效果*/</span> </span><br><span class="line"> -webkit-<span class="attribute">box-shadow</span>: inset <span class="number">0</span> -<span class="number">1px</span> <span class="number">0</span> <span class="number">#3333</span>sf; </span><br><span class="line"> -webkit-<span class="attribute">transition</span>: <span class="number">0.4s</span>; </span><br><span class="line"> -webkit-<span class="attribute">transition</span>: -webkit-transform <span class="number">0.4s</span> ease-out; </span><br><span class="line"> <span class="attribute">transition</span>: transform <span class="number">0.4s</span> ease-out;<span class="comment">/*变化时间设置为0.4秒(变化动作即为下面的图像旋转360读)*/</span> </span><br><span class="line"> -moz-<span class="attribute">transition</span>: -moz-transform <span class="number">0.4s</span> ease-out; </span><br><span class="line">} </span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span>{<span class="comment">/*设置鼠标悬浮在头像时的CSS样式*/</span> </span><br><span class="line"> <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">10px</span> <span class="number">#fff</span>; rgba(255,255,255,<span class="selector-class">.6</span>), inset 0 0 20px rgba(255,255,255,1); </span><br><span class="line"> -webkit-<span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">10px</span> <span class="number">#fff</span>; rgba(255,255,255,<span class="selector-class">.6</span>), inset 0 0 20px rgba(255,255,255,1); </span><br><span class="line"> <span class="attribute">transform</span>: rotateZ(<span class="number">360deg</span>);<span class="comment">/*图像旋转360度*/</span> </span><br><span class="line"> -webkit-<span class="attribute">transform</span>: rotateZ(<span class="number">360deg</span>); </span><br><span class="line"> -moz-<span class="attribute">transform</span>: rotateZ(<span class="number">360deg</span>); </span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="头像效果九"><a href="#头像效果九" class="headerlink" title="头像效果九"></a>头像效果九</h5><figure class="highlight css"><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></pre></td><td class="code"><pre><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span> { </span><br><span class="line"> <span class="attribute">-webkit-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-moz-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-ms-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-o-animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">animation-fill-mode</span>: both; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">0s</span>; </span><br><span class="line"> <span class="attribute">-webkit-animation-duration</span>: <span class="number">1s</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-duration</span>: <span class="number">1s</span>; </span><br><span class="line"> <span class="attribute">-ms-animation-duration</span>: <span class="number">1s</span>; </span><br><span class="line"> <span class="attribute">-o-animation-duration</span>: <span class="number">1s</span>; </span><br><span class="line"> <span class="attribute">animation-duration</span>: <span class="number">1s</span>; </span><br><span class="line"> <span class="attribute">-webkit-transform-style</span>: preserve-<span class="number">3</span>d; </span><br><span class="line"> <span class="attribute">-moz-transform-style</span>: preserve-<span class="number">3</span>d; </span><br><span class="line"> <span class="attribute">-o-transform-style</span>: preserve-<span class="number">3</span>d; </span><br><span class="line"> <span class="attribute">transform-style</span>: preserve-<span class="number">3</span>d; </span><br><span class="line"> <span class="attribute">-webkit-backface-visibility</span>: visible <span class="meta">!important</span>; </span><br><span class="line"> <span class="attribute">-webkit-animation-name</span>: flip; </span><br><span class="line"> <span class="attribute">-moz-backface-visibility</span>: visible <span class="meta">!important</span>; </span><br><span class="line"> <span class="attribute">-moz-animation-name</span>: flip; </span><br><span class="line"> <span class="attribute">-o-backface-visibility</span>: visible <span class="meta">!important</span>; </span><br><span class="line"> <span class="attribute">-o-animation-name</span>: flip; </span><br><span class="line"> <span class="attribute">backface-visibility</span>: visible <span class="meta">!important</span>; </span><br><span class="line"> <span class="attribute">animation-name</span>: flip; </span><br><span class="line">} </span><br><span class="line"> <span class="keyword">@-webkit-keyframes</span> flip { </span><br><span class="line"> 0% {<span class="attribute">-webkit-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">rotateY</span>(<span class="number">0</span>);<span class="attribute">-webkit-animation-timing-function</span>: ease-out;} </span><br><span class="line"> 40% {<span class="attribute">-webkit-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">translateZ</span>(<span class="number">150px</span>) <span class="built_in">rotateY</span>(<span class="number">170deg</span>);<span class="attribute">-webkit-animation-timing-function</span>: ease-out;} </span><br><span class="line"> 50% {<span class="attribute">-webkit-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">translateZ</span>(<span class="number">150px</span>) <span class="built_in">rotateY</span>(<span class="number">190deg</span>) <span class="built_in">scale</span>(<span class="number">1</span>);<span class="attribute">-webkit-animation-timing-function</span>: ease-in;} </span><br><span class="line"> 80% {<span class="attribute">-webkit-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">rotateY</span>(<span class="number">360deg</span>) <span class="built_in">scale</span>(.<span class="number">95</span>);<span class="attribute">-webkit-animation-timing-function</span>: ease-in;} </span><br><span class="line"> 100% {<span class="attribute">-webkit-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">scale</span>(<span class="number">1</span>);<span class="attribute">-webkit-animation-timing-function</span>: ease-in;} </span><br><span class="line">} </span><br><span class="line"> </span><br><span class="line"><span class="keyword">@-moz-keyframes</span> flip { </span><br><span class="line">0% {<span class="attribute">-moz-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">rotateY</span>(<span class="number">0</span>);<span class="attribute">-moz-animation-timing-function</span>: ease-out;} </span><br><span class="line"> 40% {<span class="attribute">-moz-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">translateZ</span>(<span class="number">150px</span>) <span class="built_in">rotateY</span>(<span class="number">170deg</span>);<span class="attribute">-moz-animation-timing-function</span>: ease-out;} </span><br><span class="line"> 50% {<span class="attribute">-moz-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">translateZ</span>(<span class="number">150px</span>) <span class="built_in">rotateY</span>(<span class="number">190deg</span>) <span class="built_in">scale</span>(<span class="number">1</span>);<span class="attribute">-moz-animation-timing-function</span>: ease-in;} </span><br><span class="line"> 80% {<span class="attribute">-moz-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">rotateY</span>(<span class="number">360deg</span>) <span class="built_in">scale</span>(.<span class="number">95</span>);<span class="attribute">-moz-animation-timing-function</span>: ease-in;} </span><br><span class="line"> 100% {<span class="attribute">-moz-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">scale</span>(<span class="number">1</span>);<span class="attribute">-moz-animation-timing-function</span>: ease-in;} </span><br><span class="line">} </span><br><span class="line"><span class="keyword">@-o-keyframes</span> flip { </span><br><span class="line">0% {<span class="attribute">-o-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">rotateY</span>(<span class="number">0</span>);<span class="attribute">-o-animation-timing-function</span>: ease-out;} </span><br><span class="line"> 40% {<span class="attribute">-o-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">translateZ</span>(<span class="number">150px</span>) <span class="built_in">rotateY</span>(<span class="number">170deg</span>);<span class="attribute">-o-animation-timing-function</span>: ease-out;} </span><br><span class="line"> 50% {<span class="attribute">-o-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">translateZ</span>(<span class="number">150px</span>) <span class="built_in">rotateY</span>(<span class="number">190deg</span>) <span class="built_in">scale</span>(<span class="number">1</span>);<span class="attribute">-o-animation-timing-function</span>: ease-in;} </span><br><span class="line"> 80% {<span class="attribute">-o-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">rotateY</span>(<span class="number">360deg</span>) <span class="built_in">scale</span>(.<span class="number">95</span>); <span class="attribute">-o-animation-timing-function</span>: ease-in;} </span><br><span class="line"> 100% {<span class="attribute">-o-transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">scale</span>(<span class="number">1</span>);<span class="attribute">-o-animation-timing-function</span>: ease-in;} </span><br><span class="line">} </span><br><span class="line"><span class="keyword">@keyframes</span> flip { </span><br><span class="line">0% {<span class="attribute">transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">rotateY</span>(<span class="number">0</span>);<span class="attribute">animation-timing-function</span>: ease-out;} </span><br><span class="line"> 40% {<span class="attribute">transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">translateZ</span>(<span class="number">150px</span>) <span class="built_in">rotateY</span>(<span class="number">170deg</span>);<span class="attribute">animation-timing-function</span>: ease-out;} </span><br><span class="line"> 50% {<span class="attribute">transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">translateZ</span>(<span class="number">150px</span>) <span class="built_in">rotateY</span>(<span class="number">190deg</span>) <span class="built_in">scale</span>(<span class="number">1</span>);<span class="attribute">animation-timing-function</span>: ease-in;} </span><br><span class="line"> 80% {<span class="attribute">transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">rotateY</span>(<span class="number">360deg</span>) <span class="built_in">scale</span>(.<span class="number">95</span>);<span class="attribute">animation-timing-function</span>: ease-in;} </span><br><span class="line"> 100% {<span class="attribute">transform</span>: <span class="built_in">perspective</span>(<span class="number">400px</span>) <span class="built_in">scale</span>(<span class="number">1</span>);<span class="attribute">animation-timing-function</span>: ease-in;} </span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="头像效果十"><a href="#头像效果十" class="headerlink" title="头像效果十"></a>头像效果十</h5><figure class="highlight scss"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">/*Head Start*/</span></span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">ul</span><span class="selector-class">.ds-comments-tabs</span> <span class="selector-tag">li</span><span class="selector-class">.ds-tab</span> <span class="selector-tag">a</span><span class="selector-class">.ds-current</span> {</span><br><span class="line"><span class="attribute">border</span>: <span class="number">0px</span>;</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#6D6D6B</span>;</span><br><span class="line"><span class="attribute">text-shadow</span>: none;</span><br><span class="line"><span class="attribute">background</span>: <span class="number">#F3F3F3</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-highlight</span> {</span><br><span class="line"><span class="attribute">font-family</span>: Microsoft YaHei, <span class="string">"Helvetica Neue"</span>, Helvetica, Arial, Sans-serif;</span><br><span class="line">;<span class="attribute">font-size</span>: <span class="number">100%</span>;</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#6D6D6B</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">ul</span><span class="selector-class">.ds-comments-tabs</span> <span class="selector-tag">li</span><span class="selector-class">.ds-tab</span> <span class="selector-tag">a</span><span class="selector-class">.ds-current</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#696a52</span>;</span><br><span class="line"><span class="attribute">background</span>: <span class="number">#F2F2F2</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">a</span><span class="selector-class">.ds-highlight</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#696a52</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> {</span><br><span class="line"><span class="attribute">padding-left</span>: <span class="number">15px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">li</span><span class="selector-class">.ds-post</span>,<span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-id">#ds-hot-posts</span> {</span><br><span class="line"><span class="attribute">overflow</span>: visible;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-post-self</span> {</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">10px</span> <span class="number">0</span> <span class="number">10px</span> <span class="number">10px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">li</span><span class="selector-class">.ds-post</span>,<span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-post-self</span> {</span><br><span class="line"><span class="attribute">border</span>: <span class="number">0</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span>, <span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">ul</span><span class="selector-class">.ds-children</span> <span class="selector-class">.ds-avatar</span> {</span><br><span class="line"><span class="attribute">top</span>: <span class="number">15px</span>;</span><br><span class="line"><span class="attribute">left</span>: -<span class="number">20px</span>;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">5px</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">36px</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">36px</span>;</span><br><span class="line"><span class="attribute">box-shadow</span>: -<span class="number">1px</span> <span class="number">0</span> <span class="number">1px</span> rgba(<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>,.<span class="number">15</span>) inset;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">46px</span>;</span><br><span class="line"><span class="attribute">background</span>: <span class="number">#FAFAFA</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">a</span> {</span><br><span class="line"><span class="attribute">display</span>: inline-block;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">1px</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">32px</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">32px</span>;</span><br><span class="line"><span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#b9baa6</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#fff</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">a</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-class">.ds-avatar</span> > <span class="selector-tag">img</span> {</span><br><span class="line"><span class="attribute">margin</span>: <span class="number">2px</span> <span class="number">0</span> <span class="number">0</span> <span class="number">2px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-replybox</span> {</span><br><span class="line"><span class="attribute">box-shadow</span>: none;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">ul</span><span class="selector-class">.ds-children</span> <span class="selector-class">.ds-replybox</span><span class="selector-class">.ds-inline-replybox</span> <span class="selector-tag">a</span><span class="selector-class">.ds-avatar</span>,</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-replybox</span><span class="selector-class">.ds-inline-replybox</span> <span class="selector-tag">a</span><span class="selector-class">.ds-avatar</span> {</span><br><span class="line"><span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">top</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">background</span>: none;</span><br><span class="line"><span class="attribute">box-shadow</span>: none;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-replybox</span><span class="selector-class">.ds-inline-replybox</span> <span class="selector-tag">a</span><span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> {</span><br><span class="line"><span class="attribute">width</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">50%</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-replybox</span> <span class="selector-tag">a</span><span class="selector-class">.ds-avatar</span>,</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-replybox</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> {</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">5px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> {</span><br><span class="line"><span class="attribute">width</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">32px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">32px</span>;</span><br><span class="line"><span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">1px</span> <span class="number">3px</span> rgba(<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0.22</span>);</span><br><span class="line">-webkit-<span class="attribute">transition</span>: .<span class="number">8s</span> all ease-in-out;</span><br><span class="line">-moz-<span class="attribute">transition</span>: .<span class="number">4s</span> all ease-in-out;</span><br><span class="line">-o-<span class="attribute">transition</span>: .<span class="number">4s</span> all ease-in-out;</span><br><span class="line">-ms-<span class="attribute">transition</span>: .<span class="number">4s</span> all ease-in-out;</span><br><span class="line"><span class="attribute">transition</span>: .<span class="number">4s</span> all ease-in-out;</span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.ds-post-self</span><span class="selector-pseudo">:hover</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> {</span><br><span class="line">-webkit-<span class="attribute">transform</span>: rotateX(<span class="number">360deg</span>);</span><br><span class="line">-moz-<span class="attribute">transform</span>: rotate(<span class="number">360deg</span>);</span><br><span class="line">-o-<span class="attribute">transform</span>: rotate(<span class="number">360deg</span>);</span><br><span class="line">-ms-<span class="attribute">transform</span>: rotate(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">transform</span>: rotate(<span class="number">360deg</span>);</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comment-body</span> {</span><br><span class="line">-webkit-<span class="attribute">transition-delay</span>: initial;</span><br><span class="line">-webkit-<span class="attribute">transition-duration</span>: <span class="number">0.4s</span>;</span><br><span class="line">-webkit-<span class="attribute">transition-property</span>: all;</span><br><span class="line">-webkit-<span class="attribute">transition-timing-function</span>: initial;</span><br><span class="line"><span class="attribute">background</span>: <span class="number">#F7F7F7</span>;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">15px</span> <span class="number">15px</span> <span class="number">15px</span> <span class="number">47px</span>;</span><br><span class="line"><span class="attribute">border-radius</span>: <span class="number">5px</span>;</span><br><span class="line"><span class="attribute">box-shadow</span>: <span class="number">#B8B9B9</span> <span class="number">0</span> <span class="number">1px</span> <span class="number">3px</span>;</span><br><span class="line"><span class="attribute">border</span>: white <span class="number">1px</span> solid;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">ul</span><span class="selector-class">.ds-children</span> <span class="selector-class">.ds-comment-body</span> {</span><br><span class="line"><span class="attribute">padding-left</span>: <span class="number">15px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comment-body</span> <span class="selector-tag">p</span> {</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#787968</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comments</span> {</span><br><span class="line"><span class="attribute">border-bottom</span>: <span class="number">0px</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-powered-by</span> {</span><br><span class="line"><span class="attribute">display</span>: none;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comments</span> <span class="selector-tag">a</span><span class="selector-class">.ds-user-name</span> {</span><br><span class="line"><span class="attribute">font-weight</span>: normal;</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#3D3D3D</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comments</span> <span class="selector-tag">a</span><span class="selector-class">.ds-user-name</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"><span class="attribute">color</span>: <span class="number">#D32</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-id">#ds-bubble</span> {</span><br><span class="line"><span class="attribute">display</span>: none <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-id">#ds-hot-posts</span> {</span><br><span class="line"><span class="attribute">border</span>: <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-id">#ds-hot-posts</span> <span class="selector-class">.ds-gradient-bg</span> {</span><br><span class="line"><span class="attribute">background</span>: none;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-comment-body</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"><span class="attribute">background-color</span>: <span class="number">#F1F1F1</span>;</span><br><span class="line">-webkit-<span class="attribute">transition-delay</span>: initial;</span><br><span class="line">-webkit-<span class="attribute">transition-duration</span>: <span class="number">0.4s</span>;</span><br><span class="line">-webkit-<span class="attribute">transition-property</span>: all;</span><br><span class="line">-webkit-<span class="attribute">transition-timing-function</span>: initial;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/*Head End*/</span></span><br></pre></td></tr></table></figure><h5 id="头像效果十一"><a href="#头像效果十一" class="headerlink" title="头像效果十一"></a>头像效果十一</h5><figure class="highlight css"><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="comment">/*头像样式*/</span></span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> {</span><br><span class="line"><span class="attribute">background</span>:none <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">box-shadow</span>:none <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> , <span class="selector-id">#ds-thread</span> <span class="selector-id">#ds-reset</span> <span class="selector-tag">ul</span><span class="selector-class">.ds-children</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> {</span><br><span class="line"><span class="attribute">width</span>:<span class="number">50px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">50px</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">-webkit-transition</span>: .<span class="number">9s</span>;</span><br><span class="line"><span class="attribute">-moz-transition</span>: .<span class="number">9s</span>;</span><br><span class="line"><span class="attribute">-o-transition</span>: .<span class="number">9s</span>;</span><br><span class="line"><span class="attribute">-ms-transition</span>: .<span class="number">9s</span>;</span><br><span class="line"><span class="attribute">padding</span>: <span class="number">2px</span>;</span><br><span class="line"><span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#ddd</span>;</span><br><span class="line"><span class="attribute">background</span>: <span class="number">#fff</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">/*鼠标悬停旋转头像*/</span></span><br><span class="line"><span class="selector-class">.ds-post</span><span class="selector-pseudo">:hover</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span> {</span><br><span class="line"><span class="attribute">transform</span>:<span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">-webkit-transform</span>:<span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">-moz-transform</span>:<span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">-o-transform</span>:<span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">-ms-transform</span>:<span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">border-radius</span>:<span class="number">30px</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br><span class="line"><span class="selector-id">#ds-reset</span> <span class="selector-class">.ds-avatar</span> <span class="selector-tag">img</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"><span class="attribute">transform</span>:<span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">-webkit-transform</span>:<span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">-moz-transform</span>:<span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">-o-transform</span>:<span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">-ms-transform</span>:<span class="built_in">rotate</span>(<span class="number">360deg</span>);</span><br><span class="line"><span class="attribute">border-radius</span>:<span class="number">30px</span> <span class="meta">!important</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><hr><p>特别感谢:<a href="http://www.vsay.cn" target="_blank" rel="noopener">@V说</a> <a href="http://wsgzao.github.io" target="_blank" rel="noopener">@wsgzao</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/duoshuoone/duoshuoone-0.png" class="img-center-logo"></p>
<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p> 多说是一款社会化评论系统,它改变了网站与用户之间,用户与用户之间的互动方式。当然Disqus在大家心目中可能更加具有影响力,而多说“接地气的本地化评论托管服务”则让人眼前一亮。<br> 在WordPress和GitHub+Hexo搭建的静态Blog我们常常使用多说、畅言等评论系统,但是官方的配色和布局往往和我们的网站不太融合,所以我们要对其进行适当的美化。<br>
</summary>
<category term="Hexo" scheme="http://inplus.top/tags/Hexo/"/>
</entry>
<entry>
<title>记一次安卓Unity3d游戏的逆向分析</title>
<link href="http://inplus.top/archives/crackunity3d/"/>
<id>http://inplus.top/archives/crackunity3d/</id>
<published>2016-09-20T23:27:09.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p>使用到的工具</p><p><a href="http://www.52pojie.cn/thread-429318-1-1.html" target="_blank" rel="noopener">ApkToolBox</a><br>.NET Reflector<br>Reflexil(.NET程序编辑器)</p><p>怎么判定它是Unity游戏呢<br>一般的路径格式是这样的assets\bin\Data\Managed<br>[如果是个Unity游戏却找不到dll文件那么骚年放弃吧。。。]<br><a id="more"></a></p><p><img src="/assets/blogImg/crackunity3d/crackunity3d-1.png"><br>一般情况下都是修改上图的这个dll文件<br>[如果想要搜索的东西不在这个dll文件可借用UltraEdit、EditPlus、Notepad++等常用编辑工具辅助搜索来判断对哪个dll文件进行修改</p><p><strong>以Jam City这款游戏为例来作以下分析:</strong></p><p>内购破解部分就不讲了,因为下面将要修改的比内购的要来的痛快<br>用ApkToolBox反编译之后找到dll文件就是上图的那个文件用.NET Reflector打开<br>[<strong>.NET Reflector工具的基本使用方法请自行百度</strong>]<br>在手机上试玩了下这个游戏 篮板和抢断的路线根本就不明确嘛。。。</p><p>金币-Coin、等级-Level 那么着重修改这两个值吧</p><p>按下F3搜索,切换到方法搜索<br><img src="/assets/blogImg/crackunity3d/crackunity3d-2.png"><br>搜到的内容这么多 改哪个呢 头疼啊!</p><p>等等!unity3d提供的有存档类啊!这是一大重要的切入点O(∩_∩)O~</p><blockquote><p>unity3d提供了一个用于本地持久化保存与读取的类——PlayerPrefs。其工作原理非常简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值。<br>PlayerPrefs类支持3种数据类型的保存和读取,浮点型,整形,和字符串型。</p></blockquote><p>游戏本地存档的主要方式无外乎xml文件和数据库存储两种,我们安装运行该游戏并简单的通过买物品和升级改变金币和等级的数值。</p><p>然后通过R.E.管理器进入/data/data/com.batteryacid.jamcity/shared_prefs/<br>果然我们发现了命名包含playerprefs的xml存档文件<br><img src="/assets/blogImg/crackunity3d/crackunity3d-3.png"></p><p>查看该文件,如下图,我们发现了与游戏中数值对应的两个 字符串-整型 键值对条目:<br>金币Currency和等级CurrentLevel<br><img src="/assets/blogImg/crackunity3d/crackunity3d-4.png"></p><p>我们回到.NET Reflector 切换到类搜索,搜索PlayerPrefs得到下图结果,双击进入位于Assembly-CSharp集中的PlayerPrefsx类<br><img src="/assets/blogImg/crackunity3d/crackunity3d-5.png"></p><p>双击进入GetInt(String,Int32)整型方法,Tools —- reflexil v1.6 开启reflexil工具<br><img src="/assets/blogImg/crackunity3d/crackunity3d-6.png"></p><p>然后在第一行“Create new…”新建字符串类型(OpCade代码为ldstr),最后“Insert before select”插入到第一行前<br><img src="/assets/blogImg/crackunity3d/crackunity3d-7.png"></p><p>在第二行新建整型(OpCade代码为ldc.i4)<br><img src="/assets/blogImg/crackunity3d/crackunity3d-8.png"></p><p>在第三行新建方法(OpCade代码为call),<br>并在PlayerPrefsx类中选择GetInt(System.String,System.Int32)方法<br><img src="/assets/blogImg/crackunity3d/crackunity3d-9.png"></p><p>这样,我们就将Currency强制设置为66666668了<br>回到dll文件名这里,右键鼠标移到Reflexil v1.6保存dll<br><img src="/assets/blogImg/crackunity3d/crackunity3d-10.png"></p><p>保存之后,F5刷新一下,如下图,代码中显示的是强制设置为了66666668<br><img src="/assets/blogImg/crackunity3d/crackunity3d-11.png"></p><p>同理,我们也将等级CurrentLevel也强制设置为20<br><img src="/assets/blogImg/crackunity3d/crackunity3d-12.png"></p><p>保存dll文件用IDE编译出来apk 看看效果</p><p><img src="/assets/blogImg/crackunity3d/crackunity3d-13.png"></p><p><img src="/assets/blogImg/crackunity3d/crackunity3d-14.png"></p><p>好了,初始金币和等级都修改成功</p><p><strong>步骤回顾:<br>1、反编译apk<br>2、利用.NET Reflector反编译dll<br>3、通过Unity3d的PlayerPrefs方法了解其写入读取过程<br>4、通过查找存档xml文件找到相应控制条件<br>5、在dll中找到相应位置修改代码段</strong></p><p><strong>总结:<br>本文主要介绍安卓unity3d游戏的本地数据的修改方法。</strong></p>]]></content>
<summary type="html">
<p>使用到的工具</p>
<p><a href="http://www.52pojie.cn/thread-429318-1-1.html" target="_blank" rel="noopener">ApkToolBox</a><br>.NET Reflector<br>Reflexil(.NET程序编辑器)</p>
<p>怎么判定它是Unity游戏呢<br>一般的路径格式是这样的assets\bin\Data\Managed<br>[如果是个Unity游戏却找不到dll文件那么骚年放弃吧。。。]<br>
</summary>
<category term="Android" scheme="http://inplus.top/tags/Android/"/>
<category term="逆向札记" scheme="http://inplus.top/tags/%E9%80%86%E5%90%91%E6%9C%AD%E8%AE%B0/"/>
</entry>
<entry>
<title>win8.1,win10开机出现致命错误C0000034解决方法</title>
<link href="http://inplus.top/archives/windows-bluescreen/"/>
<id>http://inplus.top/archives/windows-bluescreen/</id>
<published>2016-07-11T10:20:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/windows-bluescreen/windows-bluescreen-0.jpg" class="img-center-logo"><br> 当您的电脑出现<code>致命错误C0000034 正在更新操作54,共5073(000000000000000.cdf-ms)</code>时,一般都是因为您系统在更新或修补漏洞时因为某种原因而中断,再次开机就会出现这类状况。<br><a id="more"></a></p><p> 接下来就提供一种完美解决的方法:</p><h5 id="1-开机按F9-F8进入高级选项(如图所示),点击疑难解答。"><a href="#1-开机按F9-F8进入高级选项(如图所示),点击疑难解答。" class="headerlink" title="1. 开机按F9/F8进入高级选项(如图所示),点击疑难解答。"></a>1. 开机按F9/F8进入高级选项(如图所示),点击疑难解答。</h5><p><img src="/assets/blogImg/windows-bluescreen/windows-bluescreen-1.png"></p><h5 id="2-点击高级选项"><a href="#2-点击高级选项" class="headerlink" title="2. 点击高级选项"></a>2. 点击高级选项</h5><p><img src="/assets/blogImg/windows-bluescreen/windows-bluescreen-2.png"></p><h5 id="3-点击高级选项里的命令提示符"><a href="#3-点击高级选项里的命令提示符" class="headerlink" title="3. 点击高级选项里的命令提示符"></a>3. 点击高级选项里的命令提示符</h5><p><img src="/assets/blogImg/windows-bluescreen/windows-bluescreen-3.png"></p><h5 id="4-在命令提示符中输入:notepad-exe(可以打开记事本)"><a href="#4-在命令提示符中输入:notepad-exe(可以打开记事本)" class="headerlink" title="4. 在命令提示符中输入:notepad.exe(可以打开记事本)"></a>4. 在命令提示符中输入:notepad.exe(可以打开记事本)</h5><p><img src="/assets/blogImg/windows-bluescreen/windows-bluescreen-4.png"></p><h5 id="5-打开记事本后依次点击:文件-gt-gt-打开-gt-gt-修改(文件类型改为“所有文件”)"><a href="#5-打开记事本后依次点击:文件-gt-gt-打开-gt-gt-修改(文件类型改为“所有文件”)" class="headerlink" title="5. 打开记事本后依次点击:文件>>打开>>修改(文件类型改为“所有文件”)"></a>5. 打开记事本后依次点击:文件>>打开>>修改(文件类型改为“所有文件”)</h5><p><img src="/assets/blogImg/windows-bluescreen/windows-bluescreen-5.png"></p><h5 id="6-找到C-Windows-WinSxS-pending-xml文件(如果您隐藏文件后缀则显示为pending)。然后先进行备份,以免操作失误造成损失!!切记!!"><a href="#6-找到C-Windows-WinSxS-pending-xml文件(如果您隐藏文件后缀则显示为pending)。然后先进行备份,以免操作失误造成损失!!切记!!" class="headerlink" title="6. 找到C:\Windows\WinSxS\pending.xml文件(如果您隐藏文件后缀则显示为pending)。然后先进行备份,以免操作失误造成损失!!切记!!!"></a>6. 找到C:\Windows\WinSxS\pending.xml文件(如果您隐藏文件后缀则显示为pending)。然后先进行备份,以免操作失误造成损失!!切记!!!</h5><p><img src="/assets/blogImg/windows-bluescreen/windows-bluescreen-6.png"></p><h5 id="7-打开pending-xml文件之后为方便查看点击记事本-gt-gt-格式-gt-gt-自动换行。用ctrl-F查找checkpoint。选中小编图中标示的代码,删除。然后保存。重启电脑搞定!"><a href="#7-打开pending-xml文件之后为方便查看点击记事本-gt-gt-格式-gt-gt-自动换行。用ctrl-F查找checkpoint。选中小编图中标示的代码,删除。然后保存。重启电脑搞定!" class="headerlink" title="7. 打开pending.xml文件之后为方便查看点击记事本>>格式>>自动换行。用ctrl+F查找checkpoint。选中小编图中标示的代码,删除。然后保存。重启电脑搞定!"></a>7. 打开pending.xml文件之后为方便查看点击记事本>>格式>>自动换行。用ctrl+F查找<code>checkpoint</code>。选中小编图中标示的代码,删除。然后保存。重启电脑搞定!</h5><p><img src="/assets/blogImg/windows-bluescreen/windows-bluescreen-7.png"></p><hr><p><strong>注意:pending.xml文件一定要备份,不能保证此方法适用所有电脑,三思!</strong></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/windows-bluescreen/windows-bluescreen-0.jpg" class="img-center-logo"><br> 当您的电脑出现<code>致命错误C0000034 正在更新操作54,共5073(000000000000000.cdf-ms)</code>时,一般都是因为您系统在更新或修补漏洞时因为某种原因而中断,再次开机就会出现这类状况。<br>
</summary>
<category term="windows" scheme="http://inplus.top/tags/windows/"/>
</entry>
<entry>
<title>eclipse首次使用基本设置</title>
<link href="http://inplus.top/archives/eclipsefirstsetting/"/>
<id>http://inplus.top/archives/eclipsefirstsetting/</id>
<published>2016-06-23T10:20:00.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-0.png" class="img-center-logo"><br> 最近,一些刚开始学习Java的朋友使用eclipse遇到了一些编码导致的问题向我询问,那就总结一下首次安装eclipse后我们大体应该设置哪些基本东西吧~<br>大神们呐就不用看啦。</p><a id="more"></a><h4 id="一、修改工作空间默认编码"><a href="#一、修改工作空间默认编码" class="headerlink" title="一、修改工作空间默认编码"></a>一、修改工作空间默认编码</h4><ul><li>在菜单导航栏上 Window–>Preferences 打开”首选项”对话框</li></ul><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-1.png" class="img-center-normal"></p><ul><li>左侧导航树导航到 General–>Workspace</li></ul><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-2.png" class="img-center-normal"></p><h4 id="二、修改文件类型的默认编码"><a href="#二、修改文件类型的默认编码" class="headerlink" title="二、修改文件类型的默认编码"></a>二、修改文件类型的默认编码</h4><p>有时候我们需要某种类型的文件,如:<em>.jsp、</em>.java等</p><ul><li>在菜单导航栏上 Window–>Preferences 打开”首选项”对话框</li><li>左侧导航树导航到 General–>Content Types</li><li>右边找到要修改的文件的类型,我这边以<code>Java Source源文件</code>为例</li><li>在下面的Default encoding,输入框中输入UTF-8->Update->OK </li></ul><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-3.png" class="img-center-normal"></p><p>同上,把一般我们用到的CSS样式文件、HTML页面文件、Properties配置文件、Java源文件、Javascript脚本文件、JSP页面文件、XML配置文件等常用文件的默认编码均改为<strong>UTF-8</strong></p><h4 id="三、修改默认字体大小"><a href="#三、修改默认字体大小" class="headerlink" title="三、修改默认字体大小"></a>三、修改默认字体大小</h4><p>默认的字体实在是小的可怜,为了<del>养眼</del>(护眼- . -)我们需要适当的调整字体大小</p><ul><li>在菜单导航栏上 Window–>Preferences 打开”首选项”对话框</li><li>左侧导航树导航到 General–>Appearance–>Colors and Fonts</li></ul><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-4.png" class="img-center-normal"></p><p>看到右边字体一列有很多的选项,我们只需要修改Basic里面的</p><ul><li>Basic–>Text Font–>Edit<br>这里我把字体改为12</li></ul><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-5.png" class="img-center-normal"></p><h4 id="四、调整控制台缓冲区大小-显示更多日志输出"><a href="#四、调整控制台缓冲区大小-显示更多日志输出" class="headerlink" title="四、调整控制台缓冲区大小 显示更多日志输出"></a>四、调整控制台缓冲区大小 显示更多日志输出</h4><ul><li>在菜单导航栏上 Window–>Preferences 打开”首选项”对话框</li><li>左侧导航树导航到 Run/Debug–>Console</li><li>调整Console buffer size(characters)为1000000<br><img src="/assets/blogImg/eclipsesetting/eclipsesetting-5plus.png" class="img-center-normal"></li></ul><h4 id="五、适当关闭validation语法校验-优化启动速度"><a href="#五、适当关闭validation语法校验-优化启动速度" class="headerlink" title="五、适当关闭validation语法校验 优化启动速度"></a>五、适当关闭validation语法校验 优化启动速度</h4><ul><li>在菜单导航栏上 Window–>Preferences 打开”首选项”对话框</li><li>左侧导航树导航到 Validation</li><li>将Manual(手动)保持不动,将Build里面只留下Classpath Dependency Validator,其他的全部去掉。</li></ul><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-6.png" class="img-center-normal"></p><p>以后如果需要对文件进行校验检查的时候,在需要校验的文件上点击右键,点击Validate进行检查。</p><h4 id="六、设置tab键为4个空格,统一格式"><a href="#六、设置tab键为4个空格,统一格式" class="headerlink" title="六、设置tab键为4个空格,统一格式"></a>六、设置tab键为4个空格,统一格式</h4><ul><li>在菜单导航栏上 Window–>Preferences 打开”首选项”对话框</li><li>左侧导航树导航到 General–>Editors–>Text Editors</li><li>选中右侧的 Insert space for tabs</li></ul><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-7.png" class="img-center-normal"></p><ul><li>在菜单导航栏上 Window–>Preferences 打开”首选项”对话框</li><li>左侧导航树导航到 java–>code style- ->formatter</li><li>点击右侧的edit,选择左侧 tab policy 的值为 spaces only,并确保下方的空格个数为4</li><li>确定,应用保存即可,若出现应用Apply按钮为灰色的情况,需要回到上一步,点击new按钮,根据当前的样式重新生成一个新的样式并保存,名字可以随便起,新建以后重复上一步骤,编辑该样式即可。</li></ul><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-8.png" class="img-center-normal"></p><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-9.png" class="img-center-normal"></p><h4 id="七、修改背景颜色为护眼豆沙绿"><a href="#七、修改背景颜色为护眼豆沙绿" class="headerlink" title="七、修改背景颜色为护眼豆沙绿"></a>七、修改背景颜色为护眼豆沙绿</h4><p>据说长时间使用可以缓解眼疲劳哦<br>(吐槽:开什么玩笑,远离编程才能缓解眼疲劳好吗)</p><ul><li>在菜单导航栏上 Window–>Preferences 打开”首选项”对话框</li><li>左侧导航树导航到 General–>Editors–>Text Editors</li><li>点击右侧下方 Appearance color options 中的B ackground color</li><li>取消掉右侧 System Default 的勾选,点击 Color 后的色块将出现颜色选择面板</li><li>点击展开规定自定义颜色,本例使用的背景色是喜大普奔的豆沙绿,比较柔和,设置为:色调:85。饱和度:123。亮度:205 即可,添加到自定义颜色并在自定义颜色中选中确定保存即可。</li></ul><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-10.png" class="img-center-normal"></p><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-11.png" class="img-center-normal"></p><p>除此之外我们还可以设置非代码区的背景颜色(win7环境)</p><ul><li>桌面右键个性化–>窗口颜色</li><li>高级外观设置–>项目–>窗口–>颜色</li></ul><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-12.png" class="img-center-normal"></p><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-13.png" class="img-center-normal"></p><h4 id="八、修改搜狗输入法设置,防止-ctrl-shift-f-热键冲突"><a href="#八、修改搜狗输入法设置,防止-ctrl-shift-f-热键冲突" class="headerlink" title="八、修改搜狗输入法设置,防止 ctrl+shift+f 热键冲突"></a>八、修改搜狗输入法设置,防止 ctrl+shift+f 热键冲突</h4><p> 在我们使用eclipse的时候通常使用 <code>ctrl+shift+f</code> 快捷键来快速代码格式化,是否有时候发现命名并没有更改默认的快捷键设置,而使用快捷键无法格式化代码却在菜单中点击可以呢,其实这是windows上一些其他程序的热键冲突导致的,像搜狗输入法就会优先占用 <code>ctrl+shift+f</code> 快捷键为切换简繁输入法的功能,那么我们就需要取消或者变更搜狗输入法的这个快捷键喽~</p><ul><li>搜狗输入法右键–>工具箱–>属性设置–>按键</li><li>取消右侧系统功能快捷键中简繁切换的勾选</li></ul><p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-14.png" class="img-center-normal"></p><hr><p>好了,大功告成,就先介绍到这里吧。</p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/eclipsesetting/eclipsesetting-0.png" class="img-center-logo"><br> 最近,一些刚开始学习Java的朋友使用eclipse遇到了一些编码导致的问题向我询问,那就总结一下首次安装eclipse后我们大体应该设置哪些基本东西吧~<br>大神们呐就不用看啦。</p>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
</entry>
<entry>
<title>使用GitHub和Hexo搭建免费静态Blog</title>
<link href="http://inplus.top/archives/hexo/"/>
<id>http://inplus.top/archives/hexo/</id>
<published>2016-04-22T15:27:17.000Z</published>
<updated>2017-04-22T15:27:17.000Z</updated>
<content type="html"><![CDATA[<p><img src="/assets/blogImg/hexo/hexo-0.png" class="img-left-logo"></p><hr><h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>习惯自己写Blog的朋友一定不会陌生Wordpress,或许也曾在新浪博客和QQ空间留过脚印,但静心认真思考一下,似乎我们又总是向往更加简单自由的写作方式。GitHub给我们提供了一个无限的空间,我们需要珍惜使用,而Hexo的出现从某种意义上来说代替了Jekyll,让我们可以更专注于写作本身。</p><blockquote><p><strong>喜欢写Blog的人,会经历三个阶段。</strong><br>第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写。<br>第二阶段,发现免费空间限制太多,就自己购买域名和空间,搭建独立博客。<br>第三阶段,觉得独立博客的管理太麻烦,最好在保留控制权的前提下,让别人来管,自己只负责写文章。</p></blockquote><blockquote><p>大多数Blog作者,都停留在第一和第二阶段,因为第三阶段不太容易到达:你很难找到俯首听命、愿意为你管理服务器的人。</p></blockquote><blockquote><p>但是六年前,情况出现变化,一些程序员开始在GitHub网站上搭建blog。他们既拥有绝对管理权,又享受GitHub带来的便利—-不管何时何地,只要向主机提交commit,就能发布新文章。更妙的是,这一切还是免费的,GitHub提供无限流量,世界各地都有理想的访问速度。</p></blockquote><blockquote><p>今天,我就来示范如何在GitHub上搭建Blog,你可以从中掌握GitHub的Pages功能,以及Hexo软件的基本用法。更重要的是,你会体会到一种建立网站的全新思路。</p></blockquote><hr><a id="more"></a><h1 id="概要"><a href="#概要" class="headerlink" title="概要"></a>概要</h1><h3 id="GitHub-Pages-是什么?"><a href="#GitHub-Pages-是什么?" class="headerlink" title="GitHub Pages 是什么?"></a>GitHub Pages 是什么?</h3><p>如果你对编程有所了解,就一定听说过<a href="https://github.com/" target="_blank" rel="noopener">GitHub</a>。它号称程序员的Facebook,有着极高的人气,许多重要的项目都托管在上面。<br>简单说,它是一个具有版本管理功能的代码仓库,每个项目都有一个主页,列出项目的源文件。</p><p>但是对于一个新手来说,看到一大堆源码,只会让人头晕脑涨,不知何处入手。他希望看到的是,一个简明易懂的网页,说明每一步应该怎么做。因此,GitHub就设计了<a href="http://pages.github.com/" target="_blank" rel="noopener">Pages功能</a>,允许用户自定义项目首页,用来替代默认的源码列表。</p><p><strong>所以,GitHub Pages可以被认为是用户编写的、托管在GitHub 上的静态网页。</strong></p><p>GitHub 提供模板,允许<a href="https://help.github.com/articles/creating-pages-with-the-automatic-generator" target="_blank" rel="noopener">站内生成</a>网页,但也允许用户自己编写网页,然后上传。有意思的是,这种上传并不是单纯的上传,而是会经过Hexo或Jekyll等程序的再处理。</p><h3 id="什么是Hexo?"><a href="#什么是Hexo?" class="headerlink" title="什么是Hexo?"></a>什么是Hexo?</h3><p><a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a> 是一个快速、简洁且高效的基于Node.js的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。作者是来自台湾的<a href="https://github.com/tommy351/hexo" target="_blank" rel="noopener">@tommy351</a>。</p><blockquote><p>A fast, simple & powerful blog framework, powered by Node.js.</p></blockquote><p>类似于jekyll、Octopress、Wordpress,我们可以用Hexo创建自己的博客,托管到github、Heroku或Coding上,绑定自己的域名,用markdown写文章。<a href="http://viosay.github.io/" target="_blank" rel="noopener">本博客</a>即使用hexo创建并托管在github上。</p><h3 id="为什么要用hexo"><a href="#为什么要用hexo" class="headerlink" title="为什么要用hexo"></a>为什么要用hexo</h3><blockquote><p>不可思议的快速 ─ 只要一眨眼静态文件即生成完成<br>支持 Markdown<br>仅需一道指令即可部署到 GitHub Pages 和 Heroku<br>已移植 Octopress 插件<br>高扩展性、自订性<br>兼容于 Windows, Mac & Linux</p></blockquote><ul><li>易用。不仅部署简单,平时使用中仅需要<code>hexo new</code> <code>hexo generate</code> <code>hexo server</code> <code>hexo deploy</code>四个命令。不像Jekyll需要很多繁琐的<code>git</code>命令。</li><li>轻。文件少、小,易理解,方便自定义。</li><li>用户多。虽然赶不上Jekyll和Octopress,但遇到什么问题都能搜索到答案,或者找到同样使用hexo的用户进行参考和咨询。</li></ul><h3 id="谁能使用hexo"><a href="#谁能使用hexo" class="headerlink" title="谁能使用hexo"></a>谁能使用hexo</h3><p>这是一个免费开源的博客程序,任何人都可以使用和修改。但是不同于wordpress,hexo由于需要使用<em>Github,Git,Markdown,Node.js</em>这样的工具,好多插件、widget都需要自己安装、设置。所以适合那些<strong>有一定计算机基础,喜欢折腾</strong>的人。但是,不要恐惧,只要跟着本教程走,就能很方便地让自己的博客”飞起来”。</p><h3 id="怎样搭建hexo博客"><a href="#怎样搭建hexo博客" class="headerlink" title="怎样搭建hexo博客"></a>怎样搭建hexo博客</h3><p>正题来了,请认真往下看吧。</p><hr><h1 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h1><p><strong>注意</strong> 本文主要针对<code>Windows</code>平台和<code>Hexo 3.x</code></p><h3 id="安装GIT"><a href="#安装GIT" class="headerlink" title="安装GIT"></a>安装GIT</h3><p>下载 <a href="https://git-scm.com/" target="_blank" rel="noopener">Git</a> 并执行即可完成安装。<br>So Easy</p><h3 id="安装Node-JS"><a href="#安装Node-JS" class="headerlink" title="安装Node.JS"></a>安装Node.JS</h3><p>在 Windows 环境下安装Node.js非常简单,仅须下载<a href="https://nodejs.org/" target="_blank" rel="noopener">Node.JS</a>并执行即可完成安装。<br>So Easy</p><h3 id="安装Hexo"><a href="#安装Hexo" class="headerlink" title="安装Hexo"></a>安装Hexo</h3><p>在任意位置右键,选择Git Bash Here<br><figure class="highlight coffeescript"><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="built_in">npm</span> install -g hexo-cli</span><br><span class="line"><span class="comment">#如果命令无法运行,可以尝试更换taobao的npm源</span></span><br><span class="line"><span class="built_in">npm</span> config set registry https://registry.<span class="built_in">npm</span>.taobao.org</span><br><span class="line"><span class="comment">#或者安装使用cnpm</span></span><br><span class="line"><span class="built_in">npm</span> install -g cnpm --registry=https://registry.<span class="built_in">npm</span>.taobao.org</span><br></pre></td></tr></table></figure></p><hr><h1 id="Hexo初始化配置"><a href="#Hexo初始化配置" class="headerlink" title="Hexo初始化配置"></a>Hexo初始化配置</h1><h3 id="创建hexo文件夹"><a href="#创建hexo文件夹" class="headerlink" title="创建hexo文件夹"></a>创建hexo文件夹</h3><p>安装完成后,根据自己喜好建立目录(如<code>D:\hexo</code>),在该文件夹下右键–Git Bash Here。执行以下命令<br><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">hexo init</span></span><br></pre></td></tr></table></figure></p><h3 id="安装依赖包"><a href="#安装依赖包" class="headerlink" title="安装依赖包"></a>安装依赖包</h3><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm <span class="keyword">install</span></span><br></pre></td></tr></table></figure><p>该命令会将hexo所需文件自动下载到hexo文件夹下。<br><figure class="highlight 1c"><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="meta">#新建完成后,指定文件夹的目录如下</span></span><br><span class="line">.</span><br><span class="line">├── _config.yml</span><br><span class="line">├── package.json</span><br><span class="line">├── scaffolds</span><br><span class="line">├── scripts</span><br><span class="line">├── source</span><br><span class="line"><span class="string">| ├── _drafts</span></span><br><span class="line"><span class="string">| └── _posts</span></span><br><span class="line">└── themes</span><br></pre></td></tr></table></figure></p><h3 id="安装Hexo插件-可省略"><a href="#安装Hexo插件-可省略" class="headerlink" title="安装Hexo插件(可省略)"></a>安装Hexo插件(可省略)</h3><figure class="highlight sql"><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">npm <span class="keyword">install</span> hexo-generator-feed <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-sitemap <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-baidu-sitemap <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-<span class="keyword">json</span>-<span class="keyword">content</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-deployer-git <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-<span class="keyword">index</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-<span class="keyword">archive</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-<span class="keyword">category</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-tag <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-<span class="keyword">server</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-deployer-heroku <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-deployer-rsync <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-deployer-openshift <span class="comment">--save</span></span><br></pre></td></tr></table></figure><h3 id="查看本地运行效果"><a href="#查看本地运行效果" class="headerlink" title="查看本地运行效果"></a>查看本地运行效果</h3><p>现在我们已经搭建起本地的Hexo博客了,继续执行以下命令(在<code>D:\Hexo</code>),成功后即可登录<code>localhost:4000</code>查看效果,运行显示了相关页面,说明当前网站已经在本地建立。<br><figure class="highlight verilog"><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">hexo <span class="keyword">generate</span></span><br><span class="line">hexo server</span><br></pre></td></tr></table></figure></p><p>好了,至此,本地博客已经搭建起来了,只是本地哦,别人看不到的。下面,我们要部署到Github。</p><hr><h1 id="配置GitHub"><a href="#配置GitHub" class="headerlink" title="配置GitHub"></a>配置GitHub</h1><h3 id="注册Github账号"><a href="#注册Github账号" class="headerlink" title="注册Github账号"></a>注册Github账号</h3><p>已有账号可以跳过,没有的,请登录<a href="https://github.com/" target="_blank" rel="noopener">GitHub</a>进行注册,很简单,这里就不介绍了。</p><h3 id="创建repository"><a href="#创建repository" class="headerlink" title="创建repository"></a>创建repository</h3><p>在自己Github主页右下角,创建<code>New repository</code>。<br>比如我的Github账号是<a href="https://github.com/viosay" target="_blank" rel="noopener">viosay</a>,那么我应该创建的repository名字应该是<code>viosay.github.io</code>。<br>首次创建耐心等待10分钟左右审核,之后即可访问静态主页如<a href="http://viosay.github.io/" target="_blank" rel="noopener">http://viosay.github.io</a></p><h3 id="配置部署"><a href="#配置部署" class="headerlink" title="配置部署"></a>配置部署</h3><p>编辑<code>_config.yml</code>(在<code>D:\hexo</code>下)。你在配置时,要把下面的viosay都换成你的账号名。<br><figure class="highlight less"><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"><span class="attribute">deploy</span>:</span><br><span class="line"> <span class="attribute">type</span>: git</span><br><span class="line"> <span class="attribute">repository</span>: <span class="attribute">https</span>:<span class="comment">//github.com/viosay/viosay.gith防和谐ub.io.git</span></span><br><span class="line"> <span class="attribute">branch</span>: master</span><br></pre></td></tr></table></figure></p><p>注意:<code>type:空格git</code>。都要使用空格,否则会出错。</p><h3 id="配置本机的ssh-key"><a href="#配置本机的ssh-key" class="headerlink" title="配置本机的ssh key"></a>配置本机的ssh key</h3><p>通过ssh keys就可以将本地的项目与Github关联起来</p><h3 id="检查本机ssh-key"><a href="#检查本机ssh-key" class="headerlink" title="检查本机ssh key"></a>检查本机ssh key</h3><figure class="highlight jboss-cli"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">cd</span> ~<span class="string">/.ssh</span></span><br></pre></td></tr></table></figure><p>提示:没使用过Git就会显示:No such file or directory</p><h3 id="生成新的ssh-keys"><a href="#生成新的ssh-keys" class="headerlink" title="生成新的ssh keys"></a>生成新的ssh keys</h3><figure class="highlight processing"><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">$ ssh-keygen -t rsa -C <span class="string">"邮件地址@youremail.com"</span></span><br><span class="line">Generating <span class="keyword">public</span>/<span class="keyword">private</span> rsa <span class="built_in">key</span> pair.</span><br><span class="line">Enter file in which to <span class="built_in">save</span> the <span class="built_in">key</span> (/Users/your_user_directory/.ssh/id_rsa):<回车></span><br></pre></td></tr></table></figure><p>注意:-C为大写的C接下来会让你输入密码<br><figure class="highlight xml"><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">Enter passphrase (empty for no passphrase):<span class="tag"><<span class="name">输入加密串</span>></span></span><br><span class="line">Enter same passphrase again:<span class="tag"><<span class="name">再次输入加密串</span>></span></span><br></pre></td></tr></table></figure></p><p>注意:输入密码时是不会显示密码的,依次输入就好了如果显示为下界面,就说明设置ssh key成功了<br><img src="/assets/blogImg/hexo/hexo-1.png"></p><h3 id="添加ssh-key到Github"><a href="#添加ssh-key到Github" class="headerlink" title="添加ssh key到Github"></a>添加ssh key到Github</h3><ol><li>搜索本机上的<code>id_rsa.pub</code>文件。或在<code>C:\Users\用户名\.ssh</code>路径下找到该文件,以记事本打开,复制其中的内容。</li><li>进入自己的Github,右上角齿轮setting—左边列表SSH keys—Add SSH key。将内容复制到文本框(不用取title名字)。<br>注意:这时Github会给你的邮箱发送一封邮件,打开邮件确认下就好了。</li></ol><h3 id="测试通信"><a href="#测试通信" class="headerlink" title="测试通信"></a>测试通信</h3><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">ssh</span> -T git<span class="variable">@github</span>.com</span><br></pre></td></tr></table></figure><p>如果是以下反馈<br><figure class="highlight vbnet"><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">The authenticity <span class="keyword">of</span> host <span class="comment">'github.com (207.97.227.239)' can't be established.</span></span><br><span class="line">RSA <span class="keyword">key</span> fingerprint <span class="keyword">is</span> <span class="number">16</span>:<span class="number">27</span>:ac:a5:<span class="number">76</span>:<span class="number">28</span>:防和谐<span class="number">2</span>d:<span class="number">36</span>:<span class="number">63</span>:<span class="number">1</span>b:<span class="number">56</span>:<span class="number">4</span>d:eb:df:a6:<span class="number">48.</span></span><br><span class="line">Are you sure you want <span class="keyword">to</span> <span class="keyword">continue</span> connecting (yes/no)?</span><br></pre></td></tr></table></figure></p><p>输入yes<br><figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Hi yourusername! You<span class="symbol">'ve</span> successfully authenticated, but GitHub does <span class="keyword">not</span> provide shell <span class="keyword">access</span>.</span><br></pre></td></tr></table></figure></p><p>这时候说明能够通过SSH链接到你的Github了,接下来完善一下你的个人信息。Git会根据用户的名字和邮箱来记录提交。<br>GitHub也是用这些信息来做权限的处理,输入下面的代码进行个人信息的设置,把名称和邮箱替换成你自己的,名字必须是你的真名,而不是GitHub的昵称。<br><figure class="highlight routeros"><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">git<span class="built_in"> config </span>--global user.name <span class="string">"Tim"</span> #用户名</span><br><span class="line">git<span class="built_in"> config </span>--global user.email <span class="string">"tim@gmail.com"</span> #填写自己的邮箱</span><br></pre></td></tr></table></figure></p><hr><h1 id="使用Hexo克隆主题"><a href="#使用Hexo克隆主题" class="headerlink" title="使用Hexo克隆主题"></a>使用Hexo克隆主题</h1><p>自己使用的是Yilia主题,比较喜欢,以这款主题为例。</p><h3 id="克隆主题"><a href="#克隆主题" class="headerlink" title="克隆主题"></a>克隆主题</h3><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">clone</span> <span class="title">https</span>://github.com/litten/hexo-theme-yilia.git themes/yilia</span><br></pre></td></tr></table></figure><h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><p>修改hexo根目录下的<code>_config.yml</code>:<br><figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">theme:</span> yilia</span><br></pre></td></tr></table></figure></p><h3 id="更新"><a href="#更新" class="headerlink" title="更新"></a>更新</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> themes/yilia</span><br><span class="line">git pull</span><br></pre></td></tr></table></figure><h3 id="本地查看"><a href="#本地查看" class="headerlink" title="本地查看"></a>本地查看</h3><figure class="highlight ebnf"><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="attribute">hexo g</span></span><br><span class="line"><span class="attribute">hexo s</span></span><br></pre></td></tr></table></figure><p>浏览器输入<strong>localhost:4000</strong>,查看主题是否成功。</p><h3 id="部署上传"><a href="#部署上传" class="headerlink" title="部署上传"></a>部署上传</h3><figure class="highlight ebnf"><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="attribute">hexo clean</span></span><br><span class="line"><span class="attribute">hexo g</span></span><br><span class="line"><span class="attribute">hexo d</span></span><br></pre></td></tr></table></figure><p>会让你输入用户名和密码,依次输入就好。</p><h3 id="部分Hexo主题推荐"><a href="#部分Hexo主题推荐" class="headerlink" title="部分Hexo主题推荐"></a>部分Hexo主题推荐</h3><blockquote><p>选择主题建议遵循<code>KISS</code>原则</p></blockquote><p>Hexo Themes - <a href="http://hexo.io/themes/" target="_blank" rel="noopener">http://hexo.io/themes/</a><br>Themes · hexojs/hexo Wiki - <a href="https://github.com/hexojs/hexo/wiki/Themes" target="_blank" rel="noopener">https://github.com/hexojs/hexo/wiki/Themes</a></p><p>Yilia - <a href="http://litten.github.io/2014/08/31/hexo-theme-yilia/" target="_blank" rel="noopener">http://litten.github.io/2014/08/31/hexo-theme-yilia/</a><br>Jacman - <a href="http://wsgzao.github.io/post/hexo-jacman/" target="_blank" rel="noopener">http://wsgzao.github.io/post/hexo-jacman/</a><br>NexT - <a href="http://theme-next.iissnan.com/" target="_blank" rel="noopener">http://theme-next.iissnan.com/</a></p><hr><h1 id="绑定域名和DNS设置"><a href="#绑定域名和DNS设置" class="headerlink" title="绑定域名和DNS设置"></a>绑定域名和DNS设置</h1><h3 id="设置CNAME"><a href="#设置CNAME" class="headerlink" title="设置CNAME"></a>设置CNAME</h3><ul><li>打开Github–空间Repository的根目录下–点击“+”creat a new file–命名为<code>CNAME</code>,文本框中输入自己需要绑定的域名如<code>inplus.top</code>。</li><li>点击右下角的【Download ZIP】,下载项目,解压压缩包,将其中的<code>CNAME</code>文件复制到hexo根目录下。<figure class="highlight ebnf"><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="attribute">hexo g</span></span><br><span class="line"><span class="attribute">hexo d</span></span><br></pre></td></tr></table></figure></li></ul><h3 id="DNS设置"><a href="#DNS设置" class="headerlink" title="DNS设置"></a>DNS设置</h3><p>注册登录<a href="https://www.dnspod.cn/" target="_blank" rel="noopener">DNSPod</a>,先添加域名,然后添加记录,设置如下</p><table><thead><tr><th style="text-align:center">主机记录</th><th style="text-align:center">记录类型</th><th style="text-align:center">线路类型</th><th style="text-align:center">记录值</th><th style="text-align:center">MX优先级</th><th style="text-align:center">TTL</th></tr></thead><tbody><tr><td style="text-align:center">@</td><td style="text-align:center">CNAME</td><td style="text-align:center">默认</td><td style="text-align:center">viosay.github.io.</td><td style="text-align:center">-</td><td style="text-align:center">10</td></tr><tr><td style="text-align:center">www</td><td style="text-align:center">CNAME</td><td style="text-align:center">默认</td><td style="text-align:center">viosay.github.io.</td><td style="text-align:center">-</td><td style="text-align:center">10</td></tr></tbody></table><h3 id="域名推荐"><a href="#域名推荐" class="headerlink" title="域名推荐"></a>域名推荐</h3><blockquote><p>GoDaddy makes registering Domain Names fast, simple, and affordable.<br>【推荐理由】两个字“靠谱”,支持支付宝,附优惠码链接<br><a href="http://www.godaddy.com" target="_blank" rel="noopener">http://www.godaddy.com</a><br><a href="http://www.gdcodecoupon.com" target="_blank" rel="noopener">http://www.gdcodecoupon.com</a></p></blockquote><p>-</p><blockquote><p>万网<br>【推荐理由】被阿里收入麾下,实力和价格都不错<br><a href="https://wanwang.aliyun.com" target="_blank" rel="noopener">https://wanwang.aliyun.com</a></p></blockquote><h3 id="DNS推荐"><a href="#DNS推荐" class="headerlink" title="DNS推荐"></a>DNS推荐</h3><blockquote><p>致力于为您提供最稳定、最安全的域名解析服务<br>【推荐理由】依然是两个字“靠谱”,被腾讯收入麾下以后扔不忘初心,感谢他们一直以来对于公益的坚持<br><a href="https://www.dnspod.cn" target="_blank" rel="noopener">https://www.dnspod.cn</a></p></blockquote><hr><h1 id="开始写文章"><a href="#开始写文章" class="headerlink" title="开始写文章"></a>开始写文章</h1><figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo <span class="keyword">new</span> <span class="string">"postName"</span></span><br></pre></td></tr></table></figure><p>或路径<code>D:\hexo\source\_posts</code>下新建文件<code>postName.md</code>就可以了<br><strong>文章内容和格式如下:</strong><br><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">标题</span></span><br><span class="line"><span class="attr">date:</span> <span class="string">YYYY-MM-DD</span> <span class="string">hh:mm:ss</span></span><br><span class="line"><span class="attr">tags:</span> <span class="string">标签</span> <span class="comment">#多标签时以[tag1,tag2]格式填写</span></span><br><span class="line"><span class="attr">categories:</span> <span class="string">类别</span> <span class="comment">#多类别时以[category1,category2]格式填写</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="string">主页可显摘要</span></span><br><span class="line"><span class="string"><!--</span> <span class="string">more</span> <span class="string">--></span> <span class="comment">#阅读全文分隔符</span></span><br><span class="line"><span class="string">展开余下全文</span></span><br></pre></td></tr></table></figure></p><p>正文内容使用Markdown语法进行书写</p><h3 id="图床推荐"><a href="#图床推荐" class="headerlink" title="图床推荐"></a>图床推荐</h3><blockquote><p>七牛云<br>【推荐理由】体系完善,操作简便易懂<br>测试用户每月1G流量,实名后每月10G,小站够用。<br>需要注意的是未备案网站无法使用CDN,存在盗图和恶意刷流量的可能,而且七牛是先使用后付费,自己领悟吧。<br><a href="http://www.qiniu.com" target="_blank" rel="noopener">http://www.qiniu.com</a></p></blockquote><p>-</p><blockquote><p>Simple Free Image Hosting<br>【推荐理由】免费,强大,无限制,用了都说好<br>缺点:后期无法对上传的图片进行管理<br><a href="https://sm.ms" target="_blank" rel="noopener">https://sm.ms</a><br>说明:<a href="https://www.v2ex.com/t/182703" target="_blank" rel="noopener">https://www.v2ex.com/t/182703</a></p></blockquote><hr><h1 id="其他相关"><a href="#其他相关" class="headerlink" title="其他相关"></a>其他相关</h1><h3 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h3><ol><li>修改配置文件时注意<code>YAML</code>语法,参数<code>冒号:</code>后一定要留<code>空格</code></li><li>中文乱码请修改文件编码格式为<code>UTF-8</code></li></ol><p><strong>Error代码:「warning: LF will be replaced by CRLF」</strong><br>在<code>hexo deploy</code>时,有时会出现这个提示信息<code>warning: LF will be replaced by CRLF</code>,虽然看起来挺乱糟糟的,但不影响使用,可以忽略不计。若想不提示,可以使用如下方法:</p><blockquote><ol><li>切换到博客的根目录,执行如下命令:<code>git config --global core.autocrlf false</code></li><li>删除掉该目录下的<code>.git</code>文件夹(可能是隐藏的),命令:<code>rm -rf .git</code></li><li>重新<code>git init</code>。</li></ol></blockquote><p>再deploy试试吧,清新脱俗了。</p><p><strong>Error代码:hexo deploy 没反应</strong><br>好多网友遇到过这个问题,目前来看,主要问题出在<code>config.yml</code>的<code>deploy</code>配置上。注意缩进,同时注意冒号后面要有一个空格。<br><strong>Error代码:hexo update -g 升级错误,hexo命令失效</strong><br>我升级时遇到了这个问题,原因不详。这种情况下,可执行<code>npm install hexo-cli -g</code>重新安装一遍Hexo,效果跟升级一样。<br><strong>Error代码:hexo指令无法执行</strong><br>可能是升级方法不对,导致hexo generate指令也无法执行,后来索性重装了git和node,重新安装hexo,generate和server指令都能执行了,但是出现了“Deployer not found: github”。<br><strong>Error代码:Deployer not found: git</strong><br>更改_config.yml主配置文件为utf-8编码时导致的异常。<br>执行<code>npm install hexo-deployer-git --save</code>然后重新deploy即可。</p><p>各版本所做更新修正,请参考<a href="https://github.com/tommy351/hexo/releases" target="_blank" rel="noopener">这里</a>。</p><h3 id="如何迁移至Hexo"><a href="#如何迁移至Hexo" class="headerlink" title="如何迁移至Hexo"></a>如何迁移至Hexo</h3><p><a href="http://hexo.io/zh-cn/docs/migration.html" target="_blank" rel="noopener">http://hexo.io/zh-cn/docs/migration.html</a></p><h3 id="Hexo命令"><a href="#Hexo命令" class="headerlink" title="Hexo命令"></a>Hexo命令</h3><figure class="highlight jboss-cli"><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">hexo init <folder> <span class="comment">#初始化一个网站目录 我是直接cd到目标目录执行hexo init的</span></span><br><span class="line">hexo new <span class="string">"postName"</span> <span class="comment">#新建文章,或者source\_posts手动编辑</span></span><br><span class="line">hexo new page <span class="string">"pageName"</span> <span class="comment">#新建页面 默认链接为:主页地址/pageName/</span></span><br><span class="line">hexo clean <span class="comment">#清除缓存文件db.json和已生成的静态文件public</span></span><br><span class="line">hexo generate <span class="comment">#生成public静态文件至public目录</span></span><br><span class="line">hexo server <span class="comment">#本地发布预览效果 http://localhost:4000 ('ctrl + c'关闭server)</span></span><br><span class="line">hexo <span class="keyword">deploy</span> <span class="comment">#将.deploy目录部署到GitHub</span></span><br><span class="line">hexo <span class="params">--debug</span> <span class="comment">#在终端中显示调试信息并记录到 `debug.log`</span></span><br><span class="line">hexo <span class="keyword">help</span> <span class="comment">#查看帮助</span></span><br><span class="line">hexo <span class="keyword">version</span> <span class="comment">#查看Hexo的版本</span></span><br></pre></td></tr></table></figure><h3 id="Hexo简写命令"><a href="#Hexo简写命令" class="headerlink" title="Hexo简写命令"></a>Hexo简写命令</h3><figure class="highlight 1c"><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">hexo n <span class="string">"postName"</span> <span class="meta">#新建文章,或者source\_posts手动编辑</span></span><br><span class="line">hexo g <span class="meta">#生成public静态文件至public目录</span></span><br><span class="line">hexo s <span class="meta">#本地发布预览效果 http:<span class="comment">//localhost:4000 ('ctrl + c'关闭server)</span></span></span><br><span class="line">hexo d <span class="meta">#将.deploy目录部署到GitHub</span></span><br></pre></td></tr></table></figure><h3 id="Hexo复合命令"><a href="#Hexo复合命令" class="headerlink" title="Hexo复合命令"></a>Hexo复合命令</h3><figure class="highlight nginx"><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"><span class="attribute">hexo</span> d -g <span class="comment">#生成并部署上传</span></span><br><span class="line">hexo s -g <span class="comment">#生成并本地发布预览</span></span><br><span class="line">hexo clean && hexo d -g <span class="comment">#清空缓存然后生成并部署上传</span></span><br><span class="line">hexo clean && hexo s -g <span class="comment">#清空缓存然后生成并本地发布预览</span></span><br></pre></td></tr></table></figure><hr><p>本文部分说明来自互联网<br>特别感谢 <a href="https://wsgzao.github.io" target="_blank" rel="noopener">@wsgzao</a> <a href="http://www.ruanyifeng.com/" target="_blank" rel="noopener">@阮一峰</a> <a href="http://www.jianshu.com/p/5368aa49e193" target="_blank" rel="noopener">@TimFei</a> <a href="http://litten.github.io/" target="_blank" rel="noopener">@Litten</a> <a href="http://cnfeat.com/" target="_blank" rel="noopener">@陈素封</a> <a href="http://www.zipperary.com/" target="_blank" rel="noopener">@zippera</a> <a href="http://ibruce.info/2013/11/22/hexo-your-blog/" target="_blank" rel="noopener">@不如</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/hexo/hexo-0.png" class="img-left-logo"></p>
<hr>
<h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p>习惯自己写Blog的朋友一定不会陌生Wordpress,或许也曾在新浪博客和QQ空间留过脚印,但静心认真思考一下,似乎我们又总是向往更加简单自由的写作方式。GitHub给我们提供了一个无限的空间,我们需要珍惜使用,而Hexo的出现从某种意义上来说代替了Jekyll,让我们可以更专注于写作本身。</p>
<blockquote>
<p><strong>喜欢写Blog的人,会经历三个阶段。</strong><br>第一阶段,刚接触Blog,觉得很新鲜,试着选择一个免费空间来写。<br>第二阶段,发现免费空间限制太多,就自己购买域名和空间,搭建独立博客。<br>第三阶段,觉得独立博客的管理太麻烦,最好在保留控制权的前提下,让别人来管,自己只负责写文章。</p>
</blockquote>
<blockquote>
<p>大多数Blog作者,都停留在第一和第二阶段,因为第三阶段不太容易到达:你很难找到俯首听命、愿意为你管理服务器的人。</p>
</blockquote>
<blockquote>
<p>但是六年前,情况出现变化,一些程序员开始在GitHub网站上搭建blog。他们既拥有绝对管理权,又享受GitHub带来的便利—-不管何时何地,只要向主机提交commit,就能发布新文章。更妙的是,这一切还是免费的,GitHub提供无限流量,世界各地都有理想的访问速度。</p>
</blockquote>
<blockquote>
<p>今天,我就来示范如何在GitHub上搭建Blog,你可以从中掌握GitHub的Pages功能,以及Hexo软件的基本用法。更重要的是,你会体会到一种建立网站的全新思路。</p>
</blockquote>
<hr>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<category term="Hexo" scheme="http://inplus.top/tags/Hexo/"/>
</entry>
<entry>
<title>Markdown语法综述</title>
<link href="http://inplus.top/archives/markdown/"/>
<id>http://inplus.top/archives/markdown/</id>
<published>2016-03-10T15:27:17.000Z</published>
<updated>2016-10-10T15:27:17.000Z</updated>
<content type="html"><</code>这样的语法即可插入链接,<br>使用<code></code>这样的语法即可插入图片。<br>例如:<br><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[<span class="string">寻沫小栈</span>](<span class="link">http://viosay.github.io</span>)</span><br></pre></td></tr></table></figure></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"></span><br></pre></td></tr></table></figure><p>注意:插入图片的语法和链接的语法很像,只是前面多了一个<code>!</code>。</p><p>另:Markdown支持以比较简短的自动链接形式来处理网址和电子邮件信箱,只要是用尖括号<code><</code>和<code>></code>包起来,Markdown 就会自动把它转成链接。一般网址的链接文字就和链接地址一样。<br>例如:<br><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><<span class="string">http:</span><span class="comment">//example.com/></span></span><br></pre></td></tr></table></figure></p><h3 id="5、粗体与斜体"><a href="#5、粗体与斜体" class="headerlink" title="5、粗体与斜体"></a>5、粗体与斜体</h3><p>Markdown的粗体和斜体也非常简单,用两个星号<code>**</code>或两个下划线<code>__</code>包裹一段文本就是粗体的语法,用一个星号<code>*</code>或一个下划线<code>_</code>包裹一段文本就是斜体的语法。<br>例如:<br><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">*<span class="strong">*这里是粗体*</span><span class="strong">*</span></span><br></pre></td></tr></table></figure></p><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="strong">*这里是斜体*</span></span><br></pre></td></tr></table></figure><h3 id="6、分割线与删除线"><a href="#6、分割线与删除线" class="headerlink" title="6、分割线与删除线"></a>6、分割线与删除线</h3><p>分割线的语法只需要另起一行,连续输入三个减号<code>---</code>、下划线<code>___</code>、星号<code>***</code>即可。<br>删除线的语法只需用两个波浪号<code>~~</code>包裹一段文本即可。<br>例如:<br><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="string">或</span></span><br><span class="line"><span class="string">___</span></span><br><span class="line"><span class="string">或</span></span><br><span class="line"><span class="string">***</span></span><br></pre></td></tr></table></figure></p><figure class="highlight haml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~~本段文字被删除线拦截~~</span><br></pre></td></tr></table></figure><p>注意:对于分割线,行内不得有任何其他字符。</p><h3 id="7、代码句和代码块"><a href="#7、代码句和代码块" class="headerlink" title="7、代码句和代码块"></a>7、代码句和代码块</h3><p>如果你是个程序猿,需要在文章里优雅的引用代码框,在 Markdown 下实现也非常简单。需要引用代码时,如果引用的代码语句只有一段,不分行,可以用一个重音符`将代码语句包裹起来。如果引用的语句为多行的代码块,可以将三个重音符```置于这段代码的首行和末行来包裹代码块。<br>例如:<br><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">`hello <span class="built_in">word</span>代码句`</span><br></pre></td></tr></table></figure></p><p><img src="/assets/blogImg/markdown/markdown-1.png"><br>注意:在代码块中使用<code>tab</code>键即可进行缩进。</p><h3 id="8、表格"><a href="#8、表格" class="headerlink" title="8、表格"></a>8、表格</h3><p>相对于那些简单的语法,Markdown表格则较为繁琐和累人。<br>例如:<br><figure class="highlight ruby"><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="params">| Tables |</span> Are <span class="params">| Cool |</span></span><br><span class="line"><span class="params">| ------------- |</span><span class="symbol">:-------------</span><span class="symbol">:|</span> -----<span class="symbol">:|</span></span><br><span class="line"><span class="params">| col 3 is |</span> right-aligned <span class="params">| $1600 |</span></span><br><span class="line"><span class="params">| col 2 is |</span> centered <span class="params">| $12 |</span></span><br><span class="line"><span class="params">| zebra stripes |</span> are neat <span class="params">| $1 |</span></span><br></pre></td></tr></table></figure></p><h2 id="Markdown-编辑器推荐"><a href="#Markdown-编辑器推荐" class="headerlink" title="Markdown 编辑器推荐"></a>Markdown 编辑器推荐</h2><h5 id="在线编辑器:"><a href="#在线编辑器:" class="headerlink" title="在线编辑器:"></a>在线编辑器:</h5><ul><li>Cmd Markdown 编辑阅读器 <a href="https://www.zybuluo.com" target="_blank" rel="noopener">https://www.zybuluo.com</a><br>作业部落出品,是一款不错的工具和博客平台兼顾的产品。全平台且提供web版。</li><li>简书 <a href="http://www.jianshu.com/writer" target="_blank" rel="noopener">http://www.jianshu.com/writer</a><br>一个很不错的博客平台,每几秒钟便会自动存入一个备份。可以直接从本地拖入照片生成链接,一直在不断优化。作为一个博客平台,需要注册账号后方能进行写作。</li><li>Editor.MD<a href="https://pandao.github.io/editor.md" target="_blank" rel="noopener">https://pandao.github.io/editor.md</a><br>开源。</li><li>MaHua <a href="http://mahua.jser.me" target="_blank" rel="noopener">http://mahua.jser.me</a><br>界面有些丑陋。</li><li>小书匠编辑器 <a href="http://soft.xiaoshujiang.com" target="_blank" rel="noopener">http://soft.xiaoshujiang.com</a><br>全平台覆盖并且有web版。</li><li>dillinger <a href="http://dillinger.io" target="_blank" rel="noopener">http://dillinger.io</a><br>漂亮强大,支持md, html, pdf 文件导出。支持dropbox, onedrive,google drive, github. 来自国外,可能不够稳定。</li><li>Marxico <a href="http://marxi.co" target="_blank" rel="noopener">http://marxi.co</a><br>中文:马克飞象 <a href="http://maxiang.info" target="_blank" rel="noopener">http://maxiang.info</a><br>因为印象笔记不支持Markdown,而这款可以直接把文本存到印象笔记的编辑器对于重度印象笔记用户是个不错的选择。付费软件,可以免费试用。</li></ul><h5 id="Windows-平台:"><a href="#Windows-平台:" class="headerlink" title="Windows 平台:"></a>Windows 平台:</h5><ul><li>MarkdownPad <a href="http://markdownpad.com" target="_blank" rel="noopener">http://markdownpad.com</a><br>一款全功能的编辑器,被很多人称赞为windows 平台最好用的markdown编辑器。</li><li>MarkPad <a href="http://code52.org/DownmarkerWPF" target="_blank" rel="noopener">http://code52.org/DownmarkerWPF</a></li><li>Smark <a href="http://git.oschina.net/elerao/Smark" target="_blank" rel="noopener">http://git.oschina.net/elerao/Smark</a><br>开源软件</li><li>MdCharm <a href="http://www.mdcharm.com/" target="_blank" rel="noopener">http://www.mdcharm.com/</a><br>功能完备,长相一般,隐藏菜单栏后也算简约。有Windows 和Linux版本。目前已开源,不再更新。</li></ul><h5 id="Linux-平台:"><a href="#Linux-平台:" class="headerlink" title="Linux 平台:"></a>Linux 平台:</h5><p>ReText <a href="http://sourceforge.net/p/retext/home/ReText" target="_blank" rel="noopener">http://sourceforge.net/p/retext/home/ReText</a></p><h5 id="Mac-平台:"><a href="#Mac-平台:" class="headerlink" title="Mac 平台:"></a>Mac 平台:</h5><ul><li>Mou <a href="http://mouapp.com" target="_blank" rel="noopener">http://mouapp.com</a><br>似乎提到 Mac 和 MD,接下来的词一定是Mou,因为他们是一个姓吗。</li><li>Typora <a href="http://typora.io" target="_blank" rel="noopener">http://typora.io</a><br>有出Windows 和Linux版本的计划。</li><li>MacDown <a href="http://macdown.uranusjr.com" target="_blank" rel="noopener">http://macdown.uranusjr.com</a><br>开源免费</li><li>Byword <a href="http://bywordapp.com" target="_blank" rel="noopener">http://bywordapp.com</a><br>支持OS X, iOS 售价78元。</li><li>iA Writer <a href="https://ia.net/writer/ios" target="_blank" rel="noopener">https://ia.net/writer/ios</a><br>支持OS X , iOS 及Android,未优化中文显示,知乎此<a href="http://www.zhihu.com/question/20129290" target="_blank" rel="noopener">问题</a>中很多人认为 Byword比 iA 好 。售价68,pro版本128元。</li><li>Ulysses <a href="http://www.ulyssesapp.com" target="_blank" rel="noopener">http://www.ulyssesapp.com</a><br>支持OS X , iPad, 少数派有一篇专门的<a href="http://sspai.com/27336" target="_blank" rel="noopener">文章</a>介绍,售价 283元。</li><li>Typed <a href="http://realmacsoftware.com/typed" target="_blank" rel="noopener">http://realmacsoftware.com/typed</a><br>少数派有关于的<a href="http://sspai.com/30271" target="_blank" rel="noopener">测评</a> ,售价128元。</li></ul><h5 id="浏览器插件:"><a href="#浏览器插件:" class="headerlink" title="浏览器插件:"></a>浏览器插件:</h5><p>MaDe(Chrome)<br><a href="https://chrome.google.com/webstore/detail/oknndfeeopgpibecfjljjfanledpbkog)" target="_blank" rel="noopener">https://chrome.google.com/webstore/detail/oknndfeeopgpibecfjljjfanledpbkog)</a></p><h5 id="高级应用:"><a href="#高级应用:" class="headerlink" title="高级应用:"></a>高级应用:</h5><p><a href="http://www.sublimetext.com/2" target="_blank" rel="noopener">Sublime Text 2</a> + <a href="http://ttscoff.github.com/MarkdownEditing/" target="_blank" rel="noopener">MarkdownEditing</a> / <a href="http://lucifr.com/2012/07/12/markdownediting-for-sublime-text-2/" target="_blank" rel="noopener">教程</a></p>]]></content>
<summary type="html">
<p><img src="/assets/blogImg/markdown/markdown-0.png" class="img-center-logo"><br> <a href="http://zh.wikipedia.org/wiki/Markdown" target="_blank" rel="noopener">Markdown</a> 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用。看到这里请不要被「标记」、「语言」所迷惑,Markdown 的语法十分简单。常用的标记符号也不超过十个,这种相对于更为复杂的HTML 标记语言来说,Markdown 可谓是十分轻量的,其流行程度已经得到了GitHub和Stack Overflow的广泛支持,学习成本也不需要太多,作为普通人我们也可以轻松上手,结合Hexo我们可以十分优(zhuang)雅(bi)的分享知识,传递快乐。<br>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<category term="Hexo" scheme="http://inplus.top/tags/Hexo/"/>
</entry>
<entry>
<title>小镜头大视角:摄影师用iPhone拍摄乐高人偶的生活</title>
<link href="http://inplus.top/archives/legotwo/"/>
<id>http://inplus.top/archives/legotwo/</id>
<published>2016-01-04T14:51:10.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p>『摄影师』Andrew Whyte:带着乐高小人去旅行</p><p> 乐高玩具在全世界都拥有著无数粉丝,与之相关的《The Lego Movie》也是横扫世界各地的电影票房。当然,乐高玩具人人会玩,可要是想以这些小方块创作出壹些艺术作品的话可就不是那么容易了。如果你找不到什么灵感的话,那不如来看看摄影师 Andrew Whyte 利用乐高玩偶创造的「Legography」系列作品吧。<br> Andrew Whyte 擅长利用长曝光等方式创作变化多端的微观风格摄影作品。在「Legography」系列作品中,他通过技术手段巧妙地将玩偶所处的微观环境以拟人化的形态呈现在大家眼前。玩偶好似壹个现实世界中的真实身影,在不同的场景中展开各种离奇的故事。<br> 想要了解更多有关「Legography」作品的朋友可以访问 Andrew Whyte 的官方网站。</p><p><img src="/assets/blogImg/legotwo/legotwo-1.jpg" class="img-left-suitable"><br><a id="more"></a></p><blockquote><p>手机镜头的视角与相机大不相同,为了达到目标,作者尝试了19次才把相机玩具扔到了正确地位置。</p></blockquote><p><img src="/assets/blogImg/legotwo/legotwo-2.jpg" class="img-left-suitable"></p><blockquote><p>iPhone 4s在低光照的情况下画质不佳,即使这样,这张黄昏时的照片还是可以接受的</p></blockquote><p><img src="/assets/blogImg/legotwo/legotwo-3.jpg" class="img-left-suitable"></p><blockquote><p>很多时候乐高摄影需要趴在地上完成,作者因此也成为了其他游客的拍摄对象</p></blockquote><p><img src="/assets/blogImg/legotwo/legotwo-4.jpg" class="img-left-suitable"></p><blockquote><p>作者收集了许多腿、躯干、帽子的零件,能帮助小人偶进行换装</p></blockquote><p><img src="/assets/blogImg/legotwo/legotwo-5.jpg" class="img-left-suitable"></p><blockquote><p>天气不好的时候拍摄仍没有停止,作者还为小人偶加了件雨衣</p></blockquote><p><img src="/assets/blogImg/legotwo/legotwo-6.jpg" class="img-left-suitable"></p><blockquote><p>有时为了拍摄与野生动物相关的照片,作者遭遇了器械的损坏,甚至还受了伤</p></blockquote><p><img src="/assets/blogImg/legotwo/legotwo-7.jpg" class="img-left-suitable"></p><blockquote><p>拍摄于朴茨茅斯,英国唯一的岛屿城市。</p></blockquote><p><img src="/assets/blogImg/legotwo/legotwo-8.jpg" class="img-left-suitable"></p><blockquote><p>由于人偶的表情不能变化,所以大部分的照片都避开了正面,这是唯一的一张人偶自拍照</p></blockquote><p><img src="/assets/blogImg/legotwo/legotwo-9.jpg" class="img-left-suitable"></p><blockquote><p>SlowShutter实现了作者对于长曝光app的期望,其对焦与曝光锁在黑暗中相当有用</p></blockquote><p><img src="/assets/blogImg/legotwo/legotwo-10.jpg" class="img-left-suitable"></p><blockquote><p>天气一般时,往往尝试了各种滤镜后也不能获得满意的效果。但有时等到第二天早上,就能拍到不需要后期的满意照片</p></blockquote><p> 英国摄影师Andrew Whyte专长于戏剧灯光艺术与对于夜空的长时间曝光,但他最近的一些工作相当引人注目——他为一位一英寸高的小小摄影师拍摄了一组照片。Whyte花了超过一年的时间拍摄了这组称为“乐高摄影师”的系列作品,其中的主角是一个手拿黑色相机的乐高积木人偶。这个小人偶和Whyte一起旅行,一起看日出,一起在伦敦游览。</p><p><img src="/assets/blogImg/legotwo/legotwo-11.jpg" class="img-left-suitable"></p><p> 考虑到便携性,这组乐高摄影是由iPhone完成的,从最初的4s到现在的5s。Whyte使用一款称为645 Pro的应用来获得更多的手动拍摄选项,然后使用Snapseed特效进行后期后上传到乐高摄影的Facebook页面。“作为对于手机摄影的探索,这个项目相当具有启发性,我知道了我能够在几乎任何地方都能用手机拍出高水准的作品。”Whyte说道。另外他还有一些其他的长曝光摄影作品。</p><p><img src="/assets/blogImg/legotwo/legotwo-12.jpg" class="img-left-suitable"></p><p> 英国摄影师Andrew Whyte是一位擅长在弱光环境下创作的职业摄影师。他认为弱光环境下的摄影可以让“光线”和“时间”这两种最具魅力的元素交织在一起。但是在他的整个摄影职业当中,有一个非常重要的摄影项目却并非专注于弱光环境的拍摄,而是一个以乐高玩具小人为主人公的系列作品——《Legography》。</p><p><img src="/assets/blogImg/legotwo/legotwo-13.jpg" class="img-left-suitable"></p><p> 作品中的玩具小人扮演了摄影师的角色,“他”用自己的相机去看世界,而我们也从照片中看到了“他”看到的世界,从作品中你甚至可以读出“他”的性格:执着、专注、勇敢,对摄影有一种热烈的追求,你也能从“他”观看世界的角度中感受到“他”的情绪:思念、好奇、陶醉、孤独……</p><p><img src="/assets/blogImg/legotwo/legotwo-14.jpg" class="img-left-suitable"></p><p> 类似于这样以玩具或者公仔作为摄影兴趣中心的作品相信大家也看过不少。这样的作品很容易具有故事性,也就很容易让我们进入画面,获得情景设置所要传达的感受。</p><p><img src="/assets/blogImg/legotwo/legotwo-15.jpg" class="img-left-suitable"></p><p> 值得一提的是,这个系列的作品均为手机拍摄,并用手机软件修图制作完成。</p><p><img src="/assets/blogImg/legotwo/legotwo-16.jpg" class="img-left-suitable"></p><p> 乐高不一定是小朋友们钟爱的玩具,很多大人也对乐高情有独钟。摄影师Andrew Whyte作为一名“乐高控”,走到哪都要带着他的“Legographer”,于是便有了这一系列照片。</p><p><img src="/assets/blogImg/legotwo/legotwo-17.jpg" class="img-left-suitable"></p><p> Andrew Whyte来自英国,“Legographer”大部分照片拍摄于英格兰南部的著名海滨城市朴茨茅斯。这一系列照片均出自iPhone 4s,拍摄软件为645 Pro Mark II,并经过Snapseed后期处理。这样的拍摄组合另很多人意外,其实Andrew有意想挑战一下手机的弱光拍摄效果,同时也可以达到在实战中提升自己拍摄水平的目的。毫无疑问,他的目的达到了。</p><p><img src="/assets/blogImg/legotwo/legotwo-18.jpg" class="img-left-suitable"></p><p> 英国摄影师Andrew Whyte用镜头记录乐高人偶的英国游记,透过“Mini摄影师”的角度重新看世界!</p><p><img src="/assets/blogImg/legotwo/legotwo-19.jpg" class="img-left-suitable"></p><p> 凭着一点玩心和创意,英国摄影师Andrew Whyte突发奇想,以乐高 (Lego) 小人为主角记录下了他眼中的英伦风光。这位身材小小的“摄影师”相当敬业,克服千难万险拍摄了落日、彩虹等一系列美丽风景。一起来看看吧!</p><p><img src="/assets/blogImg/legotwo/legotwo-20.jpg" class="img-left-suitable"></p><p> 其实,Andrew Whyte不仅为我们带来了一组创意十足的旅行摄影图集,还十分贴心地整理出拍摄这类照片运用的方法和一些注意事项,接下来是“带着乐高小人去旅行”教学篇!</p><p><img src="/assets/blogImg/legotwo/legotwo-21.jpg" class="img-left-suitable"></p><p> 给大家介绍了摄影师Andrew Whyte拍摄的“带着乐高小人去旅行”系列照片,这组照片给人眼前一亮的感觉。其实摄影师不但介绍了这些照片的拍摄背景和器材使用情况,更加难能可贵的是,还为大家总结出了5点拍摄类似专题的注意事项,希望大家看后能有所收获:</p><p><img src="/assets/blogImg/legotwo/legotwo-22.jpg" class="img-left-suitable"></p><p> 寻找一个有趣的故事:任何一个拍摄活动都有主题,这是大家首先要确定的事情。接下来就可以围绕这个主题开始拍摄,可以尝试不同的手法,控制好大场景中的人物比例、小范围的景深问题等。</p><p><img src="/assets/blogImg/legotwo/legotwo-23.jpg" class="img-left-suitable"></p><p> 低角度:有时候我们习惯了同一高度拍摄,却忘了低角度可能有令人意想不到的效果。就像这组照片,很多时候都是贴着水平线拍摄,这样的角度给人新鲜的感觉,把视角低下来没准就能看到另一个世界。</p><p><img src="/assets/blogImg/legotwo/legotwo-24.jpg" class="img-left-suitable"></p><p> 运用技巧弥补:手机拍摄有很大的局限性,但是运用一些小技巧完全可以弥补。例如手机在弱光环境下表现不尽如人意,可以运用手电等照明装置给主体打光;在阴雨天路面积水会反光,这时可以利用影子来遮挡,这样就可以解决光比大的问题了。</p><p><img src="/assets/blogImg/legotwo/legotwo-25.jpg" class="img-left-suitable"></p><p> 反复确定对焦点:刚刚提到了手机拍摄的局限性,所以在拍摄时需要反复确定对焦点,这样才能保证对焦准确。</p><p><img src="/assets/blogImg/legotwo/legotwo-26.jpg" class="img-left-suitable"></p><p> 善于使用App:这组照片使用了645 Pro Mark II和Snapseed,这两个软件搭配使用效果很好。但不意味着大家也要使用,只要运用自己习惯的App,在拍摄是最大限度的发挥其功效,就能拍出满意的照片。</p><p><img src="/assets/blogImg/legotwo/legotwo-27.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-28.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-29.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-30.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-31.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-32.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-33.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-34.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-35.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-36.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-37.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-38.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legotwo/legotwo-39.jpg" class="img-left-suitable"></p>]]></content>
<summary type="html">
<p>『摄影师』Andrew Whyte:带着乐高小人去旅行</p>
<p> 乐高玩具在全世界都拥有著无数粉丝,与之相关的《The Lego Movie》也是横扫世界各地的电影票房。当然,乐高玩具人人会玩,可要是想以这些小方块创作出壹些艺术作品的话可就不是那么容易了。如果你找不到什么灵感的话,那不如来看看摄影师 Andrew Whyte 利用乐高玩偶创造的「Legography」系列作品吧。<br> Andrew Whyte 擅长利用长曝光等方式创作变化多端的微观风格摄影作品。在「Legography」系列作品中,他通过技术手段巧妙地将玩偶所处的微观环境以拟人化的形态呈现在大家眼前。玩偶好似壹个现实世界中的真实身影,在不同的场景中展开各种离奇的故事。<br> 想要了解更多有关「Legography」作品的朋友可以访问 Andrew Whyte 的官方网站。</p>
<p><img src="/assets/blogImg/legotwo/legotwo-1.jpg" class="img-left-suitable"><br>
</summary>
<category term="宇宙之大" scheme="http://inplus.top/tags/%E5%AE%87%E5%AE%99%E4%B9%8B%E5%A4%A7/"/>
</entry>
<entry>
<title>英夫妇带"乐高玩具人偶"全球旅行,另类情侣照获热捧。</title>
<link href="http://inplus.top/archives/legoone/"/>
<id>http://inplus.top/archives/legoone/</id>
<published>2016-01-01T14:32:05.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<p> 英格兰夫妇克雷格·麦克卡特尼(Craig McCartney)与林德赛·哈格蒂(Lindsey Haggerty)正进行“乐高全球旅行”,他们携带着以自己为蓝本、用乐高玩具拼成的情侣假人进行全球旅行,为“乐高情侣”拍摄的另类情侣照网上受热捧。</p><p><img src="/assets/blogImg/legoone/legoone-1.jpg" class="img-left-suitable"></p><p> 麦克卡特尼与哈格蒂正在环球自助游,除了携带背包、地图、照相机外,他们还用乐高玩具拼成人偶,每到一地就用人偶拍照,并将这些另类情侣照传到网上,引发网络风潮。<br><a id="more"></a></p><p><img src="/assets/blogImg/legoone/legoone-2.jpg" class="img-left-suitable"></p><p> 麦克卡特尼与哈格蒂已经去过法国、葡萄牙、西班牙、丹麦、老挝、越南、马来西亚、泰国,目前正在澳大利亚拍照。他们的Facebook帐号已经有数千名“粉丝”。</p><p><img src="/assets/blogImg/legoone/legoone-3.jpg" class="img-left-suitable"></p><p> 麦克卡特尼说:“在我考虑送女友30岁生日礼物时,我看到了乐高相机。这给我了很多灵感,因为我们喜欢多地旅游。而当我们到达新的城市时,哈格蒂总是拍照留念,而我则拿着地图和背包。”</p><p><img src="/assets/blogImg/legoone/legoone-4.jpg" class="img-left-suitable"></p><p> 麦克卡特尼还说:“我做了两个乐高小人儿代表我们两人,乐高哈格蒂身上带着相机,乐高麦克卡特尼则背着包拿着地图,这是我们在巴黎庆祝哈格蒂30岁生日时,我送她的第一份礼物。你可能惊异于我们花费多长时间拍摄到如此恰到好处的照片,因为即使最轻微的风都能将小人儿刮倒,为此我们总是需要找好适当的高度,以固定好它们。”</p><p><img src="/assets/blogImg/legoone/legoone-5.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-6.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-7.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-8.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-9.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-10.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-11.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-12.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-13.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-14.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-15.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-16.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-17.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-18.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-19.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-20.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-21.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-22.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-23.jpg" class="img-left-suitable"></p><p><img src="/assets/blogImg/legoone/legoone-24.jpg" class="img-left-suitable"></p>]]></content>
<summary type="html">
<p> 英格兰夫妇克雷格·麦克卡特尼(Craig McCartney)与林德赛·哈格蒂(Lindsey Haggerty)正进行“乐高全球旅行”,他们携带着以自己为蓝本、用乐高玩具拼成的情侣假人进行全球旅行,为“乐高情侣”拍摄的另类情侣照网上受热捧。</p>
<p><img src="/assets/blogImg/legoone/legoone-1.jpg" class="img-left-suitable"></p>
<p> 麦克卡特尼与哈格蒂正在环球自助游,除了携带背包、地图、照相机外,他们还用乐高玩具拼成人偶,每到一地就用人偶拍照,并将这些另类情侣照传到网上,引发网络风潮。<br>
</summary>
<category term="宇宙之大" scheme="http://inplus.top/tags/%E5%AE%87%E5%AE%99%E4%B9%8B%E5%A4%A7/"/>
</entry>
<entry>
<title>tomcat+java的web程序持续占cpu问题调试</title>
<link href="http://inplus.top/archives/highcpu/"/>
<id>http://inplus.top/archives/highcpu/</id>
<published>2015-12-23T14:17:44.000Z</published>
<updated>2023-02-24T03:13:49.072Z</updated>
<content type="html"><![CDATA[<h3 id="线上应用故障排查之:高CPU占用"><a href="#线上应用故障排查之:高CPU占用" class="headerlink" title="[线上应用故障排查之:高CPU占用]"></a>[线上应用故障排查之:高CPU占用]</h3><p>一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。<br>以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。<br><strong>现象:</strong><br>在tomcat中部署java的web应用程序,过一段时间后出现tomcat的java进程持续占用cpu高达100%,导致web程序访问受阻。<br><strong>可能原因分析:</strong><br>可能程序确实在进行数据计算;或程序进入死循环。<br><a id="more"></a><br><strong>解决方法:</strong></p><ol><li>根据<code>top</code>命令,查看占用cpu的进程PID,发现PID为2738的Java进程占用CPU高达99.9%,出现故障。<br><img src="/assets/blogImg/highcpu/highcpu-1.png" class="img-center-normal"></li><li>通过<code>ps aux | grep PID</code>或<code>ps -ef | grep PID</code>命令,定位具体的进程主体,如是否是tomcat启动的java进程出现了问题。但是,怎么定位到具体线程或者代码呢?<br><img src="/assets/blogImg/highcpu/highcpu-2.png" class="img-center-normal"><br><strong>首先显示线程列表:</strong></li><li>用<code>ps -mp PID -o THREAD,tid,time</code>命令打印出该进程下的线程占用cpu情况<br><img src="/assets/blogImg/highcpu/highcpu-3.jpg" class="img-center-normal"><br><img src="/assets/blogImg/highcpu/highcpu-4.png" class="img-center-normal"><br><strong>找到了耗时最高的线程2804,占用CPU时间快三个半小时了!</strong></li><li>其次用<code>printf "%x\n" TID</code>命令将需要的线程ID转换为16进制格式:<br><img src="/assets/blogImg/highcpu/highcpu-5.jpg" class="img-center-normal"></li><li>最后用<code>jstack PID |grep tid -A 30</code>命令打印线程的堆栈信息:<br><img src="/assets/blogImg/highcpu/highcpu-6.jpg" class="img-center-normal"></li></ol><p><strong>找到出现问题的代码了!</strong></p><p>现在来分析下具体的代码即可:</p><p>找到出现问题的代码,并分析具体函数中是否有可能出现死循环的代码段。<br>通常问题出现在while, for之类的循环代码片段。</p><blockquote><p>AlarmSendListener.run(AlarmSendListener.java:98)<br>SnmpTrapThreads.run(SnmpTrapThreads.java:66)<br>ProduceAlarmEvent.run(ProduceAlarmEvent.java:50)<br><img src="/assets/blogImg/highcpu/highcpu-7.png" class="img-center-normal"></p></blockquote><p><strong>最后,总结下排查CPU故障的方法和技巧有哪些:</strong><br>1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。<br>2、PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。<br>3、jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。<br>4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。</p><hr><p>特别感谢<a href="http://www.blogjava.net/hankchen" target="_blank" rel="noopener">@hankchen</a></p>]]></content>
<summary type="html">
<h3 id="线上应用故障排查之:高CPU占用"><a href="#线上应用故障排查之:高CPU占用" class="headerlink" title="[线上应用故障排查之:高CPU占用]"></a>[线上应用故障排查之:高CPU占用]</h3><p>一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。<br>以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。<br><strong>现象:</strong><br>在tomcat中部署java的web应用程序,过一段时间后出现tomcat的java进程持续占用cpu高达100%,导致web程序访问受阻。<br><strong>可能原因分析:</strong><br>可能程序确实在进行数据计算;或程序进入死循环。<br>
</summary>
<category term="软件开发" scheme="http://inplus.top/tags/%E8%BD%AF%E4%BB%B6%E5%BC%80%E5%8F%91/"/>
<category term="Java" scheme="http://inplus.top/tags/Java/"/>
</entry>
<entry>
<title>化学geek是怎么玩坏表情包的:翻滚吧,苯宝宝!</title>
<link href="http://inplus.top/archives/benzenebaby/"/>
<id>http://inplus.top/archives/benzenebaby/</id>