Compare commits
957 Commits
Author | SHA1 | Date | |
---|---|---|---|
c808475d59 | |||
63725cf4ab | |||
fad6a20b13 | |||
1c5850b8e9 | |||
a64e21d466 | |||
fcda71cfd3 | |||
450d3d8f0e | |||
f24b08489d | |||
443f2ba7b0 | |||
da0c16aab7 | |||
35e2e58205 | |||
b9e327cfb7 | |||
01c8c04b30 | |||
1b1ad3453c | |||
70e94f5cc9 | |||
d70b190edc | |||
1df034e846 | |||
88d6e50319 | |||
265bffe9c1 | |||
ffa69578a6 | |||
73106942ca | |||
9446bc0ab9 | |||
4c86b97c40 | |||
6f16c43dc5 | |||
7c005d8e8a | |||
1a829ec469 | |||
4d638b26c5 | |||
22ecbc56a6 | |||
3d2c2d4d25 | |||
6f0ec249f6 | |||
654dc15eb6 | |||
c71ea7d356 | |||
f6a29c9e9e | |||
bec51fa09f | |||
aaf6d1669b | |||
0c4c020aaf | |||
5456dbfa24 | |||
3ceb796324 | |||
87554d1616 | |||
69d5fe0b2a | |||
404f5f1070 | |||
c0b8eb4da7 | |||
7fa1528be5 | |||
564ef54c1b | |||
dd0d19cf1c | |||
5c34078de5 | |||
4e21fd05d1 | |||
d1fb7ad8cb | |||
43397a9cf7 | |||
166cbbd02f | |||
d52c7c2abc | |||
21ddcb51cb | |||
ac70a8d913 | |||
b28c141fdf | |||
a9552508a0 | |||
2c61572a99 | |||
d3ece9328d | |||
d3e778ee35 | |||
187fe9e8c0 | |||
fe5d52682e | |||
642aa08cd6 | |||
8c80f47c99 | |||
e8e1a83240 | |||
c0ebe199d1 | |||
ebcae6d5cd | |||
a39f00461b | |||
73099249f4 | |||
4db4c7a750 | |||
9db13825c5 | |||
444f2c8c91 | |||
e8af72372c | |||
d8e1bdf6ca | |||
55587bd145 | |||
9684f7c9e4 | |||
51336f8b86 | |||
f682690b9f | |||
6e46907d5c | |||
b0df70a952 | |||
55be092001 | |||
7cf8fae835 | |||
8b3784038d | |||
f000ab5d67 | |||
599e776b1a | |||
959afe6bf7 | |||
be81f1bfcb | |||
3cee78a29e | |||
742c4b0018 | |||
e1d523036e | |||
38bbf5d6d3 | |||
0bced7ac0f | |||
104f34dff9 | |||
c3197fe24b | |||
d5e6cb3b62 | |||
99e41b2798 | |||
93d760298e | |||
62777d1690 | |||
881033ca36 | |||
00cc7f7330 | |||
8c7cecb128 | |||
d4000a3c02 | |||
7bb91f3f60 | |||
1b9437656d | |||
2b6b58d7fb | |||
8dca5a8765 | |||
ce4e16fb75 | |||
ae10c15d2a | |||
844bc6d307 | |||
c343cb3587 | |||
7f0709f502 | |||
d8427d22a9 | |||
626b7ec961 | |||
278ebee2c0 | |||
822af71d7f | |||
b5f9d14ab1 | |||
0a012311dd | |||
c49b7002ce | |||
bb605ea530 | |||
a3ffdd16fc | |||
b880c23f05 | |||
df3e46f34d | |||
a45fcfef20 | |||
3b65deb8d1 | |||
3fdfa19b74 | |||
8d60181b96 | |||
cb5df68489 | |||
88f43a924a | |||
6f50c1adfd | |||
c6d9901d5e | |||
bd2d631b02 | |||
e25412175f | |||
b6ca1e5166 | |||
3d0ce212a9 | |||
2a4c08a69e | |||
3ddb8959c5 | |||
37906f6548 | |||
ce2640f9cf | |||
9e42db6fcb | |||
fd85b9d819 | |||
2dd3fd1e84 | |||
21dc25c2a4 | |||
ea8d6b3391 | |||
1efbb7155b | |||
22194283aa | |||
56d8186e0a | |||
9e5e671a1a | |||
dc3005bc99 | |||
dedb8b9475 | |||
6f978c8df0 | |||
8ce7714bca | |||
f8b4ef611f | |||
057eddb4b2 | |||
6dfc13ee6d | |||
b77f29a1c2 | |||
55f807f407 | |||
2e2b3b8ee4 | |||
234da6d914 | |||
36068c9ad3 | |||
359b81a44f | |||
20b3a1969d | |||
d59d128bd1 | |||
f5ce635f97 | |||
d6121b3ce9 | |||
e5ccf68774 | |||
f3699e12cd | |||
88452a8b07 | |||
2d8753a6a5 | |||
a7a5d029d5 | |||
dabb4b2cd7 | |||
f318e2456d | |||
8250615bca | |||
f7c2d6555f | |||
a15bd68a59 | |||
5d82708d56 | |||
fda807a97b | |||
c076d32fc1 | |||
da7cccb50b | |||
349d811c66 | |||
4c7e86893d | |||
b040885e8b | |||
925a2913c4 | |||
76785c6c55 | |||
13991b8b5e | |||
e5ad863e2d | |||
3c2e52f47e | |||
137210c886 | |||
60e83d0e0b | |||
338b54f3c5 | |||
5fc5c065df | |||
435fdead51 | |||
61f4697406 | |||
6122942c95 | |||
57d42b29ba | |||
ee97d75160 | |||
cff4119203 | |||
4dfb3c8e9f | |||
50526ab7a4 | |||
6a9c656af6 | |||
ee1c50166c | |||
18189760b7 | |||
e8c86ad588 | |||
d9ff20b22c | |||
c03deba9a5 | |||
6358f19144 | |||
8ef5df72f0 | |||
704ba7332e | |||
bc4e48c5fd | |||
587aa7e304 | |||
bacaf4df44 | |||
1da65002ba | |||
11dc28cea3 | |||
8c21b7126a | |||
7da5b74811 | |||
893391cc3b | |||
20c2bfdbef | |||
4e40ae2b1d | |||
52fc7597ca | |||
f176bf6f56 | |||
67c7a0ef49 | |||
04a12487c0 | |||
4305ed8bd9 | |||
2f66dbc882 | |||
9d8e885aec | |||
fbbc5195f7 | |||
72109ba7b6 | |||
f263431ab1 | |||
fae20e6a71 | |||
706fe7855f | |||
f5e5357de7 | |||
cb434e1180 | |||
df9bf1f5e9 | |||
a0754c5397 | |||
997e176017 | |||
8f9da1cf83 | |||
6b29e84fda | |||
317f2db41f | |||
2c7400d446 | |||
9549a30646 | |||
77b4802177 | |||
7f9b132db9 | |||
58745e7a4d | |||
1d9d2f798c | |||
8e11109e6f | |||
2f6c263221 | |||
b8d46f0cee | |||
70367ebff8 | |||
c60876d078 | |||
e391ce4cd3 | |||
f28f625a93 | |||
bfc4a0198d | |||
9436578123 | |||
fd88141567 | |||
2c10272d01 | |||
a6bb4625d7 | |||
cb1c236f5c | |||
466c3c073d | |||
56f1ce20a1 | |||
119df317f2 | |||
532cb88cf0 | |||
b5f5c95680 | |||
9d0cfca668 | |||
4c02dfd878 | |||
83655d42a5 | |||
e4bc989560 | |||
05dae25ae7 | |||
f500aae1e7 | |||
adcf084901 | |||
3cabca0a7a | |||
6d6ee93d7c | |||
7663e0aa72 | |||
70518c3d9a | |||
26f49c9bc6 | |||
76dc31a30c | |||
3bdcc831c4 | |||
a2795d4691 | |||
fa55cc17d1 | |||
7f66d28d56 | |||
de76161779 | |||
b935a35165 | |||
e1fad67e75 | |||
063369866e | |||
1f6bcaabdf | |||
1ee3fb8bed | |||
a0bd5f7304 | |||
534f39c6a7 | |||
6cb067ce06 | |||
c8aba156f7 | |||
53693bdeba | |||
2dd35ecb40 | |||
c278fb2454 | |||
ab0d82e7f5 | |||
f726b3c6d4 | |||
300aa903bd | |||
e332fa127f | |||
6653bed2eb | |||
3f822852bf | |||
3e71fee21c | |||
3a8b1a2cd7 | |||
bfe8934e88 | |||
6b737583ee | |||
108c8005d4 | |||
75830aa8bc | |||
7e8f89418c | |||
6f94d01850 | |||
bd9c837102 | |||
d29ac4215c | |||
a548bac591 | |||
0f22978db4 | |||
4b8567131f | |||
6c0c6508ab | |||
08b48b842f | |||
6e2f615551 | |||
fed14313e4 | |||
9c7c381849 | |||
1bdd1afdd3 | |||
b137c67956 | |||
feee371c24 | |||
eaee21d4bf | |||
d3b7cfb613 | |||
c1e3cdabcf | |||
5b02481425 | |||
4e651e3109 | |||
4186c93202 | |||
59509fc94e | |||
0acb2ca1f3 | |||
a7f85c5268 | |||
c993ed3228 | |||
f11a3bf99e | |||
c51e52b5c5 | |||
36d2ad88a6 | |||
17df489348 | |||
8c71fdee72 | |||
445ba9a5f8 | |||
49d5254f2b | |||
4bff216f48 | |||
58425e0318 | |||
be3818f818 | |||
b717b1c67f | |||
d4b984c509 | |||
2dbfe101c7 | |||
34434fd402 | |||
68b7bf36bb | |||
5815147509 | |||
0b669ed687 | |||
3c74a22420 | |||
3a0a9f72f7 | |||
84fa394a3a | |||
c70a95e007 | |||
c9dcfd2829 | |||
bc4dea6930 | |||
106d7aa602 | |||
ecb59d8980 | |||
f6cb68debf | |||
98f5cdd08c | |||
355d360720 | |||
5e12094078 | |||
71eb82ae3a | |||
6e1dc3467e | |||
fba093f495 | |||
34f6bba4a1 | |||
7597799323 | |||
11818ada00 | |||
4cb46dc4ea | |||
6ed219e2e1 | |||
bffbc128f2 | |||
b1ba4282f7 | |||
bbd3292c8e | |||
b14257542f | |||
8f782f6204 | |||
8e0df579c3 | |||
870cc88b2a | |||
0f475095ad | |||
e79adc056d | |||
cc2061077c | |||
c407dce74b | |||
08614a6ce8 | |||
676c87ffe8 | |||
c504469c86 | |||
b3cf04d323 | |||
5254c49bdd | |||
011ee54010 | |||
6c7d393cff | |||
86c3191501 | |||
03160c5ad4 | |||
f3b532b4d9 | |||
24290541e7 | |||
e527de9a89 | |||
fab09b1f13 | |||
7bb62ab3c3 | |||
4c4f800427 | |||
a2be0fa8a5 | |||
b3e8be65f6 | |||
4d21e9f1cf | |||
337bdf3f6f | |||
80cb879bc8 | |||
9e24d8da48 | |||
03ea09ed8d | |||
45fbcae3f9 | |||
78b431ffc7 | |||
ab51674496 | |||
a2a6011b31 | |||
44bf2fdf10 | |||
98efabd925 | |||
dc0412ed07 | |||
ca05decbc0 | |||
91f81b4958 | |||
36676240e2 | |||
0d0e73c0a3 | |||
729cafa2d6 | |||
cce405626a | |||
2a8428076e | |||
10f7b75d35 | |||
31a8351cce | |||
867bb7344a | |||
6c48ade999 | |||
138500303b | |||
9e6b4fccfb | |||
39fb8143ac | |||
bcc6cb6335 | |||
79497c0678 | |||
2333d30ee5 | |||
1ae43d171a | |||
31aa83c9b8 | |||
7309e5d249 | |||
60588c52f3 | |||
9ba0641cc7 | |||
d9e86b555f | |||
71fa3b3c26 | |||
fbd3a4fffa | |||
2f818808eb | |||
8295db4b4e | |||
be73485516 | |||
e47092fec0 | |||
8c47a905d4 | |||
624fe766df | |||
2c7028efc3 | |||
01a6b7e36f | |||
d588663619 | |||
bd03383b62 | |||
47aa71b7cc | |||
86d4e8bea5 | |||
4020036f93 | |||
3c2e988059 | |||
8f97826a84 | |||
c229e915ca | |||
2c9a399a9a | |||
c06cbe37f0 | |||
80b0443823 | |||
ba543600e5 | |||
ccd2310541 | |||
f421bfb764 | |||
be0492518b | |||
30eb2e8b0c | |||
3ab21896c5 | |||
e7d6c1318c | |||
39fb171563 | |||
d428322b0a | |||
b51cfb3977 | |||
9c86478101 | |||
d3647a1817 | |||
aedd5f5d9f | |||
5b11b6e281 | |||
07f6747c57 | |||
752bd641a6 | |||
25f5aa4695 | |||
a448246060 | |||
9fc8523762 | |||
b22c815c29 | |||
3798e14e8a | |||
2913dd244f | |||
a0476287df | |||
89be124f1d | |||
7841be7bdd | |||
f630c78dbc | |||
a9310c38d1 | |||
199e1613d4 | |||
c7b3633498 | |||
b3a2a6dae6 | |||
27cb494fa9 | |||
d734868ba7 | |||
95baa9a508 | |||
fb1fa4b47f | |||
0d0e92dd56 | |||
83c74bb912 | |||
5f87a74720 | |||
1e68618479 | |||
a4891cef29 | |||
ff0b08acdb | |||
24ea8f6a6a | |||
7900e348f1 | |||
9680e2a113 | |||
a1defb6f23 | |||
af188f9f19 | |||
f6b68c8d09 | |||
252c880f5f | |||
39f16f5a97 | |||
3b6495a781 | |||
8576cbe101 | |||
df4ef8c5ac | |||
e9386b57a5 | |||
8ee2877234 | |||
d5e8643497 | |||
0125cc1c0b | |||
937426be72 | |||
de964317cd | |||
fdb5b72830 | |||
4039d6f04c | |||
2a6da92c94 | |||
c5c157ea3d | |||
51fb218d6b | |||
150208884f | |||
c44ace5edd | |||
e97a1a8f8a | |||
3451e3b055 | |||
3cc761446e | |||
cfbe8ae4b8 | |||
9df9ff4354 | |||
cf7e9aa29e | |||
a38aaccd49 | |||
4d813c765f | |||
3d1abf5035 | |||
f7b60c9a09 | |||
93f1b473af | |||
c35662155e | |||
f3692146bf | |||
f0135c77a1 | |||
8aed2170e3 | |||
c4308aac0f | |||
82c0e32a16 | |||
80ac14cad6 | |||
41e7bac906 | |||
fe855c04c7 | |||
ef6d1d7c76 | |||
09ece3b274 | |||
56569c813a | |||
f9fb17cb5e | |||
d632dcac7e | |||
6529b5e85f | |||
1f8b93dbab | |||
22066608fe | |||
530e454bf8 | |||
f4b69f9b55 | |||
6b7e4322c9 | |||
3c1c37b4a9 | |||
fd26de4484 | |||
b065d03300 | |||
a732ff3892 | |||
a3bc1f8d20 | |||
36482c5846 | |||
862813a0fc | |||
e218c7ec86 | |||
9acf9ae5a3 | |||
0beda68e62 | |||
f3754732bd | |||
0bc4e3b09e | |||
c83de17d72 | |||
4eb3372413 | |||
511db1fb0b | |||
b724f66b27 | |||
d2c11fab72 | |||
a48806438e | |||
ed399a9dc2 | |||
a33a60838b | |||
101fd365be | |||
adb708e3ba | |||
eff2e44e1e | |||
67bc79e60b | |||
1d60e54663 | |||
6f0b8fb175 | |||
517a846133 | |||
f3ebc461d4 | |||
6f45968e1a | |||
2f0c809390 | |||
2321368d3e | |||
c65ba9df21 | |||
cb0fe8ef7d | |||
60380ceaa4 | |||
fd6f325ef6 | |||
14ed1d3f44 | |||
f34851d2d5 | |||
1626464167 | |||
556b4f8655 | |||
0915987573 | |||
fa15c32717 | |||
ac217e7b99 | |||
a2542e3e4d | |||
b530554d1e | |||
6163e9b4f5 | |||
ec3c285fbb | |||
1aae2c027e | |||
dd53261d3c | |||
0d643d4672 | |||
70c68318ee | |||
8bde7ad5de | |||
2e05f1307b | |||
3b33c3d9bc | |||
9efd75d657 | |||
a54aecde30 | |||
21cc727b16 | |||
9c875cf5f6 | |||
1ef8a1484d | |||
c0da5393f5 | |||
e7d8b4aac6 | |||
850fcfae54 | |||
8f1d00647c | |||
486ebb19c1 | |||
588f84f33c | |||
298631fd5a | |||
3ac3043898 | |||
bd8b551997 | |||
a3c44b3088 | |||
d98e60dc43 | |||
34f59d161e | |||
ac7e63e247 | |||
e606837a88 | |||
6f6526218f | |||
94f377ecd8 | |||
55a072222b | |||
f88ae30d7f | |||
5e7bfa54f2 | |||
faf1e52739 | |||
17177a29a9 | |||
801c90c059 | |||
e6f011d607 | |||
1d607ed3b5 | |||
e385350aaa | |||
271c92336d | |||
ca770c8d7a | |||
e6dc5d1858 | |||
e1b507eafc | |||
fadd789bbc | |||
3d967056e5 | |||
555238ff04 | |||
909e7929d0 | |||
cb293dc036 | |||
1eadc7748e | |||
f3b8c65f73 | |||
5c4075497e | |||
b75cb75372 | |||
1ca1e49030 | |||
03b2ce120d | |||
881fd368c5 | |||
8f2117970b | |||
32b7b03faa | |||
ea762bf805 | |||
30999dcafc | |||
d1c8300dcf | |||
e3bf99b022 | |||
8c7c9e1957 | |||
da61a8d25d | |||
3ddd8d7fea | |||
7facfea3f9 | |||
f687d48666 | |||
a90c8e2ed4 | |||
3087afb4ee | |||
710848dcac | |||
6d8fe96e96 | |||
5c775c9074 | |||
c40b0dff2f | |||
94bbb4f6a7 | |||
dbbb2cce54 | |||
714db4d198 | |||
5e02521794 | |||
cb5b582b81 | |||
3fe58b7c0d | |||
5ca1e140d1 | |||
64b52fc1bc | |||
ab26411164 | |||
2c858eb744 | |||
c39abea00a | |||
30fa592d95 | |||
36f071de00 | |||
289237d5b6 | |||
b1a10ee797 | |||
f597396afe | |||
36a3bb2112 | |||
88d42e6ac8 | |||
59e840628b | |||
2519135036 | |||
32af22afaa | |||
fcf60fb56f | |||
f81d2174f6 | |||
9daa435dee | |||
defd3d3fee | |||
33103fb68d | |||
2348522810 | |||
5ca71fdb60 | |||
bbf00328b3 | |||
dba2f6c1fd | |||
3523cdff76 | |||
d4fd7a30c8 | |||
7c153a0579 | |||
8f2a86457b | |||
b98e7d8395 | |||
3d1317603e | |||
8a651c813b | |||
10884e73f0 | |||
de4286cd7f | |||
f31aab4b35 | |||
485e83c5df | |||
5f1e3f6a2b | |||
9688866fdb | |||
9c59d4a225 | |||
3f2559c1e1 | |||
606776662d | |||
3cec40c4f9 | |||
a5c1f3c02e | |||
8171974454 | |||
d50673ad3f | |||
7ca89af17c | |||
e0ce750d73 | |||
409e44a354 | |||
8382555a20 | |||
e3e6783703 | |||
ea86c3a76c | |||
49b1394090 | |||
03f1c20d2c | |||
ae060ebac2 | |||
358d8f4e17 | |||
6614543e04 | |||
5693510df6 | |||
dfaaee7ce5 | |||
c356147d5f | |||
1e1836f949 | |||
65aab8d920 | |||
816aabf365 | |||
9efea19f6b | |||
e1661b5dc4 | |||
45f42568fc | |||
04d063f1fe | |||
7b5d556dcc | |||
6900980460 | |||
28066ae3c4 | |||
39bd0173e8 | |||
6b570f2035 | |||
dac7e778cb | |||
9e16ec7005 | |||
489d7f509e | |||
c0855988c0 | |||
e5e0160628 | |||
cb7b542fb1 | |||
101d5c1b09 | |||
004553f1de | |||
da7da9aae0 | |||
6d4ce812d0 | |||
bab4e10038 | |||
e30defe3bf | |||
0691e82eb2 | |||
38b685315b | |||
ae633b43e8 | |||
cc6e992a4b | |||
2d994f8597 | |||
ad5accdeff | |||
3a7af1eef3 | |||
9ef65a9f3d | |||
6c220d88ae | |||
01da713410 | |||
768bcb96d9 | |||
fc11b2f0dc | |||
dda6efdc7c | |||
019b4d51ec | |||
f40b56ebb8 | |||
bb533b9081 | |||
6ca7d88a48 | |||
a2cfd4e785 | |||
b08cc85e41 | |||
3f84fe66d3 | |||
5cde10b118 | |||
db7a9aa6f9 | |||
9879fabc78 | |||
a2a2ae55ca | |||
19f919f532 | |||
cabda9b9c9 | |||
ce12b2a329 | |||
5e3d42d1ad | |||
bf962194da | |||
f5e2ad2c31 | |||
ff0cc58c1d | |||
b42883e3de | |||
931850d916 | |||
f4d2c99007 | |||
112a53c101 | |||
9e525009c9 | |||
f78562b95e | |||
63d846b35d | |||
afd924a928 | |||
fb19cda5bb | |||
c9834110cd | |||
98edffbca0 | |||
b3d206d981 | |||
9ec7595b83 | |||
ef823de9a5 | |||
da22b78d8f | |||
06978b1601 | |||
b768bd4e9b | |||
a143e30d93 | |||
7ac675e34c | |||
8e3307272c | |||
0c9fb086ee | |||
f1200c67e1 | |||
cc20a31a47 | |||
1f34ea3bc3 | |||
61b3b5deec | |||
3fed079194 | |||
c481bcdb7b | |||
96e752e809 | |||
01d238eaab | |||
07aaae0e2b | |||
247cd4d4e6 | |||
9945c1b16f | |||
8b151f891c | |||
9dd378128e | |||
6b286b6eb6 | |||
d280013c31 | |||
bdf0dc17cd | |||
4995e6f500 | |||
822e08a6de | |||
88f392c532 | |||
72766dfabe | |||
bfe5551acf | |||
c5792b7c7e | |||
81548feeef | |||
5e284e6f14 | |||
3c4540d248 | |||
e8ccba5cbb | |||
e6d2a48410 | |||
a82f7b948e | |||
7c17fe1222 | |||
e781a3b20e | |||
0f18fbac08 | |||
17c188861e | |||
1a1bf6cd66 | |||
ab795d65aa | |||
150a9bc943 | |||
89fddf6b6f | |||
a8ba4c4e7a | |||
45908c8d90 | |||
f626e21702 | |||
83d9bda16e | |||
470ccb5311 | |||
3964c0c301 | |||
3d0d2947a0 | |||
df8e3a8099 | |||
88b8c8f1c2 | |||
f123f31449 | |||
c0641d2898 | |||
a442108e0f | |||
2af557fa28 | |||
cb9af579f0 | |||
9a2cbcd359 | |||
0c81d4815b | |||
d3e880b6d2 | |||
8b2c227f73 | |||
545e702138 | |||
6f61fab73d | |||
95a03cef33 | |||
c56a018d9b | |||
a40568cc85 | |||
768fb34db9 | |||
b13bb0d6b9 | |||
7348140ae1 | |||
403838287e | |||
b07df71f57 | |||
5e88df2994 | |||
58f486a9fb | |||
665b7d8ce3 | |||
0af1de43c7 | |||
c5f5f0cd19 | |||
0b704fd5e3 | |||
d7503afff2 | |||
381a23490e | |||
c1fbb99393 | |||
3dd01e372c | |||
033709eb8d | |||
260f1ec438 | |||
b104ca8bfd | |||
b3d7fb1ea1 | |||
cd599f7798 | |||
5b649147ca | |||
aa539136fc | |||
e57f03ce8d | |||
cb33da466e | |||
d2b583fc68 | |||
6cde7a1b6f | |||
57fb87d021 | |||
55f4a35a1a | |||
c5f73221f4 | |||
6d8d80c68e | |||
7efa3c1fca | |||
fbcd7edf78 | |||
33328e5987 | |||
3f191de637 | |||
d75cda78f5 | |||
b5467ec1c2 | |||
51c4d2a719 | |||
ca80355477 | |||
a24330243f | |||
acaccae376 | |||
0e2da4158f | |||
a26f95a1be | |||
53b56623a4 | |||
b58db5cc58 | |||
f00a647c3e | |||
869fbc6b40 | |||
5910a3f924 | |||
fadc13ae70 | |||
36b984bb21 | |||
f778b3c28e | |||
1c0bb6a9a5 | |||
b390eaca59 | |||
0e9d9ac16d | |||
b117f3eab7 | |||
8fddbda70d | |||
0d236303a7 | |||
d1c0ded4f7 | |||
4f705878b6 | |||
63e5cd5109 | |||
f21715f172 | |||
2bd72b4c05 | |||
10a4fe3f5b | |||
0a5373796d | |||
64a2fba903 | |||
a9f661f87f | |||
dcd6d5bdbe | |||
d25eaebcd2 | |||
501c7d757e | |||
8db7257b7a | |||
4c0c1c95e8 | |||
7e263a21e7 | |||
54eba6ebd8 | |||
97cda7ec9f | |||
746a387005 | |||
93e23d581f | |||
44711bf9a1 | |||
e251179751 | |||
bf114d2ccf | |||
5877c04e57 | |||
cb64b52cda | |||
396037f90a | |||
3ad1e261c2 | |||
915a802060 | |||
b9ca744978 | |||
c514341b29 | |||
9562c34876 | |||
91190ec29a | |||
7b5e77dd30 | |||
a41ec2693e | |||
f915f4c155 | |||
e1bf0f9655 | |||
5728ac71f9 | |||
39fef5e856 | |||
d1b87b9de9 | |||
026dc585a8 | |||
d09737fcda | |||
029e2751c4 | |||
0a4bd03900 | |||
fe7782a0c4 | |||
9751df06b9 |
@ -1,6 +1,5 @@
|
||||
.github
|
||||
.husky
|
||||
docs
|
||||
scripts
|
||||
node_modules
|
||||
package-lock.json
|
||||
|
3
.gitattributes
vendored
@ -1,3 +1,4 @@
|
||||
Dockerfile linguist-documentation=false
|
||||
.husky/* linguist-vendored
|
||||
|
||||
*.svg linguist-language=md
|
||||
*.md linguist-detectable=true
|
9
.github/FUNDING.yml
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
# github: [jaywcjlove]
|
||||
# patreon: # Replace with a single Patreon username
|
||||
# open_collective: # Replace with a single Open Collective username
|
||||
# ko_fi: # Replace with a single Ko-fi username
|
||||
# tidelift: #npm/mocker-api
|
||||
# community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
custom: https://jaywcjlove.github.io/#/sponsor
|
20
.github/ISSUE_TEMPLATE/bug-report.md
vendored
@ -1,20 +0,0 @@
|
||||
---
|
||||
name: 🐞 错误报告
|
||||
about: 当出现问题时提交报告以便修复!
|
||||
title: '错误报告: xxx.md'
|
||||
labels: bug
|
||||
assignees: jaywcjlove
|
||||
---
|
||||
|
||||
### 错误类型
|
||||
|
||||
- [ ] 排版 & 文字错误
|
||||
- [ ] 清单内容示例错误
|
||||
|
||||
### 错误清单
|
||||
|
||||
`xxx.md`
|
||||
|
||||
### 错误内容描述
|
||||
|
||||
请在这里描述具体错误内容。
|
42
.github/ISSUE_TEMPLATE/bug-report.yml
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
name: 🐞 错误报告
|
||||
description: 当出现问题时提交报告以便修复!
|
||||
title: '🐞 错误报告: xxx.md'
|
||||
labels: ['request']
|
||||
assignees: jaywcjlove
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧
|
||||
注意:请求太多,请按照下面内容提供错误报告
|
||||
🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧
|
||||
|
||||
- type: input
|
||||
id: error-list
|
||||
attributes:
|
||||
label: 📄 错误清单
|
||||
description: 指定错误清单文件,方便我们快速定位错误。
|
||||
placeholder: ex. `docs/ansible.md`
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
id: error-type
|
||||
attributes:
|
||||
label: 🧨 错误类型
|
||||
description: 请选择错误类型。
|
||||
options:
|
||||
- label: 排版 & 文字错误
|
||||
- label: 清单内容示例错误
|
||||
- label: 其它
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: 📖 错误说明
|
||||
description: 您可以在这里简单的提供一些资料,方便我们在 Quick Reference 中添加您想添加的备忘清单(速查表)。
|
||||
placeholder: 请您在这里详细介绍具体错误问题
|
||||
validations:
|
||||
required: true
|
36
.github/ISSUE_TEMPLATE/cheatsheet-request.md
vendored
@ -1,36 +0,0 @@
|
||||
---
|
||||
name: 🤙 备忘清单请求
|
||||
about: 请求添加备忘清单和参考。
|
||||
title: '请求添加备忘清单: '
|
||||
labels: request
|
||||
assignees: jaywcjlove
|
||||
---
|
||||
|
||||
🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧
|
||||
注意:请求太多,参考【优先级】快速添加内容
|
||||
🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧
|
||||
|
||||
#### 优先级
|
||||
|
||||
- [ ] 提交 PR 优先合并(优先处理)
|
||||
- [ ] 提供可复制的[中文/英文]备忘清单资料,优先添加
|
||||
- [ ] 大众化的内容(java/python),优先搬运(小众内容请提供资料)
|
||||
|
||||
#### 说明项目
|
||||
|
||||
您可以在这里简单的提供一些资料,方便我们在 Quick Reference 中添加您想添加的备忘清单(速查表)。
|
||||
|
||||
【请您在这里介绍一下工具或者语言,这很重要】
|
||||
|
||||
- 如果你有一张不错的备忘清单(速查表) [`参考这里`](https://github.com/jaywcjlove/reference/blob/main/CONTRIBUTING.md) 为仓库贡献。
|
||||
- 如果您不方便贡献,请在下方参考资料中提供链接地址,方便共建备忘清单(速查表)
|
||||
- 这里为您提供了 Markdown 排版[示例教程](https://jaywcjlove.github.io/reference/docs/quickreference.html)
|
||||
|
||||
#### 提供参考资料地址
|
||||
|
||||
提供更多参考资料有助于我们整理成备忘清单(速查表)
|
||||
|
||||
- 提供参考地址 https://jaywcjlove.github.io/reference
|
||||
- 提供官网地址 https://jaywcjlove.github.io/reference
|
||||
|
||||
_⚠️ 注意: 随着内容越来越多,可能甚至找不到这个工具或者语言的官网,请您在这里提供以便大家共同参与贡献内容_
|
55
.github/ISSUE_TEMPLATE/cheatsheet-request.yml
vendored
Normal file
@ -0,0 +1,55 @@
|
||||
name: 🤙 备忘清单请求
|
||||
description: 请求添加备忘清单和参考
|
||||
title: '【备忘清单】 请求: <Name>'
|
||||
labels: ['request']
|
||||
assignees: jaywcjlove
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧
|
||||
注意:请求太多,参考【优先级】快速添加内容
|
||||
🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧🚧
|
||||
|
||||
### 优先级
|
||||
|
||||
- 提交 PR 优先合并(优先处理)
|
||||
- 提供可复制的[中文/英文]备忘清单资料,优先添加
|
||||
- 大众化的内容(java/python),优先搬运(小众内容请提供资料)
|
||||
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: 说明项目
|
||||
description: 您可以在这里简单的提供一些资料,方便我们在 Quick Reference 中添加您想添加的备忘清单(速查表)。
|
||||
placeholder: 【请您在这里介绍一下工具或者语言,这很重要】
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: official-website
|
||||
attributes:
|
||||
label: 提供官网
|
||||
description: 提供官网网站有助于我们整理成备忘清单(速查表)
|
||||
placeholder: ex. https://xxx.com
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
_⚠️ 注意: 随着内容越来越多,可能甚至找不到这个工具或者语言的官网,请您在这里提供以便大家共同参与贡献内容_
|
||||
|
||||
- type: textarea
|
||||
id: reference-url
|
||||
attributes:
|
||||
label: 参考资料 URL
|
||||
description: 提供更多参考资料有助于我们整理成备忘清单(速查表)
|
||||
placeholder: |
|
||||
https://jaywcjlove.github.io/reference
|
||||
https://jaywcjlove.github.io/reference
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
_⚠️ 注意: 提供更多参考资料,以便大家共同参与贡献内容_
|
14
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1,14 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: 😍 投稿指南
|
||||
url: https://github.com/jaywcjlove/reference/blob/main/CONTRIBUTING.md
|
||||
about: 请在做出任何贡献之前通读!
|
||||
- name: 🚀 部署镜像网站
|
||||
url: https://github.com/jaywcjlove/reference/issues/102#issue-1451649637
|
||||
about: 部署镜像网站教程在这里!
|
||||
- name: 🪩 清单排版布局说明
|
||||
url: https://jaywcjlove.github.io/reference/docs/quickreference.html
|
||||
about: 部署镜像网站教程在这里!
|
||||
- name: 🪩 Markdown 语法说明
|
||||
url: https://jaywcjlove.github.io/reference/docs/markdown.html
|
||||
about: 部署镜像网站教程在这里!
|
105
.github/workflows/ci.yml
vendored
@ -6,12 +6,13 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: github.repository == 'jaywcjlove/reference'
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 16
|
||||
node-version: 20
|
||||
|
||||
- run: npm install
|
||||
- run: npm run build
|
||||
@ -44,8 +45,36 @@ jobs:
|
||||
with:
|
||||
package-path: ./package.json
|
||||
|
||||
- name: gh-pages README.md
|
||||
working-directory: dist
|
||||
run: |
|
||||
cat << "EOF" > README.md
|
||||
Website: https://jaywcjlove.github.io/reference
|
||||
## Docker
|
||||
|
||||
[](https://jaywcjlove.github.io/#/sponsor) [](https://hub.docker.com/r/wcjiang/reference) [](https://hub.docker.com/r/wcjiang/reference) [](https://hub.docker.com/r/wcjiang/reference)
|
||||
|
||||
轻松通过 `docker` 部署 `Quick Reference` 网站。
|
||||
|
||||
```bash
|
||||
docker pull wcjiang/reference
|
||||
```
|
||||
|
||||
```bash
|
||||
docker run --name reference --rm -d -p 9667:3000 wcjiang/reference:latest
|
||||
# Or
|
||||
docker run --name reference -itd -p 9667:3000 wcjiang/reference:latest
|
||||
```
|
||||
|
||||
在浏览器中访问以下 URL
|
||||
|
||||
```bash
|
||||
http://localhost:9667/
|
||||
```
|
||||
EOF
|
||||
|
||||
- name: Deploy
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
uses: peaceiris/actions-gh-pages@v4
|
||||
with:
|
||||
commit_message: ${{ github.event.head_commit.message }}
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
@ -55,10 +84,9 @@ jobs:
|
||||
id: changelog
|
||||
uses: jaywcjlove/changelog-generator@main
|
||||
with:
|
||||
filter-author: (小弟调调™)
|
||||
filter-author: (小弟调调™|\@github-actions-bot\@renovate-bot|dependabot|renovate\\[bot\\]|dependabot\\[bot\\]|Renovate Bot)
|
||||
filter: (^[\s]+?[R|r]elease)|(^[R|r]elease)
|
||||
|
||||
|
||||
- name: Create Release
|
||||
uses: ncipollo/release-action@v1
|
||||
if: steps.create_tag.outputs.successful
|
||||
@ -67,7 +95,9 @@ jobs:
|
||||
name: ${{ steps.create_tag.outputs.version }}
|
||||
tag: ${{ steps.create_tag.outputs.version }}
|
||||
body: |
|
||||
Documentation ${{ needs.build.outputs.create_tag_version }}: https://raw.githack.com/jaywcjlove/reference/${{ steps.changelog.outputs.gh-pages-short-hash }}/index.html
|
||||
[](https://jaywcjlove.github.io/#/sponsor)
|
||||
|
||||
Documentation ${{ steps.changelog.outputs.tag }}: https://raw.githack.com/jaywcjlove/reference/${{ steps.changelog.outputs.gh-pages-short-hash }}/index.html
|
||||
Comparing Changes: ${{ steps.changelog.outputs.compareurl }}
|
||||
|
||||
${{ steps.changelog.outputs.changelog }}
|
||||
@ -94,57 +124,56 @@ jobs:
|
||||
```
|
||||
|
||||
# Create Docker Image
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
- uses: docker/setup-buildx-action@v3
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_USER }}
|
||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||
|
||||
- run: docker buildx prune
|
||||
|
||||
- name: Build and push image:latest
|
||||
uses: docker/build-push-action@v3
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
push: true
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: ${{ secrets.DOCKER_USER }}/reference:latest
|
||||
tags: wcjiang/reference:latest
|
||||
|
||||
- name: Build and push image:tags
|
||||
uses: docker/build-push-action@v3
|
||||
uses: docker/build-push-action@v5
|
||||
if: steps.create_tag.outputs.successful
|
||||
with:
|
||||
push: true
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: ${{ secrets.DOCKER_USER }}/reference:${{steps.changelog.outputs.version}}
|
||||
tags: wcjiang/reference:${{steps.changelog.outputs.version}}
|
||||
|
||||
# Create Docker Image in Github
|
||||
- name: Login to the GitHub Container Registry
|
||||
uses: docker/login-action@v2
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Build and push image:latest
|
||||
uses: docker/build-push-action@v3
|
||||
with:
|
||||
push: true
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: ghcr.io/jaywcjlove/reference:latest
|
||||
|
||||
- name: Build and push image:tags
|
||||
uses: docker/build-push-action@v3
|
||||
if: steps.create_tag.outputs.successful
|
||||
with:
|
||||
push: true
|
||||
context: .
|
||||
platforms: linux/amd64,linux/arm64
|
||||
tags: ghcr.io/jaywcjlove/reference:${{steps.changelog.outputs.version}}
|
||||
# # Create Docker Image in Github
|
||||
# - name: Login to the GitHub Container Registry
|
||||
# uses: docker/login-action@v2
|
||||
# with:
|
||||
# registry: ghcr.io
|
||||
# username: ${{ github.actor }}
|
||||
# password: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
# - name: Build and push image:latest
|
||||
# uses: docker/build-push-action@v3
|
||||
# with:
|
||||
# push: true
|
||||
# context: .
|
||||
# platforms: linux/amd64,linux/arm64
|
||||
# tags: ghcr.io/jaywcjlove/reference:latest
|
||||
|
||||
# - name: Build and push image:tags
|
||||
# uses: docker/build-push-action@v3
|
||||
# if: steps.create_tag.outputs.successful
|
||||
# with:
|
||||
# push: true
|
||||
# context: .
|
||||
# platforms: linux/amd64,linux/arm64
|
||||
# tags: ghcr.io/jaywcjlove/reference:${{steps.changelog.outputs.version}}
|
||||
|
||||
# # Create Docker Image in Github
|
||||
# - name: Login to GitHub registry
|
||||
|
9
.github/workflows/win.yml
vendored
@ -6,12 +6,13 @@ on:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
if: github.repository == 'jaywcjlove/reference'
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/setup-node@v3
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: 16
|
||||
node-version: 20
|
||||
|
||||
- run: npm install
|
||||
- run: npm run build
|
||||
@ -21,7 +22,7 @@ jobs:
|
||||
cd dist
|
||||
ls
|
||||
|
||||
- uses: actions/upload-artifact@v3
|
||||
- uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: dist
|
||||
path: ${{ github.workspace }}\dist\**\*
|
3
.husky/pre-commit
vendored
@ -1,4 +1 @@
|
||||
#!/usr/bin/env sh
|
||||
. "$(dirname -- "$0")/_/husky.sh"
|
||||
|
||||
npx --no-install lint-staged
|
||||
|
@ -5,6 +5,9 @@
|
||||
"MD024": false,
|
||||
"MD033": false,
|
||||
"MD040": false,
|
||||
"MD055": false,
|
||||
"MD056": false,
|
||||
"MD051": false,
|
||||
"MD010": {
|
||||
"code_blocks": true,
|
||||
"spaces_per_tab": 2
|
||||
|
16
.refsrc.json
@ -12,5 +12,21 @@
|
||||
},
|
||||
"github": {
|
||||
"url": "https://github.com/jaywcjlove/reference"
|
||||
},
|
||||
"giscus": {
|
||||
"src": "https://giscus.app/client.js",
|
||||
"data-repo": "jaywcjlove/reference",
|
||||
"data-repo-id": "R_kgDOID2-Mw",
|
||||
"data-category": "Q&A",
|
||||
"data-category-id": "DIC_kwDOID2-M84CS5wo",
|
||||
"data-mapping": "pathname",
|
||||
"data-strict": "0",
|
||||
"data-reactions-enabled": "1",
|
||||
"data-emit-metadata": "0",
|
||||
"data-input-position": "bottom",
|
||||
"data-theme": "dark",
|
||||
"data-lang": "zh-CN",
|
||||
"crossorigin": "anonymous",
|
||||
"async": true
|
||||
}
|
||||
}
|
||||
|
468
CONTRIBUTING.md
@ -1,7 +1,7 @@
|
||||
Contributing 贡献
|
||||
====
|
||||
|
||||
感谢您对**备忘清单**贡献的兴趣👍👍,是像您这样的人使 [`Quick Reference`](https://jaywcjlove.github.io/reference) 成为如此出色的网站 🎉🎉。随时提交问题和增强请求。
|
||||
感谢您对**备忘清单**贡献的兴趣👍👍,是像您这样的人使 [`Quick Reference`](https://jaywcjlove.github.io/reference) 成为如此出色的网站 🎉🎉。随时提交问题和增强请求,还提供一个[在线说明排版说明]( https://wangchujiang.com/reference/docs/quickreference.html),所以各种使用技巧,都在这个排版说明中有预览和实现代码。
|
||||
|
||||
`docs/{filename}.md` 文件将被处理成备忘清单,让我们创建或编辑一个 `markdown` 文件:
|
||||
|
||||
@ -66,13 +66,13 @@ Contributing 贡献
|
||||
### 提示配置
|
||||
|
||||
```markdown
|
||||
[Django](./docs/djiango.md)<!--rehype:style=background: rgb(12 75 51/var(\-\-bg\-opacity));&class=contributing-->
|
||||
[Django](./docs/django.md)<!--rehype:style=background: rgb(12 75 51/var(\-\-bg\-opacity));&class=contributing-->
|
||||
```
|
||||
|
||||
添加 `contributing` 类名,会在卡片下方添加 _`👆待完善需要您的参与`_,添加 `data-info=👆看看还缺点儿什么?`,更换默认提示文本。
|
||||
|
||||
```markdown
|
||||
[Django](./docs/djiango.md)<!--rehype:style=background: rgb(12 75 51/var(\-\-bg\-opacity));&class=tag&data-lang=Python-->
|
||||
[Django](./docs/django.md)<!--rehype:style=background: rgb(12 75 51/var(\-\-bg\-opacity));&class=tag&data-lang=Python-->
|
||||
```
|
||||
|
||||
添加 `class=tag&data-lang=Python` 类名和参数,会在卡片右上角标记 _`Python`_
|
||||
@ -98,6 +98,123 @@ $ npm run start # 监听 md 文件编译输出 HTML
|
||||
$ git clone https://github.com/jaywcjlove/reference.git -b gh-pages
|
||||
```
|
||||
|
||||
**定时更新**
|
||||
|
||||
在 Linux 服务执行创建 `git-down-pages.sh` 脚本,将脚本放置在 `/opt/cron/` 目录下
|
||||
|
||||
> 注意:⚠️ 脚本会根据线上 pages 的 commit 和 本地 commit 比较。如果不一致才会同步更新,否则跳过
|
||||
|
||||
下面是脚本 `git-down-pages.sh` 的源码
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
|
||||
export PATH
|
||||
|
||||
#author: 南宫乘风
|
||||
|
||||
DATA_DIR="/data"
|
||||
REPO_URL="https://gitee.com/jaywcjlove/reference.git"
|
||||
BRANCH="gh-pages"
|
||||
MAX_BACKUPS=3
|
||||
|
||||
# 函数:备份旧版本
|
||||
backup_old_version() {
|
||||
echo "备份旧版本..."
|
||||
mv ../reference ../reference_backup_$(date +%Y%m%d%H%M%S)
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "备份完成。"
|
||||
remove_old_backups
|
||||
else
|
||||
echo "备份时出现错误。"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 函数:删除多余备份,保留最近的三个
|
||||
remove_old_backups() {
|
||||
echo "删除多余备份,保留最近的三个..."
|
||||
ls -1d ../reference_backup_* | head -n -${MAX_BACKUPS} | xargs -r rm -r
|
||||
}
|
||||
|
||||
# 函数:拉取最新代码
|
||||
clone_latest_code() {
|
||||
echo "拉取最新代码..."
|
||||
# 进入 /data 目录
|
||||
cd $DATA_DIR
|
||||
git clone $REPO_URL -b $BRANCH
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "拉取最新代码完成。"
|
||||
else
|
||||
echo "拉取最新代码时出现错误。"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 检查是否存在 DATA_DIR 目录,不存在则创建
|
||||
if [ ! -d "$DATA_DIR" ]; then
|
||||
echo "目录 $DATA_DIR 不存在,创建中..."
|
||||
mkdir -p "$DATA_DIR"
|
||||
if [ $? -eq 0 ]; then
|
||||
echo "目录创建成功。"
|
||||
else
|
||||
echo "目录创建失败。"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 进入 /data 目录
|
||||
cd $DATA_DIR
|
||||
|
||||
# 检查是否存在 reference 目录
|
||||
if [ -d "reference" ]; then
|
||||
# 进入 reference 目录
|
||||
cd reference
|
||||
|
||||
# 获取远程和本地的 commit 哈希值
|
||||
REMOTE_COMMIT=$(git ls-remote $REPO_URL $BRANCH | cut -f1)
|
||||
LOCAL_COMMIT=$(git rev-parse HEAD)
|
||||
|
||||
# 比较远程和本地的 commit
|
||||
if [ "$REMOTE_COMMIT" == "$LOCAL_COMMIT" ]; then
|
||||
echo "本地 'reference' 目录已经是最新版本,无需拉取。"
|
||||
else
|
||||
echo "本地 'reference' 目录不是最新版本,开始拉取最新代码..."
|
||||
backup_old_version
|
||||
clone_latest_code
|
||||
fi
|
||||
else
|
||||
# 如果目录不存在,直接克隆
|
||||
clone_latest_code
|
||||
fi
|
||||
|
||||
echo "----------------------------------------------------------------------------"
|
||||
endDate=`date +"%Y-%m-%d %H:%M:%S"`
|
||||
echo "★[$endDate] Successful"
|
||||
echo "----------------------------------------------------------------------------"
|
||||
```
|
||||
|
||||
**创建定时任务**
|
||||
|
||||
注意:请把脚本放在 `/opt/cron/` 目录下 (时间可以根据自己需求设定),下面案例:每十分钟同步线上的 `pages` 的内容
|
||||
|
||||
```shell
|
||||
crontab -e
|
||||
|
||||
*/10 * * * * /opt/cron/git-down-pages.sh >> /opt/cron/git-down.log 2>&1
|
||||
```
|
||||
|
||||
**添加 NGINX 配置:**
|
||||
|
||||
```nginx
|
||||
listen 80;
|
||||
listen 443 ssl http2;
|
||||
server_name xxx.xxx.top; #配置你的域名
|
||||
index index.php index.html index.htm default.php default.htm default.html;
|
||||
root /data/reference; # 文件存放的位置
|
||||
```
|
||||
|
||||
|
||||
### 方法二,使用 [docker](https://hub.docker.com/r/wcjiang/reference) 快捷部署 web 版
|
||||
|
||||
```shell
|
||||
@ -132,151 +249,230 @@ REF_LABEL=网站首页
|
||||
|
||||
由于中国国内访问,时常打不开,你可以访问下面镜像网站。
|
||||
|
||||
- [quickref.cn](https://quickref.cn)
|
||||
- [ecdata.cn](http://ref.ecdata.cn)
|
||||
- [mofe.io](http://quickref.mofe.io)
|
||||
- [aibk.cn](https://quickref.aibk.cn)
|
||||
- [jgeek.cn](http://reference.jgeek.cn/)
|
||||
- [laoleng.vip](http://bbs.laoleng.vip/reference/)
|
||||
- [liujiapeng.com](https://www.liujiapeng.com/)
|
||||
- [dbyun.net](https://www.dbyun.net/reference/index.html)
|
||||
- [dc6.fun](https://dc6.fun/reference/)
|
||||
- [if010.com](https://quickref.if010.com/)
|
||||
- [pipecraft.net](https://quickref.pipecraft.net/)
|
||||
- [isteed.cc](https://ref.isteed.cc/)
|
||||
- [1han.wiki](https://code.1han.wiki/)
|
||||
- [linzhe.top](https://linzhe.top/)
|
||||
- [xushanxiang.com](https://xushanxiang.com/ref/)
|
||||
- [winnerzr01.github.io](https://winnerzr01.github.io/Quick-Reference/index.html)
|
||||
- [quickref.hestudio.net](https://quickref.hestudio.net)
|
||||
- [surcode.cn](https://ref.surcode.cn)
|
||||
- [cms.im](https://quickref.cms.im/)
|
||||
- [nuomiphp.com](https://reference.tool.nuomiphp.com/)
|
||||
- [eryajf.net](https://ref.eryajf.net/)
|
||||
- [kjchmc.cn](https://ref.kjchmc.cn/)
|
||||
- [likeadmin.cn](https://www.likeadmin.cn/quickref/)
|
||||
- [qiubit.cc](http://ref.qiubit.cc)
|
||||
- [aoh.cc](https://aoh.cc/)
|
||||
- [reference.code05.com](https://reference.code05.com/)
|
||||
- [kyoma.top](https://reference.kyoma.top/)
|
||||
- [quickreference.pages.dev](https://quickreference.pages.dev/)
|
||||
- [code05.com](https://reference.code05.com/)
|
||||
- [xhfun.cn](https://ref.xhfun.cn/)
|
||||
- [ownit.top](https://memo.ownit.top/)
|
||||
|
||||
感谢🙏
|
||||
|
||||
## 利用 Github Actions 定时任务来完成自动更新
|
||||
|
||||
在仓库添加 `.github/workflows/update-ref.yml` 文件 Github Actions 配置,感谢 @eryajf https://github.com/jaywcjlove/reference/issues/102#issuecomment-1368158419 提供方法
|
||||
|
||||
```yml
|
||||
name: 每8个小时更新一次reference
|
||||
on:
|
||||
schedule:
|
||||
- cron: '21 */8 * * *' # 定时任务
|
||||
workflow_dispatch: # 手动运行
|
||||
|
||||
env: # 设置环境变量
|
||||
TZ: Asia/Shanghai # 时区(设置时区可使页面中的`最近更新时间`使用时区时间)
|
||||
|
||||
jobs:
|
||||
build: # 自定义名称
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 🚜 拉取最新代码
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
ref: 'main'
|
||||
repository: 'jaywcjlove/reference'
|
||||
|
||||
- name: ♻️ 编译静态文件
|
||||
run: |
|
||||
echo -e 'REF_URL=https://refs.xxx.net/\nREF_LABEL=网站首页' > .env
|
||||
npm install
|
||||
npm run build
|
||||
|
||||
- name: 🚁 部署到服务器
|
||||
uses: wlixcc/SFTP-Deploy-Action@v1.0
|
||||
with:
|
||||
username: 'root' #ssh user name
|
||||
port: '22' # 远程服务器ssh端口,默认22
|
||||
server: 'prod.refs.xxx.net' # 远程服务器IP
|
||||
ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }} # 认证服务器秘钥对的私钥
|
||||
local_path: './dist/*' # 对应我们项目打包后的静态文件路径
|
||||
remote_path: '/data/www/refs.xxx.net' # 服务器上的路径
|
||||
delete_remote_files: true
|
||||
```
|
||||
|
||||
## 贡献
|
||||
|
||||
请参阅[贡献指南](./CONTRIBUTING.md)了解如何开始。一如既往,感谢我们出色的贡献者!
|
||||
|
||||
<!--GAMFC--><a href="https://github.com/jaywcjlove" title="小弟调调™">
|
||||
<img src="https://avatars.githubusercontent.com/u/1680273?v=4" width="42;" alt="小弟调调™"/>
|
||||
</a>
|
||||
<a href="https://github.com/Jack-Zhang-1314" title="fw_qaq">
|
||||
<img src="https://avatars.githubusercontent.com/u/82551626?v=4" width="42;" alt="fw_qaq"/>
|
||||
</a>
|
||||
<a href="https://github.com/mofelee" title="mofelee">
|
||||
<img src="https://avatars.githubusercontent.com/u/5069410?v=4" width="42;" alt="mofelee"/>
|
||||
</a>
|
||||
<a href="https://github.com/Alex-Programer" title="Alex">
|
||||
<img src="https://avatars.githubusercontent.com/u/115539090?v=4" width="42;" alt="Alex"/>
|
||||
</a>
|
||||
<a href="https://github.com/JeffersonHuang" title="Jefferson">
|
||||
<img src="https://avatars.githubusercontent.com/u/47512530?v=4" width="42;" alt="Jefferson"/>
|
||||
</a>
|
||||
<a href="https://github.com/expoli" title="expoli">
|
||||
<img src="https://avatars.githubusercontent.com/u/31023767?v=4" width="42;" alt="expoli"/>
|
||||
</a>
|
||||
<a href="https://github.com/sjh42" title="42:p">
|
||||
<img src="https://avatars.githubusercontent.com/u/34529275?v=4" width="42;" alt="42:p"/>
|
||||
</a>
|
||||
<a href="https://github.com/partoneplay" title="partoneplay">
|
||||
<img src="https://avatars.githubusercontent.com/u/5189132?v=4" width="42;" alt="partoneplay"/>
|
||||
</a>
|
||||
<a href="https://github.com/ryanhex53" title="ryanhex53">
|
||||
<img src="https://avatars.githubusercontent.com/u/360426?v=4" width="42;" alt="ryanhex53"/>
|
||||
</a>
|
||||
<a href="https://github.com/catcto" title="喵仙人">
|
||||
<img src="https://avatars.githubusercontent.com/u/5467932?v=4" width="42;" alt="喵仙人"/>
|
||||
</a>
|
||||
<a href="https://github.com/13812700839" title="花殇">
|
||||
<img src="https://avatars.githubusercontent.com/u/58072506?v=4" width="42;" alt="花殇"/>
|
||||
</a>
|
||||
<a href="https://github.com/Smartdousha" title="Anko">
|
||||
<img src="https://avatars.githubusercontent.com/u/52566311?v=4" width="42;" alt="Anko"/>
|
||||
</a>
|
||||
<a href="https://github.com/Brid9e" title="Brid9e">
|
||||
<img src="https://avatars.githubusercontent.com/u/85558909?v=4" width="42;" alt="Brid9e"/>
|
||||
</a>
|
||||
<a href="https://github.com/CharlotteZeng" title="Chart">
|
||||
<img src="https://avatars.githubusercontent.com/u/19461184?v=4" width="42;" alt="Chart"/>
|
||||
</a>
|
||||
<a href="https://github.com/DaiNing810" title="DaiN">
|
||||
<img src="https://avatars.githubusercontent.com/u/94962339?v=4" width="42;" alt="DaiN"/>
|
||||
</a>
|
||||
<a href="https://github.com/demigodliu" title="DemigodLiu">
|
||||
<img src="https://avatars.githubusercontent.com/u/30372735?v=4" width="42;" alt="DemigodLiu"/>
|
||||
</a>
|
||||
<a href="https://github.com/jasnzhuang" title="Jason Zhuang">
|
||||
<img src="https://avatars.githubusercontent.com/u/16612921?v=4" width="42;" alt="Jason Zhuang"/>
|
||||
</a>
|
||||
<a href="https://github.com/JetSquirrel" title="JetSquirrel">
|
||||
<img src="https://avatars.githubusercontent.com/u/20291255?v=4" width="42;" alt="JetSquirrel"/>
|
||||
</a>
|
||||
<a href="https://github.com/Lihuagreek" title="Lihuagreek">
|
||||
<img src="https://avatars.githubusercontent.com/u/51040740?v=4" width="42;" alt="Lihuagreek"/>
|
||||
</a>
|
||||
<a href="https://github.com/LufsX" title="LufsX">
|
||||
<img src="https://avatars.githubusercontent.com/u/33221883?v=4" width="42;" alt="LufsX"/>
|
||||
</a>
|
||||
<a href="https://github.com/mariuszmichalowski" title="Mariusz Michalowski">
|
||||
<img src="https://avatars.githubusercontent.com/u/92091891?v=4" width="42;" alt="Mariusz Michalowski"/>
|
||||
</a>
|
||||
<a href="https://github.com/HanaNoryu" title="Noryu">
|
||||
<img src="https://avatars.githubusercontent.com/u/109856546?v=4" width="42;" alt="Noryu"/>
|
||||
</a>
|
||||
<a href="https://github.com/whb1998a" title="WHB">
|
||||
<img src="https://avatars.githubusercontent.com/u/44045064?v=4" width="42;" alt="WHB"/>
|
||||
</a>
|
||||
<a href="https://github.com/y52y" title="Zyj">
|
||||
<img src="https://avatars.githubusercontent.com/u/51304324?v=4" width="42;" alt="Zyj"/>
|
||||
</a>
|
||||
<a href="https://github.com/chyok" title="chyok">
|
||||
<img src="https://avatars.githubusercontent.com/u/32629225?v=4" width="42;" alt="chyok"/>
|
||||
</a>
|
||||
<a href="https://github.com/gaoxiaoduan" title="coderduan">
|
||||
<img src="https://avatars.githubusercontent.com/u/69953511?v=4" width="42;" alt="coderduan"/>
|
||||
</a>
|
||||
<a href="https://github.com/cool9203" title="cool9203">
|
||||
<img src="https://avatars.githubusercontent.com/u/29609607?v=4" width="42;" alt="cool9203"/>
|
||||
</a>
|
||||
<a href="https://github.com/godotc" title="godotc">
|
||||
<img src="https://avatars.githubusercontent.com/u/79260851?v=4" width="42;" alt="godotc"/>
|
||||
</a>
|
||||
<a href="https://github.com/greyhao" title="greyhao">
|
||||
<img src="https://avatars.githubusercontent.com/u/107107440?v=4" width="42;" alt="greyhao"/>
|
||||
</a>
|
||||
<a href="https://github.com/hua03" title="hua03">
|
||||
<img src="https://avatars.githubusercontent.com/u/19561959?v=4" width="42;" alt="hua03"/>
|
||||
</a>
|
||||
<a href="https://github.com/hweining" title="hweining">
|
||||
<img src="https://avatars.githubusercontent.com/u/8973985?v=4" width="42;" alt="hweining"/>
|
||||
</a>
|
||||
<a href="https://github.com/k983551019" title="k983551019">
|
||||
<img src="https://avatars.githubusercontent.com/u/48147837?v=4" width="42;" alt="k983551019"/>
|
||||
</a>
|
||||
<a href="https://github.com/kdxcxs" title="kdxcxs">
|
||||
<img src="https://avatars.githubusercontent.com/u/18746192?v=4" width="42;" alt="kdxcxs"/>
|
||||
</a>
|
||||
<a href="https://github.com/larry-xue" title="larry">
|
||||
<img src="https://avatars.githubusercontent.com/u/48818060?v=4" width="42;" alt="larry"/>
|
||||
</a>
|
||||
<a href="https://github.com/liliangrong777" title="liliangrong777">
|
||||
<img src="https://avatars.githubusercontent.com/u/58727146?v=4" width="42;" alt="liliangrong777"/>
|
||||
</a>
|
||||
<a href="https://github.com/lykjjj" title="lykjjj">
|
||||
<img src="https://avatars.githubusercontent.com/u/58510058?v=4" width="42;" alt="lykjjj"/>
|
||||
</a>
|
||||
<a href="https://github.com/mancuoj" title="mancuoj">
|
||||
<img src="https://avatars.githubusercontent.com/u/45707684?v=4" width="42;" alt="mancuoj"/>
|
||||
</a>
|
||||
<a href="https://github.com/onewesong" title="onewesong">
|
||||
<img src="https://avatars.githubusercontent.com/u/17920822?v=4" width="42;" alt="onewesong"/>
|
||||
</a>
|
||||
<a href="https://github.com/wjjwkwindy" title="wjjwkwindy">
|
||||
<img src="https://avatars.githubusercontent.com/u/9508591?v=4" width="42;" alt="wjjwkwindy"/>
|
||||
</a>
|
||||
<a href="https://github.com/xing133" title="xing133">
|
||||
<img src="https://avatars.githubusercontent.com/u/5336490?v=4" width="42;" alt="xing133"/>
|
||||
</a>
|
||||
<a href="https://github.com/zxx-457" title="zxx-457">
|
||||
<img src="https://avatars.githubusercontent.com/u/114141362?v=4" width="42;" alt="zxx-457"/>
|
||||
</a>
|
||||
<a href="https://github.com/lvzhenbo" title="吕振波">
|
||||
<img src="https://avatars.githubusercontent.com/u/32427677?v=4" width="42;" alt="吕振波"/>
|
||||
</a>
|
||||
<a href="https://github.com/qyl27" title="秋雨落">
|
||||
<img src="https://avatars.githubusercontent.com/u/53731501?v=4" width="42;" alt="秋雨落"/>
|
||||
</a>
|
||||
<a href="https://github.com/lisheng741" title="芦荟柚子茶">
|
||||
<img src="https://avatars.githubusercontent.com/u/53617305?v=4" width="42;" alt="芦荟柚子茶"/>
|
||||
</a><!--GAMFC-END-->
|
||||
<!--GAMFC--><a href="https://github.com/jaywcjlove" title="小弟调调"><img src="https://avatars.githubusercontent.com/u/1680273?v=4" width="42;" alt="小弟调调"/></a>
|
||||
<a href="https://github.com/fwqaaq" title="fwqaaq"><img src="https://avatars.githubusercontent.com/u/82551626?v=4" width="42;" alt="fwqaaq"/></a>
|
||||
<a href="https://github.com/mofelee" title="mofelee"><img src="https://avatars.githubusercontent.com/u/5069410?v=4" width="42;" alt="mofelee"/></a>
|
||||
<a href="https://github.com/Country-If" title="Maylon"><img src="https://avatars.githubusercontent.com/u/62837275?v=4" width="42;" alt="Maylon"/></a>
|
||||
<a href="https://github.com/JeffersonHuang" title="Jefferson Huang"><img src="https://avatars.githubusercontent.com/u/47512530?v=4" width="42;" alt="Jefferson Huang"/></a>
|
||||
<a href="https://github.com/LesterChang0987" title="Steve Hartwell"><img src="https://avatars.githubusercontent.com/u/114913921?v=4" width="42;" alt="Steve Hartwell"/></a>
|
||||
<a href="https://github.com/nangongchengfeng" title="南宫乘风"><img src="https://avatars.githubusercontent.com/u/46562911?v=4" width="42;" alt="南宫乘风"/></a>
|
||||
<a href="https://github.com/aixcyi" title="砹小翼"><img src="https://avatars.githubusercontent.com/u/75880483?v=4" width="42;" alt="砹小翼"/></a>
|
||||
<a href="https://github.com/Alex20180512" title="Alex"><img src="https://avatars.githubusercontent.com/u/115539090?v=4" width="42;" alt="Alex"/></a>
|
||||
<a href="https://github.com/undefined-hestudio" title="undefined"><img src="https://avatars.githubusercontent.com/u/119711513?v=4" width="42;" alt="undefined"/></a>
|
||||
<a href="https://github.com/eryajf" title="二丫讲梵"><img src="https://avatars.githubusercontent.com/u/33259379?v=4" width="42;" alt="二丫讲梵"/></a>
|
||||
<a href="https://github.com/k23223" title="k23223"><img src="https://avatars.githubusercontent.com/u/57606136?v=4" width="42;" alt="k23223"/></a>
|
||||
<a href="https://github.com/expoli" title="expoli"><img src="https://avatars.githubusercontent.com/u/31023767?v=4" width="42;" alt="expoli"/></a>
|
||||
<a href="https://github.com/mailbaoer" title="baoer"><img src="https://avatars.githubusercontent.com/u/5282978?v=4" width="42;" alt="baoer"/></a>
|
||||
<a href="https://github.com/LufsX" title="LufsX"><img src="https://avatars.githubusercontent.com/u/33221883?v=4" width="42;" alt="LufsX"/></a>
|
||||
<a href="https://github.com/Darkiiiiiice" title="Darkiiiiiice"><img src="https://avatars.githubusercontent.com/u/3959555?v=4" width="42;" alt="Darkiiiiiice"/></a>
|
||||
<a href="https://github.com/genius-kim" title="Kim同学"><img src="https://avatars.githubusercontent.com/u/119488561?v=4" width="42;" alt="Kim同学"/></a>
|
||||
<a href="https://github.com/qyl27" title="秋 雨落"><img src="https://avatars.githubusercontent.com/u/53731501?v=4" width="42;" alt="秋 雨落"/></a>
|
||||
<a href="https://github.com/MackDing" title="Blossom"><img src="https://avatars.githubusercontent.com/u/19878893?v=4" width="42;" alt="Blossom"/></a>
|
||||
<a href="https://github.com/1250422131" title="萌新杰少"><img src="https://avatars.githubusercontent.com/u/52126790?v=4" width="42;" alt="萌新杰少"/></a>
|
||||
<a href="https://github.com/zhangymPerson" title="zhangym"><img src="https://avatars.githubusercontent.com/u/40376181?v=4" width="42;" alt="zhangym"/></a>
|
||||
<a href="https://github.com/chaos-cn" title="chaos"><img src="https://avatars.githubusercontent.com/u/71205599?v=4" width="42;" alt="chaos"/></a>
|
||||
<a href="https://github.com/xia0ne" title="YuRuiH"><img src="https://avatars.githubusercontent.com/u/32591223?v=4" width="42;" alt="YuRuiH"/></a>
|
||||
<a href="https://github.com/Willxup" title="Willxup"><img src="https://avatars.githubusercontent.com/u/51990395?v=4" width="42;" alt="Willxup"/></a>
|
||||
<a href="https://github.com/LiuYuan-SHU" title="Yuan Liu"><img src="https://avatars.githubusercontent.com/u/96400967?v=4" width="42;" alt="Yuan Liu"/></a>
|
||||
<a href="https://github.com/lvelvee" title="Lve Lvee"><img src="https://avatars.githubusercontent.com/u/25785753?v=4" width="42;" alt="Lve Lvee"/></a>
|
||||
<a href="https://github.com/wsypower" title="魏"><img src="https://avatars.githubusercontent.com/u/31298317?v=4" width="42;" alt="魏"/></a>
|
||||
<a href="https://github.com/itldg" title="老大哥"><img src="https://avatars.githubusercontent.com/u/13432299?v=4" width="42;" alt="老大哥"/></a>
|
||||
<a href="https://github.com/catcto" title="小武Alan"><img src="https://avatars.githubusercontent.com/u/5467932?v=4" width="42;" alt="小武Alan"/></a>
|
||||
<a href="https://github.com/ryanhex53" title="ryanhex53"><img src="https://avatars.githubusercontent.com/u/360426?v=4" width="42;" alt="ryanhex53"/></a>
|
||||
<a href="https://github.com/partoneplay" title="partoneplay"><img src="https://avatars.githubusercontent.com/u/5189132?v=4" width="42;" alt="partoneplay"/></a>
|
||||
<a href="https://github.com/pangxiaoli" title="pangxiaoli"><img src="https://avatars.githubusercontent.com/u/54620953?v=4" width="42;" alt="pangxiaoli"/></a>
|
||||
<a href="https://github.com/mancuoj" title="mancuoj"><img src="https://avatars.githubusercontent.com/u/45707684?v=4" width="42;" alt="mancuoj"/></a>
|
||||
<a href="https://github.com/webeautiful" title="Albert"><img src="https://avatars.githubusercontent.com/u/3364316?v=4" width="42;" alt="Albert"/></a>
|
||||
<a href="https://github.com/dadatom" title="Da Da"><img src="https://avatars.githubusercontent.com/u/33886943?v=4" width="42;" alt="Da Da"/></a>
|
||||
<a href="https://github.com/ljq" title="Jack Liu"><img src="https://avatars.githubusercontent.com/u/7278286?v=4" width="42;" alt="Jack Liu"/></a>
|
||||
<a href="https://github.com/jasnzhuang" title="Jason Zhuang"><img src="https://avatars.githubusercontent.com/u/16612921?v=4" width="42;" alt="Jason Zhuang"/></a>
|
||||
<a href="https://github.com/Jovins" title="Jovins"><img src="https://avatars.githubusercontent.com/u/17738992?v=4" width="42;" alt="Jovins"/></a>
|
||||
<a href="https://github.com/SuperDiscovery" title="SuperDiscovery"><img src="https://avatars.githubusercontent.com/u/49646863?v=4" width="42;" alt="SuperDiscovery"/></a>
|
||||
<a href="https://github.com/XYZscratcher" title="XYZ"><img src="https://avatars.githubusercontent.com/u/108533817?v=4" width="42;" alt="XYZ"/></a>
|
||||
<a href="https://github.com/findnr" title="findnr"><img src="https://avatars.githubusercontent.com/u/3909023?v=4" width="42;" alt="findnr"/></a>
|
||||
<a href="https://github.com/greyhao" title="greyhao"><img src="https://avatars.githubusercontent.com/u/107107440?v=4" width="42;" alt="greyhao"/></a>
|
||||
<a href="https://github.com/1834423612" title="kjch"><img src="https://avatars.githubusercontent.com/u/49981661?v=4" width="42;" alt="kjch"/></a>
|
||||
<a href="https://github.com/sunny0826" title="Xudong Guo"><img src="https://avatars.githubusercontent.com/u/24563928?v=4" width="42;" alt="Xudong Guo"/></a>
|
||||
<a href="https://github.com/gzttcydxx" title="gzttcydxx"><img src="https://avatars.githubusercontent.com/u/50025185?v=4" width="42;" alt="gzttcydxx"/></a>
|
||||
<a href="https://github.com/hua03" title="hua03"><img src="https://avatars.githubusercontent.com/u/19561959?v=4" width="42;" alt="hua03"/></a>
|
||||
<a href="https://github.com/yanxuplay" title="hupilan"><img src="https://avatars.githubusercontent.com/u/69749541?v=4" width="42;" alt="hupilan"/></a>
|
||||
<a href="https://github.com/hweining" title="hweining"><img src="https://avatars.githubusercontent.com/u/8973985?v=4" width="42;" alt="hweining"/></a>
|
||||
<a href="https://github.com/infanx" title="infanx"><img src="https://avatars.githubusercontent.com/u/65985757?v=4" width="42;" alt="infanx"/></a>
|
||||
<a href="https://github.com/auroraslot" title="irony"><img src="https://avatars.githubusercontent.com/u/48817882?v=4" width="42;" alt="irony"/></a>
|
||||
<a href="https://github.com/jlchen5" title="jlchen5"><img src="https://avatars.githubusercontent.com/u/61578993?v=4" width="42;" alt="jlchen5"/></a>
|
||||
<a href="https://github.com/joyfully-W" title="joyfully-W"><img src="https://avatars.githubusercontent.com/u/32212924?v=4" width="42;" alt="joyfully-W"/></a>
|
||||
<a href="https://github.com/jqzhao7" title="jqzhao"><img src="https://avatars.githubusercontent.com/u/54694535?v=4" width="42;" alt="jqzhao"/></a>
|
||||
<a href="https://github.com/jussker" title="jussker"><img src="https://avatars.githubusercontent.com/u/33953356?v=4" width="42;" alt="jussker"/></a>
|
||||
<a href="https://github.com/k983551019" title="k983551019"><img src="https://avatars.githubusercontent.com/u/48147837?v=4" width="42;" alt="k983551019"/></a>
|
||||
<a href="https://github.com/Zeng-qh" title="都一样"><img src="https://avatars.githubusercontent.com/u/40046415?v=4" width="42;" alt="都一样"/></a>
|
||||
<a href="https://github.com/nodjoy" title="gowshwah"><img src="https://avatars.githubusercontent.com/u/145280043?v=4" width="42;" alt="gowshwah"/></a>
|
||||
<a href="https://github.com/godotc" title="godot42"><img src="https://avatars.githubusercontent.com/u/79260851?v=4" width="42;" alt="godot42"/></a>
|
||||
<a href="https://github.com/gi-b716" title="Gavin"><img src="https://avatars.githubusercontent.com/u/78394473?v=4" width="42;" alt="Gavin"/></a>
|
||||
<a href="https://github.com/fjqz177" title="fjqz177"><img src="https://avatars.githubusercontent.com/u/83070583?v=4" width="42;" alt="fjqz177"/></a>
|
||||
<a href="https://github.com/fakevn" title="fakevn"><img src="https://avatars.githubusercontent.com/u/11464386?v=4" width="42;" alt="fakevn"/></a>
|
||||
<a href="https://github.com/cool9203" title="cool9203"><img src="https://avatars.githubusercontent.com/u/29609607?v=4" width="42;" alt="cool9203"/></a>
|
||||
<a href="https://github.com/gaoxiaoduan" title="CoderDuan"><img src="https://avatars.githubusercontent.com/u/69953511?v=4" width="42;" alt="CoderDuan"/></a>
|
||||
<a href="https://github.com/lijc210" title="cizai"><img src="https://avatars.githubusercontent.com/u/10651081?v=4" width="42;" alt="cizai"/></a>
|
||||
<a href="https://github.com/chyok" title="chyok"><img src="https://avatars.githubusercontent.com/u/32629225?v=4" width="42;" alt="chyok"/></a>
|
||||
<a href="https://github.com/zlfyuan" title="bgbgPang"><img src="https://avatars.githubusercontent.com/u/19658018?v=4" width="42;" alt="bgbgPang"/></a>
|
||||
<a href="https://github.com/Lmmmmmm-bb" title="_lmmmmmm"><img src="https://avatars.githubusercontent.com/u/54026110?v=4" width="42;" alt="_lmmmmmm"/></a>
|
||||
<a href="https://github.com/y52y" title="Zyj"><img src="https://avatars.githubusercontent.com/u/51304324?v=4" width="42;" alt="Zyj"/></a>
|
||||
<a href="https://github.com/Leaderzhangyi" title="ZinkCas"><img src="https://avatars.githubusercontent.com/u/46915666?v=4" width="42;" alt="ZinkCas"/></a>
|
||||
<a href="https://github.com/binscor" title="Zheng Nai Bin"><img src="https://avatars.githubusercontent.com/u/37325821?v=4" width="42;" alt="Zheng Nai Bin"/></a>
|
||||
<a href="https://github.com/qwxingzhe" title="行者"><img src="https://avatars.githubusercontent.com/u/7071651?v=4" width="42;" alt="行者"/></a>
|
||||
<a href="https://github.com/HanaChan233" title="花开花落"><img src="https://avatars.githubusercontent.com/u/75212820?v=4" width="42;" alt="花开花落"/></a>
|
||||
<a href="https://github.com/lisheng741" title="芦荟柚子茶"><img src="https://avatars.githubusercontent.com/u/53617305?v=4" width="42;" alt="芦荟柚子茶"/></a>
|
||||
<a href="https://github.com/ZIDOUZI" title="ZIDOUZI"><img src="https://avatars.githubusercontent.com/u/53157536?v=4" width="42;" alt="ZIDOUZI"/></a>
|
||||
<a href="https://github.com/LuckyJie12" title="夜未央"><img src="https://avatars.githubusercontent.com/u/102901105?v=4" width="42;" alt="夜未央"/></a>
|
||||
<a href="https://github.com/lvzhenbo" title="吕振波"><img src="https://avatars.githubusercontent.com/u/32427677?v=4" width="42;" alt="吕振波"/></a>
|
||||
<a href="https://github.com/zxx457" title="zxx457"><img src="https://avatars.githubusercontent.com/u/114141362?v=4" width="42;" alt="zxx457"/></a>
|
||||
<a href="https://github.com/zhouhw0306" title="zhouhw0306"><img src="https://avatars.githubusercontent.com/u/82752681?v=4" width="42;" alt="zhouhw0306"/></a>
|
||||
<a href="https://github.com/hiyms" title="yms"><img src="https://avatars.githubusercontent.com/u/84654050?v=4" width="42;" alt="yms"/></a>
|
||||
<a href="https://github.com/xing133" title="xing133"><img src="https://avatars.githubusercontent.com/u/5336490?v=4" width="42;" alt="xing133"/></a>
|
||||
<a href="https://github.com/wjjwkwindy" title="Hudson Alen"><img src="https://avatars.githubusercontent.com/u/9508591?v=4" width="42;" alt="Hudson Alen"/></a>
|
||||
<a href="https://github.com/wannima66" title="tmen"><img src="https://avatars.githubusercontent.com/u/26410255?v=4" width="42;" alt="tmen"/></a>
|
||||
<a href="https://github.com/swift-fs" title="swift"><img src="https://avatars.githubusercontent.com/u/77133741?v=4" width="42;" alt="swift"/></a>
|
||||
<a href="https://github.com/suyangzuo" title="suyangzuo"><img src="https://avatars.githubusercontent.com/u/50766353?v=4" width="42;" alt="suyangzuo"/></a>
|
||||
<a href="https://github.com/Mowmowj" title="nexo"><img src="https://avatars.githubusercontent.com/u/24759562?v=4" width="42;" alt="nexo"/></a>
|
||||
<a href="https://github.com/phygerr" title="phygerr"><img src="https://avatars.githubusercontent.com/u/42068889?v=4" width="42;" alt="phygerr"/></a>
|
||||
<a href="https://github.com/onewesong" title="onewesong"><img src="https://avatars.githubusercontent.com/u/17920822?v=4" width="42;" alt="onewesong"/></a>
|
||||
<a href="https://github.com/miclon-dev" title="miclon-dev"><img src="https://avatars.githubusercontent.com/u/111753685?v=4" width="42;" alt="miclon-dev"/></a>
|
||||
<a href="https://github.com/lykjjj" title="lykjjj"><img src="https://avatars.githubusercontent.com/u/58510058?v=4" width="42;" alt="lykjjj"/></a>
|
||||
<a href="https://github.com/lozhu20" title="lozhu"><img src="https://avatars.githubusercontent.com/u/44923922?v=4" width="42;" alt="lozhu"/></a>
|
||||
<a href="https://github.com/liliangrong777" title="liliangrong777"><img src="https://avatars.githubusercontent.com/u/58727146?v=4" width="42;" alt="liliangrong777"/></a>
|
||||
<a href="https://github.com/larry-xue" title="larry"><img src="https://avatars.githubusercontent.com/u/48818060?v=4" width="42;" alt="larry"/></a>
|
||||
<a href="https://github.com/kubeme" title="kubernetes for me"><img src="https://avatars.githubusercontent.com/u/16346220?v=4" width="42;" alt="kubernetes for me"/></a>
|
||||
<a href="https://github.com/kdxcxs" title="kdxcxs"><img src="https://avatars.githubusercontent.com/u/18746192?v=4" width="42;" alt="kdxcxs"/></a>
|
||||
<a href="https://github.com/zhu0629" title="zhucong"><img src="https://avatars.githubusercontent.com/u/13188450?v=4" width="42;" alt="zhucong"/></a>
|
||||
<a href="https://github.com/likeshop-github" title="likeshop技术社区"><img src="https://avatars.githubusercontent.com/u/77180968?v=4" width="42;" alt="likeshop技术社区"/></a>
|
||||
<a href="https://github.com/Lihuagreek" title="Lihuagreek"><img src="https://avatars.githubusercontent.com/u/51040740?v=4" width="42;" alt="Lihuagreek"/></a>
|
||||
<a href="https://github.com/LightQuanta" title="Light_Quanta"><img src="https://avatars.githubusercontent.com/u/18213217?v=4" width="42;" alt="Light_Quanta"/></a>
|
||||
<a href="https://github.com/JetSquirrel" title="JetSquirrel"><img src="https://avatars.githubusercontent.com/u/20291255?v=4" width="42;" alt="JetSquirrel"/></a>
|
||||
<a href="https://github.com/jeremyjone" title="Jeremy Jone"><img src="https://avatars.githubusercontent.com/u/37676231?v=4" width="42;" alt="Jeremy Jone"/></a>
|
||||
<a href="https://github.com/JavaZeroo" title="JavaZero"><img src="https://avatars.githubusercontent.com/u/71128095?v=4" width="42;" alt="JavaZero"/></a>
|
||||
<a href="https://github.com/Ding-Kyoma" title="HooinKyoma"><img src="https://avatars.githubusercontent.com/u/44542198?v=4" width="42;" alt="HooinKyoma"/></a>
|
||||
<a href="https://github.com/gongyeheyu" title="GONGYE Heyu"><img src="https://avatars.githubusercontent.com/u/85177605?v=4" width="42;" alt="GONGYE Heyu"/></a>
|
||||
<a href="https://github.com/Fuku-L" title="Fuku-L"><img src="https://avatars.githubusercontent.com/u/38535911?v=4" width="42;" alt="Fuku-L"/></a>
|
||||
<a href="https://github.com/sirius-fan" title="Fan"><img src="https://avatars.githubusercontent.com/u/25720015?v=4" width="42;" alt="Fan"/></a>
|
||||
<a href="https://github.com/eeeeeio" title="EEEEE"><img src="https://avatars.githubusercontent.com/u/20723545?v=4" width="42;" alt="EEEEE"/></a>
|
||||
<a href="https://github.com/demigodliu" title="DemigodLiu"><img src="https://avatars.githubusercontent.com/u/30372735?v=4" width="42;" alt="DemigodLiu"/></a>
|
||||
<a href="https://github.com/dasferco" title="Dasferco"><img src="https://avatars.githubusercontent.com/u/92622404?v=4" width="42;" alt="Dasferco"/></a>
|
||||
<a href="https://github.com/Damao2250" title="Damao"><img src="https://avatars.githubusercontent.com/u/19251992?v=4" width="42;" alt="Damao"/></a>
|
||||
<a href="https://github.com/DEEMO101" title="DEEMO101"><img src="https://avatars.githubusercontent.com/u/35123091?v=4" width="42;" alt="DEEMO101"/></a>
|
||||
<a href="https://github.com/ohto-ai" title="Choo"><img src="https://avatars.githubusercontent.com/u/46275725?v=4" width="42;" alt="Choo"/></a>
|
||||
<a href="https://github.com/CharlotteZeng" title="hanchZ"><img src="https://avatars.githubusercontent.com/u/19461184?v=4" width="42;" alt="hanchZ"/></a>
|
||||
<a href="https://github.com/ch3nnn" title="chentong"><img src="https://avatars.githubusercontent.com/u/40114564?v=4" width="42;" alt="chentong"/></a>
|
||||
<a href="https://github.com/Brid9e" title="Joe"><img src="https://avatars.githubusercontent.com/u/85558909?v=4" width="42;" alt="Joe"/></a>
|
||||
<a href="https://github.com/BobH-Official" title="BobH"><img src="https://avatars.githubusercontent.com/u/29333228?v=4" width="42;" alt="BobH"/></a>
|
||||
<a href="https://github.com/Blanket58" title="Blanket58"><img src="https://avatars.githubusercontent.com/u/39766189?v=4" width="42;" alt="Blanket58"/></a>
|
||||
<a href="https://github.com/BlacAmDK" title="BlacAmDK"><img src="https://avatars.githubusercontent.com/u/10971397?v=4" width="42;" alt="BlacAmDK"/></a>
|
||||
<a href="https://github.com/gitchenze" title="Aze"><img src="https://avatars.githubusercontent.com/u/13357869?v=4" width="42;" alt="Aze"/></a>
|
||||
<a href="https://github.com/dousha0w0" title="dousha0w0"><img src="https://avatars.githubusercontent.com/u/52566311?v=4" width="42;" alt="dousha0w0"/></a>
|
||||
<a href="https://github.com/13812700839" title="花殇"><img src="https://avatars.githubusercontent.com/u/58072506?v=4" width="42;" alt="花殇"/></a>
|
||||
<a href="https://github.com/yikuaibro" title="yikuaibro"><img src="https://avatars.githubusercontent.com/u/44493045?v=4" width="42;" alt="yikuaibro"/></a>
|
||||
<a href="https://github.com/dfshizhiqiang" title="Zech"><img src="https://avatars.githubusercontent.com/u/7030019?v=4" width="42;" alt="Zech"/></a>
|
||||
<a href="https://github.com/Yo-gurts" title="Yogurt"><img src="https://avatars.githubusercontent.com/u/44612841?v=4" width="42;" alt="Yogurt"/></a>
|
||||
<a href="https://github.com/hi-liyan" title="李李李"><img src="https://avatars.githubusercontent.com/u/40056492?v=4" width="42;" alt="李李李"/></a>
|
||||
<a href="https://github.com/BATTLEHAWK00" title="While True: learn()"><img src="https://avatars.githubusercontent.com/u/45313304?v=4" width="42;" alt="While True: learn()"/></a>
|
||||
<a href="https://github.com/dwgeneral" title="Happy-Engineer"><img src="https://avatars.githubusercontent.com/u/8654993?v=4" width="42;" alt="Happy-Engineer"/></a>
|
||||
<a href="https://github.com/whb1998a" title="Wafer"><img src="https://avatars.githubusercontent.com/u/44045064?v=4" width="42;" alt="Wafer"/></a>
|
||||
<a href="https://github.com/YLee9527" title="Terry Young"><img src="https://avatars.githubusercontent.com/u/18697332?v=4" width="42;" alt="Terry Young"/></a>
|
||||
<a href="https://github.com/TRDSCSH" title="TRDSCSH"><img src="https://avatars.githubusercontent.com/u/125717891?v=4" width="42;" alt="TRDSCSH"/></a>
|
||||
<a href="https://github.com/Xiwin" title="Xiwin"><img src="https://avatars.githubusercontent.com/u/107191230?v=4" width="42;" alt="Xiwin"/></a>
|
||||
<a href="https://github.com/DataEraserC" title="Sacabambaspis"><img src="https://avatars.githubusercontent.com/u/102341238?v=4" width="42;" alt="Sacabambaspis"/></a>
|
||||
<a href="https://github.com/qinxiongzhou" title="Ryan Zhou"><img src="https://avatars.githubusercontent.com/u/33239096?v=4" width="42;" alt="Ryan Zhou"/></a>
|
||||
<a href="https://github.com/RivailleF" title="RivailleF"><img src="https://avatars.githubusercontent.com/u/93083015?v=4" width="42;" alt="RivailleF"/></a>
|
||||
<a href="https://github.com/QDelta" title="QDelta"><img src="https://avatars.githubusercontent.com/u/60222316?v=4" width="42;" alt="QDelta"/></a>
|
||||
<a href="https://github.com/sevenleave" title="Poirot Hercule"><img src="https://avatars.githubusercontent.com/u/24411140?v=4" width="42;" alt="Poirot Hercule"/></a>
|
||||
<a href="https://github.com/PipecraftNet" title="Pipecraft"><img src="https://avatars.githubusercontent.com/u/88728670?v=4" width="42;" alt="Pipecraft"/></a>
|
||||
<a href="https://github.com/Perzch" title="Perzch"><img src="https://avatars.githubusercontent.com/u/67987641?v=4" width="42;" alt="Perzch"/></a>
|
||||
<a href="https://github.com/PILIHU2022" title="PILIHU2022"><img src="https://avatars.githubusercontent.com/u/100511118?v=4" width="42;" alt="PILIHU2022"/></a>
|
||||
<a href="https://github.com/HanaNoryu" title="Noryu"><img src="https://avatars.githubusercontent.com/u/109856546?v=4" width="42;" alt="Noryu"/></a>
|
||||
<a href="https://github.com/NianwenDan" title="NianwenDan"><img src="https://avatars.githubusercontent.com/u/74407127?v=4" width="42;" alt="NianwenDan"/></a>
|
||||
<a href="https://github.com/mo3et" title="Monet Lee"><img src="https://avatars.githubusercontent.com/u/34803812?v=4" width="42;" alt="Monet Lee"/></a>
|
||||
<a href="https://github.com/Moeyuuko" title="Moeyuuko"><img src="https://avatars.githubusercontent.com/u/14266681?v=4" width="42;" alt="Moeyuuko"/></a>
|
||||
<a href="https://github.com/malcolmyu" title="Minghao Yu"><img src="https://avatars.githubusercontent.com/u/3203962?v=4" width="42;" alt="Minghao Yu"/></a>
|
||||
<a href="https://github.com/mariuszmichalowski" title="Mariusz Michalowski"><img src="https://avatars.githubusercontent.com/u/92091891?v=4" width="42;" alt="Mariusz Michalowski"/></a>
|
||||
<a href="https://github.com/isecret" title="Mao Wang"><img src="https://avatars.githubusercontent.com/u/15724152?v=4" width="42;" alt="Mao Wang"/></a><!--GAMFC-END-->
|
||||
|
||||
上图贡献者列表,由 [contributors](https://github.com/jaywcjlove/github-action-contributors) 自动生成贡献者图片。
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
# https://lipanski.com/posts/smallest-docker-image-static-website
|
||||
# https://github.com/lipanski/docker-static-website
|
||||
FROM lipanski/docker-static-website:latest
|
||||
FROM wcjiang/docker-static-website:latest
|
||||
|
||||
# Copy the static website
|
||||
# Use the .dockerignore file to control what ends up inside the image!
|
||||
|
558
README.md
@ -2,6 +2,7 @@ Quick Reference
|
||||
===
|
||||
|
||||
<!--rehype:ignore:start-->
|
||||
[](https://jaywcjlove.github.io/#/sponsor)
|
||||
[](https://github.com/jaywcjlove/reference/actions/workflows/ci.yml)
|
||||
[](https://hub.docker.com/r/wcjiang/reference)
|
||||
[](https://hub.docker.com/r/wcjiang/reference)
|
||||
@ -16,153 +17,236 @@ Quick Reference
|
||||
|
||||
## 正在建设中...
|
||||
|
||||
坑已挖,需要您的参与完善和贡献!🙏
|
||||
坑已挖,需要您的参与完善和[贡献](./docs/quickreference.md)!🙏
|
||||
<!--rehype:style=padding-bottom: 23px;-->
|
||||
|
||||
[Ansible](./docs/ansible.md)<!--rehype:style=background: rgb(238 0 0);&class=contributing tag&data-lang=RedHat&data-info=👆看看还缺点儿什么?-->
|
||||
[CMake](./docs/cmake.md)<!--rehype:style=background: rgb(92 107 192);&class=contributing-->
|
||||
[C#](./docs/cs.md)<!--rehype:style=background: rgb(6 147 13);&class=contributing-->
|
||||
[Django](./docs/djiango.md)<!--rehype:style=background: rgb(12 75 51);&class=contributing tag&data-lang=Python-->
|
||||
[Django](./docs/django.md)<!--rehype:style=background: rgb(12 75 51);&class=contributing tag&data-lang=Python-->
|
||||
[FFmpeg](./docs/ffmpeg.md)<!--rehype:style=background: rgb(0 193 9);&class=contributing-->
|
||||
[Flask](./docs/flask.md)<!--rehype:style=background: rgb(210 168 255);&class=contributing tag&data-lang=Python-->
|
||||
[FastAPI](./docs/fastapi.md)<!--rehype:style=background: rgb(210 168 255);&class=contributing tag&data-lang=Python-->
|
||||
[Flutter](./docs/flutter.md)<!--rehype:style=background: rgb(150 220 254);&class=contributing tag&data-lang=Dart-->
|
||||
[Gitlab CI/CD](./docs/gitlab-ci.md)<!--rehype:style=background: rgb(226 67 41);&class=contributing-->
|
||||
[LaTeX](./docs/latex.md)<!--rehype:style=background: rgb(0 128 128);&class=contributing-->
|
||||
[Lua](./docs/lua.md)<!--rehype:style=background: rgb(3 3 128);-->
|
||||
[Lua](./docs/lua.md)<!--rehype:style=background: rgb(3 3 128);&class=contributing-->
|
||||
[NestJS](./docs/nestjs.md)<!--rehype:style=background: rgb(237 21 67);&class=contributing-->
|
||||
[MATLAB](./docs/matlab.md)<!--rehype:style=background: rgb(0 118 168);&class=contributing-->
|
||||
[Oracle](./docs/oracle.md)<!--rehype:style=background: rgb(255 0 0);&class=contributing tag&data-lang=SQL-->
|
||||
[Pytorch](./docs/pytorch.md)<!--rehype:style=background: rgb(238 76 44);&class=contributing tag&data-lang=Python&data-info=👆看看还缺点儿什么?-->
|
||||
[Vue 3](./docs/vue.md)<!--rehype:style=background: rgb(64 184 131);&class=contributing-->
|
||||
[Github Copilot](./docs/github-copilot.md)<!--rehype:style=background: rgb(125 45 220);&class=tag contributing&data-lang=AI&data-info=👆看看还缺点儿什么?-->
|
||||
[Chown](./docs/chown.md)<!--rehype:style=background: rgb(12 75 51/var(\-\-bg\-opacity));&class=contributing-->
|
||||
[R 语言](./docs/r.md)<!--rehype:style=background: rgb(39 108 192);&class=contributing-->
|
||||
[Elixir](./docs/elixir.md)<!--rehype:style=background: rgb(124 26 156);&class=contributing tag&data-lang=Elixir-->
|
||||
[Tauri](./docs/tauri.md)<!--rehype:style=background: rgb(103 214 237);&class=contributing-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
## 编程
|
||||
|
||||
[Bash](./docs/bash.md)<!--rehype:style=background: rgb(72 143 223);-->
|
||||
[C](./docs/c.md)<!--rehype:style=background: rgb(92 107 192);-->
|
||||
[C 语言](./docs/c.md)<!--rehype:style=background: rgb(92 107 192);-->
|
||||
[C#](./docs/cs.md)<!--rehype:style=background: rgb(6 147 13);&class=contributing-->
|
||||
[C++](./docs/cpp.md)<!--rehype:style=background: rgb(6 147 13);&class=contributing-->
|
||||
[Dart](./docs/dart.md)<!--rehype:style=background: rgb(64 196 255);-->
|
||||
[Docker](./docs/docker.md)<!--rehype:style=background: rgb(72 143 223);-->
|
||||
[Dockerfile](./docs/dockerfile.md)<!--rehype:style=background: rgb(0 72 153);&class=tag&data-lang=Docker-->
|
||||
[Django](./docs/djiango.md)<!--rehype:style=background: rgb(12 75 51);&class=contributing tag&data-lang=Python-->
|
||||
[Django](./docs/django.md)<!--rehype:style=background: rgb(12 75 51);&class=contributing tag&data-lang=Python-->
|
||||
[Elixir](./docs/elixir.md)<!--rehype:style=background: rgb(124 26 156);&class=contributing tag&data-lang=Elixir-->
|
||||
[Flask](./docs/flask.md)<!--rehype:style=background: rgb(210 168 255);&class=contributing tag&data-lang=Python-->
|
||||
[FastAPI](./docs/fastapi.md)<!--rehype:style=background: rgb(210 168 255);&class=contributing tag&data-lang=Python-->
|
||||
[Flutter](./docs/flutter.md)<!--rehype:style=background: rgb(150 220 254);&class=contributing tag&data-lang=Dart-->
|
||||
[Golang](./docs/golang.md)<!--rehype:style=background: rgb(39 160 193);-->
|
||||
[GraphQL](./docs/graphql.md)<!--rehype:style=background: rgb(214 66 146);-->
|
||||
[INI](./docs/ini.md)<!--rehype:style=background: rgb(57 59 60);-->
|
||||
[JSON](./docs/json.md)<!--rehype:style=background: rgb(57 59 60);-->
|
||||
[Java](./docs/java.md)<!--rehype:style=background: rgb(211 55 49);&class=contributing&data-info=👆看看还缺点儿什么?-->
|
||||
[Julia](./docs/julia.md)<!--rehype:style=background: rgb(211 55 49);&class=contributing&data-info=👆看看还缺点儿什么?-->
|
||||
[Julia](./docs/julia.md)<!--rehype:style=background: rgb(26 188 156);&class=contributing&data-info=👆看看还缺点儿什么?-->
|
||||
[Kotlin](./docs/kotlin.md)<!--rehype:style=background: rgb(211 55 49);&class=contributing&data-info=👆看看还缺点儿什么?-->
|
||||
[Kubernetes](./docs/kubernetes.md)<!--rehype:style=background: rgb(51 113 227);&class=contributing&data-info=👆看看还缺点儿什么?-->
|
||||
[LaTeX](./docs/latex.md)<!--rehype:style=background: rgb(0 128 128);&class=contributing-->
|
||||
[Laravel 8](./docs/laravel.md)<!--rehype:style=background: rgb(249 50 44);&class=contributing tag&data-lang=PHP-->
|
||||
[Markdown](./docs/markdown.md)<!--rehype:style=background: rgb(103 61 156);-->
|
||||
[MySQL](./docs/mysql.md)<!--rehype:style=background: rgb(1 117 143);&class=tag&data-lang=SQL-->
|
||||
[MATLAB](./docs/matlab.md)<!--rehype:style=background: rgb(0 118 168);&class=contributing-->
|
||||
[Oracle](./docs/oracle.md)<!--rehype:style=background: rgb(255 0 0);-->
|
||||
[PHP](./docs/php.md)<!--rehype:style=background: rgb(79 91 147);-->
|
||||
[Python](./docs/python.md)<!--rehype:style=background: rgb(43 91 132);-->
|
||||
[PostgreSQL](./docs/postgres.md)<!--rehype:style=background: rgb(43 109 163);&class=tag&data-lang=SQL-->
|
||||
[R 语言](./docs/r.md)<!--rehype:style=background: rgb(39 108 192);&class=contributing&data-info-->
|
||||
[Ruby](./docs/ruby.md)<!--rehype:style=background: rgb(204 52 45);-->
|
||||
[Rust](./docs/rust.md)<!--rehype:style=background: rgb(71 71 71);-->
|
||||
[Scala](./docs/scala.md)<!--rehype:style=background: rgb(34 82 94);-->
|
||||
[Swift](./docs/swift.md)<!--rehype:style=background: rgb(240 81 57);-->
|
||||
[SwiftUI](./docs/swiftui.md)<!--rehype:style=background: rgb(10 127 247);&class=tag&data-lang=swift-->
|
||||
[TOML](./docs/toml.md)<!--rehype:style=background: rgb(132 132 132);-->
|
||||
[YAML](./docs/yaml.md)<!--rehype:style=background: rgb(91 163 230);-->
|
||||
[Lua](./docs/lua.md)<!--rehype:style=background: rgb(3 3 128);-->
|
||||
[Pytorch](./docs/pytorch.md)<!--rehype:style=background: rgb(238 76 44);&class=contributing tag&data-lang=Python&data-info=👆看看还缺点儿什么?-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
## 配置
|
||||
|
||||
[INI](./docs/ini.md)<!--rehype:style=background: rgb(57 59 60);-->
|
||||
[JSON](./docs/json.md)<!--rehype:style=background: rgb(57 59 60);-->
|
||||
[TOML](./docs/toml.md)<!--rehype:style=background: rgb(132 132 132);-->
|
||||
[YAML](./docs/yaml.md)<!--rehype:style=background: rgb(91 163 230);-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
## 前端
|
||||
|
||||
[CSS 3](./docs/css.md)<!--rehype:style=background: rgb(35 115 205);&class=tag&data-lang=CSS-->
|
||||
[前端导航](./docs/feds.md)<!--rehype:style=background: rgb(35 115 205);&class=tag&data-lang=导航-->
|
||||
[Electron](./docs/electron.md)<!--rehype:style=background: rgb(0 72 153);-->
|
||||
[Emmet](./docs/emmet.md)<!--rehype:style=background: rgb(122 203 23);-->
|
||||
[ES 6](./docs/es6.md)<!--rehype:style=background: rgb(122 203 23);&class=tag&data-lang=JS-->
|
||||
[HTML](./docs/html.md)<!--rehype:style=background: rgb(228 77 39);-->
|
||||
[JavaScript](./docs/javascript.md)<!--rehype:style=background: rgb(203 183 31);-->
|
||||
[jQuery](./docs/jquery.md)<!--rehype:style=background: rgb(203 183 31);-->
|
||||
[Next.js](./docs/nextjs.md)<!--rehype:style=background: rgb(0 0 0);&class=tag&data-lang=React-->
|
||||
[React](./docs/react.md)<!--rehype:style=background: rgb(34 143 173);-->
|
||||
[React Router](./docs/reactrouter.md)<!--rehype:style=background: rgb(244 66 79);&class=tag&data-lang=React-->
|
||||
[React Native](./docs/react-native.md)<!--rehype:style=background: rgb(34 143 173);&class=tag&data-lang=React-->
|
||||
[RegEx 正则表达式](./docs/regex.md)<!--rehype:style=background: rgb(149 36 155);-->
|
||||
[TypeScript](./docs/typescript.md)<!--rehype:style=background: rgb(49 120 198);-->
|
||||
[Tauri](./docs/tauri.md)<!--rehype:style=background: rgb(103 214 237);&class=contributing-->
|
||||
[Vue 2](./docs/vue2.md)<!--rehype:style=background: rgb(64 184 131);-->
|
||||
[Vue 3](./docs/vue.md)<!--rehype:style=background: rgb(64 184 131);&class=contributing-->
|
||||
[</> htmx](./docs/htmx.md)<!--rehype:style=background: rgb(52 101 164);&class=contributing-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
## CSS
|
||||
|
||||
[CSS 3](./docs/css.md)<!--rehype:style=background: rgb(35 115 205);&class=tag&data-lang=CSS-->
|
||||
[Styled Components](./docs/styled-components.md)<!--rehype:style=background: rgb(221 60 184);&class=tag&data-lang=CSS-->
|
||||
[Stylus](./docs/stylus.md)<!--rehype:style=background: rgb(109 161 63);&class=tag&data-lang=CSS-->
|
||||
[Sass](./docs/sass.md)<!--rehype:style=background: rgb(207 100 154);&class=tag&data-lang=CSS-->
|
||||
[HTML](./docs/html.md)<!--rehype:style=background: rgb(228 77 39);-->
|
||||
[JavaScript](./docs/javascript.md)<!--rehype:style=background: rgb(203 183 31);-->
|
||||
[Less.js](./docs/lessjs.md)<!--rehype:style=background: rgb(29 54 93);&class=tag&data-lang=CSS-->
|
||||
[React](./docs/react.md)<!--rehype:style=background: rgb(34 143 173);-->
|
||||
[RegEx 正则表达式](./docs/regex.md)<!--rehype:style=background: rgb(149 36 155);-->
|
||||
[TypeScript](./docs/typescript.md)<!--rehype:style=background: rgb(49 120 198);-->
|
||||
[Vue 2](./docs/vue2.md)<!--rehype:style=background: rgb(64 184 131);-->
|
||||
[Vue 3](./docs/vue.md)<!--rehype:style=background: rgb(64 184 131);&class=contributing-->
|
||||
[Tailwind CSS](./docs/tailwindcss.md)<!--rehype:style=background: rgb(49 120 198);-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
## Nodejs
|
||||
|
||||
[Express.js](./docs/expressjs.md)<!--rehype:style=background: rgb(95 151 206);-->
|
||||
[Ejs](./docs/ejs.md)<!--rehype:style=background: rgb(169 30 80);&class=tag&data-lang=JavaScript-->
|
||||
[Jest](./docs/jest.md)<!--rehype:style=background: rgb(153 66 91);-->
|
||||
[Koa.js](./docs/koajs.md)<!--rehype:style=background: rgb(95 151 206);-->
|
||||
[Lerna](./docs/lerna.md)<!--rehype:style=background: rgb(192 132 252);-->
|
||||
[npm](./docs/npm.md)<!--rehype:style=background: rgb(203 2 0);-->
|
||||
[NestJS](./docs/nestjs.md)<!--rehype:style=background: rgb(237 21 67);&class=contributing-->
|
||||
[PM2](./docs/pm2.md)<!--rehype:style=background: rgb(73 117 241);&class=contributing-->
|
||||
[package.json](./docs/package.json.md)<!--rehype:style=background: rgb(132 132 132);-->
|
||||
[Yarn](./docs/yarn.md)<!--rehype:style=background: rgb(33 136 182);-->
|
||||
[nvm](./docs/nvm.md)<!--rehype:style=background: rgb(132 132 132);-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
## 工具
|
||||
|
||||
[Emacs](./docs/emacs.md)<!--rehype:style=background: rgb(98 36 134);-->
|
||||
[Gmail](./docs/gmail.md)<!--rehype:style=background: rgb(234 67 54);-->
|
||||
[Github](./docs/github.md)<!--rehype:style=background: rgb(36 41 47);-->
|
||||
[nginx](./docs/nginx.md)<!--rehype:style=background: rgb(0 153 0);-->
|
||||
[Semver](./docs/semver.md)<!--rehype:style=background: rgb(106 111 141);-->
|
||||
[Sketch](./docs/sketch.md)<!--rehype:style=background: rgb(223 148 0);&class=tag&data-lang=macOS-->
|
||||
[Sublime Text](./docs/sublime-text.md)<!--rehype:style=background: rgb(223 148 0);-->
|
||||
[VSCode](./docs/vscode.md)<!--rehype:style=background: rgb(91 163 230);-->
|
||||
[Vim](./docs/vim.md)<!--rehype:style=background: rgb(9 150 8);-->
|
||||
[WebStorm](./docs/webstorm.md)<!--rehype:style=background: rgb(32 148 220);-->
|
||||
[XPath](./docs/xpath.md)<!--rehype:style=background: rgb(91 163 230);-->
|
||||
[Xcode](./docs/xcode.md)<!--rehype:style=background: rgb(24 151 233);&class=tag&data-lang=macOS-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
## 命令
|
||||
|
||||
[ADB, Android Debug Bridge](./docs/adb.md)<!--rehype:style=background: rgb(238 0 0);&class=contributing tag&data-lang=Android&data-info=👆看看还缺点儿什么?-->
|
||||
[Ansible](./docs/ansible.md)<!--rehype:style=background: rgb(238 0 0);&class=contributing tag&data-lang=RedHat&data-info=👆看看还缺点儿什么?-->
|
||||
[Awk](./docs/awk.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Conan](./docs/conan.md)<!--rehype:style=background: rgb(0 193 9);&class=tag&data-lang=C/C++-->
|
||||
[CocoaPods](./docs/cocoapods.md)<!--rehype:style=background: rgb(251 0 6);&class=tag&data-lang=C/C++-->
|
||||
[Cargo](./docs/cargo.md)<!--rehype:style=background: rgb(71 71 71);&class=tag&data-lang=Rust-->
|
||||
[Curl](./docs/curl.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Chmod](./docs/chmod.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Chown](./docs/chown.md)<!--rehype:style=background: rgb(12 75 51/var(\-\-bg\-opacity));&class=contributing-->
|
||||
[Cron](./docs/cron.md)<!--rehype:style=background: rgb(239 68 68);-->
|
||||
[CMake](./docs/cmake.md)<!--rehype:style=background: rgb(92 107 192);&class=contributing-->
|
||||
[Git](./docs/git.md)<!--rehype:style=background: rgb(215 89 62);-->
|
||||
[Grep](./docs/grep.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[CMD](./docs/cmd.md)<!--rehype:style=background: rgb(99 99 99);-->
|
||||
[Find](./docs/find.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[FFmpeg](./docs/ffmpeg.md)<!--rehype:style=background: rgb(0 193 9);&class=contributing-->
|
||||
[Gdb](./docs/gdb.md)<!--rehype:style=background: rgb(215 89 62);-->
|
||||
[Git](./docs/git.md)<!--rehype:style=background: rgb(215 89 62);&class=tag&data-lang=版本控制-->
|
||||
[Grep](./docs/grep.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Htop](./docs/htop.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Homebrew](./docs/homebrew.md)<!--rehype:style=background: rgb(252 185 87);&class=tag&data-lang=macOS-->
|
||||
[Netstat](./docs/netstat.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[iptables](./docs/iptables.md)<!--rehype:style=background: rgb(32 74 135);-->
|
||||
[jq](./docs/jq.md)<!--rehype:style=background: rgb(16 185 129);&class=tag&data-lang=JSON-->
|
||||
[Justfile](./docs/justfile.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Lsof](./docs/lsof.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Mitmproxy](./docs/mitmproxy.md)<!--rehype:style=background: rgb(4 92 135);-->
|
||||
[Make](./docs/make.md)<!--rehype:style=background: rgb(99 99 99);&class=contributing-->
|
||||
[Netstat](./docs/netstat.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Netcat](./docs/netcat.md)<!--rehype:style=background: rgb(4 92 135);-->
|
||||
[Sed](./docs/sed.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[OpenSSL](./docs/openssl.md)<!--rehype:style=background: rgb(114 20 18);-->
|
||||
[ps](./docs/ps.md)<!--rehype:style=background: rgb(99 99 99);-->
|
||||
[Pandoc](./docs/pandoc.md)<!--rehype:style=background: rgb(99 99 99);&class=tag&data-lang=文档转换器-->
|
||||
[Sed](./docs/sed.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Systemd](./docs/systemd.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[SSH](./docs/ssh.md)<!--rehype:style=background: rgb(99 99 99);-->
|
||||
[Subversion (SVN)](./docs/subversion.md)<!--rehype:style=background: rgb(99 99 99);&class=tag&data-lang=版本控制-->
|
||||
[Screen](./docs/screen.md)<!--rehype:style=background: rgb(99 99 99);-->
|
||||
[Sysdig](./docs/sysdig.md)<!--rehype:style=background: rgb(1 171 199);-->
|
||||
[Tmux](./docs/tmux.md)<!--rehype:style=background: rgb(99 99 99);-->
|
||||
[YUM](./docs/yum.md)<!--rehype:style=background: rgb(86 86 123);-->
|
||||
[CMD](./docs/cmd.md)<!--rehype:style=background: rgb(99 99 99);-->
|
||||
[Taskset](./docs/taskset.md)<!--rehype:style=background: rgb(99 99 99);-->
|
||||
[tar](./docs/tar.md)<!--rehype:style=background: rgb(215 89 62);&class=tag&data-lang=解压缩-->
|
||||
[Zip](./docs/zip.md)<!--rehype:style=background: rgb(99 99 99);&class=tag&data-lang=解压缩-->
|
||||
[FTP](./docs/ftp.md)<!--rehype:style=background: rgb(99 99 99);-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
## 工具箱
|
||||
|
||||
[APT](./docs/apt.md)<!--rehype:style=background: rgb(30 144 255);-->
|
||||
[tar](./docs/tar.md)<!--rehype:style=background: rgb(215 89 62);-->
|
||||
[Conan](./docs/conan.md)<!--rehype:style=background: rgb(0 193 9);&class=tag&data-lang=C/C++-->
|
||||
[Conda](./docs/conda.md)<!--rehype:style=background: rgb(68 168 51);&class=tag&data-lang=Python-->
|
||||
[CocoaPods](./docs/cocoapods.md)<!--rehype:style=background: rgb(251 0 6);&class=tag&data-lang=C/C++-->
|
||||
[Cargo](./docs/cargo.md)<!--rehype:style=background: rgb(71 71 71);&class=tag&data-lang=Rust-->
|
||||
[Homebrew](./docs/homebrew.md)<!--rehype:style=background: rgb(252 185 87);&class=tag&data-lang=macOS-->
|
||||
[Linux Command](./docs/linux-command.md)<!--rehype:style=background: rgb(215 89 62);&class=tag&data-lang=命令速查-->
|
||||
[Mitmproxy](./docs/mitmproxy.md)<!--rehype:style=background: rgb(4 92 135);-->
|
||||
[Pacman](./docs/pacman.md)<!--rehype:style=background: rgb(24 147 209);&class=tag&data-lang=archlinux&class=contributing-->
|
||||
[YUM](./docs/yum.md)<!--rehype:style=background: rgb(86 86 123);-->
|
||||
[SDKMAN](./docs/sdkman.md)<!--rehype:style=background: rgb(0 118 198);-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
## 数据库
|
||||
|
||||
[MySQL](./docs/mysql.md)<!--rehype:style=background: rgb(1 117 143);&class=tag&data-lang=SQL-->
|
||||
[MongoDB](./docs/mongodb.md)<!--rehype:style=background: rgb(0 237 100);-->
|
||||
[Oracle](./docs/oracle.md)<!--rehype:style=background: rgb(255 0 0);&class=tag&data-lang=SQL-->
|
||||
[PostgreSQL](./docs/postgres.md)<!--rehype:style=background: rgb(43 109 163);&class=tag&data-lang=SQL-->
|
||||
[Redis](./docs/redis.md)<!--rehype:style=background: rgb(198 47 44);-->
|
||||
[Elasticsearch](./docs/elasticsearch.md)<!--rehype:style=background: rgb(36 187 177);-->
|
||||
[Neo4j](./docs/neo4j.md)<!--rehype:style=background: rgb(86 86 123);-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
## 快捷键
|
||||
|
||||
[Adobe Lightroom](./docs/adobe-lightroom.md)<!--rehype:style=background: rgb(49 168 255);-->
|
||||
[Adobe Photoshop](./docs/adobe-photoshop.md)<!--rehype:style=background: rgb(49 168 255);-->
|
||||
[Adobe XD](./docs/adobe-xd.md)<!--rehype:style=background: rgb(255 97 246);-->
|
||||
[Android Studio](./docs/android-studio.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Blender](./docs/blender.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Firefox](./docs/firefox.md)<!--rehype:style=background: rgb(253 53 76);-->
|
||||
[Finder](./docs/finder.md)<!--rehype:style=background: rgb(253 53 76);&class=tag&data-lang=macOS-->
|
||||
[Figma](./docs/figma.md)<!--rehype:style=background: rgb(147 90 238);-->
|
||||
[Gmail](./docs/gmail.md)<!--rehype:style=background: rgb(234 67 54);-->
|
||||
[Gitlab](./docs/gitlab.md)<!--rehype:style=background: rgb(226 67 41);-->
|
||||
[Google Chrome](./docs/google-chrome.md)<!--rehype:style=background: rgb(29 116 232);-->
|
||||
[IntelliJ IDEA](./docs/intelli-j-idea.md)<!--rehype:style=background: rgb(223 148 0);&class=tag&data-lang=Java-->
|
||||
[PyCharm](./docs/pycharm.md)<!--rehype:style=background: rgb(36 215 137);&class=tag&data-lang=Python-->
|
||||
[PhpStorm](./docs/phpstorm.md)<!--rehype:style=\-\-bg\-opacity: 0.75;background-image: linear-gradient(to left, rgba(255 106 172 / var(\-\-bg\-opacity)), rgba(183 173 255 / var(\-\-bg\-opacity)));-->
|
||||
[Sketch](./docs/sketch.md)<!--rehype:style=background: rgb(223 148 0);&class=tag&data-lang=macOS-->
|
||||
[Sublime Text](./docs/sublime-text.md)<!--rehype:style=background: rgb(223 148 0);-->
|
||||
[VSCode](./docs/vscode.md)<!--rehype:style=background: rgb(91 163 230);-->
|
||||
[Twitter](./docs/twitter.md)<!--rehype:style=background: rgb(91 163 230);-->
|
||||
[WebStorm](./docs/webstorm.md)<!--rehype:style=background: rgb(32 148 220);-->
|
||||
[Xcode](./docs/xcode.md)<!--rehype:style=background: rgb(24 151 233);&class=tag&data-lang=macOS-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
## 其它
|
||||
|
||||
[Quick Reference](./docs/quickreference.md)<!--rehype:style=background: rgb(16 185 129);&class=tag&data-lang=排版说明-->
|
||||
[Quick Reference](./docs/quickreference.md)<!--rehype:style=background: rgb(0 182 122);&class=tag&data-lang=排版说明-->
|
||||
[Aspect Ratio](./docs/aspect-ratio.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[ASCII Code](./docs/ascii-code.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Symbol Code](./docs/symbol-code.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Github Actions](./docs/github-actions.md)<!--rehype:style=background: rgb(121 184 255);-->
|
||||
[Gitlab CI/CD](./docs/gitlab-ci.md)<!--rehype:style=background: rgb(226 67 41);&class=contributing-->
|
||||
[Colors Named](./docs/colors-named.md)<!--rehype:style=background: rgb(16 185 129);&class=tag&data-lang=CSS-->
|
||||
[HTTP 状态码](./docs/http-status-code.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[HTML 字符实体](./docs/html-char.md)<!--rehype:style=background: rgb(16 185 129);&class=tag&data-lang=HTML-->
|
||||
[ISO 639-1 Language Code](./docs/iso-639-1.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Emoji](./docs/emoji.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[ISO-3166 国家代码](./docs/iso-3166-1.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[ISO-639 语言代码](./docs/iso-639-1.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Emoji](./docs/emoji.md)<!--rehype:style=\-\-bg\-opacity: 0.75;background-image: linear-gradient(to left, rgba(74 222 128 / var(\-\-bg\-opacity)), rgba(59 130 246 / var(\-\-bg\-opacity)));-->
|
||||
[MIME types](./docs/mime.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
[Resolutions](./docs/resolutions.md)<!--rehype:style=background: rgb(16 185 129);-->
|
||||
<!--rehype:class=home-card-->
|
||||
@ -172,168 +256,266 @@ Quick Reference
|
||||
|
||||
上面的列表没有看到你想要的? 您是否正在寻找一些备忘清单或参考资料,或者您有一些片段备忘清单要分享,这是一个最好的机会!
|
||||
|
||||
[`请求添加备忘单(速查表)`](https://github.com/jaywcjlove/reference/issues/new?title=【备忘清单】+请求%3A+&labels=request&template=cheatsheet-request.md&assignee=jaywcjlove)<!--rehype:class=home-button&style=margin-top:2rem&target=__blank-->
|
||||
[`请求添加备忘单(速查表)`](https://github.com/jaywcjlove/reference/issues/new?title=【备忘清单】+请求%3A+&labels=request&template=cheatsheet-request.md&assignee=)<!--rehype:class=home-button&style=margin-top:2rem&target=__blank-->
|
||||
[`我有一张备忘单(速查表)`](https://github.com/jaywcjlove/reference/blob/main/CONTRIBUTING.md)<!--rehype:class=home-button text-grey&target=__blank-->
|
||||
<!--rehype:style=margin-top:3rem-->
|
||||
|
||||
## 感谢所有贡献者
|
||||
<!--rehype:wrap-style=text-align: center;max-width: 650px;margin: 0 auto;&class=home-title-reset-->
|
||||
|
||||
请参阅 [Quick Reference](./docs/quickreference.md) 了解如何开始。一如既往,感谢我们出色的贡献者!
|
||||
请参阅 [Quick Reference](./docs/quickreference.md) 了解如何开始。一如既往,感谢我们出色的[贡献者](https://github.com/jaywcjlove/reference/graphs/contributors)!
|
||||
<!--rehype:style=padding-bottom:1rem;-->
|
||||
|
||||
<!--GAMFC--><a href="https://github.com/jaywcjlove" title="小弟调调™">
|
||||
<img src="https://avatars.githubusercontent.com/u/1680273?v=4" width="42;" alt="小弟调调™"/>
|
||||
</a>
|
||||
<a href="https://github.com/Jack-Zhang-1314" title="fw_qaq">
|
||||
<img src="https://avatars.githubusercontent.com/u/82551626?v=4" width="42;" alt="fw_qaq"/>
|
||||
</a>
|
||||
<a href="https://github.com/mofelee" title="mofelee">
|
||||
<img src="https://avatars.githubusercontent.com/u/5069410?v=4" width="42;" alt="mofelee"/>
|
||||
</a>
|
||||
<a href="https://github.com/Alex-Programer" title="Alex">
|
||||
<img src="https://avatars.githubusercontent.com/u/115539090?v=4" width="42;" alt="Alex"/>
|
||||
</a>
|
||||
<a href="https://github.com/JeffersonHuang" title="Jefferson">
|
||||
<img src="https://avatars.githubusercontent.com/u/47512530?v=4" width="42;" alt="Jefferson"/>
|
||||
</a>
|
||||
<a href="https://github.com/expoli" title="expoli">
|
||||
<img src="https://avatars.githubusercontent.com/u/31023767?v=4" width="42;" alt="expoli"/>
|
||||
</a>
|
||||
<a href="https://github.com/sjh42" title="42:p">
|
||||
<img src="https://avatars.githubusercontent.com/u/34529275?v=4" width="42;" alt="42:p"/>
|
||||
</a>
|
||||
<a href="https://github.com/partoneplay" title="partoneplay">
|
||||
<img src="https://avatars.githubusercontent.com/u/5189132?v=4" width="42;" alt="partoneplay"/>
|
||||
</a>
|
||||
<a href="https://github.com/ryanhex53" title="ryanhex53">
|
||||
<img src="https://avatars.githubusercontent.com/u/360426?v=4" width="42;" alt="ryanhex53"/>
|
||||
</a>
|
||||
<a href="https://github.com/catcto" title="喵仙人">
|
||||
<img src="https://avatars.githubusercontent.com/u/5467932?v=4" width="42;" alt="喵仙人"/>
|
||||
</a>
|
||||
<a href="https://github.com/13812700839" title="花殇">
|
||||
<img src="https://avatars.githubusercontent.com/u/58072506?v=4" width="42;" alt="花殇"/>
|
||||
</a>
|
||||
<a href="https://github.com/Smartdousha" title="Anko">
|
||||
<img src="https://avatars.githubusercontent.com/u/52566311?v=4" width="42;" alt="Anko"/>
|
||||
</a>
|
||||
<a href="https://github.com/Brid9e" title="Brid9e">
|
||||
<img src="https://avatars.githubusercontent.com/u/85558909?v=4" width="42;" alt="Brid9e"/>
|
||||
</a>
|
||||
<a href="https://github.com/CharlotteZeng" title="Chart">
|
||||
<img src="https://avatars.githubusercontent.com/u/19461184?v=4" width="42;" alt="Chart"/>
|
||||
</a>
|
||||
<a href="https://github.com/DaiNing810" title="DaiN">
|
||||
<img src="https://avatars.githubusercontent.com/u/94962339?v=4" width="42;" alt="DaiN"/>
|
||||
</a>
|
||||
<a href="https://github.com/demigodliu" title="DemigodLiu">
|
||||
<img src="https://avatars.githubusercontent.com/u/30372735?v=4" width="42;" alt="DemigodLiu"/>
|
||||
</a>
|
||||
<a href="https://github.com/jasnzhuang" title="Jason Zhuang">
|
||||
<img src="https://avatars.githubusercontent.com/u/16612921?v=4" width="42;" alt="Jason Zhuang"/>
|
||||
</a>
|
||||
<a href="https://github.com/JetSquirrel" title="JetSquirrel">
|
||||
<img src="https://avatars.githubusercontent.com/u/20291255?v=4" width="42;" alt="JetSquirrel"/>
|
||||
</a>
|
||||
<a href="https://github.com/Lihuagreek" title="Lihuagreek">
|
||||
<img src="https://avatars.githubusercontent.com/u/51040740?v=4" width="42;" alt="Lihuagreek"/>
|
||||
</a>
|
||||
<a href="https://github.com/LufsX" title="LufsX">
|
||||
<img src="https://avatars.githubusercontent.com/u/33221883?v=4" width="42;" alt="LufsX"/>
|
||||
</a>
|
||||
<a href="https://github.com/mariuszmichalowski" title="Mariusz Michalowski">
|
||||
<img src="https://avatars.githubusercontent.com/u/92091891?v=4" width="42;" alt="Mariusz Michalowski"/>
|
||||
</a>
|
||||
<a href="https://github.com/HanaNoryu" title="Noryu">
|
||||
<img src="https://avatars.githubusercontent.com/u/109856546?v=4" width="42;" alt="Noryu"/>
|
||||
</a>
|
||||
<a href="https://github.com/whb1998a" title="WHB">
|
||||
<img src="https://avatars.githubusercontent.com/u/44045064?v=4" width="42;" alt="WHB"/>
|
||||
</a>
|
||||
<a href="https://github.com/y52y" title="Zyj">
|
||||
<img src="https://avatars.githubusercontent.com/u/51304324?v=4" width="42;" alt="Zyj"/>
|
||||
</a>
|
||||
<a href="https://github.com/chyok" title="chyok">
|
||||
<img src="https://avatars.githubusercontent.com/u/32629225?v=4" width="42;" alt="chyok"/>
|
||||
</a>
|
||||
<a href="https://github.com/gaoxiaoduan" title="coderduan">
|
||||
<img src="https://avatars.githubusercontent.com/u/69953511?v=4" width="42;" alt="coderduan"/>
|
||||
</a>
|
||||
<a href="https://github.com/cool9203" title="cool9203">
|
||||
<img src="https://avatars.githubusercontent.com/u/29609607?v=4" width="42;" alt="cool9203"/>
|
||||
</a>
|
||||
<a href="https://github.com/godotc" title="godotc">
|
||||
<img src="https://avatars.githubusercontent.com/u/79260851?v=4" width="42;" alt="godotc"/>
|
||||
</a>
|
||||
<a href="https://github.com/greyhao" title="greyhao">
|
||||
<img src="https://avatars.githubusercontent.com/u/107107440?v=4" width="42;" alt="greyhao"/>
|
||||
</a>
|
||||
<a href="https://github.com/hua03" title="hua03">
|
||||
<img src="https://avatars.githubusercontent.com/u/19561959?v=4" width="42;" alt="hua03"/>
|
||||
</a>
|
||||
<a href="https://github.com/hweining" title="hweining">
|
||||
<img src="https://avatars.githubusercontent.com/u/8973985?v=4" width="42;" alt="hweining"/>
|
||||
</a>
|
||||
<a href="https://github.com/k983551019" title="k983551019">
|
||||
<img src="https://avatars.githubusercontent.com/u/48147837?v=4" width="42;" alt="k983551019"/>
|
||||
</a>
|
||||
<a href="https://github.com/kdxcxs" title="kdxcxs">
|
||||
<img src="https://avatars.githubusercontent.com/u/18746192?v=4" width="42;" alt="kdxcxs"/>
|
||||
</a>
|
||||
<a href="https://github.com/larry-xue" title="larry">
|
||||
<img src="https://avatars.githubusercontent.com/u/48818060?v=4" width="42;" alt="larry"/>
|
||||
</a>
|
||||
<a href="https://github.com/liliangrong777" title="liliangrong777">
|
||||
<img src="https://avatars.githubusercontent.com/u/58727146?v=4" width="42;" alt="liliangrong777"/>
|
||||
</a>
|
||||
<a href="https://github.com/lykjjj" title="lykjjj">
|
||||
<img src="https://avatars.githubusercontent.com/u/58510058?v=4" width="42;" alt="lykjjj"/>
|
||||
</a>
|
||||
<a href="https://github.com/mancuoj" title="mancuoj">
|
||||
<img src="https://avatars.githubusercontent.com/u/45707684?v=4" width="42;" alt="mancuoj"/>
|
||||
</a>
|
||||
<a href="https://github.com/onewesong" title="onewesong">
|
||||
<img src="https://avatars.githubusercontent.com/u/17920822?v=4" width="42;" alt="onewesong"/>
|
||||
</a>
|
||||
<a href="https://github.com/wjjwkwindy" title="wjjwkwindy">
|
||||
<img src="https://avatars.githubusercontent.com/u/9508591?v=4" width="42;" alt="wjjwkwindy"/>
|
||||
</a>
|
||||
<a href="https://github.com/xing133" title="xing133">
|
||||
<img src="https://avatars.githubusercontent.com/u/5336490?v=4" width="42;" alt="xing133"/>
|
||||
</a>
|
||||
<a href="https://github.com/zxx-457" title="zxx-457">
|
||||
<img src="https://avatars.githubusercontent.com/u/114141362?v=4" width="42;" alt="zxx-457"/>
|
||||
</a>
|
||||
<a href="https://github.com/lvzhenbo" title="吕振波">
|
||||
<img src="https://avatars.githubusercontent.com/u/32427677?v=4" width="42;" alt="吕振波"/>
|
||||
</a>
|
||||
<a href="https://github.com/qyl27" title="秋雨落">
|
||||
<img src="https://avatars.githubusercontent.com/u/53731501?v=4" width="42;" alt="秋雨落"/>
|
||||
</a>
|
||||
<a href="https://github.com/lisheng741" title="芦荟柚子茶">
|
||||
<img src="https://avatars.githubusercontent.com/u/53617305?v=4" width="42;" alt="芦荟柚子茶"/>
|
||||
</a><!--GAMFC-END-->
|
||||
<!--GAMFC--><a href="https://github.com/jaywcjlove" title="小弟调调"><img src="https://avatars.githubusercontent.com/u/1680273?v=4" width="42;" alt="小弟调调"/></a>
|
||||
<a href="https://github.com/fwqaaq" title="fwqaaq"><img src="https://avatars.githubusercontent.com/u/82551626?v=4" width="42;" alt="fwqaaq"/></a>
|
||||
<a href="https://github.com/mofelee" title="mofelee"><img src="https://avatars.githubusercontent.com/u/5069410?v=4" width="42;" alt="mofelee"/></a>
|
||||
<a href="https://github.com/Country-If" title="Maylon"><img src="https://avatars.githubusercontent.com/u/62837275?v=4" width="42;" alt="Maylon"/></a>
|
||||
<a href="https://github.com/JeffersonHuang" title="Jefferson Huang"><img src="https://avatars.githubusercontent.com/u/47512530?v=4" width="42;" alt="Jefferson Huang"/></a>
|
||||
<a href="https://github.com/LesterChang0987" title="Steve Hartwell"><img src="https://avatars.githubusercontent.com/u/114913921?v=4" width="42;" alt="Steve Hartwell"/></a>
|
||||
<a href="https://github.com/nangongchengfeng" title="南宫乘风"><img src="https://avatars.githubusercontent.com/u/46562911?v=4" width="42;" alt="南宫乘风"/></a>
|
||||
<a href="https://github.com/aixcyi" title="砹小翼"><img src="https://avatars.githubusercontent.com/u/75880483?v=4" width="42;" alt="砹小翼"/></a>
|
||||
<a href="https://github.com/Alex20180512" title="Alex"><img src="https://avatars.githubusercontent.com/u/115539090?v=4" width="42;" alt="Alex"/></a>
|
||||
<a href="https://github.com/undefined-hestudio" title="undefined"><img src="https://avatars.githubusercontent.com/u/119711513?v=4" width="42;" alt="undefined"/></a>
|
||||
<a href="https://github.com/eryajf" title="二丫讲梵"><img src="https://avatars.githubusercontent.com/u/33259379?v=4" width="42;" alt="二丫讲梵"/></a>
|
||||
<a href="https://github.com/k23223" title="k23223"><img src="https://avatars.githubusercontent.com/u/57606136?v=4" width="42;" alt="k23223"/></a>
|
||||
<a href="https://github.com/expoli" title="expoli"><img src="https://avatars.githubusercontent.com/u/31023767?v=4" width="42;" alt="expoli"/></a>
|
||||
<a href="https://github.com/mailbaoer" title="baoer"><img src="https://avatars.githubusercontent.com/u/5282978?v=4" width="42;" alt="baoer"/></a>
|
||||
<a href="https://github.com/LufsX" title="LufsX"><img src="https://avatars.githubusercontent.com/u/33221883?v=4" width="42;" alt="LufsX"/></a>
|
||||
<a href="https://github.com/Darkiiiiiice" title="Darkiiiiiice"><img src="https://avatars.githubusercontent.com/u/3959555?v=4" width="42;" alt="Darkiiiiiice"/></a>
|
||||
<a href="https://github.com/genius-kim" title="Kim同学"><img src="https://avatars.githubusercontent.com/u/119488561?v=4" width="42;" alt="Kim同学"/></a>
|
||||
<a href="https://github.com/qyl27" title="秋 雨落"><img src="https://avatars.githubusercontent.com/u/53731501?v=4" width="42;" alt="秋 雨落"/></a>
|
||||
<a href="https://github.com/MackDing" title="Blossom"><img src="https://avatars.githubusercontent.com/u/19878893?v=4" width="42;" alt="Blossom"/></a>
|
||||
<a href="https://github.com/1250422131" title="萌新杰少"><img src="https://avatars.githubusercontent.com/u/52126790?v=4" width="42;" alt="萌新杰少"/></a>
|
||||
<a href="https://github.com/zhangymPerson" title="zhangym"><img src="https://avatars.githubusercontent.com/u/40376181?v=4" width="42;" alt="zhangym"/></a>
|
||||
<a href="https://github.com/chaos-cn" title="chaos"><img src="https://avatars.githubusercontent.com/u/71205599?v=4" width="42;" alt="chaos"/></a>
|
||||
<a href="https://github.com/xia0ne" title="YuRuiH"><img src="https://avatars.githubusercontent.com/u/32591223?v=4" width="42;" alt="YuRuiH"/></a>
|
||||
<a href="https://github.com/Willxup" title="Willxup"><img src="https://avatars.githubusercontent.com/u/51990395?v=4" width="42;" alt="Willxup"/></a>
|
||||
<a href="https://github.com/LiuYuan-SHU" title="Yuan Liu"><img src="https://avatars.githubusercontent.com/u/96400967?v=4" width="42;" alt="Yuan Liu"/></a>
|
||||
<a href="https://github.com/lvelvee" title="Lve Lvee"><img src="https://avatars.githubusercontent.com/u/25785753?v=4" width="42;" alt="Lve Lvee"/></a>
|
||||
<a href="https://github.com/wsypower" title="魏"><img src="https://avatars.githubusercontent.com/u/31298317?v=4" width="42;" alt="魏"/></a>
|
||||
<a href="https://github.com/itldg" title="老大哥"><img src="https://avatars.githubusercontent.com/u/13432299?v=4" width="42;" alt="老大哥"/></a>
|
||||
<a href="https://github.com/catcto" title="小武Alan"><img src="https://avatars.githubusercontent.com/u/5467932?v=4" width="42;" alt="小武Alan"/></a>
|
||||
<a href="https://github.com/ryanhex53" title="ryanhex53"><img src="https://avatars.githubusercontent.com/u/360426?v=4" width="42;" alt="ryanhex53"/></a>
|
||||
<a href="https://github.com/partoneplay" title="partoneplay"><img src="https://avatars.githubusercontent.com/u/5189132?v=4" width="42;" alt="partoneplay"/></a>
|
||||
<a href="https://github.com/pangxiaoli" title="pangxiaoli"><img src="https://avatars.githubusercontent.com/u/54620953?v=4" width="42;" alt="pangxiaoli"/></a>
|
||||
<a href="https://github.com/mancuoj" title="mancuoj"><img src="https://avatars.githubusercontent.com/u/45707684?v=4" width="42;" alt="mancuoj"/></a>
|
||||
<a href="https://github.com/webeautiful" title="Albert"><img src="https://avatars.githubusercontent.com/u/3364316?v=4" width="42;" alt="Albert"/></a>
|
||||
<a href="https://github.com/dadatom" title="Da Da"><img src="https://avatars.githubusercontent.com/u/33886943?v=4" width="42;" alt="Da Da"/></a>
|
||||
<a href="https://github.com/ljq" title="Jack Liu"><img src="https://avatars.githubusercontent.com/u/7278286?v=4" width="42;" alt="Jack Liu"/></a>
|
||||
<a href="https://github.com/jasnzhuang" title="Jason Zhuang"><img src="https://avatars.githubusercontent.com/u/16612921?v=4" width="42;" alt="Jason Zhuang"/></a>
|
||||
<a href="https://github.com/Jovins" title="Jovins"><img src="https://avatars.githubusercontent.com/u/17738992?v=4" width="42;" alt="Jovins"/></a>
|
||||
<a href="https://github.com/SuperDiscovery" title="SuperDiscovery"><img src="https://avatars.githubusercontent.com/u/49646863?v=4" width="42;" alt="SuperDiscovery"/></a>
|
||||
<a href="https://github.com/XYZscratcher" title="XYZ"><img src="https://avatars.githubusercontent.com/u/108533817?v=4" width="42;" alt="XYZ"/></a>
|
||||
<a href="https://github.com/findnr" title="findnr"><img src="https://avatars.githubusercontent.com/u/3909023?v=4" width="42;" alt="findnr"/></a>
|
||||
<a href="https://github.com/greyhao" title="greyhao"><img src="https://avatars.githubusercontent.com/u/107107440?v=4" width="42;" alt="greyhao"/></a>
|
||||
<a href="https://github.com/1834423612" title="kjch"><img src="https://avatars.githubusercontent.com/u/49981661?v=4" width="42;" alt="kjch"/></a>
|
||||
<a href="https://github.com/sunny0826" title="Xudong Guo"><img src="https://avatars.githubusercontent.com/u/24563928?v=4" width="42;" alt="Xudong Guo"/></a>
|
||||
<a href="https://github.com/gzttcydxx" title="gzttcydxx"><img src="https://avatars.githubusercontent.com/u/50025185?v=4" width="42;" alt="gzttcydxx"/></a>
|
||||
<a href="https://github.com/hua03" title="hua03"><img src="https://avatars.githubusercontent.com/u/19561959?v=4" width="42;" alt="hua03"/></a>
|
||||
<a href="https://github.com/yanxuplay" title="hupilan"><img src="https://avatars.githubusercontent.com/u/69749541?v=4" width="42;" alt="hupilan"/></a>
|
||||
<a href="https://github.com/hweining" title="hweining"><img src="https://avatars.githubusercontent.com/u/8973985?v=4" width="42;" alt="hweining"/></a>
|
||||
<a href="https://github.com/infanx" title="infanx"><img src="https://avatars.githubusercontent.com/u/65985757?v=4" width="42;" alt="infanx"/></a>
|
||||
<a href="https://github.com/auroraslot" title="irony"><img src="https://avatars.githubusercontent.com/u/48817882?v=4" width="42;" alt="irony"/></a>
|
||||
<a href="https://github.com/jlchen5" title="jlchen5"><img src="https://avatars.githubusercontent.com/u/61578993?v=4" width="42;" alt="jlchen5"/></a>
|
||||
<a href="https://github.com/joyfully-W" title="joyfully-W"><img src="https://avatars.githubusercontent.com/u/32212924?v=4" width="42;" alt="joyfully-W"/></a>
|
||||
<a href="https://github.com/jqzhao7" title="jqzhao"><img src="https://avatars.githubusercontent.com/u/54694535?v=4" width="42;" alt="jqzhao"/></a>
|
||||
<a href="https://github.com/jussker" title="jussker"><img src="https://avatars.githubusercontent.com/u/33953356?v=4" width="42;" alt="jussker"/></a>
|
||||
<a href="https://github.com/k983551019" title="k983551019"><img src="https://avatars.githubusercontent.com/u/48147837?v=4" width="42;" alt="k983551019"/></a>
|
||||
<a href="https://github.com/Zeng-qh" title="都一样"><img src="https://avatars.githubusercontent.com/u/40046415?v=4" width="42;" alt="都一样"/></a>
|
||||
<a href="https://github.com/nodjoy" title="gowshwah"><img src="https://avatars.githubusercontent.com/u/145280043?v=4" width="42;" alt="gowshwah"/></a>
|
||||
<a href="https://github.com/godotc" title="godot42"><img src="https://avatars.githubusercontent.com/u/79260851?v=4" width="42;" alt="godot42"/></a>
|
||||
<a href="https://github.com/gi-b716" title="Gavin"><img src="https://avatars.githubusercontent.com/u/78394473?v=4" width="42;" alt="Gavin"/></a>
|
||||
<a href="https://github.com/fjqz177" title="fjqz177"><img src="https://avatars.githubusercontent.com/u/83070583?v=4" width="42;" alt="fjqz177"/></a>
|
||||
<a href="https://github.com/fakevn" title="fakevn"><img src="https://avatars.githubusercontent.com/u/11464386?v=4" width="42;" alt="fakevn"/></a>
|
||||
<a href="https://github.com/cool9203" title="cool9203"><img src="https://avatars.githubusercontent.com/u/29609607?v=4" width="42;" alt="cool9203"/></a>
|
||||
<a href="https://github.com/gaoxiaoduan" title="CoderDuan"><img src="https://avatars.githubusercontent.com/u/69953511?v=4" width="42;" alt="CoderDuan"/></a>
|
||||
<a href="https://github.com/lijc210" title="cizai"><img src="https://avatars.githubusercontent.com/u/10651081?v=4" width="42;" alt="cizai"/></a>
|
||||
<a href="https://github.com/chyok" title="chyok"><img src="https://avatars.githubusercontent.com/u/32629225?v=4" width="42;" alt="chyok"/></a>
|
||||
<a href="https://github.com/zlfyuan" title="bgbgPang"><img src="https://avatars.githubusercontent.com/u/19658018?v=4" width="42;" alt="bgbgPang"/></a>
|
||||
<a href="https://github.com/Lmmmmmm-bb" title="_lmmmmmm"><img src="https://avatars.githubusercontent.com/u/54026110?v=4" width="42;" alt="_lmmmmmm"/></a>
|
||||
<a href="https://github.com/y52y" title="Zyj"><img src="https://avatars.githubusercontent.com/u/51304324?v=4" width="42;" alt="Zyj"/></a>
|
||||
<a href="https://github.com/Leaderzhangyi" title="ZinkCas"><img src="https://avatars.githubusercontent.com/u/46915666?v=4" width="42;" alt="ZinkCas"/></a>
|
||||
<a href="https://github.com/binscor" title="Zheng Nai Bin"><img src="https://avatars.githubusercontent.com/u/37325821?v=4" width="42;" alt="Zheng Nai Bin"/></a>
|
||||
<a href="https://github.com/qwxingzhe" title="行者"><img src="https://avatars.githubusercontent.com/u/7071651?v=4" width="42;" alt="行者"/></a>
|
||||
<a href="https://github.com/HanaChan233" title="花开花落"><img src="https://avatars.githubusercontent.com/u/75212820?v=4" width="42;" alt="花开花落"/></a>
|
||||
<a href="https://github.com/lisheng741" title="芦荟柚子茶"><img src="https://avatars.githubusercontent.com/u/53617305?v=4" width="42;" alt="芦荟柚子茶"/></a>
|
||||
<a href="https://github.com/ZIDOUZI" title="ZIDOUZI"><img src="https://avatars.githubusercontent.com/u/53157536?v=4" width="42;" alt="ZIDOUZI"/></a>
|
||||
<a href="https://github.com/LuckyJie12" title="夜未央"><img src="https://avatars.githubusercontent.com/u/102901105?v=4" width="42;" alt="夜未央"/></a>
|
||||
<a href="https://github.com/lvzhenbo" title="吕振波"><img src="https://avatars.githubusercontent.com/u/32427677?v=4" width="42;" alt="吕振波"/></a>
|
||||
<a href="https://github.com/zxx457" title="zxx457"><img src="https://avatars.githubusercontent.com/u/114141362?v=4" width="42;" alt="zxx457"/></a>
|
||||
<a href="https://github.com/zhouhw0306" title="zhouhw0306"><img src="https://avatars.githubusercontent.com/u/82752681?v=4" width="42;" alt="zhouhw0306"/></a>
|
||||
<a href="https://github.com/hiyms" title="yms"><img src="https://avatars.githubusercontent.com/u/84654050?v=4" width="42;" alt="yms"/></a>
|
||||
<a href="https://github.com/xing133" title="xing133"><img src="https://avatars.githubusercontent.com/u/5336490?v=4" width="42;" alt="xing133"/></a>
|
||||
<a href="https://github.com/wjjwkwindy" title="Hudson Alen"><img src="https://avatars.githubusercontent.com/u/9508591?v=4" width="42;" alt="Hudson Alen"/></a>
|
||||
<a href="https://github.com/wannima66" title="tmen"><img src="https://avatars.githubusercontent.com/u/26410255?v=4" width="42;" alt="tmen"/></a>
|
||||
<a href="https://github.com/swift-fs" title="swift"><img src="https://avatars.githubusercontent.com/u/77133741?v=4" width="42;" alt="swift"/></a>
|
||||
<a href="https://github.com/suyangzuo" title="suyangzuo"><img src="https://avatars.githubusercontent.com/u/50766353?v=4" width="42;" alt="suyangzuo"/></a>
|
||||
<a href="https://github.com/Mowmowj" title="nexo"><img src="https://avatars.githubusercontent.com/u/24759562?v=4" width="42;" alt="nexo"/></a>
|
||||
<a href="https://github.com/phygerr" title="phygerr"><img src="https://avatars.githubusercontent.com/u/42068889?v=4" width="42;" alt="phygerr"/></a>
|
||||
<a href="https://github.com/onewesong" title="onewesong"><img src="https://avatars.githubusercontent.com/u/17920822?v=4" width="42;" alt="onewesong"/></a>
|
||||
<a href="https://github.com/miclon-dev" title="miclon-dev"><img src="https://avatars.githubusercontent.com/u/111753685?v=4" width="42;" alt="miclon-dev"/></a>
|
||||
<a href="https://github.com/lykjjj" title="lykjjj"><img src="https://avatars.githubusercontent.com/u/58510058?v=4" width="42;" alt="lykjjj"/></a>
|
||||
<a href="https://github.com/lozhu20" title="lozhu"><img src="https://avatars.githubusercontent.com/u/44923922?v=4" width="42;" alt="lozhu"/></a>
|
||||
<a href="https://github.com/liliangrong777" title="liliangrong777"><img src="https://avatars.githubusercontent.com/u/58727146?v=4" width="42;" alt="liliangrong777"/></a>
|
||||
<a href="https://github.com/larry-xue" title="larry"><img src="https://avatars.githubusercontent.com/u/48818060?v=4" width="42;" alt="larry"/></a>
|
||||
<a href="https://github.com/kubeme" title="kubernetes for me"><img src="https://avatars.githubusercontent.com/u/16346220?v=4" width="42;" alt="kubernetes for me"/></a>
|
||||
<a href="https://github.com/kdxcxs" title="kdxcxs"><img src="https://avatars.githubusercontent.com/u/18746192?v=4" width="42;" alt="kdxcxs"/></a>
|
||||
<a href="https://github.com/zhu0629" title="zhucong"><img src="https://avatars.githubusercontent.com/u/13188450?v=4" width="42;" alt="zhucong"/></a>
|
||||
<a href="https://github.com/likeshop-github" title="likeshop技术社区"><img src="https://avatars.githubusercontent.com/u/77180968?v=4" width="42;" alt="likeshop技术社区"/></a>
|
||||
<a href="https://github.com/Lihuagreek" title="Lihuagreek"><img src="https://avatars.githubusercontent.com/u/51040740?v=4" width="42;" alt="Lihuagreek"/></a>
|
||||
<a href="https://github.com/LightQuanta" title="Light_Quanta"><img src="https://avatars.githubusercontent.com/u/18213217?v=4" width="42;" alt="Light_Quanta"/></a>
|
||||
<a href="https://github.com/JetSquirrel" title="JetSquirrel"><img src="https://avatars.githubusercontent.com/u/20291255?v=4" width="42;" alt="JetSquirrel"/></a>
|
||||
<a href="https://github.com/jeremyjone" title="Jeremy Jone"><img src="https://avatars.githubusercontent.com/u/37676231?v=4" width="42;" alt="Jeremy Jone"/></a>
|
||||
<a href="https://github.com/JavaZeroo" title="JavaZero"><img src="https://avatars.githubusercontent.com/u/71128095?v=4" width="42;" alt="JavaZero"/></a>
|
||||
<a href="https://github.com/Ding-Kyoma" title="HooinKyoma"><img src="https://avatars.githubusercontent.com/u/44542198?v=4" width="42;" alt="HooinKyoma"/></a>
|
||||
<a href="https://github.com/gongyeheyu" title="GONGYE Heyu"><img src="https://avatars.githubusercontent.com/u/85177605?v=4" width="42;" alt="GONGYE Heyu"/></a>
|
||||
<a href="https://github.com/Fuku-L" title="Fuku-L"><img src="https://avatars.githubusercontent.com/u/38535911?v=4" width="42;" alt="Fuku-L"/></a>
|
||||
<a href="https://github.com/sirius-fan" title="Fan"><img src="https://avatars.githubusercontent.com/u/25720015?v=4" width="42;" alt="Fan"/></a>
|
||||
<a href="https://github.com/eeeeeio" title="EEEEE"><img src="https://avatars.githubusercontent.com/u/20723545?v=4" width="42;" alt="EEEEE"/></a>
|
||||
<a href="https://github.com/demigodliu" title="DemigodLiu"><img src="https://avatars.githubusercontent.com/u/30372735?v=4" width="42;" alt="DemigodLiu"/></a>
|
||||
<a href="https://github.com/dasferco" title="Dasferco"><img src="https://avatars.githubusercontent.com/u/92622404?v=4" width="42;" alt="Dasferco"/></a>
|
||||
<a href="https://github.com/Damao2250" title="Damao"><img src="https://avatars.githubusercontent.com/u/19251992?v=4" width="42;" alt="Damao"/></a>
|
||||
<a href="https://github.com/DEEMO101" title="DEEMO101"><img src="https://avatars.githubusercontent.com/u/35123091?v=4" width="42;" alt="DEEMO101"/></a>
|
||||
<a href="https://github.com/ohto-ai" title="Choo"><img src="https://avatars.githubusercontent.com/u/46275725?v=4" width="42;" alt="Choo"/></a>
|
||||
<a href="https://github.com/CharlotteZeng" title="hanchZ"><img src="https://avatars.githubusercontent.com/u/19461184?v=4" width="42;" alt="hanchZ"/></a>
|
||||
<a href="https://github.com/ch3nnn" title="chentong"><img src="https://avatars.githubusercontent.com/u/40114564?v=4" width="42;" alt="chentong"/></a>
|
||||
<a href="https://github.com/Brid9e" title="Joe"><img src="https://avatars.githubusercontent.com/u/85558909?v=4" width="42;" alt="Joe"/></a>
|
||||
<a href="https://github.com/BobH-Official" title="BobH"><img src="https://avatars.githubusercontent.com/u/29333228?v=4" width="42;" alt="BobH"/></a>
|
||||
<a href="https://github.com/Blanket58" title="Blanket58"><img src="https://avatars.githubusercontent.com/u/39766189?v=4" width="42;" alt="Blanket58"/></a>
|
||||
<a href="https://github.com/BlacAmDK" title="BlacAmDK"><img src="https://avatars.githubusercontent.com/u/10971397?v=4" width="42;" alt="BlacAmDK"/></a>
|
||||
<a href="https://github.com/gitchenze" title="Aze"><img src="https://avatars.githubusercontent.com/u/13357869?v=4" width="42;" alt="Aze"/></a>
|
||||
<a href="https://github.com/dousha0w0" title="dousha0w0"><img src="https://avatars.githubusercontent.com/u/52566311?v=4" width="42;" alt="dousha0w0"/></a>
|
||||
<a href="https://github.com/13812700839" title="花殇"><img src="https://avatars.githubusercontent.com/u/58072506?v=4" width="42;" alt="花殇"/></a>
|
||||
<a href="https://github.com/yikuaibro" title="yikuaibro"><img src="https://avatars.githubusercontent.com/u/44493045?v=4" width="42;" alt="yikuaibro"/></a>
|
||||
<a href="https://github.com/dfshizhiqiang" title="Zech"><img src="https://avatars.githubusercontent.com/u/7030019?v=4" width="42;" alt="Zech"/></a>
|
||||
<a href="https://github.com/Yo-gurts" title="Yogurt"><img src="https://avatars.githubusercontent.com/u/44612841?v=4" width="42;" alt="Yogurt"/></a>
|
||||
<a href="https://github.com/hi-liyan" title="李李李"><img src="https://avatars.githubusercontent.com/u/40056492?v=4" width="42;" alt="李李李"/></a>
|
||||
<a href="https://github.com/BATTLEHAWK00" title="While True: learn()"><img src="https://avatars.githubusercontent.com/u/45313304?v=4" width="42;" alt="While True: learn()"/></a>
|
||||
<a href="https://github.com/dwgeneral" title="Happy-Engineer"><img src="https://avatars.githubusercontent.com/u/8654993?v=4" width="42;" alt="Happy-Engineer"/></a>
|
||||
<a href="https://github.com/whb1998a" title="Wafer"><img src="https://avatars.githubusercontent.com/u/44045064?v=4" width="42;" alt="Wafer"/></a>
|
||||
<a href="https://github.com/YLee9527" title="Terry Young"><img src="https://avatars.githubusercontent.com/u/18697332?v=4" width="42;" alt="Terry Young"/></a>
|
||||
<a href="https://github.com/TRDSCSH" title="TRDSCSH"><img src="https://avatars.githubusercontent.com/u/125717891?v=4" width="42;" alt="TRDSCSH"/></a>
|
||||
<a href="https://github.com/Xiwin" title="Xiwin"><img src="https://avatars.githubusercontent.com/u/107191230?v=4" width="42;" alt="Xiwin"/></a>
|
||||
<a href="https://github.com/DataEraserC" title="Sacabambaspis"><img src="https://avatars.githubusercontent.com/u/102341238?v=4" width="42;" alt="Sacabambaspis"/></a>
|
||||
<a href="https://github.com/qinxiongzhou" title="Ryan Zhou"><img src="https://avatars.githubusercontent.com/u/33239096?v=4" width="42;" alt="Ryan Zhou"/></a>
|
||||
<a href="https://github.com/RivailleF" title="RivailleF"><img src="https://avatars.githubusercontent.com/u/93083015?v=4" width="42;" alt="RivailleF"/></a>
|
||||
<a href="https://github.com/QDelta" title="QDelta"><img src="https://avatars.githubusercontent.com/u/60222316?v=4" width="42;" alt="QDelta"/></a>
|
||||
<a href="https://github.com/sevenleave" title="Poirot Hercule"><img src="https://avatars.githubusercontent.com/u/24411140?v=4" width="42;" alt="Poirot Hercule"/></a>
|
||||
<a href="https://github.com/PipecraftNet" title="Pipecraft"><img src="https://avatars.githubusercontent.com/u/88728670?v=4" width="42;" alt="Pipecraft"/></a>
|
||||
<a href="https://github.com/Perzch" title="Perzch"><img src="https://avatars.githubusercontent.com/u/67987641?v=4" width="42;" alt="Perzch"/></a>
|
||||
<a href="https://github.com/PILIHU2022" title="PILIHU2022"><img src="https://avatars.githubusercontent.com/u/100511118?v=4" width="42;" alt="PILIHU2022"/></a>
|
||||
<a href="https://github.com/HanaNoryu" title="Noryu"><img src="https://avatars.githubusercontent.com/u/109856546?v=4" width="42;" alt="Noryu"/></a>
|
||||
<a href="https://github.com/NianwenDan" title="NianwenDan"><img src="https://avatars.githubusercontent.com/u/74407127?v=4" width="42;" alt="NianwenDan"/></a>
|
||||
<a href="https://github.com/mo3et" title="Monet Lee"><img src="https://avatars.githubusercontent.com/u/34803812?v=4" width="42;" alt="Monet Lee"/></a>
|
||||
<a href="https://github.com/Moeyuuko" title="Moeyuuko"><img src="https://avatars.githubusercontent.com/u/14266681?v=4" width="42;" alt="Moeyuuko"/></a>
|
||||
<a href="https://github.com/malcolmyu" title="Minghao Yu"><img src="https://avatars.githubusercontent.com/u/3203962?v=4" width="42;" alt="Minghao Yu"/></a>
|
||||
<a href="https://github.com/mariuszmichalowski" title="Mariusz Michalowski"><img src="https://avatars.githubusercontent.com/u/92091891?v=4" width="42;" alt="Mariusz Michalowski"/></a>
|
||||
<a href="https://github.com/isecret" title="Mao Wang"><img src="https://avatars.githubusercontent.com/u/15724152?v=4" width="42;" alt="Mao Wang"/></a><!--GAMFC-END-->
|
||||
|
||||
贡献者列表,由 [contributors](https://github.com/jaywcjlove/github-action-contributors) 自动生成
|
||||
[贡献者](https://github.com/jaywcjlove/reference/graphs/contributors)列表,由 [contributors](https://github.com/jaywcjlove/github-action-contributors) 根据提交次数的先后顺序自动生成
|
||||
<!--rehype:style=padding-top:1rem;-->
|
||||
|
||||
## 国内镜像网站
|
||||
<!--rehype:wrap-style=text-align: center;max-width: 650px;margin: 0 auto;&class=home-title-reset-->
|
||||
|
||||
由于中国国内访问,时常打不开,你可以访问下面镜像网站。推荐自己的[镜像网站](https://github.com/jaywcjlove/reference/issues/102#issue-1451649637)
|
||||
由于中国国内访问,时常打不开,你可以访问下面镜像网站(国内打不开的不再收录)。推荐自己的[镜像网站](https://github.com/jaywcjlove/reference/discussions/206#discussion-4625735)
|
||||
|
||||
[dev.bi](https://dev.bi)<!--rehype:target=_blank&class=contributing&data-info=👆每天自动同步-->
|
||||
[server.wiki](https://ref.server.wiki)<!--rehype:target=_blank-->
|
||||
[nihaosi.com](https://refs.nihaosi.com)<!--rehype:target=_blank-->
|
||||
[quickref.cn](https://quickref.cn)<!--rehype:target=_blank-->
|
||||
[aibk.cn](https://quickref.aibk.cn)<!--rehype:target=_blank-->
|
||||
[ecdata.cn](http://ref.ecdata.cn)<!--rehype:target=_blank-->
|
||||
[quickref.hestudio.net](https://quickref.hestudio.net)<!--rehype:target=_blank&class=contributing&data-info=👆整点自动同步-->
|
||||
[qiubit.cc](http://ref.qiubit.cc)<!--rehype:target=_blank&class=contributing&data-info=👆每天自动同步-->
|
||||
[guoxudong.io](https://reference.guoxudong.io/)<!--rehype:target=_blank&class=contributing&data-info=👆每天自动同步-->
|
||||
[moeyuuko.com](https://ref.moeyuuko.com/)<!--rehype:target=_blank&class=contributing&data-info=👆每天自动同步-->
|
||||
[defense.ink](https://ref.defense.ink)<!--rehype:target=_blank&class=contributing&data-info=👆每天自动同步-->
|
||||
[terryyoung.cn](http://ref.terryyoung.cn/)<!--rehype:target=_blank&class=contributing&data-info=👆每周一三五自动同步-->
|
||||
[quickref.binscor.top](https://quickref.binscor.top)<!--rehype:target=_blank&data-info=👆每天自动同步-->
|
||||
[srebro.cn](https://ref.srebro.cn)<!--rehype:target=_blank&data-info=👆每天自动同步-->
|
||||
[haah.net](https://ref.haah.net)<!--rehype:target=_blank&data-info=👆每天自动同步-->
|
||||
[xiechengqi.top](https://ref.xiechengqi.top)<!--rehype:target=_blank&data-info=👆每天自动同步-->
|
||||
[ownit.top](https://memo.ownit.top)<!--rehype:target=_blank&data-info=👆每十分钟自动同步-->
|
||||
[666666.dev](https://cheat.666666.dev)<!--rehype:target=_blank&data-info=👆每天自动同步-->
|
||||
[mmoke.com](https://ref.mmoke.com)<!--rehype:target=_blank&data-info=👆每天自动同步-->
|
||||
[laoleng.vip](http://bbs.laoleng.vip/reference/)<!--rehype:target=_blank-->
|
||||
[dbyun.net](https://www.dbyun.net/reference/index.html)<!--rehype:target=_blank-->
|
||||
[if010.com](https://quickref.if010.com/)<!--rehype:target=_blank-->
|
||||
[isteed.cc](https://ref.isteed.cc/)<!--rehype:target=_blank-->
|
||||
[1han.wiki](https://code.1han.wiki/)<!--rehype:target=_blank-->
|
||||
[linzhe.top](https://linzhe.top/)<!--rehype:target=_blank-->
|
||||
[xushanxiang.com](https://xushanxiang.com/ref/)<!--rehype:target=_blank-->
|
||||
[surcode.cn](https://ref.surcode.cn)<!--rehype:target=_blank-->
|
||||
[cms.im](https://quickref.cms.im/)<!--rehype:target=_blank-->
|
||||
[nuomiphp.com](https://reference.tool.nuomiphp.com/)<!--rehype:target=_blank-->
|
||||
[eryajf.net](https://ref.eryajf.net/)<!--rehype:target=_blank-->
|
||||
[kjchmc.cn](https://ref.kjchmc.cn/)<!--rehype:target=_blank-->
|
||||
[aoh.cc](https://aoh.cc/)<!--rehype:target=_blank-->
|
||||
[quickreference.pages.dev](https://quickreference.pages.dev/)<!--rehype:target=_blank-->
|
||||
[btaw.cn](https://btaw.cn/qr)<!--rehype:target=_blank&class=contributing-->
|
||||
[lzw.me](https://lzw.me/x/reference/)<!--rehype:target=_blank-->
|
||||
[itcent.cn](https://code.itcent.cn/)<!--rehype:target=_blank-->
|
||||
[coolxy.top](https://refer.coolxy.top)<!--rehype:target=_blank-->
|
||||
[notes-bin.top](https://notes-bin.top)<!--rehype:target=_blank-->
|
||||
[tangcc.cn](https://web.tangcc.cn)<!--rehype:target=_blank-->
|
||||
[xadocker.cn](https://reference.xadocker.cn)<!--rehype:target=_blank-->
|
||||
[trtu.com.cn](https://reference.trtu.com.cn)<!--rehype:target=_blank-->
|
||||
[lzzzt.cn](https://ref.lzzzt.cn)<!--rehype:target=_blank-->
|
||||
[kclouder.cn](https://www.kclouder.cn/reference)<!--rehype:target=_blank-->
|
||||
[djcoder.com](https://doc.djcoder.com)<!--rehype:target=_blank-->
|
||||
[qirishuzhai.com](http://qirishuzhai.com/quickref)<!--rehype:target=_blank-->
|
||||
[longdada.me](https://ref.longdada.me)<!--rehype:target=_blank-->
|
||||
[xalaok.top](https://ref.xalaok.top)<!--rehype:target=_blank-->
|
||||
[zhangyuanqian.top](https://reference.zhangyuanqian.top/)<!--rehype:target=_blank-->
|
||||
[sosloli.com](https://ref.sosloli.com)<!--rehype:target=_blank-->
|
||||
[chenze.cloud](https://quick.chenze.cloud)<!--rehype:target=_blank-->
|
||||
[ref.v-ta.com](https://ref.v-ta.com)<!--rehype:target=_blank-->
|
||||
[hao.kim](https://ref.hao.kim)<!--rehype:target=_blank-->
|
||||
[tool.sakura.vin](https://tool.sakura.vin/ref/)<!--rehype:target=_blank-->
|
||||
[guoyaxue.top](https://reference.guoyaxue.top/)<!--rehype:target=_blank-->
|
||||
[chenchen.site](https://img.chenchen.site/reference/)<!--rehype:target=_blank-->
|
||||
[jgeek.cn](http://reference.jgeek.cn/)<!--rehype:target=_blank-->
|
||||
[itzcy.com](https://reference.itzcy.com/)<!--rehype:target=_blank-->
|
||||
[fifo.site](https://ref.fifo.site)<!--rehype:target=_blank-->
|
||||
[gaojs.com.cn](https://study.gaojs.com.cn)<!--rehype:target=_blank-->
|
||||
[15926.tech](https://ref.15926.tech)<!--rehype:target=_blank-->
|
||||
[jeffjade.com](https://codehelp.jeffjade.com)<!--rehype:target=_blank-->
|
||||
[okhk.net](https://ref.okhk.net)<!--rehype:target=_blank-->
|
||||
[wdft.com](https://ref.wdft.com)<!--rehype:target=_blank&class=contributing&data-info=👆每天自动同步-->
|
||||
[xuyiyang.vip](https://reference.xuyiyang.vip/)<!--rehype:target=_blank-->
|
||||
[zsccodelnc.cn](https://zsccodelnc.cn/coderef/)<!--rehype:target=_blank-->
|
||||
[chanlun.pro](https://ref.chanlun.pro)<!--rehype:target=_blank-->
|
||||
[likui.info](https://r.likui.info)<!--rehype:target=_blank-->
|
||||
[ruiange.work](https://code.ruiange.work/)<!--rehype:target=_blank-->
|
||||
[denganliang.com](https://ref.denganliang.com)<!--rehype:target=_blank-->
|
||||
[coderjia.cn](https://refer.coderjia.cn)<!--rehype:target=_blank-->
|
||||
[ivanz.cc](https://ref.ivanz.cc)<!--rehype:target=_blank-->
|
||||
[dev6.site](https://ref.dev6.site/)<!--rehype:target=_blank-->
|
||||
[mingming.dev](https://ref.mingming.dev)<!--rehype:target=_blank-->
|
||||
[clf.lol](https://ref.clf.lol/)<!--rehype:target=_blank-->
|
||||
[zishu.me](https://ref.zishu.me/)<!--rehype:target=_blank-->
|
||||
[sucan2233.cn](http://reference.sucan2233.cn)<!--rehype:target=_blank-->
|
||||
[reference-bk9.pages.dev](https://reference-bk9.pages.dev/)<!--rehype:target=_blank&class=contributing&data-info=👆自动实时同步-->
|
||||
[hrzweb.xyz](https://r.hrzweb.xyz)<!--rehype:target=_blank-->
|
||||
[bobh.cool](https://quickref.bobh.cool)<!--rehype:target=_blank-->
|
||||
[tangwudi.com](https://doc.tangwudi.com)<!--rehype:target=_blank-->
|
||||
[alomerry.com](https://ref.alomerry.com)<!--rehype:target=_blank-->
|
||||
[osz.icu](https://ref.osz.icu/)<!--rehype:target=_blank-->
|
||||
[ylmty.cc](https://docs.ylmty.cc)<!--rehype:target=_blank-->
|
||||
[g31.top](https://ref.g31.top/)<!--rehype:target=_blank-->
|
||||
[9up.dev](https://devref.9up.dev)<!--rehype:target=_blank-->
|
||||
[cizai.io](https://reference.cizai.io)<!--rehype:target=_blank&class=contributing&data-info=👆每天自动同步-->
|
||||
[docs.willxup.top](https://docs.willxup.top)<!--rehype:target=_blank-->
|
||||
[wangchunfei.com](https://ref.wangchunfei.com/)<!--rehype:target=_blank-->
|
||||
[object.cool](https://r.object.cool)<!--rehype:target=_blank&class=contributing&data-info=👆每天自动同步-->
|
||||
[luckyits.com](https://ref.luckyits.com/)<!--rehype:target=_blank&class=contributing&data-info=👆每天自动同步-->
|
||||
[jeremyjone.com](https://ref.jeremyjone.com/)<!--rehype:target=_blank&class=contributing&data-info=👆每天自动同步-->
|
||||
<!--rehype:class=home-card home-links-->
|
||||
|
||||
如果你有资源,可以很方便[部署 web 版](https://github.com/jaywcjlove/reference/issues/102#issue-1451649637),这非常简单,只需要克隆 [gh-pages](https://github.com/jaywcjlove/reference/tree/gh-pages) 分支代码到你的静态服务就可以了,还可以使用 [docker](https://hub.docker.com/r/wcjiang/reference) 快捷部署 web 版。
|
||||
|
||||
[quickref.cn](https://quickref.cn)<!--rehype:target=_blank&style=background: rgb(16 185 129);height: 2.6rem;border-radius: 2rem;font-weight: bold;-->
|
||||
[ecdata.cn](http://ref.ecdata.cn)<!--rehype:target=_blank&style=background: rgb(16 185 129);height: 2.6rem;border-radius: 2rem;font-weight: bold;-->
|
||||
[aibk.cn](https://quickref.aibk.cn)<!--rehype:target=_blank&style=background: rgb(16 185 129);height: 2.6rem;border-radius: 2rem;font-weight: bold;-->
|
||||
[jgeek.cn](http://reference.jgeek.cn/)<!--rehype:target=_blank&style=background: rgb(16 185 129);height: 2.6rem;border-radius: 2rem;font-weight: bold;-->
|
||||
[laoleng.vip](http://bbs.laoleng.vip/reference/)<!--rehype:target=_blank&style=background: rgb(16 185 129);height: 2.6rem;border-radius: 2rem;font-weight: bold;-->
|
||||
[liujiapeng.com](https://www.liujiapeng.com/)<!--rehype:target=_blank&style=background: rgb(16 185 129);height: 2.6rem;border-radius: 2rem;font-weight: bold;-->
|
||||
[dbyun.net](https://www.dbyun.net/reference/index.html)<!--rehype:target=_blank&style=background: rgb(16 185 129);height: 2.6rem;border-radius: 2rem;font-weight: bold;-->
|
||||
[dc6.fun](https://dc6.fun/reference/)<!--rehype:target=_blank&style=background: rgb(16 185 129);height: 2.6rem;border-radius: 2rem;font-weight: bold;-->
|
||||
<!--rehype:class=home-card&style=margin:2.2rem 0;display: flex;justify-content: center;gap: 1rem;flex-wrap: wrap;-->
|
||||
|
||||
如果你有资源,可以很方便部署 web 版,这非常简单,只需要克隆 gh-pages 分支代码到你的静态服务就可以了,还可以使用 [docker](https://hub.docker.com/r/wcjiang/reference) 快捷部署 web 版。
|
||||
|
||||
<!--rehype:ignore:start-->
|
||||
## License
|
||||
|
3
assets/adb.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 16 16" height="1em" width="1em">
|
||||
<path d="m10.213 1.471.691-1.26c.046-.083.03-.147-.048-.192-.085-.038-.15-.019-.195.058l-.7 1.27A4.832 4.832 0 0 0 8.005.941c-.688 0-1.34.135-1.956.404l-.7-1.27C5.303 0 5.239-.018 5.154.02c-.078.046-.094.11-.049.193l.691 1.259a4.25 4.25 0 0 0-1.673 1.476A3.697 3.697 0 0 0 3.5 5.02h9c0-.75-.208-1.44-.623-2.072a4.266 4.266 0 0 0-1.664-1.476ZM6.22 3.303a.367.367 0 0 1-.267.11.35.35 0 0 1-.263-.11.366.366 0 0 1-.107-.264.37.37 0 0 1 .107-.265.351.351 0 0 1 .263-.11c.103 0 .193.037.267.11a.36.36 0 0 1 .112.265.36.36 0 0 1-.112.264Zm4.101 0a.351.351 0 0 1-.262.11.366.366 0 0 1-.268-.11.358.358 0 0 1-.112-.264c0-.103.037-.191.112-.265a.367.367 0 0 1 .268-.11c.104 0 .19.037.262.11a.367.367 0 0 1 .107.265c0 .102-.035.19-.107.264ZM3.5 11.77c0 .294.104.544.311.75.208.204.46.307.76.307h.758l.01 2.182c0 .276.097.51.292.703a.961.961 0 0 0 .7.288.973.973 0 0 0 .71-.288.95.95 0 0 0 .292-.703v-2.182h1.343v2.182c0 .276.097.51.292.703a.972.972 0 0 0 .71.288.973.973 0 0 0 .71-.288.95.95 0 0 0 .292-.703v-2.182h.76c.291 0 .54-.103.749-.308.207-.205.311-.455.311-.75V5.365h-9v6.404Zm10.495-6.587a.983.983 0 0 0-.702.278.91.91 0 0 0-.293.685v4.063c0 .271.098.501.293.69a.97.97 0 0 0 .702.284c.28 0 .517-.095.712-.284a.924.924 0 0 0 .293-.69V6.146a.91.91 0 0 0-.293-.685.995.995 0 0 0-.712-.278Zm-12.702.283a.985.985 0 0 1 .712-.283c.273 0 .507.094.702.283a.913.913 0 0 1 .293.68v4.063a.932.932 0 0 1-.288.69.97.97 0 0 1-.707.284.986.986 0 0 1-.712-.284.924.924 0 0 1-.293-.69V6.146c0-.264.098-.491.293-.68Z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
3
assets/adobe-lightroom.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor" height="1em" width="1em">
|
||||
<path d="M19.75.3H4.25C1.9.3 0 2.2 0 4.55v14.9c0 2.35 1.9 4.25 4.25 4.25h15.5c2.35 0 4.25-1.9 4.25-4.25V4.55C24 2.2 22.1.3 19.75.3zm-6.99 16.389c0 .051-.029.09-.06.121a.17.17 0 0 1-.101.029H6.26c-.11 0-.16-.061-.16-.18V6.44c-.01-.07.04-.13.11-.14h2c.05-.01.11.03.11.08v8.43h4.62c.101 0 .131.049.11.14l-.29 1.739zm6.25-7.859v1.95c0 .08-.05.11-.16.11-.649-.04-1.3.08-1.89.34-.2.09-.39.21-.54.37v5.1c0 .1-.04.14-.13.14h-1.95c-.08.01-.15-.04-.16-.119V11.14c0-.24 0-.49-.01-.75s-.01-.52-.02-.78c-.01-.22-.03-.44-.061-.66-.01-.05.02-.1.07-.11.01-.01.02-.01.04 0h1.75c.1 0 .18.07.21.16.04.07.07.15.08.23.02.1.039.21.05.31.01.11.021.23.021.36.299-.35.66-.64 1.069-.86.46-.25.97-.37 1.49-.36.069-.01.13.04.14.11l.001.04z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 830 B |
3
assets/adobe-photoshop.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor" height="1em" width="1em">
|
||||
<path d="M9.85 8.42c-.37-.15-.77-.21-1.18-.2-.26 0-.49 0-.68.01-.2-.01-.34 0-.41.01v3.36c.14.01.27.02.39.02h.53c.39 0 .78-.06 1.15-.18.32-.09.6-.28.82-.53.21-.25.31-.59.31-1.03.01-.31-.07-.62-.23-.89a1.45 1.45 0 0 0-.7-.57zM19.75.3H4.25C1.9.3 0 2.2 0 4.55v14.899c0 2.35 1.9 4.25 4.25 4.25h15.5c2.35 0 4.25-1.9 4.25-4.25V4.55C24 2.2 22.1.3 19.75.3zm-7.391 11.65c-.399.56-.959.98-1.609 1.22-.68.25-1.43.34-2.25.34-.24 0-.4 0-.5-.01s-.24-.01-.43-.01v3.209c.01.07-.04.131-.11.141H5.52c-.08 0-.12-.041-.12-.131V6.42c0-.07.03-.11.1-.11.17 0 .33 0 .56-.01.24-.01.49-.01.76-.02s.56-.01.87-.02c.31-.01.61-.01.91-.01.82 0 1.5.1 2.06.31.5.17.96.45 1.34.82.32.32.57.71.73 1.14.149.42.229.85.229 1.3.001.86-.199 1.57-.6 2.13zm7.091 3.89c-.28.4-.671.709-1.12.891-.49.209-1.09.318-1.811.318-.459 0-.91-.039-1.359-.129-.35-.061-.7-.17-1.02-.32-.07-.039-.121-.109-.111-.189v-1.74c0-.029.011-.07.041-.09.029-.02.06-.01.09.01.39.23.8.391 1.24.49.379.1.779.15 1.18.15.38 0 .65-.051.83-.141.16-.07.27-.24.27-.42 0-.141-.08-.27-.24-.4-.16-.129-.489-.279-.979-.471-.51-.18-.979-.42-1.42-.719a2.625 2.625 0 0 1-.761-.85 2.158 2.158 0 0 1-.229-1.021c0-.43.12-.84.341-1.21.25-.4.619-.72 1.049-.92.469-.239 1.059-.349 1.769-.349.41 0 .83.03 1.24.09.3.04.59.12.86.23.039.01.08.05.1.09.01.04.02.08.02.12v1.63c0 .04-.02.08-.05.1-.09.02-.14.02-.18 0-.3-.16-.62-.27-.96-.34-.37-.08-.74-.13-1.12-.13-.2-.01-.41.02-.601.07-.129.03-.24.1-.31.2-.05.08-.08.18-.08.27s.04.18.101.26c.09.11.209.2.34.27.229.12.47.23.709.33.541.18 1.061.43 1.541.73.33.209.6.49.789.83.16.318.24.67.23 1.029.011.471-.129.94-.389 1.331z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
2
assets/adobe-xd.svg
Normal file
@ -0,0 +1,2 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 230 225">
|
||||
<path fill="currentColor" d="M191.816406,0 C212.904623,-3.87384253e-15 230,17.0953772 230,38.1835938 L230,186.066406 C230,207.154623 212.904623,224.25 191.816406,224.25 L38.1835938,224.25 C17.0953772,224.25 2.58256169e-15,207.154623 0,186.066406 L0,38.1835938 C-2.58256169e-15,17.0953772 17.0953772,3.87384253e-15 38.1835938,0 L191.816406,0 Z M195.077284,49.091346 L194.968125,49.0996094 L175.526836,49.0996094 C174.910508,49.0996094 174.601445,49.4607813 174.601445,50.1795313 L174.601445,80.5754688 L173.781172,80.5035938 L172.659922,80.41375 L171.669844,80.3436719 L171.080469,80.3095313 L170.550391,80.2861719 L170.077813,80.2708984 L169.664531,80.2664063 C160.200391,80.2664063 152.125234,82.1180859 145.440859,85.8214453 L144.91168,86.1089453 C138.763421,89.5141795 133.664216,94.5369517 130.166523,100.633086 C126.671624,106.792265 124.861878,113.763817 124.919648,120.845234 L124.923242,121.532539 C125.011289,129.971563 126.759648,137.020703 130.165625,142.677266 C133.543408,148.383655 138.57396,152.930169 144.591836,155.715391 C151.05183,158.667646 158.088508,160.143302 165.190313,160.035078 L166.254063,160.023398 C170.866829,159.944136 175.465136,159.483464 180.001953,158.646094 C185.345985,157.661087 190.569912,156.10972 195.585352,154.018242 C196.182744,153.743842 196.550536,153.130974 196.511641,152.474727 L196.358906,150.159453 L196.071406,146.156914 C195.952813,144.392383 195.893516,142.742852 195.893516,141.211914 L195.893516,50.025 C195.930082,49.7701021 195.844423,49.5128727 195.662338,49.3307875 C195.480252,49.1487023 195.223023,49.0630429 194.968125,49.0996094 Z M121.116289,57.8451797 C120.918558,57.505081 120.519883,57.3365583 120.138164,57.4317187 L99.9260156,57.4317187 C99.5008674,57.3901695 99.0726792,57.4705716 98.6915625,57.6635156 C98.4049609,57.9411328 98.1929297,58.2861328 98.0743359,58.6670703 C95.989605,62.7301089 93.855056,66.7673925 91.6711719,70.7780078 C89.4592187,74.8407422 87.2984766,78.8792187 85.1916406,82.8907422 C83.046362,86.9730975 80.9632439,91.0878173 78.9430078,95.2334766 L78.7884766,95.2334766 C76.817187,91.0868307 74.6810973,87.0205574 72.3853125,83.044375 C70.0538061,79.0056478 67.7650584,74.9423869 65.5194531,70.8552734 C63.2562891,66.7422266 61.1988672,62.6273828 59.3471875,58.5125391 C59.1073047,58.1630469 58.7901562,57.8728516 58.4217969,57.6635156 C57.9815263,57.4848886 57.5072287,57.4053935 57.0328125,57.4317187 L35.2780469,57.4317187 C34.9257161,57.4076934 34.5826053,57.5507949 34.3517578,57.8180469 C34.1469141,58.0767969 34.198125,58.4110156 34.5062891,58.8207031 L63.5132422,107.884375 L33.7354297,156.795312 C33.5281595,157.114603 33.4456497,157.499009 33.5036328,157.875234 C33.5359766,158.128594 33.6366016,158.164531 33.8046094,158.154648 L34.1064844,158.127695 L34.198125,158.125 L55.3356641,158.125 L55.6860547,158.119609 C56.5278906,158.091758 57.1325391,157.921055 57.4964062,157.103477 C59.7587305,153.094326 61.9702615,149.056724 64.1304687,144.991641 C66.2894141,140.929805 68.4753125,136.840117 70.6881641,132.725273 C72.8822374,128.642268 75.0168509,124.527589 77.0913281,120.382539 L77.2458594,120.382539 C79.492198,124.571384 81.7809354,128.737353 84.1117187,132.879805 L84.9724219,134.419727 C86.9211424,137.916516 88.8200324,141.440844 90.6685156,144.991641 C92.7350026,148.972723 94.7924298,152.958502 96.8407813,156.948945 C97.3645703,157.824023 98.224375,157.994727 99.4175,158.026172 L99.8523438,158.033359 L121.989844,158.033359 C122.132695,158.01 122.261172,158.004609 122.376172,158.004609 L122.588203,158.01 L122.7625,158.012695 C122.919727,158.006406 123.022148,157.965078 123.069766,157.797969 C123.167695,157.40625 123.112891,156.992969 122.915234,156.640781 L92.2111328,106.341758 L120.909922,58.9734375 L120.99168,58.8997656 C121.263231,58.6151174 121.314021,58.1852783 121.116289,57.8451797 Z M168.892773,98.1641797 C169.949193,98.1613542 171.005057,98.212933 172.056172,98.3187109 C172.916134,98.4008331 173.7676,98.5556177 174.601445,98.7814063 L174.601445,140.902852 L174.125273,141.034922 C173.169038,141.283616 172.192412,141.445986 171.207148,141.520078 C169.971797,141.623398 168.634922,141.675787 167.195625,141.675787 C164.498244,141.68816 161.81606,141.271154 159.249844,140.440156 C156.820509,139.673501 154.602403,138.353156 152.770312,136.583164 C150.855907,134.659039 149.381532,132.342646 148.448828,129.793672 C147.303124,126.630834 146.753878,123.282959 146.828945,119.919844 L146.832539,119.401445 C146.901719,114.600195 147.955586,110.709961 149.992344,107.730742 C152.03261,104.703627 154.823739,102.257983 158.092656,100.633086 C161.448702,98.9729615 165.148754,98.1271298 168.892773,98.1641797 Z"/></svg>
|
After Width: | Height: | Size: 4.6 KiB |
3
assets/android-studio.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor" height="1em" width="1em">
|
||||
<path d="M19.27 10.337a.604.604 0 0 0-.603.603v9.832h-1.738l-3.336-6.94c.476-.538.68-1.285.525-2a2.286 2.286 0 0 0-1.29-1.625v-.812a.847.847 0 0 0-.844-.864.848.848 0 0 0-.432.118.86.86 0 0 0-.412.766v.72a2.3 2.3 0 0 0-1.487 2.52 2.282 2.282 0 0 0 .591 1.21l-3.21 6.907h-2.94a1.996 1.996 0 0 1-1.983-1.99V5.017c-.006 1.102.883 2 1.986 2.006a2.024 2.024 0 0 0 .132-.004h14.745s2.535-.218 2.862 1.54a.495.495 0 0 0-.445.489c0 .711-.579 1.29-1.302 1.29h-.819zm-2.048 12.2a.973.973 0 0 1-.45 1.3.965.965 0 0 1-.402.093.974.974 0 0 1-.32-.045c-.024-.008-.046-.021-.07-.031a.97.97 0 0 1-.227-.132c-.025-.02-.05-.038-.072-.06a.96.96 0 0 1-.21-.276l-1.256-2.614-1.558-3.245a.772.772 0 0 0-.7-.444h-.002a.792.792 0 0 0-.709.444l-1.51 3.245-1.233 2.646a.972.972 0 0 1-.798.58c-.063.005-.124-.002-.185-.009-.034-.003-.069-.005-.103-.012-.048-.01-.095-.028-.142-.045-.03-.012-.06-.02-.09-.034a.987.987 0 0 1-.14-.09c-.021-.015-.045-.027-.066-.044a.986.986 0 0 1-.169-.185.979.979 0 0 1-.07-.985l.846-1.822 3.268-7.031a1.796 1.796 0 0 1-.708-1.164c-.155-.98.513-1.9 1.493-2.056V9.395a.354.354 0 0 1 .168-.316.347.347 0 0 1 .354 0 .354.354 0 0 1 .167.316v1.159l.013.006a1.803 1.803 0 0 1 1.288 1.378 1.784 1.784 0 0 1-.644 1.784l3.389 7.05.848 1.765zm-4.238-10.231a1.1 1.1 0 0 0-1.093-1.109 1.12 1.12 0 0 0-.786.322 1.101 1.101 0 0 0-.323.772 1.1 1.1 0 0 0 1.093 1.108h.008a1.1 1.1 0 0 0 1.101-1.093zm-1.027 5.277a.287.287 0 0 0-.257.155l-1.413 3.034h3.374l-1.457-3.033a.274.274 0 0 0-.247-.156zm8.143-6.746h-.83a.103.103 0 0 0-.103.103v12.91a.103.103 0 0 0 .096.103h.844a1.79 1.79 0 0 0 1.783-1.79V9.047a1.79 1.79 0 0 1-1.79 1.79zM2.61 5.017v.018a1.5 1.5 0 0 0 1.487 1.487 12.061 12.061 0 0 1 .131-.003h1.129a6.598 6.598 0 0 1 1.638-3.486H4.099A1.992 1.992 0 0 0 2.18 4.53c.242.036.43.235.43.486zm6.338-2.899L7.91.328a.219.219 0 0 1 0-.218.238.238 0 0 1 .187-.11.219.219 0 0 1 .187.11l1.05 1.815a6.49 6.49 0 0 1 5.318 0L15.696.11a.219.219 0 0 1 .373.22l-1.03 1.79a6.122 6.122 0 0 1 3.098 4.401L5.85 6.52a6.122 6.122 0 0 1 3.097-4.4zm5.377 2.62a.515.515 0 0 0 .527.503.515.515 0 0 0 .516-.515.521.521 0 0 0-.889-.367.515.515 0 0 0-.154.38zm-5.717-.006a.515.515 0 0 0 .52.51.509.509 0 0 0 .367-.149.521.521 0 1 0-.734-.734.515.515 0 0 0-.153.373z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
3
assets/blender.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" fill="currentColor" height="1em" width="1em">
|
||||
<path d="M341.333333 128C341.333333 142.506667 348.586667 157.44 362.666667 165.546667L512 256 106.666667 256C71.253333 256 42.666667 284.586667 42.666667 320 42.666667 355.413333 71.253333 384 106.666667 384L358.826667 384 85.333333 554.666667C49.493333 576 42.666667 606.72 42.666667 640 42.666667 682.666667 75.52 725.333333 128 725.333333 157.44 725.333333 187.306667 704 213.333333 682.666667L298.666667 613.546667C307.2 794.453333 456.96 938.666667 640 938.666667 828.586667 938.666667 981.333333 785.92 981.333333 597.333333 981.333333 472.746667 914.346667 362.666667 814.506667 304.213333 813.226667 303.36 811.946667 302.08 810.666667 301.226667 810.666667 301.226667 807.253333 298.666667 804.693333 297.386667 672.426667 208.213333 555.946667 158.72 407.466667 90.88 398.506667 87.04 390.826667 85.333333 384 85.333333 358.4 85.333333 341.333333 104.96 341.333333 128M640 384C757.76 384 853.333333 479.573333 853.333333 597.333333 853.333333 715.093333 757.76 810.666667 640 810.666667 522.24 810.666667 426.666667 715.093333 426.666667 597.333333 426.666667 479.573333 522.24 384 640 384M640 448C557.653333 448 490.666667 514.986667 490.666667 597.333333 490.666667 679.68 557.653333 746.666667 640 746.666667 722.346667 746.666667 789.333333 679.68 789.333333 597.333333 789.333333 514.986667 722.346667 448 640 448Z"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
1
assets/chown.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 1024 1024" version="1.1" fill="currentColor" xmlns="http://www.w3.org/2000/svg" height="1em" width="1em"><path d="M912.9 130.6c-26.1 4.5-52.8 6.9-80.2 6.9-115.4 0-221.1-41.9-302.6-111.2-10.6-9-26.2-9-36.8 0-81.5 69.4-187.2 111.2-302.6 111.2-27 0-53.5-2.3-79.2-6.7-17.2-2.9-32.9 10.4-33 27.9-0.2 109.1-0.4 238.1-0.4 242.5 0 471 394.5 592.7 431 603 1.8 0.5 3.6 0.5 5.4 0C550.9 994 943 873 945.5 405.7l0.4-247c0-17.6-15.8-31.1-33-28.1zM546 568.9v154.5c0 18.8-15.2 34-34 34s-34-15.2-34-34V568.9c-68.2-15.5-119.1-76.4-119.1-149.3 0-84.5 68.5-153.1 153.1-153.1S665.1 335 665.1 419.6c0 72.9-50.9 133.9-119.1 149.3z"></path></svg>
|
After Width: | Height: | Size: 640 B |
1
assets/conda.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg height="1em" width="1em" role="img" fill="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>Anaconda</title><path d="M12.045.033a12.181 12.182 0 00-1.361.078 17.512 17.513 0 011.813 1.433l.48.438-.465.45a15.047 15.048 0 00-1.126 1.205l-.178.215a8.527 8.527 0 01.86-.05 8.154 8.155 0 11-4.286 15.149 15.764 15.765 0 01-1.841.106h-.86a21.847 21.848 0 00.264 2.866 11.966 11.967 0 106.7-21.89zM8.17.678a12.181 12.182 0 00-2.624 1.275 15.506 15.507 0 011.813.43A18.551 18.552 0 018.17.678zM9.423.75a16.237 16.238 0 00-.995 1.998 16.15 16.152 0 011.605.66 6.98 6.98 0 01.43-.509c.234-.286.472-.559.716-.817A15.047 15.048 0 009.423.75zM4.68 2.949a14.969 14.97 0 000 2.336c.587-.065 1.196-.1 1.812-.107a16.617 16.617 0 01.48-1.748 16.48 16.481 0 00-2.292-.481zM3.62 3.5A11.938 11.938 0 001.762 5.88a17.004 17.004 0 011.877-.444A17.39 17.391 0 013.62 3.5zm4.406.287c-.143.437-.265.888-.38 1.347a8.255 8.255 0 011.67-.803c-.423-.2-.845-.38-1.29-.544zM6.3 6.216a14.051 14.052 0 00-1.555.108c.064.523.157 1.038.272 1.554a8.39 8.391 0 011.283-1.662zm-2.55.137a15.313 15.313 0 00-2.602.716h-.078v.079a17.104 17.105 0 001.267 2.544l.043.071.072-.049a16.309 16.31 0 011.734-1.083l.057-.035V8.54a16.867 16.868 0 01-.408-2.094v-.092zM.644 8.095l-.063.2A11.844 11.845 0 000 11.655v.209l.143-.152a17.706 17.707 0 011.584-1.447l.057-.043-.043-.064a16.18 16.18 0 01-1.025-1.87zm3.77 1.253l-.18.1c-.465.273-.93.573-1.375.889l-.065.05.05.064c.309.437.645.867.996 1.276l.137.165v-.208a8.176 8.176 0 01.364-2.15zM2.2 10.853l-.072.05a16.574 16.574 0 00-1.813 1.734l-.058.058.066.057a15.449 15.45 0 001.991 1.483l.072.05.043-.08a16.738 16.74 0 011.053-1.64v-.05l-.043-.05a16.99 16.99 0 01-1.19-1.54zm1.855 2.071l-.121.172a15.363 15.363 0 00-.917 1.433l-.043.072.071.043a16.61 16.61 0 001.562.766l.193.086-.086-.193a8.04 8.04 0 01-.66-2.172zm-3.976.48v.2a11.758 11.759 0 00.946 3.326l.078.186.072-.194a16.215 16.216 0 01.845-2l.057-.063-.064-.043a17.197 17.198 0 01-1.776-1.284zm2.543 1.805l-.035.08a15.764 15.765 0 00-.983 2.479v.08h.086a16.15 16.152 0 002.688.5l.072.007v-.086a17.562 17.563 0 01.164-2.056v-.065H4.55a16.266 16.266 0 01-1.849-.896zm2.544 1.169v.114a17.254 17.255 0 00-.151 1.828v.078h.931c.287 0 .624.014.946 0h.209l-.166-.129a8.011 8.011 0 01-1.64-1.834zm-3.29 2.1l.115.172a11.988 11.988 0 002.502 2.737l.157.129v-.201a22.578 22.58 0 01-.2-2.336v-.071h-.072a16.23 16.23 0 01-2.3-.387z"/></svg>
|
After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
1
assets/ejs.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" fill="currentColor" height="1em" width="1em"><path d="M384.28144981 252.31647403v112.80048696L145.20918813 474.54291854 384.28144981 587.88378965v110.53930269L21.43812835 526.28761486v-100.68590819l362.84332146-173.28714866zm246.90017394 102.1173521c0-28.82050958-26.50183907-46.93105778-47.58641778-32.52080298-21.0845787 14.41025479-21.0845787 50.63135118 0 65.04352199 21.08649586 14.41025479 47.58641778-3.70220942 47.58641778-32.52271901zm-86.46152988 88.55216697c-71.49939257-39.1951269-71.49939257-137.71758023 0-176.91462428 71.50130859-39.1951269 161.36227954 10.06609977 161.36227954 88.45827072s-89.86096981 127.65339648-161.36036352 88.45635356zm382.94102812 229.81099065c0-28.82050958-26.50183907-46.93105778-47.58641778-32.52080298-21.0845787 14.41025479-21.0845787 50.63135118 0 65.04160597 21.08649586 14.41025479 47.58641778-3.69837625 47.58641778-32.51888697zm-86.46152988 88.55216583c-71.49939257-39.1951269-71.49939257-137.71758023 0-176.91462315S1002.56187165 594.50062621 1002.56187165 672.89279602s-89.86096981 127.65339648-161.36036352 88.45635356zm-219.70656598 13.75681195 372.53958429-526.21192306H866.73755363l-378.74825784 526.21192306h133.50181432z"></path></svg>
|
After Width: | Height: | Size: 1.2 KiB |
5
assets/elasticsearch.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg viewBox="0 0 256 288" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid" height="1em" width="1em">
|
||||
<path d="M0 143.82c0 12.44 1.744 24.441 4.71 35.956h175.067c19.856 0 35.955-16.1 35.955-35.956 0-19.865-16.1-35.955-35.955-35.955H4.71C1.744 119.371 0 131.38 0 143.82" fill="#343741"/>
|
||||
<path d="M242.013 68.863c5.025-4.629 9.7-9.6 13.987-14.93C229.636 21.079 189.213 0 143.82 0 87 0 38.101 33.052 14.775 80.9h196.559c11.38 0 22.319-4.324 30.678-12.037" fill="#FEC514"/>
|
||||
<path d="M211.334 206.742H14.774c23.336 47.839 72.226 80.9 129.045 80.9 45.393 0 85.816-21.088 112.18-53.933a136.604 136.604 0 0 0-13.987-14.94c-8.36-7.721-19.299-12.027-30.678-12.027" fill="#00BFB3"/>
|
||||
</svg>
|
After Width: | Height: | Size: 703 B |
1
assets/elixir.svg
Normal file
@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1711950965872" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4680" xmlns:xlink="http://www.w3.org/1999/xlink" width="1em" height="1em"><path d="M519.381333 967.722667c-164.693333 0-298.24-155.306667-298.24-346.88 0-156.928 118.314667-348.672 209.749334-465.493334 43.264-55.296 125.013333-99.072 125.013333-99.072s-41.898667 223.530667 71.808 312.277334c100.949333 78.805333 175.189333 181.333333 175.189333 271.488 0 180.565333-118.784 327.68-283.52 327.68z" fill="currentColor" p-id="4681"></path></svg>
|
After Width: | Height: | Size: 694 B |
1
assets/es6.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" fill="currentColor" height="1em" width="1em"><path d="M821.375 500.75c-16.875-11.25-33.75-16.875-56.25-11.25000001-22.50000001 0-33.75 11.25-45 28.12500001-11.25 16.875-11.25 33.75-11.25 56.25s5.625 33.75 22.5 50.62499999c11.25 11.25 28.125 22.50000001 50.625 22.50000001s39.375-5.625 50.625-22.50000001c11.25-11.25 16.875-33.75 16.87500001-61.87499999 0-33.75-5.625-50.625-28.12500001-61.875z"></path><path d="M62 62v900h900V62H62zm292.50000001 618.75H140.75V326.375H343.25v39.375H191.375v106.875h140.625V512H191.375v123.75h163.12500001v45zm230.62499999-22.5c-16.875 16.875-45 22.50000001-78.75 22.5-33.75 0-61.875-11.25-78.75-28.125-22.50000001-16.875-28.125-39.375-28.12500001-67.5V568.25h45v11.25000001c0 22.50000001 5.625 33.75 16.87500001 45 11.25 11.25 28.125 16.875 45 16.87499999 22.50000001 0 39.375-5.625 50.625-16.87499999 5.625-11.25 11.25-22.50000001 11.25-39.37500001 0-11.25-5.625-28.125-16.875-39.375-11.25-11.25-28.125-22.50000001-50.625-28.125-33.75-11.25-56.25-28.125-73.125-39.375-16.875-16.875-22.50000001-39.375-22.5-56.25 0-28.125 11.25-50.625 28.125-67.50000001 22.50000001-22.50000001 45-28.125 73.125-28.12499999 33.75 0 61.875 11.25 78.75 33.75 11.25 16.875 22.50000001 39.375 22.5 61.875h-45c0-16.875 0-28.125-11.25-39.375-11.25-11.25-28.125-16.875-45-16.875-16.875 0-28.125 5.625-39.375 11.25-11.25 11.25-11.25 22.50000001-11.25 39.375 0 11.25 0 22.50000001 11.25 28.12499999 5.625 11.25 28.125 16.875 56.25 33.75000001 28.125 11.25 50.625 28.125 67.5 45 16.875 16.875 22.50000001 39.375 22.5 56.24999999 5.625 33.75-5.625 56.25-28.125 78.75000001zm298.125-45c-5.625 16.875-16.875 33.75-33.75000001 50.625-16.875 16.875-39.375 22.50000001-67.49999999 22.5s-50.625-5.625-73.125-16.87499999c-22.50000001-11.25-33.75-28.125-39.37500001-50.62500001-5.625-22.50000001-11.25-39.375-11.24999999-61.875 0-22.50000001 5.625-33.75 11.24999999-50.625 11.25-11.25 22.50000001-28.125 33.75000001-50.625l84.375-129.375h45l-84.375 135c39.375-11.25 67.50000001-5.625 90 5.625 22.50000001 11.25 33.75 28.125 45 39.375 5.625 16.875 11.25 33.75 11.24999999 50.625 0 16.875 0 39.375-11.24999999 56.25z"></path></svg>
|
After Width: | Height: | Size: 2.1 KiB |
3
assets/fastapi.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor" height="1em" width="1em">
|
||||
<path d="M12 0C5.375 0 0 5.375 0 12c0 6.627 5.375 12 12 12 6.626 0 12-5.373 12-12 0-6.625-5.373-12-12-12zm-.624 21.62v-7.528H7.19L13.203 2.38v7.528h4.029L11.376 21.62z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 286 B |
7
assets/figma.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 7.678 7.68" height="1em" width="1em">
|
||||
<path d="M2.56 7.68A1.28 1.28 0 0 0 3.84 6.4V5.12H2.56a1.28 1.28 0 0 0 0 2.56z" fill="#0acf83"/>
|
||||
<path d="M1.28 3.84a1.28 1.28 0 0 1 1.28-1.28h1.28v2.56H2.56a1.28 1.28 0 0 1-1.28-1.28z" fill="#a259ff"/>
|
||||
<path d="M1.28 1.28A1.28 1.28 0 0 1 2.559 0h1.28v2.56H2.56a1.28 1.28 0 0 1-1.28-1.28z" fill="#f24e1e"/>
|
||||
<path d="M3.84 0h1.28a1.28 1.28 0 0 1 0 2.56H3.84z" fill="#ff7262"/>
|
||||
<path d="M6.4 3.84a1.28 1.28 0 0 1-2.56 0 1.28 1.28 0 0 1 2.56 0z" fill="#1abcfe"/>
|
||||
</svg>
|
After Width: | Height: | Size: 568 B |
1
assets/finder.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 465 512"><path fill="currentColor" d="M248.872 63.164H0v381.678h261.91c-5.933-22.006-9.425-44.83-10.382-68.447c-68.347 4.003-133.766-13.78-180.387-34.21l8.366-19.544c57.24 24.51 114.676 35.3 171.812 32.432c.446-20.1 2.592-40.72 6.53-61.851h-80.66c-1.25-89.57 29.694-162.884 71.683-230.058m-134.6 60.62h21.255v51.408h-21.256z"/><path fill="currentColor" d="M275.335 353.01c37.076-4.358 73.997-14.42 110.621-30.343l8.48 19.491c-39.404 17.135-79.134 27.89-119.027 32.342c.925 24.412 4.796 47.862 11.426 70.342h177.716V63.164H277.265c-48.15 73.047-72.046 138.577-75.561 206.144h85.683c-4.489 18.091-10.965 48.315-12.052 83.702m60.787-177.818h-21.256v-51.407h21.256zM277.265 63.164c10.43-15.824 21.947-31.984 34.7-48.613L292.992 0c-16.643 21.701-31.247 42.669-44.12 63.164zm-15.378 381.678c6.312 23.342 15.365 45.765 27.28 67.158l20.893-11.635c-9.876-17.731-17.584-36.272-23.275-55.523z"/></svg>
|
After Width: | Height: | Size: 968 B |
3
assets/firefox.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor" height="1em" width="1em">
|
||||
<path d="M503.52 241.48c-.12-1.56-.24-3.12-.24-4.68v-.12l-.36-4.68v-.12a245.86 245.86 0 0 0-7.32-41.15c0-.12 0-.12-.12-.24l-1.08-4c-.12-.24-.12-.48-.24-.6-.36-1.2-.72-2.52-1.08-3.72-.12-.24-.12-.6-.24-.84-.36-1.2-.72-2.4-1.08-3.48-.12-.36-.24-.6-.36-1-.36-1.2-.72-2.28-1.2-3.48l-.36-1.08c-.36-1.08-.84-2.28-1.2-3.36a8.27 8.27 0 0 0-.36-1c-.48-1.08-.84-2.28-1.32-3.36-.12-.24-.24-.6-.36-.84-.48-1.2-1-2.28-1.44-3.48 0-.12-.12-.24-.12-.36-1.56-3.84-3.24-7.68-5-11.4l-.36-.72c-.48-1-.84-1.8-1.32-2.64-.24-.48-.48-1.08-.72-1.56-.36-.84-.84-1.56-1.2-2.4-.36-.6-.6-1.2-1-1.8s-.84-1.44-1.2-2.28c-.36-.6-.72-1.32-1.08-1.92s-.84-1.44-1.2-2.16a18.07 18.07 0 0 0-1.2-2c-.36-.72-.84-1.32-1.2-2s-.84-1.32-1.2-2-.84-1.32-1.2-1.92-.84-1.44-1.32-2.16a15.63 15.63 0 0 0-1.2-1.8L463.2 119a15.63 15.63 0 0 0-1.2-1.8c-.48-.72-1.08-1.56-1.56-2.28-.36-.48-.72-1.08-1.08-1.56l-1.8-2.52c-.36-.48-.6-.84-1-1.32-1-1.32-1.8-2.52-2.76-3.72a248.76 248.76 0 0 0-23.51-26.64A186.82 186.82 0 0 0 412 62.46c-4-3.48-8.16-6.72-12.48-9.84a162.49 162.49 0 0 0-24.6-15.12c-2.4-1.32-4.8-2.52-7.2-3.72a254 254 0 0 0-55.43-19.56c-1.92-.36-3.84-.84-5.64-1.2h-.12c-1-.12-1.8-.36-2.76-.48a236.35 236.35 0 0 0-38-4h-10.63a234.62 234.62 0 0 0-45.48 5c-33.59 7.08-63.23 21.24-82.91 39-1.08 1-1.92 1.68-2.4 2.16l-.48.48h.13l-.12.12.12-.12a.12.12 0 0 0 .12-.12l-.12.12a.42.42 0 0 1 .24-.12c14.64-8.76 34.92-16 49.44-19.56l5.88-1.44c.36-.12.84-.12 1.2-.24 1.68-.36 3.36-.72 5.16-1.08.24 0 .6-.12.84-.12C250.94 20.94 319.34 40.14 367 85.61a171.49 171.49 0 0 1 26.88 32.76c30.36 49.2 27.48 111.11 3.84 147.59-34.44 53-111.35 71.27-159 24.84a84.19 84.19 0 0 1-25.56-59 74.05 74.05 0 0 1 6.24-31c1.68-3.84 13.08-25.67 18.24-24.59-13.08-2.76-37.55 2.64-54.71 28.19-15.36 22.92-14.52 58.2-5 83.28a132.85 132.85 0 0 1-12.12-39.24c-12.24-82.55 43.31-153 94.31-170.51-27.48-24-96.47-22.31-147.71 15.36-29.88 22-51.23 53.16-62.51 90.36 1.68-20.88 9.6-52.08 25.8-83.88-17.16 8.88-39 37-49.8 62.88-15.6 37.43-21 82.19-16.08 124.79.36 3.24.72 6.36 1.08 9.6 19.92 117.11 122 206.38 244.78 206.38C392.77 503.42 504 392.19 504 255c-.12-4.52-.24-9.08-.48-13.52Z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
8
assets/flask.svg
Normal file
After Width: | Height: | Size: 7.2 KiB |
213
assets/gdb.svg
Normal file
After Width: | Height: | Size: 23 KiB |
4
assets/github-copilot.svg
Normal file
@ -0,0 +1,4 @@
|
||||
<svg width="1em" height="1em" viewBox="0 0 600 528" fill="currentColor" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M300.05 526.091C129.331 526.091 5.42623 417.044 0.748474 385.796V312.898C3.92935 289.397 26.0832 249.805 60.1747 235.622C60.6612 233.002 61.0728 230.27 61.5219 227.464C62.6071 220.615 63.7672 213.094 66.237 204.561C58.7152 185.551 56.7318 163.996 56.7318 142.59C56.7318 110.033 61.5219 76.3908 82.6653 49.6341C104.333 22.2037 138.574 7.57172 184.603 2.4449C229.734 -2.56966 269.252 3.71724 294.773 31.0728C296.645 33.0561 298.366 35.1143 299.975 37.2474C301.622 35.1143 303.493 33.0561 305.326 31.0728C330.848 3.71724 370.366 -2.56966 415.497 2.4449C461.526 7.57172 495.767 22.2037 517.435 49.6341C538.615 76.3908 543.368 110.033 543.368 142.59C543.368 163.996 541.385 185.551 533.863 204.561C536.333 213.094 537.53 220.615 538.578 227.464C539.027 230.308 539.476 233.002 539.963 235.622C574.541 250.029 596.919 290.669 599.501 314.021V384.075C599.501 412.74 474.1 526.091 300.05 526.091ZM300.05 470.52C385.372 470.52 471.593 428.981 487.235 416.894V257.663L486.374 253.322C468.037 261.181 446.146 264.212 421.746 264.212C378.861 264.212 344.694 251.975 320.333 227.127C312.303 218.871 305.498 209.508 300.125 199.322C294.697 209.512 287.842 218.875 279.767 227.127C255.443 251.975 221.277 264.212 178.353 264.212C153.954 264.212 132.1 261.181 113.726 253.322L112.865 257.663V416.894C128.545 428.981 214.728 470.52 300.05 470.52ZM253.796 69.3555C246.574 61.6466 229.958 53.9002 190.852 58.2412C152.719 62.4698 135.505 73.3597 126.748 84.4366C117.505 96.1123 112.94 113.963 112.94 142.59C112.94 172.266 117.767 186.412 124.466 193.896C130.528 200.669 143.888 208.079 178.428 208.079C210.349 208.079 228.536 199.285 239.726 187.871C251.514 175.821 259.447 156.923 262.815 129.755C267.193 94.7651 261.43 77.5509 253.796 69.3555ZM409.285 58.2412C370.216 53.9002 353.601 61.6466 346.378 69.3555C338.744 77.5509 332.944 94.7651 337.322 129.755C340.728 156.923 348.661 175.821 360.449 187.871C371.638 199.285 389.788 208.079 421.746 208.079C456.25 208.079 469.647 200.669 475.709 193.896C482.408 186.412 487.235 172.266 487.235 142.59C487.235 113.963 482.632 96.1123 473.389 84.4366C464.669 73.3597 447.455 62.4698 409.285 58.2412Z"/>
|
||||
<path d="M234.636 301.634C242.08 301.634 249.219 304.591 254.482 309.855C259.746 315.118 262.703 322.257 262.703 329.701V385.871C262.703 393.315 259.746 400.454 254.482 405.717C249.219 410.981 242.08 413.938 234.636 413.938C227.193 413.938 220.054 410.981 214.79 405.717C209.527 400.454 206.57 393.315 206.57 385.871V329.701C206.57 322.257 209.527 315.118 214.79 309.855C220.054 304.591 227.193 301.634 234.636 301.634ZM393.68 329.701V385.871C393.68 393.315 390.723 400.454 385.459 405.717C380.196 410.981 373.057 413.938 365.613 413.938C358.17 413.938 351.031 410.981 345.767 405.717C340.504 400.454 337.547 393.315 337.547 385.871V329.701C337.547 322.257 340.504 315.118 345.767 309.855C351.031 304.591 358.17 301.634 365.613 301.634C373.057 301.634 380.196 304.591 385.459 309.855C390.723 315.118 393.68 322.257 393.68 329.701Z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3.0 KiB |
3
assets/github.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 1984 2048" height="1em" width="1em">
|
||||
<path d="M663.6 1589.6c0 8-9.2 14.4-20.8 14.4-13.2 1.2-22.4-5.2-22.4-14.4 0-8 9.2-14.4 20.8-14.4 12-1.2 22.4 5.2 22.4 14.4zm-124.4-18c-2.8 8 5.2 17.2 17.2 19.6 10.4 4 22.4 0 24.8-8s-5.2-17.2-17.2-20.8c-10.4-2.8-22 1.2-24.8 9.2zm176.8-6.8c-11.6 2.8-19.6 10.4-18.4 19.6 1.2 8 11.6 13.2 23.6 10.4 11.6-2.8 19.6-10.4 18.4-18.4-1.2-7.6-12-12.8-23.6-11.6zM979.2 32C424.4 32 0 453.2 0 1008c0 443.6 279.2 823.2 678 956.8 51.2 9.2 69.2-22.4 69.2-48.4 0-24.8-1.2-161.6-1.2-245.6 0 0-280 60-338.8-119.2 0 0-45.6-116.4-111.2-146.4 0 0-91.6-62.8 6.4-61.6 0 0 99.6 8 154.4 103.2 87.6 154.4 234.4 110 291.6 83.6 9.2-64 35.2-108.4 64-134.8-223.6-24.8-449.2-57.2-449.2-442 0-110 30.4-165.2 94.4-235.6-10.4-26-44.4-133.2 10.4-271.6 83.6-26 276 108 276 108 80-22.4 166-34 251.2-34s171.2 11.6 251.2 34c0 0 192.4-134.4 276-108 54.8 138.8 20.8 245.6 10.4 271.6 64 70.8 103.2 126 103.2 235.6 0 386-235.6 416.8-459.2 442 36.8 31.6 68 91.6 68 185.6 0 134.8-1.2 301.6-1.2 334.4 0 26 18.4 57.6 69.2 48.4 400-132.8 671.2-512.4 671.2-956 0-554.8-450-976-1004.8-976zM388.8 1411.6c-5.2 4-4 13.2 2.8 20.8 6.4 6.4 15.6 9.2 20.8 4 5.2-4 4-13.2-2.8-20.8-6.4-6.4-15.6-9.2-20.8-4zm-43.2-32.4c-2.8 5.2 1.2 11.6 9.2 15.6 6.4 4 14.4 2.8 17.2-2.8 2.8-5.2-1.2-11.6-9.2-15.6-8-2.4-14.4-1.2-17.2 2.8zm129.6 142.4c-6.4 5.2-4 17.2 5.2 24.8 9.2 9.2 20.8 10.4 26 4 5.2-5.2 2.8-17.2-5.2-24.8-8.8-9.2-20.8-10.4-26-4zm-45.6-58.8c-6.4 4-6.4 14.4 0 23.6 6.4 9.2 17.2 13.2 22.4 9.2 6.4-5.2 6.4-15.6 0-24.8-5.6-9.2-16-13.2-22.4-8z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
9
assets/gitlab.svg
Normal file
@ -0,0 +1,9 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 236" height="1em" width="1em">
|
||||
<path d="m128.075 236.075 47.104-144.97H80.97l47.104 144.97z" fill="#E24329"/>
|
||||
<path d="M128.075 236.074 80.97 91.104H14.956l113.119 144.97z" fill="#FC6D26"/>
|
||||
<path d="M14.956 91.104.642 135.16a9.752 9.752 0 0 0 3.542 10.903l123.891 90.012-113.12-144.97z" fill="#FCA326"/>
|
||||
<path d="M14.956 91.105H80.97L52.601 3.79c-1.46-4.493-7.816-4.492-9.275 0l-28.37 87.315z" fill="#E24329"/>
|
||||
<path d="m128.075 236.074 47.104-144.97h66.015l-113.12 144.97z" fill="#FC6D26"/>
|
||||
<path d="m241.194 91.104 14.314 44.056a9.752 9.752 0 0 1-3.543 10.903l-123.89 90.012 113.119-144.97z" fill="#FCA326"/>
|
||||
<path d="M241.194 91.105h-66.015l28.37-87.315c1.46-4.493 7.816-4.492 9.275 0l28.37 87.315z" fill="#E24329"/>
|
||||
</svg>
|
After Width: | Height: | Size: 798 B |
3
assets/google-chrome.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 512 512" height="1em" width="1em">
|
||||
<path d="M0 256c0-46.6 12.47-90.4 34.27-128.9L144.1 318.3C166 357.5 207.9 384 256 384c14.3 0 27.1-2.3 40.8-6.6l-76.3 132.2C95.9 492.3 0 385.3 0 256zm365.1 65.6c12.3-19.2 18.9-42.5 18.9-65.6 0-38.2-16.8-72.5-43.3-96h152.7c12 29.6 18.6 62.1 18.6 96 0 141.4-114.6 255.1-256 256l109.1-190.4zM477.8 128H256c-62.9 0-113.7 44.1-125.5 102.7L54.19 98.47C101 38.53 174 0 256 0c94.8 0 177.5 51.48 221.8 128zM168 256c0-48.6 39.4-88 88-88s88 39.4 88 88-39.4 88-88 88-88-39.4-88-88z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 589 B |
3
assets/intelli-j-idea.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 32 32" height="1em" width="1em">
|
||||
<path d="M0 0v32h32V0zm4.964 4.145h6.667v2.448H9.776v8.371h1.855v2.443H4.964v-2.443h1.927V6.593H4.964zm14.739 0h2.964v8.667c0 .819-.073 1.485-.297 2.079a4.002 4.002 0 0 1-.963 1.479c-.371.371-.885.745-1.48.891a5.192 5.192 0 0 1-1.927.371c-1.036 0-1.927-.224-2.593-.595a6.403 6.403 0 0 1-1.704-1.405l1.855-2.073c.369.443.74.74 1.109.964.369.219.812.369 1.26.369.521 0 .959-.151 1.333-.521.292-.369.443-.891.443-1.703zM2.964 26h12v2h-12z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 554 B |
3
assets/jquery.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor" height="1em" width="1em">
|
||||
<path d="M1.525 5.87c-2.126 3.054-1.862 7.026-.237 10.269.037.079.078.154.118.229.023.052.049.1.077.15.013.027.031.056.047.082.026.052.054.102.081.152l.157.266c.03.049.057.097.09.146.056.094.12.187.178.281.026.04.05.078.079.117a6.368 6.368 0 0 0 .31.445c.078.107.156.211.24.315.027.038.058.076.086.115l.22.269c.028.03.055.067.084.099.098.118.202.233.306.35l.005.006a3.134 3.134 0 0 0 .425.44c.08.083.16.165.245.245l.101.097c.111.105.223.209.34.309.002 0 .003.002.005.003l.057.05c.102.089.205.178.31.26l.125.105c.085.068.174.133.26.2l.137.105c.093.07.192.139.287.207.035.025.07.05.106.073l.03.023.28.185.12.08c.148.094.294.184.44.272.041.02.084.044.123.068.108.062.22.125.329.183.06.034.122.063.184.094.075.042.153.083.234.125a.324.324 0 0 1 .056.023c.033.015.064.031.096.047.12.06.245.118.375.175.024.01.05.02.076.034.144.063.289.123.438.182.034.01.07.027.105.04.135.051.274.103.411.152l.05.018c.154.052.305.102.46.15.036.01.073.023.111.033.16.048.314.105.474.137 10.273 1.872 13.258-6.177 13.258-6.177-2.508 3.266-6.958 4.127-11.174 3.169-.156-.036-.312-.086-.47-.132a13.539 13.539 0 0 1-.567-.182l-.062-.024c-.136-.046-.267-.097-.4-.148a1.615 1.615 0 0 0-.11-.04c-.148-.06-.29-.121-.433-.184-.031-.01-.057-.024-.088-.036a23.44 23.44 0 0 1-.362-.17 1.485 1.485 0 0 1-.106-.052c-.094-.044-.188-.095-.28-.143a3.947 3.947 0 0 1-.187-.096c-.114-.06-.227-.125-.34-.187-.034-.024-.073-.044-.112-.066a15.922 15.922 0 0 1-.439-.27 2.107 2.107 0 0 1-.118-.078 6.01 6.01 0 0 1-.312-.207c-.035-.023-.067-.048-.103-.073a9.553 9.553 0 0 1-.295-.212c-.042-.034-.087-.066-.132-.1-.088-.07-.177-.135-.265-.208l-.118-.095a10.593 10.593 0 0 1-.335-.28.258.258 0 0 0-.037-.031l-.347-.316-.1-.094c-.082-.084-.166-.164-.25-.246l-.098-.1a9.081 9.081 0 0 1-.309-.323l-.015-.016c-.106-.116-.21-.235-.313-.355-.027-.03-.053-.064-.08-.097l-.227-.277a21.275 21.275 0 0 1-.34-.449C2.152 11.79 1.306 7.384 3.177 3.771m4.943-.473c-1.54 2.211-1.454 5.169-.254 7.508a9.111 9.111 0 0 0 .678 1.133c.23.33.484.721.793.988.107.122.223.24.344.36l.09.09c.114.11.232.217.35.325l.016.013a9.867 9.867 0 0 0 .414.342c.034.023.063.05.096.073.14.108.282.212.428.316l.015.009c.062.045.128.086.198.13.028.018.06.042.09.06.106.068.21.132.318.197.017.007.032.016.048.023.09.055.188.108.282.157.033.02.065.035.1.054.066.033.132.068.197.102l.032.014c.135.067.273.129.408.19.034.014.063.025.092.039.111.048.224.094.336.137.05.017.097.037.144.052.102.038.21.073.31.108l.14.045c.147.045.295.104.449.13C22.164 17.206 24 11.098 24 11.098c-1.653 2.38-4.852 3.513-8.261 2.628a8.04 8.04 0 0 1-.449-.13c-.048-.014-.09-.029-.136-.043-.104-.036-.211-.07-.312-.109l-.144-.054c-.113-.045-.227-.087-.336-.135-.034-.015-.065-.025-.091-.04-.14-.063-.281-.125-.418-.192l-.206-.107-.119-.06a5.673 5.673 0 0 1-.265-.15.62.62 0 0 1-.062-.035c-.106-.066-.217-.13-.318-.198-.034-.019-.065-.042-.097-.062l-.208-.136c-.144-.1-.285-.208-.428-.313-.032-.029-.063-.053-.094-.079-1.499-1.178-2.681-2.79-3.242-4.613-.59-1.897-.46-4.023.56-5.75m4.292-.147c-.909 1.334-.996 2.99-.37 4.46.665 1.563 2.024 2.79 3.608 3.37.065.025.128.046.196.07l.088.027c.092.03.185.063.28.084 4.381.845 5.567-2.25 5.886-2.704-1.043 1.498-2.792 1.857-4.938 1.335a4.85 4.85 0 0 1-.516-.16 6.352 6.352 0 0 1-.618-.254 6.53 6.53 0 0 1-1.082-.66c-1.922-1.457-3.113-4.236-1.859-6.5"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3.3 KiB |
5
assets/kubernetes.svg
Normal file
@ -0,0 +1,5 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24" height="1em" width="1em">
|
||||
<path d="m10.013 13.738-2.254.387a4.475 4.475 0 0 0 1.753 2.231l.865-2.095a.27.27 0 0 0 .022-.228c-.022-.18-.204-.295-.386-.295zm.865-2.914c.205 0 .387-.159.387-.364l.114-2.277-.456.091a4.516 4.516 0 0 0-2.118 1.162l1.89 1.343c.069.022.115.045.183.045zm-1.002 1.48a.366.366 0 0 0-.045-.524l-1.685-1.503a4.797 4.797 0 0 0-.661 2.778l2.209-.637c.091-.023.137-.046.182-.114zm1.457.797.616.296.614-.296.16-.661-.433-.546h-.683l-.433.546zm1.344-2.436c.114.159.341.182.5.091l1.867-1.32a4.286 4.286 0 0 0-2.573-1.23l.137 2.3a.215.215 0 0 0 .069.159z"/>
|
||||
<path d="m21.944 14.103-1.73-7.446c-.113-.364-.387-.66-.729-.842L12.541 2.49c-.182-.091-.387-.114-.569-.114s-.387 0-.569.045L4.457 5.769a1.22 1.22 0 0 0-.683.842l-1.708 7.492c-.068.387.023.774.25 1.093l4.805 5.943c.273.273.66.456 1.047.479h7.651c.41.045.797-.137 1.048-.479l4.805-5.943c.227-.319.318-.706.272-1.093zm-2.845.501c-.046 0-.068 0-.114-.023-.022-.023-.022-.023-.045-.023-.046 0-.068-.022-.092-.022-.091-.023-.159-.068-.25-.114a.32.32 0 0 1-.137-.045h-.022a3.91 3.91 0 0 0-.729-.205h-.022a.26.26 0 0 0-.182.068s0 .023-.023.023l-.183-.024a5.628 5.628 0 0 1-2.46 3.097l.068.182s-.022 0-.022.022a.264.264 0 0 0-.022.228c.091.228.205.455.364.66v.045a.396.396 0 0 1 .091.114.81.81 0 0 1 .159.228c.023.022.046.045.046.068 0 0 .022 0 .022.022a.582.582 0 0 1 .023.342.38.38 0 0 1-.205.25c-.068.022-.114.045-.183.045a.511.511 0 0 1-.433-.273c-.022 0-.022-.022-.022-.022-.022-.023-.022-.045-.046-.068-.045-.068-.068-.159-.091-.25l-.046-.137v-.022a3.816 3.816 0 0 0-.296-.706.353.353 0 0 0-.182-.137c0-.023 0-.023-.023-.023l-.091-.159c-.228.068-.479.159-.729.205-.41.114-.82.159-1.229.159a5.368 5.368 0 0 1-1.981-.364l-.091.182c0 .023 0 .023-.023.023a.35.35 0 0 0-.182.137c-.114.228-.228.455-.296.706l-.045.137c-.023.091-.068.159-.091.25-.022.023-.045.045-.045.068-.023 0-.023.022-.023.022a.508.508 0 0 1-.433.273.434.434 0 0 1-.159-.045.469.469 0 0 1-.182-.615c.023 0 .023-.023.023-.023.022-.023.022-.045.045-.068.068-.091.114-.182.159-.228s.068-.068.091-.114v-.023a3.73 3.73 0 0 0 .364-.66.268.268 0 0 0-.023-.228s-.022 0-.022-.022l.114-.16a3.578 3.578 0 0 1-.615-.41 5.493 5.493 0 0 1-1.867-2.664l-.205.022s0-.022-.023-.022a.256.256 0 0 0-.182-.068h-.022a4.015 4.015 0 0 0-.751.205h-.024c-.045 0-.091.023-.137.046-.068.022-.159.068-.25.091-.022 0-.091-.022-.091 0 0 .023 0 .023-.023.023-.045.023-.068.023-.114.023a.424.424 0 0 1-.456-.319.445.445 0 0 1 .364-.524c.023-.023.023-.023.046-.023.045 0 .068-.022.091-.022.091 0 .182-.023.273-.023.045-.022.091-.022.137-.022a4.2 4.2 0 0 0 .774-.137c.068-.046.137-.091.16-.16 0 0 .022 0 .022-.022l.182-.046c-.205-1.298.091-2.618.797-3.734.022-.045.045-.068.068-.114l-.131-.132a.106.106 0 0 1-.004.019v-.023l.004.004c.01-.065-.031-.145-.072-.186-.182-.182-.41-.319-.638-.455l-.136-.069a2.587 2.587 0 0 1-.251-.136c-.022 0-.068-.045-.068-.045s0-.023-.022-.023a.49.49 0 0 1-.092-.639c.068-.114.182-.159.319-.159a.54.54 0 0 1 .319.114l.023.023c.022.022.045.022.068.045.068.069.114.137.182.205.023.022.068.045.091.091.159.182.364.364.569.524.045.022.091.045.137.045.045 0 .068-.023.091-.023h.023l.137.091a5.426 5.426 0 0 1 2.801-1.594c.273-.046.523-.091.774-.114l.023-.182v-.045c.068-.045.091-.114.114-.182 0-.273 0-.524-.045-.774v-.023c0-.045 0-.091-.023-.137a1.129 1.129 0 0 1-.045-.273v-.113c0-.114.045-.228.137-.319.114-.114.25-.182.387-.159a.45.45 0 0 1 .387.478v.137c-.023.091-.023.182-.045.273 0 .045-.023.091-.023.136v.023c-.048.273-.048.524-.048.774.023.068.045.136.114.182v-.023l.023.182a5.84 5.84 0 0 1 2.96 1.184c.183.182.387.364.569.546l.183-.114h.022c.022.023.068.023.091.023.046 0 .091-.023.137-.045.205-.137.41-.319.569-.501.022-.023.068-.046.091-.091.046-.068.114-.137.183-.205.022 0 .045-.022.068-.045l.022-.023a.546.546 0 0 1 .318-.114c.114 0 .251.068.319.16.159.205.113.478-.091.637 0 .023.022.023 0 .046-.023.022-.046.022-.068.045-.092.045-.16.091-.251.137l-.137.068a4.104 4.104 0 0 0-.638.455c-.045.046-.068.137-.068.205v.023l-.136.137c.364.569.638 1.207.797 1.867.137.66.182 1.343.091 2.003l.182.046a.278.278 0 0 0 .16.159c.25.068.523.114.773.137h.023a.297.297 0 0 0 .137.022c.091 0 .182 0 .272.023.046 0 .092 0 .092.023 0 .022.022.022.045.022a.537.537 0 0 1 .41.479.49.49 0 0 1-.453.32z"/>
|
||||
<path d="M12.085 14.718a.352.352 0 0 0-.455.091l-1.116 2.027c.456.136.957.228 1.435.228.341 0 .66-.045.979-.114.159-.045.296-.068.433-.091l-1.093-1.981c-.069-.069-.115-.115-.183-.16zm3.644-4.441-1.708 1.548a.36.36 0 0 0-.091.16c-.046.205.068.41.273.455l2.163.615a4.375 4.375 0 0 0-.092-1.435 4.63 4.63 0 0 0-.545-1.343zm-2.073 3.484a.371.371 0 0 0-.205.433l.889 2.141a4.366 4.366 0 0 0 1.366-1.366c.182-.25.318-.547.433-.865l-2.277-.387a.634.634 0 0 0-.206.044z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 4.7 KiB |
3
assets/mongodb.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 120 257" fill="none" xmlns="http://www.w3.org/2000/svg" height="1em" width="1em">
|
||||
<path d="M82.323 28.644C71.537 15.847 62.249 2.85 60.35.15c-.2-.2-.5-.2-.7 0-1.897 2.7-11.185 15.697-21.971 28.494C-54.902 146.721 52.26 226.406 52.26 226.406l.9.6C53.958 239.303 55.955 257 55.955 257h7.99s1.998-17.597 2.797-29.994l.899-.7c.1.1 107.263-79.585 14.68-197.662ZM59.95 224.606s-4.793-4.099-6.092-6.198v-.201l5.793-128.574c0-.4.6-.4.6 0l5.792 128.574v.201c-1.299 2.099-6.093 6.198-6.093 6.198Z" fill="currentColor"/>
|
||||
</svg>
|
After Width: | Height: | Size: 537 B |
1
assets/neo4j.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="1em" width="1em" fill="#4581C3" role="img" viewBox="0 0 24 24"><title>Neo4j</title><path d="M9.629 13.227c-.593 0-1.139.2-1.58.533l-2.892-1.976a2.61 2.61 0 0 0 .101-.711 2.633 2.633 0 0 0-2.629-2.629A2.632 2.632 0 0 0 0 11.073a2.632 2.632 0 0 0 2.629 2.629c.593 0 1.139-.2 1.579-.533L7.1 15.145c-.063.226-.1.465-.1.711 0 .247.037.484.1.711l-2.892 1.976a2.608 2.608 0 0 0-1.579-.533A2.632 2.632 0 0 0 0 20.639a2.632 2.632 0 0 0 2.629 2.629 2.632 2.632 0 0 0 2.629-2.629c0-.247-.037-.485-.101-.711l2.892-1.976c.441.333.987.533 1.58.533a2.633 2.633 0 0 0 2.629-2.629c0-1.45-1.18-2.629-2.629-2.629ZM16.112.732c-4.72 0-7.888 2.748-7.888 8.082v3.802a3.525 3.525 0 0 1 3.071.008v-3.81c0-3.459 1.907-5.237 4.817-5.237s4.817 1.778 4.817 5.237v8.309H24V8.814C24 3.448 20.832.732 16.112.732Z"/></svg>
|
After Width: | Height: | Size: 837 B |
3
assets/nextjs.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" height="1em" width="1em">
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M0 7.5a7.5 7.5 0 1 1 11.697 6.216L4.907 4.21A.5.5 0 0 0 4 4.5V12h1V6.06l5.83 8.162A7.5 7.5 0 0 1 0 7.5ZM10 10V4h1v6h-1Z" fill="currentColor"/>
|
||||
</svg>
|
After Width: | Height: | Size: 299 B |
6
assets/nvm.svg
Normal file
@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000" fill="currentColor" height="1em" width="1em">
|
||||
<g>
|
||||
<path d="M499.8 990c-12.6 0-25.2-3.4-36.4-10.1l-115.9-71c-17.3-10-8.8-13.6-3.2-15.6 23.1-8.3 30-12.4 54.6-26.9 2.6-1.5 6-.9 8.7.7l86.9 51.4c3.2 1.9 7.8 1.9 10.8 0l339.5-201.8c3.2-1.9 5.3-5.8 5.3-9.7V298.5c0-4-2.1-7.9-5.4-9.9L505.3 81.5c-3.2-2-7.5-2-10.7 0L155.5 288.6c-3.4 2-5.5 5.9-5.5 9.8V707c0 4 2.1 7.7 5.4 9.6l87.3 52.4c51.6 26.7 82.2-.4 82.2-32V335.3c0-5.8 4.5-10.3 10.1-10.3h49.9c5.5 0 10.1 4.5 10.1 10.3v401.8c0 71.2-42.3 112.1-107.6 112.1-20 0-35.9 0-80-22.5l-91-54.2C93.9 759.1 80 734 80 707.1V292.6c0-26.9 13.9-52 36.5-65.4L463.6 19.6c21.9-12.9 51.1-12.9 72.9 0l347 207.5c22.5 13.5 36.5 38.6 36.5 65.4V707c0 26.9-13.9 52-36.5 65.5l-347 207.3c-11.1 6.6-23.7 10.1-36.5 10.1l-.2.1z" />
|
||||
<path d="M607.1 710c-141.3 0-183.8-69.1-183.8-129.7 0-5.8 4.5-10.3 10-10.3h44.9c5 0 9.2 3.7 10 8.8 6.7 47.3 36.6 68.1 118.8 68.1 73.1 0 103-22.6 103-62.7 0-23.2-7.6-40.3-121.2-51.8-95-9.7-153.8-31.4-153.8-110 0-72.5 59.1-114.8 158-114.8 100.9 0 167.3 30.6 173.2 111.2.2 2.9-.8 5.8-2.7 8-1.9 2.1-4.5 3.3-7.3 3.3h-45c-4.7 0-8.8-3.4-9.8-8.1-9.6-37.1-37.1-51.2-108.4-51.2-79.8 0-89.1 27.9-89.1 49.5 0 26.2 11 33.8 118.8 48.5C729.3 483.2 780 503.9 780 581.4c0 78.3-63.1 128.6-172.9 128.6z" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
3
assets/phpstorm.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="1em" width="1em" viewBox="0 0 256 256">
|
||||
<defs><linearGradient id="IconifyId18e425c03bba7dc7a0" x1="40.196%" x2="55.577%" y1="64.058%" y2="47.965%"><stop offset="0%" stop-color="#AF1DF5"/><stop offset="21%" stop-color="#BC20E4"/><stop offset="63%" stop-color="#DD29B8"/><stop offset="100%" stop-color="#FF318C"/></linearGradient><linearGradient id="IconifyId18e425c03bba7dc7a1" x1="42.885%" x2="63.378%" y1="78.603%" y2="-4.057%"><stop offset="2%" stop-color="#6B57FF"/><stop offset="42%" stop-color="#B74AF7"/><stop offset="75%" stop-color="#FF318C"/></linearGradient><linearGradient id="IconifyId18e425c03bba7dc7a2" x1="73.258%" x2="32.049%" y1="102.209%" y2="-3.688%"><stop offset="0%" stop-color="#293896"/><stop offset="8%" stop-color="#3B3AA2"/><stop offset="29%" stop-color="#6740C0"/><stop offset="49%" stop-color="#8A44D8"/><stop offset="68%" stop-color="#A347E9"/><stop offset="86%" stop-color="#B249F3"/><stop offset="100%" stop-color="#B74AF7"/></linearGradient><linearGradient id="IconifyId18e425c03bba7dc7a3" x1="62.87%" x2="39.747%" y1="72.446%" y2="45.568%"><stop offset="2%" stop-color="#6B57FF"/><stop offset="78%" stop-color="#B74AF7"/></linearGradient></defs><path fill="url(#IconifyId18e425c03bba7dc7a0)" d="M141.307 45.013L132.773 19.2L43.68 0L0 49.413l48 24.56v-28.96z"/><path fill="url(#IconifyId18e425c03bba7dc7a1)" d="m48 61.813l-48-12.4l24.4 146.56l23.52-.186z"/><path fill="url(#IconifyId18e425c03bba7dc7a2)" d="M208 45.013h-83.493L158.053 15.2l64.64 12L256 109.973l-47.973 47.654z"/><path fill="url(#IconifyId18e425c03bba7dc7a3)" d="M208.053 108.88L208 205.013H70.56l3.547 20.907L160.4 256l95.6-57.227z"/><path d="M47 43.771h162v162H47z"/><path fill="#FFF" d="M67.947 175.093h60v10h-60zm52.32-58.133l7.813-9.6a27.573 27.573 0 0 0 17.973 7.307c5.334 0 8.694-2.16 8.694-5.68v-.16c0-1.364-.343-2.46-1.422-3.451l-.242-.211a7.3 7.3 0 0 0-.557-.414l-.315-.204a11.058 11.058 0 0 0-.522-.302l-.382-.2a15.25 15.25 0 0 0-.201-.1l-.425-.198a20.305 20.305 0 0 0-.454-.198l-.484-.199a27.087 27.087 0 0 0-.254-.1l-.531-.198a34.56 34.56 0 0 0-.278-.1l-.58-.201l-.303-.101l-.63-.203l-.667-.205l-.702-.208c-.12-.035-.242-.07-.365-.104l-.758-.212l-.795-.215l-2.44-.633l-.766-.205l-1.126-.31l-.368-.105l-.728-.212l-.714-.215a67.125 67.125 0 0 1-.351-.11l-.694-.222l-.68-.226a50.843 50.843 0 0 1-.334-.116l-.658-.235l-.643-.24a23.119 23.119 0 0 1-.316-.124l-.622-.251l-.606-.259c-6.286-2.757-10.049-6.826-10.165-14.88l-.002-.573c0-10.792 8.59-17.981 20.68-18.131l.386-.003a34.667 34.667 0 0 1 22.347 7.654l-6.88 9.973a28.107 28.107 0 0 0-15.653-5.92c-5.067 0-7.734 2.32-7.734 5.333v.187c0 2.23.852 3.644 3.457 4.932l.414.197c.143.066.29.131.443.196l.472.195l.502.195l.533.195l.563.196l.596.198l.629.199l.662.202l1.057.308l1.137.318l1.219.328l1.303.341c.287.075.572.151.853.228l.836.232c.275.078.548.157.817.237l.8.242c.131.04.262.082.392.123l.772.25l.754.256c.372.13.737.262 1.096.397l.707.273c7.675 3.042 11.938 7.422 12.063 15.448l.003.554c0 11.947-9.12 18.667-22.106 18.667a38.27 38.27 0 0 1-25.52-9.627M68 65.333h24.533c14.15 0 22.786 8.312 22.958 20.354l.002.526c0 13.867-10.8 21.067-24.24 21.067h-9.92v17.973H68zm23.627 30.214c6.586 0 10.453-3.92 10.453-9.067v-.16c0-5.92-4.107-9.093-10.667-9.093h-10.08v18.32z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3.2 KiB |
3
assets/pm2.svg
Normal file
After Width: | Height: | Size: 5.7 KiB |
3
assets/pycharm.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="currentColor" height="1em" width="1em">
|
||||
<path d="M7.833 6.666v-.055c0-1-.667-1.5-1.778-1.5H4.389v3.055h1.723c1.111 0 1.721-.666 1.721-1.5zM0 0v24h24V0H0zm2.223 3.167h4c2.389 0 3.833 1.389 3.833 3.445v.055c0 2.278-1.778 3.5-4.001 3.5H4.389v2.945H2.223V3.167zM11.277 21h-9v-1.5h9V21zm4.779-7.777c-2.944.055-5.111-2.223-5.111-5.057C10.944 5.333 13.056 3 16.111 3c1.889 0 3 .611 3.944 1.556l-1.389 1.61c-.778-.722-1.556-1.111-2.556-1.111-1.658 0-2.873 1.375-2.887 3.084.014 1.709 1.174 3.083 2.887 3.083 1.111 0 1.833-.445 2.61-1.167l1.39 1.389c-.999 1.112-2.166 1.779-4.054 1.779z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 656 B |
1
assets/r.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 24 24"><path fill="currentColor" d="M12 4.29c-5.5 0-10 3-10 6.71c0 3.28 3.56 6 8.24 6.58v2.13h3.41v-2.12c.85-.09 1.64-.25 2.39-.48l1.38 2.6h3.86l-2.32-3.91C20.83 14.58 22 12.87 22 11c0-3.71-4.5-6.71-10-6.71m1.53 2.62c4.2 0 7.3 1.4 7.3 4.59c0 1.71-.92 2.91-2.42 3.65c-.09-.05-.17-.1-.22-.15c-.36-.16-.96-.34-.96-.34s2.98-.22 2.98-3.19c0-2.97-3.12-3.02-3.12-3.02h-6.85v7.16c-2.55-.74-4.31-2.31-4.31-4.11c0-2.54 3.4-4.59 7.6-4.59m.15 3.98h2.07s.95-.05.95.94c0 .97-.95.97-.95.97h-2.07zm-.03 4.41h.92c.18 0 .27.05.43.2c.13.1.27.29.39.46c-.55.07-1.13.1-1.74.1z"/></svg>
|
After Width: | Height: | Size: 641 B |
7
assets/react-native.svg
Normal file
@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" height="1em" width="1em">
|
||||
<circle cx="12" cy="11.245" r="1.785"/>
|
||||
<path d="m7.002 14.794-.395-.101c-2.934-.741-4.617-2.001-4.617-3.452 0-1.452 1.684-2.711 4.617-3.452l.395-.1.111.391a19.507 19.507 0 0 0 1.136 2.983l.085.178-.085.178c-.46.963-.841 1.961-1.136 2.985l-.111.39zm-.577-6.095c-2.229.628-3.598 1.586-3.598 2.542 0 .954 1.368 1.913 3.598 2.54.273-.868.603-1.717.985-2.54a20.356 20.356 0 0 1-.985-2.542zm10.572 6.095-.11-.392a19.628 19.628 0 0 0-1.137-2.984l-.085-.177.085-.179c.46-.961.839-1.96 1.137-2.984l.11-.39.395.1c2.935.741 4.617 2 4.617 3.453 0 1.452-1.683 2.711-4.617 3.452l-.395.101zm-.41-3.553c.4.866.733 1.718.987 2.54 2.23-.627 3.599-1.586 3.599-2.54 0-.956-1.368-1.913-3.599-2.542a20.683 20.683 0 0 1-.987 2.542z"/>
|
||||
<path d="m6.419 8.695-.11-.39c-.826-2.908-.576-4.991.687-5.717 1.235-.715 3.222.13 5.303 2.265l.284.292-.284.291a19.718 19.718 0 0 0-2.02 2.474l-.113.162-.196.016a19.646 19.646 0 0 0-3.157.509l-.394.098zm1.582-5.529c-.224 0-.422.049-.589.145-.828.477-.974 2.138-.404 4.38.891-.197 1.79-.338 2.696-.417a21.058 21.058 0 0 1 1.713-2.123c-1.303-1.267-2.533-1.985-3.416-1.985zm7.997 16.984c-1.188 0-2.714-.896-4.298-2.522l-.283-.291.283-.29a19.827 19.827 0 0 0 2.021-2.477l.112-.16.194-.019a19.473 19.473 0 0 0 3.158-.507l.395-.1.111.391c.822 2.906.573 4.992-.688 5.718a1.978 1.978 0 0 1-1.005.257zm-3.415-2.82c1.302 1.267 2.533 1.986 3.415 1.986.225 0 .423-.05.589-.145.829-.478.976-2.142.404-4.384-.89.198-1.79.34-2.698.419a20.526 20.526 0 0 1-1.71 2.124z"/>
|
||||
<path d="m17.58 8.695-.395-.099a19.477 19.477 0 0 0-3.158-.509l-.194-.017-.112-.162A19.551 19.551 0 0 0 11.7 5.434l-.283-.291.283-.29c2.08-2.134 4.066-2.979 5.303-2.265 1.262.727 1.513 2.81.688 5.717l-.111.39zm-3.287-1.421c.954.085 1.858.228 2.698.417.571-2.242.425-3.903-.404-4.381-.824-.477-2.375.253-4.004 1.841.616.67 1.188 1.378 1.71 2.123zM8.001 20.15a1.983 1.983 0 0 1-1.005-.257c-1.263-.726-1.513-2.811-.688-5.718l.108-.391.395.1c.964.243 2.026.414 3.158.507l.194.019.113.16c.604.878 1.28 1.707 2.02 2.477l.284.29-.284.291c-1.583 1.627-3.109 2.522-4.295 2.522zm-.993-5.362c-.57 2.242-.424 3.906.404 4.384.825.47 2.371-.255 4.005-1.842a21.17 21.17 0 0 1-1.713-2.123 20.692 20.692 0 0 1-2.696-.419z"/>
|
||||
<path d="M12 15.313c-.687 0-1.392-.029-2.1-.088l-.196-.017-.113-.162a25.697 25.697 0 0 1-1.126-1.769 26.028 26.028 0 0 1-.971-1.859l-.084-.177.084-.179c.299-.632.622-1.252.971-1.858.347-.596.726-1.192 1.126-1.77l.113-.16.196-.018a25.148 25.148 0 0 1 4.198 0l.194.019.113.16a25.136 25.136 0 0 1 2.1 3.628l.083.179-.083.177a24.742 24.742 0 0 1-2.1 3.628l-.113.162-.194.017c-.706.057-1.412.087-2.098.087zm-1.834-.904c1.235.093 2.433.093 3.667 0a24.469 24.469 0 0 0 1.832-3.168 23.916 23.916 0 0 0-1.832-3.168 23.877 23.877 0 0 0-3.667 0 23.743 23.743 0 0 0-1.832 3.168 24.82 24.82 0 0 0 1.832 3.168z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.8 KiB |
4
assets/reactrouter.svg
Normal file
@ -0,0 +1,4 @@
|
||||
<svg viewBox="0 0 256 140" fill="currentColor" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid" height="1em" width="1em">
|
||||
<path d="M78.066 92.588c12.818 0 23.209-10.391 23.209-23.21 0-12.817-10.391-23.208-23.21-23.208-12.817 0-23.208 10.39-23.208 23.209 0 12.818 10.391 23.209 23.209 23.209Zm-54.857 46.417c12.818 0 23.209-10.39 23.209-23.209 0-12.817-10.391-23.208-23.21-23.208C10.392 92.588 0 102.978 0 115.796c0 12.818 10.39 23.21 23.209 23.21Zm209.582 0c12.818 0 23.209-10.39 23.209-23.209 0-12.817-10.39-23.208-23.209-23.208-12.818 0-23.209 10.39-23.209 23.208 0 12.818 10.391 23.21 23.21 23.21Z"/>
|
||||
<path d="M156.565 70.357c-.742-7.754-1.12-14.208-7.06-18.744-7.522-5.744-16.044-2.017-26.54-5.806C112.65 43.312 105 34.155 105 23.24 105 10.405 115.578 0 128.626 0c9.665 0 17.974 5.707 21.634 13.883 5.601 10.64 1.96 21.467 8.998 26.921 8.333 6.458 19.568 1.729 32.104 7.848a23.614 23.614 0 0 1 9.84 8.425A22.858 22.858 0 0 1 205 69.718c0 10.915-7.65 20.073-17.964 22.568-10.497 3.789-19.019.062-26.541 5.806-8.46 6.46-3.931 17.267-10.826 28.682-3.913 7.518-11.867 12.663-21.043 12.663-13.048 0-23.626-10.405-23.626-23.24 0-9.323 5.582-17.364 13.638-21.066 12.536-6.12 23.77-1.39 32.104-7.848 4.807-3.726 5.823-9.473 5.823-16.926Z" fill="currentColor"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
11
assets/redis.svg
Normal file
@ -0,0 +1,11 @@
|
||||
<svg viewBox="0 0 256 220" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid" height="1em" width="1em">
|
||||
<path d="M245.97 168.943c-13.662 7.121-84.434 36.22-99.501 44.075-15.067 7.856-23.437 7.78-35.34 2.09-11.902-5.69-87.216-36.112-100.783-42.597C3.566 169.271 0 166.535 0 163.951v-25.876s98.05-21.345 113.879-27.024c15.828-5.679 21.32-5.884 34.79-.95 13.472 4.936 94.018 19.468 107.331 24.344l-.006 25.51c.002 2.558-3.07 5.364-10.024 8.988" fill="#912626"/>
|
||||
<path d="M245.965 143.22c-13.661 7.118-84.431 36.218-99.498 44.072-15.066 7.857-23.436 7.78-35.338 2.09-11.903-5.686-87.214-36.113-100.78-42.594-13.566-6.485-13.85-10.948-.524-16.166 13.326-5.22 88.224-34.605 104.055-40.284 15.828-5.677 21.319-5.884 34.789-.948 13.471 4.934 83.819 32.935 97.13 37.81 13.316 4.881 13.827 8.9.166 16.02" fill="#C6302B"/>
|
||||
<path d="M245.97 127.074c-13.662 7.122-84.434 36.22-99.501 44.078-15.067 7.853-23.437 7.777-35.34 2.087-11.903-5.687-87.216-36.112-100.783-42.597C3.566 127.402 0 124.67 0 122.085V96.206s98.05-21.344 113.879-27.023c15.828-5.679 21.32-5.885 34.79-.95C162.142 73.168 242.688 87.697 256 92.574l-.006 25.513c.002 2.557-3.07 5.363-10.024 8.987" fill="#912626"/>
|
||||
<path d="M245.965 101.351c-13.661 7.12-84.431 36.218-99.498 44.075-15.066 7.854-23.436 7.777-35.338 2.087-11.903-5.686-87.214-36.112-100.78-42.594-13.566-6.483-13.85-10.947-.524-16.167C23.151 83.535 98.05 54.148 113.88 48.47c15.828-5.678 21.319-5.884 34.789-.949 13.471 4.934 83.819 32.933 97.13 37.81 13.316 4.88 13.827 8.9.166 16.02" fill="#C6302B"/>
|
||||
<path d="M245.97 83.653c-13.662 7.12-84.434 36.22-99.501 44.078-15.067 7.854-23.437 7.777-35.34 2.087-11.903-5.687-87.216-36.113-100.783-42.595C3.566 83.98 0 81.247 0 78.665v-25.88s98.05-21.343 113.879-27.021c15.828-5.68 21.32-5.884 34.79-.95C162.142 29.749 242.688 44.278 256 49.155l-.006 25.512c.002 2.555-3.07 5.361-10.024 8.986" fill="#912626"/>
|
||||
<path d="M245.965 57.93c-13.661 7.12-84.431 36.22-99.498 44.074-15.066 7.854-23.436 7.777-35.338 2.09C99.227 98.404 23.915 67.98 10.35 61.497-3.217 55.015-3.5 50.55 9.825 45.331 23.151 40.113 98.05 10.73 113.88 5.05c15.828-5.679 21.319-5.883 34.789-.948 13.471 4.935 83.819 32.934 97.13 37.811 13.316 4.876 13.827 8.897.166 16.017" fill="#C6302B"/>
|
||||
<path d="m159.283 32.757-22.01 2.285-4.927 11.856-7.958-13.23-25.415-2.284 18.964-6.839-5.69-10.498 17.755 6.944 16.738-5.48-4.524 10.855 17.067 6.391m-28.251 57.518L89.955 73.238l58.86-9.035-17.783 26.072m-56.95-50.928c17.375 0 31.46 5.46 31.46 12.194 0 6.736-14.085 12.195-31.46 12.195s-31.46-5.46-31.46-12.195c0-6.734 14.085-12.194 31.46-12.194" fill="#FFF"/>
|
||||
<path d="m185.295 35.998 34.836 13.766-34.806 13.753-.03-27.52" fill="#621B1C"/>
|
||||
<path d="m146.755 51.243 38.54-15.245.03 27.519-3.779 1.478-34.791-13.752" fill="#9A2928"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
3
assets/scala.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 32 32" height="1em" width="1em">
|
||||
<path d="M6.12 32c6.047 0 18.411-2.021 19.76-4v-7.641c-1.276 1.88-13.714 3.885-19.76 3.885zm0-10.182c6.047 0 18.411-2.021 19.76-4v-7.635c-1.276 1.875-13.714 3.88-19.76 3.88zm0-10.177c6.047 0 18.411-2.021 19.76-4V0C24.604 1.875 12.166 3.88 6.12 3.88z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 367 B |
3
assets/subversion.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 14 14" height="1em" width="1em">
|
||||
<path d="M13 11.377V8.223c-1.643.648-3.681 1.278-6.115 1.893-2.267.573-4.229.986-5.885 1.238v.022h12zM1 8.038v2.566a51.332 51.332 0 0 0 5.065-.983c1.481-.374 2.623-.738 3.424-1.09.8-.351 1.17-.648 1.11-.89-.054-.21-.424-.318-1.109-.323-.351.005-.835.03-1.452.075-.618.045-1.387.117-2.305.213-1.425.152-2.608.269-3.55.348-.448.037-.842.066-1.183.085Zm.517 1.475c.03 0 .058.013.08.035a.116.116 0 0 1-.128.191.117.117 0 0 1-.037-.025.072.072 0 0 1-.025-.037c0-.008-.008-.023-.008-.045 0-.03.015-.06.037-.083.023-.022.053-.03.09-.03zm.406 0a.12.12 0 0 1 .082.035.115.115 0 0 1 .033.083c0 .033-.011.06-.034.084a.135.135 0 0 1-.135.024.097.097 0 0 1-.038-.025c-.014-.007-.022-.022-.03-.037-.007-.008-.007-.023-.007-.045 0-.03.007-.06.03-.083a.112.112 0 0 1 .082-.03zm-.405-.755c.03 0 .057.011.08.035.023.022.035.05.035.083 0 .031-.012.06-.035.082a.114.114 0 0 1-.082.035.114.114 0 0 1-.084-.035.115.115 0 0 1-.035-.082c0-.034.008-.062.03-.085a.117.117 0 0 1 .083-.034Zm.405 0c.031 0 .058.011.082.035.022.022.033.05.033.083 0 .031-.011.06-.034.082-.03.022-.053.035-.09.035a.106.106 0 0 1-.083-.035.118.118 0 0 1-.037-.082c0-.034.007-.062.03-.085a.116.116 0 0 1 .082-.034ZM13 3.299v2.406c-.818.05-1.84.138-3.069.267-1.245.135-2.26.24-3.046.307-.788.075-1.357.114-1.705.12-.682.016-1.045-.075-1.098-.277-.053-.224.353-.524 1.223-.885.87-.367 2.025-.735 3.45-1.095a43.649 43.649 0 0 1 4.244-.825zm-.428-.675a81.77 81.77 0 0 0-5.056 1.115C4.793 4.426 2.622 5.11 1 5.787V2.624h11.573z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
3
assets/tailwindcss.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 15 15" fill="none" xmlns="http://www.w3.org/2000/svg" height="1em" width="1em">
|
||||
<path d="M7.5 2.5c-1.026 0-1.908.277-2.6.87-.688.59-1.137 1.447-1.387 2.516a.5.5 0 0 0 .897.4c.316-.452.632-.723.936-.863.294-.135.611-.162.975-.065.366.098.65.386 1.095.87l.015.016c.336.365.745.81 1.305 1.156.582.359 1.305.6 2.264.6 1.026 0 1.908-.277 2.6-.87.688-.59 1.138-1.447 1.387-2.516a.5.5 0 0 0-.897-.4c-.316.452-.632.723-.936.863-.294.135-.611.162-.975.065-.366-.098-.65-.386-1.095-.87l-.015-.016c-.336-.365-.745-.81-1.305-1.156-.582-.359-1.305-.6-2.264-.6ZM4 7c-1.026 0-1.908.277-2.6.87C.712 8.46.263 9.317.013 10.386a.5.5 0 0 0 .897.4c.316-.452.632-.723.936-.863.294-.135.611-.162.975-.065.366.098.65.386 1.095.87l.015.016c.336.365.745.81 1.305 1.156.582.359 1.305.6 2.264.6 1.026 0 1.908-.277 2.6-.87.688-.59 1.138-1.447 1.387-2.516a.5.5 0 0 0-.897-.4c-.316.452-.632.723-.936.863-.294.135-.611.162-.975.065-.366-.098-.65-.386-1.095-.87l-.015-.016c-.335-.365-.745-.81-1.305-1.156C5.682 7.24 4.959 7 4 7Z" fill="currentColor"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.0 KiB |
6
assets/tauri.svg
Normal file
@ -0,0 +1,6 @@
|
||||
<svg viewBox="0 0 256 289" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMid" height="1em" width="1em">
|
||||
<path d="M178.497 104.93c0 15.155-12.285 27.44-27.44 27.44-15.153 0-27.438-12.285-27.438-27.44 0-15.153 12.285-27.438 27.439-27.438s27.439 12.285 27.439 27.439Z" fill="#FFC131"/>
|
||||
<circle fill="#24C8DB" transform="rotate(180 104.91 183.505)" cx="104.911" cy="183.505" r="27.439"/>
|
||||
<path d="M207.93 192.86a104.766 104.766 0 0 1-36.168 14.717 73.586 73.586 0 0 0 3.617-33.176c29.953-10.472 49.82-38.964 49.292-70.69-.53-31.727-21.336-59.542-51.622-69.008-30.286-9.467-63.23 1.546-81.733 27.324a122.227 122.227 0 0 0-40.16 11.723C64.86 29.536 105.956-.445 152.244.005c46.288.45 86.794 31.224 99.636 75.697 12.841 44.473-5.026 92.103-43.95 117.157ZM52.404 92.832l25.693 3.118a73.586 73.586 0 0 1 3.243-14.593 104.766 104.766 0 0 0-28.936 11.475Z" fill="#FFC131"/>
|
||||
<path d="M47.913 95.577a104.766 104.766 0 0 1 36.419-14.842 73.46 73.46 0 0 0-4.116 33.3c-29.847 10.619-49.549 39.148-48.906 70.822.642 31.673 21.484 59.38 51.738 68.78 30.253 9.399 63.127-1.62 81.604-27.352a122.227 122.227 0 0 0 40.16-11.6c-13.736 44.169-54.812 74.1-101.064 73.645-46.252-.453-86.733-31.184-99.602-75.612-12.87-44.427 4.92-92.037 43.768-117.141Zm155.528 100.026-.5.25.5-.25Z" fill="#24C8DB"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.3 KiB |
3
assets/twitter.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" fill="currentColor" height="1em" width="1em">
|
||||
<path d="M283.02655555 307.55600001c140.717 72.074 260.839 66.925 260.839 66.92499999s-44.617-157.87599999 94.384-228.234c138.998-70.359 236.816 48.048 236.816 48.048s24.025-6.863 42.901-13.728 44.617-18.87599999 44.61700001-18.876l-42.90100001 77.222 66.92500001-6.863s-8.579 12.014-34.31900001 36.038c-25.741 24.025-37.754 37.754-37.754 37.754s10.297 190.483-90.95 338.062c-99.53 147.58000001-229.952 235.099-417.002 253.973-187.05 18.87599999-310.606-58.347-310.606-58.347s82.37-5.149 133.852-24.025c51.483-20.592 126.99-73.79 126.99-73.79s-106.397-32.605-145.866-70.35899999-48.048-60.062-48.048-60.06200001l106.397-1.716s-111.542-60.062-142.433-106.397c-30.89-46.333-36.038-92.666-36.038-92.666l80.656 32.605s-66.925-92.666-77.222-163.025c-10.297-72.074 12.014-109.826 12.014-109.826s36.038 65.21 176.752 137.283z"></path>
|
||||
</svg>
|
After Width: | Height: | Size: 944 B |
384
docs/adb.md
Normal file
@ -0,0 +1,384 @@
|
||||
Android Debug Bridge 备忘清单
|
||||
===
|
||||
|
||||
[ADB](https://developer.android.com/studio/command-line/adb.html) 既 Android Debug Bridge,是 Google 的 Android SDK 中的一个命令行工具,可让您的计算机控制 Android 设备执行各种设备操作。以下是您可以与 [ADB](https://developer.android.com/studio/command-line/adb.html) 一起使用的一些最常见的命令及其用法
|
||||
|
||||
入门
|
||||
----
|
||||
|
||||
### 设备基础
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`adb devices` | 列出已连接的设备
|
||||
`adb devices -l` | 列出已连接的设备和种类
|
||||
`adb connect [IP:PORT]` | 连接到指定 IP 和端口的设备
|
||||
`adb disconnect [IP:PORT]` | 断开指定 IP 和端口的设备连接,若未指定,则断开所有连接
|
||||
`adb root` | 以 `root` 权限重新启动 `adbd`
|
||||
`adb start-server` | 启动 `adb` 服务
|
||||
`adb kill-server` | 停止 `adb` 服务
|
||||
`adb remount` | 重新挂载具有读/写访问权限的文件系统
|
||||
`adb reboot` | 重启设备
|
||||
`adb reboot bootloader` | 将设备重启到 fastboot 模式
|
||||
`adb reboot recovery` | 将设备重启到恢复模式
|
||||
`adb disable-verity` | 禁用设备的 dm-verity 安全特性
|
||||
<!--rehype:className=left-align code-nowrap-->
|
||||
|
||||
---
|
||||
|
||||
- `wait-for-device` 可以在 `adb` 之后指定,以确保该命令在设备连接后运行
|
||||
- `-s` 可用于在多个连接时将命令发送到特定设备
|
||||
|
||||
#### 示例
|
||||
|
||||
```bash
|
||||
$ adb wait-for-device devices
|
||||
List of devices attached
|
||||
somedevice-1234 device
|
||||
someotherdevice-1234 device
|
||||
```
|
||||
|
||||
```bash
|
||||
$ adb -s somedevice-1234 root
|
||||
```
|
||||
|
||||
### Logcat
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`adb logcat` | 将日志消息打印到标准输出
|
||||
`adb logcat -g` | 显示当前日志缓冲区大小
|
||||
`adb logcat -G <size>` | 设置缓冲区大小(K 或 M)
|
||||
`adb logcat -c` | 清除日志缓冲区
|
||||
`adb logcat *:V` | 启用所有日志消息(详细)
|
||||
`adb logcat -f <filename>` | 将日志转储到指定文件
|
||||
<!--rehype:className=left-align code-nowrap-->
|
||||
|
||||
#### 示例
|
||||
|
||||
```bash
|
||||
$ adb logcat -G 16M
|
||||
$ adb logcat *:V > output.log
|
||||
```
|
||||
|
||||
#### 过滤日志输出
|
||||
|
||||
- `V` 最详细的信息(最低优先级)
|
||||
- `D` 调试信息
|
||||
- `I` 普通信息
|
||||
- `W` 警告信息
|
||||
- `E` 错误信息
|
||||
- `F` 致命错误信息
|
||||
- `S` 静默(最高优先级)
|
||||
<!--rehype:className=cols-2 shortcuts style-none-->
|
||||
|
||||
例如,要显示优先级不低于 `警告` 的所有标记的所有日志消息,可以使用以下命令:
|
||||
|
||||
```bash
|
||||
$ adb logcat *:W
|
||||
```
|
||||
|
||||
### 文件管理
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`adb push <local> <remote>` | 将本地文件复制到远程设备
|
||||
`adb pull <remote> <local>` | 将远程设备文件复制到本地
|
||||
<!--rehype:className=left-align code-nowrap-->
|
||||
|
||||
#### 示例
|
||||
|
||||
```bash
|
||||
$ echo "This is a test" > test.txt
|
||||
$ adb push test.txt /sdcard/test.txt
|
||||
$ adb pull /sdcard/test.txt pulledTest.txt
|
||||
```
|
||||
|
||||
### 远程 Shell
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`adb shell <command>` | 在设备上运行指定的命令(大多数 Unix 命令在这里工作)
|
||||
`adb shell wm size` | 显示当前屏幕分辨率
|
||||
`adb shell wm size WxH` | 将分辨率设置为 WxH
|
||||
`adb shell pm list packages` | 列出所有已安装的应用包
|
||||
`adb shell pm list packages -3` | 列出所有已安装的第三方的应用包
|
||||
`adb shell monkey -p app.package.name` | 启动指定包名的应用程序
|
||||
<!--rehype:className=style-list-arrow-->
|
||||
|
||||
### 包安装
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`adb shell install <apk>` | 安装应用程序
|
||||
`adb shell install <path>` | 从手机路径安装应用
|
||||
`adb shell install -r <path>` | 从手机路径安装应用(允许覆盖安装)
|
||||
`adb shell uninstall <name>` | 卸载应用程序
|
||||
<!--rehype:className=left-align code-nowrap-->
|
||||
|
||||
### Paths
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`/data/data/<package>/databases` | 应用程序数据库
|
||||
`/data/data/<package>/shared_prefs/` | 共享偏好设置
|
||||
`/data/app` | 用户安装的 APK
|
||||
`/system/app` | 系统预装的 APK 文件
|
||||
`/mnt/asec` | 加密的应用程序(App2SD)
|
||||
`/mnt/emmc` | 内部 SD 卡
|
||||
`/mnt/sdcard` | 外部/内部 SD 卡
|
||||
`/mnt/sdcard/external_sd` | 外置 SD 卡
|
||||
<!--rehype:className=style-list-arrow-->
|
||||
|
||||
---
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`adb shell ls` | 列出目录内容
|
||||
`adb shell ls -s` | 每个文件的打印尺寸
|
||||
`adb shell ls -R` | 递归列出子目录
|
||||
<!--rehype:className=left-align code-nowrap-->
|
||||
|
||||
### 手机信息
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`adb get-statе` | 打印设备状态
|
||||
`adb get-serialno` | 获取设备的序列号
|
||||
`adb shell dumpsys iphonesybinfo` | 获取设备的 IMEI 信息
|
||||
`adb shell netstat` | 列出设备上的所有 TCP 连接
|
||||
`adb shell pwd` | 打印当前工作目录
|
||||
`adb shell dumpsys battery` | 获取设备电池状态
|
||||
`adb shell pm list features` |列出设备支持的所有功能
|
||||
`adb shell service list` | 列出设备上运行的所有服务
|
||||
`adb shell dumpsys activity <package>/<activity>` | 获取指定包和活动的信息
|
||||
`adb shell ps` | 打印设备上所有运行的进程状态
|
||||
`adb shell wm size` | 显示当前设备的屏幕分辨率
|
||||
`dumpsys window windows` \| `grep -E 'mCurrentFocus\|mFocusedApp'` | 打印当前应用程序的打开活动的信息
|
||||
<!--rehype:className=style-list-arrow-->
|
||||
|
||||
### 包信息
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`adb shell list packages` | 列出包名称
|
||||
`adb shell list packages -r` | 列出包名 + apks 的路径
|
||||
`adb shell list packages -3` | 列出第三方包名称
|
||||
`adb shell list packages -s` | 仅列出系统包
|
||||
`adb shell list packages -u` | 列出包名称 + 已卸载
|
||||
`adb shell dumpsys package packages` | 列出所有应用程序的信息
|
||||
`adb shell dump <name>` | 列出一个包的信息
|
||||
`adb shell path <package>` | 列出 APK 文件的路径
|
||||
<!--rehype:className=style-list-arrow-->
|
||||
|
||||
### 设备相关命令
|
||||
<!--rehype:wrap-class=col-span-2 row-span-2-->
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`adb reboot recovery` | 重启设备进入恢复模式
|
||||
`adb reboot fastboot` | 重启设备进入恢复模式
|
||||
`adb shell screencap -p "/path/to/screenshot.png"` | 截图
|
||||
`adb shell screenrecord "/path/to/record.mp4"` | 录制设备屏幕
|
||||
`adb backup -apk -all -f backup.ab` | 备份设置和应用程序
|
||||
`adb backup -apk -shared -all -f backup.ab` | 备份设置、应用程序和共享存储
|
||||
`adb backup -apk -nosystem -all -f backup.ab` | 仅备份非系统应用程序
|
||||
`adb restore backup.ab` | 恢复以前的备份
|
||||
`adb shell am start -a android.intent.action.VIEW -d URL` | 打开网址
|
||||
`adb shell am start -t image/* -a android.intent.action.VIEW` | 打开画廊
|
||||
<!--rehype:className=code-nowrap left-align-->
|
||||
|
||||
### 权限
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`adb shell permissions groups` | 列出所有已定义的权限组
|
||||
`adb shell list permissions -g -r` | 列出了所有权限的详细信息
|
||||
<!--rehype:className=style-list-arrow-->
|
||||
|
||||
### Logs
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`adb logcat [options] [filter] [filter]` | 查看设备日志
|
||||
`adb bugreport` | 打印错误报告
|
||||
<!--rehype:className=style-list-arrow-->
|
||||
|
||||
常见的 ADB 命令
|
||||
---
|
||||
|
||||
### 将文件推送到 Android 设备的下载文件夹
|
||||
|
||||
```bash
|
||||
$ adb push example.apk /sdcard/Download/
|
||||
```
|
||||
|
||||
### 列出所有已安装的包并获取完整路径
|
||||
|
||||
```bash
|
||||
$ adb shell pm list packages -f
|
||||
```
|
||||
|
||||
### 从安卓设备中提取文件
|
||||
|
||||
```bash
|
||||
$ adb pull /sdcard/Download/example.apk
|
||||
```
|
||||
|
||||
### 从主机安装 APK 到 Android 设备
|
||||
|
||||
```bash
|
||||
$ adb shell install example.apk
|
||||
```
|
||||
|
||||
### 从 Android 设备存储安装 APK
|
||||
|
||||
```bash
|
||||
$ adb shell install /sdcard/Download/example.apk
|
||||
```
|
||||
|
||||
### 设置网络代理
|
||||
|
||||
```bash
|
||||
$ adb shell settings put global http_proxy <address>:<port>
|
||||
```
|
||||
|
||||
### 禁用网络代理
|
||||
|
||||
```bash
|
||||
$ adb shell settings put global http_proxy :0
|
||||
```
|
||||
|
||||
### 显示连接的设备并指定一个设备进行 Shell
|
||||
|
||||
```bash
|
||||
$ adb devices
|
||||
$ adb -s 7f1c864e shell
|
||||
```
|
||||
|
||||
`7f1c864e` 是设备 `ID`
|
||||
|
||||
### 通过 IP 地址连接到设备
|
||||
|
||||
```bash
|
||||
$ adb connect 192.168.56.101:5555
|
||||
```
|
||||
|
||||
### 通过 Wi-Fi 连接 ADB
|
||||
<!--rehype:wrap-class=row-span-5-->
|
||||
|
||||
我们可以通过 `Wi-Fi` 或专门使用 `tcp` 连接使用 `adb`。 要通过 `Wi-Fi` 使用 `adb`,首先通过 `USB` 连接手机并启用 `USB` 调试。然后列出所有设备:
|
||||
|
||||
```bash
|
||||
$ adb devices
|
||||
# 这应该给出这样的输出:
|
||||
# device_id device
|
||||
```
|
||||
|
||||
现在检查 `Android` 设备的 `IP`:
|
||||
|
||||
```bash
|
||||
$ adb shell ifconfig
|
||||
# 输出:
|
||||
|
||||
wlan0 Link encap:UNSPEC Driver icnss
|
||||
inet addr:XXX.XXX.X.XX Bcast:XXX.XXX.X.XXX
|
||||
```
|
||||
|
||||
记下 `inet addr` 后的 `IP` 地址。稍后要用。现在在某个端口重新启动 `tcpip`:
|
||||
|
||||
```bash
|
||||
$ adb tcpip $port
|
||||
```
|
||||
|
||||
例如 5555:
|
||||
|
||||
```bash
|
||||
$ adb tcpip 5555
|
||||
```
|
||||
|
||||
您现在可以断开 USB 线缆使用。 若要连接到设备请键入以下命令:
|
||||
|
||||
```bash
|
||||
$ adb connect $ip:$port
|
||||
```
|
||||
|
||||
例如:
|
||||
|
||||
```bash
|
||||
$ adb connect 192.168.1.4:5555
|
||||
```
|
||||
|
||||
### 将计算机上的 APK 文件安装到设备
|
||||
|
||||
```bash
|
||||
$ adb install /Users/dev/projects/myapp.apk
|
||||
```
|
||||
|
||||
### 查找应用的 APK 路径
|
||||
|
||||
```bash
|
||||
$ adb shell pm path com.example.myapp
|
||||
```
|
||||
|
||||
将 `com.example.myapp` 替换为您自己的应用程序包名称
|
||||
|
||||
### 通过名称查找应用的包名
|
||||
|
||||
```bash
|
||||
$ adb shell pm list package | grep app_name
|
||||
```
|
||||
|
||||
### 从设备提取 APK 到您的计算机
|
||||
|
||||
```bash
|
||||
$ adb pull /data/app/com.example.myapp.apk ./
|
||||
```
|
||||
|
||||
### 将文件从计算机复制到设备
|
||||
|
||||
```bash
|
||||
$ adb push path/to/local/file /sdcard/foo.txt
|
||||
```
|
||||
|
||||
### 滚动屏幕
|
||||
|
||||
```bash
|
||||
$ adb shell input swipe 300 300 500 1000 # 上
|
||||
$ adb shell input swipe 500 1000 300 300 # 下
|
||||
```
|
||||
|
||||
### 发文本
|
||||
|
||||
使用虚拟键盘发送文本:
|
||||
|
||||
```bash
|
||||
$ adb shell input text "Hello World"
|
||||
```
|
||||
|
||||
### 发送按键事件
|
||||
|
||||
```bash
|
||||
$ adb shell input keyevent 66
|
||||
# 66 是回车键码
|
||||
```
|
||||
|
||||
### 发送点击
|
||||
|
||||
点击屏幕:
|
||||
|
||||
```bash
|
||||
$ adb shell input tap x y
|
||||
```
|
||||
|
||||
### 查看包的日志
|
||||
|
||||
```bash
|
||||
$ adb shell 'logcat --pid=$(pidof -s <package_name>)'
|
||||
```
|
||||
|
||||
查看特定包的日志
|
354
docs/adobe-lightroom.md
Normal file
@ -0,0 +1,354 @@
|
||||
Adobe Lightroom 键盘快捷键
|
||||
===
|
||||
|
||||
Adobe Lightroom CC 中 251 个键盘快捷键的可视化备忘单
|
||||
|
||||
键盘快捷键
|
||||
--------
|
||||
|
||||
### 使用面板
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Tab` | 显示/隐藏侧面板
|
||||
`Shift` `Tab` | 显示/隐藏所有面板
|
||||
`T` | 显示/隐藏工具栏
|
||||
`F5` | 显示/隐藏模块选择器
|
||||
`F6` | 显示/隐藏胶片
|
||||
`F7` | 显示/隐藏左侧面板
|
||||
`F8` | 显示/隐藏右侧面板
|
||||
`Alt` `(click a panel)` | 切换独奏模式
|
||||
`Shift` `(click a panel)` | 在不关闭单独面板的情况下打开一个新面板
|
||||
`Ctrl` `(click a panel)` | 打开/关闭所有面板
|
||||
`Ctrl` `Shift` `0-5` | 打开/关闭左侧面板,从上到下
|
||||
`Ctrl` `0-9` | 打开/关闭右侧面板、库和开发模块,从上到下
|
||||
`Ctrl` `1-7` | 从上到下打开/关闭右面板、幻灯片、打印和 Web 模块
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 导航模块
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Alt` `1` | 转到库模块
|
||||
`Ctrl` `Alt` `2` | 转到开发模块
|
||||
`Ctrl` `Alt` `3` | 转到幻灯片模块
|
||||
`Ctrl` `Alt` `4` | 转到打印模块
|
||||
`Ctrl` `Alt` `5` | 转到网络模块
|
||||
`Ctrl` `Alt` `Left/Right` | 返回/前进
|
||||
`Ctrl` `Alt` `Up` | 返回上一个模块
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用辅助窗口
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`F11` | 打开辅助窗口
|
||||
`Shift` `G` | 进入网格视图
|
||||
`Shift` `E` | 进入正常的放大镜视图
|
||||
`Ctrl` `Shift` `Enter` | 进入锁定的放大镜视图
|
||||
`Shift` `C` | 进入比较视图
|
||||
`Shift` `N` | 进入调查视图
|
||||
`Ctrl` `Alt` `Shift` `Enter` | 进入幻灯片视图
|
||||
`Shift` `F11` | 进入全屏模式(需要第二台显示器)
|
||||
`Shift` `\` | 显示/隐藏过滤栏
|
||||
`Ctrl` `Shift` `+/-` | 放大/缩小
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 在开发模块中工作
|
||||
<!--rehype:wrap-class=row-span-5-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`V` | 转换为灰度
|
||||
`Ctrl` `U` | 自动音调
|
||||
`Ctrl` `Shift` `U` | 自动白平衡
|
||||
`Ctrl` `E` | 在 Photoshop 中编辑
|
||||
`Ctrl` `Shift` `C/V` | 复制/粘贴开发设置
|
||||
`Ctrl` `Alt` `V` | 粘贴上一张照片的设置
|
||||
`Ctrl` `Alt` `Shift` `Left` | 将之后的设置复制到之前
|
||||
`Ctrl` `Alt` `Shift` `Right` | 将之前的设置复制到之后
|
||||
`Ctrl` `Alt` `Shift` `Up` | 交换前后设置
|
||||
`Up/Down` | 以小增量增加/减少选定的滑块
|
||||
`Shift` `Up/Down` | 以较大的增量增加/减少选定的滑块
|
||||
`./,` | 循环浏览基本面板设置(向前/向后)
|
||||
`(double-click slider name)` | 重置滑块
|
||||
`Alt` `(click group name)` | 重置一组滑块
|
||||
`Ctrl` `Shift` `R` | 重置所有设置
|
||||
`Ctrl` `Shift` `S` | 同步设置
|
||||
`Ctrl` `Alt` `S` | 绕过同步设置对话框同步设置
|
||||
`Ctrl` `(click Sync button)` | 切换自动同步
|
||||
`Ctrl` `Alt` `Shift` `A` | 启用自动同步
|
||||
`Ctrl` `Alt` `Shift` `M` | 匹配总曝光量
|
||||
`W` | 选择白平衡工具(来自任何模块)
|
||||
`R` | 选择裁剪工具(来自任何模块)
|
||||
`A` | 选择裁剪工具时限制纵横比
|
||||
`Shift` `A` | 裁剪为与上一次裁剪相同的纵横比
|
||||
`Alt` `(drag)` | 从照片中心裁剪
|
||||
`O` | 循环作物网格覆盖
|
||||
`Shift` `O` | 循环裁剪网格叠加方向
|
||||
`X` | 在纵向和横向之间切换裁剪
|
||||
`Ctrl` `Alt` `R` | 重置作物
|
||||
`Shift` `T` | 选择 Guided Upright 工具
|
||||
`Q` | 选择 Sopt 删除工具
|
||||
`Shift` `T` | 选择污点去除工具时在克隆和修复模式之间切换笔刷
|
||||
`K` | 选择调整画笔工具(来自任何模块)
|
||||
`M` | 选择渐变滤镜工具
|
||||
`Shift` `T` | 选择渐变/径向滤镜时在编辑和画笔模式之间切换蒙版
|
||||
`]/[` | 增大/减小画笔大小
|
||||
`Shift` `]/[` | 增加/减少笔刷羽化
|
||||
`/` | 在局部调整刷A和B之间切换
|
||||
`Alt` `(drag)` | 暂时从画笔 A 或 B 切换到橡皮擦
|
||||
`Shift` `(drag)` | 绘制水平线或垂直线
|
||||
`H` | 显示/隐藏局部调整引脚
|
||||
`O` | 显示/隐藏局部调整蒙版覆盖
|
||||
`Shift` `O` | 循环局部调整蒙版叠加颜色
|
||||
`Ctrl` `Alt` `Shift` `T` | 选择目标调整工具以应用色调曲线调整
|
||||
`Ctrl` `Alt` `Shift` `H` | 选择目标调整工具以应用色相调整
|
||||
`Ctrl` `Alt` `Shift` `S` | 选择目标调整工具以应用饱和度调整
|
||||
`Ctrl` `Alt` `Shift` `L` | 选择目标调整工具以应用亮度调整
|
||||
`Ctrl` `Alt` `Shift` `G` | 选择目标调整工具以应用灰度混合调整
|
||||
`Ctrl` `Alt` `Shift` `N` | 取消选择目标调整工具
|
||||
`J` | 显示剪辑
|
||||
`Ctrl` `]` | 向右旋转照片(顺时针)
|
||||
`Ctrl` `[` | 向左旋转照片(逆时针)
|
||||
`Space/Z` | 在放大镜和 1:1 缩放预览之间切换
|
||||
`Ctrl` `+/-` | 放大/缩小
|
||||
`Ctrl` `Enter` | 播放即兴幻灯片
|
||||
`Y` | 查看左/右之前和之后
|
||||
`Alt` `Y` | 查看顶部/底部之前和之后
|
||||
`Shift` `Y` | 在分屏中查看之前和之后
|
||||
`\` | 仅查看之前
|
||||
`Ctrl` `N` | 创建新快照
|
||||
`Ctrl` `Shift` `N` | 创建新预设
|
||||
`Ctrl` `Alt` `N` | 创建一个新的预设文件夹
|
||||
`Ctrl` `J` | 打开开发视图选项
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 更改视图和屏幕模式
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`E` | 进入图书馆放大镜视图
|
||||
`G` | 进入库网格视图
|
||||
`C` | 进入图书馆比较视图
|
||||
`N` | 进入图书馆调查视图
|
||||
`D` | 在修改照片模块中打开选定的照片
|
||||
`L` | 通过 Lights Out 模式向前循环
|
||||
`Shift` `L` | 通过 Lights Out 模式向后循环
|
||||
`Ctrl` `Shift` `L` | 切换灯光昏暗模式
|
||||
`F` | 循环屏幕模式
|
||||
`Ctrl` `Shift` `F` | 在普通和全屏之间切换,隐藏面板
|
||||
`Ctrl` `Alt` `F` | 进入普通屏幕模式
|
||||
`I` | 循环信息叠加
|
||||
`Ctrl` `I` | 显示/隐藏信息覆盖
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 管理照片和目录
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Shift` `I` | 从磁盘导入照片
|
||||
`Ctrl` `O` | 打开目录
|
||||
`Ctrl` `,` | 打开首选项
|
||||
`Ctrl` `Alt` `,` | 打开目录设置
|
||||
`Ctrl` `Shift` `T` | 创建新的子文件夹(分段联机捕获)
|
||||
`Ctrl` `T` | 隐藏/显示系绳捕获栏
|
||||
`Ctrl` `Shift` `N` | 在库模块中创建一个新文件夹
|
||||
`Ctrl` `'` | 创建虚拟副本(仅限库和开发模块)
|
||||
`Ctrl` `R` | 在资源管理器/Finder 中显示(仅限库和开发模块)
|
||||
`Right/Left` | 转到胶片中的下一张/上一张照片
|
||||
`Shift/Ctrl` `Click` | 选择多个文件夹或集合(在库、幻灯片、打印和 Web 模块中)
|
||||
`F2` | 重命名照片(在图库模块中)
|
||||
`Delete` | 删除所选照片
|
||||
`Alt` `Backspace` | 从目录中删除所选照片
|
||||
`Ctrl` `Alt` `Shift` `Backspace` | 删除所选照片并移至废纸篓
|
||||
`Ctrl` `Backspace` | 删除被拒绝的照片
|
||||
`Ctrl` `E` | 在 Photoshop 中编辑
|
||||
`Ctrl` `Alt` `E` | 在其他编辑器中打开
|
||||
`Ctrl` `Shift` `E` | 导出所选照片
|
||||
`Ctrl` `Alt` `Shift` `E` | 使用以前的设置导出
|
||||
`Ctrl` `Alt` `Shift` `,` | 打开插件管理器
|
||||
`Ctrl` `P` | 打印所选照片
|
||||
`Ctrl` `Shift` `P` | 打开页面设置对话框
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 比较图库模块中的照片
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`E/Enter` | 切换到放大视图
|
||||
`G/Esc` | 切换到网格视图
|
||||
`C` | 切换到比较视图
|
||||
`N` | 切换到调查视图
|
||||
`Space/E` | 从网格切换到放大视图
|
||||
`Down` | 在比较视图中交换选择和候选照片
|
||||
`Up` | 在比较视图中选择下一张照片和候选照片
|
||||
`Z` | 切换缩放视图
|
||||
`Ctrl` `+/-` | 在放大镜视图中放大/缩小
|
||||
`PgUp/PgDown` | 在放大视图中向上/向下滚动放大的照片
|
||||
`Home/End` | 转到网格视图的开头/结尾
|
||||
`Ctrl` `Enter` | 播放即兴幻灯片
|
||||
`Ctrl` `]` | 向右旋转照片(顺时针)
|
||||
`Ctrl` `[` | 向左旋转照片(逆时针)
|
||||
`=/-` | 增加/减少网格缩略图大小
|
||||
`PgUp/PgDown` | 向上/向下滚动网格缩略图
|
||||
`Ctrl` `Shift` `H` | 切换单元格附加功能
|
||||
`Ctrl` `Alt` `Shift` `H` | 显示/隐藏徽章
|
||||
`J` | 循环网格视图
|
||||
`Ctrl` `J` | 打开库视图选项
|
||||
`Ctrl` `(click)` | 选择多张离散照片
|
||||
`Shift` `(click)` | 选择多张连续照片
|
||||
`Ctrl` `A` | 选择所有照片
|
||||
`Ctrl` `D` | 取消选择所有照片
|
||||
`Ctrl` `Shift` `D` | 仅选择活动照片
|
||||
`/` | 取消选择现用照片
|
||||
`Shift` `Left/Right` | 将上一张/下一张照片添加到选择
|
||||
`Ctrl` `Alt` `A` | 选择标记的照片
|
||||
`Ctrl` `Alt` `Shift` `D` | 取消选择未标记的照片
|
||||
`Ctrl` `G` | 分组入栈
|
||||
`Ctrl` `Shift` `G` | 拆叠
|
||||
`S` | 切换堆栈
|
||||
`Shift` `S` | 移动到堆栈顶部
|
||||
`Shift` `[` | 在堆栈中向上移动
|
||||
`Shift` `]` | 在堆栈中向下移动
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 评级和过滤照片
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`1-5` | 设置星级
|
||||
`Shift` `1-5` | 设置星级并转到下一张照片
|
||||
`0` | 删除星级
|
||||
`Shift` `0` | 删除星级并转到下一张照片
|
||||
`]/[` | 将评分提高/降低一颗星
|
||||
`6` | 分配一个红色标签
|
||||
`7` | 分配黄色标签
|
||||
`8` | 分配一个绿色标签
|
||||
`9` | 分配一个蓝色标签
|
||||
`Shift` `6-9` | 分配颜色标签并转到下一张照片
|
||||
`P` | 将照片标记为精选
|
||||
`Shift` `P` | 将照片标记为精选并转到下一张照片
|
||||
`X` | 将照片标记为拒绝
|
||||
`Shift` `X` | 将照片标记为拒绝并转到下一张照片
|
||||
`U` | 取消标记照片
|
||||
`Shift` `U` | 取消标记照片并转到下一张照片
|
||||
`Ctrl` `Up/Down` | 增加/减少标志状态
|
||||
<code>\`</code> | 循环标志设置
|
||||
`Ctrl` `Alt` `R` | 优化照片
|
||||
`\` | 显示/隐藏库过滤器栏
|
||||
`Shift` `(click filter labels)` | 在过滤器栏中打开多个过滤器
|
||||
`Shift` `L` | 打开/关闭过滤器
|
||||
`Ctrl` `F` | 在图库模块中查找照片
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用集合
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `N` | 在 Library 模块中创建一个新的集合
|
||||
`B` | 添加到快速收藏
|
||||
`Shift` `B` | 添加到快速收藏并转到下一张照片
|
||||
`Ctrl` `B` | 显示快速收藏
|
||||
`Ctrl` `Alt` `B` | 保存快速收藏
|
||||
`Ctrl` `Shift` `B` | 清除快速收藏
|
||||
`Ctrl` `Alt` `Shift` `B` | 设为目标集合
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 在库模块中使用元数据和关键字
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `K` | 添加关键字
|
||||
`Ctrl` `Shift` `K` | 修改关键字
|
||||
`Ctrl` `Alt` `Shift` `K` | 设置关键字快捷方式
|
||||
`Shift` `K` | 从所选照片中添加/删除关键字快捷方式
|
||||
`Ctrl` `Alt` `K` | 启用绘画
|
||||
`Alt` `1-9` | 将关键字集中的关键字添加到所选照片
|
||||
`Alt` `0` | 通过关键字集向前循环
|
||||
`Alt` `Shift` `0` | 通过关键字集循环反向词
|
||||
`Ctrl` `Alt` `Shift` `C/V` | 复制/粘贴元数据
|
||||
`Ctrl` `S` | 将元数据保存到文件
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 在幻灯片模块中工作
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Enter` | 播放幻灯片
|
||||
`Ctrl` `Enter` | 播放即兴幻灯片
|
||||
`Space` | 暂停幻灯片放映
|
||||
`Alt` `Enter` | 预览幻灯片
|
||||
`Esc` | 结束幻灯片放映
|
||||
`Right` | 转到下一张幻灯片
|
||||
`Left` | 转到上一张幻灯片
|
||||
`Ctrl` `]` | 向右旋转照片(顺时针)
|
||||
`Ctrl` `[` | 向左旋转照片(逆时针)
|
||||
`Ctrl` `Shift` `H` | 显示/隐藏指南
|
||||
`Ctrl` `J` | 导出 PDF 幻灯片放映
|
||||
`Ctrl` `Shift` `J` | 导出 JPEG 幻灯片放映
|
||||
`Ctrl` `Alt` `J` | 导出视频幻灯片
|
||||
`Ctrl` `N` | 创建新的幻灯片放映模板
|
||||
`Ctrl` `Shift` `N` | 创建新的幻灯片放映模板文件夹
|
||||
`Ctrl` `S` | 保存幻灯片放映设置
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 在打印模块中工作
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `P` | 打印
|
||||
`Ctrl` `Alt` `P` | 打印一份
|
||||
`Ctrl` `Shift` `P` | 打开页面设置对话框
|
||||
`Ctrl` `Alt` `Shift` `P` | 打开打印设置对话框
|
||||
`Ctrl` `Shift` `Left` | 转到第一页
|
||||
`Ctrl` `Shift` `Right` | 转到最后一页
|
||||
`Ctrl` `Left` | 转到上一页
|
||||
`Ctrl` `Right` | 转到下一页
|
||||
`Ctrl` `Shift` `H` | 显示/隐藏指南
|
||||
`Ctrl` `R` | 显示/隐藏标尺
|
||||
`Ctrl` `Shift` `J` | 显示/隐藏页面出血
|
||||
`Ctrl` `Shift` `M` | 显示/隐藏边距和装订线
|
||||
`Ctrl` `Shift` `K` | 显示/隐藏图像单元格
|
||||
`Ctrl` `Shift` `U` | 显示/隐藏尺寸
|
||||
`Ctrl` `Enter` | 播放即兴幻灯片
|
||||
`Ctrl` `]` | 向右旋转照片(顺时针)
|
||||
`Ctrl` `[` | 向左旋转照片(逆时针)
|
||||
`Ctrl` `N` | 创建一个新的打印模板
|
||||
`Ctrl` `Shift` `N` | 创建一个新的打印模板文件夹
|
||||
`Ctrl` `S` | 保存打印设置
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 在 Web 模块中工作
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `R` | 重新加载网络画廊
|
||||
`Ctrl` `Alt` `P` | 在浏览器中预览
|
||||
`Ctrl` `Enter` | 播放即兴幻灯片
|
||||
`Ctrl` `J` | 导出网络画廊
|
||||
`Ctrl` `N` | 创建新的 Web 画廊模板
|
||||
`Ctrl` `Shift` `N` | 创建新的 Web 画廊模板文件夹
|
||||
`Ctrl` `S` | 保存 Web 画廊设置
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用帮助
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `/` | 显示当前模块快捷方式
|
||||
`(click)` | 隐藏当前模块快捷方式
|
||||
`Ctrl` `Alt` `/` | 转到当前模块帮助
|
||||
`F1` | 打开社区帮助
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
另见
|
||||
--------
|
||||
|
||||
- [Keyboard shortcuts for Adobe Lightroom CC](https://helpx.adobe.com/lightroom/help/keyboard-shortcuts.html) _(helpx.adobe.com)_
|
433
docs/adobe-photoshop.md
Normal file
@ -0,0 +1,433 @@
|
||||
Adobe Photoshop 键盘快捷键 备忘清单
|
||||
===
|
||||
|
||||
Adobe Photoshop 中 283 个[键盘快捷键](https://helpx.adobe.com/photoshop/using/default-keyboard-shortcuts.html)的可视化备忘单
|
||||
|
||||
键盘快捷键
|
||||
---------
|
||||
|
||||
### 热门快捷方式
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `T` | 自由变换
|
||||
`[` | 减小画笔大小
|
||||
`]` | 增加画笔大小
|
||||
`Shift` `[` | 降低画笔硬度
|
||||
`Shift` `]` | 增加笔刷硬度
|
||||
`D` | 默认前景/背景颜色
|
||||
`X` | 切换前景/背景颜色
|
||||
`Ctrl` `J` | 通过复制新建图层
|
||||
`Ctrl` `Shift` `J` | 通过剪切新建图层
|
||||
`Esc` | 取消任何模态对话框窗口(包括启动工作区)
|
||||
`Enter` | 选择工具栏的第一个编辑字段
|
||||
`Tab` | 在字段之间导航
|
||||
`Shift` `Tab` | 在相反方向的字段之间导航
|
||||
`Alt` | 更改取消重置
|
||||
`Ctrl` `F` | 调用搜索体验
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用功能键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`F1` | 开始帮助
|
||||
`F2` | 剪切
|
||||
`F3` | 复制
|
||||
`F4` | 粘贴
|
||||
`F5` | 显示/隐藏笔刷面板
|
||||
`F6` | 显示/隐藏颜色面板
|
||||
`F7` | 显示/隐藏图层面板
|
||||
`F8` | 显示/隐藏信息面板
|
||||
`F9` | 显示/隐藏操作面板
|
||||
`F12` | 恢复
|
||||
`Shift` `F5` | 充满
|
||||
`Shift` `F6` | 羽毛选择
|
||||
`Shift` `F7` | 反向选择
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 选择工具
|
||||
<!--rehype:wrap-class=row-span-3-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`V` | 移动工具
|
||||
`M` | 矩形选框工具
|
||||
`L` | 套索工具
|
||||
`W` | 魔棒工具 > 快速选择工具
|
||||
`C` | 裁剪工具 > 切片工具 > 切片选择工具
|
||||
`I` | 吸管工具 > 标尺工具 > 注释工具
|
||||
`J` | 斑点修复笔刷工具 > 修复笔刷工具 > 补丁工具 > 红眼工具
|
||||
`B` | 画笔工具 > 铅笔工具 > 颜色替换工具 > 混合器画笔工具
|
||||
`S` | 克隆图章工具 > 图案图章工具
|
||||
`Y` | 历史画笔工具 > 艺术史画笔工具
|
||||
`E` | 橡皮擦工具 > 背景橡皮擦工具 > 魔术橡皮擦工具
|
||||
`G` | 渐变工具>油漆桶工具
|
||||
`O` | 减淡工具 > 加深工具 > 海绵工具
|
||||
`P` | 钢笔工具 > 自由钢笔工具
|
||||
`T` | 横版工具 > 竖版工具 > 横版蒙版工具 > 竖版蒙版工具
|
||||
`A` | 路径选择工具 > 直接选择工具
|
||||
`U` | 矩形工具 > 圆角矩形工具 > 椭圆工具 > 多边形工具 > 直线工具
|
||||
`H` | 手工具
|
||||
`R` | 旋转视图工具
|
||||
`Z` | 缩放工具
|
||||
`D` | 默认前景/背景颜色
|
||||
`X` | 切换前景/背景颜色
|
||||
`Q` | 切换标准/快速蒙版模式
|
||||
`J` | 内容感知移动工具
|
||||
`C` | 透视裁剪工具
|
||||
`V` | 画板工具
|
||||
`R` | 旋转视图工具
|
||||
`/` | 切换保持透明度
|
||||
`,` | 上一刷
|
||||
`.` | 下一刷
|
||||
`Shift` `,` | 先刷
|
||||
`Shift` `.` | 最后刷
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 查看图片
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Tab` | 循环浏览打开的文档
|
||||
`Ctrl` `Shift` `Tab` | 切换到上一个文档
|
||||
`Ctrl` `Shift` `W` | 在 Photoshop 中关闭文件并打开 Bridge
|
||||
`F` | 在标准屏幕 > 带菜单栏的全屏 > 全屏模式之间向前切换
|
||||
`Shift` `F` | 在标准屏幕 > 带菜单栏的全屏 > 全屏模式之间向后切换
|
||||
`Space` `F` | 向前切换画布颜色
|
||||
`Shift` `Space` `F` | 向后切换画布颜色
|
||||
`Space` | 切换到手动工具(当不在文本编辑模式时)
|
||||
`Ctrl` `Space` | 切换到放大工具
|
||||
`Alt` `Space` | 切换到缩小工具
|
||||
`Shift` `Enter` | 应用缩放百分比,并保持缩放百分比框处于活动状态
|
||||
`PgUp/PgDn` | 向上或向下滚动 1 屏
|
||||
`Shift` `PgUp/PgDn` | 向上或向下滚动 10 个单位
|
||||
`Home` | 将视图移动到左上角
|
||||
`End` | 将视图移动到右下角
|
||||
`\` | 将图层蒙版打开/关闭为红宝石(必须选择图层蒙版)
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用木偶变形
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Esc` | 完全取消
|
||||
`Ctrl` `Z` | 撤消最后一次引脚调整
|
||||
`Ctrl` `A` | 选择所有引脚
|
||||
`Ctrl` `D` | 取消选择所有引脚
|
||||
`H` | 暂时隐藏图钉
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用优化边缘
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Alt` `R` | 打开优化边缘对话框
|
||||
`F` | 通过预览模式向前循环
|
||||
`Shift` `F` | 通过预览模式向后循环
|
||||
`X` | 在原始图像和选区预览之间切换
|
||||
`P` | 在原始选择和优化版本之间切换
|
||||
`J` | 打开和关闭半径预览
|
||||
`Shift` `E` | 在 Refine Radius 和 Erase Refinement 工具之间切换
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用滤镜库
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Alt` `F` | 重新应用上次使用的过滤器
|
||||
`Ctrl` | 将取消按钮更改为默认值
|
||||
`Alt` | 将取消按钮更改为重置
|
||||
`Ctrl` `Z` | 撤销重做
|
||||
`Ctrl` `Shift` `Z` | 向前一步
|
||||
`Ctrl` `Alt` `Z` | 向后退一步
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用液化滤镜
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`W` | 向前扭曲工具
|
||||
`R` | 重构工具
|
||||
`C` | 顺时针旋转工具
|
||||
`S` | 皱褶工具
|
||||
`B` | 膨胀工具
|
||||
`O` | 向左推工具
|
||||
`M` | 镜像工具
|
||||
`T` | 湍流工具
|
||||
`F` | 冻结蒙版工具
|
||||
`D` | 解冻蒙版工具
|
||||
`Alt` `(tool)` | 反转膨胀、褶皱、向左推和镜像工具的方向
|
||||
`Tab` | 从右上角循环浏览控件
|
||||
`Shift` `Tab` | 从右下角循环浏览控件
|
||||
`Alt` | 更改取消重置
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用消失点
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`X` | 缩放 2 倍(临时)
|
||||
`Ctrl` `+` | 放大
|
||||
`Ctrl` `-` | 缩小
|
||||
`Ctrl` `0` | 适合视图
|
||||
`Ctrl` `Z` | 撤消上次操作
|
||||
`Ctrl` `Shift` `Z` | 重做上一个动作
|
||||
`Ctrl` `D` | 取消全选
|
||||
`Ctrl` `H` | 隐藏选择和窗格
|
||||
`Arrows` | 将选区移动 1 个像素
|
||||
`Shift` `Arrows` | 将选区移动 10 个像素
|
||||
`Ctrl` `C` | 复制
|
||||
`Ctrl` `V` | 粘贴
|
||||
`Ctrl` `Shift` `T` | 重复最后一个副本并移动
|
||||
`Ctrl` `Alt` `T` | 从当前选区创建浮动选区
|
||||
`Alt` `Shift` | 将选择限制为 15 度旋转
|
||||
`Backspace` | 创建平面时删除最后一个节点
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用 Camera Raw 对话框
|
||||
<!--rehype:wrap-class=row-span-5-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Z` | 缩放工具
|
||||
`H` | 手工具
|
||||
`I` | 白平衡工具
|
||||
`S` | 颜色取样器工具
|
||||
`C` | 裁剪工具
|
||||
`A` | 拉直工具
|
||||
`B` | 污点去除工具
|
||||
`E` | 红眼消除工具
|
||||
`Ctrl` `Alt` `1` | 基本面板
|
||||
`Ctrl` `Alt` `2` | 色调曲线面板
|
||||
`Ctrl` `Alt` `3` | 详情面板
|
||||
`Ctrl` `Alt` `4` | HSL/灰度面板
|
||||
`Ctrl` `Alt` `5` | 分离调色板
|
||||
`Ctrl` `Alt` `6` | 镜头校正面板
|
||||
`Ctrl` `Alt` `7` | 相机校准面板
|
||||
`Ctrl` `Alt` `8` | 预设面板
|
||||
`Ctrl` `Alt` `9` | 打开快照面板
|
||||
`Ctrl` `Alt` `Shift` `T` | 参数化曲线针对性调整工具
|
||||
`Ctrl` `Alt` `Shift` `H` | 色相针对性调整工具
|
||||
`Ctrl` `Alt` `Shift` `S` | 饱和度针对性调整工具
|
||||
`Ctrl` `Alt` `Shift` `L` | 亮度针对性调整工具
|
||||
`Ctrl` `Alt` `Shift` `G` | 灰度混合针对性调整工具
|
||||
`T` | 最后使用的针对性调整工具
|
||||
`K` | 调整笔刷工具
|
||||
`G` | 分级过滤工具
|
||||
`Alt` | 暂时从调整画笔工具的添加模式切换到擦除模式,或从擦除模式切换到添加模式
|
||||
`Alt` `]/[` | 增加/减少临时调整画笔工具大小
|
||||
`Alt` `Shift` `]/[` | 增加/减少临时调整笔刷工具羽化
|
||||
`Alt` `=/-` | 以 10 为增量增加/减少临时调整画笔工具大小流
|
||||
`N` | 从调整画笔工具或渐变滤镜的添加或擦除模式切换到新建模式
|
||||
`M` | 为调整画笔工具切换自动蒙版
|
||||
`Y` | 切换调整画笔工具的显示蒙版
|
||||
`V` | 调整画笔工具的切换销
|
||||
`L` | 向左旋转图像
|
||||
`R` | 向右旋转图像
|
||||
`Ctrl` | 暂时切换到放大工具
|
||||
`Alt` | 暂时切换为缩小工具,图片打开按钮改为打开复制
|
||||
`P` | 切换预览
|
||||
`F` | 全屏模式
|
||||
`Shift` | 暂时激活白平衡工具并将打开图像按钮更改为打开对象
|
||||
`Arrows` | 将曲线面板中的选定点移动 1 个像素
|
||||
`Shift` `Arrows` | 将曲线面板中的选定点移动 10 像素
|
||||
`Ctrl` `R` | 从 Bridge 打开 Camera Raw 对话框中的选定图像
|
||||
`O` | 高亮剪裁警告
|
||||
`U` | 阴影剪切警告
|
||||
`Ctrl` `1-5` | 添加 1-5 星级(幻灯片模式)
|
||||
`Ctrl` `./,` | 增加/减少评分(幻灯片模式)
|
||||
`Ctrl` `6` | 添加红色标签(幻灯片模式)
|
||||
`Ctrl` `7` | 添加黄色标签(幻灯片模式)
|
||||
`Ctrl` `8` | 添加绿色标签(幻灯片模式)
|
||||
`Ctrl` `9` | 添加蓝色标签(幻灯片模式)
|
||||
`Ctrl` `Shift` `0` | 添加紫色标签(幻灯片模式)
|
||||
`Ctrl` `K` | Camera Raw 首选项
|
||||
`Ctrl` `Alt` | 删除 Adobe Camera Raw 首选项(打开时)
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用黑白对话框
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Shift` `Alt` `B` | 打开黑白对话框
|
||||
`Up/Down` | 将所选值增加/减少 1%
|
||||
`Shift` `Up/Down` | 将所选值增加/减少 10%
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 编辑路径
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` | 从路径选择、笔、添加锚点、删除锚点或将点工具转换为直接选择工具
|
||||
`Alt` | 当指针位于锚点或方向点上时,从钢笔工具切换到自由钢笔工具以转换点工具
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 变换选区、选区边框和路径
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Alt` | 从中心变换或反射
|
||||
`Shift` | 约束
|
||||
`Ctrl` | 歪曲
|
||||
`Enter` | 申请
|
||||
`Ctrl` `.` | 取消
|
||||
`Ctrl` `Alt` `T` | 具有重复数据的自由变换
|
||||
`Ctrl` `Shift` `Alt` `T` | 用重复数据再次转换
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用曲线
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `M` | 打开曲线对话框
|
||||
`+` | 选择曲线上的下一个点
|
||||
`-` | 选择曲线上的前一点
|
||||
`Ctrl` `D` | 取消选择一个点
|
||||
`Del` | 删除曲线上的一个点
|
||||
`Arrows` | 将所选点移动 1 个像素
|
||||
`Shift` `Arrows` | 将所选点移动 10 个像素
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 用于绘画
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Alt` `Shift` `0-9` | 混合器画笔更改混合设置
|
||||
`0-9` | 混合刷改变湿设置
|
||||
`00` | 搅拌刷变湿并混合至零
|
||||
`Shift` `+/-` | 循环混合模式
|
||||
`Backspace` | 在背景或标准图层上打开填充对话框
|
||||
`Alt` `Backspace` | 填充前景色
|
||||
`Ctrl` `Backspace` | 填充背景色
|
||||
`Ctrl` `Alt` `Backspace` | 从历史中填充
|
||||
`Shift` `Backspace` | 显示填充对话框
|
||||
`/` | 打开/关闭锁定透明像素
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 用于混合模式
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `-/+` | 循环混合模式
|
||||
`Shift` `Alt` `N` | 普通的
|
||||
`Shift` `Alt` `I` | 溶解
|
||||
`Shift` `Alt` `Q` | 背后(仅限画笔工具)
|
||||
`Shift` `Alt` `R` | 清除(仅限画笔工具)
|
||||
`Shift` `Alt` `K` | 变暗
|
||||
`Shift` `Alt` `M` | 乘
|
||||
`Shift` `Alt` `B` | 烧色
|
||||
`Shift` `Alt` `A` | 线性燃烧
|
||||
`Shift` `Alt` `G` | 减轻
|
||||
`Shift` `Alt` `S` | 屏幕
|
||||
`Shift` `Alt` `D` | 颜色减淡
|
||||
`Shift` `Alt` `W` | 直线闪避
|
||||
`Shift` `Alt` `O` | 覆盖
|
||||
`Shift` `Alt` `F` | 柔光
|
||||
`Shift` `Alt` `H` | 强光
|
||||
`Shift` `Alt` `V` | 鲜艳的光
|
||||
`Shift` `Alt` `J` | 线性光
|
||||
`Shift` `Alt` `Z` | 针灯
|
||||
`Shift` `Alt` `L` | 硬混
|
||||
`Shift` `Alt` `E` | 区别
|
||||
`Shift` `Alt` `X` | 排除
|
||||
`Shift` `Alt` `U` | 色调
|
||||
`Shift` `Alt` `T` | 饱和
|
||||
`Shift` `Alt` `C` | 颜色
|
||||
`Shift` `Alt` `Y` | 亮度
|
||||
`Shift` `Alt` `N` | 将位图图像的混合模式设置为阈值<br/>所有其他图像的混合模式设置为正常
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 格式类型
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Shift` `L/C/R` | 左对齐、居中或右对齐
|
||||
`Ctrl` `Shift` `X` | 选择 100% 水平比例
|
||||
`Ctrl` `Shift` `Alt` `X` | 选择 100% 垂直比例
|
||||
`Ctrl` `Shift` `Alt` `A` | 选择自动行进
|
||||
`Ctrl` `Shift` `Q` | 选择 0 进行跟踪
|
||||
`Ctrl` `Shift` `J` | 对齐段落,左对齐最后一行
|
||||
`Ctrl` `Shift` `F` | 证明段落,证明所有
|
||||
`Ctrl` `Shift` `Alt` `H` | 打开/关闭段落断字
|
||||
`Ctrl` `Shift` `Alt` `T` | 打开/关闭单个/每行作曲家
|
||||
`Ctrl` `Shift` `</>` | 将所选文本的字号减小或增大 2 磅或像素
|
||||
`Alt` `Up/Down` | 减少或增加前导 2 点或像素
|
||||
`Shift` `Alt` `Up/Down` | 减少或增加基线偏移 2 个点或像素
|
||||
`Alt` `Left/Right` | 减少或增加字距调整/字距调整 20/1000 em
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用面板
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Shift` `Enter` | 应用值并保持文本框处于活动状态
|
||||
`Tab` | 显示/隐藏所有面板
|
||||
`Shift` `Tab` | 显示/隐藏除工具箱和选项栏之外的所有面板
|
||||
`Enter` | 高亮选项栏(先选择工具)
|
||||
`Shift` `Up/Down` | 将所选值增加/减少 10
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用调整图层
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Alt` `3` | 选择红色通道进行调整
|
||||
`Alt` `4` | 选择绿色通道进行调整
|
||||
`Alt` `5` | 选择蓝色通道进行调整
|
||||
`Alt` `2` | 选择复合通道进行调整
|
||||
`Backspace` | 删除调整图层
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用画笔面板
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`,/.` | 选择上一个/下一个画笔大小
|
||||
`Shift` `,/.` | 选择第一个/最后一个画笔
|
||||
`Caps Lock` | 显示画笔的精确十字线
|
||||
`Shift` `Alt` `P` | 切换喷枪选项
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用克隆源面板
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Alt` `Shift` | 显示克隆源(覆盖 iamge)
|
||||
`Alt` `Shift` `(arrows)` | 轻推克隆源
|
||||
`Alt` `Shift` `</>` | 旋转克隆源
|
||||
`Alt` `Shift` `[/]` | 缩放(增加或减小大小)克隆源
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 使用图层面板
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Shift` `N` | 新层
|
||||
`Ctrl` `J` | 通过复制新建图层
|
||||
`Ctrl` `Shift` `J` | 通过剪切新建图层
|
||||
`Ctrl` `G` | 图层组
|
||||
`Ctrl` `Shift` `G` | 取消组合图层
|
||||
`Ctrl` `Alt` `G` | 创建/释放剪贴蒙版
|
||||
`Ctrl` `Alt` `A` | 选择所有图层
|
||||
`Ctrl` `Shift` `E` | 合并可见层
|
||||
`Alt` `.` | 选择顶层
|
||||
`Alt` `.` | 选择底层
|
||||
`Shift` `Alt` `[/]` | 添加到图层面板中的图层选择
|
||||
`Alt` `[/]` | 向下/向上选择下一层
|
||||
`Ctrl` `[/]` | 向下/向上移动目标图层
|
||||
`Ctrl` `Shift` `Alt` `E` | 将所有可见图层的副本合并到目标图层中
|
||||
`Ctrl` `E` | 合并图层(当图层突出显示时)
|
||||
`Ctrl` `Shift` `[/]` | 将层移动到底部或顶部
|
||||
`/` | 切换目标图层的锁定透明度或上次应用的锁定
|
||||
`\` | 打开/关闭图层蒙版的 rubylith 模式
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
另见
|
||||
--------
|
||||
|
||||
- [Keyboard shortcuts for Adobe Photoshop](https://helpx.adobe.com/photoshop/using/default-keyboard-shortcuts.html) _(helpx.adobe.com)_
|
194
docs/adobe-xd.md
Normal file
@ -0,0 +1,194 @@
|
||||
Adobe XD 键盘快捷键
|
||||
===
|
||||
|
||||
Adobe XD 中 97 个键盘快捷键的可视化备忘单
|
||||
|
||||
键盘快捷键
|
||||
--------
|
||||
|
||||
### 编辑菜单键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Z` | 撤消
|
||||
`Ctrl` `Shift` `Z` | 重做
|
||||
`Ctrl` `X` | 剪切
|
||||
`Ctrl` `C` | 复制
|
||||
`Ctrl` `V` | 粘贴
|
||||
`Ctrl` `Alt` `V` | 粘贴外观(设计模式)或粘贴交互(原型模式)
|
||||
`Ctrl` `D` | 复制
|
||||
`Del` | 删除
|
||||
`Ctrl` `A` | 全选
|
||||
`Ctrl` `Shift` `A` | 取消全选
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 文件菜单键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `N` | 新的
|
||||
`Ctrl` `Shift` `O` | 打开...
|
||||
`Alt` `F4` | 关闭
|
||||
`Ctrl` `S` | 节省...
|
||||
`Ctrl` `Shift` `S` | 另存为...
|
||||
`Ctrl` `Shift` `E` | 出口批量
|
||||
`Ctrl` `E` | 导出选择
|
||||
`Ctrl` `Shift` `I` | 进口
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 笔/路径键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`P` | 切换到钢笔工具
|
||||
`Alt` | 不对称控制点
|
||||
`Shift` | 捕捉控制点角度
|
||||
`Shift` | 捕捉锚点角度
|
||||
`Ctrl` `Alt` `U` | 添加
|
||||
`Ctrl` `Alt` `S` | 减去
|
||||
`Ctrl` `Alt` `I` | 相交
|
||||
`Ctrl` `Alt` `X` | 排除重叠
|
||||
`Ctrl` `8` | 转换为路径
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 图层(对象)、组和画板的键
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `G` | 图层组
|
||||
`Ctrl` `Shift` `G` | 取消组合图层
|
||||
`Ctrl` `K` | 制作组件
|
||||
`Ctrl` `L` | 锁定/解锁图层
|
||||
`Ctrl` `,` | 隐藏/显示图层
|
||||
`Ctrl` `Shift` `M` | 有形状的面具
|
||||
`Ctrl` `R` | 制作重复网格
|
||||
`1-9` | 更改图层不透明度
|
||||
`Ctrl` `;` | 显示/隐藏画板指南
|
||||
`Ctrl` `Shift` `;` | 锁定画板指南
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 对齐键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Shift` `Left` | 左边
|
||||
`Shift` `C` | 中心(水平)
|
||||
`Ctrl` `Shift` `Right` | 正确的
|
||||
`Ctrl` `Shift` `Up` | 顶部
|
||||
`Shift` `M` | 中间(垂直)
|
||||
`Ctrl` `Shift` `Down` | 底部
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 排列键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Shift` `]` | 置于最前面
|
||||
`Ctrl` `]` | 向前进
|
||||
`Ctrl` `[` | 向后发送
|
||||
`Ctrl` `Shift` `[` | 发送到后台
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 分发键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Shift` `H` | 水平的
|
||||
`Ctrl` `Shift` `V` | 竖的
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 文本键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `B` | 粗体
|
||||
`Ctrl` `I` | 斜体
|
||||
`Ctrl` `Shift` `.` | 增加字体大小
|
||||
`Ctrl` `Shift` `,` | 减小字体大小
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 操作菜单键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Alt` | 从中心
|
||||
`Shift` | 约束
|
||||
`Enter` | 编辑文字
|
||||
`Shift` | 约束旋转(15 度)
|
||||
`Shift` | 线约束旋转(45 度)
|
||||
`Shift` `Alt` | 从中心约束
|
||||
`Ctrl` | 直接选择
|
||||
`Ctrl` `Tab` | 在设计和原型模式之间切换
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 工具菜单键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`V` | 选择
|
||||
`R` | 长方形
|
||||
`E` | 椭圆
|
||||
`Y` | 多边形
|
||||
`L` | 线
|
||||
`P` | 笔
|
||||
`T` | 文本
|
||||
`A` | 画板
|
||||
`Z` | 快速移动
|
||||
`Ctrl` `3` | 缩放到所选内容
|
||||
`I` | 滴管
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 界面和查看选项的键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `+` | 放大
|
||||
`Ctrl` `-` | 缩小
|
||||
`Ctrl` `0` | 缩放以适合
|
||||
`Ctrl` `1` | 缩放至 `100%`
|
||||
`Ctrl` `2` | 缩放至 `200%`
|
||||
`Space` | 平底锅
|
||||
`Ctrl` `Shift` `Y` | 资产
|
||||
`Ctrl` `Y` | 图层
|
||||
`Ctrl` `Shift` `'` | 显示布局网格
|
||||
`Ctrl` `'` | 显示方形网格
|
||||
`Ctrl` `Tab` | 在设计和原型模式之间切换
|
||||
`Up/Down` | 将字段中的值增加或减少 `1`
|
||||
`Shift` `Up/Down` | 将字段中的值增加或减少 `10`
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 设计规范要点
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `+/-` | 快速移动
|
||||
`Ctrl` `0` | 重置缩放
|
||||
`(arrows)` | 平底锅
|
||||
`Shift` `(arrows)` | 更快的锅
|
||||
`Esc` | 从规范视图转到用户体验流程视图
|
||||
`Esc` | 在 UX 流视图中从画板上移除焦点
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 矢量编辑键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Enter` | 开始编辑选定的矢量对象
|
||||
`Esc` | 停止编辑选定的矢量对象
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 原型制作的关键
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `A` | 查看原型模式下的所有连接
|
||||
`Ctrl` `Enter` | 预览
|
||||
`Ctrl` `Shift` `E` | 在线分享原型
|
||||
`Left/Right` | 在预览或共享原型中浏览画板
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
另见
|
||||
--------
|
||||
|
||||
- [Keyboard shortcuts for Adobe XD](https://helpx.adobe.com/xd/help/keyboard-shortcuts.html) _(helpx.adobe.com)_
|
205
docs/android-studio.md
Normal file
@ -0,0 +1,205 @@
|
||||
Android Studio 键盘快捷键
|
||||
====
|
||||
|
||||
Android Studio 软件中 130 个键盘快捷键的可视化备忘单
|
||||
|
||||
键盘快捷键
|
||||
--------
|
||||
|
||||
### 一般的
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Ctrl` `S` | 保存全部
|
||||
`Ctrl` `Alt` `Y` | 同步
|
||||
`Ctrl` `Shift` `F12` | 最小化或最大化编辑器
|
||||
`Alt` `Shift` `F` | 添加到收藏夹
|
||||
`Alt` `Shift` `I` | 使用当前配置文件检查当前文件
|
||||
`Ctrl` <code>\`</code> | 快速切换方案
|
||||
`Ctrl` `Alt` `S` | 打开设置对话框
|
||||
`Ctrl` `Alt` `Shift` `S` | 打开项目结构对话框
|
||||
`Ctrl` `Tab` | 在选项卡和工具窗口之间切换
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 导航和搜索
|
||||
<!--rehype:wrap-class=row-span-3-->
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Shift` `Shift` | 搜索所有内容,包括代码和菜单
|
||||
`Ctrl` `F` | 寻找
|
||||
`F3` | 找下一个
|
||||
`Shift` `F3` | 查找上一个
|
||||
`Ctrl` `R` | 代替
|
||||
`Ctrl` `Shift` `A` | 查找操作
|
||||
`Ctrl` `Alt` `Shift` `N` | 按交易品种名称搜索
|
||||
`Ctrl` `N` | 查找班级
|
||||
`Ctrl` `Shift` `N` | 查找文件,而不是类
|
||||
`Ctrl` `Shift` `F` | 在路径中查找
|
||||
`Ctrl` `F12` | 打开文件结构弹出窗口
|
||||
`Alt` `Right/Left` | 在打开的编辑器选项卡之间导航
|
||||
`Ctrl` `Enter` | 跳转到源
|
||||
`Shift` `F4` | 在新窗口中打开当前编辑器选项卡
|
||||
`Ctrl` `E` | 最近打开的文件弹出窗口
|
||||
`Ctrl` `Shift` `E` | 最近编辑的文件弹出窗口
|
||||
`Ctrl` `Shift` `Backspace` | 转到上次编辑位置
|
||||
`Ctrl` `F4` | 关闭活动编辑器选项卡
|
||||
`Esc` | 从工具窗口返回到编辑器窗口
|
||||
`Shift` `Esc` | 隐藏活动或最后活动的工具窗口
|
||||
`Ctrl` `G` | 去线
|
||||
`Ctrl` `H` | 开放式层次结构
|
||||
`Ctrl` `Shift` `H` | 打开方法层次结构
|
||||
`Ctrl` `Alt` `H` | 开放调用层级
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 编写代码
|
||||
<!--rehype:wrap-class=row-span-6-->
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Alt` `Insert` | 生成代码,例如getters、setters、构造函数、新类
|
||||
`Ctrl` `O` | 覆盖方法
|
||||
`Ctrl` `I` | 实现方法
|
||||
`Ctrl` `Alt` `T` | 用 if...else、try...catch 等包围
|
||||
`Ctrl` `Y` | 删除插入符处的行
|
||||
`Ctrl` `-` | 折叠当前代码块
|
||||
`Ctrl` `+` | 展开当前代码块
|
||||
`Ctrl` `Shift` `-` | 折叠所有代码块
|
||||
`Ctrl` `Shift` `+` | 展开所有代码块
|
||||
`Ctrl` `D` | 复制当前行或选择
|
||||
`Ctrl` `Space` | 基本代码完成
|
||||
`Ctrl` `Shift` `Space` | 智能代码完成,按预期类型过滤方法和变量列表
|
||||
`Ctrl` `Shift` `Enter` | 完整声明
|
||||
`Ctrl` `Q` | 快速文档查找
|
||||
`Ctrl` `P` | 显示所选方法的参数
|
||||
`Ctrl` `B` | 直接去报关
|
||||
`Ctrl` `Alt` `B` | 转到实施
|
||||
`Ctrl` `U` | 转到超方法或超类
|
||||
`Ctrl` `Shift` `I` | 打开快速定义查找
|
||||
`Alt` `1` | 切换项目工具窗口可见性
|
||||
`F11` | 切换书签
|
||||
`Ctrl` `F11` | 使用助记符切换书签
|
||||
`Ctrl` `/` | 注释或取消注释行注释
|
||||
`Ctrl` `Shift` `/` | 使用块评论评论或取消评论
|
||||
`Ctrl` `W` | 选择连续递增的代码块
|
||||
`Ctrl` `Shift` `W` | 将当前选择减少到以前的状态
|
||||
`Ctrl` `[` | 移动到代码块开始
|
||||
`Ctrl` `]` | 移动到代码块末尾
|
||||
`Ctrl` `Shift` `[` | 选择到代码块开始
|
||||
`Ctrl` `Shift` `]` | 选择到代码块结束
|
||||
`Ctrl` `Del` | 删除到一个词的末尾
|
||||
`Ctrl` `Backspace` | 删除到单词的开头
|
||||
`Ctrl` `Alt` `O` | 优化导入
|
||||
`Alt` `Enter` | 项目快速修复、显示意图操作和快速修复
|
||||
`Ctrl` `Alt` `L` | 重新格式化代码
|
||||
`Ctrl` `Alt` `I` | 自动缩进行
|
||||
`Tab` | 缩进线
|
||||
`Shift` `Tab` | 不缩进线
|
||||
`Ctrl` `Shift` `J` | 智能线路加入
|
||||
`Ctrl` `Enter` | 智能分线
|
||||
`Shift` `Enter` | 开始新行
|
||||
`F2` | 下一个突出显示的错误
|
||||
`Shift` `F2` | 上一个突出显示的错误
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 查看布局
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Ctrl` `+` | 放大
|
||||
`Ctrl` `-` | 缩小
|
||||
`Ctrl` `0` | 适应屏幕
|
||||
`Ctrl` `Shift` `1` | 实际尺寸
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 布局编辑器
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`B` | 在设计和蓝图模式之间切换
|
||||
`O` | 在人像和风景模式之间切换
|
||||
`D` | 切换设备
|
||||
`R` | 强制刷新
|
||||
`E` | 切换渲染错误面板
|
||||
`Del` | 删除约束
|
||||
`Ctrl` `+` | 放大
|
||||
`Ctrl` `-` | 缩小
|
||||
`Ctrl` `0` | 缩放以适合
|
||||
`Ctrl` `B` | 转到 XML
|
||||
`Ctrl` `A` | 选择所有组件
|
||||
`Shift` `(click)` | 选择多个组件
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 导航编辑器
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Ctrl` `+` | 放大
|
||||
`Ctrl` `-` | 缩小
|
||||
`Ctrl` `0` | 缩放以适合
|
||||
`Ctrl` `B` | 转到 XML
|
||||
`E` | 切换渲染错误面板
|
||||
`Ctrl` `G` | 分组为嵌套图
|
||||
`Tab` | 循环浏览目的地
|
||||
`Ctrl` `A` | 选择所有目的地
|
||||
`Ctrl` `(click)` | 选择多个目的地
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 构建并运行
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Ctrl` `F9` | 建造
|
||||
`Shift` `F10` | 构建并运行
|
||||
`Ctrl` `F10` | 应用更改并重新启动活动
|
||||
`Ctrl` `Alt` `F10` | 应用代码更改
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 版本控制
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Ctrl` `K` | 提交项目到 VCS
|
||||
`Ctrl` `T` | 从 VCS 更新项目
|
||||
`Alt` `Shift` `C` | 查看最近的更改
|
||||
`Alt` <code>\`</code> | 打开 VCS 弹出窗口
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 调试
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Shift` `F9` | 调试
|
||||
`F8` | 跨过
|
||||
`F7` | 踏入
|
||||
`Shift` `F7` | 智能步入
|
||||
`Shift` `F8` | 走出去
|
||||
`Alt` `F9` | 运行到光标处
|
||||
`Alt` `F8` | 评估表达
|
||||
`F9` | 恢复程序
|
||||
`Ctrl` `F8` | 切换断点
|
||||
`Ctrl` `Shift` `F8` | 查看断点
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 重构
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`F5` | 复制
|
||||
`F6` | 移动
|
||||
`Alt` `Del` | 安全删除
|
||||
`Shift` `F6` | 改名
|
||||
`Ctrl` `F6` | 更改签名
|
||||
`Ctrl` `Alt` `N` | 排队
|
||||
`Ctrl` `Alt` `M` | 提取方法
|
||||
`Ctrl` `Alt` `V` | 提取变量
|
||||
`Ctrl` `Alt` `F` | 提取字段
|
||||
`Ctrl` `Alt` `C` | 提取常量
|
||||
`Ctrl` `Alt` `P` | 提取参数
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
另见
|
||||
--------
|
||||
|
||||
- [Keyboard shortcuts for Android Studio](https://developer.android.com/studio/intro/keyboard-shortcuts) _(developer.android.com)_
|
@ -19,6 +19,7 @@ Ansible 备忘清单
|
||||
- [Ansible 官方文档](https://docs.ansible.com)
|
||||
|
||||
### 配置位置
|
||||
<!--rehype:wrap-class=col-span-2 row-span-2-->
|
||||
|
||||
文件路径 | 说明
|
||||
:-|-
|
||||
@ -26,13 +27,27 @@ Ansible 备忘清单
|
||||
`~/ansible.cfg` | 用户特定的配置
|
||||
`$pwd/ansible.cfg` | 当前目录下的配置
|
||||
|
||||
配置文件优先级
|
||||
|
||||
- 如果没有任何其他配置文件,默认使用 `/etc/ansible/ansible.cfg`
|
||||
- `~/.ansible.cfg` `家`目录下的 `.ansible.cfg`
|
||||
- 当前目录下的 `ansible.cfg`,即在同一目录下 `ansible.cfg` 优先级高于 `~/.ansible.cfg`
|
||||
- 环境变量 `exoport ANSIBLE_CONFIG=/$DIR/ansible.cfg`
|
||||
<!--rehype:className=style-timeline-->
|
||||
|
||||
查看正在使用的 `ansible` 配置文件:
|
||||
|
||||
```bash
|
||||
ansible --version | grep "config file"
|
||||
```
|
||||
|
||||
### Inventory文件(hosts列表)
|
||||
|
||||
#### 静态Inventory
|
||||
|
||||
`/etc/ansible/hosts`
|
||||
|
||||
```INI
|
||||
```ini
|
||||
mail.example.com
|
||||
|
||||
[webservers]
|
||||
@ -42,7 +57,7 @@ bar.example.com
|
||||
|
||||
### Inventory 主机组使用多个IP和域名
|
||||
|
||||
```
|
||||
```ini
|
||||
[web]
|
||||
172.18.12.5[1:4]
|
||||
[webservers]
|
||||
@ -125,7 +140,7 @@ $ ansible target -m copy -a "src=/tmp/seq dest=/tmp/seq"
|
||||
### Ansible 命令帮助
|
||||
<!--rehype:wrap-class=col-span-2 row-span-3-->
|
||||
|
||||
```bash
|
||||
```shell
|
||||
$ ansible
|
||||
$ ansible <host-pattern> [options]
|
||||
```
|
||||
@ -156,6 +171,7 @@ $ ansible <host-pattern> [options]
|
||||
`--vault-password-file=VAULT_PASSWORD_FILE` | 保险库密码文件
|
||||
`-v`, `--verbose` | 详细模式(-vvv 更多,-vvvv 启用连接调试)
|
||||
`--version` | 显示程序的版本号并退出
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
控制谁以及如何连接到主机,连接选项:
|
||||
|
||||
@ -167,24 +183,26 @@ $ ansible <host-pattern> [options]
|
||||
`-c CONNECTION`, `--connection=CONNECTION` | 要使用的连接类型 (default=smart)
|
||||
`-T TIMEOUT`, `--timeout=TIMEOUT` | 以秒为单位覆盖连接超时 (default=10)
|
||||
`--ssh-common-args=SSH_COMMON_ARGS` | 指定要传递给 sftp/scp/ssh 的常用参数 (e.g. ProxyCommand)
|
||||
`--sftp-extra-args=SFTP_EXTRA_ARGS` | 指定仅传递给 sftp 的额外参数 (e.g. -f, -l)
|
||||
`--sftp-extra-args=SFTP_EXTRA_ARGS` | 指定仅传递给 `sftp` 的额外参数 (e.g. -f, -l)
|
||||
`--scp-extra-args=SCP_EXTRA_ARGS` | 指定仅传递给 `scp` 的额外参数 (e.g. -l)
|
||||
`--ssh-extra-args=SSH_EXTRA_ARGS` | 指定仅传递给 `ssh` 的额外参数 (e.g. -R)
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
控制您成为目标主机上的用户的方式和用户,特权升级选项:
|
||||
|
||||
:- | -
|
||||
:- | -
|
||||
`-s`, `--sudo` | 使用 sudo (nopasswd) 运行操作(已弃用,使用 become)
|
||||
`-U SUDO_USER`, `--sudo-user=SUDO_USER` | 所需的 sudo 用户(默认=root)(已弃用,使用 become)
|
||||
`-S`, `--su` | 使用 su 运行操作(已弃用,使用 become)
|
||||
`-R SU_USER`, `--su-user=SU_USER` | 以该用户身份使用 su 运行操作(默认 = root)(已弃用,使用 become)
|
||||
~~`-s`~~, ~~`--sudo`~~ | 使用 sudo (nopasswd) 运行操作(已弃用,使用 become)
|
||||
~~`-U SUDO_USER`~~, ~~`--sudo-user=SUDO_USER`~~ | 所需的 sudo 用户(默认=root)(已弃用,使用 become)
|
||||
~~`-S`~~, ~~`--su`~~ | 使用 su 运行操作(已弃用,使用 become)
|
||||
~~`-R SU_USER`~~, ~~`--su-user=SU_USER`~~ | 以该用户身份使用 su 运行操作(默认 = root)(已弃用,使用 become)
|
||||
`-b`, `--become` | 使用 become 运行操作(不暗示密码提示)
|
||||
`--become-method=BECOME_METHOD` | 要使用的权限提升方法(默认=sudo),有效选择:[ sudo | su | pbrun | pfexec | runas | doas | dzdo ]
|
||||
`--become-method=BECOME_METHOD` | 要使用的权限提升方法(默认=sudo),有效选择:\[ `sudo` \| `su` \| `pbrun` \| `pfexec` \| `runas` \| `doas` \| `dzdo` \]
|
||||
`--become-user=BECOME_USER` | 以该用户身份运行操作(默认=root)
|
||||
`--ask-sudo-pass` | 询问 sudo 密码(已弃用,使用 become)
|
||||
`--ask-su-pass` | 询问 su 密码(已弃用,使用 become)
|
||||
~~`--ask-sudo-pass`~~ | 询问 sudo 密码(已弃用,使用 become)
|
||||
~~`--ask-su-pass`~~ | 询问 su 密码(已弃用,使用 become)
|
||||
`-K`, `--ask-become-pass` | 要求提权密码
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
### Ansible Galaxy 工具
|
||||
|
||||
@ -394,6 +412,38 @@ $ ansible-pull -U <repository> [options]
|
||||
<!-- ### ansible-playbook -->
|
||||
<!-- todo -->
|
||||
|
||||
### ansible常用模块
|
||||
<!--rehype:wrap-class=col-span-3 -->
|
||||
|
||||
`Ansible` 的模块已经高达 `3000+` 之多。但是个人在日常工作中,比较常见的大约 `20` 多个
|
||||
|
||||
```bash
|
||||
$ ansible-doc --list #查询所有模块
|
||||
$ ansible <host-pattern> [options] # 标准使用方式
|
||||
```
|
||||
|
||||
---
|
||||
| :- | - | - |
|
||||
| ---------------- | ------------------------------------------------ | ------------------------------------------------------------ |
|
||||
| ping | 检查指定节点机器是否还能连通 | `ansible all -m ping` |
|
||||
| command | 用于在各受控端节点运行指定的命令 | `ansible all -m command -a 'hostname'` |
|
||||
| shell | shell模块可以特殊字符,而command是不支持 | `ansible all -m shell -a 'hostname && date'` |
|
||||
| hostname | 修改远程受控节点的主机名的模块 | `ansible -i /opt/hosts xx -m hostname -a 'name=ansible-client-199'` |
|
||||
| copy | 在远程主机执行复制操作文件 | `ansible all -m copy -a 'src=/etc/hosts dest=/opt/hosts backup=yes'` |
|
||||
| fetch | 从远程主机获取文件到管理节点,但是不支持目录操作 | `ansible all -m fetch -a "src=/etc/yum.repos.d/epel.repo dest=/usr/local/src"` |
|
||||
| script | 管理端一个脚本,然后在远程服务器上执行 | `ansible all -m script -a '/root/time.sh'` |
|
||||
| file | 主要用于远程主机上的文件和目录操作 | `ansible all -m file -a "path=/root/rsync.password mode=600 state=touch"` |
|
||||
| cron | 管理执行任务计划模块(增删改查) | `ansible all -m cron -a "name='test a job' user=root job='/bin/sh /server/scripts/test.sh' minute=* hour=* day=* month=* weekday=*"` |
|
||||
| yum | RedHat和CentOS的软件包安装和管理 | 安装<br />`ansible all -m yum -a "name=httpd state=present"`<br/>`ansible all -m yum -a "name=httpd state=installed"`<br />卸载<br />`ansible all -m yum -a "name=httpd state=absent"`<br/>`ansible all -m yum -a "name=httpd state=removed"` |
|
||||
| `service`和`systemd` | 用于管理远程主机的服务 | `ansible all -m systemd -a "name=httpd state=started enabled=yes"`<br />`ansible all -m systemd -a "name=httpd state=restarted"` |
|
||||
| user | useradd, userdel, usermod | `ansible all -m user -a 'name=haha remove=no state=absent'` |
|
||||
| group | groupadd, groupdel, groupmod | `ansible all -m group -a 'name=mygroup state=absent'` |
|
||||
| setup | 可收集远程主机的facts变量的信息 | `ansible all -m setup -a 'filter=ansible_default_ipv4'` |
|
||||
| authorized_key | 为特定的用户账号添加或删除 SSH authorized keys | `ansible all -m authorized_key -a "user=root key='{{lookup('file','/root/.ssh/id_rsa.pub')}}' path=/root/.ssh/authorized_keys manage_dir=no"` |
|
||||
| replace | 和 sed 命令比较类似,用于正则匹配和替换 | `ansible all -m replace -a "path=/etc/fstab regexp=^(UUID.*) replace='#\1'"` |
|
||||
| lineinfile | 正则匹配,更改某个关键参数值 | `ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"` |
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
另见
|
||||
---
|
||||
|
||||
|
270
docs/ascii-code.md
Normal file
@ -0,0 +1,270 @@
|
||||
ASCII Code 备忘清单
|
||||
===
|
||||
|
||||
这份速查表是 ASCII 码表的完整列表,包含了它们的数字和名称
|
||||
|
||||
ASCII 代码表
|
||||
---
|
||||
<!--rehype:body-class=cols-1&style=display:none;-->
|
||||
|
||||
### ASCII 代码表
|
||||
|
||||
| Symbol(符号) | Dec | Oct | Hex | Bin |
|
||||
|------------------------------------|------|------|------|----------|
|
||||
| NUL (Null) | 0 | 0 | 0 | 0 |
|
||||
| SOH (Start of Heading) | 1 | 1 | 1 | 1 |
|
||||
| STX (Start of Text) | 2 | 2 | 2 | 10 |
|
||||
| ETX (End of Text) | 3 | 3 | 3 | 11 |
|
||||
| EOT (End of Transmission) | 4 | 4 | 4 | 100 |
|
||||
| ENQ (Enquiry) | 5 | 5 | 5 | 101 |
|
||||
| ACK (Acknowledgment) | 6 | 6 | 6 | 110 |
|
||||
| BEL (Bell) | 7 | 7 | 7 | 111 |
|
||||
| BS (Back Space) | 8 | 10 | 8 | 1000 |
|
||||
| HT (Horizontal Tab) | 9 | 11 | 9 | 1001 |
|
||||
| LF (Line Feed) | 10 | 12 | 0A | 1010 |
|
||||
| VT (Vertical Tab) | 11 | 13 | 0B | 1011 |
|
||||
| FF (Form Feed) | 12 | 14 | 0C | 1100 |
|
||||
| CR (Carriage Return) | 13 | 15 | 0D | 1101 |
|
||||
| SO (Shift Out / X-On) | 14 | 16 | 0E | 1110 |
|
||||
| SI (Shift In / X-Off) | 15 | 17 | 0F | 1111 |
|
||||
| DLE (Data Line Escape) | 16 | 20 | 10 | 10000 |
|
||||
| DC1 (Device Control 1 / oft. XON) | 17 | 21 | 11 | 10001 |
|
||||
| DC2 (Device Control 2) | 18 | 22 | 12 | 10010 |
|
||||
| DC3 (Device Control 3 / oft. XOFF) | 19 | 23 | 13 | 10011 |
|
||||
| DC4 (Device Control 4) | 20 | 24 | 14 | 10100 |
|
||||
| NAK (Negative Acknowledgement) | 21 | 25 | 15 | 10101 |
|
||||
| SYN (Synchronous Idle) | 22 | 26 | 16 | 10110 |
|
||||
| ETB (End of Transmit Block) | 23 | 27 | 17 | 10111 |
|
||||
| CAN (Cancel) | 24 | 30 | 18 | 11000 |
|
||||
| EM (End of Medium) | 25 | 31 | 19 | 11001 |
|
||||
| SUB (Substitute) | 26 | 32 | 1A | 11010 |
|
||||
| ESC (Escape) | 27 | 33 | 1B | 11011 |
|
||||
| FS (File Separator) | 28 | 34 | 1C | 11100 |
|
||||
| GS (Group Separator) | 29 | 35 | 1D | 11101 |
|
||||
| RS (Record Separator) | 30 | 36 | 1E | 11110 |
|
||||
| US (Unit Separator) | 31 | 37 | 1F | 11111 |
|
||||
| (Space) | 32 | 40 | 20 | 100000 |
|
||||
| ! | 33 | 41 | 21 | 100001 |
|
||||
| " | 34 | 42 | 22 | 100010 |
|
||||
| # | 35 | 43 | 23 | 100011 |
|
||||
| $ | 36 | 44 | 24 | 100100 |
|
||||
| % | 37 | 45 | 25 | 100101 |
|
||||
| & | 38 | 46 | 26 | 100110 |
|
||||
| ' | 39 | 47 | 27 | 100111 |
|
||||
| ( | 40 | 50 | 28 | 101000 |
|
||||
| ) | 41 | 51 | 29 | 101001 |
|
||||
| * | 42 | 52 | 2A | 101010 |
|
||||
| + | 43 | 53 | 2B | 101011 |
|
||||
| , | 44 | 54 | 2C | 101100 |
|
||||
| - | 45 | 55 | 2D | 101101 |
|
||||
| . | 46 | 56 | 2E | 101110 |
|
||||
| / | 47 | 57 | 2F | 101111 |
|
||||
| 0 | 48 | 60 | 30 | 110000 |
|
||||
| 1 | 49 | 61 | 31 | 110001 |
|
||||
| 2 | 50 | 62 | 32 | 110010 |
|
||||
| 3 | 51 | 63 | 33 | 110011 |
|
||||
| 4 | 52 | 64 | 34 | 110100 |
|
||||
| 5 | 53 | 65 | 35 | 110101 |
|
||||
| 6 | 54 | 66 | 36 | 110110 |
|
||||
| 7 | 55 | 67 | 37 | 110111 |
|
||||
| 8 | 56 | 70 | 38 | 111000 |
|
||||
| 9 | 57 | 71 | 39 | 111001 |
|
||||
| : | 58 | 72 | 3A | 111010 |
|
||||
| ; | 59 | 73 | 3B | 111011 |
|
||||
| < | 60 | 74 | 3C | 111100 |
|
||||
| = | 61 | 75 | 3D | 111101 |
|
||||
| > | 62 | 76 | 3E | 111110 |
|
||||
| ? | 63 | 77 | 3F | 111111 |
|
||||
| @ | 64 | 100 | 40 | 1000000 |
|
||||
| A | 65 | 101 | 41 | 1000001 |
|
||||
| B | 66 | 102 | 42 | 1000010 |
|
||||
| C | 67 | 103 | 43 | 1000011 |
|
||||
| D | 68 | 104 | 44 | 1000100 |
|
||||
| E | 69 | 105 | 45 | 1000101 |
|
||||
| F | 70 | 106 | 46 | 1000110 |
|
||||
| G | 71 | 107 | 47 | 1000111 |
|
||||
| H | 72 | 110 | 48 | 1001000 |
|
||||
| I | 73 | 111 | 49 | 1001001 |
|
||||
| J | 74 | 112 | 4A | 1001010 |
|
||||
| K | 75 | 113 | 4B | 1001011 |
|
||||
| L | 76 | 114 | 4C | 1001100 |
|
||||
| M | 77 | 115 | 4D | 1001101 |
|
||||
| N | 78 | 116 | 4E | 1001110 |
|
||||
| O | 79 | 117 | 4F | 1001111 |
|
||||
| P | 80 | 120 | 50 | 1010000 |
|
||||
| Q | 81 | 121 | 51 | 1010001 |
|
||||
| R | 82 | 122 | 52 | 1010010 |
|
||||
| S | 83 | 123 | 53 | 1010011 |
|
||||
| T | 84 | 124 | 54 | 1010100 |
|
||||
| U | 85 | 125 | 55 | 1010101 |
|
||||
| V | 86 | 126 | 56 | 1010110 |
|
||||
| W | 87 | 127 | 57 | 1010111 |
|
||||
| X | 88 | 130 | 58 | 1011000 |
|
||||
| Y | 89 | 131 | 59 | 1011001 |
|
||||
| Z | 90 | 132 | 5A | 1011010 |
|
||||
| [ | 91 | 133 | 5B | 1011011 |
|
||||
| \ | 92 | 134 | 5C | 1011100 |
|
||||
| ] | 93 | 135 | 5D | 1011101 |
|
||||
| ^ | 94 | 136 | 5E | 1011110 |
|
||||
| _ | 95 | 137 | 5F | 1011111 |
|
||||
| <code>\`</code> | 96 | 140 | 60 | 1100000 |
|
||||
| a | 97 | 141 | 61 | 1100001 |
|
||||
| b | 98 | 142 | 62 | 1100010 |
|
||||
| c | 99 | 143 | 63 | 1100011 |
|
||||
| d | 100 | 144 | 64 | 1100100 |
|
||||
| e | 101 | 145 | 65 | 1100101 |
|
||||
| f | 102 | 146 | 66 | 1100110 |
|
||||
| g | 103 | 147 | 67 | 1100111 |
|
||||
| h | 104 | 150 | 68 | 1101000 |
|
||||
| i | 105 | 151 | 69 | 1101001 |
|
||||
| j | 106 | 152 | 6A | 1101010 |
|
||||
| k | 107 | 153 | 6B | 1101011 |
|
||||
| l | 108 | 154 | 6C | 1101100 |
|
||||
| m | 109 | 155 | 6D | 1101101 |
|
||||
| n | 110 | 156 | 6E | 1101110 |
|
||||
| o | 111 | 157 | 6F | 1101111 |
|
||||
| p | 112 | 160 | 70 | 1110000 |
|
||||
| q | 113 | 161 | 71 | 1110001 |
|
||||
| r | 114 | 162 | 72 | 1110010 |
|
||||
| s | 115 | 163 | 73 | 1110011 |
|
||||
| t | 116 | 164 | 74 | 1110100 |
|
||||
| u | 117 | 165 | 75 | 1110101 |
|
||||
| v | 118 | 166 | 76 | 1110110 |
|
||||
| w | 119 | 167 | 77 | 1110111 |
|
||||
| x | 120 | 170 | 78 | 1111000 |
|
||||
| y | 121 | 171 | 79 | 1111001 |
|
||||
| z | 122 | 172 | 7A | 1111010 |
|
||||
| { | 123 | 173 | 7B | 1111011 |
|
||||
| | 124 | 174 | 7C | 1111100 |
|
||||
| } | 125 | 175 | 7D | 1111101 |
|
||||
| ~ | 126 | 176 | 7E | 1111110 |
|
||||
| (Delete) | 127 | 177 | 7F | 1111111 |
|
||||
| € | 128 | 200 | 80 | 10000000 |
|
||||
| | 129 | 201 | 81 | 10000001 |
|
||||
| ‚ | 130 | 202 | 82 | 10000010 |
|
||||
| ƒ | 131 | 203 | 83 | 10000011 |
|
||||
| „ | 132 | 204 | 84 | 10000100 |
|
||||
| … | 133 | 205 | 85 | 10000101 |
|
||||
| † | 134 | 206 | 86 | 10000110 |
|
||||
| ‡ | 135 | 207 | 87 | 10000111 |
|
||||
| ˆ | 136 | 210 | 88 | 10001000 |
|
||||
| ‰ | 137 | 211 | 89 | 10001001 |
|
||||
| Š | 138 | 212 | 8A | 10001010 |
|
||||
| ‹ | 139 | 213 | 8B | 10001011 |
|
||||
| Œ | 140 | 214 | 8C | 10001100 |
|
||||
| | 141 | 215 | 8D | 10001101 |
|
||||
| Ž | 142 | 216 | 8E | 10001110 |
|
||||
| | 143 | 217 | 8F | 10001111 |
|
||||
| | 144 | 220 | 90 | 10010000 |
|
||||
| ‘ | 145 | 221 | 91 | 10010001 |
|
||||
| ’ | 146 | 222 | 92 | 10010010 |
|
||||
| “ | 147 | 223 | 93 | 10010011 |
|
||||
| ” | 148 | 224 | 94 | 10010100 |
|
||||
| • | 149 | 225 | 95 | 10010101 |
|
||||
| – | 150 | 226 | 96 | 10010110 |
|
||||
| — | 151 | 227 | 97 | 10010111 |
|
||||
| ˜ | 152 | 230 | 98 | 10011000 |
|
||||
| ™ | 153 | 231 | 99 | 10011001 |
|
||||
| š | 154 | 232 | 9A | 10011010 |
|
||||
| › | 155 | 233 | 9B | 10011011 |
|
||||
| œ | 156 | 234 | 9C | 10011100 |
|
||||
| | 157 | 235 | 9D | 10011101 |
|
||||
| ž | 158 | 236 | 9E | 10011110 |
|
||||
| Ÿ | 159 | 237 | 9F | 10011111 |
|
||||
| (Non-breaking space) | 160 | 240 | A0 | 10100000 |
|
||||
| ¡ | 161 | 241 | A1 | 10100001 |
|
||||
| ¢ | 162 | 242 | A2 | 10100010 |
|
||||
| £ | 163 | 243 | A3 | 10100011 |
|
||||
| ¤ | 164 | 244 | A4 | 10100100 |
|
||||
| ¥ | 165 | 245 | A5 | 10100101 |
|
||||
| ¦ | 166 | 246 | A6 | 10100110 |
|
||||
| § | 167 | 247 | A7 | 10100111 |
|
||||
| ¨ | 168 | 250 | A8 | 10101000 |
|
||||
| © | 169 | 251 | A9 | 10101001 |
|
||||
| ª | 170 | 252 | AA | 10101010 |
|
||||
| « | 171 | 253 | AB | 10101011 |
|
||||
| ¬ | 172 | 254 | AC | 10101100 |
|
||||
| (Soft hyphen) | 173 | 255 | AD | 10101101 |
|
||||
| ® | 174 | 256 | AE | 10101110 |
|
||||
| ¯ | 175 | 257 | AF | 10101111 |
|
||||
| ° | 176 | 260 | B0 | 10110000 |
|
||||
| ± | 177 | 261 | B1 | 10110001 |
|
||||
| ² | 178 | 262 | B2 | 10110010 |
|
||||
| ³ | 179 | 263 | B3 | 10110011 |
|
||||
| ´ | 180 | 264 | B4 | 10110100 |
|
||||
| µ | 181 | 265 | B5 | 10110101 |
|
||||
| ¶ | 182 | 266 | B6 | 10110110 |
|
||||
| · | 183 | 267 | B7 | 10110111 |
|
||||
| ¸ | 184 | 270 | B8 | 10111000 |
|
||||
| ¹ | 185 | 271 | B9 | 10111001 |
|
||||
| º | 186 | 272 | BA | 10111010 |
|
||||
| » | 187 | 273 | BB | 10111011 |
|
||||
| ¼ | 188 | 274 | BC | 10111100 |
|
||||
| ½ | 189 | 275 | BD | 10111101 |
|
||||
| ¾ | 190 | 276 | BE | 10111110 |
|
||||
| ¿ | 191 | 277 | BF | 10111111 |
|
||||
| À | 192 | 300 | C0 | 11000000 |
|
||||
| Á | 193 | 301 | C1 | 11000001 |
|
||||
| Â | 194 | 302 | C2 | 11000010 |
|
||||
| Ã | 195 | 303 | C3 | 11000011 |
|
||||
| Ä | 196 | 304 | C4 | 11000100 |
|
||||
| Å | 197 | 305 | C5 | 11000101 |
|
||||
| Æ | 198 | 306 | C6 | 11000110 |
|
||||
| Ç | 199 | 307 | C7 | 11000111 |
|
||||
| È | 200 | 310 | C8 | 11001000 |
|
||||
| É | 201 | 311 | C9 | 11001001 |
|
||||
| Ê | 202 | 312 | CA | 11001010 |
|
||||
| Ë | 203 | 313 | CB | 11001011 |
|
||||
| Ì | 204 | 314 | CC | 11001100 |
|
||||
| Í | 205 | 315 | CD | 11001101 |
|
||||
| Î | 206 | 316 | CE | 11001110 |
|
||||
| Ï | 207 | 317 | CF | 11001111 |
|
||||
| Ð | 208 | 320 | D0 | 11010000 |
|
||||
| Ñ | 209 | 321 | D1 | 11010001 |
|
||||
| Ò | 210 | 322 | D2 | 11010010 |
|
||||
| Ó | 211 | 323 | D3 | 11010011 |
|
||||
| Ô | 212 | 324 | D4 | 11010100 |
|
||||
| Õ | 213 | 325 | D5 | 11010101 |
|
||||
| Ö | 214 | 326 | D6 | 11010110 |
|
||||
| × | 215 | 327 | D7 | 11010111 |
|
||||
| Ø | 216 | 330 | D8 | 11011000 |
|
||||
| Ù | 217 | 331 | D9 | 11011001 |
|
||||
| Ú | 218 | 332 | DA | 11011010 |
|
||||
| Û | 219 | 333 | DB | 11011011 |
|
||||
| Ü | 220 | 334 | DC | 11011100 |
|
||||
| Ý | 221 | 335 | DD | 11011101 |
|
||||
| Þ | 222 | 336 | DE | 11011110 |
|
||||
| ß | 223 | 337 | DF | 11011111 |
|
||||
| à | 224 | 340 | E0 | 11100000 |
|
||||
| á | 225 | 341 | E1 | 11100001 |
|
||||
| â | 226 | 342 | E2 | 11100010 |
|
||||
| ã | 227 | 343 | E3 | 11100011 |
|
||||
| ä | 228 | 344 | E4 | 11100100 |
|
||||
| å | 229 | 345 | E5 | 11100101 |
|
||||
| æ | 230 | 346 | E6 | 11100110 |
|
||||
| ç | 231 | 347 | E7 | 11100111 |
|
||||
| è | 232 | 350 | E8 | 11101000 |
|
||||
| é | 233 | 351 | E9 | 11101001 |
|
||||
| ê | 234 | 352 | EA | 11101010 |
|
||||
| ë | 235 | 353 | EB | 11101011 |
|
||||
| ì | 236 | 354 | EC | 11101100 |
|
||||
| í | 237 | 355 | ED | 11101101 |
|
||||
| î | 238 | 356 | EE | 11101110 |
|
||||
| ï | 239 | 357 | EF | 11101111 |
|
||||
| ð | 240 | 360 | F0 | 11110000 |
|
||||
| ñ | 241 | 361 | F1 | 11110001 |
|
||||
| ò | 242 | 362 | F2 | 11110010 |
|
||||
| ó | 243 | 363 | F3 | 11110011 |
|
||||
| ô | 244 | 364 | F4 | 11110100 |
|
||||
| õ | 245 | 365 | F5 | 11110101 |
|
||||
| ö | 246 | 366 | F6 | 11110110 |
|
||||
| ÷ | 247 | 367 | F7 | 11110111 |
|
||||
| ø | 248 | 370 | F8 | 11111000 |
|
||||
| ù | 249 | 371 | F9 | 11111001 |
|
||||
| ú | 250 | 372 | FA | 11111010 |
|
||||
| û | 251 | 373 | FB | 11111011 |
|
||||
| ü | 252 | 374 | FC | 11111100 |
|
||||
| ý | 253 | 375 | FD | 11111101 |
|
||||
| þ | 254 | 376 | FE | 11111110 |
|
||||
| ÿ | 255 | 377 | FF | 11111111 |
|
||||
<!--rehype:className=show-header-->
|
249
docs/aspect-ratio.md
Normal file
@ -0,0 +1,249 @@
|
||||
Aspect Ratio 备忘清单
|
||||
===
|
||||
|
||||
此备忘单列出了一些常见的宽高比及其像素分辨率
|
||||
|
||||
入门
|
||||
----
|
||||
<!--rehype:body-class=cols-2-->
|
||||
|
||||
### 介绍
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
- 宽高比是屏幕或图像的宽度和高度之间的比率
|
||||
- 它通常写成由冒号或“x”分隔的两个数字,例如:16:9 或 16x9
|
||||
- 这被解释为宽度为 W 像素,高度为每个 H 像素。
|
||||
- 分辨率是像素数(颜色的各个点)
|
||||
<!--rehype:className=style-round-->
|
||||
|
||||
宽高比列表
|
||||
--------
|
||||
|
||||
### 1080p
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
0.80 (4:5) | 864 x 1080
|
||||
1.25 (5:4) | 1350 x 1080
|
||||
1.33 (4:3) | 1440 x 1080
|
||||
1.66 (5:3) | 1800 x 1080
|
||||
1.78 (16:9) | 1920 x 1080
|
||||
1.85 | 1920 x 1038
|
||||
1.90 | 1920 x 1011
|
||||
2.00 | 1920 x 960
|
||||
2.35 | 1920 x 817
|
||||
2.37 | 1920 x 810
|
||||
2.39 | 1920 x 803
|
||||
2.40 | 1920 x 800
|
||||
2.44 | 1920 x 787
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### 720p
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
0.80 (4:5) | 576 x 720
|
||||
1.25 (5:4) | 900 x 720
|
||||
1.33 (4:3) | 960 x 720
|
||||
1.66 (5:3) | 1200 x 720
|
||||
1.78 (16:9) | 1280 x 720
|
||||
1.85 | 1280 x 692
|
||||
1.90 | 1280 x 674
|
||||
2.00 | 1280 x 640
|
||||
2.35 | 1280 x 545
|
||||
2.37 | 1280 x 540
|
||||
2.39 | 1280 x 536
|
||||
2.40 | 1280 x 533
|
||||
2.44 | 1280 x 525
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### Cinema DCP 4K
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
Flat (1.85) | 3996 x 2160
|
||||
Scope (2.39) | 4096 x 1716
|
||||
Full Container (1.90) | 4096 x 2160
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### Cinema DCP 2K
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
Flat (1.85) | 1998 x 1080
|
||||
Scope (2.39) | 2048 x 858
|
||||
Full Container (1.90) | 2048 x 1080
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### 8K
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
0.80 (4:5) | 3686 x 4608
|
||||
1.25 (5:4) | 5760 x 4608
|
||||
1.33 (4:3) | 6144 x 4608
|
||||
1.66 (5:3) | 7680 x 4608
|
||||
1.78 (16:9) | 8192 x 4608
|
||||
1.85 | 8192 x 4428
|
||||
1.90 | 8192 x 4320
|
||||
2.00 | 8192 x 4096
|
||||
2.35 | 8192 x 3486
|
||||
2.37 | 8192 x 3456
|
||||
2.39 | 8192 x 3428
|
||||
2.40 | 8192 x 3413
|
||||
2.44 | 8192 x 3357
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### 6K
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
0.80 (4:5) | 2765 x 3456
|
||||
1.25 (5:4) | 4320 x 3456
|
||||
1.33 (4:3) | 4608 x 3456
|
||||
1.66 (5:3) | 5760 x 3456
|
||||
1.78 (16:9) | 6144 x 3456
|
||||
1.85 | 6144 x 3321
|
||||
1.90 | 6144 x 3234
|
||||
2.00 | 6144 x 3072
|
||||
2.35 | 6144 x 2614
|
||||
2.37 | 6144 x 2592
|
||||
2.39 | 6144 x 2571
|
||||
2.40 | 6144 x 2560
|
||||
2.44 | 6144 x 2518
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### 4K
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
0.80 (4:5) | 2765 x 3456
|
||||
1.25 (5:4) | 4320 x 3456
|
||||
1.33 (4:3) | 4608 x 3456
|
||||
1.66 (5:3) | 5760 x 3456
|
||||
1.78 (16:9) | 6144 x 3456
|
||||
1.85 | 6144 x 3321
|
||||
1.90 | 6144 x 3234
|
||||
2.00 | 6144 x 3072
|
||||
2.35 | 6144 x 2614
|
||||
2.37 | 6144 x 2592
|
||||
2.39 | 6144 x 2571
|
||||
2.40 | 6144 x 2560
|
||||
2.44 | 6144 x 2518
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### 3K
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
0.80 (4:5) | 1382 x 1728
|
||||
1.25 (5:4) | 2160 x 1728
|
||||
1.33 (4:3) | 2304 x 1728
|
||||
1.66 (5:3) | 2880 x 1728
|
||||
1.78 (16:9) | 3072 x 1728
|
||||
1.85 | 3072 x 1661
|
||||
1.90 | 3072 x 1620
|
||||
2.00 | 3072 x 1536
|
||||
2.35 | 3072 x 1307
|
||||
2.37 | 3072 x 1296
|
||||
2.39 | 3072 x 1285
|
||||
2.40 | 3072 x 1280
|
||||
2.44 | 3072 x 1259
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### 2K
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
0.80 (4:5) | 922 x 1152
|
||||
1.25 (5:4) | 1440 x 1152
|
||||
1.33 (4:3) | 1536 x 1152
|
||||
1.66 (5:3) | 1920 x 1152
|
||||
1.78 (16:9) | 2048 x 1152
|
||||
1.85 | 2048 x 1107
|
||||
1.90 | 2048 x 1078
|
||||
2.00 | 2048 x 1024
|
||||
2.35 | 2048 x 871
|
||||
2.37 | 2048 x 864
|
||||
2.39 | 2048 x 858
|
||||
2.40 | 2048 x 853
|
||||
2.44 | 2048 x 838
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### 8K UHD
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
0.80 (4:5) | 2765 x 3456
|
||||
1.25 (5:4) | 5400 x 3456
|
||||
1.33 (4:3) | 5760 x 3456
|
||||
1.66 (5:3) | 7200 x 3456
|
||||
1.78 (16:9) | 7680 x 4320
|
||||
1.85 | 7680 x 4151
|
||||
1.90 | 7680 x 4042
|
||||
2.00 | 7680 x 3840
|
||||
2.35 | 7680 x 3268
|
||||
2.37 | 7680 x 3240
|
||||
2.39 | 7680 x 3213
|
||||
2.40 | 7680 x 3200
|
||||
2.44 | 7680 x 3148
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### 5K
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
0.80 (4:5) | 2304 x 2880
|
||||
1.25 (5:4) | 3600 x 2880
|
||||
1.33 (4:3) | 3840 x 2880
|
||||
1.66 (5:3) | 4800 x 2880
|
||||
1.78 (16:9) | 5120 x 2880
|
||||
1.85 | 5120 x 2768
|
||||
1.90 | 5120 x 2700
|
||||
2.00 | 5120 x 2560
|
||||
2.35 | 5120 x 2179
|
||||
2.37 | 5120 x 2160
|
||||
2.39 | 5120 x 2142
|
||||
2.40 | 5120 x 2133
|
||||
2.44 | 5120 x 2098
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### 4K UHD
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
0.80 (4:5) | 1728 x 2160
|
||||
1.25 (5:4) | 2700 x 2160
|
||||
1.33 (4:3) | 2880 x 2160
|
||||
1.66 (5:3) | 3600 x 2160
|
||||
1.78 (16:9) | 3840 x 2160
|
||||
1.85 | 3840 x 2076
|
||||
1.90 | 3840 x 2021
|
||||
2.00 | 3840 x 1920
|
||||
2.35 | 3840 x 1634
|
||||
2.37 | 3840 x 1620
|
||||
2.39 | 3840 x 1607
|
||||
2.40 | 3840 x 1600
|
||||
2.44 | 3840 x 1574
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
### 3K UHD
|
||||
|
||||
纵横比 | 分辨率
|
||||
:-- | --
|
||||
0.80 (4:5) | 1296 x 1620
|
||||
1.25 (5:4) | 2025 x 1620
|
||||
1.33 (4:3) | 2160 x 1620
|
||||
1.66 (5:3) | 2700 x 1620
|
||||
1.78 (16:9) | 2880 x 1620
|
||||
1.85 | 2880 x 1557
|
||||
1.90 | 2880 x 1516
|
||||
2.00 | 2880 x 1440
|
||||
2.35 | 2880 x 1226
|
||||
2.37 | 2880 x 1215
|
||||
2.39 | 2880 x 1205
|
||||
2.40 | 2880 x 1200
|
||||
2.44 | 2880 x 1180
|
||||
<!--rehype:className=show-header-->
|
254
docs/bash.md
@ -4,7 +4,7 @@ Bash 备忘清单
|
||||
这是开始使用 linux bash shell 脚本的快速参考备忘单。
|
||||
|
||||
入门
|
||||
---------------
|
||||
-----
|
||||
|
||||
### hello.sh
|
||||
|
||||
@ -61,6 +61,7 @@ bash 注释
|
||||
`$@` | 所有参数,从第一个开始
|
||||
`$-` | 当前选项
|
||||
`$_` | 上一个命令的最后一个参数
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
见:[特殊参数](http://wiki.bash-hackers.org/syntax/shellvars#special_parameters_and_shell_variables)
|
||||
|
||||
@ -152,6 +153,7 @@ Bash 参数扩展
|
||||
`${FOO:=val}` | 如果未设置,则将 `$FOO` 设置为 `val`
|
||||
`${FOO:+val}` | `val` 如果设置了`$FOO`
|
||||
`${FOO:?message}` | 如果 `$FOO` 未设置,则显示消息并退出
|
||||
<!--rehype:className=code-nowrap left-align-->
|
||||
|
||||
### 替代 Substitution
|
||||
|
||||
@ -195,15 +197,21 @@ echo ${name:0:length} # => Jo
|
||||
SRC="/path/to/foo.cpp"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```bash
|
||||
BASEPATH=${SRC##*/}
|
||||
echo $BASEPATH # => "foo.cpp"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```bash
|
||||
DIRPATH=${SRC%$BASEPATH}
|
||||
echo $DIRPATH # => "/path/to/"
|
||||
```
|
||||
|
||||
### Transform
|
||||
### 转换
|
||||
|
||||
```bash
|
||||
STR="HELLO WORLD!"
|
||||
@ -265,7 +273,7 @@ for e in "${Fruits[@]}"; do
|
||||
done
|
||||
```
|
||||
|
||||
#### With index
|
||||
#### 有索引
|
||||
|
||||
```bash
|
||||
for i in "${!Fruits[@]}"; do
|
||||
@ -348,12 +356,12 @@ Bash 条件句
|
||||
|
||||
条件 | 描述
|
||||
:- | -
|
||||
`[[ NUM -eq NUM ]]` | 等于 <yel>Eq</yel>ual |
|
||||
`[[ NUM -ne NUM ]]` | 不等于 <yel>N</yel>ot <yel>e</yel>qual |
|
||||
`[[ NUM -lt NUM ]]` | 小于 <yel>L</yel>ess <yel>t</yel>han |
|
||||
`[[ NUM -le NUM ]]` | 小于等于 <yel>L</yel>ess than or <yel>e</yel>qual |
|
||||
`[[ NUM -gt NUM ]]` | 大于 <yel>G</yel>reater <yel>t</yel>han |
|
||||
`[[ NUM -ge NUM ]]` | 大于等于 <yel>G</yel>reater than or <yel>e</yel>qual |
|
||||
`[[ NUM -eq NUM ]]` | 等于 <yel>Eq</yel>ual
|
||||
`[[ NUM -ne NUM ]]` | 不等于 <yel>N</yel>ot <yel>e</yel>qual
|
||||
`[[ NUM -lt NUM ]]` | 小于 <yel>L</yel>ess <yel>t</yel>han
|
||||
`[[ NUM -le NUM ]]` | 小于等于 <yel>L</yel>ess than or <yel>e</yel>qual
|
||||
`[[ NUM -gt NUM ]]` | 大于 <yel>G</yel>reater <yel>t</yel>han
|
||||
`[[ NUM -ge NUM ]]` | 大于等于 <yel>G</yel>reater than or <yel>e</yel>qual
|
||||
`(( NUM < NUM ))` | 小于
|
||||
`(( NUM <= NUM ))` | 小于或等于
|
||||
`(( NUM > NUM ))` | 比...更大
|
||||
@ -448,10 +456,10 @@ fi
|
||||
|
||||
条件 | 描述
|
||||
:- | -
|
||||
`[[ -o noclobber ]]` | 如果启用 OPTION
|
||||
`[[ ! EXPR ]]` | 不是 Not
|
||||
`[[ X && Y ]]` | 和 And
|
||||
`[[ X \|\| Y ]]` | 或者 Or
|
||||
`[[ -o noclobber ]]` | 如果启用 <pur>OPTION</pur>
|
||||
`[[ ! EXPR ]]` | 不是 <pur>Not</pur>
|
||||
`[[ X && Y ]]` | 和 <pur>And</pur>
|
||||
`[[ X \|\| Y ]]` | 或者 <pur>Or</pur>
|
||||
|
||||
### 逻辑和,或
|
||||
|
||||
@ -536,10 +544,10 @@ done
|
||||
```bash
|
||||
for number in $(seq 1 3); do
|
||||
if [[ $number == 2 ]]; then
|
||||
# Skip entire rest of loop.
|
||||
# 跳过整个循环的其余部分。
|
||||
break;
|
||||
fi
|
||||
# This will only print 1
|
||||
# 这只会打印 1
|
||||
echo "$number"
|
||||
done
|
||||
```
|
||||
@ -558,7 +566,7 @@ done
|
||||
|
||||
```bash
|
||||
while true; do
|
||||
# here is some code.
|
||||
# 下面是一些代码
|
||||
done
|
||||
```
|
||||
|
||||
@ -566,7 +574,7 @@ done
|
||||
|
||||
```bash
|
||||
while :; do
|
||||
# here is some code.
|
||||
# 下面是一些代码
|
||||
done
|
||||
```
|
||||
|
||||
@ -589,8 +597,9 @@ myfunc() {
|
||||
}
|
||||
```
|
||||
|
||||
同上(替代语法)
|
||||
|
||||
```bash
|
||||
# 同上(替代语法)
|
||||
function myfunc() {
|
||||
echo "hello $1"
|
||||
}
|
||||
@ -635,42 +644,61 @@ Bash 选项
|
||||
|
||||
### 选项
|
||||
|
||||
避免覆盖文件
|
||||
|
||||
```bash
|
||||
# 避免覆盖文件
|
||||
# (echo "hi" > foo)
|
||||
set -o noclobber
|
||||
```
|
||||
|
||||
# 用于出错时退出
|
||||
# 避免级联错误
|
||||
用于出错时退出,避免级联错误
|
||||
|
||||
```bash
|
||||
set -o errexit
|
||||
```
|
||||
|
||||
# 揭示隐藏的失败
|
||||
揭示隐藏的失败
|
||||
|
||||
```bash
|
||||
set -o pipefail
|
||||
```
|
||||
|
||||
# 公开未设置的变量
|
||||
公开未设置的变量
|
||||
|
||||
```bash
|
||||
set -o nounset
|
||||
```
|
||||
|
||||
### 全局选项
|
||||
|
||||
不匹配的 glob 被删除
|
||||
|
||||
```bash
|
||||
# 不匹配的 glob 被删除
|
||||
# ('*.foo' => '')
|
||||
shopt -s nullglob
|
||||
shopt -s nullglob # ('*.foo' => '')
|
||||
```
|
||||
|
||||
# 不匹配的 glob 抛出错误
|
||||
不匹配的 glob 抛出错误
|
||||
|
||||
```bash
|
||||
shopt -s failglob
|
||||
```
|
||||
|
||||
# 不区分大小写的球体
|
||||
不区分大小写的球体
|
||||
|
||||
```bash
|
||||
shopt -s nocaseglob
|
||||
```
|
||||
|
||||
# 通配符匹配点文件
|
||||
# ("*.sh" => ".foo.sh")
|
||||
shopt -s dotglob
|
||||
通配符匹配点文件
|
||||
|
||||
# 允许 ** 进行递归匹配
|
||||
# ('lib/**/*.rb' => 'lib/a/b/c.rb')
|
||||
shopt -s globstar
|
||||
```bash
|
||||
shopt -s dotglob # ("*.sh" => ".foo.sh")
|
||||
```
|
||||
|
||||
允许 ** 进行递归匹配
|
||||
|
||||
```bash
|
||||
shopt -s globstar # ('lib/**/*.rb' => 'lib/a/b/c.rb')
|
||||
```
|
||||
|
||||
Bash 历史
|
||||
@ -682,8 +710,9 @@ Bash 历史
|
||||
命令 | 描述
|
||||
:- | -
|
||||
`history` | 显示历史
|
||||
`sudo !!` | 使用 sudo 运行上一个命令
|
||||
`sudo !!` | 使用 `sudo` 运行上一个命令
|
||||
`shopt -s histverify` | 不要立即执行扩展结果
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
### 表达式
|
||||
|
||||
@ -694,6 +723,7 @@ Bash 历史
|
||||
`!-n` | 展开第 `n` 个最近的命令
|
||||
`!n` | 展开历史中的第 `n` 个命令
|
||||
`!<command>` | 展开最近调用的命令 `<command>`
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
### 操作
|
||||
|
||||
@ -704,6 +734,7 @@ Bash 历史
|
||||
`!!:gs/<FROM>/<TO>/` | 在最近的命令中将所有出现的 `<FROM>` 替换为 `<TO>`
|
||||
`!$:t` | 仅从最近命令的最后一个参数扩展基本名称
|
||||
`!$:h` | 仅从最近命令的最后一个参数展开目录
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
`!!` 和 `!$` 可以替换为任何有效的扩展。
|
||||
|
||||
@ -716,34 +747,35 @@ Bash 历史
|
||||
`!$` | 从最近的命令中展开最后一个标记
|
||||
`!!:n-m` | 从最近的命令扩展令牌范围
|
||||
`!!:n-$` | 从最近的命令中将第 `n` 个标记展开到最后
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
`!!` 可以替换为任何有效的扩展,即 `!cat`、`!-2`、`!42` 等。
|
||||
|
||||
杂项
|
||||
-------------
|
||||
---
|
||||
|
||||
### 数值计算
|
||||
|
||||
```bash
|
||||
$((a + 200)) # Add 200 to $a
|
||||
$((a + 200)) # $a 加 200
|
||||
```
|
||||
|
||||
```bash
|
||||
$(($RANDOM%200)) # Random number 0..199
|
||||
$(($RANDOM%200)) # 随机数 0..199
|
||||
```
|
||||
|
||||
### 子 shell
|
||||
|
||||
```bash
|
||||
(cd somedir; echo "I'm now in $PWD")
|
||||
pwd # still in first directory
|
||||
pwd # 仍然在第一个目录
|
||||
```
|
||||
|
||||
### 检查命令
|
||||
|
||||
```bash
|
||||
command -V cd
|
||||
#=> "cd is a function/alias/whatever"
|
||||
#=> "cd 是一个函数/别名/其他"
|
||||
```
|
||||
|
||||
### 重定向
|
||||
@ -837,7 +869,6 @@ if [[ "$1" == '--' ]]; then shift; fi
|
||||
```
|
||||
|
||||
### 检查命令的结果
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
```bash
|
||||
if ping -c 1 google.com; then
|
||||
@ -845,6 +876,73 @@ if ping -c 1 google.com; then
|
||||
fi
|
||||
```
|
||||
|
||||
### grep 检查
|
||||
|
||||
```bash
|
||||
if grep -q 'foo' ~/.bash_history; then
|
||||
echo "您过去似乎输入过“foo”"
|
||||
fi
|
||||
```
|
||||
|
||||
### 写入文件
|
||||
<!--rehype:wrap-class=row-span-6-->
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`cat` | 用于显示文本文件内容,全部输出
|
||||
`EOF` | `end of file`,表示文本结束符
|
||||
|
||||
---
|
||||
|
||||
```bash
|
||||
cat > output.txt <<EOF
|
||||
this is test eof
|
||||
this is test eof2
|
||||
EOF
|
||||
```
|
||||
|
||||
输出 `cat output.txt`
|
||||
|
||||
```
|
||||
this is test eof
|
||||
this is test eof2
|
||||
```
|
||||
|
||||
追加内容
|
||||
|
||||
```bash
|
||||
cat >>2.txt <<EOF
|
||||
456
|
||||
789
|
||||
EOF
|
||||
```
|
||||
|
||||
`$` 等特殊字符时,须利用转义字符 `\`
|
||||
|
||||
```bash
|
||||
cat > file <<EOF
|
||||
export ORACLE_SID=yqpt
|
||||
export PATH=\$PATH:\$ORACLE_HOME/bin
|
||||
EOF
|
||||
```
|
||||
|
||||
取消变量替换,`EOF` 被加上双引号或者单引号,即可取消变量的替换
|
||||
|
||||
```bash
|
||||
cat << "EOF" > output.sh
|
||||
echo "This is output"
|
||||
echo $1
|
||||
EOF
|
||||
```
|
||||
|
||||
所有TAB键将全部忽略[不能是空格]
|
||||
|
||||
```bash
|
||||
cat << -EOF
|
||||
echo "This is output"
|
||||
EOF
|
||||
```
|
||||
|
||||
### 特殊变量
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
@ -857,15 +955,6 @@ fi
|
||||
|
||||
见[特殊参数](http://wiki.bash-hackers.org/syntax/shellvars#special_parameters_and_shell_variables)。
|
||||
|
||||
### grep 检查
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
```bash
|
||||
if grep -q 'foo' ~/.bash_history; then
|
||||
echo "您过去似乎输入过“foo”"
|
||||
fi
|
||||
```
|
||||
|
||||
### 反斜杠转义
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
@ -953,6 +1042,25 @@ echo "${args[@]}"
|
||||
|
||||
将参数放入数组中,然后追加
|
||||
|
||||
### 调试模式
|
||||
|
||||
启用调试模式,会把脚本中的每条命令的执行情况打印出来。它可以在整个会话或脚本上运行,也可以在脚本内以编程方式启用。
|
||||
|
||||
以调试模式运行脚本(整个脚本都会打印调试信息):
|
||||
|
||||
```bash
|
||||
$ bash -x myscript.sh
|
||||
```
|
||||
|
||||
在 bash 脚本中打开调试(针对部分内容打印调试信息)
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
set -x # Enable debugging
|
||||
# some code here
|
||||
set +x # Disable debugging output.
|
||||
```
|
||||
|
||||
Bash 颜色
|
||||
----
|
||||
|
||||
@ -961,10 +1069,6 @@ Bash 颜色
|
||||
|
||||
您可以通过为其输出着色来使您的 BASH 脚本更漂亮,使用以下模板编写彩色文本:
|
||||
|
||||
```bash
|
||||
echo -e "\e[COLORm文字变色了\e[0m"
|
||||
```
|
||||
|
||||
#### 示例
|
||||
|
||||
```bash
|
||||
@ -1022,35 +1126,36 @@ m # 设置图形模式
|
||||
`5` | 缓慢闪烁
|
||||
`6` | 快速闪烁
|
||||
`7` | 反显
|
||||
`8` | 隐藏 | 未广泛支持。
|
||||
`8` | 隐藏 | 未广泛支持
|
||||
`9` | 划除
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
### ANSI — 颜色转义码
|
||||
|
||||
颜色 | 前景色 | 背景色 | 示例
|
||||
:- | -- | -- | --
|
||||
`Black` 黑色 | 30 | 40 | ``<!--rehype:style=background:#000;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Red` 红色 | 31 | 41 | ``<!--rehype:style=background:#c23621;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Green` 绿色 | 32 | 42 | ``<!--rehype:style=background:#25bc26;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Yellow` 黄色 | 33 | 43 | ``<!--rehype:style=background:#cdcd00;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Blue` 蓝色 | 34 | 44 | ``<!--rehype:style=background:#0000ee;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Purple` 紫色 | 35 | 45 | ``<!--rehype:style=background:#cd00cd;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Cyan` 青色 | 36 | 46 | ``<!--rehype:style=background:#00AAAA;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`White` 白色 | 37 | 47 | ``<!--rehype:style=background:#e5e5e5;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
颜色 | 名称 | 前景色 | 背景色 | 示例
|
||||
:- | --| -- | -- | --
|
||||
`Black` | 黑色 | 30 | 40 | `黑`<!--rehype:style=background:#000;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Red` | 红色 | 31 | 41 | `红`<!--rehype:style=background:#c23621;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Green` | 绿色 | 32 | 42 | `绿`<!--rehype:style=background:#25bc26;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Yellow` | 黄色 | 33 | 43 | `黄`<!--rehype:style=background:#cdcd00;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Blue` | 蓝色 | 34 | 44 | `蓝`<!--rehype:style=background:#0000ee;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Purple` | 紫色 | 35 | 45 | `紫`<!--rehype:style=background:#cd00cd;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Cyan` | 青色 | 36 | 46 | `青`<!--rehype:style=background:#00AAAA;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`White` | 白色 | 37 | 47 | `白`<!--rehype:style=background:#e5e5e5;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
<!--rehype:className=show-header left-align-->
|
||||
|
||||
### ANSI — 颜色转义码(亮色)
|
||||
|
||||
颜色 | 前景色 | 背景色 | 示例
|
||||
颜色 | 前色 | 背色 | 示例
|
||||
:- | -- | -- | --
|
||||
`Bright Black(Gray)` 灰色 | 90 | 100 | ``<!--rehype:style=background:#555555;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Red` 亮红色 | 91 | 101 | ``<!--rehype:style=background:#FF5555;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Green` 亮绿色 | 92 | 102 | ``<!--rehype:style=background:#55FF55;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Yellow` 亮黄色 | 93 | 103 | ``<!--rehype:style=background:#FFFF55;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Blue` 亮蓝色 | 94 | 104 | ``<!--rehype:style=background:#5555FF;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Magenta` 亮紫色 | 95 | 105 | ``<!--rehype:style=background:#FF55FF;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Cyan` 亮青色 | 96 | 106 | ``<!--rehype:style=background:#55FFFF;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright White` 浅灰 | 97 | 107 | ``<!--rehype:style=background:#ffffff;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`BrightBlack(Gray)` 灰色 | 90 | 100 | `90`<!--rehype:style=background:#555555;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Red` 亮红色 | 91 | 101 | `91`<!--rehype:style=background:#FF5555;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Green` 亮绿色 | 92 | 102 | `92`<!--rehype:style=background:#55FF55;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Yellow` 亮黄色 | 93 | 103 | `93`<!--rehype:style=background:#FFFF55;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Blue` 亮蓝色 | 94 | 104 | `94`<!--rehype:style=background:#5555FF;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Magenta` 亮紫色 | 95 | 105 | `95`<!--rehype:style=background:#FF55FF;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright Cyan` 亮青色 | 96 | 106 | `96`<!--rehype:style=background:#55FFFF;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
`Bright White` 浅灰 | 97 | 107 | `97`<!--rehype:style=background:#ffffff;padding:0.2rem 1.2rem;border: 1px solid #333;-->
|
||||
<!--rehype:className=show-header left-align-->
|
||||
|
||||
### 可用功能
|
||||
@ -1077,6 +1182,7 @@ m # 设置图形模式
|
||||
`6n` | DSR – 设备状态报告 | 以 `ESC[n;mR` (就像在键盘上输入)向应用程序报告光标位置(CPR),其中 `n`是行, `m` 是列
|
||||
`s` | SCP – 保存光标位置 | 保存光标的当前位置
|
||||
`u` | RCP – 恢复光标位置 | 恢复保存的光标位置
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
另见
|
||||
----
|
||||
|
263
docs/blender.md
Normal file
@ -0,0 +1,263 @@
|
||||
Blender 键盘快捷键
|
||||
===
|
||||
|
||||
Blender 中 187 个键盘快捷键的视觉备忘单
|
||||
|
||||
键盘快捷键
|
||||
---------
|
||||
<!--rehype:body-class=cols-2-->
|
||||
|
||||
### 普遍的
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Esc` | 取消 Blender 功能而不做任何更改
|
||||
`Space` | 打开工具箱
|
||||
`Tab` | 启动或退出编辑模式
|
||||
`F1` | 加载 Blender 文件,将窗口更改为文件窗口
|
||||
`Shift` `F1` | 附加其他文件中的部分,或作为库数据加载
|
||||
`F2` | 写入 Blender 文件,将窗口更改为文件窗口
|
||||
`Shift` `F2` | 将场景导出为 DXF 文件
|
||||
`Ctrl` `F2` | 将场景导出为 VRML1 文件
|
||||
`F3` | 如果图片已渲染,并且文件格式如显示按钮中所示,则写入图片
|
||||
`Ctrl` `F3` | 保存活动窗口的屏幕转储
|
||||
`Ctrl` `Shift` `F3` | 保存整个 Blender 屏幕的屏幕转储
|
||||
`F4` | 显示逻辑上下文
|
||||
`F5` | 显示着色上下文、灯光、材质或世界子上下文
|
||||
`F6` | 显示着色上下文和纹理子上下文
|
||||
`F7` | 显示对象上下文
|
||||
`F8` | 显示着色上下文和世界子上下文
|
||||
`F9` | 显示编辑上下文
|
||||
`F10` | 显示场景上下文
|
||||
`F11` | 隐藏或显示渲染窗口
|
||||
`F12` | 从活动相机开始渲染
|
||||
`Left` | 转到上一帧
|
||||
`Shift` `Left` | 转到第一帧
|
||||
`Right` | 转到下一帧
|
||||
`Shift` `Right` | 转到最后一帧
|
||||
`Up` | 前进 10 帧
|
||||
`Down` | 后退 10 帧
|
||||
`Alt` `A` | 将当前Blender窗口更改为动画播放模式,光标变为计数器
|
||||
`Alt` `Shift` `A` | 将当前窗口和所有3D窗口更改为动画播放模式
|
||||
`I` | 插入按键菜单,该菜单因窗口而异
|
||||
`J` | 切换渲染缓冲区
|
||||
`Ctrl` `O` | 打开上次保存的文件
|
||||
`Q` | 退出搅拌机
|
||||
`Ctrl` `Alt` `T` | 计时器菜单,此菜单提供有关绘图速度的信息的访问
|
||||
`Ctrl` `U` | 保存用户默认值,当前项目设置将写入默认文件,每次启动时都会加载该文件Blender
|
||||
`Ctrl` `W` | 写入文件而不打开文件窗口
|
||||
`Alt` `W` | 写入视频景观文件
|
||||
`Ctrl` `X` | 擦除除渲染缓冲区之外的所有内容,重新加载默认场景
|
||||
`Ctrl` `Y` | 重做
|
||||
`Ctrl` `Z` | 撤消
|
||||
`Ctrl` `Shift` `Z` | 重做
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 对象模式
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Home` | 可见层中的所有对象均完整显示,位于窗口中央
|
||||
`PgUp` | 选择下一个对象键,如果选择了多个对象键,则选择循环向上移动
|
||||
`Shift` `PgUp` | 将下一个对象键添加到选择中
|
||||
`PgDn` | 选择上一个对象键,如果选择了多个对象键,则选择循环向上移动
|
||||
`Shift` `PgDn` | 将前一个对象键添加到选择中
|
||||
<code>\`</code> | 选择所有图层
|
||||
`Shift` <code>\`</code> | 恢复到上一层设置
|
||||
`Tab` | 启动或停止编辑模式
|
||||
`A` | 选择或取消选择全部
|
||||
`Ctrl` `A` | 应用尺寸和旋转
|
||||
`Ctrl` `Shift` `A` | 如果活动对象被自动复制,则会弹出一个用于实际创建对象的菜单
|
||||
`Shift` `A` | 调出添加菜单,以 ADD 开头的工具箱项目
|
||||
`B` | 边框选择,用鼠标左键画一个矩形来选择对象
|
||||
`Shift` `B` | 渲染边框,仅适用于相机视图模式
|
||||
`C` | 中心视图,3D光标的位置成为3D窗口的新中心
|
||||
`Alt` `C` | 转换菜单,根据活动对象显示弹出菜单,使您可以转换某些类型的 ObData
|
||||
`Ctrl` `C` | 复制菜单,此菜单将信息从活动对象复制到选定对象
|
||||
`Shift` `C` | 中心零视图,3D 光标设置为零并更改视图,以便可以显示所有对象
|
||||
`D` | 显示绘图模式菜单
|
||||
`Shift` `D` | 添加重复项,所选对象被重复
|
||||
`Alt` `D` | 添加链接副本,创建所选对象的链接副本
|
||||
`Ctrl` `D` | 将纹理图像绘制为线
|
||||
`Alt` `E` | 启动或停止编辑模式
|
||||
`F` | 如果所选对象是混搭,则打开或关闭面选择模式
|
||||
`Ctrl` `F` | 对面进行排序,活动网格对象的面根据 3D 窗口中的当前视图进行排序
|
||||
`G` | 抓取模式或翻译模式
|
||||
`Alt` `G` | 清除以抓取模式给出的翻译
|
||||
`Shift` `G` | 团体选拔
|
||||
`I` | 插入对象关键点,在当前帧所有选定对象中插入一个关键位置
|
||||
`Ctrl` `J` | 连接对象,所有选定的相同类型的对象都添加到活动对象中
|
||||
`K` | 显示关键点,为所有选定对象打开绘制关键点选项
|
||||
`Shift` `K` | 显示用于显示和选择所有键的弹出菜单
|
||||
`L` | 使所选对象成为本地对象,使库链接对象成为当前场景的本地对象
|
||||
`Ctrl` `L` | 链接选定对象,将一些活动对象数据链接到所有选定对象
|
||||
`Shift` `L` | 选择链接,选择以某种方式链接到活动对象的所有对象
|
||||
`M` | 将选定的对象移动到另一层
|
||||
`Ctrl` `M` | 镜像菜单,可以沿 X、Y 或 Z 轴镜像对象
|
||||
`N` | 数字面板,显示活动对象的位置、旋转、缩放比例并可修改
|
||||
`Alt` `O` | 清除原点,所有子对象的原点都被删除,这导致它们移动到父对象的确切位置objects
|
||||
`Shift` `O` | 如果选定的对象是网格,则打开或关闭 subsurf
|
||||
`Ctrl` `P` | 使选定对象成为活动对象的子对象
|
||||
`Alt` `P` | 清除父级关系,询问用户是否希望保留或清除父级引发的转换
|
||||
`R` | 旋转模式,适用于选定的对象
|
||||
`Alt` `R` | 清除旋转,将选定对象的 X、Y 和 Z 旋转设置为零
|
||||
`S` | 大小模式或缩放模式,适用于选定的对象
|
||||
`Alt` `S` | 清除大小,将选定对象的 X、Y、Z 尺寸设置为 1
|
||||
`Shift` `S` | 打开快照菜单
|
||||
`T` | 纹理空间模式,可以以相同的方式更改所选对象的纹理空间维度的位置for grab and size mode
|
||||
`Ctrl` `T` | 使选定的对象跟踪活动对象
|
||||
`Alt` `T` | 清除旧样式轨道,约束轨道被删除,因为所有约束都被删除
|
||||
`U` | 使对象成为单用户,链接的逆操作
|
||||
`V` | 切换进入和退出顶点绘制模式
|
||||
`Alt` `V` | 对象图像方面,此热键设置所选对象相对于对象尺寸的 X 和 Y 尺寸image texture they have
|
||||
`W` | 打开对象布尔菜单
|
||||
`X` | 删除选定的对象
|
||||
`Z` | 打开或关闭固体模式
|
||||
`Shift` `Z` | 打开或关闭着色模式
|
||||
`Alt` `Z` | 打开或关闭纹理模式
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 编辑模式 - 常规
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Tab` | 启动或停止编辑模式
|
||||
`Alt` `E` | 启动或停止编辑模式(替代)
|
||||
`Ctrl` `Tab` | 在顶点选择、边选择和面选择模式之间切换
|
||||
`A` | 全选或取消全选
|
||||
`B` `B` | 圆圈选择
|
||||
`Ctrl` `H` | 选择顶点后,这将创建一个钩子对象
|
||||
`N` | 数字面板,比对象模式一简单
|
||||
`O` | 切换成比例编辑和退出成比例编辑
|
||||
`Shift` `O` | 在平滑和锐利比例编辑之间切换
|
||||
`P` | 分开,您可以选择用所有选定的顶点、边、面和曲线来制作一个新对象
|
||||
`Ctrl` `P` | 使顶点成为父级
|
||||
`Ctrl` `S` | 剪切,在编辑模式下此操作使您可以使选定的形状倾斜
|
||||
`U` | 撤消
|
||||
`W` | 显示特价弹出菜单
|
||||
`Shift` `W` | 扭曲,使用此选项可以将选定的顶点弯曲成曲线
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 编辑模式 - 网格
|
||||
<!--rehype:wrap-class=row-span-3-->
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Ctrl` `+` | 将通过边连接到已选定顶点的所有顶点添加到选择中
|
||||
`Ctrl` `-` | 从选择中删除选定顶点外环的所有顶点
|
||||
`C` | 如果使用曲线变形,则打开或关闭曲线循环模式
|
||||
`E` | 挤出选定的
|
||||
`Shift` `E` | 折痕海面边缘
|
||||
`Ctrl` `E` | 标记 LSCM 接缝
|
||||
`F` | 制作边缘或面
|
||||
`Shift` `F` | 填充选定,所有选定的由边包围并形成闭合多边形的顶点都用三角形面填充
|
||||
`Alt` `F` | 美容填充,所有选定的三角形面的边缘都会交换,从而形成相同大小的面
|
||||
`Ctrl` `F` | 翻转面,将选定的三角形面配对并交换每对的公共边
|
||||
`H` | 隐藏选定,隐藏所有选定的顶点和面
|
||||
`Shift` `H` | 隐藏未选中,隐藏所有未选中的顶点和面
|
||||
`Alt` `H` | Reveal,所有隐藏的顶点和面都重新绘制
|
||||
`Alt` `J` | 连接面,选定的三角形面成对连接并转换为四边形
|
||||
`K` | 刀工具菜单
|
||||
`L` | 选择链接
|
||||
`Shift` `L` | 取消选择链接
|
||||
`Ctrl` `L` | 选择链接的选定内容
|
||||
`M` | 镜像,打开一个弹出窗口,询问要镜像的轴
|
||||
`Alt` `M` | 根据弹出窗口中的选择将选定的顶点合并为重心或光标处
|
||||
`Ctrl` `N` | 计算外部法线
|
||||
`Ctrl` `Shift` `N` | 计算内部法线
|
||||
`Alt` `S` | 沿其局部法线方向缩放每个顶点
|
||||
`Ctrl` `T` | 制作三角形,所有选定的面都转换为三角形
|
||||
`U` | 撤消
|
||||
`Shift` `U` | 重做
|
||||
`Alt` `U` | 撤消菜单
|
||||
`W` | 特别菜单
|
||||
`X` | 删除所选内容
|
||||
`Y` | 分割,此命令分割网格的选定部分而不删除面
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 编辑模式 - 曲线
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`C` | 将选定的曲线设置为循环或关闭循环
|
||||
`E` | 挤出曲线
|
||||
`F` | 添加线段,在两条曲线末端的两个选定顶点之间添加一条线段
|
||||
`H` | 切换手柄对齐或自由
|
||||
`Shift` `H` | 将句柄设置为自动
|
||||
`Ctrl` `H` | 计算句柄
|
||||
`L` | 选择链接
|
||||
`Shift` `L` | 取消选择链接
|
||||
`M` | 与网格中的顶点完全相同地镜像选定的控制点
|
||||
`T` | 倾斜模式,为 3D 曲线中的每个顶点指定额外的轴旋转
|
||||
`Alt` `T` | 清晰的倾斜
|
||||
`V` | 矢量手柄
|
||||
`W` | 出现曲线专用菜单
|
||||
`X` | 删除所选内容
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 编辑模式 - 曲面
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`C` | 切换循环菜单
|
||||
`E` | 挤出选定的
|
||||
`F` | 添加线段,在两条曲线末端的两个选定顶点之间添加一条线段
|
||||
`L` | 选择链接
|
||||
`Shift` `L` | 取消选择链接
|
||||
`M` | 与网格中的顶点完全相同地镜像选定的控制点
|
||||
`Shift` `R` | 选择行,从最后一个选定的顶点开始
|
||||
`W` | 出现曲面的特殊菜单
|
||||
`X` | 删除所选内容
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 编辑模式 - 字体
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Right` | 将文本光标向前移动一位
|
||||
`Shift` `Right` | 将文本光标移至行尾
|
||||
`Left` | 将文本光标向后移动一位
|
||||
`Shift` `Left` | 将文本光标移至行首
|
||||
`Down` | 将文本光标向前移动一行
|
||||
`Shift` `Down` | 将文本光标移动到文本末尾
|
||||
`Up` | 将文本光标向后移动一行
|
||||
`Shift` `Up` | 将文本光标移动到文本开头
|
||||
`Alt` `U` | 重新加载原始数据
|
||||
`Alt` `V` | 粘贴文本
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 脸部选择
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Tab` | 切换到编辑模式
|
||||
`F` | 选择多个共面的面后,只要它们保持共面,这会将它们合并为一个 FGon
|
||||
`L` | 选择链接的 UV
|
||||
`R` | 调用允许旋转 UV 坐标或顶点列的菜单
|
||||
`U` | 调用 UV 计算菜单
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 顶点绘制
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`Shift` `K` | 所有顶点颜色都被删除,它们更改为当前绘制颜色
|
||||
`U` | 撤消,按两次重做撤消的操作
|
||||
`W` | 共享顶点调用,共享顶点的所有面的颜色被混合
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 紫外线编辑器
|
||||
|
||||
快捷键 | 说明
|
||||
---|---
|
||||
`E` | LSCM 展开,在 UV 编辑器中可见的面上启动
|
||||
`P` | 固定选定的顶点,当执行 LSCM 展开时,它们将保留在 UV 编辑器上的适当位置
|
||||
`Alt` `P` | 取消固定选定的顶点
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
Also see
|
||||
--------
|
||||
|
||||
- [Keyboard shortcuts for Blender](https://download.blender.org/documentation/BlenderHotkeyReference.pdf) _(download.blender.org)_
|
22
docs/c.md
@ -18,13 +18,13 @@ int main() {
|
||||
}
|
||||
```
|
||||
|
||||
使用 `gcc` 编译 `hello.c` 文件
|
||||
使用 `gcc` 编译 `hello.c` 源文件
|
||||
|
||||
```bash
|
||||
$ gcc -o hello hello.c
|
||||
```
|
||||
|
||||
运行编译后的二进制文件(`hello`)
|
||||
运行编译后的二进制文件可执行文件(`hello`)
|
||||
|
||||
```bash
|
||||
$ ./hello
|
||||
@ -37,7 +37,10 @@ $ ./hello
|
||||
```c
|
||||
int myNum = 15;
|
||||
|
||||
int myNum2; // 不赋值,然后再赋值
|
||||
int myNum2; // 声明变量 myNum2
|
||||
// 变量声明后第一次赋值我们称为初始化
|
||||
// 如果 初始化 和 赋值 在同一行
|
||||
// 那么我们可以直接称为 定义变量 myNum2
|
||||
myNum2 = 15;
|
||||
|
||||
int myNum3 = 15; // myNum3 值为 15
|
||||
@ -55,6 +58,8 @@ int x = 5, y = 6, z = 50;
|
||||
|
||||
### 常量 Constants
|
||||
|
||||
常量在 C 语言中我们一般理解为不能被改变的值,活用常量与符号常量
|
||||
|
||||
```c
|
||||
const int minutesPerHour = 60;
|
||||
const float PI = 3.14;
|
||||
@ -443,7 +448,7 @@ int* ptr = &myAge; // 名为 ptr 的指针变量,用于存储 myAge
|
||||
|
||||
printf("%d\n", myAge); // 输出 myAge (43) 的值
|
||||
|
||||
printf("%p\n", \&myAge); // 输出 myAge 的内存地址(0x7ffe5367e044)
|
||||
printf("%p\n", &myAge); // 输出 myAge 的内存地址(0x7ffe5367e044)
|
||||
|
||||
printf("%p\n", ptr); // 用指针(0x7ffe5367e044)输出myAge的内存地址
|
||||
```
|
||||
@ -747,7 +752,8 @@ Carole 和 Debra: 我们爱你!
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
#define tokenpaster(n) printf ("token" #n " = %d", token##n)
|
||||
#define tokenpaster(n) \
|
||||
printf ("token" #n " = %d", token##n)
|
||||
|
||||
int main(void){
|
||||
int token34 = 40;
|
||||
@ -766,7 +772,8 @@ int main(void){
|
||||
#endif
|
||||
|
||||
int main(void) {
|
||||
printf("Here is the message: %s\n", MESSAGE);
|
||||
printf("信息如下: %s\n", \
|
||||
MESSAGE);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
@ -792,7 +799,8 @@ int square(int x) {
|
||||
#define MAX(x,y) ((x) > (y) ? (x) : (y))
|
||||
|
||||
int main(void) {
|
||||
printf("Max between 20 and 10 is %d\n", MAX(10, 20));
|
||||
printf("20 到 10 之间的最大值是 %d\n", \
|
||||
MAX(10, 20));
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
149
docs/chown.md
Normal file
@ -0,0 +1,149 @@
|
||||
Chown 备忘清单
|
||||
===
|
||||
|
||||
这份快速参考备忘单提供了改变文件或目录的所有者的简要概述,以及 chown 命令的操作
|
||||
|
||||
入门
|
||||
--------
|
||||
|
||||
### 介绍
|
||||
|
||||
Linux/Unix 系统中的一个命令,全称为 `change owner`,用于改变文件或目录的所有者
|
||||
|
||||
```shell
|
||||
chown [选项] [所有者][:[组]] 文件或目录名
|
||||
```
|
||||
|
||||
命令可以更改某个文件或目录的属主(owner),也可以同时更改其属组(group)
|
||||
|
||||
#### 示例
|
||||
|
||||
```shell
|
||||
$ chown :groupname file1.txt
|
||||
$ chown -R username:groupname *
|
||||
$ chown $USER file.txt
|
||||
```
|
||||
|
||||
`注意` 只有超级用户(root)才有权限改变文件或目录的所有者
|
||||
|
||||
### 选项
|
||||
|
||||
- `-c` : 显示更改的部分的信息
|
||||
- `-f` : 忽略错误信息
|
||||
- `-h` :修复符号链接
|
||||
- `-v` : 显示详细的处理信息
|
||||
- `-R` : 处理指定目录以及其子目录下的所有文件
|
||||
- `--help` : 显示辅助说明
|
||||
- `--version` : 显示版本
|
||||
|
||||
示例
|
||||
--------
|
||||
|
||||
### 更改文件所有者
|
||||
|
||||
```shell
|
||||
$ chown root /var/run/httpd.pid
|
||||
```
|
||||
|
||||
把 `/var/run/httpd.pid` 的所有者设为 `root`
|
||||
|
||||
#### 仅更改所有者
|
||||
|
||||
```bash
|
||||
$ chown new_owner file.txt
|
||||
```
|
||||
|
||||
### 递归更改目录及其内容的所有者
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```shell
|
||||
chown -R new_owner:new_group directory/
|
||||
```
|
||||
|
||||
将文件夹 `directory` 的拥有者设为 `new_owner` ,群体的使用者设为 `new_group`
|
||||
|
||||
```shell
|
||||
$ chown username:groupname file1.txt
|
||||
```
|
||||
|
||||
将文件 file1.txt 的拥有者设为 `username` ,群体的使用者设为 `groupname`
|
||||
|
||||
```shell
|
||||
$ chown -R username:groupname *
|
||||
```
|
||||
|
||||
将当前目录以及子目录的所有文件的拥有者设为 `username` ,群体的使用者设为 `groupname`
|
||||
|
||||
### 更改所有者为当前用户
|
||||
|
||||
```bash
|
||||
$ chown $USER file.txt
|
||||
```
|
||||
|
||||
递归更改目录及其内容的所有者为当前用户
|
||||
|
||||
```bash
|
||||
sudo chown -R $USER directory/
|
||||
```
|
||||
|
||||
### 递归并且不显示错误信息
|
||||
|
||||
```bash
|
||||
chown -R -f new_owner:new_group directory/
|
||||
```
|
||||
|
||||
更改目录及其内容的所有者和组为 `alice`
|
||||
|
||||
```bash
|
||||
chown -R alice: directory/
|
||||
```
|
||||
|
||||
### 仅更改组
|
||||
|
||||
```shell
|
||||
$ chown :groupname file1.txt
|
||||
```
|
||||
|
||||
不修改文件 `file1.txt` 的拥有者,将文件使用群体改为 `groupname`
|
||||
|
||||
### 变更符号链接的所有者
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```bash
|
||||
$ chown -h new_owner:new_group symlink
|
||||
```
|
||||
|
||||
变更符号链接的所有者而不是链接指向的文件
|
||||
|
||||
```bash
|
||||
$ chown -h manager symlink
|
||||
```
|
||||
|
||||
更改符号链接的所有者为"manager"
|
||||
|
||||
### 更改所有者为根用户
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```bash
|
||||
sudo chown root:root file.txt
|
||||
```
|
||||
|
||||
#### 递归更改所有者为当前用户
|
||||
|
||||
```bash
|
||||
sudo chown -R $USER directory/
|
||||
# 更改目录及其内容的所有者和组为"alice":
|
||||
chown -R alice: directory/
|
||||
```
|
||||
|
||||
### 将文件所有者更改为其他用户,但保留组
|
||||
|
||||
```bash
|
||||
chown new_owner file.txt
|
||||
```
|
||||
|
||||
### 将文件所有者更改为其他用户,同时更改组
|
||||
|
||||
```bash
|
||||
chown new_owner:new_group file.txt
|
||||
```
|
@ -11,6 +11,8 @@ CocoaPods 备忘清单
|
||||
|
||||
```bash
|
||||
$ sudo gem install cocoapods
|
||||
# OR
|
||||
$ brew install cocoapods
|
||||
```
|
||||
|
||||
无 Sudo 安装,不想为此过程授予 `RubyGems` 管理员权限
|
||||
|
123
docs/conda.md
Normal file
@ -0,0 +1,123 @@
|
||||
Conda备忘清单
|
||||
===
|
||||
|
||||
这是开始使用 `conda` 命令的快速参考备忘单,初次学习可参考[这里](https://anaconda.org.cn/anaconda/user-guide/getting-started/#open-nav-win)
|
||||
|
||||
入门
|
||||
-----
|
||||
<!--rehype:body-class=cols-1-->
|
||||
|
||||
### 常用基础命令
|
||||
|
||||
命令 | 说明
|
||||
:-- | --
|
||||
`conda info` | 查看 conda 的一系列基本信息(版本、源、路径等)
|
||||
`conda update -n base conda` | 在base环境中更新conda
|
||||
`conda install anconda=2022.05` | 安装最新的anaconda发行版(见[发行说明](https://docs.anaconda.com/navigator/release-notes/?utm_source=cheatsheet))
|
||||
`conda create --name <ENVNAME>` | 创建一个新的环境
|
||||
`conda activate <ENVNAME>` | 激活/切换/选择一个环境
|
||||
`conda env list 或者 conda info -e` | 列出所有的环境和位置看
|
||||
`conda list -n <ENVNAME> --show-channel-urls` | 列出某个环境所有包和包的下载源路径
|
||||
`conda install -n <ENVNAME> <PKG1> <PKG2>` | 在某个环境中安装包
|
||||
`conda uninstall <PKGNAME包名> -n <ENVNAME环境名>` | 从某个环境删除某个包
|
||||
`conda update --all -n <ENVNAME环境名>` | 升级某个环境的所有包
|
||||
<!--rehype:className=show-header-->
|
||||
|
||||
环境与包管理
|
||||
-----
|
||||
|
||||
### 包与源管理
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
> 在使用 `conda` 时,包依赖关系和平台细节会**自动解决**
|
||||
|
||||
查看命令均可搭配 `grep` 命令使用,例如:
|
||||
|
||||
```bash
|
||||
conda list | grep torch #列出所有包含torch的包
|
||||
```
|
||||
|
||||
Command | Description
|
||||
:-- | --
|
||||
`conda list` | 列出所有安装的包
|
||||
`conda list --show-channel-urls` |列出包含源信息的已安装包
|
||||
`conda update --all` | 更新所有包
|
||||
`conda install -c <CHANNELNAME源地址> <PKG1包> <PKG2>` | 从特定源(如清华源、阿里源)安装包
|
||||
`conda install PKGNAME=3.1.4` | 安装指定版本的包
|
||||
`conda install "PKGNAME>2.5,<3.2"` | 使用AND逻辑安装包
|
||||
`conda install "<PKGNAME> [version='2.5\|3.2']"` |
|
||||
`conda uninstall <PKGNAME>` | 卸载包
|
||||
`conda config --show-sources` | 查看源地址(位置越靠上,搜索的时候越优先)
|
||||
`conda config --add channels <CHANNELNAME>` | 添加conda的源地址
|
||||
`conda config --remove channels <CHANNELNAME>`| 移除conda的源地址
|
||||
|
||||
### 更改环境
|
||||
|
||||
Command | Description
|
||||
:-- | --
|
||||
`conda create -n <ENVNAME> python=3.10` | 指定Python版本创建环境
|
||||
`conda create --clone <ENVNAME> -n <NEWENV>` | 从已有环境克隆一个新环境
|
||||
`conda rename -n <ENVNAME> <NEWENVNAME>` | 对环境名字重命名
|
||||
`conda remove -n <ENVNAME> --all` | 通过名字删除一个环境
|
||||
`conda env remove -n <ENVNAME>` | 通过名字删除一个环境
|
||||
`conda list -n <ENVNAME> --revisions` | 列出环境的各个修订版本
|
||||
`conda install -n <ENVNAME> --revision <NUMBER>"` | 回滚到环境的某个版本本
|
||||
<!--rehype:className=style-list-arrow-->
|
||||
|
||||
关于 `conda` 环境回滚可参考:[这里](https://www.pybloggers.com/2016/06/conda-revisions-letting-you-rollback-to-a-previous-version-of-your-environment/)
|
||||
|
||||
### 导出环境配置
|
||||
<!--rehype:wrap-class=col-span-2 row-span-2-->
|
||||
|
||||
建议将导出文件命名为“environment”,环境名称将被保留
|
||||
|
||||
Command | Description
|
||||
:-- | --
|
||||
`conda env export --from-history>ENV.yml` | 跨平台兼容需(通过这种方式,可以省去所有其他可能是特定于平台的依赖项)
|
||||
`conda env export -n ENVNAME > ENV.yml` | 导出指定环境到yml文件
|
||||
`conda env export > ENV.yml` | 导出当前环境到yml文件
|
||||
`conda list --explicit>ENV.txt` | 导出包信息到当前目录
|
||||
`conda env create -n ENVNAME --file ENV.yml` | 从yml文件导入
|
||||
`conda create -n ENVNAME --file ENV.txt` | 从txt文件导入
|
||||
<!--rehype:className=style-list-arrow-->
|
||||
|
||||
### 另外
|
||||
|
||||
查看命令帮助
|
||||
|
||||
```bash
|
||||
conda <COMMAND> --help
|
||||
conda search <PKGNAME> --info
|
||||
conda clean --all # 清除所有未使用的文件
|
||||
conda config --show # 检查conda配置
|
||||
```
|
||||
|
||||
设置指定环境为默认环境
|
||||
|
||||
```bash
|
||||
vim ~/.bashrc
|
||||
export PATH="~/anaconda/envs/ENVNAME/bin:$PATH" # 文件末尾添加
|
||||
conda activate ENVNAME # :wq 保存并关闭
|
||||
source ~/.bashrc # 更新
|
||||
conda config --set auto_activate_base false # 禁用auto activate base环境
|
||||
```
|
||||
|
||||
### 额外提示
|
||||
|
||||
```bash
|
||||
conda COMMAND --help # 获得任何命令的帮助
|
||||
# 获取任何包裹的信息
|
||||
conda search PKGNAME --info
|
||||
# 运行没有用户提示的命令,例如,安装多个包
|
||||
conda COMMAND ARG --yes
|
||||
conda install PKG1 PKG2 --yes
|
||||
conda clean --all # 删除所有未使用的文件
|
||||
conda config --show # 检查 conda 配置
|
||||
```
|
||||
|
||||
另见
|
||||
----
|
||||
|
||||
- [Anaconda文档](https://anaconda.org.cn/)
|
||||
- [官网命令Cheat sheet](https://conda.io/projects/conda/en/latest/user-guide/cheatsheet.html)
|
||||
- [Conda cheatsheet PDF](https://conda.io/projects/conda/en/latest/_downloads/843d9e0198f2a193a3484886fa28163c/conda-cheatsheet.pdf)
|
517
docs/cpp.md
@ -73,6 +73,11 @@ int a = 5, b = 10;
|
||||
std::swap(a, b);
|
||||
// 输出: a=10, b=5
|
||||
std::cout << "a=" << a << ", b=" << b;
|
||||
|
||||
// 整数交换的奇技淫巧
|
||||
(x ^= y), (y ^= x), (x ^= y);
|
||||
// 注意! 以下操作会造成 undefined behavior
|
||||
x ^= y ^= x ^= y;
|
||||
```
|
||||
|
||||
### 注释
|
||||
@ -502,6 +507,16 @@ for (int i = 0, j = 2; i < 3; i++, j--){
|
||||
// 输出: i=0,j=2;i=1,j=1;i=2,j=0;
|
||||
```
|
||||
|
||||
### auto
|
||||
|
||||
```cpp
|
||||
std:: string s = "hello world";
|
||||
for(auto c: s){
|
||||
std:: cout << c << " ";
|
||||
}
|
||||
// 输出: h e l l o w o r l d
|
||||
```
|
||||
|
||||
C++ 函数
|
||||
------------
|
||||
|
||||
@ -545,6 +560,508 @@ int main() {
|
||||
}
|
||||
```
|
||||
|
||||
### Lambda 表达式
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
Lambda 表达式可以在函数内定义,可以理解为在函数内定义的临时函数。格式:
|
||||
|
||||
```cpp
|
||||
auto func = []() -> return_type { };
|
||||
```
|
||||
|
||||
- `[]`为捕获列表,能够捕获其所在函数的局部变量
|
||||
- 一个空的捕获列表代表Lambda表达式不捕获任何的变量
|
||||
- 对于值捕获,直接在中括号中填写要捕获的变量即可:
|
||||
|
||||
```cpp
|
||||
int val = 5;
|
||||
auto func = [val]() -> return_type { };
|
||||
```
|
||||
|
||||
- 对于引用捕获,需要在捕获的变量前添加`&`:
|
||||
|
||||
```cpp
|
||||
string str("hello world!");
|
||||
auto func = [&str]() -> return_type { };
|
||||
```
|
||||
|
||||
- 如果变量太多,需要编译器根据我们编写的代码自动捕获,可以采用隐式捕获的方式。
|
||||
|
||||
- 全部值捕获:
|
||||
|
||||
```cpp
|
||||
int val1, val2;
|
||||
auto func = [=]() -> int
|
||||
{
|
||||
return val1 + val2;
|
||||
};
|
||||
```
|
||||
|
||||
- 全部引用捕获:
|
||||
|
||||
```cpp
|
||||
string str1("hello"), str2("word!");
|
||||
auto func = [&]() -> string
|
||||
{
|
||||
return str1 + str2;
|
||||
};
|
||||
```
|
||||
|
||||
- 混合隐式捕获:
|
||||
|
||||
如果希望对一部分变量采用值捕获,对其他变量采用引用捕获,可以混合使用:
|
||||
|
||||
```cpp
|
||||
int val1 = 123, val2 = 456;
|
||||
string str1("123"), str2(456);
|
||||
|
||||
auto func1 = [=, &str1]() -> int
|
||||
{
|
||||
return val1 == std::stoi(str1)
|
||||
? val1 : val2;
|
||||
};
|
||||
|
||||
auto func2 = [&, val1]() -> int
|
||||
{
|
||||
return str1 == std::to_string(val1)
|
||||
? str1 : str2;
|
||||
};
|
||||
```
|
||||
|
||||
- `()` 是参数列表,我们只需要按照普通函数的使用方法来使用即可
|
||||
- `return_type` 是函数的返回类型,`-> return_type` 可以不写,编译器会自动推导
|
||||
- `{}` 中的内容就是函数体,依照普通函数的使用方法使用即可
|
||||
<!--rehype:className=style-timeline-->
|
||||
|
||||
此处给出一个 Lambda 表达式的实际使用例子(当然可以使用 `str::copy`):
|
||||
|
||||
```cpp
|
||||
// vec中包含1, 2, 3, 4, 5
|
||||
std::vector<int> vec({1, 2, 3, 4, 5});
|
||||
std::for_each(vec.begin(), vec.end(),
|
||||
[](int& ele) -> void
|
||||
{
|
||||
std::cout << ele
|
||||
<< " ";
|
||||
});
|
||||
```
|
||||
|
||||
## C++多线程
|
||||
|
||||
### 多线程介绍
|
||||
|
||||
g++编译选项:`-std=c++11`。包含头文件:
|
||||
|
||||
- `#include <thread>`:C++多线程库
|
||||
- `#include <mutex>`:C++互斥量库
|
||||
- `#include <future>`:C++异步库
|
||||
|
||||
### 线程的创建
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
以普通函数作为线程入口函数:
|
||||
|
||||
```cpp
|
||||
void entry_1() { }
|
||||
void entry_2(int val) { }
|
||||
|
||||
std::thread my_thread_1(entry_1);
|
||||
std::thread my_thread_2(entry_2, 5);
|
||||
```
|
||||
|
||||
以类对象作为线程入口函数:
|
||||
|
||||
```cpp
|
||||
class Entry
|
||||
{
|
||||
void operator()() { }
|
||||
void entry_function() { }
|
||||
};
|
||||
|
||||
Entry entry;
|
||||
// 调用operator()()
|
||||
std::thread my_thread_1(entry);
|
||||
// 调用Entry::entry_function
|
||||
std::thread my_thread_2(&Entry::entry_function, &entry);
|
||||
```
|
||||
|
||||
以lambda表达式作为线程入口函数:
|
||||
|
||||
```cpp
|
||||
std::thread my_thread([]() -> void
|
||||
{
|
||||
// ...
|
||||
});
|
||||
```
|
||||
|
||||
### 线程的销毁
|
||||
|
||||
```cpp
|
||||
thread my_thread;
|
||||
// 阻塞
|
||||
my_thread.join();
|
||||
// 非阻塞
|
||||
my_thread.detach();
|
||||
```
|
||||
|
||||
### `this_thread`
|
||||
|
||||
```cpp
|
||||
// 获取当前线程ID
|
||||
std::this_thread::get_id();
|
||||
// 使当前线程休眠一段指定时间
|
||||
std::this_thread::sleep_for();
|
||||
// 使当前线程休眠到指定时间
|
||||
std::this_thread::sleep_until();
|
||||
// 暂停当前线程的执行,让别的线程执行
|
||||
std::this_thread::yield();
|
||||
```
|
||||
|
||||
### 锁
|
||||
<!--rehype:wrap-class=row-span-5-->
|
||||
|
||||
> `#include <mutex>`
|
||||
|
||||
#### 锁的基本操作
|
||||
|
||||
创建锁
|
||||
|
||||
```cpp
|
||||
std::mutex m;
|
||||
```
|
||||
|
||||
上锁
|
||||
|
||||
```cpp
|
||||
m.lock();
|
||||
```
|
||||
|
||||
解锁
|
||||
|
||||
```cpp
|
||||
m.unlock();
|
||||
```
|
||||
|
||||
尝试上锁:成功返回`true`,失败返回`false`
|
||||
|
||||
```cpp
|
||||
m.try_lock();
|
||||
```
|
||||
|
||||
解锁
|
||||
|
||||
```cpp
|
||||
m.unlock();
|
||||
```
|
||||
|
||||
#### 更简单的锁 —— `std::lock_guard<Mutex>`
|
||||
|
||||
构造时上锁,析构时解锁
|
||||
|
||||
```cpp
|
||||
std::mutex m;
|
||||
std::lock_guard<std::mutex> lock(m);
|
||||
```
|
||||
|
||||
额外参数:`std::adopt_lock`:只需解锁,无需上锁
|
||||
|
||||
```cpp
|
||||
// 手动上锁
|
||||
m.lock();
|
||||
std::lock_guard<mutex> lock(m,
|
||||
std::adopt_lock);
|
||||
```
|
||||
|
||||
#### `unique_lock<Mutex>`
|
||||
|
||||
构造上锁,析构解锁
|
||||
|
||||
```cpp
|
||||
std::mutex m;
|
||||
std::unique_lock<mutex> lock(m);
|
||||
```
|
||||
|
||||
##### `std::adopt_lock`
|
||||
|
||||
只需解锁,无需上锁
|
||||
|
||||
```cpp
|
||||
// 手动上锁
|
||||
m.lock();
|
||||
std::unique_lock<mutex> lock(m,
|
||||
std::adopt_lock);
|
||||
```
|
||||
|
||||
##### `std::try_to_lock`
|
||||
|
||||
尝试上锁,可以通过`std::unique_lock<Mutex>::owns_lock()`查看状态
|
||||
|
||||
```cpp
|
||||
std::unique_lock<mutex> lock(m,
|
||||
std::try_to_lock);
|
||||
if (lock.owns_lock())
|
||||
{
|
||||
// 拿到了锁
|
||||
}
|
||||
else
|
||||
{
|
||||
// 没有
|
||||
}
|
||||
```
|
||||
|
||||
##### `std::defer_lock`
|
||||
|
||||
绑定锁,但不上锁
|
||||
|
||||
```cpp
|
||||
std::unique_lock<mutex> lock(m,
|
||||
std::defer_lock);
|
||||
lock.lock();
|
||||
lock.unlock();
|
||||
```
|
||||
|
||||
##### `std::unique_lock<Mutex>::release`
|
||||
|
||||
返回所管理的`mutex`对象指针,**释放所有权。**一旦释放了所有权,那么如果原来互斥量处于互斥状态,程序员有责任手动解锁。
|
||||
|
||||
#### `std::call_once`
|
||||
|
||||
当多个线程通过这个函数调用一个可调用对象时,只会有一个线程成功调用。
|
||||
|
||||
```cpp
|
||||
std::once_flag flag;
|
||||
|
||||
void foo() { }
|
||||
|
||||
std::call_once(flag, foo);
|
||||
```
|
||||
|
||||
### `std::condition_variable`
|
||||
|
||||
#### 创建条件变量
|
||||
|
||||
```cpp
|
||||
std::condition_variable cond;
|
||||
```
|
||||
|
||||
#### 等待条件变量被通知
|
||||
|
||||
```cpp
|
||||
std::unique_lock<std::mutex>
|
||||
lock;
|
||||
extern bool predicate();
|
||||
|
||||
// 调用方式 1
|
||||
cond.wait(lock);
|
||||
// 调用方式 2
|
||||
cond.wait(lock, predicate);
|
||||
```
|
||||
|
||||
----
|
||||
|
||||
- `wait`不断地尝试重新获取并加锁该互斥量,如果获取不到,它就卡在这里并反复尝试重新获取,如果获取到了,执行流程就继续往下走
|
||||
- `wait`在获取到互斥量并加锁了互斥量之后:
|
||||
- 如果`wait`被提供了可调用对象,那么就执行这个可调用对象:
|
||||
- 如果返回值为`false`,那么`wait`继续加锁,直到再次被 notified
|
||||
- 如果返回值为`true`,那么`wait`返回,继续执行流程
|
||||
- 如果`wait`没有第二个参数,那么直接返回,继续执行
|
||||
|
||||
#### `std::condition_variable::notify_one`
|
||||
|
||||
`notify_one` 唤醒一个调用 `wait` 的线程。注意在唤醒之前要解锁,否则调用 `wait` 的线程也会因为无法加锁而阻塞。
|
||||
|
||||
#### `std::condition_variable::notify_all`
|
||||
|
||||
唤醒所有调用 `wait` 的线程。
|
||||
|
||||
### 获取线程的运行结果
|
||||
<!--rehype:wrap-class=row-span-5-->
|
||||
|
||||
> `#include <future>`
|
||||
|
||||
#### 创建异步任务
|
||||
|
||||
```cpp
|
||||
double func(int val);
|
||||
|
||||
// 使用std::async创建异步任务
|
||||
// 使用std::future获取结果
|
||||
// future模板中存放返回值类型
|
||||
std::future<double> result =
|
||||
std::async(func, 5);
|
||||
```
|
||||
|
||||
#### 获取异步任务的返回值
|
||||
|
||||
等待异步任务结束,但是不获取返回值:
|
||||
|
||||
```cpp
|
||||
result.wait();
|
||||
```
|
||||
|
||||
获取异步任务的返回值:
|
||||
|
||||
```cpp
|
||||
int val = result.get();
|
||||
```
|
||||
|
||||
注:
|
||||
|
||||
- `get()`返回右值,因此只可调用一次
|
||||
- 只要调用上述任意函数,线程就会一直阻塞到返回值可用(入口函数运行结束)
|
||||
|
||||
#### `std::async` 的额外参数
|
||||
|
||||
额外参数可以被放在 `std::async` 的第一个参数位置,用于设定 `std::async` 的行为:
|
||||
|
||||
- `std::launch::deferred`:入口函数的运行会被推迟到`std::future<T>::get()`或者`std::future<T>::wait()`被调用时。此时调用线程会直接运行线程入口函数,换言之,**不会创建子线程**
|
||||
- `std::launch::async`:立即创建子线程,并运行线程入口函数
|
||||
- `std::launch::deferred | std::launch::async`:默认值,由系统自行决定
|
||||
|
||||
#### 返回值的状态
|
||||
|
||||
让当前线程等待一段时间(等待到指定时间点),以期待返回值准备好:
|
||||
|
||||
```cpp
|
||||
extern double foo(int val) {}
|
||||
|
||||
std::future<double> result =
|
||||
async(foo, 5);
|
||||
|
||||
//返回值类型
|
||||
std::future_status status;
|
||||
// 等待一段时间
|
||||
status = result.wait_for(
|
||||
std::chrono::seconds(1)
|
||||
);
|
||||
// 等待到某一时间点
|
||||
status = result.wait_for(
|
||||
std::chrono::now() +
|
||||
std::chrono::seconds(1)
|
||||
);
|
||||
```
|
||||
|
||||
在指定的时间过去后,可以获取等待的结果:
|
||||
|
||||
```cpp
|
||||
// 返回值已经准备好
|
||||
if (status ==
|
||||
std::future_status::ready)
|
||||
{
|
||||
|
||||
}
|
||||
// 超时:尚未准备好
|
||||
else if (status ==
|
||||
std::future_status::timeout)
|
||||
{ }
|
||||
// 尚未启动: std::launch::deferred
|
||||
else if (status ==
|
||||
std::future_status::deferred)
|
||||
{ }
|
||||
```
|
||||
|
||||
#### 多个返回值
|
||||
|
||||
如果要多次获取结果,可以使用`std::shared_future`,其会返回结果的一个**拷贝**。
|
||||
|
||||
```cpp
|
||||
std::shared_future<T> result;
|
||||
```
|
||||
|
||||
对于不可拷贝对象,可以在`std::shared_future`中存储对象的指针,而非指针本身。
|
||||
|
||||
### 创建线程
|
||||
|
||||
```cpp
|
||||
void threadFunction() {
|
||||
// 线程函数体
|
||||
std::cout << "From thread" << std::endl;
|
||||
}
|
||||
|
||||
int main() {
|
||||
// 创建线程并开始执行线程函数
|
||||
std::thread t(threadFunction);
|
||||
|
||||
// 等待线程执行完毕
|
||||
t.join();
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 传递参数给线程函数
|
||||
|
||||
```cpp
|
||||
void threadFunction(int value) {
|
||||
// 线程函数体
|
||||
std::cout << "Received value: " << value << std::endl;
|
||||
}
|
||||
|
||||
int main() {
|
||||
int data = 42;
|
||||
std::thread t(threadFunction, data);
|
||||
t.join();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### 使用Lambda表达式创建线程
|
||||
|
||||
```cpp
|
||||
int main() {
|
||||
int data = 42;
|
||||
std::thread t([data]() {
|
||||
// Lambda 表达式作为线程函数
|
||||
std::cout << "Received value: " << data << std::endl;
|
||||
});
|
||||
t.join();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### **处理线程间的同步:**
|
||||
|
||||
```cpp
|
||||
#include <mutex>
|
||||
|
||||
std::mutex mtx;
|
||||
|
||||
void threadFunction() {
|
||||
std::lock_guard<std::mutex> lock(mtx);
|
||||
std::cout << "Thread safe output." << std::endl;
|
||||
}
|
||||
|
||||
int main() {
|
||||
std::thread t1(threadFunction);
|
||||
std::thread t2(threadFunction);
|
||||
t1.join();
|
||||
t2.join();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
### **使用`std::async`启动异步任务:**
|
||||
|
||||
```cpp
|
||||
#include <future>
|
||||
|
||||
int taskFunction() {
|
||||
// 异步任务
|
||||
return 42;
|
||||
}
|
||||
|
||||
int main() {
|
||||
// 启动异步任务
|
||||
std::future<int> fut = std::async(std::launch::async, taskFunction);
|
||||
|
||||
// 获取异步任务的结果
|
||||
int result = fut.get();
|
||||
|
||||
std::cout << "Result: " << result << std::endl;
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
C++ 预处理器
|
||||
------------
|
||||
|
||||
|
1335
docs/cs.md
385
docs/css.md
@ -13,8 +13,6 @@ CSS 功能丰富,不仅仅是布局页面
|
||||
|
||||
#### 外部样式表 `<link>`
|
||||
|
||||
`
|
||||
|
||||
```html
|
||||
<link
|
||||
href="./path/to/stylesheet/style.css"
|
||||
@ -1266,10 +1264,13 @@ CSS 函数
|
||||
### calc()
|
||||
|
||||
```css
|
||||
width: calc(100% - 80px);
|
||||
div {
|
||||
width: calc(100% - 30px);
|
||||
height: calc(100% - 30px);
|
||||
}
|
||||
```
|
||||
|
||||
声明 CSS 属性值时执行一些计算
|
||||
[`calc()`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/calc) CSS 函数允许您在指定 CSS 属性值时执行计算
|
||||
|
||||
### clamp()
|
||||
|
||||
@ -1470,6 +1471,35 @@ html {
|
||||
|
||||
[点击我](#入门)页面会平滑滚动到入门
|
||||
|
||||
### 修改浏览器自动填充 input 样式
|
||||
|
||||
```css
|
||||
input[type="text"]:autofill {
|
||||
box-shadow: 0 0 0 1000px #000 inset;
|
||||
-webkit-text-fill-color: white;
|
||||
}
|
||||
```
|
||||
|
||||
另见: [:autofill](https://developer.mozilla.org/en-US/docs/Web/CSS/:autofill)
|
||||
|
||||
### 修改 input type="color" 样式
|
||||
<!--rehype:wrap-class=col-span-2 row-span-2-->
|
||||
|
||||
```css
|
||||
input[type="color"] {
|
||||
-webkit-appearance: none;
|
||||
border: none;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
input[type="color"]::-webkit-color-swatch-wrapper {
|
||||
padding: 0;
|
||||
}
|
||||
input[type="color"]::-webkit-color-swatch {
|
||||
border: none;
|
||||
}
|
||||
```
|
||||
|
||||
### 忽略用作间距的换行符 \<br />
|
||||
|
||||
```css
|
||||
@ -1487,11 +1517,13 @@ br + br {
|
||||
```
|
||||
|
||||
### CSS 重置
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```css
|
||||
html {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
*, *::before, *::after {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
@ -1501,7 +1533,82 @@ html {
|
||||
|
||||
有助于在不同的浏览器之间强制样式一致性,并为样式元素提供干净的盒子
|
||||
|
||||
### 设置光标样式
|
||||
|
||||
```css
|
||||
body {
|
||||
caret-color: red;
|
||||
}
|
||||
```
|
||||
|
||||
### 设置整个页面灰色
|
||||
<!--rehype:wrap-style=-webkit-filter: grayscale(.95);-->
|
||||
|
||||
```css
|
||||
html {
|
||||
-webkit-filter: grayscale(.95);
|
||||
}
|
||||
```
|
||||
|
||||
上面示例设置了当前卡片灰色
|
||||
|
||||
### `<textarea>`自动增加其高度
|
||||
|
||||
```css
|
||||
textarea {
|
||||
form-sizing: normal
|
||||
}
|
||||
```
|
||||
|
||||
### 定义容器的长宽比
|
||||
|
||||
```css
|
||||
div {
|
||||
aspect-ratio: 1/1
|
||||
}
|
||||
```
|
||||
|
||||
属性 [aspect-ratio](https://developer.mozilla.org/zh-CN/docs/Web/CSS/aspect-ratio) 可以非常容易的定义一个容器的长宽比
|
||||
|
||||
### 使用 unset 而不是重置所有属性
|
||||
|
||||
使用 `all` 速记来指定元素的所有属性。将值设置为 `unset` 会将元素的属性更改为其初始值:
|
||||
|
||||
```css
|
||||
button {
|
||||
all: unset;
|
||||
}
|
||||
```
|
||||
|
||||
注意:`IE11` 不支持 `all` 和 `unset` 速记
|
||||
|
||||
### 超出显示省略号
|
||||
|
||||
```css
|
||||
p {
|
||||
overflow: hidden;/*超出部分隐藏*/
|
||||
/* 超出部分显示省略号 */
|
||||
text-overflow:ellipsis;
|
||||
/* 规定段落中的文本不进行换行 */
|
||||
white-space: nowrap;
|
||||
width: 250px;/*需要配合宽度来使用*/
|
||||
}
|
||||
```
|
||||
|
||||
### 给正文添加行高
|
||||
|
||||
您不需要为每个 `<p>`、`<h*>` 等添加行高。相反,将其添加到正文:
|
||||
|
||||
```css
|
||||
body {
|
||||
line-height: 1.5;
|
||||
}
|
||||
```
|
||||
|
||||
这样文本元素可以很容易地从 `body` 继承
|
||||
|
||||
### 使用图像作为光标
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
```css
|
||||
div {
|
||||
@ -1538,17 +1645,6 @@ div {
|
||||
|
||||
多行文本截断到特定的行数,末尾显示省略号 _(...)_
|
||||
|
||||
### 计算函数
|
||||
|
||||
```css
|
||||
div {
|
||||
width: calc(100% - 30px);
|
||||
height: calc(100% - 30px);
|
||||
}
|
||||
```
|
||||
|
||||
[`calc()`](https://developer.mozilla.org/zh-CN/docs/Web/CSS/calc) CSS 函数允许您在指定 CSS 属性值时执行计算
|
||||
|
||||
### 粘性定位元素
|
||||
|
||||
```css
|
||||
@ -1622,15 +1718,264 @@ div {
|
||||
|
||||
通过样式来控制一个元素 `div` 是否可以编辑
|
||||
|
||||
### 定义容器的长宽比
|
||||
### 等宽表格单元格
|
||||
|
||||
```
|
||||
div {
|
||||
aspect-ratio: 1/1
|
||||
尝试使用 `table-layout: fixed` 以保持单元格宽度相等:
|
||||
|
||||
```css
|
||||
table {
|
||||
table-layout: fixed;
|
||||
}
|
||||
```
|
||||
|
||||
属性 [aspect-ratio](https://developer.mozilla.org/zh-CN/docs/Web/CSS/aspect-ratio) 可以非常容易的定义一个容器的长宽比
|
||||
### 利用属性选择器来选择空链接
|
||||
|
||||
当 `<a>` 元素没有文本内容,但有 `href` 属性的时候,显示它的 `href` 属性:
|
||||
|
||||
```css
|
||||
a[href^="http"]:empty::before {
|
||||
content: attr(href);
|
||||
}
|
||||
```
|
||||
|
||||
### 给 “默认” 链接定义样式
|
||||
|
||||
给 “默认” 链接定义样式:
|
||||
|
||||
```css
|
||||
a[href]:not([class]) {
|
||||
color: #008000;
|
||||
text-decoration: underline;
|
||||
}
|
||||
```
|
||||
|
||||
通常没有 `class` 属性,以上样式可以甄别它们,而且不会影响其它样式
|
||||
|
||||
### 用 rem 调整全局大小;用 em 调整局部大小
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
在根元素设置基本字体大小后 (`html { font-size: 100%; }`), 使用 em 设置文本元素的字体大小:
|
||||
|
||||
```css
|
||||
h2 {
|
||||
font-size: 2em;
|
||||
}
|
||||
p {
|
||||
font-size: 1em;
|
||||
}
|
||||
```
|
||||
|
||||
然后设置模块的字体大小为 rem:
|
||||
|
||||
```css
|
||||
article {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
aside .module {
|
||||
font-size: .9rem;
|
||||
}
|
||||
```
|
||||
|
||||
现在,每个模块变得独立,更容易、灵活的样式便于维护
|
||||
|
||||
### 隐藏没有静音、自动播放的影片
|
||||
|
||||
这是一个自定义用户样式表的不错的技巧。避免在加载页面时自动播放。如果没有静音,则不显示视频:
|
||||
|
||||
```css
|
||||
video[autoplay]:not([muted]) {
|
||||
display: none;
|
||||
}
|
||||
```
|
||||
|
||||
再次,我们利用了 `:not()` 的优点
|
||||
|
||||
### 为更好的移动体验,为表单元素设置字体大小
|
||||
|
||||
当触发 `<select>` 的下拉列表时,为了避免表单元素在移动浏览器(iOS Safari 和其它)上的缩放,加上font-size:
|
||||
|
||||
```css
|
||||
input[type="text"],
|
||||
input[type="number"],
|
||||
select,
|
||||
textarea {
|
||||
font-size: 16px;
|
||||
}
|
||||
```
|
||||
|
||||
### 使用指针事件来控制鼠标事件
|
||||
|
||||
指针事件允许您指定鼠标如何与其触摸的元素进行交互。要禁用按钮上的默认指针事件,例如:
|
||||
|
||||
```css
|
||||
button:disabled {
|
||||
opacity: .5;
|
||||
pointer-events: none;
|
||||
}
|
||||
```
|
||||
|
||||
就这么简单
|
||||
|
||||
### 子元素选中父元素
|
||||
|
||||
```css
|
||||
div:has(img) {
|
||||
background: black;
|
||||
}
|
||||
```
|
||||
|
||||
设置包含子元素 `img` 的 `div` 元素样式,还可以嵌套:
|
||||
|
||||
```css
|
||||
div:has(h2):has(ul) {
|
||||
background: black;
|
||||
}
|
||||
```
|
||||
|
||||
### 在用作间距的换行符上设置 `display: none`
|
||||
|
||||
用户使用额外的换行符
|
||||
|
||||
```css
|
||||
br + br {
|
||||
display: none;
|
||||
}
|
||||
```
|
||||
|
||||
### 给 `body` 添加行高
|
||||
|
||||
```css
|
||||
body {
|
||||
line-height: 1.5;
|
||||
}
|
||||
```
|
||||
|
||||
您不需要为每个 `<p>`、`<h*>` 等分别添加行高。相反,将其添加到正文
|
||||
|
||||
### 检查本地是否安装了字体
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```css
|
||||
@font-face {
|
||||
font-family: "Dank Mono";
|
||||
src:
|
||||
/* Full name */
|
||||
local("Dank Mono"),
|
||||
/* Postscript name */
|
||||
local("Dank-Mono"),
|
||||
/* 否则,请下载它! */
|
||||
url("//...a.server/DankMono.woff");
|
||||
}
|
||||
|
||||
code {
|
||||
font-family: "Dank Mono",
|
||||
system-ui-monospace;
|
||||
}
|
||||
```
|
||||
|
||||
您可以在远程获取字体之前检查是否在本地安装了字体,这也是一个很好的性能提示
|
||||
|
||||
### 获取 HTML 元素的属性
|
||||
|
||||
```html
|
||||
<a href="https://example.com">超链接</a>
|
||||
```
|
||||
|
||||
attr HTML 元素的属性名。
|
||||
|
||||
```css
|
||||
a:after {
|
||||
content: " (" attr(href) ")";
|
||||
}
|
||||
```
|
||||
|
||||
### 为表单元素设置 `:focus`
|
||||
|
||||
```css
|
||||
a:focus, button:focus, input:focus,
|
||||
select:focus, textarea:focus {
|
||||
box-shadow: none;
|
||||
outline: #000 dotted 2px;
|
||||
outline-offset: .05em;
|
||||
}
|
||||
```
|
||||
|
||||
有视力的键盘用户依靠焦点来确定键盘事件在页面中的位置。使表单元素的焦点比浏览器的默认实现更加突出和一致
|
||||
|
||||
### 垂直居中任何东西
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```css
|
||||
html, body {
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
-webkit-align-items: center;
|
||||
-ms-flex-align: center;
|
||||
align-items: center;
|
||||
display: -webkit-flex;
|
||||
display: flex;
|
||||
}
|
||||
```
|
||||
|
||||
...还有 CSS 网格:
|
||||
|
||||
```css
|
||||
body {
|
||||
display: grid;
|
||||
height: 100vh;
|
||||
margin: 0;
|
||||
place-items: center center;
|
||||
}
|
||||
```
|
||||
|
||||
### 图片对齐不变形
|
||||
|
||||
```css
|
||||
img {
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
/** 确保图片按原始宽高比例进行缩放 */
|
||||
object-fit: cover;
|
||||
object-position: left top;
|
||||
transition: 1s;
|
||||
}
|
||||
img:hover {
|
||||
/** 指定图片显示的位置,结合鼠标移动+过渡动画 */
|
||||
object-position: right bottom;
|
||||
}
|
||||
```
|
||||
|
||||
### 多行截断,展示省略号
|
||||
|
||||
```css
|
||||
.clamp {
|
||||
overflow: hidden;
|
||||
display: -webkit-box;
|
||||
-webkit-line-clamp: 3;
|
||||
-webkit-box-orient: vertical;
|
||||
}
|
||||
```
|
||||
|
||||
`html` 文本超过 3 行将被截断,显示省略号...
|
||||
|
||||
```html
|
||||
<p class="clamp">
|
||||
展示多行文本,超过 3 行将被截断,显示省略号...
|
||||
</p>
|
||||
```
|
||||
|
||||
### 逗号分隔列表
|
||||
|
||||
```css
|
||||
ul > li:not(:last-child)::after {
|
||||
content: ",";
|
||||
}
|
||||
```
|
||||
|
||||
使列表项看起来像一个真实的逗号分隔列表,使用 `:not()` 伪类,最后一项不会添加逗号
|
||||
|
||||
另见
|
||||
---------
|
||||
|
@ -64,13 +64,15 @@ Curl 是一种在服务器之间传输数据的工具,支持协议,包括 HT
|
||||
|
||||
```bash
|
||||
-A <str> # --user-agent
|
||||
|
||||
-b name=val # --cookie
|
||||
|
||||
# 从 URL 的指定文件加载 cookie
|
||||
-b, --cookie FILE
|
||||
# 将 cookie 从 URL 保存到指定文件
|
||||
-c, --cookie-jar FILE
|
||||
|
||||
-b FILE # --cookie
|
||||
|
||||
-H "X-Foo: y" # --header
|
||||
|
||||
--compressed # 使用 deflate/gzip
|
||||
```
|
||||
|
||||
|
74
docs/dart.md
@ -320,7 +320,7 @@ int sum = add(2,3); // 回报:5
|
||||
int totalSum = add(2, add(2,3)); // 返回:7
|
||||
```
|
||||
|
||||
### 箭头语法 (=>)
|
||||
### 箭头函数 (=>)
|
||||
|
||||
```dart
|
||||
// 只包含一个表达式的函数,您可以使用简写语法
|
||||
@ -346,6 +346,63 @@ list.forEach(
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 扩展函数 (Extension)
|
||||
|
||||
```dart
|
||||
//extension 定义扩展名称 on 扩展类
|
||||
extension StringExtension on String {
|
||||
//扩展方法
|
||||
String capitalize() {
|
||||
if (isEmpty) {
|
||||
return this;
|
||||
}
|
||||
// 将字符串的首字母大写
|
||||
String topStr = this[0].toUpperCase();
|
||||
|
||||
return '${topStr}${substring(1)}';
|
||||
}
|
||||
}
|
||||
|
||||
void main(List<String> args) {
|
||||
print("apple".capitalize());
|
||||
// Print: Apple
|
||||
print("苹果apple".capitalize());
|
||||
// Print: 苹果apple
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
在不修改 String 类的前提下为其新增了 capitalize 方法
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 运算符重载 (Extension)
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
```dart
|
||||
class Money {
|
||||
final num amount;
|
||||
Money({required this.amount});
|
||||
}
|
||||
|
||||
// 利用扩展函数特性
|
||||
extension MoneyOperatorExtension<T> on Money {
|
||||
// operator 重载运算符
|
||||
Money operator +(Money elements) {
|
||||
Money newMoney = Money(amount: this.amount + elements.amount);
|
||||
return newMoney;
|
||||
}
|
||||
}
|
||||
|
||||
void main(List<String> args) {
|
||||
// 怎么样?两个类加起来了
|
||||
Money appleMoney = Money(amount: 10.0);
|
||||
Money cardMoney = Money(amount: 6.0);
|
||||
Money allMoney = cardMoney + appleMoney;
|
||||
print(allMoney.amount);
|
||||
//Print: 16.0
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
类和对象
|
||||
----------
|
||||
|
||||
@ -747,6 +804,21 @@ var list2 = [0, ...list];
|
||||
print(list2.length); // 打印: 4
|
||||
```
|
||||
|
||||
### 延迟初始化
|
||||
|
||||
```dart
|
||||
// token 类型非空,但是不用立即赋值
|
||||
late String token;
|
||||
|
||||
void main(List<String> args) {
|
||||
/// print(token);
|
||||
/// Field 'token' has not been initialized
|
||||
/// 在初始化前调用就会报错
|
||||
token = "tokenContent";
|
||||
print(token);
|
||||
}
|
||||
```
|
||||
|
||||
另见
|
||||
----
|
||||
|
||||
|
837
docs/docker.md
@ -28,8 +28,8 @@ FROM [--platform=<platform>] <image> [AS <name>]
|
||||
示例
|
||||
|
||||
```dockerfile
|
||||
FROM ruby:2.2.2
|
||||
FROM golang:1.19-alpine3.16 AS build-env
|
||||
FROM ruby:3.3.0
|
||||
FROM golang:1.20-alpine3.16 AS build-env
|
||||
```
|
||||
|
||||
### 变量 ENV
|
||||
@ -214,8 +214,8 @@ Dockerfile 示例
|
||||
### 服务静态网站的最小 Docker 镜像
|
||||
|
||||
```dockerfile
|
||||
FROM lipanski/docker-static-website:latest
|
||||
# 使用 .dockerignore 文件来控制图像中的内容!
|
||||
FROM wcjiang/docker-static-website:latest
|
||||
# 使用 .dockerignore 文件来控制镜像中的内容!
|
||||
# 复制当前目录内容,到容器中
|
||||
COPY ./ .
|
||||
```
|
||||
@ -223,13 +223,13 @@ COPY ./ .
|
||||
这会产生一个 **`154KB +`** 的单层镜像。 如果您需要以不同的方式配置 `httpd`,您可以覆盖 CMD 行:
|
||||
|
||||
```dockerfile
|
||||
FROM lipanski/docker-static-website:latest
|
||||
FROM wcjiang/docker-static-website:latest
|
||||
COPY . .
|
||||
|
||||
CMD ["/busybox","httpd","-f","-v","-p","3000","-c","httpd.conf"]
|
||||
```
|
||||
|
||||
缩小镜像过程[查看原文](https://lipanski.com/posts/smallest-docker-image-static-website),镜像 [Dockerfile 源码](https://github.com/lipanski/docker-static-website)。
|
||||
缩小镜像过程[查看原文](https://lipanski.com/posts/smallest-docker-image-static-website),镜像 [Dockerfile 源码](https://github.com/forksss/docker-static-website)。
|
||||
|
||||
### Docker 镜像多阶段构建
|
||||
|
||||
|
329
docs/ejs.md
Normal file
@ -0,0 +1,329 @@
|
||||
Ejs 备忘清单
|
||||
====
|
||||
|
||||
[](https://www.npmjs.com/package/ejs)
|
||||
[](https://www.npmjs.com/package/ejs)
|
||||
[](https://github.com/mde/ejs/network/dependents)
|
||||
[](https://github.com/mde/ejs)
|
||||
|
||||
EJS(嵌入式 JavaScript)是一种简单的模板语言,可让您使用纯 JavaScript 生成 HTML 标记
|
||||
<!--rehype:style=padding-top: 12px;-->
|
||||
|
||||
入门
|
||||
----
|
||||
|
||||
### Hello world
|
||||
|
||||
#### 安装
|
||||
|
||||
```shell
|
||||
$ npm install ejs
|
||||
```
|
||||
|
||||
#### hello.ejs
|
||||
|
||||
```ejs
|
||||
<% if (user.email) { %>
|
||||
<h1><%= user.email %></h1>
|
||||
<% } %>
|
||||
```
|
||||
|
||||
#### 命令 CLI
|
||||
|
||||
```shell
|
||||
$ ejs hello.ejs -o hello.html
|
||||
```
|
||||
|
||||
### 使用数据渲染
|
||||
|
||||
```js
|
||||
let ejs = require('ejs');
|
||||
|
||||
let people = ['geddy', 'neil', 'alex'];
|
||||
let tpl = '<%= people.join(", "); %>';
|
||||
|
||||
let html = ejs.render(tpl, {
|
||||
people: people
|
||||
});
|
||||
console.log(html);
|
||||
```
|
||||
|
||||
向 `EJS` 传递模板字符串和一些数据
|
||||
|
||||
### 浏览器支持
|
||||
|
||||
```html
|
||||
<script src="ejs.js"></script>
|
||||
<script>
|
||||
let people = ['geddy', 'neil', 'alex'];
|
||||
let html = ejs.render(
|
||||
'<%= people.join(", "); %>',
|
||||
{ people: people }
|
||||
);
|
||||
</script>
|
||||
```
|
||||
|
||||
在脚本标签中使用 `ejs`
|
||||
|
||||
### 变量
|
||||
|
||||
| | |
|
||||
|--------------|----------------------------------|
|
||||
| `<%= var %>` | 打印变量的值 |
|
||||
| `<%- var %>` | 打印时不进行 HTML 转义 |
|
||||
|
||||
### CLI
|
||||
|
||||
渲染并指定输出文件
|
||||
|
||||
```shell
|
||||
$ ejs hello.ejs -o hello.html
|
||||
```
|
||||
|
||||
为其提供模板文件和数据文件
|
||||
|
||||
```shell
|
||||
$ ejs hello.ejs -f data.json -o hello.html
|
||||
```
|
||||
|
||||
### 注释
|
||||
|
||||
```ejs
|
||||
<%# 该行将表示一条注释 %>
|
||||
```
|
||||
|
||||
--------
|
||||
|
||||
```ejs
|
||||
<%# 这是一个多行 EJS 注释。
|
||||
它可以跨越多行,
|
||||
但不会显示
|
||||
在最终的 HTML 输出中。
|
||||
%>
|
||||
```
|
||||
|
||||
### 方法
|
||||
|
||||
```js
|
||||
let ejs = require('ejs');
|
||||
let template = ejs.compile(str, options);
|
||||
|
||||
template(data);
|
||||
// => 渲染的 HTML 字符串
|
||||
|
||||
ejs.render(str, data, options);
|
||||
// => 渲染的 HTML 字符串
|
||||
|
||||
ejs.renderFile(filename, data, options,
|
||||
function(err, str){
|
||||
// str => 渲染的 HTML 字符串
|
||||
}
|
||||
);
|
||||
```
|
||||
|
||||
### 包括文件
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
```ejs
|
||||
<%- include('partials/navbar.ejs') %>
|
||||
```
|
||||
|
||||
包含带有数据的模板:
|
||||
|
||||
```ejs
|
||||
<% include('header', { title: 'My Page' }) %>
|
||||
```
|
||||
|
||||
--------
|
||||
|
||||
```ejs
|
||||
<ul>
|
||||
<% users.forEach(function(user){ %>
|
||||
<%- include('item', {user: user}); %>
|
||||
<% }); %>
|
||||
</ul>
|
||||
```
|
||||
|
||||
要包含模板,需要文件名选项,路径是相对的
|
||||
|
||||
文档
|
||||
--------
|
||||
|
||||
### 条件句
|
||||
|
||||
```ejs
|
||||
<% if (userLoggedIn) { %>
|
||||
<p>Welcome, <%= username %>!</p>
|
||||
<% } else { %>
|
||||
<p>Please log in.</p>
|
||||
<% } %>
|
||||
```
|
||||
|
||||
### 使用循环
|
||||
|
||||
```ejs
|
||||
<% if (userLoggedIn) { %>
|
||||
<p>Welcome, <%= username %>!</p>
|
||||
<% } else { %>
|
||||
<p>Please log in.</p>
|
||||
<% } %>
|
||||
```
|
||||
|
||||
### 自定义分隔符
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```js
|
||||
let ejs = require('ejs'),
|
||||
users = ['geddy', 'neil', 'alex'];
|
||||
|
||||
// 只需一个模板
|
||||
ejs.render('<?= users.join(" | "); ?>',
|
||||
{users: users},
|
||||
{delimiter: '?'});
|
||||
// => 'geddy | neil | alex'
|
||||
|
||||
// 或全局范围内
|
||||
ejs.delimiter = '$';
|
||||
ejs.render('<$= users.join(" | "); $>',
|
||||
{users: users});
|
||||
// => 'geddy | neil | alex'
|
||||
```
|
||||
|
||||
### 缓存
|
||||
|
||||
```js
|
||||
let ejs = require('ejs'),
|
||||
LRU = require('lru-cache');
|
||||
|
||||
// LRU 缓存具有 100 项限制
|
||||
ejs.cache = LRU(100);
|
||||
```
|
||||
|
||||
### 布局
|
||||
|
||||
```ejs
|
||||
<%- include('header'); -%>
|
||||
<h1> Title </h1>
|
||||
<p>
|
||||
My page
|
||||
</p>
|
||||
<%- include('footer'); -%>
|
||||
```
|
||||
|
||||
### 自定义文件加载器
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
```js
|
||||
let ejs = require('ejs');
|
||||
let myFileLoader = function (filePath) {
|
||||
return 'myFileLoader: ' + fs.readFileSync(filePath);
|
||||
};
|
||||
|
||||
ejs.fileLoader = myFileLoader;
|
||||
```
|
||||
|
||||
客户端支持
|
||||
-----
|
||||
<!--rehype:body-class=cols-2-->
|
||||
|
||||
### 例子
|
||||
|
||||
```html
|
||||
<div id="output"></div>
|
||||
<script src="ejs.min.js"></script>
|
||||
<script>
|
||||
let people = ['geddy', 'neil', 'alex'],
|
||||
html = ejs.render('<%= people.join(", "); %>', {people: people});
|
||||
// With jQuery:
|
||||
$('#output').html(html);
|
||||
// Vanilla JS:
|
||||
document.getElementById('output').innerHTML = html;
|
||||
</script>
|
||||
```
|
||||
|
||||
### 注意事项
|
||||
|
||||
```js
|
||||
let str = "Hello <%= include('file', {person: 'John'}); %>",
|
||||
fn = ejs.compile(str, {client: true});
|
||||
|
||||
fn(data, null, function(path, d){ // include callback
|
||||
// path -> 'file'
|
||||
// d -> {person: 'John'}
|
||||
// Put your code here
|
||||
// Return the contents of file as a string
|
||||
}); // returns rendered string
|
||||
```
|
||||
|
||||
## 选项
|
||||
<!--rehype:body-class=cols-1-->
|
||||
|
||||
### 选项列表
|
||||
|
||||
选项 | 描述
|
||||
:---|---
|
||||
`cache` | 编译后的函数被缓存,需要文件名
|
||||
`filename` | 由缓存用于关键缓存,并用于包含
|
||||
`root` | 使用绝对路径(例如 `/file.ejs`)设置包含项目的根目录。 可以是一个数组来尝试解析来自多个目录的包含。
|
||||
`views` | 解析包含相对路径时要使用的路径数组。
|
||||
`context` | 函数执行上下文
|
||||
`compileDebug` | 当 `false` 时,不编译任何调试工具
|
||||
`client` | 返回独立编译的函数
|
||||
`delimiter` | 用于内部分隔符的字符,默认为 `%`
|
||||
`openDelimiter` | 用于打开分隔符的字符,默认为 `<`
|
||||
`closeDelimiter` | 用于结束分隔符的字符,默认为 `>`
|
||||
`debug` | 输出生成的函数体
|
||||
`strict` | 当设置为 `true` 时,生成的函数处于严格模式
|
||||
`_with` | 是否使用 `with() {}` 构造。 如果为 `false`,则局部变量将存储在局部变量对象中。 (暗示`--strict`)
|
||||
`localsName` | 不使用时用于存储局部变量的对象的名称 默认为局部变量
|
||||
`rmWhitespace` | 删除所有可安全删除的空格,包括前导和尾随空格。 它还为所有 `scriptlet` 标记启用了更安全版本的 `-%>` 行吸收(它不会在行中间去除新的标记行)
|
||||
`escape` | 与 `<%=` 构造一起使用的转义函数。 它用于渲染,并在生成客户端函数时进行 `.toString()` 处理。 (默认情况下转义 XML)
|
||||
`outputFunctionName` | 设置为字符串(例如 `echo` 或 `print`),以便函数在 `scriptlet` 标签内打印输出
|
||||
`async` | 当 `true` 时,EJS 将使用异步函数进行渲染。 (取决于 `JS` 运行时中的 `async`/`await` 支持
|
||||
|
||||
## 标签
|
||||
<!--rehype:body-class=cols-1-->
|
||||
|
||||
### 标签列表
|
||||
|
||||
标签 | 描述
|
||||
:---|---
|
||||
`<%` | 'Scriptlet' 标签,用于控制流,无输出
|
||||
`<%_` | “Whitespace Slurping”Scriptlet 标签,删除其前面的所有空格
|
||||
`<%=` | 将值输出到模板中(HTML 转义)
|
||||
`<%-` | 将未转义的值输出到模板中
|
||||
`<%#` | 注释标签,不执行,不输出
|
||||
`<%%` | 输出文字 `<%`
|
||||
`%>` | 普通结束标签
|
||||
`-%>` | 修剪模式('newline slurp')标签,修剪换行符后的内容
|
||||
`_%>` | “Whitespace Slurping”结束标签,删除其后的所有空格
|
||||
|
||||
## Cli
|
||||
<!--rehype:body-class=cols-1-->
|
||||
|
||||
### Cli 列表
|
||||
|
||||
选项 | 描述
|
||||
:---|---
|
||||
`cache` | 编译后的函数被缓存,需要文件名
|
||||
`-o / --output-file FILE` | 将渲染的输出写入 FILE 而不是 stdout。
|
||||
`-f / --data-file FILE` | 必须是 JSON 格式。 使用来自 FILE 的解析输入作为渲染数据。
|
||||
`-i / --data-input STRING` | 必须采用 JSON 格式和 URI 编码。 使用来自 STRING 的解析输入作为渲染数据。
|
||||
`-m / --delimiter CHARACTER` | 使用带有尖括号的 CHARACTER 来表示打开/关闭(默认为 %)。
|
||||
`-p / --open-delimiter CHARACTER` | 使用 CHARACTER 而不是左尖括号来打开。
|
||||
`-c / --close-delimiter CHARACTER` | 使用 CHARACTER 而不是右尖括号来结束。
|
||||
`-s / --strict` | 当设置为 `true` 时,生成的函数处于严格模式
|
||||
`-n / --no-with` | 对变量使用 `locals` 对象,而不是使用 `with`(隐含--strict)。
|
||||
`-l / --locals-name` | 不使用“with”时用于存储局部变量的对象的名称。
|
||||
`-w / --rm-whitespace` | 删除所有可安全删除的空格,包括前导和尾随空格。
|
||||
`-d / --debug` | 输出生成的函数体
|
||||
`-h / --help` | 显示此帮助消息。
|
||||
`-V/v / --version` | 显示 EJS 版本。
|
||||
|
||||
使用示例:
|
||||
|
||||
```bash
|
||||
$ ejs -p [ -c ] ./template_file.ejs -o ./output.html
|
||||
$ ejs ./test/fixtures/user.ejs name=Lerxst
|
||||
$ ejs -n -l _ ./some_template.ejs -f ./data_file.json
|
||||
```
|
606
docs/elasticsearch.md
Normal file
@ -0,0 +1,606 @@
|
||||
Elasticsearch 备忘清单
|
||||
===
|
||||
|
||||
这是 [Elasticsearch](https://www.elastic.co/guide/index.html) 的官方文档。 你可以在这里找到 elasticsearch 的所有文档。
|
||||
|
||||
入门
|
||||
---
|
||||
|
||||
### 入门
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
Elasticsearch 是一个基于 Lucene 库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。
|
||||
|
||||
#### 下载
|
||||
|
||||
注意: `${VERSION}` 需替换为指定版本,官方包有的功能只能试用,完整功能需要付费,请仔细阅读官网文档。
|
||||
|
||||
#### Windows
|
||||
|
||||
```
|
||||
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-windows-x86_64.zip
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
#### linux
|
||||
|
||||
```shell
|
||||
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-linux-x86_64.tar.gz
|
||||
|
||||
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-linux-x86_64.tar.gz.sha512
|
||||
|
||||
$ shasum -a 512 -c elasticsearch-${VERSION}-linux-x86_64.tar.gz.sha512
|
||||
|
||||
$ tar -xzf elasticsearch-${VERSION}-linux-x86_64.tar.gz
|
||||
|
||||
$ cd elasticsearch-${VERSION}/
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
#### macos
|
||||
|
||||
```shell
|
||||
$ curl -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-darwin-x86_64.tar.gz
|
||||
|
||||
$ curl https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-${VERSION}-darwin-x86_64.tar.gz.sha512 | shasum -a 512 -c -
|
||||
|
||||
$ tar -xzf elasticsearch-${VERSION}-darwin-x86_64.tar.gz
|
||||
|
||||
$ cd elasticsearch-${VERSION}/
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 启动
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
- 启动 Elasticsearch
|
||||
|
||||
```shell
|
||||
$ ./bin/elasticsearch
|
||||
```
|
||||
|
||||
- 设置密码
|
||||
|
||||
```shell
|
||||
export ELASTIC_PASSWORD="your_password"
|
||||
```
|
||||
|
||||
- 测试是否启动成功
|
||||
|
||||
```shell
|
||||
curl --cacert $ES_HOME/config/certs/http_ca.crt -u elastic:$ELASTIC_PASSWORD https://localhost:9200
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
- 成功则返回样例如下:
|
||||
|
||||
```json
|
||||
{
|
||||
"name" : "Cp8oag6",
|
||||
"cluster_name" : "elasticsearch",
|
||||
"cluster_uuid" : "AT69_T_DTp-1qgIJlatQqA",
|
||||
"version" : {
|
||||
"number" : "${VERSION}",
|
||||
"build_type" : "tar",
|
||||
"build_hash" : "f27399d",
|
||||
"build_flavor" : "default",
|
||||
"build_date" : "2016-03-30T09:51:41.449Z",
|
||||
"build_snapshot" : false,
|
||||
"lucene_version" : "9.10.0",
|
||||
"minimum_wire_compatibility_version" : "1.2.3",
|
||||
"minimum_index_compatibility_version" : "1.2.3"
|
||||
},
|
||||
"tagline" : "You Know, for Search"
|
||||
}
|
||||
```
|
||||
<!--rehype:className=style-timeline-->
|
||||
|
||||
### Elasticsearch 和 RDMS 的对比
|
||||
|
||||
| RDMS | elasticsearch |
|
||||
| ----------------------- | ----------------- |
|
||||
| 数据库(database) | 索引(index) |
|
||||
| 表(table) | 类型(type) |
|
||||
| 行(row) | 文档(document) |
|
||||
| 列(column) | 字段(field) |
|
||||
| 表结构 | 映射 |
|
||||
| 索引 | 全文索引 |
|
||||
| SQL | 查询DSL |
|
||||
| SELECT * FROM tablename | GET http://... |
|
||||
| UPDATE table SET | PUT http://... |
|
||||
| DELETE | DELETE http://... |
|
||||
<!--rehype:className=left-align show-header-->
|
||||
|
||||
操作
|
||||
---
|
||||
|
||||
### 基础语法规则
|
||||
|
||||
```shell
|
||||
$ curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
- `VERB HTTP` 方法:GET, POST, PUT, HEAD, DELETE
|
||||
- `PROTOCOL`:http 或者 https 协议(只有在 Elasticsearch 前面有 https 代理的时候可用)
|
||||
- `HOST`:Elasticsearch 集群中的任何一个节点的主机名,如果是在本地的节点,那么就叫 localhost
|
||||
- `PORT`:Elasticsearch HTTP 服务所在的端口,默认为 9200
|
||||
- `PATH API 路径`(例如_count 将返回集群中文档的数量),PATH:可以包含多个组件,例如_cluster/stats 或者_nodes/stats/jvm
|
||||
- `QUERY_STRING`:一些可选的查询请求参数,例如?pretty 参数将使请求返回更加美观易读的 JSON 数据
|
||||
- `BODY`:一个 JSON 格式的请求主体(如果请求需要的话)
|
||||
|
||||
### 创建索引
|
||||
<!--rehype:wrap-class=col-span-2 row-span-3-->
|
||||
|
||||
#### 统一请求 api 前缀
|
||||
|
||||
```
|
||||
http://localhost:9200/
|
||||
```
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```json
|
||||
PUT /user_info
|
||||
{
|
||||
"settings": { "number_of_replicas": 1, "number_of_shards": 1 },
|
||||
"mappings": {
|
||||
"properties": {
|
||||
"id": { "type": "long", "index": true },
|
||||
"username": { "type": "keyword", "index": true },
|
||||
"nickname": { "type": "keyword", "index": true },
|
||||
"password": { "type": "keyword", "index": false },
|
||||
"age": { "type": "integer", "index": true },
|
||||
"info": { "type": "text", "index": true },
|
||||
"remark": { "type": "text", "index": true }
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### curl
|
||||
|
||||
```shell
|
||||
curl -XPUT "http://localhost:9200/user_info" -H 'Content-Type: application/json' -d'{ "settings": { "number_of_replicas": 1, "number_of_shards": 1 }, "mappings": { "properties": { "id": { "type": "long", "index": true }, "username": { "type": "keyword", "index": true }, "nickname": { "type": "keyword", "index": true }, "password": { "type": "keyword", "index": false }, "age": { "type": "integer", "index": true }, "info": { "type": "text", "index": true }, "remark": { "type": "text", "index": true } } } }'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
#### 参数说明
|
||||
|
||||
- `settings`: 设置索引的信息
|
||||
- `number_of_shards`: 每个索引的主分片数,一旦索引创建后,无法修改此配置
|
||||
- `number_of_replicas`: 每个主分片的副本数,此配置可随时修改
|
||||
- `mappings`: 索引映射定义
|
||||
- `properties`: 字段定义。使用 JSON 配置,键为字段名称(自定义),值为嵌套 JSON,其中 `type` 指定字段的类型
|
||||
|
||||
其他参数很多,请参考官网资料
|
||||
|
||||
### 删除索引
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```http
|
||||
DELETE /user_info
|
||||
```
|
||||
|
||||
#### curl
|
||||
|
||||
```shell
|
||||
curl -XDELETE "http://localhost:9200/user_info"
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 判断索引是否存在
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```http
|
||||
# 查看索引是否存在
|
||||
HEAD /user_info
|
||||
```
|
||||
|
||||
#### curl
|
||||
|
||||
```shell
|
||||
# 查看索引是否存在
|
||||
curl -XHEAD "http://localhost:9200/user_info"
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 开启/关闭索引
|
||||
|
||||
#### 开启DSL语法
|
||||
|
||||
```shell
|
||||
POST /user_info/_open
|
||||
```
|
||||
|
||||
`curl`
|
||||
|
||||
```shell
|
||||
curl -XPOST "http://localhost:9200/user_info/_open"
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
#### 关闭 DSL 语法
|
||||
|
||||
```shell
|
||||
POST /user_info/_close
|
||||
```
|
||||
|
||||
`curl`
|
||||
|
||||
```shell
|
||||
curl -XPOST "http://localhost:9200/user_info/_close"
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 索引的别名
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
- 添加别名 DSL 语法
|
||||
|
||||
```shell
|
||||
POST /user_info/_alias/user1
|
||||
```
|
||||
|
||||
```shell
|
||||
curl -XPOST "http://localhost:9200/user_info/_alias/user1"
|
||||
```
|
||||
|
||||
- 删除别名DSL语法
|
||||
|
||||
```shell
|
||||
DELETE /user_info/_alias/user1
|
||||
```
|
||||
|
||||
```shell
|
||||
curl -XDELETE "http://localhost:9200/user_info/_alias/user1"
|
||||
```
|
||||
|
||||
- 查看别名DSL语法
|
||||
|
||||
```shell
|
||||
GET /_alias/user1
|
||||
```
|
||||
|
||||
```shell
|
||||
curl -XGET "http://localhost:9200/_alias/useraa"
|
||||
```
|
||||
|
||||
Mapping 操作
|
||||
---
|
||||
|
||||
类似修改数据库中列的操作
|
||||
|
||||
### 查看 mapping
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```shell
|
||||
GET /user_info/_mapping
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XGET "http://localhost:9200/user_info/_mapping"
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 新增 mapping
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```shell
|
||||
PUT /user_info/_mapping
|
||||
{
|
||||
"properties":{
|
||||
"sex":{ "type":"keyword" }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XPUT "http://localhost:9200/user_info/_mapping" -H 'Content-Type: application/json' -d'{ "properties":{ "sex":{ "type":"keyword" } } }'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
`注意`: 需要注意的是字段映射只能增加,不能更改删除
|
||||
|
||||
文档的操作
|
||||
---
|
||||
|
||||
### 添加文档
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
#### 新增一条数据 - DSL语法
|
||||
|
||||
```shell
|
||||
POST /user_info/_doc/1
|
||||
{
|
||||
"id":1,
|
||||
"username":"username",
|
||||
"password":"123456",
|
||||
"nickname":"nickname",
|
||||
"age":18,
|
||||
"info":"一些个人相关的介绍",
|
||||
"remark":"备注信息",
|
||||
"sex":"男"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XPOST "http://localhost:9200/user_info/_doc/1" -H 'Content-Type: application/json' -d'{ "id":1, "username":"username", "password":"123456", "nickname":"nickname", "age":18, "info":"一些个人相关的介绍", "remark":"备注信息", "sex":"男" }'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 查询指定索引的所有文档
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
类似数据库中的 `select * from user_info;`
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```json
|
||||
GET /user_info/_search
|
||||
{
|
||||
"query": {
|
||||
"match_all": {}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "match_all": {} } }'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 通过 id 查询文档
|
||||
|
||||
类似数据库中的 `select * from user_info where id = 1;`
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```shell
|
||||
GET /user_info/_doc/1
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XGET "http://localhost:9200/user_info/_doc/1"
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 模糊查找
|
||||
|
||||
类似数据库中的模糊查询 `select * from user_info where info like '%人%';`
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```json
|
||||
GET /user_info/_search
|
||||
{
|
||||
"query": { "match": { "info": "人" } }
|
||||
}
|
||||
```
|
||||
|
||||
### 通过条件查询文档
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
类似数据库中的 `select * from user_info where username = 'username';`
|
||||
|
||||
#### 通过条件查询 - DSL语法
|
||||
|
||||
```json
|
||||
GET /user_info/_search
|
||||
{
|
||||
"query": {
|
||||
"bool": {
|
||||
"must": [ { "term": { "username": "username" } } ]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "must": [ { "term": { "username": "username" } } ] } } }'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 范围查找
|
||||
|
||||
类似数据库中的范围查询 `select * from user_info where age between 18 and 30;`
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```json
|
||||
GET /user_info/_search
|
||||
{
|
||||
"query": {
|
||||
"range": {
|
||||
"age": {
|
||||
"gt": 18,
|
||||
"lt": 30
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "range": { "age": { "gt": 18, "lt": 30 } } } }'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### and 查询
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
类似数据库中的 and 查询 `select * from user_info where age > 18 and sex = '男';`
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```json
|
||||
GET /user_info/_search
|
||||
{
|
||||
"query": {
|
||||
"bool": {
|
||||
"must": [
|
||||
{ "range": { "age": { "gt": 18 } } },
|
||||
{ "term": { "sex": "男" } }
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "must": [ { "range": { "age": { "gt": 17 } } }, { "term": { "sex": "男" } } ] } } }'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### limit 查找
|
||||
|
||||
类似数据库中的 limit 查询 `select * from user_info limit 10;`
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```json
|
||||
GET /user_info/_search
|
||||
{
|
||||
"size": 10,
|
||||
"query": {
|
||||
"match_all": {}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "size": 1, "query": { "match_all": {} } }'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### limit offset 查找
|
||||
|
||||
类似数据库中的 limit 查询 `select * from user_info limit 0,10;`
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```http
|
||||
GET /user_info/_search
|
||||
{
|
||||
"size": 2,
|
||||
"from": 1,
|
||||
"query": {
|
||||
"match_all": {}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "size": 2, "from": 1, "query": { "match_all": {} } }'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
#### 参数说明
|
||||
|
||||
- `size`: 10 表示我们想要返回的结果数量是10条
|
||||
- `from`: 20 表示我们想要从结果集中的第21条记录开始返回(因为偏移是从0开始的)
|
||||
- `query`: `{"match_all": {}}` 是一个匹配所有文档的查询,因为我们没有特定的查询条件,只是想要分页结果
|
||||
|
||||
### or 查询
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
类似数据库中的 or 查询 `select * from user_info where age > 18 or sex = '男';`
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```json
|
||||
GET /user_info/_search
|
||||
{
|
||||
"query": {
|
||||
"bool": {
|
||||
"should": [
|
||||
{
|
||||
"range": {
|
||||
"age": { "gt": 18 }
|
||||
}
|
||||
},
|
||||
{
|
||||
"term": { "sex": "男" }
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XGET "http://localhost:9200/user_info/_search" -H 'Content-Type: application/json' -d'{ "query": { "bool": { "should": [ { "range": { "age": { "gt": 18 } } }, { "term": { "sex": "男" } } ] } } }'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
删除文档
|
||||
---
|
||||
|
||||
### 删除指定 id
|
||||
|
||||
类似数据库中的 delete 查询 `delete from user_info where id = 3;`
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```shell
|
||||
# 删除文档
|
||||
DELETE /user_info/_doc/3
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
# 删除文档
|
||||
curl -XDELETE "http://localhost:9200/user_info/_doc/3"
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 删除指定条件
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
类似数据库中的 delete 查询 `delete from user_info where age > 18;`
|
||||
|
||||
#### DSL语法
|
||||
|
||||
```json
|
||||
POST /user_info/_delete_by_query
|
||||
{
|
||||
"query": {
|
||||
"range": { "age": { "gt": 18 } }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```shell
|
||||
curl -XPOST "http://localhost:9200/user_info/_delete_by_query" -H 'Content-Type: application/json' -d'{"query":{"range":{"age":{"gt":18}}}}'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
@ -1,7 +1,13 @@
|
||||
Electron 备忘清单
|
||||
====
|
||||
|
||||
此快速参考备忘单提供了 Electron v21 API 说明和使用示例。
|
||||
[](https://www.npmjs.com/package/electron)
|
||||
[](https://www.npmjs.com/package/electron)
|
||||
[](https://github.com/electron/electron/network/dependents)
|
||||
[](https://github.com/electron/electron)
|
||||
|
||||
此快速参考备忘单提供了 Electron v21 API 说明和使用示例
|
||||
<!--rehype:style=padding-top: 12px;-->
|
||||
|
||||
入门
|
||||
----
|
||||
|
802
docs/elixir.md
Normal file
@ -0,0 +1,802 @@
|
||||
Elixir 备忘清单
|
||||
===
|
||||
|
||||
提供基本语法和方法的 Elixir 快速参考备忘单。
|
||||
|
||||
入门
|
||||
------
|
||||
|
||||
### 安装 Elixir
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
Elixir 自带了 `iex` 这样一个交互 shell,可以随时计算 Elixir 表达式的值,运行`iex`命令,继续输入几个简单的表达式试试:
|
||||
|
||||
```shell
|
||||
iex 2+3
|
||||
5
|
||||
iex 2+3 == 5
|
||||
true
|
||||
iex String.length("快速的狐狸跳过了懒惰的狗")
|
||||
43
|
||||
```
|
||||
|
||||
每个操作系统的文档可以在[官网](https://elixir-lang.org)网站上 [Installing Elixir](http://elixir-lang.org/install.html) 部分找到
|
||||
|
||||
### hello.exs
|
||||
|
||||
```elixir
|
||||
IO.puts("Hello world from Elixir")
|
||||
```
|
||||
|
||||
Elixir 运行命令
|
||||
|
||||
```shell
|
||||
$ elixir hello.exs
|
||||
```
|
||||
|
||||
### 基本类型
|
||||
<!--rehype:wrap-class=row-span-3-->
|
||||
|
||||
Elixir 支持多种基本类型:整数、浮点、布尔值、原子和字符串。其他数据类型,如列表和元组
|
||||
|
||||
```elixir
|
||||
# integer 整数
|
||||
iex> 1
|
||||
# integer(支持2进制、8进制和16进制的整数)
|
||||
iex> 0x1F
|
||||
# float
|
||||
iex> 1.0
|
||||
# boolean
|
||||
iex> true
|
||||
# atom / symbol
|
||||
iex> :atom
|
||||
# string
|
||||
iex> "elixir"
|
||||
# list
|
||||
iex> [1, 2, 3]
|
||||
# tuple
|
||||
iex> {1, 2, 3}
|
||||
```
|
||||
|
||||
### 注释
|
||||
|
||||
```elixir
|
||||
# 这是一个单行注释
|
||||
```
|
||||
|
||||
### 字符串插值与拼接
|
||||
|
||||
```elixir
|
||||
iex> name = "Sean"
|
||||
iex> "Hello #{name}"
|
||||
"Hello Sean"
|
||||
|
||||
iex> "Hello " <> "world!"
|
||||
"Hello world!"
|
||||
```
|
||||
|
||||
### 变量和模式匹配
|
||||
|
||||
```elixir
|
||||
x = 1
|
||||
# => x 现在等于 1
|
||||
|
||||
{a, b} = {1, 2}
|
||||
# => a 等于 1,b 等于 2
|
||||
```
|
||||
|
||||
在 Elixir 中,使用 `=` 来进行赋值操作,但实际上是模式匹配。左边是模式,右边是值
|
||||
|
||||
### 原子(Atoms)
|
||||
|
||||
```elixir
|
||||
:ok
|
||||
```
|
||||
|
||||
原子是常量,它们的名称就是它们的值
|
||||
|
||||
### 列表(Lists)
|
||||
|
||||
```elixir
|
||||
list = [1, 2, 3]
|
||||
```
|
||||
|
||||
### 元组(Tuples)
|
||||
|
||||
```elixir
|
||||
tuple = {:ok, "value"}
|
||||
```
|
||||
|
||||
### 函数定义
|
||||
|
||||
```elixir
|
||||
defmodule MyModule do
|
||||
def my_function(parameter) do
|
||||
# 函数体
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
### 匿名函数
|
||||
|
||||
```elixir
|
||||
add = fn a, b -> a + b end
|
||||
```
|
||||
|
||||
### 控制结构
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
`if/else`
|
||||
|
||||
```elixir
|
||||
if x > 0 do
|
||||
"Positive"
|
||||
else
|
||||
"Non-positive"
|
||||
end
|
||||
```
|
||||
|
||||
`case`
|
||||
|
||||
```elixir
|
||||
case {1, 2} do
|
||||
{1, x} -> "Matched #{x}"
|
||||
_ -> "Not matched"
|
||||
end
|
||||
```
|
||||
|
||||
`cond`
|
||||
|
||||
```elixir
|
||||
cond do
|
||||
x > 2 -> "Greater than 2"
|
||||
x == 2 -> "Equal to 2"
|
||||
true -> "Less than 2"
|
||||
end
|
||||
```
|
||||
|
||||
### 基本算术
|
||||
<!--rehype:wrap-class=row-span-4-->
|
||||
|
||||
```elixir
|
||||
iex> 1 + 2
|
||||
3
|
||||
iex> 5 * 5
|
||||
25
|
||||
iex> 10 / 2
|
||||
5.0
|
||||
```
|
||||
|
||||
运算符`/`总是返回一个 float。如果你想做整数除法或得到除法余数,你可以调用 div 和 rem 函数:
|
||||
|
||||
```elixir
|
||||
iex> div(10, 2)
|
||||
5
|
||||
```
|
||||
|
||||
允许在调用需要一个或多个参数的函数时删除括号
|
||||
|
||||
```elixir
|
||||
iex> div 10, 2
|
||||
5
|
||||
iex> rem 10, 3
|
||||
1
|
||||
```
|
||||
|
||||
可以调用 round 函数来获取与给定浮点数最接近的整数,或者调用 trunc 函数来获取浮点数的整数部分
|
||||
|
||||
```elixir
|
||||
iex> round(3.58)
|
||||
4
|
||||
iex> trunc(3.58)
|
||||
3
|
||||
```
|
||||
|
||||
可以使用 is_integer、is_float 或 is_number 分别检查参数是否为 integer、float 或 number 类型
|
||||
|
||||
```elixir
|
||||
iex> is_integer(1)
|
||||
true
|
||||
iex> is_float(2.0)
|
||||
true
|
||||
iex> is_number(2.0)
|
||||
false
|
||||
```
|
||||
|
||||
### 布尔算术
|
||||
<!--rehype:wrap-class=row-span-4-->
|
||||
|
||||
Elixir 提供了 `||`、`&&` 和 `!` 布尔操作符,它们支持任何类型的操作:
|
||||
|
||||
```elixir
|
||||
iex> -20 || true
|
||||
-20
|
||||
iex> false || 42
|
||||
42
|
||||
|
||||
iex> 42 && true
|
||||
true
|
||||
iex> 42 && nil
|
||||
nil
|
||||
|
||||
iex> !42
|
||||
false
|
||||
iex> !false
|
||||
true
|
||||
```
|
||||
|
||||
还有三个操作符(and、or、not),它们的第一个参数**必须是布尔类型**(true 和 false):
|
||||
|
||||
```elixir
|
||||
iex> true and 42
|
||||
42
|
||||
iex> false or true
|
||||
true
|
||||
iex> not false
|
||||
true
|
||||
iex> 42 and true
|
||||
** (ArgumentError) argument error: 42
|
||||
iex> not 42
|
||||
** (ArgumentError) argument error
|
||||
```
|
||||
|
||||
### 模块和函数导入
|
||||
|
||||
```elixir
|
||||
import List, only: [duplicate: 2]
|
||||
```
|
||||
|
||||
### 管道操作符
|
||||
|
||||
```elixir
|
||||
result = data
|
||||
|> process1()
|
||||
|> process2()
|
||||
```
|
||||
|
||||
`|>` 用于链式调用函数,将前一个函数的结果作为下一个函数的第一个参数
|
||||
|
||||
### 比较运算符
|
||||
|
||||
比较运算符 :`==`, `!=`, `===`, `!==`, `<=`, `>=`, `<` 和 `>`
|
||||
|
||||
```elixir
|
||||
iex> 1 > 2
|
||||
false
|
||||
iex> 1 != 2
|
||||
true
|
||||
iex> 2 == 2
|
||||
true
|
||||
iex> 2 <= 3
|
||||
true
|
||||
```
|
||||
|
||||
集合
|
||||
------
|
||||
>
|
||||
> 列表(list)、元组(tuple)、关键字列表(keyword list)、映射(map)。
|
||||
>
|
||||
|
||||
### 列表(List)
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```elixir
|
||||
iex> [3.14, :pie, "Apple"]
|
||||
[3.14, :pie, "Apple"]
|
||||
|
||||
iex> list = [3.14, :pie, "Apple"]
|
||||
iex> [3.14, :pie, "Apple"]
|
||||
```
|
||||
|
||||
列表的开头添加元素
|
||||
|
||||
```elixir
|
||||
iex> ["π" | list]
|
||||
["π", 3.14, :pie, "Apple"]
|
||||
```
|
||||
|
||||
列表的尾部添加元素/列表拼接
|
||||
|
||||
```elixir
|
||||
iex> list ++ ["Cherry"]
|
||||
[3.14, :pie, "Apple", "Cherry"]
|
||||
|
||||
```
|
||||
|
||||
获取列表的头部元素
|
||||
|
||||
```elixir
|
||||
iex> hd [3.14, :pie, "Apple"]
|
||||
3.14
|
||||
```
|
||||
|
||||
获取列表的尾部元素
|
||||
|
||||
```elixir
|
||||
iex> tl [3.14, :pie, "Apple"]
|
||||
[:pie, "Apple"]
|
||||
```
|
||||
|
||||
### 元组(Tuple)
|
||||
|
||||
```elixir
|
||||
iex> {3.14, :pie, "Apple"}
|
||||
{3.14, :pie, "Apple"}
|
||||
```
|
||||
|
||||
### 关键字列表(Keyword List)
|
||||
|
||||
```elixir
|
||||
iex> [foo: "bar", hello: "world"]
|
||||
[foo: "bar", hello: "world"]
|
||||
iex> [{:foo, "bar"}, {:hello, "world"}]
|
||||
[foo: "bar", hello: "world"]
|
||||
```
|
||||
|
||||
关键字列表非常重要,它有以下的特性:
|
||||
|
||||
- 键(key)都是原子(atom)
|
||||
- 键(key)是有序的(定义后,顺序不会改变)
|
||||
- 键(key)不必是唯一的
|
||||
|
||||
因为这些原因,常见的用法是作为参数传递给函数
|
||||
|
||||
### 映射(Map)
|
||||
|
||||
Elixir 的映射(maps)是键值对结构的第一选择,和关键字列表(keywords)不同,映射允许任意类型的数据作为键,而且数据并不严格排序。 你可以使用 %{} 来定义映射:
|
||||
|
||||
```elixir
|
||||
iex> map = %{:foo => "bar", "hello" => :world}
|
||||
%{:foo => "bar", "hello" => :world}
|
||||
iex> map[:foo]
|
||||
"bar"
|
||||
iex> map["hello"]
|
||||
:world
|
||||
```
|
||||
|
||||
模式匹配
|
||||
------
|
||||
|
||||
>
|
||||
> 模式匹配是 Elixir 很强大的特性,它允许我们匹配简单值、数据结构、甚至函数。
|
||||
>
|
||||
|
||||
### 匹配元组
|
||||
|
||||
```elixir
|
||||
iex> {a, b, c} = {:hello, "world", 42}
|
||||
{:hello, "world", 42}
|
||||
iex> a
|
||||
:hello
|
||||
iex> b
|
||||
"world"
|
||||
```
|
||||
|
||||
### 匹配列表
|
||||
|
||||
```
|
||||
iex> [a, b, c] = [1, 2, 3]
|
||||
[1, 2, 3]
|
||||
iex> a
|
||||
1
|
||||
```
|
||||
|
||||
### 匹配列表的头部元素
|
||||
|
||||
```
|
||||
iex> [head | tail] = [1, 2, 3]
|
||||
[1, 2, 3]
|
||||
iex> head
|
||||
1
|
||||
iex> tail
|
||||
[2, 3]
|
||||
```
|
||||
|
||||
### Pin 操作符
|
||||
|
||||
pin 操作符,就是用已经绑定的值去匹配,而不是重新绑定一个新值。
|
||||
|
||||
```elixir
|
||||
iex> {x, ^x} = {2, 1}
|
||||
{2, 1}
|
||||
iex> x
|
||||
2
|
||||
```
|
||||
|
||||
### 使用下划线 `_` 忽略匹配的值
|
||||
|
||||
```elixir
|
||||
iex> [head | _] = [1, 2, 3]
|
||||
[1, 2, 3]
|
||||
iex> head
|
||||
1
|
||||
```
|
||||
|
||||
控制语句
|
||||
------
|
||||
|
||||
### if/else/end
|
||||
|
||||
```elixir
|
||||
if condition do
|
||||
# 条件成立时执行的代码
|
||||
else
|
||||
# 条件不成立时执行的代码
|
||||
end
|
||||
```
|
||||
|
||||
### case/end
|
||||
|
||||
```elixir
|
||||
case expression do
|
||||
pattern1 -> # 匹配 pattern1 时执行的代码
|
||||
pattern2 -> # 匹配 pattern2 时执行的代码
|
||||
_ -> # 其他情况执行的代码
|
||||
end
|
||||
```
|
||||
|
||||
### cond/end
|
||||
|
||||
```elixir
|
||||
cond do
|
||||
condition1 -> # 条件1成立时执行的代码
|
||||
condition2 -> # 条件2成立时执行的代码
|
||||
true -> # 如果没有任何条件成立,执行这里的代码
|
||||
end
|
||||
```
|
||||
|
||||
### unless/do/end
|
||||
|
||||
```elixir
|
||||
unless condition do
|
||||
# 条件为假时执行的代码
|
||||
end
|
||||
```
|
||||
|
||||
### try/rescue/end
|
||||
|
||||
```elixir
|
||||
try do
|
||||
# 可能会引发异常的代码
|
||||
rescue
|
||||
pattern1 -> # 匹配 pattern1 的异常处理代码
|
||||
pattern2 -> # 匹配 pattern2 的异常处理代码
|
||||
_ -> # 其他异常处理代码
|
||||
end
|
||||
```
|
||||
|
||||
### case
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
允许将一个值与许多模式进行比较,直到找到匹配的模式:
|
||||
|
||||
```elixir
|
||||
iex> case {1, 2, 3} do
|
||||
{4, 5, 6} ->
|
||||
"This clause won't match"
|
||||
{1, x, 3} ->
|
||||
"该子句将匹配并绑定 x 到该子句中的 2"
|
||||
_ ->
|
||||
"This clause would match any value"
|
||||
end
|
||||
"该子句将匹配并绑定 x 到该子句中的 2"
|
||||
```
|
||||
|
||||
还可以使用when指定额外的条件
|
||||
|
||||
```elixir
|
||||
iex> case {1, 2, 3} do
|
||||
{1, x, 3} when x > 0 ->
|
||||
"Will match"
|
||||
_ ->
|
||||
"如果不满足保护条件,将匹配"
|
||||
end
|
||||
"Will match"
|
||||
```
|
||||
|
||||
### cond
|
||||
|
||||
当我们需要根据条件进行匹配而不是值时,类似于其他语言的 `else if` 或 `elsif`,可以使用 `cond` 控制结构。
|
||||
|
||||
```elixir
|
||||
iex> cond do
|
||||
2 + 2 == 5 ->
|
||||
"This will not be true"
|
||||
2 * 2 == 3 ->
|
||||
"Nor this"
|
||||
1 + 1 == 2 ->
|
||||
"But this will"
|
||||
end
|
||||
"But this will"
|
||||
```
|
||||
|
||||
如果所有的条件都返回 `nil` 或 `false`,则会引发一个错误(CondClauseError)。因此,需要添加一个 `final` 条件,等于 `true`,它将始终匹配:
|
||||
|
||||
```elixir
|
||||
iex> cond do
|
||||
2 + 2 == 5 ->
|
||||
"This is never true"
|
||||
2 * 2 == 3 ->
|
||||
"Nor this"
|
||||
true ->
|
||||
"这始终为真(等同于 else)"
|
||||
end
|
||||
"这始终为真(等同于 else)"
|
||||
```
|
||||
|
||||
### 变量的作用域
|
||||
|
||||
如果在if、case和类似的构造中声明或更改了任何变量,则声明和更改将只在构造中可见。
|
||||
|
||||
```elixir
|
||||
iex> x = 1
|
||||
1
|
||||
if true do
|
||||
x = x + 1
|
||||
end
|
||||
2
|
||||
iex> x
|
||||
1
|
||||
```
|
||||
|
||||
如果要更改值,则必须从if返回值:
|
||||
|
||||
```elixir
|
||||
iex> x = 1
|
||||
1
|
||||
iex> x = if true do
|
||||
x + 1
|
||||
else
|
||||
x
|
||||
end
|
||||
2
|
||||
```
|
||||
|
||||
函数
|
||||
------
|
||||
|
||||
### 函数定义
|
||||
|
||||
```elixir
|
||||
def function_name(param1, param2) do
|
||||
# 函数体
|
||||
end
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```elixir
|
||||
def sum(a, b) do
|
||||
a + b
|
||||
end
|
||||
```
|
||||
|
||||
### 模式匹配的多个函数定义
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```elixir
|
||||
def fun_name(:atom) do
|
||||
# 对于 :atom 的处理
|
||||
end
|
||||
|
||||
def fun_name("string") do
|
||||
# 对于 "string" 的处理
|
||||
end
|
||||
|
||||
def fun_name(number) when is_integer(number) do
|
||||
# 对于整数的处理
|
||||
end
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```elixir
|
||||
def is_positive(number) when number > 0 do
|
||||
true
|
||||
end
|
||||
|
||||
def is_positive(_), do: false
|
||||
```
|
||||
|
||||
### 函数调用
|
||||
|
||||
```elixir
|
||||
module_name.function_name(arg1, arg2)
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```elixir
|
||||
Enum.map([1, 2, 3], &(&1 * 2))
|
||||
```
|
||||
|
||||
### 函数参数默认值
|
||||
|
||||
```elixir
|
||||
def function_name(parameter \\ 默认值) do
|
||||
# 函数体
|
||||
end
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```elixir
|
||||
def greet(name \\ "World") do
|
||||
"Hello, #{name}!"
|
||||
end
|
||||
```
|
||||
|
||||
### 可变参数数量
|
||||
|
||||
```elixir
|
||||
def function_name(param1, param2 \\ []) do
|
||||
# 函数体
|
||||
end
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```elixir
|
||||
def sum(numbers) do
|
||||
Enum.sum(numbers)
|
||||
end
|
||||
```
|
||||
|
||||
### 函数文档注释
|
||||
|
||||
```elixir
|
||||
@doc """
|
||||
这是函数的文档。
|
||||
"""
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```elixir
|
||||
@doc """
|
||||
Adds two numbers together.
|
||||
|
||||
## 示例
|
||||
|
||||
iex> MyModule.add(1, 2)
|
||||
3
|
||||
"""
|
||||
def add(a, b) do
|
||||
a + b
|
||||
end
|
||||
```
|
||||
|
||||
这些是 Elixir 函数语法的基本要点,可以帮助你开始编写函数。
|
||||
|
||||
### 匿名函数
|
||||
|
||||
```elixir
|
||||
iex> sum = fn (a, b) -> a + b end
|
||||
iex> sum.(2, 3)
|
||||
5
|
||||
```
|
||||
|
||||
可以使用 & 语法来简化匿名函数的定义:
|
||||
|
||||
```elixir
|
||||
iex> sum = &(&1 + &2)
|
||||
iex> sum.(2, 3)
|
||||
5
|
||||
```
|
||||
|
||||
### 闭包
|
||||
|
||||
匿名函数去引用外部的变量,这通常被称为闭包。
|
||||
|
||||
```elixir
|
||||
iex> double = fn a -> add.(a, a) end
|
||||
#Function<6.71889879/1 in :erl_eval.expr/5>
|
||||
double.(2)
|
||||
4
|
||||
```
|
||||
|
||||
闭包与守卫
|
||||
|
||||
```elixir
|
||||
iex> f = fn
|
||||
x, y when x > 0 -> x + y
|
||||
x, y -> x * y
|
||||
end
|
||||
|
||||
iex> f.(1, 3)
|
||||
4
|
||||
iex> f.(-1, 3)
|
||||
-3
|
||||
```
|
||||
|
||||
### 命名函数
|
||||
|
||||
命名函数是通过 def 关键字定义在某个模块中
|
||||
|
||||
```elixir
|
||||
defmodule Greeter do
|
||||
def hello(name) do
|
||||
"Hello, " <> name
|
||||
end
|
||||
end
|
||||
|
||||
iex> Greeter.hello("Sean")
|
||||
"Hello, Sean"
|
||||
```
|
||||
|
||||
简写为一行:
|
||||
|
||||
```elixir
|
||||
defmodule Greeter do
|
||||
def hello(name), do: "Hello, " <> name
|
||||
end
|
||||
```
|
||||
|
||||
私有函数
|
||||
|
||||
```elixir
|
||||
defmodule Greeter do
|
||||
def hello(name), do: phrase <> name
|
||||
# 使用defp来定义私有函数
|
||||
defp phrase, do: "Hello, "
|
||||
end
|
||||
```
|
||||
|
||||
函数的默认参数:使用 `\\` 来定义默认参数
|
||||
|
||||
```elixir
|
||||
defmodule Greeter do
|
||||
def hello(name, language_code \\ "en") do
|
||||
phrase(language_code) <> name
|
||||
end
|
||||
|
||||
defp phrase("en"), do: "Hello, "
|
||||
defp phrase("es"), do: "Hola, "
|
||||
end
|
||||
```
|
||||
|
||||
Enumerables 与 Streams
|
||||
------
|
||||
>
|
||||
> Elixir 提供了 Enum 和 Stream 两个模块,用于处理集合。
|
||||
>
|
||||
### Enum
|
||||
>
|
||||
> Enum 模块提供了对集合的常用操作,如 map、filter、reduce、sort、chunk、join、into 等。
|
||||
|
||||
```elixir
|
||||
iex> Enum.map([1, 2, 3], fn x -> x * 2 end)
|
||||
[2, 4, 6]
|
||||
iex> Enum.map(%{1 => 2, 3 => 4}, fn {k, v} -> k * v end)
|
||||
[2, 12]
|
||||
```
|
||||
|
||||
### Stream
|
||||
>
|
||||
> 作为Enum的替代品,Elixir提供了支持懒惰操作的Stream模块
|
||||
|
||||
```elixir
|
||||
iex> 1..100_000 |> Stream.map(&(&1 * 3)) |> Stream.filter(odd?) |> Enum.sum()
|
||||
7500000000
|
||||
```
|
||||
|
||||
> 流文件操作
|
||||
|
||||
```elixir
|
||||
iex> stream = File.stream!("path/to/file")
|
||||
%File.Stream{
|
||||
line_or_bytes: :line,
|
||||
modes: [:raw, :read_ahead, :binary],
|
||||
path: "path/to/file",
|
||||
raw: true
|
||||
}
|
||||
Enum.take(stream, 10)
|
||||
|
||||
# 上面的例子将提取所选文件的前10行。这意味着流对于处理大型文件甚至是网络资源等慢速资源非常有用。
|
||||
```
|
||||
|
||||
另见
|
||||
----
|
||||
|
||||
- [Elixir 官方](https://elixir-lang.org/) _(elixir-lang.org)_
|
||||
- [Elixir School](https://elixirschool.com/) _(elixirschool.com)_
|
@ -78,9 +78,9 @@ $ emacs
|
||||
:- | :-
|
||||
:- | :-
|
||||
`C-g` | 中止部分键入或执行的命令
|
||||
`M-x` 恢复会话 | 恢复因系统崩溃而丢失的文件
|
||||
`M-x` recover-session | 恢复因系统崩溃而丢失的文件
|
||||
`C-x` `u` `C-_` `C-/` | 撤消不需要的更改
|
||||
`M-x` 恢复缓冲器 | 将缓冲区恢复到其原始内容
|
||||
`M-x` revert-buffer | 将缓冲区恢复到其原始内容
|
||||
`C-l` | 重绘垃圾屏幕
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
@ -293,9 +293,9 @@ $ emacs
|
||||
:- | :-
|
||||
`M-.` | 查找标签(定义)
|
||||
`C-u` `M-.` | 查找标签的下一个出现
|
||||
`M-x` 访问标签表 | 指定一个新的标签文件
|
||||
`M-x` 标签搜索 | 正则表达式搜索标签表中的所有文件
|
||||
`M-x` 标签查询替换 | 对所有文件运行查询替换
|
||||
`M-x` visit-tags-table | 指定一个新的标签文件
|
||||
`M-x` tags-search | 正则表达式搜索标签表中的所有文件
|
||||
`M-x` tags-query-replace | 对所有文件运行查询替换
|
||||
`M-,` | 继续最后一个标签搜索或查询替换
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
@ -494,9 +494,9 @@ Emacs 搜索
|
||||
:- | :-
|
||||
:- | :-
|
||||
`M-$` | 检查当前单词的拼写
|
||||
`M-x` ispell 地区 | 检查区域内所有单词的拼写
|
||||
`M-x` ispell 缓冲区 | 检查整个缓冲区的拼写
|
||||
`M-x` flyspell 模式 | 切换即时拼写检查
|
||||
`M-x` ispell-region | 检查区域内所有单词的拼写
|
||||
`M-x` ispell-buffer | 检查整个缓冲区的拼写
|
||||
`M-x` flyspell-mode | 切换即时拼写检查
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 编写命令
|
||||
|
118
docs/emoji.md
@ -3,8 +3,109 @@ Emoji 备忘清单
|
||||
|
||||
有些表情符号代码不太容易记住,所以这里有一个小备忘单。
|
||||
|
||||
入门
|
||||
----------
|
||||
分类
|
||||
----
|
||||
|
||||
### 笑脸
|
||||
<!--rehype:wrap-style=font-size: 27px;-->
|
||||
|
||||
😀 😃 😄 😁 😆 😅 😂 🤣 🥲 🥹 ☺️
|
||||
😊 😇 🙂 🙃 😉 😌 😍 🥰 😘 😗 😙
|
||||
😚 😋 😛 😝 😜 🤪 🤨 🧐 🤓 😎 🥸
|
||||
🤩 🥳 😏 😒 😞 😔 😟 😕 🙁 ☹️ 😣
|
||||
😖 😫 😩 🥺 😢 😭 😮💨 😤 😠 😡 🤬
|
||||
🤯 😳 🥵 🥶 😱 😨 😰 😥 😓 🫣 🤗
|
||||
🫡 🤔 🫢 🤭 🤫 🤥 😶 😶🌫️ 😐 😑 😬
|
||||
🫨 🫠 🙄 😯 😦 😧 😮 😲 🥱 😴 🤤
|
||||
😪 😵 😵💫 🫥 🤐 🥴 🤢 🤮 🤧 😷 🤒
|
||||
🤕 🤑 🤠 😈 👿 👹 👺 🤡 💩 👻 💀
|
||||
☠️ 👽 👾 🤖 🎃
|
||||
😺 😸 😹 😻 😼 😽 🙀 😿 😾
|
||||
|
||||
### 人与幻想
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-2-->
|
||||
|
||||
👶 👧 🧒 👦 👩 🧑 👨 👩🦱 🧑🦱 👨🦱 👩🦰 🧑🦰 👨🦰 👱♀️ 👱 👱♂️ 👩🦳 🧑🦳 👨🦳 👩🦲 🧑🦲 👨🦲 🧔♀️ 🧔 🧔♂️ 👵 🧓 👴 👲 👳♀️ 👳 👳♂️ 🧕 👮♀️ 👮 👮♂️ 👷♀️ 👷 👷♂️ 💂♀️ 💂 💂♂️ 🕵️♀️ 🕵️ 🕵️♂️ 👩⚕️ 🧑⚕️ 👨⚕️ 👩🌾 🧑🌾 👨🌾 👩🍳 🧑🍳 👨🍳 👩🎓 🧑🎓 👨🎓 👩🎤 🧑🎤 👨🎤 👩🏫 🧑🏫 👨🏫 👩🏭 🧑🏭 👨🏭 👩💻 🧑💻 👨💻 👩💼 🧑💼 👨💼 👩🔧 🧑🔧 👨🔧 👩🔬 🧑🔬 👨🔬 👩🎨 🧑🎨 👨🎨 👩🚒 🧑🚒 👨🚒 👩✈️ 🧑✈️ 👨✈️ 👩🚀 🧑🚀 👨🚀 👩⚖️ 🧑⚖️ 👨⚖️ 👰♀️ 👰 👰♂️ 🤵♀️ 🤵 🤵♂️ 👸 🫅 🤴 🥷 🦸♀️ 🦸 🦸♂️ 🦹♀️ 🦹 🦹♂️ 🤶 🧑🎄 🎅 🧙♀️ 🧙 🧙♂️ 🧝♀️ 🧝 🧝♂️ 🧛♀️ 🧛 🧛♂️ 🧟♀️ 🧟 🧟♂️ 🧞♀️ 🧞 🧞♂️ 🧜♀️ 🧜 🧜♂️ 🧚♀️ 🧚 🧚♂️ 🧌 👼 🤰 🫄 🫃 🤱 👩🍼 🧑🍼 👨🍼 🙇♀️ 🙇 🙇♂️ 💁♀️ 💁 💁♂️ 🙅♀️ 🙅 🙅♂️ 🙆♀️ 🙆 🙆♂️ 🙋♀️ 🙋 🙋♂️ 🧏♀️ 🧏 🧏♂️ 🤦♀️ 🤦 🤦♂️ 🤷♀️ 🤷 🤷♂️ 🙎♀️ 🙎 🙎♂️ 🙍♀️ 🙍 🙍♂️ 💇♀️ 💇 💇♂️ 💆♀️ 💆 💆♂️ 🧖♀️ 🧖 🧖♂️ 💅 🤳 💃 🕺 👯♀️ 👯 👯♂️ 🕴 👩🦽 🧑🦽 👨🦽 👩🦼 🧑🦼 👨🦼 🚶♀️ 🚶 🚶♂️ 👩🦯 🧑🦯 👨🦯 🧎♀️ 🧎 🧎♂️ 🏃♀️ 🏃 🏃♂️ 🧍♀️ 🧍 🧍♂️ 👭 🧑🤝🧑 👬 👫 👩❤️👩 💑 👨❤️👨 👩❤️👨 👩❤️💋👩 💏 👨❤️💋👨 👩❤️💋👨 👪 👨👩👦 👨👩👧 👨👩👧👦 👨👩👦👦 👨👩👧👧 👨👨👦 👨👨👧 👨👨👧👦 👨👨👦👦 👨👨👧👧 👩👩👦 👩👩👧 👩👩👧👦 👩👩👦👦 👩👩👧👧 👨👦 👨👦👦 👨👧 👨👧👦 👨👧👧 👩👦 👩👦👦 👩👧 👩👧👦 👩👧👧 🗣 👤 👥 🫂
|
||||
|
||||
### 手势和身体部位
|
||||
<!--rehype:wrap-style=font-size: 32px;-->
|
||||
|
||||
👋 🤚 🖐 ✋ 🖖 👌 🤌 🤏 ✌️ 🤞 🫰 🤟 🤘 🤙 🫵 🫱 🫲 🫸 🫷 🫳 🫴 👈 👉 👆 🖕 👇 ☝️ 👍 👎 ✊ 👊 🤛 🤜 👏 🫶 🙌 👐 🤲 🤝 🙏 ✍️ 💅 🤳 💪 🦾 🦵 🦿 🦶 👣 👂 🦻 👃 🫀 🫁 🧠 🦷 🦴 👀 👁 👅 👄 🫦 💋 🩸
|
||||
|
||||
### 苍白的表情符号
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-2 row-span-2-->
|
||||
|
||||
👋🏻 🤚🏻 🖐🏻 ✋🏻 🖖🏻 👌🏻 🤌🏻 🤏🏻 ✌🏻 🤞🏻 🫰🏻 🤟🏻 🤘🏻 🤙🏻 🫵🏻 🫱🏻 🫲🏻 🫸🏻 🫷🏻 🫳🏻 🫴🏻 👈🏻 👉🏻 👆🏻 🖕🏻 👇🏻 ☝🏻 👍🏻 👎🏻 ✊🏻 👊🏻 🤛🏻 🤜🏻 👏🏻 🫶🏻 🙌🏻 👐🏻 🤲🏻 🙏🏻 ✍🏻 💅🏻 🤳🏻 💪🏻 🦵🏻 🦶🏻 👂🏻 🦻🏻 👃🏻
|
||||
👶🏻 👧🏻 🧒🏻 👦🏻 👩🏻 🧑🏻 👨🏻 👩🏻🦱 🧑🏻🦱 👨🏻🦱 👩🏻🦰 🧑🏻🦰 👨🏻🦰 👱🏻♀️ 👱🏻 👱🏻♂️ 👩🏻🦳 🧑🏻🦳 👨🏻🦳 👩🏻🦲 🧑🏻🦲 👨🏻🦲 🧔🏻♀️ 🧔🏻 🧔🏻♂️ 👵🏻 🧓🏻 👴🏻 👲🏻 👳🏻♀️ 👳🏻 👳🏻♂️ 🧕🏻 👮🏻♀️ 👮🏻 👮🏻♂️ 👷🏻♀️ 👷🏻 👷🏻♂️ 💂🏻♀️ 💂🏻 💂🏻♂️ 🕵🏻♀️ 🕵🏻 🕵🏻♂️ 👩🏻⚕️ 🧑🏻⚕️ 👨🏻⚕️ 👩🏻🌾 🧑🏻🌾 👨🏻🌾 👩🏻🍳 🧑🏻🍳 👨🏻🍳 👩🏻🎓 🧑🏻🎓 👨🏻🎓 👩🏻🎤 🧑🏻🎤 👨🏻🎤 👩🏻🏫 🧑🏻🏫 👨🏻🏫 👩🏻🏭 🧑🏻🏭 👨🏻🏭 👩🏻💻 🧑🏻💻 👨🏻💻 👩🏻💼 🧑🏻💼 👨🏻💼 👩🏻🔧 🧑🏻🔧 👨🏻🔧 👩🏻🔬 🧑🏻🔬 👨🏻🔬 👩🏻🎨 🧑🏻🎨 👨🏻🎨 👩🏻🚒 🧑🏻🚒 👨🏻🚒 👩🏻✈️ 🧑🏻✈️ 👨🏻✈️ 👩🏻🚀 🧑🏻🚀 👨🏻🚀 👩🏻⚖️ 🧑🏻⚖️ 👨🏻⚖️ 👰🏻♀️ 👰🏻 👰🏻♂️ 🤵🏻♀️ 🤵🏻 🤵🏻♂️ 👸🏻 🫅🏻 🤴🏻 🥷🏻 🦸🏻♀️ 🦸🏻 🦸🏻♂️ 🦹🏻♀️ 🦹🏻 🦹🏻♂️ 🤶🏻 🧑🏻🎄 🎅🏻 🧙🏻♀️ 🧙🏻 🧙🏻♂️ 🧝🏻♀️ 🧝🏻 🧝🏻♂️ 🧛🏻♀️ 🧛🏻 🧛🏻♂️ 🧜🏻♀️ 🧜🏻 🧜🏻♂️ 🧚🏻♀️ 🧚🏻 🧚🏻♂️ 👼🏻 🤰🏻 🫄🏻 🫃🏻 🤱🏻 👩🏻🍼 🧑🏻🍼 👨🏻🍼 🙇🏻♀️ 🙇🏻 🙇🏻♂️ 💁🏻♀️ 💁🏻 💁🏻♂️ 🙅🏻♀️ 🙅🏻 🙅🏻♂️ 🙆🏻♀️ 🙆🏻 🙆🏻♂️ 🙋🏻♀️ 🙋🏻 🙋🏻♂️ 🧏🏻♀️ 🧏🏻 🧏🏻♂️ 🤦🏻♀️ 🤦🏻 🤦🏻♂️ 🤷🏻♀️ 🤷🏻 🤷🏻♂️ 🙎🏻♀️ 🙎🏻 🙎🏻♂️ 🙍🏻♀️ 🙍🏻 🙍🏻♂️ 💇🏻♀️ 💇🏻 💇🏻♂️ 💆🏻♀️ 💆🏻 💆🏻♂️ 🧖🏻♀️ 🧖🏻 🧖🏻♂️ 💃🏻 🕺🏻 🕴🏻 👩🏻🦽 🧑🏻🦽 👨🏻🦽 👩🏻🦼 🧑🏻🦼 👨🏻🦼 🚶🏻♀️ 🚶🏻 🚶🏻♂️ 👩🏻🦯 🧑🏻🦯 👨🏻🦯 🧎🏻♀️ 🧎🏻 🧎🏻♂️ 🏃🏻♀️ 🏃🏻 🏃🏻♂️ 🧍🏻♀️ 🧍🏻 🧍🏻♂️ 👭🏻 🧑🏻🤝🧑🏻 👬🏻 👫🏻 🧗🏻♀️ 🧗🏻 🧗🏻♂️ 🏇🏻 🏂🏻 🏌🏻♀️ 🏌🏻 🏌🏻♂️ 🏄🏻♀️ 🏄🏻 🏄🏻♂️ 🚣🏻♀️ 🚣🏻 🚣🏻♂️ 🏊🏻♀️ 🏊🏻 🏊🏻♂️ ⛹🏻♀️ ⛹🏻 ⛹🏻♂️ 🏋🏻♀️ 🏋🏻 🏋🏻♂️ 🚴🏻♀️ 🚴🏻 🚴🏻♂️ 🚵🏻♀️ 🚵🏻 🚵🏻♂️ 🤸🏻♀️ 🤸🏻 🤸🏻♂️ 🤽🏻♀️ 🤽🏻 🤽🏻♂️ 🤾🏻♀️ 🤾🏻 🤾🏻♂️ 🤹🏻♀️ 🤹🏻 🤹🏻♂️ 🧘🏻♀️ 🧘🏻 🧘🏻♂️ 🛀🏻 🛌🏻
|
||||
|
||||
### 服装和配饰
|
||||
<!--rehype:wrap-style=font-size: 26px;-->
|
||||
|
||||
🧳 🌂 ☂️ 🧵 🪡 🪢 🪭 🧶 👓 🕶 🥽
|
||||
🥼 🦺 👔 👕 👖 🧣 🧤 🧥 🧦 👗 👘 🥻 🩴 🩱 🩲 🩳 👙 👚 👛 👜 👝 🎒 👞 👟 🥾 🥿 👠 👡 🩰 👢 👑 👒 🎩 🎓 🧢 ⛑ 🪖 💄 💍 💼
|
||||
|
||||
### 奶油白色表情符号
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-3-->
|
||||
|
||||
👋🏼 🤚🏼 🖐🏼 ✋🏼 🖖🏼 👌🏼 🤌🏼 🤏🏼 ✌🏼 🤞🏼 🫰🏼 🤟🏼 🤘🏼 🤙🏼 🫵🏼 🫱🏼 🫲🏼 🫸🏼 🫷🏼 🫳🏼 🫴🏼 👈🏼 👉🏼 👆🏼 🖕🏼 👇🏼 ☝🏼 👍🏼 👎🏼 ✊🏼 👊🏼 🤛🏼 🤜🏼 👏🏼 🫶🏼 🙌🏼 👐🏼 🤲🏼 🙏🏼 ✍🏼 💅🏼 🤳🏼 💪🏼 🦵🏼 🦶🏼 👂🏼 🦻🏼 👃🏼 👶🏼 👧🏼 🧒🏼 👦🏼 👩🏼 🧑🏼 👨🏼 👩🏼🦱 🧑🏼🦱 👨🏼🦱 👩🏼🦰 🧑🏼🦰 👨🏼🦰 👱🏼♀️ 👱🏼 👱🏼♂️ 👩🏼🦳 🧑🏼🦳 👨🏼🦳 👩🏼🦲 🧑🏼🦲 👨🏼🦲 🧔🏼♀️ 🧔🏼 🧔🏼♂️ 👵🏼 🧓🏼 👴🏼 👲🏼 👳🏼♀️ 👳🏼 👳🏼♂️ 🧕🏼 👮🏼♀️ 👮🏼 👮🏼♂️ 👷🏼♀️ 👷🏼 👷🏼♂️ 💂🏼♀️ 💂🏼 💂🏼♂️ 🕵🏼♀️ 🕵🏼 🕵🏼♂️ 👩🏼⚕️ 🧑🏼⚕️ 👨🏼⚕️ 👩🏼🌾 🧑🏼🌾 👨🏼🌾 👩🏼🍳 🧑🏼🍳 👨🏼🍳 👩🏼🎓 🧑🏼🎓 👨🏼🎓 👩🏼🎤 🧑🏼🎤 👨🏼🎤 👩🏼🏫 🧑🏼🏫 👨🏼🏫 👩🏼🏭 🧑🏼🏭 👨🏼🏭 👩🏼💻 🧑🏼💻 👨🏼💻 👩🏼💼 🧑🏼💼 👨🏼💼 👩🏼🔧 🧑🏼🔧 👨🏼🔧 👩🏼🔬 🧑🏼🔬 👨🏼🔬 👩🏼🎨 🧑🏼🎨 👨🏼🎨 👩🏼🚒 🧑🏼🚒 👨🏼🚒 👩🏼✈️ 🧑🏼✈️ 👨🏼✈️ 👩🏼🚀 🧑🏼🚀 👨🏼🚀 👩🏼⚖️ 🧑🏼⚖️ 👨🏼⚖️ 👰🏼♀️ 👰🏼 👰🏼♂️ 🤵🏼♀️ 🤵🏼 🤵🏼♂️ 👸🏼 🫅🏼 🤴🏼 🥷🏼 🦸🏼♀️ 🦸🏼 🦸🏼♂️ 🦹🏼♀️ 🦹🏼 🦹🏼♂️ 🤶🏼 🧑🏼🎄 🎅🏼 🧙🏼♀️ 🧙🏼 🧙🏼♂️ 🧝🏼♀️ 🧝🏼 🧝🏼♂️ 🧛🏼♀️ 🧛🏼 🧛🏼♂️ 🧜🏼♀️ 🧜🏼 🧜🏼♂️ 🧚🏼♀️ 🧚🏼 🧚🏼♂️ 👼🏼 🤰🏼 🫄🏼 🫃🏼 🤱🏼 👩🏼🍼 🧑🏼🍼 👨🏼🍼 🙇🏼♀️ 🙇🏼 🙇🏼♂️ 💁🏼♀️ 💁🏼 💁🏼♂️ 🙅🏼♀️ 🙅🏼 🙅🏼♂️ 🙆🏼♀️ 🙆🏼 🙆🏼♂️ 🙋🏼♀️ 🙋🏼 🙋🏼♂️ 🧏🏼♀️ 🧏🏼 🧏🏼♂️ 🤦🏼♀️ 🤦🏼 🤦🏼♂️ 🤷🏼♀️ 🤷🏼 🤷🏼♂️ 🙎🏼♀️ 🙎🏼 🙎🏼♂️ 🙍🏼♀️ 🙍🏼 🙍🏼♂️ 💇🏼♀️ 💇🏼 💇🏼♂️ 💆🏼♀️ 💆🏼 💆🏼♂️ 🧖🏼♀️ 🧖🏼 🧖🏼♂️ 💃🏼 🕺🏼 🕴🏼 👩🏼🦽 🧑🏼🦽 👨🏼🦽 👩🏼🦼 🧑🏼🦼 👨🏼🦼 🚶🏼♀️ 🚶🏼 🚶🏼♂️ 👩🏼🦯 🧑🏼🦯 👨🏼🦯 🧎🏼♀️ 🧎🏼 🧎🏼♂️ 🏃🏼♀️ 🏃🏼 🏃🏼♂️ 🧍🏼♀️ 🧍🏼 🧍🏼♂️ 👭🏼 🧑🏼🤝🧑🏼 👬🏼 👫🏼 🧗🏼♀️ 🧗🏼 🧗🏼♂️ 🏇🏼 🏂🏼 🏌🏼♀️ 🏌🏼 🏌🏼♂️ 🏄🏼♀️ 🏄🏼 🏄🏼♂️ 🚣🏼♀️ 🚣🏼 🚣🏼♂️ 🏊🏼♀️ 🏊🏼 🏊🏼♂️ ⛹🏼♀️ ⛹🏼 ⛹🏼♂️ 🏋🏼♀️ 🏋🏼 🏋🏼♂️ 🚴🏼♀️ 🚴🏼 🚴🏼♂️ 🚵🏼♀️ 🚵🏼 🚵🏼♂️ 🤸🏼♀️ 🤸🏼 🤸🏼♂️ 🤽🏼♀️ 🤽🏼 🤽🏼♂️ 🤾🏼♀️ 🤾🏼 🤾🏼♂️ 🤹🏼♀️ 🤹🏼 🤹🏼♂️ 🧘🏼♀️ 🧘🏼 🧘🏼♂️ 🛀🏼 🛌🏼
|
||||
|
||||
### 棕色表情符号
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-3-->
|
||||
|
||||
👋🏽 🤚🏽 🖐🏽 ✋🏽 🖖🏽 👌🏽 🤌🏽 🤏🏽 ✌🏽 🤞🏽 🫰🏽 🤟🏽 🤘🏽 🤙🏽 🫵🏽 🫱🏽 🫲🏽 🫸🏽 🫷🏽 🫳🏽 🫴🏽 👈🏽 👉🏽 👆🏽 🖕🏽 👇🏽 ☝🏽 👍🏽 👎🏽 ✊🏽 👊🏽 🤛🏽 🤜🏽 👏🏽 🫶🏽 🙌🏽 👐🏽 🤲🏽 🙏🏽 ✍🏽 💅🏽 🤳🏽 💪🏽 🦵🏽 🦶🏽 👂🏽 🦻🏽 👃🏽 👶🏽 👧🏽 🧒🏽 👦🏽 👩🏽 🧑🏽 👨🏽 👩🏽🦱 🧑🏽🦱 👨🏽🦱 👩🏽🦰 🧑🏽🦰 👨🏽🦰 👱🏽♀️ 👱🏽 👱🏽♂️ 👩🏽🦳 🧑🏽🦳 👨🏽🦳 👩🏽🦲 🧑🏽🦲 👨🏽🦲 🧔🏽♀️ 🧔🏽 🧔🏽♂️ 👵🏽 🧓🏽 👴🏽 👲🏽 👳🏽♀️ 👳🏽 👳🏽♂️ 🧕🏽 👮🏽♀️ 👮🏽 👮🏽♂️ 👷🏽♀️ 👷🏽 👷🏽♂️ 💂🏽♀️ 💂🏽 💂🏽♂️ 🕵🏽♀️ 🕵🏽 🕵🏽♂️ 👩🏽⚕️ 🧑🏽⚕️ 👨🏽⚕️ 👩🏽🌾 🧑🏽🌾 👨🏽🌾 👩🏽🍳 🧑🏽🍳 👨🏽🍳 👩🏽🎓 🧑🏽🎓 👨🏽🎓 👩🏽🎤 🧑🏽🎤 👨🏽🎤 👩🏽🏫 🧑🏽🏫 👨🏽🏫 👩🏽🏭 🧑🏽🏭 👨🏽🏭 👩🏽💻 🧑🏽💻 👨🏽💻 👩🏽💼 🧑🏽💼 👨🏽💼 👩🏽🔧 🧑🏽🔧 👨🏽🔧 👩🏽🔬 🧑🏽🔬 👨🏽🔬 👩🏽🎨 🧑🏽🎨 👨🏽🎨 👩🏽🚒 🧑🏽🚒 👨🏽🚒 👩🏽✈️ 🧑🏽✈️ 👨🏽✈️ 👩🏽🚀 🧑🏽🚀 👨🏽🚀 👩🏽⚖️ 🧑🏽⚖️ 👨🏽⚖️ 👰🏽♀️ 👰🏽 👰🏽♂️ 🤵🏽♀️ 🤵🏽 🤵🏽♂️ 👸🏽 🫅🏽 🤴🏽 🥷🏽 🦸🏽♀️ 🦸🏽 🦸🏽♂️ 🦹🏽♀️ 🦹🏽 🦹🏽♂️ 🤶🏽 🧑🏽🎄 🎅🏽 🧙🏽♀️ 🧙🏽 🧙🏽♂️ 🧝🏽♀️ 🧝🏽 🧝🏽♂️ 🧛🏽♀️ 🧛🏽 🧛🏽♂️ 🧜🏽♀️ 🧜🏽 🧜🏽♂️ 🧚🏽♀️ 🧚🏽 🧚🏽♂️ 👼🏽 🤰🏽 🫄🏽 🫃🏽 🤱🏽 👩🏽🍼 🧑🏽🍼 👨🏽🍼 🙇🏽♀️ 🙇🏽 🙇🏽♂️ 💁🏽♀️ 💁🏽 💁🏽♂️ 🙅🏽♀️ 🙅🏽 🙅🏽♂️ 🙆🏽♀️ 🙆🏽 🙆🏽♂️ 🙋🏽♀️ 🙋🏽 🙋🏽♂️ 🧏🏽♀️ 🧏🏽 🧏🏽♂️ 🤦🏽♀️ 🤦🏽 🤦🏽♂️ 🤷🏽♀️ 🤷🏽 🤷🏽♂️ 🙎🏽♀️ 🙎🏽 🙎🏽♂️ 🙍🏽♀️ 🙍🏽 🙍🏽♂️ 💇🏽♀️ 💇🏽 💇🏽♂️ 💆🏽♀️ 💆🏽 💆🏽♂️ 🧖🏽♀️ 🧖🏽 🧖🏽♂️ 💃🏽 🕺🏽 🕴🏽 👩🏽🦽 🧑🏽🦽 👨🏽🦽 👩🏽🦼 🧑🏽🦼 👨🏽🦼 🚶🏽♀️ 🚶🏽 🚶🏽♂️ 👩🏽🦯 🧑🏽🦯 👨🏽🦯 🧎🏽♀️ 🧎🏽 🧎🏽♂️ 🏃🏽♀️ 🏃🏽 🏃🏽♂️ 🧍🏽♀️ 🧍🏽 🧍🏽♂️ 👭🏽 🧑🏽🤝🧑🏽 👬🏽 👫🏽 🧗🏽♀️ 🧗🏽 🧗🏽♂️ 🏇🏽 🏂🏽 🏌🏽♀️ 🏌🏽 🏌🏽♂️ 🏄🏽♀️ 🏄🏽 🏄🏽♂️ 🚣🏽♀️ 🚣🏽 🚣🏽♂️ 🏊🏽♀️ 🏊🏽 🏊🏽♂️ ⛹🏽♀️ ⛹🏽 ⛹🏽♂️ 🏋🏽♀️ 🏋🏽 🏋🏽♂️ 🚴🏽♀️ 🚴🏽 🚴🏽♂️ 🚵🏽♀️ 🚵🏽 🚵🏽♂️ 🤸🏽♀️ 🤸🏽 🤸🏽♂️ 🤽🏽♀️ 🤽🏽 🤽🏽♂️ 🤾🏽♀️ 🤾🏽 🤾🏽♂️ 🤹🏽♀️ 🤹🏽 🤹🏽♂️ 🧘🏽♀️ 🧘🏽 🧘🏽♂️ 🛀🏽 🛌🏽
|
||||
|
||||
### 深棕色表情符号
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-3-->
|
||||
|
||||
👋🏾 🤚🏾 🖐🏾 ✋🏾 🖖🏾 👌🏾 🤌🏾 🤏🏾 ✌🏾 🤞🏾 🫰🏾 🤟🏾 🤘🏾 🤙🏾 🫵🏾 🫱🏾 🫲🏾 🫸🏾 🫷🏾 🫳🏾 🫴🏾 👈🏾 👉🏾 👆🏾 🖕🏾 👇🏾 ☝🏾 👍🏾 👎🏾 ✊🏾 👊🏾 🤛🏾 🤜🏾 👏🏾 🫶🏾 🙌🏾 👐🏾 🤲🏾 🙏🏾 ✍🏾 💅🏾 🤳🏾 💪🏾 🦵🏾 🦶🏾 👂🏾 🦻🏾 👃🏾 👶🏾 👧🏾 🧒🏾 👦🏾 👩🏾 🧑🏾 👨🏾 👩🏾🦱 🧑🏾🦱 👨🏾🦱 👩🏾🦰 🧑🏾🦰 👨🏾🦰 👱🏾♀️ 👱🏾 👱🏾♂️ 👩🏾🦳 🧑🏾🦳 👨🏾🦳 👩🏾🦲 🧑🏾🦲 👨🏾🦲 🧔🏾♀️ 🧔🏾 🧔🏾♂️ 👵🏾 🧓🏾 👴🏾 👲🏾 👳🏾♀️ 👳🏾 👳🏾♂️ 🧕🏾 👮🏾♀️ 👮🏾 👮🏾♂️ 👷🏾♀️ 👷🏾 👷🏾♂️ 💂🏾♀️ 💂🏾 💂🏾♂️ 🕵🏾♀️ 🕵🏾 🕵🏾♂️ 👩🏾⚕️ 🧑🏾⚕️ 👨🏾⚕️ 👩🏾🌾 🧑🏾🌾 👨🏾🌾 👩🏾🍳 🧑🏾🍳 👨🏾🍳 👩🏾🎓 🧑🏾🎓 👨🏾🎓 👩🏾🎤 🧑🏾🎤 👨🏾🎤 👩🏾🏫 🧑🏾🏫 👨🏾🏫 👩🏾🏭 🧑🏾🏭 👨🏾🏭 👩🏾💻 🧑🏾💻 👨🏾💻 👩🏾💼 🧑🏾💼 👨🏾💼 👩🏾🔧 🧑🏾🔧 👨🏾🔧 👩🏾🔬 🧑🏾🔬 👨🏾🔬 👩🏾🎨 🧑🏾🎨 👨🏾🎨 👩🏾🚒 🧑🏾🚒 👨🏾🚒 👩🏾✈️ 🧑🏾✈️ 👨🏾✈️ 👩🏾🚀 🧑🏾🚀 👨🏾🚀 👩🏾⚖️ 🧑🏾⚖️ 👨🏾⚖️ 👰🏾♀️ 👰🏾 👰🏾♂️ 🤵🏾♀️ 🤵🏾 🤵🏾♂️ 👸🏾 🫅🏾 🤴🏾 🥷🏾 🦸🏾♀️ 🦸🏾 🦸🏾♂️ 🦹🏾♀️ 🦹🏾 🦹🏾♂️ 🤶🏾 🧑🏾🎄 🎅🏾 🧙🏾♀️ 🧙🏾 🧙🏾♂️ 🧝🏾♀️ 🧝🏾 🧝🏾♂️ 🧛🏾♀️ 🧛🏾 🧛🏾♂️ 🧜🏾♀️ 🧜🏾 🧜🏾♂️ 🧚🏾♀️ 🧚🏾 🧚🏾♂️ 👼🏾 🤰🏾 🫄🏾 🫃🏾 🤱🏾 👩🏾🍼 🧑🏾🍼 👨🏾🍼 🙇🏾♀️ 🙇🏾 🙇🏾♂️ 💁🏾♀️ 💁🏾 💁🏾♂️ 🙅🏾♀️ 🙅🏾 🙅🏾♂️ 🙆🏾♀️ 🙆🏾 🙆🏾♂️ 🙋🏾♀️ 🙋🏾 🙋🏾♂️ 🧏🏾♀️ 🧏🏾 🧏🏾♂️ 🤦🏾♀️ 🤦🏾 🤦🏾♂️ 🤷🏾♀️ 🤷🏾 🤷🏾♂️ 🙎🏾♀️ 🙎🏾 🙎🏾♂️ 🙍🏾♀️ 🙍🏾 🙍🏾♂️ 💇🏾♀️ 💇🏾 💇🏾♂️ 💆🏾♀️ 💆🏾 💆🏾♂️ 🧖🏾♀️ 🧖🏾 🧖🏾♂️ 💃🏾 🕺🏾 🕴🏿 👩🏾🦽 🧑🏾🦽 👨🏾🦽 👩🏾🦼 🧑🏾🦼 👨🏾🦼 🚶🏾♀️ 🚶🏾 🚶🏾♂️ 👩🏾🦯 🧑🏾🦯 👨🏾🦯 🧎🏾♀️ 🧎🏾 🧎🏾♂️ 🏃🏾♀️ 🏃🏾 🏃🏾♂️ 🧍🏾♀️ 🧍🏾 🧍🏾♂️ 👭🏾 🧑🏾🤝🧑🏾 👬🏾 👫🏾 🧗🏾♀️ 🧗🏾 🧗🏾♂️ 🏇🏾 🏂🏾 🏌🏾♀️ 🏌🏾 🏌🏾♂️ 🏄🏾♀️ 🏄🏾 🏄🏾♂️ 🚣🏾♀️ 🚣🏾 🚣🏾♂️ 🏊🏾♀️ 🏊🏾 🏊🏾♂️ ⛹🏾♀️ ⛹🏾 ⛹🏾♂️ 🏋🏾♀️ 🏋🏾 🏋🏾♂️ 🚴🏾♀️ 🚴🏾 🚴🏾♂️ 🚵🏾♀️ 🚵🏾 🚵🏾♂️ 🤸🏾♀️ 🤸🏾 🤸🏾♂️ 🤽🏾♀️ 🤽🏾 🤽🏾♂️ 🤾🏾♀️ 🤾🏾 🤾🏾♂️ 🤹🏾♀️ 🤹🏾 🤹🏾♂️ 🧘🏾♀️ 🧘🏾 🧘🏾♂️ 🛀🏾 🛌🏾
|
||||
|
||||
### 黑色表情符号
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-3-->
|
||||
|
||||
👋🏿 🤚🏿 🖐🏿 ✋🏿 🖖🏿 👌🏿 🤌🏿 🤏🏿 ✌🏿 🤞🏿 🫰🏿 🤟🏿 🤘🏿 🤙🏿 🫵🏿 🫱🏿 🫲🏿 🫸🏿 🫷🏿 🫳🏿 🫴🏿 👈🏿 👉🏿 👆🏿 🖕🏿 👇🏿 ☝🏿 👍🏿 👎🏿 ✊🏿 👊🏿 🤛🏿 🤜🏿 👏🏿 🫶🏿 🙌🏿 👐🏿 🤲🏿 🙏🏿 ✍🏿 💅🏿 🤳🏿 💪🏿 🦵🏿 🦶🏿 👂🏿 🦻🏿 👃🏿 👶🏿 👧🏿 🧒🏿 👦🏿 👩🏿 🧑🏿 👨🏿 👩🏿🦱 🧑🏿🦱 👨🏿🦱 👩🏿🦰 🧑🏿🦰 👨🏿🦰 👱🏿♀️ 👱🏿 👱🏿♂️ 👩🏿🦳 🧑🏿🦳 👨🏿🦳 👩🏿🦲 🧑🏿🦲 👨🏿🦲 🧔🏿♀️ 🧔🏿 🧔🏿♂️ 👵🏿 🧓🏿 👴🏿 👲🏿 👳🏿♀️ 👳🏿 👳🏿♂️ 🧕🏿 👮🏿♀️ 👮🏿 👮🏿♂️ 👷🏿♀️ 👷🏿 👷🏿♂️ 💂🏿♀️ 💂🏿 💂🏿♂️ 🕵🏿♀️ 🕵🏿 🕵🏿♂️ 👩🏿⚕️ 🧑🏿⚕️ 👨🏿⚕️ 👩🏿🌾 🧑🏿🌾 👨🏿🌾 👩🏿🍳 🧑🏿🍳 👨🏿🍳 👩🏿🎓 🧑🏿🎓 👨🏿🎓 👩🏿🎤 🧑🏿🎤 👨🏿🎤 👩🏿🏫 🧑🏿🏫 👨🏿🏫 👩🏿🏭 🧑🏿🏭 👨🏿🏭 👩🏿💻 🧑🏿💻 👨🏿💻 👩🏿💼 🧑🏿💼 👨🏿💼 👩🏿🔧 🧑🏿🔧 👨🏿🔧 👩🏿🔬 🧑🏿🔬 👨🏿🔬 👩🏿🎨 🧑🏿🎨 👨🏿🎨 👩🏿🚒 🧑🏿🚒 👨🏿🚒 👩🏿✈️ 🧑🏿✈️ 👨🏿✈️ 👩🏿🚀 🧑🏿🚀 👨🏿🚀 👩🏿⚖️ 🧑🏿⚖️ 👨🏿⚖️ 👰🏿♀️ 👰🏿 👰🏿♂️ 🤵🏿♀️ 🤵🏿 🤵🏿♂️ 👸🏿 🫅🏿 🤴🏿 🥷🏿 🦸🏿♀️ 🦸🏿 🦸🏿♂️ 🦹🏿♀️ 🦹🏿 🦹🏿♂️ 🤶🏿 🧑🏿🎄 🎅🏿 🧙🏿♀️ 🧙🏿 🧙🏿♂️ 🧝🏿♀️ 🧝🏿 🧝🏿♂️ 🧛🏿♀️ 🧛🏿 🧛🏿♂️ 🧜🏿♀️ 🧜🏿 🧜🏿♂️ 🧚🏿♀️ 🧚🏿 🧚🏿♂️ 👼🏿 🤰🏿 🫄🏿 🫃🏿 🤱🏿 👩🏿🍼 🧑🏿🍼 👨🏿🍼 🙇🏿♀️ 🙇🏿 🙇🏿♂️ 💁🏿♀️ 💁🏿 💁🏿♂️ 🙅🏿♀️ 🙅🏿 🙅🏿♂️ 🙆🏿♀️ 🙆🏿 🙆🏿♂️ 🙋🏿♀️ 🙋🏿 🙋🏿♂️ 🧏🏿♀️ 🧏🏿 🧏🏿♂️ 🤦🏿♀️ 🤦🏿 🤦🏿♂️ 🤷🏿♀️ 🤷🏿 🤷🏿♂️ 🙎🏿♀️ 🙎🏿 🙎🏿♂️ 🙍🏿♀️ 🙍🏿 🙍🏿♂️ 💇🏿♀️ 💇🏿 💇🏿♂️ 💆🏿♀️ 💆🏿 💆🏿♂️ 🧖🏿♀️ 🧖🏿 🧖🏿♂️ 💃🏿 🕺🏿 🕴🏿 👩🏿🦽 🧑🏿🦽 👨🏿🦽 👩🏿🦼 🧑🏿🦼 👨🏿🦼 🚶🏿♀️ 🚶🏿 🚶🏿♂️ 👩🏿🦯 🧑🏿🦯 👨🏿🦯 🧎🏿♀️ 🧎🏿 🧎🏿♂️ 🏃🏿♀️ 🏃🏿 🏃🏿♂️ 🧍🏿♀️ 🧍🏿 🧍🏿♂️ 👭🏿 🧑🏿🤝🧑🏿 👬🏿 👫🏿 🧗🏿♀️ 🧗🏿 🧗🏿♂️ 🏇🏿 🏂🏿 🏌🏿♀️ 🏌🏿 🏌🏿♂️ 🏄🏿♀️ 🏄🏿 🏄🏿♂️ 🚣🏿♀️ 🚣🏿 🚣🏿♂️ 🏊🏿♀️ 🏊🏿 🏊🏿♂️ ⛹🏿♀️ ⛹🏿 ⛹🏿♂️ 🏋🏿♀️ 🏋🏿 🏋🏿♂️ 🚴🏿♀️ 🚴🏿 🚴🏿♂️ 🚵🏿♀️ 🚵🏿 🚵🏿♂️ 🤸🏿♀️ 🤸🏿 🤸🏿♂️ 🤽🏿♀️ 🤽🏿 🤽🏿♂️ 🤾🏿♀️ 🤾🏿 🤾🏿♂️ 🤹🏿♀️ 🤹🏿 🤹🏿♂️ 🧘🏿♀️ 🧘🏿 🧘🏿♂️ 🛀🏿 🛌🏿
|
||||
|
||||
### 动物与自然
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-3-->
|
||||
|
||||
🐶 🐱 🐭 🐹 🐰 🦊 🐻 🐼 🐻❄️ 🐨 🐯 🦁 🐮 🐷 🐽 🐸 🐵 🙈 🙉 🙊 🐒 🐔 🐧 🐦 🐦⬛ 🐤 🐣 🐥 🦆 🦅 🦉 🦇 🐺 🐗 🐴 🦄 🐝 🪱 🐛 🦋 🐌 🐞 🐜 🪰 🪲 🪳 🦟 🦗 🕷 🕸 🦂 🐢 🐍 🦎 🦖 🦕 🐙 🦑 🦐 🦞 🦀 🪼 🪸 🐡 🐠 🐟 🐬 🐳 🐋 🦈 🐊 🐅 🐆 🦓 🫏 🦍 🦧 🦣 🐘 🦛 🦏 🐪 🐫 🦒 🦘 🦬 🐃 🐂 🐄 🐎 🐖 🐏 🐑 🦙 🐐 🦌 🫎 🐕 🐩 🦮 🐕🦺 🐈 🐈⬛ 🪽 🪶 🐓 🦃 🦤 🦚 🦜 🦢 🪿 🦩 🕊 🐇 🦝 🦨 🦡 🦫 🦦 🦥 🐁 🐀 🐿 🦔 🐾 🐉 🐲 🌵 🎄 🌲 🌳 🌴 🪹 🪺 🪵 🌱 🌿 ☘️ 🍀 🎍 🪴 🎋 🍃 🍂 🍁 🍄 🐚 🪨 🌾 💐 🌷 🪷 🌹 🥀 🌺 🌸 🪻 🌼 🌻 🌞 🌝 🌛 🌜 🌚 🌕 🌖 🌗 🌘 🌑 🌒 🌓 🌔 🌙 🌎 🌍 🌏 🪐 💫 ⭐️ 🌟 ✨ ⚡️ ☄️ 💥 🔥 🌪 🌈 ☀️ 🌤 ⛅️ 🌥 ☁️ 🌦 🌧 ⛈ 🌩 🌨 ❄️ ☃️ ⛄️ 🌬 💨 💧 💦 🫧 ☔️ ☂️ 🌊 🌫
|
||||
|
||||
### 食物和饮料
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-3-->
|
||||
|
||||
🍏 🍎 🍐 🍊 🍋 🍌 🍉 🍇 🍓 🫐 🍈 🍒 🍑 🥭 🍍 🥥 🥝 🍅 🍆 🥑 🥦 🫛 🥬 🥒 🌶 🫑 🌽 🥕 🫒 🧄 🧅 🫚 🥔 🍠 🫘 🥐 🥯 🍞 🥖 🥨 🧀 🥚 🍳 🧈 🥞 🧇 🥓 🥩 🍗 🍖 🦴 🌭 🍔 🍟 🍕 🫓 🥪 🥙 🧆 🌮 🌯 🫔 🥗 🥘 🫕 🥫 🍝 🍜 🍲 🍛 🍣 🍱 🥟 🦪 🍤 🍙 🍚 🍘 🍥 🥠 🥮 🍢 🍡 🍧 🍨 🍦 🥧 🧁 🍰 🎂 🍮 🍭 🍬 🍫 🍿 🍩 🍪 🌰 🥜 🍯 🥛 🍼 🫖 ☕️ 🍵 🧃 🥤 🧋 🫙 🍶 🍺 🍻 🥂 🍷 🫗 🥃 🍸 🍹 🧉 🍾 🧊 🥄 🍴 🍽 🥣 🥡 🥢 🧂
|
||||
|
||||
### 活动和运动
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-3-->
|
||||
|
||||
⚽️ 🏀 🏈 ⚾️ 🥎 🎾 🏐 🏉 🥏 🎱 🪀 🏓 🏸 🏒 🏑 🥍 🏏 🪃 🥅 ⛳️ 🪁 🏹 🎣 🤿 🥊 🥋 🎽 🛹 🛼 🛷 ⛸ 🥌 🎿 ⛷ 🏂 🪂 🏋️♀️ 🏋️ 🏋️♂️ 🤼♀️ 🤼 🤼♂️ 🤸♀️ 🤸 🤸♂️ ⛹️♀️ ⛹️ ⛹️♂️ 🤺 🤾♀️ 🤾 🤾♂️ 🏌️♀️ 🏌️ 🏌️♂️ 🏇 🧘♀️ 🧘 🧘♂️ 🏄♀️ 🏄 🏄♂️ 🏊♀️ 🏊 🏊♂️ 🤽♀️ 🤽 🤽♂️ 🚣♀️ 🚣 🚣♂️ 🧗♀️ 🧗 🧗♂️ 🚵♀️ 🚵 🚵♂️ 🚴♀️ 🚴 🚴♂️ 🏆 🥇 🥈 🥉 🏅 🎖 🏵 🎗 🎫 🎟 🎪 🤹 🤹♂️ 🤹♀️ 🎭 🩰 🎨 🎬 🎤 🎧 🎼 🎹 🥁 🪘 🪇 🎷 🎺 🪗 🎸 🪕 🎻 🪈 🎲 ♟ 🎯 🎳 🎮 🎰 🧩
|
||||
|
||||
### 旅游与地点
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-3-->
|
||||
|
||||
🚗 🚕 🚙 🚌 🚎 🏎 🚓 🚑 🚒 🚐 🛻 🚚 🚛 🚜 🦯 🦽 🦼 🛴 🚲 🛵 🏍 🛺 🚨 🚔 🚍 🚘 🚖 🛞 🚡 🚠 🚟 🚃 🚋 🚞 🚝 🚄 🚅 🚈 🚂 🚆 🚇 🚊 🚉 ✈️ 🛫 🛬 🛩 💺 🛰 🚀 🛸 🚁 🛶 ⛵️ 🚤 🛥 🛳 ⛴ 🚢 ⚓️ 🛟 🪝 ⛽️ 🚧 🚦 🚥 🚏 🗺 🗿 🗽 🗼 🏰 🏯 🏟 🎡 🎢 🛝 🎠 ⛲️ ⛱ 🏖 🏝 🏜 🌋 ⛰ 🏔 🗻 🏕 ⛺️ 🛖 🏠 🏡 🏘 🏚 🏗 🏭 🏢 🏬 🏣 🏤 🏥 🏦 🏨 🏪 🏫 🏩 💒 🏛 ⛪️ 🕌 🕍 🛕 🕋 ⛩ 🛤 🛣 🗾 🎑 🏞 🌅 🌄 🌠 🎇 🎆 🌇 🌆 🏙 🌃 🌌 🌉 🌁
|
||||
|
||||
### 对象
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-3-->
|
||||
|
||||
⌚️ 📱 📲 💻 ⌨️ 🖥 🖨 🖱 🖲 🕹 🗜 💽 💾 💿 📀 📼 📷 📸 📹 🎥 📽 🎞 📞 ☎️ 📟 📠 📺 📻 🎙 🎚 🎛 🧭 ⏱ ⏲ ⏰ 🕰 ⌛️ ⏳ 📡 🔋 🪫 🔌 💡 🔦 🕯 🪔 🧯 🛢 🛍️ 💸 💵 💴 💶 💷 🪙 💰 💳 💎 ⚖️ 🪮 🪜 🧰 🪛 🔧 🔨 ⚒ 🛠 ⛏ 🪚 🔩 ⚙️ 🪤 🧱 ⛓ 🧲 🔫 💣 🧨 🪓 🔪 🗡 ⚔️ 🛡 🚬 ⚰️ 🪦 ⚱️ 🏺 🔮 📿 🧿 🪬 💈 ⚗️ 🔭 🔬 🕳 🩹 🩺 🩻 🩼 💊 💉 🩸 🧬 🦠 🧫 🧪 🌡 🧹 🪠 🧺 🧻 🚽 🚰 🚿 🛁 🛀 🧼 🪥 🪒 🧽 🪣 🧴 🛎 🔑 🗝 🚪 🪑 🛋 🛏 🛌 🧸 🪆 🖼 🪞 🪟 🛍 🛒 🎁 🎈 🎏 🎀 🪄 🪅 🎊 🎉 🪩 🎎 🏮 🎐 🧧 ✉️ 📩 📨 📧 💌 📥 📤 📦 🏷 🪧 📪 📫 📬 📭 📮 📯 📜 📃 📄 📑 🧾 📊 📈 📉 🗒 🗓 📆 📅 🗑 🪪 📇 🗃 🗳 🗄 📋 📁 📂 🗂 🗞 📰 📓 📔 📒 📕 📗 📘 📙 📚 📖 🔖 🧷 🔗 📎 🖇 📐 📏 🧮 📌 📍 ✂️ 🖊 🖋 ✒️ 🖌 🖍 📝 ✏️ 🔍 🔎 🔏 🔐 🔒 🔓
|
||||
|
||||
### 符号
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-3-->
|
||||
|
||||
❤️ 🩷 🧡 💛 💚 💙 🩵 💜 🖤 🩶 🤍 🤎 ❤️🔥 ❤️🩹 💔 ❣️ 💕 💞 💓 💗 💖 💘 💝 💟 ☮️ ✝️ ☪️ 🪯 🕉 ☸️ ✡️ 🔯 🕎 ☯️ ☦️ 🛐 ⛎ ♈️ ♉️ ♊️ ♋️ ♌️ ♍️ ♎️ ♏️ ♐️ ♑️ ♒️ ♓️ 🆔 ⚛️ 🉑 ☢️ ☣️ 📴 📳 🈶 🈚️ 🈸 🈺 🈷️ ✴️ 🆚 💮 🉐 ㊙️ ㊗️ 🈴 🈵 🈹 🈲 🅰️ 🅱️ 🆎 🆑 🅾️ 🆘 ❌ ⭕️ 🛑 ⛔️ 📛 🚫 💯 💢 ♨️ 🚷 🚯 🚳 🚱 🔞 📵 🚭 ❗️ ❕ ❓ ❔ ‼️ ⁉️ 🔅 🔆 〽️ ⚠️ 🚸 🔱 ⚜️ 🔰 ♻️ ✅ 🈯️ 💹 ❇️ ✳️ ❎ 🌐 💠 Ⓜ️ 🌀 💤 🏧 🚾 ♿️ 🅿️ 🛗 🈳 🈂️ 🛂 🛃 🛄 🛅 🚹 🚺 🚼 ⚧ 🚻 🚮 🎦 🛜 📶 🈁 🔣 ℹ️ 🔤 🔡 🔠 🆖 🆗 🆙 🆒 🆕 🆓 0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🔢 #️⃣ *️⃣ ⏏️ ▶️ ⏸ ⏯ ⏹ ⏺ ⏭ ⏮ ⏩ ⏪ ⏫ ⏬ ◀️ 🔼 🔽 ➡️ ⬅️ ⬆️ ⬇️ ↗️ ↘️ ↙️ ↖️ ↕️ ↔️ ↪️ ↩️ ⤴️ ⤵️ 🔀 🔁 🔂 🔄 🔃 🎵 🎶 ➕ ➖ ➗ ✖️ 🟰 ♾ 💲 💱 ™️ ©️ ®️ 〰️ ➰ ➿ 🔚 🔙 🔛 🔝 🔜 ✔️ ☑️ 🔘 🔴 🟠 🟡 🟢 🔵 🟣 ⚫️ ⚪️ 🟤 🔺 🔻 🔸 🔹 🔶 🔷 🔳 🔲 ▪️ ▫️ ◾️ ◽️ ◼️ ◻️ 🟥 🟧 🟨 🟩 🟦 🟪 ⬛️ ⬜️ 🟫 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢 👁🗨 💬 💭 🗯 ♠️ ♣️ ♥️ ♦️ 🃏 🎴 🀄️ 🕐 🕑 🕒 🕓 🕔 🕕 🕖 🕗 🕘 🕙 🕚 🕛 🕜 🕝 🕞 🕟 🕠 🕡 🕢 🕣 🕤 🕥 🕦 🕧
|
||||
|
||||
### 非表情符号
|
||||
<!--rehype:wrap-style=font-size: 28px;-->
|
||||
|
||||
✢ ✣ ✤ ✥ ✦ ✧ ★ ☆ ✯ ✡︎ ✩ ✪ ✫ ✬ ✭ ✮ ✶ ✷ ✵ ✸ ✹ → ⇒ ⟹ ⇨ ⇾ ➾ ⇢ ☛ ☞ ➔ ➜ ➙ ➛ ➝ ➞ ♠︎ ♣︎ ♥︎ ♦︎ ♤ ♧ ♡ ♢ ♚ ♛ ♜ ♝ ♞ ♟ ♔ ♕ ♖ ♗ ♘ ♙ ⚀ ⚁ ⚂ ⚃ ⚄ ⚅ 🂠 ⚈ ⚉ ⚆ ⚇ 𓀀 𓀁 𓀂 𓀃 𓀄 𓀅 𓀆 𓀇 𓀈 𓀉 𓀊 𓀋 𓀌 𓀍 𓀎 𓀏 𓀐 𓀑 𓀒 𓀓 𓀔 𓀕 𓀖 𓀗 𓀘 𓀙 𓀚 𓀛 𓀜 𓀝
|
||||
|
||||
### 旗帜
|
||||
<!--rehype:wrap-style=font-size: 28px;&wrap-class=col-span-2-->
|
||||
|
||||
🏳️ 🏴 🏁 🚩 🏳️🌈 🏳️⚧️ 🏴☠️ 🇦🇫 🇦🇽 🇦🇱 🇩🇿 🇦🇸 🇦🇩 🇦🇴 🇦🇮 🇦🇶 🇦🇬 🇦🇷 🇦🇲 🇦🇼 🇦🇺 🇦🇹 🇦🇿 🇧🇸 🇧🇭 🇧🇩 🇧🇧 🇧🇾 🇧🇪 🇧🇿 🇧🇯 🇧🇲 🇧🇹 🇧🇴 🇧🇦 🇧🇼 🇧🇷 🇮🇴 🇻🇬 🇧🇳 🇧🇬 🇧🇫 🇧🇮 🇰🇭 🇨🇲 🇨🇦 🇮🇨 🇨🇻 🇧🇶 🇰🇾 🇨🇫 🇹🇩 🇨🇱 🇨🇳 🇨🇽 🇨🇨 🇨🇴 🇰🇲 🇨🇬 🇨🇩 🇨🇰 🇨🇷 🇨🇮 🇭🇷 🇨🇺 🇨🇼 🇨🇾 🇨🇿 🇩🇰 🇩🇯 🇩🇲 🇩🇴 🇪🇨 🇪🇬 🇸🇻 🇬🇶 🇪🇷 🇪🇪 🇪🇹 🇪🇺 🇫🇰 🇫🇴 🇫🇯 🇫🇮 🇫🇷 🇬🇫 🇵🇫 🇹🇫 🇬🇦 🇬🇲 🇬🇪 🇩🇪 🇬🇭 🇬🇮 🇬🇷 🇬🇱 🇬🇩 🇬🇵 🇬🇺 🇬🇹 🇬🇬 🇬🇳 🇬🇼 🇬🇾 🇭🇹 🇭🇳 🇭🇰 🇭🇺 🇮🇸 🇮🇳 🇮🇩 🇮🇷 🇮🇶 🇮🇪 🇮🇲 🇮🇱 🇮🇹 🇯🇲 🇯🇵 🎌 🇯🇪 🇯🇴 🇰🇿 🇰🇪 🇰🇮 🇽🇰 🇰🇼 🇰🇬 🇱🇦 🇱🇻 🇱🇧 🇱🇸 🇱🇷 🇱🇾 🇱🇮 🇱🇹 🇱🇺 🇲🇴 🇲🇰 🇲🇬 🇲🇼 🇲🇾 🇲🇻 🇲🇱 🇲🇹 🇲🇭 🇲🇶 🇲🇷 🇲🇺 🇾🇹 🇲🇽 🇫🇲 🇲🇩 🇲🇨 🇲🇳 🇲🇪 🇲🇸 🇲🇦 🇲🇿 🇲🇲 🇳🇦 🇳🇷 🇳🇵 🇳🇱 🇳🇨 🇳🇿 🇳🇮 🇳🇪 🇳🇬 🇳🇺 🇳🇫 🇰🇵 🇲🇵 🇳🇴 🇴🇲 🇵🇰 🇵🇼 🇵🇸 🇵🇦 🇵🇬 🇵🇾 🇵🇪 🇵🇭 🇵🇳 🇵🇱 🇵🇹 🇵🇷 🇶🇦 🇷🇪 🇷🇴 🇷🇺 🇷🇼 🇼🇸 🇸🇲 🇸🇦 🇸🇳 🇷🇸 🇸🇨 🇸🇱 🇸🇬 🇸🇽 🇸🇰 🇸🇮 🇬🇸 🇸🇧 🇸🇴 🇿🇦 🇰🇷 🇸🇸 🇪🇸 🇱🇰 🇧🇱 🇸🇭 🇰🇳 🇱🇨 🇵🇲 🇻🇨 🇸🇩 🇸🇷 🇸🇿 🇸🇪 🇨🇭 🇸🇾 🇹🇼 🇹🇯 🇹🇿 🇹🇭 🇹🇱 🇹🇬 🇹🇰 🇹🇴 🇹🇹 🇹🇳 🇹🇷 🇹🇲 🇹🇨 🇹🇻 🇻🇮 🇺🇬 🇺🇦 🇦🇪 🇬🇧 🏴 🏴 🏴 🇺🇳 🇺🇸 🇺🇾 🇺🇿 🇻🇺 🇻🇦 🇻🇪 🇻🇳 🇼🇫 🇪🇭 🇾🇪 🇿🇲 🇿🇼
|
||||
|
||||
Github emoji 图标标记
|
||||
----
|
||||
|
||||
### People
|
||||
|
||||
@ -879,3 +980,16 @@ Emoji 备忘清单
|
||||
| :milky_way: | `:milky_way:` |
|
||||
| :partly_sunny: | `:partly_sunny:` |
|
||||
| :carrot: | `:carrot:` |
|
||||
|
||||
另见
|
||||
--------
|
||||
|
||||
- [Emoji searcher](https://emoji.muan.co/) _(muan.co)_
|
||||
- [Get Emoji — All Emojis to ✂️ Copy and 📋 Paste](https://getemoji.com/) _(getemoji.com)_
|
||||
- [Emoji Guide – 🔥 The Ultimate Emoji Guide: 🌈 Meanings, 🍎 Platforms, 🆘 Codes and 😍 More](https://emojiguide.com/) _(emojiguide.com)_
|
||||
- [Full Emoji List, v15.0](https://unicode.org/emoji/charts/full-emoji-list.html) _(unicode.org)_
|
||||
- [Emoji Cheat Sheet](https://www.webfx.com/tools/emoji-cheat-sheet/) _(webfx.com)_
|
||||
- [EmojiCopy | Simple emoji copy and paste keyboard by JoyPixels®](https://www.emojicopy.com/) _(emojicopy.com)_
|
||||
- [Emojis 🌱☀️ - Copy & Paste Online 🕵️♀️ | Quicktools by Picsart](https://tools.picsart.com/text/emojis/) _(tools.picsart.com)_
|
||||
- [Emojihub 😀 - All Emojis To Copy And Paste](https://emojihub.org/) _(emojihub.org)_
|
||||
- [All Emojis – Emoji List for Copy and Paste](https://www.freecodecamp.org/news/all-emojis-emoji-list-for-copy-and-paste/) _(freecodecamp.org)_
|
||||
|
@ -1,7 +1,13 @@
|
||||
Express 备忘清单
|
||||
===
|
||||
|
||||
这是用于 Node.js 的快速、不拘一格、极简主义的 Web 框架,包含 [Express.js](http://expressjs.com/) 的 API 参考列表和一些示例。
|
||||
[](https://npmjs.org/package/express)
|
||||
[](https://www.npmjs.com/package/express)
|
||||
[](https://github.com/expressjs/express/network/dependents)
|
||||
[](https://github.com/expressjs/express)
|
||||
|
||||
这是用于 Node.js 的快速、不拘一格、极简主义的 Web 框架,包含 [Express.js](http://expressjs.com/) 的 API 参考列表和一些示例
|
||||
<!--rehype:style=padding-top: 12px;-->
|
||||
|
||||
入门
|
||||
---
|
||||
|
680
docs/fastapi.md
Normal file
@ -0,0 +1,680 @@
|
||||
FastAPI 备忘清单
|
||||
===
|
||||
|
||||
一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.6+ 并基于标准的 Python 类型提示
|
||||
|
||||
入门
|
||||
---
|
||||
<!--rehype:body-class=cols-2-->
|
||||
|
||||
### 安装 FastAPI
|
||||
|
||||
```shell
|
||||
$ pip install "fastapi[all]"
|
||||
```
|
||||
|
||||
#### 可以分开来安装
|
||||
|
||||
假如你想将应用程序部署到生产环境,你可能要执行以下操作:
|
||||
|
||||
```shell
|
||||
$ pip install fastapi
|
||||
```
|
||||
|
||||
并且安装 `uvicorn` 来作为服务器:
|
||||
|
||||
```shell
|
||||
$ pip install "uvicorn[standard]"
|
||||
```
|
||||
|
||||
#### 运行代码
|
||||
|
||||
```shell
|
||||
$ uvicorn main:app --reload
|
||||
```
|
||||
|
||||
Python: `3.9.5` FastAPI: `0.103.1`
|
||||
|
||||
### 最小程序
|
||||
|
||||
下面代码会直接启动http服务,也可以使用 `uvicorn main:app --reload`
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI
|
||||
import uvicorn
|
||||
|
||||
app = FastAPI()
|
||||
```
|
||||
|
||||
添加一个 API 的示例
|
||||
|
||||
```python
|
||||
# http://127.0.0.1:8000/
|
||||
@app.get("/")
|
||||
async def root():
|
||||
return {"message": "Hello World"}
|
||||
|
||||
if __name__ == '__main__':
|
||||
uvicorn.run(app='main:app', reload=True)
|
||||
```
|
||||
|
||||
### 路径参数
|
||||
|
||||
#### 最基本的路径参数
|
||||
|
||||
```python
|
||||
# http://127.0.0.1:8000/items/1
|
||||
@app.get("/items/{item_id}")
|
||||
async def read_item(item_id):
|
||||
return {"item_id": item_id} # item_id自定义
|
||||
```
|
||||
|
||||
#### 多个路径参数
|
||||
|
||||
```python
|
||||
# http://127.0.0.1:8000/items/1/2
|
||||
@app.get("/items/{item_id}/{user_id}")
|
||||
async def read_item(item_id, user_id):
|
||||
return {"item_id": item_id, "user_id": user_id}
|
||||
```
|
||||
|
||||
#### 有类型的路径参数
|
||||
|
||||
```python
|
||||
# http://127.0.0.1:8000/items/1
|
||||
@app.get("/items/{item_id}")
|
||||
async def read_item(item_id: int):
|
||||
return {"item_id": item_id}
|
||||
```
|
||||
|
||||
#### 文件路径参数
|
||||
|
||||
```python
|
||||
# http://127.0.0.1:8000/file//home/my/my.txt
|
||||
@app.get("/file/{file_path:path}")
|
||||
async def read_item(file_path):
|
||||
return {"file_path": file_path}
|
||||
```
|
||||
|
||||
### 查询参数
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
#### 带默认值的查询参数
|
||||
|
||||
```python
|
||||
# http://127.0.0.1:8000/items/?skip=0&limit=2
|
||||
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}]
|
||||
|
||||
@app.get("/items/")
|
||||
async def read_item(skip: int = 0, limit: int = 10):
|
||||
return fake_items_db[skip: skip + limit]
|
||||
```
|
||||
|
||||
#### 可选查询参数
|
||||
|
||||
```python
|
||||
# http://127.0.0.1:8000/items/1?q=admin
|
||||
from typing import Union
|
||||
|
||||
@app.get("/items/{item_id}")
|
||||
async def read_item(item_id: str, q: Union[str, None] = None):
|
||||
if q:
|
||||
return {"item_id": item_id, "q": q}
|
||||
return {"item_id": item_id}
|
||||
```
|
||||
|
||||
#### 多路径多查询参数
|
||||
|
||||
```python
|
||||
# http://127.0.0.1:8000/users/1/items/2
|
||||
# or
|
||||
# http://127.0.0.1:8000/users/1/items/2?q=query&short=true
|
||||
@app.get("/users/{user_id}/items/{item_id}")
|
||||
async def read_user_item(
|
||||
user_id: int,
|
||||
item_id: str,
|
||||
q: Union[str, None] = None,
|
||||
short: bool = False
|
||||
):
|
||||
item = {"item_id": item_id, "owner_id": user_id}
|
||||
if q:
|
||||
item.update({"q": q})
|
||||
if not short:
|
||||
item.update(
|
||||
{"description": "这是一个令人惊叹的项目,有很长的描述"}
|
||||
)
|
||||
return item
|
||||
```
|
||||
|
||||
#### 必需查询参数
|
||||
|
||||
```python
|
||||
# http://127.0.0.1:8000/items/123?needy=yes
|
||||
@app.get("/items/{item_id}")
|
||||
async def read_user_item(item_id: str, needy: str):
|
||||
item = {"item_id": item_id, "needy": needy}
|
||||
return item
|
||||
```
|
||||
|
||||
### 请求体
|
||||
|
||||
```python
|
||||
from pydantic import BaseModel
|
||||
from typing import Union
|
||||
|
||||
class Item(BaseModel):
|
||||
name: str = '小明'
|
||||
description: Union[str, None] = None
|
||||
price: float
|
||||
tax: Union[float, None] = None
|
||||
|
||||
@app.post("/items/")
|
||||
async def create_item(item: Item):
|
||||
print(item.name)
|
||||
return item
|
||||
```
|
||||
|
||||
#### 调用
|
||||
|
||||
```bash
|
||||
curl -X 'POST' \
|
||||
'http://127.0.0.1:8000/items/' \
|
||||
-H 'accept: application/json' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{
|
||||
"name": "小明",
|
||||
"description": "string",
|
||||
"price": 0,
|
||||
"tax": 0
|
||||
}'
|
||||
```
|
||||
|
||||
### 查询参数和字符串校验
|
||||
|
||||
```python
|
||||
from fastapi import Query
|
||||
|
||||
@app.get("/items/")
|
||||
async def read_items(
|
||||
q: Union[str, None] = Query(default=None, max_length=50)
|
||||
):
|
||||
results = {"items": [{"item_id": "Foo"}, {"item_id": "Bar"}]}
|
||||
if q:
|
||||
results.update({"q": q})
|
||||
return results
|
||||
```
|
||||
|
||||
#### 参数列表
|
||||
|
||||
| 参数 | 含义 | 类型 |
|
||||
| ---------- | ------------ | ------------- |
|
||||
| `default` | 默认值 | 任意类型或... |
|
||||
| `max_length` | 最大长度 | `int` |
|
||||
| `min_length` | 最小长度 | `int` |
|
||||
| `pattern` | 正则匹配 | `string` |
|
||||
| `alias` | 别名参数 | `string` |
|
||||
| `deprecated` | 准备弃用参数 | `bool` |
|
||||
|
||||
#### 多个相同的查询参数
|
||||
|
||||
```python
|
||||
# http://127.0.0.1:8000/items/?q=foo&q=bar
|
||||
@app.get("/items/")
|
||||
async def read_items(
|
||||
q: Union[List[str], None] = Query(default=None)
|
||||
):
|
||||
query_items = {"q": q}
|
||||
return query_items
|
||||
```
|
||||
|
||||
### 路径参数和数值校验
|
||||
|
||||
Path 用法基本和 Query 相同,参考:[FastAPI官方文档](https://fastapi.tiangolo.com/zh/tutorial/path-params-numeric-validations/)
|
||||
|
||||
#### 导入 Path
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI, Path, Query
|
||||
from typing_extensions import Annotated
|
||||
```
|
||||
|
||||
#### 声明元数据
|
||||
|
||||
```python
|
||||
@app.get("/items/{item_id}")
|
||||
async def read_items(
|
||||
item_id: Annotated[int, Path(title="要获取的项目的 ID")],
|
||||
q: Annotated[str | None, Query(alias="item-query")] = None,
|
||||
):
|
||||
results = {"item_id": item_id}
|
||||
if q:
|
||||
results.update({"q": q})
|
||||
return results
|
||||
```
|
||||
|
||||
#### 参数列表
|
||||
|
||||
| 参数 | 含义 | 类型 |
|
||||
| ----- | ------------------- | --------- |
|
||||
| `...` | 和 Query 具有相同参数 | ... |
|
||||
| `ge` | 大于等于 | `int float` |
|
||||
| `gt` | 大于 | `int float` |
|
||||
| `le` | 小于等于 | `int float` |
|
||||
| `le` | 小于等于 | `int float` |
|
||||
| `title` | api文档的标题 | `string` |
|
||||
|
||||
### 其他参数
|
||||
|
||||
都具有 `Query` 的参数,`max_length`、`min_length` 等
|
||||
|
||||
#### Cookie参数
|
||||
|
||||
```python
|
||||
from fastapi import Cookie
|
||||
|
||||
@app.get("/items/")
|
||||
async def read_items(
|
||||
ads_id: Annotated[Union[str, None], Cookie()] = None
|
||||
):
|
||||
return {"ads_id": ads_id}
|
||||
```
|
||||
|
||||
#### Header 参数
|
||||
|
||||
```python
|
||||
from fastapi import Header
|
||||
|
||||
@app.get("/items/")
|
||||
async def read_items(
|
||||
user_agent: Annotated[Union[str, None], Header()] = None,
|
||||
items_id: Annotated[Union[int, None], Header(ge=1)] = None
|
||||
):
|
||||
return {"User-Agent": user_agent, "items_id": items_id}
|
||||
```
|
||||
|
||||
### 表单数据
|
||||
|
||||
接收的不是 JSON,而是表单字段时,要使用 Form。
|
||||
|
||||
#### 安装
|
||||
|
||||
```shell
|
||||
$ pip install python-multipart
|
||||
```
|
||||
|
||||
#### HTML
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
</head>
|
||||
<body>
|
||||
<form method="post" action="http://127.0.0.1:8000/login">
|
||||
<span>账号:</span><input type="text" name="username">
|
||||
<br>
|
||||
<span>密码:</span><input type="password" name="password">
|
||||
<br>
|
||||
<input type="submit" value="登录">
|
||||
</form>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
#### FastAPI
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI, Form
|
||||
import uvicorn
|
||||
app = FastAPI()
|
||||
@app.post("/login/")
|
||||
async def login(username: str = Form(), password: str = Form()):
|
||||
return {"username": username}
|
||||
if __name__ == '__main__':
|
||||
uvicorn.run(app='main:app', reload=True)
|
||||
```
|
||||
|
||||
### 文件上传
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI, UploadFile
|
||||
from fastapi.responses import HTMLResponse
|
||||
|
||||
@app.post("/uploadfile/")
|
||||
async def create_upload_file(file: UploadFile):
|
||||
print(file.file.read().decode())
|
||||
return {"filenames": file.filename, "type": str(type(file.file))}
|
||||
|
||||
@app.get("/")
|
||||
async def main():
|
||||
content = """<body>
|
||||
<form action="/uploadfile/" enctype="multipart/form-data" method="post">
|
||||
<input name="file" type="file" multiple>
|
||||
<input type="submit">
|
||||
</form>
|
||||
</body>"""
|
||||
return HTMLResponse(content=content)
|
||||
```
|
||||
|
||||
#### UploadFile 属性
|
||||
|
||||
| 属性名 | 含义 | 返回 |
|
||||
| ------------ | -------- | --------------------------------------- |
|
||||
| `filename` | 文件名 | 上传的文件名 |
|
||||
| `content_type` | 内容类型 | `MIME` 类型 |
|
||||
| `file` | 文件 | SpooledTemporaryFile 具有 `read`,`write` 方法 |
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
#### UploadFile async 方法
|
||||
|
||||
| 方法名 | 含义 |
|
||||
| ------------ | ----------------------------------------- |
|
||||
| `write(data)` | 把 `data` 写入文件 |
|
||||
| `read(size)` | 按指定数量的字节读取文件内容 |
|
||||
| `seek(offset)` | 移动至文件 `offset` (`int`)字节处的位置 |
|
||||
| `close()` | 关闭文件 |
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
依赖项
|
||||
---
|
||||
<!--rehype:body-class=cols-2-->
|
||||
|
||||
### 依赖项使用场景
|
||||
|
||||
- 共享业务逻辑(复用相同的代码逻辑)
|
||||
- 共享数据库连接
|
||||
- 实现安全、验证、角色权限
|
||||
- 等……
|
||||
|
||||
### 创建依赖项
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```python
|
||||
from typing import Union
|
||||
|
||||
from fastapi import Depends, FastAPI
|
||||
|
||||
app = FastAPI()
|
||||
```
|
||||
|
||||
`read_items` 和 `read_users` 方法依赖 `common_parameters`
|
||||
白话就是 `read_items` 和 `read_users` 都需要 `q`,`skip`,`limit` 查询参数
|
||||
|
||||
```python
|
||||
async def common_parameters(
|
||||
q: Union[str, None] = None,
|
||||
skip: int = 0,
|
||||
limit: int = 100
|
||||
):
|
||||
return {"q": q, "skip": skip, "limit": limit}
|
||||
|
||||
|
||||
@app.get("/items/")
|
||||
async def read_items(
|
||||
commons: dict = Depends(common_parameters)
|
||||
):
|
||||
return commons
|
||||
|
||||
|
||||
@app.get("/users/")
|
||||
async def read_users(
|
||||
commons: dict = Depends(common_parameters)
|
||||
):
|
||||
return commons
|
||||
```
|
||||
|
||||
### 类作为依赖项
|
||||
|
||||
```python
|
||||
from typing import Union
|
||||
from fastapi import Depends, FastAPI
|
||||
|
||||
app = FastAPI()
|
||||
fake_items_db = [{"item_name": "Foo"}, {"item_name": "Bar"}]
|
||||
|
||||
class CommonQueryParams:
|
||||
def __init__(
|
||||
self,
|
||||
q: Union[str, None] = None,
|
||||
skip: int = 0,
|
||||
limit: int = 100
|
||||
):
|
||||
self.q = q
|
||||
self.skip = skip
|
||||
self.limit = limit
|
||||
```
|
||||
|
||||
`read_itemsx` 接收一个 `commons` 参数,类型是 `CommonQueryParams`
|
||||
`CommonQueryParams` 接收三个参数,这三个参数是调用 api 的时候传
|
||||
|
||||
```python
|
||||
@app.get("/items/")
|
||||
async def read_items(
|
||||
commons: CommonQueryParams = Depends(CommonQueryParams)
|
||||
):
|
||||
response = {}
|
||||
if commons.q:
|
||||
response.update({"q": commons.q})
|
||||
items = fake_items_db[commons.skip : commons.skip + commons.limit]
|
||||
response.update({"items": items})
|
||||
return response
|
||||
```
|
||||
|
||||
#### 还可以简写
|
||||
|
||||
```python
|
||||
@app.get("/items/")
|
||||
async def read_items(
|
||||
# 这里的 Depends 没有传参,FastAPI 会自动使用 CommonQueryParams
|
||||
commons: CommonQueryParams = Depends()
|
||||
):
|
||||
response = {}
|
||||
if commons.q:
|
||||
response.update({"q": commons.q})
|
||||
items = fake_items_db[commons.skip : commons.skip + commons.limit]
|
||||
response.update({"items": items})
|
||||
return response
|
||||
```
|
||||
|
||||
### 子依赖项
|
||||
|
||||
```python
|
||||
from typing import Union
|
||||
from fastapi import Cookie, Depends, FastAPI
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
def query_extractor(q: Union[str, None] = None):
|
||||
return q
|
||||
|
||||
def query_or_cookie_extractor(
|
||||
q: str = Depends(query_extractor),
|
||||
last_query: Union[str, None] = Cookie(default=None),
|
||||
):
|
||||
if not q:
|
||||
return last_query
|
||||
return q
|
||||
|
||||
# read_query函数依赖query_or_cookie_extractor函数
|
||||
# query_or_cookie_extractor函数又依赖query_extractor函数
|
||||
# 就是说依赖项可以依赖其他依赖项,只要你不晕,可以无数次套娃
|
||||
@app.get("/items/")
|
||||
async def read_query(
|
||||
query_or_default: str = Depends(query_or_cookie_extractor)
|
||||
):
|
||||
return {"q_or_cookie": query_or_default}
|
||||
```
|
||||
|
||||
#### 不使用缓存
|
||||
|
||||
使用 `use_cache = False` 参数不使用缓存数据,不使用 `use_cache = False`,`value` 和 `value1` 是一样的
|
||||
|
||||
```python
|
||||
def result_value():
|
||||
value = randint(1, 99)
|
||||
return value
|
||||
|
||||
def get_value(
|
||||
value: int = Depends(result_value, use_cache=False),
|
||||
value1: int = Depends(result_value, use_cache=False)
|
||||
):
|
||||
return value, value1
|
||||
|
||||
@app.get('/value/')
|
||||
async def needy_dependency(value: tuple = Depends(get_value)):
|
||||
return {"value": value}
|
||||
```
|
||||
|
||||
### 全局依赖项
|
||||
|
||||
```python
|
||||
from fastapi import Depends, FastAPI, Header, HTTPException
|
||||
|
||||
async def verify_token(x_token: str = Header()):
|
||||
if x_token != "fake-super-secret-token":
|
||||
raise HTTPException(status_code=400, detail="X-Token 标头无效")
|
||||
|
||||
async def verify_key(x_key: str = Header()):
|
||||
if x_key != "fake-super-secret-key":
|
||||
raise HTTPException(status_code=400, detail="X-Key 标头无效")
|
||||
return x_key
|
||||
```
|
||||
|
||||
全局依赖项很有用,后面的安全性就可以使用全局依赖项
|
||||
|
||||
```python
|
||||
app = FastAPI(
|
||||
dependencies=[Depends(verify_token), Depends(verify_key)]
|
||||
)
|
||||
|
||||
@app.get("/items/")
|
||||
async def read_items():
|
||||
return [{"item": "Portal Gun"}, {"item": "Plumbus"}]
|
||||
|
||||
@app.get("/users/")
|
||||
async def read_users():
|
||||
return [{"username": "Rick"}, {"username": "Morty"}]
|
||||
```
|
||||
|
||||
安全性
|
||||
---
|
||||
|
||||
### 基于 Token 的认证
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI, Depends, HTTPException
|
||||
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
|
||||
from pydantic import BaseModel
|
||||
|
||||
app = FastAPI()
|
||||
```
|
||||
|
||||
使用 OAuth2PasswordBearer 创建一个 token 依赖
|
||||
|
||||
```python
|
||||
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
|
||||
```
|
||||
|
||||
假设这是你的用户数据库
|
||||
|
||||
```python
|
||||
fake_users_db = {
|
||||
"johndoe": {
|
||||
"username": "johndoe",
|
||||
"full_name": "John Doe",
|
||||
"email": "johndoe@example.com",
|
||||
"hashed_password": "fakehashedsecret",
|
||||
"disabled": False,
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
创建一个用户模型
|
||||
|
||||
```python
|
||||
class User(BaseModel):
|
||||
username: str
|
||||
email: str
|
||||
full_name: str
|
||||
disabled: bool
|
||||
```
|
||||
|
||||
创建一个简单的认证函数
|
||||
|
||||
```python
|
||||
def fake_hash_password(password: str):
|
||||
return "fakehashed" + password
|
||||
|
||||
def get_user(db, username: str):
|
||||
if username in db:
|
||||
user_dict = db[username]
|
||||
return User(**user_dict)
|
||||
|
||||
def fake_decode_token(token: str):
|
||||
# 这个函数应该验证 token 并返回用户信息
|
||||
# 这里我们只是简单地返回了用户名
|
||||
return get_user(fake_users_db, token)
|
||||
```
|
||||
|
||||
创建一个依赖,用于从请求中获取 token 并验证用户
|
||||
|
||||
```python
|
||||
async def get_current_user(token: str = Depends(oauth2_scheme)):
|
||||
user = fake_decode_token(token)
|
||||
if not user:
|
||||
raise HTTPException(
|
||||
status_code=401,
|
||||
detail="Invalid authentication credentials",
|
||||
headers={"WWW-Authenticate": "Bearer"},
|
||||
)
|
||||
return user
|
||||
|
||||
@app.post("/token")
|
||||
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
|
||||
user = get_user(fake_users_db, form_data.username)
|
||||
if not user or user.hashed_password != fake_hash_password(form_data.password):
|
||||
raise HTTPException(status_code=400, detail="Incorrect username or password")
|
||||
return {"access_token": user.username, "token_type": "bearer"}
|
||||
|
||||
@app.get("/users/me")
|
||||
async def read_users_me(current_user: User = Depends(get_current_user)):
|
||||
return current_user
|
||||
|
||||
```
|
||||
|
||||
使用 OAuth2PasswordBearer 来创建一个简单的 token 认证流程。
|
||||
|
||||
### HTTPS 和证书
|
||||
|
||||
```python
|
||||
from fastapi import FastAPI
|
||||
|
||||
app = FastAPI()
|
||||
```
|
||||
|
||||
在生产环境中,你应该使用一个真正的证书和私钥,你可以从像 Let's Encrypt 这样的证书颁发机构获得免费的证书,或者使用 OpenSSL 生成自签名证书
|
||||
|
||||
```python
|
||||
@app.get("/https")
|
||||
async def read_https():
|
||||
return {"message": "Hello, HTTPS!"}
|
||||
```
|
||||
|
||||
启动服务器时,使用以下命令来指定证书和私钥:
|
||||
|
||||
```bash
|
||||
uvicorn main:app --host 0.0.0.0 --port 443 --ssl-keyfile /path/to/your/key.pem --ssl-certfile /path/to/your/cert.pem
|
||||
```
|
||||
|
||||
FastAPI 默认支持 HTTPS,你只需要提供证书和私钥即可。
|
||||
|
||||
待更新
|
||||
|
||||
参考
|
||||
---
|
||||
|
||||
- [Python 备忘清单](./python.md) _(jaywcjlove.github.io)_
|
||||
- [FastAPI 官方文档](https://fastapi.tiangolo.com/zh/tutorial/) _(fastapi.tiangolo.com)_
|
156
docs/feds.md
Normal file
@ -0,0 +1,156 @@
|
||||
FED 前端导航
|
||||
===
|
||||
|
||||
前端开发导航快速参考备忘单展示了前端的一些工具
|
||||
|
||||
社区
|
||||
---
|
||||
|
||||
[CSDN](https://www.csdn.net/)<!--rehype:target=_blank&style=background: rgb(252 85 49/var(\-\-bg\-opacity));-->
|
||||
[GitHub](https://github.com/)<!--rehype:target=_blank&style=background: rgb(0 0 0/var(\-\-bg\-opacity));-->
|
||||
[InfoQ](http://www.infoq.com/cn)<!--rehype:target=_blank&style=background: rgb(66 133 244/var(\-\-bg\-opacity));-->
|
||||
[Medium](https://medium.com/topic/technology)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[SegmentFault](https://segmentfault.com/)<!--rehype:target=_blank&style=background: rgb(0 150 94/var(\-\-bg\-opacity));-->
|
||||
[Stack Overflow](https://stackoverflow.com/)<!--rehype:target=_blank&style=background: rgb(244 130 37/var(\-\-bg\-opacity));-->
|
||||
[V2EX](https://www.v2ex.com/?tab=tech)<!--rehype:target=_blank&style=background: rgb(0 0 0/var(\-\-bg\-opacity));-->
|
||||
[博客园](https://www.cnblogs.com/)<!--rehype:target=_blank&style=background: rgb(46 122 203/var(\-\-bg\-opacity));-->
|
||||
[开源中国](https://www.oschina.net/)<!--rehype:target=_blank&style=background: rgb(43 179 81/var(\-\-bg\-opacity));-->
|
||||
[稀土掘金](https://juejin.im/)<!--rehype:target=_blank&style=background: rgb(30 128 255/var(\-\-bg\-opacity));-->
|
||||
[W3cplus](https://www.w3cplus.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
构建工具
|
||||
---
|
||||
|
||||
[Webpack](http://webpack.github.io/)<!--rehype:target=_blank&style=background: rgb(107 148 216/var(\-\-bg\-opacity));-->
|
||||
[NPM](https://www.npmjs.com/)<!--rehype:target=_blank&style=background: rgb(203 8 1/var(\-\-bg\-opacity));-->
|
||||
[Yarn](https://yarnpkg.com/zh-Hans/)<!--rehype:target=_blank&style=background: rgb(33 136 182/var(\-\-bg\-opacity));-->
|
||||
[pnpm](https://pnpm.io/)<!--rehype:target=_blank&style=background: rgb(246 146 32/var(\-\-bg\-opacity));-->
|
||||
[Lerna](https://lerna.js.org/)<!--rehype:target=_blank&style=background: rgb(147 51 234/var(\-\-bg\-opacity));-->
|
||||
[Vitejs](https://cn.vitejs.dev/)<!--rehype:target=_blank&style=background: rgb(188 52 254/var(\-\-bg\-opacity));-->
|
||||
[Gulp](https://gulpjs.com/)<!--rehype:target=_blank&style=background: rgb(207 70 71/var(\-\-bg\-opacity));-->
|
||||
[Parcel](https://en.parceljs.org/)<!--rehype:target=_blank&style=background: rgb(192 145 99/var(\-\-bg\-opacity));-->
|
||||
[Rollup](https://rollupjs.org/guide/en/)<!--rehype:target=_blank&style=background: rgb(239 51 53/var(\-\-bg\-opacity));-->
|
||||
[Turbopack](https://turbo.build/)<!--rehype:target=_blank&style=background: rgb(248 30 87/var(\-\-bg\-opacity));-->
|
||||
[Create React App](https://create-react-app.dev/)<!--rehype:target=_blank&style=background: rgb(60 106 146/var(\-\-bg\-opacity));-->
|
||||
[Browserify](http://browserify.org/)<!--rehype:target=_blank&style=background: rgb(60 106 146/var(\-\-bg\-opacity));-->
|
||||
[Yeoman](http://yeoman.io/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Grunt](https://gruntjs.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Babel](https://babeljs.io/)<!--rehype:target=_blank&style=background: rgb(245 218 85/var(\-\-bg\-opacity));-->
|
||||
[FIS3](https://fex-team.github.io/fis3/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
教程文档
|
||||
---
|
||||
|
||||
[MDN Web Docs](https://developer.mozilla.org/zh-CN/)<!--rehype:target=_blank&style=background: rgb(140 181 255/var(\-\-bg\-opacity));-->
|
||||
[ECMAScript 6 入门](https://es6.ruanyifeng.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
JavaScript 工具
|
||||
---
|
||||
|
||||
[Chrome Dev Tools](https://www.google.cn/chrome/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[CoffeeScript](https://coffeescript.org/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Firefox Developer Tools](https://www.mozilla.org/zh-CN/firefox/new/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[flow](https://flow.org/)<!--rehype:target=_blank&style=background: rgb(232 189 54/var(\-\-bg\-opacity));-->
|
||||
[TypeScript](https://www.typescriptlang.org/)<!--rehype:target=_blank&style=background: rgb(49 120 197/var(\-\-bg\-opacity));-->
|
||||
[JS 压缩,格式化](https://www.css-js.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[JSDoc](https://jsdoc.app/)<!--rehype:target=_blank&style=background: rgb(197 149 199/var(\-\-bg\-opacity));-->
|
||||
[UglifyJS](http://lisperator.net/uglifyjs/transform)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Prettier](https://prettier.io/)<!--rehype:target=_blank&style=background: rgb(197 149 199/var(\-\-bg\-opacity));-->
|
||||
[Biome - JS 语言格式化](https://prettier.io/)<!--rehype:target=_blank&style=background: rgb(96 165 250/var(\-\-bg\-opacity));&class=contributing tag&data-lang=格式化-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
JavaScript 测试工具
|
||||
---
|
||||
|
||||
[Chai](http://chaijs.com/)<!--rehype:target=_blank&style=background: rgb(164 8 1/var(\-\-bg\-opacity));-->
|
||||
[ESLint](https://eslint.org/)<!--rehype:target=_blank&style=background: rgb(76 50 195/var(\-\-bg\-opacity));-->
|
||||
[JSHint](http://jshint.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Jasmine](https://jasmine.github.io/)<!--rehype:target=_blank&style=background: rgb(138 65 130/var(\-\-bg\-opacity));-->
|
||||
[Jest](https://jestjs.io/)<!--rehype:target=_blank&style=background: rgb(158 79 101/var(\-\-bg\-opacity));-->
|
||||
[Mochajs](https://mochajs.org/)<!--rehype:target=_blank&style=background: rgb(141 103 72/var(\-\-bg\-opacity));-->
|
||||
[Oxc - 比 ESLint 快 100 倍](https://oxc-project.github.io)<!--rehype:target=_blank&style=background: rgb(57 172 167/var(\-\-bg\-opacity));-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
CSS 工具
|
||||
---
|
||||
|
||||
[30秒CSS](https://www.30secondsofcode.org/css/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Autoprefixer](https://github.com/postcss/autoprefixer)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[ColorZilla](http://www.colorzilla.com/gradient-editor/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[CSS Protips](https://github.com/AllThingsSmitty/css-protips)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[CSS3 Maker](http://www.css3maker.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[cssnano](http://cssnano.co/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[CSSPIN](https://webkul.github.io/csspin/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[CSSreference](https://cssreference.io/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[CSSTree](https://github.com/csstree/csstree)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[CSS美化压缩](http://tool.css-js.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Easing Functions Cheat Sheet](http://easings.net/zh-cn)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Emmet](https://www.emmet.io/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[est](http://ecomfe.github.io/est/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Flex Layout Attribute](https://github.com/StefanKovac/flex-layout-attribute)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[minireset.css](http://lesscss.org/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Normalize.css](http://necolas.github.io/normalize.css/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[PostCSS](http://postcss.org/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[purifycss](https://github.com/purifycss/purifycss)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Less](https://lesscss.org/)<!--rehype:target=_blank&style=background: rgb(36 74 121/var(\-\-bg\-opacity));-->
|
||||
[SASS](http://sass-lang.com/)<!--rehype:target=_blank&style=background: rgb(191 64 128/var(\-\-bg\-opacity));-->
|
||||
[Sprite Cow](http://www.spritecow.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Stylus](http://stylus-lang.com/)<!--rehype:target=_blank&style=background: rgb(126 194 66/var(\-\-bg\-opacity));-->
|
||||
[Stylelint](https://stylelint.io/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
框架类库
|
||||
---
|
||||
|
||||
[React](https://zh-hans.react.dev)<!--rehype:target=_blank&style=background: rgb(97 218 251/var(\-\-bg\-opacity));-->
|
||||
[Vue 中文](https://cn.vuejs.org/)<!--rehype:target=_blank&style=background: rgb(66 184 131/var(\-\-bg\-opacity));-->
|
||||
[Angular](https://angular.io/)<!--rehype:target=_blank&style=background: rgb(195 8 47/var(\-\-bg\-opacity));-->
|
||||
[jQuery](http://www.jquery123.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Bootstrap](https://getbootstrap.com/)<!--rehype:target=_blank&style=background: rgb(113 44 249/var(\-\-bg\-opacity));-->
|
||||
[React Native 中文](https://reactnative.cn/)<!--rehype:target=_blank&style=background: rgb(36 120 194/var(\-\-bg\-opacity));-->
|
||||
[Flutter](https://flutter.dev/)<!--rehype:target=_blank&style=background: rgb(35 104 215/var(\-\-bg\-opacity));-->
|
||||
[RxJs](http://reactivex.io/rxjs/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[htmx](https://htmx.org/)<!--rehype:target=_blank&style=background: rgb(61 114 215/var(\-\-bg\-opacity));-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
在线代码编辑器工具
|
||||
---
|
||||
|
||||
[CodePen](https://codepen.io/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[CodeSandbox](https://codesandbox.io/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[StackBlitz](https://stackblitz.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[esbuild](https://esbuild.github.io/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[JSFiddle](https://jsfiddle.net/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Replit](https://replit.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[JSRUN.NET](https://jsrun.net/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[WebComponents.dev](https://webcomponents.dev/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[JS Bin](https://jsbin.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[RunKit](https://runkit.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
兼容、性能测试
|
||||
---
|
||||
|
||||
[Browser Sandbox](https://turbo.net/browsers)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Browserdiet](https://browserdiet.com/zh/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[browsershots](http://browsershots.org/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[BrowserStack](https://www.browserstack.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Can I use](http://caniuse.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[httpstatus](https://httpstatus.io/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Observatory](https://observatory.mozilla.org/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[PageSpeed Insights](https://developers.google.com/speed/pagespeed/insights/?hl=zh-CN)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Security Headers](https://securityheaders.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
<!--rehype:class=home-card-->
|
||||
|
||||
CDN
|
||||
---
|
||||
|
||||
[cdnjs](https://cdnjs.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[jsDelivr](https://www.jsdelivr.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[UNPKG](https://unpkg.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[Statically](https://statically.io/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
[raw.githack.com](http://raw.githack.com/)<!--rehype:target=_blank&style=background: rgb(106 106 106/var(\-\-bg\-opacity));-->
|
||||
<!--rehype:class=home-card-->
|
@ -84,6 +84,7 @@ $ ffmpeg -i movie.webm movie.mp4
|
||||
`-r RATE` | 每秒帧率
|
||||
`-s WIDTHxHEIGHT` | 帧大小
|
||||
`-vn` | 没有视频
|
||||
`-crf` | 指定编码的质量,数值越大压缩越高,一般范围是 18-28
|
||||
|
||||
### 码率设置
|
||||
|
||||
@ -581,6 +582,7 @@ $ ffmpeg -f concat -i mylist.txt -c:v copy -c:a flac -strict -2 output.mp4
|
||||
|
||||
视频过滤器
|
||||
---
|
||||
<!--rehype:body-class=cols-2-->
|
||||
|
||||
### 格式
|
||||
|
||||
@ -631,7 +633,6 @@ ffmpeg -i 1.mp4 -b:v 548k -vf delogo=x=10:y=10:w=120:h=45:show=1 output.mp4
|
||||
<!--rehype:className=wrap-text -->
|
||||
|
||||
### 创建缩略图
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
在 10 秒时创建一个缩略图
|
||||
|
||||
@ -686,6 +687,7 @@ $ ffmpeg -i 1.mp4 -i test.mp3 \
|
||||
|
||||
音频过滤器
|
||||
---
|
||||
<!--rehype:body-class=cols-2-->
|
||||
|
||||
### 调节音量
|
||||
|
||||
@ -718,6 +720,32 @@ $ ffmpeg -i test.mp4 -af "loudnorm=I=-5:LRA=1" out.mp4
|
||||
$ ffmpeg -i input.mp3 -af "channelmap=1-0|1-1" output.mp3
|
||||
```
|
||||
|
||||
流处理
|
||||
---
|
||||
<!--rehype:body-class=cols-2-->
|
||||
|
||||
### 拉流
|
||||
|
||||
```bash
|
||||
# 拉取rtmp流并存储到本地
|
||||
$ ffmpeg -i "rtsp://127.0.0.1/test" test.mp4
|
||||
```
|
||||
|
||||
### 推流
|
||||
|
||||
```bash
|
||||
# 推送test.mp4到远程
|
||||
$ ffmpeg -re -i test.mp4 -f flv rtmp://127.0.0.1/test
|
||||
```
|
||||
|
||||
### 转发
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
```bash
|
||||
# 拉取流并转发
|
||||
$ ffmpeg -i "rtsp://127.0.0.1/test" -f mpegts -codec:v mpeg1video http://127.0.0.1/demo
|
||||
```
|
||||
|
||||
另见
|
||||
---
|
||||
|
||||
|
203
docs/figma.md
Normal file
@ -0,0 +1,203 @@
|
||||
Figma 备忘清单
|
||||
===
|
||||
|
||||
Figma 中 119 个键盘快捷键的可视化备忘表
|
||||
|
||||
键盘快捷键
|
||||
---
|
||||
|
||||
### 基本操作
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`Ctrl` `\` | 显示/隐藏界面
|
||||
`Ctrl` `C` | 选择颜色
|
||||
`Ctrl` `/` | 搜索菜单
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 工具
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`V` | 移动工具
|
||||
`F` | 框架工具
|
||||
`P` | 钢笔工具
|
||||
`Shift` `P` | 铅笔工具
|
||||
`T` | 文本工具
|
||||
`R` | 矩形工具
|
||||
`O` | 椭圆工具
|
||||
`L` | 线条工具
|
||||
`Shift` `L` | 箭头工具
|
||||
`C` | 添加/显示评论
|
||||
`Ctrl` `C` | 选择颜色
|
||||
`S` | 切片工具
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 视图
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`Shift` `R` | 切换标尺
|
||||
`Ctrl` `Y` | 显示轮廓
|
||||
`Ctrl` `P` | 像素预览
|
||||
`Ctrl` `G` | 布局网格
|
||||
`Ctrl` `'` | 像素网格
|
||||
`Ctrl` `\` | 显示/隐藏界面
|
||||
`Ctrl` `Alt` `\` | 显示多人光标
|
||||
`Alt` `1` | 显示图层
|
||||
`Alt` `2` | 显示组件
|
||||
`Alt` `3` | 显示团队库
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 缩放
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`Space` `(拖拽)` | 平移
|
||||
`+` | 放大
|
||||
`-` | 缩小
|
||||
`Shift` `0` | 缩放至100%
|
||||
`Shift` `1` | 缩放以适应
|
||||
`Shift` `2` | 缩放至选区
|
||||
`Shift` `N` | 缩放至上一帧
|
||||
`N` | 缩放至下一帧
|
||||
`PgUp` | 上一页
|
||||
`PgDown` | 下一页
|
||||
`Home` | 查找上一帧
|
||||
`End` | 查找下一帧
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 文本
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`Ctrl` `B` | 加粗
|
||||
`Ctrl` `I` | 斜体
|
||||
`Ctrl` `U` | 下划线
|
||||
`Ctrl` `Shift` `V` | 粘贴并匹配样式
|
||||
`Ctrl` `Alt` `L` | 文本左对齐
|
||||
`Ctrl` `Alt` `T` | 文本居中对齐
|
||||
`Ctrl` `Alt` `R` | 文本右对齐
|
||||
`Ctrl` `Alt` `J` | 文本两端对齐
|
||||
`Ctrl` `Shift` `</>` | 调整字体大小
|
||||
`Alt` `,/.` | 调整字间距
|
||||
`Alt` `Shift` `</>` | 调整行高
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 形状
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`P` | 钢笔
|
||||
`Shift` `P` | 铅笔
|
||||
`B` | 填充桶(编辑形状时)
|
||||
`Ctrl` | 弯曲工具(编辑形状时)
|
||||
`Alt` `/` | 移除填充
|
||||
`/` | 移除描边
|
||||
`Shift` `X` | 交换填充和描边
|
||||
`Ctrl` `Shift` `O` | 描边轮廓
|
||||
`Ctrl` `E` | 扁平化选择
|
||||
`Ctrl` `J` | 连接选择(选择点后)
|
||||
`Ctrl` `Shift` `J` | 平滑连接选择(选择点后)
|
||||
`Shift` `Backspace` | 删除并修复选择(选择点后)
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 选择
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`Ctrl` `A` | 全选
|
||||
`Ctrl` `Shift` `A` | 反向选择
|
||||
`Esc` | 取消选择
|
||||
`Ctrl` `(单击)` | 深度选择
|
||||
`Ctrl` `(右键单击)` | 选择图层菜单
|
||||
`Enter` | 选择子元素
|
||||
`Shift` `Enter` | 选择父元素
|
||||
`Tab` | 选择下一个同级元素
|
||||
`Shift` `Tab` | 选择上一个同级元素
|
||||
`Ctrl` `G` | 分组选择
|
||||
`Ctrl` `Shift` `G` | 取消分组选择
|
||||
`Ctrl` `Alt` `G` | 框架选择
|
||||
`Ctrl` `Shift` `H` | 显示/隐藏选择
|
||||
`Ctrl` `Shift` `L` | 锁定/解锁选择
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 光标
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`Alt` | 测量到选择区域(指向时)
|
||||
`Alt` | 复制选择区域(移动时)
|
||||
`Ctrl` `(单击)` | 深度选择(点击时)
|
||||
`Ctrl` `(右键单击)` | 选择图层菜单(点击时)
|
||||
`Ctrl` `(拖动)` | 矩形内深度选择(拖动选择时)
|
||||
`Alt` | 从中心调整大小(调整大小时)
|
||||
`Shift` | 等比例调整大小(调整大小时)
|
||||
`Space` | 在调整大小时移动
|
||||
`Ctrl` | 忽略约束(仅限框架)
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 编辑
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`Ctrl` `C` | 复制
|
||||
`Ctrl` `X` | 剪切
|
||||
`Ctrl` `V` | 粘贴
|
||||
`Ctrl` `Shift` `V` | 在选择上粘贴
|
||||
`Ctrl` `D` | 原地复制选择
|
||||
`Ctrl` `R` | 重命名选择
|
||||
`Ctrl` `Shift` `E` | 导出
|
||||
`Ctrl` `Alt` `C` | 复制属性
|
||||
`Ctrl` `Alt` `V` | 粘贴属性
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 变换
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`Shift` `H` | 水平翻转
|
||||
`Shift` `V` | 垂直翻转
|
||||
`Ctrl` `M` | 用作蒙版
|
||||
`Enter` | 编辑形状或图像
|
||||
`Ctrl` `Shift` `K` | 放置图像
|
||||
`Alt` `(双击)` | 裁剪图像
|
||||
`1` | 将不透明度设置为 10%
|
||||
`5` | 将不透明度设置为 50%
|
||||
`0` | 将不透明度设置为 100%
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 排列
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`Ctrl` `]` | 上移一层
|
||||
`Ctrl` `[` | 下移一层
|
||||
`Ctrl` `Alt` `]` | 移至顶层
|
||||
`Ctrl` `Alt` `[` | 移至底层
|
||||
`Alt` `A` | 左对齐
|
||||
`Alt` `D` | 右对齐
|
||||
`Alt` `W` | 顶部对齐
|
||||
`Alt` `S` | 底部对齐
|
||||
`Alt` `H` | 水平居中对齐
|
||||
`Alt` `V` | 垂直居中对齐
|
||||
`Ctrl` `Alt` `T` | 整理
|
||||
`Ctrl` `Alt` `H` | 分布水平间距
|
||||
`Ctrl` `Alt` `V` | 分布垂直间距
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 组件
|
||||
|
||||
快捷键 | 动作
|
||||
---|---
|
||||
`Alt` `2` | 显示组件
|
||||
`Ctrl` `Shift` `O` | 团队库
|
||||
`Ctrl` `Shift` `K` | 创建组件
|
||||
`Ctrl` `Shift` `B` | 分离实例
|
||||
`Alt` | 替换组件实例(从资源拖动时)
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
另见
|
||||
---
|
||||
|
||||
- [Figma 的键盘快捷键](https://help.figma.com/article/77-keyboard-shortcuts) _(help.figma.com)_
|
93
docs/finder.md
Normal file
@ -0,0 +1,93 @@
|
||||
Finder 备忘清单
|
||||
===
|
||||
|
||||
Finder 中 55 个键盘快捷键的可视化小抄。此应用程序是 macOS 的一部分。
|
||||
|
||||
键盘快捷键
|
||||
----
|
||||
<!--rehype:body-class=cols-4-->
|
||||
|
||||
### 修饰键符号
|
||||
<!--rehype:wrap-class=col-span-4-->
|
||||
|
||||
- `Command` (或 `Cmd`) ⌘
|
||||
- `Option` (或 `Alt`) ⌥
|
||||
- `Caps Lock` ⇪
|
||||
- `Shift` ⇧
|
||||
- `Control` (或 `Ctrl`) ⌃
|
||||
- `Fn` 🌐
|
||||
<!--rehype:className=cols-3-->
|
||||
|
||||
### Finder 快捷键
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
快捷键 | 操作
|
||||
---|---
|
||||
`Cmd` `D` | 复制选定的文件
|
||||
`Cmd` `E` | 弹出选定的磁盘或卷
|
||||
`Cmd` `F` | 在Finder窗口中启动Spotlight搜索
|
||||
`Cmd` `I` | 显示选定文件的详细信息窗口
|
||||
`Cmd` `R` | 当在Finder中选择别名时,显示所选别名的原始文件
|
||||
`Cmd` `Shift` `C` | 打开计算机窗口
|
||||
`Cmd` `Shift` `D` | 打开桌面文件夹
|
||||
`Cmd` `Shift` `F` | 打开最近窗口,显示您最近查看或更改的所有文件
|
||||
`Cmd` `Shift` `G` | 打开前往文件夹窗口
|
||||
`Cmd` `Shift` `H` | 打开当前MacOS用户账户的主文件夹
|
||||
`Cmd` `Shift` `I` | 打开iCloud驱动器
|
||||
`Cmd` `Shift` `K` | 打开网络窗口
|
||||
`Cmd` `Opt` `L` | 打开下载文件夹
|
||||
`Cmd` `Shift` `N` | 创建新文件夹
|
||||
`Cmd` `Shift` `O` | 打开文档文件夹
|
||||
`Cmd` `Shift` `P` | 在Finder窗口中显示或隐藏预览窗格
|
||||
`Cmd` `Shift` `R` | 打开AirDrop窗口
|
||||
`Cmd` `Shift` `T` | 在Finder窗口中显示或隐藏选项卡栏
|
||||
`Ctrl` `Cmd` `Shift` `T` | 将选定的Finder项目添加到Dock
|
||||
`Cmd` `Shift` `U` | 打开实用工具文件夹
|
||||
`Cmd` `Opt` `D` | 显示或隐藏Dock
|
||||
`Cmd` `Ctrl` `T` | 将选定项目添加到侧边栏
|
||||
`Cmd` `Opt` `P` | 在Finder窗口中隐藏或显示路径栏
|
||||
`Cmd` `Opt` `S` | 在Finder窗口中隐藏或显示侧边栏
|
||||
`Cmd` `/` | 在Finder窗口中隐藏或显示状态栏
|
||||
`Cmd` `J` | 显示视图选项
|
||||
`Cmd` `K` | 打开连接到服务器窗口
|
||||
<!--rehype:className=shortcuts left-align-->
|
||||
|
||||
### Finder 快捷键
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
快捷键 | 操作
|
||||
---|---
|
||||
`Cmd` `Ctrl` `A` | 制作所选项目的别名
|
||||
`Cmd` `N` | 打开新的Finder窗口
|
||||
`Cmd` `Opt` `N` | 创建新的智能文件夹
|
||||
`Cmd` `T` | 在当前Finder窗口中打开或隐藏选项卡栏
|
||||
`Cmd` `Opt` `T` | 在当前Finder窗口中打开或隐藏工具栏
|
||||
`Cmd` `Opt` `V` | 将剪贴板中文件从其原始位置移动到当前位置
|
||||
`Cmd` `Y` | 使用快速查看预览所选文件
|
||||
`Cmd` `Opt` `Y` | 查看所选文件的快速查看幻灯片
|
||||
`Cmd` `1` | 将Finder窗口中的项目以图标形式查看
|
||||
`Cmd` `2` | 将Finder窗口中的项目以列表形式查看
|
||||
`Cmd` `3` | 将Finder窗口中的项目以列形式查看
|
||||
`Cmd` `4` | 将Finder窗口中的项目以画廊形式查看
|
||||
`Cmd` `[` | 转到上一个文件夹
|
||||
`Cmd` `]` | 转到下一个文件夹
|
||||
`Cmd` `Up` | 打开包含当前文件夹的文件夹
|
||||
`Cmd` `Ctrl` `Up` | 在新窗口中打开包含当前文件夹的文件夹
|
||||
`Cmd` `Left` | 打开所选项目
|
||||
`Right` | 打开所选文件夹(仅在列表视图中有效)
|
||||
`Left` | 关闭所选文件夹(仅在列表视图中有效)
|
||||
`Cmd` `Del` | 将所选项目移至废纸篓
|
||||
`Cmd` `Shift` `Del` | 清空废纸篓
|
||||
`Cmd` `Opt` `Shift` `Del` | 无需确认对话框即可清空废纸篓
|
||||
`Cmd` `Bright-Down` | 在Mac连接到多个显示器时打开或关闭视频镜像
|
||||
`Cmd` `Bright-Up` | 打开显示首选项
|
||||
`Ctrl` `Bright` | 更改外部显示器的亮度(如果支持)
|
||||
`Opt` `Shift` `Bright` | 以较小步长调整显示亮度
|
||||
`Ctrl` `Down` | 显示前台应用程序的所有窗口
|
||||
`Opt` `Vol` | 打开声音首选项
|
||||
<!--rehype:className=shortcuts left-align-->
|
||||
|
||||
另见
|
||||
----
|
||||
|
||||
- [macOS Finder 的键盘快捷键](https://support.apple.com/en-us/HT201236) _(support.apple.com)_
|
197
docs/firefox.md
Normal file
@ -0,0 +1,197 @@
|
||||
Firefox 键盘快捷键备忘清单
|
||||
===
|
||||
|
||||
Firefox 中 116 个键盘快捷键的可视化备忘单
|
||||
|
||||
火狐浏览器键盘快捷键
|
||||
------------------
|
||||
|
||||
### 导航
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Left` | 后退
|
||||
`Ctrl` `Right` | 向前
|
||||
`Alt` `Home` | 家
|
||||
`Ctrl` `O` | 打开文件
|
||||
`Ctrl` `R` | 重新加载
|
||||
`Ctrl` `Shift` `R` | 重新加载(覆盖缓存)
|
||||
`Ctrl` `.` | 停止
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 当前页面
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Tab` | 聚焦下一个链接或输入字段
|
||||
`Shift` `Tab` | 聚焦上一个链接或输入字段
|
||||
`Space` | 下一个屏幕
|
||||
`Shift` `Space` | 上一个屏幕
|
||||
`Ctrl` `Down` | 转到页面底部
|
||||
`Ctrl` `Up` | 转到页面顶部
|
||||
`F6` | 移动到下一帧
|
||||
`Shift` `F6` | 移至上一帧
|
||||
`Ctrl` `P` | 打印
|
||||
`Ctrl` `S` | 将页面另存为
|
||||
`Ctrl` `+` | 放大
|
||||
`Ctrl` `-` | 缩小
|
||||
`Ctrl` `0` | 缩放重置
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 编辑
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `C` | 复制
|
||||
`Ctrl` `X` | 剪切
|
||||
`Backspace` | 删除
|
||||
`Home` | 转到行首
|
||||
`End` | 转到行尾
|
||||
`Ctrl` `V` | 粘贴
|
||||
`Ctrl` `Shift` `V` | 粘贴(作为纯文本)
|
||||
`Ctrl` `Shift` `Z` | 重做
|
||||
`Ctrl` `A` | 全选
|
||||
`Ctrl` `Z` | 撤消
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 历史
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Shift` `H` | 历史边栏
|
||||
`Ctrl` `Shift` `Delete` | 最近清除历史记录
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 搜索
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `F` | 查询
|
||||
`Ctrl` `G` | 再找
|
||||
`Ctrl` `Shift` `G` | 查找上一个
|
||||
`'` | 仅在链接文本中快速查找
|
||||
`/` | 快速查找
|
||||
`Esc` | 关闭查找或快速查找栏
|
||||
`Ctrl` `K` | 焦点搜索栏
|
||||
`Ctrl` `Up/Down` | 更改默认搜索引擎
|
||||
`Alt` `Up/Down` | 查看菜单以切换、添加或管理搜索引擎
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 窗口和选项卡
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `W` | 关闭标签
|
||||
`Ctrl` `Shift` `W` | 关闭窗口
|
||||
`Ctrl` `Tab` | 按最近使用的顺序循环浏览选项卡
|
||||
`Ctrl` `Q` | 退出
|
||||
`Ctrl` `Alt` `Left` | 向左移动一个标签
|
||||
`Ctrl` `Alt` `Right` | 向右移动一个标签
|
||||
`Ctrl` `Shift` `PgUp` | 向左移动制表符
|
||||
`Ctrl` `Shift` `PgDown` | 向右移动选项卡
|
||||
`Ctrl` `Shift` `Home` | 将 Tab 移动到焦点以开始
|
||||
`Ctrl` `Shift` `End` | 将 Tab 移动到焦点结束
|
||||
`Ctrl` `M` | 静音/取消静音音频
|
||||
`Ctrl` `T` | 新标签
|
||||
`Ctrl` `N` | 新窗户
|
||||
`Ctrl` `Shift` `P` | 新建私人窗口
|
||||
`Alt` `Enter` | 在新前台选项卡中打开地址
|
||||
`Enter` | 在当前选项卡中打开重点书签或链接
|
||||
`Ctrl` `Enter` | 在新的前景选项卡中打开重点书签
|
||||
`Ctrl` `Shift` `Enter` | 在新背景选项卡中打开重点书签
|
||||
`Ctrl` `Enter` | 在新背景选项卡中打开焦点链接
|
||||
`Shift` `Enter` | 在新窗口中打开重点书签或链接
|
||||
`Ctrl` `Shift` `T` | 撤消关闭选项卡
|
||||
`Ctrl` `Shift` `N` | 撤消关闭窗口
|
||||
`Ctrl` `1-8` | 选择选项卡 1-8
|
||||
`Ctrl` `9` | 选择最后一个标签
|
||||
`Ctrl` `Shift` `X` | 向左或向右移动 URL
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 书签
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Shift` `D` | 为所有标签添加书签
|
||||
`Ctrl` `D` | 收藏此页
|
||||
`Ctrl` `B` | 书签侧边栏
|
||||
`Ctrl` `Shift` `S` | 库窗口(书签)
|
||||
`(search field in Library)` `Space` | 搜索所有书签
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 工具
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `J` | 下载
|
||||
`Ctrl` `Shift` `A` | 插件
|
||||
`Ctrl` `Alt` `I` | 切换开发者工具
|
||||
`Ctrl` `Alt` `K` | 网络控制台
|
||||
`Ctrl` `Alt` `C` | 检查员
|
||||
`Ctrl` `Alt` `S` | 调试器
|
||||
`Shift` `F7` | 样式编辑器
|
||||
`Shift` `F5` | 剖析器
|
||||
`Ctrl` `Alt` `E` | 网络
|
||||
`Shift` `F2` | 开发者工具栏
|
||||
`Ctrl` `Alt` `M` | 响应式设计视图
|
||||
`Shift` `F4` | 便笺
|
||||
`Ctrl` `U` | 页面源
|
||||
`Ctrl` `Shift` `J` | 浏览器控制台
|
||||
`Ctrl` `I` | 页面信息
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### PDF 查看器
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`N/J/Right` | 下一页
|
||||
`P/K/Left` | 上一页
|
||||
`Ctrl` `+` | 放大
|
||||
`Ctrl` `-` | 缩小
|
||||
`Ctrl` `0` | 自动缩放
|
||||
`R` | 顺时针旋转文档
|
||||
`Ctrl` `R` | 逆时针旋转
|
||||
`Ctrl` `Alt` `P` | 切换到演示模式
|
||||
`S` | 选择文本选择工具
|
||||
`H` | 选择手形工具
|
||||
`Ctrl` `Alt` `G` | 聚焦页码输入框
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 各种各样的
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Ctrl` `Enter` | 完整的 .com 地址
|
||||
`Shift` `Enter` | 完整的 .net 地址
|
||||
`Ctrl` `Shift` `Enter` | 完整的 .org 地址
|
||||
`Shift` `Delete` | 删除选定的自动完成条目
|
||||
`Ctrl` `Shift` `F` | 切换全屏
|
||||
`Ctrl` `Alt` `R` | 切换阅读器模式
|
||||
`F7` | 插入符浏览
|
||||
`Ctrl` `L` | 选择地址栏
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
### 媒体快捷方式
|
||||
|
||||
快捷键 | 说明
|
||||
:- | -
|
||||
`Space` | 切换播放/暂停
|
||||
`Down` | 降低音量
|
||||
`Up` | 增加音量
|
||||
`Ctrl` `Down` | 静音
|
||||
`Ctrl` `Up` | 取消静音
|
||||
`Left` | 后退 15 秒
|
||||
`Ctrl` `Left` | 追回 10%
|
||||
`Right` | 快进 15 秒
|
||||
`Ctrl` `Right` | 向前寻求 10%
|
||||
`Home` | 追寻至始
|
||||
`End` | 求到底
|
||||
<!--rehype:className=shortcuts-->
|
||||
|
||||
另见
|
||||
--------
|
||||
|
||||
- [Keyboard shortcuts for Firefox](https://support.mozilla.org/en-US/kb/keyboard-shortcuts-perform-firefox-tasks-quickly) _(support.mozilla.org)_
|
255
docs/flask.md
Normal file
@ -0,0 +1,255 @@
|
||||
Flask 备忘清单
|
||||
===
|
||||
|
||||
本清单对 Flask 的入门进行了简要的概述,以及其常用示例。需要有 `HTML` 和 `Python` 基础。
|
||||
|
||||
入门
|
||||
-----
|
||||
|
||||
### 相关链接
|
||||
|
||||
- [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML) _(developer.mozilla.org)_
|
||||
- [Python](https://www.python.org/) _(python.org)_
|
||||
- [Flask](https://flask.palletsprojects.com/) _(flask.palletsprojects.com)_
|
||||
- [Python 备忘清单](./python.md) _(jaywcjlove.github.io)_
|
||||
|
||||
### Hello World
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
#### hello.py
|
||||
|
||||
```python
|
||||
# 导入 Flask 类
|
||||
from flask import Flask
|
||||
|
||||
# 创建应用实例
|
||||
app = Flask(__name__) # 'Flask' 参数是 应用程序模块 或 包 的名称
|
||||
# __name__是适用于大多数情况的便捷快捷方式
|
||||
|
||||
# 路由 (装饰器)
|
||||
@app.route('/') # route()装饰器告诉 Flask 什么路径触发下面的功能
|
||||
def hello():
|
||||
# 该函数返回我们想要在浏览器中显示的消息内容
|
||||
return 'Hello World!'
|
||||
# 默认类型 HTML, 因此字符串中的 HTML 将被浏览器渲染
|
||||
# 启动服务
|
||||
if __name__ == '__main__':
|
||||
app.run()
|
||||
```
|
||||
|
||||
### 运行 `hello.py` 程序
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```shell
|
||||
$ python hello.py
|
||||
* Serving Flask app 'hello'
|
||||
* Running on http://127.0.0.1:5000
|
||||
* Press CTRL+C to quit
|
||||
```
|
||||
|
||||
#### 或
|
||||
|
||||
```shell
|
||||
$ flask --app hello run
|
||||
* Serving Flask app 'hello'
|
||||
* Running on http://127.0.0.1:5000
|
||||
* Press CTRL+C to quit
|
||||
$ flask run --host=0.0.0.0
|
||||
```
|
||||
|
||||
启用调试模式,使用 `--debug` 选项
|
||||
|
||||
```bash
|
||||
$ flask --app hello --debug run
|
||||
```
|
||||
|
||||
### HTML 转义
|
||||
|
||||
```py
|
||||
from markupsafe import escape
|
||||
|
||||
@app.route("/<name>")
|
||||
def hello(name):
|
||||
return f"Hello, {escape(name)}!"
|
||||
```
|
||||
|
||||
### 路由
|
||||
|
||||
```py
|
||||
@app.route('/')
|
||||
def index():
|
||||
return 'Index Page'
|
||||
|
||||
@app.route('/hello')
|
||||
def hello():
|
||||
return 'Hello, World'
|
||||
```
|
||||
|
||||
### 变量规则
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```py
|
||||
from markupsafe import escape
|
||||
|
||||
@app.route('/user/<username>')
|
||||
def show_user_profile(username):
|
||||
# 显示该用户的用户个人资料
|
||||
return f'User {escape(username)}'
|
||||
|
||||
@app.route('/post/<int:post_id>')
|
||||
def show_post(post_id):
|
||||
# 显示给定id的帖子,id是一个整数
|
||||
return f'Post {post_id}'
|
||||
|
||||
@app.route('/path/<path:subpath>')
|
||||
def show_subpath(subpath):
|
||||
# 在 /path/ 之后显示子路径
|
||||
return f'Subpath {escape(subpath)}'
|
||||
```
|
||||
|
||||
转换器类型:
|
||||
|
||||
:-- | --
|
||||
:-- | --
|
||||
`string` | (默认)接受任何没有斜杠的文本
|
||||
`int` | 接受正整数
|
||||
`float` | 接受正浮点值
|
||||
`path` | 像字符串但也接受斜线
|
||||
`uuid` | 接受 UUID 字符串
|
||||
|
||||
### 唯一 URL / 重定向行为
|
||||
|
||||
```py
|
||||
@app.route('/projects/')
|
||||
def projects():
|
||||
return 'The project page'
|
||||
|
||||
@app.route('/about')
|
||||
def about():
|
||||
return 'The about page'
|
||||
```
|
||||
|
||||
项目端点的规范 `URL` 有一个尾部斜杠。它类似于文件系统中的文件夹。如果您访问没有尾部斜杠 (`/projects`) 的 `URL`,`Flask` 会将您重定向到带有尾部斜杠 (`/projects/`) 的规范 `URL`
|
||||
|
||||
### URL 建设
|
||||
|
||||
```py
|
||||
from flask import url_for
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
return 'index'
|
||||
|
||||
@app.route('/login')
|
||||
def login():
|
||||
return 'login'
|
||||
|
||||
@app.route('/user/<username>')
|
||||
def profile(username):
|
||||
return f'{username}\'s profile'
|
||||
|
||||
with app.test_request_context():
|
||||
print(url_for('index'))
|
||||
print(url_for('login'))
|
||||
print(url_for('login', next='/'))
|
||||
print(url_for('profile', username='John Doe'))
|
||||
```
|
||||
|
||||
### HTTP 方法
|
||||
|
||||
默认路由仅响应 `GET` 请求。可以使用 `route()` 装饰器的方法参数来处理不同的 `HTTP` 方法
|
||||
|
||||
```py
|
||||
from flask import request
|
||||
|
||||
@app.route('/login',methods=['GET','POST'])
|
||||
def login():
|
||||
if request.method == 'POST':
|
||||
return do_the_login()
|
||||
else:
|
||||
return show_the_login_form()
|
||||
```
|
||||
|
||||
您还可以将不同方法的视图分成不同的函数。 `Flask` 为每个常见的 `HTTP` 方法提供了一种快捷方式,用于使用 `get()`、`post()` 等来装饰此类路由
|
||||
|
||||
```py
|
||||
@app.get('/login')
|
||||
def login_get():
|
||||
return show_the_login_form()
|
||||
|
||||
@app.post('/login')
|
||||
def login_post():
|
||||
return do_the_login()
|
||||
```
|
||||
|
||||
### Blueprint
|
||||
|
||||
创建蓝图Bp1
|
||||
|
||||
```py
|
||||
from flask import Blueprint, abort, jsonify
|
||||
|
||||
# 定义Bp1,并定义url前缀为/img
|
||||
Bp1 = Blueprint('imgBlue', __name__, template_folder='templates', url_prefix='/img')
|
||||
|
||||
|
||||
@Bp1.route('/getimg')
|
||||
def getImg():
|
||||
try:
|
||||
return jsonify(name="img", size="100KB")
|
||||
except Exception as e:
|
||||
abort(e)
|
||||
```
|
||||
|
||||
创建蓝图Bp2
|
||||
|
||||
```py
|
||||
from flask import Blueprint, abort, jsonify
|
||||
|
||||
# 定义Bp2,并定义url前缀为/video
|
||||
Bp2 = Blueprint('videoBlue', __name__, template_folder='templates', url_prefix='/video')
|
||||
|
||||
|
||||
@Bp2.route('/getvideo')
|
||||
def getvideo():
|
||||
try:
|
||||
return jsonify(name="video", size="100GB")
|
||||
except Exception as e:
|
||||
abort(e)
|
||||
```
|
||||
|
||||
在flask app中引用蓝图Bp1和Bp2
|
||||
|
||||
```py
|
||||
from flask import Flask, jsonify
|
||||
from lantu.img import Bp1
|
||||
from lantu.video import Bp2
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
# 注册蓝图到app
|
||||
app.register_blueprint(Bp1)
|
||||
app.register_blueprint(Bp2)
|
||||
|
||||
|
||||
@app.route('/')
|
||||
def index():
|
||||
return jsonify(name='phyger')
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(host="127.0.0.1", debug=True)
|
||||
```
|
||||
|
||||
简单测试
|
||||
|
||||
```bash
|
||||
curl http://127.0.0.1:5000/
|
||||
>> {"name":"phyger"}
|
||||
|
||||
curl http://127.0.0.1:5000/img/getimg
|
||||
>> {"name": "img", "size": "100KB"}
|
||||
|
||||
curl http://127.0.0.1:5000/video/getvideo
|
||||
>> {"name": "video", "size": "100GB"}
|
||||
```
|
300
docs/flutter.md
@ -421,8 +421,6 @@ SizedBox(
|
||||
在实际开发中,Container常常用于对一个组件进行包装修饰。
|
||||
|
||||
```dart
|
||||
// 将Contianer大小固定为100 * 100, 背景色为蓝色。
|
||||
// 把Text包裹在Container中,并将其居中
|
||||
Container(
|
||||
width: 100,
|
||||
height: 100,
|
||||
@ -430,9 +428,10 @@ Container(
|
||||
alignment: Alignment.center,
|
||||
child: Text('Hello world'),
|
||||
),
|
||||
|
||||
```
|
||||
|
||||
将 `Contianer` 大小固定为 `100 * 100`, 背景色为蓝色。把 `Text` 包裹在 `Container` 中,并将其居中
|
||||
|
||||
### Column
|
||||
|
||||
列布局(Column),可以将多个子组件沿着垂直的方向摆放(竖的摆放)
|
||||
@ -461,7 +460,6 @@ Column(
|
||||
行布局(Row),可以将多个组件沿水平的方向摆放。
|
||||
|
||||
```dart
|
||||
// 在同一行摆放3个Button
|
||||
Row(
|
||||
children: [
|
||||
ElevatedButton(
|
||||
@ -480,12 +478,13 @@ Row(
|
||||
),
|
||||
```
|
||||
|
||||
在同一行摆放 3 个 `Button`
|
||||
|
||||
### Wrap
|
||||
|
||||
将子组件从左到右依次排列,当空间不足时自动换行。
|
||||
|
||||
```dart
|
||||
// 显示多个Flutter 的logo并自动换行
|
||||
Wrap(
|
||||
children: [
|
||||
FlutterLogo(),
|
||||
@ -498,14 +497,14 @@ Wrap(
|
||||
),
|
||||
```
|
||||
|
||||
显示多个 `Flutter` 的 `logo` 并自动换行
|
||||
|
||||
### Stack
|
||||
|
||||
Stack 可以将一多个子组件叠在一起显示。堆叠顺序按照children属性中的列表依次堆叠摆放,默认将子控件沿左上角对齐。
|
||||
需要控制子控件位置可以嵌套`Positoned`控件。
|
||||
|
||||
```dart
|
||||
// 依次堆叠300*300的蓝色色块、200*200的黑色色块、
|
||||
// 100*100的黄色色块
|
||||
Stack(
|
||||
children: [
|
||||
Container(
|
||||
@ -527,6 +526,8 @@ Stack(
|
||||
),
|
||||
```
|
||||
|
||||
依次堆叠 `300*300` 的蓝色色块、`200*200` 的黑色色块、`100*100` 的黄色色块
|
||||
|
||||
### Positioned
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
若需要控制Stack中子控件的位置,则可以嵌套改控件。
|
||||
@ -603,6 +604,291 @@ Container(
|
||||
),
|
||||
```
|
||||
|
||||
### Flex
|
||||
|
||||
Flex 的用法与 `Row` 或 `Column` 类似,但只需要额外传入 `direction` 参数
|
||||
|
||||
- `Row` 和 `Column` 组件都继承 `Flex` 组件
|
||||
- 设置 `direction` 为 `Axis.horizontal` 表示水平方向(`Row`),为 `Axis.vertical`则为垂直方向(`Column`)
|
||||
|
||||
垂直方向依次摆放3个flutter logo
|
||||
|
||||
```dart
|
||||
Flex(
|
||||
direction: Axis.vertiacl,
|
||||
children: [
|
||||
FlutterLogo(),
|
||||
FlutterLogo(),
|
||||
FlutterLogo(),
|
||||
],
|
||||
),
|
||||
```
|
||||
|
||||
水平方向依次摆放 3 个 flutter logo
|
||||
|
||||
```dart
|
||||
Flex(
|
||||
direction: Axis.horizontal,
|
||||
children: [
|
||||
FlutterLogo(),
|
||||
FlutterLogo(),
|
||||
FlutterLogo(),
|
||||
],
|
||||
),
|
||||
```
|
||||
|
||||
### Expaneded
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
Expanded 用于扩张一个子组件。可以通过 `flex` 属性,用于表示该组件相对其他弹性组件放大的倍数(可以理解为一个权重)。
|
||||
|
||||
```dart
|
||||
// Container 会占满剩余的全部空用空间
|
||||
Row(
|
||||
children: [
|
||||
FlutterLogo(),
|
||||
Expanded(
|
||||
child: Container(
|
||||
child: FlutterLogo(),
|
||||
color: Colors.green,
|
||||
),
|
||||
),
|
||||
FlutterLogo(),
|
||||
],
|
||||
),
|
||||
|
||||
// 按照1:2 的比例分配一整行的空间
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
flex: 1,
|
||||
child: Container(
|
||||
child: FlutterLogo(),
|
||||
color: Colors.green,
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
flex: 2,
|
||||
child: Container(
|
||||
child: FlutterLogo(),
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
```
|
||||
|
||||
### Flexible
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
`Flexible` 是 `Expanded` 组件的父类。
|
||||
与 `Expanded` 不同的是,`Flexible` 可以通过 `fit` 属性设置子控件是否必须占满 `Flexibal` 扩展的空间。而 `Expaned` 默认子控件必须占满
|
||||
|
||||
```dart
|
||||
// 如果将fit设置为tight,
|
||||
// 则绿色Container 和蓝色Container大小一样。
|
||||
// 如果将fit设置为loose,
|
||||
// 则两个Flexible扩展的空间大小是一样的,
|
||||
// 但绿色Container并不会填充整个扩展的空间。
|
||||
Row(
|
||||
children: [
|
||||
Flexible(
|
||||
flex: 2,
|
||||
// fit: FlexFit.tight,
|
||||
child: Container(
|
||||
child: FlutterLogo(),
|
||||
color: Colors.green,
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
flex: 2,
|
||||
child: Container(
|
||||
child: FlutterLogo(),
|
||||
color: Colors.blue,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
```
|
||||
|
||||
将 `Flexible` 的 `fit` 属性设置为 `tingt`,就等价于使用 `Expanded`
|
||||
|
||||
### Spacer
|
||||
|
||||
Spacer 用于在布局中留白
|
||||
|
||||
```dart
|
||||
Row(
|
||||
children: [
|
||||
Text('Item'),
|
||||
Spacer(),
|
||||
FlutterLogo(),
|
||||
],
|
||||
),
|
||||
```
|
||||
|
||||
例如,需要文本和图标位于一个行的两端,而中间留白时。就可以使用 `Spacer`
|
||||
|
||||
### ListView
|
||||
|
||||
`ListView` 是一个支持滚动的列表组件。该组件默认支持上下滑动。
|
||||
`ListView`的默认构造函数,会立即初始化`children`中的所有子`widget`,无法动态加载。
|
||||
|
||||
```dart
|
||||
ListView(
|
||||
children: [
|
||||
Text('1'),
|
||||
Text('2'),
|
||||
Text('3'),
|
||||
Text('4'),
|
||||
],
|
||||
),
|
||||
```
|
||||
|
||||
需要动态加载,则可以使用 `ListView.builder()`命名构函数。
|
||||
|
||||
```dart
|
||||
// 动态生成4个Text
|
||||
ListView.builder(
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return Text('$index');
|
||||
},
|
||||
itemCount: 4,
|
||||
),
|
||||
```
|
||||
|
||||
需要在对`ListView`中的`Item`添加分割线,则可以借助`ListView.separated()`。
|
||||
|
||||
```dart
|
||||
// separatorBuilder 函数用于在元素之间插入分割线。
|
||||
// 也可以返回其他widget。该widget会被插入各个元素之间。
|
||||
ListView.separated(
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return Text('$index');
|
||||
},
|
||||
itemCount: 4,
|
||||
separatorBuilder: (BuildContext context, int index) {
|
||||
// 使用Divider widget 画一条粗为5,颜色为红色的线
|
||||
return const Divider(
|
||||
height: 5,
|
||||
thickness: 5,
|
||||
color: Colors.red,
|
||||
);
|
||||
},
|
||||
),
|
||||
```
|
||||
|
||||
### GridView
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
`GridView`可将元素显示为二维网格状的列表组件,并支持主轴方向滚动。
|
||||
使用GridView() 构造函数,需要传入gridDelegate和children。Flutter中已经提供了两种实现方式,分别是:
|
||||
|
||||
- `SliverGridDelegateWithFixedCrossAxisCount()` 用于交叉轴方向固定数。
|
||||
- `SliverGridDelegateWithMaxCrossAxisExtent()` 用于交叉轴方向限制最大长度。
|
||||
|
||||
```dart
|
||||
// 使用SliverGridDelegateWithFixedCrossAxisCount
|
||||
GridView(
|
||||
gridDelegate:
|
||||
const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 4),
|
||||
children: List.generate(
|
||||
8,
|
||||
(index) => Container(
|
||||
color: Colors.red[index % 8 * 100],
|
||||
child: Text("index $index"),
|
||||
)),
|
||||
),
|
||||
|
||||
// 使用SliverGridDelegateWithMaxCrossAxisExtent
|
||||
GridView(
|
||||
gridDelegate:
|
||||
SliverGridDelegateWithMaxCrossAxisExtent(maxCrossAxisExtent: 200),
|
||||
children: List.generate(
|
||||
8,
|
||||
(index) => Container(
|
||||
color: Colors.red[index % 8 * 100],
|
||||
child: Text("index $index"),
|
||||
),
|
||||
),
|
||||
),
|
||||
```
|
||||
|
||||
`GridView.builder()`命名构造可以实现元素的动态加载,与`ListView.builder()`类似
|
||||
|
||||
```dart
|
||||
GridView.builder(
|
||||
itemCount: 8,
|
||||
gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(
|
||||
crossAxisCount: 4),
|
||||
itemBuilder: (context, index) => Container(
|
||||
color: Colors.red[index % 8 * 100],
|
||||
child: Text("index $index"),
|
||||
),
|
||||
),
|
||||
```
|
||||
|
||||
`Gridview.count()` 一个简单的构造函数,只需要传入`crossAxisCount`(交叉轴元素的个数)和`children`即可。
|
||||
|
||||
```dart
|
||||
GridView.count(
|
||||
crossAxisCount: 4, // 每行固定为4个
|
||||
children: List.generate(
|
||||
8,
|
||||
(index) => Container(
|
||||
color: Colors.red[index % 8 * 100],
|
||||
child: Text("index $index"),
|
||||
)),
|
||||
),
|
||||
```
|
||||
|
||||
`GridView.extent()` 用于设定每个元素在交叉轴方向的最大尺寸。当程序运行在较大屏幕时通常能看到更多的元素,而不是少量元素的放大版。通过传入`maxCrossAxisExtent`,`Gridview`会根据屏幕尺寸自动选择合适的行数量。
|
||||
|
||||
```dart
|
||||
GridView.extent(
|
||||
maxCrossAxisExtent: 200,
|
||||
children: List.generate(
|
||||
8,
|
||||
(index) => Container(
|
||||
color: Colors.red[index % 8 * 100],
|
||||
child: Text("index $index"),
|
||||
)),
|
||||
),
|
||||
```
|
||||
|
||||
`GridView.count()`和GridView.extent()`可以看作GridView的语法糖。
|
||||
|
||||
### PageView
|
||||
|
||||
使用`PageView`可以实现整屏页面滚动,默认为水平方向翻页。与`ListView`类似。
|
||||
|
||||
- `pageSnapping`参数可以设置滑动时`Page`停留在任意位置。
|
||||
- `scrollDirection`参数设置滚动方向(默认为水平方向)。
|
||||
|
||||
```dart
|
||||
PageView(
|
||||
pageSnapping: false, // 取消页面固定
|
||||
scrollDirection: Axis.vertical, // 设置为垂直方向滚动
|
||||
children: [
|
||||
for (int i = 0; i < 4; i++)
|
||||
Container(
|
||||
color: Colors.red[i % 4 * 100],
|
||||
)
|
||||
],
|
||||
),
|
||||
```
|
||||
|
||||
使用`PageView.builder()`命名构造,可以动态加载页面。与`ListView.builder()`类似。
|
||||
|
||||
```dart
|
||||
PageView.builder(
|
||||
pageSnapping: false,
|
||||
scrollDirection: Axis.vertical,
|
||||
itemBuilder: (BuildContext context, int index) => Container(
|
||||
color: Colors.red[index % 4 * 100],
|
||||
),
|
||||
),
|
||||
```
|
||||
|
||||
另见
|
||||
---
|
||||
|
||||
|
134
docs/ftp.md
Normal file
@ -0,0 +1,134 @@
|
||||
ftp 备忘清单
|
||||
===
|
||||
|
||||
此 ftp 备忘清单包含命令和使用 ftp 脚本实现自动化的技巧示例。
|
||||
|
||||
入门
|
||||
----
|
||||
|
||||
### 介绍
|
||||
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
- FTP 命令允许用户通过FTP(File Transfer Protocol)协议在本地计算机和远程服务器之间传输文件。
|
||||
- FTP 是一种在网络上交换文件的标准协议,是 ARPANet 的标准文件传输协议,ARPANet 网络就是现今 Internet 的前身。
|
||||
- 使用 FTP 协议时,一方充当客户端,另一方充当服务器,客户端可以上传、下载、删除、重命名文件和目录,以及执行其他文件传输相关的操作。
|
||||
|
||||
### 选项
|
||||
<!--rehype:wrap-class=row-span-3-->
|
||||
|
||||
```bash
|
||||
ftp -v ftp.example.com
|
||||
```
|
||||
|
||||
`-v`:启用或禁用详细模式。在详细模式下,`ftp`命令会显示所有来自服务器的响应消息。默认情况下,该选项为开启状态。
|
||||
|
||||
```bash
|
||||
ftp -d ftp.example.com
|
||||
```
|
||||
|
||||
`-d`:启用调试模式。该选项会显示所有FTP传输过程中发送和接收到的命令,有助于调试连接问题。
|
||||
|
||||
```bash
|
||||
ftp -n ftp.example.com
|
||||
```
|
||||
|
||||
`-n`:禁止自动登录。默认情况下,`ftp`命令会在连接到远程服务器后尝试自动登录。使用该选项可以禁止该行为,通常与`.netrc`文件联合使用。
|
||||
|
||||
```bash
|
||||
ftp -g ftp.example.com
|
||||
```
|
||||
|
||||
禁用文件名通配符扩展。`ftp`命令默认会展开文件名中的通配符。使用该选项可以关闭这一行为。
|
||||
|
||||
```bash
|
||||
ftp -p ftp.example.com
|
||||
```
|
||||
|
||||
`-p`:使用被动模式(PASV)进行数据连接。被动模式在客户端位于防火墙或NAT后面时非常有用。
|
||||
|
||||
```bash
|
||||
ftp -s:script.txt ftp.example.com # Windows
|
||||
ftp -n ftp.example.com < script # Linux
|
||||
```
|
||||
|
||||
:warning: Windows 上使用`-s`选项指定`script.txt`脚本执行 ftp 命令。Linux 上可以使用重定向实现。
|
||||
|
||||
### 目录操作
|
||||
|
||||
| 命令 | 描述 |
|
||||
| -------------------- | -------------------------- |
|
||||
| `cd` | 更改当前工作目录到指定目录 |
|
||||
| `ls`或`dir` | 列出当前目录下的内容 |
|
||||
| `pwd` | 显示当前目录的绝对路径 |
|
||||
| `mkdir` | 创建目录 |
|
||||
| `rmdir` | 删除一个目录 |
|
||||
| `rename <old> <new>` | 重命名一个目录 |
|
||||
|
||||
### 快速开始
|
||||
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
使用匿名模式访问远程 FTP 服务器
|
||||
|
||||
```bash
|
||||
ftp ftp.example.com
|
||||
```
|
||||
|
||||
ftp 会启动交互式命令行
|
||||
|
||||
```bash
|
||||
Connected to <host> (<ip address>).
|
||||
220 (vsFTPd 3.*)
|
||||
# 需要手动输入 anonymous
|
||||
Name (192.168.10.10:root): anonymous
|
||||
331 Please specify the password.
|
||||
Password: # 匿名模式下直接回车
|
||||
230 Login successful.
|
||||
Remote system type is UNIX.
|
||||
Using binary mode to transfer files.
|
||||
```
|
||||
|
||||
连接成功后进入交互式会话.
|
||||
|
||||
查看所有命令,使用 `helm` 或 `?`
|
||||
|
||||
```bash
|
||||
ftp> help
|
||||
# 或者
|
||||
ftp> ?
|
||||
```
|
||||
|
||||
### 文件操作
|
||||
|
||||
| 命令 | 描述 |
|
||||
| ---------------------- | -------------------- |
|
||||
| `get <remote> <local>` | 下载一个文件到本地 |
|
||||
| `mget` | 下载多个文件到本地 |
|
||||
| `put <local> <remote>` | 上传一个文件到服务器 |
|
||||
| `mput` | 上传多个文件到服务器 |
|
||||
| `delete <remote>` | 删除一个文件 |
|
||||
| `rename <old> <new>` | 重命名一个文件 |
|
||||
|
||||
脚本
|
||||
----
|
||||
|
||||
### 样例
|
||||
|
||||
<!--rehype:wrap-class=col-span-3-->
|
||||
|
||||
以匿名登录为例,将下列脚本代码放入文件 `script` 中:
|
||||
|
||||
```bash
|
||||
user anonymous "\n" # 匿名用户
|
||||
binary # 将文件传输模式设置为二进制模式,这对于非文本文件(如图片、压缩文件等)来说是必要的,以确保文件在传输过程中不会被更改。
|
||||
ls <dir> # 进入某个目录
|
||||
pwd # 输出当前路径
|
||||
quit # 退出 ftp 连接
|
||||
```
|
||||
|
||||
使用 `ftp` 命令执行脚本文件:
|
||||
|
||||
```bash
|
||||
ftp -n ftp.example.com < script # 使用 -n 选项禁止自动登录,这样会继续执行 user 指令,而不是启动交互式命令行。
|
||||
```
|
246
docs/gdb.md
Normal file
@ -0,0 +1,246 @@
|
||||
GDB 备忘清单
|
||||
===
|
||||
|
||||
本清单提供了对 [GDB](https://en.wikipedia.org/wiki/GNU_Debugger) 的入门简要概述,以及 `GDB` 常用示例,完整文档参阅 [Debugging with gdb](https://www.eecs.umich.edu/courses/eecs373/readings/Debugger.pdf),该文档最后有 `GDB index`,可以快速查找命令。
|
||||
|
||||
入门
|
||||
---
|
||||
<!--rehype:body-class=cols-2-->
|
||||
|
||||
### 常用命令
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
`[]` 内为命令缩写
|
||||
|
||||
| 命令 `[缩写]` | 说明 |
|
||||
|:--------------------|:-----------|
|
||||
| `help[h]` | **查看命令帮助**。如 `help run` |
|
||||
| `run[r]` | **运行程序**。可搭配参数使用 |
|
||||
| `start` | **运行程序,停在第一条执行语句**。可搭配参数使用 |
|
||||
| `list[l]` | **查看程序源码** |
|
||||
| `break[b]` | **设置断点**。可指定文件名、函数名和行号等参数来设置断点 |
|
||||
| `watch` | **设置监视点**。当监视的变量发生更改时,程序会被中断 |
|
||||
| `delete` | **删除断点等**。可用于删除断点、监视点、`display` 等 |
|
||||
| `continue[c]` | **继续执行程序**。让程序继续执行,到下一个断点或程序结束 |
|
||||
| `next[n]` | **单步执行程序,跳过函数调用** |
|
||||
| `step[s]` | **单步执行程序,进入函数调用** |
|
||||
| `finish` | **结束当前函数**。返回到函数调用点 |
|
||||
| `kill` | **杀死当前的调试进程** |
|
||||
| `backtrace[bt]` | **查看函数调用栈**。它会打印出当前的函数调用栈 |
|
||||
| `frame[fr]` | **切换栈帧**。以查看该栈帧中的局部变量和参数等 |
|
||||
| `info` | **查看程序状态信息**。例如断点、寄存器、线程、局部变量等 |
|
||||
| `show` | **查看 `gdb` 配置信息**。与 `info` 不同, `show` 查看 `GDB` 本身的配置信息 |
|
||||
| `set` | **设置变量值**。有时指定变量类型才能设置,如 `set *(int*)(&a) = 3` |
|
||||
| `whatis` | **查看变量、函数类型**。例如,`whatis a` 可以显示变量 `a` 的类型 |
|
||||
| `ptype` | **查看变量、函数类型**。会显示完整的结构体类型 |
|
||||
| `print[p]` | **打印变量的值**。例如,`print x` 可以显示变量 `x` 的当前值 |
|
||||
| `display` | **持续打印变量的值**。与 `print` 类似,但它会在每次停下时自动输出值 |
|
||||
| `thread` | **切换线程**。例如,`thread 2` 切换到编号为 `2` 的线程 |
|
||||
| `signal` | **向进程发送信号**。例如,`signal 9` 发送编号为 `9` 的信号 |
|
||||
<!--rehype:className=left-align-->
|
||||
|
||||
### 启动调试
|
||||
|
||||
启动进程,不带参数
|
||||
|
||||
```bash
|
||||
# gdb <program>
|
||||
(gdb) run
|
||||
```
|
||||
|
||||
启动进程,带参数 `<args>`
|
||||
|
||||
```bash
|
||||
# gdb <program>
|
||||
(gdb) run <args>
|
||||
```
|
||||
|
||||
启动 `gdb` 时传入参数,`run` 就不用传入了
|
||||
|
||||
```bash
|
||||
# gdb --args <program> 1 2 3
|
||||
(gdb) run
|
||||
```
|
||||
|
||||
通过 `set` 设置参数
|
||||
|
||||
```bash
|
||||
# gdb <program>
|
||||
(gdb) set args 1 2 3
|
||||
(gdb) run
|
||||
```
|
||||
|
||||
显示运行时将要或已经传递给程序的参数
|
||||
|
||||
```bash
|
||||
(gdb) show args
|
||||
```
|
||||
|
||||
在启动进程前,添加环境变量
|
||||
|
||||
```bash
|
||||
(gdb) set env DEBUG 1
|
||||
```
|
||||
|
||||
在启动进程前,清除环境变量
|
||||
|
||||
```bash
|
||||
(gdb) unset env DEBUG
|
||||
```
|
||||
|
||||
通过进程号 `123` 连接到正在运行的进程
|
||||
|
||||
```bash
|
||||
(gdb) attach 123
|
||||
```
|
||||
|
||||
### core dump 文件
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
默认情况下,`linux` 系统中程序崩溃时也不会生成 `core dump` 文件,需要先启用
|
||||
|
||||
```bash
|
||||
ulimit -c unlimited
|
||||
echo "/tmp/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
|
||||
```
|
||||
|
||||
调试 `core` 文件
|
||||
|
||||
```bash
|
||||
gdb program /tmp/core-file
|
||||
```
|
||||
|
||||
### 查看源码
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
| 命令 | 说明 |
|
||||
|:--------------------|:-----------|
|
||||
| `(gdb) list 30` | 查看第 `30` 行为中心的上下 `5` 行源码 |
|
||||
| `(gdb) list main` | 查看 `main` 函数为中心的上下 `5` 行源码 |
|
||||
| `(gdb) list file.c:30` | 查看 `file.c` 文件中 `30` 行的源码 |
|
||||
| `(gdb) list file.c:main` | 查看 `file.c` 文件中 `main` 函数 |
|
||||
| `(gdb) disassemble` | 查看当前可执行文件的汇编源码 |
|
||||
| `(gdb) disassemble myfun` | 查看指定函数的汇编源码 |
|
||||
|
||||
### 流程控制
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
| 命令 | 说明 |
|
||||
|:--------------------|:-----------|
|
||||
| `(gdb) step[s]` | 执行源码级别的单步进入操作 |
|
||||
| `(gdb) stepi[si]` | 执行指令级别的单步进入操作 |
|
||||
| `(gdb) next[n]` | 执行源码级别的单步跳过操作 |
|
||||
| `(gdb) nexti[ni]` | 执行指令级别的单步跳过操作 |
|
||||
| `(gdb) continue[c]` | 继续执行,到下一个断点或程序结束 |
|
||||
| `(gdb) finish` | 运行完当前函数,并返回到函数调用点 |
|
||||
| `(gdb) return` | 直接退出当前函数,不执行剩下代码块 |
|
||||
| `(gdb) return expression` | 可以指定返回值的内容 |
|
||||
| `(gdb) until` | 结束当前循环 |
|
||||
|
||||
### 断点命令
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
| 命令 | 说明 |
|
||||
|:--------------------|:-----------|
|
||||
| `(gdb) break main` | 在所有名为 `main` 的函数处设置一个断点 |
|
||||
| `(gdb) break test.c:12` | 在文件 `test.c` 的第 `12` 行设置断点 |
|
||||
| `(gdb) break test.c:func` | 在文件 `test.c` 的 `func` 函数处设置断点 |
|
||||
| `(gdb) rbreak regular-expression` | 在正则表达式匹配的函数名上设置断点 |
|
||||
| `(gdb) break foo if a < 100` | 设置**条件断点**,条件满足才停止 |
|
||||
| `(gdb) info break` | 列出所有断点位置、编号 |
|
||||
| `(gdb) delete 2` | 删除指定编号的断点 |
|
||||
| `(gdb) clear` | 删除刚才停止处的断点 |
|
||||
| `(gdb) disable 1` | `disable` 指定编号的断点 |
|
||||
| `(gdb) enable 1` | `enable` 指定编号的断点 |
|
||||
|
||||
### watch 命令
|
||||
|
||||
| 命令 | 说明 |
|
||||
|:--------------------|:-----------|
|
||||
| `(gdb) watch var` | 监视变量,当值变化时会输出新、旧值 |
|
||||
| `(gdb) info break` | 列出断点,也包括 `watchpoint` |
|
||||
| `(gdb) i watch` | 只列出 `watchpoint` |
|
||||
| `(gdb) delete 1` | 删除指定的 `watchpoint` |
|
||||
|
||||
### 查看变量
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
| 命令 | 说明 |
|
||||
|:--------------------|:-----------|
|
||||
| `(gdb) info args` | 查看传入参数信息 |
|
||||
| `(gdb) info local` | 查看当前栈帧(函数)的本地变量 |
|
||||
| `(gdb) print var` | 查看指定变量的值 |
|
||||
| `(gdb) print/x var` | 以十六进制输出变量的值 |
|
||||
| `(gdb) print ptr` | 假设 `int *ptr=&a`,输出变量 `a` 的地址 |
|
||||
| `(gdb) print *ptr` | 假设 `int *ptr=&a`,输出变量 `a` 的值 |
|
||||
| `(gdb) print *ptr@5` | 假设 `int ptr[5]`,输出数组的值 |
|
||||
| `(gdb) display var` | 与 `print` 作用相同,但每次停下来都自动输出变量的值 |
|
||||
| `(gdb) info display` | 列出所有设置了 `display` 的变量 |
|
||||
| `(gdb) undisplay 1` | 与 `display` 相反,不能指定变量名,只能是编号 |
|
||||
| `(gdb) delete display 1` | 与 `undisplay` 类似,通过编号取消显示 |
|
||||
| `(gdb) whatis var` | 查看变量类型 |
|
||||
| `(gdb) ptype var` | 比 `type` 更详细,会给出结构体的定义 |
|
||||
|
||||
### frame 栈帧
|
||||
|
||||
每当一个函数被调用时,一个新的栈帧 `frame` 就会被压入栈中,栈帧包含了该函数的局部变量、参数、返回地址和其他信息,当函数执行完毕后,这个栈帧会被弹出栈并销毁。
|
||||
|
||||
| 命令 | 说明 |
|
||||
|:--------------------|:-----------|
|
||||
| `(gdb) frame` | 显示当前栈帧和源代码行 |
|
||||
| `(gdb) backtrace` | 打印出当前正在执行的所有栈帧 |
|
||||
| `(gdb) backtrace 5` | 只显示最近调用的 `5` 个栈帧 |
|
||||
| `(gdb) frame 2` | 切换到第 `2` 个栈帧,以查看信息 |
|
||||
| `(gdb) up` | 切换到上一级调用栈帧 |
|
||||
| `(gdb) down` | 切换到下一级调用栈帧 |
|
||||
|
||||
### 函数调用
|
||||
|
||||
`call` 和 `print` 调用的函数如果存在全局变量、静态变量的修改,在函数返回后会恢复到调用之前的值,这两个调用不会影响程序的状态
|
||||
|
||||
| 命令 | 说明 |
|
||||
|:--------------------|:-----------|
|
||||
| `(gdb) call func(a, b)` | 调用指定的函数,不影响主线程变量 |
|
||||
| `(gdb) print func(a, b)` | 与 `call` 类似 |
|
||||
| `(gdb) finish` | 结束当前运行的函数 |
|
||||
|
||||
### 信号
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
`linux` 下使用 `kill -l` 查看信号编号与信号名,使用 `info signal` 查看信号的处理方式、描述等:
|
||||
|
||||
```bash
|
||||
(gdb) info signal
|
||||
Signal Stop Print Pass to program Description
|
||||
|
||||
SIGHUP Yes Yes Yes Hangup
|
||||
SIGINT Yes Yes No Interrupt
|
||||
SIGQUIT Yes Yes Yes Quit
|
||||
SIGILL Yes Yes Yes Illegal instruction
|
||||
```
|
||||
|
||||
| 命令 | 说明 |
|
||||
|:--------------------|:-----------|
|
||||
| `(gdb) signal SIGKILL` | 向进程发送信号,用信号名或编号表示 |
|
||||
| `(gdb) signal 9` | 向进程发送信号,用信号名或编号表示 |
|
||||
| `(gdb) handle <signal> actions` | 指定信号的处理方式,选择如下,可以组合 |
|
||||
| `stop/nostop` | 收到信号是否停止进程,类似断点 |
|
||||
| `print/noprint` | 收到信号是否输出消息 |
|
||||
| `pass/nopass` | 是否将信号传递给程序 |
|
||||
|
||||
### 线程
|
||||
|
||||
| 命令 | 说明 |
|
||||
|:--------------------|:-----------|
|
||||
| `(gdb) info threads` | 列出所有线程,标识当前所在线程 |
|
||||
| `(gdb) thread 2` | 切换到编号为 `2` 的线程 |
|
||||
| `(gdb) break file.c:23 thread all` | 在所有线程中相应的行上设置断点 |
|
||||
| `(gdb) thread apply all command` | 让所有线程执行 `gdb` 命令 |
|
||||
| `(gdb) thread apply ID1 ID2 command` | 让指定线程执行 `gdb` 命令 |
|
||||
| `(gdb) set scheduler-locking off` | 所有线程都执行,这是默认值 |
|
||||
| `(gdb) set scheduler-locking on` | 只让当前线程执行 |
|
||||
|
||||
另见
|
||||
---
|
||||
|
||||
- [应用崩溃调试分析](https://carlyleliu.github.io/2022/%E5%BA%94%E7%94%A8%E5%B4%A9%E6%BA%83%E8%B0%83%E8%AF%95%E5%88%86%E6%9E%90)
|
707
docs/git.md
@ -155,7 +155,7 @@ $ git branch -av
|
||||
$ git checkout my_branch
|
||||
```
|
||||
|
||||
创建一个名为 `new_branch` 的新分支
|
||||
创建并切换到新分支`new_branch`
|
||||
|
||||
```shell
|
||||
$ git checkout -b new_branch
|
||||
@ -389,21 +389,8 @@ $ git mv [existing-path] [new-path]
|
||||
$ git log --stat -M
|
||||
```
|
||||
|
||||
### git 配置 ssh 代理
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
```bash
|
||||
$ cat ~/.ssh/config
|
||||
Host gitlab.com
|
||||
# 直接使用 shadowsocks 提供的 socks5 代理端口
|
||||
ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p
|
||||
|
||||
Host github.com
|
||||
ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### .gitattributes
|
||||
<!--rehype:wrap-class=col-span-2 row-span-2-->
|
||||
|
||||
```ini
|
||||
# 设置默认行为,以防人们没有设置 core.autocrlf
|
||||
@ -435,6 +422,390 @@ special-vendored-path/* linguist-vendored
|
||||
*.rb linguist-language=Java
|
||||
```
|
||||
|
||||
### git 配置 ssh 代理
|
||||
|
||||
```bash
|
||||
$ cat ~/.ssh/config
|
||||
Host gitlab.com
|
||||
# 直接使用 sh**socks 提供的 socks5 代理端口
|
||||
ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p
|
||||
|
||||
Host github.com
|
||||
ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
Commit
|
||||
---
|
||||
|
||||
### 改写历史
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
重写最后的提交消息
|
||||
|
||||
```shell
|
||||
$ git commit --amend -m "new message"
|
||||
```
|
||||
|
||||
修改最新的提交而不更改提交消息
|
||||
|
||||
```shell
|
||||
$ git commit --amend --no-edit
|
||||
```
|
||||
|
||||
### 在 commit log 中显示 GPG 签名
|
||||
|
||||
```bash
|
||||
$ git log --show-signature
|
||||
```
|
||||
|
||||
### 修改远程 Commit 记录
|
||||
<!--rehype:wrap-class=row-span-5-->
|
||||
|
||||
```shell
|
||||
$ git rebase -i HEAD~3
|
||||
# 表示要修改当前版本的倒数第三次状态
|
||||
# 将要更改的记录行首单词 pick 改为 edit
|
||||
pick 96dc3f9 提交 commit 描述内容 1
|
||||
pick f1cce8a 提交 commit 描述内容 2
|
||||
pick 6293516 提交 commit 描述内容 3
|
||||
# Rebase eeb03a4..6293516 onto eeb03a4
|
||||
# (3 commands)
|
||||
#
|
||||
# Commands:
|
||||
# p, pick = 使用提交
|
||||
# r, reword = 使用提交,但编辑提交消息
|
||||
# e, edit = 使用提交,但停止修改
|
||||
# s, squash = 使用提交,但融合到先前的提交中
|
||||
# f, fixup = 像 squash,但丢弃此提交的日志消息
|
||||
# x, exec = 使用 shell 运行命令(该行的其余部分)
|
||||
# d, drop = 删除提交
|
||||
```
|
||||
|
||||
保存并退出,会弹出下面提示
|
||||
|
||||
```shell
|
||||
# 您现在可以修改提交,使用
|
||||
#
|
||||
# git commit --amend
|
||||
#
|
||||
# 对更改感到满意后,运行
|
||||
#
|
||||
# git rebase --continue
|
||||
#
|
||||
# 1. 通过这条命令进入编辑更改 commit,保存退出
|
||||
$ git commit --amend
|
||||
# 2. 保存退出确认修改,继续执行下面命令,
|
||||
$ git rebase --continue
|
||||
# 如果修改多条记录反复执行上面两条命令直到完成所有修改
|
||||
|
||||
# 最后,确保没有人提交进行推送,最好不要加 -f 强制推送
|
||||
$ git push -f origin master
|
||||
```
|
||||
|
||||
### Commit
|
||||
|
||||
```shell
|
||||
$ git commit -v --amend
|
||||
```
|
||||
|
||||
重写最后的提交信息
|
||||
|
||||
### 撤销远程记录
|
||||
|
||||
```shell
|
||||
# 撤销一条记录
|
||||
$ git reset --hard HEAD~1
|
||||
# 强制同步到远程仓库
|
||||
$ git push -f origin HEAD:master
|
||||
```
|
||||
|
||||
### 放弃本地修改内容
|
||||
|
||||
```shell
|
||||
# 如果有的修改以及加入暂存区的话
|
||||
$ git reset --hard
|
||||
# 还原所有修改,不会删除新增的文件
|
||||
$ git checkout .
|
||||
# 下面命令会删除新增的文件
|
||||
$ git clean -xdf
|
||||
```
|
||||
|
||||
### 把 A 分支的某一个 commit,放到 B 分支上
|
||||
|
||||
```shell
|
||||
# 切换到 B 分支
|
||||
$ git checkout <B>
|
||||
# 将 A 分支 <hash-id> 的内容 pick 到 B 分支
|
||||
$ git cherry-pick <hash-id>
|
||||
```
|
||||
|
||||
### 重设第一个 commit
|
||||
|
||||
```bash
|
||||
$ git update-ref -d HEAD
|
||||
```
|
||||
|
||||
把所有的改动都重新放回工作区,并**清空所有的 commit**,这样就可以重新提交第一个 `commit` 了
|
||||
|
||||
### 回到远程仓库的状态
|
||||
|
||||
```bash
|
||||
$ git fetch --all && git reset --hard origin/master
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
抛弃本地所有的修改,回到远程仓库的状态
|
||||
|
||||
### commit 历史中显示 Branch1 有的但是 Branch2 没有 commit
|
||||
|
||||
```bash
|
||||
$ git log Branch1 ^Branch2
|
||||
```
|
||||
|
||||
### git 迁移
|
||||
|
||||
- 从原地址克隆一份裸版本库
|
||||
|
||||
```bash
|
||||
$ git clone --bare https://github.com/username/project.git
|
||||
```
|
||||
|
||||
- 然后新建一个地址,比如一下
|
||||
|
||||
```bash
|
||||
$ https://gitee.com/username/newproject.git
|
||||
```
|
||||
|
||||
- 进入project.git这个全裸版本库,以镜像推送的方式上传代码到newproject上。
|
||||
|
||||
```
|
||||
$ cd project.git
|
||||
|
||||
$ git push --mirror https://gitee.com/username/newproject.git
|
||||
```
|
||||
|
||||
- 使用新地址,直接 Clone 到本地就可以了。
|
||||
|
||||
```
|
||||
$ git clone https://gitee.com/username/newproject.git
|
||||
```
|
||||
|
||||
Git Submodule 子模块
|
||||
------
|
||||
|
||||
### 添加子模块
|
||||
|
||||
```bash
|
||||
$ git submodule add <仓库地址> <子模块路径>
|
||||
```
|
||||
|
||||
### 克隆包含子模块的仓库
|
||||
|
||||
```bash
|
||||
$ git clone <repository_url> --recursive
|
||||
```
|
||||
|
||||
### 更新子模块
|
||||
|
||||
```bash
|
||||
$ git submodule update --remote
|
||||
```
|
||||
|
||||
### 切换到子模块的特定提交
|
||||
|
||||
```bash
|
||||
$ cd <path_to_submodule>
|
||||
$ git checkout <commit_hash>
|
||||
```
|
||||
|
||||
### 查看当前仓库中的子模块
|
||||
|
||||
```bash
|
||||
$ git submodule status
|
||||
```
|
||||
|
||||
### 初始化子模块
|
||||
|
||||
```bash
|
||||
$ git submodule init
|
||||
```
|
||||
|
||||
### 切换到父仓库的特定提交,并更新子模块
|
||||
|
||||
```bash
|
||||
$ cd ..
|
||||
$ git checkout <commit_hash>
|
||||
$ git submodule update --remote
|
||||
```
|
||||
|
||||
### 获取并切换子模块的最新标签
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
|
||||
```bash
|
||||
$ cd <path_to_submodule>
|
||||
$ git fetch --tags
|
||||
$ git checkout $(git describe --tags $(git rev-list --tags --max-count=1))
|
||||
```
|
||||
|
||||
### 子模块递归
|
||||
<!--rehype:wrap-class=col-span-2 row-span-3-->
|
||||
|
||||
```bash
|
||||
# 添加所有已存在的子模块
|
||||
$ git submodule foreach --recursive git submodule add <repository_url>
|
||||
# 更新所有子模块到最新提交
|
||||
$ git submodule foreach --recursive git pull origin master
|
||||
# 检出特定的子模块路径
|
||||
$ git submodule foreach --recursive git checkout <branch_name>
|
||||
# 获取仓库中的所有子模块变化
|
||||
$ git submodule foreach --recursive git fetch
|
||||
# 获取并合并子模块的远程分支
|
||||
$ git submodule foreach --recursive git pull origin <branch_name>
|
||||
# 将子模块还原到父仓库中的初始提交
|
||||
$ git submodule foreach --recursive git checkout .
|
||||
# 获取子模块的更新并忽略本地修改
|
||||
$ git submodule foreach --recursive git fetch --all
|
||||
$ git submodule foreach --recursive git reset --hard origin/master
|
||||
```
|
||||
|
||||
### 获取子模块的最新提交
|
||||
|
||||
```bash
|
||||
$ cd <path_to_submodule>
|
||||
$ git pull
|
||||
```
|
||||
|
||||
### 删除子模块
|
||||
|
||||
```bash
|
||||
$ git submodule deinit <path_to_submodule>
|
||||
$ git rm <path_to_submodule>
|
||||
```
|
||||
|
||||
### 切换子模块的分支
|
||||
|
||||
```bash
|
||||
$ cd <path_to_submodule>
|
||||
$ git checkout <branch_name>
|
||||
```
|
||||
|
||||
### 初始化并更新所有子模块
|
||||
|
||||
```bash
|
||||
$ git submodule init
|
||||
$ git submodule update
|
||||
```
|
||||
|
||||
### 切换子模块的特定标签
|
||||
|
||||
```bash
|
||||
$ cd <path_to_submodule>
|
||||
$ git checkout tags/<tag_name>
|
||||
```
|
||||
|
||||
Config 设置
|
||||
---
|
||||
|
||||
### 查看配置的信息
|
||||
|
||||
```bash
|
||||
$ git help config
|
||||
```
|
||||
|
||||
获取帮助信息,查看修改个人信息的参数
|
||||
|
||||
### 忽略文件的权限变化
|
||||
|
||||
```shell
|
||||
git config core.fileMode false
|
||||
```
|
||||
|
||||
不再将文件的权限变化视作改动
|
||||
|
||||
### 配置自动换行
|
||||
|
||||
```bash
|
||||
$ git config --global core.autocrlf input
|
||||
```
|
||||
|
||||
自动转换坑太大,提交到git是自动将换行符转换为 `lf`
|
||||
|
||||
### 获取帮助信息
|
||||
|
||||
```bash
|
||||
$ git config --list
|
||||
```
|
||||
|
||||
### 中文乱码的解决方案
|
||||
|
||||
```shell
|
||||
$ git config --global core.quotepath false
|
||||
```
|
||||
|
||||
### 删除全局设置
|
||||
|
||||
```bash
|
||||
$ git config --global --unset <entry-name>
|
||||
```
|
||||
|
||||
### 配置 http 和 socks 代理
|
||||
<!--rehype:wrap-class=col-span-2 row-span-2-->
|
||||
|
||||
```bash
|
||||
# 查看代理
|
||||
$ git config --global http.proxy
|
||||
$ git config --global https.proxy
|
||||
$ git config --global socks.proxy
|
||||
|
||||
# 设置代理
|
||||
# 适用于 privoxy 将 socks 协议转为 http 协议的 http 端口
|
||||
$ git config --global http.proxy http://127.0.0.1:1080
|
||||
$ git config --global https.proxy http://127.0.0.1:1080
|
||||
$ git config --global socks.proxy 127.0.0.1:1080
|
||||
|
||||
# 取消代理
|
||||
$ git config --global --unset http.proxy
|
||||
$ git config --global --unset https.proxy
|
||||
$ git config --global --unset socks.proxy
|
||||
|
||||
# 只对 github.com 设置代理
|
||||
$ git config --global http.https://github.com.proxy socks5://127.0.0.1:1080
|
||||
$ git config --global https.https://github.com.proxy socks5://127.0.0.1:1080
|
||||
|
||||
# 取消 github.com 代理
|
||||
$ git config --global --unset http.https://github.com.proxy
|
||||
$ git config --global --unset https.https://github.com.proxy
|
||||
```
|
||||
|
||||
### Git 别名
|
||||
|
||||
```shell
|
||||
$ git config --global alias.co checkout
|
||||
$ git config --global alias.br branch
|
||||
$ git config --global alias.ci commit
|
||||
$ git config --global alias.st status
|
||||
```
|
||||
|
||||
配置好后,再输入 `git` 命令的时候就不用再输入一大段了,例如我们要查看状态,只需:
|
||||
|
||||
```bash
|
||||
$ git st
|
||||
```
|
||||
|
||||
也可以看看:[更多别名](https://gist.github.com/johnpolacek/69604a1f6861129ef088)
|
||||
|
||||
### 设置大小写敏感
|
||||
|
||||
```shell
|
||||
# 查看git 的设置
|
||||
$ git config --get core.ignorecase
|
||||
# 设置大小写敏感
|
||||
$ git config core.ignorecase false
|
||||
# 远程有俩相同目录,通过这种方式清除掉,然后提交记录
|
||||
$ git rm -r --cached <目录/文件>
|
||||
```
|
||||
|
||||
Git 技巧
|
||||
------
|
||||
|
||||
@ -512,109 +883,7 @@ $ git checkout <branch> -- <file>
|
||||
删除本地存在远程不存在的分支
|
||||
|
||||
```shell
|
||||
git remote prune origin
|
||||
```
|
||||
|
||||
### Commit
|
||||
|
||||
```shell
|
||||
$ git commit -v --amend
|
||||
```
|
||||
|
||||
重写最后的提交信息
|
||||
|
||||
### 忽略文件的权限变化
|
||||
|
||||
```shell
|
||||
git config core.fileMode false
|
||||
```
|
||||
|
||||
不再将文件的权限变化视作改动
|
||||
|
||||
### Git 别名
|
||||
|
||||
```shell
|
||||
$ git config --global alias.co checkout
|
||||
$ git config --global alias.br branch
|
||||
$ git config --global alias.ci commit
|
||||
$ git config --global alias.st status
|
||||
```
|
||||
|
||||
也可以看看:[更多别名](https://gist.github.com/johnpolacek/69604a1f6861129ef088)
|
||||
|
||||
### 设置大小写敏感
|
||||
|
||||
```shell
|
||||
# 查看git 的设置
|
||||
$ git config --get core.ignorecase
|
||||
# 设置大小写敏感
|
||||
$ git config core.ignorecase false
|
||||
# 远程有俩相同目录,通过这种方式清除掉,然后提交记录
|
||||
$ git rm -r --cached <目录/文件>
|
||||
```
|
||||
|
||||
### 修改远程 Commit 记录
|
||||
<!--rehype:wrap-class=row-span-4-->
|
||||
|
||||
```shell
|
||||
$ git rebase -i HEAD~3
|
||||
# 表示要修改当前版本的倒数第三次状态
|
||||
# 将要更改的记录行首单词 pick 改为 edit
|
||||
pick 96dc3f9 提交 commit 描述内容 1
|
||||
pick f1cce8a 提交 commit 描述内容 2
|
||||
pick 6293516 提交 commit 描述内容 3
|
||||
# Rebase eeb03a4..6293516 onto eeb03a4
|
||||
# (3 commands)
|
||||
#
|
||||
# Commands:
|
||||
# p, pick = 使用提交
|
||||
# r, reword = 使用提交,但编辑提交消息
|
||||
# e, edit = 使用提交,但停止修改
|
||||
# s, squash = 使用提交,但融合到先前的提交中
|
||||
# f, fixup = 像 squash,但丢弃此提交的日志消息
|
||||
# x, exec = 使用 shell 运行命令(该行的其余部分)
|
||||
# d, drop = 删除提交
|
||||
```
|
||||
|
||||
保存并退出,会弹出下面提示
|
||||
|
||||
```shell
|
||||
# 您现在可以修改提交,使用
|
||||
#
|
||||
# git commit --amend
|
||||
#
|
||||
# 对更改感到满意后,运行
|
||||
#
|
||||
# git rebase --continue
|
||||
#
|
||||
# 1. 通过这条命令进入编辑更改 commit,保存退出
|
||||
$ git commit --amend
|
||||
# 2. 保存退出确认修改,继续执行下面命令,
|
||||
$ git rebase --continue
|
||||
# 如果修改多条记录反复执行上面两条命令直到完成所有修改
|
||||
|
||||
# 最后,确保没有人提交进行推送,最好不要加 -f 强制推送
|
||||
$ git push -f origin master
|
||||
```
|
||||
|
||||
### 撤销远程记录
|
||||
|
||||
```shell
|
||||
# 撤销一条记录
|
||||
$ git reset --hard HEAD~1
|
||||
# 强制同步到远程仓库
|
||||
$ git push -f origin HEAD:master
|
||||
```
|
||||
|
||||
### 放弃本地修改内容
|
||||
|
||||
```shell
|
||||
# 如果有的修改以及加入暂存区的话
|
||||
$ git reset --hard
|
||||
# 还原所有修改,不会删除新增的文件
|
||||
$ git checkout .
|
||||
# 下面命令会删除新增的文件
|
||||
$ git clean -xdf
|
||||
$ git remote prune origin
|
||||
```
|
||||
|
||||
### 获取最近一次提交的 Hash
|
||||
@ -632,32 +901,6 @@ $ git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 把 A 分支的某一个 commit,放到 B 分支上
|
||||
|
||||
```shell
|
||||
# 切换到 B 分支
|
||||
$ git checkout <B>
|
||||
# 将 A 分支 <hash-id> 的内容 pick 到 B 分支
|
||||
$ git cherry-pick <hash-id>
|
||||
```
|
||||
|
||||
### 回到远程仓库的状态
|
||||
|
||||
```bash
|
||||
$ git fetch --all && git reset --hard origin/master
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
抛弃本地所有的修改,回到远程仓库的状态
|
||||
|
||||
### 重设第一个 commit
|
||||
|
||||
```bash
|
||||
$ git update-ref -d HEAD
|
||||
```
|
||||
|
||||
把所有的改动都重新放回工作区,并**清空所有的 commit**,这样就可以重新提交第一个 `commit` 了
|
||||
|
||||
### 查看冲突文件列表
|
||||
|
||||
```bash
|
||||
@ -685,12 +928,6 @@ $ git diff <commit-id> <commit-id>
|
||||
git diff --cached
|
||||
```
|
||||
|
||||
### 中文乱码的解决方案
|
||||
|
||||
```shell
|
||||
$ git config --global core.quotepath false
|
||||
```
|
||||
|
||||
### 展示暂存区、工作区和最近版本的不同
|
||||
|
||||
```bash
|
||||
@ -733,14 +970,6 @@ $ git remote show origin
|
||||
$ git describe --tags --abbrev=0
|
||||
```
|
||||
|
||||
### 查看某段代码是谁写的
|
||||
|
||||
```bash
|
||||
$ git blame <file-name>
|
||||
```
|
||||
|
||||
`blame` 的意思为`责怪`,你懂的。
|
||||
|
||||
### 修改作者名
|
||||
|
||||
```bash
|
||||
@ -748,12 +977,6 @@ $ git commit --amend --author='Author Name <email@address.com>'
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 修改远程仓库的 url
|
||||
|
||||
```bash
|
||||
$ git remote set-url origin <URL>
|
||||
```
|
||||
|
||||
### 增加远程仓库
|
||||
|
||||
```bash
|
||||
@ -767,12 +990,6 @@ $ git remote add origin <remote-url>
|
||||
$ git remote -v
|
||||
```
|
||||
|
||||
### 查看两个星期内的改动
|
||||
|
||||
```bash
|
||||
$ git whatchanged --since='2 weeks ago'
|
||||
```
|
||||
|
||||
### 从 stash 中拿出某个文件的修改
|
||||
|
||||
```bash
|
||||
@ -846,18 +1063,6 @@ $ git clean -X -f
|
||||
$ git status --ignored
|
||||
```
|
||||
|
||||
### commit 历史中显示 Branch1 有的但是 Branch2 没有 commit
|
||||
|
||||
```bash
|
||||
$ git log Branch1 ^Branch2
|
||||
```
|
||||
|
||||
### 在 commit log 中显示 GPG 签名
|
||||
|
||||
```bash
|
||||
$ git log --show-signature
|
||||
```
|
||||
|
||||
### 新建并切换到新分支上,同时这个分支没有任何 commit
|
||||
|
||||
```bash
|
||||
@ -872,35 +1077,6 @@ $ git checkout --orphan <branch-name>
|
||||
$ git show <branch-name>:<file-name>
|
||||
```
|
||||
|
||||
### 配置 http 和 socks 代理
|
||||
<!--rehype:wrap-class=row-span-4-->
|
||||
|
||||
```bash
|
||||
# 查看代理
|
||||
$ git config --global http.proxy
|
||||
$ git config --global https.proxy
|
||||
$ git config --global socks.proxy
|
||||
|
||||
# 设置代理
|
||||
# 适用于 privoxy 将 socks 协议转为 http 协议的 http 端口
|
||||
$ git config --global http.proxy http://127.0.0.1:1080
|
||||
$ git config --global https.proxy http://127.0.0.1:1080
|
||||
$ git config --global socks.proxy 127.0.0.1:1080
|
||||
|
||||
# 取消代理
|
||||
$ git config --global --unset http.proxy
|
||||
$ git config --global --unset https.proxy
|
||||
$ git config --global --unset socks.proxy
|
||||
|
||||
# 只对 github.com 设置代理
|
||||
$ git config --global http.https://github.com.proxy socks5://127.0.0.1:1080
|
||||
$ git config --global https.https://github.com.proxy socks5://127.0.0.1:1080
|
||||
|
||||
# 取消 github.com 代理
|
||||
$ git config --global --unset http.https://github.com.proxy
|
||||
$ git config --global --unset https.https://github.com.proxy
|
||||
```
|
||||
|
||||
### clone 最新一次提交
|
||||
|
||||
```bash
|
||||
@ -934,14 +1110,6 @@ git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads
|
||||
|
||||
最新的放在最上面
|
||||
|
||||
### 在 commit log 中查找相关内容
|
||||
|
||||
```bash
|
||||
git log --all --grep='<given-text>'
|
||||
```
|
||||
|
||||
通过 grep 查找,given-text: 所需要查找的字段
|
||||
|
||||
### 把暂存区的指定 file 放到工作区中
|
||||
|
||||
```bash
|
||||
@ -960,6 +1128,107 @@ Host github.com
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### Fork仓库同步上游仓库
|
||||
|
||||
- 设置上游仓库
|
||||
|
||||
```shell
|
||||
$ git remote add upstream https://github.com/jaywcjlove/reference.git
|
||||
```
|
||||
|
||||
- 本地项目操作
|
||||
|
||||
```shell
|
||||
$ git fetch upstream # 获取上游仓库更新
|
||||
$ git stach # 暂存本地修改(如果有)
|
||||
$ git branch -a # 列出所有远程仓库地址(非必须)
|
||||
$ git rebase remotes/upstream/main # 使用远程仓库的提交记录来重写本地提交记录
|
||||
$ git push -f # 强制推送到远程(github)仓库
|
||||
$ git stach pop # 恢复暂存的本地修改(如果有)
|
||||
```
|
||||
|
||||
<!--rehype:className=style-timeline-->
|
||||
|
||||
统计查询
|
||||
---
|
||||
|
||||
### 查看 git 上的个人代码量
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
- `username` 需要改成自己的
|
||||
|
||||
```bash
|
||||
git log --author="username" --pretty=tformat: --numstat | awk \
|
||||
'{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 统计每个人增删行数
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
```bash
|
||||
git log --format='%aN' | sort -u |\
|
||||
while read name; do echo -en "$name\t";\
|
||||
git log --author="$name" --pretty=tformat: --numstat | awk \
|
||||
'{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 查看仓库提交者排名
|
||||
|
||||
这里是排名前十,也可以更改排名
|
||||
|
||||
```bash
|
||||
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 10
|
||||
```
|
||||
<!--rehype:className=wrap-text-->
|
||||
|
||||
### 提交数统计
|
||||
|
||||
```bash
|
||||
git log --oneline | wc -l
|
||||
```
|
||||
|
||||
### 查看某段代码是谁写的
|
||||
|
||||
```bash
|
||||
$ git blame <file-name>
|
||||
```
|
||||
|
||||
`blame` 的意思为`责怪`,你懂的。
|
||||
|
||||
### 查看两个星期内的改动
|
||||
|
||||
```bash
|
||||
$ git whatchanged --since='2 weeks ago'
|
||||
```
|
||||
|
||||
### 在 commit log 中查找相关内容
|
||||
|
||||
```bash
|
||||
$ git log --all --grep='<given-text>'
|
||||
```
|
||||
|
||||
通过 grep 查找,given-text: 所需要查找的字段
|
||||
|
||||
### Git 仓库的大小
|
||||
|
||||
```bash
|
||||
$ git ls-files | xargs -r du -hs
|
||||
```
|
||||
|
||||
### Git 仓库的总大小
|
||||
|
||||
```bash
|
||||
$ git count-objects -vH
|
||||
```
|
||||
|
||||
### 查询历史体积大的 10 个文件
|
||||
|
||||
```bash
|
||||
$ git rev-list --objects --all | git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' | awk '/^blob/ {print substr($0,6)}' | sort --numeric-sort --key=2 --reverse | head -n 10 | cut -c 13-
|
||||
```
|
||||
|
||||
Conventional Commmits
|
||||
----
|
||||
|
||||
|
@ -155,6 +155,27 @@ jobs:
|
||||
- run: echo ${{needs.job1.outputs.output1}} ${{needs.job1.outputs.output2}}
|
||||
```
|
||||
|
||||
### 定时触发
|
||||
|
||||
可以使用 cron 表达式配置周期性任务,定时执行
|
||||
|
||||
```yaml
|
||||
name: schedule task
|
||||
|
||||
# 要注意时差,最好手动指定时区
|
||||
env:
|
||||
TZ: Asia/Shanghai
|
||||
|
||||
on:
|
||||
# push 到 main 分支时执行任务
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
# 每隔两小时自动执行任务
|
||||
schedule:
|
||||
- cron: '0 0/2 * * *'
|
||||
```
|
||||
|
||||
### 指定每项任务的虚拟机环境
|
||||
|
||||
```yml
|
||||
@ -260,21 +281,21 @@ env:
|
||||
#### 操作符
|
||||
|
||||
- `( )` _(逻辑分组)_
|
||||
- `[ ]` _(指数)_
|
||||
- `.` _(属性取消引用)_
|
||||
- `!` _(不是)_
|
||||
- `<` _(少于)_
|
||||
- `[ ]` _(索引)_
|
||||
- `.` _(属性解引用)_
|
||||
- `!` _(非)_
|
||||
- `<` _(小于)_
|
||||
- `<=` _(小于或等于)_
|
||||
- `>` _(比...更棒)_
|
||||
- `>` _(大于)_
|
||||
- `>=` _(大于或等于)_
|
||||
- `==` _(平等的)_
|
||||
- `!=` _(不相等)_
|
||||
- `==` _(相等)_
|
||||
- `!=` _(不等)_
|
||||
- `&&` _(和)_
|
||||
- `||` _(或者)_
|
||||
- `||` _(或)_
|
||||
<!--rehype:className=cols-2 style-none-->
|
||||
|
||||
### Github 上下文
|
||||
<!--rehype:wrap-class=col-span-2-->
|
||||
<!--rehype:wrap-class=col-span-2 row-span-3-->
|
||||
|
||||
属性名称 | 类型 | 描述
|
||||
---- | ---- | ----
|
||||
@ -300,7 +321,49 @@ env:
|
||||
|
||||
[Github 上下文](https://help.github.com/cn/actions/reference/context-and-expression-syntax-for-github-actions)是访问有关工作流运行、运行器环境、作业和步骤的信息的一种方式
|
||||
|
||||
### 直接常量
|
||||
|
||||
作为表达式的一部分,可以使用 `boolean`, `null`, `number` 或 `string`数据类型
|
||||
|
||||
```yml
|
||||
env:
|
||||
myNull: ${{ null }}
|
||||
myBoolean: ${{ false }}
|
||||
myIntegerNumber: ${{ 711 }}
|
||||
myFloatNumber: ${{ -9.2 }}
|
||||
myHexNumber: ${{ 0xff }}
|
||||
myExponentialNumber: ${{ -2.99e-2 }}
|
||||
myString: Mona the Octocat
|
||||
myStringInBraces: ${{ 'It''s source!' }}
|
||||
```
|
||||
|
||||
### 函数 contains
|
||||
|
||||
使用字符串的示例
|
||||
|
||||
```js
|
||||
contains('Hello world', 'llo') // 返回 true
|
||||
```
|
||||
|
||||
使用对象过滤器的示例返回 true
|
||||
|
||||
```js
|
||||
contains(github.event.issue.labels.*.name, 'bug')
|
||||
```
|
||||
<!--rehype:className=wrap-text -->
|
||||
|
||||
另见: [函数 contains](https://docs.github.com/cn/actions/learn-github-actions/expressions#contains)
|
||||
|
||||
### 函数 startsWith
|
||||
|
||||
```js
|
||||
startsWith('Hello world', 'He') // 返回 true
|
||||
```
|
||||
|
||||
另见: [函数 startsWith](https://docs.github.com/cn/actions/learn-github-actions/expressions#startswith),此函数不区分大小写
|
||||
|
||||
### 默认环境变量
|
||||
<!--rehype:wrap-class=row-span-8 col-span-2-->
|
||||
|
||||
环境变量 | 描述
|
||||
---- | ----
|
||||
@ -326,49 +389,6 @@ env:
|
||||
|
||||
另见: [默认环境变量](https://docs.github.com/cn/actions/learn-github-actions/environment-variables#default-environment-variables)
|
||||
|
||||
### 直接常量
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
作为表达式的一部分,可以使用 `boolean`, `null`, `number` 或 `string`数据类型
|
||||
|
||||
```yml
|
||||
env:
|
||||
myNull: ${{ null }}
|
||||
myBoolean: ${{ false }}
|
||||
myIntegerNumber: ${{ 711 }}
|
||||
myFloatNumber: ${{ -9.2 }}
|
||||
myHexNumber: ${{ 0xff }}
|
||||
myExponentialNumber: ${{ -2.99e-2 }}
|
||||
myString: Mona the Octocat
|
||||
myStringInBraces: ${{ 'It''s source!' }}
|
||||
```
|
||||
|
||||
### 函数 contains
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
使用字符串的示例
|
||||
|
||||
```js
|
||||
contains('Hello world', 'llo') // 返回 true
|
||||
```
|
||||
|
||||
使用对象过滤器的示例返回 true
|
||||
|
||||
```js
|
||||
contains(github.event.issue.labels.*.name, 'bug')
|
||||
```
|
||||
<!--rehype:className=wrap-text -->
|
||||
|
||||
另见: [函数 contains](https://docs.github.com/cn/actions/learn-github-actions/expressions#contains)
|
||||
|
||||
### 函数 startsWith
|
||||
|
||||
```js
|
||||
startsWith('Hello world', 'He') // 返回 true
|
||||
```
|
||||
|
||||
另见: [函数 startsWith](https://docs.github.com/cn/actions/learn-github-actions/expressions#startswith),此函数不区分大小写
|
||||
|
||||
### 函数 format
|
||||
|
||||
```js
|
||||
@ -382,7 +402,7 @@ format('{{Hello {0} {1} {2}!}}', 'Mona', 'the', 'Octocat')
|
||||
### 函数 join
|
||||
|
||||
```js
|
||||
join(github.event.issue.labels.*.name, ', ')
|
||||
join(github.event.issue.labels.*.name,', ')
|
||||
// 也许返回 'bug, help wanted'.
|
||||
```
|
||||
|
||||
@ -414,7 +434,7 @@ toJSON(job)
|
||||
```yml
|
||||
steps:
|
||||
...
|
||||
- name: The job has succeeded
|
||||
- name: 作业已成功
|
||||
if: ${{ success() }}
|
||||
```
|
||||
|
||||
@ -423,7 +443,7 @@ steps:
|
||||
```yml
|
||||
steps:
|
||||
...
|
||||
- name: The job has failed
|
||||
- name: 作业失败
|
||||
if: ${{ failure() }}
|
||||
```
|
||||
|
||||
@ -583,14 +603,15 @@ npm token revoke <id|token> # 撤销
|
||||
|
||||
Artifacts 是 GitHub Actions 为您提供持久文件并在运行完成后使用它们或在作业(文档)之间共享的一种方式。
|
||||
|
||||
要创建工件并使用它,您将需要不同的操作:上传和下载。
|
||||
- 要创建工件并使用它,您将需要不同的操作:上传和下载
|
||||
|
||||
要上传文件或目录,您只需像这样使用它:
|
||||
|
||||
```yml
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- run: mkdir -p path/to/artifact
|
||||
- run: echo hello > path/to/artifact/a.txt
|
||||
- run: echo hello > path/to/file/a.txt
|
||||
- uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: my-artifact
|
||||
@ -829,6 +850,7 @@ steps:
|
||||
[`coverage-badges-cli`](https://github.com/jaywcjlove/coverage-badges-cli) | 生成覆盖率徽章(Badges)图片
|
||||
[`action-ejs`](https://github.com/jaywcjlove/action-ejs) | 基于 ejs 生成 HTML
|
||||
[`github-action-package`](https://github.com/jaywcjlove/github-action-package) | 修改 JSON 文件内容
|
||||
[`github-action-read-file`](https://github.com/jaywcjlove/github-action-read-file) | 读取文件内容
|
||||
[`markdown-to-html-cli`](https://github.com/jaywcjlove/markdown-to-html-cli) | Markdown 转换成 HTML
|
||||
[`ncipollo/release-action`](https://github.com/ncipollo/release-action) | 创建 `Release`
|
||||
[`peaceiris/actions-gh-pages`](https://github.com/peaceiris/actions-gh-pages) | 将文件或文件夹内容提交到 `gh-pages` 分支
|
||||
@ -924,8 +946,273 @@ steps:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
```
|
||||
|
||||
当 `npm` 推送包失败不影响整个流程,可用于自动发包
|
||||
|
||||
GitLab CI/CD 迁移到 GitHub Actions
|
||||
---
|
||||
|
||||
### 语法示例
|
||||
|
||||
<yel>GitLab CI/CD</yel>
|
||||
|
||||
```yml
|
||||
job1:
|
||||
variables:
|
||||
GIT_CHECKOUT: "true"
|
||||
script:
|
||||
- echo "Run your script here"
|
||||
```
|
||||
|
||||
GitHub Actions
|
||||
|
||||
```yml
|
||||
jobs:
|
||||
job1:
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- run: echo "Run your script here"
|
||||
```
|
||||
|
||||
### 运行程序
|
||||
<!--rehype:wrap-class=row-span-2-->
|
||||
|
||||
<yel>GitLab CI/CD</yel>
|
||||
|
||||
```yml
|
||||
windows_job:
|
||||
tags:
|
||||
- windows
|
||||
script:
|
||||
- echo Hello, %USERNAME%!
|
||||
|
||||
linux_job: tags:
|
||||
- linux script:
|
||||
- echo "Hello, $USER!"
|
||||
```
|
||||
|
||||
GitHub Actions
|
||||
|
||||
```yml
|
||||
windows_job:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- run: echo Hello, %USERNAME%!
|
||||
|
||||
linux_job:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "Hello, $USER!"
|
||||
```
|
||||
|
||||
在不同的平台上运行作业
|
||||
|
||||
### Docker 映像
|
||||
|
||||
<yel>GitLab CI/CD</yel>
|
||||
|
||||
```yml
|
||||
my_job:
|
||||
image: node:10.16-jessie
|
||||
```
|
||||
|
||||
GitHub Actions
|
||||
|
||||
```yml
|
||||
jobs:
|
||||
my_job:
|
||||
container: node:10.16-jessie
|
||||
```
|
||||
|
||||
### 条件和表达式语法
|
||||
|
||||
<yel>GitLab CI/CD</yel>
|
||||
|
||||
```yml
|
||||
deploy_prod:
|
||||
stage: deploy
|
||||
script:
|
||||
- echo "部署到生产服务器"
|
||||
rules:
|
||||
- if: '$CI_COMMIT_BRANCH == "master"'
|
||||
```
|
||||
|
||||
GitHub Actions
|
||||
|
||||
```yml
|
||||
jobs:
|
||||
deploy_prod:
|
||||
if: contains( github.ref, 'master')
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "部署到生产服务器"
|
||||
```
|
||||
|
||||
### Artifacts
|
||||
|
||||
<yel>GitLab CI/CD</yel>
|
||||
|
||||
```yml
|
||||
script:
|
||||
artifacts:
|
||||
paths:
|
||||
- math-homework.txt
|
||||
```
|
||||
|
||||
GitHub Actions
|
||||
|
||||
```yml
|
||||
- name: Upload math result for job 1
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: homework
|
||||
path: math-homework.txt
|
||||
```
|
||||
|
||||
### 作业之间的依赖关系
|
||||
|
||||
<yel>GitLab CI/CD</yel>
|
||||
|
||||
```yml
|
||||
stages:
|
||||
- build
|
||||
- test
|
||||
- deploy
|
||||
|
||||
build_a: stage: build script:
|
||||
- echo "该作业将首先运行"
|
||||
|
||||
build_b: stage: build script:
|
||||
- echo "该作业将首先运行,与 build_a 并行"
|
||||
|
||||
test_ab: stage: test script:
|
||||
- echo "此作业将在 build_a 和 build_b 完成后运行"
|
||||
|
||||
deploy_ab: stage: deploy script:
|
||||
- echo "此作业将在 test_ab 完成后运行"
|
||||
```
|
||||
|
||||
GitHub Actions
|
||||
|
||||
```yml
|
||||
jobs:
|
||||
build_a:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "该作业将首先运行"
|
||||
|
||||
build_b:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- run: echo "该作业将首先运行,与 build_a 并行"
|
||||
|
||||
test_ab:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [build_a,build_b]
|
||||
steps:
|
||||
- run: echo "此作业将在 build_a 和 build_b 完成后运行"
|
||||
|
||||
deploy_ab:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [test_ab]
|
||||
steps:
|
||||
- run: echo "此作业将在 test_ab 完成后运行"
|
||||
```
|
||||
|
||||
### 缓存
|
||||
|
||||
<yel>GitLab CI/CD</yel>
|
||||
|
||||
```yml
|
||||
image: node:latest
|
||||
|
||||
cache: key: $CI_COMMIT_REF_SLUG paths:
|
||||
- .npm/
|
||||
|
||||
before_script:
|
||||
- npm ci --cache .npm --prefer-offline
|
||||
|
||||
test_async: script:
|
||||
- node ./specs/start.js ./specs/async.spec.js
|
||||
```
|
||||
|
||||
GitHub Actions
|
||||
|
||||
```yml
|
||||
jobs:
|
||||
test_async:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Cache node modules
|
||||
uses: actions/cache@v3
|
||||
with:
|
||||
path: ~/.npm
|
||||
key: v1-npm-deps-${{ hashFiles('**/package-lock.json') }}
|
||||
restore-keys: v1-npm-deps-
|
||||
```
|
||||
|
||||
### 数据库和服务容器
|
||||
|
||||
<yel>GitLab CI/CD</yel>
|
||||
|
||||
```yml
|
||||
container-job:
|
||||
variables:
|
||||
POSTGRES_PASSWORD: postgres
|
||||
# PostgreSQL 服务容器通信的主机名
|
||||
POSTGRES_HOST: postgres
|
||||
# 默认的 PostgreSQL 端口
|
||||
POSTGRES_PORT: 5432
|
||||
image: node:10.18-jessie
|
||||
services:
|
||||
- postgres
|
||||
script:
|
||||
# 执行 package.json 文件中
|
||||
# 所有依赖项的全新安装
|
||||
- npm ci
|
||||
# 运行创建 PostgreSQL 客户端的脚本,
|
||||
# 用数据填充客户端,并检索数据
|
||||
- node client.js
|
||||
tags:
|
||||
- docker
|
||||
```
|
||||
|
||||
GitHub Actions
|
||||
|
||||
```yml
|
||||
jobs:
|
||||
container-job:
|
||||
runs-on: ubuntu-latest
|
||||
container: node:10.18-jessie
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres
|
||||
env:
|
||||
POSTGRES_PASSWORD: postgres
|
||||
|
||||
steps:
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v3
|
||||
|
||||
# 执行 package.json 文件中
|
||||
# 所有依赖项的全新安装
|
||||
- name: Install dependencies
|
||||
run: npm ci
|
||||
|
||||
- name: Connect to PostgreSQL
|
||||
# 运行创建 PostgreSQL 客户端的脚本,
|
||||
# 用数据填充客户端,并检索数据
|
||||
run: node client.js
|
||||
env:
|
||||
# PostgreSQL 服务容器通信的主机名
|
||||
POSTGRES_HOST: postgres
|
||||
# 默认的 PostgreSQL 端口
|
||||
POSTGRES_PORT: 5432
|
||||
```
|
||||
|
||||
另见
|
||||
---
|
||||
|
||||
- [Github Actions 学习笔记](https://jaywcjlove.github.io/github-actions) _(jaywcjlove.github.io)_
|
||||
- [了解 GitHub Actions](https://docs.github.com/cn/actions/learn-github-actions) _(docs.github.com)_
|
||||
- [从 GitLab CI/CD 迁移到 GitHub Actions](https://docs.github.com/cn/actions/migrating-to-github-actions/migrating-from-gitlab-cicd-to-github-actions) _(docs.github.com)_
|
||||
|
594
docs/github-copilot.md
Normal file
@ -0,0 +1,594 @@
|
||||
Github Copilot 备忘清单
|
||||
===
|
||||
|
||||
这是开始使用 [Github Copilot](https://code.visualstudio.com/docs/editor/github-copilot) 的快速参考指南
|
||||
|
||||
一、准备工作
|
||||
----
|
||||
|
||||
### 1、账号注册
|
||||
|
||||
> 需要先拥有一个Github账号,并订阅Copilot。
|
||||
|
||||
事项 | 说明
|
||||
:-|-
|
||||
Github 账号 | [注册地址](https://github.com/signup)
|
||||
订阅 Github Copilot | [订阅地址](https://github.com/features/copilot)
|
||||
|
||||
### 2、安装Vscode插件
|
||||
<!--rehype:wrap-class=col-span-1 row-span-1-->
|
||||
|
||||
> 在扩展商店中搜索安装下面插件
|
||||
|
||||
插件名称 | 功能
|
||||
:-|-
|
||||
`GitHub Copilot`|编辑器中进行代码补全提示
|
||||
`GitHub Copilot Chat`|插件栏可以与copilot对话
|
||||
|
||||
### 3、Vscode 中登陆 Github 账号
|
||||
<!--rehype:wrap-class=col-span-1 row-span-1-->
|
||||
|
||||
- 安装后,点击右下角的 `GitHub Copilot` 插件图标,然后点击 `Sign in to GitHub` 登陆。
|
||||
- 或者,点击工具栏中的 `Accounts` 图标,然后点击 `使用 Github 登陆以使用Github Copilot` 进行登陆。
|
||||
|
||||
### 4、Copilot 订阅方案
|
||||
<!--rehype:wrap-class=col-span-2 row-span-1-->
|
||||
方案 | 价格 | 特性
|
||||
:-|-|-
|
||||
Copilot Individual | 10美元/人/月 <br> (学生, 教师, 开源项目贡献者 免费) | 代码补全, 聊天机器人
|
||||
Copilot Business| 19美元/人/月 |代码补全, 聊天机器人, 命令行工具, 安全漏洞筛查, 代码参考, 公共代码筛查, 知识产权, 企业安全与隐私保障
|
||||
Copilot Enterprise| 39美元/人/月 | Business 特性 + 私有代码库的个性化聊天 + 文档搜索总结 + Git Pull Request 摘要 + 代码审查 + 模型微调
|
||||
<!--rehype:className=show-header left-align-->
|
||||
|
||||
### 5、Copilot 使用入口
|
||||
<!--rehype:wrap-class=col-span-1 row-span-1-->
|
||||
|名称 | 描述 |
|
||||
|-|-|
|
||||
Inline Suggestions| 在编辑器中紧邻光标所在位置显示建议
|
||||
Completions Panel| 在编辑器中展示完整的建议列表
|
||||
Inline Chat| 在编辑器中紧邻光标所在位置发起对话
|
||||
Editor Chat| 在编辑器中打开完整的对话界面
|
||||
Silde Chat| 在编辑器的侧边栏打开对话界面
|
||||
Quick Chat| 在顶部唤起对话界面
|
||||
|
||||
二、提示技巧
|
||||
----
|
||||
|
||||
### 提示之禅
|
||||
<!--rehype:wrap-class=col-span-1 row-span-1-->
|
||||
|
||||
> 你与 `copilot` 之间的关系,就是作家和插画师的关系。
|
||||
> 你只有尽可能的全面、干练、清晰的描述你的故事(即 `上下文`)。
|
||||
> `copilot` 才能根据你的故事画出精美的插画 (即 `代码` )。
|
||||
|
||||
### 提示技巧
|
||||
<!--rehype:wrap-class=col-span-1 row-span-1-->
|
||||
|
||||
- 1⃣️ 提供上下文信息
|
||||
- 2⃣️ 上下文可被预测
|
||||
|
||||
### 实战教程
|
||||
|
||||
- [Youtube GitHub Copilot Series](https://www.youtube.com/playlist?list=PLj6YeMhvp2S5_hvBl2SE-7YCHYlLQ0bPt)
|
||||
- [Pragmatic techniques to get the most out of GitHub Copilot](https://www.youtube.com/watch?v=CwAzIpc4AnA)
|
||||
- [How I used GitHub Copilot to build a browser extension](https://github.blog/2023-05-12-how-i-used-github-copilot-to-build-a-browser-extension/)
|
||||
|
||||
### 上下文信息的种类
|
||||
<!--rehype:wrap-class=col-span-2 row-span-1-->
|
||||
|
||||
类型|说明
|
||||
-|-
|
||||
文件|Copilot会查看编辑器中当前和紧邻打开的文件。
|
||||
注释|Copilot会根据紧邻的注释,为你的代码提供帮助和建议。如 docstring, 块注释, 行注释之类。
|
||||
命名|良好的命名能帮助Copilot更好地理解你的代码,如函数名, 变量名, 文件名等
|
||||
代码|Copilot会查看你的代码和它附近的代码,以生成帮助你的建议。
|
||||
<!--rehype:className=show-header left-align-->
|
||||
|
||||
### 上下文:文件
|
||||
|
||||
> Copilot会查看编辑器中当前和紧邻打开的文件,以分析上下文并提供适当的建议。
|
||||
|
||||
---
|
||||
|
||||
> - 1、避免打开过多的文件,以便Copilot能够更好地理解你的代码。
|
||||
> - 2、打开的文件尽量相关且有共性。
|
||||
> - 3、如果是新项目,可以打开一些模版代码、数据文件以及参考文档等相关示例文件。以便Copilot能够更好地理解你的期望。等已经开发了一些代码后,这些示例文件就可以删除了。
|
||||
|
||||
### 上下文: 注释: 顶部注释
|
||||
|
||||
创建一个新文件时,在文件顶部添加注释,描述你的需求。这对 Copilot 很有帮助。
|
||||
|
||||
\* 下面说明将使用`...`表示copilot开始生成的位置
|
||||
|
||||
```python
|
||||
# Download file from an URL and analyze its content
|
||||
# Details:
|
||||
# * Download the file from an URL
|
||||
# * Save the downloaded files into `./download` folder
|
||||
# * Use `filetype` of the file to specify how to parse
|
||||
# * Filetype can be `.pdf`, `.html`, `.epub`, `.md` and `.txt`
|
||||
# * Use NLP or OCR to get the file content
|
||||
# * Tokenize the file content and get the statistics result
|
||||
|
||||
import ...
|
||||
```
|
||||
|
||||
### 上下文: 注释: 行内注释
|
||||
|
||||
在每个函数上面或重要代码块的上面添加注释,以帮助 Copilot 了解你代码中的一些意图或问题。
|
||||
|
||||
\* 下面说明将使用`...`表示copilot开始生成的位置
|
||||
|
||||
函数上方添加注释说明
|
||||
|
||||
```python
|
||||
# parse the JSON string into User object
|
||||
def ...
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
代码添加注释说明
|
||||
|
||||
```python
|
||||
# ...
|
||||
api_sever = FastApi(...)
|
||||
|
||||
# starting the API Sever, enable ssl, bind to 8443 port
|
||||
...
|
||||
```
|
||||
|
||||
### 上下文: 注释: Docstring
|
||||
<!--rehype:wrap-class=col-span-1 row-span-2-->
|
||||
有时候当你已经拥有详细设计文档,但未编写功能代码时,可以直接使用 docstring 中的描述来让 copilot 生成代码。
|
||||
|
||||
```python
|
||||
def send_email(to_address: Email, subject: str, content: HTML): -> StatusCode:
|
||||
"""
|
||||
Send email to specified address
|
||||
|
||||
Parameters
|
||||
----------
|
||||
to_address : Email
|
||||
The email address to send to
|
||||
subject : str
|
||||
The email subject
|
||||
content : HTML
|
||||
The email content
|
||||
|
||||
Returns
|
||||
-------
|
||||
StatusCode
|
||||
The sending result
|
||||
"""
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
### 上下文: 注释: 提问
|
||||
|
||||
> 如果你不想切换到 copilot chat 时,注释也可以用于提问。
|
||||
|
||||
```python
|
||||
# Q: What is the difference between `os.path.join` and `pathlib.PurePath`?
|
||||
# A: ...
|
||||
```
|
||||
|
||||
### 上下文: 注释: Todo
|
||||
|
||||
> 你也可以让 copilot 为你生成 `todo` 列表来评估工作量。
|
||||
|
||||
```python
|
||||
# Parse the json file into a Talks object
|
||||
# TODO:
|
||||
# -[ ] 1. ...
|
||||
```
|
||||
|
||||
### 上下文: 命名
|
||||
|
||||
> 你的命名应该足够明确以便于 Copilot 理解你的意图
|
||||
|
||||
#### bad case
|
||||
|
||||
```python
|
||||
a = 60
|
||||
|
||||
def send(dict):
|
||||
...
|
||||
|
||||
class data:
|
||||
...
|
||||
```
|
||||
|
||||
#### good case
|
||||
|
||||
```python
|
||||
timeout = 60
|
||||
|
||||
def send_email(to_address: Email, subject: str, content: HTML): -> StatusCode:
|
||||
...
|
||||
|
||||
class Email:
|
||||
...
|
||||
```
|
||||
|
||||
### 上下文: 代码: 代码示例
|
||||
|
||||
> 提供片段代码示例,以帮助 Copilot 更好地开始新的开发任务。
|
||||
>
|
||||
> - 使用的框架与库
|
||||
> - 代码风格
|
||||
> - 算法逻辑
|
||||
|
||||
```python
|
||||
from typing import List
|
||||
from typing import Optional
|
||||
from sqlalchemy import ForeignKey
|
||||
from sqlalchemy import String
|
||||
from sqlalchemy.orm import DeclarativeBase
|
||||
from sqlalchemy.orm import Mapped
|
||||
from sqlalchemy.orm import mapped_column
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
class Base(DeclarativeBase):
|
||||
pass
|
||||
|
||||
class User(Base):
|
||||
__tablename__ = "user_account"
|
||||
id: Mapped[int] = mapped_column(primary_key=True)
|
||||
name: Mapped[str] = mapped_column(String(30))
|
||||
fullname: Mapped[Optional[str]]
|
||||
addresses: Mapped[List["Address"]] = relationship(
|
||||
back_populates="user", cascade="all, delete-orphan"
|
||||
)
|
||||
def __repr__(self) -> str:
|
||||
return f"User(id={self.id!r}, name={self.name!r}, fullname={self.fullname!r})"
|
||||
|
||||
# Email Address
|
||||
...
|
||||
```
|
||||
|
||||
### 上下文: 代码: 数据示例
|
||||
|
||||
> 提供片段数据示例,以帮助 Copilot 更好地开始新的开发任务。
|
||||
>
|
||||
> - 数据结构与类型
|
||||
> - 命名
|
||||
> - 值处理逻辑
|
||||
|
||||
```python
|
||||
|
||||
dailogs = [
|
||||
{
|
||||
"timestamp": "May 1, 2023 11:00:00",
|
||||
"text": "Hello, World!",
|
||||
"speaker": "Jack",
|
||||
},
|
||||
{
|
||||
"timestamp": "May 1, 2023 11:01:00",
|
||||
"text": "Hello, Copilot!",
|
||||
"speaker": "Copilot",
|
||||
},
|
||||
]
|
||||
|
||||
# Parse the json object into `Dialog` object
|
||||
...
|
||||
```
|
||||
|
||||
三、快捷键
|
||||
----
|
||||
<!--rehype:body-class=cols-2-->
|
||||
|
||||
对于mac用户建议修改alt相关的快捷键,因为mac上的alt+字母键有可能被输入法使用了。若有自定义过输入法`keylayout`,则忽略这句话。
|
||||
|
||||
另外没有快捷键的命令,可以唤起`命令面板`后输入查询关键字筛选后执行。
|
||||
|
||||
### Github Copilot
|
||||
<!--rehype:wrap-class=col-span-2 row-span-1-->
|
||||
|
||||
#### Copilot 中 Inline Suggestions 相关命令
|
||||
|
||||
| 命令 |说明 | 快捷键 | Mac 快捷键 |
|
||||
|-|:-|:-|:-|
|
||||
`editor.action.inlineSuggest.trigger`| 触发内联建议 | `alt+\` | `alt+\`
|
||||
`editor.action.inlineSuggest.showPrevious`| 显示上一个内联建议 | `alt+[`| `alt+[`
|
||||
`editor.action.inlineSuggest.showNext`| 显示下一个内联建议 | `alt+]`| `alt+]`
|
||||
`editor.action.inlineSuggest.acceptNextWord`| 接受内联建议的下一个字 | `ctl+right`| `cmd+right`
|
||||
`editor.action.inlineSuggest.commit`| 接受内联建议 | `Tab`| `Tab`
|
||||
`editor.action.inlineSuggest.hide`| 隐藏内联建议 | `Esc`| `Esc`
|
||||
`editor.action.inlineSuggest.acceptNextLine`| 接受内联建议的下一行 | - | -
|
||||
<!--rehype:className=show-header wrap-text left-align-->
|
||||
|
||||
#### Copilot 中 Completions Panel 相关命令
|
||||
|
||||
| 命令 |说明 | 快捷键 | Mac 快捷键 |
|
||||
|-|:-|:-|:-|
|
||||
`github.copilot.generate`| 打开 `Completions Panel` | `ctrl+enter`| `ctrl+enter`
|
||||
`github.copilot.acceptCursorPanelSolution`| 接受`Completions Panel`光标所在的建议 | `ctrl+/` | `ctrl+/`
|
||||
`github.copilot.previousPanelSolution`| 查看上一个建议 | `alt+[`| `alt+[`
|
||||
`github.copilot.nextPanelSolution`| 查看下一个建议 | `alt+]`| `alt+]`
|
||||
<!--rehype:className=show-header wrap-text left-align-->
|
||||
|
||||
#### Copilot 中 其他命令
|
||||
|
||||
| 命令 |说明 | 快捷键 | Mac 快捷键 |
|
||||
|-|:-|:-|:-|
|
||||
`github.copilot.toggleCopilot`| 启用/禁用 Copilot 补全提示 | -| -
|
||||
`github.copilot.collectDiagnostics`| 收集诊断信息 | -| -
|
||||
`github.copilot.openLogs`| 打开日志窗口 | -| -
|
||||
`github.copilot.sendFeedback`| 打开社区网站 | -| -
|
||||
`github.copilot.signIn`| 登陆 | -| -
|
||||
<!--rehype:className=show-header wrap-text left-align-->
|
||||
|
||||
### Github Copilot Chat
|
||||
<!--rehype:wrap-class=col-span-2 row-span-1-->
|
||||
|
||||
#### Copilot Chat 中 Chat 相关命令
|
||||
|
||||
| 命令 |说明 | 快捷键 | Mac 快捷键 |
|
||||
|-|:-|:-|:-|
|
||||
`github.copilot.interactiveEditor.explain`|进行解释(选中内容或光标所在的文件)|-|-
|
||||
`github.copilot.terminal.explainTerminalSelection`|对此进行解释(需要在终端中使用)|-|-
|
||||
`github.copilot.terminal.explainTerminalSelectionContextMenu`|Copilot: 对此进行解释(需要在终端中使用)|鼠标右键菜单|鼠标右键菜单
|
||||
`github.copilot.terminal.explainTerminalLastCommand`|对终端中最后一个命令进行解释(需要在终端中使用)|-|-
|
||||
<!--rehype:className=show-header wrap-text left-align-->
|
||||
|
||||
#### Copilot Chat 中 Inline Chat 相关命令
|
||||
|
||||
| 命令 |说明 | 快捷键 | Mac 快捷键 |
|
||||
|-|:-|:-|:-|
|
||||
`inlineChat.start`|代码内聊天| - | -
|
||||
`github.copilot.interactiveEditor.generate`|在此生成(在光标所在位置唤起inline chat的`/generate`功能)| - | -
|
||||
`github.copilot.interactiveEditor.generateDocs`|生成文档| - | -
|
||||
`github.copilot.interactiveEditor.generateTests`|生成测试| - | -
|
||||
`github.copilot.interactiveEditor.fix`|修复此| - | -
|
||||
<!--rehype:className=show-header wrap-text left-align-->
|
||||
|
||||
#### Copilot Chat 中 Quick Chat 相关命令
|
||||
|
||||
| 命令 |说明 | 快捷键 | Mac 快捷键 |
|
||||
|-|:-|:-|:-|
|
||||
`workbench.action.quickchat.toggle`|开启/关闭 Quick Chat|`shift+cmd+i`|`shift+cmd+i`
|
||||
`github.copilot.terminal.suggestCommand`|建议终端命令|`ctrl+i`(仅在终端起作用)|`cmd+i`
|
||||
<!--rehype:className=show-header wrap-text left-align-->
|
||||
|
||||
#### Copilot Chat 中 Editor Chat 相关命令
|
||||
|
||||
| 命令 |说明 | 快捷键 | Mac 快捷键 |
|
||||
|-|:-|:-|:-|
|
||||
`workbench.action.openChat.copilot`|打开编辑器聊天|-|-
|
||||
<!--rehype:className=show-header wrap-text left-align-->
|
||||
|
||||
#### Copilot Chat 其他命令
|
||||
|
||||
| 命令 |说明 | 快捷键 | Mac 快捷键 |
|
||||
|-|:-|:-|:-|
|
||||
`github.copilot.interactiveSession.feedback`|打开github Issues|-|-
|
||||
`github.copilot.debug.workbenchState`|日志工作台状态|-|-
|
||||
`github.copilot.ghpr.applySuggestion`|为Github Pull Request提供代码建议|-|-
|
||||
<!--rehype:className=show-header wrap-text left-align-->
|
||||
|
||||
四、Copilot Chat 的 Slash Commands 使用技巧
|
||||
----
|
||||
|
||||
> 在聊天对话框中可以通过`/`开头的命令来与Copilot Chat进行交互。
|
||||
|
||||
### Slash Commands 示例
|
||||
<!--rehype:wrap-class=col-span-1 row-span-1-->
|
||||
|
||||
#### Slash Commands 由四部分构成
|
||||
|
||||
|元素|说明|
|
||||
|-|-|
|
||||
|- Agent | 指定Agent, 符号为 `@`, 可选
|
||||
|- Commands | 指定命令, 符号为 `/`, 可选
|
||||
|- 变量 | 引用内容, 符号为 `#`, 可选
|
||||
|- 用户输入的指令 | 可选
|
||||
|
||||
#### 例子
|
||||
|
||||
```
|
||||
/explain def helloworld():...
|
||||
|
||||
@vscode /api 请解释 inlineChat.start 的作用
|
||||
|
||||
@workspace /explain def helloworld():...
|
||||
|
||||
在每一行代码末尾添加注释进行解释
|
||||
```
|
||||
|
||||
#### Agent
|
||||
|
||||
| Agent |说明 |
|
||||
|- |:-|
|
||||
@vscode |vscode命令与插件的问题
|
||||
@workspace|项目workspace相关的问题
|
||||
|
||||
### Inline Chat 的 Slash Commands
|
||||
<!--rehype:wrap-class=col-span-1 row-span-1-->
|
||||
|
||||
---
|
||||
|
||||
> 通过命令 `inlineChat.start` 触发 `inline chat` 后使用
|
||||
|
||||
|命令 |说明 |
|
||||
|- |:-|
|
||||
/doc |在此添加文档注释
|
||||
/explain |对选中的代码进行解释
|
||||
/fix |修复此选中的代码
|
||||
/tests |为选中的代码生成单元测试
|
||||
|
||||
---
|
||||
|
||||
> 通过命令 `github.copilot.interactiveEditor.generate` 触发
|
||||
|
||||
|命令 |说明 |
|
||||
|- |:-|
|
||||
/generate |在此生成, 该命令无法由用户输入
|
||||
|
||||
---
|
||||
|
||||
> 当然也可以直接选中区域,然后在inline chat中输入指令执行 copilot会对选中区域进行指令操作
|
||||
|
||||
|常用指令|
|
||||
| - |
|
||||
|在每一行代码末尾添加注释进行解释|
|
||||
|使代码满足PEP484要求|
|
||||
<!--rehype:className=show-header wrap-text left-align-->
|
||||
|
||||
### Silde Chat 的 Slash Commands
|
||||
<!--rehype:wrap-class=col-span-1 row-span-2-->
|
||||
|
||||
> 通过命令 `workbench.action.chat.openInSidebar` 触发 `chat` 后使用
|
||||
> 或点击侧边栏上的Copilot聊天按钮
|
||||
> 在Chat输入框中还允许指定Agent(即环境)
|
||||
|
||||
#### Slash Commands
|
||||
|
||||
|命令 |说明 |
|
||||
|- |:-|
|
||||
/api |回答vscode扩展插件开发的问题
|
||||
/explain |对选中的代码进行解释
|
||||
/fix |修复此选中的代码
|
||||
/new |创建新项目workspace
|
||||
/newNotebook |创建新的Jupyter Notebook
|
||||
/terminal |解释命令行里的命令
|
||||
/tests |为选中的代码生成单元测试
|
||||
/help |帮助说明
|
||||
/clear |清除会话
|
||||
|
||||
### `/terminal`特有的变量, 以`#`号开头
|
||||
|
||||
> 仅在`/terminal`命令中可用
|
||||
|
||||
| 变量 |说明 |
|
||||
|-|:-|
|
||||
`#terminalLastCommand`|最后一次执行的终端命令
|
||||
`#terminalSelection`|选中的终端命令
|
||||
|
||||
### 的 Slash Commands
|
||||
<!--rehype:wrap-class=col-span-1 row-span-1-->
|
||||
|
||||
- Quick Chat 与 Chat 的 Slash Commands相同
|
||||
- Editor Chat 与 Chat 的 Slash Commands相同
|
||||
|
||||
五、参数设置
|
||||
----
|
||||
|
||||
打开vscode 命令面板, 输入`Preferences:Open Settings` 打开配置文件,在文件模式下配置相关参数.
|
||||
|
||||
完整参数说明可以查看 `copilot` 与 `copilot chat` 两个[插件目录](https://code.visualstudio.com/docs/editor/extension-marketplace#_where-are-extensions-installed)下的 `package.json` 文件获知。
|
||||
|
||||
### 完整配置参考
|
||||
|
||||
```json
|
||||
// settings.json
|
||||
{
|
||||
// ...
|
||||
"github.copilot.chat.welcomeMessage": "always",
|
||||
"github.copilot.chat.localeOverride": "zh-CN",
|
||||
"github.copilot.editor.enableCodeActions": true,
|
||||
"github.copilot.editor.iterativeFixing": true,
|
||||
"github.copilot.editor.enableAutoCompletions": true,
|
||||
"github.copilot.enable": {
|
||||
"plaintext": false,
|
||||
"ini": false,
|
||||
"markdown": true,
|
||||
"*": true
|
||||
},
|
||||
"github.copilot.advanced": {
|
||||
"length": 4000,
|
||||
"inlineSuggestCount": 5,
|
||||
"top_p": 1,
|
||||
"temperature": "0.8",
|
||||
"listCount": 10,
|
||||
"stops": {
|
||||
"*": [
|
||||
"\n\n\n"
|
||||
],
|
||||
"python": [
|
||||
"\ndef ",
|
||||
"\nclass ",
|
||||
"\nif ",
|
||||
"\n\n#"
|
||||
]
|
||||
},
|
||||
"debug.showScores": true,
|
||||
"indentationMode": {
|
||||
"python": false,
|
||||
"javascript": false,
|
||||
"javascriptreact": false,
|
||||
"jsx": false,
|
||||
"typescript": false,
|
||||
"typescriptreact": false,
|
||||
"go": false,
|
||||
"ruby": false,
|
||||
"*": true
|
||||
}
|
||||
}
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
### 参数说明
|
||||
<!--rehype:wrap-class=col-span-2 row-span-1-->
|
||||
#### 代理参数
|
||||
|
||||
|设置参数 |值类型|说明 |
|
||||
|:--|:--|:--|
|
||||
`"http.proxy"`| string |配置网络代理地址
|
||||
|
||||
#### Copilot Chat 参数
|
||||
|
||||
|设置参数 |值类型|说明 |
|
||||
|:--|:--|:--|
|
||||
`"github.copilot.chat.localeOverride"`| string | 设置Copilot本地语言
|
||||
`"github.copilot.chat.welcomeMessage"`| string |Copilot Chat 是否显示欢迎语<br>`first`: 仅第一次启动时, `always`: 总是, `never`: 从不
|
||||
|
||||
#### Copilot 基本参数
|
||||
|
||||
|设置参数 |值类型|说明 |
|
||||
|:--|:--|:--|
|
||||
`"editor.inlineSuggest.enabled"`| boolean |启用内联建议
|
||||
`"github.copilot.editor.iterativeFixing"`| boolean| 允许 Copilot 提供迭代修复建议
|
||||
`"github.copilot.editor.enableAutoCompletions"`| boolean |允许 Copilot 提供自动补全
|
||||
`"github.copilot.editor.enableCodeActions"`| boolean|允许 Copilot 代码操作建议,这些操作可能包括重构代码、优化代码结构、修复可错误等
|
||||
|
||||
#### 设置 Copilot 生效的文件类型
|
||||
|
||||
|设置参数 |值类型|说明 |
|
||||
|:--|:--|:--|
|
||||
`"github.copilot.enable"`| json |请将 `"*": true` 放到末尾 <br>[语言](https://code.visualstudio.com/docs/languages/identifiers)后设置 `false` 表示禁用copilot, 设置 `true` 表示启用
|
||||
|
||||
#### Copilot 高级参数
|
||||
|
||||
> github.copilot.advanced 可以控制模型参数,最终影响到代码生成. 其值为json
|
||||
|
||||
|设置参数 |值类型|说明 |
|
||||
|:--|:--|:--|
|
||||
`"length"`| integer | 生成的代码字数, 默认为 `500`
|
||||
`"top_p"`| number | 控制模型候选范围,默认值为 `1`,值范围为`0.0~1.0`
|
||||
`"temperature"`| string | 控制模型的创造性,默认值为 `""`,值越大越不可预测,值范围为`0.0~1.0`
|
||||
`"inlineSuggestCount"`| integer | 内联提示的个数, 默认为`3`
|
||||
`"listCount"`| integer | 控制`Completions Panel`中建议个数,默认为 `10`
|
||||
`"stops"`| json | 控制模型代码生成时停止的标志,可以按[语言](https://code.visualstudio.com/docs/languages/identifiers)来控制
|
||||
`"indentationMode"`| json | 指定[语言](https://code.visualstudio.com/docs/languages/identifiers)是否采用该语言的缩近模式,由此可能会与stops冲突,比如采用`\{\}`缩近时,设置该参数时需要综合考虑
|
||||
`"debug.showScores"`| boolean | 在代码建议列表中显示每个建议的分数
|
||||
<!--rehype:className=wrap-text -->
|
||||
|
||||
END... ENJOY YOURSELF
|
||||
----
|
||||
|
||||
> 欢迎大家添加新内容,校对、错误请指正。📮邮箱: <a href="mailto:jussker@outlook.com">jussker@outlook.com</a>
|
||||
|
||||
参考来源
|
||||
----
|
||||
|
||||
\[1\]: [GitHub Copilot in VS Code](https://code.visualstudio.com/docs/editor/github-copilot)
|
||||
\[2\]: [How to use GitHub Copilot: Prompts, tips, and use cases](https://github.blog/2023-06-20-how-to-write-better-prompts-for-github-copilot/)
|
||||
\[3\]: [GitHub Copilot Official Website](https://github.com/features/copilot)
|
||||
\[4\]: [GitHub Copilot Series (Youtube)](https://www.youtube.com/playlist?list=PLj6YeMhvp2S5_hvBl2SE-7YCHYlLQ0bPt)
|
||||
\[5\]: [Pragmatic techniques to get the most out of GitHub Copilot (Youtube)](https://www.youtube.com/watch?v=CwAzIpc4AnA)
|
||||
\[6\]: [How I used GitHub Copilot to build a browser extension](https://github.blog/2023-05-12-how-i-used-github-copilot-to-build-a-browser-extension)
|
||||
\[7\]: [Visual Studio Code, Where are extensions installed?](https://code.visualstudio.com/docs/editor/extension-marketplace#_where-are-extensions-installed)
|
||||
\[8\]: [Visual Studio Code, Language Identifiers](https://code.visualstudio.com/docs/languages/identifiers)
|