-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.xml
1320 lines (1281 loc) · 116 KB
/
index.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
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>彦祖,你又来了</title>
<link>https://baiban114.github.io/tablerow.github.io/</link>
<description>Recent content on 彦祖,你又来了</description>
<generator>Hugo -- gohugo.io</generator>
<language>zh-cn</language>
<lastBuildDate>Sat, 09 Apr 2022 18:53:28 +0800</lastBuildDate>
<atom:link href="https://baiban114.github.io/tablerow.github.io/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>网络寻址</title>
<link>https://baiban114.github.io/tablerow.github.io/posts/%E7%BD%91%E7%BB%9C%E5%AF%BB%E5%9D%80/</link>
<pubDate>Sat, 09 Apr 2022 18:53:28 +0800</pubDate>
<guid>https://baiban114.github.io/tablerow.github.io/posts/%E7%BD%91%E7%BB%9C%E5%AF%BB%E5%9D%80/</guid>
<description>彦祖,你又来了 https://baiban114.github.io/tablerow.github.io/posts/%E7%BD%91%E7%BB%9C%E5%AF%BB%E5%9D%80/ -<h1 id="套接字">套接字</h1>
<h1 id="url">URL</h1>
<p><img src="https://img.php.cn/upload/article/000/000/024/5c09e320694b4361.jpg" alt=""></p>
<p>URL(统一资源定位符)是Internet上资源的地址,可以定义为引用地址的字符串,用于指示资源的位置以及用于访问它的协议。</p>
<p>URL是在网络上定位资源的最普遍使用的方式,它提供了一种通过描述其网络位置或主要访问机制来检索物理位置的表示的方法。</p>
<p>URL中描述了协议,该URL用于检索资源和资源名称。如果资源是Web类型资源,则URL在开头包含http / https。同样,如果资源是文件,则以ftp开头,如果资源是电子邮件地址,则以mailto开头。</p>
<p>URL包含以下信息:</p>
<p>1、用于访问资源的协议</p>
<p>2、服务器的位置(无论是通过IP地址还是域名)</p>
<p>3、服务器上的端口号(可选)</p>
<p>4、资源在服务器目录结构中的位置</p>
<p>5、片段标识符(可选)</p>
<ul>
<li><input disabled="" type="checkbox"> 端口是只在http默认80还是?</li>
</ul>
<p>例:https://blog.csdn.net/qq_44915801</p>
<blockquote>
<p>URL中有些字符不能出现,有些是有其他含义,比如'+'。想要再url中使用这些符号,可以使用他们的编码,比如数据库连接的url中设置时区的”GMT+8“可以写作”GMT%2B8“</p>
</blockquote>
<h1 id="uri">URI</h1>
<p>URI(统一资源标识符)是标识逻辑或物理资源的字符序列,与URL类似,也是一串字符。通过使用位置,名称或两者来标识Internet上的资源;它允许统一识别资源。</p>
<p>有两种类型的URI,统一资源标识符(URL)和统一资源名称(URN)。</p>
<p>任何URI的通用形式都是:</p>
<p>scheme:[// [user:password @] host [:port]] [/] path [?查询] [#片段]</p>
<p>Scheme(方案):该方案列出了具体语法和URI的任何相关协议。方案不区分大小写,后跟冒号。理想情况下,URI方案应该在互联网号码分配机构(IANA)注册,但也可以使用非注册方案。</p>
<p>权限组件:权限组件由多个部分组成:可选的身份验证部分,主机(由注册名称或IP地址组成) , 以及可选的端口号。身份验证部分包含用户名和密码,用冒号分隔,后跟at(@)符号。在@之后是主机名,然后是冒号,然后是一个端口号。请务必注意,IPv4地址必须采用点十进制表示法,并且IPv6地址必须括在括号中。</p>
<p>查询(可选):查询包含一串非分层数据。虽然语法没有明确定义,但通常是由分隔符分隔的属性值对序列,例如&符号或分号。查询通过问号与前一部分分开。</p>
<p>片段(可选):片段包含片段标识符,该标识符为辅助资源提供方向。</p>
<p>URL和URI之间的主要区别</p>
<p>URL是统一资源定位器,用于标识资源;URI(统一资源标识符)提供了更简单和可扩展的标识资源的方法。URL是URI的子集</p>
<p>1、作用的区别</p>
<p>URL(统一资源定位符)主要用于链接网页,网页组件或网页上的程序,借助访问方法(http,ftp,mailto等协议)来检索位置资源。</p>
<p>URI(统一资源标识符)用于定义项目的标识,此处单词标识符表示无论使用的方法是什么(URL或URN),都要将一个资源与其他资源区分开来。</p>
<p>2、可以说URL是URI(URL是URI的子集),但URI永远不能是URL。</p>
<p>3、协议区别</p>
<p>URL指定要使用的协议类型,而URI不涉及协议规范。</p>
- https://baiban114.github.io/tablerow.github.io/posts/%E7%BD%91%E7%BB%9C%E5%AF%BB%E5%9D%80/ - </description>
</item>
<item>
<title>设计模式</title>
<link>https://baiban114.github.io/tablerow.github.io/posts/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</link>
<pubDate>Tue, 11 Jan 2022 21:53:15 +0800</pubDate>
<guid>https://baiban114.github.io/tablerow.github.io/posts/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/</guid>
<description>彦祖,你又来了 https://baiban114.github.io/tablerow.github.io/posts/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/ -<p><img src="https://www.runoob.com/wp-content/uploads/2014/08/the-relationship-between-design-patterns.jpg" alt="alt"></p>
<h1 id="设计模式的六大原则">设计模式的六大原则</h1>
<p><strong>1、开闭原则(Open Close Principle)</strong></p>
<p>开闭原则的意思是:<strong>对扩展开放,对修改关闭</strong>。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。</p>
<p><strong>2、里氏代换原则(Liskov Substitution Principle)</strong></p>
<p>里氏代换原则是面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。里氏代换原则是对开闭原则的补充。实现开闭原则的关键步骤就是抽象化,而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。</p>
<p><strong>3、依赖倒转原则(Dependence Inversion Principle)</strong></p>
<p>这个原则是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。</p>
<p><strong>4、接口隔离原则(Interface Segregation Principle)</strong></p>
<p>这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。由此可见,其实设计模式就是从大型软件架构出发、便于升级和维护的软件设计思想,它强调降低依赖,降低耦合。</p>
<p><strong>5、迪米特法则,又称最少知道原则(Demeter Principle)</strong></p>
<p>最少知道原则是指:一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。</p>
<p><strong>6、合成复用原则(Composite Reuse Principle)</strong></p>
<p>合成复用原则是指:尽量使用合成/聚合的方式,而不是使用继承。</p>
<h1 id="创建型模式">创建型模式</h1>
<h2 id="工厂模式factory-pattern">工厂模式(Factory Pattern)</h2>
<p>接口Factory直接对应接口(接口指向实现类)?</p>
<h3 id="抽象工厂模式">抽象工厂模式</h3>
<p>工厂对简单工厂多一层抽象,抽象工厂再多一层</p>
<table>
<thead>
<tr>
<th>模式</th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>简单工厂(非23)</td>
<td>具体工厂,生产产品</td>
</tr>
<tr>
<td>工厂</td>
<td>工厂类有统一接口,生产一类产品(鼠标;颜色)</td>
</tr>
<tr>
<td>抽象工厂</td>
<td>同类工厂每个厂可以生产多个产品,或一个产品可以多种品牌</td>
</tr>
</tbody>
</table>
<p>总之就是接口向上提了一层,类似多级索引或多维数组,多一层就多了一种可能(系统太复杂了加一层?)</p>
<table>
<thead>
<tr>
<th>产品</th>
<th>工厂</th>
</tr>
</thead>
<tbody>
<tr>
<td>耳麦接口</td>
<td>工厂接口内加入生产耳麦方法</td>
</tr>
<tr>
<td>实现戴尔耳麦、惠普耳麦</td>
<td>实现惠普工厂、戴尔工厂,实现生产方法</td>
</tr>
</tbody>
</table>
<p>FactoryProducer不变(若加入新品牌华为就改改)</p>
<p>这菜鸟教程不还是if else么(半恼</p>
<h2 id="单例模式singleton-pattern">单例模式(Singleton Pattern)</h2>
<p>**意图:**保证一个类仅有一个实例,并提供一个访问它的全局访问点。</p>
<p>**主要解决:**一个全局使用的类频繁地创建与销毁。(创建与销毁是有成本的,创建不必要的也会浪费资源)</p>
<p>**关键代码:**构造函数是私有的。在类内部创建一个自己的静态实例。</p>
<h3 id="缺点">缺点</h3>
<p>没有接口,不能继承,与==单一职责原则==(?)冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化</p>
<h3 id="饿汉式">饿汉式</h3>
<p>==定义静态成员变量时就创建对象==</p>
<p>**是否 Lazy 初始化:**否</p>
<p>**是否多线程安全:**是</p>
<p>**实现难度:**易</p>
<p>**描述:**这种方式比较常用,但容易产生垃圾对象。
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
它基于 classloader 机制避免了多线程的同步问题,不过,实例在==类装载==时就实例化,虽然导致类装载的原因有很多种,这时候初始化 instance 显然没有达到 lazy loading 的效果。</p>
<p>在getInstance()方法中不用再考虑实例是否在为空时需要创建,直接返回即可。</p>
<p>###懒汉式</p>
<p>等到调用getInstance()方法的时候再创建对象。</p>
<p>由于创建对象时已进入临界区,如果不加Synchronized锁的话不能线程安全。</p>
<h3 id="双检锁双重校验锁dcl-double-checked-locking">双检锁/双重校验锁(DCL, double-checked locking)</h3>
<blockquote>
<p>why双锁模式下还有高性能?</p>
</blockquote>
<p>1.使用volatile修饰我们的对象引用
2.外部if判断对象是否为null,为null往下执行,不为null直接返回对象
3.使用syn同步进入代码块,使用if判断对象是否为null,为null就创建对象
4.使用volatile修饰成员变量的原因就是防止重排序的问题&mdash;&gt;变量还未完全初始化就被线程B返回了</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-java" data-lang="java"><span style="color:#8b008b;font-weight:bold">public</span> <span style="color:#8b008b;font-weight:bold">class</span> <span style="color:#008b45;font-weight:bold">Singleton</span> {
<span style="color:#8b008b;font-weight:bold">private</span> <span style="color:#8b008b;font-weight:bold">volatile</span> <span style="color:#8b008b;font-weight:bold">static</span> Singleton singleton;
<span style="color:#8b008b;font-weight:bold">private</span> <span style="color:#008b45">Singleton</span> (){}
<span style="color:#8b008b;font-weight:bold">public</span> <span style="color:#8b008b;font-weight:bold">static</span> Singleton <span style="color:#008b45">getSingleton</span>() {
<span style="color:#8b008b;font-weight:bold">if</span> (singleton == <span style="color:#8b008b;font-weight:bold">null</span>) {
<span style="color:#8b008b;font-weight:bold">synchronized</span> (Singleton.<span style="color:#658b00">class</span>) {
<span style="color:#8b008b;font-weight:bold">if</span> (singleton == <span style="color:#8b008b;font-weight:bold">null</span>) {
singleton = <span style="color:#8b008b;font-weight:bold">new</span> Singleton();
}
}
}
<span style="color:#8b008b;font-weight:bold">return</span> singleton;
}
}
</code></pre></div>- https://baiban114.github.io/tablerow.github.io/posts/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/ - </description>
</item>
<item>
<title>应用层网络协议</title>
<link>https://baiban114.github.io/tablerow.github.io/posts/%E5%BA%94%E7%94%A8%E5%B1%82%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/</link>
<pubDate>Sat, 28 Aug 2021 16:16:32 +0800</pubDate>
<guid>https://baiban114.github.io/tablerow.github.io/posts/%E5%BA%94%E7%94%A8%E5%B1%82%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/</guid>
<description>彦祖,你又来了 https://baiban114.github.io/tablerow.github.io/posts/%E5%BA%94%E7%94%A8%E5%B1%82%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/ -<ul>
<li>网络协议:约定的信息传输的格式,如几个字节是消息头、消息头记录什么信息之类的;</li>
<li>c/s架构:不一定是两台计算机,而是两个应用、两个端口</li>
<li>工具:实际使用中不用手动封装协议再发消息,而是直接使用封装的软件、库等实现功能。如SSH工具OpenSSH</li>
</ul>
<p><img src="https://gitee.com/tablerows/tianrun/raw/master/imgs/20220306212211.jpg" alt="网络协议"></p>
<h1 id="命令行常用">命令行常用</h1>
<p>一些协议名和命令名一样(或相似)的协议</p>
<h2 id="ssh">SSH</h2>
<p>Secure Shell(SSH 安全外壳协议) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络==协议==。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。通过SSH,可以把所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。</p>
<p>优点:</p>
<ul>
<li>安全!</li>
<li>方便!两台机器间不用输入账号密码就可验证身份!(通过保存在服务器和客户端上的密钥);</li>
</ul>
<p>ssh可以传输文本与二进制文件;</p>
<p>主要应用:</p>
<ul>
<li>远程登录(可免密码)、github仓库操作</li>
<li>文件传输(如hdfs)</li>
</ul>
<h3 id="ssh的安全机制">SSH的安全机制</h3>
<p>SSH之所以能够保证安全,原因在于它采用了==非对称加密技术(RSA)==加密了所有传输的数据。</p>
<p>传统的网络服务程序,如FTP、POP?和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到==中间人==(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。</p>
<p>但并不是说SSH就是绝对安全的,因为它本身提供两种级别的验证方法:</p>
<ul>
<li>第一种级别(基于口令的安全验证):只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人攻击”这种方式的攻击。</li>
</ul>
<blockquote>
<p>传统的账号密码验证?</p>
</blockquote>
<ul>
<li>第二种级别(基于密钥的安全验证):你必须为自己创建一对密钥,并把公钥放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下(该服务器上你用的账号)寻找你(客户端)的公钥,然后把它和你发送过来的公钥进行比较。如果两个密钥一致,服务器就用公钥加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私钥在本地解密再把它发送给服务器完成登录。与第一种级别相比,第二种级别不仅加密所有传输的数据,也不需要在网络上传送口令,因此安全性更高,可以有效防止中间人攻击。</li>
</ul>
<p><img src="https://gitee.com/tablerows/tianrun/raw/master/imgs/20210831010042.png" alt="ssh"></p>
<h3 id="使用">使用</h3>
<ul>
<li><input disabled="" type="checkbox"> 有没有命令行传文件的例子?传id的是个专门的命令</li>
</ul>
<p>通常使用的软件工具为OpenSSH</p>
<p>####基于密钥的安全验证-事前准备</p>
<p>常用于免密登录。如果想通过输入密码的方式登录则不需要这步准备。</p>
<p><strong>在本机生成一对密钥(即私钥与公钥):</strong></p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ssh-keygen -t rsa <span style="color:#228b22">#-t表示类型选项,这里采用rsa加密算法</span>
</code></pre></div><p>然后根据提示一步步的按enter键即可(其中有一个提示是要求设置私钥口令passphrase,不设置则为空,这里看心情吧,如果不放心私钥的安全可以设置一下),执行结束以后会在 /home/当前用户 目录下生成一个 .ssh 文件夹,其中包含私钥文件 id_rsa 和公钥文件 id_rsa.pub。(还有known_hosts不知道有用没)
<strong>将公钥复制到远程主机中</strong></p>
<p>使用ssh-copy-id命令将公钥复制到远程主机。ssh-copy-id会将公钥写到远程主机的 ~/ .ssh/authorized_keys文件中</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ssh-copy-id 用户名@ip
</code></pre></div><p>这样以后登录这台远程主机就不用账号密码了~</p>
<h4 id="服务端准备">服务端准备</h4>
<p>centos7和windows默认带有SSH工具;(OpenSSH?)可以用一下命令检查:</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">rpm -qa | grep ssh
</code></pre></div><p>首先确认服务器上的ssh-server是否已经启动了</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ps -e | grep ssh
</code></pre></div><p>SSH默认使用22端口,注意开放端口。</p>
<p>每登录一台新的主机,就会将它添加到已知主机列表。</p>
<h4 id="远程登陆">远程登陆</h4>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ssh 用户名@ip
</code></pre></div><p>口令(密码)级别使用时会提示输入密码;</p>
<p>若不填写用户名,则会默认以当前计算机登录的用户名尝试登录服务器</p>
<p>**退出:**输入logout(linux命令?) 或者exit,或直接关闭终端/进程</p>
<h3 id="拓展github码云上的ssh">拓展:github、码云上的SSH</h3>
<p>可以在网页端操作,为==账户==生成SSH key公钥;除了账户SSH key外,仓库也有key,但只供拉取权限;</p>
<p>毕竟仓库拉可以随便拉,推需要验证身份;</p>
<p>这也是SSH相对于https的优越之处:每次fetch和push时不再需要麻烦地输入账号密码(远程登陆也不需要账号密码了);</p>
<p>##SSL&amp;&amp;TLS</p>
<p>SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层与应用层之间对网络连接进行加密。</p>
<p>为Netscape所研发。</p>
<p>SSL协议位于TCP/IP协议]与各种应用层协议之间,为数据通讯提供安全支持。[SL协议可分为两层:</p>
<ul>
<li>SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。</li>
<li>SSL握手协议SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。</li>
</ul>
<p>功能:</p>
<p>1)认证用户和服务器,确保数据发送到正确的客户机和服务器;</p>
<p>2)加密数据以防止数据中途被窃取;</p>
<p>3)维护数据的完整性,确保数据在传输过程中不被改变。</p>
<ul>
<li><input disabled="" type="checkbox"> 流程图之类的在计网书中有吗</li>
</ul>
<h2 id="ftp">FTP</h2>
<ul>
<li>明文传输</li>
</ul>
<p>文件传输协议(File Transfer Protocol,FTP)是用于在<a href="https://baike.baidu.com/item/%E7%BD%91%E7%BB%9C">网络</a>上进行文件传输的一套标准协议。FTP是ARPANet(阿帕网)的标准文件传输协议。</p>
<p>FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。然而, 用户并不真正登录到自己想要存取的计算机上面而成为完全用户, 可用FTP程序访问远程资源, 实现用户往返传输文件、目录管理以及访问电子邮件等等, 即使双方计算机可能配有不同的操作系统和文件存储方式。</p>
<p>FTP 的独特的优势同时也是与其它客户服务器程序最大的不同点就在于它在两台通信的主机之间使用了两条 TCP 连接,一条是数据连接,用于数据传送;另一条是控制连接,用于传送控制信息(命令和响应),这种将命令和数据分开传送的思想大大提高了 FTP 的效率,而其它客户服务器应用程序一般只有一条 TCP 连接。</p>
<h3 id="使用-1">使用</h3>
<blockquote>
<p>centos上自带的ftp工具真他娘的多啊,,反正平时用不到,现在都是用web的http传文件,,了解即可</p>
</blockquote>
<h4 id="ftp-1">ftp</h4>
<ul>
<li><input disabled="" type="checkbox"> 怎么搞服务器?</li>
</ul>
<pre><code>ftp [-dignv][主机名称或IP地址]
</code></pre><p><strong>参数</strong>:</p>
<ul>
<li>-d 详细显示指令执行过程,便于排错或分析程序执行的情形。</li>
<li>-i 关闭互动模式,不询问任何问题。</li>
<li>-g 关闭本地主机文件名称支持特殊字符的扩充特性。</li>
<li>-n 不使用自动登陆。</li>
<li>-v 显示指令执行过程。</li>
</ul>
<p>例如使用ftp命令匿名登录ftp.kernel.org服务器,该服务是Linux 内核的官方服务器,可以使用如下命令:</p>
<pre><code>ftp ftp.kernel.org #发起链接请求
</code></pre><h4 id="ncftp">ncftp</h4>
<p>Centos有自带的ncftp客户端软件,可用于从ftp服务器接受文件。</p>
<p>Linux ncftp命令用于传输文件。</p>
<p>当不指定用户名时,ncftp 命令会自动尝试使用匿名账户anonymous 去连接远程FTP 服 务器,不需要用户输入账号和密码。</p>
<p>语法:</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ncftp [host]
ncftp [ftp://host.name/directory/]
</code></pre></div><ul>
<li><input disabled="" type="checkbox"> 不指定端口?是因为固定端口吗?</li>
<li><input disabled="" type="checkbox"> 有没有上传的方法?</li>
<li><input disabled="" type="checkbox"> 这个似乎只能连接,不能设置为服务器</li>
</ul>
<p>ncftp的命令基本上与ftp相同,例如可以使用&quot;cd&quot;命令切换在FTP服务器中的当前目录,使用&quot;ls&quot;命令列出当前目录内容,使用&quot;get 文件名&quot;命令下载&quot;/pub&quot;目录下的README文件、使用&quot;quit&quot;离开ncftp等</p>
<p>与ftp不同的是,ncftp此时会提示用户是否将FTP服务器保存为书签,以便于下次登录,用户可以进行自定义书签名等操作,如下所示:</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">You have not saved a bookmark <span style="color:#8b008b;font-weight:bold">for</span> this site. <span style="color:#228b22">#离开提示信息 </span>
Would you like to save a bookmark to:
ftp://ftp.kernel.org/pub/
Save? (yes/no) yes <span style="color:#228b22">#确认是否保存 </span>
Enter a name <span style="color:#8b008b;font-weight:bold">for</span> this bookmark, or hit enter <span style="color:#8b008b;font-weight:bold">for</span> <span style="color:#cd5555">&#34;kernel&#34;</span>: kernel <span style="color:#228b22">#输入书签名 </span>
Bookmark <span style="color:#cd5555">&#34;kernel&#34;</span> saved.
</code></pre></div><blockquote>
<p>注:在ncftp的官网有一系列Ncftp软件,覆盖服务端、上传下载等功能</p>
</blockquote>
<h4 id="tftp">tftp</h4>
<p>tftp是简单的文字模式ftp程序,它所使用的指令和FTP类似。</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">tftp [主机名称或IP地址]
</code></pre></div><h4 id="其他相关命令">其他相关命令</h4>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">ftpwho <span style="color:#228b22">#查询当前有哪些用户正在登录FTP服务器</span>
ftpcount <span style="color:#228b22">#查询当前FTP用户的人数 </span>
ftpshut <span style="color:#228b22">#指定时间关闭ftp服务器</span>
</code></pre></div><h2 id="tftp-1">tftp</h2>
<p>TFTP(Trivial File Transfer Protocol,简单<a href="https://baike.baidu.com/item/%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE">文件传输协议</a>)是TCP/IP协议族中的一个用来在客户机与<a href="https://baike.baidu.com/item/%E6%9C%8D%E5%8A%A1%E5%99%A8">服务器</a>之间进行简单文件传输的协议,提供不复杂、开销不大的<a href="https://baike.baidu.com/item/%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93%E6%9C%8D%E5%8A%A1/5389842">文件传输服务</a>。<a href="https://baike.baidu.com/item/%E7%AB%AF%E5%8F%A3%E5%8F%B7/10883658">端口号</a>为69。</p>
<p>此协议设计的时候是进行小<a href="https://baike.baidu.com/item/%E6%96%87%E4%BB%B6%E4%BC%A0%E8%BE%93">文件传输</a>的。因此它不具备通常的FTP的许多功能,它只能从<a href="https://baike.baidu.com/item/%E6%96%87%E4%BB%B6%E6%9C%8D%E5%8A%A1%E5%99%A8">文件服务器</a>上获得或写入文件,不能列出目录,不进行认证,它传输8位数据。传输中有三种模式:netascii,这是8位的ASCII码形式,另一种是octet,这是8位源<a href="https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B">数据类型</a>;最后一种mail已经不再支持,它将返回的数据直接返回给用户而不是保存为文件。</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">tftp [主机名称或IP地址]
</code></pre></div><p><strong>连接后使用命令和ftp类似:</strong></p>
<ul>
<li>connect:连接到远程tftp服务器</li>
<li>mode:文件传输模式</li>
<li>put:上传文件</li>
<li>get:下载文件</li>
<li>quit:退出</li>
<li>verbose:显示详细的处理信息</li>
<li>trace:显示包路径</li>
<li>status:显示当前状态信息</li>
<li>binary:二进制传输模式</li>
<li>ascii:ascii 传送模式</li>
<li>rexmt:设置包传输的超时时间</li>
<li>timeout:设置重传的超时时间</li>
<li>help:帮助信息</li>
<li>? :帮助信息</li>
</ul>
<h2 id="telnet">telnet</h2>
<p>在命令行实现远程登录、控制。远程登录需要用户名和密码,登陆后可以远程执行命令。属于C/S模型的服务</p>
<ul>
<li>明文传输</li>
<li>主要传输字符串(命令与输出),不适合传文件</li>
</ul>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">telnet ip 端口
</code></pre></div><p>可用于测试端口是否连通、占用。</p>
<p><a href="https://baike.baidu.com/item/Telnet%E8%BF%9C%E7%A8%8B%E7%99%BB%E5%BD%95">Telnet远程登录</a>服务分为以下4个过程:</p>
<p>1)本地与远程<a href="https://baike.baidu.com/item/%E4%B8%BB%E6%9C%BA">主机</a>建立连接。该过程实际上是建立一个TCP连接,用户必须知道远程<a href="https://baike.baidu.com/item/%E4%B8%BB%E6%9C%BA">主机</a>的Ip地址或<a href="https://baike.baidu.com/item/%E5%9F%9F%E5%90%8D">域名</a>;</p>
<p>2)将<a href="https://baike.baidu.com/item/%E6%9C%AC%E5%9C%B0%E7%BB%88%E7%AB%AF">本地终端</a>上输入的用户名和口令及以后输入的任何命令或字符以<a href="https://baike.baidu.com/item/NVT">NVT</a>(Net Virtual Terminal)格式传送到远程主机。该过程实际上是从<a href="https://baike.baidu.com/item/%E6%9C%AC%E5%9C%B0%E4%B8%BB%E6%9C%BA">本地主机</a>向远程主机发送一个IP数据包;</p>
<p>3)将远程<a href="https://baike.baidu.com/item/%E4%B8%BB%E6%9C%BA">主机</a>输出的<a href="https://baike.baidu.com/item/NVT">NVT</a>格式的数据转化为本地所接受的格式送回<a href="https://baike.baidu.com/item/%E6%9C%AC%E5%9C%B0%E7%BB%88%E7%AB%AF">本地终端</a>,包括输入命令<a href="https://baike.baidu.com/item/%E5%9B%9E%E6%98%BE">回显</a>和命令执行结果;</p>
<p>4)最后,<a href="https://baike.baidu.com/item/%E6%9C%AC%E5%9C%B0%E7%BB%88%E7%AB%AF">本地终端</a>对远程主机进行撤消连接。该过程是撤销一个TCP连接。</p>
<h3 id="适应异构-nvt">适应异构-NVT</h3>
<p>类似虚拟机的思想。太复杂就加一层!</p>
<p>为了使多个<a href="https://baike.baidu.com/item/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F">操作系统</a>间的Telnet交互操作成为可能,就必须详细了解异构计算机和操作系统。比如,一些<a href="https://baike.baidu.com/item/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F">操作系统</a>需要每行文本用ASCⅡ回车控制符(CR)结束,另一些系统则需要使用换行符(LF),还有一些系统需要用两个字符的序列回车-换行(CR-LF);再比如,大多数操作系统为用户提供了一个中断程序运行的<a href="https://baike.baidu.com/item/%E5%BF%AB%E6%8D%B7%E9%94%AE">快捷键</a>,但这个快捷键在各个系统中有可能不同(一些系统使用CTRL+C,而另一些系统使用ESCAPE)。</p>
<p>为了适应异构环境,Telnet协议定义了数据和命令在Internet上的传输方式,此定义被称作网络<a href="https://baike.baidu.com/item/%E8%99%9A%E6%8B%9F%E7%BB%88%E7%AB%AF">虚拟终端</a><a href="https://baike.baidu.com/item/NVT">NVT</a>(Net Virtual Terminal)。它的应用过程如下: 对于发送的数据:客户机<a href="https://baike.baidu.com/item/%E8%BD%AF%E4%BB%B6">软件</a>把来自用户终端的按键和命令序列转换为NVT格式,并发送到<a href="https://baike.baidu.com/item/%E6%9C%8D%E5%8A%A1%E5%99%A8">服务器</a>,服务器软件将收到的数据和命令,从NVT格式转换为远地系统需要的格式; 对于返回的数据:远地服务器将数据从远地机器的格式转换为NVT格式,而本地客户机将接收到的NVT格式数据再转换为本地的格式。</p>
<p>win2000中的telnet默认仅以NTLM方式验证身份,这就让我们不得不关注NTLM这个东东,那么什么是NTLM呢?</p>
<p>早期的<a href="https://baike.baidu.com/item/SMB%E5%8D%8F%E8%AE%AE/3770892">SMB协议</a>在网络上明文传输口令,后来出现了&quot;LAN Manager Challenge/Response&quot;验证机制,简称LM,它十分简单以至很容易被破解,<a href="https://baike.baidu.com/item/%E5%BE%AE%E8%BD%AF">微软</a>随后提出了WindowsNT挑战/响应验证机制,即NTLM。现在已经有了更新的NTLMv2以及Kerberos验证体系。看看百度telnet</p>
<h2 id="pop">pop</h2>
<ul>
<li>明文传输</li>
</ul>
<h2 id="dns">DNS</h2>
<h1 id="web常用">web常用</h1>
<h2 id="websocket">websocket</h2>
<p>可在单个TCP连接上进行全双工通信,<strong>依赖于</strong>TCP。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。</p>
<p><img src="https://www.runoob.com/wp-content/uploads/2016/03/ws.png" alt=""></p>
<p>连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。</p>
<p><em>注:ws和http兼容,将http改改格式就是ws协议</em>?还是说一开始要用http协议握手,然后 传输 不用http?http握手和tcp握手有啥区别?为什么不直接用tcp握手,难道为了兼容就必须使用http?或是说本来设计的就是要用http?</p>
<ul>
<li>
<p><input disabled="" type="checkbox"> 没有同源限制,客户端可以与任意服务器通信。</p>
</li>
<li>
<p><input disabled="" type="checkbox"> TCP是传输层?,传数据用TCP</p>
</li>
<li>
<p><input disabled="" type="checkbox"> ws的格式又是什么?</p>
<p>注意:虽然HTTP/2也具备服务器推送功能,但HTTP/2 只能推送静态资源,无法推送指定的信息。</p>
</li>
</ul>
<p><img src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ba526e239afd4693b4ce6e21e2de3d7d~tplv-k3u1fbpfcp-zoom-in-crop-mark:1304:0:0:0.awebp?" alt=""></p>
<p><strong>一个典型的Websocket握手请求如下:</strong></p>
<p>客户端请求</p>
<pre><code>GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13
</code></pre><p>服务器回应</p>
<pre><code>HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Location: ws://example.com/
</code></pre><ul>
<li>Connection 必须设置 Upgrade,表示客户端希望连接升级。</li>
<li>Upgrade 字段必须设置 Websocket,表示希望升级到 Websocket 协议。</li>
<li>Sec-WebSocket-Key 是随机的字符串,服务器端会用这些数据来构造出一个 SHA-1 的信息摘要。把 “Sec-WebSocket-Key” 加上一个特殊字符串 “258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后计算 SHA-1 摘要,之后进行 BASE-64 编码,将结果做为 “Sec-WebSocket-Accept” 头的值,返回给客户端。如此操作,可以尽量避免普通 HTTP 请求被误认为 Websocket 协议。</li>
<li>Sec-WebSocket-Version 表示支持的 Websocket 版本。RFC6455 要求使用的版本是 13,之前草案的版本均应当弃用。</li>
<li>Origin 字段是可选的,通常用来表示在浏览器中发起此 Websocket 连接所在的页面,类似于 Referer。但是,与 Referer 不同的是,Origin 只包含了协议和主机名称。</li>
<li>其他一些定义在 HTTP 协议中的字段,如 Cookie 等,也可以在 Websocket 中使用。</li>
</ul>
<p>首先, Sec-WebSocket-Key 是一个 Base64 encode 的值,这个是浏览器随机生成的,告诉服务器:泥煤,不要忽悠我,我要验证你是不是真的是 WebSocket 助理。</p>
<p>然后, Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同 URL 下,不同的服务所需要的协议。简单理解:今晚我要服务A,别搞错啦~</p>
<p>最后, Sec-WebSocket-Version 是告诉服务器所使用的 WebSocket Draft (协议版本),在最初的时候,WebSocket 协议还在 Draft 阶段,各种奇奇怪怪的协议都有,而且还有很多期奇奇怪怪不同的东西,什么 Firefox 和 Chrome 用的不是一个版本之类的,当初 WebSocket 协议太多可是一个大难题。。不过现在还好,已经定下来啦~大家都使用同一个版本: 服务员,我要的是13岁的噢→_→</p>
<p>然后服务器会返回下列东西,表示已经接受到请求, 成功建立 WebSocket 啦!</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-js" data-lang="js">HTTP/<span style="color:#b452cd">1.1</span> <span style="color:#b452cd">101</span> Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
复制代码
</code></pre></div><p>这里开始就是 HTTP 最后负责的区域了,告诉客户,我已经成功切换协议啦~</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-js" data-lang="js">Upgrade: websocket
Connection: Upgrade
复制代码
</code></pre></div><p>依然是固定的,告诉客户端即将升级的是 WebSocket 协议,而不是 mozillasocket,lurnarsocket 或者 shitsocket。</p>
<p>然后, Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key 。 服务器:好啦好啦,知道啦,给你看我的 ID CARD 来证明行了吧。</p>
<p>后面的, Sec-WebSocket-Protocol 则是表示最终使用的协议。</p>
<p>至此,HTTP 已经完成它所有工作了,接下来就是完全按照 WebSocket 协议进行了。</p>
<p>总结,<strong>WebSocket连接的过程是:</strong></p>
<p>首先,客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放WebSocket支持的版本号等信息,如:Upgrade、Connection、WebSocket-Version等;</p>
<p>然后,服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据;</p>
<p>最后,客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信。</p>
<p>WebSocket协议规范将<strong>ws</strong>(WebSocket)和<strong>wss</strong>(WebSocket Secure)定义为两个新的统一资源标识符(URI)方案,分别对应<strong>明文</strong>和<strong>加密</strong>连接。</p>
<blockquote>
<p><strong>节选自wiki</strong>
RFC 6455中规定:it is designed to work over HTTP ports 80 and 443 as well as to support HTTP proxies and intermediaries
(WebSocket通过HTTP端口80和443进行工作,并支持HTTP代理和中介),从而使其与HTTP协议兼容。
为了实现兼容性,WebSocket握手使用HTTP Upgrade头,从HTTP协议更改为WebSocket协议。</p>
<p>WebSocket协议支持Web浏览器(或其他客户端应用程序)与Web服务器之间的交互,具有较低的开销,便于实现客户端与服务器的实时数据传输。
服务器可以通过标准化的方式来实现,而无需客户端首先请求内容,并允许消息在保持连接打开的同时来回传递。
通过这种方式,可以在客户端和服务器之间进行双向持续对话。
通信通过TCP端口80或443完成,这在防火墙阻止非Web网络连接的环境下是有益的。</p>
<p>大多数浏览器都支持该协议。
此外,WebSocket还可以在TCP之上实现消息流。TCP单独处理字节流,没有固有的消息概念。</p>
<ul>
<li><input disabled="" type="checkbox"> 消息是数据包?和流是对立的概念?</li>
</ul>
<p>在WebSocket之前,使用Comet可以实现全双工通信。但是Comet存在TCP握手和HTTP头的开销,因此对于小消息来说效率很低。</p>
</blockquote>
<ul>
<li>常见使用场景:弹幕,网页聊天系统,实时监控(JVM、在线用户、性能等),股票行情推送等</li>
<li>在浏览器控制台可以输入window.socket查看当前浏览器是否支持websocket</li>
</ul>
<p>comet百度百科</p>
<p>Alex Russell(Dojo Toolkit 的项目 Lead)称这种基于 HTTP<a href="https://baike.baidu.com/item/%E9%95%BF%E8%BF%9E%E6%8E%A5">长连接</a>、无须在浏览器端安装插件的“服务器推”技术为“Comet”。目前已经出现了一些成熟的 Comet 应用以及各种开源框架;一些 Web 服务器如 Jetty 也在为支持大量并发的长连接进行了很多改进。关于 Comet 技术最新的发展状况请参考关于 Comet 的 wiki。</p>
<p>下面将介绍两种 Comet 应用的实现模型。</p>
<p>基于 AJAX 的长轮询(long-polling)方式</p>
<p>如 图 1 所示,AJAX 的出现使得 JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP 请求,JavaScript 响应处理函数根据服务器返回的信息对 HTML 页面的显示进行更新。使用 AJAX 实现“<a href="https://baike.baidu.com/item/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8E%A8">服务器推</a>”与传统的 AJAX 应用不同之处在于:</p>
<p>服务器端会阻塞请求直到有数据传递或超时才返回。</p>
<p>客户端JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。</p>
<p>当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。</p>
<p>图 2. 基于长轮询的<a href="https://baike.baidu.com/item/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8E%A8">服务器推</a>模型</p>
<p>一些应用及示例如 “Meebo”, “Pushlet Chat” 都采用了这种长轮询的方式。相对于“<a href="https://baike.baidu.com/item/%E8%BD%AE%E8%AF%A2">轮询</a>”(poll),这种长轮询方式也可以称为“拉”(pull)。因为这种方案相对于 AJAX,具有以下一些优点:请求异步发出;无须安装插件;IE、Mozilla FireFox 都支持 AJAX。</p>
<p>在这种长轮询方式下,客户端是在 XMLHttpRequest 的 readystate 为 4(即数据传输结束)时调用<a href="https://baike.baidu.com/item/%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0">回调函数</a>,进行信息处理。当 readystate 为 4 时,数据传输结束,连接已经关闭。Mozilla Firefox 提供了对 Streaming AJAX 的支持, 即 readystate 为 3 时(数据仍在传输中),客户端可以读取数据,从而无须关闭连接,就能读取处理服务器端返回的信息。IE 在 readystate 为 3 时,不能读取服务器返回的数据,目前 IE 不支持基于 Streaming AJAX。</p>
<p>基于 Iframe 及 htmlfile 的流(streaming)方式</p>
<p>iframe 是很早就存在的一种 HTML 标记, 通过在 HTML 页面里嵌入一个隐蔵帧,然后将这个隐蔵帧的 SRC 属性设为对一个<a href="https://baike.baidu.com/item/%E9%95%BF%E8%BF%9E%E6%8E%A5">长连接</a>的请求,服务器端就能源源不断地往客户端输入数据。</p>
<p><a href="https://baike.baidu.com/pic/comet/10206588/0/f6428f8fc5b5bd9f503d9264?fr=lemma&amp;ct=single"> <img src="https://bkimg.cdn.bcebos.com/pic/9f2f070828381f308c7d0dfca9014c086e06f07b?x-bce-process=image/resize,m_lfit,w_440,limit_1/format,f_auto" alt="img"> </a></p>
<p>图 3. 基于流方式的<a href="https://baike.baidu.com/item/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%8E%A8">服务器推</a>模型</p>
<p>上节提到的 AJAX 方案是在 JavaScript 里处理 XMLHttpRequest 从服务器取回的数据,然后 Javascript 可以很方便的去控制 HTML 页面的显示。同样的思路用在 iframe 方案的客户端,iframe 服务器端并不返回直接显示在页面的数据,而是返回对客户端 Javascript 函数的调用,如“<code>&lt;script type=&quot;text/javascript&quot;&gt;js_func(“data from server ”)&lt;/script&gt;</code>”。服务器端将返回的数据作为客户端JavaScript 函数的<a href="https://baike.baidu.com/item/%E5%8F%82%E6%95%B0%E4%BC%A0%E9%80%92">参数传递</a>;客户端浏览器的 Javascript 引擎在收到服务器返回的 JavaScript 调用时就会去执行代码。</p>
<p>从 图 3 可以看到,每次<a href="https://baike.baidu.com/item/%E6%95%B0%E6%8D%AE%E4%BC%A0%E9%80%81">数据传送</a>不会关闭连接,连接只会在通信出现错误时,或是连接重建时关闭(一些防火墙常被设置为丢弃过长的连接, 服务器端可以设置一个超时时间, 超时后通知客户端重新建立连接,并关闭原来的连接)。</p>
<p>使用 iframe 请求一个<a href="https://baike.baidu.com/item/%E9%95%BF%E8%BF%9E%E6%8E%A5">长连接</a>有一个很明显的不足之处:IE、Morzilla Firefox 下端的进度栏都会显示加载没有完成,而且 IE 上方的图标会不停的转动,表示加载正在进行。Google 的天才们使用一个称为“htmlfile”的 ActiveX 解决了在 IE 中的加载显示问题,并将这种方法用到了 gmail+gtalk 产品中。Alex Russell 在 “What else is burried down in the depth&rsquo;s of Google&rsquo;s amazing JavaScript?”文章中介绍了这种方法。Zeitoun 网站提供的 comet-iframe.tar.gz,封装了一个基于 iframe 和 htmlfile 的 JavaScript comet 对象,支持 IE、Mozilla Firefox 浏览器,可以作为参考。</p>
<h2 id="comet的优缺点">Comet的优缺点</h2>
<p><a href="">编辑</a><a href=""> 播报 </a></p>
<p>优 点: 实时性好(消息延时小);性能好(能支持大量用户)</p>
<p>缺点: 长期占用连接,丧失了无状态高并发的特点。</p>
<h2 id="http">HTTP</h2>
<p>依赖于tcp</p>
<ul>
<li><input disabled="" type="checkbox"> http头什么时候发?和tcp头以及websocket头什么区别?</li>
</ul>
<p><a href="https://www.cnblogs.com/gotodsp/p/6366163.html">https://www.cnblogs.com/gotodsp/p/6366163.html</a></p>
<p>如果是默认消息头名称,消息头格式已经固定,即便输入的大小写有误,也会给你翻译成默认的写法,如果自己定义的,会自动给你翻译成小写,所以传参数的名称都用小写字母即可,否则可能取不到值,</p>
<h3 id="什么是长连接短连接">什么是长连接、短连接?</h3>
<p>在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。</p>
<p>而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-makefile" data-lang="makefile"><span style="color:#008b45">Connection</span>:keep-alive
</code></pre></div><p>在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。</p>
<p>HTTP协议的长连接和短连接,<strong>实质上是TCP协议的长连接和短连接</strong>。(关不关tcp连接的区别,毕竟是用tcp传输的?)</p>
<p>由于浏览器中的页面每次需要全部刷新才能从服务器端获得最新的数据或向服务器传送数据,这样产生的延迟所带来的视觉感受非常糟糕。因此很多的桌面应用为了获得更友好的界面放弃了Web技术,或者采用浏览器的插件技术(ActiveX、Applet、Flash等)。但是浏览器插件技术本身又有许多问题,例如跨平台问题和插件版本兼容性问题。</p>
<p>把 IFrame 嵌在“htmlfile“的 ActiveX 组件中可以解决 IE 的加载显示问题</p>
<p>曾经建议以X开头的是拓展的Header信息,后来懒得管了doge</p>
<h3 id="我见到的http-header信息">我见到的Http Header信息</h3>
<h4 id="代理nginx为例">代理(nginx为例)</h4>
<table>
<thead>
<tr>
<th>key</th>
<th>描述</th>
<th>例子/描述</th>
<th>解释</th>
</tr>
</thead>
<tbody>
<tr>
<td>X-Forwarded-For</td>
<td>表示 HTTP 路过的ip</td>
<td>X-Forwarded-For: clientIP, proxy1IP, proxy2IP</td>
<td>由后一个代理追加前一代理的信息</td>
</tr>
<tr>
<td>Remote Address</td>
<td>当前HTTP请求的源地址</td>
<td>tcp连接必须知道源地址,若伪造则无法收到消息</td>
<td>可用于获取最后一个代理服务器的ip</td>
</tr>
<tr>
<td>X-Real-IP</td>
<td>没啥规定</td>
<td>通常被代理用来表示与它产生 TCP 连接的设备 IP</td>
<td>也就是设置为Remote Address</td>
</tr>
</tbody>
</table>
<p>注:</p>
<ul>
<li>Remote Address 和 代理服务器追加的X-Forwarded-For(前一个代理或请求端)IP通常是一样的,都是向他发起连接请求端的IP
<ul>
<li>尽管在nginx中不是直接将X-Forwarded-For设置为Remote Address,因为需要“追加”而不是覆盖</li>
</ul>
</li>
<li>服务端没必要再追加X-Forwarded-For,,它可以通过Remote Address获取不可伪造的上一个代理的ip</li>
</ul>
<h5 id="对于伪造与隐藏">对于伪造与隐藏:</h5>
<p>如对于真实ip为114.248.238.236的机器发出的请求,(nginx代理一次,设置x-real-ip为Remote Address,X-Forwarded-For追加 )</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">curl http://t1.imququ.com:9009/ -H <span style="color:#cd5555">&#39;X-Forwarded-For: 1.1.1.1&#39;</span> -H <span style="color:#cd5555">&#39;X-Real-IP: 2.2.2.2&#39;</span>
<span style="color:#228b22"># nginx代理后服务端输出</span>
remoteAddress: 127.0.0.1
x-forwarded-for: 1.1.1.1, 114.248.238.236
x-real-ip: 114.248.238.236
</code></pre></div><p><strong>伪造</strong>:可以在发请求时伪造一些header信息,但由于Remote Address 不能伪造,所以x-real-ip和追加的x-forwarded-for是真实ip,之前的部分可以伪造</p>
<p><strong>隐藏</strong>:源ip被隐藏在了x-forwarded-for的一个ip中(如果中间没有被改写或是一开始就伪造的话,且可以主动隐藏),其他信息已经被替换成代理服务器的(我主动配置的)</p>
<p>事实上在这种常用设置下,第一台代理还是知道真实的请求端地址的,服务端可能只知道上一次请求的真实地址;</p>
<p>伪造后,x-forwarded-for是以为前面还有一台机器(1,1,1,1),,</p>
<ul>
<li><input disabled="" type="checkbox"> 那为什么要real ip呢?用偷偷藏起来的自定义ip偷偷保存真实地址么?</li>
</ul>
<p>看来代理是多进行了几次http连接,作为中介,请求端和服务端的http连接都没有联系对方。</p>
<p>这也是为什么在nginx上配置跨域比较简单,和请求端沟通始终都是统一个源(代理),他从不同的源获取东西再统一返回。</p>
<h4 id="升级为websocket">升级为websocket</h4>
<table>
<thead>
<tr>
<th>key</th>
<th>描述</th>
<th>例子/描述</th>
<th>解释/补充</th>
</tr>
</thead>
<tbody>
<tr>
<td>Upgrade</td>
<td></td>
<td>websocket</td>
<td></td>
</tr>
<tr>
<td>Connection</td>
<td></td>
<td>Upgrade/keep-alive/close</td>
<td>1.1版本出现,也可用于保持长连接</td>
</tr>
</tbody>
</table>
<blockquote>
<p>据说是为了向下兼容,HTTP1.1才正式规范Connection头,之前的协议无法升级;如果是HTTP1.0,不认识Conncetion头,就不升级?</p>
</blockquote>
<p>linux系统中有一个httpd程序,是Apache HTTP服务器程序。直接执行程序可启动服务器的服务,在没有自己安装web服务器软件时可以临时用一下。</p>
<h1 id="邮件常用">邮件常用</h1>
<p>POP\IMAP负责收,SMTP负责发</p>
<p>平时我们主要使用网页邮箱,而通过开启IMAP/SMTP服务或POP3/SMTP服务,就可以在其他客户端收发该邮箱的邮件</p>
<p>在网页邮箱的设置中可以看到POP\IMAP\SMTP的服务器地址(也可以直接百度),将其配置到客户端软件即可(如电脑或手机自带的“邮件”应用)。</p>
<p>邮箱协议也可以使用SSL加密</p>
<p>腾讯企业邮箱:</p>
<p>POP3/SMTP协议</p>
<p>接收邮件服务器:pop.exmail.qq.com (端口 110),使用SSL,端口号995
发送邮件服务器:smtp.exmail.qq.com (端口 25),使用SSL,端口号465</p>
<p>IMAP协议</p>
<p>接收邮件服务器:imap.exmail.qq.com (端口 143),使用SSL,端口号993
发送邮件服务器:smtp.exmail.qq.com (端口 25),使用SSL,端口号465</p>
<p>我们学校教育邮箱用的腾讯企业邮箱,默认开启了IMAP/SMTP服务,将服务区和端口设置到windows的邮件应用即可使用。</p>
<p><strong>IMAP是什么?</strong>
IMAP,即<strong>I</strong>nternet <strong>M</strong>essage <strong>A</strong>ccess <strong>P</strong>rotocol(互联网邮件访问协议),您可以通过这种协议从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP类似,都是一种邮件获取协议。</p>
<p><strong>IMAP和POP有什么区别?</strong></p>
<p>POP允许电子邮件客户端下载服务器上的邮件,但是您在电子邮件客户端的操作(如:移动邮件、标记已读等),这是不会反馈到服务器上的,比如:您通过电子邮件客户端收取了QQ邮箱中的3封邮件并移动到了其他文件夹,这些移动动作是不会反馈到服务器上的,也就是说,QQ邮箱服务器上的这些邮件是没有同时被移动的 。但是IMAP就不同了,电子邮件客户端的操作都会反馈到服务器上,您对邮件进行的操作(如:移动邮件、标记已读等),服务器上的邮件也会做相应的动作。也就是说,IMAP是“双向”的。</p>
<p>同时,IMAP可以只下载邮件的主题,只有当您真正需要的时候,才会下载邮件的所有内容。</p>
<h1 id="拓展">拓展</h1>
<h2 id="浏览器可以运行的协议">浏览器可以运行的协议</h2>
<p>http/https</p>
<p>file</p>
<p>ftp</p>
<h2 id="其他命令行网络工具无对应协议">其他命令行网络工具/无对应协议</h2>
<p>有些在命令行常用的网络工具,使用的协议和命令名没有关联。</p>
<h3 id="curl">curl</h3>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">curl ip:端口
</code></pre></div><p>可用于测试端口是否联通</p>
<h3 id="ping">ping</h3>
<p>Linux ping 命令用于检测主机。</p>
<p>执行 ping 指令会使用 ICMP 传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。</p>
<h1 id="平行的形容词">平行的形容词</h1>
<table>
<thead>
<tr>
<th></th>
<th></th>
</tr>
</thead>
<tbody>
<tr>
<td>实时</td>
<td></td>
</tr>
<tr>
<td>双工?(通信方式?)</td>
<td></td>
</tr>
<tr>
<td>有状态?</td>
<td></td>
</tr>
<tr>
<td>连接?</td>
<td></td>
</tr>
</tbody>
</table>
<h3 id="heading"></h3>
- https://baiban114.github.io/tablerow.github.io/posts/%E5%BA%94%E7%94%A8%E5%B1%82%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/ - </description>
</item>
<item>
<title>管理计算机上的软件</title>
<link>https://baiban114.github.io/tablerow.github.io/posts/%E7%AE%A1%E7%90%86%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8A%E7%9A%84%E8%BD%AF%E4%BB%B6/</link>
<pubDate>Mon, 23 Aug 2021 16:45:08 +0800</pubDate>
<guid>https://baiban114.github.io/tablerow.github.io/posts/%E7%AE%A1%E7%90%86%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8A%E7%9A%84%E8%BD%AF%E4%BB%B6/</guid>
<description>彦祖,你又来了 https://baiban114.github.io/tablerow.github.io/posts/%E7%AE%A1%E7%90%86%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8A%E7%9A%84%E8%BD%AF%E4%BB%B6/ -<h1 id="前置知识">前置知识</h1>
<p>代码+文档(bushi)</p>
<p>装在计算机上的软件,在硬盘上是静态的一系列代码、文件的集合,运行时成为动态的进程;</p>
<p>但想要保证软件正常运行,需要环境+软件+库/依赖相匹配才行</p>
<ul>
<li>环境:
<ul>
<li>操作系统:基本环境,也是可执行文件的直接运行环境;</li>
<li>运行环境:如java字节码文件需要运行在jvm里,解释型语言要运行在有解释器的操作系统上,js要在浏览器or Node.js运行一样;似乎都是非纯编译运行的语言需要;在自己的环境中运行,就不需要转换成操作系统的可执行文件;</li>
<li>java、python等环境安装后,需要将环境的位置添加到操作系统的PATH环境变量中,以确保操作系统能找到他们。</li>
</ul>
</li>
<li>软件
<ul>
<li>比程序要大一点的概念,也是一系列指令;</li>
<li>因此软件最终都会成为机器能看懂的语言,在硬盘上不论是被编译成的可执行文件,还是脚本语言文件(由解释器读入内存一行就解释一行?可能要看看py和js的原理才懂),在cpu接触前,都会成为机器语言;</li>
</ul>
</li>
<li>库
<ul>
<li>自己的库,如C语言#include的库;Java中的jre就是jvm+基础类库</li>
<li>系统提供的动态链接库,如win下的dll、linux的lib文件夹内容;</li>
</ul>
</li>
</ul>
<h1 id="软件安装方式">软件安装方式</h1>
<h2 id="源码编译">源码编译</h2>
<p>下载源代码(如redis使用C语言开发、nginx基于c++开发),然后使用对应版本的编译器(如gcc)在源码文件夹下编译,最终形成可执行文件。为了方便管理,通常会用到项目管理工具如make</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">./configure
make &amp;&amp; make install
</code></pre></div><blockquote>
<p>make 系列命令是GNU下的自由软件,有gcc编译、打包、管理项目(C语言为主,其他语言要调用其他编译/解释器),和maven类似属于项目管理工具(不知道会不会从网上下载依赖)</p>
<p>GCC是C/C++语言的编译工具,Make是增量式(编译)批处理工具,CMake是Make脚本生成工具。 在现代C/C++项目的构建中,它们的关系如下。</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-C" data-lang="C"> cmake make gcc
CMakelist.txt -----&gt; Makefile ----&gt; Cmds ---&gt; Binary
</code></pre></div></blockquote>
<p>在不同cpu架构下源码包和编译器会有区别,因为底层的指令集不同;</p>
<p>安装流程和C语言源文件运行流程类似</p>
<h2 id="安装包">安装包</h2>
<p>msi\exe\rpm\ipk\apk\aab;</p>
<p>安装包也是由源码编译而成的二进制文件;但已经过官方封装,开箱即用。</p>
<p>单独安装安装包可能会遇到安装包之间的依赖问题。</p>
<h2 id="包管理器">包管理器</h2>
<p>应用商店等也是类似的角色,在官方的服务器上统一管理安装包;</p>
<p>apt、yum、rpm、pip、winget等,从源(保管安装包的服务器)上下载安装软件或安装包;可以通过写配置文件等操作来指定多个源;</p>
<p>一些包管理器可以帮助解决依赖等问题。</p>
<blockquote>
<p>除了软件下载外,类似的操作还有maven、nodejs、docker等,对库、包进行管理(包括下载),同时有些具有项目管理功能</p>
</blockquote>
<h3 id="npm">npm</h3>
<p>npm 是世界上最大的软件注册表,每星期大约有 30 亿次的下载量,包含超过 600000 个 <em>包(package)</em> (即,代码模块)。来自各大洲的开源软件开发者使用 npm 互相分享和借鉴。包的结构使您能够轻松跟踪依赖项和版本。</p>
<p>npm 由三个独立的部分组成:</p>
<ul>
<li>网站</li>
<li>注册表(registry)</li>
<li>命令行工具 (CLI)</li>
</ul>
<h3 id="yarn">yarn</h3>
<p>Yarn 是一个软件包管理器,还可以作为项目管理工具。</p>
<p>代码通过 <strong>软件包(package)</strong> 的方式被共享。一个软件包里包含了所有需要共享的代码,以及一个描述软件包信息的文件 <code>package.json</code> (叫做 <strong>清单</strong>)。</p>
<p><a href="https://www.yarnpkg.cn/getting-started/install">2 - 安装 | Yarn - JavaScript 软件包管理器 | Yarn 中文文档 - Yarn 中文网 (yarnpkg.cn)</a></p>
<p>用lockfile隔离单个项目的依赖环境;</p>
<p>先全局安装yarn的 <strong>二进制文件</strong></p>
<h2 id="安装脚本">安装脚本</h2>
<p>如docker,网上有提供脚本直接安装;</p>
<h2 id="可执行文件脚本文件">可执行文件/脚本文件</h2>
<p>可执行文件 (executable file) 指的是可以由<strong>操作系统进行加载执行的文件</strong>。在不同的操作系统环境下,可执行程序的呈现方式不一样。</p>
<p>有时被称为“绿色免安装”版,“安装包”其实就是全部程序压缩一下;这种软件安装时不去注册表注册。</p>
<p>如windows下的exe;</p>
<p>任何文件都是有数字(编码)组成的,即使是文本在物理上也是以二进制存储的;在一些编辑器下,exe也可以直接被文本编辑器以字符的形式查看。图片、视频也是二进制文件,但不是可执行文件。</p>
<p>大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是<strong>逻辑上</strong>的。这两者只是在编码层次上有差异。</p>
<p>可执行文件就是操作系统可以执行的、不需要指定其他软件来执行的文件。一个文件是不是可执行文件要看操作系统的定义。</p>
<p>pyInstaller可以把py程序打包成exe程序,然后在没有安装python环境的电脑上能运行啦!</p>
<p>But why MC还需要装java,而不是打包成exe?java应该可以打包吧</p>
<h1 id="软件卸载">软件卸载</h1>
<h2 id="管理器控制面板">管理器/控制面板</h2>
<ul>
<li>使用包管理器的命令卸载</li>
<li>windows的控制面板:操作系统找到对应的卸载程序并运行;
<ul>
<li>这样似乎对exe直接运行的软件不行;是因为他们没去注册表报道吗?</li>
</ul>
</li>
</ul>
<h2 id="软件官方提供卸载程序">软件官方提供卸载程序</h2>
<p>windows下比较常见,linux可能会提供卸载脚本。</p>
<h2 id="可执行文件">可执行文件</h2>
<p>直接删除即可;注意不要被快捷方式迷惑了。可以对快捷方式右键-&gt;打开文件位置找到真正的文件所在处。</p>
<h1 id="软件运行">软件运行</h1>
<p>有些会在内存被更改</p>
<p>守护进程:占端口号,后台运行</p>
<p>阻塞进程:会一直占用当前进程/线程</p>
<h1 id="附录">附录</h1>
<h2 id="附录1注册表">附录1:注册表</h2>
<h2 id="附录2安装包选择">附录2:安装包选择</h2>
<p>x86:适用于字长为32位的计算机;因为在386年代所以叫x86;</p>
<p>x86_64、arm64:适用于32位和64位的计算机;只是叫法不同(intel和amd);</p>
<p>el7:centos7</p>
<h2 id="附录3为什么不要安装在中文路径下">附录3:为什么不要安装在中文路径下?</h2>
<p>安装目录不要有<strong>中文</strong>或<strong>空格</strong>。同一个中文字符在不同字符集下为不同的数值,但大多字符集的前128个字符通常和ASCII字符集保持一致,为了统一且省事,很多软件安装时都不要在中文路径下。</p>
- https://baiban114.github.io/tablerow.github.io/posts/%E7%AE%A1%E7%90%86%E8%AE%A1%E7%AE%97%E6%9C%BA%E4%B8%8A%E7%9A%84%E8%BD%AF%E4%BB%B6/ - </description>
</item>
<item>
<title>文件系统</title>
<link>https://baiban114.github.io/tablerow.github.io/posts/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/</link>
<pubDate>Thu, 05 Aug 2021 17:07:35 +0800</pubDate>
<guid>https://baiban114.github.io/tablerow.github.io/posts/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/</guid>
<description>彦祖,你又来了 https://baiban114.github.io/tablerow.github.io/posts/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/ -<blockquote>
<p>文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件机构称为文件管理系统,简称文件系统。</p>
<p>文件系统由三部分组成:文件系统的接口,对对象操作和管理的软件集合,对象及属性。从系统角度来看,文件系统是对文件存储设备的空间进行组织和分配,负责文件存储并对存入的文件进行保护和检索的系统。具体地说,它负责为用户建立文件,存入、读出、修改、转储文件,控制文件的存取,当用户不再使用时撤销文件等。</p>
</blockquote>
<h1 id="ufs联合文件系统">UFS:联合文件系统</h1>
<p>Docker使用的系统</p>
<p>UnionFs(联合文件系统):Union文件系统(UnionFs)是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下( unite several directories into a single virtual filesystem)。Union文件系统是 Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。</p>
<h1 id="hdfs">HDFS</h1>
<p>Hadoop生态系统中的分布式文件系统</p>
- https://baiban114.github.io/tablerow.github.io/posts/%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/ - </description>
</item>
<item>
<title>Hugo博客搭建经验</title>
<link>https://baiban114.github.io/tablerow.github.io/posts/hugo%E4%BD%BF%E7%94%A8%E7%BB%8F%E9%AA%8C/</link>
<pubDate>Mon, 26 Jul 2021 16:47:18 +0800</pubDate>
<guid>https://baiban114.github.io/tablerow.github.io/posts/hugo%E4%BD%BF%E7%94%A8%E7%BB%8F%E9%AA%8C/</guid>
<description>彦祖,你又来了 https://baiban114.github.io/tablerow.github.io/posts/hugo%E4%BD%BF%E7%94%A8%E7%BB%8F%E9%AA%8C/ -<h1 id="写在前面">写在前面</h1>
<p> hugo最强使用技巧:<del>别用hugo</del> (狗头)</p>
<p> 这个世界上的静态网站生成器至少有<a href="https://jamstack.org/generators/">333</a>个,先从我的角度说说其他静态网站生成器的优点:</p>
<ul>
<li>
<p>VuePress:基于vue构建,可以顺便练习vue,减小web开发者的学习成本;</p>
<ul>
<li>
<p><input checked="" disabled="" type="checkbox"> 中文文档</p>
</li>
<li>
<p><input checked="" disabled="" type="checkbox"> 主题丰富(在github主页有)</p>
</li>
<li>
<p>插件挺丰富,不知道常用的有没,但是大丈夫!因为是Vue,自己集成功能很方便!</p>
</li>
<li>
<p>文档说是单页应用,解决路由时音乐播放器重新加载播放的问题应该简单一些;</p>
</li>
</ul>
</li>
<li>
<p>Hexo:由中国台湾人创建,咱们用的人多所以网上教程丰富;</p>
<ul>
<li>[√]中文文档</li>
<li>[√]主题丰富</li>
<li>[√]插件齐全(几乎不用敲代码,npm上都一堆插件)</li>
<li>多个静态页面</li>
</ul>
</li>
<li>
<p>WordPress:嗯。。和hugo都是老外搞的,风格半斤八两,都用了&quot;shortcode&quot;这种奇怪的东西(类似模板引擎或vue的组件,但还需要额外的学习成本),支持OneNote上传笔记(鸡肋);可以和PHP配套使用;</p>
<p>然后。。。hugo的优点可能是快?我不知道。。。<del>可我是男人</del>可如果开发速度慢、学习成本高不还相当于慢了。。中文文档还相当于没有!</p>
<p>如果重命名content下的md文件,hugo编译时不会把删掉该替换的文件。不知道其他工具怎么样。</p>
<p>当然所有工具都是没有上限的!只是==碰壁次数与资料多少、学习成本==之类的区别!</p>
</li>
</ul>
<h1 id="快速开始">快速开始</h1>
<p>中文文档少有的中文233:</p>
<p><a href="https://www.gohugo.cn/getting-started/quick-start/">快速入门 | Hugo 中文网 (gohugo.cn)</a></p>
<p>其中下载主题这步可以自己选,主题商城也在这个网站中↑;</p>
<p>我所用的主题是Diary,可以在博客左下↙版权那里找到github仓库。自己魔改了一部分,为了添加功能。</p>
<h1 id="常用命令脚本">常用命令、脚本</h1>
<p> 获取QQ头像的url: <code>https://q1.qlogo.cn/g?b=qq&amp;nk=QQ号码&amp;s=640</code>。用edge浏览器的时候发现,如果用https访问博客,头像url用http访问的话会被拦截。</p>
<p> 每次输入这么多命令太麻烦了,hugo似乎没有把自己提交到github的命令,索性写了一个windows脚本上传博客。提前在path环境变量中配置hugo命令所在目录,以在任意位置执行hugo命令。</p>
<p> 还是第一次主动写windows脚本,上一次写还是上一次(呸,上次是改U盘图标,照网上抄的)。脚本文件后缀名为.bat,直接在里面写命令即可。</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">hugo -D
hugo
<span style="color:#658b00">cd</span> ./public
git add -A
git commit -m <span style="color:#cd5555">&#34;脚本提交&#34;</span>
git push -u origin master
</code></pre></div><p> 先执行一遍hugo -D是为了将草稿也编译一下;再不带-D,这样主页不会显示草稿;</p>
<p> 还有一个博客生成测试脚本,执行hugo server命令,用于在本地实时查看页面;</p>
<p> 也可以使用github Actions来完成持续集成(CI),顺道学习Devops;难得有个项目有提供hugo的插件,我却还是觉得脚本成本低,,</p>
<p>进阶版脚本:同时提交至github和gitee:</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash">chcp <span style="color:#b452cd">65001</span>
rem 定义变量延迟环境,关闭回显
@echo off&amp;setlocal enabledelayedexpansion
rem 读取config.toml所有内容
<span style="color:#8b008b;font-weight:bold">for</span> /f <span style="color:#cd5555">&#34;eol=* tokens=*&#34;</span> %%i in (config.toml) <span style="color:#8b008b;font-weight:bold">do</span> (
rem 设置变量a为每行内容
<span style="color:#658b00">set</span> <span style="color:#00688b">a</span>=%%i
<span style="color:#658b00">set</span> <span style="color:#cd5555">&#34;a=!a:http://tablerows.gitee.io/tablerow.github.io/=https://baiban114.github.io/tablerow.github.io/!&#34;</span>
rem 把修改后的全部行存入$
<span style="color:#658b00">echo</span> !a!&gt;&gt;$)
rem 用$的内容替换原来config.toml内容
move $ config.toml
hugo -D
hugo
<span style="color:#658b00">cd</span> ./public
git add -A
git commit -m <span style="color:#cd5555">&#34;脚本提交&#34;</span>
git push -u origin master
<span style="color:#658b00">cd</span> ..
@echo off&amp;setlocal enabledelayedexpansion
<span style="color:#8b008b;font-weight:bold">for</span> /f <span style="color:#cd5555">&#34;eol=* tokens=*&#34;</span> %%i in (config.toml) <span style="color:#8b008b;font-weight:bold">do</span> (
<span style="color:#658b00">set</span> <span style="color:#00688b">a</span>=%%i
<span style="color:#658b00">set</span> <span style="color:#cd5555">&#34;a=!a:https://baiban114.github.io/tablerow.github.io/=http://tablerows.gitee.io/tablerow.github.io/!&#34;</span>
<span style="color:#658b00">echo</span> !a!&gt;&gt;$)
move $ config.toml
hugo -D
hugo
<span style="color:#658b00">cd</span> ./public
git add -A
git commit -m <span style="color:#cd5555">&#34;脚本提交&#34;</span>
git push -u gitee master
pause
</code></pre></div><blockquote>
<p>chcp 65001是将本次bat脚本运行时采用的字符集设置为utf8,因为牵扯到修改hugo的配置文件(相关内容会编译至页面)</p>
<p>如果脚本页面中的内容也有中文(如“脚本提交”),建议将也脚本文件保存为utf8,避免这一部分中文变成乱码</p>
<ul>
<li><input disabled="" type="checkbox"> 回头试试提交信息加上时间戳之类的(或者指定参数?)</li>
</ul>
</blockquote>
<h1 id="自己钻研的定制经验">自己钻研的定制经验</h1>
<p>utteranc.es客户端地址:https://utteranc.es/client.js</p>
<p> 因为没时间系统学习怎么制作hugo主题,我只能在Diary主题的基础上瞎摸索,这里是一些经验;如果其他主题作者命名方式一样(约定大于配置233)就会很好办。</p>
<p> 对Diary主题改动了一些,有点儿想提PR的冲动。。。不过萌新经验还差太多,不知道合不合适。。。羞(.. )…</p>
<h2 id="站点主题目录结构">站点&amp;&amp;主题目录结构</h2>
<p>根站点和主题文件夹有相同的目录结构,hugo会优先使用根站点下的配置。</p>
<p>以Diary为例,主题根文件夹下:</p>
<ul>
<li>
<p>layout放置了页面的主体框架,其中</p>
<ul>
<li>
<p>shortcodes目录定义shortcode,可以在其他html中当组件用</p>
</li>
<li>
<p>_default下存放了主体部分的html框架(即body中的主div内的内容,正中间的主体)</p>
<ul>
<li>
<p>baseof.html是全html页面的框架,其中head部分被放到了partials文件夹下</p>
</li>
<li>
<p>single.html是文章内容的html</p>
</li>
<li>
<p>可以自定义友链、“关于我”这种功能的页面在这里,记得将single中的主体框架部分拷贝过来,修改{{.Content}}附近;</p>
<ul>
<li>踩坑:自定义页面的时候,要全用{{define main}}包裹起来,我把css放在外边,结果只编译了css</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>
<p>partials有评论、head、自定义head、版权、主体js等部分的html</p>
<ul>
<li>sidebar:电脑端侧边栏的大纲(说是大纲是因为引用了版权页,而版权页单独写在一个html里),移动端这部分有单独页面,不在这里(见baseof.html);</li>
</ul>
</li>
<li>
<p>data 存储数据文件供模板使用</p>
</li>
<li>
<p><em>public</em> 生成的静态网站文件会放在这里</p>
</li>
</ul>
<h2 id="站点配置文件configtoml">站点配置文件config.toml</h2>
<p>注意不要在主题文件夹下放config!那儿也会生效!</p>
<h2 id="博文开头的元数据配置">博文开头的元数据配置</h2>
<ul>
<li>layout: &quot;&quot; 不用带后缀;该md文件会寻找layout下同名html文件渲该页染;</li>
<li>draft: true 为true时是草稿,不带-D参数的hugo命令不会编译、在首页显示草稿;这也是为什么我要在脚本里先后执行两次命令。
<ul>
<li>关于我、友链等页面可以用这种方式从隐藏,只在特定页面出现</li>
</ul>
</li>
</ul>
<p>其他的可以见主题文件夹下/archetypes/default.md</p>
<h1 id="拓展">拓展</h1>
<h2 id="评论插件">评论插件</h2>
<p>静态博客要是没有自己的后台的话,评论也只能托管到其他平台上去。我用的是utteranc.es,客户端地址:https://utteranc.es/client.js</p>
<p>是将评论套在github的评论区。缺点是要在国内登录github网不好。。也许有gitee的?</p>
<ul>
<li><input disabled="" type="checkbox"> 或者自己写个类似的直接评论到B站这类平台?会爬虫or bot应该不难。</li>
</ul>
<p>还有很多其他的评论插件更好,但我忘了名字了doge在这里记一下。真不推荐我用的这个。虽然有些平台要带水印之类的。</p>
<ul>
<li>gittalk</li>
</ul>
<h2 id="live2d看板娘">Live2d看板娘</h2>
<h3 id="基础款">基础款</h3>
<p> 基础款</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html">&lt;<span style="color:#8b008b;font-weight:bold">script</span> <span style="color:#658b00">type</span>=<span style="color:#cd5555">&#34;text/javascript&#34;</span> <span style="color:#658b00">charset</span>=<span style="color:#cd5555">&#34;utf-8&#34;</span> <span style="color:#658b00">src</span>=<span style="color:#cd5555">&#34;https://cdn.jsdelivr.net/npm/[email protected]/lib/L2Dwidget.min.js&#34;</span>&gt;&lt;/<span style="color:#8b008b;font-weight:bold">script</span>&gt;
&lt;<span style="color:#8b008b;font-weight:bold">script</span> <span style="color:#658b00">type</span>=<span style="color:#cd5555">&#34;text/javascript&#34;</span>&gt;
L2Dwidget.init({
model: {
scale: <span style="color:#b452cd">1</span>,
hHeadPos: <span style="color:#b452cd">0.5</span>,
vHeadPos: <span style="color:#b452cd">0.618</span>,
jsonPath: <span style="color:#cd5555">&#39;https://cdn.jsdelivr.net/npm/[email protected]/assets/shizuku.model.json&#39;</span>, <span style="color:#228b22">// xxx.model.json 的路径,换人物修改这个
</span><span style="color:#228b22"></span> },
display: {
superSample: <span style="color:#b452cd">1</span>, <span style="color:#228b22">// 超采样等级
</span><span style="color:#228b22"></span> width: <span style="color:#b452cd">120</span>, <span style="color:#228b22">// canvas的宽度
</span><span style="color:#228b22"></span> height: <span style="color:#b452cd">300</span>, <span style="color:#228b22">// canvas的高度
</span><span style="color:#228b22"></span> position: <span style="color:#cd5555">&#39;right&#39;</span>, <span style="color:#228b22">// 显示位置:左或右
</span><span style="color:#228b22"></span> hOffset: <span style="color:#b452cd">0</span>, <span style="color:#228b22">// canvas水平偏移
</span><span style="color:#228b22"></span> vOffset: <span style="color:#b452cd">0</span>, <span style="color:#228b22">// canvas垂直偏移
</span><span style="color:#228b22"></span> },
mobile: {
show: <span style="color:#8b008b;font-weight:bold">true</span>, <span style="color:#228b22">// 是否在移动设备上显示
</span><span style="color:#228b22"></span> scale: <span style="color:#b452cd">1</span>, <span style="color:#228b22">// 移动设备上的缩放
</span><span style="color:#228b22"></span> motion: <span style="color:#8b008b;font-weight:bold">true</span>, <span style="color:#228b22">// 移动设备是否开启重力感应
</span><span style="color:#228b22"></span> },
react: {
opacityDefault: <span style="color:#b452cd">1</span>, <span style="color:#228b22">// 默认透明度
</span><span style="color:#228b22"></span> opacityOnHover: <span style="color:#b452cd">1</span>, <span style="color:#228b22">// 鼠标移上透明度
</span><span style="color:#228b22"></span> },
});
&lt;/<span style="color:#8b008b;font-weight:bold">script</span>&gt;
</code></pre></div><p>加到哪儿应该都行,我是粘到了extended_head里,这样会加载到head标签中。人物长什么样子可以直接百度“live2d 看板娘 ”+名字、长相什么的。我个人喜欢shizuku,双马尾好可爱ヽ(✿゚▽゚)ノ!!! hibiki也不错</p>
<h2 id="音乐插件">音乐插件</h2>
<p>使用了APlayer &amp;&amp; MetingJS。直接看MetingJS的github仓库即可:<a href="https://github.com/metowolf/MetingJS">MetingJS</a>,暂时不用看Aplayer用法,CV大法好(doge)</p>
<div class="highlight"><pre style="background-color:#eed;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-html" data-lang="html">&lt;<span style="color:#8b008b;font-weight:bold">link</span> <span style="color:#658b00">rel</span>=<span style="color:#cd5555">&#34;stylesheet&#34;</span> <span style="color:#658b00">href</span>=<span style="color:#cd5555">&#34;https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.css&#34;</span>&gt;
&lt;<span style="color:#8b008b;font-weight:bold">script</span> <span style="color:#658b00">src</span>=<span style="color:#cd5555">&#34;https://cdn.jsdelivr.net/npm/aplayer/dist/APlayer.min.js&#34;</span>&gt;&lt;/<span style="color:#8b008b;font-weight:bold">script</span>&gt;
&lt;<span style="color:#8b008b;font-weight:bold">script</span> <span style="color:#658b00">src</span>=<span style="color:#cd5555">&#34;https://cdn.jsdelivr.net/npm/meting@2/dist/Meting.min.js&#34;</span>&gt;&lt;/<span style="color:#8b008b;font-weight:bold">script</span>&gt;
<span style="color:#228b22">&lt;!-- 放在想生成播放器的地方⬇ --&gt;</span>
&lt;<span style="color:#8b008b;font-weight:bold">meting-js</span>
<span style="color:#658b00">server</span>=<span style="color:#cd5555">&#34;netease&#34;</span>
<span style="color:#658b00">type</span>=<span style="color:#cd5555">&#34;playlist&#34;</span>
<span style="color:#658b00">id</span>=<span style="color:#cd5555">&#34; &#34;</span>
<span style="color:#658b00">list-folded </span>= <span style="color:#cd5555">&#34;true&#34;</span>
<span style="color:#658b00">volume </span>= <span style="color:#cd5555">&#34;0.3&#34;</span>
&gt;
&lt;/<span style="color:#8b008b;font-weight:bold">meting-js</span>&gt;
</code></pre></div><p>Aplay是一个Html5音乐播放器,而MetingJS结合了国内几大音乐平台的api。本想直接用外链,但网易云官方现在似乎不提供可用的歌单外链。</p>
<p>注:</p>
<ul>
<li>在使用Meting提供的网易云api时,歌单里歌曲太多或使用“我喜欢的音乐”歌单可能无法从api获取数据!</li>
<li>需要的js、css文件在头文件中<code>按顺序</code>引入(有依赖关系)</li>
<li>Aplayer官方提出了好多静态博客插件,唯独没有hugo的。~~《如果早知道,用hugo会被孤立。。。》~~虽然我也没用那些插件。这个主题用了vue,可以通过vue集成。</li>
</ul>
<h1 id="静态页面托管平台">静态页面托管平台</h1>
<ul>
<li>github pages</li>
<li>gitee pages
<ul>
<li>提交到仓库后,还要在Pages服务那里点“更新”才会更新!!</li>
</ul>
</li>