-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.xml
5240 lines (5240 loc) · 309 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
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
<title>知政的个人博客</title>
<link>https://99999.fun/</link>
<description>Recent content on 知政的个人博客</description>
<image>
<title>知政的个人博客</title>
<url>https://99999.fun/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
<link>https://99999.fun/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
</image>
<generator>Hugo -- gohugo.io</generator>
<language>zh-cn</language>
<lastBuildDate>Fri, 01 Mar 2024 10:49:25 +0800</lastBuildDate>
<atom:link href="https://99999.fun/index.xml" rel="self" type="application/rss+xml" />
<item>
<title>密码学的学习笔记</title>
<link>https://99999.fun/posts/165/</link>
<pubDate>Fri, 01 Mar 2024 10:49:25 +0800</pubDate>
<guid>https://99999.fun/posts/165/</guid>
<description>密码技术手段:数据指纹,身份证明,消息的可信度和不可抵赖性,数据加密
信息安全(机密性,完整性,可用性,不可抵赖性)
Hash函数
hash可以用于校验文件是否完整,数字签名的摘要信息等等
hash函数是将任意大小的输入映射成固定大小的哈希值的函数
hash函数具备抗原像性(无法通过哈希值求到输入的值,是具备单相性的),抗次原像性(很难得到两个不同输入内容确得到相同的hash值),雪崩效应(原文的改变会导致hash值发生变化),抗碰撞性(很难得到可以生成相同hash值的输入内容)
常见的哈希函数:md4,md5,sha1,sha224,SM3(国密发布),sha256,sha384,sha512等等
md5发布于于1992年,摘要长度为128个比特,hash值为16位字节(128/8=16),块大小512个比特(每一次计算都以512个比特来分组处理),轮计算4(16 step)(一共进行4轮的计算,每一轮计算16步,一共计算64步)
简单的来说就是hash值长度是16位字节,计算过程中每个512比特的数据块都会进行64步的计算
sha1发布于1995年,摘要长度为160个比特,块大小512个比特,轮计算4(20 step)
md5和sha1的计算过程:
先将原消息作为一个头部,然后填充一个64位的尾部(这个尾部是说明了原消息有多长),然后中间填充一个经过计算得到的多少个位的数据(确保头部和尾部大小,以及中间的大小的和是512的倍数,这个中间会在开头填1,然后填0,直到头部和中间,以及尾部的bit是512的倍数为止),这个目的是将任意大小的原信息计算切成多个512的块,计算完成后是没有余的
也就是输入信息长度除于512不等于512-64时,进行填充,填充1和n个0,让其总长度等于(512-64)+512的倍数,这个填充是必须进行的,即便输入信息长度等于512-64,也要进行填充一个512bit的数据,确保填充位数是1到512之间
确保这个消息的长度=输入消息+64+填充 = 512的整倍数
md5会初始化4个32bit的值,sha1会初始化5个32bit的值
md5将512的块数据进行分组,分成16个32bit的子分组,然后对4个初始值进行循环计算
每个512块数据都需要进行4轮处理,每一轮64步的计算,然后得到128的结果,这个128位的结果将作为下一组的初始值,一直计算到最后的一组,得到就是128位md5哈希值
计算过程:在1到16步计算时,顺序获得16个子分组进行计算(即第几步就获取第几个分组的数据,例如第3步计算,使用第3组子分组进行计算),在17步到32步计算时,将跳跃获取16个子分组进行计算(跳跃的长度取决于当前的步数+5,即第18步时,获取2+5,第7组的数据),在33步到48步计算时获取当前步数+3,在49步到64步计算时获取当前步数+7,计算完成时,得到的数就是md5哈希值
如果有多个区块的数据,计算的步数就是n*64了,只是初始值变成了上一个区块计算完成的结果
mod 模计算
sha1原理和md5差不多,只是变成了80个步。并且将在20,40,60,80步用不同的计算方式
注意:md5和sha1都不安全了
md5
cryptographically broken and unsuitable for further use
users should avoid using the MD5 algorithm in any capacity. As previous research has demonstrated, it should be considered cryptographically broken and unsuitable for further use
sha1
谷歌SHA1碰撞实验
结论:应该放弃md5,sha1,改用sha2,sha3,BLAKE2等更安全的哈希函数
对称加密
AES,发布于1997年,其是迭代类型的加密,分组长度128bit,密钥长度有128,192,256,轮数分别10,12,14
计算过程:
AES加密计算会进行4种操作,轮密钥加(AddRoundKey),字节替代(SubBytes),行移位(ShiftRows),列混淆(MixColumns)
128位的明文和128位的密钥被分组成16个子节,变成4*4的正方形矩阵
加解密的每一轮的密钥都是通过密钥扩展算法得到的,因此轮密钥也是4*4的正方形矩阵</description>
</item>
<item>
<title>云计算学习笔记</title>
<link>https://99999.fun/posts/164/</link>
<pubDate>Tue, 27 Feb 2024 10:49:25 +0800</pubDate>
<guid>https://99999.fun/posts/164/</guid>
<description>云服务平台:微软的Azure,开源云服务平台Open Stack,谷歌家的Google Cloud,亚马逊的AWS,国内的阿里云,京东云,华为云,腾讯云等等公有云,私有云
云计算就是通过互联网按需访问计算资源,例如物理服务器和虚拟服务器资源,数据存储器等等,这些资源都由云服务提供商管理,云服务提供商通过这些资源,并且根据使用情况按量收费
云计算的特点:按需使用,按量收费,弹性资源,自助服务(即开即用,无需审核),无人值守(高可用,无需监守)
亚马逊在2006年推出S3和EC2,2008年谷歌发布Google App Engine,2009年heroku发布Paas,2010年微软推出Azure服务平台,2011年Open Stack发布开源Iaas,2014年亚马逊推出lambda(无服务器计算服务)
云计算类似于水电服务,电力部门已经为你架构好了基础设施,无需再投资建设基础设施
云计算按需支付按需使用,无需再使用服务器来浪费用不到的资源,多用资源,使用时间长更省钱
云计算保证业务高可用,运维自动化,资源自动扩缩,无需人为管理
云主机,云服务器,云端服务器
创建云主机,指定规格
核心数量,内存,磁盘,网络(私有地址,公有地址),操作系统,操作系统账户(密码,ssh密钥),地理位置,防火墙(安全组)
openstack 构建私有云或者公有云
安装openstack
OpenStack 是一个基于Python的开源项目,安装太复杂了,将通过kolla-ansible快速部署OpenStack环境
kolla-ansible使用ansible自动化运维工具进行OpenStack服务编排部署,kolla-ansible采用可全容器部署,全部跑在docker容器中
OpenStack官方要求8g内存,40g磁盘
Kolla Ansible支持Ubuntu20.04,Ubuntu22.04,Debian 11系统,支持Ubuntu,centos,Debian容器
Kolla Ansible官方文档地址:https://docs.openstack.org/kolla-ansible/yoga/user/quickstart.html
这里将使用Ubuntu22.04
安装必要依赖
sudo apt install git python3-dev libffi-dev gcc libssl-dev
sudo apt install python3-pip
pypi换源(适合国内朋友)
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
安装 ansible(官方要求ansible版本大于4,小于6)
sudo apt install ansible
或者
sudo pip install -U &lsquo;ansible&gt;=4,&lt;6&rsquo;
安装Kolla-ansible
sudo pip install git+https://opendev.org/openstack/kolla-ansible@master
创建目录
sudo mkdir -p /etc/kolla
复制kolla-ansible配置文件(例如globals.yml和passwords.yml,清单文件)</description>
</item>
<item>
<title>C++学习笔记</title>
<link>https://99999.fun/posts/163/</link>
<pubDate>Sat, 17 Feb 2024 14:50:12 +0800</pubDate>
<guid>https://99999.fun/posts/163/</guid>
<description>C++的历史最早追溯到1979年,Bjarne Stroustrup创建了带类的C(即C的超集),这就是C++的雏形,直到1983年,才正式成为C++
C++标准委员会在1998年发布了第一个国际标准C++ ISO/IEC 1488,又叫C++ 98
2011年,C++ 11标准发布,boost库诞生,11标准之后,c++每3年发布一个版本,每一个版本保持向后兼任性的同时,还提供新功能以及改进
C++的特点:封装能力强,高性能,低功耗(可在微型设备上运行,例如嵌入式设备)
C++主要用于开发桌面应用程序,后台系统引擎,游戏以及游戏引擎,图像视觉和AI引擎,数据库(例如MongoDB),嵌入式开发
C++是编译型语言,C++程序会经过编译器生成中间的目标程序,再通过链接器,将目标程序和程序库链接到一起,最后生成可执行程序
.cpp程序经过编译器生成汇编程序.asm,再通过汇编器生成目标程序.obj,链接器会将目标程序和其他目标程序以及一些库程序链接到一起,生成可执行文件
Windows下直接安装Visual Studio,选择使用C++的桌面开发和通用Windows平台开发,Visual Studio扩展插件选上
如果需要开发移动设备的开发,也可以选择使用C++的移动开发选项,还有使用C++的Linux开发,根据自己需求选择
第一个C++程序
#include<iostream>int main(){std::cout &lt;&lt; &quot;hallo word!\n&quot;;}运行以及调试程序:生成,生成解决方案,清理解决方案,编译
C++的每一个变量是具备其数据类型的,该数据类型决定了该变量在内存的空间大小以及该内存空间的值范围,该变量能参与哪些运算,例如:
int sum; // 定义整形int a = 1;int b = 1;sum = a + b; // 求和一些常见的类型的定义:
#include &quot;stdafx.h&quot;void main(void){char a[6]=&quot;qq&quot;;short int a = 88;long int a = 99;int a = 99;float a = 3.</description>
</item>
<item>
<title>汇编基础学习笔记</title>
<link>https://99999.fun/posts/162/</link>
<pubDate>Sun, 20 Nov 2022 11:49:00 +0000</pubDate>
<guid>https://99999.fun/posts/162/</guid>
<description>x86架构通用寄存器(32位的x86架构和64位的x86_64架构)
x86_64架构由amd公司推出,因此又叫amd64架构,64位架构是基于32位架构扩展的
32位架构的x86处理器具备8个32位的通用寄存器,可通过名称来引用这8个寄存器,分别为EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI
EAX的低16位可以被单独使用,引用名称叫AX(高位是左边位,低位是右边位),AX又可以被分为高8位的AH和低8位的AL
实质上EAX,ECX,EDX,EBX都可以被拆开使用,ECX的低16位叫CX,CX又可以被分为高8位的CH和低8位的CL
EDC的低16位叫DX,DX又可以被分为高8位的DH和低8位的DL,EBX的低16为叫BX,BX又可以被分为高8位的BH和低8位的BL
ESP,EBP,ESI,EDI的低16位也可以被单独使用,但是没有8位的,这低16位名称分别是SP,BP,SI,DI
EAX寄存器被乘法和除法指令自动调用,因此又叫累加寄存器
ECX被LOOP(循环)指令调用为循环计数器
ESP被用于寻址栈上的数据,ESP始终指向栈顶,因此又叫栈指针寄存器
ESI和EDI又叫变址寄存器,变址寄存器引用的是内存地址,ESI指向内存源地址,EDI指向目的地址
EBP叫帧指针寄存器,被用来引用栈上的函数参数和局部变量
除了通用寄存器还有EFLAGS标志寄存器,EIP指针寄存器(这个非常重要,因为其引用的是下一条要被指向的指令的地址,注意:并不能直接通过名称来说调用,只能通过CALL之类的间接修改)等等
64位架构(通用寄存器为16个,并且是64位的,而且每个都可以低8位,16位,32位单独使用)
EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI的64位是R开头的,其他和32位架构是一样的,64位架构的内存地址也是64位的
x86汇编指令(通常是由一个操作码(opcode)和0到多个的操作数(operand)组成)
整数加减指令(ADD指令(有2个操作数,分别是目的操作数和源操作数,ADD指向将这2个操作数的值相加,将结果存放在源操作数中,源操作数可以是寄存器,内存,目的操作数要满足可写条件,因此也可以是寄存器,内存,但是不能同为内存))和SUB指令(和ADD指令一样,但是是将结果存放在目的操作数中))
ADD指令:ADD EAX,32 (将EAX寄存器的值加上32,并且将结果存放回EAX寄存器中)
SUB指令:SUB ESP,32 (将ESP寄存器的值减去32,并且将值存放回EAX寄存器中)
数据传输指令(x86架构有多个数据传输指令,这里是MOV指令)
MOV指令用于寄存器之间和寄存器和内存之间传输数据使用,MOV指令将源操作数复制到目的操作数中,例如MOV EDX, 666 (将数值666存储在EDX寄存器中)
x86架构内存寻址:displacement(位移,可以在指令中直接得到内存的偏移量,也就是位移,这个位移表示距离操作数的直接偏移量),base(基址,内存地址存储在通用寄存器中),index(索引,注意ESP寄存器不能用于索引),scale(比例因子,用于索引相乘,是固定值,可取值1,2,4,8)
内存最复杂的地址计算公式:base+(index*scale)+displacement
base和index,displacement都可以随意组合,也可以不存在,如果不使用index,就不需要使用scale了,scale只为index服务,index和scale被用于寻找数组地址和多维数组
入栈和出栈指令(PUSH和POP指令)
PUSH指令只有一个操作数,就是需要入栈的源操作数,这个指令可以将ESP寄存器向下移动一个位,并且将源操作数复制到ESP寄存器指向的内存处,例如:PUSH EAX
POP指令也是只有一个操作数,就是用来接收数据的目的操作数,POP指向会将ESP寄存器指向的内存处的值复制到目的操作数中,并且将ESP寄存器向上移动一个位置,例如:POP EAX
分支跳转指令(JMP指令)
JMP指令只有一个操作数,这个操作数可以是内存,寄存器或者立即数,通过这个操作数来给出需要跳转的目的地址,例如 JMP EAX
过程调用指令(CALL指令)
高级语言的函数在汇编叫过程,CALL指令只有一个操作数,是过程的起始地址,例如 CALL EAX
分支跳转指令和过程调用指令的区别是,分支跳转指令不会记录返回地址,这个返回地址是CALL指令之后的下一条指令的地址,CALL指令会将返回地址入栈,然后跳转到目的地址执行
子过程执行完成通过RET指令返回,RET指令会在栈上弹出返回地址,并且跳转到该返回地址上继续执行
内存分页机制
线性地址
在内存分页模式中,应用使用的地址就叫线性地址,由MMU(menorymanagement unit)基于页表来映射转换为物理地址
在内存分页模式未出现之前,应用是直接访问物理内存的,应用具备读写全部物理内存的权限,因此可能会覆盖其他应用的数据,而80386架构出现,出现了保护模式,使用内存分页来通过特权级和进程地址空间来进行隔离
进程地址空间隔离是通过进程独立性页表来完成的,每个进程实现的地址空间是不同的,避免影响到其他进程
80386两级页表
80386架构的线性地址为32位,因此可寻4GB大小的内存空间(4096),地址总线也是32位,因此也是只能寻找4gb大小的物理内存,而且分页机制也将每个物理内存的页面的大小设为4096字节
一个页面大小为4096字节,地址总线为32位,因此一个页面可存储1024个物理页面地址,80386页表的第一页面是目录页面,物理内存地址存储在CR3寄存器中,可通过该目录页面来查找第二页面的1024个物理页面地址
MMU将32位的线性地址,低12位是页内偏移,然后的低10位是页表的索引,最后的高10位是页面目录索引,页内偏移的取值范围为0到4095,页表索引和页面目录索引的取值范围为0到1023
80386线性地址转换到物理地址的过程:先从CR3寄存器中获取页目录的物理地址,然后选择一个页表,在到页表索引中,找到页面的物理地址,最后通过页内偏移量来得到实质上的物理地址
PAE三级页表
80386架构的每个进程可使用4gb的线性地址空间,但是操作系统会将4gb的地址空间划分成用户空间和内核空间,为了解决内存空间不够使用,英特尔公司推出了物理地址扩展技术(PAE,PhysicalAddressExtension)
PAE将地址总线扩展到36位,因此可寻找64gb的物理内存,但是线性地址依然是32位的,为了解决32位线性地址支持36位的物理地址映射,MMU页表映射机制进行了调整,一个页面只能存储512个地址
PAE的32位线性地址是,高2位是页目录指针索引,后面9位是页目录索引,再后9位是页表索引,最后12位是页内偏移
x64四级页表
因为PAE技术并没有扩展线性空间,32位的地址宽度不够使用了,AMD公司基于x86架构扩展而出的x64架构,x64架构的寄存器宽度是64位的,但是线性地址只使用了48位,但是也足够了,因为可以寻高达256TB的内存空间地址,具体可寻多少物理内存空间,取决于地址总线的宽度
x64架构,在PAE的基础上扩展了页表为4级,而且每个页面的大小是4096字节,高9位是页目录指针表,后9位是页目录指针,再后9位是页目录,然后9位是页表。最后12位是页内偏移量
虚拟内存
进程是以内存页面为单位向操作系统申请内存的,现代操作系统中会对申请的内存空间进行记录,并不会马上分配,而是等到该进程真正访问该内存空间是才会分配物理页面并且进行映射,然后恢复中断程序,如果进程访问了没有映射的内存空间,会被操作系统进行page fault处理,操作系统通过page failt handle进行检查内存空间分配记录
物理空间不够分配时,操作系统可以将少使用的物理页面写入到磁盘交换分区(Swap分区)中,将空出来的页面给需要的进程使用,注意:当在磁盘交换分区中内存页面被访问了,也会触发page fault处理,操作系统通过page failt handle来将磁盘交换分区的内存页面加载回内存中</description>
</item>
<item>
<title>Deno js运行时环境学习笔记</title>
<link>https://99999.fun/posts/161/</link>
<pubDate>Fri, 11 Nov 2022 07:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/161/</guid>
<description>Deno是基于V8引擎,使用Rust构建的JavaScript &amp; TypeScript 运行时环境,天生支持TypeScript,并且有安全模式(默认情况下无法获取网络,文件系统,环境变量等权限,当然也可以开放),Deno的作者是Nodejs之父Ryan Dahl,构建的原因是解决Nodejs的缺陷,例如模块的安全性(Node运行时的权限很高,缺乏模块的安全运行),Deno的模块化选择了ESMoule标准,而且具备浏览器的api,例如window全局变量,支持onload,onunload等事件函数,支持fetch,Web Workers等标准,异步操作返回采用Promise,支持await
Deno不使用node_modules与package.json的包管理机制,而是采用下载编译的机制,并且存在缓存,模块更新通过更新缓存来完成
Deno有个特殊的功能,就是可以从网络上导入模块
安装
Linux
curl -fsSL https://deno.land/install.sh | sh
或者
windows
iwr https://deno.land/install.ps1 -useb | iex
也可以通过scoop安装
scoop install deno
作为Rust构建的,当然也支持Cargo包管理器安装
cargo install deno &ndash;locked
或者通过单一的可执行文件来安装(我采用这个方式,再配置一下Path环境变量就是可以了,windows选择deno-x86_64-pc-windows-msvc)
https://github.com/denoland/deno/releases
检查是否安装完成
deno &ndash;version
第一个例子
import DFetch from &quot;https://deno.land/x/dfetch/mod.ts&quot;DFetch.get(&quot;https://xiaochenabc123.test.com&quot;).then((response) =&gt; {console.log(response)})运行
deno run .\index.ts
它会向你询问进行网络请求,是否允许,可通过&ndash;allow-net默认运行,例如:deno run &ndash;allow-net .\index.ts
第三方库通过https://deno.land/x查找
权限
&ndash;allow-env,允许访问环境变量,可指定环境变量列表,通过逗号分隔
&ndash;allow-hrtime,允许高分辨率时间测量
&ndash;allow-net,允许网络访问,可指定网络地址列表,通过逗号分隔
&ndash;allow-ffi,允许加载动态库,动态库不是安全运行的
&ndash;allow-read,允许读取,可指定读取文件列表或者目录,使用逗号分隔
&ndash;allow-run,允许运行子进程,这个子进程不是安全运行的,可指定子进程列表,通过逗号分隔
&ndash;allow-write,允许写入,可指定写入文件列表或者目录,使用逗号分隔
-A 或者 &ndash;allow-all 允许全部权限
VsCode插件deno
deno内置工具
安装模块</description>
</item>
<item>
<title>简单使用Mock.js模拟数据生成器</title>
<link>https://99999.fun/posts/160/</link>
<pubDate>Wed, 09 Nov 2022 12:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/160/</guid>
<description>Mock.js是模拟数据生成器,不需要后端来提供接口数据来进行开发,Mock可以根据数据模板生成随机数据,并且拦截Ajax请求返回模拟数据
安装
npm install mockjs
导入
import Mock from 'mockjs'通过传入数据模板对象生成数据
const data = Mock.mock({'list|10': [{&quot;id|+1&quot;: 1,&quot;name&quot;: &quot;@cname&quot;,&quot;age|18-25&quot;: 25}]})console.log(data)配置响应数据(当匹配url的ajax请求时,会根据数据模板生成模拟数据,并且作为响应返回,这里通过axios发送get请求)
const Data = Mock.mock('/api/name','get',{code: 200,data: {'list|10': [{&quot;id|+1&quot;: 1,&quot;name&quot;: &quot;@cname&quot;,&quot;age|18-25&quot;: 25}]}})axios.get('/api/name').then(res =&gt; {console.log(res.data)})也可以传入第二个参数,表示匹配的请求是哪个请求方法的
记录数据模板
const Data = Mock.mock('/api/name',(options) =&gt; {return {code: 200,options}})axios({method: 'get', url: '/api/name' , data: {'name':'chenjunlin'}}).</description>
</item>
<item>
<title>计算机图形学学习笔记</title>
<link>https://99999.fun/posts/159/</link>
<pubDate>Tue, 08 Nov 2022 12:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/159/</guid>
<description>计算机图形学(Computer Graphics,CG)是研究图形表达,生成,处理与显示的学科
通过数学算法将二维,三维图形转换成计算机显示器的栅格,例如向量,行列式,矩阵算法等等
图形学历史
1950年,MIT诞生第一个图形显示器(用于Whirlwind(旋风)电子管计算机显示图形),CRT显示器
Whirlwind电子管计算机设计之初是美国空军训练飞行员,半自动地面防空系统(SAGE)
应用CRT和光笔
1958年,双人网球
1960年,William Fetter(威廉﹒费特),创造‘计算机图形学’名词,计算机图形学先驱
1961年,史帝夫﹒罗素(Steve Russell),spacewar游戏
1962年,皮埃尔·贝塞尔(Pierre Bézier),贝塞尔曲线(Bézier curve),绘制曲线
1962年,伊凡·苏泽兰(Ivan Sutherland),Sketchpad绘图应用,计算机图形学之父
1963年,Force, Mass and Motion,https://techchannel.att.com/play-video.cfm/2012/8/20/AT&amp;T-Archives-Force-Mass-Motion
1968年,Ivan Sutherland创造“达摩克里斯之剑”头盔显示器
1968年,Arthur Appel 提出光线投射算法
1973年,Bui Tuong Phong,发明phong shading(Phong着色法)
1974年,Speed Race游戏,第一款赛车游戏
1977年,3D core Graphics System,图形学标准
1980年,NEC µPD7220 GPU,支持1024*1024的显示,普及民用
1996年,Krishnamurthy与Levoy提出法线贴图(Normal Mapping)
1995年,Directx 1.0
1997年,OpenGL 1.1
1999年,Nvidia,Gefprce 256 GPU</description>
</item>
<item>
<title>WebSocket学习笔记</title>
<link>https://99999.fun/posts/158/</link>
<pubDate>Sat, 05 Nov 2022 14:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/158/</guid>
<description>HTTP1.1协议实质上就是半双工信道,无法同时发送数据和接收数据,而且HTTP连接必须是客户端发起,由服务器来进行处理响应,只有HTTP2.0才是全双工信道(不需要等待响应,就可以发送第二个报文)
WebSocket是全双工信道,而且还支持服务端主动发送数据给客户端,是服务器推送技术(还是需要客户端发起连接)
WebSocket协议是应用层协议,而且是建立在TCP协议上,端口也是使用443和80,握手使用HTTP协议,浏览器不会限制WebSocket的同源
WebSocket客户端配置
WebSocket构造函数,用来创建WebSocket实例
const ws = new WebSocket(&lsquo;ws://127.0.0.1&rsquo;)
WebSocket.readyState实例具备4种状态,该属性是只读的,用来表示连接WebSocket服务端的状态,分别是:0(正在连接),1(连接完成并且可以通信),2(连接正在关闭),3(连接已经关闭或者连接失败)
WebSocket.onopen是指定连接成功后执行的回调函数
WebSocket.onerror是指定连接失败后执行的回调函数
WebSocket.onclose是指定连接关闭后执行的回调函数
WebSocket.onmessage是指定从服务器获取信息时执行的回调函数
可以指定WebSocket.binaryType来指定传输的数据类型,数据类型有2种,分别是blob和arraybuffer
客户端配置例如:
const ws = new WebSocket('ws://localhost:8080')ws.onopen = () =&gt;{console.log(&quot;连接中&quot;)ws.send('hallo word') // 向服务端发送数据}ws.onerror = () =&gt;{console.log('连接失败')}ws.onmessage = (evt) =&gt;{console.log('连接成功,正在获取数据')if(typeof evt.data === String){console.log('hallo'+evt.data)}else if(evt.data instanceof ArrayBuffer){let data = evt.dataconsole.log('数据:'+data)}ws.close() // 手动关闭连接}ws.onclose = () =&gt;{console.log('连接已关闭')}还有WebSocket.bufferedAmount属性,也是只读,用于返回WebSocket..send没有发送到服务端的数据的字节数,为0表示全部数据已传输完毕
WebSocket.url属性可以返回WebSocket实例的URL绝对路径,只读</description>
</item>
<item>
<title>简单使用Element Plus组件库</title>
<link>https://99999.fun/posts/157/</link>
<pubDate>Thu, 03 Nov 2022 17:40:00 +0000</pubDate>
<guid>https://99999.fun/posts/157/</guid>
<description>Element Plus是基于vue3开发的组件库,而Element使用vue2开发的组件库
安装Element Plus
npm install element-plus &ndash;save
或者
yarn add element-plus
导入Element Plus
import ElementPlus from 'element-plus'import 'element-plus/dist/index.css'按需导入
安装插件
npm install -D unplugin-vue-components unplugin-auto-import
如果是使用Vite则配置vite.config.ts文件
导入并且启用插件
import AutoImport from 'unplugin-auto-import/vite'import Components from 'unplugin-vue-components/vite'...plugins: [AutoImport({resolvers: [ElementPlusResolver()],}),Components({resolvers: [ElementPlusResolver()],}),],这个组件库还支持module导入的方式手动按需使用,例如:
&lt;template&gt;&lt;el-button&gt;I am ElButton&lt;/el-button&gt;&lt;/template&gt;&lt;script&gt;import { ElButton } from 'element-plus'export default {components: { ElButton },}&lt;/script&gt;</description>
</item>
<item>
<title>计算机网络学习笔记</title>
<link>https://99999.fun/posts/156/</link>
<pubDate>Tue, 01 Nov 2022 12:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/156/</guid>
<description>计算机网络是通用,可编程的硬件组成的,并且这些设备可互连,并且可以传输不同类型的数据
计算机网络不是只有软件概念,还有硬件设备,例如:网卡,网线,路由器等等
网络作用范围:广域网(WAN),城域网(MAN),局域网(LAN)
计算机网络发展历史
ARPANET(1969年,美国国防部创建的单个网络)
三层结构互联网(现代互联网雏形,当时主要用于连接美国学校,实验室的计算机,主干网,地区网,校园网)
多层次ISP互联网(ISP指网络服务提供商(Internet Service Provider),常见网络服务提供商有中国移动,中国电信,中国联通等等)
多层次ISP互联网,分主干ISP(主要跨国通信),地区ISP(主要局部地区通信,例如广东移动,北京电信等等)
中国创建了多个公共互联网,例如:中国电信互联网(CHINANET),中国移动互联网(CMNET),中国联通互联网(UNINET),中国教育与科研计算机网(CERNET),中国科学技术网(CSTNET)等等
计算机网络层次结构(确保数据通信顺通,识别目标计算机的状态,数据是否存在错误)
层次结构大概分3个,网络应用,数据通信,物理网络
层次细分的话,有七层,也就是OSI七层模型(OSI国际标准定义的),而且每个层都是独立的(不干预其他层),只完成不同的工作
OSI七层模型:应用层(为计算机提供服务),表示层(数据处理),会话层(管理通信会话),传输层(管理通信连接),网络层(数据路由),数据链路层(管理节点之间的数据通信,例如传输数据到另一个局域网),物理层(计算机物理设备)
OSI七层模型并没有成为广泛使用的标准,而是采用TCP/IP四层模型
TCP/IP四层模型:应用层(对于OSI七层模型的应用,表示,会话,HTTP协议),传输层(OSI七层模型的传输层,TCP/UDP协议),(OSI七层模型的网络层,IP/ICMP协议)网络层,(数据链路层和物理层,ARP/RARP协议)网络接口层
计算机网络性能指标
bps=bit/s,1秒多少比特位,比特率
时延:发送时延(数据bit除以bps),排队时延(数据等待被网络设备处理的时间),处理时延(数据到达目标机器后处理需要的时间),传输时延(传输路径除以bps)
总时延 = 发送时延+排队时延+传输时延+处理时延
往返时间RTT(Route-Trip Time):数据报文在通信中来回一次的时间(可通过ping命令来查看RTT)
物理层(连接不同的物理设备,传输比特流)
物理层传输介质:双绞线(又分屏蔽和无屏蔽,区别就是增加了一层屏蔽层),同轴电缆,光纤(通过光传输,光纤内部是具有高折射率的纤芯,能折射光)
电缆使用铜作为传输介质,光纤通过光来作为传输介质
铜线中的电信号传播速度大约为2.3*10^8m/s
光纤中光信号的传播速度是2.0*10^8m/s
因此实质上电缆的传播速度比光纤快,因为光纤是利用光的反射来传输到远方的,实质光走的距离更长
但是电缆的铜在远距离的情况下,会导致衰减(主要有2个原因导致,介质损耗(通过电磁波传导,会在介质中产生电场的电荷规则排序,这会消耗能量)和导线损耗),需要通过中继器来延续信号
因此在跨市,跨城,跨省,跨国使用都是光纤(光纤的带宽比电缆好,也是一个原因),但是短距离,得益于电缆的传播速度,会更好,因此局域网内部大多使用电缆来传输(因为解析光信号,还需要个光信号调制调解器,计算机无法直接使用光纤传输的数据)
比特流:通过高低电平来表示比特流,来传输数据
信道(往一个方向传输信息的媒体,一个通信电路最少要有一个发送信道和接收信道)
信道的分类:单工通信信道(只能往一个方向通信的信道,没有反馈的信道,例如电视机的电视闭路线),半双工通信信道(可以发送和接收信息,但是不能同时发送,同时接收),全双工通信信道(可以同时发送,同时接收)
物理层会实现信道分用复用技术(提升信道的利用率)
频分复用,时分复用,波分复用,码分复用
数据链路层(封装成帧,透明传输,差错监测)
数据帧:数据链路层中数据的基本单位,数据发送方会在网络层的一段数据的前后添加特定标记,而这一段数据就是数据帧,数据接收方根据特定标记来识别数据帧,是数据链路层内部数据处理成帧
数据帧也分MAC帧(没有帧尾,因为MAC帧之间是96比特时间,帧头也是没有的,而是让物理层给MAC帧添加8bts的前导码),PPP帧(有帧头和帧尾,帧头到帧尾就是这个帧的长度)
封装成帧:数据链路层会将网络层交付的数据报文添加帧头和帧尾,让其成为帧
帧头和帧尾都是特定的控制字符(比特流),帧头(SOH):00000001,帧尾(EOT):00000100
透明传输:数据链路层对网络层提供的数据没有限制(控制字符在帧数据中,但是不会去当成数据去处理,就好像帧头和帧尾不存在一样)
字节填充(对数据内部的数据填充ESC转义字符),比特填充(零比特填充法:在每5个连续的1后面插入比特0)
数据链路层规定了帧的数据的长度限制,就是最大传输单元MTU(Maximun Transfer Unit)
以太网的MTU(MAC帧)是1500字节
路径MTU:由链路中MTU的最小值决定
差错监测:因为物理层只负责传输比特流,没有控制出错的功能,因此数据链路层提供了差错监测的功能
奇偶校验码:在发送的每个字节后加上一位,让字节中为1的数可以是奇数或者偶数,通过奇偶校验来确定数据是否出错,具体可以看https://xiaochenabc123.test.com/archives/77.html这篇文章,讲TCP的可靠性那里
奇偶校验码的缺点就是如果发生2位的出错,就无法校验出来错误
循环冗余校验码CRC(根据传输或者保存的数据来产生固定位数的校验码,校验码再附加到数据的后面)
模二除法:通过异或来表示0或者1,例如00就是0,01就是1,异为1,或为0
选择用于校验的多项式,并且在数据后面添加多个0,添加多个0的数据,通过模二除法来除以校验的多项式的位串,得到的余数将填充到原来数据的添加多个0的位置,来得到可校验的位串
假设校验的多项式为X3+X2+1,那么就是原数据后面添加3个0(添加多少个0取决多项式的最高阶,二进制位的最高位也取决于最高阶(最高幂次)二进制位数等于最高阶+1,这里就是表示的二进制位为4位的二进制数),二进制位串位计算就是1x3+1x2+0x1+1x0,就是1101
例如原数据为1010110,CRC校验码计算就是1010110000除以1101,得到的余数0001就是CRC校验码,在将原来填充0的位置填充CRC,就是10101100001,这个比特流就是要传输的数据
接收数据进行校验通过,传输的数据除以位串,来得到余数,根据余数来进行判断校验(余数为0则表示数据正确)
数据链路层只检测数据的错误,不会进行数据的纠错,数据错了,数据链路层将会丢弃错误的数据或者重新传输数据
MAC地址(物理地址,硬件地址,每个设备都有唯一的MAC地址,用48个比特位来表示,使用16进制)
MAC地址表:映射MAC地址到硬件接口上
以太网协议是数据链路层的协议,以太网协议是局域网技术,以太网协议用于完成相邻设备的数据帧传输
网络层(数据路由,数据在网络传输的路径,跨局域网,跨节点)
路由器的顶层是网络层,没有使用到传输层和应用层
网络层的ip协议,子网划分
虚拟互连网络(物理网络复杂,使用IP协议时,将无需关心物理网络的差异)
网络层利用IP协议来将使用IP协议的计算机连接起来,就好像这些计算机只需要连接一个虚拟互连网络一样,无需关心底层经过了哪些网关,路由器,ISP等等,将专注于数据的转发工作
IP协议
IP地址(v4只有32位,v6有128位),ipv4使用点分十进制表示,使用4组从0到255的数字表示ip地址,ipv6使用冒分十六进制,用8组4位的16进制表示ipv6地址</description>
</item>
<item>
<title>计算机组成原理学习笔记</title>
<link>https://99999.fun/posts/155/</link>
<pubDate>Tue, 01 Nov 2022 02:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/155/</guid>
<description>计算机发展历史
1946-1957,电子管计算机,1957-1964,晶体管计算机,1964-1980,集成电路计算机,1980-至今,超大规模集成电路计算机
电子管计算机:二战时期,英国为了破译德国的无线电密文,而发明了电子管计算机,最出名的电子管计算机莫过于埃尼阿克(ENIAC),埃尼阿克是美国军方为了计算弹道而诞生的,埃尼阿克长30多米,高2.4米,宽6米,拥有18000多个电子管,70000个电阻,10000个电容,1500个续电,6000多个开关,运行耗电150千瓦,重30吨,占地1500平方英寸(140平方米),造价48万美元,运算速度每秒5000次
电子管计算机特点:集成度低,占空间大,功耗高,操作复杂(更换程序需要接线)
晶体管计算机:诞生原因是因为贝尔实验室发明晶体管,1956年诺贝尔物理奖授予贝尔实验室发明晶体管的科学家,第一台晶体管计算机TX-0诞生于MIT的林肯实验室,当时的最强晶体管计算机PDP-1具备4k内存,每秒可执行20万条指令,具备512x512显示器(也是世界第一个显示器,也因为这个计算机携带了显示器的原因,而诞生了世界第一款电子游戏,太空战争)
晶体管计算机特点:对于电子管计算机来说,集成度高,空间占据小,功耗比电子管低,运行速度快
集成电路计算机:诞生原因是因为德州仪器的工程师发明了集成电路(IC),操作系统也因为集成电路计算机的出现而诞生,当时为了解决IBM的2款集成电路计算机(7094和1401)所编写的程序无法相互兼容,IBM而推出了System/360(操作系统雏形)
超大规模集成电路计算机:芯片集成超大规模的集成电路
微型计算机发展历史:因为集成电路计算机的诞生,计算机逐渐从庞然大物变成小型,乃至微型,1971到1973年,500khz频率的微型计算机(8位),1973到1978年,高于1mhz的微型计算机(8位),1978到1985年,500mhz的微型计算机(16位),1985到2000年,高于1ghz的微型计算机(32位),2000年到至今,高于2ghz的微型计算机(64位)
摩尔定律:当价格不变的情况下,集成电路的性能,会每18至24个月提升一倍
后来因为集成电路太密集,热损耗也越来越高,无法解决,摩尔定律也因此失效
因为摩尔定律的失效,单核已到瓶颈,转而搞多核CPU,2005年,英特尔发布了奔腾系列的双核CPU,AMD也发布了速龙系列的双核CPU,2006年,英特尔发布酷睿四核CPU,至今AMD的服务器级霄龙处理器CPU可以高达64核,而且基准频率(单核频率)可以达到2Ghz以上
计算机的分类
超级计算机:功能最强,运算最快,存储容量最大的计算机,用于天气预报,海洋监测,生物制药,科学计算,航天等等需要超大运算的领域,衡量超级计算机的单位是TFlop/s(每秒一万亿次浮点计算)
著名的超级计算机有Summit,神威太湖之光,天河一号,天河二号,Sierra
天河二号位于广州大学城的中山大学校区的国家超级计算机广州中心
大型计算机:又被称为大型机,大型机面向大型商业公司,维护成本高,硬件不易扩展,IBM占据大型机的大片市场,IBM为IOE中的I(计算机提供商)
迷你计算机(服务器):目前已替代大型机,为企业主要计算顶梁柱
工作站:高端微型计算机,面向需要强性能的专业工作者(例如图形,视频)
微型计算机(个人计算机):又分为台式计算机,笔记本计算机,一体化计算机
计算机体系和结构
冯诺依曼体系:将指令和数据一起存储的计算机设计概念结构,使用通用电路设计,而不是使用专用电路,将指令存储,再将指令编译成通用电路可理解的程序
冯诺依曼体系要求具备存储器,控制器,运算器,输入/输出设备
冯诺依曼体系要求能将程序和数据发送给计算机(输入),能长期存储程序,数据,计算过程,计算结果的功能(存储器),具备算术,逻辑处理和数据传送等数据处理功能(运算器和控制器),并且能将处理结果反馈给用户(输出)
冯诺依曼瓶颈:CPU和存储器速率之间无法调和,导致CPU空转等待数据传输
现代计算机都是基于冯诺依曼体系的(解决冯诺依曼瓶颈),存储器和运算器,以及控制器整合在一起(就是CPU),CPU内部的存储器更高速(寄存器)
计算机层次和编程语言
程序编译和程序解析(计算机无法理解人类语言),需要进行语言(高级语言对低级语言)的转换
高级语言生成低级语言的过程叫程序编译,而生成的工具叫编译器
常见的编译型语言有C,C++,Golang
高级语言作为输入,低级语言接收输入,从而达到高转低的目的,这个过程叫程序解析,而这个低级语言接收的工具叫解析器,解析器必须是用低级语言编写的
常见的解析型语言有Python,PHP
java是编译+解析语言,因为它会将源程序编译成JVM字节码,JVM虚拟机再将JVM字节码再解析成机器码,java的跨平台就是因为JVM虚拟机解析器
计算机的层次:硬件逻辑层,微程序机器层,传统机器层,操作系统层,汇编语言层,高级语言层,应用层
硬件逻辑层:由门电路和触发器等逻辑电路组成
微程序机器层:由微指令组成的微程序直接交给硬件执行
传统机器层:CPU指令集,不同架构CPU使用不同的CPU指令集
这3层都为机器硬件层,一个指令就是一个微程序,也是一组微指令
操作系统层:向上提供操作界面,向下对应指令系统,管理硬件(例如分配内存空间)
汇编语言层:汇编语言可以直接编译成机器语言,完成翻译的工具叫汇编器
高级语言层:高级语言
应用层:应用软件
计算机的计算单位
容量单位
在物理层次,用高低电平来记录信息(低电平为0,高电平为1,一个0/1的位被叫为bit(比特位))
1字节(Byte)等于8bit
1Kb(千字位)等于1024字节(Byte)
1mb(兆字节)等于1025kb(千字节)
1Gb(吉字节)等于1024mb(兆字节)
1tb(太字节)等于1024gb(吉字节)
1pb(拍字节)等于1024tb(太字节)
1eb(艾字节)等于1024pb(拍字节)
1024是2的10次方
对于硬盘制造商来说,使用10进制,也就是硬盘制造商认为1000G才是1tb
因此实质硬盘容量为购买标注的容量(例如240G)乘以1000的3次方,再除于1024的3次方,得到的数就是实质硬盘的容量
原因是硬盘制造商为了记录硬盘的扇区,使用人类可理解的10进制,而不是2进制
速度单位
网络速度
网络传输数据的单位为Mbps
因此100M宽带就是指100Mbit/s,每秒传输100Mbps
100Mbit换算字节就是100/8,也就是12.5MB,因此100m宽带峰值每秒可以传输12.5mb
CPU速度(CPU的时钟频率,Hz)
Hz是每秒中的周期性变动重复次数的计量
例如 3.30 GHz的CPU,就是3.3*1000^3Hz,也就是每秒可以达到33亿次的高低电平变化
计算机的字符和编码集
字符编码集的历史
ASCII码:ASCII码包含95个可打印字符和33个不可打印的字符(例如控制字符),用7个bits表示一个ASCII码(95+33就是128,也就是2的7次方)
因为ASCII码无法满足需求(例如π),而推出了Extended ASCII码,由原来的7个bits变成8个bits,也就是支持256个字符</description>
</item>
<item>
<title>简单使用PWA技术</title>
<link>https://99999.fun/posts/154/</link>
<pubDate>Fri, 28 Oct 2022 01:21:00 +0000</pubDate>
<guid>https://99999.fun/posts/154/</guid>
<description>PWA,Progressive Web App(渐进式web应用),PWA技术可以将web应用具备接近原生应用的特性和用户体验,无需额外安装,支持离线缓存,消息推送等功能
PWA由Service Worker,Promise,fetch,cache Api,Notification Api等技术组成
Service Worker:服务工作线程,独立于主线程,常驻内存,代理网络请求,依赖HTTPS通信
注册Service Worker
navigator.serviceWorker.register('./sw.js',{scope: '/'}).then(registration =&gt; {console.log(registration)},error =&gt; {console.error(error)})window.onload = function() {document.body.append('PWA!')}sw.js
const cachename = 'v1'self.addEventListener('install', function (event) {console.log('install',event)// 安装新的Service Worker脚本时触发,只有Service Worker脚本不同,会认为是不同的Service Worker版本event.waitUntil(new Promise(resolve =&gt;{setTimeout(resolve, 1000) // 安装新的Service Worker脚本后等待1秒后激活该脚本}))// event.waitUntil(self.skipWaiting) // 强制停止老的Service Worker,激活启动新的Service Worker,只要有更新就激活新的event.waitUntil(caches.open(name).then(cache =&gt;{cache.addAll(['/','./1.img'])})) // 开启cache api缓存系统})self.</description>
</item>
<item>
<title>ECharts数据可视化图表库简单使用</title>
<link>https://99999.fun/posts/153/</link>
<pubDate>Sat, 18 Jun 2022 00:12:00 +0000</pubDate>
<guid>https://99999.fun/posts/153/</guid>
<description>ECharts是基于JavaScript的数据可视化图表库
安装
npm install echarts --save第一个实例
import * as echarts from 'echarts'let app = echarts.init(document.getElementById('app'), null, {width: 800,height: 500})let data = {title: {text: '用户管理'},tooltip:{},legend: {data: ['用户']},xAxis: {data: ['root','admin','user1','user2','user3']},yAxis: {},series: [{name: '用户权限',type: 'bar',data: [10,8,5,1,3]}]}app.setOption(data)注意:容器必须具备高度和宽度(这里的容器的id为app),要么html指定,要么在初始化时指定一个</description>
</item>
<item>
<title>Nuxt.js学习笔记</title>
<link>https://99999.fun/posts/152/</link>
<pubDate>Sun, 05 Jun 2022 21:36:00 +0000</pubDate>
<guid>https://99999.fun/posts/152/</guid>
<description>nuxt是一个基于vue的应用框架,用于创建服务端渲染应用,使用vite作为打包器,使用webpack作为构建工具
创建项目
yarn create nuxt-app test
需要做一些选择,例如:选择TypeScript,选择Yarn,选择UI框架等等
安装依赖
yarn
启动项目
yarn dev
构建打包
yarn build
yarn start
启动测试环境 yarn test</description>
</item>
<item>
<title>简单使用Scoop包管理器</title>
<link>https://99999.fun/posts/150/</link>
<pubDate>Fri, 20 May 2022 22:10:00 +0000</pubDate>
<guid>https://99999.fun/posts/150/</guid>
<description>Scoop是windows平台下开源的命令行软件包管理器,类似于ubuntu的apt或者macOS的brew
scoop仓库里面全部都是通过审核的绿色软件包(前提是不要乱用来路不明的scoop源)
允许执行本地脚本权限
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
修改Scoop安装目录(用户级)
$env:SCOOP=&lsquo;D:\Software\Scoop&rsquo; [Environment]::SetEnvironmentVariable(&lsquo;SCOOP&rsquo;, $env:SCOOP, &lsquo;User&rsquo;)
修改Scoop安装目录(全局)
$env:SCOOP_GLOBAL=&lsquo;D:\Software\Scoop\Global&rsquo; [Environment]::SetEnvironmentVariable(&lsquo;SCOOP_GLOBAL&rsquo;, $env:SCOOP_GLOBAL, &lsquo;Machine&rsquo;)
目录介绍: apps:通过scoop安装的软件存储的目录
buckets:管理软件的仓库目录(记录了哪些仓库有哪些软件)
chache:软件安装包目录
persit:存储用户数据,与软件分离
shims;软链接
安装scoop
iwr -useb get.scoop.sh | iex
或者
iex (new-object net.webclient).downloadstring(&lsquo;https://get.scoop.sh&rsquo;)
安装软件
scoop install sudo
查看环境存在的问题
scoop checkup
将一些scoop环境必须的软件安装一下
搜索软件
scoop search git
安装软件
scoop install git
查看软件信息
scoop info git
查看已经安装的软件
scoop list
卸载软件(-p删除配置)
scoop uninstall git -p
更新软件
scoop update git
更新全部已安装软件
scoop update *</description>
</item>
<item>
<title>简单使用Corepack-包管理器的管理器</title>
<link>https://99999.fun/posts/149/</link>
<pubDate>Fri, 13 May 2022 00:09:00 +0000</pubDate>
<guid>https://99999.fun/posts/149/</guid>
<description>Corepack(管理yarn和pnpm的包管理器的管理器)
corepack是nodejs官方内置的CLI,nodejs16.9.0版本及其以上版本默认携带corepack一起分发(不需要额外安装corepack,16.9.0版本之下的需要手动安装或者更新nodejs版本)
corepack的特点就是不需要安装yarn和pnpm(yarn和pnpm将通过corepack来进行管理安装以及使用),而且还可以限制项目使用特定的包管理器版本(避免一个项目用多个包管理器,而且包管理器的版本还不同的情况)
手动安装
npm install -g corepack如果全局已经安装了yarn或者pnpm的话,需要先卸载
npm uninstall -g yarn pnpm启用corepack
corepack enable限制包管理器版本
package.json
&quot;packageManager&quot;: &quot;[email protected]&quot;表示该项目只能使用yarn包管理器的1.22.19版本,使用其他版本或者使用pnpm包管理器的话,会报错,例如Usage Error: This project is configured to use yarn
默认无法限制npm,需要通过corepack enable npm来手动限制,移除限制通过corepack disable npm来处理
修改packageManager的值后,yarn install,会自动安装指定版本
安装包管理器(会根据package.json下的packageManager来下载指定版本的包管理器)
yarn install指定一个新的包管理器
corepack prepare [email protected] --activate使用本地包管理器(会将本地包管理器存储到一个压缩包里,方便离线使用)
获取
corepack prepare --all -o=D:/demo/test.tgz启动压缩包内的包
corepack hydrate D:/demo/test.tgz或者获取完成后立刻使用
corepack hydrate D:/demo/test.tgz --activate </description>
</item>
<item>
<title>编译原理学习笔记</title>
<link>https://99999.fun/posts/148/</link>
<pubDate>Sun, 08 May 2022 03:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/148/</guid>
<description>编译就是翻译,将机器语言翻译成另一个机器语言(例如高级语言翻译成低级语言(例如汇编),低级语言翻译成机器语言(二进制))
编译让计算机理解高级语言并且执行,编译让计算机更理解人,编译提供了人类新的思考方式
编译的翻译只能作用于形式语言
编译器和解释器
编译器将源程序编译成目标的程序
解释器接收源程序与输入,执行并且返回输出
混合编译器通常需要2次编译,第一次编译将源程序翻译成目标程序,第二次编译时,将目标程序与输入一起放到虚拟机来处理执行(虚拟机用于跨平台,来处理复杂的执行环境)
即时编译器,将源程序编译成机器码后再执行
交叉编译:在一个平台上编译产生多个平台的可执行程序
编译的过程
关注度分离
词法分析(分词,分析词法)
语法分析(将词分析的结果分析成抽象语法树的过程,也就是AST(Abstract Syntax Tree)),语法分析器被叫为parser
语义分析:分析抽象语法的语法是否合法
根据抽象语法树生成的三地址码进行存储,传输,优化
根据三地址码生成机器码(有一些还需要把机器码编译成可执行应用)
词法分析:将程序的字符流转换为符号流,分析符号,并且给予描述
例如:let a = 1
词法分析后得到
let: Keyword a: Variable =: Operator 1: Integer
词法分析器会将关键字抽离,并且对每个字符作描述
词法分析器得到返回值是符号元组,符号又叫词法单元(Token)
词法:构造语句的方法(哪些是具备词性(根据词的特点来区分的语法分类,例如动词,名词等等),哪些是具备词语(具有意义的词,关键字)),通常使用正则表达式来描述词法,使用状态机来实现正则表达式
字母表(alphabet):某个编程语言中允许的全部字符
串(string)是某个编程语言中的字母序列
词法分析器将源程序的字符流进行分析,通正则文法过来找到这些词汇,并且给予词性,如果存在不支持的词汇,则报错(也就是分词)
词法分析器使用了一种叫有限自动机(有限状态机,deterministic finite automaton, DFA)的算法,在分析字符串时,当遇到了关键字时,会改变状态
有限自动机和图灵机很相似,不过有限自动机只能读取,无法进行计算
例如:a == 1
当识别扫描到a时,会处于标识符状态,直到遇到了==,就会切换到比较运算符状态,然后再识别1,知道该值是数值字面量
语法分析
语法分析的过程就是在词法分析的基础上分析程序的语法结构,这个语法结构是树状的,这个树叫抽象语法树(Abstract Syntax Tree,AST),树节点是语法单元,可通过递归下降算法或者自底向上算法来构造该树状
语法制导翻译</description>
</item>
<item>
<title>vuejs底层原理学习笔记</title>
<link>https://99999.fun/posts/147/</link>
<pubDate>Tue, 26 Apr 2022 20:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/147/</guid>
<description>组件的渲染,更新
组件的渲染:通过组件的模板创建vnode,渲染vnode,生成DOM
vue应用的初始化
import { createApp } from 'vue'import App from './app'const app = createApp(App)app.mount('#app')通过上面例子看到vue将app应用挂载到根组件上(一般是id为app的dom节点),通过createApp()函数,对外暴露vue,createApp()方法主要作用是创建app应用,以及重写mount方法,最后返回app应用
通过createApp()源码,可以看到createApp()接收一个参数,这个参数也就是app应用(根组件),createApp()创建app应用是通过ensureRenderer()的createApp()创建的
ensureRenderer()用于创建一个惰性渲染器对象(延时创建,这样的好处是当只使用响应式包时,不需要打包渲染器等渲染逻辑相关的代码)</description>
</item>
<item>
<title>链接</title>
<link>https://99999.fun/links/</link>
<pubDate>Tue, 19 Apr 2022 21:11:29 +0800</pubDate>
<guid>https://99999.fun/links/</guid>
<description>保罗的小宇宙 临轩 狱杰的屋敷 猕猴の那年记忆 一叶三秋 新漫猫 提莫酱的博客 zshMVP 清墨的橘 流星Aday的博客 隔壁小胡的博客 Citrons博客 若志随笔 星云馆 螓首蛾眉 阅读・阅己 北熙宝宝 Sanakeyの小站 百里飞洋の博客 itsNekoDeng 喵二の小博客日语笔记</description>
</item>
<item>
<title>分类</title>
<link>https://99999.fun/categories/</link>
<pubDate>Tue, 19 Apr 2022 21:00:55 +0800</pubDate>
<guid>https://99999.fun/categories/</guid>
<description></description>
</item>
<item>
<title>标签</title>
<link>https://99999.fun/tags/</link>
<pubDate>Tue, 19 Apr 2022 21:00:05 +0800</pubDate>
<guid>https://99999.fun/tags/</guid>
<description></description>
</item>
<item>
<title>简单使用Pm2---node进程管理工具</title>
<link>https://99999.fun/posts/pm2/</link>
<pubDate>Tue, 19 Apr 2022 20:39:27 +0800</pubDate>
<guid>https://99999.fun/posts/pm2/</guid>
<description>安装pm2
npm install pm2 -g
执行app.js文件并且监听app.js的变化,-i为进程数,max表示当前cpu可启动的最大进程
pm2 start app.js &ndash;watch -i max &ndash;ignore-watch=&ldquo;node_modules&rdquo; &ndash;name demo
&ndash;ignore-watch=&ldquo;node_modules&quot;为忽略监听指定的目录或者文件,这里忽略的是node_modules文件夹
&ndash;name为进程名字
pm2执行npm run dev
pm2 start npm &ndash;watch &ndash; run dev
pm2执行npm run start
pm2 start npm &ndash;name demo &ndash; run start
查看PM2中的进程信息
pm2 list
查看指定进程id的信息
pm2 show 0
重启指定进程id的进程
pm2 restart 0
重启全部进程
pm2 restart all
停止指定进程id的进程
pm2 stop 0
删除指定进程id的进程
pm2 delete 0
查看全部进程的日志
pm2 logs
清空所有日志文件
pm2 flush</description>
</item>
<item>
<title>关于</title>
<link>https://99999.fun/about/</link>
<pubDate>Sun, 17 Apr 2022 22:50:06 +0800</pubDate>
<guid>https://99999.fun/about/</guid>
<description>关于本站
这是本人的个人博客,分享一些本人学习过程中写的笔记
好记性不如烂笔头
如果文章出现错误或者不正确的地方,欢迎联系本人的邮箱,进行纠正,笔记会根据学习进度来进行更新或者修改
本站未注明转载的文章均为原创,转载请标明来源
本站点基于强大的hugo构建完成
免责声明
本站内容仅供学习和参阅使用,本网站内容仅代表作者本人的观点,内容仅供阅读,如有任何问题,欢迎联系站长(email:[email protected]),将会在第一时间为您做相关处理
自述:
2002年生人,星座:摩羯座
偏好语言:JavaScript(TypeScript),Python,Golang,Rust,C++
家里蹲公司的一名干饭攻城狮
最喜欢的游戏:CSGO,塞尔达传说:旷野之息,王者荣耀,火影忍者手游
看完的小说:全职法师,雪鹰领主,吞噬星空,星辰变,牧龙师
目前在看小说:完美世界
设备:ThinkBook 14p Gen 2(Windows11操作系统,5800H处理器,16G内存,1TB硬盘)
联系方式:
QQ:195551690
Email:[email protected]
GitHub:https://github.com/chenjunlinabc
Twitter:https://twitter.com/chenjunlina
Telegram:https://t.me/zhizheng123
在看书籍:
GO语言学习笔记,数学之美,深入浅出Docker,GO语言核心编程,JavaScript高级程序设计,深入浅出Nodejs,React进阶之路,Redis实战,深入浅出React和Redux,深入理解TypeScript,前端技术架构与工程,labuladong的算法小抄,算法图解,Python3网络爬虫开发实战,前端架构:从入门到微前端,前端开发核心知识进阶:从夯实基础到突破瓶颈,Vue.js设计与实现,MongoDB进阶与实战:微服务整合、性能优化、架构管理,Angular开发入门与实战,React设计原理</description>
</item>
<item>
<title>web安全学习笔记</title>
<link>https://99999.fun/posts/145/</link>
<pubDate>Wed, 13 Apr 2022 13:50:00 +0000</pubDate>
<guid>https://99999.fun/posts/145/</guid>
<description>常见web工具:
burpsuite:通过代理渗透,可重放HTTP请求,来分析HTTP响应
curl:通过url方式传输数据,可用于抓取页面(执行请求),监控网络等等
postmain
hackbar quantum
wappalyzer
文件上传漏洞:没有足够的安全约束的情况下,允许上传恶意文件,例如恶意脚本,webshell等等
文件上传漏洞关键点在于绕过
由于法律限制的原因,禁止对其他网站非法攻击,因此需要在本地或者在自己的服务器上建立靶场渗透环境,这边使用的是bwapp(全称为buggy web Application)
这边使用的是docker运行bwapp,也可以下载bwapp,来自己搭建(https://sourceforge.net/projects/bwapp/files/)
docker pull raesene/bwapp
docker run -d -p 0.0.0.0:80:80 raesene/bwapp
访问127.0.0.1/install.php
点击here来初始化,或者直接访问127.0.0.1/install.php?install=yes
创建账号信息,点击new user,或者直接访问127.0.0.1/user_new.php
点击login,或者直接访问127.0.0.1/login.php,根据刚才的账号信息进行登录
简单接触文件上传漏洞
chose your bug选择unrestricted File Upload(未经严格审记的文件上传),安全级别选择low(set your security level)
上传一句话木马,创建shell.php文件,添加
通过curl触发,执行curl -d &rsquo;test=echo getcwd();&rsquo; http://127.0.0.1/images/shell.php
可以看到成功触发shell.php,并且服务器返回了当前执行的目录
后缀名绕过
安全级别选择medium(set your security level)
常见后缀名验证方式有,黑名单(禁止哪些后缀上传),白名单(只允许哪些后缀上传)
这里的靶场环境的web server为Apache,因此需要了解Apache解析器模块
.htaccess绕过,当黑名单没有限制上传.htaccess文件时,并且web sever也支持.htaccess时
上传.htaccess文件,内容为:AddType application/x-httpd-php jpg
上传木马,shell.jpg
AddType application/x-httpd-php jpg的意思是,jpg文件按照php文件的方式解析
大小写绕过
大小写用于Windows平台环境下,在Windows中,大小写是不敏感的,而在Linux环境下,大小写是敏感的
Windows文件流绕过
利用windows平台的NTFS文件系统的文件流特性,设置文件时,默认使用未命名的文件流,但是也可以创建其他命名的文件流
例如:
echo hallo,word &gt; hallo.txt:a.txtecho hallo &gt; hallo.</description>
</item>
<item>
<title>简单了解a11y无障碍</title>
<link>https://99999.fun/posts/144/</link>
<pubDate>Sat, 09 Apr 2022 13:01:00 +0000</pubDate>
<guid>https://99999.fun/posts/144/</guid>
<description>a11y全称为Accessibility,A到y之间有11个字母,因此叫a11y,Accessibility中文翻译为可访问性,也就是无障碍
让网站具备无障碍性,可以让一些视觉障碍人士访问该网站,而且就算是其他人士使用,也会因a11y而受益(不因网络慢,css文件丢失而无法正常浏览页面内容)
在mdn上有句话:The Web is fundamentally designed to work for all people, whatever their hardware, software, language, culture, location, or physical or mental ability. When the Web meets this goal, it is accessible to people with a diverse range of hearing, movement, sight, and cognitive ability.
w3c发布了Web内容无障碍指南 (WCAG) https://www.w3.org/Translations/WCAG21-zh/
妨碍障碍人士访问web页面常见是视觉障碍,一般需要使用放大镜或者屏幕缩放来访问,严重的可能需要使用屏幕阅读器
常见的屏幕阅读器有:NVDA(windows),ChromeVox(Chrome浏览器内置),Narrator(windows内置,也就是我们说的讲述人),VoiceOver(苹果家的,像MacOS,ios,ipadOS都内置了),TalkBack(安卓内置),以及Orca(Linux内置)
mdn对于障碍人士可访问性优化提供了建议:
1.使用多种方式传达内容,比如从文本到语音或是视频; 2.更易理解的内容,例如使用更通俗的语言书写的文本; 3.将注意力集中在重要内容上; 4.尽量减少干扰,例如不必要的内容或广告; 5.一致的网页布局和导航; 6.相似的元素,比如未访问的下划线链接使用蓝色而访问过的使用紫色; 7.将过程划分为更有逻辑的,必要的步骤并附上进度指示器; 8.在不影响安全性的情况下尽可能让网站认证更简单;并且 9.使表单容易完成,例如带有清晰的错误消息和简单的错误恢复。
而WCAG指南也提供了建议:
可感知性(Perceivable):非文本内容有文本替代,对于视频内容应该提供字幕,确保视感和听感都可浏览,不会因为某些原因导致信息或者结构(可以理解为文本顺序)丢失,应该具备可辨别性(颜色不应该作用区别视觉的唯一手段(针对色盲人士))
可操作性(Operable):页面可通过键盘来操作,而不是唯一依赖于鼠标,提供足够的时间来阅读和使用内容(比如定时可调整,关闭定时,延长定时等等),防癫痫(不使用会诱发癫痫的设计,例如控制闪光的次数),提供导航,查找以及提供内容位置,允许使用键盘之外的设备输入(例如鼠标或者手写板)
可理解性(Understandable):内容应该都是可读,可被理解的(例如设置多种人类语言,比如英文,中文,日文等等,根据操作系统使用语言或者时区设置为默认语言,语言可切换),任何操作都应该具备可预见性(例如关闭一个弹窗,不会导致其他意想不到的情况发生),当输入出现问题应该提示用户哪错了(例如注册时,密码的组合程度等等),当出现用户操作出错时,应该做到操作可逆或者二次确定操作(给予用户检查和纠正的机会)
鲁棒性(Robust):应该在发生某一些系统故障或者网络故障时,确保还能正常工作,而不是罢工或者出错,鲁棒性又叫抗干扰性,健壮性</description>
</item>
<item>
<title>Rust学习笔记</title>
<link>https://99999.fun/posts/142/</link>
<pubDate>Mon, 28 Mar 2022 13:22:00 +0000</pubDate>
<guid>https://99999.fun/posts/142/</guid>
<description>Rust由非盈利组织Mozilla基金会开发,像著名的Mozilla Firefox浏览器和MDN Web Docs都出自该基金会
安装
官方推荐使用Rustup来安装(Rustup是rust的安装器和版本管理工具)
通过rustup-init来安装Rust
https://www.rust-lang.org/zh-CN/tools/install
windows直接安装pustup-init.exe来安装(需联网),默认通过vc安装,建议选择2自定义安装
Linux或者macOS则直接执行以下命令
curl &ndash;proto &lsquo;=https&rsquo; &ndash;tlsv1.2 -sSf https://sh.rustup.rs | sh
注意:Rust的一些包,可能还依赖C编译器,因此最好安装一下GCC
检查是否安装完成
rustc &ndash;version
如果喜欢用Visual Studio Code开发,可搭配rust-analyzer插件来使用
更新rust
rustup update
卸载rust和rustup
rustup self uninstall
在安装rustup的同时也会安装Cargo
Cargo是rust的项目构建工具和包管理器
检查是否安装成功
cargo &ndash;version
创建第一个rust项目
cargo new halloword
其中Cargo.toml文件是项目的依赖库文件
通过编辑Cargo.toml文件来添加依赖
rust依赖可通过https://crates.io/查找
[package]name = &quot;hallo_word&quot;version = &quot;0.0.1&quot;edition = &quot;2021&quot;[dependencies]hyper = &quot;0.14.20&quot; # 来自https://crates.io/# hyper = { git = &quot;https://github.com/hyperium/hyper&quot; } # 来自第三方社区# hyper = { path = &quot;.</description>
</item>
<item>
<title>Flutter框架学习笔记</title>
<link>https://99999.fun/posts/141/</link>
<pubDate>Tue, 22 Mar 2022 12:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/141/</guid>
<description>Flutter是谷歌开源的跨平台UI框架,可以快速在iOS和Android上构建高质量的原生用户界面,可在Windows,Linux,Android,Web,iOS,Mac等6大平台上开发应用
闲鱼和Now直播,美团,快手都使用了Flutter
获取Flutter
https://storage.flutter-io.cn/flutter_infra_release/releases/stable/windows/flutter_windows_2.10.3-stable.zip
添加path环境变量
由于Flutter库是在google那,因此需要设置第三方可信镜像库
设置PUB_HOSTED_URL和FLUTTER_STORAGE_BASE_URL环境变量
PUB_HOSTED_URL设置为https://pub.flutter-io.cn
FLUTTER_STORAGE_BASE_URL设置为https://storage.flutter-io.cn
(flutter-io.cn所提供的镜像由中国的Flutter开发者社区提供和维护)
其他可信第三方镜像库:
腾讯云镜像
PUB_HOSTED_URL(https://mirrors.cloud.tencent.com/dart-pub) FLUTTER_STORAGE_BASE_URL(https://mirrors.cloud.tencent.com/flutter)
清华大学镜像
PUB_HOSTED_URL(https://mirrors.tuna.tsinghua.edu.cn/dart-pub) FLUTTER_STORAGE_BASE_URL(https://mirrors.tuna.tsinghua.edu.cn/flutter)
添加Flutter环境变量path,解压路径\flutter\bin
执行where.exe flutter dart,如果有反应,说明path环境配置完成
(如果要开发安卓的话,需要安装jdk,Android Studio,Android Jdk,可执行flutter doctor检查依赖(如果是X表示没依赖,需要安装))
这里用Visual Studio Code的Flutter插件
创建第一个demo(项目名必须全小写,可用_下划线)
flutter create flutterdemo
启动项目(编译执行)
flutter run
Dart是静态类型语言,它会在定义时绑定数据类型(var)
Dart允许一个类中有多个构造函数,在new初始化时,可选择类的某个构造函数
Dart库管理(pub.dev),在pubspec.yaml添加库
实质上Dart和JavaScript很相似,只是它有抽象和泛型(ts也有泛型,抽象类就是类似于golang的接口,只定义不实现)
Dart也是单线程执行,主线程外也有宏任务队列和事件队列(可以理解为JavaScript中的宏任务)
Dart执行过程:执行main()函数,判断是微任务还是事件队列,是微任务则插入微任务队列,是宏任务则插入宏任务队列,执行完成后(主线程),会执行微任务队列和事件队列,以及判断微任务队列和事件队列是否为空,当为空时程序执行结束
flutter项目下的lib/main.dart,class MyApp类下
修改为 home: const MyHomePage(title: &lsquo;Hallo word&rsquo;), // 当前title信息
在return Scaffold下的body: Center下的,修改为children: [const Text(&lsquo;Hallo word&rsquo;,),
运行后可以看到一个title以及内容都为Hallo word的app
flutter自带了可视化工具,Dart DevTools
自己写一个main.dart
void main() =&gt; runApp(MyApp());class MyApp extends StatelessWidget{@overrideWidget build(BuildContext context){return MaterialApp(title: &quot;hallo word&quot;, // app的titletheme: ThemeData(primarySwatch: Colors.</description>
</item>
<item>
<title>browserslist的简单配置</title>
<link>https://99999.fun/posts/140/</link>
<pubDate>Sat, 12 Mar 2022 10:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/140/</guid>
<description>browserslist是查询浏览器列表的工具,browserslisp的配置可写在package.json中,也可以单独写在.browserslistrc配置⽂件中
browserslist的配置文件会被Autoprefixer,Babel,postcss-preset-env,eslint-plugin-compat,stylelint-no-unsupported-browser-features,postcss-normalize,obsolete-webpack-plugin工具读取,并且对配置的目标浏览器做适配工作
npx browserslist可查看根据条件输出的浏览器列表
查看全球用户份额大于0.2%的浏览器
npx browserslist &ldquo;&gt; 0.2%&rdquo;
查询Chrome最新1个版本
npx browserslist &ldquo;last 1 Chrome versions&rdquo;
查看browserslist的默认配置
npx browserslist &ldquo;defaults&rdquo;
browserslist的默认配置为&gt; 0.5% and last 2 versions adn Firefox ESR and not dead
not dead的意思是不输出官方不再维护的浏览器(例如ie10),dead是不维护,not是不输出
and就是和,or是或者
browserslist的配置
package.json(browserslist官方推荐用这个)
&quot;browserslist&quot;: ['&gt; 0.2%','last 1 Chrome versions''not dead']或者写成
&quot;browserslist&quot;: ['&gt; 0.2% and last 1 Chrome versions and not dead',].browserslistrc
&gt; 0.2% and last 1 Chrome versions and not deadbrowserslist数据的优先级:当前项目的package.</description>
</item>
<item>
<title>Nestjs学习笔记</title>
<link>https://99999.fun/posts/139/</link>
<pubDate>Sat, 05 Mar 2022 14:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/139/</guid>
<description>NestJS是一个nodejs服务端应用开发框架,基于typescript开发,http服务框架默认为Express,也支持Fastify,支持面向对象,函数式以及函数响应式编程
安装
npm install -g @nestjs/cli
创建demo项目
nest new demo
选择使用包管理器(支持npm,yarn,pnpm)
创建完成后可以看到src目录,是典型的MVC架构
app.controller.ts(应用路由控制器,例如Get()方法,该路由控制器将从应用服务文件中获取数据,并且将数据返回到页面上) app.controller.spec.ts(应用控制器单元测试) app.module.ts(应用模块文件,nest模块化,一个nest项目最少有一个模块,通过controllers()方法接收一个模块组(数组形式),) app.service.ts(应用服务文件,数据来源于该文件) main.ts(应用程序入口文件,实质上是async/await异步函数(bootstrap())
从main.ts入口文件可以看出,nest应用实例是基于NestFactory类(该类来源于@nestjs/core,nest核心程序)对外暴露的方法创建的
启动项目
npm run start
访问http://localhost:3000/,如果看到Hello World!表示启动成功
nestjs cli支持对mvc模块的生成
新建nest项目 nest new demo
打包nest项目 nets build
运行nest项目 nest start
查看nest当前项目的一些信息 nest info
创建控制器 nest g controller 名称 或者 nest g co 名称
创建服务 nest g service 名称 或者 nest g s 名称
创建模块 nest g module 名称 或者 nest g mo 名称
创建异常过滤器 nest g filter 名称</description>
</item>
<item>
<title>简单使用Express-Web应用框架</title>
<link>https://99999.fun/posts/138/</link>
<pubDate>Mon, 28 Feb 2022 18:04:00 +0000</pubDate>
<guid>https://99999.fun/posts/138/</guid>
<description>Express是基于nodejs的web应用框架(同时也是node的第三库),同时也是很多web应用框架的底层库,Express是cjs模块标准的http服务框架
安装
npm install express &ndash;save
或者安装express-generator脚手架
npm install -g express-generator
脚手架:
初始化项目(demo是项目名)
express demo
安装依赖
npm install
运行
npm start
如果不使用脚手架(main.js)
const express = require(&quot;express&quot;)const app = express()app.get('/',function(req,res){ res.end(&quot;hallo world!&quot;)})app.listen(3000)运行
node main.js
或者(监视nodejs应用中的任何更改并自动重启服务)
nodemon main.js
访问localhost:3000
静态文件管理(必须通过/src才能访问src文件夹的静态文件)
app.use(&rsquo;/src&rsquo;,express.static(&lsquo;src&rsquo;))
解决跨域问题(依赖于cors模块)
app.use(require(&lsquo;cors&rsquo;)())
Express连接MongoDB(mongoose)
npm install mongoose
const mongoose = require('mongoose')mongoose.connect('mongodb://localhost:27014/test',{useNewUrlParser: true})const testdb = mongoose.model('testdb',new mongoose.Schema({_id: Number,title: String}))/*testdb.inserMany([{_id: 1, title: &quot;abc&quot;},{_id: 2, title: &quot;xyz&quot;}{_id: 3, title: &quot;abcxyz&quot;}])*/app.</description>
</item>
<item>
<title>简单使用Hugo搭建网站</title>
<link>https://99999.fun/posts/137/</link>
<pubDate>Tue, 22 Feb 2022 05:19:00 +0000</pubDate>
<guid>https://99999.fun/posts/137/</guid>
<description>Hugo是基于Go语言开发的静态网站生成器,特点就是快
安装
二进制文件安装(由官方编译完成的二进制文件来安装,推荐使用,用源码容易出现问题)
https://github.com/gohugoio/hugo/releases
源码安装
git clone https://github.com/gohugoio/hugo.git
cd hugo
go install
检查是否安装完成 hugo -v,如果需要支持SASS/SCSS,请添加&ndash;tags extended参数,不过在这之前需要CGO的依赖(或者使用hugo_extended版本)
如果没安装CGO,请先安装CGO,这里使用的是mingw64,CGO_ENABLED环境变量为1
生成站点
hugo new site ./www
创建文章(默认自动生成md文件到content文件夹中,可选择目录)
hugo new post/hallo.md
如果没有显示文章的话,请将文章的draft字段改为false,因为这个是草稿,草稿是不会显示在页面上的
安装主题
git clone https://github.com/miiiku/hugo-theme-kagome.git ./themes/kagome
修改config.toml文件
baseURL = &lsquo;https://blog.xiaochenabc123.test.com&rsquo; languageCode = &lsquo;zh-CN&rsquo; title = &lsquo;小陈的博客&rsquo; theme = &ldquo;kagome&rdquo;
启动Hugo服务器
hugo server
访问http://localhost:1313
如果报错,you need the extended version to build SCSS/SASS的话,请使用extended版本
部署到github pages
hugo
如果该命令执行成功,会将静态页面生成到public文件夹中,只需要push该文件夹到github上就好了</description>
</item>
<item>
<title>简单了解RESTful设计规范</title>
<link>https://99999.fun/posts/136/</link>
<pubDate>Wed, 16 Feb 2022 21:50:00 +0000</pubDate>
<guid>https://99999.fun/posts/136/</guid>
<description>RESTful是指满足REST的约束条件和原则的应用或者设计,REST全称Representational State Transfer(表现层状态转移),REST出现在2000年Roy Fielding的博士论文中(Roy Fielding是HTTP规范的主要编写者之一),RESTful是目前最流行的API设计规范
资源(Resources):REST是基于资源的,不同的资源使用不同且唯一的URI(统一资源标识符(Uniform Resource Identifier),URI格式例如:/img/hallo.jpg,可表示一个资源的路径和资源名称,URI实质上就是URL加URN)表示,获取资源通过访问URI得到,这个资源可以是任何东西(例如txt,exe,iso,mp3,mp4等等)
表示层(Representation):表示层指是将资源具体内容以某种方式展现出来的,例如hallo.mp3,那么就会用mp3的格式来展现这个文件的内容
状态转换(State Transfer):如果希望客户端通过某种请求方式来让服务端表示层的资源发生改变,这就是状态转换,这请求方式分别为GET(获取资源),POST(新建资源),PUT(更新资源),DELETE(删除资源)
RESTful设计规范的六个规范:
1.客户端/服务端(C/S)关注点分离,客户端专注于用户的操作界面,服务端专注于数据存储
2.无状态,要求客户端的每个请求都要拥有完成请求的全部信息,服务端不用存储任何上下文信息,会话信息存储在客户端上
3.统一接口(Uniform Interface),要求使用具备REST规范(资源标识符,资源状态的修改,具备描述资源怎么操作处理的信息,客户端应使用超链接的方式来动态访问其他资源)的接口
4.可缓存(Cache),允许服务端响应可被缓存或者不可缓存(必须明确是否可缓存),如果响应可缓存,客户端可以根据有效缓存时间,来复用响应,减少前后端交互
5.分层系统,不允许跨层访问(访问不相邻的层)
6.按需编码(可选,可理解为按需扩展客户端功能),允许服务端提供一些脚本来扩展客户端功能(例如JavaScript)
api接口统一域名(推荐使用api.xiaochenabc123.test.com这样的格式)
URI(不使用大写,使用中杆-,资源名字是复数名词,资源实体集合,不能出现动词)
HTTP请求方式(不同的操作使用不同的请求方式,例如获取资源使用get,post新建资源等等)
如果资源庞大,可通过get参数的形式获取(例如分页),API的版本号应该放在URI中,更改资源,应该修改资源版本号,原有的URI应该保持继续可用
需正确设置http状态码,根据http状态码来做出不同的响应,例如200正常返回,404文件不存在等等
简单来说就是使用唯一接口,通过URL来访问不同的资源,通过不同的请求方式对资源做出响应</description>
</item>
<item>
<title>Gin框架学习笔记</title>
<link>https://99999.fun/posts/135/</link>
<pubDate>Tue, 15 Feb 2022 17:00:00 +0000</pubDate>
<guid>https://99999.fun/posts/135/</guid>
<description>Gin是一个基于go语言编写的web框架,因为Gin的路由库基于httprouter开发的,性能非常好,支持Restful api规范
安装
go get -u github.com/gin-gonic/gin
第一个demo
package mainimport &quot;github.com/gin-gonic/gin&quot;import &quot;net/http&quot;func main() {g := gin.Default()g.GET(&quot;/&quot;, func(c *gin.Context) {c.String(http.StatusOK, &quot;hallo word&quot;)})g.Run()}go run main.go
g.Run()是将应用部署到本地服务器上,默认端口为8080,可设置端口,g.Run(&quot;:2333&quot;)
路由
r.GET(&quot;/test/:name&quot;, func(c *gin.Context) {name := c.Param(&quot;name&quot;)c.String(http.StatusOK, name)})g.Run(&quot;:6666&quot;)127.0.0.1:6666/test/xiaochen
可以看到Context的Param方法可以获取路由的参数
通过url传递参数
r.GET(&quot;/test&quot;, func(c *gin.Context) {name := c.DefaultQuery(&quot;name&quot;, &quot;test&quot;)c.String(http.StatusOK, fmt.Sprintf(&quot;hallo %s&quot;, name))})r.Run()127.0.0.1:6666/test
如果没有传递参数将会输出DefaultQuery的默认参数test
传递参数后 127.0.0.1:6666/test?name=word
POST请求
index.html main.go</description>
</item>
<item>
<title>beego应用框架的简单使用</title>
<link>https://99999.fun/posts/134/</link>
<pubDate>Sat, 12 Feb 2022 16:50:00 +0000</pubDate>
<guid>https://99999.fun/posts/134/</guid>
<description>beego是一个基于go语言开发的http框架,beego可用于开发web,api,后端服务等等应用,beego架构为mvc模型,支持RESTful api规范设计,支持热更新
安装
go get github.com/beego/beego
go get github.com/beego/bee
检查是否安装完成
bee version
beego项目可使用bee指令来创建和管理
创建第一个web应用
bee new hallo
beego是基于mvc模型的,因此其构建出来的项目文件也是标准mvc模型文件结构,其中main.go是入口文件
执行go mod tidy,生成go.sum
启动项目(bee run指令会自动编译部署)
bee run
访问http://127.0.0.1:8080/
其他常用beeg指令
创建api应用
bee api apitest
打包应用命令(将项目打包压缩)
bee pack
自动生成代码
bee generate
controller控制器
简单接收一下get请求的参数
controllers/default.go,在func (c *MainController) Get() 函数中修改
name := c.GetString(&quot;name&quot;)c.Data[&quot;Website&quot;] = name访问http://127.0.0.1:8080/?name=hallo,views\index.tpl的模板中的{{.Website}}被设置为hallo
在controllers/default.go看到,其定义了一个MainController结构体,该结构体继承了beego.Controller的全部方法(其中方法包括Get,Post等等方法)