-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
1592 lines (1551 loc) · 298 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>Vim 中文乱码的非典型解决方案</title>
<url>/2018/08/20/Atypical-solution-for-Vim-Chinese-garbled/</url>
<content><![CDATA[<h4 id="TLDR"><a href="#TLDR" class="headerlink" title="TLDR"></a>TLDR</h4><ol>
<li>在.vimrc 或者你的相应 Vim 配置文件中删去<code>set binanry</code></li>
<li>根据你打开的文件编码(如何查询文件格式编码,可以使用<code>enca -L chinese filename</code>),在 Vim 中输入,譬如<code>:edit ++enc=gb18030</code></li>
</ol>
<h4 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h4><p>前些天从用了一年多了 Linux Mint 转投 Arch Linux 门下,然后在Vim里编辑网络上下载下来的字幕文件时,发现了中文乱码的现象。当时心态有点糟,用了这么久的Vim,居然阴沟翻船。<br>我的环境是 Arch + NeoVim,配置文件是从我自己用了很久的没出问题的 .vimrc 拷贝过来的。</p>
<p>尝试了网上种种乱码解决方案无效之后,决定自行解决问题。</p>
<span id="more"></span>
<h4 id="Solution-1"><a href="#Solution-1" class="headerlink" title="Solution 1"></a>Solution 1</h4><p>大部分会要求你在 .vimrc中进行如下配置<a href="#1">[1]</a>:</p>
<figure class="highlight vim"><table><tr><td class="code"><pre><span class="line"><span class="keyword">set</span> encoding=utf-<span class="number">8</span></span><br><span class="line"><span class="keyword">set</span> termencoding=utf-<span class="number">8</span></span><br><span class="line"><span class="keyword">set</span> fileencodings=utf-<span class="number">8</span>,gbk,latin1</span><br></pre></td></tr></table></figure>
<ul>
<li><span id = "1"> [1] <a href="https://blog.csdn.net/smstong/article/details/51279810">https://blog.csdn.net/smstong/article/details/51279810</a></span></li>
</ul>
<p>这些配置,我当然是有的……扶额……</p>
<p>经检查发现是 .vimrc中的<code>set binary</code>在作祟。输入<code>:help binary</code>查看说明:</p>
<blockquote>
<p>The ‘fileencoding’ and ‘fileencodings’ options will not be used, the file is read without conversion.</p>
</blockquote>
<p>binay选项会导致fileencoding 和fileencodings失效,这就是在进行网上大部分的配置之后,仍会失效的原因。</p>
<blockquote>
<p><a href="https://superuser.com/questions/663405/consequences-of-vims-binary-mode">https://superuser.com/questions/663405/consequences-of-vims-binary-mode</a></p>
</blockquote>
<h4 id="Solution-2"><a href="#Solution-2" class="headerlink" title="Solution 2"></a>Solution 2</h4><p>除了取消binary选项之外,也可以在打开的文件中输入如下命令:(具体参数根据文件编码格式而异)</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">:edit ++enc=gb18030</span><br></pre></td></tr></table></figure>
<blockquote>
<p><a href="https://blog.csdn.net/cnwzh/article/details/7024427">https://blog.csdn.net/cnwzh/article/details/7024427</a></p>
</blockquote>
<h4 id="题外话"><a href="#题外话" class="headerlink" title="题外话"></a>题外话</h4><p>关于我为什么要配置<code>set binary</code>选项,请参看stack overflow问答<br><a href="https://stackoverflow.com/questions/16222530/why-do-i-need-vim-in-binary-mode-for-noeol-to-work">Why do I need vim in binary mode for ‘noeol’ to work?</a></p>
]]></content>
<tags>
<tag>Vim</tag>
</tags>
</entry>
<entry>
<title>Build OpenVPN Server on 53 port - The Easiest Way</title>
<url>/2018/06/06/Build-OpenVpn-Server-on-53-port-the-easiest-way/</url>
<content><![CDATA[<h4 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h4><p>本文旨在教会对 Linux 稍有基础的同学,以__最简单__的方式在拥有__公网 IP__ Ubuntu 主机上搭建一个监听 <strong>UDP 53(67、68) 端口</strong> <strong>OpenVPN</strong> 服务器,并配置好 Linux client 端,以实现绕过__Portal 认证__的目的。</p>
<blockquote>
<p>加黑的每个关键词要么可以搜出大量相关资料,要么是接下来的步骤的关键。<br>本文不会告诉你为什么要这么做,上面给出的关键词已经是充足的暗示。</p>
</blockquote>
<span id="more"></span>
<h4 id="正文"><a href="#正文" class="headerlink" title="正文"></a>正文</h4><ol>
<li><p>使用 ssh 登录你的 Ubuntu 服务器,在命令行中输入:<code>netstat -anup | grep 53</code></p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">udp 0 0 0.0.0.0:5355 0.0.0.0:* 446/systemd-resolve</span><br><span class="line">udp 0 0 127.0.0.1:53 0.0.0.0:* 543/dnsmasq</span><br><span class="line">udp 0 0 127.0.0.53:53 0.0.0.0:* 446/systemd-resolve</span><br><span class="line">.</span><br><span class="line">.</span><br><span class="line">udp6 0 0 :::5355 :::* 446/systemd-resolve</span><br><span class="line">udp6 0 0 ::1:53 :::* 543/dnsmasq</span><br></pre></td></tr></table></figure>
<p> 倘若上面这条命令输出大量结果,请先暂时离开这篇文章,去调研如何先关闭你机器上监听 53 端口的服务。因为倘若有别的服务占用了 53 端口,会与我们接下来的步骤产生冲突。<br> 倘若没有任何结果输入,恭喜,进入下一步骤。</p>
</li>
<li><p>继续在命令行中输入:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh</span><br></pre></td></tr></table></figure>
<blockquote>
<p>参考资料:<a href="https://github.com/Nyr/openvpn-install">https://github.com/Nyr/openvpn-install</a></p>
</blockquote>
<p> 得到如下结果:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Welcome to this OpenVPN <span class="string">"road warrior"</span> installer!</span><br><span class="line"></span><br><span class="line">I need to ask you a few questions before starting the setup.</span><br><span class="line">You can leave the default options and just press enter <span class="keyword">if</span> you are ok with them.</span><br><span class="line"></span><br><span class="line">First, provide the IPv4 address of the network interface you want OpenVPN</span><br><span class="line">listening to.</span><br><span class="line">IP address: XX.XX.XX.XX <span class="comment">#此处隐匿的是笔者机器的公网 IP,不用做任何修改,直接回车</span></span><br><span class="line"></span><br><span class="line">Which protocol <span class="keyword">do</span> you want <span class="keyword">for</span> OpenVPN connections?</span><br><span class="line"> 1) UDP (recommended)</span><br><span class="line"> 2) TCP</span><br><span class="line">Protocol [1-2]: 1</span><br><span class="line"></span><br><span class="line">What port <span class="keyword">do</span> you want OpenVPN listening to?</span><br><span class="line">Port: 53 <span class="comment">#注意此处一定要修改为 53,这是最为关键的一步</span></span><br><span class="line"></span><br><span class="line">Which DNS <span class="keyword">do</span> you want to use with the VPN?</span><br><span class="line"> 1) Current system resolvers</span><br><span class="line"> 2) 1.1.1.1</span><br><span class="line"> 3) Google</span><br><span class="line"> 4) OpenDNS</span><br><span class="line"> 5) Verisign</span><br><span class="line">DNS [1-5]: 3 <span class="comment">#此处修改为 3</span></span><br><span class="line"></span><br><span class="line">Finally, tell me your name <span class="keyword">for</span> the client certificate.</span><br><span class="line">Please, use one word only, no special characters.</span><br><span class="line">Client name: client</span><br><span class="line"></span><br><span class="line">Okay, that was all I needed. We are ready to <span class="built_in">set</span> up your OpenVPN server now.</span><br><span class="line">Press any key to <span class="built_in">continue</span>...</span><br></pre></td></tr></table></figure></li>
<li><p>此时耐心等待脚本安装软件包,以及配置服务器 config 文件。根据机器性能不同,等待时间从几十秒到十几分钟不等。所幸不用任何操作,可以去喝杯咖啡再回来。<br>待到看到如下字样时,OpenVPN 安装并配置成功,而且已经默认跑起来了。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Finished!</span><br><span class="line"></span><br><span class="line">Your client configuration is available at: /root/client.ovpn</span><br><span class="line">If you want to add more clients, you simply need to run this script again!</span><br></pre></td></tr></table></figure>
</li>
<li><p>注意输出的这一条语句:__/root/client.ovpn__,使用<code>scp</code>将改文件从服务器拷贝到你的 client 端机器上。<br>由于每个人登录的账户不同,具体的输出路径可能不一样。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">scp [email protected]:yourfilepath .</span><br></pre></td></tr></table></figure>
</li>
<li><p>打开你的 Ubuntu client 机器上的网络管理,选择<code>import a saved VPN configuration</code>,选中拷贝下来的__client.ovpn__文件,在弹出窗口中不用做任何修改,直接点击 saved 保存即可。</p>
</li>
</ol>
<h4 id="撤销操作"><a href="#撤销操作" class="headerlink" title="撤销操作"></a>撤销操作</h4><p>如果想要撤销服务器上的操作,再次运行下面这条指令。选择__3__即可。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh</span><br><span class="line"></span><br><span class="line">Looks like OpenVPN is already installed.</span><br><span class="line"></span><br><span class="line">What <span class="keyword">do</span> you want to <span class="keyword">do</span>?</span><br><span class="line"> 1) Add a new user</span><br><span class="line"> 2) Revoke an existing user</span><br><span class="line"> 3) Remove OpenVPN</span><br><span class="line"> 4) Exit</span><br><span class="line">Select an option [1-4]: 3</span><br><span class="line"></span><br><span class="line">Do you really want to remove OpenVPN? [y/N]: y</span><br></pre></td></tr></table></figure>
]]></content>
<tags>
<tag>OpenVPN</tag>
<tag>crack</tag>
</tags>
</entry>
<entry>
<title>How to crack Synergy</title>
<url>/2018/05/31/How-to-crack-synergy/</url>
<content><![CDATA[<p>Synergy 是一款用于在不同电脑之间共享键盘、鼠标、剪贴板的开源商业软件,支持包括 Linux、Windows、Mac OS 在内的多种主流操作系统,其 Pro 版本甚至支持直接在不同桌面上面拖动文件。</p>
<p>笔者使用的 Linux 系统有免费的基础版可以使用,但想要使用共享剪贴板功能,则需付费购买 Pro 版。这篇文章简单描述了从源代码逆向其付费序列号的过程。由于实在太败人品了……不会放出序列号,读者可以自行尝试编译笔者提供的代码。</p>
<span id="more"></span>
<p><img src="/synergy_active_window.png" alt="Synergy 激活窗口"></p>
<p>观察 Synergy 的激活窗口,注意到存在 “serial key”关键字。<br>从 Github 将 Synergy 源码仓库 clone 下来之后,使用<code>ag "serial key"</code>得到如下结果。从中我们可以定位到 <code>src/lib/shared/SerialKey.cpp</code>文件。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ ag <span class="string">"serial key"</span></span><br><span class="line">ChangeLog</span><br><span class="line">7:Bug <span class="comment">#5901 - Stored serial key corrupted on macOS</span></span><br><span class="line">40:Bug <span class="comment">#5722 - Malformed serial key in registry will crash GUI on startup</span></span><br><span class="line">84:Bug <span class="comment">#5471 - Serial key textbox on activation screen overflows on Mac</span></span><br><span class="line">99:Enhancement <span class="comment">#4715 - Activation dialog which also accepts a serial key</span></span><br><span class="line">100:Enhancement <span class="comment">#5020 - Recommend using serial key when online activation fails</span></span><br><span class="line">105:Enhancement <span class="comment">#4716 - Allow software to be time limited with serial key</span></span><br><span class="line"></span><br><span class="line">src/lib/shared/SerialKey.cpp</span><br><span class="line">53: throw std::runtime_error (<span class="string">"Invalid serial key"</span>);</span><br></pre></td></tr></table></figure>
<blockquote>
<p><a href="https://github.com/symless/synergy-core/blob/master/src/lib/shared/SerialKey.cpp">https://github.com/symless/synergy-core/blob/master/src/lib/shared/SerialKey.cpp</a></p>
</blockquote>
<p>粗略扫视一眼 SerialKey.cpp 文件,确定如下两个函数可能是对序列号进行解析的关键。</p>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line">SerialKey::decode(<span class="type">const</span> <span class="built_in">std</span>::<span class="built_in">string</span>& serial);</span><br><span class="line">SerialKey::parse(<span class="built_in">std</span>::<span class="built_in">string</span> plainSerial);</span><br></pre></td></tr></table></figure>
<p>decode 函数并不复杂,就不做分析了。继续跟踪函数逻辑流,发现代码中仅仅对序列号版本(Basic 或者 Pro)以及软件过期时间进行了检验,其余 filed 可以随便乱填。Synergy 毕竟是家小公司,做事可能不太严谨。不过话说回来,既然公司把源码都公布出来,自行编译也实在不是什么难事。所以我做的这事的确是有点败坏人品的,图灵祖师宽恕则个……</p>
<p>下附简单的 Crack Pro 版本序列号的代码。读者可以自行编译,但请勿传播。</p>
<figure class="highlight cpp"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><iostream></span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string"><string></span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function">string <span class="title">decode</span><span class="params">(<span class="type">const</span> std::string &serial)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="type">static</span> <span class="type">const</span> <span class="type">char</span> *<span class="type">const</span> lut = <span class="string">"0123456789ABCDEF"</span>;</span><br><span class="line"> string output;</span><br><span class="line"> <span class="type">int</span> len = serial.<span class="built_in">length</span>();</span><br><span class="line"> <span class="keyword">if</span> ((len & <span class="number">1</span>) != <span class="number">0u</span>) {</span><br><span class="line"> <span class="keyword">return</span> output;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> output.<span class="built_in">reserve</span>(len / <span class="number">2</span>);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < len; i += <span class="number">2</span>) {</span><br><span class="line"></span><br><span class="line"> <span class="type">char</span> a = serial[i];</span><br><span class="line"> <span class="type">char</span> b = serial[i + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line"> <span class="type">const</span> <span class="type">char</span> *p = <span class="built_in">lower_bound</span>(lut, lut + <span class="number">16</span>, a);</span><br><span class="line"> <span class="type">const</span> <span class="type">char</span> *q = <span class="built_in">lower_bound</span>(lut, lut + <span class="number">16</span>, b);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (*q != b || *p != a) {</span><br><span class="line"> <span class="keyword">return</span> output;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> output.<span class="built_in">push_back</span>(<span class="built_in">static_cast</span><<span class="type">char</span>>(((p - lut) << <span class="number">4</span>) | (q - lut)));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> output;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function">string <span class="title">encode</span><span class="params">(string src)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> string result;</span><br><span class="line"> <span class="type">static</span> <span class="type">const</span> <span class="type">char</span> *<span class="type">const</span> lut = <span class="string">"0123456789ABCDEF"</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i < src.<span class="built_in">length</span>(); ++i) {</span><br><span class="line"> <span class="type">char</span> a = src[i];</span><br><span class="line"> <span class="type">char</span> p = (a & <span class="number">0xf0</span>) >> <span class="number">4</span>;</span><br><span class="line"> <span class="type">char</span> q = (a & <span class="number">0x0f</span>);</span><br><span class="line"> <span class="comment">// const char *x = lower_bound(lut, lut + 16, p);</span></span><br><span class="line"> <span class="comment">// const char *y = lower_bound(lut, lut + 16, q);</span></span><br><span class="line"></span><br><span class="line"> result.<span class="built_in">push_back</span>(lut[p]);</span><br><span class="line"> result.<span class="built_in">push_back</span>(lut[q]);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">char</span> *argv[])</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="comment">// e.g.: {v1;basic;Bob;1;email;company name;1398297600;1398384000}</span></span><br><span class="line"> cout << <span class="built_in">encode</span>(<span class="string">"{v1;pro;Bob;1;email;company name;1398297600;1398384000}"</span>);</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
]]></content>
<tags>
<tag>crack</tag>
<tag>tips</tag>
</tags>
</entry>
<entry>
<title>从印象主义到蒸汽朋克</title>
<url>/2018/05/24/From-Impressionism-to-Steampunk/</url>
<content><![CDATA[<h3 id="摘要"><a href="#摘要" class="headerlink" title="摘要"></a>摘要</h3><p>出现于工业革命期间的印象主义与出现于 20 世纪下半叶的蒸汽朋克文化,在审美旨趣的角度有着非常多的相似之处,这些相似之处包括:表现对象的相同,对工业和科技的赞美,对社会传统的反叛,对现实社会的乐观精神。除此之外,这两种截然不同的艺术形式在受众人群上存在着极大的重合,大都是受过高等教育,有一定的艺术修养,对未来充满美好憧憬的群体,他们所持有的往往是一种根植于新维多利亚主义的大众审美。抛开这些纷繁复杂的特征表象,我们会惊讶地发现,无论是印象派还是蒸汽朋克都存在着一个相同的精神内核 —— 一种机械唯物主义的积极乐观的进取精神,对科学的崇拜,相信技术的进步终将解决一切问题。</p>
<p><strong>关键词:印象派、蒸汽朋克、科学崇拜、工业革命、机械唯物主义、机械美学</strong></p>
<h3 id="序言"><a href="#序言" class="headerlink" title="序言"></a>序言</h3><p>蒸汽朋克(Steampunk)是一种流行于 20 世纪 80 年代至 90 年代初的科幻题材,显著特征为故事都设定于一个蒸气科技树攀升到巅峰的架空世界。这类故事对距今已较遥远的工业革命时代的科技进行了极大的夸张,创建出一个与当今科技文明不同的、依赖于蒸汽动力装置的机械科技世界。从广义上讲,只要是将某种科技置于图腾地位,并将其力量无限扩大的文化,都可算作蒸汽朋克。<a href="#1">[1]</a></p>
<p>蒸汽朋克通常以英国的维多利亚时代为背景,威廉·吉布森(William Gibson)的小说《差分机》,就是这个领域的第一本小说。虽然“蒸汽朋克”一词出现于 20 世纪下半叶,但从今天的观点来看,工业革命时代所产生的许多科幻小说其实都可以归入该类别。只不过当年人们的创作多是推崇科技的力量。而今天人们创作这类故事则多以对早期科技文化的怀旧与复古为目的。蒸汽朋克的怀旧风格与现今社会崇尚未来感设计的风尚形成鲜明对比。<a href="#1">[1]</a></p>
<span id="more"></span>
<p>在后维多利亚时代,以蒸汽机、差分机为代表的工业革命产物以摧枯拉朽之势完成了对传统农业社会的改造;与此同时以透纳、康斯坦勃尔、莫奈等为代表的印象派先驱、创始人,借助当时最新的科技发展,以及伴随工业革命来到的海外殖民地而产生的相关经济结构,开始了在艺术领域对传统的表现手法的革新,在思想上开始追求与“学院派”观点不同的新价值观。(以及这里可以补充的是,价值观的内容)</p>
<p>蒸汽朋克的主要表现对象为工业革命背景下的种种产物,这一点自不必多提。但值得注意的是,受到第二次工业革命的时代背景的影响,印象派画家往往也热衷于在绘画中描绘能反应当时时代精神的相关社会现象:新兴中产阶级的“闲暇”生活、喷涂着蒸汽快速前行的火车、轮船等等,都是他们所喜爱的题材。除此之外,蒸汽朋克与通常的科幻流派最大的一点不同是,通常的科幻流派在作品中往往警惕科技进步可能会带给我们的危害,这样的担忧在末世、赛博朋克等题材中尤为典型;但在蒸汽朋克中占据主导地位的是一种机械唯物主义的世界观,在那个牛顿和洛克的时代,科学仍然是古典的,世界图景是明晰的,时空还是平直的,上帝是不扔色子的。人们第一次可以不借助自然力量,而单凭借自己创造的机械来改造世界,人们的物质世界、认知的深度和广度都得到极大拓展,充满了对未来的美好遐想。生活在这样的世界中,人们崇拜科学和由科学带来的力量也就不足为奇了。</p>
<p>在精神层面,蒸汽朋克的“朋克”一词本身就意味着拒绝对传统和权威的妥协,象征着一种标新立异、创造自由乌托邦的精神内核。<a href="#4">[4]</a> 而印象派画家同样也是击碎了学院派传统的种种束缚,才得以产生出能够孕育现代艺术的土壤。从蒸汽朋克作品和印象派绘画的受众群体的角度来看,我们仍能看到一种令人惊异的相似性,他们以受过良好高等教育、并享有一定闲暇时间、对艺术存在一定的鉴赏力的群体为主。</p>
<p>那么究竟什么是科学崇拜,所谓科学崇拜,是唯科学主义的外在表现形式。唯科学主义思想源自启蒙主义,成于实证主义,其思想内核是由牛顿爵士构建的“机械唯物主义世界观”。其拥护者往往以“知识就是力量”为口号,这里的“知识”通常被他们理解为科学。拥护科学的想法似乎没什么不好,但凡事都有一个度,一旦超过了这个度,想要用科学去解释世间的一切,就不免陷入了自视为真理的泥淖。在科学对世界的解构的过程中,由于其精确性、实用性、强大性,科学逐渐在人们心中接管了宗教曾经具有的那种神性,唯科学主义也因而变成了一种与科学精神推崇的理性怀疑精神相悖的“类宗教”。<a href="#2">[2]</a></p>
<p>唯科学主义在普遍科学素养不太高的时代,有着其积极的意义。在这个目的论和决定论的机械唯物主义的世界里,世界乃至宇宙的图景都无比清晰,人与人之间的关系也被视作一种“力”的互动,在社会科学上,也有孔德试图用牛顿力学体系来构建“社会动力学”和“社会静力学”体系的尝试。这个世界并非暗淡无光,事实上由于世界图景的清晰,科学向人们承诺了一个科学终将解决一切问题的光明美好的未来。而且由于目的论的影响,各个阶层的人们都安于在庞大的“社会机械”中充当一个运转的齿轮。</p>
<p>在我们下面的行文中,我们将分别从以上这些角度来论证,印象派和蒸汽朋克在科学崇拜这一精神内核上的共通性。</p>
<h3 id="对工业和科技的赞美"><a href="#对工业和科技的赞美" class="headerlink" title="对工业和科技的赞美"></a>对工业和科技的赞美</h3><p>蒸汽朋克有着专属于自己的美学形式,这个形式通常被称为新维多利亚美学,其主要的表现对象是多种饱含维多利亚风格的产物,包括交通工具、武器、建筑和服装等等。这些产物通常是第二次工业革命阶段的技术有机组合构造的更复杂更超脱的审美意象,往往造型古朴、体积庞大、结构复杂且暴露在外。以蒸汽锅炉为动力,螺旋桨、齿轮、活塞、轴承、旋钮、管道共同组成眼花缭乱又极具美感的连锁装置,其令人惊异的想象力总让人联想到“阿鲁贝戈德堡机”。因为蒸汽朋克时代所有的动力都是靠纯机械装置将蒸汽产生的动力输送到动力机关来做功的,因为机械自重过大和摩擦力还有热传递等原因,蒸汽产生的动力在机械装置传导的过程中大量损耗,能量转化效率极低,但是也造就了蒸汽朋克世界观当中各种独有暴力美感的巨大机械造型。<a href="#3">[3]</a> 一经启动,锅炉中升起腾腾热气,活塞错落有致地起伏,精准咬合的大小齿轮互相带动旋转,那是一幅大工业时代盛世图景的完美再现。</p>
<p>这些工艺上具有时代特征的表现对象,在各类文艺作品中都常常见到:从电子游戏《教团 1886》特斯拉电弧枪、宫崎骏的动漫电影《风之谷》中的王虫也可视作一种异化的机械、《天空之城》中的类人机械人和漂浮之城、《哈尔的移动城堡》那座典型的蒸汽朋克风格的移动城堡等,无不洋溢着对机械质感的强烈赞美。<br><img src="/TS-23_Resonant_Circuit_Arc_Induction_Lance.jpg" alt="特斯拉电弧枪"></p>
<blockquote>
<p>关于《教团 1886》中各种蒸汽朋克风格武器介绍,可参见网友 tekkenman 整理的资料。<br><a href="http://bbs.a9vg.com/thread-4446281-1-1.html">『《教团 1886》中的一些特殊武器装备预热以及与当时现实中科技对比』</a></p>
</blockquote>
<p>在一个特殊的科幻迷群体 —— “多炮塔神教”中,还存在着“多铆蒸刚”的说法。所谓“多铆蒸刚”,指的是“多炮塔,铆钉连接,蒸汽动力,刚性悬挂”,在他们眼中“多就是美,大就是好,多属于蒸汽时代浪漫情怀的一种体现。”。<a href="#4">[4]</a><br>总的来说,蒸汽朋克的机器美学集中体现了后现代艺术的精髓,百无禁忌,任想象驰骋,但又有一定规律可循,呈现一望即知的视觉风格。<a href="#5">[5]</a></p>
<p>印象派画家同样热衷于表现近代工业文明。有三幅画,非常典型地表明了印象派画家的审美取向:透纳的《被拖去解体的战舰无畏号》、《雨,蒸汽和速度》,莫奈的《圣·拉扎尔火车站》。</p>
<p><img src="/The_Fighting_T%C3%A9m%C3%A9raire_tugged_to_her_last_Berth_to_be_broken.jpg" alt="被拖去解体的战舰无畏号"><br>《被拖去解体的战舰无畏号》意在表现一艘巨大的老式木质风帆战舰被对比起来显得渺小的蒸汽动力船拖去船坞解体,这艘战舰正是在奠定英国海上霸权地位的特拉法海战(the Battle of Trafalgar)中,营救了纳尔逊指挥的胜利号旗舰,并俘获了两艘敌舰,立下了赫赫战功的“战舰无畏号”(The Fighting Temeraire)。<br>画家选取的这戏剧性的一幕充分地显示了一个辉煌时代的落幕。远方的太阳看不出是日出还是日落,更像是画家的有意为之,它既是象征着传统社会的木质战船的落日,又是冉冉升起的工业化时代的新日。油画中可以看到,巨大的无畏号在汽轮喷吐出的蒸汽中仿佛在雾霭里一般朦胧,桅杆上的帆紧紧收着,渐渐远离平静的海面,一个时代结束了,古老的荣耀与激情如今被新的一页覆盖。小小汽船拖动巨大的木质战舰去解体,也显示了工业革命和科技的力量。画面整体所使用的暖色调,也又一次强调了画家所想表达的积极乐观的主旨。</p>
<p><img src="/Rain_Steam_and_Speed_the_Great_Western_Railway.jpg" alt="雨、蒸汽和速度"><br>在《雨、蒸汽和速度》中表现出大自然和两大技术发明(铁路和高架桥)之间的强烈对比。铁路和高架桥这两个人造的力量使自然景色大大改观,透纳看到并描绘了它们所有震撼人心的效果。雨水滴落的方向仿佛被机械强大的力量所扭转,这似乎象征着人类通过机械的力量对自然的征服。火车头前方有一只小野兔在奔跑,既象征着速度,又对极尽烘托出了了雨中飞驰的火车那磅礴的气势。</p>
<p><img src="/La_Gare_Saint-Lazare_-_Claude_Monet.jpg" alt="圣·拉扎尔火车站"><br>随着城市化进程的加快,工程师对伦敦、巴黎等大城市进行了大刀阔斧的改造,因而出现了大量全新的城市新景观。莫奈的《圣·拉扎尔火车站》,即成功地表现了现代生活最典型的景象。那巨大的停车场,有玻璃的屋顶,沉重的火车头发出暗沉沉的水蒸汽,进进出出的列车、人群,背景中澄澈的天空和蒸汽腾腾的机器之间的对照———所有这一切供给他以不平常的动人题材,谱写了一首工业文明的赞美诗。可见,当时的印象派画家不仅仅是利用刚出现不久的道路和交通手段外出作画,更是将它们看作是值得去画的创作题材,甚至比传统的作画题材更为重要,将其搬上画面,描绘出由于工业化而“变得更美的风景”,用通俗的画面让人们了解了工业化。</p>
<h3 id="对现代事物及宗教的反叛"><a href="#对现代事物及宗教的反叛" class="headerlink" title="对现代事物及宗教的反叛"></a>对现代事物及宗教的反叛</h3><p>如果说印象派画家是通过对传统的反叛而通向未来的话,那么蒸汽朋克则是对后现代美学的反叛而回到过去。他们有着不同的起点,不同的手段,但最终却达至了相同的终点。</p>
<p>朋克精神本质在于超越社会准则,反对除朋克外的一切,有反社会无政府主义的倾向,通常被人视作叛逆的代名词。但蒸汽朋克的反叛情绪显然要温和得多,并没有通常的科幻作品中那种科技发达、物质文明泛滥、世界被机器主宰、人际关系冷漠疏离、精神迷惘空虚的反乌托邦情绪。蒸汽朋克非但罕见阴郁低落的基调,而且往往充满了催人振奋、积极向上的情绪,这与维多利亚时代的科技乐观主义是一脉相承的。<a href="#5">[5]</a></p>
<p>有人提出了一个蒸汽朋克理念 —— “异质世界”。蒸汽朋克作品中叛逆因素的存在,更多的是为了切合架空世界的后现代表现形式。它常拼凑出一个虚幻,独立、区别于古往今来的任何一个时代的面貌,构成独一无二的异质世界。朋克世界中强调反抗和独立,总有种打破旧世界的味道。再生艺术是思维构成的自我演绎与不断完善,是艺术思维的超越性体现,也是艺术生命力的延续和变革发展。蒸汽朋克同样如此,过去与未来、想象与现实、魔幻与科学的元素互相并存,反抗并独立的延续着。它有极大的想象力,构造的是一个超现实的幻想世界,将蒸汽的力量无限扩大化。蒸汽朋克作品的主要内容就是把第一次工业革命的技术形象有机组合起来,用 19 世纪的科技实现 21 世纪当代科学产物,去构造更复杂更超脱的意象,以及这一事实造成的反差和对比给人带来的震撼力。<a href="#6">[6]</a></p>
<p>作为后现代艺术的一种,蒸汽朋克同样也质疑传统的元叙事作品的合法性,这种质疑随着元叙事的基础 — 堂皇话语环境 — 的终结而达到顶峰。传统的元叙事作品遵循的总是以英雄为主视角的堂而皇之的叙述模式,而后现代作品倾向于将堂皇叙事的社会的语境(如圣贤英雄、解放拯救、光辉的胜利、壮丽的远景等)散入叙事语言的迷雾中,使观众对堂而皇之的历史言论,或历史上的伟大“推动者”和伟大的“主题”产生怀疑,并以平凡的小人物、平凡的主题、平凡而琐碎的故事取而代之或利用堂皇叙事与平凡话语间的杂揉、拼贴和交替衍生来反衬、嘲弄元叙事的理性偏激。<a href="#7">[7]</a></p>
<p>文艺复兴时期是一个重要的转折点,达芬奇以及丢勒等艺术家对飞机、潜水艇等人造机械装置的热爱已经远远超过了工具研制的层面,而上升到了审美层面上,他们似乎要穷尽自己的脑力和心力来与上帝抗衡。通过否定上帝,肯定自身,人类对自身的肯定也随之带来了对自身造物的肯定。<a href="#8">[8]</a></p>
<p>如果说蒸汽朋克是对反直觉的现代事物的反叛(详见下文的古典机械美学),那么印象派的反叛则是多角度、更深刻的。</p>
<p>科学技术的发展为印象派的诞生产生了巨大的影响:照相技术的出现对传统写实绘画纪实功能的消解;光学研究的新成果促使艺术家重新审视光线对物体色彩的影响;色彩研究的新成果让艺术家在画面色彩表现技巧上有了新突破;交通工具的发展为作画者的出行带来方便;颜料管的发明节约了工时,也使得户外作画成为可能;伴随对日本的经济殖民,日本浮世绘的传入引发了画家技法和思想上的思考。<a href="#9">[9]</a></p>
<p>传统的写实主义绘画,承担着为贵族记录形象和对宗教、社会事件说教的任务,画面写实技术精湛性的攀比和社会服务功能对一幅作品的好坏起到了决定性的作用。但随着摄影技术的发展和普及,当时的艺术家发现他们在耗尽全部心血完成一幅写实作品的时候,照相机在瞬间就能够记录或超越写实绘画的真实效果,写实绘画失去了记录功能的优势,这种危机感促使艺术家放弃了照片式的古典画法,转而寻找绘画艺术表现形式的新途径。<a href="#9">[9]</a></p>
<p>过去古典写实主义画家认为任何物体的固有色都是一成不变的,艺术家们完全按照物体的固有色和棕褐色的调子去观察和习惯性表现对象。牛顿、托马斯·杨等科学家建立了新的光学理论,艺术家们吸收并在自己的作品中实践了这些观念———世界万物并没有什么固有色,色彩的根源在于光,于是选取唯一真实的元素———光来诠释自然。<a href="#10">[10]</a></p>
<p>如今看来毫不起眼的颜料管的发明,事实上从三个方面极大地影响了艺术创作,曾经油画颜料无论是制作还是保存都繁琐异常。耗费在颜色调配的时间,往往数倍于作品的真正绘制的时间。而且这一点往往局限了画家作画的场地只能是在室内。最后一点,颜料管的发明,也为画师尝试使用不加调和的色彩进行作画提供了便利。如我们所知,印象派有两大主张正是“到户外去作画”、“用不加调和的色彩去表现光”。</p>
<p>色彩的研究也有了一些新的突破,人们发现不同色彩混织一起时,从一定距离的远处看就在人的视觉中形成了这两种颜色的混合色。以及日本浮世绘的传入,使得画家们开始尝试像东方艺术一样使用单一色彩来进行单线平涂,不再追求使用精心调和的色彩来进行绘画。浮世绘带来的另一个影响是,画家用东方绘画中“步步移,面面观”的透视代替了原先的单点透视。</p>
<p>在此之前的古典画法的主要题材要么是将相王侯、要么是宗教神话,不追求对自然风光的描绘,不需要也不能在室外作画。印象派画家的一个重大主张就是到户外去作画,而铁路交通网的覆盖,为画家们能够便利地到郊区作画提供了便利。新兴的百货商店、林荫大道、公园、咖啡馆等建筑不仅为人们提供了全新的娱乐场所,也激发了艺术家对现实生活的关注,现代景观的出现吸引了印象派画家走出画室,探索户外创作之路。不仅是对“室内作画传统”的反叛,也是对作画主题的反叛。</p>
<h3 id="乐观精神-人文主义,机械唯物主义"><a href="#乐观精神-人文主义,机械唯物主义" class="headerlink" title="乐观精神 - 人文主义,机械唯物主义"></a>乐观精神 - 人文主义,机械唯物主义</h3><p>蒸汽朋克的作品中弥漫着浪漫主义乐观精神,工业的发展一定程度解放了劳动力,自然科学的发展破除了迷信与宗教集权政治,文化逐渐开明,人们充满了对世界的好奇心。人们对科技的发展持乐观态度。它的这种魅力是人们对乌托邦的向往。人类刚刚拥有接近神的力量,踏出解开自然奥秘的第一步。这种科技带来的神力让人们从数千年以来在繁重的体力劳动和贫乏的物质限制中获得解脱,让人们从束缚思想的封建禁锢中解放出。落后的势力和人类自诞生以来的人性缺陷又同时存在,先进与落后并存,先进与落后抗争,人们开动着巨大而笨拙的机器飞奔在文明发展的道路上,无情的碾压着旧事物,不断的探索,不断的创新,用自己的智慧谱写着工业文明辉煌的篇章,徜徉在探索新世界的浪漫主义思想中。</p>
<p>如前文所说,蒸汽朋克的哲学本质是一种机械唯物主义。机械唯物主义的世界观之下,自然、社会乃至于组成社会的一个个基本单位 —— 人,都是机械。拉美特利就宣称:“人是机器”。<a href="#11">[11]</a> 通过将世间的一切都视作平等的机械,将曾经高于人类的自然,拉到了与人类平等的地位上,从理论上为征服自然提供了法理依据。在哲学上,牛顿爵士、伏尔泰等人所创立的自然神论,认为上帝创造自然但不干涉自然,只是在自然之外默默观察,通过将上帝置于自然之外的“太上皇”地位,从而架空了上帝的权利,人的意志得以彰显。</p>
<p>在这个机械的世界当中,所有的一切都如同钟表一般精准。无论身处社会的哪一个阶级,只要你遵从机械说明书一样的程式,那么你的未来也会如同机械一般精准而清晰。而科学承诺将会解决这世界上的一切问题,所以你的未来也会迈向一个光明的未来。</p>
<p>蒸汽朋克代表的是一种机械之美,代表的是人类在征服自然过程中的一种重大胜利,代表了现代文明的开端,永不放弃的奋斗意志,即使在黑暗中也要等待光明的到来的念头让它的主旨充满了乐观精神。</p>
<p>印象派作品中的乐观精神并不直接,事实上印象派画家也会描绘当时社会中的不幸事件,例如《运输船遇难》,但这些作品不占印象派作品的主流。印象派画家最喜欢的题材大多与当时中产阶级的生活方式和情趣相关。马奈的《草地上的午餐》、莫奈的阿尔让特伊沿岸(中产阶住宅区)风光、雷诺阿《游艇上的午餐》、德加的芭蕾舞演员、修拉的《大碗岛的星期日下午》等等,无不以中产阶级 “闲暇”,对世俗生活的享乐为主题。</p>
<p>19 世纪后期的印象主义者们是典型的享乐主义者。19 世纪法国政治的变动、普法战争时期的颠沛流离,这些苦难的经历并没有在印象主义者的笔下留下痕迹,他们画中的场景一如他们眼中的阳光一般灿烂。在他们的手中,绘画不再承载道德说教的任务,只是快乐单纯地享受来自周遭视觉景象的快乐。在《视觉艺术中的现代主义和大众文化》一文中用“闲暇”来形容印象派绘画中所表现的中产阶级的生活,印象派画家通过画面中郊游、赛马、歌舞表演、咖啡厅等题材来表现出中产阶级的闲情逸致。这种有一定程度的文化和固定职业的白领阶层的闲暇生活不同于古典主义的理想式贵族生活,也不同于荷兰小画派的乡村情调的市井生活;印象派笔下的中产阶级闲暇生活与大众消费文化有关,他们的生活、消遣方式是他们在紧张的工作之余处理对通俗文化的消费。<a href="#12">[12]</a></p>
<p>如果说文艺复兴是人的主体意识(人性)的觉醒的话(在科学上表现为科学作为一支独立的力量而出现和存在,不再是神学的婢女;在艺术上表现为从“以神为中心”转向“以人为中心” ), 那么,印象派和相对论的诞生,则再一次深刻地反思了“神中心”的残存。这在科学上表现为对“独立于人而存在的绝对时间——空间”——这是神的认识能力的范围——的批判;在艺术上表现为对“完全地表现客观物体的样子”——神的认识能力——的批判。因此印象派和相对论进一步大大深化了“人中心”这一主题。<a href="#10">[10]</a> 正是因为由“以神为中心”转向“以人为中心”而招致的人文主义精神,人们重新从基督教那自我指责的赎罪意识中挣脱了出来。人间不再是急于摆脱的不名一文的“尘世”,转而成为了有待于建设的天堂。而且路德和加尔文的新教改革运动,从另一个侧面又加深了这一观点:“天职”描述人们不是要以苦修、超越世俗道德的禁欲主义方式来追求上帝的应许,反而应该在俗世中,完成个人在其所处职业位置上的工作责任和义务。<a href="#13">[13]</a></p>
<h3 id="受众人群的相似审美观"><a href="#受众人群的相似审美观" class="headerlink" title="受众人群的相似审美观"></a>受众人群的相似审美观</h3><p>蒸汽朋克完美契合了工业社会普通人审美情趣的风格。 这类风格之所以有独特魅力,是因为在技术发展的高速和大众审美观念的惯性之间找到了平衡:新型机械工程师们喜爱的,那种由管道电线煤炉仪表板堆砌出来的,粗糙但准确的美感;上流社会贵族们钟爱的,那种下午茶和舞会组织起来的细密精致的美感;商人市民阶层追求的,普通实用日常生活的朴素美感。</p>
<p>机器美学,正是这个机器主宰一切的时代的产物。机器之所以美,并不仅仅因为其实用功能,也不只因为其形式结构,更重要的是因为其在心理层面上的人造物意义。古典美学研究的是美的终极意义,那个美是虚幻的,而机器美学所研究的美是实在的,是具象的,它是被人所创造也为人所感知的,这显然是一种更加真实朴素、毫无修饰的美。正如本雅明所言,机械复制时代的艺术和文化是大众文化,而从某种意义上讲,机械美学也是一种大众美学,它几乎无处不在,尤其是在 19 世纪以后纷纷出现的那些蒸汽机、汽车、火车头和巨型轮船乃至于翱翔的飞机,它们一方面以前所未见的奇特外形刺激着人们,另一方面却频频出现在人们身旁并迅速改变着我们的生活方式。<a href="#8">[8]</a></p>
<p>古典机器美学是符合直觉的。这种直觉是一种机能化的视角,古典式机械的设计,我们想要增加动力就加一个锅炉,想要一个侧向的驱动力,齿轮组,扭杆组可以很直觉的形成模块,我们可以依靠直觉粗暴地构成一个可以运作的有机体。而这种机能主义,就如同这个技术变革刚解体原秩序,新秩序刚形成的社会生态一样,我们在解决一个社会问题,只需要建构一个符合直觉和普遍认识的机制来解决就行了,社会生态还在初期的建设阶段,而这一切是符合直觉的,也是从经验主义学理传承下来对于历史语境的推崇。故而,在这种指导下,社会的前景,科学技术的发展是有序的,可认知的,在我们经验里面也是可以明确的,这里没有人类本身之外的不确定因素,也没有社会结构的离散化,我们可以将一系列自然问题可以归元到我们的经验中和逻辑之中,来做一个判断,最后还原到技术上来解决。整个社会生态就如同一个精密设计的,符合直觉和经验的有机体,各模块(阶级,共同体)之间被分割放置,各司其职,就如同古典式机器一样。<a href="#15">[15]</a> 这就是蒸汽朋克世界观给我们的美感。</p>
<p>与蒸汽朋克类似,印象派画家同样追求符合人的直觉的视觉感官体验,对于他们来说,美得毫无瑕疵的古典画作并不是真实,那是只存在与柏拉图“理念世界”的产物。真实是你用肉眼看到的亲身体验,是笼罩在牛奶般薄雾中的“日出·印象”,是市民阶级中熟悉的日常生活中点点滴滴。有几位印象派画家比较典型:</p>
<p>莫奈笔下的巴黎街景记录性强,在风格上类似现在的城市景观派;他所有的描绘巴黎街景的作品都是对巴黎各大街道的一种真实写照。而雷诺阿与他们不同,虽然雷诺阿大部分作品是描绘女人的,描绘巴黎街头的作品很少,但是他描绘的巴黎街头总是带有欢愉的社交氛围。</p>
<p>印象派画家中比较特殊的一位——卡耶博特,擅于表现和巴黎现代生活息息相关的作品,尤其是表现巴黎街头的景象。虽然受印象派影响,但是他不是完全模仿印象派的创作方法而是进行实验性的探索,形成与众不同的风格。他希望最大限度的表现出这条街道在某一瞬间的真实,所以他对此时街道上的每一个事物包括细节都细致的描绘。卡耶博特的创作风格尤其是在构图上受到摄影的巨大影响,他所表现的这一场景就像摄影师在下雨天的某条巴黎街道偶然拍下的一个场景。<a href="#12">[12]</a></p>
<h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>而蒸汽朋克的核心魅力,或者说是比较核心的那部分科幻迷看重的东西,应该是过去时代的科学精神和社会精神。19 世纪是一个机械唯物主义泛滥的时代,不仅自然界是机械性的,人类历史也是线性的,新东西一定比老东西强,明天一定比昨天好,崇拜科学,科学只要无限发展下去就一定会掌握整个宇宙的真理。蒸汽朋克通过把故事背景调整到 19 世纪,来复苏 19 世纪的“纯洁的科学精神”,缓解一下现代科幻迷遇到的信仰危机。而印象派虽然不以科学为表现主体,它对科学的崇拜是隐性的,但受时代背景影响,一脉相承于文艺复兴中的人文主义乐观精神,以及对工业革命将现实社会改造得更加美好的颂扬都得到了充分的体现。</p>
<h3 id="引用"><a href="#引用" class="headerlink" title="引用"></a>引用</h3><p><span id = "1"> [1] 维基百科 : <a href="https://zh.wikipedia.org/wiki/%E8%92%B8%E6%B1%BD%E6%9C%8B%E5%85%8B">https://zh.wikipedia.org/wiki/%E8%92%B8%E6%B1%BD%E6%9C%8B%E5%85%8B</a> </span><br><span id = "2"> [2] 科学崇拜和合理性怀疑_高知识人群邪教受害者思想根源初探_亓馈言 </span><br><span id = "3"> [3] 知乎 首先说一下蒸汽朋克的时代背景 </span><br><span id = "4"> [4] <a href="https://zh.moegirl.org/%E5%A4%9A%E7%82%AE%E5%A1%94%E7%A5%9E%E6%95%99">https://zh.moegirl.org/%E5%A4%9A%E7%82%AE%E5%A1%94%E7%A5%9E%E6%95%99</a> </span><br><span id = "5"> [5] 果壳 什么是真正的蒸汽朋克?方聿南 </span><br><span id = "6"> [6] 从蒸汽朋克看城市再生创意的必要性_魏安琪 </span><br><span id = "7"> [7] 维基百科 <a href="https://zh.wikipedia.org/wiki/%E5%90%8E%E7%8E%B0%E4%BB%A3%E4%B8%BB%E4%B9%89">https://zh.wikipedia.org/wiki/%E5%90%8E%E7%8E%B0%E4%BB%A3%E4%B8%BB%E4%B9%89</a> </span><br><span id = "8"> [8] 蒸汽朋克电影与机器美学 </span><br><span id = "9"> [9] 自然科学新成果对印象派绘画的影响_曹跻圣 </span><br><span id = "10"> [10] 印象派绘画与狭义相对论物理学比较研究_杨正瓴 </span><br><span id = "11"> [11] 拉美特利 《人是机器》 </span><br><span id = "12"> [12] 印象画派的历史发展及审美特征_李怀鹏 </span><br><span id = "13"> [13] 马克思·韦伯 新教伦理与资本主义精神 </span><br><span id = "14"> [14] 知乎 作者:acel rovsion 链接:<a href="https://www.zhihu.com/question/21722005/answer/34906841">https://www.zhihu.com/question/21722005/answer/34906841</a> </span></p>
]]></content>
<tags>
<tag>art</tag>
</tags>
</entry>
<entry>
<title>Share my dotfile</title>
<url>/2018/05/31/Share-my-dotfile/</url>
<content><![CDATA[<h4 id="工作环境推荐"><a href="#工作环境推荐" class="headerlink" title="工作环境推荐"></a>工作环境推荐</h4><p>笔者的工作环境是<code>Ubuntu-16.04.1 + Neovim + zsh + oh-my-zsh + tmux + oh-my-tmux</code>,使用到图形界面的时候主要是阅读 pdf 文档以及浏览网页。</p>
<p>身为一个重度 Vim 使用者,我交换了 ESC 键和 Caps Lock 键,使用 zsh 的 <code>Vi</code> 模式,并尝试在一切可能的地方使用<code>Vim-like</code>的方式来操控机器。</p>
<ul>
<li>网页浏览:Chrome + cVim(Chrome 插件)</li>
<li>PDF 阅读: Evince(测试过所有 <code>Vim-like</code> 的阅读器之后,发现或多或少存在问题,Evince 只能算是差强人意的选择) (2018.12.09 更新:配置好 Zathura 后挺好用的)</li>
<li>PDF 制作: Neovim + Typora</li>
<li>PPT 制作: Neovim + nodePPT</li>
<li>Overwall: VPS + Shadowsocks</li>
<li>文件管理: VPS + Git(这里强烈批评坚果云,居然能 24 小时吃掉我 100% 的 CPU 资源,对富文本格式文件解析能力非常差)</li>
<li>文件共享: VPS + Git</li>
<li>下载: VPS + aria2c</li>
<li>终端模拟器: Tilix</li>
<li>键鼠 + 剪贴板共享: Synergy</li>
</ul>
<p>折腾过很久的 Vim 插件,所走的这些路,应该是大多数被 Vim 哲学所吸引的人都走过的。<br>在这里分享 dotfile,以飨后来人。希望或多或少能帮到你。</p>
<span id="more"></span>
<blockquote>
<p><a href="https://github.com/DarcySail/dotfile">https://github.com/DarcySail/dotfile</a><br><a href="https://xaizek.github.io/2016-08-13/big-list-of-vim-like-software/">https://xaizek.github.io/2016-08-13/big-list-of-vim-like-software/</a></p>
</blockquote>
<p>本仓库会持续更新,除了去掉敏感的隐私内容之外,会尽量与我实际使用的 dotfile 保持一致。</p>
<h4 id="To-be-tested"><a href="#To-be-tested" class="headerlink" title="To be tested"></a>To be tested</h4><ul>
<li>文件浏览: 的确有 <code>Vim-like</code> 的文件系统管理器,但我对此心存疑虑,zsh 组合拳似乎对我已经非常够用了</li>
</ul>
<h4 id="未来目标"><a href="#未来目标" class="headerlink" title="未来目标"></a>未来目标</h4><ul>
<li>将 dotfile 中的所有英文整理为中文(本博客的定位是创造价值以及帮助后来者,所以会照顾大多数 newcomer);</li>
<li>测试完所有 Github 上面排名前十的 dotfile 仓库,整合到我自己的内容中来;</li>
<li>排版格式</li>
</ul>
]]></content>
<tags>
<tag>vim</tag>
<tag>zsh</tag>
<tag>terminal</tag>
</tags>
</entry>
<entry>
<title>Using QEMU to implement micro:bit machine type emulation</title>
<url>/2018/04/27/QEMU-GSoC-2018-proposal/</url>
<content><![CDATA[<h2 id="Basic-Information"><a href="#Basic-Information" class="headerlink" title="Basic Information"></a>Basic Information</h2><ul>
<li><strong>Name:</strong> darcy</li>
<li><strong>IRC nickname:</strong> darcy</li>
<li><strong>Programming languages (fluent):</strong> C, C++</li>
<li><strong>Past open source contributions:</strong><br> participating write a open source technical book about ‘OpenResty’<br> <a href="https://github.com/moonbingbing/openresty-best-practices">https://github.com/moonbingbing/openresty-best-practices</a></li>
<li><strong>Sample source code, hobby projects, GitHub, etc URLs:</strong><br> <a href="https://github.com/DarcySail">https://github.com/DarcySail</a></li>
</ul>
<h2 id="Why-you-are-applying"><a href="#Why-you-are-applying" class="headerlink" title="Why you are applying"></a>Why you are applying</h2><p>There are two reasons for participating in QEMU-GSoC:</p>
<p>First, I’m an virtualization technology enthusiast. During my junior year at college, I’ve designed and implemented a C programming language based compiler, allowing users to directly convert native C code into a my own designed Stack-Based Instruction Set. Internally, a virtual machine to support byte-code execution is integrated into this compiler. Although this simple virtual machine prototype cannot support the full stack of virtualization technology, it’s actually the starting point for my interest in virtualization. Now, I’m pursuing my PH.D degree in University of Chinese Academy of Sciences. And I focus on low-level system software design,including virtualization technologies and AI operating systems, e.g., QEMU, Docker, etc. Thus, I want to utilize QEMU to implement the emulation of Intelligence Chip after I am familiar enough with QEMU.</p>
<span id="more"></span>
<p>First, I am greatly interested in virtualization. When I was a junior, I designed and implemented a compiler that support the subset of C language, the compiler accepted C code as input, and output Stack-based Instruction Set(also designed by myself). A virtual machine was written in order to run this bytecode. Now, in my point of view, this amateur virtual machine is far from virtualization, but it’s actually the starting point for my interest in virtualization. When I came to University of Chinese Academy of Sciences as a master student, most of tasks assigned to me by my school mentor are about low-level system software. And I want to utilize QEMU to implement the emulation of Intelligence Chip after I am familiar enough with QEMU.</p>
<p>Firstly, I am greatly interested in virtualization. When I was a junior, I designed and implemented a compiler that supports the subset of C language. The compiler accepted C code as input, and output Stack-based Instruction Set(also designed by myself). A virtual machine was written in order to run this bytecode. Now, in my point of view, this amateur virtual machine is far from virtualization, but it’s actually my starting point of the interest in virtualization. When I came to University of Chinese Academy of Sciences as a Master student, most tasks of mine assigned by my school mentor are about low-level system software. And I want to utilize QEMU to implement the emulation of Intelligence Chip after I am familiar enough with QEMU.</p>
<p>Secondly, when I use Linux and various open source software every day, the idea of contributing to Open Source Community naturally emerge in my deep heart. QEMU-GSoC is the best practice I could take part in. Since I have read all project ideas listed in QEMU, I thought the implementation of micro:bit is not only able to satisfy my requirement of learning peripheral emulation, but also within the capability of my skill.</p>
<p>And I have already contributed to QEMU Community by commit 4 patchs, three of them have been merged into master branch. Here are links:<a href="#1">[1]</a> <a href="#2">[2]</a> <a href="#3">[3]</a> <a href="#4">[4]</a></p>
<h2 id="Summary-of-your-understanding-of-the-project-idea"><a href="#Summary-of-your-understanding-of-the-project-idea" class="headerlink" title="Summary of your understanding of the project idea"></a>Summary of your understanding of the project idea</h2><p>The Project Idea of implementing micro:bit machine type provides the best testing platform for developers or kids.Besides, the implemented peripherals can be reused as modular components by future devices.</p>
<p>What I need to do includes:</p>
<h3 id="Part-I"><a href="#Part-I" class="headerlink" title="Part I."></a>Part I.</h3><ul>
<li>Implementing ARM Cortex-M0 CPU support based on existing Cortex-M3 support in QEMU.</li>
</ul>
<p>Although the architectures are binary instructions upward compatible from Armv6-M to Armv7-M, and most(not all) binary instructions available for the Cortex-M0 can execute without modification on the Cortex-M3.<a href="#4">[4]</a> <a href="#5">[5]</a></p>
<p>Normally, when porting from the Cortex-M3 to the Cortex-M0, I need to change the peripheral access code, and update system features like clock speed, sleep modes, and so on. And this part of the code in the qemu architecture basically does not belong to implementiion of CPU (./target/arm), but is the work of the implementation of peripherals (./hw/arm).<a href="#6">[6]</a></p>
<p>However, what I need to do is to use QEMU’s support for cortex-m3 to implement a “true” virtual CPU rather than just using the existing cortex-m3 to implement the microbit machine functionality.</p>
<p>Except for some functional differences in some of the instructions, the two CPUs still have some differences above features. Some programmers may write some code based on the characteristics of the processor. And some softwares should validate the existence of a feature before attempting to use it. When programmers write such code on Cortex-M0, it is assumed that these features are supported on qemu. In fact, in this case, if we directly replace cortex-m0 with cortex-m3, a series of unpredictable problems will happen. This is why we should trim unnecessary feature from Cortex-M3.<a href="#7">[7]</a></p>
<h4 id="1-Differences-between-instructions"><a href="#1-Differences-between-instructions" class="headerlink" title="1. Differences between instructions"></a>1. Differences between instructions</h4><p>The Cortex-M0 contains traditional Thumb-1, not including new instructions (CBZ, CBNZ, IT) which were added in Armv7-M architecture, and a minor subset of Thumb-2 instructions (BL, DMB, DSB, ISB, MRS, MSR). The Cortex-M3 have all base Thumb-1 and Thumb-2 instructions.<a href="#8">[8]</a></p>
<ul>
<li>The Cortex-M0 only has 32-bit multiply instructions with a lower-32-bit result (32bit × 32bit = lower 32bit), where as the Cortex-M3 / M4 / M7 / M33 includes additional 32-bit multiply instructions with 64-bit results (32bit × 32bit = 64bit).<a href="#8">[8]</a></li>
</ul>
<p>All this unsupported instructions should be trimmed from current Cortex-M3 implementation. The specific method is to utilize the following functions provided by QEMU, using <code>UNPREDICTABLE</code> or <code>UNDEFINED</code> to replace the original instructions.</p>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">define</span> ENABLE_ARCH_V6 arm_dc_feature(s, ARM_FEATURE_V6)</span></span><br><span class="line"><span class="type">static</span> <span class="type">void</span> <span class="title function_">disas_arm_insn</span><span class="params">(DisasContext *s, <span class="type">unsigned</span> <span class="type">int</span> insn)</span></span><br><span class="line">{</span><br><span class="line"> ....</span><br><span class="line"> <span class="comment">/* for different feature that not supported by cotex-m0(armv6);</span></span><br><span class="line"><span class="comment"> * we could raise the INVSTATE UsageFault exception.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">if</span> (arm_dc_feature(s, ARM_FEATURE_V6)) {</span><br><span class="line"> gen_exception_insn(s, <span class="number">4</span>, EXCP_INVSTATE, syn_uncategorized(),</span><br><span class="line"> default_exception_el(s));</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> ....</span><br><span class="line"> <span class="comment">/* for Instruction that not supported by cortex-m0(armv6), we</span></span><br><span class="line"><span class="comment"> * choose to UNDEF.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">if</span> (!arm_dc_feature(s, ARM_FEATURE_NEON)) {</span><br><span class="line"> <span class="keyword">goto</span> illegal_op;</span><br><span class="line"> }</span><br><span class="line">illegal_op:</span><br><span class="line"> gen_exception_insn(s, <span class="number">4</span>, EXCP_UDEF, syn_uncategorized(),</span><br><span class="line"> default_exception_el(s));</span><br><span class="line"> ....</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h4 id="2-Differences-between-features"><a href="#2-Differences-between-features" class="headerlink" title="2. Differences between features"></a>2. Differences between features</h4><p>The following features should be taken into consideration:</p>
<p>ARM architecture: The Cortex-M0 implement the Armv6-M architecture, and the Cortex-M3 implements the Armv7-M architecture.</p>
<ul>
<li>Interrupts: 1 to 32 (Cortex-M0), 1 to 240 (Cortex-M3).</li>
<li>Vector Table Offset Register: Not available for Cortex-M0.</li>
<li>Number of watchpoint comparators: 0 to 2 (Cortex M0), 0 to 4 (Cortex-M3).</li>
<li>Number of breakpoint comparators: 0 to 4 (Cortex M0), 0 to 8 (Cortex-M3).</li>
<li>The performance efficiency: 0.9 DMIPS/MHz 1.25 DMIPS/MHz(this part won’t affect QEMU)<a href="#8">[8]</a></li>
</ul>
<p>Except for listed above, aligned access is another important different feature. An aligned access is an operation where a word-aligned address is used for a word or multiple word access, or where a halfword-aligned address is used for a halfword access. Byte accesses are always aligned.</p>
<p>There is no support for unaligned accesses on the Cortex-M0 processor. Any attempt to perform an unaligned memory access operation results in a HardFault exception.<a href="#9">[9]</a></p>
<p>NVIC and SCB (System Control Block) registers in the Cortex-M0 can only be accessed in word-size transfers. While some registers in the NVIC and the SCB in the Cortex-M3 are not available in the Cortex-M0. These include the Interrupt Active Status Register, the Software Trigger Interrupt Register, the Vector Table Offset Register, and some of the fault status registers.<a href="#6">[6]</a></p>
<p>The bit-band feature in the Cortex-M3 is not available in the Cortex-M0. If the bit-band alias access is used, it needs to return an error_id.</p>
<p>In general, Cortex-M0 memory access must always be naturally aligned while Cortex-M3 doesn’t have this limit. The unsupported features should be trimmed to satisfy Cortex-M0.<br>(refered to <a href="#code2">[code]</a>):</p>
<h3 id="Part-II"><a href="#Part-II" class="headerlink" title="Part II."></a>Part II.</h3><ul>
<li>Implementing a “microbit” machine type.</li>
<li>Implementing at least the 5x5 LED display, buttons, and UART.</li>
<li>Stubbing out other devices as needed for the runtime to start successfully.</li>
</ul>
<p>Different from X86 architecture which provides port-mapped I/O, ARM architecture uses memory-mapped I/O to perform input/output (I/O) between CPU and peripheral devices. In programming of kernel module, we control peripherals by read/write I/O registers. Because of the opposite behaviors, when we try to emulate peripheral device, we should read the value of I/O register to figure out what kind of operations do users want us to achieve so that we can give feedback to users by write corresponding I/O register. In order to specify utilize QEMU to emulate peripherals in ARM architecture, we should add a QEMU data structure named “MemoryRegion” per I/O mapped-memory, then hook the “MemoryRegion” with two callback functions(one for responding reading behavior, one for responding writing behavior), as long as user’s code tries to access this “MemoryRegion”, no matter reading or writing, the right corresponding callback function will be called. And exactly in this callback function should we implement the concrete peripherals feature.<a href="#10">[10]</a></p>
<p><span id = "code2"></span></p>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="type">static</span> <span class="type">uint64_t</span> <span class="title function_">microbit_rom_read_hook</span><span class="params">(<span class="type">void</span> *opaque, hwaddr offset, <span class="type">unsigned</span> size)</span></span><br><span class="line">{</span><br><span class="line"> <span class="keyword">if</span> (offset & <span class="number">0x1</span>) {</span><br><span class="line"> qemu_log_mask(LOG_GUEST_ERROR,</span><br><span class="line"> <span class="string">"ROM: read at bad offset 0x%x\n"</span>, (<span class="type">int</span>)offset);</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> ...</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">const</span> MemoryRegionOps microbit_rom_ops = {</span><br><span class="line"> .read = microbit_rom_read,</span><br><span class="line"> .write = microbit_rom_write,</span><br><span class="line"> .endianness = DEVICE_NATIVE_ENDIAN,</span><br><span class="line">};</span><br></pre></td></tr></table></figure>
<p>There is no big difference between stubbing a device and actually implementing a device, both of them need to allocate a MemoryRegion, and hook the access to them, expect for stubbed device hooked with almost empty functions.</p>
<h3 id="Part-III"><a href="#Part-III" class="headerlink" title="Part III."></a>Part III.</h3><ul>
<li>Test code.</li>
</ul>
<p>In order to test the correctness of emulation code, we could use online Python(or Javascript Blocks editors) to generate specific code which controls specific peripheral. According to “nRF51 Series Reference Manual”, we check whether the generated code has written right value of right address. For example, in the emulation of LED device, we can use Python to generate “.hex” file that only controls one LED light to blink. Then we check whether the corresponding callback function has been called, and whether “.hex” code has written expected value to right I/O registers.</p>
<p>In addition to using these official compilers, we can also use the runtime environment provided by Lancaster University, to minimize irrelevant variables.</p>
<figure class="highlight c"><table><tr><td class="code"><pre><span class="line"><span class="comment">//This code should blink LED every 500ms.</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">"mbed.h"</span></span></span><br><span class="line"></span><br><span class="line">DigitalOut <span class="title function_">led1</span><span class="params">(LED1)</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> led1 = !led1;</span><br><span class="line"> wait(<span class="number">0.5</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>Then use the following shell command to compile the source code.</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">yotta init</span><br><span class="line">yotta target bbc-microbit-classic-gcc</span><br><span class="line">yotta install lancaster-university/microbit</span><br><span class="line">yotta build</span><br></pre></td></tr></table></figure>
<p>The hex file we need to burn to flash rom will be found in project <code>LED-Blink/build/bbc-microbit-classic-gcc/source</code> and it will be called <code>LED-Blink-combined.hex</code>.</p>
<p>In addition, assembly code, which directly controls peripherals, should also be able to test on baremetel virtual machine.</p>
<h2 id="Project-plan"><a href="#Project-plan" class="headerlink" title="Project plan"></a>Project plan</h2><p><strong>5.15 - 5.22</strong><br>Implementing a micro:bit .hex ROM loader;</p>
<p>(approximately 500 - 1000 line of c code)</p>
<p><strong>5.23 - 7.11</strong><br>Implementing a “microbit” machine type;</p>
<p>Stubbing out other devices as needed for the runtime to start successfully;</p>
<p>Implementing at least the 5x5 LED display, buttons, and UART;</p>
<p>(approximately 1000 - 1500 line of c code for these three tasks.)</p>
<blockquote>
<p><strong>6.12 - 6.13</strong><br>GSoC middle evaluations.</p>
</blockquote>
<p><strong>7.12 - 7.22</strong><br>Implementing ARM Cortex-M0 CPU support based on existing Cortex-M3 support in QEMU;</p>
<p>(approximately 98 instructions need to be trimmed, approximately 98 * 5 = 490. Include trimming feature code, approximately 500 - 800 line of c code.)</p>
<blockquote>
<p><strong>7.10 - 7.11</strong><br>GSoC middle evaluations.</p>
</blockquote>
<p><strong>7.23 - 7.31</strong><br>Finish all basic task, completely test code, prepare and start to code other peripherals and GUI;</p>
<p><strong>8.1 - 8.14</strong><br>Implement basic GUI. Implement other meaningful peripherals;</p>
<h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul>
<li><span id = "1"> [1] <a href="http://lists.nongnu.org/archive/html/qemu-devel/2018-02/msg06778.html">http://lists.nongnu.org/archive/html/qemu-devel/2018-02/msg06778.html</a></span></li>
<li><span id = "2"> [2] <a href="http://lists.nongnu.org/archive/html/qemu-devel/2018-03/msg01626.html">http://lists.nongnu.org/archive/html/qemu-devel/2018-03/msg01626.html</a></span></li>
<li><span id = "3"> [3] <a href="http://lists.nongnu.org/archive/html/qemu-devel/2018-04/msg00899.html">http://lists.nongnu.org/archive/html/qemu-devel/2018-04/msg00899.html</a></span></li>
<li><span id = "4"> [4] <a href="http://lists.nongnu.org/archive/html/qemu-devel/2018-04/msg03242.html">http://lists.nongnu.org/archive/html/qemu-devel/2018-04/msg03242.html</a></span></li>
<li><span id = "5"> [4] ARMv6-M Architecture Reference Manual</span></li>
<li><span id = "6"> [5] ARMv7-M Architecture Reference Manual</span></li>
<li><span id = "7"> [6] The Definitive Guide to the ARM Cortex-M0</span></li>
<li><span id = "8"> [7] Cortex-M3 Embedded Software Development</span></li>
<li><span id = "9"> [8] <a href="https://en.wikipedia.org/wiki/ARM_Cortex-M">https://en.wikipedia.org/wiki/ARM_Cortex-M</a></span></li>
<li><span id = "10"> [9] STM32F0xxx Cortex-M0 programming manual</span></li>
<li><span id = "11"> [10] <a href="https://www.qemu.org/2018/02/09/understanding-qemu-devices/">https://www.qemu.org/2018/02/09/understanding-qemu-devices/</a></span></li>
</ul>
]]></content>
<tags>
<tag>QEMU</tag>
</tags>
</entry>
<entry>
<title>深入解析 Docker 镜像机制 -- 为何 Docker 镜像 ID 会显示 missing ?『译』</title>
<url>/2019/01/09/Inside-Docker-images-and-layers/</url>
<content><![CDATA[<p><em>原文地址:<a href="https://windsock.io/explaining-docker-image-ids/">https://windsock.io/explaining-docker-image-ids/</a></em><br><em>Author:Nigel Brown</em><br><em>Translator:SU Hang</em><br><em>经原作者 Nigel Brown 授权翻译 | Translator authorized by the Nigel Brown</em></p>
<p>当 Docker v1.10 发布时,Docker Engine 处理镜像的方式发生了相当大的变化。虽然这种<a href="https://blog.docker.com/2016/01/docker-1-10-rc/">新的处理机制</a> 被解释得很清楚,并且对 Docker 的常规使用(除了镜像迁移之外)几乎没有影响,但是有一些 UI 变动还是引起了一些<a href="https://github.com/moby/moby/issues/20131">误解</a>。那么这种变化是什么,为什么 <code>docker history</code> 命令会显示一些镜像层的 ID 为 <code><missing></code>呢?</p>
<span id="more"></span>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ docker <span class="built_in">history</span> debian</span><br><span class="line">IMAGE CREATED CREATED BY SIZE COMMENT</span><br><span class="line">1742affe03b5 10 days ago /bin/sh -c <span class="comment">#(nop) CMD ["/bin/bash"] 0 B</span></span><br><span class="line"><missing> 10 days ago /bin/sh -c <span class="comment">#(nop) ADD file:5d8521419ad6cfb695 125.1 MB</span></span><br></pre></td></tr></table></figure>
<h4 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h4><p>首先交代一些相关背景。docker 镜像是用于创建容器的只读模板,并提供基于多层文件和目录的顺序联合的文件系统,这种<a href="https://en.wikipedia.org/wiki/Union_mount">联合文件系统</a> 使得 Docker 镜像得以复用。Docker 平台提供了”共享镜像层”这一基本组件,通常使用<a href="https://zh.wikipedia.org/wiki/%E5%AF%AB%E5%85%A5%E6%99%82%E8%A4%87%E8%A3%BD">写时复制(COW)</a> 机制来实现。在容器运行的生命周期中,如果容器需要从下层的某个只读镜像中修改文件,则在进行更改之前,它会将文件复制到其自己的专用读写层 - 即容器层。</p>
<p>在 Docker 镜像构建过程中,会创建一个镜像或’diff’,在容器中运行的命令 - 譬如上面提到的 <code>/bin/bash</code>等等 - 会生成新的或修改过的文件和目录。这些新的或修改过的文件和目录被“提交”到容器层。<code>docker history</code> 输出显示 <code>debian</code> 镜像有两层。</p>
<h4 id="历史遗留"><a href="#历史遗留" class="headerlink" title="历史遗留"></a>历史遗留</h4><p>历史上(在 Docker v1.10 版本之前),每次由于提交操作(译者注:<code>docker commit</code>) 而创建新镜像时,就会随机生成一个 256 位 <a href="https://en.wikipedia.org/wiki/Universally_unique_identifier">UUID</a> 标识来代表这唯一镜像,通常称为镜像 ID(在 UI 中显示为短 12 位十六进制字符串或长 64 位十六进制字符串)。Docker 将镜像内容存储在名称与镜像 ID 相同的目录中。在该目录内部,包括镜像的配置信息 (configuration object ) 和 镜像 ID 和镜像的父镜像的 ID 和。通过这种方式,Docker 能够为容器构建文件系统,每个镜像依次引用其父镜像内容,直到到达没有父级的基本镜像。每一层镜像也可以用有意义的名称(例如 <code>my_image:1.0</code>)标记(可选,不强制),但这通常保留用于叶子镜像。这在下图中描述:</p>
<p><img src="/Historical_Image.png" alt="Historical_Image"></p>
<p>使用 <code>docker inspect</code> 命令将输出:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ docker inspect my_image:1.0</span><br><span class="line">[</span><br><span class="line"> {</span><br><span class="line"> <span class="string">"Id"</span>: <span class="string">"ca1f5f48ef431c0818d5e8797dfe707557bdc728fe7c3027c75de18f934a3b76"</span>,</span><br><span class="line"> <span class="string">"Parent"</span>: <span class="string">"91bac885982d2d564c0e1869e8b8827c435eead714c06d4c670aaae616c1542c"</span></span><br><span class="line"> ...</span><br><span class="line"> ...</span><br></pre></td></tr></table></figure>
<p>这种方法在很长一段时间都工作良好,但随着时间的推移,由于各种原因,它被认为是一种次优的选择。驱使作出改变的一个重要原因是:当从 Docker registry(如 <a href="https://hub.docker.com/">Docker Hub</a>)中推送到或拉取时,缺乏检测镜像内容是否在被篡改的方法。这收到了整个社区的<a href="https://github.com/moby/moby/issues/9719">强烈批评</a>,最终促使了内容可寻址 ID (content addressable IDs) 的诞生。</p>
<h4 id="内容可寻址-ID"><a href="#内容可寻址-ID" class="headerlink" title="内容可寻址 ID"></a>内容可寻址 ID</h4><p>从 Docker v1.10 开始,镜像和层级 (images and layers) 不再是同义词。除此之外,镜像可以直接引用一个或多个层级。</p>
<p>现在层级通过摘要来进行识别,摘要采用如下形式:<code>algorithm:hex</code> 例如:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">sha256:fc92eec5cac70b0c324cec2933cd7db1c0eae7c9e2649e42d02e77eb6da0d15f</span><br></pre></td></tr></table></figure>
<p>通过将 <a href="https://github.com/moby/moby/issues/9719">SHA256</a> 算法应用于镜像的内容之上,来计算十六进制 hash 值。如果内容发生变化,则计算的摘要也将发生变化,这意味着 Docker 可以使用其发布的摘要来检查镜像的内容,以验证其是否被篡改。层级不同于”镜像”这个概念,也不属于”镜像”这个概念的一部分,它只是文件和目录的集合。</p>
<p>现在的 Docker 镜像由一个配置对象 (configuration object) 组成,配置对象中包含了一个有序层级摘要列表,这使得 Docker Engine 能够根据层级摘要而不是父镜像来组装容器的文件系统。镜像 ID 也是一个摘要,是镜像配置对象的 SHA256 哈希值,镜像配置对象涵盖了组成该镜像文件系统的所有”层级”的 hash 摘要。下图描绘了 Docker v1.10 之后镜像和层级之间的关系:</p>
<p><img src="/Content_Addressable_Image.png" alt="Content_Addressable_Image"></p>
<p>为了便于阅读,镜像和镜像的 SHA256 hash 摘要被缩短了。</p>
<p>用于存储层级内容的目录 <code>diff</code> , 现在以随机生成的“cache ID”命名,Docker Engine 维护层级与其 cache ID 之间的关联性,以便它在磁盘上定位层级内容的位置。</p>
<p>因此,当从 registery 中提取 Docker 镜像时,<code>docker history</code> 命令用于显示其内容,其输出类似于这样:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ docker <span class="built_in">history</span> swarm</span><br><span class="line">IMAGE CREATED CREATED BY SIZE COMMENT</span><br><span class="line">c54bba046158 9 days ago /bin/sh -c <span class="comment">#(nop) CMD ["--help"] 0 B</span></span><br><span class="line"><missing> 9 days ago /bin/sh -c <span class="comment">#(nop) ENTRYPOINT &{["/swarm"]} 0 B</span></span><br><span class="line"><missing> 9 days ago /bin/sh -c <span class="comment">#(nop) VOLUME [/.swarm] 0 B</span></span><br><span class="line"><missing> 9 days ago /bin/sh -c <span class="comment">#(nop) EXPOSE 2375/tcp 0 B</span></span><br><span class="line"><missing> 9 days ago /bin/sh -c <span class="comment">#(nop) ENV SWARM_HOST=:2375 0 B</span></span><br><span class="line"><missing> 9 days ago /bin/sh -c <span class="comment">#(nop) COPY dir:b76b2255a3b423981a 0 B</span></span><br><span class="line"><missing> 9 days ago /bin/sh -c <span class="comment">#(nop) COPY file:5acf949e76228329d 277.2 kB</span></span><br><span class="line"><missing> 9 days ago /bin/sh -c <span class="comment">#(nop) COPY file:a2157cec2320f541a 19.06 MB</span></span><br></pre></td></tr></table></figure>
<p>该命令提供具体镜像及其层级的详细组成信息。除了镜像的最上面一个层级之外(译者注:这不一定), 所有 <code>IMAGE</code> 字段中的值都是<code><missing></code>, 很不幸,这个值极具误导性,因为它给人一种错误的暗示。但严格来说这么做没错,因为层级不再与镜像同义。我认为把这个领域留空是更恰当的(译者在这里表示赞同)。此外,镜像 ID 似乎仅仅与最上层相关联,但实际上,镜像 ID 不属于任何层。相反,这些层级共同属于该镜像。</p>
<h4 id="本地构建镜像"><a href="#本地构建镜像" class="headerlink" title="本地构建镜像"></a>本地构建镜像</h4><p>虽然这个内容可寻址镜像的描述适用于 Docker v1.10 版本 之后的所有 Docker 镜像,但 Docker 主机上的本地构建镜像的方式略有不同。本地构建的镜像保持不变 - 它是包含配置项的配置对象,包括层级摘要的有序列表。</p>
<p>但是,当本地 Docker 主机上构建的层级提交给镜像时,会同时创建“中间”镜像。与所有其他镜像一样,”中间镜像”也具有配置项,该配置项是组成镜像的层级摘要列表,并且其 ID(或摘要)包含配置对象的 hash 值。中间镜像没有标记名 (tag name),但是,它们有一个“父”键(译者注:原文这里有点小瑕疵,不是”父”键,在代码中是以对象成员表示的),其中包含父镜像的 ID。</p>
<p>使用中间镜像和包含对父镜像的引用的目的,是为了便于 Docker <a href="https://docs.docker.com/engine/reference/builder/#from">构建缓存</a> 。构建缓存是 Docker 平台的另一个重要特性,用于帮助 Docker 引擎利用预先存在的层级,以免为相同的构建命令不必要地重复生成内容。它使得构建过程更有效。在本地构建镜像时,该 <code>docker history</code> 命令可能提供类似于以下内容的输出:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ docker <span class="built_in">history</span> jbloggs/my_image:latest</span><br><span class="line">IMAGE CREATED CREATED BY SIZE COMMENT</span><br><span class="line">26cca5b0c787 52 seconds ago /bin/sh -c <span class="comment">#(nop) CMD ["/bin/sh" "-c" "/bin/b 0 B</span></span><br><span class="line">97e47fb9e0a6 52 seconds ago /bin/sh -c apt-get update && apt-get inst 16.98 MB</span><br><span class="line">1742affe03b5 13 days ago /bin/sh -c <span class="comment">#(nop) CMD ["/bin/bash"] 0 B</span></span><br><span class="line"><missing> 13 days ago /bin/sh -c <span class="comment">#(nop) ADD file:5d8521419ad6cfb695 125.1 MB</span></span><br></pre></td></tr></table></figure>
<p>在此示例中,上面两个层级是在本地镜像构建期间创建的,而底层是来自基本镜像(例如 <a href="https://docs.docker.com/engine/reference/builder/#from">Dockerfile 指令</a> <code>FROM debian</code>)。我们可以使用 <code>docker inspect</code> 命令查看与该镜像关联的层级摘要:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">$ docker inspect jboggs/my_image:latest</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"> "RootFS": {</span><br><span class="line"> "Type": "layers",</span><br><span class="line"> "Layers": [</span><br><span class="line"> "sha256:4dcab49015d47e8f300ec33400a02cebc7b54cadd09c37e49eccbc655279da90",</span><br><span class="line"> "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",</span><br><span class="line"> "sha256:f22bfbc1df820c465d94215e45bf9b1f0ae0fe3435a90dc5296a4b55712f46e7"</span><br><span class="line"> ]</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">]</span><br></pre></td></tr></table></figure>
<p><code>docker history</code> 命令显示镜像具有四个层级,但 <code>docker inspect</code> 显示仅包含三个镜像。这是因为两条 <code>CMD</code> 指令仅为镜像生成元数据,不添加任何实质性内容,因此’diff’为空。摘要 5f70bf18a08a 是空镜像的 SHA256 哈希值,由两个相关层共享。</p>
<p>被推送到 registry 的本地构建镜像,是仅有的”叶子镜像”, 与它的组成层级一同上传,并随后由另一个 Docker 主机拉取,这过程将不会产生任何中间父镜像。这是因为一旦借助 registry 将镜像提供给不同 Docker 主机上的其他潜在用户时,它的属性将变为只读,并且不再需要构建缓存 (build cache) 组件的支持。所以此时,<code><missing></code>值将被插入到其相应位置。</p>
<p>将镜像推送到 registry 可能会产生如下输出:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ docker push jbloggs/my_image:latest</span><br><span class="line">The push refers to a repository [docker.io/jbloggs/my_image]</span><br><span class="line">f22bfbc1df82: Pushed</span><br><span class="line">5f70bf18a086: Layer already exists</span><br><span class="line">4dcab49015d4: Layer already exists</span><br><span class="line">latest: digest: sha256:7f63e3661b1377e2658e458ac1ff6d5e0079f0cfd9ff2830786d1b45ae1bb820 size: 3147</span><br></pre></td></tr></table></figure>
<p>在此示例中,仅推送了一个层级,因为 registry 中已存在两个层级,这两个层级可能被一个或多个其他镜像引用。</p>
<h4 id="最后的”小别扭”"><a href="#最后的”小别扭”" class="headerlink" title="最后的”小别扭”"></a>最后的”小别扭”</h4><p>Docker 的层级“diffs”摘要,包含 <code>diff</code>目录 的 tar 包的 sha256 hash 值。在将镜像上传到 registry 之前,会对其进行压缩以提高带宽效率。除此之外,还会创建清单 (manifest) 来描述镜像的内容,它包含压缩层级内容的摘要。因此,清单中的层级摘要与在其未压缩状态下生成的摘要不同。该清单也会被推送到 registry。</p>
<p>压缩层 diff 的摘要可以被称为“分发摘要”,而未压缩层 diff 的摘要可以被称为“内容摘要”。因此,当我们在不同的 Docker 主机上提取示例镜像时,<code>docker pull</code> 命令会提供以下输出:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">$ docker pull jbloggs/my_image</span><br><span class="line">Using default tag: latest</span><br><span class="line">latest: Pulling from jbloggs/my_image</span><br><span class="line"></span><br><span class="line">51f5c6a04d83: Pull complete</span><br><span class="line">a3ed95caeb02: Pull complete</span><br><span class="line">9a246d793396: Pull complete</span><br><span class="line">Digest: sha256:7f63e3661b1377e2658e458ac1ff6d5e0079f0cfd9ff2830786d1b45ae1bb820</span><br><span class="line">Status: Downloaded newer image <span class="keyword">for</span> jbloggs/my_image:latest</span><br></pre></td></tr></table></figure>
<p><code>docker pull</code> 命令输出中的分发摘要,与<code>docker push</code>命令输出的摘要非常不同 。但是,pull 将解压缩层级,<code>docker inspect</code> 命令的输出将与我们在构建镜像后看到的内容摘要相同。</p>
<h4 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h4><p>在 Docker v1.10 中更改镜像和镜像处理机制之后:</p>
<ul>
<li>Docker 镜像基于它存储到层级差异 (diffs) 的引用为派生容器提供文件系统;</li>
<li>使用摘要引用层级差异 (diffs),摘要包含差异 (diffs) 内容归档(译者注:就是 tar 包)的 SHA256 hash 值;</li>
<li>Docker 镜像的 ID 是一个摘要,其中包含镜像的 JSON 配置对象的 SHA256 哈希值;</li>
<li>为了维护构建缓存,Docker 在本地镜像构建期间会创建中间镜像;</li>
<li>镜像清单会在推送镜像时一并推送到 Docker registry;</li>
<li>镜像清单包含镜像层级的摘要,其中包含压缩的归档差异内容的 SHA256 哈希值;</li>
</ul>
]]></content>
<tags>
<tag>Docker</tag>
</tags>
</entry>
<entry>
<title>杂念-2</title>
<url>/2019/05/24/Thought-2/</url>
<content><![CDATA[<p>当然,我是一个男人,我自然会觉得“爱人”要比“被爱”更快乐一些。也许我是一个女人的话,就会有完全相反的想法了。</p>
<p>我得警惕我这个念头里面性别不平等的气味。</p>
<hr>
<p>不小心看到过去自己写的一些话,觉得自己那时浑身都是刺,脸红不已,不敢再看下去。<br>话说回来,我怎么知道自己现在就不是浑身都是刺呢?</p>
<span id="more"></span>
<hr>
<p>“荒诞主义的旗手加缪对其他存在主义哲学家试图在生活中重建一种意义的做法进行了批判:在这个无意义的世界中创造意义实际上是一种逃避,一种哲学意义上的自杀。一个清醒的人的正确做法应当是直面世界的荒诞本质,并以最大的热情去对抗它。”</p>
<hr>
<p>“都想被爱,可这世界哪里凭空来这么多太阳。<br>满眼都是等爱的黑洞,空无一个发光的太阳。” —— 某网友</p>
<p>很多领域都和这相似呀,永远是一群人围观为数不多的、有能力创造价值的人。<br>回到爱的话题上,我真的很乐意做一个太阳,做一个太阳是一件很快乐的事。<br>爱与被爱都是好的,但我还是更乐意爱人一些,因为给予爱是主动的,而接受爱是被动的。</p>
<p>之前不明白她的创作的意义是什么,现在在我的视角里,也许就是分享一些爱吧。尽管是虚假的,但也勉强提供一些慰藉了。</p>
<hr>
<p>学界干预政治似乎是佳话,政治干预学界则被视作不择不扣的暴政了。说到底,谁干预谁,有本质上的区别吗?</p>
<hr>
<p>严格而怜悯:严格地判断这些恶,不要觉得恶小就不是恶;没有人能够完全纯洁,要理解人都有软弱的时候。<br>“为求赎罪,避免通奸。未能生而自制的众生,应当结婚,仍为我主的纯洁儿女”</p>
<hr>
<p>当奥丁将此枪掷出时,会发出划越空际的亮光,地上的人称之为“闪电”,另一说法是“流星”。神话中记载,对着这一把枪发誓的人,他的誓言必将实现。这也许就是对着流星许愿的由来。</p>
<hr>
<p>撒旦具有耳语能力,而影响人的决定。</p>
<hr>
<p>身生智未生,智生身已老。身恨智生迟,智恨身生早。身智不相逢,曾经几度老。身智若相逢,即得成佛道。</p>
<p>保国者,其君其臣肉食者谋之;保天下者,匹夫之贱与有责焉耳矣。</p>
<hr>
<p>候人兮猗</p>
<hr>
<p>“而最严重的问题是高人口密度造成的高压力,而造成少子化问题。” —— 某人</p>
<hr>
<p>“真正的女权运动到底是要做什么?<br>让女人能承担一半的责任,能有一半的议会席位,以及,有一半的工作机会。” —— 某观点</p>
<hr>
<p>醉后不知天在水,满船清梦压星河。</p>
<hr>
<p>“25 岁了,但我觉得跟 5 年前的自己相比也没有长进。”<br>在我十几岁的时候,我是带着一丝优越感听雪野小姐说这话的,那时候的我,未来仍有无限可能。我很优秀,未来看起来似乎很光明。<br>真是讨厌。这个讨厌的名为██的自己。</p>
<hr>
<p>『前天我看見了一隻兔子』,女孩說,『昨天看見了一頭鹿,而今天則遇見了你。』</p>
<hr>
<p>人类像孤岛也像冰山,冰山下面有很多东西没表达出来。也不适合向所有人、不恰当的时间去表达。</p>
<hr>
<p>我完全认同”人在保留一定的底线的情况下,拥有选择过自己想要的生活的自由”,这个观点不知道你是否认同。<br>我也完全认同“我们要有争取<strong>有一定限制的</strong>自由的意识并为之努力”。</p>
<p>但这本书在这个故事中,过于强调子女忤逆父母的行为,所以我认为这本书没有选对最合适的例子。<br>我的理由是:“父母不仅仅是因为子女不按照自己的想法做而不高兴,而是在他们所信仰的基督教认知中,以及他们所认同的社会价值观中,同性恋是一件有悖道德的事。”这就不仅仅是个人选择,而且牵涉到社会价值观的问题了。所以我觉得书里这个例子本意是为了“强调父母对子女的控制”,但这个例子没有很好的表达这个观点,有点打偏了。</p>
<p>具体到同性恋这件事上,我是认同可以选择过同性恋生活的自由。尽管我的这个想法甚至可能在世界上大多数国家都不合法。</p>
<p>具体到吸毒这件事上,他们可能是这样,比如认为毒品违法,但大麻、酒精、烟草不是毒品,所以这些东西不违法。无论对毒品的定义是什么,是没有一个国家认为吸毒合法的。<br>我们是否该去争取想吸毒就吸毒的自由呢?</p>
<p>这同样很难说,一项东西也许现在人们没有意识到他的危害,现在不违法,但以后可能违法。<br>同样的,宋朝时(甚至现代的印度)吃牛肉都违法,但如今并不违法。<br>法律也只是反映了现阶段人类的认知,甚至即使反映了认知,也没有及时动态更新。<br>我的想法是,在保留一定的底线的情况下,人拥有选择过自己生活的自由。但这个底线具体该是什么,我不知道,甚至我想,哲学家、法学家他们也不一定真正拥有这个问题的答案。<br>只要人生活在社会群体中,既受到社会的影响,同时也在影响着这个社会。除非过着完全不与任何人进行任何程度的交流的生活,但这样,人之所以为人也不成立了。<br>我下面的回复没有任何恶意啊,只是陈述我想到的东西:<br>假设子女认为吸毒是好的,同样没有影响到任何人(其实这很难说,就像同性恋也很难说没有影响到他人一样)。那这种情况,外人是否应该干涉呢?<br>我认同可以选择自由选择保持何种价值观,但我同时也觉得这种权利也该保留最低底线的限制才行。<br>比如他认同多杀人就是好的,这种不应该限制一下吗?抱歉,不是有意抬杠,写代码总要考虑各种极端情况,这让我养成了这种思维习惯。</p>
<p>如果认为法律是底线的话。我不能生活在以色列就认为这个可以,去日本旅游了一下就认为不可以吧。这价值观也变化得太快了……</p>
<hr>
<p><strong>《To 妹妹》</strong></p>
<p><strong>幸福</strong><br>“幸福美满的家庭”,关于幸福,无论是哲学家的论证,还是我自己的经验,它们都告诉我幸福感来源于人的意志本身。读完一本好书,看完一部引我深思的电影,与喜欢的人的简单交流,与朋友深刻而坦诚的讨论,这些都让我感到无比幸福。</p>
<p>但幸福的家庭,却是有些难的,这不仅需要家庭中的每一个成员清晰的认知,也需要经年累月对抗自己内心的努力。我想说的是,也许不能有幸福的家庭,但平淡的而普通的家庭才是人世间的常态呀。而且就算不能有幸福的家庭,但却可以有幸福的个人呀。</p>
<p><strong>能力</strong><br>什么叫做有能力呢?在视野中的所有可行的选择中,能够实现自己想要达成的目标,以我的认知来说,这就是有能力了。</p>
<p>但无论你现阶段作出怎样的选择,都逃脱不了“高考”或是“考取国外高校”这一框架,你的选择是有限的。<br><del>但无论我们现阶段作出怎样的选择,都逃脱不了认知以及某种框架的制约,我们的选择是有限的。</del></p>
<p>你的选择有限,单纯只是年龄阶段、以及社会条件的制约,跟你本人的身体、心理素质没有任何关系。举一个极端但更方便你理解的例子,我就难以想象一个刚出生的婴儿能为他的家庭带来多少物质上的改变。但我们能说这个婴儿“无能”吗?不,甚至用“能力”去对他做这样的评价都是不合适的,不仅仅因为他没有任何行动力,更因为他没有任何选择的余地。</p>
<p>具体到家庭,一个尚在读书时的学生,同样也没有多少作出帮助家庭减轻物质负担的余地。具体到学生工作来说,虽然我们是班长(或是别的什么职务),我们手中的权能和职责也真的很有限,“巧妇难为无米之炊”呀。</p>
<p>怎样在有限的选择中锻炼能力呢?有两条可以同时进行的路径,这是具体的“方法论”:</p>
<ol>
<li>作出一个选择的前提是你首先要知道这个选择的存在,倘若都完全不知道还能作出这样的选择,那么想去实现它更是无从谈起。如何知晓更多的可能性,很简单,扩宽视野。有些老生常谈的一句话:“读万卷书,行万里路”,书籍是个人人生经历的延伸,别人记录下自己的生活,我们从中探知他的生活方式的可能性。当你面临一个未曾经历的事件时,问自己,这事违法吗?这件事可能会对我造成无法承受的伤害吗?如果答案都是否定的,那就勇敢的去尝试吧。</li>
<li>已经知晓了一个选择的存在,去实现它,需要行动力和意志力的支撑。而行动力和意志力都是我们通过锻炼能够不断提升的。这里我不展开说了,只简单给几个特别有效的建议:<ul>
<li>每天做 2 件自己不想做的事情。比如原本想要赖床,那就至少今天绝对不要赖床。今天特别想喝一瓶可乐,那就今天坚决不要喝可乐,哪怕明天报复性地喝 3 瓶都可以,但重要的是今天一定不要做。每天只做两件就够了,因为意志力其实是会被消耗的,消耗过后需要时间去恢复。</li>
<li>把目标拆分成更小的目标,然后尝试“欺骗”自己。比如原本 1 点想喝可乐了,告诉自己,你如果坚持到 2 点,我就允许你喝。到了两点之后,又不断地把这个目标往前延伸。</li>
</ul>
</li>
</ol>
<p><strong>浮躁</strong><br>不要在意他人眼光。</p>
<p>我想跟妹妹探讨一下,人的价值由什么定义。妹妹完全可以有不同的想法,毕竟这只是我的一家之言。</p>
<p>对于我来说,我的价值完全由我这个人本身的内在所定义。而与外界对我的评价看法,甚至于我有哪些成就、哪些奖项、做过哪些事情都完全无关。举例来说,世人常说的一句话,“是金子总会发光”,隐含的意思似乎是“金子的发光”才体现了它的价值,换句话来说,是它对外的展现种种属性体现了它的价值。但我并不这么认为,金子就是金子,哪怕把它永远埋在暗无天日的矿井之中永不发光,它也仍然是金子,它是金子这一客观事实不需要任何外界视角的承认和定义。反之如果金子是因为外界的定义而存在,那么定义反而会因为外界视角往往会不那么全面而发生扭曲。</p>
<p>维持一个人设,往往是做给<em><strong>包括自己在内的“他者”</strong></em>来看的,注意,“包括自己在内的他者”。但何必囿于一个人物设定呢,你的价值并不由外界决定。即使没有任何第三者在场,刻意去维护一个人设的行为,实际上自己既是观众也是扮演者,“观众”的视角使得原本是率真的自己也演变成了他者。</p>
<p>“我”可以在好友面前没心没肺的嬉戏打闹、不用顾及淑女形象;也可以在课堂上、在老师面前严肃认真;更可以在公众面前发怒、落泪,但“我”还是我,我想这样做于是我就做了。行事或许跟之前从表象上看没有任何区别,但在此之前“我”是出于压力,而现在我只是在做我自己。即使做同一件事情,指导思想上的不同,会导致结果上的巨大差异。</p>
<p>除此之外,从上面的逻辑出发,他人的眼光和期待对“我”有任何意义吗?似乎有点小骄傲,但“我”的价值并不由他人的定义而决定,无论他人是否理解我、甚至贬损“我”,都对于我本身的价值不会产生任何影响。但我不是教你不要尊重别人哦,我只是在说他人无法影响你本身的价值。我们永远都应该尊重他人,但这是另外一个话题了,我会放在下面。</p>
<p>但我们是否可以有(不止一个)人设呢?其实可以有,只不过这样的人设不应该是刻意地去维持,而应该发自本心,换言之“我”只是在做我自己。坚强的人也会有脆弱的时候可以流泪,懦弱的人在面对想要守护的东西也可以变得勇敢(不过“懦弱”不是什么好人设就是了),这样就无所谓是否“打破人设”了,因为对外人来说他眼中“我”的人设不过是出自他脑海中的幻想,对我来说我只不过是在做我自己罢了。</p>
<blockquote>
<p>关于尊重,以前写的一点文字:</p>
<p>我们不仅热衷于给别人贴标签,也热衷于给自己贴标签。贴标签这一行为本质是通过符号来认识并理解这个世界。</p>
<p>通过给别人贴标签,可以节省大量去了解别人的时间成本,而且如果是面对攻击对象,可以竖起很好的靶子;通过给自己贴标签,不仅强化自我认知,而且让人在群体中找到安全感和归属感。</p>
<p>但我希望你记住,世界以及人都是复杂的,人脑无力承担这种复杂,所以借助符号化以抽象来简化复杂,在抽象的过程中不可避免会损失大量信息。</p>
<p>要将每一个人当做值得尊重的人,避免符号化带来的认知偏差。</p>
</blockquote>
<hr>
<p>4.29:<br>跟年轻人接触,他们的一些想法来源是因为他们还未曾经历过一些他们终将经历的事情,因为过去的我想法跟他们一样。<br>这事实无可争辩地告诉我,我已经老了。我又羡慕又悲哀。<br>我羡慕他们初雪般的单纯,也悲哀自己的老去。</p>
<p>小时候做语文题,题目中经常会有“言之成理即可”,现在经历的世事越多,逐渐明白那是因为世界上很难说有什么绝对的对错,但年轻的时候总是最喜欢那些最纯粹炽烈的东西,当然这无可厚非,我直到现在也喜欢。我只能像这样小布尔乔亚式地哀叹年华老去吧。<br>可笑的是,我小时候总以为自己明白这些,回过头来,我哪里真正明白呢。书中读的再多,也远不如亲身经历来的感受深刻。</p>
<p>我的话有可能会被理解成“我也堕落了”,“我也向这个世界妥协了”。但我丝毫没有这种意思,我只是说我懂得了一些我过去不认同的事情背后的逻辑。</p>
<hr>
<p>我完全支持多样性这个理由,但我也害怕多样性成为权贵的新遮羞布。事实上,已经成为了。</p>
<hr>
<p>秦,这个字让我感受到一种古拙、冷硬、机械、强力。</p>
<hr>
<p>每次面对一个新领域的知识时,心里都有一种绝望感,这些知识太过浩瀚深奥了,我穷尽一生可能也无法窥其全貌。<br>但忍住恐惧慢慢学下去,发现自己没必要学得面面俱到,只学习自己感兴趣、对自己有用的知识就行。而这是可以做到的。</p>
<hr>
<p>信息差就像能量差一样客观存在。</p>
<hr>
<p>我不是学生了,这个念头在我脑海中轰然作响,<br>我要失去学生身份了,我最熟悉的学生身份,<br>不,我仍然是学生,人生路上,我会不断求索,不断学习,不会终止。<br>感受类似于审判,但接受谁的审判呢?</p>
<hr>
<p>『只求你别忘了<br>倘若我从梦中哭着醒来<br>那是因为我梦见自己是迷途的孩子<br>穿过黑暗的森林<br>去寻找你的手』</p>
]]></content>
</entry>
<entry>
<title>杂念-3</title>
<url>/2022/12/25/Thought-3/</url>
<content><![CDATA[<p>溪柴火软蛮毡暖,我与狸奴不出门。</p>
<hr>
<p>计算机科学家和工程师都是从行动上来说都是极度悲观主义者,他们的考虑甚至不是为灾难的发生做准备,而是假定灾难已经发生我们该如何降低影响。</p>
<hr>
<p>清晰而坚定地认识自己,就可以不因外界对自己的错误认识而生气.<br>无法清晰认知自己,这绝不是天真、单纯等尚有褒义的事情</p>
<hr>
<p>最近总是五点半无需闹钟准时醒来,想来是因为我没拉窗帘而此时北方天色已然大亮的缘故。淡蓝天空,绿意层次丰富的山,淡金阳光,风在旗杆上划出道道律动,浅灰蓝色阴影下的凉亭,我的窗口面对大美而我尚不自知。</p>
<span id="more"></span>
<hr>
<p>人活着,不创造新东西、体验新东西,只是躺尸,有啥意思。<br>《盖茨比》里面说,不是每个人都具备你拥有的优良条件,我想也许天生精力充沛的人,更容易不满足于躺尸的生活?所以我们对躺尸的人也无法过多苛责,毕竟哪怕是相同的生活,每个人的体验都可能不一样(ta可能真的已经竭尽全力在生活了)。</p>
<blockquote>
<p>不创造新东西、体验新东西<br>创造的本质是生产,体验的本质是消费。消费的意义已经被资本主义无限拔高了,但生产的意义无论多么重视都不为过。</p>
</blockquote>
<hr>
<p>“吾道不孤”对于很多人来说也许挺重要,但我觉得,我们去探索世界,本身就是一个孤独的过程。倘若不感到孤独,反而说明这条道路很可能早已被探索过了,除了学习、仿古的意义之外,求新的价值不那么高。</p>
<hr>
<p>能否在如同复印一样的日子里产生一些新东西:可以是见到不同的风景、人;可以是多学到一些新知识;可以是产生新的想法;可以是写下新的句子;可以是阅读到新的文字;可以是接触到新的思想;可以是有新的感官体验。<br>不要停止这一切,否则这就是生命的终结。</p>
<hr>
<p>还能够迷茫是一件好事,放弃思考则是彻头彻尾的堕落。</p>
<p>如果我没有(时常)批判自我的勇气,如何叫人相信我的言行是对真理的维护而不是对立场的维护?</p>
<hr>
<p>为什么大家有时候会放弃长远的目标而选择短期的目标,因为长期的目标可能具有一定的不确定性,而短期的选择则是比较确定的。<br>让我们放弃确定的东西而选择不确定的东西,这是有些违反人性的。但我们有没有办法,用团队的力量或是制度的力量,将对于每个个人的不确定转为确定,让大家更加勇于选择长远目标。<br>比如挖矿,对于每个挖矿的个体而言,是否出矿完全看运气。但每个矿工可以加入矿池,挖到的矿整个矿池共享。降低个人风险。</p>
<hr>
<p>真理掌握在多数人手里还是少数人手里?<br>这个问题让我觉得非常可笑,(其潜台词似乎是)真理是因为掌握在多数人或者少数人手里而成为真理吗?<br>真理就是真理,不需要被人承认它也是真理。充其量我们可以说,在某个时候某个人发现了某种相对更加接近真理的规律,这个时候这个规律还未向全世界扩散,勉强可以说少数人此时获得关于此规律的信息。随着时间流逝,信息不断向外界扩散,这时候此规律的信息被大多数人获悉。</p>
<p>说到底,人们只是想创造出一种自己与众不同的优越感。很遗憾,不少人只是被动地获取被工业成批量生产的信息,也缺乏自己的思考(哪怕你思考的模式也是工业文化灌输的产物呢),这样的”与众不同“是一种虚妄的幻觉。</p>
<p>这个提问的另一个问题是,它将一个动态的事物用两个静态的状态就概况了,这是不符合实际情况的。</p>
<hr>
<p>我在思考一个问题:如果美感无法量化,是否说明感性的某些领域将永远把理性隔离在外?<br>美感无法量化,似乎并不等同于美感无法逻辑化,但其中的逻辑性并非基于数理逻辑,而是一种基于经验性的、神秘主义的、甚至是神性的逻辑,也许无法为人类所创造的数理逻辑所理解。<br>然后我试图去找寻量化美感的资料,发现确实有人在尝试做相关工作,其方法基于统计学。他们的努力仅仅只能说一种尝试,一种想要将”美”囊括到理性领域的尝试。他们的努力因其仍未从理论高度建立美与数字之间的联系,所以仍然未脱离中世纪炼金术的范式。</p>
<hr>
<p>文字的极限也是人类的极限,只要人类还在不断发明、发现新东西,故事就不会讲完。<br>书籍是基本概念的创造和重组,基本逻辑的无限组合可能,为人类的未来创造可能。</p>
<hr>
<p>今天第一次产生了一个想法,公平和正义是人类基于感性而不是理性的的价值追求。<br>第一次开始怀疑公平和正义这种几乎不会有人去质疑的东西的合理性……<br>我并不是说公平和正义不好,不该追求,我还没有那么极端。我只是想说,公平这种连猴子(生物学定义上的猴子)都拥有的朴素情感,作为人类的价值基石,够稳固吗……亦或是,公平这种价值追求,其实是后天塑造的,因为在动物界里,公平其实是非常罕见的社会架构。</p>
<hr>
<p>荆极:<br>己所不欲勿施于人,但己所欲就该施于人吗?<br>如果你真的为这个人着想,自己的欲与不欲都不是施于人的关键。<br>向提供他人无偏差、无虚假的充足信息,并抱有充分的同理心。这是真诚待人的基础。<br>但每个个体的经历和耐受程度都不一样,经历和立场的不同,已经足以让同理心在人与人的沟通中失去了绝大部分作用。<br>人该如何做到相互理解呢,宗教?脑机接口?社会架构?<br>充分的沟通就能够让人相互理解了吗?我并不看好这个想法,这个想法忽视了资源的有限性。<br>沟通的前提是双方相信彼此还有最低程度的“善意”,当这种最低程度的“善意”都不存在时,便是“发现即消灭”的世界了。</p>
<p>核心观点是这句:向提供他人无偏差、无虚假的充足信息,并抱有充分的同理心。这是真诚待人的基础。<br>但后面又表明了我其实不看好同理心能够发挥的作用。</p>
<p>原因是我觉得,能做到这点能打 60 分,但这个方法从理论上就没法打 100 分。但现实距离 60 分还有差距呢,先达到 60 分在说吧。</p>
<p>子瑞:<br>不过我觉得相互理解的前提就是人类社会的存在,人类社会的存在必然是建立在一定的价值基础上的,基于这种价值基础就会有一些基本的同理心。当然越复杂的理解,肯定需要越复杂的同理心,也就需要越复杂的类似经历或者价值观,这也决定了人和人之间的关系是知己还是熟人还是陌生人。不同等级的互相理解是必然存在的,导致了人们对陌生人基本的尊重,以及对好朋友的珍惜。</p>
<hr>
<p>荆极:<br>问你个问题,你觉得应该把人当做人对待,还是把人当做一个有一定规律可循的 object 对待呢?<br>真正把人当做人对待,我一直想要摒弃自己理性的那部分,用自己感性的那一面而不是机器的那一面去对待 ta。但这样就会做错事,说错话。<br>但如果在人的交往中应用理性,那些人际关系技巧和套路可以让对方很舒服,但实质却是把对方视作一个 object 了。</p>
<p>小贱:<br>我觉得人和人交往的过程中理性和感性同样重要,并不是说理性就不真诚,而是基于对方真实的需求选择最能让他安定或者给予帮助的方案。<br>当然缺乏感性上真诚的理性就会变成纯粹的套路和利用,但如果缺乏理性的话,那你几乎完全不可能对对方有所帮助,反而让自己陷入麻烦。</p>
<hr>
<p>“优越感、尊严、尊敬、自信”随想之一:<br>我一直不明白人为什么进化出“优越感”这种在我看来没有丝毫益处的情感,我想了很久,只能归结于生物的求偶本能,通过彰显自己占有资源多、能力强、外表靓丽来增强求偶优势。</p>
<p>将尊敬和优越感等同,一个很大的错误在于,这相当于将自我尊严建立在别人对自己的看法之上。换言之持有这种看法的人的人格是不独立的。</p>
<p>刚跟智鹏聊了一下这个话题,他给我讲了黑猩猩社会的例子,有点意思:<br>黑猩猩社会里,他们通过打架来决出首领,确实是打赢的当首领没错,但并不一定是最强壮的获胜。<br>而是更自信的那一方获胜,自信的来源则是自身跟其他黑猩猩的关系。</p>
<blockquote>
<p>自信的来源则是自身跟其他黑猩猩的关系<br>逻辑关系的递进是,是通过与其他黑猩猩的比较来建立自信,通过自信来与其他黑猩猩建立同盟获得势力和支持。</p>
</blockquote>
<p>上面的论述里面混淆了自信和优越感,这是2个不同的概念,自信从定义上就该是筑基于自身内心,而优越感则是相对于他人的概念。</p>
<p>自信的根源在于对自身的了解。<br>优越感,我们可以拗口地定义成,借由与他人的比较而增进的对自身的了解。这是一种“他信”。</p>
<hr>
<p>“优越感、尊严、尊敬、自信”随想之二:<br>“优越感是由心理治疗师阿尔弗雷德·阿德勒在20世纪初创造的名词,也是其个体心理学理论的一部分。优越感是一种心理防卫机制,在一个人应对痛苦的自卑感时会产生并发展。有优越感情结的人通常会展现出自大、傲慢和蔑视他人的性格特征,他们也可能会建立起以专横、霸道甚至有攻击性的行为模式来对待他人。[1][2]</p>
<p>阿尔弗雷德·阿德勒是第一个使用并在其个体心理学理论专著中探讨“优越感”一词的人[3][4]在阿德勒的书中,自卑感和优越感作为因果关系交织在一起。[5][6]。阿德勒认为,优越感本质来源于人需要克服潜在自卑情结。优越感是一种补偿自卑感的过度矫正[3],而这是一种消极的、有害的心里观念[7]。某些人在面对有自卑感带来的困难时,会发出一种优越感来克服前者,而克服的形式主要是通过夸大自身的重要性。有优越感的人往往抱有英雄主义的幻想,或对成功与失败有着错误的认知[8][9]。阿德勒认为,追求优越是人类的天性[3],然而理智的人不会将优越情结投射到他人之上或是瞧不起他人,而是将精力放在自我突破和脚踏实地的工作中。相比之下,那些拥有优越感的人却充满了自负的幻想并妄想着属于自己的霸权。[10]”</p>
<blockquote>
<p>refs: <a href="https://zh.wikipedia.org/wiki/%E5%84%AA%E8%B6%8A%E6%84%9F">https://zh.wikipedia.org/wiki/%E5%84%AA%E8%B6%8A%E6%84%9F</a></p>
</blockquote>
<p>“尊严概念常用于道德、伦理、法学和政治学学说的讨论中,用以表明人本固有的价值属性和拥有受到他人的尊重的权利。<br>尊严更多的意义体现在人类价值的维度,尽管并未就此给予明确一致的定义。<br>尊严是他者对我们自身价值的意见,这种关于尊严的主观性定义正是我们对他者意见恐惧的体现。”</p>
<blockquote>
<p>refs: <a href="https://zh.wikipedia.org/wiki/%E5%B0%8A%E4%B8%A5">https://zh.wikipedia.org/wiki/%E5%B0%8A%E4%B8%A5</a></p>
</blockquote>
<p>我的个人看法,尊严的本质乃是生存权。<br>尊严也指向了对虚无的恐惧。</p>
<p>价值是否虚无?价值的本质是什么?<br>价值最终指向如何活,如何更好的活。</p>
<hr>
<p>我有一个想法,你看有没有值得批驳的地方:<br>一个健康的系统,是该一定程度容忍负面的东西存在的,理由有三:</p>
<ol>
<li>这些负面的东西并不会因为我们不喜欢、不认同而不存在(消极、被动容忍)</li>
<li>随着时代变化,当初认为错误、不可容忍的思想,也许会变得不是那么不可接受,甚至成为主流(积极、主动容忍)</li>
<li>我们需要这些负面的东西来激活抵抗这些负面东西的机制,而这些机制能帮助我们抵抗更大的破坏力(积极、主动容忍)</li>
</ol>
<hr>
<p>topic 1:<br>不要表白的意思不是说你不能向对方释放善意乃至喜爱的感觉,你当然可以向对方表达你的喜爱,但表白实质是逼迫对方做决定。<br>尤其当对方甚至还不够了解你时,你就强迫对方做决定。当一个理性人不得不在信息缺失的情况下做决定时,选择 A 的后果是可能变坏、可能变好;选择 B 的后果是不会变得比当下更差。绝大多数人都是风险厌恶的,你觉得对方会如何决定呢?<br>面对未知,谁都不喜欢做决定。</p>
<p>topic 2:<br>男女之间的关系不能一昧地付出,可能你会觉得我真的好爱ta,我愿意为了ta付出我的一切。<br>但其实不是这样的:</p>
<ol>
<li>不是说你不能为了ta付出一切,而是你们之间到了为ta付出一切的那一步了吗?关系未进展到那个地步之前,过度的付出反而徒增对方的压力。</li>
<li>其实也没有人能真的成为太阳。</li>
</ol>
<p>一段良性的关系里面有投之以木瓜,也该有报之以琼琚。换句话说,有良好的反馈。付出的目的不是为了索取,而是互动和反馈。匪报也,永以为好也。</p>
<p>男女之间的关系需要推拉,这是人的本性。不要排斥这个过程,感情就是在这个过程逐渐磨合,也是在这个过程中增进对彼此的了解的。</p>
<p>中国教育讳谈感情真的很奇怪,你看我上面这些思考都是非常正面健康的思考,都是能帮我变成更好的人的思考。<br>我早该懂得这些做人的基础道理,却还要在将近30的年纪,自己来悟。</p>
<p>现代社会将爱情神圣化了,谈情说爱本该如渴了要喝水、饿了要吃饭一样平常。<br>我反对将爱情神圣化的原因是,爱情本就不神圣。倘若你以神圣的心态对待爱情,那势必会让你极其慎重选择是否要踏入一段关系,显然会让你失去不少学习、体验的机会。<br>而你只有吃得多了才知道哪种米适合自己的口味。</p>
<hr>
<p>阅读少年的那些日记,一瞬间我面红耳赤。老师这个职业一次又一次地融入到那些少年最美好的时光里去,一次又一次地借由少年体验“人生第一次”。<br>面红耳赤,这样的情绪波动,主要来自于一个人不设防地完全向“我”敞开少年自己,而少年在这一小段碎片里面展现出来的自我,竟然是如此真诚美好。<br>我也曾有过那一段日子,它们已经过去了。但对于老师来说,他们竟然幸运得可以重复这样的日子。</p>
<hr>
<p>绝大多数时候,我们更习惯用第一人称来指代自己,我会在审视、批判自己的时候使用xx的视角,这时候便会下意识地使用第二人称。<br>但我似乎很少用第三人称来审视自己,第三人称是否是更客观的视角?未经深思,但我觉得是的。第二人称,你我之间也许仍然纠缠不清。<br>但第三人称,我能更客观、更刻薄、更抽离地审视自己。</p>
<hr>
<p>吾日三省吾身,我有让遇到我的人变得更好吗?我自己有变得更好吗?</p>
<hr>
<p>你要说小孩子会相对真实,我比较认同;你要说小孩子善良,我未置可否。<br>我自己随着年岁越大,越来越共情,越来越能体谅别人的感受。<br>一个孩子何以能做到这些呢?</p>
<hr>
<p>温和的交涉能够保留沟通的可能,极端的话语会阻绝沟通的渠道。</p>
<p>这世界上的绝大多数矛盾,只要矛盾方之间还能沟通,事情就有还有彼此妥协、不走向激化的余地。<br>倘若将沟通的渠道堵死,那事态基本上会发展到只能依靠暴力交流或者暴力机构背书的地步了。</p>
<p>美式选票制度之所以能糊弄住人,也是因为保留了这样一种实际上只存在于想象中的沟通渠道,使得人民的愤怒不至于爆发。而问题沟通之后是否得到解决,那就不好说了。</p>
<hr>
<p>真和直很近很像,但不同。<br>可以做到真而不直。</p>
<hr>
<blockquote>
<p>90%以上的先秦两汉文献、98%以上的魏晋南北朝文献、94%以上的隋唐文献均已无法查考。<br>这话几乎让我落下泪来。有空时查一下是哪些原因导致了这些珍贵的书籍的丢失。<br>refs: <a href="https://zh.wikipedia.org/wiki/%E8%BE%91%E4%BD%9A">https://zh.wikipedia.org/wiki/%E8%BE%91%E4%BD%9A</a></p>
</blockquote>
<hr>
<p>我小时候喜欢卖弄聪明,追求在一句话中包含多层含义。<br>后来觉得哪来的这么多弯弯绕绕,考虑更多的是如何用简单通俗语言,尽可能精确的将概念和想法传达出去。(这得看是在写什么类型的文字了,人贵直,文贵曲)</p>
<p>现在对简单易上手,却可以深挖内涵的产品满含敬意。只有对事物的理解臻入化境,才能删繁就简直击事物本质的同时饱含深意。简单的道理竟然能在一层层的领悟中体会出别样的意味。</p>
<hr>
<p>“我”是意志的张扬,是生命力的喷发。</p>
<hr>
<p>人设是重要的,其重要性并不在于你向其他人展现出来什么,而在于其他人(以为他们)知道该用什么样的方式和你相处。</p>
<hr>
<p>当一个人不愿意遵守规则时,我能想到这么几种可能:</p>
<ol>
<li>ta的行事不遵循逻辑(通俗来说,是疯子)</li>
<li>相比遵守规则,破坏规则ta能获取更多利益</li>
<li>规则保护的不是他的利益</li>
</ol>
<p>第一点不值得讨论。<br>第二点需要思考规则当中是否有漏洞存在,是否该扩大惩罚破坏规则的力度,直到超过破坏规则能获得的收益。<br>第三点我们就该注意为什么基于大多数人共识的规则会没有保护ta的利益,该深入调查这个人了。</p>
<hr>
<p>两条关于我个人的:</p>
<ol>
<li>我永远不会怀着恶意说话、做事。</li>
<li>我的认知和理解可能是错误的,但我的表述是真诚的。<br>一条关于讨论的共识:<br>一个人可能持有错误的观念,但只要他能听进改正的建议,我们该批驳的是他的错误观念而不是他本人。</li>
</ol>
<hr>
<p>取仕采用门第出身,就会导致社会各阶层对于门第的重视。这种重视又会反过来助长社会中的奢靡攀比之风。因为品性、才华不重要,重要的就只有从家族中继承而来的财富和地位了。</p>
<hr>
<p>我们评判一个人该论迹不论心,如果只是想一想就要因此受到惩罚,那这个世界上已经没有任何一个活人存在了。<br>在座的各位谁没曾起过杀人的念头,但大家杀人了吗?</p>
<p>跟亲密的人闹矛盾之后:<br>在群里问群友该怎么做 X<br>跟ta心平气和地探讨彼此的想法,如果不能沟通再做下一步决定 √</p>
<p>每个人对亲密伴侣犯错的容忍程度不一样,这无可厚非,如果你觉得他犯下的错已经超过了你的底线,那就当断则断;如果只是觉得他现在就这样了,未来一定会如何如何,那大可不必,这是逻辑上的滑坡谬误。</p>
<hr>
<p>最近这起全国瞩目的案件,让我有些犹疑:男性确实有原罪吗?<br>我构想了2个有些类似的思想实验:</p>
<ol>
<li>只有男性存在的社会会不会变得更好?</li>
<li>只有女性存在的社会会不会变得更好?<blockquote>
<p>refs: <a href="https://en.wikipedia.org/wiki/Gender_in_speculative_fiction">https://en.wikipedia.org/wiki/Gender_in_speculative_fiction</a><br>refs: <a href="https://en.wikipedia.org/wiki/Utopian_and_dystopian_fiction#Feminist_utopias">https://en.wikipedia.org/wiki/Utopian_and_dystopian_fiction#Feminist_utopias</a><br>refs: <a href="https://en.wikipedia.org/wiki/Women-only_space">https://en.wikipedia.org/wiki/Women-only_space</a></p>
</blockquote>
</li>
</ol>
<p>没有男性存在,战争就会消失吗?暴力和纷争就会消失吗?<br>这让我感觉到,男性诞生出来,就是为了承担这些恶的……甚至说的大义凛然一些,男性承担了这些恶,所以女性不必承担这些恶。<br>如果真是这样,我有必要反问自己一句,这些恶是必要的吗?只要男性不存在,共产主义就能实现?</p>
<blockquote>
<p>refs: <a href="https://www.npr.org/sections/13.7/2015/04/16/400075715/is-it-sexist-to-say-that-women-are-superior-to-men">https://www.npr.org/sections/13.7/2015/04/16/400075715/is-it-sexist-to-say-that-women-are-superior-to-men</a></p>
</blockquote>
<hr>
<p>认知是一个被刻意模糊的概念,可以用一个更容易理解的概念来替换——信息量。<br>一个古代人,他的大脑跟现代人不会有太大的差别,但他们对世界的认识、理解完全不一样。其中的差别,在于如洪水一般猛烈冲击、被动灌输的信息量。<br>认知,是事物发展的可能性。现代社会,从不同方向出击,探索事实的边界。<br>我这里并没有把这顶桂冠给与科学,因为每个人、每件事都在对事物可能的形态进行不断地塑形。甚至是负面的东西,也为我们揭示了一种可能性。(我们从中可以探知避免、预防负面的方法)<br>既然已经谈到了信息量这个概念,不同时代、社会,产生有效信息的效率有着天壤之别。时间来到现代中国,10年积累信息差足以形成断代的鸿沟。<br>更新的速度太快了,保持学习吧。</p>
<p>2022-08-15 16:05<br>跟持盏交流更新:除了信息量之外,还包括处理信息的方式。<br>我应该是以前跟其他人提到过这一点,可惜没记录下来,非常遗憾。</p>
<hr>
<p>君子不立危墙。受害者固然不该受到如此对待,但我们不该用理想世界的标准要要求现实世界。<br>理想世界里不该有犯罪,不该有战争,人人都是圣贤,更不用说罪犯了。<br>你扪心自问,你自己是圣人吗,我们现在这个世界有罪犯吗?<br>你要假想自己在一个永远都不会实现的理想世界中生活吗。<br>可能是受到我自身的悲观主义思想影响,人人都只有一条命,我建议也许在可能危及生命的情况下,还是按照最坏情况来考虑比较好。</p>
<p>受害者有罪论的反面,也不该等同于“抱怨这个社会不是人间天国”。<br>我们不该受害者有罪论,而应该就事论事,逐事地分析。<br>保护好自己是否是所有人的责任?受害者是否有承担这一责任?<br>一个人皆圣贤的社会,这种社会以前不会有,以后也不会有。</p>
<hr>
<p>依靠个人力量把开源项目做起来是一件几乎不可能完成的任务,我并不怀疑个人的技术实力和热情,我想指出的是个人对抗风险的能力在时代洪流面前薄如蝉翼。<br>你有很好的个人技术品味;你单枪匹马做出的作品比开源社区维护的作品还要好;但你没有盈利点,你没法靠一个开源作品生存下去:疫情来了,用户的捐赠少了,啪,下个月的贷款突然难以为继了。<br>这时候,即使挨饿,即使面对妻子对你温柔无限的包容,即使面对还在长身体中的女儿无忧无虑的笑脸,你真能、真该继续坚持下去吗?你已经不是一个人,更不是为自己一个人而活。<br>只有公司级别乃至国家级别的投入,才能让个人无后顾之忧地、全身心地投入到作品的维护和创作之中。</p>
<hr>
<p>不要将挑战铁拳视为勇敢,法律的威慑在于惩罚的必然性而不在于惩罚的严重性。<br>如果你选择做一件必然知晓其结果的事情只是为了展现自己的“勇敢”,我看到的不是勇敢,而是愚蠢。</p>
<hr>
<p>在经历了麦卡锡运动的白色恐怖和苏联腐化解体的打击之后,美国学界呈现出一种实质上是保守主义价值取向的伪左派倾向,主动避入象牙塔,以此跟供养他们的社会进行切割,是一种抗争失败后理想幻灭的自我阉割。<br>不同于与其他社会中学界的关注点主要在社会大众,被彻底驯化并甘当喉舌的美国学界,在政治正确的严格自我审查的之下,视角只能缩向了LGBT等看似光荣正义、实则避实击虚的小众领域,可谓是诞生在美国土壤上的一朵奇葩。<br>橘生淮北则为枳,谁又能过多苛责美国学界变成了现在这幅模样呢。</p>
<hr>
<p>推荐算法会构建一个不断强化自我认同的正反馈循环,在这种循环当中,个人的观点会不断得到强化。我的想法是,无论这种观点是对是错,都不该只听到一种声音,尤其这种声音主要诞生于相似的环境。人如果无法获取到不同视角的信息,则极易陷入偏执,因而这是一种有害的循环。<br>推荐算法只说你爱听的话,史书上一般将具备这种特质的人叫佞臣。</p>
<p>我尽我所能地拒绝推荐算法。</p>
<hr>
<p>奴隶主害怕奴隶有脑子有手有脚,有脑子奴隶就知道自己在受奴役,有脚奴隶就会逃跑,有手奴隶就会反抗。<br>于是就用 996 和奶头乐占用他的所有时间,让他不能思考;<br>于是就用房贷锁住他的脚,让他没法逃跑;<br>于是就用不会饿死的月薪,让他失去反抗的积极性。</p>
<hr>
<p>中国的人口红利这个概念广为人知,但工程师红利这个说法不知道你是否听过。<br>人口红利我的理解是基础教育普及后,有大量能学习、理解基础生产概念(知识)的人口可参与到国际生产的竞争中。因为人多,可以把人力成本压得很低,这活你不干,有大量的人为了填饱肚子抢着干。对国家来说竞争力是强了,因为成本低,但对于个人来说是不幸的。<br>工程师红利也好理解,高等教育随着大学扩招铺开之后,有大量像我这样的人,掌握比上面相对复杂一点的知识,参与到国际竞争中来。</p>
<p>要是你问我,我已经把这视作不幸了,为什么我还要继续。我的回答是,不同时代的人们有不同的牺牲,建国初用血肉和饥饿作为代价换回了安全的环境,然后又牺牲了农业人口建立了基础工业环境,现在到我了,吾辈虽渺小怎敢推脱。</p>
<p>有人在昨天我发你的那个截图演讲的问题里面提到 996 工作制的问题,没想到政治问题专家跟我的看法也是一致的,我们社会中的每个人或多或少都在牺牲,只不过到这个时代牺牲的主体是我们。<br>然后也提到了 90-00 年初这十多年农民工的牺牲,十几年没有涨过工资。<br>其实我觉得农民工未必意识到自己在牺牲,也未必有自我牺牲的自觉。我很高兴自己在意识到自己在作出牺牲的同时,仍然有自我牺牲的自觉。</p>
<hr>
<p>世界观是理解、解释这个世界的方式,解释这个世界可以有无限种方式。<br>世界上没有魔法,发展到极致的科技只是人类对这个世界的认知在这个物理世界的投射。</p>
<p>这些不同的解释方式,最终实现为在这个物理世界上不同的诉求。关于智慧、关于真理、关于美、关于人体的极致、关于世界的边界……</p>
<hr>
<p>从P8开始就不怎么写代码,这是国内技术晋升路线不完备导致的。<br>总想着管理制人,则技术显然会受制于人。这又如何能产生鼓励技术至上、技术创新的氛围?公司需要这么多做PPT的人吗?<br>技术跟不上了,于是开始从外界挖人、引进,殊不知内部土壤已经是一滩烂泥,挖人也只解得了一时之急。</p>
<hr>
<p>人脑是一种可塑性极强的东西,不同人群之中诞生的不同文化,经过学习完全能被另一完全不同的族群所接受。种族之间存在差异,但这些身体上的差异并非影响一个社会的决定性因素。影响一个社会的决定性因素在于文化,而文化在不同的族群之间都是可以通过学习而习得的。</p>
<p>我想在我的这个观念再往前稍微推进一点点:<br>社会是由人组成的,反过来,人之所以为人,也是因为其拥有的社会性,而不是其拥有的动物性。<br>既然对于社会来说,身体上的差异并不重要,重要的是文化上的差异。那么同时作为文化的创造者和承载者的人脑才是最重要的。<br>既然一个观点能够被任何族群,任何性别的人所理解(而不是接受)(前提是不带先入为主的偏见): 那么我认为种族歧视和性别歧视都是可耻的。</p>
<hr>
<p>爱国这项事业,需要各个层次的人们的广泛而深入的参与。<br>有些人被批评为“无脑爱国”,他们说我懂得更多信息有更多思考,所以我的爱国跟他们的爱国是不一样的。言外之意似乎是他们的爱国比较低级,我的爱国比较“高级”。<br>但我完全不这么认为。爱国这项事业,需要全行业、全层次的广泛参与,任何一个层次都缺一不可。我们这项事业,能否广泛动员社会各个阶层,并深入地引发共鸣,是事业成功与否的一项指标。反而是被你们批评的群众的爱国,我认为这说明我们的这项事业进行得非常成功。<br>我能为爱国这项事业做的事情相对较多,他们能做的相对较少,是否我就相对更“高贵”?高贵,用在这里真是一个非常奇怪的词,谁都不比谁高贵,贡献或许有大小,但绝对都不可替代,不可或缺。</p>
<p>中国崛起当然是理性思考的结果,但这个世界上有能力、有理性进行深入思考的只是少数精英,是否连“爱国”都需要精英化了,只有精英才可以爱国?</p>
<p>“爱”这个字眼本身就意味着情感,我们在爱国的时候当然需要理性,但感情的宣泄私以为也必不可少。</p>
<p>在这个世界上的绝大多数事务中,人多当然是一件值得骄傲的事情,私以为爱国也在这绝多大数之内。</p>
<blockquote>
<p>上面这段是对某复旦同学“鄙弃普通人爱国、愚民为自己人数众多而骄傲”的观点的批驳。</p>
</blockquote>
<hr>
<p>To 欣欣 (之一)<br>又得废一番功夫写字了,欣欣你要是看了满意,就再送我一幅画:</p>
<p>想要说服一个人,让他真正认可你的说法,并为之行动,最好的办法莫过于用他切身的利益来触动他。<br>笼统地空谈大词、道德、人情,都是虚妄。<br>一个人可以不为上面这些所动,但有利于他的,他一定不会拒绝。<br>但一个人的利益,并不能简简单单地理解为物质利益。精神上的通达,情绪上的愉悦,人群中的声望,甚至良好的社会氛围(想想现在的香港),这些都是个人利益的一部分。<br>我为什么要好心说服一个人,那肯定是说服了这个人对于我自己的利益也是存在促进作用的。这个促进作用可以是切实的物质收获,可以是误会的消除人际关系的改善,甚至还可以是我就是好为人师,指点江山一番我感觉很爽。<br>但是,利益并不与道德、家国等过于伟光正的大词相冲突。经典经济学理论就有“市场中每个人只为了自身的利益驱使而运作,但作为整体却促进了社会的福祉”的说法。由此说的更深去,哲学中的功利主义进路也有更为详尽的论述。</p>
<p>To 欣欣 (之二)<br>我花了很久很久才学会,原来如何正确地爱人并不是与生俱来的本能,也是需要学习和摸索才能掌握的。</p>
<p>如何与他人建立共情其实也是,如果她能正确地体会到你的情绪,设身处地在你的立场考虑,就不会这么做。<br>但这并不是她的错,共情是种需要学习和锻炼的能力,年纪尚轻,这方面的能力不算强罢了。而且她做事没有恶意呀,是人就会犯错,犯错只要改正了,那还是我们的大宝贝呀。</p>
<hr>
<p>昨天跟跟卓腾前辈一起 debug,问题解决之后我有一些感触:</p>
<ol>
<li>“越是奇怪、难以发现的 bug,最后定位问题所在反而愈加简单,是因为对其本质的不怀疑。”——卓腾</li>
<li>结合前几天小组 Rust 学习经历,我感到再厉害的工程师也是人,是人就会犯错。宁愿用严格的语法检查在编译期流汗,也不要在 debug 时流血。机器相较于人,几乎不会犯错。那些机器得出来很奇葩的推论,我们顺着给予机器的规则一步步推导下去,往往会发现这奇葩推论在给予机器的规则之下竟然是完全合理的。</li>
<li>计算机领域有一句名言,任何问题都可以通过增加一层中间层来解决。我们这次遇到的问题其实早该在编译期就暴露出来,但代码首先经历了序列化、传输给 Server 端、Server 端反序列化处理数据、再次序列化、传输给 Client 端、Client 端反序列化处理数据、等 6 个中间层,使得本该在第一次序列化之前就该发现的问题推迟到 6 个中间层之后才暴露出来,极大增加了定位问题的难度。引入中间层在解决问题的同时,往往也会导致问题的产生并不在出错的那一行代码——所谓第一现场。引入中间层带来的“解决问题”、“定位问题”之间代价的权衡,值得细细考量。</li>
</ol>
<hr>
<p>About 《巨人》男主:<br>永远认为自己是正确的,驱使其行动的最大动力是仇恨,仅凭认为自己拥有牺牲精神就认为自己正确于他人,但在真正面对人类利益的时候选择私利救活男二而不是更能带领墙内人走向胜利的团长。自私而不自知。</p>
<p>这个作者在面对“选择团长还是男二时的讨论”时,故意避开不谈。故意绕开,仿佛让男二亲口说出更应该救团长就能弥补主角三人团的过错。</p>
<p>看到大海说的第一句话是要杀光大海对面的所有人就自由,我qnmd,杀杀杀,是,杀光天下人他就自由了。</p>
<p>从这个人物身上,我反思自己,我自己是不是同样令人恶心,我是不是也心里暗暗觉得自己与众不同。</p>
<hr>
<p>苜蓿 发布于<br>我看着学妹,一阵情欲从心底某个角落翻涌上来,“我好喜欢你,”我想对她说,“你喜欢我吗?”<br>这种激素的刺激,我知道它会归于平淡,所以我什么都不会去做,什么都不会去说。<br>但那一刻的发自心底的真诚的喜悦,已经让我很疲惫、好满足。</p>
<p>#1 楼无<br>去舔,追寻着你内心的声音,去舔!<br>#6259355@2 小时前 OO[14]XX[0]<br>#2 楼有挂车<br>文艺青年:<br>普通青年:下了,撸了,删了。<br>#6259598@2 小时前 OO[6]XX[0]<br>#3 楼阿正哥。等着看方丈女装<br>你就是馋她的身子!!<br>#6259655@1 小时前 OO[3]XX[0]<br>#4 楼小快乐<br>春天来了<br>万物复苏<br>#6260016@34 分钟前 OO[0]XX[0]</p>
<hr>
<p>“真实不装,不是不分场合地把自己内心不成熟的想法表达出来。”<br>我对这点感触很深,我是一个对“真”有着近乎偏执追求的人,也常常在未经深思熟虑、或是对要讨论的事务缺乏足够了解的情况下,贸然地发表自己的看法。但我过去认为这是好的,因为我自信自己足够中立客观、足够“对事不对人”,而且我觉得我在不够了解情况时候的想法,能够代表很多跟我一样不够了解这些事务的人的意见,而这些意见能够帮助当事人知道其他同样不够了解的人是如何思考的。<br>但这条告诉我,不合时宜地表达自己,或许并不能真正帮助到当事人。</p>
<hr>
<p>也是今天看到二战的最重要的战术都是基于坦克,而时至今日,美国想攻打哪个地方,仍然可以被地缘政治制约得动弹不得,我想到以现在的技术力,人类在战争这个场景下仍然无法突破地理因素的影响。我在想,啥时候能够完全整合所控制领地的资源,至少不受地理的限制。</p>
<hr>
<p>冷淡并不一定是坏词,我用在这里也不是取偏“贬义”的含义,而是一个尽量客观的评价。<br>一座城市的性格是由他的市民所塑造的,照理说江浙这种民营经济发达的地方,市井文化应该非常发达,生活应该充满了烟火气。一个非常好的类比的例子就是广东人就很会享受生活,早茶、夜宵什么的,很晚大街上还有熙熙攘攘的人的活动。<br>杭州是一个夜生活非常不发达的城市,这与它的经济实力非常不符。在别的城市随处可见的广场舞(我并不是说广场舞好,只是我觉得广场舞这种现象非常地有烟火味),杭州也少见。</p>
<p>我个人推测这个现象 2 方面原因吧:</p>
<ol>
<li>杭州传统文教确实发达,崇尚需要一定的经济实力和文化底蕴才能审美的文人文化,而对市井的泥土味不屑一顾。</li>
<li>商业社会重契约淡人际,人的交往淡了,用以支撑交际的手段也就相应少了。</li>
</ol>
<hr>
<p>我明白我为什么对“自由”有一种难以言喻的排斥了,“公平”、“自由”这两大旗帜,公平的实现前提是对特异群体的一定程度的压制。<br>不得不承认在“自由”土壤上诞生的种种奇葩非常美丽,但这种美丽却是建立在吸食(最不能保护自己的弱者 / 比自己弱的人)的血液的基础上。<br>奇葩很有魅力,但我更在乎那些最弱者的命运。</p>
<hr>
<p>探索新领域时,有 2 个时刻是最爽的:一是醍醐灌顶的上升期,二是虽然缓慢但能感觉到不断精进的磨练期。</p>
<hr>
<p>无知是一种“相对”状态,任何人永远都存在着对某些方面的无知。<br>并且“相对”这个词不准确,而是“领域”状态。<br>无知包括两方面,一方面是信息的不掌握,另一方面是对信息的不理解。</p>
<p>蒙特卡洛算法,用暴力搜索来击败智慧。<br>如果智慧的本质是启发式搜索,那么只不过是一种更高效的暴力击败了另一种相对低效的暴力。</p>
<hr>
<p>读历史时感到清朝的皇帝确实是勤政的好皇帝,但也真是禁锢民间发展、对中华民族犯下不可磨灭罪行的皇帝。<br>抛开意识形态而谈,这些好皇帝都是在不愿直面自己错误、不敢直面问题的本质之后,致使国家步入(封建视角下)衰退的。<br>乾隆帝晚年时不愿相信自己勤政一生,竟然却落到国家危机四伏的境地。换做任何一人,得知自己一生的努力俱为泡影,只怕都难以接受。</p>
<p>一抓就死,一放就乱。<br>真能一直乱下去吗?权力厌恶真空。从中迟早会诞生新的秩序,只不过这种秩序是否是我们想要的秩序,就不一定了。</p>
]]></content>
</entry>
<entry>
<title>QEMU 内部原理:整体架构和线程模型『译』</title>
<url>/2018/04/22/qemu-internals-overall-architecture/</url>
<content><![CDATA[<p>原文地址:<a href="http://blog.vmsplice.net/2011/03/qemu-internals-overall-architecture-and.html">http://blog.vmsplice.net/2011/03/qemu-internals-overall-architecture-and.html</a><br>Author:Stefan Hajnoczi<br>Translator:Su Hang<br><em>本文经原作者Stefan Hajnoczi授权翻译</em></p>
<p>这是针对开发人员的 QEMU 内部原理探析系列中的第一篇文章。它旨在分享 QEMU 工作原理的知识,并使新贡献者更容易了解 QEMU 代码。</p>
<p>执行 guest 代码涉及到如下任务:处理定时器、处理 I/O 请求、响应虚拟机监视器的命令,等等。要想设计一个良好的、能够解决这些问题的架构,需要安全地一次性地解决所有这些资源的分发问题。尤其是当某些请求,譬如 I/O 请求、来自用户的命令,需要大量的时间去执行的话。</p>
<p>一个 guest 的运行包括执行 guest 代码,处理定时器,处理 I / O 以及响应监视器命令。要想一次性地安排好所有这些事情需要一个能够以安全的方式调解资源的体系结构,而且最好不会暂停 guest 代码的执行。如果磁盘 I / O 或监视器命令需要很长时间才能完成,对于需要响应来自多个来源的事件的程序,有两种流行体系结构:</p>
<ol>
<li>并行体系架构,将工作分解为可同时执行的进程或线程。我将称之为线程架构。</li>
<li>事件驱动架构,通过在一个主循环分派各个事件到与之对应的事件处理函数。这通常使用<code>select(2)</code>或<code>poll(2)</code>系列调用系列来实现,以等待多个文件描述符。</li>
</ol>
<p>但 QEMU 实际上使用了一种将事件驱动编程与多线程相结合的混合架构。这样做是有道理的,因为事件循环不能利用多个 CPU 内核的特性,因为它只有一个执行线程。另外,有时编写专用线程来处理一个特定的任务,而不是将其集成到事件驱动的体系结构,在编程实现中更为简单。尽管如此,QEMU 的核心还是事件驱动的,大多数代码在这种环境中执行。</p>
<h3 id="QEMU-的事件驱动核心"><a href="#QEMU-的事件驱动核心" class="headerlink" title="QEMU 的事件驱动核心"></a>QEMU 的事件驱动核心</h3><p>事件驱动的架构以事件循环为中心,该事件循环将事件分派给处理函数。QEMU 的主要事件循环是<code>main_loop_wait()</code>,它执行以下任务:</p>
<ul>
<li>等待文件描述符变为可读或可写。文件描述符起着至关重要的作用,因为无论是文件、套接字、管道还是各种其他资源都是通过文件描述符来控制的。文件描述符可以使用<code>qemu_set_fd_handler()</code>来添加。</li>
<li>运行会定时过期的定时器。定时器可以使用<code>qemu_mod_timer()</code>添加。</li>
<li>运行下半部机制 (BHs)(译者注:所谓 bottom-halves 机制,是指在允许中断的情况下,将中断处理程序延迟执行),就像立即过期的定时器一样。BH(译者注:原文中 BH 是 bottom halves 的缩写,下同)用于避免重入和溢出调用堆栈。使用<code>qemu_bh_schedule()</code>添加 BHs。</li>
</ul>
<span id="more"></span>
<blockquote>
<p>Linux 将一些中断处理分成两部分,第一部分是在关中断的条件下执行的,具有”原子”性,而且是中断发生以后一般要立即执行的,第二部分,就是 bottom half 了,是在开中断的条件下执行,这部分是可以延迟一段时间再做的,而且有可能将多个中断的 bottom half 合并起来一起做。</p>
</blockquote>
<p>当文件描述符准备就绪,计时器到期或调度 BH 时,事件循环会调用相应该事件的回调函数。关于回调函数的执行场景,有两条简单规则:</p>
<ol>
<li>没有其他核心代码正在同时执行,因此不需要考虑同步问题。回调函数相对于其他核心代码是顺序的,并且以原子的方式执行。在任何时候只有一个控制线程执行核心代码。</li>
<li>回调函数不应阻塞系统调用或进行长时间运行的运算。由于事件循环会在回调函数返回之前等待,所以其他想要被执行的事件就因此被阻塞,避免在回调中花费大量时间非常重要。打破此规则会导致 guest 虚拟机暂停并且监视器无法再响应用户。</li>
</ol>
<p>第二条规则有时在 QEMU 的某些代码中其实是难以实现的。事实上,<code>qemu_aio_wait()</code>中甚至有一个嵌套事件循环等待顶层事件循环处理的事件子集。希望在未来重构代码时,可以消除这些违背了第二天规则的代码。新代码几乎从来没有合法的理由阻止,一种解决方案是使用专用工作线程来卸载长时间运行或阻塞的代码。</p>
<h3 id="将特定任务分配到工作线程"><a href="#将特定任务分配到工作线程" class="headerlink" title="将特定任务分配到工作线程"></a>将特定任务分配到工作线程</h3><p>虽然许多 I / O 操作可以以非阻塞方式执行,但是有些系统调用没有非阻塞版本。此外,有时候长时运行的计算任务会影响 CPU,并且很难将其分解成多个小的回调函数。在这些情况下,可以谨慎地通过分配专用工作线程的方式,将这些任务移出 QEMU 核心函数。</p>
<p>一个工作线程的用户示例是<code>posix-aio-compat.c</code>,一个异步文件 I / O 实现。当 QEMU 核心代码发出 aio 请求时,该请求将被放置在一个队列中。工作线程将从队列中取出该 aio 请求并在 QEMU 核心函数之外去执行。这时就可以执行阻塞操作了,因为这些任务在自己的线程中执行并且不会阻塞 QEMU 的其余部分。通过这种方式需要注意在工作线程和 QEMU 核心函数之间执行必要的同步和通信。</p>
<p>另一个例子是<code>ui/vnc-jobs-async.c</code>,它在工作线程中进行密集的图像压缩和编码计算。</p>
<p>由于大多数 QEMU 核心代码不是线程安全的,所以工作线程不能调用 QEMU 核心代码代码。对于简单的实用程序——如<code>qemu_malloc()</code>——是线程安全的,但这算是例外而非规则。这种特性使得将工作线程事件传回 QEMU 核心函数变成了一个难题。</p>
<p>当工作线程需要通知 QEMU 核心代码时,会在事件循环中添加管道或<code>qemu_eventfd()</code>文件描述符。工作线程可以写入文件描述符,并且当文件描述符的状态变为可读时,事件循环将调用回调函数。另外,必须有一个信号来确保事件循环能够在任何情况下运行。在了解 guest 代码的执行方式后,<code>posix-aio-compat.c</code>使用的这种方法更加自然。</p>
<h3 id="执行-guest-代码"><a href="#执行-guest-代码" class="headerlink" title="执行 guest 代码"></a>执行 guest 代码</h3><p>到目前为止,我们主要关注的是事件循环及其在 QEMU 中所扮演的的核心角色。但同样重要的是执行 guest 代码的能力,如果没有可执行的 guest 代码,QEMU 即使可以对事件做出响应,但这并没有太大意义。</p>
<p>执行 guest 代码有两种机制:微型代码生成器 (TCG) 和 KVM。TCG 使用动态二进制翻译(也称为即时 (JIT) 编译)模拟 guest。KVM 利用现代英特尔和 AMD CPU 中的硬件虚拟化扩展技术,直接在主机 CPU 上安全地执行 guest 代码。对于本文来说,在使用中实际使用哪种技术并不重要,但重要的是 TCG 和 KVM 都允许我们跳入 guest 代码并执行。</p>
<p>跳入 guest 代码会将执行的控制权转移给 guest。当线程正在运行 guest 代码时,它不能同时处于事件循环中,因为 guest 端对 CPU 具有(安全的)控制权。通常来说,在 guest 代码中花费的时间是有限的,因为对模拟设备寄存器的读写和其他异常处理都将导致我们离开 guest 并将控制权交还给 QEMU。但在极端情况下,guest 可以花费无限的时间去执行某段代码,而且不放弃其控制权限,在这种情况下 QEMU 会无法响应外界信息。</p>
<p>为了解决 guest 代码占用 QEMU 的控制线程的问题,信号被用来打破 guest 的控制权限。一个 UNIX 信号会将控制权限拉离 (yank) 当前的执行流程,并调用信号处理函数。这使 QEMU 得以采取一系列步骤脱离 guest 代码,并返回到其主循环中,其中事件循环可以有机会处理被持续推入到队列中的事件。</p>
<p>这样做的结果是,如果 QEMU 当前处于 guest 代码中,则可能无法立即检测到新事件。当然,大多数时候 QEMU 最终都会处理事件,但这种额外的延迟本身就是一个需要克服的性能问题。由于这个原因,定时器、I / O 完成 (completion) 和从工作线程到 QEMU 核心代码的通知 (notification),使用信号机制来确保事件循环将立即运行。</p>
<p>你可能想知道事件循环与具有多个 vcpus 的 SMP guest 虚拟机之间的整体情况。在已经讨论了线程模型和执行 guest 代码之后,我们可以讨论它的整体架构。</p>
<h3 id="iothread-和-non-iothread-架构"><a href="#iothread-和-non-iothread-架构" class="headerlink" title="iothread 和 non-iothread 架构"></a>iothread 和 non-iothread 架构</h3><p>传统的体系结构是单个 QEMU 线程来执行 guest 代码和事件循环。这个模型也被称为非 iothread 或<code>!CONFIG_IOTHREAD</code>,并且在使用<code>./configure && make</code>编译 QEMU 源码时是默认的。QEMU 线程执行 guest 代码,直到异常或信号产生一次回退控制。然后在<code>select(2)</code>中以非阻塞的方式运行事件循环的一次迭代。之后,它回到 guest 代码并重复这一过程,直到 QEMU 进程退出。</p>
<p>如果 guest 虚拟机使用<code>-smp 2</code>的方式启动多个 vcpus,在这种情况下,就不会创建额外的 QEMU 线程。而是单个 QEMU 线程以多路复用的方式,在两个 vcpus 的 guest 代码和事件循环之间执行。因此,non-iothread 无法利用多核主机,并可能导致 SMP guest 机性能不佳。</p>
<p>请注意,尽管只有一个 QEMU 线程,但可能有零个或多个工作线程。这些线程既可能是暂时的有可能是永久的。请记住,它们执行特定的任务,而不执行 guest 代码或处理事件。我想强调一下,因为在监视 host 上面的线程,并将它们解释为 vcpu 线程时,工作线程很容易被 vcpu 线程所混淆。请记住,non-iothread 线程只有一个 QEMU 线程。</p>
<p>较新的体系结构是每个 vcpu 一个 QEMU 线程以及一个专用的事件循环线程。这种模式被称为 iothread 或 CONFIG_IOTHREAD,可以在构建时使用<code>./configure --enable-io-thread</code>启用。每个 vcpu 线程可以并行执行 guest 代码,提供真正的 SMP 支持,而 iothread 负责运行事件循环。通过全局互斥体来维护,QEMU 核心代码代码永远不会同时运行的规则是。该全局互斥体通过 vcpus 和 iothread 同步 QEMU 核心代码。大多数情况下,vcpus 将执行 guest 代码,并且不需要保存全局互斥锁。大多数情况下,<code>select(2)</code>中的线程被阻塞,并且不需要保持全局互斥。</p>
<p>请注意,TCG 不是线程安全的,因此即使在 iothread 模型下,它也是以单个 QEMU 线程来实现多路复用 vcpus。只有 KVM 可以利用 per-vcpu 线程。</p>
<h3 id="结论和展望"><a href="#结论和展望" class="headerlink" title="结论和展望"></a>结论和展望</h3><p>希望这有助于交流 QEMU 的整体架构 (KVM 继承)。欢迎在下面的评论中留下问题。</p>
<p>在将来,上面讨论到的细节可能会改变,我希望我们会默认使用 CONFIG_IOTHREAD,甚至可能会删除!CONFIG_IOTHREAD。</p>
<p>当 qemu 的 master 分支做出更改时,我会尝试更新此帖。</p>
]]></content>
<tags>
<tag>QEMU</tag>
<tag>Translation</tag>
</tags>
</entry>
<entry>
<title>LFS 部分问题的解决方案</title>
<url>/2018/08/15/record-lfs-solution-you-cant-find-in-chinese-internet/</url>
<content><![CDATA[<p>本文记录一些在尝试 LFS 8.2 时遇到的一些问题的解决方案。<br>这些解决方案被我选录的标准是,英文网络中有,但中文网络目前还没有。以飨后来人。</p>
<hr>
<ol>
<li>在为 LFS 编译 Glibc 库的时候,会在 <code>./configure</code>期间遇到如下问题:</li>
</ol>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">LD_LIBRARY_PATH shouldn<span class="string">'t contain the current directory</span></span><br><span class="line"><span class="string">checking LD_LIBRARY_PATH variable... contains current directory</span></span><br><span class="line"><span class="string">configure: error:</span></span><br><span class="line"><span class="string">*** LD_LIBRARY_PATH shouldn'</span>t contain the current directory when</span><br><span class="line">*** building glibc. Please change the environment variable</span><br><span class="line">*** and run configure again.</span><br></pre></td></tr></table></figure>
<p>出现这个错误的原因是由于环境变量的 <code>LD_LIBRARY_PATH</code> 中出现了当前目录。通常我们修改环境变量时会这么写:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">export</span> LD_LIBRARY_PATH = <span class="variable">$LD_LIBRARY_PATH</span>:/foo/bar:/hello/world:/a/b</span><br></pre></td></tr></table></figure>
<p>如果一开始 <code>LD_LIBRARY_PATH</code> 不存在的话,这个上面这串环境变量开头就是冒号,这就把当前文件夹包含进去了。一般来说我们挺需要这种效果,因为在编译的时候可以 include 某些东西,但是对于编译 glibc 来说这个是多余的。</p>
<span id="more"></span>
<p>最简单的解决方法就是 <code>unset LD_LIBRARY_PATH</code>。但这个解决方案会在接下来 LFS 的一系列步骤中,产生一些问题。</p>
<blockquote>
<ol>
<li><a href="https://github.com/Linuxbrew/legacy-linuxbrew/issues/807">https://github.com/Linuxbrew/legacy-linuxbrew/issues/807</a></li>
<li><code>LIBRARY_PATH</code> 用于在链接过程中查找库。<code>LD_LIBRARY_PATH</code> 用于在程序执行期间查找库。</li>
</ol>
</blockquote>
<hr>
<ol start="2">
<li>在为 LFS 第二遍编译 Binutils-2.25 的时候,会在 <code>./configure</code>期间遇到如下问题:</li>
</ol>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">no such file or directory: ./a.out</span><br></pre></td></tr></table></figure>
<p>日志如下(注,这段日志并不重要,只是为了增加被搜索引擎索引的准确率,方便后来人查找到这一问题):</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">checking <span class="keyword">for</span> C compiler default output file name... a.out</span><br><span class="line">checking whether the C compiler works... configure: error: <span class="keyword">in</span> `/mnt/sources/binutils-build<span class="string">':</span></span><br><span class="line"><span class="string">configure: error: cannot run C compiled programs.</span></span><br><span class="line"><span class="string">If you meant to cross compile, use `--host'</span>.</span><br><span class="line">See `config.log<span class="string">' for more details.</span></span><br></pre></td></tr></table></figure>
<p>My problem is glibc was in /lib and /lib64 was not a link to /lib. My fix was mv /tools/lib64/* /tools/lib/ && rmdir /tools/lib64 && ln -s lib /tools/lib64<br>翻译:我遇到的问题在于 glic 位于<code>/lib</code>路径下,而<code>/lib64</code>并没有链接(注,指 ln 命令的软链接)到<code>/lib</code>目录。我解决这个问题的办法是运行下面这条命令:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="built_in">mv</span> /tools/lib64/* /tools/lib/ && <span class="built_in">rmdir</span> /tools/lib64 && <span class="built_in">ln</span> -s lib /tools/lib64</span><br></pre></td></tr></table></figure>
<blockquote>
<p>参考链接:<a href="https://www.reddit.com/r/linuxfromscratch/comments/2yd1j5/59_binutils225_pass_2_failing_during_configure/">https://www.reddit.com/r/linuxfromscratch/comments/2yd1j5/59_binutils225_pass_2_failing_during_configure/</a></p>
</blockquote>
<hr>
<ol start="3">
<li>LFS 书中最坑的一处小细节是,在 <code>chroot</code> 之后,它完成 <code>/mnt/lfs/boot/</code> 到宿主<code>/boot</code>路径的绑定了,就直接让读者对 <code>/boot/grub/grub.cfg</code>文件进行修改。 此刻你可能还沉浸在 <code>chroot</code> 带给你的安全感里,一不留神就中招。</li>
</ol>
<p>重启并发现 grub 引导失败之后,大多数用户应该使用的 grub2 而非 grub。这两个程序重新进入引导的方式是不一样的。<br>简单记录 grub2 手动重新引导过程如下,__注意,不要直接输入下面的代码!__:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">grub> <span class="built_in">set</span> root=(hd0,1)</span><br><span class="line">grub> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1</span><br><span class="line">grub> initrd /boot/initrd.img-3.13.0-29-generic</span><br><span class="line">grub> boot</span><br></pre></td></tr></table></figure>
<p>将第一行中的 <code>(hd0,1)</code> 替换为你原本 <code>/mnt/lfs</code> (也就是 <code>chroot</code> 所用到的地址)所挂在的硬盘地址。这里值得一提的是,grub 对于硬盘命名的方式有细微差别,一定要弄清之后再根据你机器的实际情况做修改。<br>将第二行和第三行的路径都需要替换为你编译好的内核路径,第二行中的root路径与第一行的路径相同(只是写法不一样)。</p>
<blockquote>
<p>参考链接:<a href="https://www.linux.com/learn/how-rescue-non-booting-grub-2-linux">https://www.linux.com/learn/how-rescue-non-booting-grub-2-linux</a></p>
</blockquote>
]]></content>
<tags>
<tag>Linux</tag>
<tag>LFS</tag>
</tags>
</entry>
<entry>
<title>记录一次 LLVM 编译错误的解决</title>
<url>/2018/07/09/record_LLVM_compile_error_solution/</url>
<content><![CDATA[<blockquote>
<p>undefined reference to `llvm::orc::AsynchronousSymbolQuery::handleFullyReady()’</p>
</blockquote>
<p>使用官方教程中的命令编译</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">clang++ -g -rdynamic toy.cpp -L/usr/local/lib -lLLVMOrcJIT `llvm-config --cxxflags --ldflags --system-libs --libs core mcjit native` -O3 -o toy</span><br></pre></td></tr></table></figure>
<p>会得到如下错误:</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">warning: unknown warning option <span class="string">'-Wno-maybe-uninitialized'</span>; did you mean <span class="string">'-Wno-uninitialized'</span>? [-Wunknown-warning-option]</span><br><span class="line">1 warning generated.</span><br><span class="line">/tmp/toy-e5b39c.o: In <span class="keyword">function</span> `llvm::orc::RTDyldObjectLinkingLayer::ConcreteLinkedObject<std::shared_ptr<llvm::RuntimeDyld::MemoryManager> >::finalize()<span class="string">':</span></span><br><span class="line"><span class="string">/usr/local/include/llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h:191: undefined reference to `llvm::orc::JITSymbolResolverAdapter::JITSymbolResolverAdapter(llvm::orc::ExecutionSession&, llvm::orc::SymbolResolver&, llvm::orc::MaterializationResponsibility*)'</span></span><br><span class="line">/tmp/toy-e5b39c.o: In <span class="keyword">function</span> `llvm::orc::JITSymbolResolverAdapter::~JITSymbolResolverAdapter()<span class="string">':</span></span><br><span class="line"><span class="string">/usr/local/include/llvm/ExecutionEngine/Orc/Legacy.h:23: undefined reference to `vtable for llvm::orc::JITSymbolResolverAdapter'</span></span><br><span class="line">/tmp/toy-e5b39c.o: In <span class="keyword">function</span> `llvm::orc::ExecutionSessionBase::materializeOnCurrentThread(llvm::orc::VSO&, std::unique_ptr<llvm::orc::MaterializationUnit, std::default_delete<llvm::orc::MaterializationUnit> >)<span class="string">':</span></span><br><span class="line"><span class="string">/usr/local/include/llvm/ExecutionEngine/Orc/Core.h:188: undefined reference to `llvm::orc::MaterializationResponsibility::MaterializationResponsibility(llvm::orc::VSO&, std::map<llvm::orc::SymbolStringPtr, llvm::JITSymbolFlags, std::less<llvm::orc::SymbolStringPtr>, std::allocator<std::pair<llvm::orc::SymbolStringPtr const, llvm::JITSymbolFlags> > >)'</span></span><br><span class="line">/usr/local/include/llvm/ExecutionEngine/Orc/Core.h:188: undefined reference to `llvm::orc::MaterializationResponsibility::~MaterializationResponsibility()<span class="string">'</span></span><br><span class="line"><span class="string">/tmp/toy-e5b39c.o: In function `std::set<llvm::orc::SymbolStringPtr, std::less<std::set>, std::allocator<std::set> > llvm::orc::lookupWithLegacyFn<llvm::orc::KaleidoscopeJIT::KaleidoscopeJIT()::{lambda(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)#1}>(llvm::orc::ExecutionSession&, llvm::orc::AsynchronousSymbolQuery&, std::allocator<std::set> const&, llvm::orc::KaleidoscopeJIT::KaleidoscopeJIT()::{lambda(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)#1})'</span>:</span><br><span class="line">/usr/local/include/llvm/ExecutionEngine/Orc/Legacy.h:90: undefined reference to `llvm::orc::ExecutionSessionBase::failQuery(llvm::orc::AsynchronousSymbolQuery&, llvm::Error)<span class="string">'</span></span><br><span class="line"><span class="string">/usr/local/include/llvm/ExecutionEngine/Orc/Legacy.h:82: undefined reference to `llvm::orc::AsynchronousSymbolQuery::resolve(llvm::orc::SymbolStringPtr const&, llvm::JITEvaluatedSymbol)'</span></span><br><span class="line">/usr/local/include/llvm/ExecutionEngine/Orc/Legacy.h:83: undefined reference to `llvm::orc::AsynchronousSymbolQuery::notifySymbolReady()<span class="string">'</span></span><br><span class="line"><span class="string">/usr/local/include/llvm/ExecutionEngine/Orc/Legacy.h:86: undefined reference to `llvm::orc::ExecutionSessionBase::failQuery(llvm::orc::AsynchronousSymbolQuery&, llvm::Error)'</span></span><br><span class="line">/usr/local/include/llvm/ExecutionEngine/Orc/Legacy.h:97: undefined reference to `llvm::orc::AsynchronousSymbolQuery::handleFullyResolved()<span class="string">'</span></span><br><span class="line"><span class="string">/usr/local/include/llvm/ExecutionEngine/Orc/Legacy.h:100: undefined reference to `llvm::orc::AsynchronousSymbolQuery::handleFullyReady()'</span></span><br><span class="line">/tmp/toy-e5b39c.o:(.data.rel.ro._ZTVN4llvm3orc22LegacyLookupFnResolverIZNS0_15KaleidoscopeJITC1EvEUlRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE_EE[_ZTVN4llvm3orc22LegacyLookupFnResolverIZNS0_15KaleidoscopeJITC1EvEUlRKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEE_EE]+0x30): undefined reference to `llvm::orc::SymbolResolver::anchor()<span class="string">'</span></span><br><span class="line"><span class="string">clang-7: error: linker command failed with exit code 1 (use -v to see invocation)</span></span><br></pre></td></tr></table></figure>
<p>定位到最下方的一次函数调用<code>handleFullyReady</code>,在 <code>/usr/local/lib</code> 目录下使用<code>grep handleFullyReady . -r -n</code>搜索,发现该函数位于 <code>LibLLVMOrcJIT.so</code> 文件中。</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">Binary file ./libLLVMOrcJIT.so.7svn matches</span><br></pre></td></tr></table></figure>
<p>使用新的命令</p>
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">clang++ -g -rdynamic toy.cpp -lLLVMOrcJIT `llvm-config --cxxflags --ldflags --system-libs --libs core mcjit native` -O3 -o toy</span><br></pre></td></tr></table></figure>
<p>问题解决。</p>
]]></content>
<tags>
<tag>LLVM</tag>
</tags>
</entry>
<entry>
<title>关闭 tmux panel 无需确认</title>
<url>/2018/05/10/tmux-close-panal-without-confirm/</url>
<content><![CDATA[<p>使用 tmux 时经常开启关闭临时面板(panel),每次关闭时 tmux 都会让你确认是否真的要关闭,有些繁琐。<br>将如下配置加入你的<code>.tmux.conf</code>文件来避免繁琐的确认步骤:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">bind-key & kill-window</span><br><span class="line">bind-key x kill-pane</span><br></pre></td></tr></table></figure>
<p>重启 tmux 服务,或者重新加载 tmux 配置文件(<code>.tmux.conf</code>)后生效。</p>
<p>参考链接:<br><a href="https://unix.stackexchange.com/questions/30270/tmux-disable-confirmation-prompt-on-kill-window">https://unix.stackexchange.com/questions/30270/tmux-disable-confirmation-prompt-on-kill-window</a></p>
<span id="more"></span>
<p>回答部分翻译如下:</p>
<p>前缀键(通常指 ctrl+b)& 通常与<code>confirm-before -p "kill-window #W? (y/n)" kill-window</code>相绑定,<code>confirm-before</code>导致你需要进行确认的操作。如果你想避免确认步骤,只需要将原有的按键命令解绑,然后直接将其与<code>kill-window</code>重新绑定即可。</p>
<p>如果你想要知道你的 tmux 配置默认有哪些操作需要确认步骤,使用如下命令:</p>
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">tmux list-keys | grep confirm-before</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag>tmux</tag>
</tags>
</entry>
<entry>
<title>了解 QEMU 设备模拟原理『译』</title>
<url>/2018/04/22/understanding-qemu-devices/</url>
<content><![CDATA[<p>原文地址:<a href="https://www.qemu.org/2018/02/09/understanding-qemu-devices/">https://www.qemu.org/2018/02/09/understanding-qemu-devices/</a><br>Author:Eric Blake<br>Translator:Su Hang</p>
<p>以下是一些可帮助新手了解 QEMU 设备实际原理的笔记:</p>
<p>在使用 QEMU 时,需要记住的一件事就是:以操作系统的视角来说,当其运行于我们试图模拟的裸机硬件之上时,操作系统在裸机硬件上会看到什么。大多数裸机的模拟实现仅仅是简单的内存映射,在特定地址上的软件戳(software poking) 会产生特定的边际效应(side effect)(最常见的边际效应当然是访问内存;但是内存中的其他常见区域还包括用于控制寄存器组特定的硬件,如硬盘或网卡,甚至 CPU 本身)。模拟的最终目标是允许只使用普通 ring3 内存访问(译者注:这里的普通内存访问与操作系统的 ring0 特权访问相对应)的用户空间程序来管理 guest 操作系统所期望的所有边际效应。</p>
<p>从实现细节上来说,一些硬件(如 x86)实际上有两个内存空间,其中 I / O 空间使用与普通内存访问(译者注:例如 mov a, b) 不同的汇编代码(译者注:这里指 in a,out a 等等 x86 架构特有汇编指令); QEMU 必须模拟这些特殊访问。同样,许多现代 CPU 在内存地址映射范围中,也为提供了一组 CPU 本地寄存器,例如中断控制寄存器。</p>
<p>对于在某些特定硬件,我们通过虚拟化挂钩技术(virtualization hooks),使得 CPU 本身可以很容易地捕获非正常存储器访问的汇编指令(那些访问 I / O 空间或 CPU 内部寄存器的指令,因此需要不同于正常存储器访问的边际效应),所以 guest 机只是执行与裸机相同的汇编指令序列,但是执行之后会导致陷入到 trap 中,让运行于用户空间的 QEMU 在对控制权返回 guest 代码之前使用普通的用户空间内存访问对指令作出反应。QEMU 通过“加速器”实现了这个功能。</p>
<p>虚拟化加速器(如 KVM)可以使 guest 代码运行在 QEMU 虚拟机中的速度几乎与裸机一样快。其中速度减慢的部分是由来自 guest 代码的每个 trap 都会返回至 QEMU(vmexit)执行,以处理非正常的汇编指令或内存地址引起的。除此之外,QEMU 还支持其他虚拟化加速器(例如 HAXM 或 macOS 的 Hypervisor.framework)。</p>
<span id="more"></span>
<p>QEMU 还拥有一个 TCG 加速器,该加速器在运行期(译者注:可视为一种 Just in time 技术)将 guest 汇编指令编译为相应的主机指令或调用主机帮助例程。TCG 技术虽然速度不及硬件加速,但它允许跨硬件模拟,例如在 x86 上运行 ARM 代码。</p>
<p>接下来要弄清楚的是当操作系统访问各种硬件资源时都发生了些什么。例如,大多数操作系统都附带了管理 IDE 磁盘的驱动程序 - 驱动程序仅仅是一种软件,它被编程为对特定的内存映射子集(译者注:简单来说就是某一片内存区域)(IDE 总线所在的任何位置)发出特定的 I / O 请求,与不同的硬件相绑定)。当 IDE 控制器硬件接收到这些 I / O 请求时,它会执行相应的操作(通过 DMA 传输或其他硬件操作)将数据从内存复制到永久存储器(写入磁盘)或从永久存储器复制到内存(从磁盘读取)。</p>
<p>当我们购买一个包含未初始化磁盘的裸机硬件时,我们安装使用操作系统中相应驱动程序,对 IDE 硬件映射到内存的部分进行访问,然后将磁盘格式化为一系列分区和文件系统。</p>
<p>那么,QEMU 如何模拟这个功能呢?在 QEMU 提供给 guest 代码的内存映射中,它在与裸机相同的地址处(译者注:具体地址得查阅相应的硬件手册)模拟 IDE 磁盘。当 guest 操作系统驱动程序向 IDE 控制寄存器发出特定的内存写入操作以便将数据从内存复制到永久存储器时,QEMU 加速器会陷入该内存区域(译者注:通过 Hook 技术实现),并将请求传递到 QEMU IDE 控制器设备模型。设备模型会解析 I / O 请求,并通过发出主机系统调用来模拟它们。这一系列行为的结果是 guest 内存被复制到 host 机器的存储中。</p>
<p>在 host 端,模拟永久存储的最简单方法是将主机文件系统中的文件视为不包含任何结构信息的原始数据(raw data)(也就是说,host 文件中的偏移量与 guest 驱动程序访问的磁盘偏移量,以 1:1 比例映射). 但 QEMU 实际上能够将许多不同主机格式(raw, qcow2,qed, vhdx,…)和协议(文件系统,块设备, NBD, Ceph,gluster 等)的任意组合粘合在一起作为后端,然后在 QEMU 对硬件的模拟中绑定到提供服务的 guest 设备。</p>
<p>因此,当您告诉 QEMU 使用主机 qcow2 文件时,guest 虚拟机不必对 qcow2 文件格式有任何了解,仅仅只需要 guest 的驱动程序执行与裸机相同的寄存器读写操作,从而触发 vmexits 进入 QEMU 代码,然后 QEMU 将这些访问映射到 qcow2 文件的相应偏移量中来进行读写。在首次安装 guest 虚拟机时,所有 guest 虚拟机都会看到一个空白未初始化的线性磁盘(无论该磁盘在主机中是线性的——如原始数据(raw format);还是针对随机访问进行了优化,如 qcow2 格式);guest 操作系统决定如何划分其硬盘并在其上安装文件系统,而 QEMU 不关心 guest 代码正在使用什么文件系统,只关心原始磁盘(raw disk)I / O 寄存器控制序列的模式。</p>
<p>接下来要意识到的是,模拟 IDE 并不总是最高效的。每次 guest 试图写入控制寄存器时,都必须经过特殊处理,并且 vmexits 会减慢模拟速度。当然,不同的硬件模型在虚拟化时具有不同的性能特征。然而,一般来说,对真实硬件最有效实现方法并不一定适用于其在虚拟化之中的实现,直到最近,硬件并没有被设计成当通过 QEMU 等软件进行模拟时运行得更快。因此,QEMU 包含专为此目的而设计的半虚拟化设备(paravirtualized device)。</p>
<p>在 QEMU 这里的“半虚拟化”的含义,与半虚拟化的原始含义:“通过 guest 和主机之间的合作实现虚拟化”略有不同。QEMU 开发人员已经制定了一套硬件寄存器规范,并规定了这些寄存器的行为,这些寄存器旨在尽可能减少 vmexits 的数量,同时仍然完成硬盘必须做的事情,即实现 guest 内存和持久存储设备之间的传输。这个规范被称为 virtio;使用它需要在 guest 虚拟机中安装 virtio 驱动程序。尽管不存在与 virtio 具有相同的寄存器布局的物理设备,但其理念是相通的:virtio 磁盘的行为类似于内存映射寄存器组,guest 操作系统驱动程序知道将哪些操作硬件的寄存器值的写入该存储体,以使数据被复制进出其他 guest 内存。virtio 中的大部分加速功能都是通过它的如下设计实现的:guest 虚拟机为其大部分硬件命令序列设置了一部分常规内存,只需启动一个寄存器即可告知 QEMU 读取命令序列(较少的映射寄存器访问意味着更少的 vmexits),通过握手机制(handshaking)来保证 QEMU 处理这些命令序列时 guest 端驱动程序在不会改变正常内存。</p>
<p>顺带一提,就像最新的硬件在实现虚拟化时效率十分高效一样,virtio 也在演进为通过硬件来实现变得更加高效,当然不会以牺牲模拟或虚拟化的性能来达到此目的。因此,将来你也可能会偶然发现实现了物理 virtio 的高性能设备。</p>
<p>同样,许多操作系统都支持多个网卡,一个常见的例子就是 PCI 总线上的 e1000 板卡。在裸机上,操作系统将检测 PCI 空间,当看到具有 e1000 签名的寄存器组被填充时,就加载驱动程序,然后该驱动程序知道要写入的寄存器命令序列,以便让硬件传输网络流量。因此,QEMU 拥有一台 e1000 设备——作为众多网卡模拟实现之一——映射到同一个内存区域(译者注:这里的 guest 内存区域指的是 host 上面的用户内存区域),而真正的 guest 内存区域将裸露在被模拟的裸机内存上。</p>
<p>其次,e1000 寄存器布局往往需要大量的寄存器写入(并因此需要 vmexits)来满足硬件的工作需求,因此 QEMU 开发人员添加了 virtio-net 卡(PCI 硬件规范,尽管现在还没有实现它的真实物理硬件),因此在 guest 操作系统中安装 virtio-net 驱动程序可以最大限度地减少 vmexits 的数量,同时还能获得与发送网络流量的相同边际效应。如果您告诉 QEMU 使用 virtio-net 卡启动 guest 虚拟机,则 guest 虚拟机操作系统将探测 PCI 空间,并使用 virtio-net 签名查看一系列寄存器,并加载适用于任何其他 PCI 硬件的适当驱动程序。</p>
<p>总结一下,尽管 QEMU 最初是为了虚拟化 guest 操作系统而模拟硬件内存映射,但事实证明,最快的虚拟化还是取决于虚拟硬件:具有特定边际效应的寄存器内存映射的效率没有任何物理硬件能够匹敌。所有的硬件设备虚拟化实际上意味着运行一组特定的汇编指令(guest 操作系统)来处理映射到内存中的地址,以产生一组特定的边际效应,其中 QEMU 仅仅是一个提供内存映射,并模仿在裸机硬件上执行这些 guest 指令时所获得的相同边际效应的用户空间应用程序。</p>
]]></content>
<tags>
<tag>QEMU</tag>
<tag>Translation</tag>
</tags>
</entry>
<entry>
<title>时间顺序</title>
<url>/2016/08/29/%E6%97%B6%E9%97%B4%E9%A1%BA%E5%BA%8F/</url>
<content><![CDATA[<p>广州,一个微热的下午,一个人躲在楼顶的凉棚下,穿着舅舅的旧汗衫,学着 c++,背着 gre,看着闲书,淡金色的阳光融化在天际,杂乱的花坛和菜地,清凉积水下青苔密布,真的有一种忽而盛夏的错觉。</p>
<hr>
<p>读书时,时常因为某些字句触动回忆,竟至情难自已,无法呼吸,不能再阅读下去。</p>
<p>新干线,光是名字就能勾起我美好得令人窒息的回忆……<br>名字,是最短的咒语。</p>
<hr>
<p>暴雨欲来,空气中飘着雨腥味,那种雨水混合着尘土,然后在空气中肆意弥漫的气息,大自然好闲适惬意啊,she just can do whatever she want,not like me。庄子所说的那种自由。很是羡慕啊。</p>
<p>风雨已来,心中躁动难耐。幼稚的灵魂无法找到可以希冀的未来。</p>
<p>我希望我的回忆纯洁、温润如玉。年少的无知、冲动,现在想想就黯然。</p>
<span id="more"></span>
<hr>
<p>下面是这些天,写的一点杂碎东西。<br>I want to write something, as a matter of fact, I DO NOT know what I’m goning to write down.<br>I do know, 我想写下一些东西,无论是古老的伸展的汉字,还是由二十六个字母组成的 colorful 字符,我只想体验书写的感觉。用铅笔尖端滑过干净白纸的锐利多刺;用渐渐钝去的笔锋书写哲理,用形如刀锋的笔触写下回忆。事实上这三种笔锋一直都是水乳交融的,I owe you,you belong to me. 真的很喜欢使用铅笔,时光会风化这清邃浅棕的石墨印记。意识的无规则流动,汪洋无语。</p>
<hr>
<p>很久没有写下韵脚的诗句<br>风卷走象牙塔里我的叹息<br>笔会钝 感觉会粗粝<br>好吧 大学 我恨你<br>也许我应该恨我自己</p>
<hr>
<p>亲爱的,这个日记里面我会写下一些我为人处世之中的一些困扰,当然大都是一些小事,该怎么去处理和避免呢?<br>亲爱的你可以告诉我吗?</p>
<hr>
<p>天空蔚蓝,云朵微澜</p>
<p>天空中的云朵,边缘重叠,光色弥漫,清晰得如同概念。</p>
<hr>
<p>武汉雷鸣骤雨,我从没觉得闪电也可以如此吓人。</p>
<hr>
<p>高二那个刚看完《秒速五厘米》的冬日下午,我坐在阳台上,用日记本盛满阳光。</p>
<hr>
<p>色泽如成熟小麦的金黄马尾、秀发。<br>让我想到…… 嗯,每一位男孩子满脑子一直在想的事。<br>醇如清凉井水的酒液。<br>她湛蓝色双眼衬着神色的波浪金发,映照着身上的淡蓝色礼服。<br>我害怕有一天,我会学到迂腐,用 1 和 0 的符号为你写一首诗。</p>
<p>我希望我能更善用时间,用媲美日光的光线温暖自己。<br>她的发丝轻触我的脸庞,呼出的温暖气息就像羽毛一样轻触我身。</p>
<p>哇,好大只啊,萌死了。<br>听她的呼吸,就像聆听风在林隙间穿梭一样,微弱的细碎响声,像把纸揉碎。<br>很奇怪,我没有经历过那样的情感,但是文字却能让我感受到。</p>
<hr>
<p>生命的千种可能,我的千种名字<br>习惯性地在纸上写下我的名字,写下一种承诺。<br>很奇妙,不知道是这个名字属于我,还是我属于这个名字。<br>这个名字自我出生开始就和我的生命骨血相连,我是别人眼里的这个名字,我支配着这个名字。</p>
<hr>
<p>漫山的秋意落在身上,青春的梧桐绿了又黄。</p>
<hr>
<p>半夜空中飞舞的雪晶,不甚明亮的路灯,疏朗的梧桐,云隙间漏下的月光。美丽一如我初来武大的日子。</p>
<p>弹奏键盘的小男孩</p>
<hr>
<p>帝台在鼓钟之山宴饮百神,还有座山叫高前山,山上的泉水,人称帝台之浆,水质清寒,据说喝了它就不会心痛。</p>
<p>能让我喝一口吗?<br>能让全天下人都喝一口吗?<br>若真有此水,我愿用我的生命换全天下人共饮一口。</p>
<hr>
<p>(上面的文字写成于本科的不同时期。基本按照时间顺序整理。)</p>
]]></content>
<tags>
<tag>chaos</tag>
</tags>
</entry>
<entry>
<title>文采</title>
<url>/2019/04/11/%E6%96%87%E9%87%87/</url>
<content><![CDATA[<p>现在是清晨四点钟<br>十二月已然尾声<br>此刻我写这封给你<br>其实只是想知道你过得好不好<br>我听说你将自己的生活深筑在荒漠中<br>难道你现在真的一无所求了吗<br>多么希望你至少能留住一些值得着恋的东西</p>
<hr>
<p>你出现在我的晨曦、午夜、朝霞和黄昏里,无时不刻,如影随形。我爱你时失去踪影,一想到你便沉入云端、跌落谷底,如火焚烧、涟漪层层。</p>
<p>你在我的指尖、发梢、锁骨和脊梁,呼吸都带着颤栗的不安。清醒时你是微笑的、拘谨的、整齐的文字,癫狂时你是窒息的、失语的、狂热的声音。</p>
<span id="more"></span>
<p>我们无话可说又无所不谈。一开始做爱的时候,我甚至不敢看你的眼睛,总是请求你关灯减少尴尬,疼痛、不适也一言不发。后来等我们真正无话不谈的时候我提起此事,你嗔怪我:“你应该告诉我的”,我说“那时候你还是个完全的陌生人!” 你把我扳过来,“我是个陌生人吗?” 我说“本来就是嘛“。我说我那时大概是到了需要一个亲密关系的阶段了,我和你第三次见面就上了床,那时候我对你的了解大概比我公寓的房东还要少。你拨开我的头发,脸压近过来:“那你就是利用我了?“我说不是,只是我很高兴你正好出现在对的时间。你仍不满意,整个身体都压过来,“那你不喜欢我吗?“</p>
<p>我看着你的眼睛。这时候我已经能看着你的眼睛讲话了,有时候不讲话也可以。最开始的时候你也避开我的目光,后来偶尔目光接触就会笑,如今再发现我在看你,只会伸手把我揽在怀里,或是凑过来吻我散发着廉价超市洗发水气味的头发。这一过程进展缓慢却自然,来不及等我思考“两个人都上过床了却连牵手都有些尴尬怎么办”,你已经一跃成为一个称职而温情的恋人,亲吻我的脸颊时湿润得令人心软。</p>
<p>我说我当然喜欢你。你裸着上身,整个重量承在我身上,压得我呼吸都沉重起来。我费力地从你身下抽出手来揽住你的脖颈,我直直地看着你,我说我喜欢你,有时喜欢到失去控制。</p>
<p>你是我所有可怖的、柔情的、诡异的、私密的想象和欲望的具象,在你面前所有羞耻的告白和呓语都可被原谅,不,甚至被你喜爱,被你一再请求,迟疑又欢喜,落地成花。</p>
<p>细密的、无常的、潮汐般的爱要如何量化?Lust or love 是永远的话题,但此时我混为一谈、深陷其中。我无法承认爱你超过任何人,但我真切地爱你,全心、全身、全部时空、全部灵魂。</p>
<hr>
<p>金雀出何所,必出自灵岳。剪断白云根,分破苍岑角。<br>既为之巨砚,遂登于纶阁。水贮见温润,墨发知瀺濯。</p>
<hr>
<p>香雪如海</p>
<hr>
<p>“雨声潺潺,像住在溪边。宁愿天天下雨,以为你是因为下雨不来。”</p>
<p>她爱他们。他们不干涉她,只静静的躺在她血液里,在她死的时候再死一次。</p>
<p>他微红的微笑的脸俯向她,是苦海里长著的一朵赤金莲花。<br>“怎么今天不痛了?因为是你的生日?”他说。<br>他眼睛里闪著兴奋的光,像鱼摆尾一样在她里面荡漾了一下,望着她一笑。他忽然退出,爬到脚头去。<br>“嗳,你在做什麼?”她恐惧的笑着问。他的头发拂在她大腿上,毛毵毵的不知道什么野兽的头。<br>兽在幽暗的岩洞里的一线黄泉就饮,泊泊的用舌头卷起来。她是洞口倒挂着的蝙蝠,深山中藏匿的遗民,被侵犯了,被发现了,无助,无告的,有只动物在小口小口的啜著她的核心。暴露的恐怖揉合在难忍的愿望里:要他回来,马上回来——回到她的怀抱里,回到她眼底。</p>
<hr>
<p>朱利安深沉的思绪迷雾般交织变幻、浮现出复杂的色彩和形状。人的本质,他想道,超越言语可能涵盖的范畴,有着最坚硬和古怪的外形,是逻辑无法解释的存在形式。即便被层层假象包裹,但内里的硬核与生俱来,只在生死关头才显露无遗。这个层次上,每个人都是独一无二的。朱利安不由得想到包裹杰罗姆的重重迷雾。眼看着他不断成熟、现在要承担沉重的责任,朱利安内心却产生了强烈的不安。他深深自问,杰罗姆身上延续了自己的影子吗?还是说,自己对他的了解从未触及实质、不过是种自以为是?</p>
<p>对面的读心难以忍受旅途的枯燥,不时把眼光投向静坐的朱利安,流露出嫉炉和憎恶的表情。朱利安对他的存在毫不介意,沉浸在反覆的思绪中。随着年龄增长,不知从何时开始,他迷上了倾听时间的脚步声,如同体味飞速坠向深渊所带来的恐惧和快感。朱利安以年轻人不能理解的沉稳思考着过去种种,此时另一节车厢里发生的事他闭着眼都能猜到。但愿杰罗姆不要被短暂的幸福冲昏头脑。一想到自己的过去,朱利安的心像注满滚烫的铅水:爱情的要价太高了!</p>
<hr>
<p>她们两人真是幸福。像我这种混蛋夹在她们两人之间,总有一天会毁了她们。低调的幸福。一对好母女。啊,倘若上天肯聆听我这种人的祈祷,我祈求您赐给她们幸福,就算一生只有那么一次也好。</p>
<p>天使在空中飞舞,奉了神灵的旨意,翅膀消失,降落伞似的飘落到了世界的每一个角落。我飘落到北国皑皑的白雪之上,你飘落到南国的蜜橘田里,而这几个少年,则飘落到了上野公园里。其区别就仅此而已。哪怕今后还得度过多少的岁月,少年们啊,毋庸关心容颜,不要抽烟,除了节日之外也别喝酒,为那些个性格内向、稍有姿色的姑娘们倾心钟情吧。</p>
<p>天使在天空中飞舞。听从神的意志,天使隐去翅膀,宛如降落伞一般,飘落到世界的各个角落。我飘落在北国的雪原上,你飘落在南国的柑橘地里。而这群少年则飘落在了上野公园。差别仅此而已。少年们啊,从今以后,无论你们如何长大,都不要抽烟,也不要喝酒,除非逢年过节。而且,要持之以恒地去爱一个姑娘,一个腼腆而又有点臭美的姑娘。</p>
<hr>
<p>我不记得是谁曾经建议过,为了使灵魂宁静,一个人每天要做两件他不喜欢的事。</p>
<hr>
<p>“目击众神死亡的草原上野花一片,远在远方的风比远方更远,我的琴声呜咽,泪水全无,我把这远方的远归还草原。”</p>
<hr>
<p>她们十五岁的时候,到德国德累斯顿学习音乐。她们在那里过的是快活的日子。她们无拘无束地生活在学生中间,她们和男子们争论着哲学、社会学和艺术上的种种问题。她们的学识并不下于男子;因为是女子,所以更胜于他们了。强壮的青年男子们,带着六弦琴和她们到林中漫游。她们歌唱着,歌喉动人的青年们,在旷野间,在清晨的林中奔窜,自由地为所欲为,尤其是自由地谈所欲谈。最要紧的还是谈话,热情的谈话,爱情不过是件小小的陪衬品。</p>
<p>希尔达和康士丹斯婉妹俩,都曾在十八岁的时候初试爱情。那些热情地和她们交谈,欢快地和她们歌唱,自由自在地和她们在林中野宿的男子们,不用说都欲望勃勃地想更进一步。她们起初是踌躇着;但是爱情这问题已经过许多的讨论,而且被认为是最重要的东西了,况且男子们又是这样低声下气地央求。为什么一个少女不能以身相就,象一个王后似的赐予恩惠呢?</p>
<p>于是她们都赐身于平素最微妙、最亲密在一起讨论的男子了。辩论是重要的事情,恋爱和性交不过是一种原始的本能;一种反应,事后,她们对于对手的爱情冷淡了,而且有点憎很他们的倾向,仿佛他们侵犯了她们的秘密和自由似的。因为一个少女的尊严,和她的生存意义,全在获得绝对的、完全的、纯粹的、高尚的自由。要不是摆脱了从前的污秽的两性关系和可耻的主奴状态,一个少女的生命还有什么意义。</p>
<p>无论人怎样感情用事,性爱总是各种最古老、最宿秽的结合和从属状态之一。歌颂性爱的诗人们大都是男子。女子们一向就知道有更好更高尚的东西。现在她们知之更确了。一个人的美丽纯洁的自由,是比任何性爱都可爱的。不过男子对于这点的看法太落后了,他们象狗似的坚要性的满足。</p>
<p>可是女人不得不退让,男子是像孩子般的嘴馋的,他要什么女人便得给什么,否则他便孩子似的讨厌起来,暴躁起来把好事弄糟。但是女人可以顺从男子,而不退让她内在的、自由的自我。那些高谈性爱的诗人和其他的人好象不大注意到这点。一个女人是可以有个男子,而不真正委身,让他支配的。反之,她可以利用这性爱去支配他。在性交的时候,她自己忍持着,让男子尽先尽情地发泄完了,然而她便可以把性交延长,而把他当作工具去满足她自己的性欲。</p>
<p>当大战爆发,她们急忙回家的时候,姐妹俩都有了爱情的经验了。她们所以恋爱,全是因为对手是可以亲切地、热烈地谈心的男子。和真正聪明的青年男子,一点钟又一点钟地,一天又一天地,热情地谈话,这种惊人的、深刻的、意想不到的美妙,是她们在经验以前所不知道的,天国的诺言: “您将有可以谈心的男子。”还没有吐露,而这奇妙的诺言却在她们明白其意义之前实现了。</p>
<p>在这些生动的、毫无隐讳的、亲密的谈心过后,性行为成为不可避免的了,那只好忍受。那象是一章的结尾,它本身也是令人情热的;那是肉体深处的一种奇特的、美妙的震颤,最后是一种自我决定的痉挛。宛如最后—个奋激的宇,和一段文字后一行表示题意中断的小点子一样。</p>
<p>这姊妹俩在性的快感中,几乎在男性的奇异的权力下面屈服了。但是很快她们便自拨了,把性的快感看作一种感觉,而保持了她们的自由。至于她们的情人呢,因为感激她们所赐与的性的满足,便把灵魂交给她们。但是不久,他们又有点觉得得不偿失了。康妮的男子开始有点负气的样子,希尔达的对手也渐渐态度轻蔑起来。但是男子们就是这样的;忘恩负义而永不满足!你要他们的时候,他们憎恨你,因为你要他们。你不睬他们的时候,他们还是憎恨你,因为旁的什么理由。或者毫无理由。他们是不知足的孩子,无论得到什么,无论女子怎样,都不满意的。</p>
<hr>
<p>我从未写诗<br>只是上帝在我的骨节中<br>踩踏出音阶</p>
<hr>
<p>山中·夜</p>
<p>夜半,群山只剩下轮廓<br>深刻了布谷的叫声<br>清风化成水,透过身体<br>留一注沁凉<br>稀释浓重的色泽<br>我站在天地中执笔<br>调和梦里与梦外<br>早晨推开窗<br>便碰了一鼻子绿</p>
<hr>
<p>绿的肌肉,绿的头发,还有银子般沁凉的眼睛。</p>
<p>绿</p>
<p>天空一色苹果绿,<br>天空是阳光下举着的绿色美酒,<br>月亮是其中一片金色的花瓣</p>
<p>她睁开她的眼睛,绿莹莹地<br>眼波闪耀,象未绽的花蕾一般纯,<br>第一次,此刻第一次为人瞥见</p>
<p>裘小龙 译</p>
<p>绿</p>
<p>曙光是苹果绿,<br>天空是绿酒在阳光中举起,<br>月亮是其间的一瓣金玉。</p>
<p>她张开眼,绿芒<br>四射,明亮如花<br>初绽,首次展放。</p>
<p>非马 译</p>
<hr>
<p>站在下风的方向,可以嗅出树叶,满林子树叶散播的死讯,以及整个中西部成熟后的体香。中西部的深秋,是一场弥月不息的野火,从浅黄到血红到暗赭到沉郁郁的浓栗,从爱荷华一直烧到俄亥俄,夜以继日日以继夜地维持好几十郡的灿烂。</p>
<hr>
<p>“我们喝的咖啡都是如夜晚般漆黑,像罪恶一样甜腻。”</p>
<p>永远不要对上厕所、吃东西,或者闭上眼睛打半小时瞌睡的机会说‘不’。</p>
<p>“喂,胡因还是穆因,随便什么名字都好,喂,你!”<br>黑鸟转过身,脑袋怀疑地偏在一侧,闪闪发光的眼珠子打量着他。<br>“说‘我下次再也不这样做了’,说!”影子说。<br>“日你妈。”乌鸦说。一人一鸟一起穿过树林,它再也没说一个字。</p>
<p>“不是那个原因。女人能拯救她们的男人。而男人——像他这样的男人——他们的女人一旦死掉,他们也不会再活很长时间了。你会看到的。用不了多久,他开始变得神情恍惚,熟悉的一切都随着她的离开而离开。他开始对生命感到厌倦,整个人憔悴下去,他放弃对生的追求,然后,他死了。最后夺去他生命的也许是肺炎,也许是癌,或许是心脏停止跳动。等你上了年纪,所有的激情斗志都离你而去之后,你的生命也就结束了。”</p>
<p>没有人是一座孤岛,多恩这样说过。但是他错了。如果我们不是孤岛,我们就会迷失自我,溺死在彼此的悲哀中。我们彼此隔绝孤立,隔绝于他人的悲哀之外。这是自我保护的天性。我们是一座座孤岛,其形状被所有故事一遍遍地反复描绘。孤岛的形状是不会改变的:一个人出生、长大,然后,因为这种或那种原因,死了。好了,其余细节你可以用你自己的经历来填充。你的故事和其他人的故事一样,没有任何独创内容,但也和其他人的人生一样独一无二。生活就像雪花,每个人的人生都是不同形状的雪花;生活就像豆荚中的豆子(你有没有见过豆荚中的豆子?我是说真正仔细地观察它们?近距离观察一分钟之后,你绝对不会把一颗豆子混同于另外一颗豆子),看似相同,但每一个都是独一无二的。<br>如果没有个体的存在,我们看见的只能是总体数字:死亡一千人,死亡十万人,“伤亡人数达到一百万”。但有了活生生的个体,统计数据就变成了真实存在的人——但这同样是谎言。数字仍旧是麻木的,没有任何意义,哪怕人们会因为它们而感到痛苦。看这个孩子吧,腹部肿胀,苍蝇叮满他的眼角,他瘦得皮包骨头。但是,有了这些,你就能知道他的名字、他的年龄、他的梦想和他的恐惧吗?你就能了解他的内心吗?如果你可以,那就让我们再对他的姐姐来一番解剖。此刻她就躺在他身后灼热的土地上,身体歪扭、肿胀。好吧,你同样能感受到她的内心。但除了这两姐弟之外,还有上千个孩子成为饥馑受害者,上千个孩子即将成为苍蝇们无数蠕动的蛆虫的食物。难道说只有那两姐弟重要,其他所有那些孩子就无足轻重吗?<br>我们画出一道隔离保护线,把他们的痛苦隔离在外,安全地待在属于自己的孤岛上,让他们的痛苦无法伤害我们。他们被我们包裹在一层光滑、安全、充满光泽的隔离膜中,仿佛珍珠一样,他们经历的苦难不会让我们的灵魂深处感受到任何真正的痛苦。<br>虚构的小说允许我们进入他们的大脑,通过他们的眼睛观看外面的世界。在故事中,我们会在作为主角的我们死亡之前停止阅读,或者体验毫无痛苦的“代理死亡”,然后跳出这个故事,在真实的世界中轻轻翻过新的一页,或者合上书,继续属于我们自己的生活。<br>自己的生活——和其他人生既相同、又不同的生活。</p>
<hr>
<p>马骁(Selkie)版:<br>那些强盛的力量和存在可能尚有留存……远古之时的遗存……早在人性之潮涌起前就已消隐的知觉意识……这些觉识在诗歌和传说中偶有闪现,它们常被冠以神祗、怪兽和各种神秘事物之名……</p>
<p>――阿尔杰农・布莱克伍德</p>
<ol>
<li>陶塑中的恐怖</li>
</ol>
<p>我认为,人的思维缺乏将已知事物联系起来的能力,这是世上最仁慈的事了。人类居住在幽暗的海洋中名为无知的小岛上,这海洋浩淼无垠蕴藏无穷秘密,但我们并不应该航行过远,探究太深。迄今为止,各门类的科学都遵循着自己的道路发展,并未给人类带来多少危害;但总有一天这些分立的知识将融合在一起,揭示出世界真实的景象,以及人类可怖的处境――我们或是因这景象而疯狂,或是从光明中逃回那安全静寂的黑暗纪元去。</p>
<p>黄公夏(wwmidia)版:<br>“可以想见,如此超凡的力量或存在未必灭绝殆尽……来自太古时代的幸存者……其自我意识,也许表现为某种形态,自人类出现以前很久就失落无踪……只有诗歌和传说以稍纵即逝的记忆加以临摹,并以林林总总的神祗、怪物和神话生物称之……”</p>
<p>——阿尔杰农•布莱克伍德</p>
<ol>
<li>恐怖泥雕</li>
</ol>
<p>人类无法将脑内所有信息同时关联到一起,我想,这算是世间最大的仁慈了。我们身处恬然宁静的无知之岛,位于黑狞无边的大海中央,也并非注定要驶向远方一探究竟。各种科学在其所属方向竭力前行,虽然至今尚未对我们造成伤害,但终有一天,各不相关的知识彼此碰撞,会揭开那骇人的真相,点明我们在这片可怕光景中所处的方位。这份光明是如此恐怖而致命,我们若不想失心而疯,就必须远远逃开,躲进一个新的黑暗时代去寻找平和与安宁。</p>
<hr>
<p>与瑞娜相处就像在伤口上撒盐,让他想起自己开始在身上刺青时所放弃的一切。</p>
<hr>
<p>竹篱上 停留着 蜻蜓<br>玻璃瓶里插满 小小 森林<br>青春 嫩绿的很 鲜明<br>百叶窗 折射的 光影<br>像有着心事的 一张 表情<br>而你 低头拆信<br>想知道关于我的事情<br>青苔入镜 檐下风铃 摇晃曾经<br>回忆是 一行行无从<br>剪接的风景 爱始终年轻<br>而我听见 下雨的声音<br>想起你用唇语 说爱情<br>幸福也可以 很安静<br>我付出一直 很小心<br>终于听见 下雨的声音<br>于是我的世界 被吵醒<br>就怕情绪红 了眼睛<br>不舍的泪在 彼此的 脸上透明<br>百叶窗 折射的 光影<br>像有着心事的 一张 表情<br>而你 低头拆信<br>想知道关于我的事情<br>爱在过境 缘份不停 谁在担心<br>窗台上 滴落的雨滴<br>轻敲着伤心 凄美而动听<br>而我听见下 雨的声音<br>想起你用 唇语说爱情<br>热恋的时刻 最任性<br>不顾一切的 给约定<br>终于听见 下雨的声音<br>于是我的 世界被吵醒<br>发现你始终 很靠近<br>默默的陪在<br>我身边 态度坚定</p>
<hr>
<p>对爱情的渴望,对知识的追求,对人类苦难不可遏制的同情心,这三种纯洁而无比强烈的激情支配着我的一生。这三种激情,就像飓风一样,在深深的苦海上,肆意地把我吹来吹去,吹到濒临绝望的边缘。</p>
<p>我寻求爱情,首先因为爱情给我带来狂喜,它如此强烈以致我经常愿意为了几小时的欢愉而牺牲生命中的其他一切。我寻求爱情,其次是因为爱情可以解除孤寂一—那是一颗震颤的心,在世界的边缘,俯瞰那冰冷死寂、深不可测的深渊。我寻求爱情,最后是因为在爱情的结合中,我看到圣徒和诗人们所想像的天堂景象的神秘缩影。这就是我所寻求的,虽然它对人生似乎过于美好,然而最终我还是得到了它。</p>
<p>我以同样的热情寻求知识,我渴望了解人的心灵。我渴望知道星星为什么闪闪发光,我试图理解毕达哥拉斯的思想威力,即数字支配着万物流转。这方面我获得一些成就,然而并不多。</p>
<p>爱情和知识,尽其可能地把我引上天堂,但是同情心总把我带回尘世。痛苦的呼唤经常在我心中回荡,饥饿的儿童,被压迫被折磨者,被儿女视为负担的无助的老人以及充满孤寂、贫穷和痛苦的整个世界,都是对人类应有生活的嘲讽。我渴望减轻这些不幸,但是我无能为力,而且我自己也深受其害。<br>这就是我的一生,我觉得值得为它活着。如果有机会的话,我还乐意再活一次。</p>
<p>爱之于我,不是肌肤之亲,不是一蔬一饭,它是一种不死的欲望,是颓败生活中的英雄梦想。</p>
<p>两样东西,人们越是经常持久对之凝神思索,它们就越是使内心充满常新而日增的惊奇和敬畏:我头上的星空和我心中的道德律。</p>
<p>所有由这些感受(指恋爱)而得到的美好和甜蜜,都只是在一开始才具有其全部的强烈力量,但是随后就由于共同生活和家务操劳而逐渐变得日益迟钝,这时它就退化成为互相信赖的爱情;而这里面的伟大艺术就在于仍然能保持这些东西的充分的残余,从而无所谓的态度和厌倦都不会勾销欢愉的全部价值……</p>
<hr>
<p>** 以上均为摘录,抱歉没有精力去一一注明出处。如有侵权,请联系我删掉。 **</p>
]]></content>
</entry>