-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
1078 lines (517 loc) · 431 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
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"?>
<search>
<entry>
<title>秋韵湘乡</title>
<link href="/2024/11/28/%E7%A7%8B%E9%9F%B5%E6%B9%98%E4%B9%A1/"/>
<url>/2024/11/28/%E7%A7%8B%E9%9F%B5%E6%B9%98%E4%B9%A1/</url>
<content type="html"><![CDATA[<p>十一月,在机缘巧合下走进湘西十万大山,看看沈从文笔下的小镇。先来到的地方是芙蓉镇。从长沙出发,当天抵达已是下午。绿藤挂峭,苍翠叠宕。倾泻的瀑布与波光粼粼的水面,倒映着摇曳朦胧的万家灯火,在夜色的衬托下古镇十分惊艳,但吵闹的灯光与扑面而来的商业气息也让我怯步。 </p><span id="more"></span><hr><p>两个小时的车程,从芙蓉镇到保靖县再到龙凤村,路上很多乡间小道不太好走。但当我来到龙凤村的时候,还是觉得此行意义非凡。与世隔绝的山村里的生活在我眼里带着一层神秘面纱,他们传统、淳朴。山村悠然宁静,落叶飘零在小路上,犬吠、鸡鸣回荡在宁静的村庄中。村子里的人,身上沾满了泥土和阳光的味道。 </p><p>夜幕降临,农家院落里的灯逐渐亮起,微风吹拂着,火光闪烁,烧热的火堆旁传来阵阵炊烟,院子里弥漫着炊烟与菜香的味道。村民们围坐在一起,火堆旁传来欢声笑语。 </p><hr><p>秋意渐浓,清晨的薄雾如梦如幻,在山间缭绕,一缕淡淡的晨雾从山间若隐若现地升腾而起,轻轻吻在田野上的露珠和枝叶间,将整个乡村笼罩在一层神秘而宁静的薄纱之中。初升的太阳在山梁后缓缓升起,洒下一缕温暖的晨曦,每一粒尘埃、每一片叶子都因此变得通透明亮。 </p><p>村庄渐渐苏醒,晨起的村民们在门口迎接第一缕阳光,村舍间一阵炊烟袅袅升起,村舍里传来一阵阵炊具碰撞的声音,一切仿佛在这个清晨中沉静而生动。我静静地走过乡间的小路,感受着田野与露水的淡淡清香。</p><p>父亲回忆说,印象最深的一个早上,好像是秋天,婆和我早上走路10多里山里,路上翻过一个小山坳,眼前是一片绵延不断的薄纱样的晨雾,轻轻包绕着大小不一的山丘,山头浮在雾气中,宛如仙境。 </p><hr><p>这里是一个与世隔绝的角落,充满着质朴和生机,仿佛时光在这里流淌得慢了许多,静谧而美好。 </p><p>我想我该走了。</p><hr><p><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1494.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1495.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1496.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1497.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1499.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1498.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1502.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1503.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1504.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1505.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1507.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1506.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1500.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1501.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1508.JPG_compressed.JPEG"><br><img src="https://image.whrblog.online/file/whrblog-image/2024/11/IMG_1509.JPG_compressed.JPEG"> </p>]]></content>
</entry>
<entry>
<title>那些我希望我能早点知道的摄影技术/技巧/经验(转载)</title>
<link href="/2023/05/29/%E9%82%A3%E4%BA%9B%E6%88%91%E5%B8%8C%E6%9C%9B%E6%88%91%E8%83%BD%E6%97%A9%E7%82%B9%E7%9F%A5%E9%81%93%E7%9A%84%E6%91%84%E5%BD%B1%E6%8A%80%E6%9C%AF-%E6%8A%80%E5%B7%A7-%E7%BB%8F%E9%AA%8C/"/>
<url>/2023/05/29/%E9%82%A3%E4%BA%9B%E6%88%91%E5%B8%8C%E6%9C%9B%E6%88%91%E8%83%BD%E6%97%A9%E7%82%B9%E7%9F%A5%E9%81%93%E7%9A%84%E6%91%84%E5%BD%B1%E6%8A%80%E6%9C%AF-%E6%8A%80%E5%B7%A7-%E7%BB%8F%E9%AA%8C/</url>
<content type="html"><![CDATA[<h1 id="摄影是非常私人的事情"><a href="#摄影是非常私人的事情" class="headerlink" title="摄影是非常私人的事情"></a>摄影是非常私人的事情</h1><p>摄影的私人性是一把快乐且痛苦的双刃剑。我们每个人自然都是基于自身的审美去创作的,但往往不一定能受到其他人的认可。一定要记住:你自身和他人的审美都是有缺陷的。而你要做的就是去平衡“做得更好”和“做得更开心”这件事。去做能被他人接受并引领他人审美向上的作品。</p><h1 id="糖水片是形式大于内容的艺术"><a href="#糖水片是形式大于内容的艺术" class="headerlink" title="糖水片是形式大于内容的艺术"></a>糖水片是形式大于内容的艺术</h1><p>糖水片是一种泛指,在我这里它的意思是能让人 “非常直观且快速地获得美学愉悦” 的照片。无论是何题材,如果你的“形式”可以让观众不经理解内容而直接产生美学愉悦,那就是非常好的糖水片。<br>以下图片均为引用,请注意观察一点:即使是小图看不清细节,这些图片依然很美:<br><img src="https://image.whrblog.online/file/whrblog-image/2023/05/20230529162619.png" alt="image.png"></p><h1 id="明暗-gt-色彩-gt-内容"><a href="#明暗-gt-色彩-gt-内容" class="headerlink" title="明暗>色彩>内容"></a>明暗>色彩>内容</h1><p>我们对人的审美机制了解还不够透彻,但人眼提取信息的优先级是比较明确的:明暗>色彩>内容。以这个规律为中心,进而衍生出更高级的审美,以及摄影技巧。<br><img src="https://image.whrblog.online/file/whrblog-image/2023/05/20230529162758.png" alt="image.png"><br><img src="https://image.whrblog.online/file/whrblog-image/2023/05/20230529162855.png" alt="image.png"></p><h2 id="明暗:明暗比例和构成决定构图基本"><a href="#明暗:明暗比例和构成决定构图基本" class="headerlink" title="明暗:明暗比例和构成决定构图基本"></a>明暗:明暗比例和构成决定构图基本</h2><p>人眼的视锥细胞只能分辨三种颜色,而其中有两种颜色(红、绿)在光谱上非常相近。这意味着人实际上色觉分辨能力是很弱的(当然现实中也普遍存在着色盲和色弱现象)。我在后期过程中为了避免色彩干扰我对明度的观察,时常会对照片首先进行去色,调整明度后再还原<br><img src="https://s2.loli.net/2023/05/29/5McBnoOFPIXxNqE.png" alt="image.png"></p><p>顺带一提,HSL(色度,饱和度,明度)这个色彩空间模型就很好地利用了人眼明度与色度观察方式不同这个特点。当你把S也就是饱和度调为0时,此时图片就只剩下了明度——也就是明暗信息。明暗信息是最直接的构图元素,一些摄影师会用彩色相机拍黑白RAW+JPG,为的就是取景时忽略色彩干扰。色彩在后期可以恢复<br>如果你的彩色相机能拍RAW并且有黑白的机内滤镜,你可以尝试使用这个滤镜进行构图练习。在后期时,只要在LR或者C1里面把颜色模式给改回彩色即可恢复彩色。(详细的原因这里就不解释了,总之彩色相机的RAW一定可以恢复出彩色信息。)</p><h2 id="色彩:简化色彩成为色块"><a href="#色彩:简化色彩成为色块" class="headerlink" title="色彩:简化色彩成为色块"></a>色彩:简化色彩成为色块</h2><p>如图所示,人眼更喜欢易与分辨的色块。例如这张色盲测试图,如果你的色觉正常,你会发现你很容易注意到12,然后是74,之后可能是6或者42,最后应该还会有张图不好分辨。而你注意力递减的原因并非内容(数字),而是因为其可分辨性在下降。<br><img src="https://image.whrblog.online/file/whrblog-image/2023/05/20230529161723.png" alt="image.png"><br>色块化:<br><img src="https://image.whrblog.online/file/whrblog-image/2023/05/20230529161849.png" alt="image.png"></p><h2 id="内容:图形,几何和眼"><a href="#内容:图形,几何和眼" class="headerlink" title="内容:图形,几何和眼"></a>内容:图形,几何和眼</h2><p>摄影是一种平面艺术,这意味着所有的深度和尺度信息要靠观众通过他熟悉的元素来脑补。这些熟悉的元素包括但不限于——人的任意部分,特别是眼;“点线面、三角方形圆”之类的图中几何元素;透视消失点。内容可以讲的东西太多了,我自己也没那么高法力。<br><img src="https://image.whrblog.online/file/whrblog-image/2023/05/20230529162010.png" alt="image.png"><br><img src="https://image.whrblog.online/file/whrblog-image/2023/05/20230529162035.png" alt="image.png"><br><img src="https://image.whrblog.online/file/whrblog-image/2023/05/20230529162057.png" alt="image.png"></p><h1 id="拍RAW-JPG"><a href="#拍RAW-JPG" class="headerlink" title="拍RAW+JPG"></a>拍RAW+JPG</h1><p>为什么要拍RAW+JPG?因为对于一个合格的摄影师来说,他所拍摄时预览的画面应该已经接近非常接近最终效果。由于后期软件的技术限制,单凭RAW文件无法完全还原机内硬件ISP渲染的效果,因此保留JPG作为参考极为重要。此外保留JPG还有诸多益处:<br><img src="https://image.whrblog.online/file/whrblog-image/2023/05/20230529162221.png" alt="image.png"><br>在Lightroom里使用RAW+JPG工作流需要做一个小设置:<br>Treat JPEG Files Next To Raw Files As Separate Photos 如图中高亮部分所示。英文版也是类似的设置。<br><img src="https://image.whrblog.online/file/whrblog-image/2023/05/20230529162305.png" alt="image.png"></p><h1 id="呈现比质量重要"><a href="#呈现比质量重要" class="headerlink" title="呈现比质量重要"></a>呈现比质量重要</h1><p>这也是我经历了很多次失望以后才终于承认的现实:内容的呈现形式,在如今的时代,又或许自古以来都是,比内容本身还要重要。创作者一定要思考自己的作品究竟是怎样被呈现的——比如说有没有被互联网平台压图压崩,自己的图片形式是否适合观看平台,比如,手机竖屏状态。<br><img src="https://image.whrblog.online/file/whrblog-image/2023/05/20230529162341.png" alt="image.png"></p><p>转自<a href="https://twitter.com/coco_mizuho/status/1662465168314597376">@coco_mizuho</a></p>]]></content>
<tags>
<tag> 摄影 </tag>
</tags>
</entry>
<entry>
<title>听见阳光</title>
<link href="/2022/12/11/%E5%90%AC%E8%A7%81%E9%98%B3%E5%85%89/"/>
<url>/2022/12/11/%E5%90%AC%E8%A7%81%E9%98%B3%E5%85%89/</url>
<content type="html"><![CDATA[<p>日色穿行在落叶与和风之间,渐变着天际,云卷淡影里,人间恰好能均匀地接受风与光的温柔。微蒙的光褪去蛰伏一夜的寂静,拨开了山海辽阔,穿梭于微隙,在晨露斑驳里折射出一抹黄色暖意,不经意的撩拨,云边也染上些许热烈。 </p><span id="more"></span><hr><p>放了假,日子也松弛下来。阳光把日子拉长,时间的脚步放缓,我看日色澄黄,撩动裙摆由窗棂浸染到室内,晶莹地流动。树叶被风吹得轻晃,阳光破碎一片,像远方的潮水将我从发怔的状态里拉出来。我望着太阳那湛明的体质,不经意间地抬起手想要去辨别它那绚烂交织的色泽,追随它的流动,那一刻,世界仿佛随着那不着痕迹的流动逐渐慢了下来,静了下来。 </p><hr><p>阳光迈着轻盈的步子缓缓映到书桌上,有意无意的跳跃在房间各处,让人不由得心绪紧张,如同期待花开,蓦然醉倒在光影流动里。<br>晌午的日色带着些热烈,整整复斜斜地透过树叶间隙,变成了淡淡的圆圆的轻轻摇曳的光晕,给万物平添了一份暖色。地面上花影浮动,暗香吹拂左右,光霭花气漾开诗的故事,夹带日色温柔的和风轻吻黛山,恍若用梵高的画笔将橘黄色点缀其间,濒蒙一片,像油画般浓郁。 </p><hr><p>从白日行至黄昏,天际由橙黄逐渐染成少女的羞红,在透明如醇蜜的阳光下,人间仿佛浸在糖水罐头里。黄昏的雾气柔和了日色,落日弥漫的霞空像一杯醉人的酒,沿途散播日色温柔。明暗舒展,绚烂的色彩交错变换,橙黄与霞红纵横叠影,橘色的风漫过街角,日落的光晕弥散,川野俱晚,人间岁岁平安。 </p><hr><p>我坐在日落里,望着白鸟衔玫瑰远去,太阳温柔地沉没,微风踮起脚尖轻轻拂过发梢,那一刻,我听见了阳光的声音。 </p><center> <p><img src="https://image.whrblog.online/file/whrblog-image/2022/12/DSC_2832.JPG"></p></center>]]></content>
</entry>
<entry>
<title>威廉·克莱因</title>
<link href="/2022/09/12/%E5%A8%81%E5%BB%89%C2%B7%E5%85%8B%E8%8E%B1%E5%9B%A0/"/>
<url>/2022/09/12/%E5%A8%81%E5%BB%89%C2%B7%E5%85%8B%E8%8E%B1%E5%9B%A0/</url>
<content type="html"><![CDATA[<h1 id="人物"><a href="#人物" class="headerlink" title="人物"></a>人物</h1><p><strong>威廉·克莱因</strong>(1928~2022) 出生于美国纽约一个贫穷的犹太人家庭。克莱因少时极为聪颖,14岁便进入纽约城市学院学习。1945年在大三时就辍学加入美军赴欧洲作战。二战结束后,美军选拔会讲法语且是大学生的士兵到法国索邦大学进修,克莱因顺利入选,进入索邦大学学习超现实绘画与雕塑。复员后,留在巴黎学习绘画,师从法国著名画家费尔南德·莱热。<span id="more"></span> 莱热的画作经常采用抽象的几何形状与色块,用以描绘城市生活与工业题材,<strong>他勇于突破常规的“革新”意识,以及对社会的激进看法,深深影响到克莱因</strong>。因其自我放逐的性格,他转身开始了摄影并很快取得了广泛的知名度。他执导过长篇小说电影、众多短片和长篇纪录片,并制作了250多个电视广告。以其对媒体的讽刺手法以及在新闻摄影和时尚摄影中广泛使用不寻常的摄影技术而著称。他是一位革命性的时尚摄影师。他的照片具有自然采光,高对比度以及标志性的场景和服装的高辨识性。</p><p>1952年,克莱因在意大利举办<strong>油画展览</strong>,结识了一位意大利建筑师,对方希望克莱因制作一批抽象的摄影作品。于是,克莱因回到美国,通过某些关系结识了《时尚》杂志艺术总监亚历山大·利伯曼。后来又提出: </p><blockquote><p>“我想用在欧洲生活了数年后回到祖国的眼睛,做一个有关自己出生城市的摄影记录” </p></blockquote><p>因此,诞生了其代表作品《纽约》。</p><p>1962年,克莱因开始进入电影拍摄领域,后来因威廉·克莱因激进的政治倾向而导致了法国政府的高压,其1969年拍摄的影片《自由先生》被禁映,差点被法国驱逐出境。</p><p>20世纪70年代末,威廉·克莱因重新回归摄影,再度为摄影瞩目。1980年纽约现代艺术博物馆为他举办了大型个人回顾展。</p><h1 id="代表作品"><a href="#代表作品" class="headerlink" title="代表作品"></a>代表作品</h1><p><img src="https://s2.loli.net/2022/09/15/4ADqWyrJZYM9f8a.png" alt="image.png"><br><img src="https://s2.loli.net/2022/09/15/jC25aWBUfutNF9y.png" alt="image.png"><br><img src="https://s2.loli.net/2022/09/15/tDEv3Agkz7RfYCs.png" alt="Gun 1 **Broadway and 103rd Street,New York,1954**"></p><blockquote><p><strong>“好的,首先我已经厌倦了在印刷版上看到它,此外,还被误读了。这是假暴力,只是一个模仿。是我让那个男孩拿枪指着我的镜头的,我拍完照片后我们都笑了,那就像个双面自画像,我既是那个愤怒的男孩,也是那个胆怯的男孩”。</strong> ——From the book《New York 1954-55》Marval,1995</p></blockquote><p>克莱因一生中出版过多部摄影集,包括1958年《罗马》,1964年《莫斯科》、1965年《东京》,但<strong>最为著名的还是第一本画册——《纽约》</strong>(全名: <em>Life is good & Good for you in New York, Trance Witness Revels</em>), 借用了当时流行的一句广告词</p><blockquote><p><em>“生活对你好上加好”</em></p></blockquote><p>书名充满了反讽与反叛。</p><p>《纽约》首版由克莱因亲自编辑、设计,相比于同时代的摄影画册,显得极为前卫。该画册大量使用单张照片跨页、多个图像排列组合、椭圆画框等,大胆使用黑色版面,整本画册充满张力与挑衅性。</p><p><img src="https://s2.loli.net/2022/09/15/FOY7RQTcqPytjXW.png" alt="image.png"><br><img src="https://s2.loli.net/2022/09/15/uNcUTYQwbodOZ7r.png" alt="image.png"><br><img src="https://s2.loli.net/2022/09/15/ShlpNYmBizwMaFn.png" alt="image.png"><br><img src="https://s2.loli.net/2022/09/15/ukDjOdyK5VmqERo.png" alt="image.png"></p><p>拿起相机的克莱因,被最有名的服装杂志——时尚 (<em>VOGUE</em>)的艺术指导亚历山大·林伯门(<em>AlexhnderLiberman</em>)所赏识, 将之聘为时尚的摄影家,林伯门回忆他看到克莱因作品的感受:“他的东西有我在任何其他人的作品所经验不到的暴力,这些照片刺目粗糙而不妥协,然而克莱因却将之捺入一种新的美学里,这些强烈的街头景象,使我感到兴趣,他是破除迷信的天才,攫取他所看到的。”<br>克莱因拍摄时装的手法是前所未有的奇特,他把模特儿由摄影棚带到街头,实施交通管制,雇来作儒、演员,或运上一卡车的蜡像当配角,有时还重新粉刷街面。他将现实世界重新捏造成一个舞台,以便拍 一件新衣服。有人说他是服装摄影的费里尼,表现感知领域的怪诞与 您力。</p><p>克莱因有了《时尚》的丰厚饭票,就尽情的拍摄他的街头照片。他所用的镜头不是趋广角(21mm)就是超望远(500mm),彻头彻尾违反正常的视觉。他认为所谓客观的角度是不存在的,而摄影的工作并不需要客观地去看世界!</p><blockquote><p>“为什么摄影要背负替现实世界做证的重担,布列松下令用广角镜 头是歪曲事实,只有50mm的标准镜头才是正常视觉,而整个时代的 摄影家都将之奉为未来。在我看来广角镜头比标准镜头要来得正常。你甚至可以说50mm是一种局限观点下所受到的惩罚。我们是用两个眼睛在看世界,而相机却只有一个眼睛,无论用什么镜头,任何照片都是双眼所见的事物的扭曲。”<br><img src="https://s2.loli.net/2022/09/15/N3xZHS4XLPsvhA6.jpg" alt="image.png"><br><img src="https://s2.loli.net/2022/09/15/pwna3DZC8JPdKgU.jpg" alt="image.png"><br><img src="https://s2.loli.net/2022/09/15/wWZPue8dC3bT9pB.jpg" alt="image.png"><br><img src="https://s2.loli.net/2022/09/15/mAdC8PV1eEc7O9f.png" alt="image.png"></p></blockquote><p>威廉·克莱因对社会事件的拍摄一改优雅的主流观念,他更注重时代感而不是个人。他拍摄的照片没有精准的画面,却有着宽广的构图和自然的拍摄瞬间,是对逝去时间精彩的记录。他的照片使观看者确信,生命的意义就在于这些短暂的时刻中,可能是转头的瞬间,也可是抬起的手臂。照片的定义丢失,却带来了生动的形式,令人更接近混乱和困惑。</p><p>个性很偏激的克莱因,看事情也有其极偏颇的一面,他的摄影风格也就是建立在极度偏差的视觉角度上,然而他不认为自己是在扭曲什 么。他只觉得他要把自己对世界的感觉,原原本本的表达出来而已。</p><h1 id="大师语录"><a href="#大师语录" class="headerlink" title="大师语录"></a>大师语录</h1><ul><li>我来自摄影圈外,摄影的种种规范无法引起我的兴趣。有些事情,你可以有一台相机去做,却不能用任何其它的媒介。颗粒、反差、模糊,歪斜的取景、故意消减或夸张的色调等。我认为展示摄影的各种可能性是很棒的。</li><li>我一直在做跟以前被训练的完全相反的事情,我只有很少的技术背景,却成了一名摄影师。我选取了一台机器,却用最大的极限刻意使它失灵。对我来说,做一张照片,其实就是在做反摄影的照片。</li><li>有时我宁可拍照时不加瞄准,只想看看到底会发生什么。我会冲着人群”砰、砰“,它一定很像拳击手那样猛戳、绕圈、挨揍,突然有个机会,”砰“的一声正中目标,这是很棒的感觉。</li><li>要做你自己。我更喜欢去看东西,即使它是粗劣笨拙的,看起来不像其他人的作品那样。</li></ul>]]></content>
</entry>
<entry>
<title>尤金·阿杰特——摄影界的“梵高”</title>
<link href="/2022/09/10/%E5%B0%A4%E9%87%91-%E9%98%BF%E6%9D%B0%E7%89%B9/"/>
<url>/2022/09/10/%E5%B0%A4%E9%87%91-%E9%98%BF%E6%9D%B0%E7%89%B9/</url>
<content type="html"><![CDATA[<p>当20世纪20年代美国开始兴起“直接摄影”之时,在遥远的欧洲,尤金·阿杰特,又译为尤金·阿特热(_Eugene.Atget_)早已经在用“直接摄影”这一方式来进行摄影创作了(只是他在生前并不为人们所知)。纵观他的一生,笔者觉得用摄影界“梵高”来比喻是最为恰当不过的。而在梳理他摄影作品的过程中,我们也可以渐渐得出一个结论,那就是摄影从“画意”转变到“直接”是一种历史的必然。 </p><span id="more"></span><h1 id="挫折的生平"><a href="#挫折的生平" class="headerlink" title="挫折的生平"></a>挫折的生平</h1><p>有别于那些摄影史上的伟大摄影师,尤金·阿杰特的生平没有存在夸耀的地方,他只是生活在巴黎的一个普通人罢了。<br>尤金.阿杰特(Eugene.Atget),1857年生于法国的里波恩,五岁的时候父母去世,被祖父母抚养长大,为了生存他从事过绘画、化妆师、海员等多种职业。1879年,他考取了法国国家戏剧艺术学院,后来成为了一名演员。这一职业他从事了十五年之久,但他的演艺生涯却一直没有大的发展。1896年,他因为疾病而声带失声,不得不放弃了戏剧舞台。在19世纪80年代,商业摄影在巴黎逐渐流行,从绘画事业中失败的尤金.阿杰特(Eugene.Atget)在1897年购买了一套老旧的二手大画幅相机,成立了一个小小的商业摄影工作室。1898年至1914年间,阿杰特接受了很多来自市政部门的委托拍摄,同时也将自己的作品销售给政府部门。1906年,巴黎市立历史图书馆委托尤金 阿杰特对巴黎的古老建筑进行系统拍摄。1925年,美国摄影家贝伦妮斯·阿博特(Berenice·Abbott)偶然看到了尤金·阿杰特的照片,并推荐给了曼·雷1927年,尤金·阿杰特在巴黎去世,贝伦妮斯·阿博特将他的遗留作品进行了整理并带到美国。1931年,他的第一部摄影集出版。1969年,美国纽约现代艺术博物馆为他举办了一次重要的回顾展。</p><hr><h1 id="籍籍无名的活在巴黎"><a href="#籍籍无名的活在巴黎" class="headerlink" title="籍籍无名的活在巴黎"></a>籍籍无名的活在巴黎</h1><p>由于身体原因不得不放弃演艺生涯的阿杰特总是需要生存的,他选择了摄影,由于以前有一定的绘画基础,一开始考虑做一名画家,但是迫于生计且没有接受过系统的视觉艺术方面的教育和培训,他成了一名摄影师。 </p><p>另一方面的原因,他希望摄影能够成为一份职业,通过摄影作品销售给他蒙帕纳斯地区的艺术家邻居们获得不错的收益。就如他康帕涅第一街17号门前的广告语:给艺术家的文献。其中包括了:曼雷、郁特里罗、杜诺亚·德·塞贡札克和弗拉芒克这样的画家,还有一些经营场所的店主。</p><hr><h1 id="落后的技术"><a href="#落后的技术" class="headerlink" title="落后的技术"></a>落后的技术</h1><p>1871年,英国一名医生兼业余摄影爱好者R.L.马多克斯(Ric Hard.Lench.Maddox)发明感光“干板”。干板技术的出现为摄影艺术家的创作提供了极大的便利——他们可以随时拍摄。尤金.阿杰特(Eugene.Atget)在摄影过程中使用的就是干板,但在那个时代干板技术是一项比较落后的技术(在1889年,美国的G.伊斯曼发明了硝化纤维透明片基胶片,这种胶片明显更加轻便,形成的影像也更加清晰)。尤金.阿杰特(Eugene.Atget)用干板进行拍摄,用蛋白印相工艺来进行影像制作,这也是一种比较落后的摄影技术。笔者猜测这可能是和尤金.阿杰特(Eugene.Atget)本身的经济状况有着密切的关系——这一点我们可以从他工作室的简陋条件中观察到。</p><p><img src="https://s2.loli.net/2022/09/10/X4E7CGbc8hrs6jT.png" alt="《Atget's Work Room with Contact Printing Frames》,尤金.阿杰特,1910年"></p><p>生存是第一重要的事情,因为以前从事过绘画,尤金.阿杰特(Eugene.Atget)知道那些画家、建筑师和设计师们需要用照片作为创作的素材和样本,所以他开始用这些相对落后的摄影器材和摄影技术来拍摄巴黎的风物人情。但那笨重的相机,脆弱的玻璃干板,繁琐的蛋白印相工艺,都让尤金.阿杰特(Eugene.Atget)的拍摄工作变得艰辛异常,所以他不得不早出晚归的长时间工作。</p><hr><h1 id="超现实主义"><a href="#超现实主义" class="headerlink" title="超现实主义"></a>超现实主义</h1><p>因为穷困潦倒,阿杰特一直用着一台老旧的相机,且因为年久失修很多照片出现因为相场不对导致的暗角。用的工艺是蛋白工艺,玻璃干板的需要长时间曝光才能成像,这也就解释了为什么在阿杰特的照片里面,城市总是空无一人。可能阿杰特为了更好的实现这种效果,总是选择清晨薄雾散去之际,拍摄人烟稀少的巴黎街头,这便是“超现实”的由来。</p><p>在逐渐熟悉摄影这一媒介语言后,尤金.阿杰特(Eugene.Atget)开始展现出自己在摄影艺术上的才华。1906年,巴黎市立历史图书馆委托尤金.阿杰特(Eugene.Atget)对巴黎的古老建筑进行系统拍摄,于是他开始背着自己沉重的大画幅相机游走在巴黎的大街小巷,用平实朴质的视角来系统的记录巴黎的街道河流、建筑雕塑。这一拍,就是20多年。除了拍摄古老建筑,他也拍摄街头商贩、妓女、以及不同地区所流行的娱乐活动等题材。</p><p><img src="https://s2.loli.net/2022/09/10/CUaQE8JGDIR6vKA.png" alt="《Washington Monument as it stood for 25 years》,马修.布雷迪,1860年"><br><img src="https://s2.loli.net/2022/09/10/T8f5LIRWDJgwHeY.png" alt="《Monge square circulation》,尤金.阿杰特,1900——1901年间"><br><img src="https://s2.loli.net/2022/09/10/5X9rWYdi6UbPBal.png" alt="《Chanteuse de rue et joueur d'orgue de Barbarie》尤金.阿杰特,1898年"><br><img src="https://s2.loli.net/2022/09/10/YDcp1t7vNs4ZxJl.png" alt="《Marchand de mèches pour fouets》,尤金.阿杰特,1899年"><br><img src="https://s2.loli.net/2022/09/10/hdY3HMfGux8cZ2X.png" alt="《Wire basket merchant》,尤金.阿杰特,1899年"></p><p>阿杰特并不是漫无目的的拍摄这些景象,他致力于拍摄老巴黎,那个巴黎已经消失在时光里,那是中世纪的巴黎,他拍摄了即将拆除的建筑,记录石头、钢铁、植物等等。特写镜头、全景镜头、细节,以及不同角度、不同时间和光线环境下的景物,他镜头里的世界可以经历岁月和时光的考验。</p><p>1920年11月12日,他在给巴黎历史资料管理处的美术总监保罗莱昂的一封信中总结了自己的摄影生涯:</p><blockquote><p>在过去的20年里,由于我的工作和主动,我收集了16到19世纪的旧巴黎所有古代街道的建筑艺术资料,其形式为摄影版开本18cm x 24cm:旧旅馆、有关历史的奇特房子、漂亮的建筑物正面以及门、镶板、门把手、古老的喷泉、楼梯(木质的和铁质的)、还有巴黎所有教堂的内部(全景和细节),包括巴黎圣母院、圣热尔韦、圣赛弗兰、圣于连、圣艾蒂安,夏尔多内的圣尼古拉教堂等等。这一庞大的艺术记录收集工作现已完成,我可以真实的说我拥有了整个巴黎。</p></blockquote><hr><h1 id="“大师”却是偶然中的必然"><a href="#“大师”却是偶然中的必然" class="headerlink" title="“大师”却是偶然中的必然"></a>“大师”却是偶然中的必然</h1><p>尤金.阿杰特(Eugene.Atget)一生都没有参加过一次摄影展览,也没有出版过一本画册,没有多少人认得这位身材瘦削的摄影老人。但是命运总是眷顾那些有准备的人,1925年美国摄影家贝伦妮斯.阿博特(Berenice.Abbott )偶然间看到了尤金.阿杰特(Eugene Atget)的照片(阿博特当时是艺术家曼.雷的助手,而曼.雷的工作室与阿杰特的住所同在一条街上),十分的喜欢,于是亲自了拜访了尤金.阿杰特(Eugene.Atget),观看并购买了他的一部分作品。多年以后她在谈到阿杰特的照片时,这样写道:“它们给我的影响是迅速的、巨大的,使我一下子认识到这就是毫无矫饰的现实主义。”</p><p><img src="https://s2.loli.net/2022/09/10/tnkDEdXM2jTQAIx.png" alt="《Place Maubert 》,尤金.阿杰特,1908年"></p><p>1927年,尤金.阿杰特(Eugene.Atget)在巴黎去世,贝伦妮斯.阿博特(Berenice.Abbott )将他遗留的作品进行了整理并带到了美国。1931年他的第一部摄影集出版。1969年美国纽约现代艺术博物馆为他举办了一次重要的回顾展从而确立了尤金.阿杰特(Eugene.Atget)在现代摄影史上的重要地位。</p><p><img src="https://s2.loli.net/2022/09/10/8be4MgjsEtipOAv.png" alt="《Rue du Maure》,尤金.阿杰特,1908年"></p><p>曼雷是阿杰特照片的购买者,当时他住在同一条街的31号。曼雷对阿杰的照片印象很深,并在当时超现实主义艺术家的圈子里宣传这些照片;其中三张被发表在1926年的杂志《超现实主义革命》上,另有11张于1929年在斯图加特举办的以现代主义为特征的“胶片与摄影”展上展出。(值得一提的是,阿杰特嘱咐曼雷刊登可以,但是不要附上自己的姓名)</p><p><img src="https://s2.loli.net/2022/09/10/jpz9MahRSNmDxtV.png" alt="《Fontaine Champs Elysees》,尤金.阿杰特,1910年"></p><p>1925年,美国摄影家贝伦妮斯·阿博特偶然间看到了尤金·阿杰特的照片(阿博特当时是艺术家曼·雷的助手,而曼·雷的工作室与阿杰特的住所同在一条街上),十分的喜欢,于是亲自了拜访了尤金·阿杰特,观看并购买了他的一部分作品。多年以后,她在谈到阿杰特的照片时,这样写道:“它们给我的影响是迅速的、巨大的,使我一下子认识到这就是毫无矫饰的现实主义。 </p><p><img src="https://s2.loli.net/2022/09/10/4PVEt9g6LOfSRQv.png" alt="《Vieille Cour, 22 rue Quincampoix》,尤金.阿杰特,1908——1912年间"><br><img src="https://s2.loli.net/2022/09/10/1gdASKFTfBcnJUG.png" alt="《Un coin du quai Montebello》,尤金.阿杰特,1911 年"><br><img src="https://s2.loli.net/2022/09/10/6XPV9hdlGT4pk18.png" alt="《Prostitute with soldier in Paris》,尤金.阿杰特,1920年"><br><img src="https://s2.loli.net/2022/09/10/PBlE16iMXLDySTG.png" alt="《Hairdress, Palais Royal》,尤金.阿杰特, 1926——1927年间"></p><p>1927年,尤金·阿杰特(Eugene·Atget)在巴黎去世,贝伦妮斯·阿博特(Berenice·Abbott )将他遗留的作品进行了整理并带到了美国。1931年,他的第一部摄影集出版。 </p><p><img src="https://s2.loli.net/2022/09/10/hYG5bzOCWR6MoTj.png" alt="《Carrousel》,尤金.阿杰特,1923年"></p><p>约翰•萨考夫斯基基在担任纽约现代艺术博物馆摄影部主任期间,在1969年为尤金阿杰举办了一次重要的回顾展,这次展览确立了阿杰在现代摄影史上的地位。</p><p>约翰•萨考夫斯基在《尤金·阿杰》一书中写到:</p><blockquote><p>“阿杰特的作品之所以令人兴奋,并不在于他规避了空虚、浅薄,而在于他给我们展示了一个陌生的世界,里面充满了我们闻所未闻的节奏和共鸣,充满了对于我们几乎已经忘怀,或许我们从未了解的经历的暗指。”</p></blockquote><p>尤金·阿杰特之所以有这样的地位和这些人的推崇是分不开的,但并不能说他配不上这份成就。</p><hr><h1 id="尤金·阿杰特的风格"><a href="#尤金·阿杰特的风格" class="headerlink" title="尤金·阿杰特的风格"></a><strong>尤金·阿杰特的风格</strong></h1><p>阿杰的风格到底是怎样的呢?他为何会被如此多的摄影家认同和推崇呢?</p><p>《世界摄影史》一书对尤金·阿杰的描述如下:</p><blockquote><p>“阿杰以电影导演拍摄的方式来进行摄影创作,拍摄特写镜头、长焦镜头、细节,以及从不同角度、不同时间和光线环境下进行拍摄,他镜头中的二维世界可以经历岁月和时光的考验。他创作了约1万余幅作品,包括商店橱窗、建筑物入口、拱廊、街景、公共场所和私人花园,还包括街头涌动的人群和从事日常劳动的工人,或者上流社会的生活,他作品中的巴黎亦梦亦幻,但都绝对真实。”而且,在阿杰这里,纪实摄影和艺术摄影并没有形成对立,而是完美地融合在一起,甚至不分彼此,这一点从新近出版的《尤金·阿杰》一书百幅作品中可见一斑,纪实的影像中不无优雅。</p></blockquote><p>《摄影小史》</p><blockquote><p>不管摄影者的技术如何灵巧,也无论拍摄对象如何正襟危坐,观者却感受到有股不可抗拒的想望,要在影像中寻求那极微小的火花,意外的,属于此时此地的;因为有了这火光,“真实”就像彻头彻尾灼透了相中人——观者渴望去寻觅那看不见的地方,那地方,那长久以来已成“过去”分秒的表象之下,如今栖荫着“未来”,如此动人,我们稍一回顾,就能发现。因为对相机说话的大自然,不同于对眼睛说话的大自然:两者会有不同,首先是因相片中的空间而不是人有意识的布局的,而是无意识所编织出来的。</p></blockquote><p>《决斗写真论》</p><blockquote><p>偶然通过相机记录下的世界,或许也听恰当的。亦即阿杰特之所以拍照,并不是因为他已有既定的影像,他只是将镜头对着巴黎的街道上所有的事物,凭借正确的光影原理,将事物烙印在干板上。我们当然无法忽视当时相机、底片的条件决定了他的摄影性格。需要长时间曝光的低感度底片,让街上的行人消失。还有当时无法进行夜间摄影,所以被认为”犯罪现场“的摄影,绝对不是他心中影像的具体化、外在化、而只是必然的结果吧。那个时代的摄影技术决定了阿特热影像的质感,只是难以否认的事实,同时也显示他的摄影并不是摄影家意识渗透的摄影,阿杰特不去意识的部分、没有意识的部分,决定了他摄影的本质。即使现在,我们依然因为观看他的照片而感动,因为通过相机无意识所支配的世界,已经动摇了我们的意识。</p></blockquote><p>《摄影简史》</p><blockquote><p>本雅明对阿杰的评价很高,认为他是“以为被他的职业所排斥的艺术家,他扯掉自己的面具然后去寻求剥去伪装的真实”。他认为,阿杰已经把物体从它的氛围中解放出来,由此他解释说阿杰的照片摆脱了传统摄影师所珍视的那种能让人产生共鸣的气氛:“它们并不孤独,只是缺乏气氛:这些照片中的城市空如平地,仿佛尚未找到一个新的占有者。它们是超现实主义摄影的成就,预示着人类与环境之间的一种有益的疏远,从而为受到政治训练的眼睛清理了场地,因为在这样的眼光下,所有亲近的事物都会对细节的阐明起作用。”换句话说,阿杰的主题是场景之外的,而不是有关他的情感,他让他的观众去观察,去分析,而不是去做梦。</p></blockquote><p>阿杰特的影像既有纪实性也有艺术性,他既是超现实主义的先驱,也影响了后世的纪实摄影和直接摄影。在他的镜头了,我们找不到拍摄者的意图,并没有去刻意的去赋予拍摄主体特定的意义,它们都是绝对真实的、客观的。</p><hr><p>这些都不是最重要的,这并不能说明阿杰特与超现实主义的关系,也没法使曼·雷产生了兴趣,更加不能让本雅明把他的作品看做超现实主义摄影的成就。一定程度都是因为阿杰特把他拍摄的很多东西做了改变。他使得没有生命的东西神奇的复活了,或者更确切地说,他们复活的时候阿杰特恰好注意到了。</p><h1 id="时代的遗憾"><a href="#时代的遗憾" class="headerlink" title="时代的遗憾"></a>时代的遗憾</h1><p>阿杰特对技术的掌握早已登峰造极。可这位大师终其一生活在阴影中。孜孜不倦地默默工作,却忘了在技术上的顶峰插上他的旗帜;因此不少后来者竟以为是他们发现了顶峰,却不知尤金·阿杰特老早之前就已经捷足先登。</p><p>为何如此坚持与专注的阿杰特没有在生前获得世人的认可,原因在于在当时的时代背景下,主流文化还没有将绘画和摄影的各自职能理清楚,这也是为何当时画意摄影风行的原因。这让我想到了稍早于他的印象派梵高,也是生前没有世人认可,被嘲笑为疯子。时代就是这样,伟大的人早于世人发现了美,但却需要世人花时间摆脱既定的理念。</p><p>尤金.阿杰特(Eugene.Atget)在长达30年的拍摄实践中形成了自己独特的观察方式,他将19世纪初巴黎完整的影印在自己的照片里,开创了一种崭新的摄影形式。他拍摄的影像是介于抒情和纪实之间,有一种独特的“超现实”的视觉感受,而这种视觉感受也应和了20世纪20、30年代人们对于现代摄影的一种探索,对后来的摄影艺术家们产生了深远的影响(沃克.埃文斯(Walker.Evans),李.弗莱德兰德((Lee.Friedlander)等人都受其深刻影响)。</p><p>虽然尤金.阿杰特(Eugene.Atget)已经离我们远去了,但他遗留的“巴黎影像”却一直在影响着我们,影响着摄影史,无论他是故意使然还是下意识所为,都对世界摄影发展做出了杰出的贡献,是值得后人学习与借鉴的。</p><p>这样的人有很多,多少伟大的人遭受着时代的遗弃,哥白尼、莫奈、梵高以及阿杰特。这是时代的遗憾,也是他们的遗憾。</p>]]></content>
</entry>
<entry>
<title>沃克·埃文斯的摄影美学</title>
<link href="/2022/09/08/%E6%B2%83%E5%85%8B%C2%B7%E5%9F%83%E6%96%87%E6%96%AF%E7%9A%84%E6%91%84%E5%BD%B1%E7%BE%8E%E5%AD%A6/"/>
<url>/2022/09/08/%E6%B2%83%E5%85%8B%C2%B7%E5%9F%83%E6%96%87%E6%96%AF%E7%9A%84%E6%91%84%E5%BD%B1%E7%BE%8E%E5%AD%A6/</url>
<content type="html"><![CDATA[<blockquote><p>维姬·戈德堡(Vicki Goldberg)是西方摄影评论领域的领军人物之一,以富有说服力和洞察力的文章著称。《光影的要义》(Light Matters)首版于2005年,该书收集了作家写作生涯以来的诸多优秀散文和评论。 </p></blockquote><blockquote><p>戈德堡对摄影的观察深入浅出且包罗万象,她的写作主题跨越极广:从流行影像到战争新闻,从肖像摄影快照亭到可后期数字图像,从乏味无趣的窥视到充满悲剧的现场等等。她还从摄影领域的“大师”作品中提炼出新的启示,其中包括沃克·埃文斯、约瑟夫·寇德卡和黛安·阿勃斯等,并以同样敏锐地视角书写和剖析了比尔·维奥拉(Bill Viola)、森山大道和巴斯蒂安娜·施密特(Bastienne Schmidt)等当代影像先驱者的作品。</p></blockquote><blockquote><p>此外,维姬·戈德堡的著作还包括《摄影的力量:照片如何改变我们的生活》(The Power of Photography: How Photographs Changed Our Lives)、《作为印刷品的摄影:从1816年至今的影像写作》(Photography in Print:Writings from 1816 To the Present)等。1997年,戈德堡获得国际摄影中心(ICP)著名的“无限奖”,1999年,她荣获英国皇家摄影学会的约翰斯顿奖。</p></blockquote><span id="more"></span><hr><p> 耶鲁大学艺术学院院长理查德·本森(Richard Benson)认为,沃克·埃文斯(Walker Evans,1903—1975年)是我们这个时代伟大的艺术家。本森曾经为埃文斯印制过底片,如果谈及毕加索,他或许会有些避重就轻,但若把语境仅仅限定在美国摄影或是美国艺术上,就很难不同意他的观点了。<strong>埃文斯将整个国家的生存状态从被低估和忽视中解救了出来。</strong>破败和遗弃的建筑、手绘招牌上的零星字母、有序的停车坪、杂乱的理发店、空荡的街道、垃圾回收站、废弃的汽车以及疲倦的面容,在埃文斯拍下它们之前,这些事物根本没有什么自命不凡的地位可言。恰恰在没有人关注到这一切时,埃文斯意识到并创造了<strong>无名之物的尊严和无名之辈的成就。<br> 20世纪30年代,埃文斯将民间文化和普通人的生存环境推上了历史舞台的中央,将各种象征物、图形招牌、广告栏以及大量照片都变成了摄影的重要主题,并将纪实摄影提升到了一个新的复杂程度。如同法国大革命让朝臣们脱下蓝色缎子的膝上裤,换上黑色的西装一般,</strong>埃文斯把身披艺术外衣的摄影换上了日常工作服。**<br> 这带来了摄影史上一次悄无声息的革命,它<strong>建立了一套全新的视觉模式和领域。</strong>埃文斯当然不是单枪匹马完成,他只是比别人做得更好。直到三四十年后,才陆续有很多人意识到,一场革命正在进行。但如果我们现在知道,除了上帝,一座没有任何恩典的小木教堂可以如此动人美丽,那是因为埃文斯用他的照片向一个曾对此不屑一顾的国度证明了这一点。 </p><p><img src="https://s2.loli.net/2022/09/08/YakDJ8TwAdt1P2N.png" alt="© Walker Evans"></p><p> 埃文斯的作品对大萧条时期农业安全管理局(Farm Security Administration)的照片产生了十分重要的影响,还包括本·沙恩(Ben Shahn,埃文斯教他摄影)、海伦·莱维特(Helen Levitt)、哈里·卡拉汉(Harry Callahan),以及20世纪五六十年代的主要摄影师,特别是罗伯特·弗兰克(Robert Frank)、李·弗里德兰德(Lee Friedlander,他说,不知道有多少比埃文斯年轻的摄影师们会不受他的影响)以及加里·温诺格兰德(Garry Winogrand,他曾经说,埃文斯的《美国影像》一书让他第一次意识到摄影可以与智慧相接)等人。<br> 埃文斯还在不断影响后继的摄影师,从布鲁斯·戴维森(Bruce Davidson)、乔尔·梅耶罗维茨(Joel Meyerowitz)到罗伯特·劳森伯格(Robert Rauschenberg)、威廉·埃格尔斯顿(William Eggleston)等等,这些采用纪实摄影作为美国现代主义摄影载体的街头摄影师。 </p><p><img src="https://s2.loli.net/2022/09/08/UsMYpinkWyvLeV9.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/08/bkAGtLKVnW5DU32.png" alt="© Walker Evans"></p><p> 埃文斯有时也被认为影响了波普艺术,<strong>他笑称自己是波普艺术的先驱者</strong>,可能是由于60年代对商业文化的痴迷正蓄势待发,艺术家们把埃文斯的影像当成了一种时代的印证。吉姆·迪因(Jim Dine)和安迪·沃霍尔(Andy Warhol)都对埃文斯的作品着迷;沃霍尔甚至将他向劳森伯格致敬的摄影作品干脆命名为《现在让我们赞美伟大的人》(_Let Us Now Praise Famous Men_),这直接取材于埃文斯与詹姆斯·艾吉(James Agee)合作的那本里程碑式著作。<br> <strong>埃文斯对观念艺术也产生了重大影响,甚至对那些试图采用纪实风格的电影也产生了影响,并且很大程度上塑造了我们对大萧条这一历史时期的目光。埃文斯所敲响的音符几乎成了如今我们所处时代的背景音乐。</strong> </p><p><img src="https://s2.loli.net/2022/09/08/tjRlvCYpUfhmgMb.png" alt="© Walker Evans"></p><hr><p><img src="https://s2.loli.net/2022/09/08/vyU2IChQZwHdWSA.png" alt="沃克·埃文斯的室内陈设"></p><p> “沃克·埃文斯”(Walker Evans)是美国大都会艺术博物馆(Metropolitan Museum of Art)举办的第一场关于埃文斯的全面回顾展,它几乎涵盖了埃文斯每个时期的作品,包括他在《财富》杂志工作期间发表的作品以及晚年用宝丽来SX-70所拍摄的照片。时任博物馆摄影部助理馆长杰夫·罗森海姆(Jeff L. Rosenheim)收集了沃克·埃文斯的175张作品,以及该博物馆于1994年收购的各种以前从未展出过的物品,它们作为埃文斯档案的一部分,包括日记、信件、家庭相册、杂志、明信片、书籍等(还包括一份由普林斯顿大学出版社提供的作品目录,随该展览一起展出)。 </p><p><img src="https://s2.loli.net/2022/09/08/ijySbRH8Zp6gVtN.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/08/9vtMAaiByfhndWN.png" alt="© Walker Evans"></p><p> 埃文斯是一位身穿布克兄弟(Brooks Brothers,美国服装品牌)西装的叛逆者。他的父亲是一位广告主管,母亲则是一位社交攀附者。他们曾住在位于芝加哥郊区的肯尼尔沃斯(Kenilworth)和托莱多(Toledo)。沃克本意想成为一名作家,他在大学一年级结束便辍学了,但埃文斯还是通过自己的方式走近了当代文学。从1926年开始,他在巴黎度过了闷闷不乐的一年,回到纽约后发现自己的写作并不很理想,随后摆弄了一阵子相机,但直到1928、1929年才开始认真对待摄影。到了1930年,他对这种媒介的可能性感到非常兴奋,有时甚至认为自己对摄影已经到了疯狂的地步。 </p><p>在摄影还普遍被认为是一个不上台面的行业时,做一名摄影师就已经足够叛逆了。</p><blockquote><p>“我那没品位的父亲……觉得我想做的尽是些调皮捣蛋的事儿,以及想通过摄影把妹……”埃文斯说,“当然,这反而会让我对摄影更感兴趣,事实往往就是这么反常。” </p></blockquote><p> 人若是想叛逆总能找到理由。有人认为20世纪20年代的繁荣表象恰恰暴露了这个国家最糟糕的一面。“我当时真的很反感这个国家,”埃文斯说,“美国几乎成了一个买卖的国度,我想逃离,这一切让我感到恶心。<strong>我的摄影是对保守理念和乐观主义的半自觉反应,是一种对权威的反击。</strong>”<br> 埃文斯决心成为艺术家,在大萧条时期过着勉强糊口的生活,甚至一度穷到不得不卖掉自己的书。<strong>他一生都渴望成为百万富翁,却又鄙视资本主义。但凡身上有一点钱,他就会把它们花在高级酒店或蜡制小腿皮鞋上,以此自娱自乐。</strong>他的一位朋友写道,埃文斯最初对他的兴趣 “源于一件特制的萨维尔街西装(Savile Row,英国伦敦的一条街道,聚集了售卖高档定制男装的店铺),他是如此觊觎这件西装以至于我答应在遗嘱中把它留给他。” <strong>埃文斯不止一次被誉为大艺术家,幸好从来没人拿他的银行账户作为衡量标准。</strong> </p><p><img src="https://s2.loli.net/2022/09/08/JYpoAm8QUuq1TEZ.png" alt="© Walker Evans"></p><hr><p> 受欧洲现代主义运动的影响,埃文斯最初拍摄了一些设计感强烈、角度奇特、城市几何以及带有蒙太奇效果的照片,其中三幅作品于1930年发表在哈特·克兰恩(Hart Crane)的《桥》(_The Bridge_)中。但埃文斯很快就开始了一些新的尝试,他到街头寻找拍摄题材,那些在城市的喧嚣中稍作休息的路人,他们看上去毫无防备,以及随意涂抹在墙上的标语,和微不足道的被摄对象等。<strong>他直接、朴素、甚至粗暴地观察着周围环境,没有任何华丽的修饰,也没有传统的艺术手法。</strong>他迅速地对当时的摄影风格进行了反叛,反对当时被认为摄影界的两位统治者爱德华·斯泰肯(Edward Steichen,太商业化)和阿尔弗雷德·斯蒂格利茨(Alfred Stieglitz,太艺术化)对相机不诚实地使用。 </p><p><img src="https://s2.loli.net/2022/09/08/LdzVUCKIbHc6Bkn.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/08/RJVuhHLyYWoNXaU.png" alt="© Walker Evans"></p><p> <strong>埃文斯对当时报纸上的新闻照片、新闻短片、以及他本人收集的明信片印象都十分深刻,他认为这些照片简洁而真实,据说连房地产经纪人办公室里的照片他都喜欢。</strong> 在他为1933年卡尔顿·比尔斯(Carleton Beals)的著作《古巴罪行》(_The Crime of Cuba_)所拍摄的摄影集中,就有几张关于揭露政府罪行的匿名照片。<strong>这很大程度上表明了埃文斯相信新闻照片所蕴含的力量,以及身为艺术家,埃文斯拥有使用任何素材的权利。在当时的美国,鲜有艺术家能够从新闻照片和新闻短片中获得灵感,但埃文斯做到了这一点。</strong> </p><p> 时机已经趋于成熟。这是一个纪实的年代,而相机(摄影机)正是这个时代的明星,有些电影院甚至整天只放映新闻短片。约翰·多斯·帕索斯(John Dos Passos)的《美国》(U.S.A)三部曲中的部分章节就被命名为“照相机之眼”和“新闻短片”。<strong>在《现在,让我们赞美伟大的人》(_Let Us Now Praise Famous Men_)一书中,艾吉写道:“所有的感受都从原先对真实的想象转变成了如今人们与真实影像的残酷对视。这就是为何照相机在我看来,它更像是一种近似于与辅助设备无关的意识,它是记录我们这个时代最重要的工具。”而埃文斯则十分善于利用它来观察和捕获真实世界的残酷。</strong> </p><p><img src="https://s2.loli.net/2022/09/08/oNXVHesluzERDtm.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/08/MlkIiUs8oRHcYyr.png" alt="© Walker Evans"></p><hr><p> 1931年,林肯·科尔斯坦(Lincoln Kirstein)还在哈佛大学读书时,就创办了一本先锋杂志和一个当代艺术协会,并影响了纽约现代艺术博物馆的建立,他邀请埃文斯去拍摄新英格兰地区的维多利亚式建筑,当时大多数人认为这些建筑并不值得保留。然而埃文斯说,这个还未毕业的学生在教我认真做事,我正在经历一个科尔斯坦式的转变,这其中充满了力量,闪烁着光芒,潇洒且技艺高超,涵盖了对“一切美学问题”真正透彻的领悟。(然而另一方面,科尔斯坦却发现埃文斯总是那么无聊,那么瘦,那么容易疲倦,他猜测或许是他吃得不够好。)</p><p> <strong>埃文斯很喜欢维多利亚时代的建筑,喜欢它们的风雅衰退,喜欢它们那古朴的典雅和装饰性的皱褶,它们的气质在浮华之下显得坚实而得体,仿佛是戴着蕾丝领的朝圣者。</strong> 1933年,科尔斯坦为埃文斯在MoMA举办了一场摄影展,这是美国大型博物馆有史以来的第一次个人摄影展。</p><p><img src="https://s2.loli.net/2022/09/08/7jOdhrcWzTp5ReQ.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/08/KsTeSkEtv4OFygP.png" alt="© Walker Evans"></p><p> 1935年,MoMA聘请埃文斯拍摄非洲雕塑,约翰·契弗(John Cheever)担任他的助手。那一年,当埃文斯在新奥尔良及其周边地区拍摄建筑时,认识了保罗·尼纳斯(Paul Ninas)和他的妻子简·史密斯·尼纳斯(Jane Smith Ninas)(现为简·萨金特),他们都是画家。保罗·尼纳斯有一个情妇,她有时会和这对夫妇一起过夜;当埃文斯和简·尼纳斯相爱时,表面上吃饭跳舞的四人组事实上关系并不稳固。一天晚上,在尼纳斯家的客厅里,保罗用枪指着沃克,让他要么把简带走,要么立即滚出他们的生活。埃文斯因此离开,并随后给简写了一封长长的道歉信,事情便这样结束了。</p><p><img src="https://s2.loli.net/2022/09/08/LsHAw7vGxlEWV6X.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/08/C3ZhDjndiqEb5Ol.png" alt="© Walker Evans"></p><hr><p> 埃文斯受雇于罗伊·斯特莱克(Roy Stryker),他是安置管理局(Resettlement Administration)摄影部负责人,该管理局成立于1935年,后来更名为农业安全管理局——一个旨在为陷入困境的农民提供帮助而成立的新政局。为了赢得公众对该计划的支持,13名FSA摄影师在8年的时间里拍摄了超过7.5万张照片和20万张底片——这是政府相信摄影力量的空前证明,也是对大萧条时期的重要记录。</p><p> <strong>埃文斯不参与政治,不愿接受政府的指导,也不愿相信通过摄影可以进行社会改革。</strong> 但不论如何,埃文斯对FSA的意义至关重要,斯特莱克后来说,埃文斯的照片大大拓展了他对于摄影的认知。埃文斯自己则觉得,其他几位自由摄影师包括多萝西娅·兰格(Dorothea Lange)、罗素·李(Russell Lee)和阿瑟·罗斯坦(Arthur Rothstein)只是偷学了他的风格,并将其应用到整个项目中。简·萨金特说,埃文斯始终对政治保持冷漠,甚至都不参加投票,直到40年代末他才开始投票,还会因此大闹情绪,<strong>其实他一生都在固执地抵抗权威。</strong></p><p> <img src="https://s2.loli.net/2022/09/08/BhgwZEHD6lS4AfV.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/08/MvIJhNdVa82Xxcy.png" alt="© Walker Evans"></p><p> 政府的话埃文斯固然是不爱听的,于是斯特莱克很快发现,埃文斯很少向他报告拍摄进度,只要是在途中拍摄几乎找不到他的行踪,并且他也不完全按照要求去拍摄。由于当时他使用的主力相机是耗费时间的大画幅8×10相机,这种相机要比35毫米相机记录的细节多得多,所以他也没有像其他摄影师那样向管理局发送那么多的照片。于是,斯特莱克在两年多后就把他解雇了。</p><p> <strong>埃文斯强烈反对任何带有宣传意味的事物,不管它们背后的理由看似多么充分。</strong>由于拍摄了佃农的照片而使他多次被误读为社会改革摄影师,这个标签令他难以接受。<strong>“我不会把我的观念和工作政治化……使徒们是不会接纳我这么做的。我不认为一个艺术家能够直接缓解人类的状况,我能做的仅仅是去揭示它。</strong>”同时,埃文斯反对用摄影来做慈善事业,反对摄影背后的虚情假意,反对用影像去声援或利用,以及制造耸人听闻的效应,反对任何将艺术家的个性、情感和政治态度嵌入照片的行为。**</p><p><img src="https://s2.loli.net/2022/09/08/Ef7TXx6w8l1kbHY.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/08/6cIpM41zRKlYxWt.png" alt="© Walker Evans"></p><p> 这种故意将艺术家自身的态度从作品中移除的做法是有先例的。马修·布雷迪(Mathew Brady)和他19世纪的美国同行们所拍摄的照片都是平铺直叙、直截了当的记录,而不是个人化的表达,但那是在摄影被公认为具有艺术气质之前的事;20世纪的前25年,尤金·阿杰(Eugène Atget)在巴黎朴实无华的门廊和商店门面前挖掘出了影像的诗意。埃文斯当然了解这两个人的作品,但他声称他的主要影响来自波德莱尔(Baudelaire)和福楼拜(Flaubert),他希望作者消失在作品中。埃文斯也读过现代主义中“非个人化”作家的作品,正如 T.S.艾略特(T. S. Eliot)所说的那样,“诗歌不是对情感的释放,而是对情感的回避,它不是个性的表达,而是个性的逃离。” <strong>埃文斯开始将他的艺术理念与纪实摄影中平凡朴素、非个人化的修辞融为一体,并拍摄出如他所说的“直白、可信、超验的”影像。</strong></p><p><img src="https://s2.loli.net/2022/09/08/zcZHVKLWtTuIirG.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/08/9G5euhANb4SFWCa.png" alt="© Walker Evans"></p><hr><p> 当然,朴素也只是表面上的。在上世纪40年代,当未来的MoMA摄影部主任约翰·萨考夫斯基(John Szarkowski)(任期为1962—1991年)还是一名大学二年级学生时,他第一次看到埃文斯的《美国影像》(_American Photographs_)一书后十分困惑,甚至一度认为这可能是个恶作剧。如果要以上帝的名义发问,书中的艺术到底在哪里?他说,大部分都只是事实,任何一个有自尊心的大二学生都会认为,只有事实当然不能算艺术。但萨考夫斯基随即改变了自己的想法,在1971年的MoMA回顾展上,埃文斯终于一举成名。</p><p> <strong>1935—1936年,埃文斯的创造力势如破竹,他用影像记录下了一张又一张经典的美国历史,有的甚至是时间的历史,仿佛他目光所及的每一处都在诉说着某种深刻。</strong> 在宾夕法尼亚州的伯利恒(Bethlehem),埃文斯在取景时将墓地作为前景,工人的房子作为中景,工厂作为背景,他利用长焦镜头压缩空间,使三者相互挤压:他们的一生——出生、工作、死亡——都在工厂及其老板的奴役下。 </p><p> 一个女人来到FSA并索要这张照片的复本,当被问及为何需要它时,她回答道:“我想把它送给我的哥哥,他是钢铁公司的主管。我还想在上面写几行字:这里是你的墓场,你的街道,你的建筑,你的钢厂。但这里却有我们的灵魂。愿上帝诅咒你。”</p><p><img src="https://s2.loli.net/2022/09/08/NF4KRxYsyd7azcA.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/08/zXuoGC2lRLAqd6k.png" alt="© Walker Evans"></p><p> 他在一美分证件照相馆(Penny Picture Studio)的橱窗里纪念了无数陌生的肖像,普通公民在这里找到了他们身份的象征。事实上,他们只是通过照片为埃文斯排列出了新的组合,埃文斯则用镜头重新表现了他们,使照相馆摄影师的艺术被转换成了埃文斯自己的艺术,而这样的观念要比主流艺术家早许多年。</p><p><img src="https://s2.loli.net/2022/09/08/Z3taGCMqmjTOByx.png" alt="© Walker Evans"></p><p> <strong>这张照片同时也是对于拍摄和时间的一种重复:相机将这些人保留成记忆,而埃文斯则再一次用相机地保留了他们先前的记忆,只不过是以一种再现的形式。</strong> 橱窗里的婴儿、青少年和穿吊带男人们现在或许都变了,或者消失不见了,他们的照片只是一种面带微笑的替代物。</p><p> <strong>埃文斯以清教徒式的严谨、夏克派(Shaker)式的朴素,以及新教徒式的节俭进行创作,同时在拍摄过程中融入适当的情感与机智,在各种场景、肖像和造型中传达着意义。这就是这个世界,这就是事物的本来面目,悄无声息地诉说着它们各自的历史,它们被建造出来、融入生活、最后被丢弃,如果你仔细观察,它们所经历的一切便会从记录的影像中显现出来。</strong> 一间店面就是一间店面,一条街道就是一条街道,同时它们又不只是这些:它们是人类生活与社会历史经过此地的场所与证明,它们受到传统、贸易和作为必需之物的影响,于是,过往的记忆和未来的期待得以进驻其间。</p><p><img src="https://s2.loli.net/2022/09/08/XR8EFmhQSpcD5tI.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/08/bWAmIYVF1ToOfa6.png" alt="© Walker Evans"></p><p> 1936年夏天,埃文斯向FSA请假,与艾吉一起前往南方,为《财富》杂志撰写一篇关于佃农的文章。埃文斯的情感冷漠,无论是他本人还是在他的照片里都是如此;艾吉则从毛孔中渗透着他心中的内疚与忏悔,谈话时滔滔不绝,势不可挡,就像尼亚加拉河一般。在随后的几年里,每当埃文斯在半夜无精打采地自言自语和蹒跚踱步时,这位饶舌的朋友便会跟进他的卧室,追着他的话题聊天。埃文斯曾经说过:“我对主观表达感到尴尬,包括艾吉的散文,尽管我知道写得确实很棒。我永远也想象不出自己会成为那种有忏悔之心或者表现欲的人。”</p><p> 他们两人与三个佃农家庭相处了几个星期。<strong>埃文斯拍摄人像,大多是让他的拍摄对象自己调整姿态,以及如何面对镜头。</strong> 一位女士害羞又优雅地轻弹了一下她的麻袋裙,这个细微的举动暴露了她的贫穷,而另一位则目光紧盯着镜头,眼神里没有一丝虚荣和自怜。一家人就这样聚在一间卧室里——光着脚,穿着脏衣服,露着擦破皮的小腿。</p><p> 男孩半裸着身子,开心地笑着,其余的人则神情肃穆,像是在评价眼前的这位摄影师。他们的状态仿佛带着某种<strong>模糊而晦涩的尊严</strong>,就像是银版照片中的商人家庭一样。</p><p><img src="https://s2.loli.net/2022/09/09/yVdHa6j4oJQECnP.png" alt="© Walker Evans"></p><p> <strong>埃文斯拒绝将摄影政治化,以及利用摄影进行宣讲和鼓吹,这样就使得职业摄影师与非职业摄影师、观看者与被观看者之间的差异变得平等起来。埃文斯坚持认为,人类作为自身本来就具有足够的价值,不应该遭到他人的反对,更不应该去反对自身,应根据他们自身的条件和状况进行拍摄,而不是去强加某种慈善的、带有偏见的目光,以及下意识地用阶级概念去打量他们。</strong></p><p><img src="https://s2.loli.net/2022/09/09/E71tRcXkuUGO4aM.png" alt="© Walker Evans"></p><p> 有人说,埃文斯以剥削者的目光拍摄了这些家庭,让他们看起来比实际情况更糟糕,但威廉·克里森伯里(William Christenberry)在20世纪60年代第一次看到这些照片时,认出了其中的一个家庭就住在他祖父母家附近,于是他把这本书拿给照片中的一个孩子看,那个孩子说:“我们喜欢吉米先生和沃克先生,他们会给我们送圣诞礼物。”</p><p> 埃文斯拍下了佃农们手工建造的简陋房屋,以及他们破旧的内部陈设。房间布局和采光都经过精心地设计,仿佛维米尔(Johannes Vermeer)在创作前准备一桌食物。他也拍摄南方的城镇,孤零零的商店和吟游艺人的海报,以及在长椅上久坐却连他们自己也不知在等待什么的人们。<strong>这些对建筑、街道和倦容的面无表情记录,是历史文本、文化记述、对国家的批判,甚至是对人类状况的严肃审视。埃文斯非常清楚相机与历史之间的紧密关系,他曾写道,他“感兴趣于任何一个当下成为过去的样子”。</strong></p><p><img src="https://s2.loli.net/2022/09/09/H36xlVj14uGCNht.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/09/fVPagsbZM13ETw6.png" alt="© Walker Evans"></p><hr><p> 艾吉的文章篇幅太长加上交稿很晚,于是《财富》杂志没有进行刊登。直到1941年,《现在,让我们赞美伟大的人》才以成书形式出版,埃文斯的照片(按照他所坚持的想法)被分组放在扉页前,没有文字说明,悄无声息地吐露着寻常百姓的秘密,也揭示着在他们被微薄收入与艰辛劳动所充斥的无序生活背后的普遍规律。</p><p> 评论家莱昂内尔·特里林(Lionel Trilling)称此书是“我们这一代美国人无比真实和重要的道德坚守”,只不过随着欧洲进入战争状态以及大萧条开始好转,没有引起人们的兴趣,于是《现在,让我们赞美伟大的人》在当时只卖了六百多本。</p><p> 1938年,现代艺术博物馆举办了“沃克·埃文斯:美国影像”(Walker Evans: American photos)主题摄影展,这是一场共有100张照片的回顾展,还附带了一份目录。<strong>这本书既是一首史诗,也是一首挽歌,其主题就是美国文化——这便是这个国家亲手创造出的一切;这便是美国梦所能够支撑的一切;在历史的回荡中,一切都在经历着无声的衰败,在时间的压榨下,一切都在悄然坍塌。</strong></p><p><img src="https://s2.loli.net/2022/09/09/oQGmHTB8DhKAJUr.png" alt="《美国影像》展览现场,MoMA,纽约"></p><p> 埃文斯把书中的照片分为两组,没有备注相关说明。开放式的照片和人物肖像不仅注解了眼前的所见,也注解了所有图像的传播。然后是各种汽车的照片,包括堆放在一起只剩下车骨架的报废车场,路上的行人,寂寞的街道,大萧条中的难民,一位矿工住房的墙上宣称美好生活的广告,所有的这一切都在悄无声息的摄影中被衬托出来,没有一丝脚步声,只剩下时间流逝时无人知晓的叹息。</p><p> 在本书的第二部分,几乎没有人物在这里出现,空荡荡的街道和房屋排成行,似乎在沉睡中等待着被唤醒。这一部分以一张遗迹照片作为开始,这是一张被破碎的锡制残片,上面印着古典图案,这些残片依旧诉说着欧洲上层阶级对锡制品的渴望。接下来的照片里,是围绕着工厂和铁路而建的城镇,田地和工业厂房仿佛在吞噬着它们,随后是一些光板的教堂和房屋。随着书页的翻动,这些建筑的装饰也变得越来越精致,直到书的结尾处出现了另一件锡制遗物——又一份在艰难时期对华丽生活的憧憬——这便是美国文化,它们被无名的建设者和工匠们所创造,它们试图在一切困局被破除之前努力让此刻的平庸变得美好。埃文斯曾经说过:“我着迷于人类的作品和人类的文明。事实上,我认为这是世界上最有趣的事情,即人创造的一切。”</p><p><img src="https://s2.loli.net/2022/09/09/I1wDeHtKrFXSsmz.png" alt="© Walker Evans"></p><p> <strong>编辑顺序对埃文斯而言至关重要,他的照片在与其他照片的呼应和互动中改变着意义。</strong>在第一部分接近尾声时,几栋陈旧的房屋前,卡洛尔·隆巴德(Carole Lombard)的电影的海报暗示着好莱坞式的梦幻生活,然而,当我们继续向后翻两页就会发现,那些做梦的人,竟然是一群躺在路边、无处安睡的失业者,而在这一部分的的最后一张照片,则是一颗被连根拔起的大树倒在了一座荒废的种植园房屋面前,这喻示着一种无法实现且最终化为乌有的生活梦想。</p><p> 隐匿在作品中的埃文斯希望读者们多花一些时间,在照片相互关涉的过程中去建立我们自己与生活的联系并得出结论。埃文斯问过许多观众一个问题,即生活的目标是否只是即刻的满足,他想说的是,虽然总有一些画刊能让人获得当下的愉悦,比如《生活》(_Life_)杂志(他讨厌的那种),但诗歌王国却不是那么容易建造的。</p><p><img src="https://s2.loli.net/2022/09/09/pK2eM57iO6FdJrD.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/09/1bWqVBUnZui74f3.png" alt="© Walker Evans"></p><p> 关于《美国影像》,威廉·卡洛斯·威廉姆斯(William Carlos Williams)曾写道, **“它使我们照见自己,让我们得以从狭隘的认知中抽离出来。我们看到了至今未曾意识到的真相,作为无名之辈,我们于此刻赋予自身以价值。”</p><p> 另一部分人则认为这本书带有偏见,在这个国家需要正面鼓舞时却充满抱怨,以这样的方式批评自己的国家是不公正的。安塞尔·亚当斯(Ansel Adams)在写给爱德华·韦斯顿(Edward Weston)信中说:“我真他妈的对那些美国左派们的言论感到气愤。”</p><p> 在新奥尔良,保罗·尼纳斯给他的妻子看了写有她名字缩写(J.S.N.)的献词页,这让她十分惊讶。这是简自从三年前埃文斯写给她的告别信以来,第一次收到他的消息。随后埃文斯开始了秘密通信,他在写给简朋友的信中塞进好运签大小的纸条。由于简同样拒绝再回到已经支离破碎的婚姻,于是找了个借口去了东部,并在1939年终于搬到了埃文斯那里。在MoMA展览之后,埃文斯无可争议地成为了大师,至少在当时少数关注摄影的人看来是这样,虽然他依旧找不到工作。有时艾吉会给他们10美元,好让他们熬过眼前一个礼拜。就这样,简和保罗离婚了,并在1941年一时兴起地和埃文斯结了婚。</p><p><img src="https://s2.loli.net/2022/09/09/hvu6a7Tt4Iyj2wq.png" alt="© Walker Evans"></p><hr><p> 埃文斯性格复杂,年轻时就容易陷入抑郁。据说他有身上一种聚光灯式的魅力,以致一进屋就仿佛照亮整个房间。二战期间,《时代》(_Time_)周刊的同事詹姆斯·斯特恩(James Stern)这样描述这位多重定义的男人:“<strong>沃克·埃文斯是个知识分子,一位教育家,一个忧郁症患者,一个讲究体面的人,一个花花公子——我想说情人来着。我知道有一些女性爱他、仰慕他,但觉得他有些古怪,还有些无赖。</strong>”德克萨斯大学(University of Texas)美国研究和英文教授比尔·斯托特(Bill Stott)在晚年认识了埃文斯,他说,<strong>埃文斯的谈话风格“总体上是精彩和浮夸的,充满了格言式的语句。</strong>”</p><p> 埃文斯还有鬼才般聪明的一面。艺术家玛丽·弗兰克(Mary Frank)说,有一年,埃文斯没有收到预期去科德角的邀请,随后她便收到了埃文斯寄来的一封信,大意是这样说的:“亲爱的沃克,在这里真是太美妙了,唯一的问题是我非常想念你……请告诉我你什么时候能来,”并署名“玛丽”,最后他还是来了,并且一副满怀感激的样子。</p><p><img src="https://s2.loli.net/2022/09/09/qS9b2xPHiDvjGJR.png" alt="© Walker Evans"></p><p> 有一次,当理查德·本森打印完埃文斯的代表作时,有人向埃文斯建议在三个空画框上签名,以防画框一旦损坏需要更换。艺术家的签名是很有价值的,但埃文斯却慷慨地同意了:他的签名一个是“亚伯拉罕·林肯”(Abraham Lincoln),一个是“沃尔特·惠特曼”(Walt Whitman),还有一个是“拉尔夫·沃尔多·爱默生”(Ralph Waldo Emerson)。(<strong>埃文斯在1971年回顾展的序言中引用了惠特曼的一句话:我不怀疑,在那些琐碎的事物、昆虫、粗人、奴隶、侏儒、芦苇、被摈弃的废物中,所包含的雄伟和美好远多于我的想象……</strong>)</p><p> 1938年,埃文斯有了新的拍摄项目,在地铁里拍摄毫无防备的乘客。他像个游客一样把康泰时相机(Contax)挂在脖子上,但他既不用手去碰它,也不把它举起来取景,所以没有人意识到他是通过一根从袖子里穿到手上的快门线来拍摄的。他在地下抓拍那些毫不知情的陌生人,他们放下戒备,坦白着自己的表情。光线昏暗,列车摇晃,相机被他有效地固定住,他依靠运气把拍摄目标锁定在对面的长椅上。他故意放弃了对影像的控制,去拍摄那些无意中同样放弃对自己的影像控制的人们。没有人再去提醒他们“笑一个”,埃文斯把偶然性引入了摄影领域,而在这个领域,肖像摄影从未如此偶然过。</p><p><img src="https://s2.loli.net/2022/09/09/CrVkaS5PWvdsIyK.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/09/J2nqHtk1hRz8OsY.png" alt="© Walker Evans"></p><p> 这些照片在很长一段时间内都没有发表,直到MoMA在1966年展出了它们,一本名为《众人受到召唤》(_Many Are Called_)的影集为它们带来了不少读者。埃文斯很清楚这些照片具有多大的侵略性,他曾称自己是一个“忏悔的间谍和歉意的偷窥者”。这些照片是通往个人隐私被普遍侵犯道路上的重要标志之一。埃文斯把它们看作是一种清单式的“民众”影像,其中包含了30年代的重要特征:“如同相机所拍下的那样,你在他们中间分辨不出哪些是法官、参议员或银行行长的面孔。你所看到的是即刻清醒的、惊愕的或者平淡无奇的表情:仿佛陪审团里坐着的女士们和先生们。”</p><p> 从1943年到1945年,埃文斯为《时代》杂志撰写电影评论,有时也评论艺术和书籍。由于当时的汽油和胶卷都是稀缺物(译者注:二战时期美国政府对民众生活物资实行配给制),这给摄影带来了困难,而他即便有一份全职工作,却总是缺乏充沛的精力去胜任,似乎也没有足够的想法让他带着相机出门。同时,由于当时没有人委托他做专题拍摄,这种境况令他一度十分低迷,而且他很可能知道自己的状态已经非常糟糕。但不论如何他还在写作,正如他一直以来渴望的那样。他喜欢流行电影,就像他喜欢民间风格的建筑一样。在评论电影《康尼岛》(Coney Island)(1943年上映,沃尔特·朗执导)时,他说:“这部电影的彩色摄影会让许多观众羡慕不已。接下来,他们终于可以尽情地谈论漂亮的贝蒂·格拉布尔(Betty Grable)了。”</p><p><img src="https://s2.loli.net/2022/09/09/mBD7U8QKgjYxyr1.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/09/yOwmsK4DtEoJjFl.png" alt="© Walker Evans"></p><p> 1945年,埃文斯作为唯一的职业摄影师加入了《财富》杂志,后来成为该杂志的特约摄影编辑。但他的内心一直对在资本主义的老巢里做艺术家感到十分矛盾,他设法保持自己的独立性,并在随后的20年里,努力做了一些他想做的事。他时不时地和上级领导见面,试图传达一些自己的想法,然后就带着相机出门了,有时几个月都不回来。埃文斯是个相当有说服力的人,他先成功说服了政府部门,随后又说服卢斯帝国(Luce empire)给他资金,好让他在自己的快乐时光里随心所欲。在20多年的时间里,他先后在《财富》杂志发表了大约40篇作品集和摄影随笔,其中包括几篇关于他的明信片收藏的随笔。</p><p> 即便不会常有灵感出现,埃文斯仍在不停探索。他通过在街道上设置一个固定位置来拍摄路人,以此关注主体的不在场和影像失去人为控制的问题;他还透过行驶的列车窗户拍下路过的景象;他虽声称彩色摄影是粗俗的,却依旧发表了几篇关于彩色摄影的文章;并且,在芝加哥的街道上,新英格兰的旧旅馆里,陈旧的车站里,以及老旧的办公家具中,埃文斯一直在用影像探寻美国人的生活传统是如何被塑造和延续的。</p><p><img src="https://s2.loli.net/2022/09/09/JWhRceAUd5Ignw1.png" alt="© Walker Evans"></p><hr><p> 埃文斯和简在一起的时间变得越来越少,在他的社交生活中渐渐失去了她的身影,以至于埃文斯的一些朋友和同事都不知道他已经结婚了。埃文斯一生都确信自己是艺术家,当他和简吵架时,他甚至会说,“你难道不知道我是谁吗!” 当简终于在画廊开办展览,并尝到了一点成功的滋味时,埃文斯竟认为这是在和他竞争。绘画对于简而言已经举步维艰,1955年,简终于离开了他,与另一个男人结了婚。</p><p> 1959年,埃文斯结识了瑞士设计师伊莎贝尔·博舍斯坦·冯·斯泰格(Isabelle Boeschenstein von Steiger,现在是Storey),她漂亮、老练,比埃文斯年轻近30岁,一年半后,她与丈夫离婚并嫁给了埃文斯。埃文斯当时的朋友既包括莱昂内尔(Lionel)和戴安娜·特林(Diana Trilling)、玛丽·麦卡锡(Mary McCarthy)、埃德蒙·威尔逊(Edmund Wilson)等文艺界人士,也包括玛丽·弗兰克(Mary Frank)和罗伯特·弗兰克(Robert Frank)在内的波希米亚艺术家群体,但埃文斯习惯把他的熟人圈子分开交往。伊莎贝尔·斯托里(Isabelle Storey)说,她刚认识他时,他社交频繁,经常和乔克·惠特尼(Jock Whitney)等人在一起。作为一名艺术家和叛逆者,埃文斯的内心并不算封闭。“他是一个身穿礼服的艺术家,”斯托里说,“那时的我们被到处邀请。”</p><p> 1964年,埃文斯先被邀请到耶鲁大学做演讲,随后开始在那儿授课。埃文斯会厚着脸皮让学生们为他提供各种帮助,包括借钱,但学生们认为埃文斯是名人,能够为他提供帮助是一种荣幸,当然埃文斯对他们也同样慷慨。他随后退出了《财富》杂志,因为当时他的身价已非杂志所能负担。他和伊莎贝尔在康涅狄格州的莱姆(Lyme)建了一栋房子,然而这时他们的婚姻已陷入困境。埃文斯开始酗酒,当他的妻子在瑞士教了一个学期的课后,埃文斯指控她抛弃了他。尽管埃文斯对女人有着巨大的吸引力,他对女人也很着迷,但他骨子里始终是一个爱德华时代的绅士,他无法想象一个女人在任何方面都与自己平起平坐,于是在1971年,伊莎贝尔·斯托里离开了他。</p><p><img src="https://s2.loli.net/2022/09/09/wLBjWfZg81nsMlJ.png" alt="© Walker Evans"></p><p><img src="https://s2.loli.net/2022/09/09/xywn5FjUINpck9f.png" alt="© Walker Evans"></p><p> 就在1973年,也就是埃文斯去世前两年,他给自己买了一台宝丽来SX-70相机。这时的他已是体弱多病,但由于这台相机使用起来十分方便,他对摄影又重新产生了兴趣。埃文斯的拍摄十分密集,在大约8个月的时间里拍摄了2400多张照片:人物特写、日常建筑、室内景物、各类标志等等。直到现在,见到这些作品的人依然不多。</p><p> <strong>晚年的埃文斯是一个痴迷的收藏家,他热衷于收集废旧物、票根和各类贝壳,有时还用它们来做拼贴画。</strong> 家中的后院固然被这些物品塞满,甚至连他的半张床都被盖住了,要想把埃文斯自己瘦弱的身体顺利躺平,就必须先把床上的东西推到一边。有一次,他买下了一整个院子的拍卖品,并借来了一辆卡车,把它们全部丢在了朋友处的草坪上。他还收集各类招牌,甚至唆使年轻朋友帮他在人流密集的路上偷窃招牌。有一次,威廉·克里森伯里突然意识到自己刚刚干了什么,他问埃文斯,如果警察拦住他们该怎么做。“哦,见鬼,”埃文斯说,“我会告诉他们,这是大学生联谊会搞的恶作剧。”那时的他已经快七十岁了。</p><p><img src="https://s2.loli.net/2022/09/09/ywkMtpiJQP8Agur.png" alt="© Walker Evans"></p><p> 埃文斯在这一时期的照片有着独特的民间气息,各类手绘招牌,广告牌,破旧的遗物,还包括一些生活中的边缘手工艺品等等,晚年的埃文斯只是单纯地把它们带回家。<strong>他将这些庸常的手工艺品提升为大众的普遍认知,并以此暗示,如果将它们按照一定的顺序排列组合,就会幻化成全新的音符弹奏出一个民族的曲调,它们也确实传递出了悲壮的旋律,同时保持着一个国家的历史特有的节拍。即使在今天,它们依然在这片土地上回响。</strong></p><hr><p><strong>作者</strong></p><p>维姬·戈德堡(Vicki Goldberg)是西方摄影评论领域的领军人物之一,以富有说服力和洞察力的文章著称。《光影的要义》(Light Matters)首版于2005年,该书收集了作家写作生涯以来的诸多优秀散文和评论。</p><p><strong>译者</strong></p><p>南艺翻译小组是由南京艺术学院传媒学院曹昆萍副教授率领摄影专业在读硕士生组成的翻译团队,致力于将国外优秀的摄影文论引入国内,以飱广大摄影专业人士及爱好者。</p><p><a href="https://mp.weixin.qq.com/s/vDnjdeongwg5oAc5CaDBiw">原文</a></p>]]></content>
</entry>
<entry>
<title>旅行的意义是什么?</title>
<link href="/2022/02/15/%E6%97%85%E8%A1%8C%E7%9A%84%E6%84%8F%E4%B9%89%E6%98%AF%E4%BB%80%E4%B9%88/"/>
<url>/2022/02/15/%E6%97%85%E8%A1%8C%E7%9A%84%E6%84%8F%E4%B9%89%E6%98%AF%E4%BB%80%E4%B9%88/</url>
<content type="html"><![CDATA[<p>喜欢独自旅行,“在路上”已成为一种生活姿态。</p><p>经常被问到“旅行的意义是什么”,想想在人生不同阶段,答案也有所不同。<br>旅行,一开始是出于炫耀,当在每一个到过的地方贴上“到此一游”的标签后,也就有了不甘人后的底气,有了谈资,继而增添了履历,满足了虚荣心,这是一种眼睛的旅行。 </p><hr><span id="more"></span><p>后来是为了学习。“读万卷书,行万里路。”读书是一种纸上的旅行,旅行是一种路上的读书,谁都无法代替谁,当用开放心态去触摸未知世界时,生活会变得充实而灵动,这是一种头脑的旅行。<br>再后来发现,旅行就是旅行,自有独特价值。于行者而言,星辰与大海既是初心,也是终点;既在路上,也在当下;既是远方,也是家园;这是一种心灵的旅行。 </p><hr><blockquote><p>“旅人叩过每个陌生人的门/才找到自己的家/人只有在外面四处漂泊/才能到达内心最深的殿堂。” ——泰戈尔</p></blockquote><hr><p>一路走来,欣赏过那么多壮丽的景色,了解过那么多奇特的风情,接触过那么多陌生的脸孔,发生过那么多感人的故事,历经过那么多艰苦的磨练,不为炫耀,不为猎奇,更非走向虚无,而是更加认识自己。 路上是一个不断怀疑、否定、推翻、重建与求证的过程,一个忍受痛苦与挣扎的蜕变与重生的过程,一个不断告别过去、享受当下与寻找未来的过程。</p><p>如果风景与经历没有刻在心上,没有在远行中成长,那走得再远,也只是邮差。 “一个人的行走范围,就是他的世界。”当反思生活中的种种成败得失时,也许远行中曾经流连的一处风景、一个细节、一种心态就会涌上心头,让思考更宽广、更扎实,让人生选择时有丰富的可能性,而不会被眼前的世界所局限。</p><p>旅行的意义并不在于一个个具体的世俗目的,但事实上旅行的“名利”价值无处不在,而且是构建人生坐标的基石。 知乎上有个高赞的问答:“我读过很多书,但后来大部分都忘记了,你说这样的阅读究竟有什么意义?”“当我还是个孩子时,我吃过很多食物,现在已经记不起来吃过什么了。但可以肯定的是,它们中的一部分已经长成我的骨头和肉。”读书如此,旅行亦如此。<br>旅行是一场感动,一场旅心,一场修行。走出去是为了走回来,只有清楚世界的方位,才能找到自身的定位。<br>当跋涉过岁月与山河,挣扎过月亮与六便士,旅行成为身体和灵魂的一部分后,你会发现自己想要什么样的风景,什么样的生活,继而找到一条适合自己的路,找到自己最舒服的状态。那时,你已找到归途,找到自我,找到心安之家了;那时,你已懂得善待自己,成全自己,成为自己了。</p><hr>]]></content>
</entry>
<entry>
<title>2021的尾声—My Lonely Moment</title>
<link href="/2022/01/31/2021%E7%9A%84%E5%B0%BE%E5%A3%B0%E2%80%94My-Lonely-Moment/"/>
<url>/2022/01/31/2021%E7%9A%84%E5%B0%BE%E5%A3%B0%E2%80%94My-Lonely-Moment/</url>
<content type="html"><![CDATA[<p>在 2021 的最后,独自一人<br>窗外弥漫的雾气<br>一瞬,又一瞬<br>“之后能做什么呢”<br>转身,<br>光芒涌现 </p><hr><span id="more"></span><div id="player"></div><script type="text/javascript" src="https://player.dogecloud.com/js/loader"></script><script type="text/javascript">var player = new DogePlayer({ container: document.getElementById('player'), userId: 1131, vcode: '4d215f84a8d12d66', autoPlay: false});</script>]]></content>
</entry>
<entry>
<title>柯达克罗姆彩色反转片的冲洗(转)</title>
<link href="/2021/10/29/%E6%9F%AF%E8%BE%BE%E5%85%8B%E7%BD%97%E5%A7%86%E5%BD%A9%E8%89%B2%E5%8F%8D%E8%BD%AC%E7%89%87%E7%9A%84%E5%86%B2%E6%B4%97%EF%BC%88%E8%BD%AC%EF%BC%89/"/>
<url>/2021/10/29/%E6%9F%AF%E8%BE%BE%E5%85%8B%E7%BD%97%E5%A7%86%E5%BD%A9%E8%89%B2%E5%8F%8D%E8%BD%AC%E7%89%87%E7%9A%84%E5%86%B2%E6%B4%97%EF%BC%88%E8%BD%AC%EF%BC%89/</url>
<content type="html"><![CDATA[<h1 id="关于柯达克罗姆彩色反转片的概况"><a href="#关于柯达克罗姆彩色反转片的概况" class="headerlink" title="关于柯达克罗姆彩色反转片的概况"></a>关于柯达克罗姆彩色反转片的概况</h1><p>柯达公司从1936年开始生产外式法柯达克罗姆色彩反转片,目前共生产三个品种,即:柯达克罗姆25、柯达克罗姆40和柯达克罗姆64。25型和64型是日光型,40型是灯光片。<br>柯达克罗姆彩色反转片的感光度都比较低,25型为ASA25,40型为ASA40,64型为ASA64。它们的共同特点是颗粒细、清晰度高和色彩还原好,主要供作为幻灯片使用。<br>柯达克罗姆胶片的冲洗工艺代号为K14,但原厂既不不公布配方,也不供应成药,只能寄回原厂或原厂指定的代理公司冲洗。</p><hr><span id="more"></span><hr><h1 id="柯达克罗姆彩色胶片的构造"><a href="#柯达克罗姆彩色胶片的构造" class="headerlink" title="柯达克罗姆彩色胶片的构造"></a>柯达克罗姆彩色胶片的构造</h1><p>柯达克罗姆彩色胶片的构造与一般多层彩色胶片没有根本的区别,其基本结构如下</p><h2 id="结构"><a href="#结构" class="headerlink" title="结构"></a>结构</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>1</td><td>感蓝光乳剂层</td></tr><tr><td>2</td><td>黄滤色层</td></tr><tr><td>3</td><td>感绿光乳剂层</td></tr><tr><td>4</td><td>感红光乳剂层</td></tr><tr><td>5</td><td>片基</td></tr><tr><td>6</td><td>防光晕层</td></tr></tbody></table><p>柯达克罗姆胶片也是在醋酸纤维片基上依次涂布着感蓝光乳剂层、黄滤色层、感绿光乳剂层和感红光乳剂层,片基的背面涂有碳黑的防光晕层。但是它在蓝、绿、红三层乳剂中含有丙烯酸乙酯和丙烯酸的共聚体,这样一方面可以取消明胶间的隔层,另一方面可以提高在显影过程中外式法彩色显影的上色率,同时也可以防止颜色穿层的现象。 </p><h1 id="外式法色彩显影的工艺过程:"><a href="#外式法色彩显影的工艺过程:" class="headerlink" title="外式法色彩显影的工艺过程:"></a>外式法色彩显影的工艺过程:</h1><p>柯达克罗姆胶片,实际上是一种黑白分色多层乳剂的感光材料,在乳剂中并不含有成色剂。<br>经过拍摄曝光在红、绿、蓝三个感光层产生潜影,在冲洗的时候,首先和一般反转片一样,要进行首次黑白显影,把三层感光层的潜影全部还原为金属银的负像。<br>然后把各层残留着的未曝光的卤化银再进行分层曝光和分层彩色显影,这就和一般的反转片不同了。</p><ol><li>先把胶片背面(即片基面)对着红光进行反转曝光,接着进行青色彩显,使感红层获得青色正像</li><li>再把胶片的乳剂面(即上层)对着蓝光进行反转曝光,接着进行黄色彩显,使感蓝层得到黄色正像</li><li>然后对中间感绿层用绿光进行反转曝光</li><li>接着进行品红色彩显</li><li>最后再经漂白、定影、水洗等过程<br>即获得与被摄景物颜色相同的彩色正像。<br>在进行外式法彩色显影时,可以根据成色剂的特性来调整显影液的配方,有时也可以更换彩色显影剂,用于调整色彩还原和提高胶片的上色率。</li></ol><h1 id="外式法彩色显影的成色剂:"><a href="#外式法彩色显影的成色剂:" class="headerlink" title="外式法彩色显影的成色剂:"></a>外式法彩色显影的成色剂:</h1><p>冲洗加工柯达克罗姆,由于胶片乳剂不含有成色剂,必须用外式法进行彩色显影,因此对成色剂的选择特别重要,它直接影响彩色还原质量和色彩平衡。通过试验我们进一步体会到,对黄、品红、青三种成色剂的要求是十分严格的,有以下一些特点:</p><ol><li>彩色画面上所生成黄、品红、青三种染料的光谱特性应与胶片所具有的蓝、绿、红乳剂的感光特性相适应。 </li><li>在彩色显影过程中,成色剂的上色率要高,但彩色灰雾要较低。 </li><li>在彩色显影过程中,彩色影像应与银影像相符合,不能产生染料的扩散与渗透现象。 </li><li>在冲洗加工过程中,应能经过得住酸、碱、醛等溶液的处理,而不致变色或褪色。 </li><li>成色剂应能溶解于有机溶剂和氢氧化钠溶液中,也能溶解于彩色显影液中而不会产生沉淀。 </li></ol><h1 id="冲洗工艺过程"><a href="#冲洗工艺过程" class="headerlink" title="冲洗工艺过程"></a>冲洗工艺过程</h1><table><thead><tr><th></th><th>工序</th><th>温度(℃)</th><th>时间(min)</th></tr></thead><tbody><tr><td>1</td><td>预坚膜</td><td>24</td><td>3</td></tr><tr><td>2</td><td>水洗</td><td>20~24</td><td>0.5</td></tr><tr><td>3</td><td>首显</td><td>24</td><td>4</td></tr><tr><td>4</td><td>停显</td><td>22~24</td><td>3</td></tr><tr><td>5</td><td>水洗</td><td>20~24</td><td>10</td></tr><tr><td>6</td><td>红光曝光</td><td></td><td></td></tr><tr><td>7</td><td>青显影</td><td>24</td><td>10</td></tr><tr><td>8</td><td>黑白显影</td><td>22~24</td><td>2</td></tr><tr><td>9</td><td>停显</td><td>22~24</td><td>2</td></tr><tr><td>10</td><td>水洗</td><td>20~24</td><td>10</td></tr><tr><td>11</td><td>蓝光曝光</td><td></td><td></td></tr><tr><td>12</td><td>黄显影</td><td>24</td><td>14</td></tr><tr><td>13</td><td>黑白显影</td><td>22~24</td><td>2</td></tr><tr><td>14</td><td>停影</td><td>22~24</td><td>2</td></tr><tr><td>15</td><td>水洗</td><td>20~24</td><td>10</td></tr><tr><td>16</td><td>绿光曝光</td><td></td><td></td></tr><tr><td>17</td><td>品红显影</td><td>24</td><td>10</td></tr><tr><td>18</td><td>停影</td><td>22~24</td><td>2</td></tr><tr><td>19</td><td>水洗</td><td>20~24</td><td>10</td></tr><tr><td>20</td><td>漂白</td><td>22~24</td><td>5</td></tr><tr><td>21</td><td>水洗</td><td>20~24</td><td>10</td></tr><tr><td>22</td><td>定影</td><td>22~24</td><td>5</td></tr><tr><td>23</td><td>水洗</td><td>20~24</td><td>10</td></tr><tr><td>24</td><td>稳定</td><td>22~24</td><td>1</td></tr><tr><td>25</td><td>干燥</td><td></td><td></td></tr></tbody></table><h2 id="〖注〗"><a href="#〖注〗" class="headerlink" title="〖注〗"></a>〖注〗</h2><h3 id="红曝光:"><a href="#红曝光:" class="headerlink" title="红曝光:"></a>红曝光:</h3><p>必须选用与胶片感色性相对应的红滤色镜(或滤色片)对红感光层进行反转曝光,红感光层是涂布在底层,即片基之上,所以,红曝光时,须将胶片片基面对着红光源。<br>我们使用的红滤镜是<code>柯达雷登70号</code>,将红色滤色镜装在彩色放大机的滤色镜夹具中,插入光源前,把放大机镜头光圈全部打开,将红光投影在黑纸上以防反光,然后将柯达克罗姆胶片平放在投影台上,放大机镜头距胶片0.5米,打开光源后对胶片进行分段曝光,<code>每段曝光5分钟</code>,这些都是在暗室中进行。<br>对于滤色镜的选择是十分重要的,这主要取决于他的波长和光谱透光特性,如果要改换滤色镜,需通过试验效果后确定。</p><h3 id="青彩色显影:"><a href="#青彩色显影:" class="headerlink" title="青彩色显影:"></a>青彩色显影:</h3><p>胶片红曝光后,装入显影罐中,然后将青成色剂溶解加入显影液中,调好温度,胶片进行青彩显,在<code>温度24摄氏度下显影10分钟</code>。<br>为了全部地还原底层乳剂中的卤化银,在青色显影之后,须再用黑白显影液进行补充显影。<br>同时为了控制、调整青色画面密度,还可以根据情况在青彩显液中加入适当的黑白显影剂,如米吐尔溶液,一般我们在1000毫升青显影液内加入1%的米吐尔溶液5-10毫升,这对青色密度的影响效果显著。 </p><h4 id="对青显影的要求是:"><a href="#对青显影的要求是:" class="headerlink" title="对青显影的要求是:"></a>对青显影的要求是:</h4><p>应控制青色密度、灰雾和反差,因为青色显影效果,它也会影响后面黄显影与品红显影密度的上色率,如果青色灰雾大,会造成色彩不平衡。<br><code>对于青显影液最好是配好就用,用多少配多少,用后即倒掉,以保证药液稳定。</code></p><h3 id="黑白显影:"><a href="#黑白显影:" class="headerlink" title="黑白显影:"></a>黑白显影:</h3><p>这次黑白显影的作用主要是为了全部地还原底层乳剂中青显影后剩余的卤化银进行补充显影。</p><h3 id="蓝曝光:"><a href="#蓝曝光:" class="headerlink" title="蓝曝光:"></a>蓝曝光:</h3><p>柯达克罗姆胶片的蓝感光层是在胶片的上层,因此要把胶片乳剂面对着蓝光进行反转曝光,要注意蓝滤色镜的选择,对于它的波长和光谱透光特性应十分严格,以防止穿层现象。<br>我们使用的滤色镜是<code>柯达雷登47B</code>。蓝曝光操作方法和红曝光一样,只是胶片乳剂面向上,对准蓝光源,也是采用分段曝光,在暗室中进行。</p><h3 id="黄彩色显影:"><a href="#黄彩色显影:" class="headerlink" title="黄彩色显影:"></a>黄彩色显影:</h3><p>胶片蓝曝光后,装入显影罐中,然后将黄色成色剂按照配制黄显影液要求溶解后加入显影液中,调好温度后,胶片进入黄彩色显影,在<code>温度24摄氏度</code>下,<code>显影14分钟</code>。 </p><h4 id="对黄显影的要求是:"><a href="#对黄显影的要求是:" class="headerlink" title="对黄显影的要求是:"></a>对黄显影的要求是:</h4><p>黄上色率要高,灰雾要小。选用的黄色成色剂经显影后,画面里的黄色中不能有带有红色,黄色透明度要好。<br><code>黄显影液也是随配好随用,用多少配多少,使用后即倒掉,以保证冲洗质量。</code></p><h3 id="黑白显影:-1"><a href="#黑白显影:-1" class="headerlink" title="黑白显影:"></a>黑白显影:</h3><p>黄显影后,随即进行黑白补充显影,使黄乳剂层中已曝光而未显影的残余卤化银全部还原成金属银,以防止在品红灰雾显影时影响品红的上色率和增加灰雾。</p><h3 id="品红灰雾显影:"><a href="#品红灰雾显影:" class="headerlink" title="品红灰雾显影:"></a>品红灰雾显影:</h3><p>显影液中加入品红成色剂后再加入适当的灰雾剂,使乳剂中的银盐全部灰化,进行显影还原。<br>同时为了控制品红画面密度,也可以根据情况在品红彩色显影液中加入适当的黑白显影液,如米吐尔溶液,一般我们在1000毫升品红显影液内加入1%的米吐尔溶液3-5毫升,即可控制品红密度。</p><h1 id="配方"><a href="#配方" class="headerlink" title="配方"></a>配方</h1><h2 id="预坚液-PH值9"><a href="#预坚液-PH值9" class="headerlink" title="预坚液 PH值9"></a>预坚液 PH值9</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>水</td><td>800毫升</td></tr><tr><td>亚硫酸氢钠</td><td>1克</td></tr><tr><td>四硼酸钠</td><td>20克</td></tr><tr><td>甲醛</td><td>20毫升</td></tr><tr><td>无水硫酸钠</td><td>100克</td></tr><tr><td>溴化钾</td><td>1克</td></tr><tr><td>加水至1000毫升</td><td></td></tr></tbody></table><h2 id="首显液-PH值10-5"><a href="#首显液-PH值10-5" class="headerlink" title="首显液 PH值10.5"></a>首显液 PH值10.5</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>水</td><td>800毫升</td></tr><tr><td>米吐尔</td><td>4克</td></tr><tr><td>无水亚硫酸钠</td><td>50克</td></tr><tr><td>海得尔(对苯二酚)</td><td>4克</td></tr><tr><td>无水碳酸钠</td><td>30克</td></tr><tr><td>氢氧化钠</td><td>1克</td></tr><tr><td>硫氰酸钾</td><td>1克</td></tr><tr><td>溴化钾</td><td>3克</td></tr><tr><td>六硝基苯并咪唑1%</td><td>5毫升</td></tr><tr><td>加水至1000毫升</td><td></td></tr></tbody></table><h2 id="停显液"><a href="#停显液" class="headerlink" title="停显液"></a>停显液</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>水</td><td>800毫升</td></tr><tr><td>98%醋酸</td><td>20毫升</td></tr><tr><td>加水至1000毫升</td><td></td></tr></tbody></table><h2 id="青彩色显影液-PH值11-3"><a href="#青彩色显影液-PH值11-3" class="headerlink" title="青彩色显影液 PH值11.3"></a>青彩色显影液 PH值11.3</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>水</td><td>600毫升</td></tr><tr><td>无水亚硫酸钠</td><td>10克</td></tr><tr><td>磷酸钠</td><td>25克</td></tr><tr><td>盐酸羟胺</td><td>1克</td></tr><tr><td>溴化钾</td><td>1克</td></tr><tr><td>六硝基苯并咪唑1%</td><td>10毫升</td></tr><tr><td>CD-2</td><td>2克</td></tr><tr><td>加水至800毫升</td><td></td></tr></tbody></table><h3 id="〖注〗-1"><a href="#〖注〗-1" class="headerlink" title="〖注〗"></a>〖注〗</h3><p>在使用前取青成色剂1克,溶解于10%含有氢氧化钠溶液的20毫升中,成色剂完全溶解后加入上述显影液中,然后将显影液加水至1000毫升,胶片经红曝光后,即可进行青显影。<br>其中CD-2化学成分名称为:2-氨基-5-二乙基氨基甲苯盐酸盐。</p><h2 id="黄彩色显影液-PH值11-5"><a href="#黄彩色显影液-PH值11-5" class="headerlink" title="黄彩色显影液 PH值11.5"></a>黄彩色显影液 PH值11.5</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>水</td><td>600毫升</td></tr><tr><td>无水亚硫酸钠</td><td>5克</td></tr><tr><td>磷酸钠</td><td>25克</td></tr><tr><td>氢氧化钠</td><td>2克</td></tr><tr><td>溴化钾</td><td>2克</td></tr><tr><td>盐酸羟胺</td><td>0.5克</td></tr><tr><td>六硝基苯并咪唑1%</td><td>10毫升</td></tr><tr><td>TSS</td><td>2.8克</td></tr><tr><td>加水至800毫升</td><td></td></tr></tbody></table><h3 id="〖注〗-2"><a href="#〖注〗-2" class="headerlink" title="〖注〗"></a>〖注〗</h3><p>在使用前取黄色成色剂1.2克,用20毫升丙酮溶液溶解黄成色剂,完全溶解后再加入上述显影液中,然后将显影液加水至1000毫升。<br>胶片经蓝曝光后,即可进行黄显影。<br>其中TSS化学成分名称为:对氨基二乙基苯胺硫酸盐。</p><h2 id="黑白显影液:"><a href="#黑白显影液:" class="headerlink" title="黑白显影液:"></a>黑白显影液:</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>水</td><td>700毫升</td></tr><tr><td>米吐尔</td><td>3克</td></tr><tr><td>无水亚硫酸钠</td><td>45克</td></tr><tr><td>海得尔(对苯二酚)</td><td>12克</td></tr><tr><td>无水碳酸钠</td><td>60克</td></tr><tr><td>溴化钾</td><td>2克</td></tr><tr><td>加水至1000毫升</td><td></td></tr></tbody></table><h3 id="〖注〗-3"><a href="#〖注〗-3" class="headerlink" title="〖注〗"></a>〖注〗</h3><p>使用时一份药液加一份水冲淡后显影,即1:1。</p><h2 id="品红彩色显影液-PH值11-75"><a href="#品红彩色显影液-PH值11-75" class="headerlink" title="品红彩色显影液 PH值11.75"></a>品红彩色显影液 PH值11.75</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>水</td><td>800毫升</td></tr><tr><td>无水亚硫酸钠</td><td>4克</td></tr><tr><td>TSS</td><td>4克</td></tr><tr><td>氢氧化钠</td><td>1克</td></tr><tr><td>一水合氨</td><td>8毫升</td></tr><tr><td>对硝基苯乙腈</td><td>1克</td></tr><tr><td>加水至1000毫升</td><td></td></tr></tbody></table><h3 id="〖注〗-4"><a href="#〖注〗-4" class="headerlink" title="〖注〗"></a>〖注〗</h3><p>品红彩显液配方法:<br>配方中除成色剂及灰雾剂(氢氧化胺),其他药品可先溶解配成储备液。在使用前将对硝基苯乙腈(品红成色剂)1克放入20毫升丙酮溶液和10毫升乙醇溶解中溶解,然后再加上上述显影液中,将水加至1000毫升,待其它准备工作完成后(如调好显影液温度等),胶片进入品红显影前再加入氢氧化胺8毫升(灰雾剂),此时,立即将胶片进行品红显影。<br>其中TSS化学成分名称为:对氨基二乙基苯胺硫酸盐。</p><h2 id="漂白液-PH值6-9"><a href="#漂白液-PH值6-9" class="headerlink" title="漂白液 PH值6.9"></a>漂白液 PH值6.9</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>水</td><td>800毫升</td></tr><tr><td>铁氰化钾</td><td>50克</td></tr><tr><td>溴化钾</td><td>10克</td></tr><tr><td>加水至1000毫升</td><td></td></tr></tbody></table><h2 id="定影液-PH值8-5"><a href="#定影液-PH值8-5" class="headerlink" title="定影液 PH值8.5"></a>定影液 PH值8.5</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>水</td><td>700毫升</td></tr><tr><td>海波</td><td>200克</td></tr><tr><td>无水亚硫酸钠</td><td>10克</td></tr><tr><td>加水至1000毫升</td><td></td></tr></tbody></table><h2 id="稳定液"><a href="#稳定液" class="headerlink" title="稳定液"></a>稳定液</h2><table><thead><tr><th></th><th></th></tr></thead><tbody><tr><td>水</td><td>800毫升</td></tr><tr><td>皂角素(湿润剂)</td><td>1克</td></tr><tr><td>甲醛</td><td>10毫升</td></tr><tr><td>加水至1000毫升</td><td></td></tr></tbody></table><h1 id="样片"><a href="#样片" class="headerlink" title="样片"></a>样片</h1><p><a href="https://www.flickr.com/people/54110121@N02/#">Kelly-Shane Fuller</a><br><a href="https://www.flickr.com/photos/doctorspider/">Paweł Pająk</a></p><h1 id="PDF"><a href="#PDF" class="headerlink" title="PDF"></a>PDF</h1><details markdown="1"><summary>展开/收起</summary><div class="row"> <embed src="https://ntsc.rec709.cf:2083/Documents/z50_03.pdf" width="100%" height="550" type="application/pdf"></div></details>]]></content>
</entry>
<entry>
<title>提升Intel 4代处理器性能锁定全核倍频</title>
<link href="/2021/09/20/enhance_haswell/"/>
<url>/2021/09/20/enhance_haswell/</url>
<content type="html"><![CDATA[<p>Z系列可以直接解锁全核倍频。对于B和H系列,如果你的主板BIOS选项中有 (CPU倍频 all core),也可以解锁全核倍频</p><span id="more"></span><hr><h1 id="工具"><a href="#工具" class="headerlink" title="工具"></a>工具</h1><ol><li>主板BIOS(2015年3月左右或者官方超频BIOS)</li><li><a href="https://github.com/wanghurui/whrblog/releases/tag/Blog">UEFI Tool</a></li></ol><h1 id="替换BIOS中的微码"><a href="#替换BIOS中的微码" class="headerlink" title="替换BIOS中的微码"></a>替换BIOS中的微码</h1><p>运行<code>UEFI.BIOS.Updater.1.66 </code>文件夹中的<code>ubu.bat</code>。<code>ubu.bat</code>可以自己识别文件夹中的BIOS文件,如果没有自动识别,提示载入一个文件,选择bios文件即可。</p><h2 id="更新CPU微码"><a href="#更新CPU微码" class="headerlink" title="更新CPU微码"></a>更新CPU微码</h2><p><img src="https://i.loli.net/2021/09/20/oMhPRSwUak18Ocn.png" alt="image.png"></p><h2 id="更新HasWell架构微码"><a href="#更新HasWell架构微码" class="headerlink" title="更新HasWell架构微码"></a>更新HasWell架构微码</h2><p>输入7回车,更新CPU微码</p><p><img src="https://i.loli.net/2021/09/20/nb7tU8vcVZ5G61M.png" alt="image.png"><br>输入1回车,更新HasWell架构微码<br><img src="https://i.loli.net/2021/09/20/bgHBlJXjqrQn5o2.png" alt="image.png"> </p><h2 id="解锁HasWell限制"><a href="#解锁HasWell限制" class="headerlink" title="解锁HasWell限制"></a>解锁HasWell限制</h2><p>输入7回车,解锁HasWell限制<br><img src="https://i.loli.net/2021/09/20/d34Ho7UmFQchx8G.png" alt="image.png"><br><img src="https://i.loli.net/2021/09/20/31oLk86umDrlOwW.png" alt="image.png"> </p><p>输入0回车,完成BIOS编辑<br>输入1回车,将新BIOS保存到当前目录<br>输入任意键结束程序,程序目录下便有最新的BIOS了</p><h1 id="刷写BIOS"><a href="#刷写BIOS" class="headerlink" title="刷写BIOS"></a>刷写BIOS</h1><p>把它放入_FAT32_格式U盘根目录中<br>详细刷写BIOS请参考主板官网的帮助</p><h1 id="设置BIOS为all-core"><a href="#设置BIOS为all-core" class="headerlink" title="设置BIOS为all core"></a>设置BIOS为all core</h1><p>cpu倍频必须必须选择所有内核(all core),否则解锁无效。在All core 填入你的CPU单核最大频率即可。如E3 1231V3 单核最大倍频为38 </p><p>保存退出重启电脑即可</p><hr><p>如果你打开电脑,打开CPUZ发现所有核心都运行在了最高倍频,那么恭喜,你锁住了。🎉</p><p>如果没有,请继续往下看。</p><h1 id="Oops!我没锁住🤔"><a href="#Oops!我没锁住🤔" class="headerlink" title="Oops!我没锁住🤔"></a>Oops!我没锁住🤔</h1><blockquote><p>Make a screenshot of <code>regedit</code> with expanded key <code>HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0</code> </p></blockquote><blockquote><p><img src="https://i.loli.net/2021/07/20/Mo9ZYUlrVO5cPWI.png" alt="image.png"></p></blockquote><blockquote><p>Your BIOS has microcode with <code>0x06</code> version, but Windows update it to <code>0x28</code> version.<br>Delete or rename file <code>C:\Windows\System32\mcupdate_GenuineIntel.dll</code></p></blockquote><p><a href="https://www.bios-mods.com/forum/Thread-Biostar-B85W-CPU-frequency-problem">https://www.bios-mods.com/forum/Thread-Biostar-B85W-CPU-frequency-problem</a></p><p>大意就是我修改了BIOS中的微码为<code>0x06</code>,但是系统把微码更新成了<code>0x28</code>。 </p><h3 id="删除系统微码"><a href="#删除系统微码" class="headerlink" title="删除系统微码"></a>删除系统微码</h3><p>在PE中删除或重命名系统微码文件<code>C:\Windows\System32\mcupdate_GenuineIntel.dll</code></p><p><img src="https://i.loli.net/2021/07/20/3BbGqs95YDdMVIj.png" alt="image.png"><br>还是锁不住🤔</p><h3 id="使用ThottleStop锁倍频"><a href="#使用ThottleStop锁倍频" class="headerlink" title="使用ThottleStop锁倍频"></a>使用ThottleStop锁倍频</h3><blockquote><p>Show FIVR and TPL information in ThrottleStop.</p></blockquote><p><img src="https://i.loli.net/2021/07/21/mzlWRBYjx3sKS9F.png" alt="image.png"><br>设置ThottleStop中的FIVR的Turbo Ratio Limits为CPU单核最大倍频。修改即时生效。</p><p>最后把ThottleStop设置为开机启动就行了</p><hr><p>🎉如果你锁住了,可以送我一条评论吗🎉</p><hr><p>参考资料</p><ul><li><a href="https://www.bios-mods.com/forum/Thread-Biostar-B85W-CPU-frequency-problem">https://www.bios-mods.com/forum/Thread-Biostar-B85W-CPU-frequency-problem</a></li><li><a href="https://zhuanlan.zhihu.com/p/54535319">https://zhuanlan.zhihu.com/p/54535319</a></li><li><a href="https://www.techpowerup.com/forums/threads/how-can-i-get-throttlestop-to-auto-load-when-windows-starts-up.230371/">https://www.techpowerup.com/forums/threads/how-can-i-get-throttlestop-to-auto-load-when-windows-starts-up.230371/</a></li></ul>]]></content>
</entry>
<entry>
<title>解读MTF曲线</title>
<link href="/2021/07/01/%E8%A7%A3%E8%AF%BBmtf%E6%9B%B2%E7%BA%BF/"/>
<url>/2021/07/01/%E8%A7%A3%E8%AF%BBmtf%E6%9B%B2%E7%BA%BF/</url>
<content type="html"><![CDATA[<blockquote><p>Modulation Transfer Function(调制传递函数)是分析镜头的解像比较科学的方法,这种测定光学频率的方式是以一个mm的范围内能呈现出多少条线来度量,其单位以line/mm来表示。所以当一支镜头能做到所入即所出的程度那就表示这支镜头是所谓的完美镜头,但是因为镜片镜头的设计往往还有很多因素影响所以不可能有这种理想化的镜头。</p></blockquote><span id="more"></span><hr><p>1.横坐标轴代表与画面中心的距离,从左到右代表从中心到边缘的成像 (全画幅镜头的横轴约22mm,残幅镜头的横轴约13mm) 2.纵坐标轴代表MTF值 3.黑色线条表示最大光圈,蓝色线条表示f/8光圈 4.粗线表示10线/mm,细线表示30线/mm 5.实线表示拍摄从中心呈放射状纹样的成像性能,用字母“S”表示 6.虚线表示拍摄线条呈同心圆向外扩展状纹样的成像性能,用字母“M”表示 [caption id=”” align=”aligncenter” width=”670”]<a href="https://z3.ax1x.com/2021/07/01/RD2Yo4.png"><img src="https://z3.ax1x.com/2021/07/01/RD2Yo4.png"></a> <a href="https://www.canon.com.cn/product/ef/index/lensmtf.html/[/caption/]">https://www.canon.com.cn/product/ef/index/lensmtf.html\[/caption\]</a></p><hr><p>1. MTF值越接近1越好,即MTF线越高越好 2.粗线约高,说明镜头的反差表现越好 3.细线越高,说明镜头的分辨率越好 4. MTF曲线越平坦,说明边缘和中心的成像差距越小 5.实线和虚线越接近,说明镜头的焦外成像越好 6.蓝线说明镜头f/8时的成像水平,近似于镜头的最佳成像水平 7.黑线说明镜头最大光圈时的成像水平,大光圈的价值所在</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> 摄影 </tag>
</tags>
</entry>
<entry>
<title>Digispark模拟HID键盘控制BIOS</title>
<link href="/2021/04/05/%E9%80%9A%E8%BF%87digispark%E6%A8%A1%E6%8B%9F%E9%94%AE%E7%9B%98%E6%8E%A7%E5%88%B6bios/"/>
<url>/2021/04/05/%E9%80%9A%E8%BF%87digispark%E6%A8%A1%E6%8B%9F%E9%94%AE%E7%9B%98%E6%8E%A7%E5%88%B6bios/</url>
<content type="html"><![CDATA[<details markdown="1"><summary>展开/收起</summary>有一个穷鬼,十分喜欢折腾电脑硬件,可他的父母并不支持他的兴趣爱好,他们认为生为学生就应该心无杂念的一心想着读书。几年过去了,穷鬼的电脑开始渐渐的赶不上时代了,他看了看他的CPU,不由自主地叹了口气:“Pentium E5300…<p>“ 在他的不懈努力之下,从<a href="krunk.cn">K</a>那里抢来了一块Q6600和一块9600GT 又过了几年,又从一个不知名的仓库里拆出了一块Q9300。<br> 没过多久,他收到一个快递,拆开一看竟然是印着自己名字的GT1030,那天,是他的生日。 一年后,穷鬼上了高中,发现处理器还是差那么亿点点,他看了看自己空空荡荡的钱包,一咬牙,买了一块X5450,装CPU的那天,他心里想着,装上了这块CPU你就无敌了…… 欧耶,点亮了! 关机。 来BIOS里超个外频。欸,🌿🌿🌿,怎么点不亮了,#¥%……他发现了一个问题,每次开机前要断电, BIOS恢复后才能开机。 🌿那岂不是保存不了超频。 在默频用了一段时间后,他突发奇想,是否可以用arduino做badusb,在开机时模拟键盘,自动设置BIOS呢?他翻出来尘封已久的arduino……<br>最后选择了digispark作为badusb</p></details><h1 id="Digispark?"><a href="#Digispark?" class="headerlink" title="Digispark?"></a>Digispark?</h1><p>Digispark是一款类似于Arduino Uno基于Attiny85的微控制器开发板。可用于制作Badusb设备, BadUSB是一种通过重写U盘固件伪装成USB输入设备(键盘,网卡)用于恶意用途的usb设备。杀毒软件由于无法接触到usb固件,所以对它也无可奈何 </p><hr><span id="more"></span><h1 id="点个灯"><a href="#点个灯" class="headerlink" title="点个灯"></a>点个灯</h1><p>尝试烧写一个示例程序。</p><figure class="highlight plaintext"><table><tbody><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">//_因为此开发板有两种类型,并且这两种的LED接的引脚不一样,所以下面的代码中,同时在操作两个引脚。_</span><br><span class="line">void setup() {</span><br><span class="line"> pinMode(0, OUTPUT); //LED on Model B </span><br><span class="line"> pinMode(1, OUTPUT); //LED on Model A </span><br><span class="line">} </span><br><span class="line">void loop() { </span><br><span class="line"> digitalWrite(0, HIGH); // turn the LED on (HIGH is the voltage level) </span><br><span class="line"> digitalWrite(1, HIGH); delay(300); // wait for a second </span><br><span class="line"> digitalWrite(0, LOW); // turn the LED off by making the voltage LOW </span><br><span class="line"> digitalWrite(1, LOW); delay(300); // wait for a second </span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>这款开发板比较特殊,先点击下载按钮,当出现如下提示时再插入开发板(而不是插好等下载)</p><figure class="highlight plaintext"><table><tbody><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">项目使用了 718 字节,占用了 (11%) 程序存储空间。最大为 6012 字节。</span><br><span class="line">全局变量使用了9字节的动态内存。</span><br><span class="line">Running Digispark Uploader...</span><br><span class="line">Plug in device now... (will timeout in 60 seconds)</span><br></pre></td></tr></tbody></table></figure><p>这段时间是用来烧写程序的,因为烧写时引导程序需要通过USB接口与计算机沟通,所以这时候计算机才能识别到开发板。5秒后,内部的boot loader会退出烧写模式,并加载用户程序,所以计算机就识别不到它了,并且此时led才能正常闪烁。</p><details markdown="1"><summary>展开/收起</summary><p></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">Running Digispark Uploader...</span><br><span class="line">Plug in device now... (will timeout in 60 seconds)</span><br><span class="line">> Please plug in the device ... </span><br><span class="line">> Press CTRL+C to terminate the program.</span><br><span class="line">> Device is found!</span><br><span class="line">connecting: 16% complete</span><br><span class="line">connecting: 22% complete</span><br><span class="line">connecting: 28% complete</span><br><span class="line">connecting: 33% complete</span><br><span class="line">> Device has firmware version 2.2</span><br><span class="line">> Device signature: 0x1e930b </span><br><span class="line">> Available space for user applications: 6522 bytes</span><br><span class="line">> Suggested sleep time between sending pages: 7ms</span><br><span class="line">> Whole page count: 102 page size: 64</span><br><span class="line">> Erase function sleep duration: 714ms</span><br><span class="line">parsing: 50% complete</span><br><span class="line">> Erasing the memory ...</span><br><span class="line">erasing: 55% complete</span><br><span class="line">erasing: 60% complete</span><br><span class="line">erasing: 65% complete</span><br><span class="line">>> Eep! Connection to device lost during erase! Not to worry</span><br><span class="line">>> This happens on some computers - reconnecting...</span><br><span class="line">>> Reconnected! Continuing upload sequence...</span><br><span class="line">> Starting to upload ...</span><br><span class="line">writing: 70% complete</span><br><span class="line">writing: 75% complete</span><br><span class="line">writing: 80% complete</span><br><span class="line">> Starting the user app ...</span><br><span class="line">running: 100% complete</span><br><span class="line">>> Micronucleus done. Thank you!</span><br></pre></td></tr></tbody></table></figure></details><div id="player_af937f3787ae1eb1"></div><script type="text/javascript" src="https://player.dogecloud.com/js/loader"></script><script type="text/javascript">var player = new DogePlayer({ container: document.getElementById('player_af937f3787ae1eb1'), userId: 1131, vcode: 'af937f3787ae1eb1', autoPlay: false});</script><hr><h1 id="撸代码"><a href="#撸代码" class="headerlink" title="撸代码"></a>撸代码</h1><p>在GitHub上有一个为digispark一键生成代码的project > <a href="https://github.com/Catboy96/Automator">AutoMator</a><br><img src="https://i.loli.net/2021/03/22/7cPFRJKUSrx5kIs.png" alt="长这样"></p><figure class="highlight plaintext"><table><tbody><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></pre></td><td class="code"><pre><span class="line">#include </span><br><span class="line"></span><br><span class="line">void loop() {}</span><br><span class="line"></span><br><span class="line">void setup() {</span><br><span class="line">DigiKeyboard.sendKeyStroke(0);</span><br><span class="line">DigiKeyboard.delay(1000);</span><br><span class="line">//START</span><br><span class="line">DigiKeyboard.delay(15000);</span><br><span class="line">//ENTER BIOS</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_F1);</span><br><span class="line">DigiKeyboard.delay(1000);</span><br><span class="line">//TO ADVANCED</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_RIGHT\_ARROW);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//ENTER JUMPERFREE CONFIGURATION</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_ENTER);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//SET OVERCLOCKING MODE</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_ENTER);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//MANUAL</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_UP\_ARROW);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_ENTER);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//TO CPU FREQUENCY</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_DOWN\_ARROW);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//ENTER CPU FREQUENCY</span><br><span class="line">DigiKeyboard.print("380");</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_ENTER);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//BACK TO ADVANCED</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_ESC);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//TO CPU CONFIGURATION</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_DOWN\_ARROW);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//ENTER CPU CONFIGURATION</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_ENTER);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//TO C1E SUPPORT</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_DOWN\_ARROW);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//SET C1E SUPPORT</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_ENTER);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//DISABLE C1E SUPPORT</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_UP\_ARROW);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_ENTER);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">//SAVE && EXIT</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_F10);</span><br><span class="line">DigiKeyboard.delay(600);</span><br><span class="line">DigiKeyboard.sendKeyStroke(KEY\_ENTER);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h1 id="编译失败了"><a href="#编译失败了" class="headerlink" title="编译失败了"></a>编译失败了</h1><figure class="highlight plaintext"><table><tbody><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">const unsigned char ascii\_to\_scan\_code\_table \[119\]' previously defined here</span><br><span class="line">const unsigned char ascii\_to\_scan\_code\_table\[\] PROGMEM = {</span><br></pre></td></tr></tbody></table></figure><p>这个错误由<code>digispark.h</code>中键位表不全所致。代码中如出现<code>KEY_RIGHT_ARROW</code>等未定义的键时会导致编译出错。 在<code>digispark.h</code>中补全键位表即可</p><figure class="highlight plaintext"><table><tbody><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">#define KEY\_UP\_ARROW 0x52</span><br><span class="line">#define KEY\_DOWN\_ARROW 0x51</span><br><span class="line">#define KEY\_LEFT\_ARROW 0x50</span><br><span class="line">#define KEY\_RIGHT\_ARROW 0x4F</span><br><span class="line">#define KEY\_ESC 0x29</span><br></pre></td></tr></tbody></table></figure><p><a href="https://i.loli.net/2021/03/21/SbuWnvKVU5BrYzh.png"><img src="https://i.loli.net/2021/03/21/SbuWnvKVU5BrYzh.png"></a></p><h1 id="怎么没反应🧐"><a href="#怎么没反应🧐" class="headerlink" title="怎么没反应🧐"></a>怎么没反应🧐</h1><p>好欸,BIOS认digispark是个键盘了 等 再等 再等等 并没有反应 在digispark论坛中,很多人反应digispark模拟的hid键盘并不能在BIOS中使用 <a href="https://digistump.com/board/index.php?topic=1096.0" title="https://digistump.com/board/index.php?topic=1096.0">https://digistump.com/board/index.php?topic=1096.0</a> <a href="https://digistump.com/board/index.php?topic=2922.0" title="https://digistump.com/board/index.php?topic=2922.0">https://digistump.com/board/index.php?topic=2922.0</a> 有大佬提出通过替换<code>digispark.h</code>和<code>usbconfig.h</code>文件可以解决这个问题<a href="https://github.com/bkgarry/DigikeyboardBIOS">https://github.com/bkgarry/DigikeyboardBIOS</a></p><blockquote><p>These two files (DigiKeyboard.h and usbconfig.h) replace the original digikeyboard files in the following windows directory.<br><code>%localappdata%\\Arduino15\\packages\\digistump\\hardware\\avr\\1.6.7\\libraries\\DigisparkKeyboard</code><br>(please note that the path may change for different versions of the digistump files and Arduino IDE)</p><p>%localappdata% is the environmental variable to take you to your user’s local appdata so the path will work.</p><p>Once these files have been replaced, recompile your existing code to your digispark and you will be able to use the same script to run your keyboard commands within a system BIOS)</p></blockquote><h1 id="Working🤗"><a href="#Working🤗" class="headerlink" title="Working🤗"></a>Working🤗</h1><div id="player"></div><script type="text/javascript" src="https://player.dogecloud.com/js/loader"></script><script type="text/javascript">var player = new DogePlayer({ container: document.getElementById('player'), userId: 1131, vcode: '0314c74e2e4534b5', autoPlay: false});</script><p><img src="https://i.loli.net/2021/04/11/Wa3gVdvxGiuzPXD.jpg"></p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
</entry>
<entry>
<title>DIY适马佳能AF镜头兼容性修复(\"rechip\")</title>
<link href="/2020/12/22/diy%E9%80%82%E9%A9%AC%E4%BD%B3%E8%83%BDaf%E9%95%9C%E5%A4%B4%E5%85%BC%E5%AE%B9%E6%80%A7%E4%BF%AE%E5%A4%8Drechip/"/>
<url>/2020/12/22/diy%E9%80%82%E9%A9%AC%E4%BD%B3%E8%83%BDaf%E9%95%9C%E5%A4%B4%E5%85%BC%E5%AE%B9%E6%80%A7%E4%BF%AE%E5%A4%8Drechip/</url>
<content type="html"><![CDATA[<p>原文:<a href="https://github.com/marcan/sigmafix">Github</a> & <a href="https://twitter.com/marcan42/status/1046781328148979712?s=09" title="@marcan42">Twitter</a></p><p>翻译/校对:<a href="https://2890.ltd/">Given</a></p><p>使用佳能EF卡口的旧的适马镜头不能在新的佳能机身上工作,因为适马不完全反向工程EF协议,没有实现所有需要的命令。这是一个DIY修复方法,使用ATtiny13单片机来修改协议,使镜头重新兼容数码EOS机身。</p><span id="more"></span><p>有些人喜欢称之为 “rechip”,”rechip”实际上是指官方的修复,包括更换镜头中的芯片。但这个修正是一个附加的修正,并没有替换镜头中现有的芯片,所以更应该称之为 “modchip”。</p><hr><h1 id="功能介绍"><a href="#功能介绍" class="headerlink" title="功能介绍"></a>功能介绍</h1><p>**<em>低功耗</em>**:该修复在活动模式下(例如拍摄、自动对焦、实时视图模式或更改镜头设置时)消耗约500µA,在睡眠模式下(在标准模式下或相机关闭时,在几秒钟不活动后自动进入)消耗不到1µA。因此,它不会对电池寿命产生可衡量的影响。 **<em>被动式</em>**:本方案不像其他方案那样通过DCL线路由MCU处理,而是使用一个电阻,仅在必要时主动覆盖DCL。因此,在协议的正常运行中,它的影响为零,只改变需要改变的一个位。 **<em>正确的EF协议</em>**:与其他版本不同,这个版本正确解析EF协议,并跟踪命令长度。它还有一个超时功能,如果出了问题,可以与命令重新同步。 [dogevideo]57b05519765a9df3[/dogevideo]</p><hr><h1 id="编译"><a href="#编译" class="headerlink" title="编译"></a><a href="https://github.com/wanghurui/sigmafix/releases/tag/1.0">编译</a></h1><p>输入<code>make</code>来编译工程(需要avra编译器),或者<code>make flash</code>来用avrdude flash (默认使用 usbtiny 编译器,但你可以使用 <code>make PROGRAMMER=foo</code>来改变编译器类型)。如果你使用其他的编程方法,不要忘了刷写保险丝 (<code>LFUSE=0x72 HFUSE=0xfb</code>)。</p><hr><h1 id="安装方法"><a href="#安装方法" class="headerlink" title="安装方法"></a>安装方法</h1><p>安装时,需要剪断相机到镜头的DCL线,并在线路上插入一个220Ω的电阻,然后将编程后的ATtiny13接上,如下图所示。</p><figure class="highlight plaintext"><table><tbody><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"> Camera side</span><br><span class="line"> =========================================</span><br><span class="line"> DGND LCLK DLC DCL VDD PGND/DET VBAT</span><br><span class="line"> | | | | | | |</span><br><span class="line"> ATtiny13 ,------------------------+ | |</span><br><span class="line"> __________ | | | | | | | |</span><br><span class="line"> |o | | | | | \ | | |</span><br><span class="line"> 1|RESET VCC|8-' | | | 220/ | | |</span><br><span class="line"> 2|PB3 PB2|7 | | | Ω \ | | |</span><br><span class="line"> 3|PB4 PB1|6----------+ | / | | |</span><br><span class="line">,-4|GND PB0|5---------------------+ | | |</span><br><span class="line">| |__________| | | | | | | |</span><br><span class="line">`-------------------+ | | | | | |</span><br><span class="line"> | | | | | | |</span><br><span class="line"> DGND LCLK DLC DCL VDD PGND/DET VBAT</span><br><span class="line"> =========================================</span><br><span class="line"> Lens side</span><br></pre></td></tr></tbody></table></figure><p><a href="https://cdn.hyh.ink/imger/2020/12/21/sigmafix_lens_diagram.jpg"><img src="https://cdn.hyh.ink/imger/2020/12/21/sigmafix_lens_diagram.jpg" alt="安装示例"></a></p><hr><h1 id="问题"><a href="#问题" class="headerlink" title="问题"></a>问题</h1><p>佳能EF镜头同时接受<code>12 YY</code>和<code>13 YY</code>两个命令,以<code>YY</code>步数(符号为uint8)改变光圈。旧的胶片佳能机身使用<code>12 YY</code>,而新的数码机身使用<code>13 YY</code>。看来适马并没有通过尝试所有可能的命令来完全逆向工程协议,而只是实现了当时佳能机身使用的命令。因此,老的适马镜头只支持<code>12 YY</code>。如果这样的镜头用在新机身上,光圈永远不会移动。光圈有一个位子反馈给相机:是否在全开位置。相机会根据它所期望的光圈位置来检查这一点。因此,这些老镜头的行为如下:如果光圈是大开(常见情况),镜头只会在相机光圈设置为全开(匹配)的情况下拍摄,否则相机会抛出一个错误。如果光圈不是全开(比如被手动移动了,或者在关机时取下了镜头),那么相机会允许用其他光圈设置拍照,但光圈当然也不会移动。</p><hr><h1 id="解决方法"><a href="#解决方法" class="headerlink" title="解决方法"></a>解决方法</h1><p>把命令13补成命令12。他们之间只有一个比特的差异差。由于协议是MSB优先,所以只要前面7个位都收到后,即可完成,也就是说不需要延迟或缓冲协议,而是可以近乎实时完成。</p><hr><h1 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h1><p>代码的大部分时间都是处于在睡眠模式下的。当LCLK为低电平时(在命令开始时),它通过低电平INT0中断唤醒芯片。中断处理程序什么也不做,只是从掉电模式返回。然后,主程序禁用中断以防止其重新启动,并接收命令字节。唤醒延迟是这样的:当LCLK为高电平时,芯片正好可以对第一个命令位进行采样,这是预期的采样时间。 在接收到7个命令位后,代码会检查命令0x12/0x13。如果命令匹配,则等待下一个位周期,然后强制DCL为低。这将任何0x13命令改写成0x12,然后等待镜头通过LCLK脉冲确认命令。 由于命令可以有参数,而且没有明确的框架来区分参数和命令,因此代码中包含了所有256个可能的命令以及预期参数长度的表格(根据佳能镜头进行检查)。如果有任何参数字节,它就会读取这些字节,而不进行任何进一步的处理,然后回到睡眠模式,等待下一条命令。 为了在出现故障时实现超时,定时器0设置了0-700µs的超时,并在每个命令开始时启动,同时允许中断。只有当镜头应答一个命令时,它才会停止。如果定时器过期,它就会触发一个中断,该中断不会返回,而是从复位向量重新启动整个程序。这与佳能镜头的行为类似,如果一个命令字节的时间超过700µs,它将启动一个协议复位。</p><div id="player"></div><script type="text/javascript" src="https://player.dogecloud.com/js/loader"></script><script type="text/javascript">var player = new DogePlayer({ container: document.getElementById('player'), userId: 1131, vcode: '57b05519765a9df3', autoPlay: false});</script>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> 折腾 </tag>
<tag> 摄影 </tag>
</tags>
</entry>
<entry>
<title>DIY Arduino 入射式测光表</title>
<link href="/2020/11/23/diy-arduino-%E5%85%A5%E5%B0%84%E5%BC%8F%E6%B5%8B%E5%85%89%E8%A1%A8/"/>
<url>/2020/11/23/diy-arduino-%E5%85%A5%E5%B0%84%E5%BC%8F%E6%B5%8B%E5%85%89%E8%A1%A8/</url>
<content type="html"><![CDATA[<blockquote><p>A Lightmeter/Flashmeter for photographers, based on Arduino. Components: </p><ul><li>Arduino NANO v.3 </li><li>BH1750 light sensor </li><li>SSD1306 128*96 OLED SPI Display </li><li>Buttons </li></ul><p>Thanks <a href="https://github.com/morozgrafix">@morozgrafix</a> for creating schematic diagram for this device. The lightmeter based on Arduino as a main controller and BH1750 as a metering cell. </p><p>Information is displayed on SSD1306 OLED display. The device is powered by 2 AAA batteries. Functions list:</p><ul><li> Ambient light metering</li><li> Flash light metering</li><li> ND filter correction</li><li> Aperture priority</li><li> Shutter speed priority</li><li> ISO range 8 - 4 000 000</li><li> Aperture range 1.0 - 3251</li><li> Shutter speed range 1/10000 - 133 sec</li><li> ND Filter range ND2 - ND8192</li><li> Displaying amount of light in Lux.</li><li> Displaying exposure value, EV</li><li> Recalculating exposure pair while one of the parameter changing</li><li> Battery information</li><li> Power 2xAAA LR03 batteries</li></ul></blockquote><blockquote><p>Detailed information on my site: <a href="https://www.pominchuk.com/lightmeter/">https://www.pominchuk.com/lightmeter/</a></p></blockquote><h2 id=""><a href="#" class="headerlink" title=""></a><img src="https://s2.loli.net/2022/02/03/s6LuUXAYDWKbwnT.jpg"></h2><span id="more"></span><p>DIY测光表测光模式相当于相机内中央平均测光。在大多数拍摄情况下中央平均测光是一种非常实用的测光模式,在拍摄人像旅游照等对于中央亮度起到决定性作用的拍摄场景时,应用广泛。</p><h1 id="所需元件"><a href="#所需元件" class="headerlink" title="所需元件"></a>所需元件</h1><pre><code>1. Arduino nano2. BH1750光强度模块3. 0.96寸 7针SPI接口oled屏幕(SSD1306)</code></pre><p><img src="https://s2.loli.net/2022/02/03/25gABb6LoY4qKQu.jpg"></p><h1 id="源码-amp-amp-焊接"><a href="#源码-amp-amp-焊接" class="headerlink" title="源码&&焊接"></a>源码&&焊接</h1><figure class="highlight plaintext"><table><tbody><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></pre></td><td class="code"><pre><span class="line">#include <SPI.h></span><br><span class="line">#include <Wire.h></span><br><span class="line">#include <Adafruit\_GFX.h></span><br><span class="line">#include <Adafruit\_SSD1306.h></span><br><span class="line">#include <BH1750.h></span><br><span class="line">#include <EEPROM.h></span><br><span class="line">#include <avr/sleep.h></span><br><span class="line">#define SCREEN\_WIDTH 128 // OLED display width, in pixels</span><br><span class="line">#define SCREEN\_HEIGHT 64 // OLED display height, in pixels</span><br><span class="line"></span><br><span class="line">// Declaration for SSD1306 display connected using software SPI (default case):</span><br><span class="line">#define OLED\_DC 11</span><br><span class="line">#define OLED\_CS 12</span><br><span class="line">#define OLED\_CLK 8 //10</span><br><span class="line">#define OLED\_MOSI 9 //9</span><br><span class="line">#define OLED\_RESET 10 //13</span><br><span class="line">Adafruit\_SSD1306 display(SCREEN\_WIDTH, SCREEN\_HEIGHT,</span><br><span class="line"> OLED\_MOSI, OLED\_CLK, OLED\_DC, OLED\_RESET, OLED\_CS);</span><br><span class="line"></span><br><span class="line">BH1750 lightMeter;</span><br><span class="line"></span><br><span class="line">#define DomeMultiplier 2.17 // Multiplier when using a white translucid Dome covering the lightmeter</span><br><span class="line">#define MeteringButtonPin 2 // Metering button pin</span><br><span class="line">#define PlusButtonPin 3 // Plus button pin</span><br><span class="line">#define MinusButtonPin 4 // Minus button pin</span><br><span class="line">#define ModeButtonPin 5 // Mode button pin</span><br><span class="line">#define MenuButtonPin 6 // ISO button pin</span><br><span class="line">#define MeteringModeButtonPin 7 // Metering Mode (Ambient / Flash)</span><br><span class="line">//#define PowerButtonPin 2</span><br><span class="line"></span><br><span class="line">#define MaxISOIndex 57</span><br><span class="line">#define MaxApertureIndex 70</span><br><span class="line">#define MaxTimeIndex 80</span><br><span class="line">#define MaxNDIndex 13</span><br><span class="line">#define MaxFlashMeteringTime 5000 // ms</span><br><span class="line"></span><br><span class="line">float lux;</span><br><span class="line">boolean Overflow = 0; // Sensor got Saturated and Display "Overflow"</span><br><span class="line">float ISOND;</span><br><span class="line">boolean ISOmode = 0;</span><br><span class="line">boolean NDmode = 0;</span><br><span class="line"></span><br><span class="line">boolean PlusButtonState; // "+" button state</span><br><span class="line">boolean MinusButtonState; // "-" button state</span><br><span class="line">boolean MeteringButtonState; // Metering button state</span><br><span class="line">boolean ModeButtonState; // Mode button state</span><br><span class="line">boolean MenuButtonState; // ISO button state</span><br><span class="line">boolean MeteringModeButtonState; // Metering mode button state (Ambient / Flash)</span><br><span class="line"></span><br><span class="line">boolean ISOMenu = false;</span><br><span class="line">boolean NDMenu = false;</span><br><span class="line">boolean mainScreen = false;</span><br><span class="line"></span><br><span class="line">// EEPROM for memory recording</span><br><span class="line">#define ISOIndexAddr 1</span><br><span class="line">#define apertureIndexAddr 2</span><br><span class="line">#define modeIndexAddr 3</span><br><span class="line">#define T\_expIndexAddr 4</span><br><span class="line">#define meteringModeAddr 5</span><br><span class="line">#define ndIndexAddr 6</span><br><span class="line"></span><br><span class="line">#define defaultApertureIndex 12</span><br><span class="line">#define defaultISOIndex 11</span><br><span class="line">#define defaultModeIndex 0</span><br><span class="line">#define defaultT\_expIndex 19</span><br><span class="line"></span><br><span class="line">uint8\_t ISOIndex = EEPROM.read(ISOIndexAddr);</span><br><span class="line">uint8\_t apertureIndex = EEPROM.read(apertureIndexAddr);</span><br><span class="line">uint8\_t T\_expIndex = EEPROM.read(T\_expIndexAddr);</span><br><span class="line">uint8\_t modeIndex = EEPROM.read(modeIndexAddr);</span><br><span class="line">uint8\_t meteringMode = EEPROM.read(meteringModeAddr);</span><br><span class="line">uint8\_t ndIndex = EEPROM.read(ndIndexAddr);</span><br><span class="line"></span><br><span class="line">int battVolts;</span><br><span class="line">#define batteryInterval 10000</span><br><span class="line">double lastBatteryTime = 0;</span><br><span class="line"></span><br><span class="line">#include "lightmeter.h"</span><br><span class="line"></span><br><span class="line">void setup() { </span><br><span class="line"> pinMode(PlusButtonPin, INPUT\_PULLUP);</span><br><span class="line"> pinMode(MinusButtonPin, INPUT\_PULLUP);</span><br><span class="line"> pinMode(MeteringButtonPin, INPUT\_PULLUP);</span><br><span class="line"> pinMode(ModeButtonPin, INPUT\_PULLUP);</span><br><span class="line"> pinMode(MenuButtonPin, INPUT\_PULLUP);</span><br><span class="line"> pinMode(MeteringModeButtonPin, INPUT\_PULLUP);</span><br><span class="line"></span><br><span class="line"> //Serial.begin(115200);</span><br><span class="line"></span><br><span class="line"> battVolts = getBandgap(); //Determins what actual Vcc is, (X 100), based on known bandgap voltage</span><br><span class="line"></span><br><span class="line"> Wire.begin();</span><br><span class="line"> lightMeter.begin(BH1750::ONE\_TIME\_HIGH\_RES\_MODE\_2);</span><br><span class="line"> //lightMeter.begin(BH1750::ONE\_TIME\_LOW\_RES\_MODE); // for low resolution but 16ms light measurement time.</span><br><span class="line"></span><br><span class="line"> display.begin(SSD1306\_SWITCHCAPVCC, 0x3D);</span><br><span class="line"> display.setTextColor(WHITE);</span><br><span class="line"> display.clearDisplay();</span><br><span class="line"></span><br><span class="line"> // IF NO MEMORY WAS RECORDED BEFORE, START WITH THIS VALUES otherwise it will read "255"</span><br><span class="line"> if (apertureIndex > MaxApertureIndex) {</span><br><span class="line"> apertureIndex = defaultApertureIndex;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> if (ISOIndex > MaxISOIndex) {</span><br><span class="line"> ISOIndex = defaultISOIndex;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> if (T\_expIndex > MaxTimeIndex) {</span><br><span class="line"> T\_expIndex = defaultT\_expIndex;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> if (modeIndex < 0 modeIndex > 1) {</span><br><span class="line"> // Aperture priority. Calculating shutter speed.</span><br><span class="line"> modeIndex = 0;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> if (meteringMode > 1) {</span><br><span class="line"> meteringMode = 0;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> if (ndIndex > MaxNDIndex) {</span><br><span class="line"> ndIndex = 0;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> lux = getLux();</span><br><span class="line"> refresh();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">void loop() { </span><br><span class="line"> if (millis() >= lastBatteryTime + batteryInterval) {</span><br><span class="line"> lastBatteryTime = millis();</span><br><span class="line"> battVolts = getBandgap();</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> readButtons();</span><br><span class="line"></span><br><span class="line"> menu();</span><br><span class="line"></span><br><span class="line"> if (MeteringButtonState == 0) {</span><br><span class="line"> // Save setting if Metering button pressed.</span><br><span class="line"> SaveSettings();</span><br><span class="line"></span><br><span class="line"> lux = 0;</span><br><span class="line"> refresh();</span><br><span class="line"> </span><br><span class="line"> if (meteringMode == 0) {</span><br><span class="line"> // Ambient light meter mode.</span><br><span class="line"> lightMeter.configure(BH1750::ONE\_TIME\_HIGH\_RES\_MODE\_2);</span><br><span class="line"></span><br><span class="line"> lux = getLux();</span><br><span class="line"></span><br><span class="line"> if (Overflow == 1) {</span><br><span class="line"> delay(10);</span><br><span class="line"> getLux();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> refresh();</span><br><span class="line"> delay(200);</span><br><span class="line"> } else if (meteringMode == 1) {</span><br><span class="line"> // Flash light metering</span><br><span class="line"> lightMeter.configure(BH1750::CONTINUOUS\_LOW\_RES\_MODE);</span><br><span class="line"></span><br><span class="line"> unsigned long startTime = millis();</span><br><span class="line"> uint16\_t currentLux = 0;</span><br><span class="line"> lux = 0;</span><br><span class="line"></span><br><span class="line"> while (true) {</span><br><span class="line"> // check max flash metering time</span><br><span class="line"> if (startTime + MaxFlashMeteringTime < millis()) { break; } currentLux = getLux(); delay(16); if (currentLux > lux) {</span><br><span class="line"> lux = currentLux;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> refresh();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="运行库"><a href="#运行库" class="headerlink" title="运行库"></a>运行库</h2><ul><li>Adafruit_Circuit_Playground</li><li>Adafruit_Sensor</li><li>Adafruit_SSD1306</li><li>Adafruit-GFX-Library</li><li>BH1750</li></ul><p>2020.11.23</p><h1 id="立个flag-2022-02-03"><a href="#立个flag-2022-02-03" class="headerlink" title="立个flag 2022-02-03"></a>立个flag 2022-02-03</h1><ul><li><input disabled="" type="checkbox"> 重新设计PCB</li></ul>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> 折腾 </tag>
<tag> 摄影 </tag>
</tags>
</entry>
<entry>
<title>用ESP8266扩展家中局域网</title>
<link href="/2020/08/07/%E7%94%A8esp8266%E6%89%A9%E5%B1%95%E5%AE%B6%E4%B8%AD%E5%B1%80%E5%9F%9F%E7%BD%91/"/>
<url>/2020/08/07/%E7%94%A8esp8266%E6%89%A9%E5%B1%95%E5%AE%B6%E4%B8%AD%E5%B1%80%E5%9F%9F%E7%BD%91/</url>
<content type="html"><![CDATA[<p>via <a href="https://github.com/rubfi/esp_wifi_repeater">https://github.com/rubfi/esp_wifi_repeater</a></p><h1 id=""><a href="#" class="headerlink" title=""></a><a href="https://image.krunk.cn/images/2020/08/07/image66b4119bcffcf74e.png"><img src="https://image.krunk.cn/images/2020/08/07/image66b4119bcffcf74e.png"></a></h1><h1 id="ESP无线中继器"><a href="#ESP无线中继器" class="headerlink" title="ESP无线中继器"></a>ESP无线中继器</h1><p>这是一个在esp8266作为WiFi NAT路由器的概念和实现。它可以作为现有WiFi网络的无线AP扩展。esp以STA和soft-AP模式透明转发任何IP的流量。因为它使用NAT转发,所以在网络端和连接的站点上都不需要路由条目。站点在192.168.4.0/24网络中默认通过DHCP配置,并从现有的WiFi网络接收其DNS地址。 经过测试,ESP无线中继器可以在两个方向上实现约 5 Mbps,因此即使流媒体也是可能的。ESP无线中继器还允许远程监控(或数据包嗅探),例如使用 Wireshark。</p><span id="more"></span><h1 id="烧录"><a href="#烧录" class="headerlink" title="烧录"></a>烧录</h1><p>在 Windows 上,可以使用”ESP8266 下载工具”在 <a href="https://espressif.com/en/support/download/other-tools">https://espressif.com/en/support/download/other-tools</a> 从固件目录下载两个文件 0x000000.bin 和 0x10000.bin。<em>(对于 ESP-01,将闪存大小更改为”8Mbit”)</em></p><blockquote><p>使用 V2.0.0 SDK 编译的固件无法在某些 ESP-01 模块上启动。如果遇到这些问题,请使用目录firmware_sdk_1.5.4(地址 0x00000 和 0x40000)。 我用的D1 mini也只能用firmware_sdk_1.5.4编译的固件启动</p></blockquote><p><a href="https://image.krunk.cn/images/2020/08/07/image.png"><img src="https://image.krunk.cn/images/2020/08/07/image.png"></a></p><h1 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h1><p>固件烧录完成后可以使用putty连接ESP的com口,波特率115200以修改固件默认配置 <a href="https://image.krunk.cn/images/2020/08/07/image5a41c56eb0cdadb9.png"><img src="https://image.krunk.cn/images/2020/08/07/image5a41c56eb0cdadb9.png"></a> 固件从以下默认配置开始:</p><ul><li> ssid: ssid, pasword: password</li><li> ap_ssid: MyAP, ap_password: none, ap_on: 1, ap_open: 1</li><li> network: 192.168.4.0/24</li></ul><p>这意味着它通过AP sid,密码连接到互联网,并提供一个开放的AP与ap_ssid:MyAP。此默认值可以在文件user_config. h 中更改。可以使用控制台接口覆盖默认值并持续保存为闪存。此控制台可通过 115200 波特的串行端口或 tcp 端口 7777(例如,从连接的 STA 获得”telnet 192.168.4.1 7777”)。 控制台使用以下命令:</p><ul><li> help: prints a short help message</li><li> show [configstats]: prints the current config or some statistics <em>eg:show config</em></li><li>set [ssidpasswordap_ssidap_password] <em>value</em>: changes the named config parameter set ssid TP-LINK_B9C0 set password !@#¥%……&*(( </li><li> set ap_open [01]: selects, wheter the soft-AP uses WPA2 security (ap_open=0) or no password (ap_open=1)</li><li> set ap_on [01]: selects, wheter the soft-AP is disabled (ap_on=0) or enabled (ap_on=1)</li><li> set network <em>ip-addr</em>: sets the IP address of the internal network, network is always /24, router is always x.x.x.1</li><li> set speed [80160]: sets the CPU clock frequency</li><li> set vmin <em>voltage</em>: sets the minimum battery voltage in mV. If Vdd drops below, the ESP goes into deep sleep. If 0, nothing happens</li><li> set vmin_sleep <em>time</em>: sets the time interval in seconds the ESP sleeps on low voltage</li><li> set config_port <em>portno</em>: sets the port number of the console login (default is 7777, 0 disables remote console config)</li><li> portmap add [TCPUDP] <em>external_port</em> <em>internal_ip</em> <em>internal_port</em>: adds a port forwarding</li><li> portmap remove [TCPUDP] <em>external_port</em>: deletes a port forwarding</li><li> save [dhcp]: saves the current config parameters [+ the current DHCP leases] to flash</li><li> quit: terminates a remote session</li><li> reset [factory]: resets the esp, optionally resets WiFi params to default values</li><li> lock: locks the current config, changes are not allowed</li><li> unlock <em>password</em>: unlocks the config, requires password of the network AP</li><li> scan: does a scan for APs</li><li> monitor [onoff] <em>port</em>: starts and stops monitor server on a given port</li></ul><p><a href="https://image.krunk.cn/images/2020/08/07/image40a310f55c3654de.png"><img src="https://image.krunk.cn/images/2020/08/07/image40a310f55c3654de.png"></a></p><h1 id="状态指示灯"><a href="#状态指示灯" class="headerlink" title="状态指示灯"></a>状态指示灯</h1><p>在默认配置 GPIO2 配置驱动器状态 LED(连接到 GND)与以下指示:</p><ul><li> 常亮:已启动,但未成功连接到 AP</li><li> 闪烁(1 秒):工作,连接到 AP</li><li> 非正常闪烁:工作,内部网络中的流量</li></ul><p>在user_config.h 中,可以配置备用 GPIO 端口。当配置为 GPIO1 时,它可与 ESP-01 板上的蓝色 LED 一起使用。但是,由于 GPIO1 ist 也是 UART-TX 引脚,这意味着串行控制台不工作。</p><h1 id="MQTT-支持"><a href="#MQTT-支持" class="headerlink" title="MQTT 支持"></a>MQTT 支持</h1><p>自版本 1.3 以来,路由器具有一个构建中的 MQTT 客户端(感谢 Tuan PM的库<a href="https://github.com/tuanpmt/esp_mqtt">https://github.com/tuanpmt/esp_mqtt</a>。这可以帮助将路由器/中继器集成到 IoT 中。家庭自动化系统可以例如,根据有关当前关联站的信息做出决策,它可以打开和中继器(例如,根据时间安排),或者简单地用于监视负载。路由器可以连接到本地 MQTT 代理或云中的公开代理。但是,当前它不支持 TLS 加密。 默认情况下,MQTT 客户端处于禁用状态。可以通过将配置参数”mqtt_host”设置为不同于”无”的主机名来启用它。要配置 MQTT,可以设置以下参数:</p><ul><li> set mqtt_host <em>IP_or_hostname</em>: IP or hostname of the MQTT broker (“none” disables the MQTT client)</li><li> set mqtt_user <em>username</em>: Username for authentication (“none” if no authentication is required at the broker)</li><li> set mqtt_user <em>password</em>: Password for authentication</li><li> set mqtt_id <em>clientId</em>: Id of the client at the broker (default: “ESPRouter_xxxxxx” derived from the MAC address)</li><li> set mqtt_prefix <em>prefix_path</em>: Prefix for all published topics (default: “/WiFi/ESPRouter_xxxxxx/system”, again derived from the MAC address)</li><li> set mqtt_command_topic <em>command_topic</em>: Topic subscribed to receive commands, same as from the console. (default: “/WiFi/ESPRouter_xxxxxx/command”, “none” disables commands via MQTT)</li><li> set mqtt_interval <em>secs</em>: Set the interval in which the router publishs status topics (default: 15s, 0 disables status publication)</li><li> set mqtt_mask <em>mask_in_hex</em>: Selects which topics are published (default: “ffff” means all)</li></ul><p>MQTT 参数可以使用”显示 mqtt”命令显示。</p><ul><li> <em>prefix_path</em>/Uptime: System uptime since last reset in s (mask: 0x0020)</li><li> <em>prefix_path</em>/Vdd: Voltage of the power supply in mV (mask: 0x0040)</li><li> <em>prefix_path</em>/Bpsin: Bytes/s from stations into the AP (mask: 0x0800)</li><li> <em>prefix_path</em>/Bpsout: Bytes/s from the AP to stations (mask: 0x1000)</li><li> <em>prefix_path</em>/Ppsin: Packets/s from stations into the AP (mask: 0x0200)</li><li> <em>prefix_path</em>/Ppsout: Packets/s from the AP to stations (mask: 0x0400)</li><li> <em>prefix_path</em>/Bin: Total bytes from stations into the AP (mask: 0x0080)</li><li> <em>prefix_path</em>/Bout: Total bytes from the AP to stations (mask: 0x0100)</li><li> <em>prefix_path</em>/NoStations: Number of stations currently connected to the AP (mask: 0x2000)</li><li> <em>prefix_path</em>/join: MAC address of a station joining the AP (mask: 0x0008)</li><li> <em>prefix_path</em>/leave: MAC address of a station leaving the AP (mask: 0x0010)</li><li> <em>prefix_path</em>/IP: IP address of the router when received via DHCP (mask: 0x0002)</li><li> <em>prefix_path</em>/ScanResult: Separate topic for the results of a “scan” command (one message per found AP) (mask: 0x0004)</li><li> <em>prefix_path</em>/response: The router publishes on this topic the command line output (mask: 0x0001)</li></ul><h1 id="电源管理"><a href="#电源管理" class="headerlink" title="电源管理"></a>电源管理</h1><p>中继器监控其电流电源电压(显示在”show stats”命令中)。如果_vmin(_在 mV 中,默认 0)设置为值 > 0,并且电源电压低于此值,则它将进入_深度睡眠模式 vmin_sleep_秒。如果您已将 GPIO16 连接到 RST(很难在 ESP-01 上焊接),它将在此间隔后重新启动,尝试重新连接,并将继续测量。 <a href="https://image.krunk.cn/images/2020/08/07/image9c31a7ebc2011e84.png"><img src="https://image.krunk.cn/images/2020/08/07/image9c31a7ebc2011e84.png"></a></p><hr><h1 id="运行截图"><a href="#运行截图" class="headerlink" title="运行截图"></a>运行截图</h1><p><a href="https://image.krunk.cn/images/2020/08/12/Z0_GSZR0CDRLTNBEUF.png"><img src="https://image.krunk.cn/images/2020/08/12/Z0_GSZR0CDRLTNBEUF.png" alt="Z0_GSZR0CDRLTNBEUF.png"></a> <a href="https://image.krunk.cn/images/2020/08/12/4VQ0LYHQLDXMCM91P.png"><img src="https://image.krunk.cn/images/2020/08/12/4VQ0LYHQLDXMCM91P.png" alt="4VQ0LYHQLDXMCM91P.png"></a></p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> 折腾 </tag>
</tags>
</entry>
<entry>
<title>太阳神HELIOS 44M-4</title>
<link href="/2020/05/07/%E5%A4%AA%E9%98%B3%E7%A5%9Ehelios-44m-4/"/>
<url>/2020/05/07/%E5%A4%AA%E9%98%B3%E7%A5%9Ehelios-44m-4/</url>
<content type="html"><![CDATA[<p><a href="https://history.whrblog.online/2019/04/07/image-bed-1/20200507134351.jpg"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/20200507134351.jpg"></a></p><span id="more"></span><h1 id="Helios-44"><a href="#Helios-44" class="headerlink" title="Helios 44"></a>Helios 44</h1><hr><blockquote><p> Helios 44型135镜头自1950年年初开始研制,基于卡尔-蔡司-耶拿的Biotar 2/58镜头的光学设计,最初被称为“BTK”,即BioTar Krasnogorskij,大意为克拉斯诺戈尔斯克的Biotar镜头。该镜头1958年开始在KMZ工厂正式生产,后来螺口的格里奥斯44镜头搬迁到白俄罗斯明斯克的BELOMO厂生产,卡口镜头依然在KMZ厂生产。1972年,格里奥斯44M问世,标志着该镜头开始向现代镜头演变;1981年格里奥斯44M -4定型,此后逐渐延伸出一个庞大的镜头家族。 Helios 44镜头有多重卡口,除了早期的插刀式之外,还有PK卡口、L39螺口和M42螺口。 Helios 44镜头均采用双高斯结构,使得该镜头可以轻松提供F2的大光圈,同时能够自动校正很多像差。但是由于早期双高斯结构设计上的问题,光圈全开时像场边缘部位的球形畸变校正不彻底,导致焦外光斑被压缩成椭圆形状,越靠近边缘变形越厉害,当焦外是明亮的杂乱光斑时能够形成所谓“漩涡散景”,即大家通常所说的漩焦。 Helios 44镜头版本繁多,如 Helios-44、Helios-44-2、Helios-44-7、Helios-44M、Helios-44M-4、以及后续的Helios-44M-5、Helios-44M-6和Helios-44M-7等。最早因为Helios-44-2有八片光圈,故有“八羽怪”的别称 Helios-44-2有两个用于控制光圈的光圈环,一个是无级调整光圈大小的光圈环,另一个环带有刻度,用于锁定最小光圈,以便在最大光圈下取景完毕后能迅速回到想用的光圈进行拍摄。 从Helios-44M开始,加入了自动顶针,光圈环减少为一个并带有刻度。镜头前面是对焦环,后面是光圈环,使用起来的感觉和如今的手动头一样。从Helios-44M-4开始,开始采用多层镀膜技术,分辨率大为提高</p></blockquote><hr><p><a href="https://image.krunk.cn/images/2020/05/08/IMG_0008.md.jpg"><img src="https://image.krunk.cn/images/2020/05/08/IMG_0008.md.jpg" alt="IMG_0008.md.jpg"></a><br><a href="https://image.krunk.cn/images/2020/05/08/IMG_0010.md.jpg"><img src="https://image.krunk.cn/images/2020/05/08/IMG_0010.md.jpg" alt="IMG_0010.md.jpg"></a><br><a href="https://i.loli.net/2020/05/08/I2APli6fuxDFqLa.png"><img src="https://i.loli.net/2020/05/08/I2APli6fuxDFqLa.png"></a><br><a href="https://i.loli.net/2020/05/09/j2nG6PfvbEKoZzC.jpg"><img src="https://i.loli.net/2020/05/09/j2nG6PfvbEKoZzC.jpg"></a></p><hr><h1 id="样片"><a href="#样片" class="headerlink" title="样片"></a>样片</h1><p><a href="https://history.whrblog.online/2019/04/07/image-bed-1/20200503165489.jpg"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/20200503165489.jpg"></a> <a href="https://i.loli.net/2020/05/11/mlf62tdD3BULeIM.jpg"><img src="https://i.loli.net/2020/05/11/mlf62tdD3BULeIM.jpg"></a> Canon Kiss X3 f2 0.5‘ ISO 100 <a href="https://history.whrblog.online/2019/04/07/image-bed-1/DSCF1296.JPG"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/DSCF1296.JPG" alt="FUJIFILM XT3 f4"></a> <a href="https://history.whrblog.online/2019/04/07/image-bed-1/DSCF1291.JPG"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/DSCF1291.JPG" alt="FUJIFILM XT3 f8"></a> </p><div id="player"></div><script type="text/javascript" src="https://player.dogecloud.com/js/loader"></script><script type="text/javascript">var player = new DogePlayer({ container: document.getElementById('player'), userId: 1131, vcode: 'abb6a1f3fefd5245', autoPlay: false});</script>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> 折腾 </tag>
<tag> 摄影 </tag>
</tags>
</entry>
<entry>
<title>4.7 玄风飞行基地</title>
<link href="/2020/04/08/4-7/"/>
<url>/2020/04/08/4-7/</url>
<content type="html"><![CDATA[<p><img src="https://image.krunk.cn/images/2020/04/13/IMG_0155.md.jpg"></p><span id="more"></span><p>[dogevideo]1e4b3e5ea84bd042[/dogevideo]</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> Date </tag>
<tag> Hexo </tag>
<tag> R.C </tag>
</tags>
</entry>
<entry>
<title>极致细节的无损视频</title>
<link href="/2020/03/25/lossless_video_on_500D_with_magiclantern/"/>
<url>/2020/03/25/lossless_video_on_500D_with_magiclantern/</url>
<content type="html"><![CDATA[<div id="player"></div><script type="text/javascript" src="https://player.dogecloud.com/js/loader"></script><script type="text/javascript">var player = new DogePlayer({ container: document.getElementById('player'), userId: 1131, vcode: 'c7f76db19e56338b'});</script><span id="more"></span><p>说出来可能不信,器材是09年的佳能500D加上外挂<a href="http://magiclantern.fm/">Magic lantern</a>固件</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> 折腾 </tag>
<tag> 摄影 </tag>
</tags>
</entry>
<entry>
<title>在单片机上运行Linux(转载)</title>
<link href="/2020/03/11/%E5%9C%A8avr%E5%8D%95%E7%89%87%E6%9C%BA%E4%B8%8A%E8%BF%90%E8%A1%8Clinux/"/>
<url>/2020/03/11/%E5%9C%A8avr%E5%8D%95%E7%89%87%E6%9C%BA%E4%B8%8A%E8%BF%90%E8%A1%8Clinux/</url>
<content type="html"><![CDATA[<h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><p>在Linux论坛中,常见的问题是询问Linux的最低规格是多少。常见的答案是,它需要32位体系结构,一个MMU和至少一兆字节的RAM以适合内核。该项目旨在(并成功)的粉碎这些概念。您在右侧看到的开发板基于ATmega1284p。我也使用ATmega644a取得了同样的成功。该主板没有其他处理器,并且可以启动Linux 2.6.34。实际上,它甚至可以显示完整的Ubuntu堆栈,包括(如果有时间等的话)X和gnome。</p><span id="more"></span><p><a href="https://image.krunk.cn/images/2020/03/11/board1.jpg"><img src="https://image.krunk.cn/images/2020/03/11/board1.jpg" alt="board1.jpg"></a></p><h1 id="内存"><a href="#内存" class="headerlink" title="内存"></a><strong>内存</strong></h1><p>完整的Linux安装需要兆字节或RAM和带有MMU的32位CPU。这个项目具有所有这些。首先让我们解决RAM。如您所见,板上有一个老式的30针SIMM内存模块。这些已用于基于80286的PC。它与ATmega接口,我编写了代码来访问它以及在规范内对其进行刷新(SDRAM需要不断刷新以避免丢失数据)。有多快?刷新中断每62ms发生一次,占用1.5ms,因此占用了不到3%的CPU。为了便于编程,一次访问一个字节访问RAM。这导致每秒大约300 KB的最大带宽。</p><h1 id="存储"><a href="#存储" class="headerlink" title="存储"></a>存储</h1><p>随着对RAM要求的降低,我们有两个要处理。存储不是很难解决的问题。SD卡很容易与使用SPI对话,而我的项目做到了这一点。1GB SD卡可以正常工作,尽管512Mb对于该特定文件系统(Ubuntu Jaunty)而言已足够。ATmega确实有一个硬件SPI模块,但是由于某种原因,它并没有完全解决问题,因此我在接口上做一些改动。它仍然足够快-大约每秒200千字节。这也给项目增加了一个很好的感觉-可以在任何具有足够引脚的微控制器上完成-无需使用硬件模块。 <a href="https://image.krunk.cn/images/2020/03/11/board3.jpg"><img src="https://image.krunk.cn/images/2020/03/11/board3.jpg" alt="board3.jpg"></a></p><h1 id="中央处理器"><a href="#中央处理器" class="headerlink" title="中央处理器"></a>中央处理器</h1><p>剩下的就是讨厌的32位CPU和MMU要求。那么,AVR没有MMU,而是8位的。为了克服这一障碍,我编写了一个ARM仿真器。ARM是我最熟悉的体系结构,它非常简单,可以轻松编写一个仿真器。为什么要写一个而不是移植一个?好吧,移植别人的代码是没有意思的,再加上我看到的所有仿真器都不是以易于移植到8位设备的方式编写的。原因之一:AVR编译器坚持将ints设置为16位,这样简单的事情如“(1 << 20)”会给您带来麻烦,并产生零。相反,您需要执行“(1UL << 20)”。不用说拖曳其他人的未知代码库,寻找所有假定为int且可能会失败的地方将是一场灾难。另外,我希望有机会编写一个不错的模块化ARM仿真器。所以我做了。</p><h1 id="其它功能"><a href="#其它功能" class="headerlink" title="其它功能"></a>其它功能</h1><p>该板与现实世界的通信是通过串行端口进行的。目前,它连接到运行minicom的PC上的串行端口,但是可以替代地将键盘和字符LCD连接到板上,使其完全独立。板上也有两个LED。它们发出SD卡访问信号。一读,一写。板上也有一个按钮。按住一秒钟,它将在串行端口上吐出模拟CPU的当前有效速度。AVR的主频为24MHz(比其现有的20MHz略有超频)</p><h1 id="速度有多快?"><a href="#速度有多快?" class="headerlink" title="速度有多快?"></a>速度有多快?</h1><p>uARM当然不是速度恶魔。引导到bash提示符(“ <code>init = / bin / bas</code>h”内核命令行)大约需要2个小时。然后再花4个小时来启动整个Ubuntu(“ exec init”,然后登录)。启动X需要更长的时间。有效的仿真CPU速度约为6.5KHz,与您期望的在8位微控制器上仿真32位CPU和MMU相当。<strong>奇怪的是</strong>,系统一旦启动,就可以使用了。您可以输入命令并在一分钟内得到答复。也就是说,实际上您<strong>可以</strong>使用它。例如,我今天用它来格式化SD卡。这绝对不是最快的方法,但我认为它可能是_最便宜_,<em>最慢_,_最容易组装的_,_最低的零件数量_和_最低端的</em> Linux PC。该板是用电线手工焊接的,甚至不需要印刷电路板。</p><h1 id="有关仿真器的详细信息"><a href="#有关仿真器的详细信息" class="headerlink" title="有关仿真器的详细信息"></a>有关仿真器的详细信息</h1><p>该仿真器是非常模块化的,可以随意扩展以仿真其他SoC和硬件配置。仿真的CPU是ARMv5TE。前一阵子,我开始支持ARMv6,但是由于不需要,它从未完成(如代码所示)。仿真的SoC是PXA255。由于设计的模块化,您可以替换SoC.c并使用相同的ARMv5TE内核制造一个全新的SoC,或者替换该内核,或者随意替换外围设备。这是有目的的,因为我的意思是该代码也可以作为ARM SoC工作原理的合理清晰演示。CPU模拟器本身的代码不太干净,因为它是一个CPU模拟器。它是几年前写的超过6个月的空闲时间,然后放在一边。最近专门针对该项目复活了它。仿真器实现了一个i-cache来加快处理速度。AVR上<strong>有很多</strong>功能,与我的外部RAM不同,AVR可以以每秒5兆字节的速度访问内部存储器。我从来没有实现过d-cache,但是它在待办事项列表中。对块设备的访问未模拟为SD设备。事实证明这太慢了。相反,我编写了一个半虚拟化的磁盘设备(pvdisk,请参阅pvDisk.tar.bz2,GPL许可证),该设备使用无效的操作码来调用仿真器并访问磁盘。我映像中的ramdisk加载了该pvdisk,然后将chroots加载到/ dev / pvd1。ramdisk作为“ rd.img”包含在内。我使用的“机器类型”是PalmTE2。为什么?因为我对硬件非常熟悉,所以它是我看到的第一个pxa255机器类型。</p><h1 id="超级终端?"><a href="#超级终端?" class="headerlink" title="超级终端?"></a>超级终端?</h1><p>您可以使用特殊的操作码向仿真器请求一些服务。在手臂上是<code>0xF7BBBBBB</code>,在拇指上是0xBBBB。选择它们是因为它们在ARM保证未定义的范围内。在R12中传递超级调用号,在R0..R3中传递参数,将返回值放置在R0中。来电:</p><ul><li> 0 =停止仿真</li><li> 1 =打印十进制数</li><li> 2 =打印字符</li><li> 3 =获取滑枕尺寸</li><li>4 =块设备操作(R0 =操作R1 =扇区编号)。请注意,它们不写仿真RAM,而是填充仿真器内部缓冲区,仿真来宾使用另一个超级调用(每次一个字)访问该缓冲区。我本来打算实现DMA,但从未尝试过。操作:<ul><li> 0 = getInfo(如果扇区num为零,则返回num个扇区;如果扇区num为1,则返回以字节为单位的扇区大小)</li><li> 1 =扇区读取</li><li> 2 =扇区写入</li></ul></li><li> 5 =块设备缓冲区访问(R0 =值输入/值输出,R1 =字号,如果写则R2 = 1,否则为0)</li></ul><h1 id="支持Thumb?"><a href="#支持Thumb?" class="headerlink" title="支持Thumb?"></a>支持Thumb?</h1><p>完全支持Thumb。不过,我作弊了一点,将每个thumb指令解码为等效的ARM指令,然后使用arm模拟器功能执行该指令。它没有其他方法快,但是它很简单并且代码很小。可以使用256KB的查询表,但是我觉得256KB对于微控制器的闪存来说太大了。有些thumb指令不能转换为ARM,而是可以正确处理。</p><h1 id="自己建立"><a href="#自己建立" class="headerlink" title="自己建立"></a>自己建立</h1><p>出于非商业目的,您绝对可以这样做。接线如下。RAM DQ0..DQ7-> AVR C0..C7。RAM A0..A7-> AVR A0..A7。RAM A8..A11-> AVR B0..B3。RAM nRAS nCAS nWE-> AVR D7 B4 B5。SD DI SCK DO-> AVR B6 B7 D6。LED读写-> AVR D2 D3(LED的另一脚接地)。按钮-> AVR D4(另一条腿接地)。内存可以是任何30针16MB SIMM,并且可以每64ms进行4K周期的CAS-RAS刷新之前的CAS。我所用的(OWC)可以在线购买,价格为几美元。原理图如图所示。点击查看大图 <a href="https://image.krunk.cn/images/2020/03/11/uARM_big.png"><img src="https://image.krunk.cn/images/2020/03/11/uARM_big.png" alt="uARM_big.png"></a> </p><h1 id="源代码?"><a href="#源代码?" class="headerlink" title="源代码?"></a>源代码?</h1><p>有点混乱,但确实有效。趁热获取:<a href="http://dmitry.gr/images/uARM.zip">LINK</a>。许可证对于非商业用途,只要您将许可证文件与源保持在一起并发布所有更改,如果用于商业用途,请与我联系,我们会达成协议。要构建仿真器以在PC上进行尝试,请键入“ make”</p><ul><li> 使用“ ./uARM DISK_IMAGE”。要构建优化的PC版本,</li><li> 使用“ make BUILD = opt”。为AVR构建,</li><li> 使用“ make BUILD = avr”。它目前针对ATmega1284p。</li><li> 要以ATmega644为目标,除了更改makefile之外,还要减少icache.h中的数字,以使icache足够小以适合644中的内部RAM。归档文件中还包括1284p的最终十六进制文件。</li></ul><h2 id="启动过程"><a href="#启动过程" class="headerlink" title="启动过程"></a>启动过程</h2><p>为了节省AVR中的代码空间,仿真器中几乎没有启动代码。实际上,“ ROM”总共有50个字节:8个字节可切换到拇指模式,还有一些拇指代码可读取SD卡的第一个扇区并以拇指模式跳至该扇区(请参见EmbeddedBoot.c)。SD卡的MBR具有另一个引导加载程序(以拇指模式编写)。这一节着眼于MBR,找到了活动分区并将其内容加载到RAM的末尾。然后,它跳转到目标ram地址+ 512(请参阅mbrBoot.c)。这里有第三大引导加载程序ELLE(请参阅ELLE.c)。这将重定位虚拟磁盘,设置ATAGS,然后调用内核。提供所有二进制文件和源文件,以便您可以随意制作自己的图像。引导过程应让人联想到PC引导。:)包含的mkbootimg。sh工具可用于制作启动分区的工作映像。完整的工作磁盘映像?<a href="https://mega.nz/#!0wQSSSbT!VHOZ3XhWDeyxMb8yvuCBw-GfJkpYNnnjIgl9SKWLi6Q">链接</a>。 </p><p><a href="http://dmitry.gr/?r=05.Projects&proj=07.%20Linux%20on%208bit">via</a></p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> 折腾 </tag>
</tags>
</entry>
<entry>
<title>ESP8266+Blynk做一个根开机棒</title>
<link href="/2020/01/24/esp8266blynk%E5%81%9A%E4%B8%80%E4%B8%AA%E6%A0%B9%E5%BC%80%E6%9C%BA%E6%A3%92/"/>
<url>/2020/01/24/esp8266blynk%E5%81%9A%E4%B8%80%E4%B8%AA%E6%A0%B9%E5%BC%80%E6%9C%BA%E6%A3%92/</url>
<content type="html"><![CDATA[<p><a href="https://image.krunk.cn/images/2020/01/24/IMG_20200124_131834-01.jpg"><img src="https://image.krunk.cn/images/2020/01/24/IMG_20200124_131834-01.md.jpg" alt="IMG_20200124_131834-01.jpg"></a></p><span id="more"></span><h1 id="介绍"><a href="#介绍" class="headerlink" title="介绍"></a>介绍</h1><p>这个应用程序是为启动服务器编写的,只支持启动一个设备。它需要在源码中配置WOL服务器以及配置服务器的静态IP。</p><h1 id="Devices"><a href="#Devices" class="headerlink" title="Devices"></a>Devices</h1><ol><li> ESP8266</li><li> Arduino IDE(所需库文件<a href="https://github.com/dancol90/ESP8266Ping">ESP8266Ping</a>,<a href="https://github.com/esp8266/Arduino">ESP8266 Plug-in</a>,<a href="https://github.com/blynkkk/blynk-library/releases/download/">Blynk</a>)</li><li> Blynk</li></ol><table><thead><tr><th>Variable name</th><th>Default value</th><th>Comment</th></tr></thead><tbody><tr><td>auth</td><td>Blynk_AuthToken</td><td>Blynk Auth Token (You get after the project was created in Blynk)</td></tr><tr><td>ssid</td><td>WiFi_SSID</td><td>Your WiFi network name</td></tr><tr><td>pass</td><td>WiFi_Password</td><td>Your WiFi network password</td></tr><tr><td>ip</td><td>192.168.0.123</td><td>Static IP for your WOL Server</td></tr><tr><td>gateway</td><td>192.168.0.1</td><td>Your Gateway IP address</td></tr><tr><td>bcastAddr</td><td>192.168.0.255</td><td>Your Broadcast IP address</td></tr><tr><td>subnet</td><td>255.255.255.0</td><td>Your Subnet Mask IP address</td></tr><tr><td>dns</td><td>1.1.1.1</td><td>IP address of your preferred DNS server</td></tr><tr><td>device_ip</td><td>192.168.0.234</td><td>Static IP address of device to be turned on (used for ping)</td></tr><tr><td>macAddr</td><td>aa:bb:cc:dd:ee:ff</td><td>Mac address of device to be turned on (important for the magic packet)</td></tr><tr><td>email</td><td><a href="mailto:[email protected]">[email protected]</a></td><td>Email address for notifications (when the device could not be turned on within the set time limit)</td></tr><tr><td>device_name</td><td>NAS</td><td>The short name of your device that turns on</td></tr><tr><td>boot_time</td><td>45</td><td>Maximum time to wait for the device to turn on (used for notification, read the known issues!)</td></tr></tbody></table><hr><h1 id="需要更改的代码"><a href="#需要更改的代码" class="headerlink" title="需要更改的代码"></a>需要更改的代码</h1><figure class="highlight plaintext"><table><tbody><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">//WiFi config</span><br><span class="line">const char auth\[\] = "Blynk\_AuthToken"; //Blynk Auth Token (You get after the project was created in Blynk)</span><br><span class="line">const char ssid\[\] = "WiFi\_SSID"; </span><br><span class="line">const char pass\[\] = "WiFi\_Password";</span><br><span class="line"></span><br><span class="line">const IPAddress ip(192, 168, 0, 123); //Static IP for your WOL Server</span><br><span class="line">const IPAddress gateway(192, 168, 0, 1);</span><br><span class="line">const IPAddress bcastAddr(192, 168, 0, 255);</span><br><span class="line">const IPAddress subnet(255, 255, 255, 0);</span><br><span class="line">const IPAddress dns(1, 1, 1, 1); //IP address of your preferred DNS server</span><br><span class="line"></span><br><span class="line">//WOL device config</span><br><span class="line">const IPAddress device\_ip(192, 168, 0, 234); //Static IP address of device to be turned on (used for ping)</span><br><span class="line">byte macAddr\[6\] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff}; //Mac address of device to be turned on (important for the magic packet)</span><br><span class="line"></span><br><span class="line">//Alert config</span><br><span class="line">const char email\[\] = "[email protected]";</span><br><span class="line">const char device\_name\[\] = "NAS";</span><br><span class="line">const uint16\_t boot\_time = 45;//number for countdown (It does not represent seconds, but it's close, read the known issues!)</span><br></pre></td></tr></tbody></table></figure><p><a href="https://image.krunk.cn/images/2020/01/24/-1.jpg"><img src="https://image.krunk.cn/images/2020/01/24/-1.jpg" alt="-1.jpg"></a></p><h1 id="Code"><a href="#Code" class="headerlink" title="Code"></a>Code</h1><figure class="highlight plaintext"><table><tbody><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></pre></td><td class="code"><pre><span class="line">//#define DEBUG</span><br><span class="line">#ifdef DEBUG</span><br><span class="line">#define BLYNK\_PRINT Serial</span><br><span class="line">//#define BLYNK\_DEBUG</span><br><span class="line">//#define ENABLE\_DEBUG\_PING</span><br><span class="line">#endif</span><br><span class="line"></span><br><span class="line">#define BLYNK\_NO\_BUILTIN//disable built-in analog and digital operations.</span><br><span class="line">//#define BLYNK\_NO\_INFO//disable providing info about device to the server. (saving time)</span><br><span class="line"></span><br><span class="line">#include <ESP8266WiFi.h></span><br><span class="line">#include <BlynkSimpleEsp8266.h></span><br><span class="line">#include <WiFiUdp.h></span><br><span class="line">#include <ESP8266Ping.h> </span><br><span class="line"></span><br><span class="line">//blynk colors</span><br><span class="line">#define BLYNK\_GREEN"#23C48E"</span><br><span class="line">#define BLYNK\_BLUE"#04C0F8"</span><br><span class="line">#define BLYNK\_YELLOW"#ED9D00"</span><br><span class="line">#define BLYNK\_RED"#D3435C"</span><br><span class="line">#define BLYNK\_DARK\_BLUE"#5F7CD8"</span><br><span class="line"></span><br><span class="line">//WiFi config</span><br><span class="line">const char auth\[\] = "Blynk\_AuthToken";</span><br><span class="line">const char ssid\[\] = "WiFi\_SSID";</span><br><span class="line">const char pass\[\] = "WiFi\_Password";</span><br><span class="line"></span><br><span class="line">const IPAddress ip(192, 168, 0, 123);</span><br><span class="line">const IPAddress gateway(192, 168, 0, 1);</span><br><span class="line">const IPAddress bcastAddr(192, 168, 0, 255);</span><br><span class="line">const IPAddress subnet(255, 255, 255, 0);</span><br><span class="line">const IPAddress dns(1, 1, 1, 1);</span><br><span class="line"></span><br><span class="line">//WOL device config</span><br><span class="line">const IPAddress device\_ip(192, 168, 0, 234);</span><br><span class="line">byte macAddr\[6\] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff};</span><br><span class="line"></span><br><span class="line">//Alert config</span><br><span class="line">const char email\[\] = "[email protected]";</span><br><span class="line">const char device\_name\[\] = "NAS";</span><br><span class="line">const uint16\_t boot\_time = 45;//number for countdown (It does not represent seconds, read the known issues!)</span><br><span class="line"></span><br><span class="line">//WOL</span><br><span class="line">#define MAGIC\_PACKET\_LENGTH 102</span><br><span class="line">#define PORT\_WAKEONLAN 9</span><br><span class="line">byte magicPacket\[MAGIC\_PACKET\_LENGTH\];</span><br><span class="line">unsigned int localPort = 9;</span><br><span class="line"></span><br><span class="line">WiFiUDP udp;</span><br><span class="line"></span><br><span class="line">//pins</span><br><span class="line">#define STATE\_PINV0</span><br><span class="line">#define BUTTON\_PINV1</span><br><span class="line">#define PING\_TIME\_PINV2</span><br><span class="line">#define RSSI\_PINV3</span><br><span class="line"></span><br><span class="line">//state</span><br><span class="line">struct WOLServerState {</span><br><span class="line">bool IsOnline;</span><br><span class="line">uint16\_t boot\_time;</span><br><span class="line">bool boot\_error;</span><br><span class="line">uint16\_t ping;</span><br><span class="line">uint32\_t previousMillis;</span><br><span class="line">uint32\_t interval;</span><br><span class="line">};</span><br><span class="line">WOLServerState currentState = { false, 0, false, 0, 0, 5000UL };</span><br><span class="line"></span><br><span class="line">void setup() {</span><br><span class="line">#ifdef DEBUG</span><br><span class="line">Serial.begin(115200);</span><br><span class="line">#endif</span><br><span class="line"></span><br><span class="line">connectWiFi();</span><br><span class="line">connectBlynk();</span><br><span class="line"></span><br><span class="line">//if (Blynk.connected()) {</span><br><span class="line">if (udp.begin(localPort) == 1) {</span><br><span class="line">BLYNK\_LOG("udp begin OK");</span><br><span class="line">buildMagicPacket();</span><br><span class="line">} else {</span><br><span class="line">delay(500);</span><br><span class="line">ESP.restart();</span><br><span class="line">}</span><br><span class="line">//}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">void connectWiFi() {</span><br><span class="line">WiFi.mode(WIFI\_STA);</span><br><span class="line">WiFi.hostname("WOL server");</span><br><span class="line">WiFi.config(ip, dns, gateway, subnet);</span><br><span class="line">WiFi.begin(ssid, pass);</span><br><span class="line"></span><br><span class="line">int count = 0;</span><br><span class="line">while (WiFi.status() != WL\_CONNECTED) {</span><br><span class="line">delay(250);</span><br><span class="line">digitalWrite(LED\_BUILTIN, HIGH);</span><br><span class="line">delay(250);</span><br><span class="line">digitalWrite(LED\_BUILTIN, LOW);</span><br><span class="line"></span><br><span class="line">count++;</span><br><span class="line">if (count > 20) {</span><br><span class="line">delay(500);</span><br><span class="line">ESP.restart();</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">//BLYNK\_LOG("WiFi connected, IP: %s", WiFi.localIP().toString());</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">void connectBlynk() {</span><br><span class="line">Blynk.config(auth);</span><br><span class="line">Blynk.disconnect();</span><br><span class="line"></span><br><span class="line">int count = 0;</span><br><span class="line">while (Blynk.connect(10000) == false) {</span><br><span class="line">delay(250);</span><br><span class="line">digitalWrite(LED\_BUILTIN, HIGH);</span><br><span class="line">delay(250);</span><br><span class="line">digitalWrite(LED\_BUILTIN, LOW);</span><br><span class="line"></span><br><span class="line">count++;</span><br><span class="line">if (count > 20) {</span><br><span class="line">delay(500);</span><br><span class="line">ESP.restart();</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">BLYNK\_LOG("Blynk connected");</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">void loop() {</span><br><span class="line">// Reconnect WiFi</span><br><span class="line">if (WiFi.status() != WL\_CONNECTED) {</span><br><span class="line">connectWiFi();</span><br><span class="line">return;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">// Reconnect to Blynk Cloud</span><br><span class="line">if (!Blynk.connected()) {</span><br><span class="line">connectBlynk();</span><br><span class="line">return;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">uint32\_t currentMillis = millis();</span><br><span class="line">if (currentMillis - currentState.previousMillis >= currentState.interval) {</span><br><span class="line">currentState.previousMillis = currentMillis;</span><br><span class="line"></span><br><span class="line">if (currentState.boot\_time == 0) {</span><br><span class="line">currentState.interval = 5000UL;</span><br><span class="line">} else {</span><br><span class="line">currentState.boot\_time--;</span><br><span class="line">if (currentState.boot\_time == 0) {</span><br><span class="line">currentState.boot\_error = true;</span><br><span class="line">Blynk.email(email, "{DEVICE\_NAME} : Alert", String(device\_name) + " could not be turned on!");</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">if (Ping.ping(device\_ip, 1)) {</span><br><span class="line">currentState.IsOnline = true;</span><br><span class="line">currentState.boot\_error = false;</span><br><span class="line">currentState.boot\_time = 0;</span><br><span class="line">currentState.ping = Ping.averageTime();</span><br><span class="line">} else {</span><br><span class="line">currentState.IsOnline = false;</span><br><span class="line">currentState.ping = 0;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">Blynk.run();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">// Generate magic packet</span><br><span class="line">void buildMagicPacket() {</span><br><span class="line">memset(magicPacket, 0xFF, 6);</span><br><span class="line">for (int i = 0; i < 16; i++) { int ofs = i \* sizeof(macAddr) + 6; memcpy(&magicPacket\[ofs\], macAddr, sizeof(macAddr)); } } //BLYNK\_CONNECTED() { // Blynk.syncVirtual(BUTTON\_PIN); //} // BOOT PC button handler of application BLYNK\_WRITE(BUTTON\_PIN) { if (!currentState.IsOnline && currentState.boot\_time == 0) { BLYNK\_LOG("AppButtonWakeOnLan: value=%d", param.asInt()); udp.beginPacket(bcastAddr, PORT\_WAKEONLAN); udp.write(magicPacket, MAGIC\_PACKET\_LENGTH); udp.endPacket(); currentState.boot\_time = boot\_time; currentState.interval = 1000UL; } } BLYNK\_READ(STATE\_PIN) { Blynk.virtualWrite(RSSI\_PIN, WiFi.RSSI()); Blynk.virtualWrite(PING\_TIME\_PIN, currentState.ping); if (currentState.IsOnline) { Blynk.setProperty(STATE\_PIN, "color", BLYNK\_GREEN); Blynk.virtualWrite(STATE\_PIN, String(device\_name) + " is Online"); Blynk.setProperty(BUTTON\_PIN, "color", BLYNK\_DARK\_BLUE); Blynk.setProperty(BUTTON\_PIN, "offLabel", String(device\_name) + " running..."); Blynk.setProperty(BUTTON\_PIN, "onLabel", String(device\_name) + " running..."); } else if (!currentState.IsOnline && currentState.boot\_time > 0) {</span><br><span class="line">Blynk.setProperty(STATE\_PIN, "color", BLYNK\_BLUE);</span><br><span class="line">Blynk.virtualWrite(STATE\_PIN, "Waiting for ping...");</span><br><span class="line"></span><br><span class="line">Blynk.setProperty(BUTTON\_PIN, "color", BLYNK\_YELLOW);</span><br><span class="line">Blynk.setProperty(BUTTON\_PIN, "offLabel", currentState.boot\_time);</span><br><span class="line">Blynk.setProperty(BUTTON\_PIN, "onLabel", "Waiting for ping...");</span><br><span class="line">} else if (!currentState.IsOnline && currentState.boot\_time == 0 && currentState.boot\_error) {</span><br><span class="line">Blynk.setProperty(STATE\_PIN, "color", BLYNK\_RED);</span><br><span class="line">Blynk.virtualWrite(STATE\_PIN, "Oops! Something happened, Try It Again!");</span><br><span class="line"></span><br><span class="line">Blynk.setProperty(BUTTON\_PIN, "color", BLYNK\_YELLOW);</span><br><span class="line">Blynk.setProperty(BUTTON\_PIN, "offLabel", "Try It Again");</span><br><span class="line">Blynk.setProperty(BUTTON\_PIN, "onLabel", "Magic Packet has been sent");</span><br><span class="line">} else {</span><br><span class="line">Blynk.setProperty(STATE\_PIN, "color", BLYNK\_RED);</span><br><span class="line">Blynk.virtualWrite(STATE\_PIN, String(device\_name) + " is Offline");</span><br><span class="line"></span><br><span class="line">Blynk.setProperty(BUTTON\_PIN, "color", BLYNK\_BLUE);</span><br><span class="line">Blynk.setProperty(BUTTON\_PIN, "offLabel", "Turn On");</span><br><span class="line">Blynk.setProperty(BUTTON\_PIN, "onLabel", "Magic Packet has been sent");</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h1 id="Blynk"><a href="#Blynk" class="headerlink" title="Blynk"></a>Blynk</h1><p><img src="https://image.krunk.cn/images/2020/01/24/TIM20200124142924.md.jpg" alt="TIM20200124142924.jpg"> <img src="https://camo.githubusercontent.com/51545377e6fb634a2db39a6f43c8f83f7cafd31c/68747470733a2f2f7777772e656d7369742e736b2f536861726564436f6e74656e742f4769744875622f455350383236365f426c796e6b5f574f4c5f5365727665722f325f7468756d626e61696c2e706e67"> </p><p><a href="https://github.com/Pnoxi/ESP8266_Blynk_WOL_Server">via</a></p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> 折腾 </tag>
<tag> Raspi/Orapi </tag>
</tags>
</entry>
<entry>
<title>行摄北疆</title>
<link href="/2019/08/18/%E6%96%B0%E7%96%86/"/>
<url>/2019/08/18/%E6%96%B0%E7%96%86/</url>
<content type="html"><![CDATA[<div id="player_a2cbd5de91db84e1"></div><script type="text/javascript" src="https://player.dogecloud.com/js/loader"></script><script type="text/javascript">var player = new DogePlayer({ container: document.getElementById('player_a2cbd5de91db84e1'), userId: 1131, vcode: 'a2cbd5de91db84e1', autoPlay: false});</script><hr><h2 id="2019-8-17"><a href="#2019-8-17" class="headerlink" title="2019.8.17"></a>2019.8.17</h2><p>飞机承载着我对遥远北疆的热忱,在滑行道上缓缓升腾,在气流的颠簸里,我知道我此时已在离北疆越来越近的路途上了,那是个令人心驰神往的名词——北疆。</p><p>从平原到戈壁,从绿洲到雪山。造物主的鬼斧神工恍若中国水墨的手笔一般,那奇妙的白茫茫的雾爬进了我们的视野,模糊了云层的日光,并把那高空底下的层峦叠嶂幻化成了迷一般的幢幢怪影。 终于来到了向往已久的天山北麓,大自然用五彩斑斓的画笔给黄土高坡添置了别样的色彩,新疆——触手可及。 </p><!-- more --><p>雪山,雪岭无限延伸;雪峰,肃立威严。北国的冬雪尚未化尽,一座座山峦此起彼伏、银装素裹、延绵千里,那盘踞的身形恍若九天银河洒落人间阅尽千帆。那山脚下干的树枝虬劲疏落,在蓝天夏日的背景下仿佛国画,偏爱空白,也颇留意趣。有时有一群飞鸟循声觅食,在夕阳里,徒留几声凄清的脆鸣,袅袅于空谷山间。 </p><p><img src="https://image.whrblog.online/file/whrblog-image/2022/12/aPrDQYqlKEcwdF8.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0431.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0455.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0449.jpg"></p><hr><h2 id="2019-8-18"><a href="#2019-8-18" class="headerlink" title="2019.8.18"></a>2019.8.18</h2><p>行驶在独库公路上才能感到真正的孤独,裸露的岩壁,空无一人的公路,满是落石的路基。在这里,每一块岩石都在诉说这不同的故事。雪山半掩琵琶半遮面似得躲在云层后面,不由得增加了几分神秘感。 在这条一天可以体验四季的路上,每一个峰回路转都有别样的一番景致,正如移步换景一般,上一帧还是深不见底大峡谷,下一帧就变成了沟壑纵横的雪山。从针叶林到高山草甸再到雪线……甚是迷人。<br>翻越雪山,一扫之前裸露的岩石滩,取而代之的是那郁郁葱葱的高山草甸,那是天公的神来之笔,满眼的苍翠从眼前开始延伸,直至渺远的他方,我想它可能是上苍对人世浮沉的些微怜悯。而那悠然的牛羊带着那偶尔露怯的眼神,惊慌地穿过公路,晃悠悠朝着远处走去,印着薄日的光,留下几个淡淡背影……极目远眺,那是修建独库公路的人在这片荒凉的土地挥着汗洒下泪,而我此时正踏在祖国的这方土地之上,闻着这方泥土淳朴的芬芳,我想那当是工人们灵魂的芬芳。 </p><p><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0633.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0648.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0644.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0695.jpg"></p><hr><h2 id="2019-8-19"><a href="#2019-8-19" class="headerlink" title="2019.8.19"></a>2019.8.19</h2><p>再次飞驰在独库公路上,太阳渐渐地从云层后露了出来,晨曦撒在远处巍峨的雪山上,犹如戴上了金顶。远山层峦叠起,草地色泽丰富,湖泊清如明镜,牛羊马儿悠闲自得。 平直的公路,向前飞驰的轿车,耳边呼呼的风声,再一次把我们带入雪山,驶向南疆,太阳又羞答答地躲在了云层之后。延绵的山路像绸带一般缠绕在延绵的雪上。 海拔一点点上升,车外气温一点点下降,我们距离雪线的距离也越来越近。<br>越过雪线,翻过那重峦叠嶂,气势滂沱的天山山脉,又是延绵不断的下坡路,但是景致与北疆截然不同:这些“远看成岭侧成峰,远近高低各不同”的红色岩壁,静静的屹立在广袤的戈壁滩上,那是一种岑峦迭起的壮丽,是一种傲风凌雪的气度,更是一种气定山河的坦荡。<br>库车大峡谷集雄、静、险、幽、神为一体,无不赞美叫绝。两侧红色峡谷陡峭险峻,谷内蜿蜒曲折、幽静深邃。 </p><p><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0755.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0816.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0846.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0868.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0864.jpg"></p><p>再折回,天气如同孩子似得,豆大的雨点从天上打下来。再向前,翻回之前的雪山。随着海拔的再次上升,豆大的雨点变成了鹅毛一般的大雪。穿出隧道,雪花如同幕布一样飘落。在这里我终于体验到了千里冰封万里雪飘的北国风光。</p><p><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0921.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0954.jpg"></p><hr><h2 id="2019-8-20"><a href="#2019-8-20" class="headerlink" title="2019.8.20"></a>2019.8.20</h2><p>那拉提在准噶尔蒙古语中意为“最先见到太阳的地方” 挺拔的胡杨,环绕的山峦,哈萨克牧民的毡房,成群的牛羊,无不被它的美丽所震撼。 向前远眺,一望无际的草原,牛羊成群,骏马飞腾,哈萨克牧民那纯白的毡房点缀其间;路边各色的野花,风吹过沙沙作响,及腰的野草…… “天苍苍,野茫茫,风吹草低见牛羊”好像就是为那拉提所写。</p><p><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_0998.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1057.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1060.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1063.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1197.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1208.jpg"></p><hr><h2 id="2019-8-21"><a href="#2019-8-21" class="headerlink" title="2019.8.21"></a>2019.8.21</h2><p>雪白的云朵装着天空那无边的喜悦,如同棉花糖一般轻飘飘地浮游飘动着,恍若触手可及,在明净的天边演绎着斑斓的人生,千姿百态。 八卦城,相对称的结构,如同八卦一般放射状圆形的布局,街道如神奇迷宫般,街街相通,路路相连,极具有神秘色彩。相传乌孙王建城时,以太极坛为中心,八匹马朝着八个方向规划,形成一个八卦形态。 </p><p><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1282.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/20b5f65246814ef9a457cb0caefd5b3f.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1394-Panorama_zip2.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/33-29.jpg"></p><hr><h2 id="2019-8-22"><a href="#2019-8-22" class="headerlink" title="2019.8.22"></a>2019.8.22</h2><p>夏塔清丽开阔的雪山下,留有着小溪飞扬的身姿,潺潺的流水声在讲述着乌孙古道当年的辉煌。<br>在峡谷中穿行,云卷云舒,光影似武,天山山脉木扎特峰在蓝天下呈现,雪山一面,不枉此行。雪山仿佛近在咫尺,又远在天边。<br>抬头,漆黑的幕布上,偶尔璀璨的星辰在倾诉北疆之夜的寂寥。它闪屏一般地规律眨眼,像极了梵高笔下一帧又一帧变化流淌的罗纳河上的星夜,偌大的夜晚只有漫天的星辰懂得它的黑。而今,这样一望无际的夜空里,我猜测大概是藏着上帝对漫漫人世羞赧的怜悯与深沉的爱,让它在深刻的色调里走向永恒,正印证了那句话:每个人的心里都有一团火,路过的人只看到烟。 </p><p><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1451.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/YPQjd6ftzu9gyHF.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1583.jpg"></p><hr><h2 id="2019-8-23"><a href="#2019-8-23" class="headerlink" title="2019.8.23"></a>2019.8.23</h2><p>八月末的赛里木湖送走了酷暑难耐的夏天,迎来了凉风习习的秋天。寒风起草地黄,应了这句话,这正是一个青黄不接的的季节,白天的日照依旧如往常强烈,而下车时身上携带的热量,经不住湖畔的大风之来势,三两下的吹拂便随之消弭殆尽,只剩下了丝丝凉意不住地往袖口里钻。八月末的赛里木湖周边的景致也略显单薄。<br>高原地区,气候出乎意料的多变,正如“东边日出西边雨”,穿越云雨区,阳光依旧。 夕阳慢慢移到了山的后方,光影随时间一分一秒地更迭,暗蓝的天空和旖旎的晚霞流光溢彩,这是夕阳跌落于地平线前给予世人最后的馈赠。</p><p><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1721.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1813.jpg"><br><img src="https://image.whrblog.online/file/whrblog-image/2022/12/IMG_1825.jpg"></p><hr><p><img src="https://s2.loli.net/2022/10/24/LYuvUaqA47zSnsy.png" alt="Bookmark Style Card"></p><hr>]]></content>
<tags>
<tag> Date </tag>
<tag> 摄影 </tag>
<tag> 行者笔记 </tag>
</tags>
</entry>
<entry>
<title>树莓派+SSD1306屏幕</title>
<link href="/2019/08/07/%E6%A0%91%E8%8E%93%E6%B4%BEssd1306%E5%B1%8F%E5%B9%95/"/>
<url>/2019/08/07/%E6%A0%91%E8%8E%93%E6%B4%BEssd1306%E5%B1%8F%E5%B9%95/</url>
<content type="html"><![CDATA[<p><a href="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_20190804_165053.jpg"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_20190804_165053.jpg"></a></p><span id="more"></span><h1 id="启用树莓派的I2C功能"><a href="#启用树莓派的I2C功能" class="headerlink" title="启用树莓派的I2C功能"></a>启用树莓派的I2C功能</h1><figure class="highlight plaintext"><table><tbody><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">sudo apt-get install -y python-smbus</span><br><span class="line">sudo apt-get install -y i2c-tools</span><br><span class="line">sudo raspi-config</span><br></pre></td></tr></tbody></table></figure><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Interfacing Options-->I2C-->enable</span><br></pre></td></tr></tbody></table></figure><hr><h1 id="安装库文件"><a href="#安装库文件" class="headerlink" title="安装库文件"></a>安装库文件</h1><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo python -m pip install --upgrade pip setuptools wheel</span><br></pre></td></tr></tbody></table></figure><p>PIL 库</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get install python-pil python3-pil</span><br></pre></td></tr></tbody></table></figure><p>Adafruit-SSD1306 库</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone https://github.com/adafruit/Adafruit\_Python\_SSD1306.git</span><br></pre></td></tr></tbody></table></figure><hr><h1 id="连接屏幕"><a href="#连接屏幕" class="headerlink" title="连接屏幕"></a>连接屏幕</h1><p><a href="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1565147846250&di=7ee10e48ad53b034f6f3effa0257bba9&imgtype=0&src=http://upload.semidata.info/new.eefocus.com/article/image/2019/01/11/5c380a5770ccf.jpg"><img src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1565147846250&di=7ee10e48ad53b034f6f3effa0257bba9&imgtype=0&src=http://upload.semidata.info/new.eefocus.com/article/image/2019/01/11/5c380a5770ccf.jpg"></a> 屏幕 GND 接树莓派 GND 屏幕 VCC 接树莓派 3V3 屏幕 SDA 接树莓派 SDA 屏幕 SCL 接树莓派 SCL</p><hr><h1 id="检测是否识别到-I2C-设备"><a href="#检测是否识别到-I2C-设备" class="headerlink" title="检测是否识别到 I2C 设备"></a>检测是否识别到 I2C 设备</h1><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo i2cdetect -y 1</span><br></pre></td></tr></tbody></table></figure><h1 id="运行"><a href="#运行" class="headerlink" title="运行"></a>运行</h1><p>在之前克隆的代码中包含了可以直接运行的示例源码</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo nano ~/Adafruit\_Python\_SSD1306/examples/stats.py</span><br></pre></td></tr></tbody></table></figure><p>修改屏幕类型</p><figure class="highlight plaintext"><table><tbody><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"># 128x32 display with hardware I2C:</span><br><span class="line"># disp = Adafruit\_SSD1306.SSD1306\_128\_32(rst=RST)</span><br><span class="line"> </span><br><span class="line"># 128x64 display with hardware I2C:</span><br><span class="line">disp = Adafruit\_SSD1306.SSD1306\_128\_64(rst=RST)</span><br><span class="line"> </span><br><span class="line"># Note you can change the I2C address by passing an i2c\_address parameter like:</span><br><span class="line"># disp = Adafruit\_SSD1306.SSD1306\_128\_64(rst=RST, i2c\_address=0x3C)</span><br></pre></td></tr></tbody></table></figure><p>运行</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo python ~/Adafruit\_Python\_SSD1306/examples/stats.py</span><br></pre></td></tr></tbody></table></figure><p><a href="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_20190804_161202.jpg"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_20190804_161202.jpg"></a></p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo python ~/Adafruit\_Python\_SSD1306/examples/image.py</span><br></pre></td></tr></tbody></table></figure><p><a href="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_20190804_161458.jpg"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_20190804_161458.jpg"></a></p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> 折腾 </tag>
<tag> Raspi/Orapi </tag>
</tags>
</entry>
<entry>
<title>树莓派lot=Node.js+Bylnk+DHT11/DHT22</title>
<link href="/2019/07/30/%E6%A0%91%E8%8E%93%E6%B4%BEnode-jsbylnk-appdht11-dht22-am2302/"/>
<url>/2019/07/30/%E6%A0%91%E8%8E%93%E6%B4%BEnode-jsbylnk-appdht11-dht22-am2302/</url>
<content type="html"><![CDATA[<h1 id=""><a href="#" class="headerlink" title=""></a><a href="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_20190731_160014.jpg"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_20190731_160014.jpg"></a></h1><span id="more"></span><h1 id="安装npm及Bylnk库"><a href="#安装npm及Bylnk库" class="headerlink" title="安装npm及Bylnk库"></a>安装npm及Bylnk库</h1><p> </p><figure class="highlight plaintext"><table><tbody><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">sudo apt install npm -y</span><br><span class="line">sudo apt-get install build-essential</span><br><span class="line">sudo npm install -g npm</span><br><span class="line">sudo npm install -g onoff</span><br><span class="line">sudo npm install -g blynk-library</span><br></pre></td></tr></tbody></table></figure><h1 id="安装传感器库"><a href="#安装传感器库" class="headerlink" title="安装传感器库"></a>安装传感器库</h1><ul><li> <a href="http://www.airspayce.com/mikem/bcm2835/">bcm2835库</a></li><li> <a href="https://github.com/momenso/node-dht-sensor">node-dht-sensor</a> npm包</li></ul><figure class="highlight plaintext"><table><tbody><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">wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.46.tar.gz</span><br><span class="line">tar zxvf bcm2835-1.46.tar.gz</span><br><span class="line">cd bcm2835-1.46</span><br><span class="line">./configure</span><br><span class="line">make</span><br><span class="line">sudo make check</span><br><span class="line">sudo make install</span><br><span class="line">sudo npm install -g node-dht-sensor</span><br></pre></td></tr></tbody></table></figure><h1 id="连接传感器"><a href="#连接传感器" class="headerlink" title="连接传感器"></a>连接传感器</h1><ul><li> GND至GND</li><li> DAT信号到GPIO7</li><li> VCC至3.3v</li></ul><h1 id="创建可执行文件"><a href="#创建可执行文件" class="headerlink" title="创建可执行文件"></a>创建可执行文件</h1><figure class="highlight plaintext"><table><tbody><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">cd ~</span><br><span class="line">git clone https://github.com/wanghurui/Blynk-dht11-22.git</span><br></pre></td></tr></tbody></table></figure><p>或者</p><figure class="highlight js"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> blynkLib = <span class="built_in">require</span>(<span class="string">'blynk-library'</span>);</span><br><span class="line"><span class="keyword">var</span> sensorLib = <span class="built_in">require</span>(<span class="string">'node-dht-sensor'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> <span class="variable constant_">AUTH</span> = <span class="string">'YOUR\_AUTH\_TOKEN'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Setup Blynk</span></span><br><span class="line"><span class="keyword">var</span> blynk = <span class="keyword">new</span> blynkLib.<span class="title class_">Blynk</span>(<span class="variable constant_">AUTH</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// Setup sensor, exit if failed</span></span><br><span class="line"><span class="keyword">var</span> sensorType = <span class="number">11</span>; <span class="comment">// 11 for DHT11, 22 for DHT22 and AM2302</span></span><br><span class="line"><span class="keyword">var</span> sensorPin = <span class="number">4</span>; <span class="comment">// The GPIO pin number for sensor signal</span></span><br><span class="line"><span class="keyword">if</span> (!sensorLib.<span class="title function_">initialize</span>(sensorType, sensorPin)) {</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">warn</span>(<span class="string">'Failed to initialize sensor'</span>);</span><br><span class="line"> process.<span class="title function_">exit</span>(<span class="number">1</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// Automatically update sensor value every 2 seconds</span></span><br><span class="line"><span class="built_in">setInterval</span>(<span class="keyword">function</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">var</span> readout = sensorLib.<span class="title function_">read</span>();</span><br><span class="line"> blynk.<span class="title function_">virtualWrite</span>(<span class="number">3</span>, readout.<span class="property">temperature</span>.<span class="title function_">toFixed</span>(<span class="number">1</span>));</span><br><span class="line"> blynk.<span class="title function_">virtualWrite</span>(<span class="number">4</span>, readout.<span class="property">humidity</span>.<span class="title function_">toFixed</span>(<span class="number">1</span>));</span><br><span class="line"> </span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'Temperature:'</span>, readout.<span class="property">temperature</span>.<span class="title function_">toFixed</span>(<span class="number">1</span>) + <span class="string">'C'</span>);</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'Humidity: '</span>, readout.<span class="property">humidity</span>.<span class="title function_">toFixed</span>(<span class="number">1</span>) + <span class="string">'%'</span>);</span><br><span class="line">}, <span class="number">2000</span>);</span><br><span class="line"></span><br><span class="line">将**<span class="variable constant_">YOUR</span>\_AUTH\_TOKEN**替换为<span class="title class_">App</span>中的令牌。</span><br></pre></td></tr></tbody></table></figure><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo NODE\_PATH =/usr/local/lib/node\_modules node ./blynk-sensor-test.js</span><br></pre></td></tr></tbody></table></figure><p>输出应如下所示</p><figure class="highlight js"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">OnOff</span> mode</span><br><span class="line"><span class="title class_">Connecting</span> to <span class="attr">TCP</span>: cloud.<span class="property">blynk</span>.<span class="property">cc</span> <span class="number">8442</span></span><br><span class="line"><span class="title class_">Connected</span></span><br><span class="line"><span class="title class_">Temperature</span>: <span class="number">18.</span>0C</span><br><span class="line"><span class="title class_">Humidity</span>: <span class="number">26.0</span>%</span><br><span class="line"><span class="title class_">Temperature</span>: <span class="number">18.</span>0C</span><br><span class="line"><span class="title class_">Humidity</span>: <span class="number">26.0</span>%</span><br></pre></td></tr></tbody></table></figure><p>可以使用pm2将此程序放在后台守护进程并且开机自启动</p><figure class="highlight plaintext"><table><tbody><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">npm install -g pm2</span><br><span class="line">sudo NODE\_PATH=/usr/local/lib/node\_modules pm2 start ./blynk-sensor-test.js</span><br><span class="line">sudo pm2 save</span><br><span class="line">sudo pm2 startup</span><br></pre></td></tr></tbody></table></figure><p> <a href="https://history.whrblog.online/2019/04/07/image-bed-1/20190730071339.png"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/20190730071339.png"></a></p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> 折腾 </tag>
<tag> Raspi/Orapi </tag>
</tags>
</entry>
<entry>
<title>2019.7.19</title>
<link href="/2019/07/20/2019-7-19/"/>
<url>/2019/07/20/2019-7-19/</url>
<content type="html"><![CDATA[<h2 id="何谓友情?何谓缘分?"><a href="#何谓友情?何谓缘分?" class="headerlink" title="何谓友情?何谓缘分?"></a>何谓友情?何谓缘分?</h2><hr><span id="more"></span><p>是离别时远隔重洋却心照不宣的默契,是多年来老旧相片里昔日光景的纪念,是与你聊的同一话题时一起旁若无人的开怀大笑,是茫茫人海行色匆匆里曾经彼此熟悉的身影…… 青春的颜色,是真情的颜色;相聚总是太少,真情总被无情错过。 希望多年以后,你仍然能在别人面前自豪的说出:“我是你的朋友”。</p><hr><p><a href="https://history.whrblog.online/2019/04/07/image-bed-1/20190720150444.jpg"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/20190720150444.jpg"></a> <a href="https://history.whrblog.online/2019/04/07/image-bed-1/20190720150244.jpg"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/20190720150244.jpg"></a> <a href="https://history.whrblog.online/2019/04/07/image-bed-1/20190720150439.jpg"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/20190720150439.jpg"></a> <a href="https://history.whrblog.online/2019/04/07/image-bed-1/20190720150314.jpg"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/20190720150314.jpg"></a></p><hr><p>2019.7.20</p><p>Whr</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> Date </tag>
<tag> Hexo </tag>
<tag> Friends </tag>
<tag> R.C </tag>
</tags>
</entry>
<entry>
<title>2019.6.29 大嵛山岛笔记</title>
<link href="/2019/06/30/2019-6-29-%E5%A4%A7%E5%B5%9B%E5%B1%B1%E5%B2%9B%E7%AC%94%E8%AE%B0/"/>
<url>/2019/06/30/2019-6-29-%E5%A4%A7%E5%B5%9B%E5%B1%B1%E5%B2%9B%E7%AC%94%E8%AE%B0/</url>
<content type="html"><![CDATA[<p>大嵛山岛—-是闽东最大的列岛,是一个坐落在福鼎东南海域,距离三沙古镇港5海里,他由大嵛山、小嵛山、鸳鸯岛、银屿等十一个大小岛屿组成,大嵛山岛曾被中国国家地理”杂志社评为“中国最美的地方”中“最美的海岛”第八名。其山、湖、草、海在此浓缩。天湖四周山坡平缓,是有“南国天山”之誉的万亩草场。</p><p>嵛山岛地理位置特殊,扼闽浙海路之咽喉,是南来北往船只的必经之道,战略意义重大。明朝时期为抵御倭寇骚扰,1389年明政府在嵛山岛设置军事要塞,归北路福宁卫烽火寨管辖,1592年改守备为参将、节制水陆,改中军为嵛山游。清代中叶,嵛山列岛是蔡牵海上起义活动的重要根据地。辛亥革命先驱朱腾芬先生也在此组织义军抗清。</p><span id="more"></span><p>山势回环,路随山转,岛上的旅游巴士在这蜿蜒曲折的山路上飞驰着。随着海拔的增高,视线内的景物也随之变化,从灌木丛变成了高山草甸,从涓涓的小溪变成了气势滂沱的瀑布。旅游巴士一路颠簸,我们眼中摇摇晃晃的崎岖山路里承载的尽是一行人无尽的好奇与向往,我们驻足停留来到了山腰。<a href="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_0199.JPG"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_0199.JPG"></a> 刚涉足这片陌生的土地,无比沉闷的湿气里一股沁人心脾草籽的清香扑面而来 我们沿着盘山步道一点一点向大嵛山山顶登去。我们行走在山脊上,缭绕的雾气被山顶的强风吹散,呼吸着雾气特有的味道,藏在雾霭中的两个天池逐渐拭去混沌,越发清冽。 <a href="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_0265.JPG"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_0265.JPG"></a> 天池周围群峰环拱,其状似盂,这可能就是嵛山岛名字的来源吧。在这里恍若置身于“天苍苍,野茫茫,风吹草低见牛羊”的大西北草原。如果不是我们来这里旅行,难以想象在碧波万顷的东海之上竟有如此风云奇诡的意境。 <a href="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_0227.JPG"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/IMG_0227.JPG"></a> 我极目远眺,它拼命掩面,半伏半隐,挣扎着躲进袅袅的雾霭中去。潮湿的季风将山间的云雾升腾出如海市蜃楼的形状;蓝天上,是上帝的一半明媚一半忧伤。山峦间,是悠悠的水,袅袅的烟,静静的谱写着属于大嵛山的歌…… </p><p>2019.6.29</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> Date </tag>
<tag> 摄影 </tag>
<tag> 行者笔记 </tag>
<tag> Hexo </tag>
</tags>
</entry>
<entry>
<title>用WP-CLI给WordPress更换域名</title>
<link href="/2019/03/02/%E7%94%A8wp-cli%E7%BB%99wordpress%E6%9B%B4%E6%8D%A2%E5%9F%9F%E5%90%8D/"/>
<url>/2019/03/02/%E7%94%A8wp-cli%E7%BB%99wordpress%E6%9B%B4%E6%8D%A2%E5%9F%9F%E5%90%8D/</url>
<content type="html"><![CDATA[<p>wp-cli 是一个命令行工具,可以让我们通过命令行安装、更新 WordPress,对 WordPress 执行一些批量操作,响应速度快,使用方便</p><span id="more"></span><p><img src="https://history.whrblog.online/2019/04/07/image-bed-1/kqSUFU.png"></p><h2 id="安装-wp-cli-工具"><a href="#安装-wp-cli-工具" class="headerlink" title="安装 wp-cli 工具"></a>安装 wp-cli 工具</h2><p>curl -O <a href="https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar">https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar</a><br>chmod +x wp-cli.phar<br>sudo mv wp-cli.phar /usr/local/bin/wp</p><h2 id="搜索替换-WordPress-数据库中的域名"><a href="#搜索替换-WordPress-数据库中的域名" class="headerlink" title="搜索替换 WordPress 数据库中的域名"></a>搜索替换 WordPress 数据库中的域名</h2><p>wp-cli 工具为我们提供了一个搜索替换数据库中字符的命令,<strong>直接在 WordPress 的根目录执行</strong>以下命令即可完成更换 WordPress 域名的操作,该命令支持一些选项方便我们自定义操作,具体查看 wp search-replace 命令的官方说明。</p><p>wp search-replace ‘old.com’ ‘new.com’</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> 折腾 </tag>
<tag> Wordpress </tag>
</tags>
</entry>
<entry>
<title>小米路由器mini/mini青春版 刷入Openwrt固件</title>
<link href="/2019/02/19/%E5%B0%8F%E7%B1%B3%E8%B7%AF%E7%94%B1%E5%99%A8mini%E5%88%B7%E5%85%A5lean-r9-1-1%E5%9B%BA%E4%BB%B6/"/>
<url>/2019/02/19/%E5%B0%8F%E7%B1%B3%E8%B7%AF%E7%94%B1%E5%99%A8mini%E5%88%B7%E5%85%A5lean-r9-1-1%E5%9B%BA%E4%BB%B6/</url>
<content type="html"><![CDATA[<p><a href="https://history.whrblog.online/2019/04/07/image-bed-1/5c8db64171e04.jpg"><img src="https://history.whrblog.online/2019/04/07/image-bed-1/5c8db64171e04.jpg" alt="mmexport1552791022636.jpg" title="mmexport1552791022636.jpg"></a></p><ol><li> 刷开发版</li><li> 打开ssh</li><li> 刷入breed</li><li> 刷入固件</li></ol><hr><span id="more"></span><h1 id="0-1小米路由器刷入开发版"><a href="#0-1小米路由器刷入开发版" class="headerlink" title="0.1小米路由器刷入开发版"></a>0.1小米路由器刷入开发版</h1><h2 id="小米路由器mini"><a href="#小米路由器mini" class="headerlink" title="小米路由器mini"></a>小米路由器mini</h2><p>在MiWiFi官网<a href="www1.miwifi.com">www.miwifi.com</a>,下载 ROM Mini的开发版,下载完毕后放入fat32格式U盘下的根目录,并将包名改为miwifi.bin 断开路由器的电源,将U盘插入路由器的USB接口,用细长的工具按住reset后,接通电源,待路由器指示灯变为黄灯闪烁时,松开reset。 大约3-5分钟后,指示灯变成黄色常亮状态时可以拔掉U盘,此时刷机已经完成正在重启,稍等片刻路由器指示灯变蓝就可以正常使用了。</p><h2 id="小米路由器mini青春版"><a href="#小米路由器mini青春版" class="headerlink" title="小米路由器mini青春版"></a>小米路由器mini青春版</h2><p>由于青春版没有usb的缺陷,只能使用后台的手动上传固件的方式进行刷入开发版 链接: <a href="https://pan.baidu.com/s/1rG3qNVrbPKnj0G3orQU5Mg">https://pan.baidu.com/s/1rG3qNVrbPKnj0G3orQU5Mg</a> 提取码: i422 下载旧版本的青春版开发版,在后台“常用设置” –>“系统状态”–>“手动上传更新包”完成刷机</p><hr><h1 id="0-2开启路由器ssh"><a href="#0-2开启路由器ssh" class="headerlink" title="0.2开启路由器ssh"></a>0.2开启路由器ssh</h1><p>将小米路由器插上电源,这里不要让小米路由器联网(不需要小米路由器的Internet口连接另一台路由器的LAN口),连接小米路由器WiFi,打开后台页面<a href="192.168.31.1">192.168.31.1</a>,配置小米路由器工作模式为“普通路由器工作模式”应该是默认,并且配置WiFi密码以及后台登录密码。 登录后台,在登录后可以在首页上看到小米路由器的sn,通过sn查询路由器ssh登录密码。 用一台可以联网的设备打开<a href="http://www.iptvfans.cn/miwifi/passwd">http://www.iptvfans.cn/miwifi/passwd</a>复制sn到查询框中即可获取登录密码</p><p><img src="https://history.whrblog.online/2019/04/07/image-bed-1/kg4mvQ.png" alt="kg4mvQ.png"></p><p>打开终端:</p><ul><li> windows下推荐使用putty,在IP处填入小米路由器的ip,也就是192.168.31.1其他不动。然后会弹出一个关于密匙的窗口,点击yes即可。log as后填写root password是之前查询的密码。<img src="https://history.whrblog.online/2019/04/07/image-bed-1/5c8db641deadc.jpg" alt="mmexport1552791038364.jpg" title="mmexport1552791038364.jpg"></li><li>Mac OS下的终端可以参考这个<a href="https://jingyan.baidu.com/article/f3e34a1289cda3f5eb6535c0.html">https://jingyan.baidu.com/article/f3e34a1289cda3f5eb6535c0.html</a>在终端中输入 ssh <a href="mailto:[email protected]">[email protected]</a> 并按下回车后同windows</li></ul><hr><h1 id="1-0全盘备份"><a href="#1-0全盘备份" class="headerlink" title="1.0全盘备份"></a>1.0全盘备份</h1><p>插入U盘并新建文件夹(青春版请跳过)</p><figure class="highlight plaintext"><table><tbody><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">cd /extdisks/sda1</span><br><span class="line">mkdir xiaomi\_rom\_backup</span><br></pre></td></tr></tbody></table></figure><p>备份</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cat /proc/mtd</span><br></pre></td></tr></tbody></table></figure><p><img src="https://history.whrblog.online/2019/04/07/image-bed-1/kg7tBQ.png" alt="kg7tBQ.png"></p><figure class="highlight plaintext"><table><tbody><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">dd if=/dev/mtd0 of=/extdisks/sda1/xiaomi\_rom\_backup/all.bin</span><br><span class="line">dd if=/dev/mtd1 of=/extdisks/sda1/xiaomi\_rom\_backup/bootloader.bin</span><br><span class="line">dd if=/dev/mtd2 of=/extdisks/sda1/xiaomi\_rom\_backup/config.bin</span><br><span class="line">dd if=/dev/mtd3 of=/extdisks/sda1/xiaomi\_rom\_backup/factory.bin</span><br><span class="line">dd if=/dev/mtd4 of=/extdisks/sda1/xiaomi\_rom\_backup/os1.bin</span><br><span class="line">dd if=/dev/mtd5 of=/extdisks/sda1/xiaomi\_rom\_backup/rootfs.bin</span><br><span class="line">dd if=/dev/mtd6 of=/extdisks/sda1/xiaomi\_rom\_backup/os2.bin</span><br><span class="line">dd if=/dev/mtd7 of=/extdisks/sda1/xiaomi\_rom\_backup/overlay.bin</span><br><span class="line">dd if=/dev/mtd8 of=/extdisks/sda1/xiaomi\_rom\_backup/crash.bin</span><br><span class="line">dd if=/dev/mtd9 of=/extdisks/sda1/xiaomi\_rom\_backup/reserved.bin</span><br><span class="line">dd if=/dev/mtd10 of=/extdisks/sda1/xiaomi\_rom\_backup/bdata.bin</span><br></pre></td></tr></tbody></table></figure><p>如果是青春版的话请执行</p><figure class="highlight plaintext"><table><tbody><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">dd if=/dev/mtd0 of=/tmp/all.bin</span><br><span class="line">dd if=/dev/mtd1 of=/tmp/bootloader.bin</span><br><span class="line">dd if=/dev/mtd2 of=/tmp/config.bin</span><br><span class="line">dd if=/dev/mtd3 of=/tmp/factory.bin</span><br><span class="line">dd if=/dev/mtd4 of=/tmp/os1.bin</span><br><span class="line">dd if=/dev/mtd5 of=/tmp/rootfs.bin</span><br><span class="line">dd if=/dev/mtd6 of=/tmp/os2.bin</span><br><span class="line">dd if=/dev/mtd7 of=/tmp/overlay.bin</span><br><span class="line">dd if=/dev/mtd8 of=/tmp/crash.bin</span><br><span class="line">dd if=/dev/mtd9 of=/tmp/reserved.bin</span><br><span class="line">dd if=/dev/mtd10 of=/tmp/bdata.bin</span><br></pre></td></tr></tbody></table></figure><p>备份完成后请及时使用winscp把备份文件拷出,避免刷breed时内存不足导致路由器变砖。 输出应该是这样的</p><figure class="highlight plaintext"><table><tbody><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">root@XiaoQiang:~# dd if=/dev/mtd0 of=/extdisks/sda1/xiaomi\_rom\_backup/all.bin</span><br><span class="line">32768+0 records in</span><br><span class="line">32768+0 records out</span><br><span class="line">root@XiaoQiang:~# dd if=/dev/mtd1 of=/extdisks/sda1/xiaomi\_rom\_backup/bootloader.bin</span><br><span class="line">384+0 records in</span><br><span class="line">384+0 records out</span><br><span class="line">root@XiaoQiang:~# dd if=/dev/mtd2 of=/extdisks/sda1/xiaomi\_rom\_backup/config.bin</span><br><span class="line">128+0 records in</span><br><span class="line">128+0 records out</span><br><span class="line">root@XiaoQiang:~# dd if=/dev/mtd3 of=/extdisks/sda1/xiaomi\_rom\_backup/factory.bin</span><br><span class="line">128+0 records in</span><br><span class="line">128+0 records out</span><br><span class="line">root@XiaoQiang:~# dd if=/dev/mtd4 of=/extdisks/sda1/xiaomi\_rom\_backup/os1.bin</span><br><span class="line">25600+0 records in</span><br><span class="line">25600+0 records out</span><br><span class="line">root@XiaoQiang:~# dd if=/dev/mtd5 of=/extdisks/sda1/xiaomi\_rom\_backup/rootfs.bin</span><br><span class="line">22716+1 records in</span><br><span class="line">22716+1 records out</span><br><span class="line">root@XiaoQiang:~# dd if=/dev/mtd6 of=/extdisks/sda1/xiaomi\_rom\_backup/os2.bin</span><br><span class="line">4096+0 records in</span><br><span class="line">4096+0 records out</span><br><span class="line">root@XiaoQiang:~# dd if=/dev/mtd7 of=/extdisks/sda1/xiaomi\_rom\_backup/overlay.bin</span><br><span class="line">2048+0 records in</span><br><span class="line">2048+0 records out</span><br><span class="line">root@XiaoQiang:~# dd if=/dev/mtd8 of=/extdisks/sda1/xiaomi\_rom\_backup/crash.bin</span><br><span class="line">128+0 records in</span><br><span class="line">128+0 records out</span><br><span class="line">root@XiaoQiang:~# dd if=/dev/mtd9 of=/extdisks/sda1/xiaomi\_rom\_backup/reserved.bin</span><br><span class="line">128+0 records in</span><br><span class="line">128+0 records out</span><br><span class="line">root@XiaoQiang:~# dd if=/dev/mtd10 of=/extdisks/sda1/xiaomi\_rom\_backup/bdata.bin</span><br><span class="line">128+0 records in</span><br><span class="line">128+0 records out</span><br></pre></td></tr></tbody></table></figure><hr><h1 id="1-1刷入Bootloader"><a href="#1-1刷入Bootloader" class="headerlink" title="1.1刷入Bootloader"></a>1.1刷入Bootloader</h1><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cd /tmp</span><br></pre></td></tr></tbody></table></figure><p>在电脑上下载好小米路由器mini专用的breed<a href="https://breed.hackpascal.net/breed-mt7620-xiaomi-mini.bin">https://breed.hackpascal.net/breed-mt7620-xiaomi-mini.bin</a>使用scp工具拷入路由器的/tmp目录中 青春版请使用<a href="https://breed.hackpascal.net/breed-mt7688-reset38.bin">https://breed.hackpascal.net/breed-mt7688-reset38.bin</a></p><ul><li> windows下使用winscp</li><li> MacOS/unix/linux使用shell里的scp命令</li><li> 密码还是之前sn查询的密码</li></ul><p>Linux/Unix下详细命令</p><figure class="highlight plaintext"><table><tbody><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 /tmp</span><br><span class="line">wget https://breed.hackpascal.net/breed-mt7620-xiaomi-mini.bin</span><br><span class="line">scp ./breed-mt7620-xiaomi-mini.bin [email protected]:/tmp</span><br></pre></td></tr></tbody></table></figure><p>刷入Bootloader</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mtd -r write /tmp/breed-mt7620-xiaomi-mini.bin Bootloader</span><br></pre></td></tr></tbody></table></figure><hr><h1 id="1-2刷入固件"><a href="#1-2刷入固件" class="headerlink" title="1.2刷入固件"></a>1.2刷入固件</h1><h2 id="mini"><a href="#mini" class="headerlink" title="mini"></a>mini</h2><p>下载固件<a href="https://1jjklacnz-my.sharepoint.com/personal/alog_1_jjkl_ac_nz/_layouts/15/download.aspx?share=ETxwSwq7ms9JoISMXlZpPB8BtTJ8lBaX270VraNKh3ZBTA&ithint=.bin">https://1jjklacnz-my.sharepoint.com/personal/alog_1_jjkl_ac_nz/_layouts/15/download.aspx?share=ETxwSwq7ms9JoISMXlZpPB8BtTJ8lBaX270VraNKh3ZBTA&ithint=.bin</a></p><h2 id="青春版"><a href="#青春版" class="headerlink" title="青春版"></a>青春版</h2><p>下载固件<a href="https://drive.google.com/file/d/1b-PJ9C1JQWO0/_gmVWNgFckuEbS43eM97/view?usp=sharing">https://drive.google.com/file/d/1b-PJ9C1JQWO0\_gmVWNgFckuEbS43eM97/view?usp=sharing</a> 断电关闭路由器 更改电脑适配器设置,并设置IPv4:IP是192.168.1.2,子网掩码:255.255.255.0,默认网关:192.168.1.1 捅路由器上的reset键开机,过一会浏览器打开192.168.1.1,上传你下载的固件。 <img src="https://history.whrblog.online//2019/04/07/image-bed-1/kgbVdH.jpg" alt="kgbVdH.jpg"> <img src="https://history.whrblog.online/2019/04/07/image-bed-1/kgbEee.jpg" alt="kgbEee.jpg"> 刷入方法可以借鉴一下我的<a href="http://www.whrblog.online/archives/1111">TPlink842硬改篇</a> 等待刷完之后手动重启路由器即可。</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> miwifi </tag>
<tag> 折腾 </tag>
</tags>
</entry>
<entry>
<title>TP link 842 v4.4硬改手记</title>
<link href="/2019/01/21/tp-link-842-v4-4%E7%A1%AC%E6%94%B9%E6%89%8B%E8%AE%B0/"/>
<url>/2019/01/21/tp-link-842-v4-4%E7%A1%AC%E6%94%B9%E6%89%8B%E8%AE%B0/</url>
<content type="html"><![CDATA[<p>TPlink家族的路由器都有一个很大的问题,新路由器买回来十分好用,在用了几年之后各种卡网,各种宕机……早在一年前就萌生了硬改的想法,只是一直忙于学业😌😌😌</p><hr><span id="more"></span><p>趁着刚考完试的闲暇时间,买来了flash,ddr和编程器。买的时候犯了一个大错误-_-,买flash没有查手册,看着w25q32v以为是32m的flash就下单了,在快递回来的几天左思右想找不到32m的固件,还去论坛询问,后来查手册才发现是4m的flash,可玩性大大降低了。(︶^︶)</p><hr><h1 id="0x01"><a href="#0x01" class="headerlink" title="0x01"></a>0x01</h1><p>某宝上购买了两块winbond的W25Q32V的flash和HY64的DDR内存,还有一个CH341A的编程器。开始吐槽编程器,有一个晶振竟然是虚焊的,差评…… <img src="https://history.whrblog.online/2019/04/07/image-bed-1/kPbopd.md.jpg?raw=true" alt="kPbopd.jpg"> <img src="https://history.whrblog.online/2019/04/07/image-bed-1/kPqVNF.md.jpg?raw=true" alt="kPqVNF.jpg"></p><hr><h1 id="0x02"><a href="#0x02" class="headerlink" title="0x02"></a>0x02</h1><p>开始烧固件,系统是windows7 x64,没有出现不兼容的情况。刷入大H的breed,并在0001fc00写入在路由器背面的MAC地址,不然连网络都没有。店家给的转接板也不能用,无奈用手把flash摁在编程器上4分钟,刷了两次才成功,第一次手抖了一下卡在了83%,回想起论坛上各种spi flash坏道导致的问题,一阵阵冷汗不由自主地冒了出来。 还好没有什么大碍,又读了出来,摁的4分钟刷刷网页很快就过去了,手摁得有点僵,再一次差评…. <img src="https://history.whrblog.online/2019/04/07/image-bed-1/kitSw4.md.png"></p><hr><h1 id="0x03"><a href="#0x03" class="headerlink" title="0x03"></a>0x03</h1><p>把这个66脚的ddr焊到主板上去,我承认我是在外面找人焊的,这个对我来说太困难了,哪怕焊上去也是灯全部亮,系统没有反应,更可能的是焊盘掉了两三个,路由器废了。 后果.jpg <img src="http://history.whrblog.online/2019/04/07/image-bed-1/k3j6II.jpg" alt="k3j6II.jpg"></p><hr><h1 id="0x04"><a href="#0x04" class="headerlink" title="0x04"></a>0x04</h1><p>在电脑段设置静态ip,ip地址为192.168.1.1,掩码为255.255.255.0,网关为192.168.1.1 在路由器上电开机前,捅住restart,接上电源,当看到LED灯全部亮起后闪了一下松开,打开浏览器访问192.168.1.1,不出意外的情况下就是之前刷好的breed了 <img src="https://history.whrblog.online/2019/04/07/image-bed-1/kitpTJ.md.png" alt="kitpTJ.md.png"> 在固件中心刷入openwrt固件和art无线修正固件,刷入速度极快。openwrt固件用了恩山AndyX大神的4m精简固件<a href="https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=270339">OpenWrt/LEDE 4M精简迷你固件-Luci界面-SFE加速-SQM分配-UPNP-IPv6-VLAN支持-WIFI计划</a> art无线修正的文件我上传到了git上<a href="https://github.com/wanghurui/Router-art-firmware">https://github.com/wanghurui/Router-art-firmware</a> <img src="https://history.whrblog.online/2019/04/07/image-bed-1/kiYvOU.md.png"> SFE效果如下图,本地网速几乎增加了1m/s <img src="https://history.whrblog.online/2019/04/07/image-bed-1/kmDnmD.jpg"></p><hr><h1 id="0x05"><a href="#0x05" class="headerlink" title="0x05"></a>0x05</h1><p>激动人心的时刻,刷完后的自动重启,在等了大概30s后跳出了下面这个页面 <img src="https://history.whrblog.online/2019/04/07/image-bed-1/kiYjyT.png" alt="kiYjyT.png"> 下图为Luci界面 <img src="https://history.whrblog.online//2019/04/07/image-bed-1/kitPYR.md.png" alt="kitPYR.md.png"> 在刷了机之后,无线性能只能用时间去测量它,掉线的情况应该少了,在家里的Xiaomi TV上测出来的峰值网速可以有5m/s,对于30m的有线通宽带已经心满意足了。 <img src="https://history.whrblog.online/2019/04/07/image-bed-1/kitCk9.png" alt="kitCk9.png"> 由于内存只有4m,而且刷完了之后只有150+k可以使用,一开始想在路由器上实现smartdns和koolproxy的都因为内存不足而放弃。不过我觉得在/tmp目录安装opkg和软件很ok😹😹😹</p><h1 id="0x06-Bugs"><a href="#0x06-Bugs" class="headerlink" title="0x06 Bugs"></a>0x06 Bugs</h1><p>貌似Andy X的固件crontab有问题:我正确配置了crontab设置了每天6点自动重启,可是没有一次成功😐</p><p>Wed May 29 06:00:43 2019 daemon.info hostapd: wlan0: STA 68:db:ca:23:1f:71 WPA: group key handshake completed (RSN)<br>Wed May 29 06:00:43 2019 daemon.info hostapd: wlan0: STA b0:65:bd:68:1a:9c WPA: group key handshake completed (RSN)</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> 折腾 </tag>
</tags>
</entry>
<entry>
<title>Monlor tools 2.0</title>
<link href="/2018/11/09/1017/"/>
<url>/2018/11/09/1017/</url>
<content type="html"><![CDATA[<p>工具箱2.0已经比较完善了, 出于学习的目的, 想重新写新的工具箱, 尝试支持更多的固件. 现有工具箱处于维护状态, 有严重bug可能会更新解决一下.</p><span id="more"></span><p>如果Koolshare大佬们写的软件中心2.0有希望能移植到小米路由器, 也可以考虑移植而不开发新的工具箱. <img src="https://www.monlor.com/images/180727-1.png" alt="工具箱界面"></p><blockquote><p>工具箱正处于测试状态,安装需要有一定的动手能力。 支持以下的路由器,arm路由: R1D R2D R3D,mips路由: R3 R3P R3G R1CM 目前支持了以下几种插件:</p></blockquote><blockquote><ol><li> <a href="https://www.zerotier.com/">ZeroTier</a></li><li> <a href="http://koolshare.b0.upaiyun.com/">KoolProxy</a></li><li> <a href="http://aria2.github.io/">Aria2</a></li><li> <a href="https://security.appspot.com/vsftpd.html">VsFtpd</a></li><li> <a href="https://github.com/Wind4/vlmcsd">kms</a></li><li> <a href="https://github.com/fatedier/frp">Frpc</a></li><li> <a href="https://github.com/dosgo/ngrok-c">Ngrok</a></li><li> <a href="https://github.com/shellinabox/shellinabox">WebShell</a></li><li> <a href="https://github.com/tinyproxy/tinyproxy">TinyProxy</a></li><li> <a href="https://github.com/Entware/Entware-ng">Entware</a></li><li> <a href="https://kodcloud.com/">KodExplorer</a></li><li> <a href="http://koolshare.cn/thread-129199-1-1.html">EasyExplorer</a></li><li> <a href="http://nginx.org/">HttpFile</a></li><li> <a href="http://verysync.com/">VerySync</a></li><li> <a href="https://github.com/fffonion/Xunlei-Fastdick">FastDick</a></li><li> <a href="https://www.netfilter.org/">FireWall</a></li><li> <a href="http://blog.lanyus.com/archives/174.html">JetBrains</a></li><li> <a href="http://koolshare.cn/thread-127783-1-1.html">QianDao</a></li><li> <a href="https://github.com/filebrowser/filebrowser">FileBrowser</a></li></ol></blockquote><hr><h3 id="安装方式"><a href="#安装方式" class="headerlink" title="安装方式"></a>安装方式</h3><h4 id="插件的安装"><a href="#插件的安装" class="headerlink" title="插件的安装"></a>插件的安装</h4><ol><li> 离线安装插件,<code>appmanage.sh add /tmp/kms.tar.gz</code>安装插件</li><li> 在线安装插件,默认下载源coding.net,安装命令<code>appmanage.sh add kms</code></li><li> monlor命令一键安装插件[推荐]</li></ol><h4 id="一键安装命令"><a href="#一键安装命令" class="headerlink" title="一键安装命令"></a>一键安装命令</h4><p><code>curl -kfsSl https://coding.net/u/monlor/p/Monlor-Tools/git/raw/master/install.sh</code></p><hr><h3 id="工具箱命令"><a href="#工具箱命令" class="headerlink" title="工具箱命令"></a>工具箱命令</h3><ol><li> 卸载:<code>uninstall.sh</code> (不推荐)</li><li> 更新:<code>update.sh [-f]</code> (不推荐)</li><li> 初始化:<code>init.sh</code></li><li> 插件管理:<code>appmanage.sh addupgradedel appname [-f]</code></li><li> 工具箱配置:<code>monlor</code> (任意界面Ctrl + c可以退出配置)</li><li> 在线更新:<code>sh -c "$(curl -kfsSl $(uci get monlor.tools.url)/scripts/update.sh)"</code></li><li> 在线卸载:<code>sh -c "$(curl -kfsSl $(uci get monlor.tools.url)/scripts/uninstall.sh)"</code></li></ol><hr><h3 id="目录结构"><a href="#目录结构" class="headerlink" title="目录结构"></a>目录结构</h3><figure class="highlight plaintext"><table><tbody><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></tbody></table></figure><hr><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><ol><li> 如果插件和工具箱都有更新,请务必先更新工具箱!</li><li> 工具箱没有web界面,完全靠Shell开发,插件的安装、卸载、配置由配置文件完成。</li><li> 安装完成后执行monlor命令配置工具箱,Ctrl + c或者输入exit可以退出。</li><li> 关于迅雷快鸟FastDick,请按<a href="https://github.com/fffonion/Xunlei-Fastdick">Xunlei-Fastdick</a>这里的教程运行swjsq.py并找到运行成功后生成的swjsq_wget.sh文件,提取里面的uid,pwd,peerid即可。</li><li> 插件列表显示异常运行<code>rm -rf $(uci get monlor.tools.path)/config/applist.txt</code>,运行monlor会自动获取插件列表</li><li> 提问前请指出你的路由器型号,工具箱版本。如果是插件问题运行<code>cat /var/log/appname*</code>命令提交日志给我(appname为插件名,部分插件没有日志)</li></ol><h3 id="Monlor-tools已经不再更新,最新工具箱请移步到http-blog-whrblog-online-archives-1093"><a href="#Monlor-tools已经不再更新,最新工具箱请移步到http-blog-whrblog-online-archives-1093" class="headerlink" title="Monlor tools已经不再更新,最新工具箱请移步到http://blog.whrblog.online/archives/1093"></a>Monlor tools已经不再更新,最新工具箱请移步到<a href="http://blog.whrblog.online/archives/1093">http://blog.whrblog.online/archives/1093</a></h3>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> miwifi </tag>
</tags>
</entry>
<entry>
<title>SmartDNS</title>
<link href="/2018/11/03/smartdns/"/>
<url>/2018/11/03/smartdns/</url>
<content type="html"><![CDATA[<p><img src="http://https//pymumu.github.io/smartdns/doc/smartdns-banner.png"> SmartDNS是一个运行在本地的DNS服务器,SmartDNS接受本地客户端的DNS查询请求,从多个上游DNS服务器获取DNS查询结果,并将访问速度最快的结果返回个客户端,避免DNS污染,提高网络访问速度。</p><span id="more"></span><p>同时支持指定特定域名IP地址,并高性匹配,达到过滤广告的效果。 与dnsmasq的all-servers不同,smartdns返回的是访问速度最快的解析结果。 支持树莓派,openwrt,华硕路由器等设备。</p><h2 id="软件效果展示"><a href="#软件效果展示" class="headerlink" title="软件效果展示"></a>软件效果展示</h2><p><strong>阿里DNS</strong> 使用阿里DNS查询百度IP,并检测结果。</p><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">pi@raspberrypi:~/code/smartdns_build $ nslookup www.baidu.com 223.5.5.5</span><br><span class="line">Server: 223.5.5.5</span><br><span class="line">Address: 223.5.5.5#53</span><br><span class="line"></span><br><span class="line">Non-authoritative answer:</span><br><span class="line">www.baidu.com canonical name = www.a.shifen.com.</span><br><span class="line">Name: www.a.shifen.com</span><br><span class="line">Address: 180.97.33.108</span><br><span class="line">Name: www.a.shifen.com</span><br><span class="line">Address: 180.97.33.107</span><br><span class="line"></span><br><span class="line">pi@raspberrypi:~/code/smartdns_build $ ping 180.97.33.107 -c 2</span><br><span class="line">PING 180.97.33.107 (180.97.33.107) 56(84) bytes of data.</span><br><span class="line">64 bytes from 180.97.33.107: icmp_seq=1 ttl=55 time=24.3 ms</span><br><span class="line">64 bytes from 180.97.33.107: icmp_seq=2 ttl=55 time=24.2 ms</span><br><span class="line"></span><br><span class="line">--- 180.97.33.107 ping statistics ---</span><br><span class="line">2 packets transmitted, 2 received, 0% packet loss, time 1001ms</span><br><span class="line">rtt min/avg/max/mdev = 24.275/24.327/24.380/0.164 ms</span><br><span class="line">pi@raspberrypi:~/code/smartdns_build $ ping 180.97.33.108 -c 2</span><br><span class="line">PING 180.97.33.108 (180.97.33.108) 56(84) bytes of data.</span><br><span class="line">64 bytes from 180.97.33.108: icmp_seq=1 ttl=55 time=31.1 ms</span><br><span class="line">64 bytes from 180.97.33.108: icmp_seq=2 ttl=55 time=31.0 ms</span><br><span class="line"></span><br><span class="line">--- 180.97.33.108 ping statistics ---</span><br><span class="line">2 packets transmitted, 2 received, 0% packet loss, time 1001ms</span><br><span class="line">rtt min/avg/max/mdev = 31.014/31.094/31.175/0.193 ms</span><br></pre></td></tr></tbody></table></figure><p><strong>smartdns</strong> 使用SmartDNS查询百度IP,并检测结果。</p><figure class="highlight plaintext"><table><tbody><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">pi@raspberrypi:~/code/smartdns_build $ nslookup www.baidu.com</span><br><span class="line">Server: 192.168.1.1</span><br><span class="line">Address: 192.168.1.1#53</span><br><span class="line"></span><br><span class="line">Non-authoritative answer:</span><br><span class="line">www.baidu.com canonical name = www.a.shifen.com.</span><br><span class="line">Name: www.a.shifen.com</span><br><span class="line">Address: 14.215.177.39</span><br><span class="line"></span><br><span class="line">pi@raspberrypi:~/code/smartdns_build $ ping 14.215.177.39 -c 2</span><br><span class="line">PING 14.215.177.39 (14.215.177.39) 56(84) bytes of data.</span><br><span class="line">64 bytes from 14.215.177.39: icmp_seq=1 ttl=56 time=6.31 ms</span><br><span class="line">64 bytes from 14.215.177.39: icmp_seq=2 ttl=56 time=5.95 ms</span><br><span class="line"></span><br><span class="line">--- 14.215.177.39 ping statistics ---</span><br><span class="line">2 packets transmitted, 2 received, 0% packet loss, time 1001ms</span><br><span class="line">rtt min/avg/max/mdev = 5.954/6.133/6.313/0.195 ms</span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><p>从对比看出,smartdns找到访问<a href="http://www.baidu.com最快的ip地址,这样访问百度比阿里dns速度快5倍./">www.baidu.com最快的IP地址,这样访问百度比阿里DNS速度快5倍。</a></p><h2 id="特性"><a href="#特性" class="headerlink" title="特性"></a>特性</h2><ol><li> <strong>多DNS上游服务器</strong> 支持配置多个上游DNS服务器,并同时进行查询,即使其中有DNS服务器异常,也不会影响查询。</li><li> <strong>返回最快IP地址</strong> 支持从域名所属IP地址列表中查找到访问速度最快的IP地址,并返回给客户端,避免DNS污染,提高网络访问速度。</li><li> <strong>支持非标准端口</strong> 支持非53端口查询,支持TCP查询,有效避免DNS污染。</li><li> <strong>特定域名IP地址指定</strong> 支持指定域名的IP地址,达到广告过滤效果,避免恶意网站的效果。</li><li> <strong>域名高性能后缀匹配</strong> 支持域名后缀匹配模式,简化过滤配置,过滤20万条记录时间<1ms</li><li> <strong>Linux多平台支持</strong> 支持标准Linux系统(树莓派),openwrt系统各种固件,华硕路由器原生固件。</li><li> <strong>支持IPV4, IPV6双栈</strong> 支持IPV4,IPV6网络,支持查询A, AAAA记录。</li><li> <strong>高性能,占用资源少</strong> 多线程异步IO模式,cache缓存查询结果。</li></ol><h2 id="架构"><a href="#架构" class="headerlink" title="架构"></a>架构</h2><p> </p><ol><li> SmartDNS接收本地网络设备的DNS查询请求,如PC,手机的查询请求。</li><li> SmartDNS将查询请求发送到多个上游DNS服务器,可采用标准UDP查询,非标准端口UDP查询,及TCP查询。</li><li> 上游DNS服务器返回域名对应的Server IP地址列表。SmartDNS检测与本地网络访问速度最快的Server IP。</li><li> 将访问速度最快的Server IP返回给本地客户端。</li></ol><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><h3 id="下载配套安装包"><a href="#下载配套安装包" class="headerlink" title="下载配套安装包"></a>下载配套安装包</h3><hr><p>下载配套版本的SmartDNS安装包,对应安装包配套关系如下。</p><p>系统</p><p>安装包</p><p>说明</p><p>标准Linux系统(树莓派)</p><p>smartdns.xxxxxxxx.armhf.deb</p><p>支持树莓派Raspbian stretch,Debian 9系统。</p><p>标准Linux系统(x86_64)</p><p>smartdns.xxxxxxxx.x86_64..tar.gz</p><p>支持x86_64系统。</p><p>华硕原生固件(optware)</p><p>smartdns.xxxxxxx.mipsbig.ipk</p><p>支持MIPS大端架构的系统,如RT-AC55U, RT-AC66U.</p><p>华硕原生固件(optware)</p><p>smartdns.xxxxxxx.mipsel.ipk</p><p>支持MIPS小端架构的系统,如RT-AC68U。</p><p>华硕原生固件(optware)</p><p>smartdns.xxxxxxx.arm.ipk</p><p>支持arm小端架构的系统,如RT-AC88U。</p><p>openwrt 15.01</p><p>smartdns.xxxxxxxx.ar71xx.ipk</p><p>支持AR71XX MIPS系统。</p><p>openwrt 15.01</p><p>smartdns.xxxxxxxx.ramips_24kec.ipk</p><p>支持MT762X等小端路由器</p><p>openwrt 15.01(潘多拉)</p><p>smartdns.xxxxxxxx.mipsel_24kec_dsp.ipk</p><p>支持MT7620系列的潘多拉固件</p><p>openwrt LEDE</p><p>smartdns.xxxxxxxx.mips_24kc.ipk</p><p>支持AR71XX MIPS系统。</p><p>openwrt LEDE</p><p>smartdns.xxxxxxxx.mipsel_24kc.ipk</p><p>支持MT726X等小端路由器</p><p>openwrt LEDE</p><p>smartdns.xxxxxxxx.x86_64.ipk</p><p>支持x86_64路由器</p><p>openwrt LEDE</p><p>smartdns.xxxxxxxxxxx.arm_cortex-a9.ipk</p><p>支持arm A9核心CPU的路由器</p><p>openwrt LEDE</p><p>smartdns.xxxxxxxxx.arm_cortex-a7_neon-vfpv4.ipk</p><p>支持arm A7核心CPU的路由器</p><p>openwrt LUCI</p><p>luci-app-smartdns.xxxxxxxxx.xxxx.all.ipk</p><p>openwrt管理统一界面</p><ul><li> openwrt系统CPU架构比较多,上述表格未列出所有支持系统,请查看CPU架构后下载。</li><li> merlin梅林固件理论和华硕固件一致,所以根据硬件类型安装相应的ipk包即可。(梅林暂时未验证,有问题提交issue)</li><li>CPU架构可在路由器管理界面找到,查看方法: 登录路由器,点击<code>System</code>-><code>Software</code>,点击<code>Configuration</code> Tab页面,在opkg安装源中可找到对应软件架构,下载路径中可找到,如下,架构为ar71xx <figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">src/gz chaos_calmer_base http://downloads.openwrt.org/chaos_calmer/15.05/ar71xx/generic/packages/base</span><br></pre></td></tr></tbody></table></figure> 请在Release页面下载:<a href="https://github.com/pymumu/smartdns/releases">此处下载</a></li></ul><h3 id="标准Linux系统安装(树莓派-X86-64系统)"><a href="#标准Linux系统安装(树莓派-X86-64系统)" class="headerlink" title="标准Linux系统安装(树莓派, X86_64系统)"></a>标准Linux系统安装(树莓派, X86_64系统)</h3><hr><ol><li>安装 下载配套安装包<code>smartdns.xxxxxxxx.armhf.deb</code>,并上传到Linux系统中。 执行如下命令安装 <figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">dpkg -i smartdns.xxxxxxxx.armhf.deb</span><br></pre></td></tr></tbody></table></figure></li><li>修改配置 安装完成后,可配置smartdns的上游服务器信息。具体配置参数参考<code>配置参数</code>说明。 一般情况下,只需要增加<code>server [IP]:port</code>, <code>server-tcp [IP]:port</code>配置项, 尽可能配置多个上游DNS服务器,包括国内外的服务器。配置参数请查看<code>配置参数</code>章节。 <figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /etc/smartdns/smartdns.conf</span><br></pre></td></tr></tbody></table></figure></li><li>启动服务 <figure class="highlight plaintext"><table><tbody><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 enable smartdns</span><br><span class="line">systemctl start smartdns</span><br></pre></td></tr></tbody></table></figure></li><li>将DNS请求转发的SmartDNS解析。 修改本地路由器的DNS服务器,将DNS服务器配置为SmartDNS。<ul><li> 登录到本地网络的路由器中,配置树莓派分配静态IP地址。</li><li> 修改WAN口或者DHCP DNS为树莓派IP地址。 注意: I. 每款路由器配置方法不尽相同,请百度搜索相关的配置方法。 II.华为等路由器可能不支持配置DNS为本地IP,请修改PC端,手机端DNS服务器为树莓派IP。</li></ul></li><li>检测服务是否配置成功。 使用<code>nslookup -querytype=ptr 127.0.0.1</code>查询域名 看命令结果中的<code>name</code>项目是否显示为<code>smartdns</code>或<code>主机名</code>,如<code>smartdns</code>则表示生效 <figure class="highlight plaintext"><table><tbody><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">pi@raspberrypi:~/code/smartdns_build $ nslookup -querytype=ptr 127.0.0.1</span><br><span class="line">Server: 192.168.1.1</span><br><span class="line">Address: 192.168.1.1#53</span><br><span class="line"> </span><br><span class="line">Non-authoritative answer:</span><br><span class="line">1.0.0.127.in-addr.arpa name = smartdns.</span><br></pre></td></tr></tbody></table></figure></li></ol><h3 id="openwrt-LEDE"><a href="#openwrt-LEDE" class="headerlink" title="openwrt/LEDE"></a>openwrt/LEDE</h3><hr><ol><li>安装 将软件使用winscp上传到路由器的/root目录,执行如下命令安装 <figure class="highlight plaintext"><table><tbody><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">opkg install smartdns.xxxxxxxx.xxxx.ipk</span><br><span class="line">opkg install luci-app-smartdns.xxxxxxxx.xxxx.all.ipk</span><br></pre></td></tr></tbody></table></figure></li><li>修改配置 登录openwrt管理页面,打开<code>Services</code>-><code>SmartDNS</code>进行配置。<ul><li> 在<code>Upstream Servers</code>增加上游DNS服务器配置,建议配置多个国内外DNS服务器。</li><li> 在<code>Domain Address</code>指定特定域名的IP地址,可用于广告屏蔽。</li></ul></li><li> 启用服务 SmartDNS服务生效方法有两种,<code>一种是直接作为主DNS服务</code>;<code>另一种是作为dnsmasq的上游</code>。 默认情况下,SmartDNS采用第一种方式。如下两种方式根据需求选择即可。</li><li>启用方法一:作为主DNS(默认方案)<ul><li> <strong>启用smartdns的53端口重定向</strong> 登录路由器,点击<code>Services</code>-><code>SmartDNS</code>,勾选<code>Redirect</code>选项,启用53端口转发。</li><li><strong>检测转发服务是否配置成功</strong> 使用<code>nslookup -querytype=ptr 127.0.0.1</code>查询域名 看命令结果中的<code>name</code>项目是否显示为<code>smartdns</code>或<code>主机名</code>,如<code>smartdns</code>则表示生效 <figure class="highlight plaintext"><table><tbody><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">pi@raspberrypi:~/code/smartdns_build $ nslookup -querytype=ptr 127.0.0.1</span><br><span class="line">Server: 192.168.1.1</span><br><span class="line">Address: 192.168.1.1#53</span><br><span class="line"> </span><br><span class="line">Non-authoritative answer:</span><br><span class="line">1.0.0.127.in-addr.arpa name = smartdns.</span><br></pre></td></tr></tbody></table></figure></li><li><strong>界面提示重定向失败</strong><ul><li> 检查iptable,ip6table命令是否正确安装。</li><li> openwrt 15.01系统不支持IPV6重定向,如网络需要支持IPV6,请将DNSMASQ上游改为smartdns,或者将smartdns的端口改为53,并停用dnsmasq。</li><li> LEDE之后系统,请安装IPV6的nat转发驱动。点击<code>system</code>-><code>Software</code>,点击<code>update lists</code>更新软件列表后,安装<code>ip6tables-mod-nat</code></li><li> 使用如下命令检查路由规则是否生效。</li></ul> <figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">iptables -t nat -L PREROUTING grep REDIRECT</span><br></pre></td></tr></tbody></table></figure><ul><li> 如转发功能不正常,请使用方法二:作为DNSMASQ的上游。</li></ul></li></ul></li><li>方法二:作为DNSMASQ的上游<ul><li> <strong>停用smartdns的53端口重定向</strong> 登录路由器,点击<code>Services</code>-><code>SmartDNS</code>,去勾选<code>Redirect</code>选项,停用53端口转发。</li><li><strong>将dnsmasq的请求发送到smartdns</strong> 登录路由器,点击<code>Network</code>-><code>DHCP and DNS</code>,修改<code>DNS forwardings(DNS转发)</code>为: <figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/#/127.0.0.1#5353</span><br></pre></td></tr></tbody></table></figure> 其中<code>#5353</code>为smartdns的服务端口号,未修改的情况下,默认为5353。</li><li><strong>检测上游服务是否配置成功</strong> 使用<code>nslookup</code>查询<code>www.baidu.com</code>域名,查看结果中百度的IP地址是否<code>只有一个</code>,如有多个IP地址返回,则表示未生效,请多尝试几个域名检查。 <figure class="highlight plaintext"><table><tbody><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">pi@raspberrypi:~ $ nslookup www.baidu.com 192.168.1.1</span><br><span class="line">Server: 192.168.1.1</span><br><span class="line">Address: 192.168.1.1#53</span><br><span class="line"> </span><br><span class="line">Non-authoritative answer:</span><br><span class="line">www.baidu.com canonical name = www.a.shifen.com.</span><br><span class="line">Name: www.a.shifen.com</span><br><span class="line">Address: 14.215.177.38</span><br></pre></td></tr></tbody></table></figure></li></ul></li><li> 启动服务 勾选配置页面中的<code>Enable(启用)</code>来启动SmartDNS</li><li>注意:<ul><li> 如已经安装chinaDNS,建议将chinaDNS的上游配置为SmartDNS。</li><li> SmartDNS默认情况,将53端口的请求转发到SmartDNS的本地端口,由<code>Redirect</code>配置选项控制。</li></ul></li></ol><h3 id="华硕路由器原生固件-梅林固件"><a href="#华硕路由器原生固件-梅林固件" class="headerlink" title="华硕路由器原生固件/梅林固件"></a>华硕路由器原生固件/梅林固件</h3><hr><p>说明:梅林固件派生自华硕固件,理论上可以直接使用华硕配套的安装包使用。但目前未经验证,如有问题,请提交issue。</p><ol><li> 准备 在使用此软件时,需要确认路由器是否支持U盘,并准备好U盘一个。</li><li> 启用SSH登录 登录管理界面,点击<code>系统管理</code>->点击<code>系统设置</code>,配置<code>Enable SSH</code>为<code>Lan Only</code>。 SSH登录用户名密码与管理界面相同。</li><li> 下载<code>Download Master</code> 在管理界面点击<code>USB相关应用</code>->点击<code>Download Master</code>下载。 下载完成后,启用<code>Download Master</code>,如果不需要下载功能,此处可以卸载<code>Download Master</code>,但要保证卸载前Download Master是启用的。</li><li>安装SmartDNS 将软件使用winscp上传到路由器的<code>/tmp/mnt/sda1</code>目录。(或网上邻居复制到sda1共享目录) <figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ipkg install smartdns.xxxxxxx.mipsbig.ipk</span><br></pre></td></tr></tbody></table></figure></li><li>重启路由器生效服务 待路由器启动后,使用<code>nslookup -querytype=ptr 127.0.0.1</code>查询域名 看命令结果中的<code>name</code>项目是否显示为<code>smartdns</code>或<code>主机名</code>,如<code>smartdns</code>则表示生效 <figure class="highlight plaintext"><table><tbody><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">pi@raspberrypi:~/code/smartdns_build $ nslookup -querytype=ptr 127.0.0.1</span><br><span class="line">Server: 192.168.1.1</span><br><span class="line">Address: 192.168.1.1#53</span><br><span class="line"> </span><br><span class="line">Non-authoritative answer:</span><br><span class="line">1.0.0.127.in-addr.arpa name = smartdns.</span><br></pre></td></tr></tbody></table></figure></li><li>额外说明 上述过程,smartdns将安装到U盘根目录,采用optware的模式运行。 其目录结构如下: (此处仅列出smartdns相关文件) <figure class="highlight plaintext"><table><tbody><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">U盘</span><br><span class="line">└── asusware.mipsbig</span><br><span class="line"> ├── bin</span><br><span class="line"> ├── etc</span><br><span class="line"> ├── smartdns</span><br><span class="line"> └── smartdns.conf</span><br><span class="line"> └── init.d</span><br><span class="line"> └── S50smartdns</span><br><span class="line"> ├── lib</span><br><span class="line"> ├── sbin</span><br><span class="line"> ├── usr</span><br><span class="line"> └── sbin</span><br><span class="line"> └── smartdns</span><br><span class="line"> ....</span><br></pre></td></tr></tbody></table></figure> 如要修改配置,可以ssh登录路由器,使用vi命令修改 <figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vi /opt/etc/smartdns/smartdns.conf</span><br></pre></td></tr></tbody></table></figure> 也可以通过网上邻居修改,网上邻居共享目录<code>sda1</code>看不到<code>asusware.mipsbig</code>目录,但可以直接在<code>文件管理器</code>中输入<code>asusware.mipsbig\etc\init.d</code>访问 <figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">\\192.168.1.1\sda1\asusware.mipsbig\etc\init.d</span><br></pre></td></tr></tbody></table></figure></li></ol><h2 id="配置参数"><a href="#配置参数" class="headerlink" title="配置参数"></a>配置参数</h2><p>参数</p><p>功能</p><p>默认值</p><p>配置值</p><p>例子</p><p>server-name</p><p>DNS服务器名称</p><p>操作系统主机名/smartdns</p><p>符合主机名规格的字符串</p><p>server-name smartdns</p><p>bind</p><p>DNS监听端口号</p><p>[::]:53</p><p>IP:PORT</p><p>bind 192.168.1.1:53</p><p>cache-size</p><p>域名结果缓存个数</p><p>512</p><p>数字</p><p>cache-size 512</p><p>rr-ttl</p><p>域名结果TTL</p><p>远程查询结果</p><p>大于0的数字</p><p>rr-ttl 600</p><p>rr-ttl-min</p><p>允许的最小TTL值</p><p>远程查询结果</p><p>大于0的数字</p><p>rr-ttl-min 60</p><p>rr-ttl-max</p><p>允许的最大TTL值</p><p>远程查询结果</p><p>大于0的数字</p><p>rr-ttl-max 600</p><p>log-level</p><p>设置日志级别</p><p>error</p><p>error,warn,info,debug</p><p>log-level error</p><p>log-file</p><p>日志文件路径</p><p>/var/log/smartdns.log</p><p>路径</p><p>log-file /var/log/smartdns.log</p><p>log-size</p><p>日志大小</p><p>128K</p><p>数字+K,M,G</p><p>log-size 128K</p><p>log-num</p><p>日志归档个数</p><p>2</p><p>数字</p><p>log-num 2</p><p>conf-file</p><p>附加配置文件</p><p>无</p><p>文件路径</p><p>conf-file /etc/smartdns/smartdns.more.conf</p><p>server</p><p>上游UDP DNS</p><p>无</p><p>[ip][:port],可重复</p><p>server 8.8.8.8:53</p><p>server-tcp</p><p>上游TCP DNS</p><p>无</p><p>[IP][:port],可重复</p><p>server-tcp 8.8.8.8:53</p><p>address</p><p>指定域名IP地址</p><p>无</p><p>address /domain/ip</p><p>address /<a href="http://www.example.com/1.2.3.4">www.example.com/1.2.3.4</a></p><p>bogus-nxdomain</p><p>假冒IP地址过滤</p><p>无</p><p>[ip],可重复</p><p>bogus-nxdomain 1.2.3.4</p><p>force-AAAA-SOA</p><p>强制AAAA地址返回SOA</p><p>no</p><p>[yesno]</p><p>force-AAAA-SOA yes</p><p>转自github 原文链接<a href="https://pymumu.github.io/smartdns/">https://pymumu.github.io/smartdns/</a></p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> 折腾 </tag>
<tag> Hexo </tag>
</tags>
</entry>
<entry>
<title>Pi上传CPU温度到oneNet</title>
<link href="/2018/07/22/pi%E4%B8%8A%E4%BC%A0cpu%E6%B8%A9%E5%BA%A6%E5%88%B0onenet/"/>
<url>/2018/07/22/pi%E4%B8%8A%E4%BC%A0cpu%E6%B8%A9%E5%BA%A6%E5%88%B0onenet/</url>
<content type="html"><![CDATA[<span id="more"></span><h2 id="参考代码"><a href="#参考代码" class="headerlink" title="参考代码"></a>参考代码</h2><figure class="highlight python"><table><tbody><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></pre></td><td class="code"><pre><span class="line">\<span class="comment"># -\*- coding:utf-8 -\*-</span></span><br><span class="line"><span class="comment"># File: cputemp.py</span></span><br><span class="line"><span class="comment">#向平台已经创建的数据流发送数据点</span></span><br><span class="line"><span class="keyword">import</span> urllib2</span><br><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> time</span><br><span class="line"><span class="keyword">import</span> datetime</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">APIKEY = <span class="string">'xxxxxxxxxxx'</span> <span class="comment">#改成你的APIKEY</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">get</span>\_temp():</span><br><span class="line"> <span class="comment"># 打开文件 </span></span><br><span class="line"> file = <span class="built_in">open</span>(<span class="string">"/sys/class/thermal/thermal\_zone0/temp"</span>) </span><br><span class="line"> <span class="comment"># 读取结果,并转换为浮点数 </span></span><br><span class="line"> temp = <span class="built_in">float</span>(file.read()) / <span class="number">1000</span> </span><br><span class="line"> <span class="comment"># 关闭文件 </span></span><br><span class="line"> file.close() </span><br><span class="line"> <span class="comment"># 向控制台打印结果 </span></span><br><span class="line"> <span class="built_in">print</span> <span class="string">"CPU的温度值为: %.3f"</span> %temp </span><br><span class="line"> <span class="comment"># 返回温度值</span></span><br><span class="line"> <span class="keyword">return</span> temp</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"><span class="keyword">def</span> <span class="title function_">http</span>\_put():</span><br><span class="line"> temperature = get\_temp() <span class="comment">#获取CPU温度并上传</span></span><br><span class="line"> CurTime = datetime.datetime.now()</span><br><span class="line"> url=<span class="string">'http://api.heclouds.com/devices/xxxxx/datapoints'</span> <span class="comment">#改成你自己的①</span></span><br><span class="line"> values={<span class="string">'datastreams'</span>:\[{<span class="string">"id"</span>:<span class="string">"temp"</span>,<span class="string">"datapoints"</span>:\[{<span class="string">"at"</span>:CurTime.isoformat(),<span class="string">"value"</span>:temperature}\]}\]}</span><br><span class="line"></span><br><span class="line"> <span class="built_in">print</span> <span class="string">"当前的ISO时间为: %s"</span> %CurTime.isoformat()</span><br><span class="line"> <span class="built_in">print</span> <span class="string">"上传的温度值为: %.3f"</span> %temperature</span><br><span class="line"></span><br><span class="line"> jdata = json.dumps(values) <span class="comment"># 对数据进行JSON格式化编码</span></span><br><span class="line"> <span class="comment">#打印json内容</span></span><br><span class="line"> <span class="built_in">print</span> jdata</span><br><span class="line"> request = urllib2.Request(url, jdata)</span><br><span class="line"> request.add\_header(<span class="string">'api-key'</span>, APIKEY)</span><br><span class="line"> request.get\_method = <span class="keyword">lambda</span>:<span class="string">'POST'</span> <span class="comment"># 设置HTTP的访问方式</span></span><br><span class="line"> request = urllib2.urlopen(request)</span><br><span class="line"> <span class="keyword">return</span> request.read()</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line"> time.sleep(<span class="number">60</span>)</span><br><span class="line"> resp = http\_put()</span><br><span class="line"> <span class="built_in">print</span> <span class="string">"OneNET请求结果:\\n %s"</span> %resp</span><br><span class="line"> time.sleep(<span class="number">60</span>)</span><br></pre></td></tr></tbody></table></figure><h5 id="注:①为设备API地址"><a href="#注:①为设备API地址" class="headerlink" title="注:①为设备API地址"></a>注:①为设备API地址</h5><p><img src="https://s1.ax1x.com/2018/07/20/P8PJvq.jpg" alt="1"></p><h5 id="执行效果"><a href="#执行效果" class="headerlink" title="执行效果"></a>执行效果</h5><p><img src="https://s1.ax1x.com/2018/07/20/P8P88s.md.png" alt="2"></p><h6 id="转自https-open-iot-10086-cn-bbs-thread-2533-1-1-html-有改动"><a href="#转自https-open-iot-10086-cn-bbs-thread-2533-1-1-html-有改动" class="headerlink" title="转自https://open.iot.10086.cn/bbs/thread-2533-1-1.html 有改动"></a>转自<a href="https://open.iot.10086.cn/bbs/thread-2533-1-1.html">https://open.iot.10086.cn/bbs/thread-2533-1-1.html</a> 有改动</h6>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> Hexo </tag>
</tags>
</entry>
<entry>
<title>自己动手建造WordPress全站Ajax</title>
<link href="/2018/07/06/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%BB%BA%E9%80%A0wordpress%E5%85%A8%E7%AB%99ajax/"/>
<url>/2018/07/06/%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%BB%BA%E9%80%A0wordpress%E5%85%A8%E7%AB%99ajax/</url>
<content type="html"><![CDATA[<p>全站 ajax 加载网站的用户体验是很奇妙的,全程浏览网站期间看不到任何浏览器刷新的迹象,点击网站上的链接,如果网站的速度可以的话,会给人一种瞬间加载的顺滑感觉,同时不失有高大上的感觉。 现在我看到很多 WordPress 网站已经部署上了全站 ajax 加载代码,效果也不错,所以我也在主题中设置了全站局部刷新的 ajax 代码。</p><span id="more"></span><p>全站 ajax 看似技术复杂,但是实际上操作起来非常简易,原因是已经有大神写好了相关的函数,任何开发者只要稍微修改一下参数,就可以轻松改造自己的网站。 全 站 ajax 代码的来源是从 WordPress 插件中提取出来的,作者是英国的卢克和威廉姆斯。这款代码适用范围非常广,不仅 WordPress 网站可以使用,只要结构统一完整的网站都可以使用,只需要简单的几部就可以改造完成。</p><figure class="highlight js"><table><tbody><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> ajaxhome=<span class="string">''</span>;</span><br><span class="line"><span class="keyword">var</span> ajaxcontent = <span class="string">'content'</span>;</span><br><span class="line"><span class="keyword">var</span> ajaxsearch\_class = <span class="string">'searchform'</span>;</span><br><span class="line"><span class="keyword">var</span> ajaxignore\_string = <span class="keyword">new</span> <span class="title class_">String</span>(<span class="string">'#, /wp-, .pdf, .zip, .rar, /goto'</span>);</span><br><span class="line"><span class="keyword">var</span> ajaxignore = ajaxignore\_string.<span class="title function_">split</span>(<span class="string">', '</span>);</span><br><span class="line"><span class="keyword">var</span> ajaxloading\_code = <span class="string">'loading'</span>;</span><br><span class="line"><span class="keyword">var</span> ajaxloading\_error\_code = <span class="string">'error'</span>;</span><br><span class="line"><span class="keyword">var</span> ajaxreloadDocumentReady = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">var</span> ajaxtrack\_analytics = <span class="literal">false</span></span><br><span class="line"><span class="keyword">var</span> ajaxscroll\_top = <span class="literal">true</span></span><br><span class="line"><span class="keyword">var</span> ajaxisLoad = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">var</span> ajaxstarted = <span class="literal">false</span>;</span><br><span class="line"><span class="keyword">var</span> ajaxsearchPath = <span class="literal">null</span>;</span><br><span class="line"><span class="keyword">var</span> ajaxua = jQuery.<span class="property">browser</span>;</span><br><span class="line"><span class="title function_">jQuery</span>(<span class="variable language_">document</span>).<span class="title function_">ready</span>(<span class="keyword">function</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="title function_">ajaxloadPageInit</span>(<span class="string">""</span>);</span><br><span class="line">});</span><br><span class="line"><span class="variable language_">window</span>.<span class="property">onpopstate</span> = <span class="keyword">function</span>(<span class="params">event</span>) {</span><br><span class="line"> <span class="keyword">if</span> (ajaxstarted === <span class="literal">true</span> && ajaxcheck\<span class="title function_">_ignore</span>(<span class="variable language_">document</span>.<span class="property">location</span>.<span class="title function_">toString</span>()) == <span class="literal">true</span>) {</span><br><span class="line"> <span class="title function_">ajaxloadPage</span>(<span class="variable language_">document</span>.<span class="property">location</span>.<span class="title function_">toString</span>(),<span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line">};</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">ajaxloadPageInit</span>(<span class="params">scope</span>){</span><br><span class="line"> <span class="title function_">jQuery</span>(scope + <span class="string">"a"</span>).<span class="title function_">click</span>(<span class="keyword">function</span>(<span class="params">event</span>){</span><br><span class="line"> <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">href</span>.<span class="title function_">indexOf</span>(ajaxhome) >= <span class="number">0</span> && ajaxcheck\<span class="title function_">_ignore</span>(<span class="variable language_">this</span>.<span class="property">href</span>) == <span class="literal">true</span>){</span><br><span class="line"> event.<span class="title function_">preventDefault</span>();</span><br><span class="line"> <span class="variable language_">this</span>.<span class="title function_">blur</span>();</span><br><span class="line"> <span class="keyword">var</span> caption = <span class="variable language_">this</span>.<span class="property">title</span> <span class="variable language_">this</span>.<span class="property">name</span> <span class="string">""</span>;</span><br><span class="line"> <span class="keyword">var</span> group = <span class="variable language_">this</span>.<span class="property">rel</span> <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> ajaxclick\<span class="title function_">_code</span>(<span class="variable language_">this</span>);</span><br><span class="line"> } <span class="keyword">catch</span>(err) {</span><br><span class="line"> }</span><br><span class="line"> <span class="title function_">ajaxloadPage</span>(<span class="variable language_">this</span>.<span class="property">href</span>);</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'.'</span> + ajaxsearch\_class).<span class="title function_">each</span>(<span class="keyword">function</span>(<span class="params">index</span>) {</span><br><span class="line"> <span class="keyword">if</span> (<span class="title function_">jQuery</span>(<span class="variable language_">this</span>).<span class="title function_">attr</span>(<span class="string">"action"</span>)) {</span><br><span class="line"> ajaxsearchPath = <span class="title function_">jQuery</span>(<span class="variable language_">this</span>).<span class="title function_">attr</span>(<span class="string">"action"</span>);;</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="variable language_">this</span>).<span class="title function_">submit</span>(<span class="keyword">function</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="title function_">submitSearch</span>(<span class="title function_">jQuery</span>(<span class="variable language_">this</span>).<span class="title function_">serialize</span>());</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><br><span class="line"> });</span><br><span class="line"> <span class="keyword">if</span> (<span class="title function_">jQuery</span>(<span class="string">'.'</span> + ajaxsearch\_class).<span class="title function_">attr</span>(<span class="string">"action"</span>)) {} <span class="keyword">else</span> {</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">ajaxloadPage</span>(<span class="params">url, push, getData</span>){</span><br><span class="line"> <span class="keyword">if</span> (!ajaxisLoad){</span><br><span class="line"> <span class="keyword">if</span> (ajaxscroll\_top == <span class="literal">true</span>) {</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'html,body'</span>).<span class="title function_">animate</span>({<span class="attr">scrollTop</span>: <span class="number">0</span>}, <span class="number">1500</span>);</span><br><span class="line"> }</span><br><span class="line"> ajaxisLoad = <span class="literal">true</span>;</span><br><span class="line"> ajaxstarted = <span class="literal">true</span>;</span><br><span class="line"> nohttp = url.<span class="title function_">replace</span>(<span class="string">"http://"</span>,<span class="string">""</span>).<span class="title function_">replace</span>(<span class="string">"https://"</span>,<span class="string">""</span>);</span><br><span class="line"> firstsla = nohttp.<span class="title function_">indexOf</span>(<span class="string">"/"</span>);</span><br><span class="line"> pathpos = url.<span class="title function_">indexOf</span>(nohttp);</span><br><span class="line"> path = url.<span class="title function_">substring</span>(pathpos + firstsla);</span><br><span class="line"> <span class="keyword">if</span> (push != <span class="number">1</span>) {</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">typeof</span> <span class="variable language_">window</span>.<span class="property">history</span>.<span class="property">pushState</span> == <span class="string">"function"</span>) {</span><br><span class="line"> <span class="keyword">var</span> stateObj = { <span class="attr">foo</span>: <span class="number">1000</span> + <span class="title class_">Math</span>.<span class="title function_">random</span>()\*<span class="number">1001</span> };</span><br><span class="line"> history.<span class="title function_">pushState</span>(stateObj, <span class="string">"ajax page loaded..."</span>, path);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (!<span class="title function_">jQuery</span>(<span class="string">'#'</span> + ajaxcontent)) {</span><br><span class="line"> }</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'#'</span> + ajaxcontent).<span class="title function_">append</span>(ajaxloading\_code);</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'#'</span> + ajaxcontent).<span class="title function_">fadeTo</span>(<span class="string">"slow"</span>, <span class="number">0.4</span>,<span class="keyword">function</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'#'</span> + ajaxcontent).<span class="title function_">fadeIn</span>(<span class="string">"slow"</span>, <span class="keyword">function</span>(<span class="params"></span>) {</span><br><span class="line"> jQuery.<span class="title function_">ajax</span>({</span><br><span class="line"> <span class="attr">type</span>: <span class="string">"GET"</span>,</span><br><span class="line"> <span class="attr">url</span>: url,</span><br><span class="line"> <span class="attr">data</span>: getData,</span><br><span class="line"> <span class="attr">cache</span>: <span class="literal">false</span>,</span><br><span class="line"> <span class="attr">dataType</span>: <span class="string">"html"</span>,</span><br><span class="line"> <span class="attr">success</span>: <span class="keyword">function</span>(<span class="params">data</span>) {</span><br><span class="line"> ajaxisLoad = <span class="literal">false</span>;</span><br><span class="line"> datax = data.<span class="title function_">split</span>(<span class="string">'<title>'</span>);</span><br><span class="line"> titlesx = data.<span class="title function_">split</span>(<span class="string">'</title>'</span>);</span><br><span class="line"> <span class="keyword">if</span> (datax.<span class="property">length</span> == <span class="number">2</span> titlesx.<span class="property">length</span> == <span class="number">2</span>) {</span><br><span class="line"> data = data.<span class="title function_">split</span>(<span class="string">'<title>'</span>)\[<span class="number">1</span>\];</span><br><span class="line"> titles = data.<span class="title function_">split</span>(<span class="string">'</title>'</span>)\[<span class="number">0</span>\];</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="variable language_">document</span>).<span class="title function_">attr</span>(<span class="string">'title'</span>, (<span class="title function_">jQuery</span>(<span class="string">"<div/>"</span>).<span class="title function_">html</span>(titles).<span class="title function_">text</span>()));</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (ajaxtrack\_analytics == <span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span>(<span class="keyword">typeof</span> \_gaq != <span class="string">"undefined"</span>) {</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">typeof</span> getData == <span class="string">"undefined"</span>) {</span><br><span class="line"> getData = <span class="string">""</span>;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> getData = <span class="string">"?"</span> + getData;</span><br><span class="line"> }</span><br><span class="line"> \_gaq.<span class="title function_">push</span>(\[<span class="string">'\_trackPageview'</span>, path + getData\]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> data = data.<span class="title function_">split</span>(<span class="string">'id="'</span> + ajaxcontent + <span class="string">'"'</span>)\[<span class="number">1</span>\];</span><br><span class="line"> data = data.<span class="title function_">substring</span>(data.<span class="title function_">indexOf</span>(<span class="string">'>'</span>) + <span class="number">1</span>);</span><br><span class="line"> <span class="keyword">var</span> depth = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">var</span> output = <span class="string">''</span>;</span><br><span class="line"> <span class="keyword">while</span>(depth > <span class="number">0</span>) {</span><br><span class="line"> temp = data.<span class="title function_">split</span>(<span class="string">'</div>'</span>)\[<span class="number">0</span>\];</span><br><span class="line"> i = <span class="number">0</span>;</span><br><span class="line"> pos = temp.<span class="title function_">indexOf</span>(<span class="string">"<div"</span>);</span><br><span class="line"> <span class="keyword">while</span> (pos != -<span class="number">1</span>) {</span><br><span class="line"> i++;</span><br><span class="line"> pos = temp.<span class="title function_">indexOf</span>(<span class="string">"<div"</span>, pos + <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"> depth=depth+i-<span class="number">1</span>;</span><br><span class="line"> output=output+data.<span class="title function_">split</span>(<span class="string">'</div>'</span>)\[<span class="number">0</span>\] + <span class="string">'</div>'</span>;</span><br><span class="line"> data = data.<span class="title function_">substring</span>(data.<span class="title function_">indexOf</span>(<span class="string">'</div>'</span>) + <span class="number">6</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(ajaxcontent).<span class="property">innerHTML</span> = output;</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'#'</span> + ajaxcontent).<span class="title function_">css</span>(<span class="string">"position"</span>, <span class="string">"absolute"</span>);</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'#'</span> + ajaxcontent).<span class="title function_">css</span>(<span class="string">"left"</span>, <span class="string">"20000px"</span>);</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'#'</span> + ajaxcontent).<span class="title function_">show</span>();</span><br><span class="line"> <span class="title function_">ajaxloadPageInit</span>(<span class="string">"#"</span> + ajaxcontent + <span class="string">" "</span>);</span><br><span class="line"> <span class="keyword">if</span> (ajaxreloadDocumentReady == <span class="literal">true</span>) {</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="variable language_">document</span>).<span class="title function_">trigger</span>(<span class="string">"ready"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> ajaxreload\<span class="title function_">_code</span>();</span><br><span class="line"> } <span class="keyword">catch</span>(err) {</span><br><span class="line"> }</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'#'</span> + ajaxcontent).<span class="title function_">hide</span>();</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'#'</span> + ajaxcontent).<span class="title function_">css</span>(<span class="string">"position"</span>, <span class="string">""</span>);</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'#'</span> + ajaxcontent).<span class="title function_">css</span>(<span class="string">"left"</span>, <span class="string">""</span>);</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'#'</span> + ajaxcontent).<span class="title function_">fadeTo</span>(<span class="string">"slow"</span>, <span class="number">1</span>, <span class="keyword">function</span>(<span class="params"></span>) {});</span><br><span class="line"> },</span><br><span class="line"> <span class="attr">error</span>: <span class="keyword">function</span>(<span class="params">jqXHR, textStatus, errorThrown</span>) {</span><br><span class="line"> ajaxisLoad = <span class="literal">false</span>;</span><br><span class="line"> <span class="variable language_">document</span>.<span class="property">title</span> = <span class="string">"Error loading requested page!"</span>;</span><br><span class="line"> <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(ajaxcontent).<span class="property">innerHTML</span> = ajaxloading\_error\_code;</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">submitSearch</span>(<span class="params">param</span>){</span><br><span class="line"> <span class="keyword">if</span> (!ajaxisLoad){</span><br><span class="line"> <span class="title function_">ajaxloadPage</span>(ajaxsearchPath, <span class="number">0</span>, param);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="keyword">function</span> ajaxcheck\<span class="title function_">_ignore</span>(<span class="params">url</span>) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">var</span> i <span class="keyword">in</span> ajaxignore) {</span><br><span class="line"> <span class="keyword">if</span> (url.<span class="title function_">indexOf</span>(ajaxignore\[i\]) >= <span class="number">0</span>) {</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><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">function</span> ajaxreload\<span class="title function_">_code</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="comment">//add code here </span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">function</span> ajaxclick\<span class="title function_">_code</span>(<span class="params">thiss</span>) {</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="string">'ul.nav li'</span>).<span class="title function_">each</span>(<span class="keyword">function</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="title function_">jQuery</span>(<span class="variable language_">this</span>).<span class="title function_">removeClass</span>(<span class="string">'current-menu-item'</span>);</span><br><span class="line"> });</span><br><span class="line"> <span class="title function_">jQuery</span>(thiss).<span class="title function_">parents</span>(<span class="string">'li'</span>).<span class="title function_">addClass</span>(<span class="string">'current-menu-item'</span>);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>代码部分需要根据自己的实际修改一小部分:</p><ol><li>第一行 ajaxhome 填写网站的访问网址; </li><li>第二行 ajaxcontent 填写网站文章的容器id名称,即异步加载的部分; </li><li>第三行 ajaxsearch_class 填写网站搜索框的容器名称,一般都是“searchform”; </li><li>第四行 ajaxignore_string 是忽略使用ajax加载的链接,比如说feed源等等; </li><li>第六行 ajaxloading_code 加载时显示的内容,可以设定动画; </li><li>第七行 ajaxloading_error_code 加载失败时显示的内容,可以设定动画。 </li></ol><p>只要按照上述要求修改好代码,单独存放为 JS 文件并且引入网页之中,效果立竿见影。有木有很神奇的感觉。 ajax异步加载影响其他jQuery特效: 部署上 ajax 异步加载代码后,会出现一个问题,首次打开网站后,jQuery 动画都会正常运行,但是点击网页执行了 ajax 异步加载之后,所有的动画都会失效。 这是因为进行异步加载后 jQuery 代码无法获取元素,特效自然消失,为解决这个问题,还需要对 jQuery 代码进行改造。 解决方式是使用 <code>live()</code> 事件,<code>live()</code>事件的用法如下</p><figure class="highlight js"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$(selector).<span class="title function_">live</span>(event,data,<span class="keyword">function</span>)</span><br></pre></td></tr></tbody></table></figure><p>event 用来替换 click()、hover() 等动作;data 可选,是参数;function 是需要执行的动作。 举个例子,一个 <code>click()</code> 事件改写为 <code>live()</code> 事件,原本代码是这样:</p><figure class="highlight js"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$(<span class="string">".menu-item"</span>).<span class="title function_">click</span>(<span class="keyword">function</span>(<span class="params"></span>){$(<span class="string">".topmenu"</span>).<span class="title function_">fadeOut</span>(<span class="number">500</span>)});</span><br></pre></td></tr></tbody></table></figure><p>修改之后</p><figure class="highlight js"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(<span class="string">".menu-item"</span>).<span class="title function_">live</span>(<span class="string">"click"</span>,<span class="keyword">function</span>(<span class="params"></span>){$(<span class="string">".topmenu"</span>).<span class="title function_">fadeOut</span>(<span class="number">500</span>)});</span><br></pre></td></tr></tbody></table></figure><p>原文出自KRUNK ZHOU 原文链接:<a href="https://krunk.cn/kblog325/">https://krunk.cn/kblog325/</a></p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> 折腾 </tag>
</tags>
</entry>
<entry>
<title>GitHub文件加速</title>
<link href="/2018/06/23/whr-uptime/"/>
<url>/2018/06/23/whr-uptime/</url>
<content type="html"><![CDATA[]]></content>
<categories>
<category> uncategorized </category>
</categories>
</entry>
<entry>
<title>pm2让hexo博客在后台运行</title>
<link href="/2018/06/23/pm2%E8%AE%A9hexo%E5%8D%9A%E5%AE%A2%E5%9C%A8%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C/"/>
<url>/2018/06/23/pm2%E8%AE%A9hexo%E5%8D%9A%E5%AE%A2%E5%9C%A8%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C/</url>
<content type="html"><![CDATA[<p>估计有好多人和我一样,在linux上部署成功hexo这个开源博客的时候,很高兴的用<code>$ hexo server</code>在服务上跑了起来。都遇到了 hexo 进程无法一直常驻后台。 ssh 一关,博客进程就死掉了。这可就扎心了,因为我们不可能一直本地开着ssh吧。 我也尝试过很多办法,比如screen,windows X system …… 于是经过一番大肆搜索,官方说用<code>$ hexo s & </code>但是我在用的时候还是进程莫名奇妙的死掉了</p><span id="more"></span><h1 id="安装pm2"><a href="#安装pm2" class="headerlink" title="安装pm2"></a><strong>安装pm2</strong></h1><figure class="highlight plaintext"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g pm2</span><br></pre></td></tr></tbody></table></figure><h1 id="写一个执行脚本"><a href="#写一个执行脚本" class="headerlink" title="写一个执行脚本"></a><strong>写一个执行脚本</strong></h1><p>在博客根目录下面创建一个<strong>hexo_run.js</strong></p><figure class="highlight js"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//run</span></span><br><span class="line"><span class="keyword">const</span> { exec } = <span class="built_in">require</span>(<span class="string">'child\_process'</span>)</span><br><span class="line"><span class="title function_">exec</span>(<span class="string">'hexo server'</span>,<span class="function">(<span class="params">error, stdout, stderr</span>) =></span> {</span><br><span class="line"> <span class="keyword">if</span>(error){</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'exec error: ${error}'</span>)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"> }</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'stdout: ${stdout}'</span>);</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'stderr: ${stderr}'</span>);</span><br><span class="line">})</span><br></pre></td></tr></tbody></table></figure><h1 id="运行脚本"><a href="#运行脚本" class="headerlink" title="运行脚本"></a><strong>运行脚本</strong></h1><p>在博客根目录下</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pm2 start hexo_run.js</span><br></pre></td></tr></tbody></table></figure>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> 折腾 </tag>
<tag> Hexo </tag>
<tag> Raspi/Orapi </tag>
</tags>
</entry>
<entry>
<title>树莓派打开powersave</title>
<link href="/2018/06/06/%E6%A0%91%E8%8E%93%E6%B4%BE%E6%89%93%E5%BC%80powersave/"/>
<url>/2018/06/06/%E6%A0%91%E8%8E%93%E6%B4%BE%E6%89%93%E5%BC%80powersave/</url>
<content type="html"><![CDATA[<p>powersave顾名思义,减少功耗,这个功能在有些供电不足的情况下十分好用,可以减少树莓派宕机的次数。</p><span id="more"></span><p>举个栗子我的一台供电不足树莓派上搭了个web server,再叫几个好伙伴访问一下,写两篇文章或者评论什么的,第一个访客还没有什么问题,第二个一来,503了。。。 通过powersave功能可以将Pi的CPU主频降到最低</p><p>sudo -i</p><p>echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor</p><p>然后</p><p>sudo cat/sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq</p><p>我的Orangepi的主频已经降到了480mhz了,毕竟windowsX system玩的少,在shell里面这点主频足够了 编辑/etc/rc.local把降频功能加入到自启动项目中</p><p>echo powersave > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor</p><p> 完美节能</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> 折腾 </tag>
<tag> Raspi/Orapi </tag>
</tags>
</entry>
<entry>
<title>我为什么写博客</title>
<link href="/2018/05/20/%E6%88%91%E4%B8%BA%E4%BB%80%E4%B9%88%E5%86%99%E5%8D%9A%E5%AE%A2/"/>
<url>/2018/05/20/%E6%88%91%E4%B8%BA%E4%BB%80%E4%B9%88%E5%86%99%E5%8D%9A%E5%AE%A2/</url>
<content type="html"><![CDATA[<p>一个选择 我知道现在可能说这话有点不合时宜,毕竟博客时代都已经过去了,再号召大家用过就好像时的东西是不是有点逆流而上?</p><span id="more"></span><p>我曾经也问过自己这个问题,但是我觉得,博客时代过去跟我们要开博客是没有多大关系的,就好像你的读书时代已经过去你就不再读书一样。 判断一件事情值不值得去做有一个方法:在一张白纸的左边写不值得做的原因,然后在右边写值得做的原因,写完一比较,一权衡,自然能够得出结果。 大家都成年人了,你会觉得这样思考分析总结的过程才是正确的思考的方法吧? 所以,我在这里列出要写(独立)博客的原因,供大家去选择,然后填在你白纸的右边。 注意,我不是给你一个建议,而是提供一个选择,这个选择蕴藏着我也不知道的可能。 博客内容 写博客不难,你可以当作是生活的记录,但是这样的记录没有任何的意义。写要对得住写本身,写出来的东西应该是思考的结果。我认为,如果你要开一个博客,博客的内容应该是这样的: 1. 不是生活杂记、不是流水账、不是牢骚、不是抱怨、不是心情琐记……;2. 有目的地写,要务实,追求质量;3. 承认真实的自己,不要吹嘘,不要装逼,无需讨好读者;4. 记录自己学习、思考、总结的过程;5. 分享你的故事、所得、感想、经验; 值得写的原因 以下是一个清单,可以根据自己的情况匹配,然后选择。 重新认识自己 是不是很久没有跟自己对话了? 你可以尝试从回答一些问题开始,将你过去要回避的问题写下来,例如就可以从这个九个问题开始: 1、请你介绍一下你自己,你是个什么样的人? 2、你有什么理想吗?这个理想是怎么形成的? 3、你理想的伴侣关系是什么样的?你自己在这个伴侣关系中扮演什么样的角色?要承担什么样的责任? 4、你理想的事业是什么,你正在做的工作符合你的事业理想吗?这份工作对你的意义是什么? 5、你对亲子关系怎么看?对你来说,什么是一个理想的父亲(母亲),你期望自己成为这样一个理想父亲(母亲)吗? 6、你对钱怎么看,你认为赚到多少钱是足够的?如果你明天一早醒来,已经有足够的钱,你将会如何继续安排自己的生活? 7、对你来说,什么是理想的性生活?什么是理想的性道德,在你的性道德观中,什么样的性生活是禁忌的,需要避免的,什么样的性生活是美好的,需要得到鼓励和发展的? 8、你的择友标准是什么?什么样的人你会愿意交往,什么样的人你会拒绝和他交往? 9、你对死亡怎么看?你希望自己活到多少岁,你准备怎么度过从现在到死亡的这段时间?如果你要立遗嘱,这份遗嘱会怎么写? 以上的这九个问题摘自《很少人能顺畅回答这9个问题——心理治疗刚开始医生常常会先问你的 》by 李孟潮。 这些问题的答案你可以选择不发,但是我强烈地建议写下来,只有在写的时候你才可以慎重地思考这些问题,而不会回避跳过或者留下空白,这是接受自己的第一步。 提供持续学习的动力 例如,我为自己设限每天写一千字,信息的不断输出给我带来恐惧,我害怕有一天我写无可写,于是我不停地阅读,通过个人的知识管理促使自己不断学习,提高核心竞争力。 详细的知识管理可以看我的这篇文章:《个人知识管理的方法》,回复「知识」可见 积累更多的知识 写并不是单纯的写。 例如你写着写着,你突然忘记了一个概念,于是上网找,找回来这个概念的时候,你重温这个概念,可能还会顺便看了一下这个概念的其他东西。 例如你需要获取第一手的资料,寻找信息来源本身就是一个知识积累的过程,同时,你慢慢就学会了鉴别知识:什么是没有用的心灵鸡汤,什么是不值得关注的吐槽名人,还有,在这个过程中,你还养成你的心智。 提高将事情讲清楚的能力 很多东西你以为懂了,但当你在写下来的时候,你就觉得无从下手了。 如果一件事情你不能讲清楚,十有八九你还没有完全理解。 将事情写下来,慢慢就可以提高你的逻辑思维能力,分析能力,写会迫使你在你脑中搭建一个有条理的框架。例如我写这篇文章一样,我就将值得写博客的原因一点一点地罗列出来,事情就更加清晰,你也可以更好的思考问题。 分享带来的连锁反应 “通过分享,你获得了直接而快速的回报,你最终或许会发现你已将版权和“保留所有权利”抛诸脑后。新的经济学准则是:参与你作品的人越多,回报越高。在分享主义里,如果你愿意你可以保留所有权,但是我乐于分享。” by 毛向辉 《分享主义:一场思维革命》 互联网精神其中最重要的就是分享主义,基于分享主义,你可以享受到社会化及互联网给你带来的种种便利和好处,你分享了一个知识,你就成为了互联网中的一个点,这个点的大小由你自己来决定,互联网的大潮会将你的这个点推送到它所能触及的每个角落,让需要的人得到,同时,你的这个点也会继续扩大,连接到整个网络,这个点有可能连接成一张网,而你就是这张网的中心。 帮你找到志同道合的人 在微博,在朋友圈,你可能找不到跟你志同道合的人,而在博客,你可以通过看他的几篇文章就迅速地理解认同这个人,即使你没有见过这个人,但你也可以通过这种关联来相互学习。 如果你在一个领域有相当的了解,你将这些内容发在网络上,网络上跟你志趣相投的人也会被你吸引过来,根据吸引力法则,你是怎样的人你就被怎么样的人吸引,这就是博客所能赋予你的魅力。 即使博客没有被他人关注,我们依然可以找到同好,你可以自己将博文转载到其他站点,人们会通过搜索引擎找到你,有邮件、微博等工具,我们不乏与他人交流的途径。by Gabriel Weinberg《Why I blog》 记录成长 隔一段时间,你再回头看你写的博客,你会发现自己正在通过这样的方式在不断的成长,这种成长在自己眼里是一种财富,在别人眼里是一张地图,你得到了收获,不断修正自己的错误,别人得到了指引,避免走弯路。 更多的情况是当你回望自己的时候你会发现自己是一个傻逼,so what,that is what I am! 培养持续做一件事情的能力 开始是坚持,后来是习惯,接着喜欢。以后当有人对你说,「你写那么多有用的东西,你真的很厉害啊!」你可以笑而不语,也可以大声说道:「你妹,你不知道我开始的时候多么痛苦!」 让你长久地去跑步,你可能做不到;让你每个月看一本书,你也可能做不到;但让你持续地写一个博客,你可以做得到。 你不相信?你不试试你怎么知道? 默默地持续做一件事是一种难得的能力,也是一种难得的品质。 讨论反思 每人都会有思维的盲点,就好像这篇文章一样,可能你觉得我可能说得不对,你可以反驳我,我欢迎这种讨论,因为讨论的过程中会产生各种的思维的碰撞,这种碰撞会让你反思,也会激发出你新的灵感,这种讨论反思给自己的带来巨大的受益。 互联网给你的反馈就是让你承受更多,接受更多,成为一个更好的人。 搜寻到你意想不到东西 世界不止是你的家,你的公司,你的朋友圈,你应该去发现一个更大的世界,通过写博客,你会知道世界上还有很多人像你一样在写博客,这些人和知识正在世界的某个角落在等着你。 例如,在写这篇文章的过程中,我才知道了Gabriel Weinberg,我才要将阳志平的博客重读一遍。写的过程会让你有很多新的发现,这些新的发现都值得你去再写下来,总结分享出去。 一个人在做一件属于自己的事 很多你认为自己很牛逼的事情都是自己一个人做出来。 别人在刷微博,你在看书,别人在看穿越剧,你在学英文,别人在去唱K,你在写个人总结。吃饭也要找同伴,出游要找同伴,看电影要找同伴,你上一次一个人在做一件属于自己的事是在什么时候? 如果你想要清晰地思考,就必须远离人群。但是走得越远,你的处境就会越困难,收到的阻力也会越大。因为你没有迎合社会习俗,而是一步步地与它背道而驰。如果自己就是潮水的一部分 ,怎么能看见潮流的方向呢?你只能永远保持质疑,问自己,什么话是我不能说的?为什么?——Paul Graham《不能说的话》 互联网的身份识别: 一个长期的价值博客是一份很好的简历。这里的“简历”并非是狭义上的求职简历,毕竟现在还没有到价值博客的时代,很多人写博客都是到处转载或者干脆碎碎念,正因此面试官未必拿个人博客当成了解一个人的更可靠窗口。 这里的“简历”是指一个让别人了解自己的窗口,虽然我们未必做得到像罗永浩、Keso这样的博客,个人的影响力已经足以支撑出一份事业(牛博和5gme),但至少你会因此而结识更多的人,你的博客价值越高,你结识的人就越牛,跟牛人交流又会让你的眼界得到极大的开阔,打开一扇又一扇你原本不知道的门,于是你就变得更牛… 这是一个良性循环。by 刘未鹏 最后 你可能想不到在白纸的左边(不值得写博客的原因)写什么了,想不到写个「博客时代已经过去」或者「我没有时间」也可以,但与此同时,你也可以用那些时间去思考一下「怎么做到长期写一个价值博客」。 如果你不想思考,也可以回复「价值」看看别人的建议。 转自知乎 你为什么写博客</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> Date </tag>
<tag> 行者笔记 </tag>
</tags>
</entry>
<entry>
<title>树莓派WIFI自动重连</title>
<link href="/2018/05/09/%E6%A0%91%E8%8E%93%E6%B4%BEwifi%E8%87%AA%E5%8A%A8%E9%87%8D%E8%BF%9E/"/>
<url>/2018/05/09/%E6%A0%91%E8%8E%93%E6%B4%BEwifi%E8%87%AA%E5%8A%A8%E9%87%8D%E8%BF%9E/</url>
<content type="html"><![CDATA[<p>python代码autowifi.py,放在/home/pi目录下</p><span id="more"></span><p>#!/usr/bin/python<br>import os, time</p><p>while True:<br> if ‘192’ not in os.popen(‘ifconfig grep 192’).read():<br> print ‘\n****** wifi is down, restart… ******\n’<br> os.system(‘sudo /etc/init.d/networking restart’)<br> time.sleep(5*60) #5 minutes</p><p>shell脚本autowifi.sh,也放在/home/pi目录下</p><p>#!/bin/sh<br>python /home/pi/autowifi.py &</p><p>开机自动启动以上脚本:在终端窗口执行以下命令即可</p><p>sudo cp -f /home/pi/autowifi.sh /etc/init.d/<br>sudo chmod +x /etc/init.d/autowifi.sh<br>sudo chown root:root /etc/init.d/autowifi.sh<br>sudo update-rc.d autowifi.sh defaults </p><p>脚本会每5分钟检测一次,若wifi断线,则自动重新连接 如果出现 “insserv: warning: script ‘xxxx’ missing LSB tags and overrides” 移除wolfram-engine</p><p>sudo apt-get remove wolfram-engine</p><p> 转自创客社区 原文链接<a href="http://bbs.nxez.com/thread-99-1-1.html">http://bbs.nxez.com/thread-99-1-1.html</a></p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> 折腾 </tag>
<tag> Raspi/Orapi </tag>
</tags>
</entry>
<entry>
<title>论破解大疆限高</title>
<link href="/2018/05/08/%E8%AE%BA%E7%A0%B4%E8%A7%A3%E5%A4%A7%E7%96%86%E9%99%90%E9%AB%98/"/>
<url>/2018/05/08/%E8%AE%BA%E7%A0%B4%E8%A7%A3%E5%A4%A7%E7%96%86%E9%99%90%E9%AB%98/</url>
<content type="html"><![CDATA[<p>作为一个过来人讲,DJI这种机器破限高没啥意义。 但是有人会说,站得高望得远啊。</p><span id="more"></span><p>因为大疆的机载图传天线是向四周发射的。你要飞的高且有图传,必须飞的远。 但是飞到一千三四百高的时候电量就报警了,要求返航了,受到天气温度,电池寿命的影响,有时候飞到破千 飞机就嚷嚷着要返航回来了。 如果你光头顶的话,一没有图传,二直升的效率低于斜线上升。一上去连片刻停留的没有就下来了有啥意义。 所以DJI的机机破高没意义,向往挑战的心理解,但是损人不利己的事情咱千万别干。</p><p>整理来自Arkbird fpv群</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> Date </tag>
<tag> 行者笔记 </tag>
<tag> R.C </tag>
</tags>
</entry>
<entry>
<title>JS实现仿饿了么在浏览器标签页失去焦点时网页标题改变</title>
<link href="/2018/04/17/js%E5%AE%9E%E7%8E%B0%E4%BB%BF%E9%A5%BF%E4%BA%86%E4%B9%88%E5%9C%A8%E6%B5%8F%E8%A7%88%E5%99%A8%E6%A0%87%E7%AD%BE%E9%A1%B5%E5%A4%B1%E5%8E%BB%E7%84%A6%E7%82%B9%E6%97%B6%E7%BD%91%E9%A1%B5%E6%A0%87%E9%A2%98/"/>
<url>/2018/04/17/js%E5%AE%9E%E7%8E%B0%E4%BB%BF%E9%A5%BF%E4%BA%86%E4%B9%88%E5%9C%A8%E6%B5%8F%E8%A7%88%E5%99%A8%E6%A0%87%E7%AD%BE%E9%A1%B5%E5%A4%B1%E5%8E%BB%E7%84%A6%E7%82%B9%E6%97%B6%E7%BD%91%E9%A1%B5%E6%A0%87%E9%A2%98/</url>
<content type="html"><![CDATA[<p>S实现浏览器标签页失去焦点时网页Title的改变 这个 API 本身非常简单,由以下三部分组成。</p><span id="more"></span><ul><li><code>document.hidden</code>:表示页面是否隐藏的布尔值。页面隐藏包括 页面在后台标签页中 或者 浏览器最小化 </li><li><code>document.visibilityState</code>:表示下面 4 个可能状态的值 </li><li> <code>hidden</code>:页面在后台标签页中或者浏览器最小化 </li><li> <code>visible</code>:页面在前台标签页中 </li><li> <code>prerender</code>:页面在屏幕外执行预渲染处理 </li><li> <code>document.hidden</code> 的值为 true </li><li> <code>unloaded</code>:页面正在从内存中卸载 </li><li> <code>Visibilitychange</code>事件:当文档从可见变为不可见或者从不可见变为可见时,会触发该事件。 <br>这样,我们可以监听 Visibilitychange 事件,当该事件触发时,获取 document.hidden 的值,根据该值进行页面一些事件的处理。 <br>记住:必须是基于支持H5的浏览器才可以</li></ul><hr><figure class="highlight js"><table><tbody><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">var</span> <span class="title class_">OriginTitile</span> = <span class="variable language_">document</span>.<span class="property">title</span>;</span><br><span class="line"><span class="keyword">var</span> titleTime;</span><br><span class="line"> <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">'visibilitychange'</span>, <span class="keyword">function</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">if</span> (<span class="variable language_">document</span>.<span class="property">hidden</span>) {</span><br><span class="line"> <span class="variable language_">document</span>.<span class="property">title</span> = <span class="string">'(つェ⊂)我藏好了哦~ '</span> + <span class="title class_">OriginTitile</span>;</span><br><span class="line"> <span class="built_in">clearTimeout</span>(titleTime);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> <span class="variable language_">document</span>.<span class="property">title</span> = <span class="string">'(\*´∇`\*) 被你发现啦~ '</span> + <span class="title class_">OriginTitile</span>;</span><br><span class="line"> titleTime = <span class="built_in">setTimeout</span>(<span class="keyword">function</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="variable language_">document</span>.<span class="property">title</span> = <span class="title class_">OriginTitile</span>;</span><br><span class="line"> }, <span class="number">2000</span>);</span><br><span class="line"> }</span><br><span class="line"> });</span><br></pre></td></tr></tbody></table></figure><hr><p>最后在Wordpress中使用Custom Javascript插件启用 </p><p>本文来源于KRUNK BLOG( <a href="https://krunk.cn/">https://krunk.cn</a>),</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Date </tag>
<tag> 折腾 </tag>
</tags>
</entry>
<entry>
<title>树莓派创建自定义HDMI模式</title>
<link href="/2018/02/22/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89hdmi%E6%A8%A1%E5%BC%8F/"/>
<url>/2018/02/22/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%88%9B%E5%BB%BA%E8%87%AA%E5%AE%9A%E4%B9%89hdmi%E6%A8%A1%E5%BC%8F/</url>
<content type="html"><![CDATA[<p>我们经常使用HDMI连接树莓派,但是有时候树莓派HDMI导致屏幕不能显现,让人很烦</p><span id="more"></span><p>在config.txt中使用以下配置字符串指定新模式</p><p>hdmi_cvt=<width> <height> <framerate> <aspect> <margins> <interlace><rb><br>width width in pixels<br>height height in pixels<br>framerate framerate in Hz aspect aspect ratio 1=4:3, 2=14:9, 3=16:9, 4=5:4, 5=16:10, 6=15:9<br>margins 0=margins disabled, 1=margins enabled<br>interlace 0=progressive, 1=interlaced<br>rb 0=normal, 1=reduced blanking</rb></interlace></margins></aspect></framerate></height></width></p><p>前三个参数是必需的。其余的是可选的。如果未指定,则方面默认为16:9 使自定义模式成为默认模式。 请注意。不能保证您的显示器将支持由此产生的分辨率/帧速率。 但是,如果您目前正在以非原生分辨率运行显示器,那么这可能值得一试。</p>]]></content>
<categories>
<category> uncategorized </category>
</categories>
<tags>
<tag> IT </tag>
<tag> Linux </tag>
<tag> 折腾 </tag>
<tag> Raspi/Orapi </tag>
</tags>
</entry>
<entry>
<title>树莓派用自带的网卡搭建热点</title>
<link href="/2018/02/17/%E6%A0%91%E8%8E%93%E6%B4%BE%E7%94%A8%E8%87%AA%E5%B8%A6%E7%9A%84%E7%BD%91%E5%8D%A1%E6%90%AD%E5%BB%BA%E7%83%AD%E7%82%B9/"/>
<url>/2018/02/17/%E6%A0%91%E8%8E%93%E6%B4%BE%E7%94%A8%E8%87%AA%E5%B8%A6%E7%9A%84%E7%BD%91%E5%8D%A1%E6%90%AD%E5%BB%BA%E7%83%AD%E7%82%B9/</url>
<content type="html"><![CDATA[<p>主要用到的软件有hostapd、dnsmasq</p><span id="more"></span><p><code>sudo apt-get install hostapd dnsmasq</code> 然后在/etc/dnsmasq.conf末加入(自己修改IP和网段,这个文件是已存在的,很详细的配置文件,但是所有行都加入了#号注释掉) <code>interface=wlan0 dhcp-range=10.0.0.2,10.0.0.5,12h</code> 然后新建/etc/hostapd/hostapd.conf,加入 <code>interface=wlan0 hw_mode=g channel=10 auth_algs=1 wpa=2 wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP rsn_pairwise=CCMP wpa_passphrase=wifi密码 ssid=wifi名字</code> 接着修改/etc/sysctl.conf,更改(如果有这一行,把#号去掉就行) <code>net.ipv4.ip_forward=1</code> 最后,将下面脚本加入到/etc/rc.local的exit 0前 <code>ifconfig wlan0 down ifconfig wlan0 10.0.0.1 netmask 255.255.255.0 up iwconfig wlan0 power off service dnsmasq restart hostapd -B /etc/hostapd/hostapd.conf & > /dev/null 2>&1 sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT</code> 重启,就可以看到热点了。 转自<a href="http://zhoubanxian.cn/">周半仙的博客</a></p>]]></content>