Compare commits

...

282 Commits

Author SHA1 Message Date
小弟调调
be4dbe6c13 chore: update sponsors. 2026-03-18 15:49:36 +08:00
小弟调调
74be8a4ba0 doc: Update README.md 2026-03-14 23:24:43 +08:00
github-actions[bot]
b4e3ba78a7 doc: update README.md. 2026-03-14 15:23:20 +00:00
github-actions[bot]
cc040b328a doc: update CONTRIBUTING.md. 2026-03-14 15:23:19 +00:00
小弟调调
f036d00bdb ci: update FUNDING.yml 2026-03-14 23:13:11 +08:00
小弟调调
668b9fe6da ci: update workflows config. 2026-03-14 23:13:11 +08:00
github-actions[bot]
6af39111be doc: update README.md. 2026-02-24 11:52:49 +00:00
github-actions[bot]
1ebefcd42a doc: update CONTRIBUTING.md. 2026-02-24 11:52:48 +00:00
jackyrwj
7492af652a doc: update cmd.md (#1022) 2026-02-24 19:51:15 +08:00
github-actions[bot]
91cd804737 doc: update README.md. 2026-02-18 23:59:58 +00:00
github-actions[bot]
74eb2d0cfb doc: update CONTRIBUTING.md. 2026-02-18 23:59:58 +00:00
Dogxi
f08d8cee72 Update Biome link in documentation (#1021) 2026-02-19 07:58:40 +08:00
github-actions[bot]
770a6e3ecf doc: update README.md. 2026-02-12 15:45:19 +00:00
github-actions[bot]
71529ce520 doc: update CONTRIBUTING.md. 2026-02-12 15:45:18 +00:00
小弟调调
b4ba469d7a chore: Update README.md 2026-02-12 23:43:48 +08:00
小弟调调
ce9270a230 chore: update CONTRIBUTING.md 2026-01-26 00:26:45 +08:00
小弟调调
851899f359 doc: update mirror site #102. 2026-01-26 00:25:15 +08:00
小弟调调
6d0c09c52b doc: update mirror site #102. 2026-01-24 03:16:20 +08:00
小弟调调
fb9408759e fixed #1020 2026-01-23 19:48:09 +08:00
小弟调调
95627ca561 doc: update mirror site #102. 2026-01-23 19:48:09 +08:00
github-actions[bot]
e6e522e190 doc: update README.md. 2026-01-18 09:14:36 +00:00
github-actions[bot]
53abe065dd doc: update CONTRIBUTING.md. 2026-01-18 09:14:35 +00:00
Lystran
886d5d749b doc: improve minio.md (add common admin commands and fix some issues) (#1019)
* doc: include recursive options for moving and copying folders

* doc: add  mc admin  commands
2026-01-18 17:13:25 +08:00
github-actions[bot]
f02f2cfef6 doc: update README.md. 2026-01-17 13:37:57 +00:00
github-actions[bot]
284d894283 doc: update CONTRIBUTING.md. 2026-01-17 13:37:56 +00:00
Lystran
53bc354a63 doc: add 7z commands (#1018)
* doc: add 7zip

* doc: update docs/7zip.md
2026-01-17 21:36:46 +08:00
小弟调调
4b4f361e7a doc: Update README.md 2026-01-10 21:26:35 +08:00
小弟调调
c822e74120 doc: update mirror site #102. 2025-12-31 19:51:52 +08:00
小弟调调
a8314905a3 doc: update mirror site #102. 2025-12-31 19:51:52 +08:00
github-actions[bot]
8486dc4ead doc: update README.md. 2025-12-30 13:53:33 +00:00
github-actions[bot]
10b779cd59 doc: update CONTRIBUTING.md. 2025-12-30 13:53:32 +00:00
小弟调调
a3874c1af0 doc: update mirror site #102. 2025-12-30 21:52:15 +08:00
github-actions[bot]
9979cd6b41 doc: update README.md. 2025-12-11 12:47:36 +00:00
github-actions[bot]
7c5209a0e4 doc: update CONTRIBUTING.md. 2025-12-11 12:47:35 +00:00
tutourenshi
9ec70f61c2 doc: Update glances.md (#1016)
Add alert mail configuration
2025-12-11 20:46:19 +08:00
github-actions[bot]
f82ffcc589 doc: update README.md. 2025-12-09 15:59:50 +00:00
github-actions[bot]
837740be91 doc: update CONTRIBUTING.md. 2025-12-09 15:59:49 +00:00
小弟调调
c85669ed18 doc: add mirror site #102. 2025-12-09 23:58:28 +08:00
github-actions[bot]
18663c80bd doc: update README.md. 2025-12-03 16:22:45 +00:00
github-actions[bot]
3b8f251564 doc: update CONTRIBUTING.md. 2025-12-03 16:22:44 +00:00
小弟调调
c4f39e99a3 doc: Update README.md 2025-12-04 00:20:57 +08:00
小弟调调
fc493bdfc2 doc: add mirror site #102. 2025-11-27 20:12:12 +08:00
小弟调调
3f1b8a15c4 doc: update docs/leaf.md 2025-11-22 18:37:50 +08:00
小弟调调
403e79bbf7 doc: Update docs/leaf.md 2025-11-17 23:29:48 +08:00
小弟调调
c62670ddfd released v1.47.0 2025-11-16 21:51:43 +08:00
github-actions[bot]
fb2612335c doc: update README.md. 2025-11-16 13:40:17 +00:00
github-actions[bot]
34b858a392 doc: update CONTRIBUTING.md. 2025-11-16 13:40:16 +00:00
小弟调调
2196468b0b feat: add Leaf 2025-11-16 21:38:34 +08:00
小弟调调
b1ad378ff2 doc: Update README.md 2025-11-03 15:06:58 +08:00
小弟调调
29f1b64f4a doc: Update README.md 2025-10-30 19:46:08 +08:00
小弟调调
059d3afb40 doc: add mirror site #102. 2025-10-29 22:33:42 +08:00
github-actions[bot]
b9407bacdc doc: update README.md. 2025-10-26 11:49:44 +00:00
github-actions[bot]
6742495261 doc: update CONTRIBUTING.md. 2025-10-26 11:49:43 +00:00
小弟调调
dba099a6ae doc: add mirror site #102. 2025-10-26 19:48:18 +08:00
小弟调调
9b11fe4aa8 doc: update docs/huawei-devices.md (#1011) 2025-10-10 13:01:31 +08:00
github-actions[bot]
7d40c537aa doc: update README.md. 2025-10-10 04:10:45 +00:00
github-actions[bot]
d5387c8b9d doc: update CONTRIBUTING.md. 2025-10-10 04:10:43 +00:00
InkSha
719387ba48 doc: add common Cisco and Huawei network device commands (#1011)
* add net device doc

* add huawei net device

* add cisco net device doc

* fix some wrong
2025-10-10 12:09:11 +08:00
小弟调调
ca80b477fb doc: Update README.md 2025-09-28 20:11:55 +08:00
小弟调调
95f841a667 doc: update docs/nginx.md 2025-09-28 01:03:22 +08:00
小弟调调
2478e94303 doc: update docs/nginx.md 2025-09-28 01:03:21 +08:00
github-actions[bot]
508383a235 doc: update README.md. 2025-09-27 16:48:01 +00:00
github-actions[bot]
0b58d6057c doc: update CONTRIBUTING.md. 2025-09-27 16:48:00 +00:00
小弟调调
b4db543088 doc: update docs/javascript.md 2025-09-28 00:46:26 +08:00
github-actions[bot]
4f132524a0 doc: update README.md. 2025-09-18 17:19:15 +00:00
github-actions[bot]
46c07b01b2 doc: update CONTRIBUTING.md. 2025-09-18 17:19:14 +00:00
小弟调调
e4266a394f doc: Update README.md 2025-09-19 01:17:54 +08:00
小弟调调
af12b11ced doc: update docs/quickreference.md 2025-09-15 13:24:29 +08:00
小弟调调
0c0492919c doc: update claude.md 2025-09-15 13:24:29 +08:00
github-actions[bot]
9893a18276 doc: update README.md. 2025-09-09 05:59:18 +00:00
github-actions[bot]
4ff0011317 doc: update CONTRIBUTING.md. 2025-09-09 05:59:17 +00:00
小弟调调
9035c92853 chore: update docs/docker.md 2025-09-09 13:57:30 +08:00
小弟调调
f39f922578 feat: add claude #1008 2025-09-09 13:57:29 +08:00
github-actions[bot]
ea84393d77 doc: update README.md. 2025-08-31 07:52:55 +00:00
github-actions[bot]
6ebe8410b3 doc: update CONTRIBUTING.md. 2025-08-31 07:52:54 +00:00
小弟调调
9961be4fc9 chore: update sponsors. 2025-08-31 15:51:25 +08:00
小弟调调
f78869094b chore: update sponsors. 2025-08-31 15:50:11 +08:00
小弟调调
9198a543d2 chore: add sponsors. 2025-08-31 15:50:11 +08:00
github-actions[bot]
11e5aa5158 doc: update README.md. 2025-08-26 17:56:15 +00:00
github-actions[bot]
0980d53f43 doc: update CONTRIBUTING.md. 2025-08-26 17:56:14 +00:00
小弟调调
74426ba24b feat: add nix cheatsheet. 2025-08-27 01:54:36 +08:00
github-actions[bot]
9fac0fb20b doc: update README.md. 2025-08-23 06:05:45 +00:00
github-actions[bot]
7a5da97aff doc: update CONTRIBUTING.md. 2025-08-23 06:05:45 +00:00
小弟调调
86f24c0724 doc: update app icon. 2025-08-23 14:04:02 +08:00
小弟调调
38a5603ffc doc: update README.md #1001 2025-08-21 12:35:13 +08:00
github-actions[bot]
33bc22f094 doc: update README.md. 2025-08-21 04:28:20 +00:00
github-actions[bot]
cfc51a8da6 doc: update CONTRIBUTING.md. 2025-08-21 04:28:20 +00:00
永恒
c2faaea62b doc: Add one-click deployment to Netlify (#1001)
* Update README.md

add 78888889.xyz 镜像

* feat: 增加 Netlify 一键部署
2025-08-21 12:27:13 +08:00
小弟调调
759396147c fix: fix website title. 2025-08-15 02:23:14 +08:00
小弟调调
2c56431af6 doc: update document. 2025-08-15 01:58:02 +08:00
github-actions[bot]
b00fd39440 doc: update README.md. 2025-08-14 17:03:03 +00:00
github-actions[bot]
77d1a9e89d doc: update CONTRIBUTING.md. 2025-08-14 17:03:03 +00:00
小弟调调
50f3830673 chore: add sponsors. 2025-08-15 01:01:43 +08:00
github-actions[bot]
0251f31ea4 doc: update README.md. 2025-08-14 15:08:00 +00:00
github-actions[bot]
3c2f65ee0f doc: update CONTRIBUTING.md. 2025-08-14 15:07:59 +00:00
github-actions[bot]
5d8f8cf376 doc: update README.md. 2025-08-14 15:06:50 +00:00
github-actions[bot]
1776fa139c doc: update CONTRIBUTING.md. 2025-08-14 15:06:49 +00:00
zcq100
43b0cffc0c docs: update docker document. (#998)
* 移除废弃的命令

* 标记 维护和废弃 的功能

* 已不属于docker命令,参考docker compose子命令用法。

* search功能受限,但是还能用

* 修复文件名错误
2025-08-14 23:06:29 +08:00
冰彦糖
b89630def9 doc: add mirror site #102. (#999)
添加腾讯云CDN镜像站
2025-08-14 23:05:33 +08:00
小弟调调
5a4f7cdf37 doc: format markdown. 2025-08-13 23:17:02 +08:00
小弟调调
6687a0989a doc: update docs/docker-compose.md #997 2025-08-13 23:17:02 +08:00
github-actions[bot]
03874e30ea doc: update README.md. 2025-08-13 14:21:42 +00:00
github-actions[bot]
184f2be3fe doc: update CONTRIBUTING.md. 2025-08-13 14:21:41 +00:00
zcq100
7056d441a6 doc: Update docs/docker-compose.md (#997)
* docker compose 版本的变化,添加实用命令

* 调整显示

* 命令调整
2025-08-13 22:20:05 +08:00
github-actions[bot]
d6d8ee05ca doc: update README.md. 2025-08-13 11:35:46 +00:00
github-actions[bot]
b76f1ee0e4 doc: update CONTRIBUTING.md. 2025-08-13 11:35:45 +00:00
小弟调调
97a83d2094 doc: add mirror site #102. 2025-08-13 19:33:26 +08:00
github-actions[bot]
4f757330fb doc: update README.md. 2025-08-12 02:21:17 +00:00
github-actions[bot]
ec74c928a7 doc: update CONTRIBUTING.md. 2025-08-12 02:21:16 +00:00
InkSha
2e985e4fee doc: update docs/tauri.md (#996) 2025-08-12 10:20:07 +08:00
小弟调调
cca2f658b3 doc: add mirror site #102. 2025-08-10 15:52:34 +08:00
github-actions[bot]
3e3a7c4bd3 doc: update README.md. 2025-08-09 11:19:06 +00:00
github-actions[bot]
f2210fa2c3 doc: update CONTRIBUTING.md. 2025-08-09 11:19:05 +00:00
Liu Yuhe
02fed846ad doc: Update rust.md (#994) 2025-08-09 19:17:57 +08:00
小弟调调
7e18748595 doc: add mirror site #102. 2025-08-01 01:31:39 +08:00
github-actions[bot]
866b8081c4 doc: update README.md. 2025-07-31 17:29:37 +00:00
github-actions[bot]
a817c3ef5c doc: update CONTRIBUTING.md. 2025-07-31 17:29:36 +00:00
初五
61e2fdb221 docs: Update wails.md (#991) 2025-08-01 01:28:30 +08:00
zhangym
2251b24c61 docs: update docs/java.md (#990) 2025-07-28 16:09:46 +08:00
小弟调调
c0567c6abf doc: Update document. #102 2025-07-27 01:55:15 +08:00
github-actions[bot]
1ad3c1ddd5 doc: update README.md. 2025-07-26 16:39:54 +00:00
github-actions[bot]
a39923a5fb doc: update CONTRIBUTING.md. 2025-07-26 16:39:53 +00:00
初五
027ceead3d docs: update docs/wails.md (#988) 2025-07-27 00:38:40 +08:00
github-actions[bot]
5f1201ee76 doc: update README.md. 2025-07-26 08:43:08 +00:00
github-actions[bot]
a172b1d5e8 doc: update CONTRIBUTING.md. 2025-07-26 08:43:06 +00:00
初五
65e99b1650 docs: update docs/htmx.md (#987) 2025-07-26 16:41:48 +08:00
小弟调调
28257459f7 doc: update README.md #102 2025-07-22 18:39:40 +08:00
github-actions[bot]
66871598a9 doc: update README.md. 2025-07-21 07:12:16 +00:00
github-actions[bot]
ea4c9c9e86 doc: update CONTRIBUTING.md. 2025-07-21 07:12:15 +00:00
小弟调调
d0f3c95f1b doc: update README.md #102 2025-07-21 15:11:01 +08:00
Jruing
a5b3b23d16 doc: Update python.md (#986)
增加高阶函数sorted  reduce  map以及偏函数,增加类属性的访问控制和验证
2025-07-21 15:08:51 +08:00
github-actions[bot]
91d788741b doc: update README.md. 2025-07-21 06:20:23 +00:00
github-actions[bot]
48c8cef906 doc: update CONTRIBUTING.md. 2025-07-21 06:20:22 +00:00
小弟调调
4b02ff685a doc: Update README.md 2025-07-21 14:19:08 +08:00
小弟调调
8f75108d8b doc: Update README.md 2025-07-18 23:59:13 +08:00
github-actions[bot]
c0786cce01 doc: update README.md. 2025-07-18 11:16:54 +00:00
github-actions[bot]
9410da12c3 doc: update CONTRIBUTING.md. 2025-07-18 11:16:53 +00:00
小弟调调
ad034b476d doc: update docs/ssh.md #980 2025-07-18 19:15:15 +08:00
小弟调调
91ba353e23 doc: update docs/bash.md. 2025-07-18 01:10:53 +08:00
小弟调调
799f041fcf doc: Update README.md #102 2025-07-18 01:00:09 +08:00
github-actions[bot]
20cca08e43 doc: update README.md. 2025-07-17 16:57:42 +00:00
github-actions[bot]
732caab18d doc: update CONTRIBUTING.md. 2025-07-17 16:57:42 +00:00
Coffee
c6064801c5 doc: update docs/nginx.md (#985) 2025-07-18 00:56:40 +08:00
github-actions[bot]
1e0da1903f doc: update README.md. 2025-07-15 14:07:06 +00:00
github-actions[bot]
a160cfa338 doc: update CONTRIBUTING.md. 2025-07-15 14:07:05 +00:00
Attack825
59e2b25346 doc: Update javascript.md (#984)
Triple operator result error
2025-07-15 22:05:16 +08:00
github-actions[bot]
63ce1ab296 doc: update README.md. 2025-07-15 06:26:47 +00:00
github-actions[bot]
2ec2657daf doc: update CONTRIBUTING.md. 2025-07-15 06:26:46 +00:00
youyu
3abdb35ccd doc: Update flutter.md (#983)
修改错别字
2025-07-15 14:25:21 +08:00
github-actions[bot]
0e0def2d88 doc: update README.md. 2025-07-14 04:48:02 +00:00
github-actions[bot]
ae5a826b0d doc: update CONTRIBUTING.md. 2025-07-14 04:48:01 +00:00
BlacAmDK
4d311ed58b docs: update docs/systemd.md (#982) 2025-07-14 12:47:02 +08:00
小弟调调
3c5578a2f3 chore: add google analytics. 2025-07-11 02:39:37 +08:00
小弟调调
899d85223d doc: update docs/swift.md 2025-07-02 13:46:17 +08:00
github-actions[bot]
5f521444be doc: update README.md. 2025-07-02 05:18:44 +00:00
github-actions[bot]
225c72510d doc: update CONTRIBUTING.md. 2025-07-02 05:18:43 +00:00
cgluWxh
e140614012 doc: kotlin.md translation fix (#977)
翻译错误修正:
- 你被认为是高级 -> 您被视为老年人
2025-07-02 13:17:22 +08:00
github-actions[bot]
7d52e09f27 doc: update README.md. 2025-06-26 15:27:32 +00:00
github-actions[bot]
0abfabe64c doc: update CONTRIBUTING.md. 2025-06-26 15:27:31 +00:00
notes-bin
f1fef44b71 doc: Update README.md (#975) 2025-06-26 23:26:29 +08:00
github-actions[bot]
c861330de9 doc: update README.md. 2025-06-24 18:05:00 +00:00
github-actions[bot]
0dd17923bc doc: update CONTRIBUTING.md. 2025-06-24 18:04:59 +00:00
小弟调调
47c412520e doc: Update README.md 2025-06-25 02:03:47 +08:00
小弟调调
28872d3391 doc: update README.md 2025-06-23 00:59:10 +08:00
小弟调调
d243e4261b doc: Update README.md #102 2025-06-21 02:28:35 +08:00
小弟调调
dd0cdb393d doc: Update docker.md 2025-06-21 02:27:10 +08:00
小弟调调
cb3b1b89c5 doc: update docs/wails.md #973 2025-06-16 21:42:14 +08:00
小弟调调
721b876dea doc: update wails logo #973 2025-06-16 21:40:44 +08:00
小弟调调
1cd3c369ea doc: update docs/wails.md #973 2025-06-16 21:34:48 +08:00
小弟调调
e15d66956c doc: update docs/wails.md
https://github.com/jaywcjlove/reference/discussions/580
2025-06-16 19:00:04 +08:00
github-actions[bot]
32862fe194 doc: update README.md. 2025-06-16 10:58:16 +00:00
github-actions[bot]
626e70a666 doc: update CONTRIBUTING.md. 2025-06-16 10:58:15 +00:00
初五
47cf42deff feat: add wails.md cheat sheet doc (#973)
* docs: add wails.md introduction doc

* Update wails.md

* docs: update documentation
2025-06-16 18:57:12 +08:00
小弟调调
55ee13ad5f doc: Update README.md 2025-06-13 08:42:53 +08:00
小弟调调
3a106842b3 doc: Update README.md #102 2025-06-09 19:03:08 +08:00
小弟调调
0feb5644c9 doc: Update README.md 2025-06-08 21:44:28 +08:00
小弟调调
139d107454 Add OneNAS.space 2025-06-08 21:21:18 +08:00
小弟调调
7011e08a95 doc: Update README.md 2025-06-06 23:20:42 +08:00
小弟调调
d48cf7d4ec doc: Update README.md 2025-06-06 23:18:57 +08:00
小弟调调
b833cb0981 doc: update docs/uv.md #972 #967 2025-06-06 23:08:41 +08:00
github-actions[bot]
e97857cb7e doc: update README.md. 2025-06-06 14:50:24 +00:00
github-actions[bot]
faed604ead doc: update CONTRIBUTING.md. 2025-06-06 14:50:24 +00:00
zine yu
6b8fdb3366 feat: add docs/uv.md (#972)
#967
2025-06-06 22:49:22 +08:00
github-actions[bot]
78f60f418c doc: update README.md. 2025-06-05 04:45:40 +00:00
github-actions[bot]
9e66decded doc: update CONTRIBUTING.md. 2025-06-05 04:45:39 +00:00
zine yu
4e2bc83644 docs(docs/java.md): add Java abstract class and interface (#971)
* docs: fix formatting and add Java OOP content in docs

* docs(docs/java.md): add Java abstract class and interface
2025-06-05 12:44:18 +08:00
github-actions[bot]
d2585a431c doc: update README.md. 2025-06-04 13:40:09 +00:00
github-actions[bot]
1abd69f13f doc: update CONTRIBUTING.md. 2025-06-04 13:40:08 +00:00
zine yu
13ce84c95a docs: fix formatting and add Java OOP content in docs (#970) 2025-06-04 21:39:01 +08:00
小弟调调
43effcf0cb doc: Update README.md 2025-06-04 15:57:55 +08:00
小弟调调
5cdd5d8d89 doc: Update README.md #102 2025-06-03 16:38:16 +08:00
github-actions[bot]
4ab24ae284 doc: update README.md. 2025-06-01 15:25:02 +00:00
github-actions[bot]
102b0862b9 doc: update CONTRIBUTING.md. 2025-06-01 15:25:01 +00:00
fenglielie
0b9af04f70 doc: update docs/matlab.md (#969) 2025-06-01 23:23:57 +08:00
小弟调调
68b804b7f5 doc: update README.md #102 2025-06-01 10:07:36 +08:00
小弟调调
ce0b7c6cd0 doc: update docs/yazi.md 2025-05-30 13:47:40 +08:00
小弟调调
007394b051 doc: Update README.md 2025-05-27 14:56:02 +08:00
小弟调调
3577721578 doc: update README.md 2025-05-27 14:28:21 +08:00
小弟调调
e0b540d174 doc: update docs/dotnet-cli.md #945 2025-05-27 14:12:07 +08:00
小弟调调
7650bbac40 feat: add .NET CLI fix #945 2025-05-27 14:09:21 +08:00
github-actions[bot]
ffb15d6542 doc: update README.md. 2025-05-27 05:43:45 +00:00
github-actions[bot]
4a9e2d0ed7 doc: update CONTRIBUTING.md. 2025-05-27 05:43:44 +00:00
小弟调调
3e732813c8 doc: update docs/mysql.md #940 2025-05-27 13:42:27 +08:00
github-actions[bot]
4381fe820e doc: update README.md. 2025-05-12 17:19:42 +00:00
github-actions[bot]
1c866c011f doc: update CONTRIBUTING.md. 2025-05-12 17:19:41 +00:00
小弟调调
856094374d ci: update workflows config. 2025-05-13 01:18:33 +08:00
小弟调调
4ca8110520 doc: update docs/pip.md 2025-05-12 01:32:36 +08:00
小弟调调
cb8d9dfb45 feat: add pip.md #83 #964 2025-05-12 01:05:32 +08:00
小弟调调
fb3e277fed chore: update sponsorship info. 2025-05-10 22:59:51 +08:00
小弟调调
c2454acd73 doc: Update README.md 2025-05-10 17:48:59 +08:00
小弟调调
3301d5a7ee doc: Update README.md 2025-05-10 17:38:10 +08:00
小弟调调
d37f9c6442 doc: Update README.md #102 2025-05-10 16:48:38 +08:00
github-actions[bot]
4661fdc6b9 doc: update README.md. 2025-05-08 10:32:56 +00:00
github-actions[bot]
3f064a5457 doc: update CONTRIBUTING.md. 2025-05-08 10:32:55 +00:00
You Kuan Zhang
582d26a6d9 doc: Update vue.md (#962) 2025-05-08 18:31:37 +08:00
小弟调调
0cb2ec73cc doc: docs/chatgpt.md 2025-04-30 16:51:54 +08:00
小弟调调
e4dda9a41a doc: update docs/zed.md 2025-04-30 15:44:47 +08:00
小弟调调
6937111dce feat: add zed cheatsheet. 2025-04-30 15:43:12 +08:00
github-actions[bot]
27d597c801 doc: update README.md. 2025-04-30 07:31:44 +00:00
github-actions[bot]
04676e51df doc: update CONTRIBUTING.md. 2025-04-30 07:31:43 +00:00
小弟调调
340934876e chore: update README.md 2025-04-30 15:30:17 +08:00
小弟调调
95da603a74 doc: Update lua.md fix #956 2025-04-18 22:34:52 +08:00
小弟调调
975ddb3193 doc: Update lua.md #957 2025-04-18 22:29:06 +08:00
小弟调调
ee9a764b8f doc: update README.md 2025-04-17 09:47:35 +08:00
github-actions[bot]
d9a0c8cf07 doc: update README.md. 2025-04-11 05:49:34 +00:00
github-actions[bot]
4c7c88626b doc: update CONTRIBUTING.md. 2025-04-11 05:49:33 +00:00
永恒
3ca296f8f7 doc: Update README.md (#954) #102
add 78888889.xyz 镜像
2025-04-11 13:48:31 +08:00
小弟调调
fe07d5fd8c doc: Update README.md #102 2025-04-10 17:08:59 +08:00
小弟调调
5b256b077e doc: Update README.md #102 2025-04-06 13:53:42 +08:00
小弟调调
2655ce4914 chore: update scripts. 2025-04-03 23:55:34 +08:00
小弟调调
1d6db04e39 chore: update scripts. 2025-04-03 23:52:54 +08:00
小弟调调
1b4be7d870 chore: update sponsorship support #947 2025-04-03 23:50:56 +08:00
github-actions[bot]
ba9b4a5ca1 doc: update README.md. 2025-04-02 15:09:08 +00:00
github-actions[bot]
15cf70fb50 doc: update CONTRIBUTING.md. 2025-04-02 15:09:07 +00:00
fault
b463143e63 doc: update docs/vue.md (#948) 2025-04-02 23:08:07 +08:00
fault
740b2b8871 doc: update docs/vue.md (#948) 2025-04-02 23:05:25 +08:00
小弟调调
9eb9edd04a doc: Update README.md 2025-04-01 23:54:24 +08:00
github-actions[bot]
882efb7310 doc: update README.md. 2025-04-01 11:47:39 +00:00
github-actions[bot]
a1dfc43d67 doc: update CONTRIBUTING.md. 2025-04-01 11:47:38 +00:00
小弟调调
c9e729bc7e doc: Update README.md #102 2025-04-01 19:46:19 +08:00
小弟调调
46e0ef5443 doc: Update README.md #102 2025-03-27 12:33:55 +08:00
小弟调调
c9ae7d673e doc: Update README.md #102 2025-03-27 09:48:32 +08:00
github-actions[bot]
adf39710da doc: update README.md. 2025-03-26 09:53:16 +00:00
github-actions[bot]
b7f0db51fe doc: update CONTRIBUTING.md. 2025-03-26 09:53:15 +00:00
小弟调调
c99af98f7d doc: Update README.md #102 2025-03-26 17:52:13 +08:00
fault
2e96576084 doc: updat docs/vue.md (#943)
* 新增性能优化板块

* Move Performance Optimization introduction to ### 介绍 section

* 我在 `# 性能优化` 章节中又新增了三个优化方法:虚拟列表(Virtual Scrolling)、按需加载资源(Lazy Loading Resources)和优化事件监听(Event Delegation),每个方法都附带了代码示例和说明。这些方法可以进一步丰富优化策略,覆盖更多场景。
2025-03-22 09:22:28 +08:00
github-actions[bot]
17921854d3 doc: update README.md. 2025-03-18 15:58:06 +00:00
github-actions[bot]
f401c87bbf doc: update CONTRIBUTING.md. 2025-03-18 15:58:05 +00:00
小弟调调
a9974dfd20 doc: Update README.md 2025-03-18 23:56:50 +08:00
github-actions[bot]
0fd9e8af65 doc: update README.md. 2025-03-13 04:10:26 +00:00
github-actions[bot]
9f2ad7a295 doc: update CONTRIBUTING.md. 2025-03-13 04:10:25 +00:00
shanhai1024
0c618e1c01 doc: update docs/mysql.md (#941)
Co-authored-by: null <shanhai1204@gmail.com>
2025-03-13 12:09:28 +08:00
Hao He
19e258c591 doc: Update golang.md (#938) 2025-03-11 23:44:43 +08:00
github-actions[bot]
13701d39ee doc: update README.md. 2025-03-10 09:54:24 +00:00
github-actions[bot]
a5759ea2d3 doc: update CONTRIBUTING.md. 2025-03-10 09:54:23 +00:00
Hao He
0c78352ef7 doc: Update cpp.md (#935) 2025-03-10 17:53:22 +08:00
github-actions[bot]
5e5666d347 doc: update README.md. 2025-03-10 03:15:01 +00:00
github-actions[bot]
884e8dbeff doc: update CONTRIBUTING.md. 2025-03-10 03:15:00 +00:00
Hao He
e3dbd1b196 doc: Update cpp.md (#933) 2025-03-10 11:14:54 +08:00
jldxpm
828afdad47 doc: Update java.md (#934)
* doc: Update java.md

📝 修正注释中的错误

* doc: Update java.md

📝 修正小标题的翻译错误
2025-03-10 11:13:56 +08:00
github-actions[bot]
c99f3c8788 doc: update README.md. 2025-03-06 04:51:57 +00:00
github-actions[bot]
cec3255efc doc: update CONTRIBUTING.md. 2025-03-06 04:51:56 +00:00
Qliangw
a0a957483c doc(git): update docs/git.md (#931) 2025-03-06 12:50:56 +08:00
github-actions[bot]
8ec4235082 doc: update README.md. 2025-03-04 16:45:46 +00:00
github-actions[bot]
6f95c250e6 doc: update CONTRIBUTING.md. 2025-03-04 16:45:45 +00:00
xunjian
792451b75f doc: Update java.md (#930)
✏️ 为 Arrays.deepToString(Object[] a) 添加说明注释
🐛 修正变量名拼写错误
2025-03-05 00:44:41 +08:00
github-actions[bot]
d57b60064c doc: update README.md. 2025-03-01 22:30:28 +00:00
github-actions[bot]
3ec25b8951 doc: update CONTRIBUTING.md. 2025-03-01 22:30:27 +00:00
icer
6d86d679f0 docs: optimize latex.md (#929)
* docs:  unified title language and format

- Translate English titles into Chinese ones
- Delete English titles

* docs: 微分符号 `d` 使用正体

* docs: modify the structure of 入门/介绍
2025-03-02 06:29:10 +08:00
github-actions[bot]
95d21e81a9 doc: update README.md. 2025-02-27 08:19:24 +00:00
github-actions[bot]
99c30d38fd doc: update CONTRIBUTING.md. 2025-02-27 08:19:23 +00:00
jaywcjlove
7cb9f0e058 doc: update docs/cs.md (#926) 2025-02-27 16:17:57 +08:00
github-actions[bot]
f945549091 doc: update README.md. 2025-02-27 08:02:42 +00:00
github-actions[bot]
229b4af4a5 doc: update CONTRIBUTING.md. 2025-02-27 08:02:41 +00:00
github-actions[bot]
b673ede608 doc: update README.md. 2025-02-27 08:01:42 +00:00
github-actions[bot]
2297475e5a doc: update CONTRIBUTING.md. 2025-02-27 08:01:41 +00:00
Furry-Monster
03e52c1126 doc: update docs/cs.md (#926) 2025-02-27 16:01:16 +08:00
LufsX
e544b8f7b3 doc: update docs/python.md (#925) 2025-02-27 16:00:44 +08:00
github-actions[bot]
a7b01e4ce0 doc: update README.md. 2025-02-25 06:25:02 +00:00
github-actions[bot]
ea4637c28f doc: update CONTRIBUTING.md. 2025-02-25 06:25:01 +00:00
jaywcjlove
fe047b1e5a feat: add time-zones.md #924 2025-02-25 14:22:51 +08:00
jaywcjlove
4c8694d784 doc: Update README.md 2025-02-18 08:51:31 +08:00
91 changed files with 8916 additions and 871 deletions

14
.github/FUNDING.yml vendored
View File

@@ -1,10 +1,4 @@
# 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: jaywcjlove
buy_me_a_coffee: jaywcjlove
# tidelift: #npm/mocker-api
# community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
custom: ["https://www.paypal.me/kennyiseeyou", "https://jaywcjlove.github.io/#/sponsor"]
github: [jaywcjlove]
#ko_fi: jaywcjlove
#buy_me_a_coffee: jaywcjlove
# custom: ["https://wangchujiang.com/#/sponsor"]

View File

@@ -9,10 +9,11 @@ jobs:
if: github.repository == 'jaywcjlove/reference'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 20
node-version: 24
registry-url: 'https://registry.npmjs.org'
- run: npm install
- run: npm run build
@@ -30,6 +31,7 @@ jobs:
uses: jaywcjlove/github-action-modify-file-content@main
with:
path: CONTRIBUTING.md
trim_whitespace: false
body: |
${{steps.contributors.outputs.htmlList}}
@@ -37,6 +39,7 @@ jobs:
uses: jaywcjlove/github-action-modify-file-content@main
with:
path: README.md
trim_whitespace: false
body: |
${{steps.contributors.outputs.htmlList}}

View File

@@ -9,10 +9,11 @@ jobs:
if: github.repository == 'jaywcjlove/reference'
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/checkout@v6
- uses: actions/setup-node@v6
with:
node-version: 20
node-version: 24
registry-url: 'https://registry.npmjs.org'
- run: npm install
- run: npm run build

View File

@@ -24,6 +24,7 @@
{ "rel": "apple-touch-icon", "sizes": "167x167", "href": "{{RELATIVE_PATH}}icons/touch-icon-ipad-retina.png" },
{ "rel": "apple-touch-icon", "sizes": "120x120", "href": "{{RELATIVE_PATH}}icons/touch-icon-iphone-retina.png" }
],
"analyticsId": "G-9MWEWXSDQK",
"giscus": {
"src": "https://giscus.app/client.js",
"data-repo": "jaywcjlove/reference",

View File

@@ -249,36 +249,106 @@ REF_LABEL=网站首页
由于中国国内访问,时常打不开,你可以访问下面镜像网站。
- [baiyapeng.cc](https://ref.cc.baiyapeng.cc)
- [stacktao.cn](https://ref.stacktao.cn)
- [chanlun.pro](https://ref.chanlun.pro)
- [ljdyjh.cn](https://ref.ljdyjh.cn)
- [szsyw.cn](https://projects.szsyw.cn/reference/)
- [hanauta.icu](https://ref.hanauta.icu)
- [doc.xyz.sb](https://doc.xyz.sb)
- [quickref.cn](https://quickref.cn)
- [ecdata.cn](http://ref.ecdata.cn)
- [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/)
- [axchen.top](https://ref.tool.axchen.top)
- [tamamo.top](https://ref.tamamo.top)
- [sakuraovo.site](https://quick-re.site-ali.sakuraovo.site)
- [nyanon.online](https://quick-re.nyanon.online)
- [0x0f.dev](https://ref.0x0f.dev)
- [78888889.xyz](https://reference.78888889.xyz)
- [pusukeji.com](https://reference.pusukeji.com/)
- [magese.com](https://ref.magese.com)
- [doraemon.press](https://reference.doraemon.press/)
- [foreverlink.love](https://reference.foreverlink.love)
- [xod.cc](https://ref.xod.cc)
- [jhao.me](http://reference.jhao.me/)
- [maoo.me](https://note.maoo.me)
- [luckyits.com](https://ref.luckyits.com/)
- [9up.dev](https://devref.9up.dev)
- [ylmty.cc](https://docs.ylmty.cc)
- [mingming.dev](https://ref.mingming.dev)
- [itzcy.com](https://reference.itzcy.com/)
- [ref.v-ta.com](https://ref.v-ta.com)
- [eryajf.net](https://ref.eryajf.net/)
- [kjchmc.cn](https://ref.kjchmc.cn/)
- [likeadmin.cn](https://www.likeadmin.cn/quickref/)
- [isteed.cc](https://ref.isteed.cc/)
- [666666.dev](https://cheat.666666.dev)
- [srebro.cn](https://ref.srebro.cn)
- [guoxudong.io](https://reference.guoxudong.io/)
- [terryyoung.cn](http://ref.terryyoung.cn/)
- [quickref.binscor.top](https://quickref.binscor.top)
- [zone.id](https://cyref.zone.id/)
- [aibk.cn](https://quickref.aibk.cn)
- [docflow.cn](https://ref.docflow.cn)
- [quickref.hestudio.net](https://quickref.hestudio.net)
- [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/)
- [moeyuuko.com](https://ref.moeyuuko.com/)
- [haah.net](https://ref.haah.net)
- [ownit.top](https://memo.ownit.top)
- [laoleng.vip](http://bbs.laoleng.vip/reference/)
- [if010.com](https://quickref.if010.com/)
- [cms.im](https://quickref.cms.im/)
- [itcent.cn](https://code.itcent.cn/)
- [coolxy.top](https://refer.coolxy.top)
- [kclouder.cn](https://www.kclouder.cn/reference)
- [xalaok.top](https://ref.xalaok.top)
- [hao.kim](https://ref.hao.kim)
- [tool.sakura.vin](https://tool.sakura.vin/ref/)
- [chenchen.site](https://img.chenchen.site/reference/)
- [jgeek.cn](http://reference.jgeek.cn/)
- [gaojs.com.cn](https://study.gaojs.com.cn)
- [15926.tech](https://ref.15926.tech)
- [okhk.net](https://ref.okhk.net)
- [wdft.com](https://ref.wdft.com)
- [likui.info](https://r.likui.info)
- [ruiange.work](https://code.ruiange.work/)
- [denganliang.com](https://ref.denganliang.com)
- [ivanz.cc](https://ref.ivanz.cc)
- [dev6.site](https://ref.dev6.site/)
- [zishu.me](https://ref.zishu.me/)
- [sucan2233.cn](http://reference.sucan2233.cn)
- [bobh.cool](https://quickref.bobh.cool)
- [tangwudi.com](https://doc.tangwudi.com)
- [osz.icu](https://ref.osz.icu/)
- [docs.willxup.top](https://docs.willxup.top)
- [wangchunfei.com](https://ref.wangchunfei.com/)
- [object.cool](https://r.object.cool)
- [jeremyjone.com](https://ref.jeremyjone.com/)
- [gistudy.net](https://reference.gistudy.net/)
- [deyout.com](https://ref.deyout.com)
- [const.team](https://reference.const.team)
- [liamng.de](https://refer.liamng.de)
- [zcsk18.cn](https://reference.zcsk18.cn/)
- [hhxyrk.icu](http://hhxy.hhxyrk.icu/)
- [vhcffh.com](https://docs.vhcffh.com)
- [childish.vip](https://reference.childish.vip)
- [hackshen.com](https://reference.hackshen.com)
- [afetera.top](https://note.afetera.top)
- [trtuaazz.com](https://reference.trtuaazz.com)
- [anhaoyang.com](http://dev-doc.anhaoyang.com/)
- [xxcxx.lat](https://xxcxx.lat/)
- [fishlee.net](https://cr.fishlee.net/)
- [yunshangmanyou.com](https://quick.yunshangmanyou.com)
- [xiaokaixuan.com](https://xiaokaixuan.com/xkx/rq/index.html)
- [opzz.top](https://reference.opzz.top)
- [songbaixin.xin](https://home.songbaixin.xin:26009/)
- [dev.bi](https://dev.bi)
- [ecdata.cn](http://ref.ecdata.cn)
- [cnxiaobai.com](https://quickref.cnxiaobai.com)
- [web.app](https://reference-f1cf1.web.app)
- [OneNAS.space](https://ref.onenas.space)
- [leonus.cn](https://ref.leonus.cn/)
- [taotaome.com](http://www.taotaome.com/)
- [hurcaguari.top](https://help.hurcaguari.top)
- [cutterman.cn](https://blog.cutterman.cn/reference/index.html)
- [notes-bin.top](https://notes-bin.top:10443)
- [dongdong741236.cn](https://code.dongdong741236.cn/)
感谢🙏
@@ -328,7 +398,8 @@ jobs:
请参阅[贡献指南](./CONTRIBUTING.md)了解如何开始。一如既往,感谢我们出色的贡献者!
<!--GAMFC--><a href="https://github.com/jaywcjlove" title="小弟调调"><img src="https://avatars.githubusercontent.com/u/1680273?v=4" width="42;" alt="小弟调调"/></a>
<!--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/zhangymPerson" title="zhangym"><img src="https://avatars.githubusercontent.com/u/40376181?v=4" width="42;" alt="zhangym"/></a>
<a href="https://github.com/mofelee" title="mofelee"><img src="https://avatars.githubusercontent.com/u/5069410?v=4" width="42;" alt="mofelee"/></a>
@@ -338,164 +409,194 @@ jobs:
<a href="https://github.com/h7ml" title="h7ml"><img src="https://avatars.githubusercontent.com/u/55233292?v=4" width="42;" alt="h7ml"/></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/alex-reinfoce" title="Alex"><img src="https://avatars.githubusercontent.com/u/115539090?v=4" width="42;" alt="Alex"/></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/liduchuan" title="Alex"><img src="https://avatars.githubusercontent.com/u/115539090?v=4" width="42;" alt="Alex"/></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/expoli" title="expoli"><img src="https://avatars.githubusercontent.com/u/31023767?v=4" width="42;" alt="expoli"/></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/eryajf" title="二丫讲梵"><img src="https://avatars.githubusercontent.com/u/33259379?v=4" width="42;" alt="二丫讲梵"/></a>
<a href="https://github.com/ChuwuYo" title="ChuwuYo"><img src="https://avatars.githubusercontent.com/u/141227996?v=4" width="42;" alt="ChuwuYo"/></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/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/zine0" title="zine yu"><img src="https://avatars.githubusercontent.com/u/46991452?v=4" width="42;" alt="zine yu"/></a>
<a href="https://github.com/richuff" title="richuff"><img src="https://avatars.githubusercontent.com/u/162144087?v=4" width="42;" alt="richuff"/></a>
<a href="https://github.com/QinIndexCode" title="Qin"><img src="https://avatars.githubusercontent.com/u/177287013?v=4" width="42;" alt="Qin"/></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/Willxup" title="Will"><img src="https://avatars.githubusercontent.com/u/51990395?v=4" width="42;" alt="Will"/></a>
<a href="https://github.com/long-910" title="Small Long"><img src="https://avatars.githubusercontent.com/u/7323488?v=4" width="42;" alt="Small Long"/></a>
<a href="https://github.com/Harris-H" title="Hao He"><img src="https://avatars.githubusercontent.com/u/57698783?v=4" width="42;" alt="Hao He"/></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/AmosHuKe" title="Amos"><img src="https://avatars.githubusercontent.com/u/32262985?v=4" width="42;" alt="Amos"/></a>
<a href="https://github.com/4twocc" title="42:p"><img src="https://avatars.githubusercontent.com/u/34529275?v=4" width="42;" alt="42:p"/></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/1834423612" title="kjch"><img src="https://avatars.githubusercontent.com/u/49981661?v=4" width="42;" alt="kjch"/></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/pangxiaoli" title="pangxiaoli"><img src="https://avatars.githubusercontent.com/u/54620953?v=4" width="42;" alt="pangxiaoli"/></a>
<a href="https://github.com/partoneplay" title="佐博"><img src="https://avatars.githubusercontent.com/u/5189132?v=4" width="42;" alt="佐博"/></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/witt-bit" title="witt"><img src="https://avatars.githubusercontent.com/u/52407727?v=4" width="42;" alt="witt"/></a>
<a href="https://github.com/zcq100" title="zcq100"><img src="https://avatars.githubusercontent.com/u/425234?v=4" width="42;" alt="zcq100"/></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/sundakai" title="永恒"><img src="https://avatars.githubusercontent.com/u/21995250?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/wsypower" title="魏"><img src="https://avatars.githubusercontent.com/u/31298317?v=4" width="42;" alt="魏"/></a>
<a href="https://github.com/buyfakett" title="buyfakett"><img src="https://avatars.githubusercontent.com/u/46560426?v=4" width="42;" alt="buyfakett"/></a>
<a href="https://github.com/wangdaodao" title="王叨叨"><img src="https://avatars.githubusercontent.com/u/2317442?v=4" width="42;" alt="王叨叨"/></a>
<a href="https://github.com/AmosHuKe" title="Amos"><img src="https://avatars.githubusercontent.com/u/32262985?v=4" width="42;" alt="Amos"/></a>
<a href="https://github.com/qjksxy" title="Apin"><img src="https://avatars.githubusercontent.com/u/81305669?v=4" width="42;" alt="Apin"/></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/BlacAmDK" title="BlacAmDK"><img src="https://avatars.githubusercontent.com/u/10971397?v=4" width="42;" alt="BlacAmDK"/></a>
<a href="https://github.com/kinoward" title="Kino Ward"><img src="https://avatars.githubusercontent.com/u/33886943?v=4" width="42;" alt="Kino Ward"/></a>
<a href="https://github.com/InkSha" title="InkSha"><img src="https://avatars.githubusercontent.com/u/79246657?v=4" width="42;" alt="InkSha"/></a>
<a href="https://github.com/ljq" title="Jaco Liu"><img src="https://avatars.githubusercontent.com/u/7278286?v=4" width="42;" alt="Jaco 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/Kisa-Dong" title="Kisa-Dong"><img src="https://avatars.githubusercontent.com/u/84782008?v=4" width="42;" alt="Kisa-Dong"/></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/greyhao" title="greyhao"><img src="https://avatars.githubusercontent.com/u/107107440?v=4" width="42;" alt="greyhao"/></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/izven" title="Zhang"><img src="https://avatars.githubusercontent.com/u/2149051?v=4" width="42;" alt="Zhang"/></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/ThanatosXingYu" title="Thanatos"><img src="https://avatars.githubusercontent.com/u/53430376?v=4" width="42;" alt="Thanatos"/></a>
<a href="https://github.com/LystranG" title="Lystran"><img src="https://avatars.githubusercontent.com/u/49083828?v=4" width="42;" alt="Lystran"/></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/ThanatosXingYu" title="Thanatos"><img src="https://avatars.githubusercontent.com/u/53430376?v=4" width="42;" alt="Thanatos"/></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/izven" title="Zhang"><img src="https://avatars.githubusercontent.com/u/2149051?v=4" width="42;" alt="Zhang"/></a>
<a href="https://github.com/findnr" title="findnr"><img src="https://avatars.githubusercontent.com/u/217852450?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/jussker" title="jussker"><img src="https://avatars.githubusercontent.com/u/33953356?v=4" width="42;" alt="jussker"/></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/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/jldxpm" title="Peng Min"><img src="https://avatars.githubusercontent.com/u/128905630?v=4" width="42;" alt="Peng Min"/></a>
<a href="https://github.com/jlchen5" title="J.Chen"><img src="https://avatars.githubusercontent.com/u/61578993?v=4" width="42;" alt="J.Chen"/></a>
<a href="https://github.com/jackyrwj" title="jackyrwj"><img src="https://avatars.githubusercontent.com/u/32791282?v=4" width="42;" alt="jackyrwj"/></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/icer233" title="icer"><img src="https://avatars.githubusercontent.com/u/74440627?v=4" width="42;" alt="icer"/></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/kcmeven" title="Evan-k"><img src="https://avatars.githubusercontent.com/u/48147837?v=4" width="42;" alt="Evan-k"/></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/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/larry-xue" title="yujian"><img src="https://avatars.githubusercontent.com/u/48818060?v=4" width="42;" alt="yujian"/></a>
<a href="https://github.com/leauny" title="leauny"><img src="https://avatars.githubusercontent.com/u/42369176?v=4" width="42;" alt="leauny"/></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/qiukuip" title="qiukuip | 秋葵Pie"><img src="https://avatars.githubusercontent.com/u/44923922?v=4" width="42;" alt="qiukuip | 秋葵Pie"/></a>
<a href="https://github.com/childeyouyu" title="youyu"><img src="https://avatars.githubusercontent.com/u/89082776?v=4" width="42;" alt="youyu"/></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/lijc210" title="cizai"><img src="https://avatars.githubusercontent.com/u/10651081?v=4" width="42;" alt="cizai"/></a>
<a href="https://github.com/gaoxiaoduan" title="Coder Duan"><img src="https://avatars.githubusercontent.com/u/69953511?v=4" width="42;" alt="Coder Duan"/></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/emoji-share" title="emoji-share🤪"><img src="https://avatars.githubusercontent.com/u/192275245?v=4" width="42;" alt="emoji-share🤪"/></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/fenglielie" title="fenglielie"><img src="https://avatars.githubusercontent.com/u/51266402?v=4" width="42;" alt="fenglielie"/></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/gi-b716" title="Gavin"><img src="https://avatars.githubusercontent.com/u/78394473?v=4" width="42;" alt="Gavin"/></a>
<a href="https://github.com/godot42x" title="godot42x"><img src="https://avatars.githubusercontent.com/u/79260851?v=4" width="42;" alt="godot42x"/></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/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/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="J.Chen"><img src="https://avatars.githubusercontent.com/u/61578993?v=4" width="42;" alt="J.Chen"/></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="Evan-k"><img src="https://avatars.githubusercontent.com/u/48147837?v=4" width="42;" alt="Evan-k"/></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/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/larry-xue" title="yujian(larry) xue"><img src="https://avatars.githubusercontent.com/u/48818060?v=4" width="42;" alt="yujian(larry) xue"/></a>
<a href="https://github.com/leauny" title="leauny"><img src="https://avatars.githubusercontent.com/u/42369176?v=4" width="42;" alt="leauny"/></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/gzttcydxx" title="gzttcydxx"><img src="https://avatars.githubusercontent.com/u/50025185?v=4" width="42;" alt="gzttcydxx"/></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/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/emoji-share" title="emoji-share🤪"><img src="https://avatars.githubusercontent.com/u/192275245?v=4" width="42;" alt="emoji-share🤪"/></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="Coder Duan"><img src="https://avatars.githubusercontent.com/u/69953511?v=4" width="42;" alt="Coder Duan"/></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/Zeng-qh" title="都一样"><img src="https://avatars.githubusercontent.com/u/40046415?v=4" width="42;" alt="都一样"/></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/lisheng741" title="芦荟柚子茶"><img src="https://avatars.githubusercontent.com/u/53617305?v=4" width="42;" alt="芦荟柚子茶"/></a>
<a href="https://github.com/rainbowatcher" title="rainbowatcher"><img src="https://avatars.githubusercontent.com/u/42316353?v=4" width="42;" alt="rainbowatcher"/></a>
<a href="https://github.com/HChenX" title="焕晨HChen"><img src="https://avatars.githubusercontent.com/u/123531821?v=4" width="42;" alt="焕晨HChen"/></a>
<a href="https://github.com/LebranceBW" title="落叶乌龟"><img src="https://avatars.githubusercontent.com/u/19501514?v=4" width="42;" alt="落叶乌龟"/></a>
<a href="https://github.com/LongYinStudio" title="敬培全"><img src="https://avatars.githubusercontent.com/u/42208852?v=4" width="42;" alt="敬培全"/></a>
<a href="https://github.com/Fengjing95" title="小枫"><img src="https://avatars.githubusercontent.com/u/51731411?v=4" width="42;" alt="小枫"/></a>
<a href="https://github.com/ZIDOUZI" title="子斗子"><img src="https://avatars.githubusercontent.com/u/53157536?v=4" width="42;" alt="子斗子"/></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/kele527" title="吹衣轻飏"><img src="https://avatars.githubusercontent.com/u/345445?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-fs"><img src="https://avatars.githubusercontent.com/u/77133741?v=4" width="42;" alt="swift-fs"/></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/ri-fumo" title="ri-fumo"><img src="https://avatars.githubusercontent.com/u/190000479?v=4" width="42;" alt="ri-fumo"/></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/openapphub" title="openapphub"><img src="https://avatars.githubusercontent.com/u/175949671?v=4" width="42;" alt="openapphub"/></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/zxx457" title="Xianxin Zeng"><img src="https://avatars.githubusercontent.com/u/114141362?v=4" width="42;" alt="Xianxin Zeng"/></a>
<a href="https://github.com/BingChunMoLi" title="冰彦糖"><img src="https://avatars.githubusercontent.com/u/44092516?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/kele527" title="吹衣轻飏"><img src="https://avatars.githubusercontent.com/u/345445?v=4" width="42;" alt="吹衣轻飏"/></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/ZIDOUZI" title="子斗子"><img src="https://avatars.githubusercontent.com/u/53157536?v=4" width="42;" alt="子斗子"/></a>
<a href="https://github.com/Fengjing95" title="小枫"><img src="https://avatars.githubusercontent.com/u/51731411?v=4" width="42;" alt="小枫"/></a>
<a href="https://github.com/LongYinStudio" title="敬培全"><img src="https://avatars.githubusercontent.com/u/42208852?v=4" width="42;" alt="敬培全"/></a>
<a href="https://github.com/LebranceBW" title="落叶乌龟"><img src="https://avatars.githubusercontent.com/u/19501514?v=4" width="42;" alt="落叶乌龟"/></a>
<a href="https://github.com/HChenX" title="焕晨HChen"><img src="https://avatars.githubusercontent.com/u/123531821?v=4" width="42;" alt="焕晨HChen"/></a>
<a href="https://github.com/rainbowatcher" title="rainbowatcher"><img src="https://avatars.githubusercontent.com/u/42316353?v=4" width="42;" alt="rainbowatcher"/></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/qwxingzhe" title="行者"><img src="https://avatars.githubusercontent.com/u/7071651?v=4" width="42;" alt="行者"/></a>
<a href="https://github.com/binscor" title="binscor"><img src="https://avatars.githubusercontent.com/u/37325821?v=4" width="42;" alt="binscor"/></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/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/isecret" title="Mao Wang"><img src="https://avatars.githubusercontent.com/u/15724152?v=4" width="42;" alt="Mao Wang"/></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/likeadmin-likeshop" title="likeadmin通过管理后台-likeshop全开源商城"><img src="https://avatars.githubusercontent.com/u/77180968?v=4" width="42;" alt="likeadmin通过管理后台-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="Foozi"><img src="https://avatars.githubusercontent.com/u/38535911?v=4" width="42;" alt="Foozi"/></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/notes-bin" title="notes-bin"><img src="https://avatars.githubusercontent.com/u/58727373?v=4" width="42;" alt="notes-bin"/></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/openapphub" title="openapphub"><img src="https://avatars.githubusercontent.com/u/175949671?v=4" width="42;" alt="openapphub"/></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/ri-fumo" title="ri-fumo"><img src="https://avatars.githubusercontent.com/u/190000479?v=4" width="42;" alt="ri-fumo"/></a>
<a href="https://github.com/shanhai1024" title="shanhai1024"><img src="https://avatars.githubusercontent.com/u/56210461?v=4" width="42;" alt="shanhai1024"/></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/suyangzuo" title="suyangzuo"><img src="https://avatars.githubusercontent.com/u/50766353?v=4" width="42;" alt="suyangzuo"/></a>
<a href="https://github.com/swift-fs" title="swift-fs"><img src="https://avatars.githubusercontent.com/u/77133741?v=4" width="42;" alt="swift-fs"/></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/tutourenshi" title="tutourenshi"><img src="https://avatars.githubusercontent.com/u/70181730?v=4" width="42;" alt="tutourenshi"/></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/xing133" title="xing133"><img src="https://avatars.githubusercontent.com/u/5336490?v=4" width="42;" alt="xing133"/></a>
<a href="https://github.com/giteeking" title="xunjian"><img src="https://avatars.githubusercontent.com/u/166626162?v=4" width="42;" alt="xunjian"/></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/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/daining810" title="dain"><img src="https://avatars.githubusercontent.com/u/125986872?v=4" width="42;" alt="dain"/></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/JinchuanL" title="ANDY"><img src="https://avatars.githubusercontent.com/u/68026794?v=4" width="42;" alt="ANDY"/></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/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/zhu0629" title="zhucong"><img src="https://avatars.githubusercontent.com/u/13188450?v=4" width="42;" alt="zhucong"/></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/HeZephyr" title="Zephyr He"><img src="https://avatars.githubusercontent.com/u/67893254?v=4" width="42;" alt="Zephyr He"/></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/Fuku-L" title="Foozi"><img src="https://avatars.githubusercontent.com/u/38535911?v=4" width="42;" alt="Foozi"/></a>
<a href="https://github.com/Furry-Monster" title="Furry-Monster"><img src="https://avatars.githubusercontent.com/u/158404543?v=4" width="42;" alt="Furry-Monster"/></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/Ding-Kyoma" title="HooinKyoma"><img src="https://avatars.githubusercontent.com/u/44542198?v=4" width="42;" alt="HooinKyoma"/></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/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/JetSquirrel" title="JetSquirrel"><img src="https://avatars.githubusercontent.com/u/20291255?v=4" width="42;" alt="JetSquirrel"/></a>
<a href="https://github.com/Jruing" title="Jruing"><img src="https://avatars.githubusercontent.com/u/31944565?v=4" width="42;" alt="Jruing"/></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/Lihuagreek" title="Lihuagreek"><img src="https://avatars.githubusercontent.com/u/51040740?v=4" width="42;" alt="Lihuagreek"/></a>
<a href="https://github.com/likeadmin-likeshop" title="likeadmin通过管理后台-likeshop全开源商城"><img src="https://avatars.githubusercontent.com/u/77180968?v=4" width="42;" alt="likeadmin通过管理后台-likeshop全开源商城"/></a>
<a href="https://github.com/liuyuhe666" title="Liu Yuhe"><img src="https://avatars.githubusercontent.com/u/171144077?v=4" width="42;" alt="Liu Yuhe"/></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/isecret" title="Mao Wang"><img src="https://avatars.githubusercontent.com/u/15724152?v=4" width="42;" alt="Mao Wang"/></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/13812700839" title="花殇"><img src="https://avatars.githubusercontent.com/u/58072506?v=4" width="42;" alt="花殇"/></a>
<a href="https://github.com/JinchuanL" title="ANDY"><img src="https://avatars.githubusercontent.com/u/68026794?v=4" width="42;" alt="ANDY"/></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/Attack825" title="Attack825"><img src="https://avatars.githubusercontent.com/u/68852184?v=4" width="42;" alt="Attack825"/></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/Blanket58" title="Blanket58"><img src="https://avatars.githubusercontent.com/u/39766189?v=4" width="42;" alt="Blanket58"/></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/Brid9e" title="brid9e"><img src="https://avatars.githubusercontent.com/u/85558909?v=4" width="42;" alt="brid9e"/></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/CharlotteZeng" title="hanchZ"><img src="https://avatars.githubusercontent.com/u/19461184?v=4" width="42;" alt="hanchZ"/></a>
<a href="https://github.com/ohto-ai" title="AI"><img src="https://avatars.githubusercontent.com/u/46275725?v=4" width="42;" alt="AI"/></a>
<a href="https://github.com/chinaphp" title="Coffee"><img src="https://avatars.githubusercontent.com/u/520827?v=4" width="42;" alt="Coffee"/></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/Damao2250" title="Damao"><img src="https://avatars.githubusercontent.com/u/19251992?v=4" width="42;" alt="Damao"/></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/demigodliu" title="DemigodLiu"><img src="https://avatars.githubusercontent.com/u/30372735?v=4" width="42;" alt="DemigodLiu"/></a>
<a href="https://github.com/dogxii" title="Dogxi"><img src="https://avatars.githubusercontent.com/u/106546046?v=4" width="42;" alt="Dogxi"/></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/whb1998a" title="Wafer"><img src="https://avatars.githubusercontent.com/u/44045064?v=4" width="42;" alt="Wafer"/></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/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/hi-liyan" title="李李李"><img src="https://avatars.githubusercontent.com/u/40056492?v=4" width="42;" alt="李李李"/></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/zkassing" title="You Kuan Zhang"><img src="https://avatars.githubusercontent.com/u/13414184?v=4" width="42;" alt="You Kuan Zhang"/></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/HeZephyr" title="Zephyr He"><img src="https://avatars.githubusercontent.com/u/67893254?v=4" width="42;" alt="Zephyr He"/></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/zhu0629" title="zhucong"><img src="https://avatars.githubusercontent.com/u/13188450?v=4" width="42;" alt="zhucong"/></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/y52y" title="Zyj"><img src="https://avatars.githubusercontent.com/u/51304324?v=4" width="42;" alt="Zyj"/></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/zlfyuan" title="bgbgPang"><img src="https://avatars.githubusercontent.com/u/19658018?v=4" width="42;" alt="bgbgPang"/></a>
<a href="https://github.com/cgluWxh" title="cgluWxh"><img src="https://avatars.githubusercontent.com/u/18211130?v=4" width="42;" alt="cgluWxh"/></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/Mieriki" title="Mieriki"><img src="https://avatars.githubusercontent.com/u/142009318?v=4" width="42;" alt="Mieriki"/></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><!--GAMFC-END-->
<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/Moeyuuko" title="Moeyuuko"><img src="https://avatars.githubusercontent.com/u/14266681?v=4" width="42;" alt="Moeyuuko"/></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/NianwenDan" title="NianwenDan"><img src="https://avatars.githubusercontent.com/u/74407127?v=4" width="42;" alt="NianwenDan"/></a>
<a href="https://github.com/Noryu-01" title="Noryu"><img src="https://avatars.githubusercontent.com/u/109856546?v=4" width="42;" alt="Noryu"/></a>
<a href="https://github.com/PILIHU2022" title="Spark"><img src="https://avatars.githubusercontent.com/u/100511118?v=4" width="42;" alt="Spark"/></a>
<a href="https://github.com/Perzch" title="Chunhwan"><img src="https://avatars.githubusercontent.com/u/67987641?v=4" width="42;" alt="Chunhwan"/></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/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/QDelta" title="QDelta"><img src="https://avatars.githubusercontent.com/u/60222316?v=4" width="42;" alt="QDelta"/></a>
<a href="https://github.com/Qliangw" title="Qliangw"><img src="https://avatars.githubusercontent.com/u/22791711?v=4" width="42;" alt="Qliangw"/></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/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/DataEraserC" title="Sacabambaspis"><img src="https://avatars.githubusercontent.com/u/102341238?v=4" width="42;" alt="Sacabambaspis"/></a>
<a href="https://github.com/N0x-xOn" title="shawing"><img src="https://avatars.githubusercontent.com/u/107191230?v=4" width="42;" alt="shawing"/></a>
<!--GAMFC-END-->
上图贡献者列表,由 [contributors](https://github.com/jaywcjlove/github-action-contributors) 自动生成贡献者图片。

968
README.md

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 635 KiB

BIN
appicon/audioer.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

BIN
appicon/copybook-generator.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
appicon/daybar.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

BIN
appicon/deskmark.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

BIN
appicon/devhub.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
appicon/devtutor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
appicon/file-sentinel.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

BIN
appicon/focus-cursor.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
appicon/iconed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

BIN
appicon/iconize-folder.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
appicon/key-clicker.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
appicon/keyzer.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

BIN
appicon/menuist.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

BIN
appicon/mousio-hint.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
appicon/mousio.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
appicon/musicer.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
appicon/palette-genius.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
appicon/paste-quick.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

BIN
appicon/quick-rss.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
appicon/regex-mate.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

BIN
appicon/resume-revise.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
appicon/scap.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

BIN
appicon/screen-test.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

BIN
appicon/symbol-scribe.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
appicon/textsound-saver.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
appicon/time-passage.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
appicon/vidcrop.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

BIN
appicon/videoer.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

BIN
appicon/vidwall-hub.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

BIN
appicon/vidwall.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

BIN
appicon/web-serve.png Executable file

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

1
assets/claude.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" height="1em" width="1em" viewBox="0 0 40 40"><path fill="currentColor" d="M7.75,26.28 L15.52,21.92 L15.65,21.54 L15.52,21.33 L15.14,21.33 L13.84,21.25 L9.4,21.13 L5.55,20.97 L1.82,20.77 L0.88,20.57 L0,19.41 L0.09,18.83 L0.88,18.3 L2.01,18.4 L4.51,18.57 L8.26,18.83 L10.98,18.99 L15.01,19.41 L15.65,19.41 L15.74,19.15 L15.52,18.99 L15.35,18.83 L11.47,16.2 L7.27,13.42 L5.07,11.82 L3.88,11.01 L3.28,10.25 L3.02,8.59 L4.1,7.4 L5.55,7.5 L5.92,7.6 L7.39,8.73 L10.53,11.16 L14.63,14.18 L15.23,14.68 L15.47,14.51 L15.5,14.39 L15.23,13.94 L13,9.91 L10.62,5.81 L9.56,4.11 L9.28,3.09 C9.18,2.67 9.11,2.32 9.11,1.89 L10.34,0.22 L11.02,0 L12.66,0.22 L13.35,0.82 L14.37,3.15 L16.02,6.82 L18.58,11.81 L19.33,13.29 L19.73,14.66 L19.88,15.08 L20.14,15.08 L20.14,14.84 L20.35,12.03 L20.74,8.58 L21.12,4.14 L21.25,2.89 L21.87,1.39 L23.1,0.58 L24.06,1.04 L24.85,2.17 L24.74,2.9 L24.27,5.95 L23.35,10.73 L22.75,13.93 L23.1,13.93 L23.5,13.53 L25.12,11.38 L27.84,7.98 L29.04,6.63 L30.44,5.14 L31.34,4.43 L33.04,4.43 L34.29,6.29 L33.73,8.21 L31.98,10.43 L30.53,12.31 L28.45,15.11 L27.15,17.35 L27.27,17.53 L27.58,17.5 L32.28,16.5 L34.82,16.04 L37.85,15.52 L39.22,16.16 L39.37,16.81 L38.83,18.14 L35.59,18.94 L31.79,19.7 L26.13,21.04 L26.06,21.09 L26.14,21.19 L28.69,21.43 L29.78,21.49 L32.45,21.49 L37.42,21.86 L38.72,22.72 L39.5,23.77 L39.37,24.57 L37.37,25.59 L34.67,24.95 L28.37,23.45 L26.21,22.91 L25.91,22.91 L25.91,23.09 L27.71,24.85 L31.01,27.83 L35.14,31.67 L35.35,32.62 L34.82,33.37 L34.26,33.29 L30.63,30.56 L29.23,29.33 L26.06,26.66 L25.85,26.66 L25.85,26.94 L26.58,28.01 L30.44,33.81 L30.64,35.59 L30.36,36.17 L29.36,36.52 L28.26,36.32 L26,33.15 L23.67,29.58 L21.79,26.38 L21.56,26.51 L20.45,38.46 L19.93,39.07 L18.73,39.53 L17.73,38.77 L17.2,37.54 L17.73,35.11 L18.37,31.94 L18.89,29.42 L19.36,26.29 L19.64,25.25 L19.62,25.18 L19.39,25.21 L17.03,28.45 L13.44,33.3 L10.6,36.34 L9.92,36.61 L8.74,36 L8.85,34.91 L9.51,33.94 L13.44,28.94 L15.81,25.84 L17.34,24.05 L17.33,23.79 L17.24,23.79 L6.8,30.57 L4.94,30.81 L4.14,30.06 L4.24,28.83 L4.62,28.43 L7.76,26.27 L7.75,26.28 Z"/></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

1
assets/leaf.svg Normal file
View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 44 50"><g fill="none" fill-rule="evenodd"><polygon fill="#FFF" points="0 18.234 21.191 0 43.403 18.234 43.403 18.365 21.702 35.818 0 18.365"/><path fill="#40C4FF" d="M21.8169,35.8142 L21.9452,35.8142 C21.9452,35.8142 21.9868,39.0876 21.9452,40.6557 C21.9036,42.2237 21.8169,40.6557 21.8169,40.6557 L0,23.1217 L0,18.2803 L21.8169,35.8142 Z"/><polygon fill="#3DC4FF" points="21.817 40.525 21.945 40.525 21.945 45.235 21.817 45.366 0 27.832 0 22.991"/><polygon fill="#FFF" fill-opacity=".25" points="21.817 40.525 21.945 40.525 21.945 45.235 21.817 45.366 0 27.832 0 22.991"/><polygon fill="#3DC4FF" points="21.817 45.236 21.945 45.105 21.945 49.684 21.817 49.815 0 32.281 0 27.702"/><polygon fill="#FFF" fill-opacity=".5" points="21.817 45.236 21.945 45.105 21.945 49.684 21.817 49.815 0 32.281 0 27.702"/><polygon fill="#E040FB" points="21.656 35.814 21.656 40.656 43.403 23.122 43.403 18.28"/><polygon fill="#E040FB" points="21.656 40.525 21.656 45.366 43.403 27.832 43.403 22.991"/><polygon fill="#FFF" fill-opacity=".25" points="21.656 40.525 21.656 45.366 43.403 27.832 43.403 22.991"/><polygon fill="#E040FB" points="21.656 45.236 21.656 49.815 43.403 32.412 43.403 27.702"/><polygon fill="#FFF" fill-opacity=".5" points="21.656 45.236 21.656 49.815 43.403 32.412 43.403 27.702"/><path fill="#1C1C1F" fill-rule="nonzero" d="M14.559,11.6222 C14.559,11.6222 24.812,11.948 27.5377,14.2818 C30.2635,16.6157 30.6498,20.725 28.4006,23.4601 C26.1514,26.1953 22.1185,26.5206 19.3927,24.1868 C16.667,21.8529 14.559,11.6222 14.559,11.6222 Z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

26
assets/nix.svg Normal file
View File

@@ -0,0 +1,26 @@
<svg fill="currentColor" height="1em" width="1em" viewBox="0 0 573 573" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g transform="translate(-44, 0)" fill-rule="nonzero">
<g transform="translate(-0, 0)">
<g transform="translate(179.2478, 344.2665) rotate(60) translate(-179.2478, -344.2665)translate(39.4675, 217.9911)" fill="#7EBAE4">
<polygon points="247.986334 -1.77635684e-15 165.324004 143.175778 7.10542736e-15 143.175778 31.5740916 197.862998 133.750004 197.862998 165.324004 252.550728 279.560554 54.68749"></polygon>
</g>
<g transform="translate(204.7907, 184.1915) rotate(120) translate(-204.7907, -184.1915)translate(65.0104, 57.9162)" fill="#5277C3">
<polygon points="247.986334 -1.77635684e-15 165.324004 143.175778 7.10542736e-15 143.175778 31.5740916 197.862998 133.750004 197.862998 165.324004 252.550728 279.560554 54.68749"></polygon>
</g>
<g transform="translate(356.1917, 126.2754) rotate(180) translate(-356.1917, -126.2754)translate(216.4114, 0)" fill="#7EBAE4">
<polygon points="247.986334 -1.77635684e-15 165.324004 143.175778 7.10542736e-15 143.175778 31.5740916 197.862998 133.750004 197.862998 165.324004 252.550728 279.560554 54.68749"></polygon>
</g>
<g transform="translate(482.0485, 228.4337) rotate(-120) translate(-482.0485, -228.4337)translate(342.2683, 102.1584)" fill="#5277C3">
<polygon points="247.986334 -1.77635684e-15 165.324004 143.175778 7.10542736e-15 143.175778 31.5740916 197.862998 133.750004 197.862998 165.324004 252.550728 279.560554 54.68749"></polygon>
</g>
<g transform="translate(456.5059, 388.5084) rotate(-60) translate(-456.5059, -388.5084)translate(316.7256, 262.233)" fill="#7EBAE4">
<polygon points="247.986334 -1.77635684e-15 165.324004 143.175778 7.10542736e-15 143.175778 31.5740916 197.862998 133.750004 197.862998 165.324004 252.550728 279.560554 54.68749"></polygon>
</g>
<g transform="translate(165.3253, 320.1492)" fill="#5277C3">
<polygon points="247.986334 -1.77635684e-15 165.324004 143.175778 7.10542736e-15 143.175778 31.5740916 197.862998 133.750004 197.862998 165.324004 252.550728 279.560554 54.68749"></polygon>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

4
assets/time-zones.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg viewBox="0 0 1024 1024" fill="currentColor" xmlns="http://www.w3.org/2000/svg" height="1em" width="1em">
<path d="M945 412H689c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h256c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM811 548H689c-4.4 0-8 3.6-8 8v48c0 4.4 3.6 8 8 8h122c4.4 0 8-3.6 8-8v-48c0-4.4-3.6-8-8-8zM477.3 322.5H434c-6.2 0-11.2 5-11.2 11.2v248c0 3.6 1.7 6.9 4.6 9l148.9 108.6c5 3.6 12 2.6 15.6-2.4l25.7-35.1v-.1c3.6-5 2.5-12-2.5-15.6l-126.7-91.6V333.7c.1-6.2-5-11.2-11.1-11.2z"/>
<path d="M804.8 673.9H747c-5.6 0-10.9 2.9-13.9 7.7-12.7 20.1-27.5 38.7-44.5 55.7-29.3 29.3-63.4 52.3-101.3 68.3-39.3 16.6-81 25-124 25-43.1 0-84.8-8.4-124-25-37.9-16-72-39-101.3-68.3s-52.3-63.4-68.3-101.3c-16.6-39.2-25-80.9-25-124 0-43.1 8.4-84.7 25-124 16-37.9 39-72 68.3-101.3 29.3-29.3 63.4-52.3 101.3-68.3 39.2-16.6 81-25 124-25 43.1 0 84.8 8.4 124 25 37.9 16 72 39 101.3 68.3 17 17 31.8 35.6 44.5 55.7 3 4.8 8.3 7.7 13.9 7.7h57.8c6.9 0 11.3-7.2 8.2-13.3-65.2-129.7-197.4-214-345-215.7-216.1-2.7-395.6 174.2-396 390.1C71.6 727.5 246.9 903 463.2 903c149.5 0 283.9-84.6 349.8-215.8 3.1-6.1-1.4-13.3-8.2-13.3z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

3
assets/uv.svg Normal file
View File

@@ -0,0 +1,3 @@
<svg width="41" height="41" viewBox="0 0 41 41" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M-5.28619e-06 0.168629L0.0843098 20.1685L0.151762 36.1683C0.161075 38.3774 1.95947 40.1607 4.16859 40.1514L20.1684 40.084L30.1684 40.0418L31.1852 40.0375C33.3877 40.0282 35.1683 38.2026 35.1683 36V36L37.0003 36L37.0003 39.9992L40.1683 39.9996L39.9996 -9.94653e-07L21.5998 0.0775689L21.6774 16.0185L21.6774 25.9998L20.0774 25.9998L18.3998 25.9998L18.4774 16.032L18.3998 0.0910593L-5.28619e-06 0.168629Z" fill="currentColor" />
</svg>

After

Width:  |  Height:  |  Size: 537 B

41
assets/wails.svg Normal file
View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="43px" height="25px" viewBox="0 0 43 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>wails</title>
<defs>
<linearGradient x1="-0.2%" y1="49.9996942%" x2="99.8%" y2="49.9996942%" id="linearGradient-1">
<stop stop-color="#E33232" offset="0%"></stop>
<stop stop-color="#6B000D" offset="100%"></stop>
</linearGradient>
<linearGradient x1="57.4612403%" y1="49.999806%" x2="105.910853%" y2="49.999806%" id="linearGradient-2">
<stop stop-color="#E33232" offset="0%"></stop>
<stop stop-color="#6B000D" offset="100%"></stop>
</linearGradient>
<linearGradient x1="37.15%" y1="49.9997381%" x2="137.15%" y2="49.9997381%" id="linearGradient-3">
<stop stop-color="#E33232" offset="0%"></stop>
<stop stop-color="#6B000D" offset="100%"></stop>
</linearGradient>
<linearGradient x1="112.55%" y1="91.3957%" x2="32.3601%" y2="31.6497%" id="linearGradient-4">
<stop stop-color="#E33232" offset="0%"></stop>
<stop stop-color="#6B000D" offset="100%"></stop>
</linearGradient>
<linearGradient x1="11.95%" y1="49.9998072%" x2="111.95%" y2="49.9998072%" id="linearGradient-5">
<stop stop-color="#E33232" offset="0%"></stop>
<stop stop-color="#6B000D" offset="100%"></stop>
</linearGradient>
<linearGradient x1="25.85%" y1="50.0000968%" x2="125.85%" y2="50.0000968%" id="linearGradient-6">
<stop stop-color="#E33232" offset="0%"></stop>
<stop stop-color="#6B000D" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="wails" transform="translate(-2, -16)">
<polygon id="Path" fill="url(#linearGradient-1)" fill-rule="nonzero" transform="translate(7.0309, 29.4785) scale(-1, 1) rotate(1.5717) translate(-7.0309, -29.4785)" points="11.9494683 28.4327958 2.11242576 30.5241355 3.85520888 28.6651669"></polygon>
<polygon id="Path" fill="url(#linearGradient-2)" fill-rule="nonzero" transform="translate(36.5284, 31.0714) scale(-1, 1) rotate(-8.5836) translate(-36.5284, -31.0714)" points="45.1336155 28.6949336 37.2037952 36.9916435 27.9231538 35.590792 37.9375746 32.7974273 30.7582105 31.7134351 40.7726313 28.9200704 33.6016056 27.8360782 43.2241214 25.1511127"></polygon>
<polygon id="Path" fill="url(#linearGradient-3)" fill-rule="nonzero" transform="translate(26.7683, 36.8365) scale(-1, 1) rotate(-54.8194) translate(-26.7683, -36.8365)" points="31.562747 36.2208083 28.8692495 35.9745456 27.514805 43.5625128 20.0037949 32.9116542 28.8230753 30.1104168 33.532848 30.1104168"></polygon>
<polygon id="Path" fill="url(#linearGradient-4)" fill-rule="nonzero" transform="translate(25.014, 20.7986) scale(-1, 1) rotate(128.5441) translate(-25.014, -20.7986)" points="21.9947129 16.4027699 26.1092974 16.4027699 27.4413571 19.4221053 28.0333837 25.1943641"></polygon>
<polygon id="Path" fill="url(#linearGradient-5)" fill-rule="nonzero" transform="translate(36.3109, 20.727) scale(-1, 1) rotate(-14.7678) translate(-36.3109, -20.727)" points="38.8713907 20.875032 39.5522206 22.562306 33.0695361 18.8917449"></polygon>
<polygon id="Path" fill="#FFFFFF" transform="translate(23.7731, 24.2307) rotate(-70.4489) translate(-23.7731, -24.2307)" points="23.1059371 22.8465329 24.9921646 25.6148058 22.5539813 23.7394335"></polygon>
<polygon id="Path" fill="url(#linearGradient-6)" fill-rule="nonzero" transform="translate(21.3064, 24.9941) scale(-1, 1) rotate(-6.2086) translate(-21.3064, -24.9941)" points="19.70206 25.0327874 20.4365745 24.298273 35.7067436 25.4580326 32.0341713 28.4347491 22.8720698 27.6229174 19.70206 30.2130473 29.8692865 32.493908 26.4286662 35.2773312 17.3052234 32.1846388 13.7872857 26.2698644 6.90604496 14.7109263"></polygon>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

1
assets/zed.svg Normal file
View File

@@ -0,0 +1 @@
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" fill="currentColor" height="1em" width="1em"><path d="M141.744 113.262C126.017 113.262 113.262 126.008 113.262 141.744L113.262 768.331 56.3 768.331 56.3 141.744C56.3 94.554 94.554 56.3 141.744 56.3L904.837 56.3C942.903 56.3 961.959 102.315 935.044 129.23L465.054 599.228 597.444 599.228 597.444 540.481 654.406 540.481 654.406 613.469C654.406 637.061 635.279 656.191 611.684 656.191L408.088 656.191 310.184 754.091 754.091 754.091 754.091 398.075 811.053 398.075 811.053 754.091C811.053 785.553 785.55 811.053 754.091 811.053L253.221 811.053 153.537 910.737 882.256 910.737C897.983 910.737 910.737 897.992 910.737 882.256L910.737 255.669 967.7 255.669 967.7 882.256C967.7 929.446 929.446 967.7 882.256 967.7L119.163 967.7C81.096 967.7 62.041 921.685 88.956 894.769L557.166 426.556 426.556 426.556 426.556 483.519 369.594 483.519 369.594 412.316C369.594 388.723 388.721 369.594 412.316 369.594L614.128 369.594 713.813 269.909 269.909 269.909 269.909 625.925 212.947 625.925 212.947 269.909C212.947 238.446 238.446 212.947 269.909 212.947L770.775 212.947 870.46 113.262 141.744 113.262Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

183
docs/7zip.md Normal file
View File

@@ -0,0 +1,183 @@
7zip 备忘清单
====
7z7-Zip / p7zip命令用于创建、更新、查看与解压压缩包常见格式包括 `7z``zip``tar` 等。
入门
----
### 7z 用法
```shell
$ 7z <命令> [<开关>..] <压缩包名称> [<文件名>..]
```
<!--rehype:className=wrap-text-->
常见命令:
- `a` 添加文件到压缩包(创建/追加)
- `x` 解压(保留完整路径)
- `e` 解压(不保留目录结构)
- `l` 列出压缩包内容
- `t` 测试压缩包完整性
安装:
```shell
# Debian/Ubuntu
$ sudo apt install p7zip-full
# RHEL/CentOS/Fedora
$ sudo yum install p7zip p7zip-plugins
# macOS (Homebrew)
$ brew install sevenzip
```
### 命令
<!--rehype:wrap-class=col-span-2-->
参数 | 描述 | 参数 | 描述
:--- | :--- | :--- | :---
`a` | **add** 添加/创建压缩包 | `x` | **extract** 解压(保留完整路径)
`e` | **extract** 解压(不保留目录名) | `l` | **list** 列出压缩包内容
`t` | **test** 测试压缩包完整性 | `h` | **hash** 计算文件哈希
`u` | **update** 更新压缩包内文件 | `d` | **delete** 从压缩包中删除文件
`rn` | **rename** 重命名压缩包内文件 | `i` | **info** 查看支持的格式信息
`b` | **benchmark** 性能测试 | &nbsp; | &nbsp;
### 语法形式和选项
:- | :-
:- | :-
**基本语法** | `7z <命令> [开关...] 压缩包 [文件...]`
**创建 7z 压缩包** | `7z a -t7z archive.7z 文件/目录...`
**创建 zip 压缩包** | `7z a -tzip archive.zip 文件/目录...`
**解压(保留路径)** | `7z x archive.7z -o输出目录`
**解压(不保留目录)** | `7z e archive.7z -o输出目录`
**列出内容** | `7z l archive.7z`
**测试完整性** | `7z t archive.7z`
**计算哈希** | `7z h -scrcSHA256 文件...`
**创建分卷压缩包** | `7z a archive.7z 大文件.iso -v1g`
<!--rehype:className=style-list-arrow-->
### 常用开关示例
<!--rehype:wrap-class=col-span-2 row-span-1-->
参数 | 描述 | 参数 | 描述
:--- | :--- | :--- | :---
`--` | 停止解析后续参数为开关 | `-t{Type}` | 指定压缩格式(如 `-t7z` / `-tzip`),默认为`7z`
`-o{目录}` | 指定输出目录(解压) | `-p{密码}` | 设置密码
`-r[-\|0]` | 递归子目录(`-r` / `-r-` / `-r0` | `-mx[N]` | 压缩等级:`-mx0`(不压缩) `-mx1`(最快)… `-mx9`(最强)
`-mmt[N]` | 线程数(如 `-mmt4` | `-y` | 所有询问默认回答 Yes
`-ao{a\|s\|t\|u}` | 覆盖策略a 全覆盖 / s 跳过 / t 仅覆盖旧文件 / u 自动重命名 | &nbsp; | &nbsp;
`-v{Size}[b\|k\|m\|g]` | 分卷(如 `-v1g` / `-v500m` | `-sdel` | 压缩后删除源文件
`-sfx[{name}]` | 生成自解压压缩包SFX | `-bd` | 关闭进度指示器
`-bb[0-3]` | 输出日志等级 | `-bt` | 输出执行时间统计
`-so` | 输出到 stdout | `-si[{name}]` | 从 stdin 读入数据
`-scrc[CRC64\|SHA1\|SHA256\|*]` | 指定校验/哈希算法(用于 `x/e/h` | `@listfile` | 从列表文件读取文件名
`-i...` | 仅包含匹配项include | `-x...` | 排除匹配项exclude
`-slt` | `l` 命令输出技术信息 | `-spf` | 使用绝对路径
7z 压缩示例
--------
### 创建新的 7z 压缩包
```shell
$ 7z a -t7z archive.7z file1 file2 dir1/
```
### 创建分卷压缩包
```shell
$ 7z a big.7z big.iso -v1g
```
压缩时会自动根据文件名后缀判断压缩格式,所以可以忽略 `-t` 开关
### 设置压缩等级与线程数
```shell
$ 7z a archive.7z dir1/ -mx9 -mmt4
```
### 排除目录或文件
<!--rehype:wrap-class=col-span-2-->
```shell
$ 7z a archive.7z example/ '-x!example/node_modules/*' '-x!example/dist/*'
```
<!--rehype:className=wrap-text-->
### 从列表文件读取待压缩文件
```shell
$ 7z a archive.7z @files.txt
```
`files.txt` 每行一个文件路径(相对或绝对路径均可)。
### 压缩后删除源文件
```shell
$ 7z a archive.7z dir1/ -sdel
```
7z 解压示例
--------
### 解压并保留目录结构(推荐)
```shell
$ 7z x archive.7z
```
### 解压到指定目录
```shell
$ 7z x archive.7z -o./output
```
### 解压但不保留目录结构
```shell
$ 7z e archive.7z -o./output
```
### 解压时覆盖策略
```shell
$ 7z x archive.7z -o./output -aoa
```
### 仅解压匹配的文件
```shell
$ 7z x archive.7z '*.log' -o./output
```
### 列出压缩包内容(含技术信息)
```shell
$ 7z l archive.7z -slt
```
### 测试压缩包完整性
```shell
$ 7z t archive.7z
```
### 计算文件哈希SHA256
```shell
$ 7z h -scrcSHA256 file1 file2
```
另见
----
- [7-Zip 官网](https://www.7-zip.org/) _(7-zip.org)_
- [7-Zip 简体中文网站](https://sparanoid.com/lab/7z/) _(7-zip.org)_
- [7z 命令帮助文档](https://jaywcjlove.github.io/linux-command/c/7z.html) _(linux-command)_

View File

@@ -1043,6 +1043,7 @@ echo "${args[@]}"
将参数放入数组中,然后追加
### 调试模式
<!--rehype:wrap-class=col-span-2-->
启用调试模式,会把脚本中的每条命令的执行情况打印出来。它可以在整个会话或脚本上运行,也可以在脚本内以编程方式启用。
@@ -1056,11 +1057,23 @@ $ bash -x myscript.sh
```bash
#!/bin/bash
set -x # Enable debugging
# some code here
set +x # Disable debugging output.
set -x # 启用调试模式(显示执行的每一行命令)
# 此处放置要执行的代码
set +x # 关闭调试输出(停止显示命令)
```
### 命令行光标移动类
| 快捷键 | 作用 |
|----------|-------------|
| `Ctrl` + `A` | 移动到命令行开头 |
| `Ctrl` + `E` | 移动到命令行末尾 |
| `Alt` + `B` | 向左移动一个“词” |
| `Alt` + `F` | 向右移动一个“词” |
| `Ctrl` + `B` | 向左移动一个字符(←) |
| `Ctrl` + `F` | 向右移动一个字符(→) |
<!--rehype:className=shortcuts left-align-->
Bash 颜色
----

View File

@@ -616,3 +616,4 @@ Facebook 受众建议
- [Awesome ChatGPT Prompts](https://github.com/f/awesome-chatgpt-prompts)
- [原始资料](https://github.com/Fechin/reference/blob/main/source/_posts/chatgpt.md)
- [ChatGPT](https://chatgpt.com/)
- [Comprehensive Cheatsheet](https://github.com/bg-write/chatGPT-cheatsheet)

594
docs/cisco-devices.md Normal file
View File

@@ -0,0 +1,594 @@
Cisco 网络设备备忘清单
===
本清单提供了 Cisco 网络设备常用命令示例
清单内容基于 [**Cisco Packet Tracer**](https://www.netacad.com/cisco-packet-tracer) 进行
模式
---
### 模式简介
<!--rehype:wrap-class=col-span-3-->
是指命令行界面的操作层级,不同模式可执行不同范围的命令
以下列出了一些基本的模式
| 模式 | 命令提示符 | 进入方式 |
| :-: | :-: | :-: |
| 用户模式 | `用户名称>` | 默认进入 |
| 特权模式 | `用户名称#` | 通过 enable 进入 |
| 全局配置模式 | `用户名称(config)#` | 通过 config terminal 进入 |
| VLAN 模式 | `用户名称(config-vlan)#` | 通过 vlan vlan-ID 进入 |
| 接口配置模式 | `用户名称(config-if)#` | 通过 interface 接口 进入 |
| Line 模式 | `用户名称(config-line)#` | 通过 line vty 端口 进入 |
<!--rehype:className=show-header-->
### 进入特权模式
```shell
enable # 进入到特权模式
```
### 进入全局模式
```shell
configure terminal # 进入到全局模式
```
### 进入 line 模式
```shell
line vty 0 # 进入 line 模式 的 0 端口
```
### 退回上级模式
退回到上一级模式, 如全局模式退到特权模式,特权模式退到普通模式
```shell
exit
```
### 强制执行
在任何模式下均可
```shell
do ~ # 强制执行 ~
```
### 取消命令
```shell
no ~ # 取消命令 ~
```
基本操作
---
### 修改主机名称
需要在全局模式下进行
```shell
hostname NAME # 修改名称为 NAME
```
### 查看设备配置
需要在特权模式下进行
```shell
show running-config # 查看设备配置
```
### 关闭端口
需要在接口配置模式下进行
```shell
shutdown ~ # 关闭端口 ~
```
### 设置进入特权模式密码
<!--rehype:wrap-class=col-span-2-->
需要在全局模式下进行
#### 明文密码
```shell
enable password PASSWORD # 设置进入 特权模式 的密码为 PASSWORD
```
#### 密文密码
```shell
enable secret PASSWORD # 设置进入 特权模式 的密码为 PASSWORD
```
vlan 配置
---
### 创建并进入 vlan
需要在全局模式下进行
vlan-ID 可以是任何符合 vlan 范围的数字,如果 vlan 存在,则直接进入
```shell
vlan vlan-ID
```
### 修改 vlan 名称
在进入 vlan 后,将当前 vlan 名称变更为 NAME
```shell
name NAME
```
### 取消 vlan
需要离开 vlan 后,在全局模式下才能取消 vlan
```shell
no vlan vlan-ID
```
### 配置 vlan trunk
<!--rehype:wrap-class=col-span-2-->
#### 首先创建需要配置的对应 vlan
```sh
vlan vlan-id
```
#### 添加端口到 vlan 当中
```sh
# 进入 范围在 1 - 10 的所有接口
interface range f0/1 - 10
# 进入 范围在 1 - 10 的所有接口 和 单独的 f0/12 接口
interface range f0/1 - 11, f0/12
# 进入 单个 接口 f0/1
interface f0/1
```
#### 进入接口后
```sh
# vlan-id 为 需要将 当前接口 添加到 的 vlan id为数字
switchport access vlan vlan-id
```
#### 进入两个交换机相连接口
```sh
# 设置模式 trunk
switchport mode trunk
```
#### 在 trunk 中 添加或删除 vlan
```sh
# 首先需要进入 配置 trunk 的接口
switchport trunk allowed vlan add vlan-id
switchport trunk allowed vlan remove vlan-id
```
#### 查看 trunk 配置
```sh
# 特权模式下
# interface-id 为配置 trunk 的接口名称
show interfaces interface-id switchport
```
接口操作
---
### 进入接口
需要在全局模式下进行
#### 单个接口
```shell
# 进入单个接口
# 进入接口 f0/1
interface f0/1
```
#### 多个接口
```shell
# 进入接口 f0/1 直到 f0/8 和 f0/10
interface range f0/1 - 8, f0/10
```
### 添加接口到 vlan 中
将进入到的当前接口添加到对应 vlan-ID 的 vlan 中
```shell
switchport access vlan vlan-ID
```
### 将接口从 vlan 中移出
取消添加到对应 vlan-ID 的 vlan 的接口
```shell
no switchport access vlan vlan-ID
```
设备调试
---
### 配置 console 口令
设置进入终端的密码
```shell
# 配置端口
line console 0
# 设置密码为 123
password 123
# 载入
login
```
### 配置远程
<!--rehype:wrap-class=row-span-2 col-span-2-->
#### 配置远程用户
```shell
# 0 为一个用户
# 0 - 2 为 0 1 2 三个用户
# 0 - 15 为 16 个用户
line vty 0
line vty 0 - 2
line vty 0 - 15
# 配置密码为 123456
password 123456
# 载入设置
login
```
#### 配置接口
```shell
# 进入 vlan 1
interface vlan 1
# 配置 ip 地址
# 192.168.100.254 为需要配置的 ip 地址
# 255.255.255.0 为子网掩码
ip address 192.168.100.254 255.255.255.0
# 启动远程
# no 为取消 ~
# shutdown 为关闭
# no shutdown 就是取消关闭,即启动
no shutdown
```
#### 连接远程
```shell
# 需要先配置远程的电脑 ip 地址
# 需要与 配置的 远程 ip 地址频段一致
# 如 远程 ip 地址为 192.168.100.254
# 电脑 ip 地址需要与 远程 ip 地址在同一频段 即 192.168.100.~
# 然后通过在 电脑 的命令提示行使用 ping 命令查看是否连接成功
# 连接成功之后通过 telnet 访问远程
telnet 192.168.100.254
```
路由配置
---
### 静态路由
<!--rehype:wrap-class=col-span-2-->
```sh
# 首先需要配置 IP 地址
## 电脑配置
### IP地址配置 假设为192.168.1.1
### 默认网关 需与IP地址同段假设为192.168.1.254
## 路由器配置
### 首先进入与电脑连接的接口 (假设为 f0/0
### 需在 全局模式 下
interface f0/0
### 进入接口后
### 在 接口模式 下
ip address 192.168.1.254 255.255.255.0
### 192.168.1.254 为 在 电脑所配置的默认网关
### 255.255.255.0 为 子网掩码
### 然后启动接口 否则无法连接
no shutdown
### 进入两个路由器相连的接口 (假设为 s1/0
interface s1/0
### 同样需要配置 IP地址
ip address 10.10.10.1 255.0.0.0
### 然后配置时钟
clock rate 64000
### 64000 为 时钟速率
### 同时也需要启动接口
no shutdown
# 配置跳转路由
## 在 全局模式 下
ip route 192.168.1.0 255.255.255.0 10.10.10.1
### 其中 192.168.1.0 为 需要到达的目标 IP地址
### 第四位 0 表示无指定值,即 1 - 254 的值都能匹配
### 255.255.255.0 为 子网掩码
### 目标地址有几位明确的就需要几位255
### 10.10.10.1 为 下一跳地址
### 下一跳可以理解为 公交车的下一站
### 而目标 IP地址则为公交车的终点站
```
### 默认路由
<!--rehype:wrap-class=col-span-2-->
```sh
# 首先需要清空所有路由
## 然后重新配置
ip route 0.0.0.0 0.0.0.0 0.0.0.0
# 第一个 0.0.0.0 为 目标 IP地址 固定不变
## 0 表示无指定目标,因此匹配所有 IP地址
# 第二个 0.0.0.0 为 目标地址的子网掩码 固定不变
## 目标 IP地址 有几位不为 0 则有几位是 255
## 如:目标 IP地址 为10.10.0.0
## 则 子网掩码为 255.255.0.0
# 第三个 0.0.0.0 为 下一跳的 IP地址 随下一跳地址变化
## 如:下一跳地址为 10.10.10.1 则 命令为
ip route 0.0.0.0 0.0.0.0 10.10.10.1
```
### 单臂路由
<!--rehype:wrap-class=col-span-2-->
```sh
# 首先需要在 PC 配置IP和网关 (假设分别为 192.168.1.1、192.168.1.254
# 然后进入交换机创建 vlan (假设 vlan 为 1
vlan 1
## 并将与PC相连的接口 添加到 vlan 当中 (假设接口为 f0/1
interface f0/1
## 配置接口为access口
switchport mode access
switchport access vlan 1
## 然后在于路由器相连的接口中放通vlan (假设为 g0/0接口
int g0/0
## 设置 trunk
switchport mode trunk
## 放通所有vlan
switchport trunk allowed vlan all
# 进入路由器
## 首先需要开启
### 需要进入与交换机相连的接口 (假设为 f0/1
interface f0/1
### 开启接口
no sh
## 然后进入 f0/1.1 (f0/1.1 为 f0/1 的子接口)
int f0/1.1
## 配置封装 trunk 到 vlan 中 (假设 vlan 为 1
encapsulation dot1Q 1
## 随后配置 IP 和 掩码
ip address 192.168.1.254 255.255.255.0
```
### 动态路由
<!--rehype:wrap-class=col-span-2-->
```sh
# 首先配置电脑IP及网关 (假设为 192.168.1.1、192.168.1.254
# 然后配置路由器
## 进入与电脑相连的接口 (假设为 f0/1开启并配置IP地址
int f0/1
no sh
ip address 192.168.1.254 255.255.255.0
## 然后进入与其它路由器相连的接口 (假设为 f0/0开启
## 并为接口配置IP (假设为 10.10.10.1
int f0/0
ip address 10.10.10.1 255.0.0.0
## 然后回到全局模式开始RIP配置
route rip
network 192.168.1.0
## network 后面跟的IP地址为与当前路由器所相连的接口所配置的IP0表示全网段
## 即 network 后,所有在 192.168.1.1 - 254 这个范围的IP都能联通
```
### OSPF 配置
<!--rehype:wrap-class=col-span-2-->
```sh
# 添加环回地址
## 进入环回接口
interface loopback 0
## 配置ip
ip address IP-Address subnet-mask
## 配置 ospf 点对点
ip ospf network point-to-point
# OSPF 路由进程
## 进程号可自定义
## 用于识别当前路由器上的多个进程
router ospf 进程号
## 发布网段在区域
### 网段 如192.168.10.~
### 网段可以是与子网地址,网络地址,接口地址...
### 正向掩码若为 255.0.0.0 则反向掩码为 0.255.255.255
### 255.255.255.192 - 0.0.0.63
### 区域号可自定义
network 网段 反向掩码 area 区域号
## 设置 router ID
### ID 为 IP地址
### 是在 OSPF区域当中唯一标识路由器的IP地址
### 优先选取最大的环回接口IP
### 若没有则选取最大物理接口IP
router-id ID
## 修改 接口 cost值
### OSPF 使用 cost值来决定最佳路径
### cost值类似权重值
### 需要首先进入对应接口当中
ip ospf cost cost值
## 配置 OSPF计时器
### TIME 为 时间 单位为 s
ip ospf hello-interval TIME(s)
ip ospf dead-interval TIME(s)
```
交换机配置
---
### VTP协议
<!--rehype:wrap-class=col-span-2-->
```sh
# 可以通过 VTP协议 在一台交换机上集中进行配置变更
# 所做的变更会自动传播到当前网络中的所有交换机上
# VTP 域
## 域内的每台交换机必须使用相同 VTP域名
## 一台交换机只能加入一个 VTP域
## 交换机必须是相连的,且之间须启用 Trunk 中继
# VTP 模式
## 服务器模式
vtp mode server
### 充当VTP服务器控制它所在域中的VLAN生成和修改并向外发送VTP通告
## 客户机模式
vtp mode client
### 此模式的交换机不允许增删VLAN监听其它交换机的VTP通告并修改对应配置
## 透明模式
vtp mode transparent
### 不参与VTP可增删本地VLAN但不向外通告也不接受VTP通告修改自身VLAN数据库可转发VTP通告
# 流程
## 首先创建一个 VTP服务器
vtp mode server
### 配置 VTP域名 为 VTP
vtp domain VTP
## 然后创建 VTP客户端
vtp mode client
### 需要在创建 VTP客户端前 先配置 trunk
### 进入当前交换机与 VTP服务器交换机 相连的接口 (假设为 f0/24
int f0/24
switchport mode trunk
### VTP服务器交换机 与 当前交换机相连接口 在 f0/24 设 trunk 时自动变为 trunk
### 不需要再手动配置 trunk
### 并将客户端配置到 VTP 这个 VTP域名 下
vtp domain VTP
# VTP 相关命令
## 查看配置
do sh vtp status
## VTP 版本
vtp version versions
### VTP 版本号大的 VLAN信息 将覆盖 VTP版本号低的
## 设置VTP口令 为 VTPPASSWORD
vtp password VTPPASSWORD
### 只有在 域名和口令 相同的情况下 才会同步 vlan
```
### STP 协议
<!--rehype:wrap-class=col-span-2-->
```shell
# 概念
## RBRoot Bridge 根网桥
### 网络中倒数的根,整个网络中只存在一个根
## RPRoot Port根端口
## DPdesign Port指定端口
# 命令
## 查看STP的配置
show spanning-tree
## 查看 f0/0 端口状态
show spanning-tree interface f0/0
## 查看某个 vlan 下的 stp 配置信息
show spanning-tree vlan vlan-id
## 配置生成树模式为 STP 或 RSTP
spanning-tree mode pvst
spanning-tree mode rapid-pvst
## 配置交换机在 VLAN1 中的优先级
spanning-tree vlan 1 priority <0-61440>
## 配置为 vlan1 的根网桥
spanning-tree vlan root primary
## 配置为 vlan1 的次根网桥
spanning-tree vlan 1 root secondary
## 将 f0/0 接口在 vlan1 生成树的路径开销变更为 18
interface f0/0
spanning-tree vlan 1 cost 18
## 将 f0/0 接口在 vlan1 生成树的端口优先级变更为 16
interface f0/0
spanning-tree vlan 1 port-priority 16
```
### 三层交换机
<!--rehype:wrap-class=col-span-2-->
```shell
# 首先在三层交换机上启动路由
ip routing
# 然后配置vlan的ip地址
int vlan vlan-id
## 添加IP地址
ip address ip-address subnet-mask
## 启动当前接口
no sh
# 然后进入交换机与添加到vlan中的ip地址一致的终端相连的接口
## 将当前接口添加到赋予当前接口连接的终端ip地址一致的vlan中
```
### 三层交换机DHCP配置
<!--rehype:wrap-class=col-span-2-->
```sh
# 首先创建与连接的电脑终端数量一致的vlan
# 然后进入到与中介交换机相连的接口
## 使用trunk 放通创建的vlan
switchport trunk allowed vlan vlan-id/all
# 进入创建的vlan当中
int vlan vlan-id
## 配置当前vlan的IP为对应当前vlan的终端IP
ip address IP-Address subnet-mask
## 开启当前vlan接口
no sh
# 对 DHCP 地址池地址进行排除
## 排除的为vlan的ip地址
ip dhcp exculded-address IP-Address
# 创建DHCP地址池
## DHCP_AddressName 为可自定义的地址名称
ip dhcp pool DHCP_AddressName
## 设置当前DHCP地址池网段
### ip-address 为可自定义的ip地址
### subnet-mask 为可自定义的子网掩码
### 需要注意子网掩码需要与对应vlan的子网掩码一致
### 否则无法接通
network ip-address subnet-mask
## 设置DNS DNS-Address 为可自定义的 dns 地址
dns-server DNS-Address
## 设置默认网关 IP-Address 为可自定义的IP地址
default-route IP-Address
# 进入中介交换机
## 创建与三层交换机相同的vlan
## 进入与三层交换机相连的接口
### 将接口模式设为 trunk 并 放通创建的vlan
### 可使用 all 代替全部vlan
switchport mode trunk
switchport trunk allowed vlan vlan-id,vlan-id...
## 进入与电脑终端相连的接口
### 将接口分配到指定ip的vlan下
### 最后在电脑终端IP配置为DHCP即可
```

433
docs/claude.md Normal file
View File

@@ -0,0 +1,433 @@
ClaudeCode 备忘清单
===
ClaudeCode 命令行开发工具快速参考备忘单。
CLI 参考
---
### 命令行
<!--rehype:wrap-class=col-span-2-->
| 命令 | 描述 | 示例 |
| --- | --- | --- |
| `claude` | 启动交互式 REPL | `claude` |
| `claude "query"` | 使用初始提示启动 REPL | `claude "explain this project"` |
| `claude -p "query"` | 通过 SDK 查询,然后退出 | `claude -p "explain this function"` |
| `cat file \| claude -p "query"` | 处理管道内容 | `cat logs.txt \| claude -p "explain"` |
| `claude -c` | 继续最近的对话 | `claude -c` |
| `claude -c -p "query"` | 通过 SDK 继续 | `claude -c -p "Check for type errors"` |
| `claude -r "<session-id>" "query"` | 通过 ID 恢复会话 | `claude -r "abc123" "Finish this PR"` |
| `claude update` | 更新到最新版本 | `claude update` |
| `claude mcp` | 配置模型上下文协议 (MCP) 服务器 | 请参阅 [Claude Code MCP 文档](https://docs.anthropic.com/zh-CN/docs/claude-code/mcp)。 |
<!--rehype:className=left-align-->
### CLI 标志
<!--rehype:wrap-class=row-span-2-->
使用这些命令行标志自定义 Claude Code 的行为:
| 标志 | 描述 | 示例 |
| --- | --- | --- |
| `--add-dir` | 添加额外的工作目录供 Claude 访问(验证每个路径是否作为目录存在) | `claude --add-dir ../apps ../lib` |
| `--allowedTools` | 除了 [settings.json 文件](https://docs.anthropic.com/zh-CN/docs/claude-code/settings) 之外,应该在不提示用户许可的情况下允许的工具列表 | `"Bash(git log:*)" "Bash(git diff:*)" "Read"` |
| `--disallowedTools` | 除了 [settings.json 文件](https://docs.anthropic.com/zh-CN/docs/claude-code/settings) 之外,应该在不提示用户许可的情况下禁止的工具列表 | `"Bash(git log:*)" "Bash(git diff:*)" "Edit"` |
| `--print`, `-p` | 打印响应而不使用交互模式(有关编程使用详细信息,请参阅 [SDK 文档](https://docs.anthropic.com/zh-CN/docs/claude-code/sdk) | `claude -p "query"` |
| `--append-system-prompt` | 附加到系统提示(仅与 `--print` 一起使用) | `claude --append-system-prompt "Custom instruction"` |
| `--output-format` | 为打印模式指定输出格式(选项:`text``json``stream-json` | `claude -p "query" --output-format json` |
| `--input-format` | 为打印模式指定输入格式(选项:`text``stream-json` | `claude -p --output-format json --input-format stream-json` |
| `--verbose` | 启用详细日志记录,显示完整的轮次输出(在打印和交互模式中都有助于调试) | `claude --verbose` |
| `--max-turns` | 在非交互模式下限制代理轮次数量 | `claude -p --max-turns 3 "query"` |
| `--model` | 使用最新模型的别名(`sonnet``opus`)或模型的全名为当前会话设置模型 | `claude --model claude-sonnet-4-20250514` |
| `--permission-mode` | 在指定的[权限模式](iam#permission-modes)下开始 | `claude --permission-mode plan` |
| `--permission-prompt-tool` | 指定一个 MCP 工具来处理非交互模式下的权限提示 | `claude -p --permission-prompt-tool mcp_auth_tool "query"` |
| `--resume` | 通过 ID 恢复特定会话,或在交互模式下选择 | `claude --resume abc123 "query"` |
| `--continue` | 在当前目录中加载最近的对话 | `claude --continue` |
| `--dangerously-skip-permissions` | 跳过权限提示(谨慎使用) | `claude --dangerously-skip-permissions` |
<!--rehype:className=style-list-arrow squarefill-->
### 内置斜杠命令
<!--rehype:wrap-class=col-span-2-->
| 命令 | 用途 |
| --- | --- |
| `/add-dir` | 添加额外的工作目录 |
| `/agents` | 管理用于专门任务的自定义AI子代理 |
| `/bug` | 报告错误将对话发送给Anthropic |
| `/clear` | 清除对话历史 |
| `/compact [instructions]` | 压缩对话,可选择性地提供重点指令 |
| `/config` | 查看/修改配置 |
| `/cost` | 显示令牌使用统计(请参阅[成本跟踪指南](https://docs.anthropic.com/zh-CN/docs/claude-code/costs#using-the-cost-command)了解订阅特定详情) |
| `/doctor` | 检查您的Claude Code安装的健康状况 |
| `/help` | 获取使用帮助 |
| `/init` | 使用CLAUDE.md指南初始化项目 |
| `/login` | 切换Anthropic账户 |
| `/logout` | 从您的Anthropic账户登出 |
| `/mcp` | 管理MCP服务器连接和OAuth身份验证 |
| `/memory` | 编辑CLAUDE.md内存文件 |
| `/model` | 选择或更改AI模型 |
| `/permissions` | 查看或更新[权限](https://docs.anthropic.com/zh-CN/docs/claude-code/iam#configuring-permissions) |
| `/pr_comments` | 查看拉取请求评论 |
| `/review` | 请求代码审查 |
| `/status` | 查看账户和系统状态 |
| `/terminal-setup` | 安装Shift+Enter键绑定用于换行仅限iTerm2和VSCode |
| `/vim` | 进入vim模式以在插入和命令模式之间切换 |
<!--rehype:className=left-align-->
键盘快捷键
---
### 通用控制
| 快捷键 | 描述 | 上下文 |
| --- | --- | --- |
| `Ctrl+C` | 取消当前输入或生成 | 标准中断 |
| `Ctrl+D` | 退出 Claude Code 会话 | EOF 信号 |
| `Ctrl+L` | 清除终端屏幕 | 保留对话历史 |
| `上/下箭头` | 导航命令历史 | 回调之前的输入 |
| `Esc` + `Esc` | 编辑上一条消息 | 双击 Esc 键修改 |
| `Shift+Tab` | 切换权限模式 | 在自动接受模式、计划模式和正常模式之间切换 |
<!--rehype:className=left-align shortcuts-->
### 多行输入
| 方法 | 快捷键 | 上下文 |
| --- | --- | --- |
| 快速转义 | `\` + `Enter` | 在所有终端中有效 |
| macOS 默认 | `Option+Enter` | macOS 上的默认设置 |
| 终端设置 | `Shift+Enter` | 在 `/terminal-setup` 之后 |
| 控制序列 | `Ctrl+J` | 多行换行符 |
| 粘贴模式 | 直接粘贴 | 用于代码块、日志 |
<!--rehype:className=left-align shortcuts-->
### 快速命令
| 快捷键 | 描述 | 注释 |
| --- | --- | --- |
| 开头的 `#` | 内存快捷键 - 添加到 CLAUDE.md | 提示文件选择 |
| 开头的 `/` | 斜杠命令 | 参见[斜杠命令](https://docs.anthropic.com/zh-CN/docs/claude-code/slash-commands) |
| 开头的 `!` | Bash 模式 | 直接运行命令并将执行输出添加到会话中 |
<!--rehype:className=left-align shortcuts-->
Vim 编辑器模式
---
### 模式切换
| 命令 | 操作 | 从模式 |
| --- | --- | --- |
| `Esc` | 进入 NORMAL 模式 | INSERT |
| `i` | 在光标前插入 | NORMAL |
| `I` | 在行首插入 | NORMAL |
| `a` | 在光标后插入 | NORMAL |
| `A` | 在行尾插入 | NORMAL |
| `o` | 在下方打开新行 | NORMAL |
| `O` | 在上方打开新行 | NORMAL |
### 导航NORMAL 模式)
| 命令 | 操作 |
| --- | --- |
| `h`/`j`/`k`/`l` | 向左/下/上/右移动 |
| `w` | 下一个单词 |
| `e` | 单词末尾 |
| `b` | 上一个单词 |
| `0` | 行首 |
| `$` | 行尾 |
| `^` | 第一个非空白字符 |
| `gg` | 输入开头 |
| `G` | 输入末尾 |
### 编辑NORMAL 模式)
| 命令 | 操作 |
| --- | --- |
| `x` | 删除字符 |
| `dd` | 删除行 |
| `D` | 删除到行尾 |
| `dw`/`de`/`db` | 删除单词/到末尾/向后 |
| `cc` | 更改行 |
| `C` | 更改到行尾 |
| `cw`/`ce`/`cb` | 更改单词/到末尾/向后 |
| `.` | 重复上次更改 |
Hooks 参考
---
### 配置
* `~/.claude/settings.json` 用户设置
* `.claude/settings.json` 项目设置
* `.claude/settings.local.json` 本地项目设置(不提交)
* 企业管理策略设置
### 结构
<!--rehype:wrap-class=col-span-2 row-span-2-->
```json
{
"hooks": {
"EventName": [
{
"matcher": "ToolPattern",
"hooks": [
{ "type": "command", "command": "your-command-here" }
]
}
]
}
}
```
#### <pur>matcher</pur> 匹配工具名称的模式,区分大小写(仅适用于 `PreToolUse` 和 `PostToolUse`
* 简单字符串精确匹配:`Write` 仅匹配 Write 工具
* 支持正则表达式:`Edit|Write``Notebook.*`
* 使用 `*` 匹配所有工具。您也可以使用空字符串(`""`)或留空 `matcher`
#### <pur>hooks</pur> 当模式匹配时要执行的命令数组
* `type`:目前仅支持 `"command"`
* `command`:要执行的 bash 命令(可以使用 `$CLAUDE_PROJECT_DIR` 环境变量)
* `timeout`:(可选)命令应该运行多长时间(以秒为单位),在取消该特定命令之前。
### 项目特定的 Hook 脚本
```json {9}
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/check-style.sh"
}
]
}
]
}
}
```
可通过环境变量 `CLAUDE_PROJECT_DIR` 引用项目中的脚本,确保无论 Claude 当前目录如何都能正常使用(仅在生成 hook 命令时可用)
Hook 事件
---
### PreToolUse
#### 常见匹配器
* `Task` - 子代理任务(参见[子代理文档](https://docs.anthropic.com/zh-CN/docs/claude-code/sub-agents)
* `Bash` - Shell 命令
* `Glob` - 文件模式匹配
* `Grep` - 内容搜索
* `Read` - 文件读取
* `Edit`、`MultiEdit` - 文件编辑
* `Write` - 文件写入
* `WebFetch`、`WebSearch` - Web 操作
在 Claude 创建工具参数之后、处理工具调用之前运行。
### 其它 Hook
Hook | 描述
--- | ---
`PostToolUse` | 在工具成功完成后立即运行。
`UserPromptSubmit` | 当用户提交提示时、Claude 处理之前运行。这允许您根据提示/对话添加额外的上下文、验证提示或阻止某些类型的提示。
`Stop` | 当主 Claude Code 代理完成响应时运行。如果停止是由于用户中断而发生的,则不会运行。
`SubagentStop` | 当 Claude Code 子代理Task 工具调用)完成响应时运行。
<!--rehype:className=style-list-arrow square-->
### Notification
当 Claude Code 发送通知时运行。通知在以下情况下发送:
Hook | 描述
--- | ---
Claude 需要您的权限来使用工具。 | 示例“Claude needs your permission to use Bash”
提示输入已空闲至少 `60` 秒。 | “Claude is waiting for your input”
<!--rehype:className=style-list-arrow square-->
### PreCompact
在 Claude Code 即将运行压缩操作之前运行。
#### 匹配器
<!--rehype:style=text-align:left;-->
Hook | 描述
--- | ---
`manual` | 从 `/compact` 调用
`auto` | 从自动压缩调用(由于上下文窗口已满)
<!--rehype:className=style-list-arrow square-->
### SessionStart
当 Claude Code 启动新会话或恢复现有会话时运行(目前确实会在底层启动新会话)
#### 匹配器
<!--rehype:style=text-align:left;-->
* `startup` - 从启动调用
* `resume` - 从 `--resume`、`--continue` 或 `/resume` 调用
* `clear` - 从 `/clear` 调用
* `compact` - 从自动或手动压缩调用。
对于加载开发上下文(如现有问题或代码库的最近更改)很有用。
### SessionEnd
#### hook 输入中的 reason 字段将是以下之一
<!--rehype:style=text-align:left;-->
* `clear` - 使用 /clear 命令清除会话
* `logout` - 用户注销
* `prompt_input_exit` - 用户在提示输入可见时退出
* `other` - 其他退出原因
当 Claude Code 会话结束时运行。对于清理任务、记录会话统计信息或保存会话状态很有用。
Hook 输入
---
### 示例
Hooks 通过 `stdin` 接收包含会话信息和事件特定数据的 JSON 数据:
```json
{
// 通用字段
session_id: string
// 对话 JSON 的路径
transcript_path: string
// 调用 hook 时的当前工作目录
cwd: string
// 事件特定字段
hook_event_name: string
...
}
```
### PreToolUse 输入
`tool_input` 的确切模式取决于工具。
```json {5}
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "PreToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "/path/to/file.txt",
"content": "file content"
}
}
```
### PostToolUse 输入
`tool_input` 和 `tool_response` 的确切模式取决于工具。
```json {5}
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "PostToolUse",
"tool_name": "Write",
"tool_input": {
"file_path": "/path/to/file.txt",
"content": "file content"
},
"tool_response": {
"filePath": "/path/to/file.txt",
"success": true
}
}
```
### Notification 输入
```json {5}
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "Notification",
"message": "Task completed successfully"
}
```
### UserPromptSubmit 输入
```json {5}
{
"session_id": "abc123",
"transcript_path": "/Users/.../.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "UserPromptSubmit",
"prompt": "Write a function to calculate the factorial of a number"
}
```
### Stop 和 SubagentStop 输入
```json {4}
{
"session_id": "abc123",
"transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"hook_event_name": "Stop",
"stop_hook_active": true
}
```
当 Claude Code 已经因为 `stop hook` 而继续时,`stop_hook_active` 为 `true`。检查此值或处理记录以防止 Claude Code 无限运行。
### PreCompact 输入
```json {4}
{
"session_id": "abc123",
"transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"hook_event_name": "PreCompact",
"trigger": "manual",
"custom_instructions": ""
}
```
对于 `manual``custom_instructions` 来自用户传递给 `/compact` 的内容。对于 `auto``custom_instructions` 为空。
### SessionStart 输入
```json {4}
{
"session_id": "abc123",
"transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"hook_event_name": "SessionStart",
"source": "startup"
}
```
### SessionEnd 输入
```json {5}
{
"session_id": "abc123",
"transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
"cwd": "/Users/...",
"hook_event_name": "SessionEnd",
"reason": "exit"
}
```
另见
----
* [Claude 代码参考](https://docs.anthropic.com/zh-CN/docs/claude-code/cli-reference) _(docs.anthropic.com)_
* [送你一张Claude Code速查表](https://mp.weixin.qq.com/s/LbQbzvXh49Qo22nArTv4Og) _(weixin.qq.com)_

View File

@@ -192,6 +192,15 @@ attrib命令可以列出或修改磁盘上文件的属性
`netstat -s` | 查看正在使用的所有协议使用情况
`nbtstat -A ip` | 对方136到139其中一个端口开了的话就可查看对方最近登陆的用户名
### taskkill 命令
参数 | action
:--- | :--
`taskkill /f | 强制终止进程(最常用,防止进程无响应)
`taskkill /im 映像名` | 通过进程名称结束例如taskkill /im notepad.exe
`taskkill /pid 进程号` | 通过 PID 结束,通常配合 netstat -ano 查询到的 PID 使用
`taskkill /t` | 终止指定的进程及其子进程
`taskkill /s 远程IP` | 结束远程指定机器上的任务
启动程序
--------
@@ -209,7 +218,7 @@ attrib命令可以列出或修改磁盘上文件的属性
`cliconfg` | SQL SERVER 客户端网络实用工具
`cmstp` | 连接管理器配置文件安装程序
`compmgmt.msc` | 计算机管理
`omexp.msc` | 打开系统组件服务
`comexp.msc` | 打开系统组件服务
`control` | 控制面版
### 启动程序(二)

View File

@@ -30,7 +30,7 @@ Hello Quick Reference
int number = 5; // 整数
float f = 0.95; // 浮点数
double PI = 3.14159; // 浮点数
char yes = 'Y'; // 特点
char yes = 'Y'; // 字符
std::string s = "ME"; // 字符串(文本)
bool isRight = true; // 布尔值
// 常量
@@ -322,19 +322,19 @@ else
| Example | Meaning |
|----------------|------------------------|
| `exp1 && exp2` | Both are true _(AND)_ |
| `exp1 || exp2` | Either is true _(OR)_ |
| <code>exp1 &#124;&#124; exp2</code> | Either is true _(OR)_ |
| `!exp` | `exp` is false _(NOT)_ |
#### 位运算符
| Operator | Description |
|----------|-------------------------|
| `a & b` | Binary AND |
| `a | b` | Binary OR |
| `a ^ b` | Binary XOR |
| `a ~ b` | Binary One's Complement |
| `a << b` | Binary Shift Left |
| `a >> b` | Binary Shift Right |
| 运算符 | 描述 |
|--------|------|
| `a & b` | 按位与 |
| <code>a &#124; b</code> | 按位或 |
| `a ^ b` | 按位异或 |
| `~a` | 按位取反 |
| `a << b` | 左移 |
| `a >> b` | 右移 |
### 三元运算符
@@ -614,14 +614,14 @@ auto func = []() -> return_type { };
```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
auto func2 = [&, val1]() -> string
{
return str1 == std::to_string(val1)
? str1 : str2;
@@ -646,6 +646,128 @@ std::for_each(vec.begin(), vec.end(),
});
```
## C++智能指针
### 智能指针基础
<!--rehype:wrap-class=row-span-2-->
```cpp
#include <memory>
// 创建独占所有权的指针
std::unique_ptr<int> p1 = std::make_unique<int>(42);
// 不能复制,只能移动
std::unique_ptr<int> p2 = std::move(p1);
// p1 现在为 nullptr
// 创建共享所有权的指针
std::shared_ptr<int> sp1 = std::make_shared<int>(42);
// 可以复制,引用计数增加
std::shared_ptr<int> sp2 = sp1;
// 获取引用计数
std::cout << sp1.use_count(); // 输出: 2
// 创建弱引用,不增加引用计数
std::weak_ptr<int> wp = sp1;
```
### unique_ptr
```cpp
// 创建方式1使用 make_unique (C++14)
auto p1 = std::make_unique<int>(42);
// 创建方式2直接构造
std::unique_ptr<int> p2(new int(42));
// 访问资源
std::cout << *p1 << std::endl;
*p1 = 100;
// 获取原始指针(不转移所有权)
int* raw = p1.get();
// 释放所有权并返回原始指针
int* released = p1.release();
// p1 现在为 nullptr
// 替换管理的对象
p1.reset(new int(50));
```
### shared_ptr
```cpp
// 创建方式1使用 make_shared
auto sp1 = std::make_shared<int>(42);
// 创建方式2直接构造
std::shared_ptr<int> sp2(new int(42));
// 复制和共享所有权
std::shared_ptr<int> sp3 = sp1;
std::cout << sp1.use_count(); // 输出: 2
// 访问资源
std::cout << *sp1 << std::endl;
*sp1 = 100; // 所有指向该资源的shared_ptr都会看到这个修改
// 重置指针
sp1.reset(); // sp1变为nullptr引用计数减1
```
### weak_ptr
```cpp
std::shared_ptr<int> sp = std::make_shared<int>(42);
std::weak_ptr<int> wp = sp;
// 检查引用对象是否存在
if (auto locked = wp.lock()) {
std::cout << *locked << std::endl; // 输出: 42
} else {
std::cout << "对象已被销毁" << std::endl;
}
// 检查是否过期
bool is_expired = wp.expired(); // false
// 获取引用计数
std::cout << wp.use_count(); // 输出: 1
// 当所有shared_ptr都被销毁时
sp.reset();
if (wp.expired()) {
std::cout << "对象已被销毁" << std::endl;
}
```
### 循环引用问题
```cpp
struct Node {
std::string name;
std::shared_ptr<Node> next;
// 使用weak_ptr避免循环引用
std::weak_ptr<Node> parent;
Node(const std::string& n) : name(n) {}
~Node() { std::cout << "销毁: " << name << std::endl; }
};
// 创建循环引用
void createCycle() {
auto node1 = std::make_shared<Node>("Node1");
auto node2 = std::make_shared<Node>("Node2");
node1->next = node2;
node2->parent = node1; // 使用weak_ptr避免循环引用
// 函数结束时node1和node2会被正确销毁
// 如果parent也是shared_ptr则会造成内存泄漏
}
```
## C++多线程
### 多线程介绍
@@ -926,7 +1048,7 @@ int val = result.get();
extern double foo(int val) {}
std::future<double> result =
async(foo, 5);
std::async(foo, 5);
//返回值类型
std::future_status status;
@@ -935,7 +1057,7 @@ status = result.wait_for(
std::chrono::seconds(1)
);
// 等待到某一时间点
status = result.wait_for(
status = result.wait_until(
std::chrono::now() +
std::chrono::seconds(1)
);
@@ -1108,7 +1230,7 @@ C++ 预处理器
```cpp
#ifdef DEBUG
console.log('hi');
std::cout << "hi" << std::endl;
#elif defined VERBOSE
...
#else

View File

@@ -1321,6 +1321,261 @@ var result = students
["Charlie","Damon","David"]
```
事件和委托
----
### 介绍
在 .NET 中,委托支持后期绑定,允许调用方在运行时提供方法的一部分,而不是在创建委托时定义完整算法,从而增强了灵活性和扩展性。
### 多播委托
<!--rehype:wrap-class=col-span-2 row-span-6-->
我们预先提供这些可用的方法
```cs
public void Sub(int x, int y)
{
Console.WriteLine("x-y=" + (x - y));
}
public void Mul(int x, int y)
{
Console.WriteLine("x*y=" + (x * y));
}
```
定义一个委托类型
```cs
public delegate void MyDelegate3(int x, int y);
```
定义一个方法,接收委托作为参数
```cs
public void MyMethod3(int x, int y, MyDelegate3 myDelegate)
{
myDelegate(x, y);
}
```
定义另一个委托类型
```cs
public delegate void MyDelegate4(int x, int y);
```
定义一个方法,接收委托作为参数
```cs
public void MyMethod4(int x, int y, MyDelegate4 myDelegate)
{
myDelegate(x, y);
}
```
定义一个方法,接收委托作为参数
```cs
public void MyMethod5(int x, int y, MyDelegate3 myDelegate, MyDelegate4 myDelegate2)
{
myDelegate(x, y);
myDelegate2(x, y);
}
```
#### 多播委托
```cs
MyDelegate3 myDelegate31 = new MyDelegate3(Sub);
MyDelegate4 myDelegate41 = new MyDelegate4(Mul);
```
调用 MyMethod3 方法,并传入委托作为参数
```cs
MyMethod3(10, 5, myDelegate31);
// output:
// x-y=5
```
调用 MyMethod4 方法,并传入委托作为参数
```cs
MyMethod4(10, 5, myDelegate41);
// output:
// x*y=50
```
调用 MyMethod5 方法,并传入委托作为参数
```cs
MyMethod5(10, 5, myDelegate31, myDelegate41);
// output:
// x-y=5
// x*y=50
```
### 定义委托类型
使用 `delegate` 关键字定义委托
```cs
public delegate void MyDelegate(
int x, string y
);
```
上述委托对应的函数实现应该类似:
```cs
public void MyMethod(int x, string y);
```
### 创建委托实例
```cs
// 创建委托实例
MyDelegate myDelegate = new MyDelegate(
MyMethod
);
```
### 调用委托
```cs
// 调用委托,传入对应类型的参数
myDelegate(10, "Hello");
```
### 委托作为参数
```cs
// 定义另一个委托类型
public delegate int MyDelegate2(
int x, int y
);
// 定义一个方法,接收委托作为参数
public int MyMethod2(
int x, int y, MyDelegate2 myDelegate
)
{
return myDelegate(x, y);
}
// 创建委托实例
MyDelegate2 myDelegate2 = new MyDelegate2(
Add
);
// 调用 MyMethod2 方法,并传入委托作为参数
int result = MyMethod2(
10, 20, myDelegate2
);
```
### Action 委托
Action 委托的变体最多可包含 16 个参数,且返回类型为 `void`
```cs
// 创建一个Action
public Action<int, string> myAction;
// 给Action赋值
myAction = (x, y) => Console.WriteLine(
"x+y=" + (x + y)
);
// 直接调用Action
myAction(10, "Hello");
// 使用 null 合并运算符调用Action
myAction?.Invoke(10, "Hello");
```
### Func 委托
<!--rehype:wrap-class=row-span-2-->
Func 委托的变体可包含最多16个参数返回类型可以是任意类型 T
```cs
// 创建一个Func,最后一个参数是返回类型
public Func<int, int, string> myFunc;
// 给Func赋值
myFunc = (x, y) => "x+y=" + (x + y);
// 调用Func
string result = myFunc(10, 20);
// 使用 null 合并运算符调用Func
string result2 = myFunc?.Invoke(10, 20);
```
事件与委托类似,都是后期绑定机制。实际上,事件是建立在委托基础上的一种语言支持,它是 C# 对委托的封装,提供了更面向对象的编程模型,并实现了观察者模式。
### 事件定义
<!--rehype:wrap-class=col-span-2-->
```cs
// 使用 event 关键字定义事件
public event EventHandler<EventArgs> MyEvent;
```
### 事件订阅
<!--rehype:wrap-class=col-span-2-->
我们实现定义一个方法作为事件处理器,并订阅事件
```cs
public void MyEventHandler(object sender, EventArgs e)
{
// 事件处理逻辑
// ...
}
```
```cs
// 订阅事件
MyEvent += MyEventHandler;
// 取消订阅事件
MyEvent -= MyEventHandler;
```
### 事件触发
```cs
// 触发事件
MyEvent?.Invoke(this, new EventArgs());
```
### 事件参数
<!--rehype:wrap-class=col-span-2-->
```cs
// 定义事件参数
public class MyEventArgs : EventArgs
{
public int Value { get; set; }
}
// 新的Handler
public void MyEventHandler2(object sender, MyEventArgs e)
{
// 事件处理逻辑,这里可以获取到事件参数
Console.WriteLine("事件参数的值:" + e.Value);
}
// 触发事件
// output:
// 事件参数的值10
MyEvent?.Invoke(this, new MyEventArgs { Value = 10 });
```
语法糖
----

View File

@@ -8,17 +8,17 @@ Docker Compose 备忘清单
### Docker Compose 是什么?
- `Docker-compsoe` 是一个开源项目,用于定义和运行多容器 `Docker` 应用程序的工具。由 `Docker` 社区维护
- 通过`YAML` 文件配置应用程序的服务,以便可以使用一命令启动、停止重启整个应用程序
- **Docker Compose** 是由 [Docker](./docker.md) 社区维护的开源工具,用于定义和运行多容器应用
- 通过[YAML](./yaml.md) 文件配置服务,可用一命令启动、停止重启整个应用。
- [Docker Compose 开源地址](https://github.com/docker/compose)
- [Docker Compose 发行地址](https://github.com/docker/compose/releases) _github.com_
### 基本概念
- **服务 (services):** 一个服务指的是一个容器,即一个应用程序的一个实例。
- **容器 (container):** `Docker` 容器,其中运行着应用程序的一个实例。
- **镜像 (image):** `Docker` 镜像,用于创建容器的模板。
- **Docker-Compose 文件:** 一个 `YAML` 文件,描述了应用程序的各个服务以及它们之间的关系、配置等信息。
- **容器 (container):** [Docker](./docker.md) 容器,其中运行着应用程序的一个实例。
- **镜像 (image):** [Docker](./docker.md) 镜像,用于创建容器的模板。
- **Docker-Compose 文件:** 一个 [YAML](./yaml.md) 文件,描述了应用程序的各个服务以及它们之间的关系、配置等信息。
### Docker-Compose 文件结构
@@ -30,6 +30,13 @@ Docker Compose 备忘清单
### 安装
<!--rehype:wrap-class=row-span-2-->
Docker 20.10 起CLI 支持插件机制,官方已将 Compose 迁移为 CLI 插件。推荐使用 `docker compose`(空格,无横线),旧项目如需兼容 `docker-compose` 可安装 `docker-compose-plugin` 或使用软链接。
```bash
sudo ln -s /usr/lib/docker/cli-plugins/docker-compose /usr/local/bin/docker-compose
```
<!--rehype:className=wrap-text-->
对于 Ubuntu 和 Debian运行
```bash
@@ -154,13 +161,29 @@ docker info --format '{{range .ClientInfo.Plugins}}{{if eq .Name "compose"}}{{.P
| `docker compose ps` | 查看容器状态 |
<!--rehype:className=left-align-->
### 其他命令
<!--rehype:wrap-class=col-span-3-->
```bash
docker compose up -d --remove-orphans --pull always --force-recreate
```
| 参数 | 说明|
|-----|----|
| `-d / --detach` | 后台运行容器。|
| `--remove-orphans` | 删除孤儿容器和网络配置。|
| `--pull always` | 每次启动前都从远程仓库拉取最新镜像,确保使用最新镜像,而不是本地缓存。还可以用--pull missing只拉不存在的镜像或 --pull never不拉取。|
| `--force-recreate` | 强制重新创建容器,即使配置或镜像没有变化。|
<!--rehype:className=left-align-->
Docker Compose 配置
---
### 示例配置文件
<!--rehype:wrap-class=col-span-2-->
`docker-compose` 的配置文件是一个 `YAML` 文件,用于定义和运行多容器 Docker 应用程序。通常命名为 `docker-compose.yml`,它使用单一的 YAML 文件来定义多个容器的集合,以及它们之间的依赖关系和服务。以下是一份 `docker-compose.yml` 文件的配置模板,包含了常用配置项和解释:
`docker-compose` 使用 [YAML](./yaml.md) 文件定义和运行多容器应用,通常命名为 `docker-compose.yml`(新版本建议用 `compose.yaml`)。
该文件集中描述多个容器的服务、依赖关系等。下面是一个包含常用配置项和说明的模板:
```yml
name: myapp
@@ -210,9 +233,9 @@ volumes: # 定义数据卷
- 使用 Docker-Compose 可以简化多容器应用程序的部署和管理,但需要注意容器之间的依赖关系和通信。
- 配置文件中的缩进必须使用空格,不能使用制表符。
- 可以使用环境变量来动态设置配置项,如数据库密码。
- 当你修改了 `docker-compose.yml` 文件后,需要重新运行 `docker-compose up` 来使改动生效。
- 使用 `docker-compose build` 仅重建镜像,而不启动容器。
- 使用 `docker-compose restart` 重启容器。
- 当你修改了 `docker-compose.yml` 文件后,需要重新运行 `docker compose up` 来使改动生效。
- 使用 `docker compose build` 仅重建镜像,而不启动容器。
- 使用 `docker compose restart` 重启容器。
- 记得清理不再需要的容器和镜像,以避免磁盘空间不足。
### 使用环境变量

View File

@@ -351,24 +351,6 @@ $ docker volume ls # 检查卷
$ docker volume prune # 清理未使用的卷
```
### Docker Compose
<!--rehype:wrap-class=row-span-2-->
:- | :-
:- | :-
`docker-compose up` | 创建和启动容器
`docker-compose up -d` | 以分离模式创建和启动容器
`docker-compose down` | 停止和删除容器、网络、映像和卷
`docker-compose logs` | 查看容器的输出
`docker-compose restart` | 重启所有服务
`docker-compose pull` | 拉取所有服务的镜像
`docker-compose build` | 构建所有服务的镜像
`docker-compose config` | 验证并查看 Compose 文件
`docker-compose scale <service_name>=<replica>` | 为服务指定容器个数
`docker-compose top` | 显示正在运行的进程
`docker-compose run -rm -p 2022:22 web bash` | 启动 Web 服务并运行 bash 作为其命令,删除旧容器
<!--rehype:className=left-align-->
### Docker Services
:- | :-
@@ -393,27 +375,6 @@ $ docker volume prune # 清理未使用的卷
`docker stack rm <appname>` | 拆掉一个应用程序
<!--rehype:className=left-align-->
### Docker Machine
<!--rehype:wrap-class=col-span-2-->
:- | :-
:- | :-
`docker-machine create --driver virtualbox myvm1` | 创建虚拟机Mac、Win7、Linux
`docker-machine create -d hyperv --hyperv-virtual-switch "myswitch" myvm1` | Win10
`docker-machine env myvm1` | 查看有关您的节点的基本信息
`docker-machine ssh myvm1 "docker node ls"` | 列出集群中的节点
`docker-machine ssh myvm1 "docker node inspect <node ID>"` | 检查节点
`docker-machine ssh myvm1 "docker swarm join-token -q worker"` | 查看加入令牌
`docker-machine ssh myvm1` | 打开与 VM 的 SSH 会话; 输入“exit”结束
`docker-machine ssh myvm2 "docker swarm leave"` | 让工人离开群体
`docker-machine ssh myvm1 "docker swarm leave -f"` | 让主人离开,杀群
`docker-machine start myvm1` | 启动当前未运行的 VM
`docker-machine stop $(docker-machine ls -q)` | 停止所有正在运行的虚拟机
`docker-machine rm $(docker-machine ls -q)` | 删除所有虚拟机及其磁盘映像
`docker-machine scp docker-compose.yml myvm1:~` | 将文件复制到节点的主目录
`docker-machine ssh myvm1 "docker stack deploy -c <file> <app>"` | 部署应用
<!--rehype:className=left-align-->
### docker 主要命令
<!--rehype:wrap-class=row-span-3-->
@@ -474,18 +435,34 @@ $ docker volume prune # 清理未使用的卷
`docker image` | 管理镜像
`docker manifest` | 管理 Docker 镜像清单和清单列表
`docker network` | 管理网络
`docker node` | 管理 Swarm 节点
`docker plugin` | 管理插件
`docker scan*` | Docker 扫描Docker Inc.v0.16.0
`docker secret` | 管理 Docker 机密
`docker service` | 管理服务
`docker stack` | 管理 Docker 堆栈
`docker swarm` | 管理群
`docker system` | 管理 Docker
`docker trust` | 管理对 Docker 映像的信任
`docker volume` | 管理卷
`docker search` | 搜索镜像
<!--rehype:className=left-align-->
### 功能状态
<!--rehype:wrap-class=row-span-3-->
截至 2025 年 8 月最新官方信息以下功能处于维护模式建议迁移到Kubernetes或者其他编排工具。
| 命令 | 用途 | 状态说明 |
| ---------------- | ----------- | ---------- |
| `docker swarm` | 管理 Swarm 集群 | 维护模式 |
| `docker service` | Swarm 服务管理 | 维护模式 |
| `docker stack` | Swarm 多服务部署 | 维护模式 |
| `docker node` | Swarm 节点管理 | 维护模式 |
| `docker plugin` | 插件管理 | 生态活跃度低,维护中 |
已废弃或被移除
| 命令 | 用途 | 取代方式 |
| ---------------------- | ----------------- | ---------------------------------------------- |
| `docker-machine` | 创建/管理远程 Docker 主机 | 使用 cloud provider CLI 或 SSH + `docker context` |
| `docker trust` | 内容信任Notary v1 | 迁移到 **Notary v2**(镜像签名) |
| `docker app` | CNAB 应用包管理 | 已并入 Compose/其他工具 |
| `docker search`(旧 API | Docker Hub 搜索 | 用 Hub Web API 或 CLI 插件 |
| `docker manifest`(旧版本) | 多平台镜像管理 | 已集成到 `docker buildx imagetools` |
### docker 全局参数
```bash
@@ -692,7 +669,7 @@ $ docker run -d --name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v $HOME/portainer:/data \
portainer/portainer-ee:latest
portainer/portainer-ce:latest
```
### Nginx

125
docs/dotnet-cli.md Normal file
View File

@@ -0,0 +1,125 @@
.NET CLI 备忘清单
===
本备忘单总结了 [.NET](https://learn.microsoft.com/zh-cn/dotnet/core/tools/) 命令行接口 (CLI) 工具,以供快速参考
.NET CLI 备忘清单
---
<!--rehype:style=display: none;-->
### 介绍
`.NET CLI` 命令由 **驱动程序(`dotnet`**、**命令**、**参数** 和 **选项** 组成。典型流程如下:
```bash
# 创建控制台应用
dotnet new console
# 构建并指定输出目录
dotnet build --output ./build_output
# 运行构建结果
dotnet ./build_output/my_app.dll
```
### 基本命令
<!--rehype:wrap-class=col-span-2 row-span-2-->
| 命令 | 说明 | 示例 |
|--------------|--------------|--------------|
| `new` | 创建新项目或文件模板 | `dotnet new console` |
| `restore` | 还原项目依赖项 | `dotnet restore` |
| `build` | 构建项目 | `dotnet build` |
| `publish` | 发布应用以部署 | `dotnet publish -c Release -o ./publish`|
| `run` | 运行项目 | `dotnet run` |
| `test` | 运行测试(使用 xUnit/NUnit 等) | `dotnet test` |
| `vstest` | 运行已编译的测试程序集 | `dotnet vstest ./bin/Debug/test.dll` |
| `pack` | 打包为 NuGet 包 | `dotnet pack` |
| `migrate` | 迁移旧版项目(已弃用) | `dotnet migrate` |
| `clean` | 清理构建输出 | `dotnet clean` |
| `sln` | 管理 `.sln` 解决方案文件 | `dotnet sln add ./MyApp/MyApp.csproj` |
| `help` | 显示帮助信息 | `dotnet help build` |
| `store` | 预编译和缓存程序集(高级用法) | `dotnet store` |
| `watch` | 监视文件更改并自动运行命令 | `dotnet watch run` |
| `format` | 格式化代码(自 .NET 6 起支持) | `dotnet format` |
<!--rehype:className=left-align -->
### 项目修改命令
<!--rehype:wrap-class=row-span-2-->
| 命令 | 说明 | 示例 |
|--------------|--------------|--------------|
| `package add` | 添加 NuGet 包依赖 | `dotnet add package Newtonsoft.Json` |
| `package list` | 列出项目中的所有包依赖 | `dotnet list package` |
| `package remove` | 移除 NuGet 包依赖 | `dotnet remove package Newtonsoft.Json` |
| `package search` | 搜索 NuGet 包 | `dotnet search package Newtonsoft.Json` |
| `reference add` | 添加项目引用(*.csproj | `dotnet add reference ../CommonLib/CommonLib.csproj` |
| `reference list` | 列出当前项目引用的其他项目 | `dotnet list reference` |
| `reference remove` | 移除项目引用 | `dotnet remove reference ../CommonLib/CommonLib.csproj` |
<!--rehype:className=left-align style-list-arrow-->
### 工作负荷管理命令
<!--rehype:wrap-class=col-span-2-->
| 命令 | 说明 | 示例 |
|--------------|--------------|--------------|
| `workload` | 顶级命令,显示所有 workload 子命令 | `dotnet workload --help` |
| `workload install` | 安装指定的工作负荷(如 MAUI、Web 等) | `dotnet workload install maui` |
| `workload uninstall` | 卸载指定的工作负荷 | `dotnet workload uninstall maui` |
| `workload update` | 更新所有已安装的工作负荷 | `dotnet workload update` |
| `workload list` | 显示当前已安装的工作负荷 | `dotnet workload list` |
| `workload restore` | 还原项目所需的工作负荷 | `dotnet workload restore` |
| `workload search` | 搜索可用的工作负荷 | `dotnet workload search` |
| `workload repair` | 修复已安装的工作负荷 | `dotnet workload repair` |
| `workload config` | 配置自定义源、缓存路径等(.NET 8.0.400+ | `dotnet workload config list` |
<!--rehype:className=left-align-->
### NuGet 命令
<!--rehype:wrap-class=col-span-3-->
| 命令 | 说明 | 示例 |
|--------------|--------------|--------------|
| `nuget delete` | 从源中删除一个 NuGet 包 | `dotnet nuget delete MyLib 1.0.0 -s https://api.nuget.org/v3/index.json`|
| `nuget locals` | 清理 NuGet 缓存 | `dotnet nuget locals all --clear` |
| `nuget push` | 将 NuGet 包推送到服务器(如 nuget.org | `dotnet nuget push MyLib.1.0.0.nupkg -k API_KEY -s https://api.nuget.org/v3/index.json` |
| `nuget add source` | 添加一个新的 NuGet 源 | `dotnet nuget add source https://myserver/index.json -n MySource` |
| `nuget disable source` | 禁用一个现有的 NuGet 源 | `dotnet nuget disable source MySource` |
| `nuget enable source` | 启用已禁用的 NuGet 源 | `dotnet nuget enable source MySource` |
| `nuget list source` | 列出所有已配置的 NuGet 源 | `dotnet nuget list source` |
| `nuget remove source` | 移除已配置的 NuGet 源 | `dotnet nuget remove source MySource` |
| `nuget update source` | 更新现有 NuGet 源信息 | `dotnet nuget update source MySource -s https://new-url` |
| `nuget verify` | 验证 NuGet 包签名(.NET 5+ | `dotnet nuget verify MyLib.1.0.0.nupkg` |
| `nuget trust` | 管理受信任的签名证书(.NET 5+ | `dotnet nuget trust list` |
| `nuget sign` | 对 NuGet 包进行签名(.NET 6+ | `dotnet nuget sign MyLib.1.0.0.nupkg --certificate-path cert.pfx` |
| `package search` | 搜索 NuGet 包(.NET 8.0.2xx+ | `dotnet package search Newtonsoft.Json` |
| `nuget why` | 显示为什么某个包被安装(.NET 8.0.4xx+| `dotnet nuget why Newtonsoft.Json` |
<!--rehype:className=left-align-->
### 高级命令
| 命令 | 说明 | 示例 |
|--------------|--------------|--------------|
| `sdk check` | 显示可用的 SDK/运行时版本,并检测更新 | `dotnet sdk check` |
| `msbuild` | 使用 MSBuild 构建项目(提供更多构建自定义性) | `dotnet msbuild /t:Clean;Build /p:Configuration=Release` |
| `build-server` | 管理后端构建服务器(如清理缓存、关闭等) | `dotnet build-server shutdown` |
| `dev-certs` | 管理开发 HTTPS 证书 | `dotnet dev-certs https --trust` |
| `dotnet install script` | 获取可安装指定版本 .NET 的脚本Linux/macOS | `curl -sSL https://dot.net/v1/dotnet-install.sh \| bash` |
<!--rehype:className=left-align style-list-arrow-->
### 工具管理命令
<!--rehype:wrap-class=col-span-2-->
| 命令 | 说明 | 示例 |
|--------------|--------------|--------------|
| `tool install` | 安装 .NET 工具(本地或全局) | `dotnet tool install -g dotnet-ef` |
| `tool list` | 列出已安装的工具 | `dotnet tool list -g` |
| `tool update` | 更新指定工具 | `dotnet tool update -g dotnet-ef` |
| `tool restore` | 恢复项目中定义的工具(基于 manifest | `dotnet tool restore` |
| `tool run` | 运行本地安装的工具 | `dotnet tool run my-tool` |
| `tool uninstall` | 卸载已安装的工具 | `dotnet tool uninstall -g dotnet-ef` |
| `tool search` | 搜索 NuGet 上可用的工具 | `dotnet tool search dotnet-ef` |
<!--rehype:className=left-align-->
另请参阅
---
- [dotnet/sdk GitHub 存储库](https://github.com/dotnet/sdk/) _(github.com/dotnet)_
- [.NET 安装指南](https://learn.microsoft.com/zh-cn/dotnet/core/install/windows) _(learn.microsoft.com)_

View File

@@ -59,7 +59,7 @@ JavaScript 工具
[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=格式化-->
[Biome - JS 语言格式化](https://biomejs.dev/)<!--rehype:target=_blank&style=background: rgb(96 165 250/var(\-\-bg\-opacity));&class=contributing tag&data-lang=格式化-->
<!--rehype:class=home-card-->
JavaScript 测试工具
@@ -82,7 +82,6 @@ CSS 工具
[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));-->

View File

@@ -592,7 +592,7 @@ Container(
### Center
Center 组件实际上继承于Align。用于专门中。
Center 组件实际上继承于Align。用于专门中。
```dart
//与 Align中代码效果一致

View File

@@ -1287,6 +1287,54 @@ Conventional Commmits
| `test:` | 添加测试代码或修正已有的测试 |
<!--rehype:className=left-align-->
patch 补丁的使用
----
### 简单创建
```bash
$ git diff commit_id > my.patch
```
### 简单应用
- **检查**补丁
```bash
# 检查下这个补丁能否被正常应用
$ git apply --check path/to/my.patch
```
- **使用**补丁
```
# 检查通过使用该补丁
$ git apply < path/to/my.patch
```
- 若有冲突则**解决**
```
# 检查不通过可以自动合入patch不冲突的代码同时保留冲突部分
$ git apply --reject path/to/my.patch
```
<!--rehype:className=style-timeline-->
### Email patch 方式
```bash
# 创建指定 commit sha1 id 之前的 n 次提交补丁
$ git format-patch commit_id -n
# 创建 300f59991f22826c8478f0c019387c4ca815b085 这个提交的patch
$ git format-patch commit_id -1
# 提取当前分支最上面的3次提交生成补丁
$ git format-patch -3
# 发送者可使用 git-send-email 发送 git format-patch 的结果给接收者
# 接收者保存邮件到文件 email.txt然后应用补丁创建一个提交会自动包含作者的信息
$ git am < email.txt
```
另见
---

View File

@@ -71,6 +71,20 @@ Glances 的配置文件位于 `~/.config/glances/glances.conf`。通过编辑这
```ini
[global]
refresh=2 # 设置刷新间隔(以秒为单位)
[alert]
enable = True
# 邮件告警配置(放在 alert 下)
mail = True
mail_from =
mail_to =
mail_server =
mail_port = 465
mail_user =
mail_password =
mail_tls = True
[cpu]
enable=true # 显示 CPU 负载平均值
[mem]

View File

@@ -851,6 +851,54 @@ ch <- 3
参见:[缓冲通道](https://tour.golang.org/concurrency/3)
### Context
<!--rehype:wrap-class=col-span-2 row-span-2-->
```go
package main
import (
"context"
"fmt"
"time"
)
func main() {
// 创建根 context
ctx := context.Background() // 空 context通常作为根 context
todo := context.TODO() // 当不确定使用哪个 context 时使用
// 创建带取消功能的 context
ctx, cancel := context.WithCancel(context.Background())
defer cancel() // 确保所有路径都调用取消函数
// 创建带超时的 context
ctx, cancel = context.WithTimeout(context.Background(), 100*time.Millisecond)
defer cancel()
// 创建带截止时间的 context
deadline := time.Now().Add(200 * time.Millisecond)
ctx, cancel = context.WithDeadline(context.Background(), deadline)
defer cancel()
// 创建带值的 context
ctx = context.WithValue(context.Background(), "key", "value")
// 从 context 获取值
value := ctx.Value("key")
fmt.Println(value)
// 检查 context 是否已取消
select {
case <-ctx.Done():
fmt.Println("Context canceled:", ctx.Err())
default:
fmt.Println("Context still valid")
}
}
```
Golang 错误控制
--------

View File

@@ -18,7 +18,9 @@
```html
<script
src="https://unpkg.com/htmx.org@1.8.4"
src="https://unpkg.com/htmx.org@2.0.6"
integrity="sha384-Akqfrbj/HpNVo8k11SXBb6TlBWmXXlYQrCSqEWmyKJe+hDm3Z/B2WVG4smwBkRVm"
crossorigin="anonymous"
>
</script>
<!-- 有一个按钮POST通过AJAX点击 -->
@@ -206,11 +208,9 @@ API 参考
`hx-put` | 向指定的 URL 发出 PUT
`hx-replace-url` | 替换浏览器地址栏中的 URL
`hx-request` | 配置请求的各个方面
`hx-sse` | 已移至分机。 [旧版本的文档](https://htmx.org/attributes/hx-sse)
`hx-sync` | 控制不同元素发出的请求如何同步
`hx-validate` | 强制元素在请求之前验证自己
~~`hx-vars`~~ | 将值动态添加到参数以随请求提交(已弃用,请使用 `hx-vals`)
`hx-ws` | 已移至分机。[旧版本的文档](https://htmx.org/attributes/hx-ws)
`hx-disabled-elt` | 禁用触发元素和指定的元素,在发出请求期间
<!--rehype:className=left-align-->
列出了 htmx 中可用的所有其他属性
@@ -323,6 +323,11 @@ Class | 说明
[`HX-Replace-Url`](https://htmx.org/headers/hx-replace-url) | 替换地址栏中的当前 `URL`
`HX-Reswap` | 允许您指定如何交换响应<br /> _有关可能的值请参阅 [`hx-swap`](https://htmx.org/attributes/hx-swap)_
`HX-Retarget` | 将内容更新的目标更新为页面上不同元素的 CSS 选择器
[`HX-Trigger`](https://htmx.org/headers/hx-trigger) | 允许您触发客户端事件<br /> _请[参阅文档](https://htmx.org/headers/hx-trigger)以获取更多信息_
[`HX-Trigger-After-Settle`](https://htmx.org/headers/hx-trigger) | 允许您触发客户端事件<br /> _请[参阅文档](https://htmx.org/headers/hx-trigger)以获取更多信息_
[`HX-Trigger-After-Swap`](https://htmx.org/headers/hx-trigger) | 允许您触发客户端事件<br /> _请[参阅文档](https://htmx.org/headers/hx-trigger)以获取更多信息_
[`HX-Trigger`](https://htmx.org/headers/hx-trigger) | 响应接收后立即触发事件<br /> _请[参阅文档](https://htmx.org/headers/hx-trigger)以获取更多信息_
[`HX-Trigger-After-Settle`](https://htmx.org/headers/hx-trigger) | 在 settle 阶段之后触发事件<br /> _请[参阅文档](https://htmx.org/headers/hx-trigger)以获取更多信息_
[`HX-Trigger-After-Swap`](https://htmx.org/headers/hx-trigger) | 在 swap 阶段之后触发事件<br /> _请[参阅文档](https://htmx.org/headers/hx-trigger)以获取更多信息_
参考资料
---
- [HTMX 官方文档](https://htmx.org/docs/) _(htmx.org)_

786
docs/huawei-devices.md Normal file
View File

@@ -0,0 +1,786 @@
Huawei 网络设备备忘清单
===
本清单提供了对 Huawei 网络设备的入门简要概述,以及 Huawei 网络设备常用命令示例
基本知识
---
### VRP
- 华为数据通信产品的通用网络操作平台,可用于设备管理和配置
- 支持命令简写,输入命令时可通过提示获取完整写法
- 例如:`undo in en` 取消系统信息显示,完整命令为 `undo info-center enable`
- 如果简写存在歧义,则需要输入更完整的命令
### 视图
<!--rehype:wrap-class=col-span-2-->
视图View是指命令行界面CLI的操作层级不同视图可执行不同范围的命令。
| 视图 | 进入方式 | 说明 |
| :-----: | :-------------------------------------------------- | :--------------------------------- |
| 用户视图 | 登录设备后默认进入 | 可执行监控、查看信息等命令(如 `display version` |
| 系统视图 | `system-view` | 可执行全局配置命令 |
| 接口视图 | `interface 接口名`(如 `interface GigabitEthernet0/0/1` | 用于配置接口相关参数IP、速率、VLAN等 |
| ACL 视图 | `acl 编号`(如 `acl 3000` | 用于定义访问控制规则 |
| VLAN 视图 | `vlan VLAN_ID`(如 `vlan 10` | 用于创建、修改或删除 VLAN |
| OSPF 视图 | `ospf 进程号`(如 `ospf 1` | 用于配置 OSPF 动态路由 |
| AAA 视图 | `aaa` | 用于配置认证、授权与计费 |
<!--rehype:className=show-header-->
---
```txt
用户视图
└── system-view (系统视图)
├── interface GigabitEthernet0/0/1 (接口视图)
├── vlan 10 VLAN视图
├── acl 3000 ACL视图
├── ospf 1 OSPF视图
└── aaa AAA视图
```
基本操作
---
### 系统信息
<!--rehype:wrap-class=row-span-3-->
#### 查看信息
```shell
display version # 查看版本信息
display current-configuration # 查看当前配置
display mac-address # 查看 mac 地址
```
#### 重命名设备
在系统视图下:`sysname RENAME`
#### 切换语言
```sh
# 用户视图下
language-mode [English, Chinese]
```
#### 设置标题
```shell
header login information 信息 # 载入时信息
header shell information 信息 # 远程时信息
```
#### 取消调试信息
```shell
undo terminal monitor
```
&nbsp;
### 撤销操作
<!--rehype:wrap-class=row-span-2-->
- 可用于恢复默认配置
- 可用于禁用某些功能
- 可用于删除某些配置
```shell
# 恢复默认名称
undo sysname
# 禁用信息显示
undo in en
# 删除接口配置
undo ip address
```
#### 恢复出厂设置
`reset saved-configuration`
### 历史命令
<!--rehype:wrap-class=row-span-1-->
使用上箭头或 ctrl+p 可访问上一命令
使用下箭头或 ctrl+n 可访问下一命令
默认保存10条命令
#### 显示历史命令
`display history-command`
### 设置系统时钟
```shell
# 在用户视图下
# 为保证与其他设备协调工作需要配置系统时钟
clock datetime 12:00:00 2020-02-02 # 时间
clock timezone BJ add 08:00:00 # 时区
```
### mac 地址
<!--rehype:wrap-class=col-span-2-->
```shell
# 添加 mac 地址
# MAC-Address mac 地址
# e0/0/0 自定义接口
# VlanID 自定义 vlanid
mac-address static MAC-Address e0/0/0 vlan VlanID
# 清除
reset arp all
```
### 退出
`quit` 命令用于从任意视图退回上一个视图
`return` 这是立刻退回至用户视图
### 保存配置
`save`
### 重启
```shell
reboot
```
登录管理
---
### STelnet 方式
<!--rehype:wrap-class=col-span-2 row-span-3-->
```shell
# 开启 ssh 服务
stelnet server enable
# 配置远程管理ip
int vlanif 1
ip add 192.168.1.254 24
# 生成本地 rsa 秘钥对
rsa local-key-pair create
# ssh 首次认证
ssh cl fi en
# ssh 用户验证类型 password
ssh user admin authentication-type password
# ssh 用户服务类型 stelnet
ssh user admin service-type stelnet
```
#### AAA 登录
```shell
aaa
# 本地用户 admin 密码密文 123456 等级 2
local-user admin password cipher 123456 privilege level 2
# 本地用户 admin 登录方式 ssh
local-user admin service-type ssh
quit
user-interface vty 0 4
authentication-mode aaa # 认证模式 aaa
protocol inbound ssh # 仅支持 ssh 协议
quit
# ssh用户端首次认证
ssh client first-time enable
```
#### 命令级别
- 0 参观级 只能进行如诊断工具命令pingtracert部分 display 命令
- 1 监控级 主要用于系统维护业务故障诊断包括部分displaydebugging命令
- 2 配置级 主要用于业务配置,包括路由,各个网络层次命令,可向用户提供直接网络服务
- 3 - 15 为管理级,涉及系统基本运行,系统支撑模块等
### Console 接口登录
#### 永不超时
```shell
user-interface console 0 # 进入 console 接口
idle-timeout 0 # 超时时间为 0 即 永不超时
```
#### 密码认证
```shell
user-interface console 0
authentication-mode password # 验证模式 密码认证
set authentication password simple 123456 # 设置验证密码 简单密码 123456
```
#### AAA认证
```shell
user-interface console 0
authentication-mode aaa # 验证模式 AAA认证
quit
aaa # 进入 aaa 模式
local-user admin password simple 123456 # 本地用户 admin 密码 简单密码 123456
local-user admin password cipher 123456 # 本地用户 admin 密码 密文密码 123456
local-user admin service-type terminal # 本地用户 admin 服务类型 终端
```
### Telnet 方式
```shell
# 开启 Telnet
telnet server enable
```
#### password 登录
```shell
user-interface vty 0 4
authentication-mode password # 认证模式 password
set authentication password simple 123456 # 设置 认证 密码 简单密码 123456
user privilege level 2 # 用户等级 2
idle-timeout 15 # 断连时间 15 分
```
#### AAA 登录
```shell
aaa
# 本地用户 admin 密码密文 123456 等级 2
local-user admin password cipher 123456 privilege level 2
# 本地用户 admin 登录方式 telnet
local-user admin service-type telnet
quit
user-interface vty 0 4
authentication-mode aaa # 认证模式 aaa
quit
```
### 远程 IP
```shell
# 远程管理 ip
int vlanif 1
ip add 192.168.1.254 24
# pc
192.168.1.1 24
```
接口配置
---
### 接口组
<!--rehype:wrap-class=col-span-2-->
```sh
# 组内配置会自动为组成员配置
port-group 1 # 创建接口组 1
group-member e0/0/2 to e0/0/8 # 划分组成员为 e0/0/2 - e0/0/8 即 2,3,4,5,6,7,8 接口
```
#### 接口模式
```shell
# access 普通模式 只能在某个 vlan 中通信
# trunk 中继器模式 可在任意 vlan 中通信
int e0/0/1
port link-type access # 接口模式为 access
port link-type trunk # 接口模式为 trunk
```
#### 接口带宽
```shell
# 接口每秒传输数据量
int e0/0/1
# 10Mbit/s
# 100Mbit/s
# Auto 自协商
speed 10 | 100 | Auto
# 关闭自协商
# 先关闭自协商再手动指定接口速率
undo negotiation auto
```
#### 接口双工模式
```shell
# 接口协商模式不一致会导致异常
int e0/0/1
# full 全双工 同时收发数据
# half 半双工 同时只能接收或发送数据一个操作
duplex full | half
# 先关闭自协商再手动指定
```
#### 配置 trunk
```sh
interface g0/0/1 # 进入接口
port link-type trunk # 接口模式为 trunk
```
`all` 为通过所有 `vlan`, VlanId 为指定 vlan多个vlan以空格隔开
```sh
port trunk allow-pass vlan VlanId | all
```
### vlan 配置
#### 查看 vlan
`display vlan`
#### 创建 vlan
```sh
# VlanId 自定义vlanid 1 ~ 4094
vlan VlanId
# VLANNAME 自定义的 vlan 名称
description VLANNAME
# 删除vlan
undo vlan VlanId
# 创建 10,20,30 vlan
vlan batch 10 20 30
# 创建 10 ~ 30 vlan
vlan batch 10 to 30
```
#### 分配 vlan
```sh
# 进入接口
interface E0/0/1
# 接口模式设为 access
port link-type access
# 划分到 vlan 10 中
port default vlan 10
# 创建接口组 1
port-group 1
# 组成员为 e0/0/5 - e0/0/8 .... 5,6,7,8
group-member e0/0/5 to e0/0/8
# 组成员接口模式设为 access
port link-type access
# 组成员划分到 vlan 10 中
port default vlan 10
```
交换机配置
---
### STP (Spanning Tree Protocol)
<!--rehype:wrap-class=col-span-2 row-span-2-->
即生成树协议
可将有环路的物理拓扑变为无环路的逻辑拓扑,从而为网络提供安全机制,使得冗余拓扑中不会产生交换环路问题
```shell
# 三层交换机
# 首先需要创建 vlan
# 划分接口给 vlan
# 所有与其他交换机相连接口需要做 trunk 放通划分 vlan
# 二层交换机
# 建立 vlan
# 客户机接口划分默认 vlan
# 与三层交换机相连接口做 trunk 放通 vlan
# 开启 STP
# 系统视图下
# 交换机都要配置
# stp 开启
stp enable
# stp 模式 stp
stp mode stp
# # 指定根交换机
# 配置优先级
# 系统视图下
# 优先级为 0
# 优先级值在 0 ~ 65535 默认 32768
# 要求设为 4096 倍数
stp priority 0
# 使用命令
# 系统视图下
# 需要先删除配置优先级
# 根交换机
stp root primary
# 备用根交换机
stp root secondary
```
### 链路聚合
```shell
# 创建 id 为 1 的 eth-trunk 聚合接口
interface eth-trunk 1
quit
interface g0/0/1
eth-trunk 1 # 加入 g/0/01 到 eth-trunk 1 中
# 添加完毕成员后
# eth-trunk 接口下
# 设置接口链路类型为 trunk
port link-type trunk
```
在聚合接口下添加成员
```sh
trunkport g0/0/1
trunkport g0/0/1 to g0/0/2
# 删除用 undo
```
`接口汇聚`是将交换机间的多条物理链路合并为一条逻辑链路,以提升带宽并实现链路冗余备份。
### RSTPRapid Spanning Tree Protocol
- RSTP快速生成树协议是对 STP 的改进版
- 当网络故障发生时STP 的拓扑结构需要较长时间收敛,而 RSTP 可在 1 秒内完成
- 配置方式与 STP 基本一致
不同点:
```shell
# 系统视图下
stp enable
# stp mode stp 变更
stp mode rstp
# 配置边缘接口
# 接口视图下
# 将该接口设置为边缘接口
# 节省接口从初始启动到转发状态的时间间隔
# 默认不参与生成树计算
# 不经历转发延迟
# 关闭或激活不触发 RSTP 拓扑变更
# 通常将与终端设备连接的接口设置
stp edged-port enable
```
### DHCPDynamic Host Configuration Protocol
<!--rehype:wrap-class=col-span-2-->
即动态主机配置协议
可有规划的划分 IP 地址,也可避免用户私设 IP 引起的地址冲突
三层交换机可充当 DHCP 服务器,能动态分配 IP 地址及 DNS 服务地址等网络参数
可以使得用户零配置上网
```sh
# 二层交换机
# 首先创建 vlan
# 一个 vlan 代表一个地址池范围
# 然后划分接口配置默认 vlan
# 进入与三层交换机相连的接口做 trunk 并放通 vlan
# # 三层交换机
# 创建 vlan
# 进入与二层交换机相连的接口做 trunk 并放通 vlan
# 开启 DHCP
# 系统视图下
dhcp enable
# 系统视图下
# 建立地址池 V10 V10 为自定义的合法地址池名称
ip pool V10
# 发布网段 10.10.10
# 掩码 255.0.0.0
network 10.10.10.0 mask 255.0.0.0
# 配置网关
gateway-list 10.10.10.254
# 设置租期为 8 天
lease 8
# dns 服务器 5.5.5.5
dns-list 5.5.5.5
# 进入 vlan 视图
# 为 vlan 配置对应的网关地址及掩码
# 配置设备指定接口采取全局地址
# vlan 视图下
# dhcp 配置选择 全局配置
dhcp select global
# dhcp 配置选择 接口配置
# 接口配置与全局配置基本相同
# 此 dhcp 配置在接口中
dhcp select interface
# #
# 保留地址
# 保留了 5 - 15 这个范围的 IP 地址
excluded-ip-address 10.10.10.5 10.10.10.15
```
路由配置
---
### 查看路由
<!--rehype:wrap-class=col-span-3-->
```sh
# 查看路由表
display ip routing-table
```
### VRRP (Virtual Router Redundancy Protocol)
<!--rehype:wrap-class=col-span-2 row-span-4-->
即虚拟路由器冗余协议
是一种选择协议,可将虚拟路由器责任动态分配至局域网内的一台 VRRP 路由器
控制虚拟路由器 IP 地址的 VRRP 路由器为 Master 路由器,负责将数据包进行分发
一旦 Master 不可用,可提供动态的故障转移机制
由 Backup 路由器代替 Master路由器故障时的工作
允许虚拟路由器的 IP 地址作为 终端主机的默认第一跳路由
优势为更高的默认路由的可用性,无须在终端主机上配置动态路由或路由发现协议
```sh
# 二层交换机
# 创建 vlan
# 划分接口默认 vlan
# 与 三层交换机 相连的接口配置 trunk 放通 vlan
# # 三层交换机
# 创建 vlan
# 与 二层交换机 相连的接口配置 trunk 放通 vlan
# 配置 vlan 的 IP 地址
# 配置 VRRP
# vlan 视图下
# 配置虚拟接口 IP
# 与当前 vlan ip 同段
# 一台虚拟路由器可拥有多个 IP 地址
# vrid 虚拟路由器的标识,相同的 vrid 的路由器组成一台虚拟 Master 路由器
vrrp vrid 1 virtual-ip 192.168.100.254
# 配置优先级
# 根据优先级确定虚拟路由器中每台路由器的地位
vrrp vrid 1 priority 150
# 配置抢占模式和延迟时间
# 非抢占模式
# Master 无故障, Backup 即使优先级比 Master 高也不会成为 Master
# 抢占模式
# Backup 优先级比 Master 高,则代替 Master
vrrp vrid 1 preempt-mode timer delay 5
# 将 g/0/23 配置为跟踪接口
vrrp vrid 1 track interface g0/0/23
# 查看 VRRP 服务
display vrrp brief
# 1 为 vrrp id
display vrrp 1
# #
```
### 单臂路由
划分 vlan 之后vlan 是无法互通的,但是使用单臂路由可以解决此问题。
```sh
# 首先交换机划分 vlan
# 划分接口默认 vlan
# 与路由器相连接口进行 trunk 放通 vlan
# 假设路由器与交换机连接的接口是 g0/0/0
# 创建子接口
int g0/0/0.1
# 配置 ip 地址
# 封装 802.1Q 协议
# 假设当前接口对应的 vlan 是 vlan 10
dot1q termination vid 10
# 开启 arp 广播
# 不配置会导致子接口不主动发送 arp 报文
# 以及对外转发 ip 报文
arp broadcast enable
```
### 静态路由
适用于规模较小,不经常变动,简单的网络环境
```sh
# 首先配置交换机
# 创建 vlan 并划分接口默认 vlan
# 配置 vlan 的 ip 地址
# 路由器配置相连接口 ip
# 添加 静态路由
# 所有不能直达的网络都需要添加静态路由
ip route-static 目标网段 掩码 下一跳地址
```
### 默认路由
默认路由与静态路由配置基本相同。
唯一不同的就是路由的配置。
```bash
ip rou 0.0.0.0 0.0.0.0 下一跳地址
```
### 浮动路由
就是路由器之间多个接口相连,并配置接口优先级。
配置与静态,默认路由基本相同。
```bash
ip rou 目标网段 掩码 下一跳地址
ip rou 目标网段 掩码 下一跳地址 pr 权重
```
### OSPF
<!--rehype:wrap-class=row-span-2 col-span-2-->
首先配置完毕相关接口及IP。
#### 单域
```bash
# 系统视图下
# 1 是 ospf 进程号
ospf 1
# 0 是区域号 0 是骨干区域
area 0
# 发布网段
# 网段需要根据掩码
net x.x.x.x 反码
```
#### 多域
与单域配置基本相同,只是需要划分多个 OSPF 区域。
需要注意,路由器相连接口需要划分到一个区域。
```bash
# 系统视图下
ospf 1
area 0
# 发布当前区域的网段
net x.x.x.x 反码
# 切换区域
area 1
# 发布当前区域的网段
net x.x.x.x 反码
```
### 动态路由 RIP
配置基本相同。
```bash
# 系统视图下
# 进入 rip 视图
rip
# 切换版本 2
v 2
# 自动汇总
summary always
# 发布网段 (需要根据掩码)
# 如 掩码 255.0.0.0
# 则 发布 x.0.0.0
net x.x.x.x
```
### 路由重分发
大型网络中,有时有多种路由协议共存,此时需要进行路由重分发。
```bash
# 首先完成相关路由配置
# 假设 Router 左侧为 RIP 协议
# 右侧为 OSPF 协议
# 左右路由分别是 1.1.1.1 和 2.2.2.2
# 因为 左侧为 RIP 协议
# 因此需要先配置 RIP 发布 1.1.1.0 的网段
# 右侧 OSPF 协议相同
# Router 中
# 进入 rip 中
# 导入 ospf 1 的路由
import-route ospf 1
# 进入 ospf
# 导入 rip 1 的路由
import-route rip 1
```
网络安全
---
### 接口安全
<!--rehype:wrap-class=col-span-2-->
```shell
# 接口视图下
# 开启接口安全
port-security enable
# 设置当前接口只能由 MAC 地址 MAC-ADDRESS 的设备访问
port-security mac-address sticky MAC-ADDRESS
# 设置安全 MAC 地址最大数为 1
port-security max-mac-num 1
# 设置其他非安全 MAC 地址数据帧处理动作为 关闭接口
port-security protect-action shutdown
# 设置安全 MAC 地址老化时间为 300s
port-security aging-time 300
```
### 访问控制列表Access Control List
- 由一系列规则组成的集合,通过规则对报文分类处理。
- 通常由若干条 <red>deny</red>(拒绝) | <code>permit</code>(允许) 语句组成。
### 基本访问控制列表
范围只能在 2000 - 2999。
```shell
# 系统视图下
acl 2000
# 规则 拒绝 源 IP地址 反码
# deny 拒绝 permit 允许
rule deny source IP-ADDRESS MASK
# 接口视图下
# 传输过滤 输出 规则 2000
# outbound 输出
# inbound 输入
traffic-filter outbound acl 2000
```
### 高级访问控制列表
<!--rehype:wrap-class=col-span-2-->
范围 3000 - 3999。
```shell
# 系统视图下
acl 3000
# 规则 id5 拒绝 tcp 源 IP-ADDRESS 反码 访问目标 IP-ADDRESS 反码 目标端口 范围 20 21
rule 5 deny tcp source IP-ADDRESS MASK destination IP-ADDRESS MASK destination-port range 20 21
#规则 id10 允许 tcp 源 IP-ADDRESS 反码 访问目标 IP-ADDRESS 反码 目标端口 等于 80
# gt 大于
# lt 小于
rule 10 permit tcp source IP-ADDRESS MASK destination IP-ADDRESS MASK destination-port eq 80
```
应尽量在靠近源地址的接口上应用;允许某个网段后,应拒绝其他网段。对于 FTP需要同时指定 FTP21和 FTP-DATA20端口。

View File

@@ -80,8 +80,8 @@ for (char c: word.toCharArray()) {
```java
char[] chars = new char[10];
chars[0] = 'a'
chars[1] = 'b'
chars[0] = 'a';
chars[1] = 'b';
String[] letters = {"A", "B", "C"};
int[] mylist = {100, 200};
boolean[] answers = {true, false};
@@ -311,8 +311,9 @@ int[] a2 = {1, 2, 3};
int[] a3 = new int[]{1, 2, 3};
int[] a4 = new int[3];
a4[0] = 1;
a4[2] = 2;
a4[3] = 3; // 会出现索引越界异常
a4[1] = 2;
a4[2] = 3; // 正常赋值
a4[3] = 4; // 会出现索引越界异常 ArrayIndexOutOfBoundsException
```
### 修改 Modify
@@ -340,7 +341,7 @@ for (int i=0; i < arr.length; i++) {
```java
String[] arr = {"a", "b", "c"};
for (int a: arr) {
for (String a: arr) {
System.out.print(a + " ");
}
// 输出: a b c
@@ -349,16 +350,16 @@ for (int a: arr) {
### 二维数组 Multidimensional Arrays
```java
int[][] matrix = { {1, 2, 3}, {4, 5} };
int[][] matrix = {{1, 2, 3}, {4, 5}, {6}};
int x = matrix[1][0]; // 4
// [[1, 2, 3], [4, 5]]
Arrays.deepToString(matrix)
for (int i = 0; i < a.length; ++i) {
for(int j = 0; j < a[i].length; ++j) {
System.out.println(a[i][j]);
}
System.out.println(Arrays.deepToString(matrix));
// 输出: [[1, 2, 3], [4, 5], [6]]
for (int i = 0; i < matrix.length; ++i) {
for(int j = 0; j < matrix[i].length; ++j) {
System.out.println(matrix[i][j]);
}
}
// 输出: 1 2 3 4 5 6 7
// 输出: 1 2 3 4 5 6
```
### 排序 Sort
@@ -563,7 +564,7 @@ do {
// 输出: 01234
```
### 继续声明
### 继续语句
```java
for (int i = 0; i < 5; i++) {
@@ -572,7 +573,7 @@ for (int i = 0; i < 5; i++) {
}
System.out.print(i);
}
// 输出: 01245
// 输出: 0124
```
### 中断语句
@@ -587,6 +588,255 @@ for (int i = 0; i < 5; i++) {
// 输出: 0123
```
Java 面向对象
---
### 类的定义
```java
public class Dog {
private String name;
// 构造方法无无返回值,方法名与类名相同
// 一个类可以有多个构造方法
// Java 默认提供一个无参构造方法(只有在没有显式定义任何构造方法时)
public Dog() {
}
public Dog(String name) {
this.name = name;
}
}
```
### 类中的变量
```java
public class Dog {
// 成员变量
private String name;
// 类变量
// 多对象将会共享同一个类变量
static int val = 10;
public void Say() {
// 局部变量
String sentence = "hello";
System.out.println(sentence);
}
}
```
### 对象的创建
```java
Dog myDog = new Dog(); // 调用无参构造函数
Dog myDog2 = new Dog("aaa"); // 调用对应参数列表的构造函数
// 调用方法
myDog.Say();
```
### 对象的继承
```java
public Animal {
public String name;
public Animal(String name) {
this.name = name;
}
public void eat() {
System.out.println("eat something");
}
}
// Dog类继承Animal类
public Dog extends Animal {
// 调用父类的构造函数
public Dog(String name){
super(name);
}
}
```
请注意Java不支持多继承只能够单继承但支持多重继承
即,一个类最多只有一个父类,但可以有爷爷类和太爷爷类
#### Java继承的特点
- 子类拥有父类中可访问的属性和方法public、protected 以及同包访问权限的成员)
- 子类可以有自己的属性、方法
- 子类可以重写父类的方法
#### super 与 this
super引用当前类的父类
this引用自身
```java
class Animal {
void eat() {
System.out.println("animal : eat");
}
}
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
}
```
#### final 关键字
被final 关键字修饰的类不能够被继承
被final 关键字修饰的方法不能被子类重写
### Java的重写(Override)与重载(Overload)
#### 重写(Override)
重写者位于被重写者的子类中
重写者的签名必须与被重写者的签名相同
```java
class Animal {
// 被重写者
void say(String sentence) {
System.out.println("Animal say: " + sentence);
}
}
class Dog extends Animal {
// 重写者
// 重写者位于被重写者的子类 重写一般需要添加 @Override 注解
@Override
void say(String sentence) { // 签名与被重写者相同
System.out.println("Dog say: " + sentence);
}
}
```
#### 重载(Overload)
重载位于同一类内部
签名必须不同
```java
public class Overloading {
public int test(){
System.out.println("test1");
return 1;
}
public void test(int a) {
System.out.println("test2");
}
//以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println("test3");
return "returntest3";
}
public String test(String s,int a){
System.out.println("test4");
return "returntest4";
}
}
```
### Java 抽象类
抽象类不能被实例化为对象,因此,抽象类必须被继承才能够使用
抽象类使用abstract 关键字进行修饰
```java
public abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
}
```
使用abstract 关键字修饰的方法是抽象方法
抽象方法必须包含在抽象类中
子类必须重写父类中的所有抽象方法,除非子类也是抽象类
```java
public abstract class Animal {
String name;
public Animal(String name) {
this.name = name;
}
public abstract void say();
}
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
public void say(){
System.out.println("Dog");
}
}
```
### Java 接口
#### 接口的定义
与类的继承不同,接口可以继承多个接口
```java
[可见性修饰符] interface 接口名称 [extends 其他接口名列表] {
// 声明变量
// 抽象方法
}
```
#### 接口的实现
一个类可以实现多个接口
类必须实现接口的所有方法,除非该类是抽象类
```java
public interface Animal {
public void eat();
public void say();
}
public class Dog implements Animal {
public void eat() {
System.out.println("Dog eat something");
}
public void say() {
System.out.println("Dog say something");
}
}
```
Java 多线程
---
@@ -631,7 +881,7 @@ public class ExtendsThread extends Thread {
```java
public static void main(String[] args) throws ExecutionException, InterruptedException {
new Thread(new RunnableThread()).start();
new ExtendsThread2().start();
new ExtendsThread().start();
FutureTask<Integer> integerFutureTask = new FutureTask<>(new CallableTask());
integerFutureTask.run();
}
@@ -643,7 +893,7 @@ public static void main(String[] args) throws ExecutionException, InterruptedExc
- corePoolSize: 核心线程数
- maximumPoolSize: 最大线程数
- keepAliveTime: 线程空闲时间
- timeUni: 线程空闲时间单位
- TimeUnit: 线程空闲时间单位
- workQueue: 线程等待队列
- threadFactory: 线程创建工厂
- handler: 拒绝策略
@@ -673,9 +923,13 @@ synchronized(obj) {
...
}
// (静态)方法
public synchronized
(static) void methodName() {
// 实例方法同步
public synchronized void methodName() {
...
}
// 静态方法同步
public static synchronized void methodName() {
...
}
```
@@ -749,7 +1003,7 @@ try{
condition.signal();
condition.signalAll();
} finally {
lock.unlock
lock.unlock();
}
// LockSupport,可以先unpark,后续park不会阻塞线程
@@ -775,7 +1029,7 @@ Java 框架搜集
[CopyOnWriteArraySet](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CopyOnWriteArraySet.html) | Set | Y | _N_ | Y | _N_ | One `null`
[ConcurrentSkipListSet](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentSkipListSet.html) | Set | Y | Y | Y | _N_ | _N_
[HashMap](https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html) | Map | _N_ | _N_ | _N_ | _N (key)_ | One `null` _(key)_
[HashTable](https://docs.oracle.com/javase/8/docs/api/java/util/Hashtable.html) | Map | _N_ | _N_ | Y | _N (key)_ | _N (key)_
[Hashtable](https://docs.oracle.com/javase/8/docs/api/java/util/Hashtable.html) | Map | _N_ | _N_ | Y | _N (key)_ | _N (key)_
[LinkedHashMap](https://docs.oracle.com/javase/8/docs/api/java/util/LinkedHashMap.html) | Map | Y | _N_ | _N_ | _N (key)_ | One `null` _(key)_
[TreeMap](https://docs.oracle.com/javase/8/docs/api/java/util/TreeMap.html) | Map | Y | Y | _N_ | _N (key)_ | _N (key)_
[ConcurrentHashMap](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html) | Map | _N_ | _N_ | Y | _N (key)_ | _N_
@@ -804,7 +1058,7 @@ for (int i = 0; i < nums.size(); i++) {
System.out.println(nums.get(i));
}
nums.remove(nums.size() - 1);
nums.remove(0); // 非常慢
nums.remove(0); // 较慢,因为需要移动后续元素
for (Integer value : nums) {
System.out.println(value);
}
@@ -957,11 +1211,11 @@ Java I/O流
### 字节流
```java
// 文件输入流
// 文件输入流 (注意:需要手动关闭或使用 try-with-resources
InputStream inputStream
= new FileInputStream("input.txt");
// 文件输出流
// 文件输出流 (注意:需要手动关闭或使用 try-with-resources
OutputStream outputStream
= new FileOutputStream("output.txt");
@@ -1246,8 +1500,8 @@ Class<?>[] interfaces = clazz.getInterfaces();
<!--rehype:wrap-class=col-span-2-->
```java
// 使用默认构造函数创建对象
MyClass instance = (MyClass) clazz.newInstance();
// 使用默认构造函数创建对象注意newInstance() 已废弃)
MyClass instance = (MyClass) clazz.getDeclaredConstructor().newInstance();
// 使用带参数的构造函数创建对象
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);
@@ -1347,6 +1601,10 @@ Consumer<String> test = System.out::println;
Comparator<Integer> comparator = Math::max;
int result = comparator.compare(1, 2);
// 返回 -1
BinaryOperator<Integer> maxOperator = Math::max;
int result = maxOperator.apply(1, 2);
// 返回 2
```
@@ -1354,8 +1612,8 @@ int result = comparator.compare(1, 2);
```java
String str = "HELLO";
String lowerCase = str::toLowerCase;
Supplier<String> lowerCaseSupplier = str::toLowerCase;
String lowerCase = lowerCaseSupplier.get();
// 返回 "hello"
```
@@ -1375,7 +1633,7 @@ Function<Integer, String[]> function = String[]::new;
String[] array = function.apply(5);
// 返回 5 空字符串数组
// 返回长度为 5 空字符串数组
```
<!--rehype:className=wrap-text-->
@@ -1384,7 +1642,8 @@ String[] array = function.apply(5);
```java
String someStr = "HELLO";
String lowerCase = someStr::toLowerCase;
Supplier<String> lowerCaseSupplier = someStr::toLowerCase;
String lowerCase = lowerCaseSupplier.get();
// 返回 "hello"
```
@@ -1393,7 +1652,8 @@ String lowerCase = someStr::toLowerCase;
```java
SomeClass someObject = new SomeClass();
int result = someObject::staticMethod;
Supplier<Integer> methodSupplier = someObject::staticMethod;
int result = methodSupplier.get();
// 调用静态方法
```
@@ -1503,7 +1763,7 @@ text.split(Pattern.quote("|"));
:-|:-
`Math.max(a,b)` | `a``b` 的最大值
`Math.min(a,b)` | `a``b` 的最小值
`Math.abs(a)` | 绝对值
`Math.abs(a)` | `a`绝对值
`Math.sqrt(a)` | `a` 的平方根
`Math.pow(a,b)` | `b` 的幂
`Math.round(a)` | 最接近的整数
@@ -1512,8 +1772,8 @@ text.split(Pattern.quote("|"));
`Math.tan(ang)` | `ang` 的切线
`Math.asin(ang)` | `ang` 的反正弦
`Math.log(a)` | `a` 的自然对数
`Math.toDegrees(rad)` | 以度为单位的角度弧度
`Math.toRadians(deg)` | 以弧度为单位的角度度
`Math.toDegrees(rad)` | 弧度转角
`Math.toRadians(deg)` | 角度转弧
### 异常 Try/Catch/Finally
@@ -1521,9 +1781,12 @@ text.split(Pattern.quote("|"));
try {
// something
} catch (Exception e) {
e.printStackTrace();
// 建议使用日志框架记录异常
logger.error("发生异常", e);
// 或者至少使用标准错误流
// e.printStackTrace();
} finally {
System.out.println("always printed");
System.out.println("总是执行");
}
```
@@ -1531,7 +1794,7 @@ try {
<!--rehype:wrap-class=row-span-2-->
- `ArrayDeque`: 可调整大小的数组双端队列实现了Deque接口
- `Arrays`: 提供静态工厂,允许将数组视为列表
- `Arrays`: 提供操作数组的静态方法,如排序、搜索、比较等
- `Collections`: 包含操作集合或返回集合的静态方法
- `Date`: 表示特定时间瞬间,精度为毫秒
- `Dictionary`: 抽象父类可用于键值对映射例如Hashtable

View File

@@ -315,7 +315,7 @@ if (isMailSent) {
```javascript
var age = 1;
// => true
// => false
var status = (age >= 18) ? true : false;
```
@@ -886,7 +886,6 @@ for (let index in fruits) {
```
### label 语句
<!--rehype:wrap-class= row-span-2-->
```js
var num = 0;
@@ -916,10 +915,16 @@ for (let fruit of fruits) {
// => apple
// => orange
// => banana
for (let [index, value] of fruits.entries()) {
console.log(index, value);
}
// => 0 apple
// => 1 orange
// => 2 banana
```
### for await...of
<!--rehype:wrap-class= row-span-2-->
```javascript
async function* asyncGenerator() {

View File

@@ -217,10 +217,10 @@ if (age < 18 ) {
} else if (age < 60) {
println("您被视为成年人")
} else {
println("你被认为是高级")
println("您被视为老年人")
}
// 打印: 你被认为是高级
// 打印: 您被视为老年人
```
### 比较运算符

View File

@@ -11,17 +11,18 @@ LaTeX 备忘清单
[LaTeX](https://www.latex-project.org/) 基于 TEX 的排版系统,适用于生成高印刷质量的科技和数学、物理文档。
- [LaTeX 官网](https://www.latex-project.org/) _(latex-project.org)_
- [KaTeX 官网](https://katex.org/) _(katex.org)_
而 [KaTeX](https://katex.org/) 只处理 LaTeX 的数学符号的一个更小的子集,用于 web 上展示
- [KaTeX 官网](https://katex.org/) _(katex.org)_
### 示例
```KaTeX
% \f is defined as #1f(#2) using the macro
f\relax(x) = \int_{-\infty}^\infty
f\hat\xi\,e^{2 \pi i \xi x}
\,d\xi
\,\mathrm{d}\xi
```
---
@@ -30,7 +31,7 @@ f\relax(x) = \int_{-\infty}^\infty
% \f is defined as #1f(#2) using the macro
f\relax(x) = \int_{-\infty}^\infty
f\hat\xi\,e^{2 \pi i \xi x}
\,d\xi
\,\mathrm{d}\xi
```
### 行内展示
@@ -42,10 +43,10 @@ f\relax(x) = \int_{-\infty}^\infty
基于 KaTeX 在一行展示示例: `KaTeX:\int_0^\infty x^2 dx`
Supported Functions
支持的语法
---
### Accents
### 标注符号
<!--rehype:wrap-class=col-span-2 row-span-2-->
:- | :- | :-
@@ -74,7 +75,7 @@ Supported Functions
`KaTeX:\^{a}` <pur>`\^{a}`</pur> | `KaTeX:\u{a}` <pur>`\u{a}`</pur> |
`KaTeX:\r{a}` <pur>`\r{a}`</pur> |
### Delimiter Sizing
### 定界符大小调整
:- | :-
:- | :-
@@ -90,7 +91,7 @@ Supported Functions
`\right` | `\bigg` | `\biggl` | `\biggm` | `\biggr`
`\` | `\Bigg` | `\Biggl` | `\Biggm` | `\Biggr`
### 希腊和希伯来字母 Greek and Hebrew letters
### 希腊和希伯来字母
<!--rehype:wrap-class=col-span-3-->
预览 | 方法 | 预览 | 方法 | 预览 | 方法 | 预览| 方法 | 预览 | 方法 | 预览 | 方法
@@ -193,7 +194,7 @@ Supported Functions
\sum_{\mathclap{1\le i\le j\le n}} x_{ij}
```
### `KaTex:\LaTeX` math constructs
### `KaTex:\LaTeX` 数学结构
<!--rehype:wrap-class=col-span-3-->
预览 | 方法 | 预览 | 方法 | 预览 | 方法
@@ -203,7 +204,7 @@ Supported Functions
| `KaTex:\sqrt{abc}` | <pur>`\sqrt{abc}`</pur> | `KaTex:\widehat{abc}` | <pur>`\widehat{abc}`</pur> | `KaTex:\overbrace{abc}` | <pur>`\overbrace{abc}`</pur> |
| `KaTex:\sqrt[n]{abc}` | <pur>`\sqrt[n]{abc}`</pur> | `KaTex:\widetilde{abc}` | <pur>`\widetilde{abc}`</pur> | `KaTex:\underbrace{abc}` | <pur>`\underbrace{abc}`</pur> |
### 分隔符 Delimiters
### 分隔符
<!--rehype:wrap-class=col-span-3-->
预览 | 方法 | 预览 | 方法 | 预览 | 方法 | 预览| 方法 | 预览 | 方法
@@ -547,10 +548,10 @@ Supported Functions
`KaTex:\circledS` | <pur>`\circledS`</pur> | `KaTex:\spadesuit` | <pur>`\spadesuit`</pur> | `KaTex:\spades` | <pur>`\spades`</pur> |
`KaTex:\text{\textcircled a}` | <pur>`\text{\textcircled a}`</pur> | `KaTex:\maltese` | <pur>`\maltese`</pur> | `KaTex:\minuso` | <pur>`\minuso`</pur> |
Environments
环境
---
### Environments 1
### 环境 1
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -569,7 +570,7 @@ Environments
```
<!--rehype:style=flex:1;-->
### Environments 2
### 环境 2
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -587,7 +588,7 @@ Environments
\end{array}
```
### Environments 3
### 环境 3
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -606,7 +607,7 @@ Environments
```
<!--rehype:style=flex:1;-->
### Environments 4
### 环境 4
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -623,7 +624,7 @@ Environments
\end{bmatrix}
```
### Environments 5
### 环境 5
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -642,7 +643,7 @@ Environments
```
<!--rehype:style=flex:1;-->
### Environments 6
### 环境 6
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -661,7 +662,7 @@ Environments
```
<!--rehype:style=flex:1;-->
### Environments 7
### 环境 7
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -678,7 +679,7 @@ Environments
\end{Bmatrix}
```
### Environments 8
### 环境 8
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -702,7 +703,7 @@ Environments
\end{array}
```
### Environments 9
### 环境 9
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -719,7 +720,7 @@ x = \begin{cases}
\end{cases}
```
### Environments 10
### 环境 10
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -736,7 +737,7 @@ x = \begin{cases}
\end{rcases}⇒…
```
### Environments 11
### 环境 11
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -754,7 +755,7 @@ x = \begin{cases}
\end{smallmatrix}
```
### Environments 12
### 环境 12
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -774,7 +775,7 @@ x = \begin{cases}
\end{subarray}}
```
### Environments 13
### 环境 13
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -794,7 +795,7 @@ x = \begin{cases}
\end{equation}
```
### Environments 14
### 环境 14
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -812,7 +813,7 @@ x = \begin{cases}
\end{align}
```
### Environments 15
### 环境 15
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -830,7 +831,7 @@ x = \begin{cases}
\end{gather}
```
### Environments 16
### 环境 16
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -848,7 +849,7 @@ x = \begin{cases}
\end{alignat}
```
### Environments 17
### 环境 17
<!--rehype:body-style=display: flex;flex-direction: row;justify-content: flex-start;-->
```KaTeX
@@ -881,7 +882,7 @@ x = \begin{cases}
`KaTex:\colorbox{aqua}{$F=ma$}` | <pur>`\colorbox{aqua}{$F=ma$}`</pur>
`KaTex:\fcolorbox{red}{aqua}{$F=ma$}` | <pur>`\fcolorbox{red}{aqua}{$F=ma$}`</pur>
### Font 字体
### 字体
<!--rehype:wrap-class=col-span-2-->
:- | :- | :- | :- | :- | :-
@@ -892,7 +893,7 @@ x = \begin{cases}
`KaTex:\Large AB` | <pur>`\Large AB`</pur> | `KaTex:\Large AB` | <pur>`\Large AB`</pur> | `KaTex:\scriptsize AB` | <pur>\scriptsize AB</pur>
`KaTex:\large AB` | <pur>`\large AB`</pur> | `KaTex:\large AB` | <pur>`\large AB`</pur> | `KaTex:\tiny AB` | <pur>\tiny AB</pur>
### Style 样式
### 样式
<!--rehype:wrap-class=col-span-3-->
:- | :- | :- | :-

539
docs/leaf.md Normal file
View File

@@ -0,0 +1,539 @@
Leaf 备忘清单
====
[Leaf](https://github.com/vapor/leaf) 是 [Vapor](https://github.com/vapor/vapor) 的轻量级模板引擎,用于在服务端生成动态 HTML 页面。
入门
----
### Leaf
`Leaf` 是一种强大的模板语言,其语法受 `Swift` 启发。
- [Leaf 模板语言官方文档](https://docs.vapor.codes/zh/leaf/getting-started/) _(vapor.codes)_
- [**LeafKit**Swift 模板引擎库](https://github.com/vapor/leaf-kit) _(github.com)_
- [**Leaf**LeafKit 的 Vapor 集成模板系统](https://github.com/vapor/leaf) _(github.com)_
### Package
<!--rehype:wrap-class=col-span-2-->
```swift
// swift-tools-version:5.2
import PackageDescription
let package = Package(
name: "MyApp",
platforms: [ .macOS(.v10_15) ],
dependencies: [ /// 添加其它依赖
.package(url: "https://github.com/vapor/leaf.git", from: "4.0.0"),
],
targets: [
.target(name: "App", dependencies: [ .product(name: "Leaf", package: "leaf") ]),
]
)
```
### 配置
```swift
import Vapor
import Leaf
```
设置工作目录
```swift
app.directory.workingDirectory = "...."
```
设置模板目录
```swift
app.directory.viewsDirectory = "...."
```
设置模板引擎
```swift
app.views.use(.leaf)
```
配置自定义标签
```swift
app.leaf.tags["relative"] = CustomTag()
```
### 目录结构
```
VaporApp
├── Package.swift
├── Resources
│ ├── Views
│ │ └── hello.leaf
├── Public
│ ├── images (images 资源)
│ ├── styles (css 资源)
└── Sources
└── ...
```
- Views 文件夹来存储 `.leaf` 文件
- 配置 [`FileMiddleware`](https://api.vapor.codes/vapor/documentation/vapor/filemiddleware/) 提供静态文件
```swift
app.middleware.use(FileMiddleware(
publicDirectory:
app.directory.publicDirectory
))
```
### 渲染视图
```swift
app.get("hello") {
req -> EventLoopFuture<View> in
return req.view.render("hello", [
"name": "Leaf"
])
}
// 或
app.get("hello") {
req async throws -> View in
return try await req.view.render(
"hello", ["name": "Leaf"]
)
}
```
`hello.leaf` 模板中使用 `name`
```
Hello, #(name)!
```
打开浏览器访问 `/hello` 显示 `Hello, Leaf!`
## Leaf 概述
### 模板语法
一个基本的 `Leaf` 标签使用示例
```swift
There are #count(users) users.
```
可以使用冒号和结束标签为某些标签提供可选的正文。
- 标记 `#`:这表示 leaf 解析器开始寻找的标记。
- 名称 `count`:标签的标识符。
- 参数列表 (`users`):可以接受零个或多个参数。
### 内置标签示例
```html
#(variable)
#extend("template"): 添加到模板中!#endextend
#export("title"): 欢迎使用 Vapor #endexport
#import("body")
#count(friends)
#for(friend in friends):
<li>#(friend.name)</li>
#endfor
```
文件夹中的模板
```html
#extend("partials/detail-layout"):
#export("body"): 详情页面 #endexport
#endextend
```
### 表达式
- `+`
- `%`
- `>`
- `==`
- `||`
<!--rehype:className=cols-3 style-none-->
```leaf
#if(1 + 1 == 2):
Hello!
#endif
#if(index % 2 == 0):
This is even index.
#else:
This is odd index.
#endif
```
### 上下文
<!--rehype:wrap-class=row-span-2-->
Leaf 推荐用 `Encodable` 结构体传数据,数组需包装,`[String: Any]` 不支持。
```swift
struct WelcomeContext: Encodable {
var title: String
var numbers: [Int]
}
return req.view.render("home",
WelcomeContext(
title: "Hello!",
numbers: [42, 9001]
)
)
```
`title``numbers` 将暴露给 `Leaf` 模板,就可以在标签中使用这些变量。
```html
<h1>#(title)</h1>
#for(number in numbers):
<p>#(number)</p>
#endfor
```
### 条件
<!--rehype:wrap-class=row-span-2-->
变量是否存在
```html
#if(title):
The title is #(title)
#endif
```
比较
```html
#if(title == "Welcome"):
This is a friendly web page.
#endif
```
使用另一个标签作为判断条件的一部分,内部标签应该省略 `#`
```html
#if(count(users) > 0):
You have users!
#else:
There are no users yet :(
#endif
```
多个条件满足时才渲染内容的模板
```html
#if(title == "user" && count(users) > 0):
You have users!
#endif
```
### #elseif
```html
#if(title == "Welcome"):
Hello new user!
#elseif(title == "Welcome back!"):
Hello old user
#else:
Unexpected page!
#endif
```
### 循环
```swift
struct SolarSystem: Codable {
let planets = ["Venus", "Earth", "Mars"]
}
return req.view.render(
"solarSystem", SolarSystem()
)
```
`Leaf` 中循环它们:
```html
<ul>
#for(planet in planets):
<li>#(planet)</li>
#endfor
</ul>
```
### 模板示例
<!--rehype:wrap-class=row-span-4-->
入口页面,通过 `#extend("main")``mainleaf` 模板的内容复制到当前模板中使用
```html
#extend("main"):
#export("body"):
<p>Welcome to Vapor!</p>
#endexport
#endextend
```
在公共模板 `main.leaf`
```html
<html>
<head>
<title>#(name)</title>
</head>
<body>#import("body")</body>
</html>
```
呈现如下内容:
```html
<html>
<head>
<title>Leaf</title>
</head>
<body>
<p>Welcome to Vapor!</p>
</body>
</html>
```
### 扩展模板
<!--rehype:wrap-class=row-span-3-->
在模板中使用 `#export` 存储名为 `body` 的一些 HTML
```html
#export("body"):
<p>Welcome to Vapor!</p>
#endexport
```
使用 `#import` 获取传递给 `#extend` 标签的内容
```html
<body>
#import("body")
</body>
```
### #count
```html
Your search matched #count(matches) pages.
```
`#count` 标签返回数组中的项目数量
### #lowercased
```html
#lowercased(name)
```
`#lowercased` 标签将字符串转成小写字母。
### #capitalized
```html
#capitalized(name)
```
`#capitalized` 标签将字符串中每个单词的首字母大写,其他字母小写。
### #contains
```html
#if(contains(planets, "Earth")):
Earth is here!
#else:
Earth is not in this array.
#endif
```
`#contains` 标签接受一个数组和一个值作为其两个参数,如果参数一中的数组包含参数二中的值,则返回 true。
### #date
<!--rehype:wrap-class=row-span-2-->
`#date` 标签将日期格式化为可读的字符串。默认情况下,它使用 ISO8601 格式。
```swift
render(..., ["now": Date()])
```
模板中使用
```
The time is #date(now)
```
你可以传自定义日期格式作为第二参数,详见 [Swift DateFormatter](https://developer.apple.com/documentation/foundation/dateformatter)。
```
The date is #date(now, "yyyy-MM-dd")
```
### #unsafeHTML
标签就像一个变量标签 - 例如 `#(variable)`
```
The time is #unsafeHTML(styledTitle)
```
它不会转义任何 `variable` 可能包含的 HTML 标签
### #dumpContext
`#dumpContext` 标签将整个上下文渲染为可读的字符串。使用此标记来调试作为上下文提供给当前渲染的内容。
```
Hello, world!
#dumpContext
```
自定义标签
---
### LeafTag
<!--rehype:wrap-class=col-span-2 row-span-2-->
创建一个名为 `NowTag` 的类并遵循 `LeafTag` 协议
```swift
struct NowTag: LeafTag {
func render(_ ctx: LeafContext) throws -> LeafData {
...
}
}
```
实现 `render(_:)` 方法。传递给该方法的 `LeafContext` 参数包含了我们需要的所有内容。
```swift
enum NowTagError: Error {
case invalidFormatParameter
case tooManyParameters
}
struct NowTag: LeafTag {
func render(_ ctx: LeafContext) throws -> LeafData {
let formatter = DateFormatter()
switch ctx.parameters.count {
case 0: formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
case 1:
guard let string = ctx.parameters[0].string else {
throw NowTagError.invalidFormatParameter
}
formatter.dateFormat = string
default:
throw NowTagError.tooManyParameters
}
let dateAsString = formatter.string(from: Date())
return LeafData.string(dateAsString)
}
}
```
### 配置标签
实现了 `NowTag`,告诉 `Leaf` 并设置标签名称为 `#now`
```swift
app.leaf.tags["now"] = NowTag()
```
现在可以在 Leaf 中使用我们的自定义标签 `#now`
```html
The time is #now()
```
### 上下文属性
#### `parameters` 包含标签参数的数组
```swift
struct NowTag: LeafTag {
func render(
_ ctx: LeafContext
) throws -> LeafData {
/// ctx.parameters
}
}
```
#### 使用 Data`render(_:_:)` 方法作为上下文视图的数据
```swift
return try await req.view.render(
"home", ["name": "John"]
)
```
自定义标签使用 `Data`
```swift
struct NowTag: LeafTag {
func render(
_ ctx: LeafContext
) throws -> LeafData {
let name = ctx.data["name"]?.string
}
}
```
`LeafContext` 包含两个重要的属性
### 相对路径拼接标签
<!--rehype:wrap-class=col-span-2-->
```swift
struct RelativePathTag: LeafTag {
func render(_ ctx: LeafContext) throws -> LeafData {
guard ctx.parameters.count == 1, let filename = ctx.parameters[0].string else {
throw "Missing #relative parameters"
}
if let filepath = ctx.request?.url.path, filename.hasPrefix("/") == false {
return .string("\(relativePrefix(for: filepath, targetFile: filename))")
}
return .string("\(filename)")
}
private func relativePrefix(for pagePath: String, targetFile: String) -> String {
var components = pagePath
.trimmingCharacters(in: CharacterSet(charactersIn: "/"))
.split(separator: "/")
if let last = components.last, last.contains(".") {
components = components.dropLast()
}
let cleanTarget = targetFile.hasPrefix("./")
? String(targetFile.dropFirst(2))
: targetFile
return String(repeating: "../", count: components.count) + cleanTarget
}
}
```
配置标签
```swift
app.leaf.tags["relative"] = RelativePathTag()
```
现在可以在 Leaf 中使用我们的自定义标签了
```html
<link rel="stylesheet" href="#relative("main.css")" />
```

View File

@@ -197,7 +197,11 @@ t.n = t.n + 1 -- 改变 table
```lua
-- 给多个变量赋值
a, b = 10, 2*a --> a=10; b=20
-- 情况1a 未定义过
a, b = 10, 2*a -- 报错a 是 nil
-- 情况2a 已定义(比如 a=5
a = 5
a, b = 10, 2*a -- 右侧的 a=5结果 a=10, b=10不会报错
```
#### 交换变量
@@ -763,7 +767,7 @@ table["sex"] = "boy"
-- 获取 table 的长度
print(#table) -- 3
print(#table) -- 0
-- 如果想要删除一个 table那么可以使用 nil 赋值
table = nil

View File

@@ -1410,6 +1410,402 @@ true 或 false 条件
[thingSpeakWrite](https://ww2.mathworks.cn/help/matlab/ref/thingspeakwrite.html) | 将数据写入 `ThingSpeak` 通道
<!--rehype:className=style-list-->
## 面向对象基础
MATLAB 支持面向对象编程,虽然很少有人使用。
MATLAB 的自定义类型可以分成全值类和句柄类,它们的区别在于句柄类相当于指针,赋值时只会进行浅拷贝,全值类总是会进行深拷贝。下面的例子只涉及全值类。
### 简单例子
一个简单的 `point2d` 类(文件名必须与类名相同:`point2d.m`
```matlab
classdef point2d
properties % 属性
x
y
end
methods % 方法
function obj = point2d(x0,y0) % 构造方法
if nargin == 0
obj.x = 0;
obj.y = 0;
elseif nargin == 2
obj.x = x0;
obj.y = y0;
else
error("unsupported arguments")
end
end
function obj = normalize(obj) % 普通方法
% obj 相当于 Python 的 self
r = sqrt(obj.x^2+obj.y^2);
obj.x = obj.x/r;
obj.y = obj.y/r;
end
end
end
```
使用例如
```matlab
a = point2d(3,4);
fprintf('(%f, %f)\n',a.x,a.y);
% (3.000000, 4.000000)
b = a.normalize();
fprintf('(%f, %f)\n',b.x,b.y);
% (0.600000, 0.800000)
```
### 属性
可以给属性提供默认值
```matlab
classdef point2d
properties
x = cos(pi/12);
y = sin(pi/12);
end
...
end
```
默认值不需要是常量,可以是任何表达式
```matlab
classdef demo
properties
time_stamp = date;
end
...
end
```
属性的默认值在类被加载时会被计算,并不会在每一个对象创建时重新计算。
可以将属性标记为只读(`Constant`),不允许对其进行修改。
```matlab
classdef demo
properties(Constant)
R = pi/180;
end
...
end
```
尝试修改会报错
```matlab
s = demo();
disp(s.R)
s.R = 100; % error
```
### 构造方法和普通方法
#### 构造方法
与类同名的方法称为构造方法。MATLAB只允许创建一个构造方法但是我们通过nargin判断参数个数并据此实现不同的创建行为例如
```matlab
function obj = point2d(x0,y0)
if nargin == 0
obj.x = 0;
obj.y = 0;
elseif nargin == 2
obj.x = x0;
obj.y = y0;
else
error("unsupported arguments")
end
end
```
例如
```matlab
s1 = point2d(1,2);
s2 = point2d();
s3 = point2d;
```
#### 普通方法
类的普通方法的第一个参数是对象自身并且习惯上使用obj表示。
```matlab
classdef demo
properties
x = 100;
end
methods
function z = compute(obj,y)
z = obj.x + y;
end
end
end
```
普通方法可以通过对象或类调用
```matlab
s = demo();
s.compute(10); % 110
compute(s,20); % 120
```
### 静态方法
MATLAB 提供了静态方法,在定义时标记为 `Static`,静态方法没有`obj`参数,不绑定任何的对象,不能访问类对象的普通属性,但是可以访问类的常量属性。
例如
```matlab
classdef demo
methods(Static) % 静态方法
function hello()
disp("hello,world!")
end
end
end
```
使用例如
```matlab
>> demo.hello()
hello,world!
>> s = demo();
>> s.hello()
hello,world!
```
### 重写disp方法
可以通过提供`disp`方法来定制自定义类型调用`disp`函数时的行为,例如
```matlab
classdef point2d
properties
x = 0
y = 0
end
methods
function disp(obj)
fprintf("(%f,%f)",obj.x,obj.y);
end
end
end
```
提供`disp`函数后的输出
```matlab
>> s = point2d();
>> disp(s)
(0.000000,0.000000)
```
作为对比,默认情况下的输出
```matlab
>> s = point2d();
>> disp(s)
point2d with properties:
x: 0
y: 0
R: 0.0175
```
### 重载运算符
MATLAB 支持自定义类型对运算符的重载,例如`plus`方法对应加法。
```matlab
classdef point2d
properties
x
y
end
methods
function obj = point2d(x0,y0)
% same as before
end
function result = plus(obj, other)
result = point2d(obj.x + other.x, obj.y + other.y);
end
end
end
```
例如
```matlab
>> a = point2d(1,0);
>> b = point2d(0,2);
>> a + b
ans =
point2d with properties:
x: 1
y: 2
```
### 属性和方法的权限
MATLAB 提供了比 C++ 和 Java 更加精细的访问权限控制默认情况下所有的属性和方法都是public。
基本的三种权限例如
```matlab
classdef demo
properties % public
x1
end
properties(Access = protected)
x2
end
properties(Access = privated)
x3
end
methods % public
function h1(obj)
end
end
methods(Access = protected)
function h2(obj)
end
end
methods(Access = privated)
function h3(obj)
end
end
end
```
MATLAB对属性提供了更精细的访问权限可以将其拆分为读权限和写权限例如
```matlab
classdef demo
properties(SetAccess = private)
x1
end
properties(SetAccess = private, GetAccess = protected)
x2
end
end
```
### 类的继承
MATLAB 使用 `<` 表示继承关系。
基类
```matlab
classdef demo
properties
Value
end
methods
function obj = demo(val)
if nargin > 0
obj.Value = val;
else
obj.Value = 0;
end
end
function displayValue(obj)
disp(['Value: ', num2str(obj.Value)]);
end
end
end
```
派生类
```matlab
classdef demo2 < demo
properties
ExtraValue
end
methods
function obj = demo2(val, extraVal)
obj = obj@demo(val); % 调用基类构造方法
if nargin > 1
obj.ExtraValue = extraVal;
else
obj.ExtraValue = 0;
end
end
function displayValue(obj)
displayValue@demo(obj); % 调用基类的同名函数
disp(['Extra Value: ',num2str(obj.ExtraValue)]);
end
end
end
```
### 补充
#### 抽象方法和抽象类
MATLAB提供了抽象方法和抽象类。
抽象基类(不可实例化)
```matlab
classdef demo
methods(Abstract) % 抽象方法
hello(obj) % 只有接口,没有实现
end
end
```
继承自抽象基类的派生类(实现了抽象方法,可以实例化)
```matlab
classdef demo2 < demo
methods
function hello(obj) % 实现抽象方法
disp("hello,world!")
end
end
end
```
#### 禁止继承和重写
可以使用 `Sealed` 关键词来禁止一个类被继承,例如
```matlab
classdef (Sealed) demo
...
end
```
可以使用 `Sealed` 关键词来禁止方法被派生类重写,例如
```matlab
classdef demo
methods(Sealed)
...
end
end
```
另见
----

View File

@@ -181,13 +181,13 @@ mc rb myminio/mybucket/folder
移动文件夹
```sh
mc mv myminio/mybucket/folder myminio/mybucket/newfolder
mc mv -r myminio/mybucket/folder myminio/mybucket/newfolder
```
拷贝文件夹
```sh
mc cp myminio/mybucket/folder myminio/mybucket/newfolder
mc cp -r myminio/mybucket/folder myminio/mybucket/newfolder
```
删除文件夹中的所有文件
@@ -228,6 +228,228 @@ mc help
mc version
```
Admin 常用管理命令
---
### mc admin 管理操作
<!--rehype:wrap-class=col-span-3-->
`mc admin` 用于管理 MinIO 服务端(需要具备相应管理权限的账号/策略)。
#### 常用全局参数(`mc` 全局,对 `mc admin` 同样适用)
参数 | 说明
---- | ----
`--json` | 输出 JSON便于脚本解析与自动化处理
`--debug` | 打印调试信息(排查权限/网络/签名等问题)
`--insecure` | 跳过 TLS 证书校验(自签名证书/测试环境常用)
`-C, --config-dir <DIR>` | 指定 `mc` 配置目录(多环境隔离)
`-q, --quiet` | 静默模式,减少非必要输出
`--no-color` | 禁用彩色输出CI/日志更友好)
`--dp, --disable-pager` | 禁用分页器(管道/重定向场景更稳定)
`-H, --custom-header '<key>:<value>'` | 追加自定义 HTTP Header
<!--rehype:className=show-header left-align-->
### mc admin info节点/集群信息)
查看 MinIO 服务信息(集群/节点/版本等)。
```sh
mc admin info [--offline] TARGET
```
常用参数:
参数 | 说明
---- | ----
`--offline` | 允许在部分节点离线的情况下返回可用信息(排障场景常用)
<!--rehype:className=show-header left-align-->
示例:
```sh
mc admin info myminio
mc admin info --offline myminio
mc admin info --json myminio
```
### mc admin logs服务端日志
<!--rehype:wrap-class=col-span-2-->
按需拉取服务端日志输出(可指定节点)。
```sh
mc admin logs [--last <N>] [--type <TYPE>] TARGET [NODE]
```
常用参数:
参数 | 说明
---- | ----
`-l, --last <N>` | 返回最近 N 条日志
`-t, --type <TYPE>` | 指定服务类型(常见:`minio`
<!--rehype:className=show-header left-align-->
示例:
```sh
mc admin logs myminio
mc admin logs --last 100 myminio
mc admin logs --type minio myminio
mc admin logs --json --last 200 myminio
mc admin logs myminio http://minio-node-1:9000
```
### mc admin accesskey访问密钥 / Service Account
<!--rehype:wrap-class=col-span-3 row-span-2-->
用于创建与管理用户的访问密钥(常用于给应用/CI 生成可控权限的 Service Account
> 注:从 `mc` **2024-10-08** 起开始提供 `mc admin accesskey`(旧版本可能使用 `mc admin user svcacct` 等命令族)。
#### create创建
```sh
# 用户名可忽略,默认为当前用户
mc admin accesskey create [FLAGS] TARGET [USERNAME]
```
常用参数:
参数 | 说明
---- | ----
`--access-key <ACCESSKEY>` | 指定 Access Key不指定则自动生成
`--secret-key <SECRETKEY>` | 指定 Secret Key不指定则自动生成
`--comment <TEXT>` | 为该密钥添加备注
`--expiry <DURATION>` | 设置过期时间/有效期(不指定则为永久有效)
`--policy <JSON>` | 直接传入策略 JSON为该密钥绑定权限
`--policy-file <FILE>` | 从文件加载策略 JSON
`--description <TEXT>` | 描述信息
<!--rehype:className=show-header left-align-->
示例:
```sh
mc admin accesskey create myminio
mc admin accesskey create --comment "ci" --policy-file ./readonly.json myminio appuser
mc admin accesskey create --access-key "$AK" --secret-key "$SK" --expiry 168h myminio appuser
```
#### edit编辑
```sh
mc admin accesskey edit [FLAGS] TARGET ACCESSKEY
```
常用参数:
参数 | 说明
---- | ----
`--comment <TEXT>` | 更新备注
`--expiry <DURATION>` | 更新过期时间/有效期
`--policy <JSON>` | 更新策略 JSON
`--policy-file <FILE>` | 从文件更新策略 JSON
`--description <TEXT>` | 更新描述信息
<!--rehype:className=show-header left-align-->
示例:
```sh
mc admin accesskey edit --comment "rotate-2026-01" myminio "$AK"
mc admin accesskey edit --policy-file ./writeonly.json myminio "$AK"
```
#### info查看详情
```sh
mc admin accesskey info TARGET ACCESSKEY
```
示例:
```sh
mc admin accesskey info myminio "$AK"
mc admin accesskey info --json myminio "$AK"
```
#### ls列表
```sh
mc admin accesskey ls [FLAGS] TARGET [USERNAME]
```
常用参数:
参数 | 说明
---- | ----
`--all` | 列出所有用户(含临时用户)
`--self` | 仅列出当前用户
`--svcacc-only` | 仅列出临时 STS Key
`--temp-only` | 仅列出有 Access Key 的用户(只返回存在关联密钥的用户)
`--users-only` | 仅列出用户(不含临时 Key
<!--rehype:className=show-header left-align-->
示例:
```sh
mc admin accesskey ls myminio
mc admin accesskey ls myminio appuser
mc admin accesskey ls --users-only myminio
mc admin accesskey ls --svcacc-only myminio
```
#### enable / disable启用 / 禁用)
```sh
mc admin accesskey enable TARGET ACCESSKEY
mc admin accesskey disable TARGET ACCESSKEY
```
示例:
```sh
mc admin accesskey disable myminio "$AK"
mc admin accesskey enable myminio "$AK"
```
`$AK` 替换为你的AccessKey
#### rm删除
```sh
mc admin accesskey rm TARGET ACCESSKEY
```
示例:
```sh
mc admin accesskey rm myminio "$AK"
```
#### sts-revoke撤销 STS 临时凭证)
```sh
mc admin accesskey sts-revoke [FLAGS] TARGET [STS-KEY ...]
```
常用参数:
参数 | 说明
---- | ----
`--all` | 撤销全部 STS Key
`--self` | 撤销当前用户的 STS Key
`--token-type <TYPE>` | 仅撤销指定类型的 Token例如 `web`、`api`
<!--rehype:className=show-header left-align-->
示例:
```sh
mc admin accesskey sts-revoke --self myminio
mc admin accesskey sts-revoke --all myminio
mc admin accesskey sts-revoke --token-type web myminio
mc admin accesskey sts-revoke myminio "$STS_KEY"
```
另见
---

View File

@@ -95,12 +95,35 @@ mysql> exit
退出 `quit;``\q;` 一样的效果
### 备份
<!--rehype:wrap-class=col-span-2-->
创建备份
备份特定表
```sql
mysqldump -u user -p db_name > db.sql
```bash
mysqldump -u user -p db_name table1 table2 > tables_backup.sql
```
<!--rehype:className=wrap-text -->
备份多个数据库
```bash
mysqldump -u user -p --databases db1 db2 > multi_backup.sql
```
<!--rehype:className=wrap-text -->
备份所有数据库
```bash
mysqldump -u user -p --all-databases > all_backup.sql
```
<!--rehype:className=wrap-text -->
备份时压缩
```bash
mysqldump -u user -p db_name | gzip > db_backup.sql.gz
```
<!--rehype:className=wrap-text -->
导出不带架构的数据库
@@ -109,11 +132,116 @@ mysqldump -u user -p db_name --no-data=true --add-drop-table=false > db.sql
```
<!--rehype:className=wrap-text -->
恢复备份
仅导出数据
```shell
mysql -u user -p db_name < db.sql
```bash
mysqldump -u user -p --no-create-info db_name > only_data.sql
```
<!--rehype:className=wrap-text -->
仅导出结构
```bash
mysqldump -u user -p --no-data db_name > only_schema.sql
```
<!--rehype:className=wrap-text -->
导出时忽略某些表
```bash
mysqldump -u user -p db_name --ignore-table=db_name.table1 --ignore-table=db_name.table2 > partial.sql
```
<!--rehype:className=wrap-text -->
### 恢复备份
<!--rehype:wrap-class=row-span-2-->
恢复单个数据库备份
```bash
mysql -u user -p db_name < db_backup.sql
```
恢复多个数据库(带 `--databases` 选项备份的)
```bash
mysql -u user -p < multi_backup.sql
```
恢复所有数据库(使用 `--all-databases` 备份的)
```bash
mysql -u user -p < all_backup.sql
```
从 gzip 压缩的备份恢复
```bash
gunzip < db_backup.sql.gz | mysql -u user -p db_name
# 或:
zcat db_backup.sql.gz | mysql -u user -p db_name
```
<!--rehype:className=wrap-text -->
恢复单张表(从 `mysqldump` 单表导出文件)
```bash
mysql -u user -p db_name < table1_backup.sql
```
<!--rehype:className=wrap-text -->
先创建数据库再导入(如果备份中不包含 CREATE DATABASE
```bash
mysql -u user -p -e "CREATE DATABASE IF NOT EXISTS db_name;"
mysql -u user -p db_name < db_backup.sql
```
<!--rehype:className=wrap-text -->
恢复指定字符集(防止乱码)
```bash
mysql --default-character-set=utf8mb4 -u user -p db_name < db_backup.sql
```
<!--rehype:className=wrap-text -->
恢复时跳过某些错误(如重复键)
```bash
mysql -u user -p --force db_name < db_backup.sql
```
<!--rehype:className=wrap-text -->
恢复到远程主机数据库
```bash
mysql -h remote_host -u user -p db_name < db_backup.sql
```
<!--rehype:className=wrap-text -->
### 错误处理Error Handling
<!--rehype:wrap-class=col-span-2-->
| 语句 | 说明 |
| :--------------------------- | :------------------------------ |
| `SHOW ERRORS;` | 显示最近的错误 |
| `SHOW WARNINGS;` | 显示最近的警告 |
| `SHOW COUNT(*) ERRORS;` | 显示错误数量 |
| `SHOW COUNT(*) WARNINGS;` | 显示警告数量 |
| `EXPLAIN SELECT ...;` | 分析查询执行计划 |
| `SHOW ENGINE INNODB STATUS;` | 查看 InnoDB 状态和死锁信息 |
| `SHOW PROFILE;` | 显示语句的资源消耗(需开启 profiling |
| `SHOW PROFILES;` | 显示所有已记录的 profiling 数据 |
| `SHOW PROCESSLIST;` | 查看当前线程,排查长时间运行或阻塞的语句 |
| `SHOW STATUS LIKE 'Last_error%';` | 查看上次语句执行的错误信息 |
| `SHOW VARIABLES LIKE 'log_%';` | 查看错误日志相关配置 |
| `SHOW BINARY LOGS;` | 查看二进制日志,排查事务或复制异常 |
| `SHOW SLAVE STATUS\G` | 查看主从复制错误(用于主从复制场景) |
| `SHOW MASTER STATUS;` | 查看主库状态,辅助分析复制问题 |
<!--rehype:className=left-align-->
MySQL 示例
------
@@ -613,6 +741,7 @@ MySQL 数据类型
| `COUNT()` | 计算行数可选择性地忽略NULL值 |
| `MAX()` | 找出一列的最大值 |
| `MIN()` | 找出一列的最小值 |
| `GROUP_CONCAT()` | 将一组值连接成单一字符串,可指定分隔符,常用于分组。|
### 数学函数

View File

@@ -10,27 +10,28 @@ NGINX 备忘清单
<!--rehype:wrap-class=row-span-2-->
```bash
sudo systemctl status nginx # nginx当前状态
sudo systemctl reload nginx # 重新加载 nginx
sudo systemctl reload nginx # 重新加载 nginx
sudo systemctl restart nginx # 重启nginx
sudo nginx -t # 检查语法
nginx # 启动
nginx -s reload # 重启
nginx -s stop # 关闭进程
nginx -s quit # 平滑关闭nginx
```
状态
```bash
sudo systemctl status nginx # nginx当前状态
nginx -V # 查看nginx的安装状态
```
### Docker 安装
<!--rehype:wrap-class=col-span-2-->
检查语法
```bash
docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
sudo nginx -t # 检查语法
```
### 简单代理
<!--rehype:wrap-class=col-span-2-->
```nginx
location / {
@@ -40,6 +41,41 @@ location / {
}
```
### 简单代理
<!--rehype:wrap-class=row-span-2-->
Ubuntu/Debian
```shell
$ sudo apt update && sudo apt install -y nginx
```
<!--rehype:className=wrap-text-->
RHEL/CentOS
```shell
$ sudo yum install -y epel-release nginx && sudo systemctl enable --now nginx
```
<!--rehype:className=wrap-text-->
Docker 安装
```bash
$ docker run --name some-nginx -v /some/content:/usr/share/nginx/html:ro -d nginx
```
<!--rehype:className=wrap-text-->
### 配置路径
- `/etc/nginx/nginx.conf` _(main config)_
- `/etc/nginx/conf.d/*.conf` _(dropins)_
- `/etc/nginx/sites-available/` + `sites-enabled/` _(Debian style)_
- `/var/www/html` _(default docroot)_
- `logs`: `/var/log/nginx/access.log`, `/var/log/nginx/error.log`
配置
---
### 全局变量
<!--rehype:wrap-class=col-span-2 row-span-4-->
@@ -295,34 +331,75 @@ server {
server {
listen 443 ssl http2;
server_name example.com;
ssl on;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/privkey.pem;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /path/to/fullchain.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# 优化 SSL 配置
ssl_protocols TLSv1.2 TLSv1.3; # 禁用旧版 TLS
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
add_header Strict-Transport-Security max-age=15768000;
ssl_session_cache shared:SSL:10m;
# 其他配置(如根目录、代理等)
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
```
您可以使用 Let's Encrypt 轻松保护您的网站/应用程序。去 [lets-encrypt](https://certbot.eff.org/lets-encrypt/ubuntuxenial-nginx.html) 获取更多信息
### 重定向(301永久)
<!--rehype:wrap-class=row-span-2-->
虚拟主机与重定向
---
将 <www.example.com> 重定向到 example.com
### 基础服务器块
```nginx
server {
listen 80;
server_name www.example.com;
return 301 http://example.com$request_uri;
server_name example.com www.example.com;
root /var/www/example/public;
index index.html index.htm;
}
```
### HTTP→HTTPS 重定向
```nginx
server {
listen 80;
server_name demo.com www.demo.com;
return 301 https://demo.com$request_uri;
}
```
### 规范主机
```nginx
# Force non-www
server {
listen 80;
server_name www.demo.com;
return 301 $scheme://demo.com$request_uri;
}
```
### 重定向(301永久)
<!--rehype:wrap-class=row-span-2-->
将 <www.demo.com> 重定向到 demo.com
```nginx
server {
listen 80;
server_name www.demo.com;
return 301 http://demo.com$request_uri;
}
```
@@ -331,8 +408,8 @@ server {
```nginx
server {
listen 80;
server_name example.com;
return 301 https://example.com$request_uri;
server_name demo.com;
return 301 https://demo.com$request_uri;
}
```

1195
docs/nix.md Normal file

File diff suppressed because it is too large Load Diff

67
docs/pip.md Normal file
View File

@@ -0,0 +1,67 @@
pip 备忘清单
===
这份 pip 备忘清单汇总了 Python 包管理的常用命令,涵盖安装、卸载、版本控制、依赖管理及镜像加速等操作,助你高效掌控开发环境。
入门
---
### 基础命令
<!--rehype:wrap-class=col-span-2-->
命令 | 说明
:- | :-
`pip install package_name` | 安装指定的包
`pip install requests-2.22.0-py2.py3-none-any.whl` | 从本地的 wheel 文件安装包
`pip install git+https://github.com/psf/requests.git` | 从 Git 仓库安装包
`pip install /home/user/src/requests` | 从目录中安装包
`pip uninstall package_name` | 卸载指定的包
`pip list` | 查看已安装的包列表
`pip show package_name` | 查看某个包的详细信息
`pip search keyword` | 搜索 PyPI 包(新版 pip 已弃用,建议用 [pypi.org](https://pypi.org)
<!--rehype:className=left-align-->
### 版本控制
命令 | 说明
:- | :-
`pip install package==1.2.3` | 安装指定版本
`pip install "package>=1.0,<2.0"` | 安装满足条件的版本
`pip install package!=2.21.0` | 安装包,但排除某个特定版本
`pip install --upgrade package` | 升级包到最新版本
<!--rehype:className=style-list-->
### 依赖文件操作
命令 | 说明
:- | :-
`pip freeze` | 导出当前环境的所有包及版本
`pip freeze > requirements.txt` | 保存依赖列表到文件
`pip install -r requirements.txt` | 从文件安装依赖
<!--rehype:className=style-list-->
### 高级选项
命令 | 说明
:- | :-
`pip install .` | 安装当前目录中的包(`setup.py``pyproject.toml`
`pip install -e .` | 安装当前项目为可编辑模式(开发用)
`pip cache dir` | 查看 pip 缓存目录
`pip cache purge` | 清除 pip 缓存
`pip check` | 检查依赖冲突
<!--rehype:className=style-list-->
### 使用镜像源
命令 | 说明
:- | :-
`pip install -i https://pypi.org/simple package` | 使用官方源安装
`pip install -i https://pypi.tuna.tsinghua.edu.cn/simple package` | 使用清华镜像安装
`pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple` | 永久设置默认镜像
<!--rehype:className=style-list-->
另见
---
- [pip 官方文档](https://pip.pypa.io/en/stable/) _(pypa.io)_
- [Github 仓库](https://github.com/pypa/pip) _(github.com)_

View File

@@ -1394,6 +1394,34 @@ print(Yoki.legs) # => 4
Yoki.sound() # => Woof!
```
### 属性封装与访问控制
实现计算属性、只读属性和验证逻辑。
```python
class Person:
def __init__(self, age):
self._age = age # 约定_age 为内部属性
@property
def age(self):
"""获取年龄的方法,伪装成属性"""
return self._age
@age.setter
def age(self, value):
"""设置年龄的方法,添加验证逻辑"""
if value < 0:
raise ValueError("年龄不能为负数")
self._age = value
# 使用示例
p = Person(30)
print(p.age) # 直接访问属性,无需括号 → 30
p.age = 31 # 赋值操作调用 @age.setter → 验证通过
p.age = -5 # 抛出 ValueError: 年龄不能为负数
```
Python 数据模型
--------
@@ -1814,10 +1842,89 @@ finally: # 在所有情况下执行
print("我们可以在这里清理资源")
```
### 高阶函数map
将一个函数应用到可迭代对象(如列表)的每个元素上,并返回一个新的迭代器。
```python
def square(x):
return x ** 2
使用 map 函数
numbers = [1, 2, 3, 4]
result = map(square, numbers)
转换为列表查看结果
print(list(result)) # 输出: [1, 4, 9, 16]
```
### 高阶函数sorted
对可迭代对象进行排序,返回一个新的已排序列表(原对象不变)
```python
# 按照分数排序
users = [
{"name": "Alice", "score": 95, "time": "2023-01-15 10:30:00"},
{"name": "Bob", "score": 88, "time": "2023-01-15 09:45:00"},
{"name": "Charlie", "score": 95, "time": "2023-01-14 15:20:00"},
{"name": "David", "score": 85, "time": "2023-01-16 11:10:00"}
]
# reverse=True代表降序排序
sorted_users = sorted(users, key=lambda x: x["score"], reverse=True)
# 输出结果
for user in sorted_users:
print(f"{user['name']}: {user['score']}")
# 结果:
# Alice: 95
# Charlie: 95
# Bob: 88
# David: 85
```
### 高阶函数reduce
将一个二元函数(接受两个参数的函数)累积应用到可迭代对象的元素上,最终合并为单个值
```python
from functools import reduce
# 定义一个乘法函数
def multiply(x, y):
return x * y
# 使用 reduce 函数
numbers = [2, 3, 4, 5]
result = reduce(multiply, numbers)
print(result) # 输出: 1202×3×4×5=120
```
### 偏函数
固定原函数的某些参数,生成新函数
```python
from functools import partial
# 原函数:计算 x 的 y 次幂
def power(x, y):
return x ** y
# 创建偏函数,固定 y=2即平方函数
square = partial(power, y=2)
# 调用偏函数
print(square(5)) # 输出: 25 (5²)
print(square(10)) # 输出: 100 (10²)
```
### pyenv & pipenv
<!--rehype:wrap-class=col-span-3-->
pvenv 用于管理python版本pipenv 用于管理项目包版本
pyenv 用于管理python版本pipenv 用于管理项目包版本
#### pyenv
@@ -1829,13 +1936,21 @@ curl https://pyenv.run | bash
[更多安装方式](https://github.com/pyenv/pyenv#installation)
```shell
# 查看 pyenv 可以安装的 python 版本列表
pyenv install -l
# 按照 3.10 的前缀显示 python 的最新版本
pyenv latest 3.10
# 安装 python 版本
pyenv install 3.10.12
pyenv install 3.10.14
# 查看已安装的 python 版本
pyenv versions
# 设置 python 版本
pyenv global 3.10.12 # 全局设置
pyenv shell 3.10.12 # 针对当前 shell session
pyenv local 3.10.12 # 针对当前目录
pyenv global 3.10.14 # 全局设置
pyenv shell 3.10.14 # 针对当前 shell session
pyenv local 3.10.14 # 针对当前目录
```
#### pipenv

View File

@@ -252,6 +252,26 @@ LICENSE=Copyright (c) <b>2022</b> 小弟调调™
在项目根目录中创建 <pur>**.env**</pur> 文件
### 图片
![alt text](../icons/favicon.svg)
<img src="../icons/favicon.svg?#sss=1" alt="alt text" height="95" width="95" />
<hr />
```markdown
![alt text](./quickreference.svg?#sss=1)
<img
src="./quickreference.svg?#sss=1"
alt="alt text"
height="95"
width="95"
/>
```
在 Markdown 中引入图片
Markdown 语法注释
---
@@ -882,6 +902,50 @@ H2 部分
[#](https://github.com/jaywcjlove/reference/blob/ee03850619440e3700ed68ccc2ed21d3591a1490/docs/quickreference.md?plain=1#L850-L855)<!--rehype:target=__blank--> `<!--rehype:className=style-list-->`
### 列表圆圈样式展示表格
:- | :-
:- | :-
`visualEffectState.inactive` | 后台应一直显示为非激活状态。
`titleBarStyle` _string_ _(win/mac)_ | 窗口标题栏样式。默认值 _(default)_
`titleBarStyle.default` | 分别返回 _mac_ 或者 _win_ 的标准标题栏
<!--rehype:className=style-list-arrow circle-->
添加 `style-list-arrow` 和 `circle` 样式
### 列表实心圆圈样式展示表格
:- | :-
:- | :-
`visualEffectState.inactive` | 后台应一直显示为非激活状态。
`titleBarStyle` _string_ _(win/mac)_ | 窗口标题栏样式。默认值 _(default)_
`titleBarStyle.default` | 分别返回 _mac_ 或者 _win_ 的标准标题栏
<!--rehype:className=style-list-arrow circlefill-->
添加 `style-list-arrow` 和 `circlefill` 样式
### 列表方形展示表格
:- | :-
:- | :-
`visualEffectState.inactive` | 后台应一直显示为非激活状态。
`titleBarStyle` _string_ _(win/mac)_ | 窗口标题栏样式。默认值 _(default)_
`titleBarStyle.default` | 分别返回 _mac_ 或者 _win_ 的标准标题栏
<!--rehype:className=style-list-arrow square-->
添加 `style-list-arrow` 和 `square` 样式
### 列表实心方形展示表格
:- | :-
:- | :-
`visualEffectState.inactive` | 后台应一直显示为非激活状态。
`titleBarStyle` _string_ _(win/mac)_ | 窗口标题栏样式。默认值 _(default)_
`titleBarStyle.default` | 分别返回 _mac_ 或者 _win_ 的标准标题栏
<!--rehype:className=style-list-arrow squarefill-->
添加 `style-list-arrow` 和 `squarefill` 样式
### 列表箭头样式展示表格
:- | :-

View File

@@ -349,7 +349,7 @@ println!("为开发者分享 {cs}");
```rust
// 创建一个空字符串对象
let my_string = String::new;
let my_string = String::new();
// 转换为字符串对象
let S_string = a_string.to_string()
// 创建一个初始化的字符串对象

View File

@@ -246,6 +246,71 @@ $ ssh-keygen -R <ip/hostname>
- PEM
- PKCS8
端口转发
---------------
<!--rehype:body-class=cols-6-->
### 动态端口转发语法
<!--rehype:wrap-class=col-span-3-->
将本地端口变成一个 SOCKS 代理,自动转发任意目标地址的请求(适用于代理上网)。
```shell
$ ssh -D 本地SOCKS端口 用户名@SSH服务器 -N
```
示例:开启本地 1080 端口作为 SOCKS5 代理:
```shell
$ ssh -D 1080 -N user@example.com
```
### 验证 SOCKS5 代理
<!--rehype:wrap-class=col-span-3-->
使用 curl 命令验证 SOCKS5 代理是否工作正常:
```shell
# 设置
$ ssh -D 1080 -N user@example.com
# 验证
$ curl --socks5 127.0.0.1:1080 https://ifconfig.me
```
如果返回的是 `example.com` 服务器的公网 IP说明 SOCKS5 代理正常工作。
### 本地端口转发
<!--rehype:wrap-class=col-span-3-->
将本地端口的流量通过 SSH 隧道转发到目标服务器(适用于访问远程/内网服务)。
```shell
$ ssh -L [本地IP:]本地端口:目标IP:目标端口 用户名@SSH服务器 -N
```
示例:将本地的 `4000` 端口转发到远程内网服务器 192.168.1.10:80
```shell
$ ssh -L 4000:192.168.1.10:80 user@example.com -N
```
其中 `-N` 表示不执行远程命令,只是建立隧道。
### 远程端口转发
<!--rehype:wrap-class=col-span-3-->
让远程 SSH 服务器上的端口转发到本地的某个服务(适用于让外部访问你本地服务)。
```shell
$ ssh -R [SSH服务器IP:]远程端口:本地IP:本地端口 用户名@SSH服务器 -N
```
示例:将远程服务器的 5000 端口映射到你本地的 localhost:3306MySQL
```shell
$ ssh -R 5000:localhost:3306 user@example.com -N
```
另见
--------

View File

@@ -1859,7 +1859,9 @@ extension UIColor {
return objc_getAssociatedObject(self, &fuchsiaKey) as? UIColor
}
set {
objc_setAssociatedObject(self, &fuchsiaKey, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
objc_setAssociatedObject(self
, &fuchsiaKey, newValue
, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
@@ -1961,7 +1963,7 @@ print(floatBox.square()) // 输出 25.0
为泛型类型创建别名`typealias`,这样可以给泛型类型起一个更具体的名字,使得代码更加清晰易懂
- 示例1
#### 示例1
```swift
// 定义一个泛型类型别名 'IntBox'
@@ -1973,7 +1975,7 @@ print(intBox.value) // 输出 42
```
- 示例2
#### 示例2
```swift
// 定义一个泛型类型别名 'StringBox',其中 T 被约束为 String
@@ -2001,7 +2003,8 @@ class SimpleStorage<T>: Storage {
}
func retrieve() -> T? {
return items.isEmpty ? nil : items.removeLast()
return items.isEmpty
? nil : items.removeLast()
}
}
@@ -2011,6 +2014,85 @@ print(intStorage.retrieve() ?? "Empty")
// 打印: 42
```
命令工具
---
### 工具比对
<!--rehype:wrap-class=col-span-2-->
工具 | 功能 | 使用场景
:-- | :-- | :--
`swift` | 交互式执行器 / 脚本运行器 | 快速测试、运行脚本
`swiftc` | 编译器 | 编译源码为可执行文件
`swift-inspect` | 模块/符号分析工具 | 检查模块结构/调试工具输出
<!--rehype:className=show-header left-align-->
### swift — 脚本执行 & REPL
<!--rehype:wrap-class=row-span-3-->
命令 | 说明
:-- | :--
`swift` | 启动交互式环境REPL
`swift my_script.swift` | 运行 Swift 脚本文件
`swift build` | 使用 SwiftPM 编译项目
`swift build --clean` | 清理构建缓存
`swift build --disable-sandbox` | 在禁用沙盒模式下构建CI 用)
`swift run` | 构建并运行当前 SwiftPM 项目
`swift run --configuration release` | 以 release 模式构建并运行
`swift run --verbose` | 输出详细构建信息
`swift test` | 运行测试SwiftPM 项目)
`swift test --enable-code-coverage` | 测试覆盖率Xcode 项目)
`swift package resolve` | 解析依赖
<!--rehype:className=style-list-->
#### 创建项目
```shell
$ swift package init --type executable
$ swift package init --type library
```
#### 项目信息
```shell
# 查看项目描述
$ swift package describe
# 查看依赖树
$ swift package show-dependencies
# 导出 Package.swift 的 JSON 结构
$ swift package dump-package
```
### swiftc — 编译器命令
<!--rehype:wrap-class=col-span-2-->
命令 | 说明
:-- | :--
`swiftc main.swift` | 编译为默认名 `main` 的可执行文件
`swiftc main.swift -o myapp` | 编译为 `myapp` 可执行文件
`swiftc -c Foo.swift` | 编译为中间的 `.o` 文件
`swiftc Foo.swift Bar.swift -o app` | 编译多个文件成一个可执行文件
`swiftc -emit-library Foo.swift` | 编译为动态库 `.dylib`/`.so`
`swiftc -emit-module Foo.swift` | 仅生成 `.swiftmodule` 模块文件
`swiftc -emit-sil Foo.swift` | 输出 SILSwift Intermediate Language
`swiftc -emit-assembly Foo.swift` | 输出汇编代码
`swiftc -emit-object Foo.swift` | 输出目标文件 `.o`
<!--rehype:className=show-header left-align-->
### swift-inspect
<!--rehype:wrap-class=col-span-2-->
命令 | 说明
:-- | :--
`swift-inspect MyApp` | 分析一个编译产物(如 `.app``.dylib`
`swift-inspect --symbols MyModule.swiftmodule` | 查看模块的符号信息
`swift-inspect --help` | 查看所有可用选项
`swift-inspect --types MyApp` | 查看类型信息
`swift-inspect --protocols MyApp` | 查看协议实现
<!--rehype:className=show-header left-align-->
模块与符号分析工具macOS 14+
另见
----

View File

@@ -38,7 +38,7 @@ Systemd 备忘清单
`systemctl restart service` | 重新启动正在运行的服务
`systemctl reload service` | 重新加载服务中的所有配置文件
`systemctl daemon-reload` | 必须运行以重新加载更改的单元文件
`systemctl status` | service 查看服务是否正在运行/启用
`systemctl status service` | 查看服务是否正在运行/启用
`systemctl --failed` | 显示未能运行的服务
`systemctl reset-failed` | 将任何单位从失败状态重置
`systemctl enable service` | 使服务在启动时启动

View File

@@ -1,7 +1,7 @@
tauri 备忘清单
===
这个 [tauri](https://tauri.app/) 快速参考备忘单显示了它的常用命令使用清单
[tauri](https://tauri.app/) 是一个轻量、高性能的跨平台应用开发框架,这里展示了它的常用配置与命令清单
入门
---
@@ -44,7 +44,6 @@ $ bunx create-tauri-app
[rust](https://www.rust-lang.org/tools/install)| rust安装
[nodejs](https://nodejs.org/en)| nodejs安装
[Windows Build Tools](https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/)| Microsoft C++ 生成工具 (for windows)
[Android Studio](https://developer.android.google.cn/studio?hl=zh-cn)|安卓开发工具
### 启动 Tauri 开发窗口
@@ -112,7 +111,7 @@ RUST_BACKTRACE=1 tauri dev
Window 上这样开启
```bash
set RUST_BACKTRACE=1
set RUST_BACKTRACE=1
tauri dev
```
@@ -153,46 +152,278 @@ tauri = { version = "...", features = ["...", "devtools"] }
在文件 `src-tauri/Cargo.toml` 中启用 `devtools Cargo` 功能
移动端开发
---
### 注意事项
<!--rehype:wrap-class=col-span-2-->
Tauri 使用系统原生的 `Webview`,而不像 Electron 那样将完整的 `Chromium` 打包进应用,因此构建产物体积相当小。
但各手机厂商对于 `Webview` 的支持程度不同,因此在部分设备可能会出现一些兼容性问题。
安卓开发
---
### 安装 Android Studio
<!--rehype:wrap-class=row-span-2-->
在进行安卓开发之前,需要首先安装 [Android Studio](https://developer.android.google.cn/studio?hl=zh-cn) 并配置好环境变量。
安装后,打开 `Settings`,切换到 `Languages & Frameworks` > `Android SDK` 界面。
> 可以在这个页面更改 `Android SDK Location` 以调整 SDK 安装目录
安装以下内容:
- Android SDK Platform
- Android SDK Platform-Tools
- NDK (Side by side)
- Android SDK Build-Tools
- Android SDK Command-line Tools
### 环境变量
<!--rehype:wrap-class=col-span-2-->
`JAVA_HOME`
`ANDROID_HOME`
- `JAVA_HOME`: 若无其他 JDK 环境,可以配置为 Android Studio 安装目录下的 jbr 目录。
`NDK_HOME`
- `ANDROID_HOME`: 配置为 Android SDK Location 目录下的 sdk 目录。
### 准备目标
- `NDK_HOME`: 配置为 Android SDK Location 目录下的 ndk 下的 ndk 版本号目录。
### 编译目标
<!--rehype:wrap-class=col-span-2-->
Rust 默认只安装当前主机平台的编译目标(比如在 macOS 上默认就是 `x86_64-apple-darwin`)。
如果你想编译到其它平台或架构,就需要使用 `rustup target add` 安装对应的编译目标。
Android 应用打包时,一般会把编译的这几种架构的库文件全都放进 APK/ABB 中,系统会自动选择匹配的那个。
| target | CPU 架构 | 常见设备/场景 |
| --------------------------- | -------------- | ------------------- |
| **aarch64-linux-android** | ARM 64 位 | 新款安卓手机(主流) |
| **armv7-linux-androideabi** | ARM 32 位 | 老款安卓手机(较少见) |
| **i686-linux-android** | Intel x86 32 位 | 早期安卓模拟器(老旧) |
| **x86_64-linux-android** | Intel x86 64 位 | 安卓模拟器、新款 Chromebook |
```bash
$ npm install @tauri-apps/cli@next @tauri-apps/api@next
$ npm run tauri migrate
$ rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
$ rm -r src-tauri/gen
$ npm run tauri android init
$ npm run tauri icon
```
修改应用名:%app_path%\src-tauri\gen\android\app\src\main\res\values\strings.xml
### 创建 Android 项目
<!--rehype:wrap-class=row-span-3-->
创建基础 Tauri 项目:
### 编译
<!--rehype:wrap-class=col-span-2-->
```bash
$ npm run tauri android dev
$ npm run tauri android build
# 创建 tauri 项目
$ npm create tauri-app@latest
# 安装依赖
$ npm install
```
### 签名
手动创建:
```bash
$ npm install -D @tauri-apps/cli@latest
# 进入项目目录初始化,按照提示输入即可
$ npx tauri init
```
创建后,则可以执行以下命令:
```bash
# 初始化 Android 开发配置
$ npx tauri android init
# 开发 Android 应用
$ npx tauri android dev
# 构建 Android 应用
$ npx tauri android build
```
### 开发调试
<!--rehype:wrap-class=col-span-2-->
首先需要在开发环境下打开应用,才能进行调试。
在浏览器打开检查页面根据浏览器不同地址也不同edge 浏览器是 `edge://inspect`chrome 浏览器是 `chrome://inspect`
在检查页面中,会显示当前运行的应用,点击 `inspect` 即可打开调试工具。
### 生成签名
<!--rehype:wrap-class=col-span-2-->
Android 系统要求所有 APK 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。
`keytool` 是 Java 数据证书管理工具。
可以在 `JAVA_HOME` 环境变量指向的目录下的 `/bin/` 目录中找到 `keytool.exe`
执行以下命令之后按照提示进行输入即可。
```bash
$ keytool -genkey -v -keystore 自定义的数据文件名称 -storetype JKS -keyalg RSA -keysize 2048 -validity 10000 -alias 自定义的证书别名
```
如果是要上架应用商店的,要如实填写。否则可能会导致因信息不对从而上架失败。
输入完毕,确认后,工具会要求设置密码。记住密码,后面会用到。
完成以上操作后,在当前工作目录下会生成一个 `自定义的数据文件名称.keystore` 文件。
### 手动签名
<!--rehype:wrap-class=col-span-2-->
```bash
$ keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore
$ zipalign -p -f -v 4 unsigned.apk release.apk
$ apksigner sign --ks android.keystore release.apk
```
### 自动签名
<!--rehype:wrap-class=col-span-2-->
创建 `src-tauri/gen/android/keystore.properties` 文件。
```properties
storePassword=数据文件密码
keyPassword=证书密码
keyAlias=自定义的证书别名
storeFile=自定义的数据文件名称.keystore
```
需要注意,在 windows 下,`storeFile` 需要 `C:\\Program Files\\Android` 这样的格式。
随后找到 `src-tauri/gen/android/app/build.gradle.kts` 文件,添加以下内容:
```kotlin
import java.io.FileInputStream
// ...
android {
defaultConfig {
// ...
}
signingConfigs {
create("release") {
val keystorePropertiesFile = rootProject.file("keystore.properties")
val keystoreProperties = Properties()
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
}
keyAlias = keystoreProperties["keyAlias"] as String
keyPassword = keystoreProperties["keyPassword"] as String
storeFile = file(keystoreProperties["storeFile"] as String)
storePassword = keystoreProperties["storePassword"] as String
}
}
buildTypes {
// ...
getByName("release") {
signingConfig = signingConfigs.getByName("release")
// ...
}
}
}
```
配置完毕后,当执行 `npm run tauri android build` 时,会自动对构建的 APK/AAB 文件进行签名。
iOS 开发
---
### 预先准备
根据苹果政策MacOS 不允许运行在非 Mac 硬件上,而开发所依赖的 Xcode 工具链只在 MacOS 上可用。
因此,为了进行开发 iOS 和 MacOS 应用,必须要有一台 Mac 设备。
对应用进行签名和发布,需要加入 [Apple Developer Program年费 99 美元)](https://developer.apple.com/programs/whats-included/)。
不付费可以正常使用 Xcode 等工具,但无法进行正式签名和在 App Store 上架。
&nbsp;
### 签名
iOS 应用的签名现在已经非常简单了。
在 Xcode 打开项目,登录 Apple Developer 账号,在项目配置中找到并勾选自动管理签名即可。
Xcode 会自动帮助我们管理证书,签名等。
&nbsp;
### 开发调试
首先需要在开发环境下打开应用,才能进行调试。
在 Mac 上打开 Safari 浏览器,开启开发者模式,接着找到需要调试的设备即可。
如果是真机调试,则需要在设备上开启开发者模式。
&nbsp;
### 环境搭建
<!--rehype:wrap-class=col-span-2-->
#### 安装 Xcode
Xcode 是苹果官方的开发工具,提供了完整的开发环境,包括测试,分发,模拟器等。
需要注意的是Xcode 的版本并非越新越好,而是要根据当前设备的 MacOS 的系统版本来选择。
前往 [Xcode 页面](https://developer.apple.com/cn/xcode/) 下载安装 Xcode。
#### 安装 [Homebrew](https://brew.sh/zh-cn/)
```bash
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
#### 使用 Homebrew 安装 [Cocoapods](https://cocoapods.org/)
```bash
brew install cocoapods
```
#### 增加编译目标
```bash
$ rustup target add aarch64-apple-ios x86_64-apple-ios aarch64-apple-ios-sim
```
### 创建 iOS 项目
<!--rehype:wrap-class=col-span-1-->
首先创建基础 Tauri 项目。
```bash
# 创建 tauri 项目
$ npm create tauri-app@latest
# 安装依赖
$ npm install
```
手动创建:
```bash
$ npm install -D @tauri-apps/cli@latest
# 进入项目目录初始化,按照提示输入即可
$ npx tauri init
```
创建后,则可以执行以下命令:
```bash
# 初始化 iOS 开发配置
$ npx tauri ios init
# 开发 iOS 应用
$ npx tauri ios dev
# 构建 iOS 应用
$ npx tauri ios build
```
配置
---
@@ -294,7 +525,7 @@ $ apksigner sign --ks android.keystore release.apk
#### 隔离模式。建议出于安全目的
```json
{
{
"use": "isolation",
"options": { "dir": string }
}

439
docs/time-zones.md Normal file
View File

@@ -0,0 +1,439 @@
时区列表 备忘清单
===
全部时区列表帮助用户快速查看和管理世界各地时区的备忘参考清单
全部时区列表
----
### 完整代码
<!--rehype:wrap-class=col-span-3-->
UTC (协调世界时) | 时区 | 国家 | 时区主要城市
---|---|---|---
UTC-11 | Pacific/Midway | United States Minor Outlying Islands |
UTC-11 | Pacific/Niue | Niue | Alofi
UTC-11 | Pacific/Pago_Pago | American Samoa | Pago Pago, Tāfuna, Ta`ū, Taulaga
UTC-10 | America/Adak | United States |
UTC-10 | Pacific/Honolulu | United States | Honolulu, East Honolulu, Pearl City, Hilo, Kailua
UTC-10 | Pacific/Rarotonga | Cook Islands | Avarua
UTC-10 | Pacific/Tahiti | French Polynesia | Faaa, Papeete, Punaauia, Pirae, Mahina
UTC-9:30 | Pacific/Marquesas | French Polynesia | Taiohae
UTC-9 | America/Anchorage | United States | Anchorage, Fairbanks, Eagle River, Badger, Knik-Fairview
UTC-9 | America/Juneau | United States | Juneau
UTC-9 | America/Metlakatla | United States |
UTC-9 | America/Nome | United States |
UTC-9 | America/Sitka | United States | Sitka, Ketchikan
UTC-9 | America/Yakutat | United States |
UTC-9 | Pacific/Gambier | French Polynesia |
UTC-8 | America/Los_Angeles | United States | Los Angeles, San Diego, San Jose, San Francisco, Seattle
UTC-8 | America/Tijuana | Mexico | Tijuana, Mexicali, Ensenada, Rosarito, Tecate
UTC-8 | America/Vancouver | Canada | Vancouver, Surrey, Okanagan, Victoria, Burnaby
UTC-8 | Pacific/Pitcairn | Pitcairn | Adamstown
UTC-7 | America/Boise | United States | Boise, Meridian, Nampa, Idaho Falls, Pocatello
UTC-7 | America/Cambridge_Bay | Canada |
UTC-7 | America/Ciudad_Juarez | Mexico | Ciudad Juárez, Ascensión, Ascención, Puerto Palomas
UTC-7 | America/Creston | Canada | Creston
UTC-7 | America/Dawson | Canada |
UTC-7 | America/Dawson_Creek | Canada | Fort St. John, Dawson Creek
UTC-7 | America/Denver | United States | Denver, El Paso, Albuquerque, Colorado Springs, Aurora
UTC-7 | America/Edmonton | Canada | Calgary, Edmonton, Shaughnessy, Red Deer, Sherwood Park
UTC-7 | America/Fort_Nelson | Canada |
UTC-7 | America/Hermosillo | Mexico | Hermosillo, Ciudad Obregón, Nogales, San Luis Río Colorado, Navojoa
UTC-7 | America/Inuvik | Canada |
UTC-7 | America/Mazatlan | Mexico | Culiacán, Mazatlán, Tepic, Los Mochis, La Paz
UTC-7 | America/Phoenix | United States | Phoenix, Tucson, Mesa, Chandler, Gilbert
UTC-7 | America/Whitehorse | Canada | Whitehorse
UTC-7 | America/Yellowknife | Canada | Yellowknife
UTC-6 | America/Bahia_Banderas | Mexico | Mezcales, San Vicente, Bucerías, Valle de Banderas
UTC-6 | America/Belize | Belize | Belize City, San Ignacio, San Pedro, Orange Walk, Corozal
UTC-6 | America/Chicago | United States | Chicago, Houston, San Antonio, Dallas, Austin
UTC-6 | America/Chihuahua | Mexico | Chihuahua, Ciudad Delicias, Cuauhtémoc, Parral, Nuevo Casas Grandes
UTC-6 | America/Costa_Rica | Costa Rica | San José, Limón, San Francisco, Alajuela, Liberia
UTC-6 | America/El_Salvador | El Salvador | San Salvador, Soyapango, San Miguel, Santa Ana, Mejicanos
UTC-6 | America/Guatemala | Guatemala | Guatemala City, Villa Nueva, Mixco, Cobán, Quetzaltenango
UTC-6 | America/Indiana/Knox | United States |
UTC-6 | America/Indiana/Tell_City | United States | Tell City
UTC-6 | America/Managua | Nicaragua | Managua, León, Masaya, Chinandega, Matagalpa
UTC-6 | America/Matamoros | Mexico | Reynosa, Heroica Matamoros, Nuevo Laredo, Piedras Negras, Ciudad Acuña
UTC-6 | America/Menominee | United States | Menominee, Iron Mountain, Kingsford, Ironwood
UTC-6 | America/Merida | Mexico | Mérida, Campeche, Ciudad del Carmen, Kanasín, Valladolid
UTC-6 | America/Mexico_City | Mexico | Mexico City, Iztapalapa, León de los Aldama, Puebla, Ecatepec de Morelos
UTC-6 | America/Monterrey | Mexico | Monterrey, Torreón, Saltillo, Guadalupe, Victoria de Durango
UTC-6 | America/North_Dakota/Beulah | United States |
UTC-6 | America/North_Dakota/Center | United States |
UTC-6 | America/North_Dakota/New_Salem | United States | Mandan
UTC-6 | America/Ojinaga | Mexico | Manuel Ojinaga, Ojinaga
UTC-6 | America/Rankin_Inlet | Canada |
UTC-6 | America/Regina | Canada | Saskatoon, Regina, Prince Albert, Moose Jaw, North Battleford
UTC-6 | America/Resolute | Canada |
UTC-6 | America/Swift_Current | Canada | Swift Current
UTC-6 | America/Tegucigalpa | Honduras | Tegucigalpa, San Pedro Sula, La Ceiba, Choloma, El Progreso
UTC-6 | America/Winnipeg | Canada | Winnipeg, Brandon, Steinbach, Kenora, Thompson
UTC-6 | Pacific/Easter | Chile | Hanga Roa
UTC-6 | Pacific/Galapagos | Ecuador | Puerto Ayora, Puerto Baquerizo Moreno
UTC-5 | America/Atikokan | Canada |
UTC-5 | America/Bogota | Colombia | Bogotá, Cali, Medellín, Barranquilla, Cartagena
UTC-5 | America/Cancun | Mexico | Cancún, Chetumal, Playa del Carmen, Cozumel, Felipe Carrillo Puerto
UTC-5 | America/Cayman | Cayman Islands | George Town, West Bay, Bodden Town, North Side, East End
UTC-5 | America/Detroit | United States | Detroit, Grand Rapids, Warren, Sterling Heights, Ann Arbor
UTC-5 | America/Eirunepe | Brazil | Eirunepé, Benjamin Constant, Envira
UTC-5 | America/Grand_Turk | Turks and Caicos Islands | Cockburn Town
UTC-5 | America/Guayaquil | Ecuador | Quito, Guayaquil, Cuenca, Santo Domingo de los Colorados, Ambato
UTC-5 | America/Havana | Cuba | Havana, Santiago de Cuba, Camagüey, Holguín, Guantánamo
UTC-5 | America/Indiana/Indianapolis | United States | Indianapolis, Fort Wayne, South Bend, Carmel, Bloomington
UTC-5 | America/Indiana/Marengo | United States |
UTC-5 | America/Indiana/Petersburg | United States |
UTC-5 | America/Indiana/Vevay | United States |
UTC-5 | America/Indiana/Vincennes | United States | Jasper, Washington, Huntingburg
UTC-5 | America/Indiana/Winamac | United States |
UTC-5 | America/Iqaluit | Canada | Iqaluit
UTC-5 | America/Jamaica | Jamaica | Kingston, New Kingston, Spanish Town, Portmore, Montego Bay
UTC-5 | America/Kentucky/Louisville | United States | Louisville, Jeffersonville, New Albany, Jeffersontown, Pleasure Ridge Park
UTC-5 | America/Kentucky/Monticello | United States | Monticello
UTC-5 | America/Lima | Peru | Lima, Callao, Arequipa, Trujillo, Chiclayo
UTC-5 | America/Nassau | Bahamas | Nassau, Lucaya, Freeport, West End, Coopers Town
UTC-5 | America/New_York | United States | New York City, Brooklyn, Queens, Philadelphia, Manhattan
UTC-5 | America/Panama | Panama | Panamá, San Miguelito, Juan Díaz, David, Arraiján
UTC-5 | America/Port-au-Prince | Haiti | Port-au-Prince, Carrefour, Delmas 73, Port-de-Paix, Pétionville
UTC-5 | America/Rio_Branco | Brazil | Rio Branco, Cruzeiro do Sul, Senador Guiomard, Sena Madureira, Tarauacá
UTC-5 | America/Toronto | Canada | Toronto, Montréal, Ottawa, Mississauga, Brampton
UTC-4 | America/Anguilla | Anguilla | The Valley, Blowing Point Village, Sandy Ground Village, The Quarter, Sandy Hill
UTC-4 | America/Antigua | Antigua and Barbuda | Saint Johns, Piggotts, Bolands, Codrington, Parham
UTC-4 | America/Aruba | Aruba | Oranjestad, Tanki Leendert, San Nicolas, Santa Cruz, Paradera
UTC-4 | America/Asuncion | Paraguay | Asunción, Ciudad del Este, San Lorenzo, Capiatá, Lambaré
UTC-4 | America/Barbados | Barbados | Bridgetown, Speightstown, Oistins, Bathsheba, Holetown
UTC-4 | America/Blanc-Sablon | Canada |
UTC-4 | America/Boa_Vista | Brazil | Boa Vista
UTC-4 | America/Campo_Grande | Brazil | Campo Grande, Dourados, Corumbá, Três Lagoas, Ponta Porã
UTC-4 | America/Caracas | Venezuela | Caracas, Maracaibo, Maracay, Valencia, Barquisimeto
UTC-4 | America/Cuiaba | Brazil | Cuiabá, Várzea Grande, Rondonópolis, Sinop, Barra do Garças
UTC-4 | America/Curacao | Curacao | Willemstad, Sint Michiel Liber
UTC-4 | America/Dominica | Dominica | Roseau, Portsmouth, Berekua, Saint Joseph, Wesley
UTC-4 | America/Glace_Bay | Canada | Sydney, Glace Bay, Sydney Mines
UTC-4 | America/Goose_Bay | Canada | Happy Valley-Goose Bay, Labrador City
UTC-4 | America/Grenada | Grenada | Saint George's, Gouyave, Grenville, Victoria, Saint Davids
UTC-4 | America/Guadeloupe | Guadeloupe | Les Abymes, Baie-Mahault, Le Gosier, Petit-Bourg, Sainte-Anne
UTC-4 | America/Guyana | Guyana | Georgetown, Linden, New Amsterdam, Anna Regina, Bartica
UTC-4 | America/Halifax | Canada | Halifax, Dartmouth, Charlottetown, Lower Sackville, Cole Harbour
UTC-4 | America/Kralendijk | Bonaire, Saint Eustatius and Saba | Kralendijk, Oranjestad, The Bottom
UTC-4 | America/La_Paz | Bolivia | La Paz, Santa Cruz de la Sierra, Cochabamba, Sucre, Oruro
UTC-4 | America/Lower_Princes | Sint Maarten | Cul de Sac, Lower Princes Quarter, Koolbaai, Philipsburg
UTC-4 | America/Manaus | Brazil | Manaus, Itacoatiara, Parintins, Manacapuru, Coari
UTC-4 | America/Marigot | Saint Martin | Marigot
UTC-4 | America/Martinique | Martinique | Fort-de-France, Le Lamentin, Le Robert, Sainte-Marie, Le François
UTC-4 | America/Moncton | Canada | Moncton, Saint John, Fredericton, Dieppe, Miramichi
UTC-4 | America/Montserrat | Montserrat | Brades, Saint Peters, Plymouth
UTC-4 | America/Porto_Velho | Brazil | Porto Velho, Ji Paraná, Vilhena, Ariquemes, Cacoal
UTC-4 | America/Port_of_Spain | Trinidad and Tobago | Chaguanas, Mon Repos, San Fernando, Port of Spain, Rio Claro
UTC-4 | America/Puerto_Rico | Puerto Rico | San Juan, Bayamón, Carolina, Ponce, Arecibo
UTC-4 | America/Santiago | Chile | Santiago, Puente Alto, Antofagasta, Viña del Mar, Valparaíso
UTC-4 | America/Santo_Domingo | Dominican Republic | Santo Domingo, Santiago de los Caballeros, Santo Domingo Oeste, Santo Domingo Este, San Pedro de Macorís
UTC-4 | America/St_Barthelemy | Saint Barthelemy | Gustavia
UTC-4 | America/St_Kitts | Saint Kitts and Nevis | Basseterre, Fig Tree, Market Shop, Saint Pauls, Middle Island
UTC-4 | America/St_Lucia | Saint Lucia | Castries, Bisee, Vieux Fort, Micoud, Soufrière
UTC-4 | America/St_Thomas | U.S. Virgin Islands | Saint Croix, Charlotte Amalie, Cruz Bay
UTC-4 | America/St_Vincent | Saint Vincent and the Grenadines | Kingstown, Georgetown, Barrouallie, Port Elizabeth, Chateaubelair
UTC-4 | America/Thule | Greenland |
UTC-4 | America/Tortola | British Virgin Islands | Road Town
UTC-4 | Atlantic/Bermuda | Bermuda | Hamilton
UTC-3:30 | America/St_Johns | Canada | St. John's, Mount Pearl, Corner Brook, Conception Bay South, Grand Falls-Windsor
UTC-3 | America/Araguaina | Brazil | Palmas, Araguaína, Gurupi, Miracema do Tocantins, Taguatinga
UTC-3 | America/Argentina/Buenos_Aires | Argentina | Buenos Aires, Mar del Plata, Bahía Blanca, Merlo, Quilmes
UTC-3 | America/Argentina/Catamarca | Argentina | Catamarca, Comodoro Rivadavia, Trelew, Puerto Madryn, Esquel
UTC-3 | America/Argentina/Cordoba | Argentina | Córdoba, Rosario, Santa Fe, Corrientes, Posadas
UTC-3 | America/Argentina/Jujuy | Argentina | San Salvador de Jujuy, San Pedro de Jujuy, Libertador General San Martín, Palpalá, La Quiaca
UTC-3 | America/Argentina/La_Rioja | Argentina | La Rioja, Chilecito, Arauco, Chamical
UTC-3 | America/Argentina/Mendoza | Argentina | San Rafael, Mendoza, San Martín
UTC-3 | America/Argentina/Rio_Gallegos | Argentina | Río Gallegos, Caleta Olivia, Pico Truncado, Puerto Deseado, Las Heras
UTC-3 | America/Argentina/Salta | Argentina | Salta, Neuquén, Santa Rosa, San Carlos de Bariloche, Cipolletti
UTC-3 | America/Argentina/San_Juan | Argentina | San Juan, Chimbas, Santa Lucía, Pocito, Caucete
UTC-3 | America/Argentina/San_Luis | Argentina | San Luis, Villa Mercedes, La Punta, Merlo, Justo Daract
UTC-3 | America/Argentina/Tucuman | Argentina | San Miguel de Tucumán, Yerba Buena, Tafí Viejo, Alderetes, Aguilares
UTC-3 | America/Argentina/Ushuaia | Argentina | Ushuaia, Río Grande
UTC-3 | America/Bahia | Brazil | Salvador, Feira de Santana, Vitória da Conquista, Itabuna, Camaçari
UTC-3 | America/Belem | Brazil | Belém, Macapá, Ananindeua, Parauapebas, Marabá
UTC-3 | America/Cayenne | French Guiana | Cayenne, Matoury, Saint-Laurent-du-Maroni, Kourou, Rémire-Montjoly
UTC-3 | America/Fortaleza | Brazil | Fortaleza, São Luís, Natal, Teresina, João Pessoa
UTC-3 | America/Maceio | Brazil | Maceió, Aracaju, Arapiraca, Nossa Senhora do Socorro, São Cristóvão
UTC-3 | America/Miquelon | Saint Pierre and Miquelon | Saint-Pierre, Miquelon
UTC-3 | America/Montevideo | Uruguay | Montevideo, Salto, Paysandú, Las Piedras, Rivera
UTC-3 | America/Paramaribo | Suriname | Paramaribo, Lelydorp, Brokopondo, Nieuw Nickerie, Meerzorg
UTC-3 | America/Punta_Arenas | Chile | Punta Arenas, Puerto Natales
UTC-3 | America/Recife | Brazil | Recife, Jaboatão, Jaboatão dos Guararapes, Olinda, Paulista
UTC-3 | America/Santarem | Brazil | Santarém, Altamira, Itaituba, Óbidos, Oriximiná
UTC-3 | America/Sao_Paulo | Brazil | São Paulo, Rio de Janeiro, Belo Horizonte, Brasília, Curitiba
UTC-3 | Antarctica/Palmer | Antarctica |
UTC-3 | Antarctica/Rothera | Antarctica |
UTC-3 | Atlantic/Stanley | Falkland Islands | Stanley
UTC-2 | America/Noronha | Brazil |
UTC-2 | America/Nuuk | Greenland | Nuuk, Sisimiut, Ilulissat, Qaqortoq, Aasiaat
UTC-2 | Atlantic/South_Georgia | South Georgia and the South Sandwich Islands | Grytviken
UTC-1 | America/Scoresbysund | Greenland |
UTC-1 | Atlantic/Azores | Portugal | Ponta Delgada, Lagoa, Angra do Heroísmo, Rosto de Cão, Rabo de Peixe
UTC-1 | Atlantic/Cape_Verde | Cabo Verde | Praia, Mindelo, Espargos, Assomada, Tarrafal
UTC+0 | Africa/Abidjan | Ivory Coast | Abidjan, Abobo, Bouaké, Korhogo, Daloa
UTC+0 | Africa/Accra | Ghana | Kumasi, Accra, Tamale, Takoradi, Sekondi
UTC+0 | Africa/Bamako | Mali | Bamako, Ségou, Sikasso, Mopti, Koutiala
UTC+0 | Africa/Banjul | Gambia | Serekunda, Brikama, Bununka Kunda, Sukuta, Talinding
UTC+0 | Africa/Bissau | Guinea-Bissau | Bissau, Gabú, Bafatá, Canchungo, Bissorã
UTC+0 | Africa/Casablanca | Morocco | Casablanca, Rabat, Fès, Sale, Marrakesh
UTC+0 | Africa/Conakry | Guinea | Conakry, Camayenne, Nzérékoré, Kankan, Manéah
UTC+0 | Africa/Dakar | Senegal | Dakar, Pikine, Touba, Thiès, Thiès Nones
UTC+0 | Africa/El_Aaiun | Western Sahara | Laayoune, Dakhla, Boujdour, Laayoune Plage
UTC+0 | Africa/Freetown | Sierra Leone | Freetown, Bo, Kenema, Koidu, Makeni
UTC+0 | Africa/Lome | Togo | Lomé, Sokodé, Kara, Atakpamé, Kpalimé
UTC+0 | Africa/Monrovia | Liberia | Monrovia, Gbarnga, Buchanan, Kakata, Zwedru
UTC+0 | Africa/Nouakchott | Mauritania | Nouakchott, Nouadhibou, Dar Naim, Néma, Kaédi
UTC+0 | Africa/Ouagadougou | Burkina Faso | Ouagadougou, Bobo-Dioulasso, Koudougou, Saaba, Ouahigouya
UTC+0 | Africa/Sao_Tome | Sao Tome and Principe | São Tomé, Santo António
UTC+0 | America/Danmarkshavn | Greenland |
UTC+0 | Antarctica/Troll | Antarctica |
UTC+0 | Atlantic/Canary | Spain | Las Palmas de Gran Canaria, Santa Cruz de Tenerife, La Laguna, Telde, Arona
UTC+0 | Atlantic/Faroe | Faroe Islands | Tórshavn, Klaksvík, Fuglafjørður, Miðvágur, Tvøroyri
UTC+0 | Atlantic/Madeira | Portugal | Funchal, Câmara de Lobos, São Martinho, Caniço, Machico
UTC+0 | Atlantic/Reykjavik | Iceland | Reykjavík, Kópavogur, Hafnarfjörður, Reykjanesbær, Akureyri
UTC+0 | Atlantic/St_Helena | Saint Helena | Jamestown, Georgetown, Edinburgh of the Seven Seas
UTC+0 | Europe/Dublin | Ireland | Dublin, South Dublin, Cork, Limerick, Galway
UTC+0 | Europe/Guernsey | Guernsey | Saint Peter Port, Saint Sampson, St Martin, St Anne, Saint Saviour
UTC+0 | Europe/Isle_of_Man | Isle of Man | Douglas, Ramsey, Peel, Port Erin, Castletown
UTC+0 | Europe/Jersey | Jersey | Saint Helier, Le Hocq
UTC+0 | Europe/Lisbon | Portugal | Lisbon, Porto, Amadora, Braga, Setúbal
UTC+0 | Europe/London | United Kingdom | London, Birmingham, Liverpool, Glasgow, Sheffield
UTC+1 | Africa/Algiers | Algeria | Algiers, Oran, Constantine, Annaba, Blida
UTC+1 | Africa/Bangui | Central African Republic | Bangui, Bimbo, Bégoua, Carnot, Berbérati
UTC+1 | Africa/Brazzaville | Republic of the Congo | Brazzaville, Pointe-Noire, Dolisie, Nkayi, Kayes
UTC+1 | Africa/Ceuta | Spain | Melilla
UTC+1 | Africa/Douala | Cameroon | Douala, Yaoundé, Bamenda, Bafoussam, Maroua
UTC+1 | Africa/Kinshasa | Democratic Republic of the Congo | Kinshasa, Kikwit, Masina, Mbandaka, Matadi
UTC+1 | Africa/Lagos | Nigeria | Lagos, Kano, Ibadan, Port Harcourt, Benin City
UTC+1 | Africa/Libreville | Gabon | Libreville, Port-Gentil, Franceville, Owendo, Oyem
UTC+1 | Africa/Luanda | Angola | Luanda, Lubango, Huambo, Benguela, Cabinda
UTC+1 | Africa/Malabo | Equatorial Guinea | Bata, Malabo, Ebebiyin, Aconibe, Añisoc
UTC+1 | Africa/Ndjamena | Chad | N'Djamena, Moundou, Abéché, Sarh, Kelo
UTC+1 | Africa/Niamey | Niger | Niamey, Zinder, Maradi, Agadez, Alaghsas
UTC+1 | Africa/Porto-Novo | Benin | Cotonou, Abomey-Calavi, Porto-Novo, Parakou, Godomè
UTC+1 | Africa/Tunis | Tunisia | Tunis, Sfax, Sousse, Kairouan, Bizerte
UTC+1 | Africa/Windhoek | Namibia | Windhoek, Rundu, Walvis Bay, Oshakati, Swakopmund
UTC+1 | Arctic/Longyearbyen | Svalbard and Jan Mayen | Longyearbyen, Olonkinbyen
UTC+1 | Europe/Amsterdam | The Netherlands | Amsterdam, Rotterdam, The Hague, Utrecht, Groningen
UTC+1 | Europe/Andorra | Andorra | Andorra la Vella, les Escaldes, Encamp, Sant Julià de Lòria, la Massana
UTC+1 | Europe/Belgrade | Serbia | Belgrade, Pristina, Niš, Novi Sad, Prizren
UTC+1 | Europe/Berlin | Germany | Berlin, Hamburg, Munich, Köln, Frankfurt am Main
UTC+1 | Europe/Bratislava | Slovakia | Bratislava, Košice, Nitra, Prešov, Žilina
UTC+1 | Europe/Brussels | Belgium | Brussels, Antwerpen, Gent, Charleroi, Liège
UTC+1 | Europe/Budapest | Hungary | Budapest, Debrecen, Szeged, Miskolc, Pécs
UTC+1 | Europe/Copenhagen | Denmark | Copenhagen, Århus, Odense, Aalborg, Frederiksberg
UTC+1 | Europe/Gibraltar | Gibraltar | Gibraltar
UTC+1 | Europe/Ljubljana | Slovenia | Ljubljana, Maribor, Kranj, Celje, Koper
UTC+1 | Europe/Luxembourg | Luxembourg | Luxembourg, Esch-sur-Alzette, Dudelange, Schifflange, Bettembourg
UTC+1 | Europe/Madrid | Spain | Madrid, Barcelona, Valencia, Sevilla, Zaragoza
UTC+1 | Europe/Malta | Malta | San Pawl il-Baħar, Birkirkara, Mosta, Sliema, Qormi
UTC+1 | Europe/Monaco | Monaco | Monaco, Monte-Carlo, La Condamine
UTC+1 | Europe/Oslo | Norway | Oslo, Bergen, Trondheim, Stavanger, Drammen
UTC+1 | Europe/Paris | France | Paris, Marseille, Lyon, Toulouse, Nice
UTC+1 | Europe/Podgorica | Montenegro | Podgorica, Nikšić, Herceg Novi, Pljevlja, Budva
UTC+1 | Europe/Prague | Czechia | Prague, Brno, Ostrava, Pilsen, Liberec
UTC+1 | Europe/Rome | Italy | Rome, Milan, Naples, Turin, Palermo
UTC+1 | Europe/San_Marino | San Marino | Serravalle, Borgo Maggiore, San Marino, Domagnano, Fiorentino
UTC+1 | Europe/Sarajevo | Bosnia and Herzegovina | Sarajevo, Banja Luka, Zenica, Tuzla, Mostar
UTC+1 | Europe/Skopje | North Macedonia | Skopje, Kumanovo, Prilep, Bitola, Čair
UTC+1 | Europe/Stockholm | Sweden | Stockholm, Göteborg, Malmö, Uppsala, Linköping
UTC+1 | Europe/Tirane | Albania | Tirana, Durrës, Elbasan, Vlorë, Shkodër
UTC+1 | Europe/Vaduz | Liechtenstein | Schaan, Vaduz, Triesen, Balzers, Eschen
UTC+1 | Europe/Vatican | Vatican | Vatican City
UTC+1 | Europe/Vienna | Austria | Vienna, Graz, Linz, Favoriten, Donaustadt
UTC+1 | Europe/Warsaw | Poland | Warsaw, Łódź, Kraków, Wrocław, Poznań
UTC+1 | Europe/Zagreb | Croatia | Zagreb, Split, Rijeka, Osijek, Zadar
UTC+1 | Europe/Zurich | Switzerland | Zürich, Genève, Basel, Lausanne, Bern
UTC+2 | Africa/Blantyre | Malawi | Lilongwe, Blantyre, Mzuzu, Zomba, Kasungu
UTC+2 | Africa/Bujumbura | Burundi | Bujumbura, Gitega, Ngozi, Rumonge, Cibitoke
UTC+2 | Africa/Cairo | Egypt | Cairo, Alexandria, Giza, Shubrā al Khaymah, Port Said
UTC+2 | Africa/Gaborone | Botswana | Gaborone, Francistown, Mogoditshane, Maun, Molepolole
UTC+2 | Africa/Harare | Zimbabwe | Harare, Bulawayo, Chitungwiza, Mutare, Gweru
UTC+2 | Africa/Johannesburg | South Africa | Johannesburg, Cape Town, Durban, Soweto, Pretoria
UTC+2 | Africa/Juba | South Sudan | Juba, Winejok, Yei, Malakal, Wau
UTC+2 | Africa/Khartoum | Sudan | Khartoum, Omdurman, Nyala, Port Sudan, Kassala
UTC+2 | Africa/Kigali | Rwanda | Kigali, Gisenyi, Butare, Gitarama, Musanze
UTC+2 | Africa/Lubumbashi | Democratic Republic of the Congo | Lubumbashi, Mbuji-Mayi, Kananga, Kisangani, Bukavu
UTC+2 | Africa/Lusaka | Zambia | Lusaka, Ndola, Kitwe, Chipata, Kabwe
UTC+2 | Africa/Maputo | Mozambique | Maputo, Matola, Nampula, Beira, Chimoio
UTC+2 | Africa/Maseru | Lesotho | Maseru, Maputsoe, Mohale's Hoek, Mafeteng, Hlotse
UTC+2 | Africa/Mbabane | Eswatini | Manzini, Mbabane, Big Bend, Malkerns, Nhlangano
UTC+2 | Africa/Tripoli | Libya | Tripoli, Benghazi, Misratah, Zliten, Al Khums
UTC+2 | Asia/Beirut | Lebanon | Beirut, Ras Bayrūt, Tripoli, Sidon, Tyre
UTC+2 | Asia/Famagusta | Cyprus | Famagusta, Kyrenia, Égkomi, Protaras, Paralímni
UTC+2 | Asia/Gaza | Palestinian Territory | Gaza, Khān Yūnis, Jabālyā, Rafaḩ, Dayr al Balaḩ
UTC+2 | Asia/Hebron | Palestinian Territory | East Jerusalem, Hebron, Nablus, Ţūlkarm, Qalqīlyah
UTC+2 | Asia/Jerusalem | Israel | Jerusalem, Tel Aviv, West Jerusalem, Haifa, Rishon LeTsiyyon
UTC+2 | Asia/Nicosia | Cyprus | Nicosia, Limassol, Larnaca, Stróvolos, Káto Lakatámeia
UTC+2 | Europe/Athens | Greece | Athens, Thessaloníki, Pátra, Piraeus, Lárisa
UTC+2 | Europe/Bucharest | Romania | Bucharest, Sector 3, Iaşi, Sector 6, Sector 2
UTC+2 | Europe/Chisinau | Moldova | Chisinau, Tiraspol, Bălţi, Bender, Rîbniţa
UTC+2 | Europe/Helsinki | Finland | Helsinki, Espoo, Tampere, Oulu, Turku
UTC+2 | Europe/Kaliningrad | Russia | Kaliningrad, Chernyakhovsk, Sovetsk, Baltiysk, Gusev
UTC+2 | Europe/Kyiv | Ukraine | Kyiv, Kharkiv, Odesa, Dnipro, Donetsk
UTC+2 | Europe/Mariehamn | Aland Islands | Mariehamn
UTC+2 | Europe/Riga | Latvia | Riga, Daugavpils, Liepāja, Jelgava, Jūrmala
UTC+2 | Europe/Sofia | Bulgaria | Sofia, Plovdiv, Varna, Burgas, Stara Zagora
UTC+2 | Europe/Tallinn | Estonia | Tallinn, Tartu, Narva, Pärnu, Nõmme
UTC+2 | Europe/Vilnius | Lithuania | Vilnius, Kaunas, Klaipėda, Šiauliai, Panevėžys
UTC+3 | Africa/Addis_Ababa | Ethiopia | Addis Ababa, Jijiga, Gonder, Mek'ele, Nazrēt
UTC+3 | Africa/Asmara | Eritrea | Asmara, Keren, Himora, Massawa, Assab
UTC+3 | Africa/Dar_es_Salaam | Tanzania | Dar es Salaam, Mwanza, Arusha, Mbeya, Morogoro
UTC+3 | Africa/Djibouti | Djibouti | Djibouti, Ali Sabih, Dikhil, Tadjoura, Arta
UTC+3 | Africa/Kampala | Uganda | Kampala, Gulu, Lira, Mbarara, Jinja
UTC+3 | Africa/Mogadishu | Somalia | Mogadishu, Borama, Hargeysa, Berbera, Kismayo
UTC+3 | Africa/Nairobi | Kenya | Nairobi, Kakamega, Mombasa, Nakuru, Ruiru
UTC+3 | Antarctica/Syowa | Antarctica |
UTC+3 | Asia/Aden | Yemen | Sanaa, Aden, Al Ḩudaydah, Taiz, Mukalla
UTC+3 | Asia/Amman | Jordan | Amman, Zarqa, Irbid, Russeifa, Wādī as Sīr
UTC+3 | Asia/Baghdad | Iraq | Baghdad, Al Mawşil al Jadīdah, Al Başrah al Qadīmah, Mosul, Erbil
UTC+3 | Asia/Bahrain | Bahrain | Ar Rifā, Manama, Al Muharraq, Dār Kulayb, Madīnat Ḩamad
UTC+3 | Asia/Damascus | Syria | Aleppo, Damascus, Homs, Latakia, Ar Raqqah
UTC+3 | Asia/Kuwait | Kuwait | Al Aḩmadī, Ḩawallī, As Sālimīyah, Şabāḩ as Sālim, Al Farwānīyah
UTC+3 | Asia/Qatar | Qatar | Doha, Ar Rayyān, Umm Şalāl Muḩammad, Al Wakrah, Al Khawr
UTC+3 | Asia/Riyadh | Saudi Arabia | Jeddah, Riyadh, Mecca, Medina, Dammam
UTC+3 | Europe/Istanbul | Turkey | Istanbul, Ankara, Bursa, İzmir, Gaziantep
UTC+3 | Europe/Kirov | Russia | Kirov, Kirovo-Chepetsk, Vyatskiye Polyany, Slobodskoy, Kotelnich
UTC+3 | Europe/Minsk | Belarus | Minsk, Homyel', Hrodna, Mahilyow, Brest
UTC+3 | Europe/Moscow | Russia | Moscow, Saint Petersburg, Nizhniy Novgorod, Kazan, Rostov-na-Donu
UTC+3 | Europe/Simferopol | Ukraine | Sevastopol, Simferopol, Kerch, Yevpatoriya, Yalta
UTC+3 | Europe/Volgograd | Russia | Volgograd, Volzhsky, Kamyshin, Mikhaylovka, Uryupinsk
UTC+3 | Indian/Antananarivo | Madagascar | Antananarivo, Toamasina, Antsirabe, Mahajanga, Fianarantsoa
UTC+3 | Indian/Comoro | Comoros | Moroni, Moutsamoudou, Fomboni, Tsimbeo, Domoni
UTC+3 | Indian/Mayotte | Mayotte | Mamoudzou, Koungou, Dzaoudzi, Dembeni, Sada
UTC+3:30 | Asia/Tehran | Iran | Tehran, Mashhad, Isfahan, Karaj, Tabriz
UTC+4 | Asia/Baku | Azerbaijan | Baku, Sumqayıt, Ganja, Lankaran, Tovuz
UTC+4 | Asia/Dubai | United Arab Emirates | Dubai, Abu Dhabi, Sharjah, Al Ain City, Ajman City
UTC+4 | Asia/Muscat | Oman | Muscat, Seeb, Bawshar, Ibrī, Şalālah
UTC+4 | Asia/Tbilisi | Georgia | Tbilisi, Batumi, Kutaisi, Rustavi, Sokhumi
UTC+4 | Asia/Yerevan | Armenia | Yerevan, Gyumri, Vanadzor, Vagharshapat, Hrazdan
UTC+4 | Europe/Astrakhan | Russia | Astrakhan, Akhtubinsk, Znamensk, Kharabali, Kamyzyak
UTC+4 | Europe/Samara | Russia | Samara, Tolyatti, Izhevsk, Syzran, Novokuybyshevsk
UTC+4 | Europe/Saratov | Russia | Saratov, Balakovo, Engels, Balashov, Volsk
UTC+4 | Europe/Ulyanovsk | Russia | Ulyanovsk, Dimitrovgrad, Inza, Barysh, Novoulyanovsk
UTC+4 | Indian/Mahe | Seychelles | Victoria, Anse Boileau, Bel Ombre, Beau Vallon, Cascade
UTC+4 | Indian/Mauritius | Mauritius | Port Louis, Vacoas, Beau Bassin-Rose Hill, Curepipe, Quatre Bornes
UTC+4 | Indian/Reunion | Reunion | Saint-Denis, Saint-Paul, Le Tampon, Saint-Pierre, Saint-André
UTC+4:30 | Asia/Kabul | Afghanistan | Kabul, Herāt, Mazār-e Sharīf, Kandahār, Jalālābād
UTC+5 | Antarctica/Mawson | Antarctica |
UTC+5 | Asia/Aqtau | Kazakhstan | Shevchenko, Zhanaozen, Beyneu, Shetpe, Kuryk
UTC+5 | Asia/Aqtobe | Kazakhstan | Aktobe, Kandyagash, Shalqar, Khromtau, Embi
UTC+5 | Asia/Ashgabat | Turkmenistan | Ashgabat, Türkmenabat, Daşoguz, Mary, Balkanabat
UTC+5 | Asia/Atyrau | Kazakhstan | Atyrau, Qulsary, Shalkar, Balykshi, Maqat
UTC+5 | Asia/Dushanbe | Tajikistan | Dushanbe, Isfara, Istaravshan, Kŭlob, Konibodom
UTC+5 | Asia/Karachi | Pakistan | Karachi, Lahore, Faisalabad, Rawalpindi, Multan
UTC+5 | Asia/Oral | Kazakhstan | Oral, Aqsay, Zhanibek, Tasqala, Zhumysker
UTC+5 | Asia/Qyzylorda | Kazakhstan | Kyzylorda, Novokazalinsk, Aral, Shiyeli, Zhangaqorghan
UTC+5 | Asia/Samarkand | Uzbekistan | Samarkand, Nukus, Bukhara, Qarshi, Tirmiz
UTC+5 | Asia/Tashkent | Uzbekistan | Tashkent, Namangan, Andijon, Fergana, Qoqon
UTC+5 | Asia/Yekaterinburg | Russia | Yekaterinburg, Chelyabinsk, Ufa, Perm, Tyumen
UTC+5 | Indian/Kerguelen | French Southern Territories | Port-aux-Français
UTC+5 | Indian/Maldives | Maldives | Male, Fuvahmulah, Hithadhoo, Kulhudhuffushi, Thinadhoo
UTC+5:30 | Asia/Colombo | Sri Lanka | Colombo, Dehiwala-Mount Lavinia, Maharagama, Jaffna, Moratuwa
UTC+5:30 | Asia/Kolkata | India | Mumbai, Delhi, Bengaluru, Hyderābād, Ahmedabad
UTC+5:45 | Asia/Kathmandu | Nepal | Kathmandu, Bharatpur, Pātan, Birgañj, Biratnagar
UTC+6 | Antarctica/Vostok | Antarctica |
UTC+6 | Asia/Almaty | Kazakhstan | Almaty, Shymkent, Karagandy, Taraz, Astana
UTC+6 | Asia/Bishkek | Kyrgyzstan | Bishkek, Osh, Jalal-Abad, Karakol, Tokmok
UTC+6 | Asia/Dhaka | Bangladesh | Dhaka, Chattogram, Khulna, Rangpur, Comilla
UTC+6 | Asia/Omsk | Russia | Omsk, Tara, Kalachinsk, Znamenskoye, Tavricheskoye
UTC+6 | Asia/Qostanay | Kazakhstan | Kostanay, Rudnyy, Baikonur, Zhitikara, Arkalyk
UTC+6 | Asia/Thimphu | Bhutan | Thimphu, Phuntsholing, Tsirang, Punākha, Pemagatshel
UTC+6 | Asia/Urumqi | China | Ürümqi, Shihezi, Korla, Aksu, Kashgar
UTC+6 | Indian/Chagos | British Indian Ocean Territory |
UTC+6:30 | Asia/Yangon | Myanmar | Yangon, Mandalay, Nay Pyi Taw, Mawlamyine, Kyain Seikgyi Township
UTC+6:30 | Indian/Cocos | Cocos Islands | West Island
UTC+7 | Antarctica/Davis | Antarctica |
UTC+7 | Asia/Bangkok | Thailand | Hanoi, Bangkok, Haiphong, Samut Prakan, Huế
UTC+7 | Asia/Barnaul | Russia | Barnaul, Biysk, Rubtsovsk, Gorno-Altaysk, Novoaltaysk
UTC+7 | Asia/Hovd | Mongolia | Ulaangom, Khovd, Ölgii, Altai, Uliastay
UTC+7 | Asia/Ho_Chi_Minh | Vietnam | Ho Chi Minh City, Da Nang, Biên Hòa, Cần Thơ, Thuận An
UTC+7 | Asia/Jakarta | Indonesia | Jakarta, Surabaya, Bekasi, Bandung, Medan
UTC+7 | Asia/Krasnoyarsk | Russia | Krasnoyarsk, Abakan, Norilsk, Achinsk, Kyzyl
UTC+7 | Asia/Novokuznetsk | Russia | Kemerovo, Novokuznetsk, Prokopyevsk, Leninsk-Kuznetsky, Kiselëvsk
UTC+7 | Asia/Novosibirsk | Russia | Novosibirsk, Berdsk, Iskitim, Akademgorodok, Kuybyshev
UTC+7 | Asia/Phnom_Penh | Cambodia | Phnom Penh, Takeo, Siem Reap, Battambang, Paoy Paet
UTC+7 | Asia/Pontianak | Indonesia | Pontianak, Palangkaraya, Singkawang, Sampit, Sungai Raya
UTC+7 | Asia/Tomsk | Russia | Tomsk, Seversk, Strezhevoy, Kolpashevo, Asino
UTC+7 | Asia/Vientiane | Laos | Vientiane, Savannakhet, Pakse, Thakhèk, Luang Prabang
UTC+7 | Indian/Christmas | Christmas Island | Flying Fish Cove
UTC+8 | Asia/Brunei | Brunei | Bandar Seri Begawan, Kuala Belait, Seria, Tutong, Bangar
UTC+8 | Asia/Choibalsan | Mongolia | Baruun-Urt, Choibalsan
UTC+8 | Asia/Hong_Kong | Hong Kong | Hong Kong, Kowloon, Victoria, Tuen Mun, Sha Tin
UTC+8 | Asia/Irkutsk | Russia | Irkutsk, Ulan-Ude, Bratsk, Angarsk, Ust-Ilimsk
UTC+8 | Asia/Kuala_Lumpur | Malaysia | Kuala Lumpur, Petaling Jaya, Klang, Johor Bahru, Ipoh
UTC+8 | Asia/Kuching | Malaysia | Kota Kinabalu, Sandakan, Kuching, Tawau, Miri
UTC+8 | Asia/Macau | Macao | Macau, Taipa
UTC+8 | Asia/Makassar | Indonesia | Makassar, Samarinda, Denpasar, Balikpapan, Banjarmasin
UTC+8 | Asia/Manila | Philippines | Quezon City, Davao, Manila, Caloocan City, Budta
UTC+8 | Asia/Shanghai | China | Shanghai, Beijing, Shenzhen, Guangzhou, Chengdu
UTC+8 | Asia/Singapore | Singapore | Singapore, Jurong Town, Woodlands, Punggol, Kampong Pasir Ris
UTC+8 | Asia/Taipei | Taiwan | Taipei, Kaohsiung, Taichung, Tainan, Banqiao
UTC+8 | Asia/Ulaanbaatar | Mongolia | Ulan Bator, Erdenet, Darhan, Mörön, Bayanhongor
UTC+8 | Australia/Perth | Australia | Perth, Mandurah, Bunbury, Baldivis, Geraldton
UTC+8:45 | Australia/Eucla | Australia |
UTC+9 | Asia/Chita | Russia | Chita, Krasnokamensk, Borzya, Petrovsk-Zabaykalskiy, Aginskoye
UTC+9 | Asia/Dili | Timor Leste | Dili, Maliana, Suai, Likisá, Aileu
UTC+9 | Asia/Jayapura | Indonesia | Jayapura, Ambon, Sorong, Ternate, Manokwari
UTC+9 | Asia/Khandyga | Russia |
UTC+9 | Asia/Pyongyang | North Korea | Pyongyang, Hamhŭng, Nampo, Sunchŏn, Hŭngnam
UTC+9 | Asia/Seoul | South Korea | Seoul, Busan, Incheon, Daegu, Gwangju
UTC+9 | Asia/Tokyo | Japan | Tokyo, Yokohama, Osaka, Nagoya, Sapporo
UTC+9 | Asia/Yakutsk | Russia | Yakutsk, Blagoveshchensk, Belogorsk, Neryungri, Svobodnyy
UTC+9 | Pacific/Palau | Palau | Koror, Koror Town, Kloulklubed, Ulimang, Mengellang
UTC+9:30 | Australia/Adelaide | Australia | Adelaide, Adelaide Hills, Mount Gambier, Morphett Vale, Gawler
UTC+9:30 | Australia/Broken_Hill | Australia | Broken Hill
UTC+9:30 | Australia/Darwin | Australia | Darwin, Alice Springs, Palmerston, Howard Springs
UTC+10 | Antarctica/DumontDUrville | Antarctica |
UTC+10 | Antarctica/Macquarie | Australia |
UTC+10 | Asia/Ust-Nera | Russia |
UTC+10 | Asia/Vladivostok | Russia | Khabarovsk, Vladivostok, Khabarovsk Vtoroy, Komsomolsk-on-Amur, Ussuriysk
UTC+10 | Australia/Brisbane | Australia | Brisbane, Gold Coast, Logan City, Townsville, Cairns
UTC+10 | Australia/Hobart | Australia | Hobart, Launceston, Burnie, Devonport, Sandy Bay
UTC+10 | Australia/Lindeman | Australia |
UTC+10 | Australia/Melbourne | Australia | Melbourne, Geelong, Ballarat, Bendigo, Point Cook
UTC+10 | Australia/Sydney | Australia | Sydney, Canberra, Newcastle, Wollongong, Maitland
UTC+10 | Pacific/Chuuk | Micronesia | Weno, Colonia
UTC+10 | Pacific/Guam | Guam | Dededo Village, Yigo Village, Tamuning, Tamuning-Tumon-Harmon Village, Mangilao Village
UTC+10 | Pacific/Port_Moresby | Papua New Guinea | Port Moresby, Lae, Mount Hagen, Popondetta, Madang
UTC+10 | Pacific/Saipan | Northern Mariana Islands | Saipan, San Jose Village
UTC+10:30 | Australia/Lord_Howe | Australia |
UTC+11 | Antarctica/Casey | Antarctica |
UTC+11 | Asia/Magadan | Russia | Magadan, Ust-Nera, Susuman, Ola
UTC+11 | Asia/Sakhalin | Russia | Yuzhno-Sakhalinsk, Korsakov, Kholmsk, Okha, Nevelsk
UTC+11 | Asia/Srednekolymsk | Russia |
UTC+11 | Pacific/Bougainville | Papua New Guinea | Arawa, Buka
UTC+11 | Pacific/Efate | Vanuatu | Port-Vila, Luganville, Isangel, Sola, Lakatoro
UTC+11 | Pacific/Guadalcanal | Solomon Islands | Honiara, Malango, Auki, Gizo, Kirakira
UTC+11 | Pacific/Kosrae | Micronesia | Tofol
UTC+11 | Pacific/Norfolk | Norfolk Island | Kingston
UTC+11 | Pacific/Noumea | New Caledonia | Nouméa, Mont-Dore, Dumbéa, Païta, Wé
UTC+11 | Pacific/Pohnpei | Micronesia | Kolonia, Kolonia Town, Palikir - National Government Center
UTC+12 | Antarctica/McMurdo | Antarctica |
UTC+12 | Asia/Anadyr | Russia | Anadyr, Bilibino
UTC+12 | Asia/Kamchatka | Russia | Petropavlovsk-Kamchatsky, Yelizovo, Vilyuchinsk, Klyuchi, Milkovo
UTC+12 | Pacific/Auckland | New Zealand | Auckland, Wellington, Christchurch, Manukau City, North Shore
UTC+12 | Pacific/Fiji | Fiji | Nasinu, Suva, Lautoka, Nadi, Labasa
UTC+12 | Pacific/Funafuti | Tuvalu | Funafuti, Savave Village, Tanrake Village, Toga Village, Asau Village
UTC+12 | Pacific/Kwajalein | Marshall Islands | Ebaye, Jabat
UTC+12 | Pacific/Majuro | Marshall Islands | Majuro, Arno, Jabor, Wotje, Mili
UTC+12 | Pacific/Nauru | Nauru | Yaren, Baiti, Anabar, Uaboe, Ijuw
UTC+12 | Pacific/Tarawa | Kiribati | Tarawa, Betio Village, Bikenibeu Village
UTC+12 | Pacific/Wake | United States Minor Outlying Islands |
UTC+12 | Pacific/Wallis | Wallis and Futuna | Mata-Utu, Leava, Alo
UTC+12:45 | Pacific/Chatham | New Zealand | Waitangi
UTC+13 | Pacific/Apia | Samoa | Apia, Asau, Mulifanua, Afega, Leulumoega
UTC+13 | Pacific/Fakaofo | Tokelau | Atafu Village, Nukunonu, Fale old settlement
UTC+13 | Pacific/Kanton | Kiribati |
UTC+13 | Pacific/Tongatapu | Tonga | Nukualofa, Lapaha, Neiafu, Pangai, Ohonua
UTC+14 | Pacific/Kiritimati | Kiribati |
<!--rehype:className=left-align show-header-->
另见
---
<!--rehype:wrap-class=col-span-3-->
- [时区列表](https://help.aliyun.com/zh/maxcompute/user-guide/time-zones) _(aliyun.com)_
- [全部时区列表](https://www.zeitverschiebung.net/cn/all-time-zones.html) _(zeitverschiebung.net)_

123
docs/uv.md Normal file
View File

@@ -0,0 +1,123 @@
uv 备忘清单
===
一个用 Rust 编写的极快的 Python 包和项目管理工具
安装
---
### 使用独立安装程序安装
<!--rehype:wrap-class=col-span-2-->
#### macOS or Linux
```sh
curl -LsSf https://astral.sh/uv/install.sh | sh
```
#### Windows
```sh
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
```
### 通过PyPI
```sh
# pip
pip install uv
```
```sh
# pipx
pipx install uv
```
入门
---
### 创建新项目
<!--rehype:wrap-class=row-span-2-->
```sh
# 创建一个目录作为项目的根目录
uv init project_name
```
```sh
# 将当前目录作为项目的根目录
uv init
```
#### 项目的结构
```sh
.
├── .venv/ # 虚拟环境目录
│ ├── bin/ # 可执行文件
│ ├── lib/ # 安装的库
│ └── pyvenv.cfg # 虚拟环境配置
├── .python-version # 指定 Python 版本
├── README.md # 项目说明文档
├── main.py # 主程序入口
├── pyproject.toml # 项目配置与依赖声明
└── uv.lock # 依赖锁定文件(自动生成)
```
### 管理项目依赖
<!--rehype:wrap-class=row-span-2-->
#### 添加依赖
```sh
uv add requests
```
#### 指定依赖版本或替代来源
```sh
# 指定版本
uv add 'requests==2.28.1'
# 指定来源
uv add git+https://github.com/psf/requests
```
#### 从`requirements.txt`迁移
```sh
uv add -r requirements.txt
```
#### 删除一个包
```sh
uv remove requests
```
#### 升级一个包
```sh
uv lock --upgrade-package requests
```
### 运行脚本
指定脚本运行
```sh
uv run main.py
```
指定Python版本运行
```sh
uv run --python 3.10 main.py
```
### 构建项目
```sh
uv build
```
构建结果存储在`dist`目录下

View File

@@ -841,51 +841,13 @@ export default router
### 3.路由的query
```html
<template>
<div>
<ul class="list">
<!-- to的对象写法 -->
<li v-for="item of data" :key="item.id">
<router-link
class="link"
:to="{
path:'/home/message/mes',
query: { id:item.id, title:item.mes }
}"
>{{item.mes}}</router-link>
</li>
</ul>
<hr>
<router-view></router-view>
</div>
</template>
<script>
export default {
name:'HomeChild1',
data() {
return {
data:[
{id:1,mes:"消息1"},
{id:2,mes:"消息2"},
{id:3,mes:"消息3"}
]
}
},
}
<script setup>
import { useRoute } from 'vue-router';
const route = useRoute();
</script>
<style scoped>
.list { margin-left:80px; }
.link{
color: orange;
text-decoration: none;
background-color: skyblue;
}
</style>
```
> 接收参数 `{{$route.query.id}}`
> 接收参数 `{{route.query.id}}`
#### 跳转路由并携带参数
@@ -1529,10 +1491,356 @@ declare module 'vue' {
from: Route,
next: () => void
): void
}
}
```
## 性能优化
### 介绍
性能优化是构建高效 Vue 应用的关键。以下是一些特殊的优化策略,结合 Vue 的特性,可以大幅减少渲染开销、提升加载速度和用户体验。这些方法不仅限于单一 API而是从整体架构和开发实践出发提供通用的性能提升思路。
### 条件渲染与缓存结合
通过结合 `v-if` 和 `<KeepAlive>`,可以避免频繁销毁和重建组件,尤其是在切换视图或路由时。搭配 `defineAsyncComponent` 实现懒加载,进一步减少初次加载的开销。
```html
<template>
<div>
<button @click="toggle">Toggle View</button>
<keep-alive>
<component :is="currentView" />
</keep-alive>
</div>
</template>
<script setup>
import { ref, defineAsyncComponent } from 'vue';
const currentView = ref('ViewA');
const toggle = () => {
currentView.value = currentView.value === 'ViewA' ? 'ViewB' : 'ViewA';
};
const ViewA = defineAsyncComponent(() => import('./ViewA.vue'));
const ViewB = defineAsyncComponent(() => import('./ViewB.vue'));
</script>
//<KeepAlive> 缓存动态组件,防止重复创建和销毁。
//defineAsyncComponent 实现组件懒加载,仅在需要时加载模块。
//效果:减少 DOM 操作和组件初始化的性能消耗,特别适合复杂组件切换或路由场景。
```
### 路由前置优化beforeRouteEnter
在路由进入前执行数据预取或条件检查,可以避免不必要的渲染和请求,提升页面加载效率。
```html
<script>
import { defineComponent } from 'vue';
export default defineComponent({
name: 'Profile',
beforeRouteEnter(to, from, next) {
// 模拟数据预取
fetchUserData(to.params.id).then((user) => {
next((vm) => {
vm.user = user; // 将数据传递给组件实例
});
}).catch(() => {
next(false); // 阻止路由进入
});
},
data() {
return {
user: null,
};
},
});
</script>
<template>
<div v-if="user">
<h1>{{ user.name }}</h1>
</div>
</template>
```
### 响应式对象的精简
避免将大型对象直接用 reactive 包裹,而是按需拆分,使用 ref 或 toRef 精细控制响应式范围,减少依赖追踪的开销。
```html
<script setup>
import { ref, toRef, reactive } from 'vue';
const largeData = {
user: { name: 'Alice', age: 25 },
settings: { theme: 'dark', fontSize: 16 },
items: Array(1000).fill({ id: 0, value: 'test' }),
};
// 仅将需要的部分设为响应式
const userName = ref(largeData.user.name);
const settings = reactive(largeData.settings);
const firstItem = toRef(largeData.items[0], 'value');
</script>
<template>
<div>
<input v-model="userName" />
<p>Theme: {{ settings.theme }}</p>
<p>First Item: {{ firstItem }}</p>
</div>
</template>
```
### 计算属性的延迟执行
通过封装计算属性并结合 watchEffect实现按需计算避免不必要的开销。
```html
<script setup>
import { ref, computed, watchEffect } from 'vue';
const items = ref([]);
const filterText = ref('');
const filteredItems = computed(() => {
return items.value.filter((item) => item.includes(filterText.value));
});
watchEffect(() => {
if (filterText.value) {
// 仅在 filterText 不为空时触发计算
filteredItems.value;
}
});
</script>
<template>
<div>
<input v-model="filterText" placeholder="Filter items" />
<ul>
<li v-for="item in filteredItems" :key="item">{{ item }}</li>
</ul>
</div>
</template>
```
### v-memo 缓存子树
v-memo 用于缓存模板子树,仅在依赖项变化时更新,常用于优化列表或静态内容。
```html
<template>
<div v-for="item in items" :key="item.id" v-memo="[item.updated]">
{{ item.name }} - {{ expensiveComputation(item) }}
</div>
</template>
<script setup>
import { ref } from 'vue';
const items = ref([
{ id: 1, name: 'Item 1', updated: false },
{ id: 2, name: 'Item 2', updated: false },
]);
const expensiveComputation = (item) => {
return item.name.toUpperCase(); // 模拟复杂计算
};
</script>
```
### 事件节流与防抖
通过在事件处理中引入节流throttle或防抖debounce减少高频事件的触发频率。
```html
<script setup>
import { ref } from 'vue';
import { debounce } from 'lodash-es';
const searchText = ref('');
const search = debounce((value) => {
console.log('Search:', value); // 模拟搜索请求
}, 300);
const handleInput = (e) => {
searchText.value = e.target.value;
search(searchText.value);
};
</script>
<template>
<input
:value="searchText"
@input="handleInput"
placeholder="Type to search"
/>
</template>
```
### 虚拟列表Virtual Scrolling
对于长列表(如包含数千条数据的列表),可以使用虚拟列表技术,只渲染可视区域内的元素,减少 DOM 节点数量。
```html
<template>
<div class="list-container" ref="list">
<div class="list-viewport" :style="{ height: totalHeight + 'px' }">
<div
class="list-content"
:style="{ transform: `translateY(${scrollTop}px)` }"
>
<div
v-for="item in visibleItems"
:key="item.id"
class="list-item"
>
{{ item.name }}
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref, computed, onMounted, onUnmounted } from 'vue';
const items = ref(
Array.from({ length: 10000 }, (_, i) => ({
id: i,
name: `Item ${i}`,
}))
);
const itemHeight = 40; // 每项高度
const viewportHeight = 400; // 视口高度
const totalHeight = computed(() => items.value.length * itemHeight);
const scrollTop = ref(0);
const visibleCount = Math.ceil(viewportHeight / itemHeight) + 2; // 多渲染2项作为缓冲
const visibleItems = computed(() => {
const start = Math.floor(scrollTop.value / itemHeight);
const end = Math.min(start + visibleCount, items.value.length);
return items.value.slice(start, end);
});
const list = ref(null);
const onScroll = () => {
scrollTop.value = list.value.scrollTop;
};
onMounted(() => {
list.value.addEventListener('scroll', onScroll);
});
onUnmounted(() => {
list.value.removeEventListener('scroll', onScroll);
});
</script>
<style>
.list-container {
height: 400px;
overflow-y: auto;
}
.list-item {
height: 40px;
line-height: 40px;
border-bottom: 1px solid #ddd;
}
</style>
```
### 按需加载资源Lazy Loading Resources
通过动态导入Dynamic Import按需加载非关键资源如图片、第三方库可以减少初次加载的开销提升首屏渲染速度。
```html
<template>
<div>
<button @click="loadChart">Load Chart</button>
<div v-if="ChartComponent">
<ChartComponent :data="chartData" />
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const ChartComponent = ref(null);
const chartData = ref([10, 20, 30, 40]);
const loadChart = async () => {
// 动态导入第三方库(如 Chart.js
const { default: Chart } = await import('chart.js/auto');
// 模拟动态加载的图表组件
ChartComponent.value = {
props: ['data'],
template: `<canvas ref="chart"></canvas>`,
mounted() {
new Chart(this.$refs.chart, {
type: 'bar',
data: {
labels: ['A', 'B', 'C', 'D'],
datasets: [{ data: this.data }],
},
});
},
};
};
</script>
```
### 优化事件监听Event Delegation
通过事件委托Event Delegation将事件监听器绑定到父元素减少直接绑定到每个子元素的事件监听器数量适合动态列表或大量元素场景。
```html
<template>
<div class="item-list" @click="handleItemClick">
<div
v-for="item in items"
:key="item.id"
:data-id="item.id"
class="item"
>
{{ item.name }}
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const items = ref([
{ id: 1, name: 'Item 1' },
{ id: 2, name: 'Item 2' },
{ id: 3, name: 'Item 3' },
]);
const handleItemClick = (event) => {
const itemId = event.target.dataset.id;
if (itemId) {
console.log(`Clicked item with ID: ${itemId}`);
}
};
</script>
<style>
.item-list {
padding: 10px;
}
.item {
padding: 10px;
border-bottom: 1px solid #ddd;
cursor: pointer;
}
</style>
```
API 参考
---

537
docs/wails.md Normal file
View File

@@ -0,0 +1,537 @@
Wails V2 备忘清单
===
[![GitHub Repo stars](https://img.shields.io/github/stars/wailsapp/wails?style=flat)](https://github.com/wailsapp/wails) [![GitHub release (latest by date)](https://img.shields.io/github/v/release/wailsapp/wails?style=flat)](https://github.com/wailsapp/wails/releases/latest) [![Go Reference](https://pkg.go.dev/badge/github.com/wailsapp/wails/v2.svg)](https://pkg.go.dev/github.com/wailsapp/wails/v2)
Wails 是一个基于 Go 和现代 Web 技术(如 Vue、React、Svelte 等)构建跨平台桌面应用的轻量级开源框架,可作为 Electron 的替代方案,以下是 Wails v2 的常用命令和示例速查v3 仍在开发中)。
<!--rehype:style=padding-top: 12px;-->
## 命令行工具 (CLI)
### 安装与更新
```bash
# 安装 Wails CLI
$ go install github.com/wailsapp/wails/v2/cmd/wails@latest
# 更新到最新稳定版
$ wails update
# 更新到最新预发布版
$ wails update -pre
```
<!--rehype:className=wrap-text-->
### 常用命令参数
<!--rehype:wrap-class=col-span-2 row-span-2-->
| 命令 | 参数 | 描述 |
| ------- | ----------------------- | ---------------------------------------------------------- |
| `init` | `-n` | **项目名称 (必填)** |
| | `-t` | 模板名称 (`vue`, `react`, `svelte`, `angular`) 或模板 URL |
| | `-ide` | 为 `vscode``goland` 生成 IDE 配置 |
| | `-f` | 强制覆盖现有目录 |
| `dev` | `-browser` | 在浏览器中打开前端界面进行调试 |
| | `-assetdir` | 指定前端资产目录的路径 |
| | `-frontenddevserverurl` | 使用外部前端开发服务器的 URL |
| | `-wailsjsdir` | 指定生成的 Wails JS 模块目录 |
| | `-reload` | 启用自动重载 |
| `build` | `-platform` | 交叉编译目标平台, 如 `darwin/arm64` |
| | `-clean` | 构建前清理 `build/bin` 目录 |
| | `-upx` | 使用 UPX 压缩最终的二进制文件 |
| | `-nsis` | (Windows) 生成 NSIS 安装程序 |
| | `-webview2` | (Windows) WebView2 依赖处理策略 (`download`, `embed`, `browser`) |
| | `-debug` | 保留调试信息 |
| | `-devtools` | 在生产版本中启用开发者工具 |
| | `-ldflags` | 传递给 Go 链接器的标志 |
| | `-tags` | 构建标签 |
<!--rehype:className=wrap-text left-align-->
### 项目命令
```bash
# 初始化新项目 (以 Vue 模板为例)
$ wails init -n my-project -t vue
# 使用自定义模板
$ wails init -n my-project -t https://github.com/user/template
# 进入项目目录并启动实时开发
$ cd my-project
$ wails dev
# 构建生产版本 (以 Windows 平台为例)
$ wails build -platform windows/amd64 -clean -upx
# 检查环境依赖
$ wails doctor
# 生成绑定文件
$ wails generate module
```
<!--rehype:className=wrap-text-->
## 项目配置
### 项目结构
```shell
my-project/
├── build/ # 构建输出目录
├── frontend/ # 前端源文件
│ └── wailsjs/ # Wails 自动生成的模块
├── app.go # 应用核心逻辑
├── main.go # 应用入口
├── go.mod
└── wails.json # 项目配置文件
```
### `wails.json` 详解
<!--rehype:wrap-class=col-span-2-->
| 配置项 | 描述 | 示例 |
| ---------------------- | ---------------------------- | --------------------------- |
| `name` | 项目名称 | `"my-app"` |
| `outputfilename` | 输出的二进制文件名 | `"my-app.exe"` |
| `frontend:install` | 前端依赖安装命令 | `"npm install"` |
| `frontend:build` | 前端构建命令 | `"npm run build"` |
| `frontend:dev:watcher` | 开发模式下运行的前端监视命令 | `"npm run dev"` |
| `frontend:dev:serverUrl` | 前端开发服务器 URL | `"http://localhost:3000"` |
| `wailsjsdir` | 生成 JS 模块的目录 | `"./frontend/wailsjs"` |
| `assetdir` | 前端资产目录 | `"./frontend/dist"` |
| `reloaddirs` | 监听重载的目录 | `"frontend/src,app.go"` |
| `author.name` | 作者名称,用于打包元数据 | `"Your Name"` |
| `author.email` | 作者邮箱 | `"you@example.com"` |
| `info` | (macOS) 用于 `Info.plist` 的元数据 | `{"CFBundleName": "MyApp"}` |
<!--rehype:className=wrap-text left-align-->
## 核心交互与生命周期
### 方法绑定 (Go <-> JS)
在 Go 中定义公共方法,即可在前端直接调用。
```go
// app.go
type App struct {
ctx context.Context
}
func (a *App) Greet(name string) string {
return fmt.Sprintf("Hello %s!", name)
}
// main.go
app := NewApp()
err := wails.Run(&options.App{
Title: "My App",
Bind: []interface{}{
app, // 暴露 app 实例的所有公共方法
},
})
```
```js
// frontend/main.js
import { Greet } from '../wailsjs/go/main/App';
Greet("World").then(result => console.log(result));
```
### 事件系统 (Events)
用于在 Go 和前端之间异步发送和监听消息。
#### Go 端 (`runtime.Events*`)
```go
import "github.com/wailsapp/wails/v2/pkg/runtime"
// 发送事件到前端
runtime.EventsEmit(app.ctx, "go-event", "data from Go")
// 监听来自前端的事件
runtime.EventsOn(app.ctx, "js-event", func(optionalData ...interface{}) {
// ... 处理数据
})
```
#### JavaScript 端 (`runtime.Events*`)
```js
import { EventsOn, EventsEmit } from '../wailsjs/runtime';
// 发送事件到 Go
EventsEmit("js-event", { "payload": 123 });
// 监听来自 Go 的事件
EventsOn("go-event", (data) => {
console.log("Received data from Go:", data);
});
```
### 应用生命周期钩子
`wails.Run()` 中定义,用于在应用关键节点执行 Go 代码。
```go
// main.go
err := wails.Run(&options.App{
// ...
OnStartup: app.startup,
OnDomReady: app.domReady,
OnShutdown: app.shutdown,
// 返回 bool 值决定是否关闭
OnBeforeClose: app.beforeClose,
})
```
| 钩子 | 描述 |
| --------------- | ------------------------- |
| `OnStartup` | 应用启动时,在窗口创建前调用 |
| `OnDomReady` | 前端 DOM 加载完成后调用 |
| `OnShutdown` | 应用关闭前,在窗口销毁后调用 |
| `OnBeforeClose` | 用户关闭窗口时调用,返回 `true` 可阻止关闭 |
<!--rehype:className=wrap-text left-align-->
## 运行时 API (Runtime)
### 窗口 (Window)
<!--rehype:wrap-class=col-span-3-->
| 功能 | Go 示例 (`runtime.*`) | JS 示例 (`runtime.*`) |
| ------------- | ------------------------------------- | --------------------------------------------- |
| **设置标题** | `WindowSetTitle(ctx, "New")` | `WindowSetTitle("New")` |
| **设置尺寸** | `WindowSetSize(ctx, 800, 600)` | `WindowSetSize(800, 600)` |
| **设置最小/最大尺寸** | `WindowSetMinSize(ctx, 400, 300)` | `WindowSetMinSize(400, 300)` |
| **居中** | `WindowCenter(ctx)` | `WindowCenter()` |
| **全屏/取消全屏** | `WindowFullscreen(ctx)` | `WindowFullscreen()` |
| **显示/隐藏** | `WindowShow(ctx)` / `WindowHide(ctx)` | `WindowShow()` / `WindowHide()` |
| **设为置顶** | `WindowSetAlwaysOnTop(ctx, true)` | `WindowSetAlwaysOnTop(true)` |
| **拖动窗口** | (仅 JS) | 在 HTML 元素上设置 `style="--wails-draggable:drag"` |
<!--rehype:className=wrap-text left-align-->
### 对话框 (Dialog)
<!--rehype:wrap-class=col-span-3-->
#### Go 端
```go
dialogOpts := &runtime.OpenDialogOptions{ Title: "Select File" }
filePath, err := runtime.OpenFileDialog(app.ctx, *dialogOpts)
```
| 对话框类型 | Go 方法 (`runtime.*`) |
| -------- | ---------------------------------------------------------- |
| **信息框** | `MessageDialog(ctx, runtime.MessageDialogOptions{...})` |
| **打开文件** | `OpenFileDialog(ctx, runtime.OpenDialogOptions{...})` |
| **保存文件** | `SaveFileDialog(ctx, runtime.SaveDialogOptions{...})` |
| **打开目录** | `OpenDirectoryDialog(ctx, runtime.OpenDialogOptions{...})` |
<!--rehype:className=wrap-text left-align-->
#### JavaScript 端
```js
import { OpenFileDialog } from '../wailsjs/runtime';
async function selectFile() {
const filePath = await OpenFileDialog({ title: "Select File" });
}
```
### 菜单 (Menu)
<!--rehype:wrap-class=col-span-2-->
```go
// main.go
appMenu := menu.NewMenu()
fileMenu := appMenu.AddSubmenu("File")
fileMenu.AddText("Quit", keys.CmdOrCtrl("q"), func(_ *menu.CallbackData) {
runtime.Quit(app.ctx)
})
err := wails.Run(&options.App{
// ...
Menu: appMenu,
})
```
| 菜单项类型 | 示例 |
| ------- | --------------------------------------------------------- |
| **文本项** | `menu.AddText("Item", accelerator, callback)` |
| **复选框** | `menu.AddCheckbox("Toggle", true, accelerator, callback)` |
| **分隔符** | `menu.AddSeparator()` |
| **子菜单** | `menu.AddSubmenu("Submenu")` |
<!--rehype:className=wrap-text -->
### 其他 Runtime API
#### 日志
```go
// Go 示例 (`runtime.*`)
LogInfo(ctx, "Message")
// JS 示例 (`runtime.*`)
LogInfo("Message")
```
#### 剪贴板
```go
// Go 示例 (`runtime.*`)
ClipboardSetText(ctx, "text")
// JS 示例 (`runtime.*`)
ClipboardSetText("text")
```
应用打包与分发
---
### Windows 打包
<!--rehype:wrap-class=col-span-2 row-span-2-->
#### <red>■</red> 默认生成: `.exe` 可执行文件
<!--rehype:style=text-align: left;font-weight: bold;-->
```bash
$ wails build -platform windows/amd64
```
#### <red>■</red> 生成 NSIS 安装程序
<!--rehype:style=text-align: left;font-weight: bold;-->
**前提条件**: 需要预先安装 [NSIS (Nullsoft Scriptable Install System)](https://nsis.sourceforge.io/Download)。
- **下载 NSIS**: 从 [NSIS 官方网站](https://nsis.sourceforge.io/Download) 下载最新版本的 NSIS 安装程序。
- **安装 NSIS**: 运行安装程序并按照提示完成安装。**确保**在安装过程中选择将 NSIS 添加到系统的 `PATH` 环境变量中,以便 `makensis` 命令可以在命令行中全局访问。
- **验证安装**:
```bash
$ makensis -VERSION
```
如果安装正确,您将看到 NSIS 的版本号输出。
**生成安装程序**:
```bash
$ wails build -platform windows/amd64 -nsis
```
#### <red>■</red> 处理 WebView2 依赖
<!--rehype:style=text-align: left;font-weight: bold;-->
`download`: 提示用户下载 WebView2。
```bash
$ wails build -platform windows/amd64 -webview2 download
```
`embed`: 将 WebView2 嵌入到应用中(推荐)。
```bash
$ wails build -platform windows/amd64 -webview2 embed
```
`browser`: 在浏览器中打开下载页面。
```bash
$ wails build -platform windows/amd64 -webview2 browser
```
### macOS 打包
#### <red>■</red> 默认生成: `.app` 应用程序包
<!--rehype:style=text-align: left;font-weight: bold;-->
```bash
$ wails build -platform darwin/amd64
```
#### <red>■</red> 代码签名与公证
<!--rehype:style=text-align: left;font-weight: bold;-->
需要通过 Apple 开发者账户进行 **代码签名** 和 **公证** 才能分发。
#### <red>■</red> 跳过打包成 `.app` 步骤
<!--rehype:style=text-align: left;font-weight: bold;-->
```bash
$ wails build -platform darwin/amd64 -skippackage
```
<!--rehype:className=wrap-text-->
### Linux 打包
#### <red>■</red> 生成可执行文件
<!--rehype:style=text-align: left;font-weight: bold;-->
```bash
$ wails build -platform linux/amd64
```
#### <red>■</red> 打包成 `.deb`
<!--rehype:style=text-align: left;font-weight: bold;-->
```bash
$ wails build -platform linux/amd64 -deb
```
#### <red>■</red> 打包成 `.rpm`
<!--rehype:style=text-align: left;font-weight: bold;-->
```bash
$ wails build -platform linux/amd64 -rpm
```
---
#### AppImage 支持
Wails 不直接内置对 AppImage 的支持,但可以使用外部工具手动创建。使用 `appimagetool`:
```shell
appimagetool ./your-app-dir
```
**安装 `appimagetool`**:
- 您可以从 [AppImage 官方网站](https://appimage.org/) 获取 `appimagetool`。
- 下载后,将其添加到您的 `PATH` 中以便全局访问。
## 进阶主题与杂项
### 平台特定构建选项
<!--rehype:wrap-class=col-span-2 row-span-2-->
在 `main.go` 的 `wails.Run()` 中为不同平台提供细粒度配置。
```go
err := wails.Run(&options.App{
// ...
Windows: &windows.Options{
WebviewIsTransparent: true, // WebView2 背景透明
WindowIsTranslucent: true, // 窗口背景透明
DisableWindowIcon: false, // 禁用窗口图标
Theme: windows.SystemDefault, // 主题设置
},
Mac: &mac.Options{
TitleBar: &mac.TitleBar{
TitlebarAppearsTransparent: true, // 透明标题栏
HideTitle: false, // 隐藏标题
HideTitleBar: false, // 隐藏标题栏
FullSizeContent: false, // 全尺寸内容
UseToolbar: false, // 使用工具栏
},
About: &mac.AboutInfo{
Title: "My Awesome App",
Message: "© 2025 Me",
Icon: icon, // 应用图标
},
WebviewIsTransparent: true, // WebView 透明
WindowIsTranslucent: false, // 窗口半透明
},
Linux: &linux.Options{
Icon: icon, // Linux 图标
WindowIsTranslucent: false, // 窗口半透明
},
})
```
### 使用 TypeScript
Wails 会自动为 Go 绑定的方法生成 TypeScript 定义。
```bash
# wails.json
"frontend:build": "npm run build"
# package.json
"scripts": {
"build": "tsc && vite build"
}
```
### 上下文 (Context)
使用 Go 的 context 进行更好的资源管理和取消操作。
```go
// app.go
func (a *App) LongRunningTask(ctx context.Context) error {
select {
case <-time.After(5 * time.Second):
return nil
case <-ctx.Done():
return ctx.Err() // 任务被取消
}
}
```
### 调试
- **Go 部分**: 使用 `wails dev -debug` 启动并附加您的 Go 调试器。
- **前端部分**: 在 `wails dev` 模式下,右键点击应用,选择“检查”打开浏览器开发者工具。
### 性能优化
#### 构建优化
```bash
# 使用构建标签优化
$ wails build -tags production
# 使用 ldflags 减小二进制文件大小
$ wails build -ldflags "-s -w"
# 使用 UPX 压缩
$ wails build -upx
# 组合使用多个优化选项
$ wails build -ldflags "-s -w" -upx -tags production
```
#### 前端优化 (wails.json)
```json
{
"frontend:build": "npm run build:prod",
"frontend:dev:build": "npm run build:dev"
}
```
### 常见问题与解决方案
#### 构建问题
```bash
# 清理构建缓存
$ wails build -clean
# 强制重新生成绑定
$ wails generate module -f
# 检查环境配置
$ wails doctor
```
#### 开发问题
```bash
# 重置前端依赖
$ rm -rf frontend/node_modules
$ wails dev
# 使用外部开发服务器
$ wails dev -frontenddevserverurl http://localhost:3000
```
参考资料
---
- [Wails 官方文档](https://wails.io/) _(wails.io)_
- [Wails GitHub 仓库](https://github.com/wailsapp/wails) _(github.com)_
- [Wails Discord 社区](https://discord.gg/4K6VHPkG5c) _(discord.gg)_
- [Wails 模板库](https://github.com/wailsapp/awesome-wails) _(github.com)_

View File

@@ -51,34 +51,132 @@ yazi --help
| `l` | 进入选中的目录或打开文件 |
<!--rehype:className=shortcuts-->
### 文件操作
更多导航命令
:- | :-
:- | :-
| `y` | 复制选中的文件或目录 |
| `d` | 剪切选中的文件或目录 |
| `p` | 粘贴文件或目录 |
| `x` | 删除选中的文件或目录 |
| `r` | 重命名选中的文件或目录 |
<!--rehype:className=shortcuts-->
| 快捷键 | 操作说明 |
| --------------------------- | --------------------------------------------------------- |
| `K` | 在预览中向上移动 5 个单位 |
| `J` | 在预览中向下移动 5 个单位 |
| `g``g` | 将光标移动到顶部 |
| `G` | 将光标移动到底部 |
| `z` | 通过 fzf 进入目录或显示文件([cd](https://yazi-rs.github.io/docs/configuration/keymap#mgr.cd) 或 [reveal](https://yazi-rs.github.io/docs/configuration/keymap#mgr.reveal) |
| `Z` | 通过 zoxide 进入目录([cd](https://yazi-rs.github.io/docs/configuration/keymap#mgr.cd) |
<!--rehype:className=shortcuts left-align-->
### 选择操作
| 快捷键 | 操作说明 |
| ------------------------------ | --------------------------------------------- |
| <kbd>Space</kbd> | 切换当前悬停的文件/目录的选择状态 |
| <kbd>v</kbd> | 进入可视模式(选择模式) |
| <kbd>V</kbd> | 进入可视模式(取消模式) |
| <kbd>Ctrl</kbd> + <kbd>a</kbd> | 选择所有文件 |
| <kbd>Ctrl</kbd> + <kbd>r</kbd> | 反转当前所有文件的选择状态 |
| <kbd>Esc</kbd> | 取消所有选择 |
<!--rehype:className=shortcuts left-align-->
用于选择文件和目录的快捷键命令
### 文件操作
<!--rehype:wrap-class=row-span-4-->
| 快捷键 | 操作说明 |
| ----------------------------------- | ----------------------------------------------------------------------------- |
| <kbd>o</kbd> | 打开选中的文件 |
| <kbd>O</kbd> | 以交互方式打开选中的文件 |
| <kbd>Enter</kbd> | 打开选中的文件 |
| <kbd>Shift</kbd> + <kbd>Enter</kbd> | 以交互方式打开选中的文件(部分终端尚不支持) |
| <kbd>Tab</kbd> | 显示文件信息 |
| <kbd>y</kbd> | 复制选中的文件 |
| <kbd>x</kbd> | 剪切选中的文件 |
| <kbd>p</kbd> | 粘贴已复制/剪切的文件 |
| <kbd>P</kbd> | 粘贴已复制/剪切的文件(如目标存在则覆盖) |
| <kbd>Y</kbd><kbd>X</kbd> | 取消已复制/剪切状态 |
| <kbd>d</kbd> | 将选中的文件移至回收站 |
| <kbd>D</kbd> | 彻底删除选中的文件 |
| <kbd>a</kbd> | 新建文件(以 / 结尾表示新建目录) |
| <kbd>r</kbd> | 重命名选中的文件 |
| <kbd>.</kbd> | 切换隐藏文件的显示状态 |
<!--rehype:className=shortcuts left-align-->
更多文件操作命令如下:
| 快捷键 | 操作说明 |
| ------------------------------ | -------------------------------------------- |
| <kbd>;</kbd> | 执行一个 Shell 命令 |
| <kbd>:</kbd> | 执行一个 Shell 命令(阻塞,直到命令完成) |
| <kbd>-</kbd> | 创建已复制文件的绝对路径符号链接 |
| <kbd>\_</kbd> | 创建已复制文件的相对路径符号链接 |
| <kbd>Ctrl</kbd> + <kbd>-</kbd> | 创建已复制文件的硬链接 |
<!--rehype:className=shortcuts left-align-->
要操作选中的文件或目录
### 复制路径
| 快捷键 | 操作说明 |
| ---------------------------- | ---------------------------------- |
| <kbd>c</kbd><kbd>c</kbd> | 复制文件路径 |
| <kbd>c</kbd><kbd>d</kbd> | 复制目录路径 |
| <kbd>c</kbd><kbd>f</kbd> | 复制文件名 |
| <kbd>c</kbd><kbd>n</kbd> | 复制不带扩展名的文件名 |
<!--rehype:className=shortcuts left-align-->
**复制路径** _说明<kbd>c</kbd> ⇒ <kbd>d</kbd> 表示先按下 <kbd>c</kbd> 键,然后按下 <kbd>d</kbd> 键。_
### 搜索与过滤
:- | :-
:- | :-
| `/` | 开始搜索模式 |
| `n` | 在搜索模式中跳到下一个匹配项 |
| `N` | 在搜索模式中跳到上一个匹配项 |
| 快捷键 | 操作说明 |
| ------------ | -------------------- |
| <kbd>f</kbd> | 过滤文件 |
| <kbd>/</kbd> | 查找下一个文件 |
| <kbd>?</kbd> | 查找上一个文件 |
| <kbd>n</kbd> | 跳转到下一个匹配项 |
| <kbd>N</kbd> | 跳转到上一个匹配项 |
<!--rehype:className=shortcuts left-align-->
### 搜索文件
| 快捷键 | 操作说明 |
| ---------------------------- | ------------------------------------------------------- |
| <kbd>s</kbd> | 使用 [fd](https://github.com/sharkdp/fd) 按名称搜索文件 |
| <kbd>S</kbd> | 使用 [ripgrep](https://github.com/BurntSushi/ripgrep) 按内容搜索文件 |
| <kbd>Ctrl</kbd> + <kbd>s</kbd> | 取消当前进行中的搜索 |
<!--rehype:className=shortcuts-->
### 视图操作
### 排序
<!--rehype:wrap-class=row-span-2-->
:- | :-
:- | :-
| `gg` | 跳到列表的顶部 |
| `G` | 跳到列表的底部 |
| `Ctrl+f` | 向下滚动一页 |
| `Ctrl+b` | 向上滚动一页 |
| 快捷键 | 操作说明 |
| ---------------------- | ------------------------ |
| <kbd>,</kbd><kbd>m</kbd> | 按修改`时间`排序 |
| <kbd>,</kbd><kbd>M</kbd> | 按修改`时间倒序`排序 |
| <kbd>,</kbd><kbd>b</kbd> | 按`创建时间`排序 |
| <kbd>,</kbd><kbd>B</kbd> | 按`创建时间`倒序排序 |
| <kbd>,</kbd><kbd>e</kbd> | 按文件`扩展名`排序 |
| <kbd>,</kbd><kbd>E</kbd> | 按文件`扩展名倒序`排序 |
| <kbd>,</kbd><kbd>a</kbd> | 按`字母顺序`排序 |
| <kbd>,</kbd><kbd>A</kbd> | 按`字母倒序`排序 |
| <kbd>,</kbd><kbd>n</kbd> | 按`自然`排序 |
| <kbd>,</kbd><kbd>N</kbd> | 按`自然倒序`排序 |
| <kbd>,</kbd><kbd>s</kbd> | 按文件`大小`排序 |
| <kbd>,</kbd><kbd>S</kbd> | 按文件`大小倒序`排序 |
| <kbd>,</kbd><kbd>r</kbd> | `随机`排序 |
<!--rehype:className=shortcuts left-align-->
对文件/目录进行排序说明: _<kbd>,</kbd> ⇒ <kbd>a</kbd> 表示先按下 <kbd>,</kbd> 键,再按下 <kbd>a</kbd> 键。_
### 多标签页
| 快捷键 | 操作说明 |
| ------------------------------------------- | ---------------------------- |
| <kbd>t</kbd> | 以当前工作目录创建新标签页 |
| <kbd>1</kbd>, <kbd>2</kbd>, ..., <kbd>9</kbd> | 切换到第 N 个标签页 |
| <kbd>[</kbd> | 切换到上一个标签页 |
| <kbd>]</kbd> | 切换到下一个标签页 |
| <kbd>{</kbd> | 当前标签页与上一个互换位置 |
| <kbd>}</kbd> | 当前标签页与下一个互换位置 |
| <kbd>Ctrl</kbd> + <kbd>c</kbd> | 关闭当前标签页 |
<!--rehype:className=shortcuts-->
## 自定义配置
@@ -98,38 +196,59 @@ yazi --help
[general]
# 设置主界面主题为 dark 或 light
theme = "dark"
```
# 启动时的默认路径
启动时的默认路径
```toml
default_path = "~"
```
# 是否启用自动保存配置
是否启用自动保存配置
```toml
auto_save_config = true
```
自定义快捷键绑定
```toml
[keybindings]
# 自定义快捷键绑定
quit = "q" # 退出
copy = "y" # 复制文件
paste = "p" # 粘贴文件
delete = "d" # 删除文件
```
界面相关配置
```toml
[ui]
# 界面相关配置
preview_enabled = true # 是否启用文件预览
show_hidden_files = true # 显示隐藏文件
columns = 2 # 文件列表列数
```
搜索行为配置
```toml
[search]
# 搜索行为配置
case_sensitive = false # 搜索是否区分大小写
search_timeout = 30 # 搜索超时时间(秒)
```
排序规则配置
```toml
[sorting]
# 排序规则配置
sort_by = "name" # 排序方式: name,size,date
reverse_sort = false # 是否反向排序
```
插件加载配置
```toml
[plugins]
# 插件加载配置
enabled_plugins = ["git", "archive"]
```

98
docs/zed.md Normal file
View File

@@ -0,0 +1,98 @@
Zed 备忘清单
====
Zed 文本编辑器中 50 个快捷键的视觉备忘单
## 键盘快捷键
### Zed
| 快捷键 | 操作 |
|-----------------------|------------------------|
| `Ctrl` `,` | 打开设置 |
| `Ctrl` `Shift` `X` | 打开扩展商店 |
| `Ctrl` `Q` | 退出 Zed |
<!--rehype:className=shortcuts-->
### 文件
| 快捷键 | 操作 |
|-------------------------|------------------------|
| `Ctrl` `N` | 新建文件 |
| `Ctrl` `Shift` `N` | 新建窗口 |
| `Ctrl` `O` | 打开文件夹 |
| `Ctrl` `Alt` `Shift` `O`| 打开远程文件夹 |
| `Ctrl` `S` | 保存 |
| `Ctrl` `Shift` `S` | 另存为... |
| `Ctrl` `Alt` `S` | 保存所有文件 |
| `Ctrl` `Shift` `W` | 关闭窗口 |
<!--rehype:className=shortcuts left-align-->
### 编辑
| 快捷键 | 操作 |
|-----------------------|------------------------|
| `Ctrl` `Z` | 撤销 |
| `Ctrl` `Shift` `Z` | 重做 |
| `Ctrl` `X` | 剪切 |
| `Ctrl` `C` | 复制 |
| `Ctrl` `V` | 粘贴 |
| `Ctrl` `Shift` `F` | 在项目中查找 |
| `Ctrl` `/` | 切换行注释 |
<!--rehype:className=shortcuts-->
### 选择
| 快捷键 | 操作 |
|--------------------------|--------------------------|
| `Ctrl` `A` | 全选 |
| `Alt` `Shift` `Right` | 扩展选择 |
| `Alt` `Shift` `Left` | 缩小选择 |
| `Alt` `Shift` `Up` | 在上方添加光标 |
| `Alt` `Shift` `Down` | 在下方添加光标 |
| `Ctrl` `Shift` `Down` | 选择下一个匹配项 |
| `Alt` `Up` | 上移一行 |
| `Alt` `Down` | 下移一行 |
| `Ctrl` `Shift` `D` | 复制选中的内容 |
<!--rehype:className=shortcuts left-align-->
### 视图
| 快捷键 | 操作 |
|----------------------|-------------------------|
| `Ctrl` `B` | 切换左侧面板 |
| `Ctrl` `Alt` `B` | 切换右侧面板 |
| `Ctrl` `J` | 切换底部面板 |
| `Ctrl` `Alt` `Y` | 关闭所有面板 |
| `Ctrl` `K` `Up` | 向上分屏 |
| `Ctrl` `K` `Down` | 向下分屏 |
| `Ctrl` `K` `Left` | 向左分屏 |
| `Ctrl` `K` `Right` | 向右分屏 |
| `Ctrl` `Shift` `E` | 项目面板 |
| `Ctrl` `Shift` `B` | 大纲面板 |
| `Ctrl` `Shift` `C` | 协作面板 |
| `Ctrl` ``` ` ``` | 终端面板 |
| `Ctrl` `Shift` `M` | 调试面板 |
<!--rehype:className=shortcuts -->
### 跳转
| 快捷键 | 操作 |
|-----------------------|-----------------------------|
| `Ctrl` `Alt` `-` | 后退 |
| `Ctrl` `Shift` `P` | 打开命令面板… |
| `Ctrl` `E` | 跳转到文件… |
| `Ctrl` `Shift` `O` | 跳转到编辑器中的符号… |
| `Ctrl` `G` | 跳转到行/列… |
| `F12` | 跳转到定义 |
| `Ctrl` `F12` | 跳转到类型定义 |
| `Alt` `Shift` `F12` | 查找所有引用 |
| `F8` | 下一个问题 |
| `Shift` `F8` | 上一个问题 |
<!--rehype:className=shortcuts left-align-->
## 相关链接
- [Zed](https://zed.dev/)
- [Zed GitHub](https://github.com/zed-industries/zed)
- [Zed 文档](https://zed.dev/docs)

3
netlify.toml Normal file
View File

@@ -0,0 +1,3 @@
[build]
command = "npm run build"
publish = "dist"

View File

@@ -1,6 +1,6 @@
{
"name": "@wcj/reference",
"version": "1.46.0",
"version": "1.47.0",
"description": "为开发人员分享快速参考备忘单(主要是方便自己)。",
"author": "jaywcjlove",
"license": "MIT",
@@ -9,8 +9,10 @@
"private": false,
"scripts": {
"prepare": "husky",
"build": "refs-cli",
"start": "refs-cli --watch",
"postinstall": "npm run cpy",
"build": "refs-cli && npm run cpy",
"start": "npm run cpy && refs-cli --watch",
"cpy": "cpy 'appicon/*.png' dist/appicon",
"prettier": "prettier --write '**/*.{mjs,css,json,prettierrc,lintstagedrc}'",
"markdownlint": "npx markdownlint-cli --fix ./docs/*.md"
},
@@ -28,12 +30,13 @@
"docs/*.md": "markdownlint --fix"
},
"devDependencies": {
"cpy-cli": "^5.0.0",
"husky": "^9.0.0",
"lint-staged": "^15.0.0",
"prettier": "^3.0.0",
"refs-cli": "^1.8.0",
"markdownlint": "^0.33.0",
"markdownlint-cli": "^0.39.0"
"markdownlint-cli": "^0.39.0",
"prettier": "^3.0.0",
"refs-cli": "^1.11.1"
},
"engines": {
"node": ">=16.0.0"