-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathzh-cn.search-data.json
1 lines (1 loc) · 135 KB
/
zh-cn.search-data.json
1
{"/blog/2fa-mfa/":{"data":{"":"2FA/MFA:双重、多重(因素)验证\n指出于安全原因,登陆账户或进行敏感操作等情况时除了用户名(Username)和密码(Password)外,额外使用其他一种或多种方式进行身份验证。\n常用的附加验证方式有:\n一次性密码、动态密码(OTP) 短信验证码(SMS OTP) 身份验证器(Authenticator OTP) 通行密钥(Passkey) 移动端 APP(Mobile APP)* *即用已登陆账户的设备给其他设备授权,具体授权方法不确定。\n下图就是 Github 的 2FA 设置界面。","mobile-app#Mobile APP":"即用已登陆账户的设备给其他设备授权,具体授权方法不确定。\n有些会像前面提到的,向已登陆的设备发送验证码(OTP),Telegram、微博等会使用。 Telegram 登陆手机版时只需要短信验证码 / 旧设备验证码,所以这个 OTP 不是 2FA。但是其开启 2FA 后需要 验证码 + 密码,这时 OTP 就是 2FA 中的一种方式。\n有些验证时需要在 APP 中输入相应的数字,图中的 Github Mobile、Android 上的 Google Service 等就是。 有些会内置一个仅用于其账户的 Authenticator 组件,如 Steam 的令牌功能。 还有就是扫码验证(不是直接扫码登陆),我们经常使用的微信/ QQ 经常使用这种方法验证新的设备。 直接扫码登陆一般用于“高权重”的设备(手机)给“更低权重”的设备(PC、网页版等)“授权”,而不能用于同等级设备。","otp#OTP":"OTP 常见算法有\nHOTP:基于散列消息验证码的一次性密码 TOTP:基于时间的一次性密码,基于HOTP,广泛应用 其具体形式有\nSMS OTP:短信验证码 Mail OTP:邮箱验证码 APP OTP:已登陆的设备接收的验证码\n这种一般作为短信/邮件验证码的(廉价)替代。 Authenticator OTP:常见的一种形式是有效期为 30s 的 6 位验证码,某些人所说 TOTP 专指这种验证码。\nAuthenticator,身份验证器,“软件令牌”,很多 Authenticator 会与密码管理器组合到一起。 硬件令牌,银行等行业中经常使用 ","passkey#Passkey":"具体参见:\n通行密钥 - 维基百科 passkey.io 严格来说,我觉得用 Passkey 验证不是 MFA,因为仅通过这一种方式你可以直接完成认证,不需要用其他方式。"},"title":"关于 2FA/MFA"},"/blog/font/":{"data":{"":" 讲讲字体,也不讲那么细,毕竟咱也不是专业的。说几个重要参数,能让你在下载和使用字体时知道怎么挑就行。","下载字体应注意#下载字体应注意":"字重——字的粗细 如题,字重其实就是字的粗细。可以通过这个网站查看一下效果:字体字重测试\n像我常用的思源黑体就有:Thin、Light、DemiLight、Regular、Medium、Bold、Black 共7种字重。其中用的最多/最重要的字重就是 Regular ,有些会叫 Normal 或者其他的,没有字重需求的下载这一个就可以了。\n常见一种字重标准:\n100 - 淡体 Thin ( Hairline ) 200 - 特细 Extra-light ( ultra-light ) 300 - 细体 Light 350 - 次细 Demi-Light 400 - 标准 Regular ( normal / book / plain ) 500 - 适中 Medium 600 - 次粗 Demi-bold / semi-bold 700 - 粗体 Bold 800 - 特粗 Extra-bold / ( Ultra-bold ) 900 - 浓体 Black ( Heavy ) 950 - 特浓 Extra-black ( Ultra-black ) 可变字体 上面我们知道了一个字体会有不同字重的字型,我们下载一个字体时,想体验更完善就要下载不同字重的好几个字体文件,这也太麻烦了。\n不过幸好不是我一个人觉得麻烦,苹果、微软、谷歌和 Adobe 等几个大厂之后又推出了可变字体(Variable Fonts)规范。可变字体是字体格式 OpenType 的一种特殊规范,一个可变字体文件可以储存一个设计的多个变体,相当于是一个字体文件包含了无数个字型。\n不过我实际使用下来,(Linux 下)Qt 程序的字重会有问题,所以并没有使用。\n异体字 就是不同国家/地区都包含的文字,但是相互之间写法稍有不同。比如:\n部分手机上可能没有效果\n默认 遍角次亮采之门,门上插刀、直字拐弯、天上平板、船顶漏雨。\n中文(大陆) lang=zh-cn 遍角次亮采之门,门上插刀、直字拐弯、天上平板、船顶漏雨。\n中文(台湾) lang=zh-tw 遍角次亮采之门,门上插刀、直字拐弯、天上平板、船顶漏雨。\n中文(香港) lang=zh-hk 遍角次亮采之门,门上插刀、直字拐弯、天上平板、船顶漏雨。\n日文 lang=ja 遍角次亮采之门,门上插刀、直字拐弯、天上平板、船顶漏雨。\n韩文 lang=ko 遍角次亮采之门,门上插刀、直字拐弯、天上平板、船顶漏雨。\n字体文件格式 现在操作系统中常用的字体类型标准主要有两类,即 TrueType 和 OpenType。\nAdobe 使用 PostScript 语言开发了包括 Type1 在内的 PostScript字体。为了对抗其颇高的商业授权,苹果联合微软推出了 TrueType 字体。而后,微软又联合 Adobe 在TrueType 的基础上推出了OpenType 字体,在 OpenType 类型字体中,可以选择PostScript或TrueType作为记述方式。\nTrueType 字体文件的扩展名是 .ttf;而对于 OpenType 字体文件,OpenType TT字体扩展名为 .ttf,OpenType PS字体扩展名为 .otf。\n同时,OpenType 还推出了特殊的“字体集”格式。文件扩展名分别为 .ttc(TrueType Collection)、.otc(OpenType Collection),这种“字体集”一个文件内包含了多种字体类型。实际应用中一般用于将不同字体或同一字体的不同语言封装成一个文件,如 Windows 中文版内置的 simsun.ttc 就包含了(中易)宋体 SimSun 和新宋体 NSimSun 两种字体的 Regular 字型。\n下载实例——思源黑体 思源黑体(Source Han Sans / Noto Sans CJK),它是一个包含了中文(C)、日文(J)、韩文(K)的“CJK”字体,当然中文还可细分为简体中文(SC)、繁体(即台湾正体)中文(TC)、香港繁体中文(HK)。由于这些文字中会有一些异体字,所以它除了不带任何标志的字体外,还有带有 SC、TC、HK、J、K 后缀的字体,每款的默认字形会使用该地区常用的。","使用字体应注意#使用字体应注意":"通用字族 字体选择中可以使用“通用字族”(generic font family)指定某一大类的字体,至于选择成哪个则是取决于用户和系统的设定。\n通用字族有 Cursive(手写体,对应中文楷体)、Fantasy(另类体)、Monospace(等宽字体)、Sans-serif(无衬线体,对应中文黑体)、Serif(衬线体,对应中文宋体/明体)、Fangsong(仿宋体)等。\n其中最常用的是 Monospace(等宽字体)、Sans-serif(无衬线体)、Serif(衬线体)。你也可以在上面查看字重的网站上进行更详细的对比。\n字族设定 示例结果(取决于系统设定) Sans-serif\n无衬线体\n黑体(中文) ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 αβγ عربي язык 我能吞下玻璃而不伤身体。 The quick brown fox jumps over the lazy dog.\nSerif\n衬线体\n宋体/明体(中文) ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 αβγ عربي язык 我能吞下玻璃而不伤身体。 The quick brown fox jumps over the lazy dog.\nMonospace\n等宽字体 ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 αβγ عربي язык 我能吞下玻璃而不伤身体。 The quick brown fox jumps over the lazy dog.","字型字体字族#字型、字体、字族":"很多人会将字体叫为 Font,但 Font 的专业名称应该叫字型。一种字体(Typeface)有不同字型(Font),一个字体的不同字型之间的差别就是会有不同的字重和尺码等。\n有些地方(如网页设计)也会将字体叫做 Font Family(字族)。当然我们一般也不用分那么清楚,感兴趣可以看看维基百科上的字体、字体家族与字型。"},"title":"字体重要参数"},"/blog/license/":{"data":{"":" 如何选择开源许可证? - 阮一峰的网络日志\nchoosealicense\n那些有画风毒的开源许可证 | 螺莉莉数据中心\n开源许可证选择器"},"title":"开源许可证"},"/blog/markdown/":{"data":{"":"","html#HTML":"说明 边学边写,所以一边学着后面就顺便将前文格式改了改,把这当作学习笔记了。 现在又变成博客样式测试文章了😁\n因为Markdown没有明确规范,所以这里就只说一些基本用法。\n本文在VS code上编写,一些效果默认情况下不能显示(不是基本语法),但在其他的在线编辑器上试过可以显示,已标明。 建议学习时可以多看看英文资料,毕竟中文资料中可能有翻译错误或者加入了作者自己的想法。\n这里面是编辑器内的原形式\r这里面是演示效果\n标题与正文 换行与换段 正文可以直接写。\n两个及以上空格再回车表示换行,空一行及以上表示换段。\n换行 使用#,一级标题为一个#,二级标题为两个#,以此类推,可表示 1-6 级标题。\n或使用=和-并换行标记一级和二级标题(备用方案)。\n为了显示效果引用了一下。\n## 一级标题\r### 二级标题\r#### 三级标题\r##### 四级标题\r......\r这是正文 一级标题 二级标题 三级标题 四级标题 ……\n这是正文\n另一种:\n一级标题\r==\r二级标题\r--\r效果如下:\n一级标题二级标题 分隔符 由三个及以上-/*/_构成的单行,其中可有空格\n---\r- - -\r***\r* * *\r___\r_ _ _\r字体效果 斜、黑体 斜体:在其前后各加一个*或_\n黑体:在其前后各加两个*或_\n斜黑体:在其前后各加三个*或_\n正常文字 *斜体*_文字_ **黑体**__文字__ ***斜黑体***___文字___\r正常文字\n斜体文字\n黑体文字\n斜黑体文字\n最好用*不用_\n也可将斜黑体表示为__*1*__或**_2_**(VS code并不支持):__1__或**2**\n删除线 在其前后各加~~\n~~这是删除线测试~~\r效果如下:\n这是删除线测试\n高亮(VS code里无效果) 在其前后各加==\n==这是高亮==\r==这是高亮==\n列表 有序列表 数字加.加一个空格\n可嵌套,若嵌套在前面加四个空格(一个Tab)\n1. 一级\r1. 二级\r1. 三级\r2. 三级\r2. 二级\r2. 一级\r3.一级\r效果如下:\n一级 二级 三级 三级 二级 一级 一级 数字不必按数字顺序排列,但列表会以数字顺序开始。测试一下\n1. 测试\r1. 序号不按前面数字而是自动变?\r1. 确实自动啊,估计怕不同级别的序号出现混乱\r1. 那我是不是可以在哪一级就用哪一数字(滑稽)\r2. 一级\r效果如下:\n测试 下一级 序号好像不按前面数字而是自动变 确实自动啊,估计怕不同级别的序号出现混乱 那我是不是可以在哪一级就用哪一数字(滑稽) 一级 无序列表 *、+或-加一个空格\n也可以嵌套\n- 一级\r- 二级\r- 三级\r- 二级\r- 一级\r效果如下:\n一级 二级 三级 二级 一级 再测试一下\n- - 直接二级\r- 三级\r效果如下:\n直接二级 三级 区块引用 在段落开头使用\u003e,然后加一个空格(非必需,为了防止有些不支持)\n\u003e 区块引用\r效果如下:\n区块引用\n区块引用也可嵌套使用。\n\u003e 1\r\u003e\u003e 2 3\r效果如下:\n1\n2\n3\n在正文中引用后,换段效果不继续引用,换行继续引用。\n代码 可以保留原格式,效果为阴影背景\n1)行内代码 可以在前后各加一个及以上`(反引号,Tab键上面的那个)来表示,但是要几个开始几个结束\n这是`行内代码`演示\r效果如下:\n这是行内代码演示\n`` ` `` 这样就能打出`了,效果如下:\n`\n2)代码区块 可以使用四个空格(一个Tab)\n显示效果如下:\n这就是代码区块,记得要换段\r也可以在前后各加单独由```构成的一行表示,其后可指定语言。\n```C\rprintf(\"Hello World!\");\r```\r效果如下:\nprintf(\"Hello World!\"); 行内代码只能显示一行,适合正文插入,区块适合多条语句。我觉得单独一行代码也可用来区块来表示强调。\n链接 1.形式为[链接名称](链接地址)\n[百度](https://www.baidu.com)\r效果如下:\n百度\n2.或者使用\u003c链接地址\u003e\n\u003chttps://www.baidu.com\u003e\r效果如下:\nhttps://www.baidu.com\n3.或者直接使用链接地址\nhttps://www.baidu.com\r效果如下:\nhttps://www.baidu.com\n4.参考样式链接\n由两部分组成。第一部分[链接名称][标签]\n第二部分[标签]: 链接地址\n其中第二部分可以放置于其他地方(不能在同一段内。)。\n这是一个[链接][1]\r[1]:https://www.baidu.com\r这是一个链接\n省略写法:\n这是一个[链接]\r[链接]:https://www.baidu.com 这是一个链接\n5.所以的链接都可以带上格式,如https://www.baidu.com\n图片 插入图片与链接类似,格式如下:\n\r效果如下:\n图片也可以添加链接(就是将链接名称换成图片)\n[](https://baike.baidu.com/item/markdown)\r脚注(VS code里无效果) 格式:[^要注明的内容]\n这是要标注的[^内容] [^内容]:一个标注\r效果如下:\n这是要标注的1\n表格 使用|分隔每一行的单元格,用-分隔表头与数据。\n表格对齐方式:\n设置内容和标题栏居右对齐-:。\n设置内容和标题栏居左对齐:-。\n设置内容和标题栏居中对齐:-:。\n|表头1|表头2|表头3|\r|:-:|-:|:-|\r|1|2|3|\r|1|2|3|\r表头1 表头2 表头3 1 2 3 1 2 3 转义字符 特殊符号可以用转义字符显示,及前面加\\。\n**加粗** \\*\\*不加粗\\*\\*\r效果如下:\n加粗\n**不加粗**\n支持转义的字符:\r\\ 反斜线\r` 反引号\r* 星号\r_ 下划线\r{} 花括号\r[] 方括号\r\u003c\u003e 尖括号\r() 小括号\r## 井字号\r+ 加号\r- 减号\r. 英文句点\r! 感叹号\r| 竖线符号\rLaTex公式 用$ $包围的为行内的公式,用$$ $$包围的为居中的公式块\n$2^{10} = 1024$\r$$\\sum_{n = 0}^{100} n = (100 + 0) + (99 + 1) + ... + 55 = 55 × 100 + 55 = 5555}$$\r效果如下: $2^{10} = 1024$ $$\\sum_{n = 0}^{100} n = (100 + 0) + (99 + 1) + … + 55 = 55 × 100 + 55 = 5555$$\n这个具体语法就不详细介绍了。\nHTML HTML中的标签可以直接在Markdown中使用,举个例子。\n下划线 HTML中的\u003cu\u003e和\u003c/u\u003e标签\n\u003cu\u003e这是下划线测试\u003c/u\u003e\r效果如下:\n这是下划线测试\n一个标注 ↩︎","latex公式#LaTex公式":"","一级标题#一级标题":"","一级标题-1#一级标题":"","二级标题-1#二级标题":"","代码#代码":"","列表#列表":"","区块引用#区块引用":"","图片#图片":"","字体效果#字体效果":"","标题与正文#标题与正文":"","脚注vs-code里无效果#脚注(VS code里无效果)":"","表格#表格":"","说明#说明":"","转义字符#转义字符":"","链接#链接":""},"title":"Markdwon 笔记(样式测试)"},"/blog/region_lang_code/":{"data":{"":"","国家地区代码httpszhwikipediaorgwikie59c8be5aeb6e59cb0e58d80e4bba3e7a2bc#\u003ca href=\"https://zh.wikipedia.org/wiki/%E5%9C%8B%E5%AE%B6%E5%9C%B0%E5%8D%80%E4%BB%A3%E7%A2%BC\"\u003e国家地区代码\u003c/a\u003e":"","语言代码httpszhwikipediaorgwikie8aa9ee8a880e4bba3e7a2bc#\u003ca href=\"https://zh.wikipedia.org/wiki/%E8%AA%9E%E8%A8%80%E4%BB%A3%E7%A2%BC\"\u003e语言代码\u003c/a\u003e":"国家地区代码 ISO标准国家代码 - ISO 3166 形如:CN\n分为3种,即二位字母代码(alpha-2)、三位字母代码(alpha-3)、数字代码(numeric)。其中,二位字母代码适用于通常情况,三位字母代码较接近国家名称,而数字代码则适用于非拉丁字母环境中。\n国家顶级域 形如:.cn\n2字母国家代码顶级域的DNS名称。它们遵循ISO 3166-1两字母代码,除了个别一些例外:“.ac”用于阿森松岛、“.eu”用于欧盟或英国选用“.uk”而非“.gb”。\n语言代码 ISO标准语言代码 - ISO 639 形如:zh、zho\nISO 639 是为语言分类的设计的一套标准代码。每种语言都被分配了两个字母(639-1)或三个字母(639-2 和 639-3)的小写代码。\nIETF语言标签 形如:zh(中文)、zh-CN(大陆中文)、zh-Hans-CN(大陆简体中文)、yue / zh-yue(粤语), cmn / zh-cmn(普通话)\nIETF语言标签由互联网工程任务组(IETF)的“BCP 47”文档系列定义。现在标准化为RFC 5646(引用了相关的RFC 5645)与RFC 4647,IANA语言子标签登记。使用的各成分来自ISO 639、ISO 15924、ISO 3166-1以及UN M.49。 IETF语言标签的最早版本是1995年3月发布的RFC 1766。使用ISO 639的2字母语言代码,ISO 3166的2字母国家地区代码,允许登记的标签携带variant或书写文字子标签。 2001年1月发布RFC 3066, 使用ISO 639-2的3字母语言代码。 2006年9月发布RFC 4646 (规范的主体)与RFC 4647 (处理匹配行为)。RFC 4646增加了使用ISO 15924 的4字母书写文字代码与UN M.49的3数字地理分区码。 2009年9月发布RFC 5646,引入了3字符码的ISO 639-3与639-5作为语言子标签。","语言代码实例#语言代码实例":"Linux Locale 命名规则为:language[_territory[.codeset]][@modifier] 其中language是ISO 639-1标准中定义的双字母的语言代码,territory是ISO 3166-1标准中定义的双字母的国家和地区代码,codeset是字符集的名称 (如 UTF-8等),而 modifier 则是某些 locale 变体的修正符。1\n目前的 Debian 桌面 GUI(图形用户界面)系统通常在 GUI 环境中设置语言环境为 LANG=xx_YY.UTF-8。这里,xx 是 ISO 639 语言代码 ,YY 是 ISO 3166 国家地区代码 2\nWindows 开发 语言字符串 Windows 媒体格式 SDK 的多语言支持功能使用符合 RFC 1766 的语言字符串。3 .NET 类 CultureInfo 根据 RFC 4646 为每个区域性指定唯一名称。 该名称是与语言关联的 ISO 639 双字母或三字母小写区域性代码和与国家或地区关联的 ISO 3166 双字母大写子区域性代码的组合。 此外,对于面向 .NET Framework 4 或更高版本且在 Windows 10 或更高版本下运行的应用,支持对应于有效 BCP-47 语言标记的区域性名称。 基于 RFC 4646 的区域性名称的格式为 languagecode2-country/regioncode2,其中 languagecode2 是双字母语言代码, country/regioncode2 是双字母子区域性代码。4 HTML lang 属性 由 用于定义语言的标签 (BCP47) IETF 文档定义。5\nBCP 47标准代替了早期使用的RFC 3066 与RFC 1766标准,且信息量远远超过了ISO语言与国家地区标准。您还应该使用IANA语言子标签注册表(IANA Language Subtag Registry)来改善语言标记,而非ISO标准。6\n区域设置 - 维基百科 ↩︎\n第 8 章 国际化和本地化 ↩︎\nLanguage Strings - Win32 apps|Microsoft Learn ↩︎\nCultureInfo 类 (System.Globalization)|Microsoft Learn ↩︎\nMDN ↩︎\nW3C ↩︎"},"title":"地区语言代码"},"/blog/tempermonkey/":{"data":{"":"","#":"这也是我的一篇 知乎文章\n图片是知乎的外链,不会给我挂了吧\n6.3:昨天在几个新闻上和Appinn频道看到了也就算了,今天在沙雕墙的频道看到了,好丢人\n不许说名字难听,不许说不如“窜天猴”,我找了好几个翻译都是这么翻的,奔跑中的奶酪那张图中还有一些文章都是这么叫的,我只是搬运工罢了。\n省流:官网之前一直没中文名,今年不知谁把官网上的“Tampermonkey”翻译为了“油猴”,我才和作者发邮件提出更改的。\n至于这句“有些人也会把篡改猴(Tampermonkey)称作油猴(Greasemonkey),尽管后者只是一款仅适用于 Firefox 浏览器的浏览器扩展程序。”,虽然邮件里提到了,但是最开始作者并没有加上。可能是有些人觉得 不好听/像盗版 又去找作者讨论了吧。\n水文章罢了。\nTamperMonkey 作为大名鼎鼎的脚本管理器,就算没用过也大概率听过吧。没?这个图标总见过吧\n到这有人可能会说了,哦,这个我知道,这是 我同学/某UP主 推荐的宝藏啊,能去广告、刷课等等,叫油猴来着。嗯,恭喜你,答错了\n腾讯翻译\n微软翻译\n图源 奔跑中的奶酪\nTamperMonkey为什么被叫做“油猴” 很多人把 Userscript 叫做“油猴脚本”,原因上面文章也提到了,因为最早的用户脚本管理器叫油猴(Greasemonkey ),所以很多人叫其“油猴脚本”,这也能理解。\n不过,Greasemonkey 只支持Firefox,于是就有人做Chrome等上面的移植版,就比如我们要说的 Tampermonkey,它也是其中最有名的。但是问题来了,Tampermonkey 官方一直没有正式中文名称(而油猴、暴力猴等都有“官方认证”的中文名),所有场合出现的都是它的英文名字,这我们这些说中文的日常交流多不方便啊。\nFirefox,有油猴和暴力猴为对比\nEdge,有暴力猴为对比\n那么它中文叫什么呢,很多人这时候犯懒了,翻字典是不可能翻的,“当时xxx给我推荐这个,能装脚本来做xxx,他当时说叫什么来着,哦对,油猴脚本!油猴脚本、油猴脚本,那这个东西是用来做这个的,那他一定叫“油猴”吧。”\n当然以上只是个人猜想的一些人(尤其近几年才接触的人)的思路,可能一些“老人”就像 为什么Tampermonkey被翻译成\"油猴\"? 里说的,纯粹是习惯了罢,就像一些人老是说“百度一下”,实际他并不用百度一样。\n官网名称被改 今年2月份,当我重装手机上Firefox时,安装扩展时不小心选了TamperMonkey(为什么说不小心,因为它有个弹窗在手机上关不掉,我没法操作,所以一般都用的暴力猴)。大家都知道它装完之后会弹出官网的欢迎界面,而作者在前几个月更新了官网。在我将要关闭时,我发现了一点异常:Tampermonkey 有中文自称了,还是“油猴”?!\n这……你让Greasemonkey怎么面对,你让Tampermonkey怎么想,“没想到这么多年了,我终究还是个替身( ꒦ິ⌓꒦ີ )”。\n我再附上几张历史截图,证明一下,TamperMonkey 官网之前从来没有自称过“油猴”。或者可以从Tampermonkey 的旧备份查看。\n2021.2.22 https://www.tampermonkey.net/?locale=zh\n2022.8.11 https://www.tampermonkey.net/?ext=dhdg\u0026locale=zh\n因为不同语言是通过url传参实现的,所以中文没有什么固定的URL\n当时就想提个反馈,但我找遍网站也没有发现反馈位置,只有一个邮箱。Github上 也只有扩展本体及扩展的翻译,没地方提关于网站的issue。\n发邮件,对我来说有点太过正式,我写了两句就懒癌犯了,算了吧。\n反馈起因及结果 最近某同学要刷智慧树的课,他给我说他一搜排名第一的是 OCS 网课助手 ,装上后发现提示我推荐的暴力猴不支持,必须用“油猴”。当时我就忍不了了,什么,看不起我“暴力猴”是吧,另外你连名字都打不对,你在教我做事?(狗头\n于是上Github给他拉了分支,改了翻译再提了个PR。https://github.com/ocsjs/ocs-docs/pull/4\n然后,隔了几天(因为回复邮件被Outlook收到垃圾箱了)我发现他回复说官网就叫油猴。得,官网的更新让错误翻译更有理了。于是我又忍不了了,又打开了PR,同时又从草稿箱翻出草稿来给TamperMonkey发了个邮件。\n很快啊,他没给我回复……\n不过4.4忽然收到Github邮件: OCS doc 批准了PR。然后我去官网一看,现在已经改过来了\n截图于 2023.4.4"},"title":"给 TamperMonkey 正名 - “我叫篡改猴”"},"/blog/wcbing-apt-repo/":{"data":{"":"","fq#F\u0026amp;Q":"向 Debian、Ubuntu 等 Linux 发行版用户分享我自建的软件仓库。里面收集了一些国内常用的软件,使安装和更新更方便。\nhttps://github.com/wcbing/wcbing-apt-repo\n仓库特点 里面收集了一些国内常用的软件,像腾讯系的QQ、QQ音乐、腾讯会议,还有钉钉、百度网盘、Xmind 等。还有一些官方提供源的,包括 Firefox、Tailscale 以及 Chrome、VS Code、Steam 等(后面这些安装后会自行添加软件源),减少需要手动添加源的次数。\n兼容性强:因为是官方提供的通用 deb 包,所以较新版本的 Debian、Ubuntu 及其衍生版应该都可以正常安装运行。 下载速度:除了 Github Releases 之外,其他大都是重定向至软件官网,所以下载速度和从软件官网下载一样。 Github 代理: Releases 文件重定向到了代理网站,如 ghproxy,使国内也有不错的下载速度。 F\u0026Q 有些不是星火商店已经收录了吗,为什么不用星火商店? 本软件源与星火商店形式有些不同,星火商店必须要安装额外的客户端,而这个是通用的 APT 软件源,你可以通过APT或 GNOME Software、KDE Discover 等任意客户端进行升级。并且相比星火商店还有个小优势是更新快,因为都是自动化的流程,不用人工审核投稿。\n我知道 DebianCN、铜豌豆软件源等,这个有什么优势? 确实,这个源和 DebianCN、铜豌豆软件源 等类似。相比两者优势是更新快,都是自动化的流程,不用人工整理。拿 DebianCN 为例,其现收录软件大概30多个(实际可用10个左右),除 Chrome 在更新外,其他最新的更新都距今半年以上,很多都是5、6年前的软件。铜豌豆相比之下要好很多,但也不太及时,并且自打包应用较多,兼容性也较差。\n有什么劣势? 劣势就是应用较少,现在只有自己常用的软件。\n最后,欢迎大家参与,提交现有repo的地址或为常用程序编写定时检测代码。\n本文同时发布于 deepin。","仓库特点#仓库特点":""},"title":"自建 APT 软件源"},"/dev/c-cpp/input/":{"data":{"":"字符串处理一直是一个繁琐又重要的工作,也是天梯赛必考内容之一。\n处理字符串首先要做的就是按需读入字符串。如果你用C/C++处理,就会遇到很尴尬的情况,首先是有C和C++两套语言的语法,你到底是用 char array 还是 string?然后每个还有不同的读入方式,不熟悉的话看着乱七八糟的。\n参考:c++之cin/cin.get/cin.getline()详解\nC++中cin、cin.get()、cin.getline()、getline()、gets()等函数的用法"},"title":"C/CPP字符读入"},"/dev/database/mysql_replication/":{"data":{"":"","主服务器详细步骤#主服务器详细步骤":"创建复制账号授予同步权限 首先创建复制用的账号,专号专用比较好。管理员登陆 MySQL,执行:\ncreat user 'repl'@'%' identified by 'password'; 这里假设用户名为repl,密码为password,使用时请替换为实际的用户名和密码。\n授予该用户同步权限:\ngrant replication slave on *.* TO 'repl'@'%'; 获取 binary log 状态 我们这里先获取 binary log 状态,供之后从服务器设置使用。\n8.4 ?之前:\nshow master status; 8.4 之后:\nshow binary log status; 输出形式如下,我们需要记住其文件名和 Positon 值。\nmysql\u003e show binary log status; +---------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +---------------+----------+--------------+------------------+-------------------+ | binlog.000002 | 158 | | | | +---------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec) 根据 8.4 官方文档,show master status 已完全弃用,改为 show binary log status。(具体开始时间未知)\n8.0.22 声明将弃用的 show slave status 也已完全弃用。","主要流程#主要流程":"主服务器设置:\n创建复制账号并授予复制权限。 获取 binary log 状态。 从服务器设置:\n设置主服务器信息。 启动并检查复制服务。 提示 出于“政治正确”,MySQL 对“主从(仆)”这对词进行了替换,所以导致部分流程出现了差异。其实自 8.0.22 开始,slave 基本都被替换为了 replica。但是像 GRANT 授权语句里的直到 MySQL 9 都没被替换。\n本文用到 MySQL 版本:\nMySQL 9.0/8.4 for docker(对本文来说无区别) MySQL 8.0.34 for docker ","从服务器详细步骤#从服务器详细步骤":"提前设置 在从服务器的配置文件(my.cnf)中找到 [mysqld],修改以下参数:\n[mysqld] server-id = 2 # 设置服务器 ID,每个主服务器和从服务器都必须有唯一的 ID 重启从服务器,让以上配置生效。\n设置复制主服务器 这里设置主服务器的地址、用户信息等配置,用于指明复制来源。\n8.0.23 之前:\nchange master to master_host='master_ip', master_user='repl', master_password='password', master_log_file='binlog_file', master_log_pos=log_file_position; 如果需要更改端口,比如端口号为 33060,则在其中添加 master_port=33060。\n8.0.23 及之后:\nchange replication source to source_host='source_ip', source_user='repl', source_password='password', source_log_file='binlog_file', source_log_pos=log_file_position; 8.0 官方文档提到:In MySQL 8.0.23 and later, use CHANGE REPLICATION SOURCE TO in place of the deprecated CHANGE MASTER TO statement.\n启动复制服务 8.0.22 之前:\nstart slave 类似的,你应该能推测出来停止复制应该是 stop slave。\n8.0.22 之后:\nstart replica 查看复制状态 8.0.22 之前:\nshow slave status \\G; 8.0.22 之后:\nshow replica status \\G; 根据 8.0 官方文档,8.22 之后用 show replica status 代替了 show slave status,后者仍可使用但有警告。而 show master status 没有替代。\n开头部分如下:\nmysql\u003e show replica status\\G *************************** 1. row *************************** Replica_IO_State: Waiting for source to send event Source_Host: xxx Source_User: repl Source_Port: 33060 Connect_Retry: 1 Source_Log_File: binlog.000002 Read_Source_Log_Pos: 927 Relay_Log_File: slave-relay-bin.000002 Relay_Log_Pos: 158 Relay_Source_Log_File: binlog.000002 Replica_IO_Running: Yes Replica_SQL_Running: Yes 注意这里的最后两行,确保 Replica_IO_Running 和 Replica_SQL_Running 都为 Yes,这时复制就开始了。","原理#原理":"\n网上找的,图源水印"},"title":"MySQL 主从复制 - binary log"},"/dev/jdk/":{"data":{"":"","1-windows---免手动配置path#1. Windows - \u003cstrong\u003e免手动配置PATH\u003c/strong\u003e":"凡是到现在还让你配置 CLASS_PATH 的都是垃圾文章,不要看了。\n把官网和介绍放到了最后\n1. Windows - 免手动配置PATH 推荐开源免费的 AdoptOpenJDK(Adoptium),它也是VS Code的默认推荐。你可以在下面找到需要的版本进行下载。\nAdoptium - 校园网联合镜像站 任意点击一个镜像站的名字进入,以清华镜像站TUNA为例,依次点击“需要的版本(推荐8、11、17等LTS版本)”- “jdk” - “架构(x64)” - “平台(windows)”,如图就是64位Windows用的jdk11,选择第一个.msi文件下载打开即可。 Java I tell you(包含了多个版本的JDK) 选择Temurin即可 安装时将下面第三个选项选上,装完重启(或关闭所有终端)即可。 微软加入了Adoptium,也有自己的Microsoft Build of OpenJDK,Java I tell you中也有下载。 我看着安装程序和上面差不多,可以试试。","2-linux含-wsl#2. Linux(含 WSL)":"可以直接用包管理器安装。 以Ubuntu为例,终端内输入javac,如果提示没有安装,复制提示的命令来安装JDK。 如上图,Ubuntu安装默认版本的OpenJDK(JDK11)的命令是\nsudo apt install default-jdk 安装完之后就可以正常使用了。\n通过包管理器安装的软件不用配置PATH环境变量就能使用,但是有些程序会检测JAVA_HOME这个环境变量,这时需要设置一下。通过下面可以看到JDK在/usr/lib/jvm/java-xxx目录中,将其添加到环境变量中即可。 系统环境变量推荐在/etc/environment声明,或在/etc/profile.d目录下以.sh结尾的脚本中用export语句声明,下面例子就放在了/etc/environment中。根据实际情况修改单引号中的路径。\nroot用户:echo 'JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64' \u003e\u003e /etc/environment\n普通用户:echo 'JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64' | sudo tee /etc/environment\n系统环境注销再登录后即可生效。更多关于Linux环境变量的请看Linux环境变量。","3-jdkjrejvm的关系及区别#3. JDK、JRE、JVM的关系及区别":" JDK(Java Development Kit)是Java开发工具包。 JRE(Java Runtime Enviroment)是Java的运行环境。 JVM(Java Virtual Machine)是Java虚拟机。 JDK里包含了JRE,JRE里又包含JVM。所以开发者只用安装JDK就行。","4-官网及版本#4. 官网及版本":" 官网 介绍 Java SE(Oracle JDK) 包含Oracle JDK和JRE的下载,商业用途收费。 OpenJDK Java开源的源码。下面是预编译的OpenJDK。 Oracle OpenJDK 现在与Oracle JDK功能基本无区别,维护周期不同。 AdoptOpenJDK(现为Adoptium) AdoptOpenJDK是OpenJDK的社区维护版,现已移交eclipse基金会并更名为Adoptium。 …… 三个不同版本:(Sun/Oracle) JDK、OpenJDK、Oracle OpenJDK"},"title":"JDK下载安装"},"/friends/":{"data":{"":"朋友动态\n烂🍐的同学们\nYLQQ のBLOG SYH’s Note 欢迎与我交换友链,直接在下面评论就可以。提供网站名称、URL、头像链接等即可。以我为例:\n网站名称:炳的自留地 域名地址:https://wcbing.top 头像链接:https://wcbing.top/imgs/my.png "},"title":"朋友们"},"/linux/containers/":{"data":{"":"关于安装与基础操作请看:\nDocker / Podman 安装与换源 Docker / Podman 基础操作 扩展: 是否要用 Podman 代替 Docker\n自用镜像\n安装容器 Web 面板 —— Portainer Docker / Podman 常用镜像 "},"title":"容器"},"/linux/containers/base-usages/":{"data":{"":"Docker 镜像和容器的基础操作。Podman 用法与其相同,将docker替换为podman即可。","compose-管理#Compose 管理":"很多情况下我们项目会需要多个相互配合的容器组成一个容器组;或者需要进行批量部署。这时继续通过上面的方法就有些费力,可以通过 Docker Compose(或者 Podman Compose)进行方便的管理。\n有些创建的容器创建后想修改,这时也可以通过这个完成。虽然重新部署实际还是把容器删掉再建一个。\n它使用一个 compose.yaml 文件作为配置文件。使用时只需在该文件所在目录执行 docker compose 相关指令就可进行容器组的建立、启动、停止等操作。\n有些人将这个配置文件命名为 docker-compose.yml,这是一种过时但仍兼容的写法。详细请看 https://docs.docker.com/compose/compose-application-model/#the-compose-file\n功能 docker compose 命令 备注 查看容器 docker compose ps 还有 docker compose ls 建立容器 docker compose up 常加 -d,后台运行 启动容器 docker compose start 重启容器 docker compose restart 停止容器 docker compose stop 删除容器 docker compose down 查看日志 docker compose logs ","容器管理#容器管理":"操作容器一般使用\u003c容器名\u003e或\u003c容器ID\u003e。容器名可通过--name在docker run时指定,也可由系统自动分配;容器ID同镜像ID一样,仅需开头3、4位,能分辨即可。\n使用镜像创建容器 - docker run命令 docker run [参数] \u003c镜像名\u003e docker run 创建容器时如果本地没有镜像,docker 会自动去拉取镜像,可以免去 docker pull 这一步。\n常用参数:\n--name xxx :给新容器命名为“xxx” -d :后台运行 -i :进行交互式操作 -t :分配一个伪终端,一般与i一同使用 -p xxxx:xxxx :指定端口映射,格式为“主机端口:容器端口” -e xxx :设置环境变量 -v xx:xx :挂载数据卷、主机目录 --mount xx=xx,xx=xx :同上 样例:\nMySQL docker run -d \\ -p 3306:3306 \\ -e MYSQL_ROOT_PASSWORD=123456 \\ --name mysql \\ mysql PostgreSQL docker run -d \\ -p 5432:5432 \\ -e POSTGRES_PASSWORD=123456 \\ --name postgresql \\ postgres:alpine 容器的管理 - docker container命令 docker container 的常用命令一般可以省略container,如docker container start 可以写为 docker start\n功能 docker container 命令 别名 查看容器 docker container ps docker ps,常加-a查看所有容器\n还有个docker ls也可以 启动容器 docker container start \u003c容器名\u003e/\u003c容器ID\u003e docker start \u003c容器名\u003e/\u003c容器ID\u003e 重启容器 docker container restart \u003c容器名\u003e/\u003c容器ID\u003e docker restart \u003c容器名\u003e/\u003c容器ID\u003e 停止容器 docker container stop \u003c容器名\u003e/\u003c容器ID\u003e docker stop \u003c容器名\u003e/\u003c容器ID\u003e 删除容器 docker container rm \u003c容器名\u003e/\u003c容器ID\u003e docker rm \u003c容器名\u003e/\u003c容器ID\u003e 查看日志 docker container logs \u003c容器名\u003e/\u003c容器ID\u003e docker logs \u003c容器名\u003e/\u003c容器ID\u003e 进入后台运行的容器 docker attach \u003c容器名\u003e/\u003c容器ID\u003e 或\ndocker exec \u003c容器名\u003e/\u003c容器ID\u003e 命令 -it \u003c容器名\u003e/\u003c容器ID\u003e bash :进入容器并启动bash进行交互式操作 推荐exec,退出容器不会停止。","镜像管理#镜像管理":" 功能 命令 说明 查找镜像 docker search \u003c关键字\u003e 下载镜像 docker pull \u003c镜像名\u003e 镜像名 = 镜像仓库名(用户名/软件名):tag,用户名为library时会省略,tag为latest时可省略 查看镜像 docker image ls 列出的镜像ID是镜像短ID,镜像ID一般使用时取开头3、4位,能分辨即可。 删除镜像 docker image rm \u003c镜像名\u003e/\u003c镜像 ID\u003e 别名:docker rmi \u003c镜像名\u003e/\u003c镜像 ID\u003e "},"title":"Docker / Podman 基础操作"},"/linux/containers/images/":{"data":{"":" ","databases#databases":"PostgreSQL postgres:alpine docker run -d -p 5432:5432 \\ -e POSTGRES_PASSWORD=123456 \\ --name postgres postgres:alpine MySQL mysql:debian docker run -d -p 3306:3306 \\ -e MYSQL_ROOT_PASSWORD=123456 \\ --name mysql mysql:debian openGauss enmotech/opengauss opengauss/opengauss:5.0.0 251 DB。密码还有要求,破事真多。\n社区做的晚也就罢了,连个 latest 标签都没有,不会又是大学生做的吧。而且基于 openEuler 镜像,比较大。\ndocker run -d \\ -e GS_PASSWORD=openGauss@123 \\ --privileged true \\ --name opengauss enmotech/opengauss Redis redis:alpine docker run -d -p 6379:6379 \\ --name redis redis:alpine ","os#OS":" alpine debian debian:12-slim fedora ","tools#tools":"Nginx nginx:alpine nginx:alpine-perl docker run -d \\ --network host \\ --restart always \\ --name nginx \\ nginx:alpine 挂载本地目录\nmkdir -p nginx/conf.d nginx/web cd nginx docker run -d \\ -v $PWD/conf.d:/etc/nginx/conf.d \\ -v $PWD/web:/usr/share/nginx \\ --network host \\ --restart always \\ --name nginx \\ nginx:alpine weasyprint docker run --rm -v $PWD:/app \\ -w /app minidocks/weasyprint \\ https://weasyprint.org/ weasyprint.pdf "},"title":"Docker / Podman 常用镜像"},"/linux/containers/install/":{"data":{"":"安装 Docker 或 Podman(选一个就好),以及更换 Docker Hub 镜像源。","安装-docker--podman#安装 Docker / Podman":"我到底安装哪一个?可以参考下表:\nLinux(CLI) Windows \u0026 macOS \u0026 Linux(GUI) docker Docker Engine\n(原 Docker CE) Docker Desktop podman Podman Podman Desktop Docker 作为最有名的容器引擎应该就不用我多说了。Podman 是 Redhat 开发的 “Docker 替代品”,特点是无需后台运行守护进程,并且是 rootless 的。更多请看:是否要用 Podman 代替 Docker\nDocker CLI(Linux) 如果你发行版的仓库中有且更新及时(比如 Arch、Alpine),那直接用包管理器安装就行了。 需要注意的是,Debian系(包括Ubuntu等)仓库中的 docker 并不是我们要用的,Docker 包名为docker.io。 如果仓库中没有,或仓库版本较旧要最新版的请查看官方文档或 Docker CE 软件仓库镜像使用帮助安装。 个人用户推荐用其中的安装脚本进行安装:\n可以正常访问 docker 请执行 curl -fsSL https://get.docker.com/ | sudo -E sh 使用校园网联合镜像站请执行: export DOWNLOAD_URL=\"https://mirrors.cernet.edu.cn/docker-ce\" curl -fsSL https://get.docker.com/ | sudo -E sh 使用阿里云镜像站安装请执行 curl -fsSL https://get.docker.com/ | sudo sh -s - --mirror Aliyun Podman CLI (Linux) Podman 因为是 Redhat 推出的,主流发行版的仓库基本都是有的,包管理器直接安装即可。\n配置缺省 Docker Hub Podman 拉取 Docker Hub 内镜像时,镜像名称不能省略 docker.io/ 前缀。你可以每次都手动添加,也可以按下面方法配置缺省使用。\n打开 /etc/containers/registries.conf 或新建 /etc/containers/registries.conf.d/docker.conf,在末尾添加:\nunqualified-search-registries = [\"docker.io\"] Docker Desktop 或 Podman Desktop Docker Desktop 是 Docker 官方提供的一个 GUI 管理工具,可以帮你自动化安装 docker(Docker Engine)。Podman 官方也提供了类似的 GUI 管理工具 Podman Desktop,它不仅可以帮你自动化安装和管理 Podman,还支持 Docker 管理。\n它们都是支持 Windows \u0026 macOS \u0026 Linux 的,具体下载地址请看前面的表格。\nDocker 使用了 Linux 内核的一些特性,在 Windows \u0026 macOS 上使用需要虚拟机内运行(比如 Windows 上的 Docker 就是通过 WSL 实现的),这两个平台一般会安装 Docker Desktop。Podman 也也同理。\nLinux 上就算了,占用太高了,真喜欢这种“图形化面板”不如用 Portainer,或者 lazydocker 这样的 TUI 软件。","访问-docker-hub#访问 Docker Hub":"因为 Docker Hub 服务器在国外,国内拉取镜像挺慢的,解决方法有两种。\n一是可以使用镜像站,国内还是有很多镜像的。 二是可以让 docker、podman 通过代理拉取镜像。 Docker Hub 仓库镜像 可用镜像\n云服务器参考下面 阿里云,需要自己去 容器镜像服务 创建专属镜像仓库。 腾讯云,按照文档操作即可。 公网 2024.6 知名高校、企业的公网镜像基本都关了。如果你有可用的镜像,请自行替换下面的配置文件。\n可用镜像参考:https://status.1panel.top/status/docker Docker 配置镜像源 打开或新建 /etc/docker/daemon.json,添加:\n{ \"registry-mirrors\": [ \"https://example.com\" ] } 将 example.com 替换为可用镜像。\nPodman 配置镜像源 在刚刚配置 Docker Hub 的地方继续追加:\n[[registry]] location = \"docker.io\" [[registry.mirror]] location = \"exaple.com\" 将 example.com 替换为可用镜像。\nDocker / Podman 设置代理 Docker 设置代理 参见官方文档:https://docs.docker.com/config/daemon/proxy/#systemd-unit-file\n因为 Docker 有守护进程 dockerd,我们应该修改它的配置。而它又是 Systemd 管理的,所以我们要编辑 Systemd 的配置。\nsudo mkdir -p /etc/systemd/system/docker.service.d echo '[Service] Environment=\"HTTP_PROXY=http://127.0.0.1:7890/\" Environment=\"HTTPS_PROXY=http://127.0.0.1:7890/\" Environment=\"NO_PROXY=localhost,127.0.0.1\" ' | sudo tee /etc/systemd/system/docker.service.d/proxy.conf Podman 设置代理 与之相比 Podman 就简单多了,设置系统代理就好了,也就是它会读取 http_proxy、https_proxy 等变量。无守护进程的又一个优势。"},"title":"Docker / Podman 安装与换源"},"/linux/containers/portainer/":{"data":{"":"Portainer,用来管理容器的 Web 面板。\nPodman 相关内容参考:podman support - github。\n我修改了一些细节,比如将 --restart=always 换为推荐的 --restart always,将 ${HOME} 换为所有 Shell 都支持的 \"$HOME\",等等。\n更新:2.22 之后官方添加了正式的 Podman 支持,文档地址,这是个非 LTS 版本。\n文档还是有些细节问题,下面的我就不更新了。而且文档中的方法相当完全放弃了 podman rootless 用户,虽然我在 rootless 情况下(桌面环境中)也不用它😄。","portainer-agent#portainer-agent":"docker docker run -d -p 9001:9001 \\ --name portainer_agent \\ --restart always \\ -v /var/run/docker.sock:/var/run/docker.sock \\ -v /var/lib/docker/volumes:/var/lib/docker/volumes \\ -v /:/host \\ portainer/agent:alpine podman root mkdir -p /var/lib/containers/storage/volumes podman run -d -p 9001:9001 \\ --name portainer_agent \\ --restart always \\ -v /run/podman/podman.sock:/var/run/docker.sock \\ -v /var/lib/containers/storage/volumes:/var/lib/docker/volumes \\ -v /:/host \\ portainer/agent:alpine podman rootless systemctl --user enable --now podman.socket podman run -d -p 9001:9001 \\ --name portainer_agent \\ --security-opt label=disable \\ --restart always \\ -v /run/user/$(id -u)/podman/podman.sock:/var/run/docker.sock \\ -v \"$HOME\"/.local/share/containers/storage/volumes:/var/lib/docker/volumes \\ -v /:/host \\ portainer/agent:alpine ","portainer-ce#portainer-ce":"docker docker volume create portainer_data docker run -d -p 9443:9443 \\ --name portainer \\ --restart always \\ -v /var/run/docker.sock:/var/run/docker.sock \\ -v portainer_data:/data \\ portainer/portainer-ce:alpine podman root podman volume create portainer_data podman run -d -p 9443:9443 \\ --name portainer \\ --restart always \\ -v /run/podman/podman.sock:/var/run/docker.sock \\ -v portainer_data:/data \\ portainer/portainer-ce:alpine podman rootless systemctl --user enable --now podman.socket podman volume create portainer_data podman run -d -p 9443:9443 \\ --name portainer \\ --restart always \\ --security-opt label=disable \\ -v /run/user/$(id -u)/podman/podman.sock:/var/run/docker.sock \\ -v portainer_data:/data \\ portainer/portainer-ce:alpine "},"title":"安装容器 Web 面板 —— Portainer"},"/linux/containers/whether-podman/":{"data":{"":"Docker 作为最有名的容器引擎应该就不用我多说了。Podman 是 Redhat 开发的 “Docker 替代品”,特点是无需后台运行守护进程,并且是 rootless 的。\n无守护进程是个好事,少个常驻进程。 rootless 简单说就是普通用户可以以非 root 身份管理容器,具体可看官网介绍,现在 Docker 也有办法实现。\n但 rootless 说是更安全,但是对我来说反倒会带来不方便,比如跑个 nginx 需要 80、443 ,普通用户没有权限创建,root/sudo 创建了之后普通用户又看不见这个容器。 Podman 用法和 Docker 基本上一样,甚至官方文档里说习惯 docker 的可以直接 alias docker=podman。其实现在基本的容器引擎基本都是😂","podman-优缺点#Podman 优缺点":"优点:\n最明显的优点就是内存占用小。 无需守护进程,配置网络代理等时更方便。 缺点:\n资料、热度不如 docker 多,不过很多其实是通用的。 更新不方便\nPodman 和 Docker,各大发行版都会在官方仓库收录,安装都很简单。但是代价呢,大部分发行版是 Point-Release,仓库里的会锁版本。Docker 还有官方仓库,可以替换掉发行版仓库中的来更新,但是 Podman 不放出 deb、rpm 包,你想用最新版很困难。 配套的 podman compose 和 docker compose 有差别,有些用 docker compose 进行的特殊操作不好实现。 特点(可能是优点也可能是缺点):\nrootless\n每个用户的容器是各自独立的,不扯安全性,多用户时只看隐私性这样也会更好。但是前面也说了,有些资源就是得 root 才能操作,你可能要 podman、 sudo podman 混用。 生态兼容,迁移成本低\n因为容器的标准已经标准化(OCI, Open Container Initiative),所以相互之间兼容是很正常的,甚至 CLI 操作也基本一样。不过因为大部分常用镜像都放在 Docker Hub,而很多文档因为使用 docker 会有一些简写,比如省略 docker.io、library这些,你需要给 Podman 配置一下缺省使用 Docker Hub。 还有就是网络问题,待写。","内存占用对比#内存占用对比":"下面是 docker 和 podan 同时运行两个相同容器的进程信息,我整理并将两者分开后结果如下。\n时间 2024.11,宿主系统 Alpine Linux 3.20\nPodman\nTree: MemB [-]─8125 conmon (/usr/bin/conmon --api-version 1 -c c6c992b132) 896K │ └─ 8138 agent (./agent) 40M [-]─28148 conmon (/usr/bin/conmon --api-version 1 -c c97c4960f) 896K │ └─ 28159 frps (/usr/bin/frps -c /etc/frp/frps.toml) 24M [-]─2138 supervise-daemo (supervise-daemon) 384K │ └─ 2139 podman (/usr/bin/podman system service --time 0) 58M Docker\nTree: MemB [-]─28497 containerd-shim (containerd-shim-runc-v2) 20M │ └─ 28518 agent (./agent) 44M [-]─28416 containerd-shim (containerd-shim-runc-v2) 19M │ └─ 28435 frps (/usr/bin/frps -c /etc/frp/frps.toml) 23M [-]─2393 supervise-daemo (supervise-daemon) 384K │ [-]─2394 dockerd (/usr/bin/dockerd) 108M │ │ ├─ 2412 containerd 49M │ │ ├─ 28482 docker-proxy 4.4M │ │ ├─ 2395 log_proxy 1.4M │ │ └─ 2397 log_proxy 1.4M 首先可以看到,对每个单独容器,每个容器对应的守护进程确相差挺大。Docker 的 containerd-shim 有 20 MB,而 Podman 的 conmon 却只有 1MB 不到。也就是每跑一个容器,Docker 要比 Podman 多用 20 MB.\n还有就是容器引擎的守护进程。而前面说了 Podman 无守护进程,但是为什么我图中又有了,因为我图中用的宿主系统是 Alpine,没有用 Systemd 等那一套,不过这样对比也是明显的。结果显示 dockerd 占用是 160MB 以上,而podman 是不到 60 MB,相差大概 100 MB。\n所以,假如你服务器上要跑 5 个容器,那么用 docker 和 podman 的内存占用就有 100+20*5=200 MB 的差距了。"},"title":"是否要用 Podman 代替 Docker"},"/linux/disto/":{"data":{"":"","#":" 什么是 Linux发行版 主要 Linux 发行版发展时间线 - Linux Distribution Timeline 常见的桌面(Deaktop)发行版 Debian\n各种桌面都有 deepin\nDDE,应用商店对中国用户比较友好。 Ubuntu\n默认修改版 GNOME,用户多,资料多 Linux Mint\n默认 Cinnamon,口碑较好 LMDE\nLinux Mint 的另一个版本,默认 Cinnamon Arch EndeavourOS\n默认 KDE Crystal Linux\n默认底栏布局 GNOME Redhat fedora\n默认 GNOME,不太推荐 SUSE openSUSE\n默认 KDE,不太推荐 为什么不太推荐选择使用 rpm 包的桌面发行版? 其实就一个原因,桌面生态太差。fedora 是红帽系唯一称得上“桌面发行版”的,其他用 rpm 的也就 SUSE 系的 openSUSE。\n很多应用如果只提供一种专用包格式(与跨发行版的通用二进制包、AppImage 等对应),那基本就是 deb,deb 包的生态比 rpm 好的多。国内尤其如此,因为很多企业适配 Linux 都是所谓的“信创”要求,而国产桌面发行版都是使用 deb 包的。\n主动为 Arch 打包的更少,但是因为社区活跃打包人多,有了 AUR 加持,其生态也算是比较好的。\n为什么不推荐选择 Manjaro? 因为 Manjaro 自建仓库消解了 Arch 的几大优点。\n首先是滚动发行版,其自建仓库主动延迟更新,用户无法即时体验到最新的软件版本,这不太符合滚动发行版尽力提供最新的稳定版包的理念。 其次是AUR丰富的用户生态,因为AUR都是为Arch打造的,Manjaro的更新延迟可能会导致依赖出现一些问题,甚至因此“滚挂”。 还有就是活跃的用户社区,自建仓库导致它的问题很多其他 Arch 用户无法复现,所以Arch社区都明确要求你使用的不是原版 Arch(尤其是 Manjaro)在提出问题之前必须说明,如果是Manjaro特有的问题会让其到自己社区去解决。 软件\nPlymouth - 开机启动界面 Plymouth 是一个来自于 Fedora 社区的提供漂亮的启动界面的项目,现在它被列入了freedesktop.org 的官方资源之中。"},"title":"Linux 发行版"},"/linux/git-base/":{"data":{"":"一点点基础,应该够给你搭博客使用了","提前的设置#提前的设置":"git config 在提交之前,你必须先设置你的名字和 email。 这是你在提交 commit 时的签名,每次提交记录里都会包含这些信息。\ngit config --global user.name \"YourName\" git config --global user.email \"YourEmail@xxx\" ","本地操作#本地操作":"git init Git初始化,在目标目录内执行\ngit status 检测当前目录和暂存区的状态\ngit add 将要同步的内容加入本地暂存区\ngit add 目录/文件 常用\ngit add . ## 将当前目录下所有改动添加到暂存区 git add -A ## 将仓库所有改动添加到暂存区 git commit 提交到本地仓库中,后面加注释\ngit commit -m \"注释\" git commit -am \"注释\" ## 相当于同时执行了 git add -A git commit 提交信息参考规范:Angular","远程仓库#远程仓库":"git clone 克隆一个Git仓库到本地,可以将仓库内容直接下载下来。\ngit clone \u003curl\u003e git remote 管理远程仓库,常用的是与远程仓库添加关联\ngit remove add \u003c仓库别名\u003e \u003c仓库url\u003e 下面先不涉及分支,默认主分支master\ngit push 将本地仓库内容推送到远端仓库中\ngit push \u003c仓库别名\u003e \u003c本地分支\u003e:\u003c远程分支\u003e git push \u003c仓库别名\u003e \u003c本地分支\u003e ## 分支相同可简写 -f:强制推送\n-u:同时建立分支的关联\ngit pull 从远程仓库拉取到本地仓库,与git push相反\ngit pull \u003c仓库别名\u003e \u003c远程分支\u003e:\u003c本地分支\u003e git pull \u003c仓库别名\u003e \u003c远程分支\u003e ## 分支相同可省略 "},"title":"Git基础"},"/linux/linux-env/":{"data":{"":"乱七八糟的。说是 Linux,但 Unix-like 基本都适用。","shell-初始化文件#Shell 初始化文件":"部分 Shell 初始化文件 系统/全局配置都在/etc/目录下 用户配置都在~目录下 bash(login) /ect/profile ~/.profile bash(non-login) /etc/bash.bashrc ~/.bashrc zsh(login) 同 bash,以及 /etc/zsh/zshprofile zsh(non-login) /etc/zsh/zshrc ~/.zshrc fish /etc/fish/config.fish ~/.config/fish/config.fish 某些发行版可能不同,比如 /etc/bash.bashrc 换为 /etc/bashrc 没有列出所有;各种xx-login与xx-profile作用类似 Fish 好像是没有专门给 login shell 用的文件,需要自己使用 if 判断。其实我觉得这样挺好,因为现在的配置文件太多太乱了。 login shell 与 non-login shell 看过上表会发现有些 Shell 有 xx-profile 和 xx-rc 两套 Shell 的初始化文件。其原因是登录 Shell 有两种方法:login shell 与 non-login shell。\n下面来自鸟哥的 Linux 私房菜:\n在开始介绍 bash 的配置文件前,我们一定要先知道的就是 login shell 与 non-login shell! 重点在于有没有登入 (login) 啦!\nlogin shell:取得 bash 时需要完整的登入流程的,就称为 login shell。举例来说,你要由 tty1 ~ tty6 登入,需要输入用户的账号与密码,此时取得的 bash 就称为『 login shell 』啰; non-login shell:取得 bash 接口的方法不需要重复登入的举动,举例来说,(1)你以 X window 登入 Linux 后,再以 X 的图形化接口启动终端机,此时那个终端接口并没有需要再次的输入账号与密码,那个 bash 的环境就称为 non-login shell 了。(2)你在原本的 bash 环境下再次下达 bash 这个指令,同样的也没有输入账号密码, 那第二个 bash (子程序) 也是 non-login shell 。 为什么要介绍 login, non-login shell 呢?这是因为这两个取得 bash 的情况中,读取的配置文件数据并不一样所致。 对于这些Shell,启动 non-login shell 时只会加载 xx-rc;启动 login shell 时只会加载 xx-profile。\n通过 su 切换用户时,若直接 su 用户名,会以 non-login shell 登录到该用户,若加上选项 -、-l、--login,则会以 login shell 登录到该用户。\n初始化文件读取顺序 还是先以 Bash 为例,可查看 Bash - ArchWiki。\n因为 profile 一般会加载同级的 bashrc,我们简化来看后,其实际初始化文件读取顺序: 如果考虑到是否是交互式、是否远程登陆等因素,之前看到一张图讲 sh、bash、zsh 初始化文件的读取顺序大概分别是这样的:\n令人头大是吧。当然也有这图的原因,登陆条件与读取文件的图例没有明显区分,大家看个乐子就行。","环境变量#环境变量":" 环境变量一般习惯为全大写,使用时前面加 $ 可以使用 echo 查看,例如 echo $PATH Linux 上多个环境变量用 : 分隔 查看所有环境变量可以使用 Shell 内置的 export、set,或者使用 env 、printenv。 自己设置环境变量可以使用 export 声明,其只在当前 Shell 进程(及子进程)中起作用。如:\nexport AB=/root 使用 export 时等号前后都不可有空格,内容有空格的话用引号包围。","环境变量持久化#环境变量持久化":"/etc/environment Linux有一个 /etc/environment 文件可以存放系统环境变量,里面只能写变量的声明语句,语法就是如 AA=1234 的键值对。修改后重新登录用户(注销、重启)以生效。 但是这个地方不支持变量展开(如:PATH=$PATH:/usr/local/sbin),所以不是很推荐。\n写进 Shell 初始化文件 可以将 export 命令添加进Shell的初始化文件,这样每次启动 Shell 时就会自动加载环境变量。初始化时依次读取系统和用户的初始化文件,以最后读到的为准。\n要注意不同Shell的初始化文件也不同,区别在下面一节,先说结论,对于大多数人用的 Bash、Zsh 等:\n如果修改用户的环境变量,建议修改 ~/.xx-rc(根据你使用的shell,如 .bashrc )。修改完使用 source ~/.xx-rc 命令或启动新shell进程、切换用户等即可生效。 如果修改系统环境变量,建议在 /etc/profile.d 目录下新建或修改 .sh 结尾的脚本。修改完使用 source /etc/profile 命令或重新登录用户(注销、重启)以生效。 另外,source 命令也可以用.代替。不过它们只在当前 shell 进程起作用,所以最好还是重新登录或重启。"},"title":"Linux(Shell)环境变量"},"/linux/package-manager/apt-remove-purge/":{"data":{"":"你可以将这些看作 apt remove 是否使用 --purge、--autoremove 这两个参数排列组合结果的别名。\n--purge 参数作用是删除程序包时删除其配置文件,--autoremove 参数的作用是删除不再需要的依赖包。\napt remove apt purge\n= apt remove –purge apt autoremove\n= apt remove –autoremove apt autopurge\n= apt remove –autoremove –purge\n= apt autoremove –purge\n= apt purge –autoremove 在 man 手册里,apt(8) 只提到了前三个,且都显示来自apt-get(8),没有 autopurge。而 apt-get(8) 中有 autopurge,并说其是 autoremove --purge 的别名。\n新版 fish 补全中四个子命令都有,旧版也是没有 autopurge。"},"title":"apt remove purge autoremove autopurge 异同"},"/linux/package-manager/subcmd-for-pacman/":{"data":{"":"用过 Arch 的都知道其包管理器 pacman 以及很多“AUR helper”如 yay、paru 等,使用的 -S 形式的“选项”(OPTIONS)作为参数。这和主流的 apt、dnf/yum 等的“子命令”式参数有着明显差异,很多新接触的都是一脸懵逼,比如最经典的 -S、-Sy、-Syy、-Syu、-Syyu、-Syuu 这一连串看着类似的选项。\n很多人就算用 Arch 挺长时间也根本不知道什么意思,就是入门时看的什么“小白教材”这么写就这么一直用了。\n其实 apt 和 dnf/yum 的“底层” —— dpkg、rpm 也是选项式的,而他们作为直接与用户交互的封装都使用了子命令式,说明子命令应该对大部分人来说是更易使用的,因为它更“human-readable”。所以简单写了个脚本,让用户也可以像 apt 那样在 pacman 或 yay 等 AUR helper 中使用子命令。\n可以保存并命名为 pkg 之类的进行使用。记得给运行权限并放进环境变量。普通用户使用时也不用加 sudo,这样一是为了方便,二是为了兼容那些 AUR helper 。\n真要想标题里那样就是给 pacman 加子命令那也可以命名为 pacman,已经过简单测试,不过并不推荐这么做。\n#!/bin/sh get_arch_pkg() { local pkgs=\"yay paru /bin/pacman\" for p in $pkgs; do if command -v \"$p\" \u003e/dev/null; then pkg=\"$p\" return 0 fi done echo \"not find package manager\" \u0026\u0026 exit 1 } no_subcmd() { echo \"Please use \\\"$(basename $0) help\\\" to see detailed usage.\" echo \"The package manager is $pkg\" echo \"Now will executing $pkg.\" echo $pkg exit 0 } # Subcommands for pacman/yay/paru pacman_like() { sub_cmd=\"$1\" shift case $sub_cmd in \"search\") $pkg -Ss $@ ;; \"show\") $pkg -Si $@ ;; # from repo \"info\") $pkg -Qi $@ ;; # from local \"clean\") $sudo_prefix$pkg -Sc $@ ;; \"update\") echo 'Avoid doing partial upgrades. Always use upgrade(-Syu) instead of update(-Sy).' echo 'Refer to https://wiki.archlinux.org/title/System_maintenance 3.2 3.3' echo '请避免部分更新,不要运行 update(-Sy),而是运行 upgrade(-Syu)。' echo '请参阅 https://wiki.archlinuxcn.org/wiki/系统维护 3.2 3.3' $sudo_prefix$pkg -Sy $@ ;; \"install\" | \"add\") case \"$@\" in ./*) $sudo_prefix$pkg -U $@ ;; # install local package *) $sudo_prefix$pkg -S $@ ;; esac ;; \"upgrade\") $sudo_prefix$pkg -Syu $@ ;; \"force-upgrade\") $sudo_prefix$pkg -Syyu $@ ;; \"remove\" | \"del\"* | \"uninstall\") echo Suggest using \"purge\" or \"autopurge\" $sudo_prefix$pkg -R $@ ;; \"purge\") $sudo_prefix$pkg -Rn $@ ;; \"autoremove\" | \"autopurge\") if [ $# -eq 0 ]; then # from https://wiki.archlinuxcn.org/wiki/Pacman/提示和技巧 1.6 $pkg -Qtdq | $sudo_prefix$pkg -Rns - else [ \"$sub_cmd\" = \"autoremove\" ] \u0026\u0026 $sudo_prefix$pkg -Rcs $@ [ \"$sub_cmd\" = \"autopurge\" ] \u0026\u0026 $sudo_prefix$pkg -Rncs $@ fi ;; \"help\") echo \"可用子命令(Available subcommands):\" echo \" search : Search for packages\" echo \" show : Show package information from repo\" echo \" info : Show package information from local\" echo \" clean : Clean package cache\" echo \" install : Install packages\" echo \" |- add\" echo \" upgrade : Upgrade packages\" echo \" force-upgrade : Force upgrade packages\" echo \" remove : Remove packages\" echo \" |- del\" echo \" |- uninstall\" echo \" purge : Purge packages\" echo \" autoremove : Automatically remove unneeded packages\" echo \" autopurge : Automatically purge unneeded packages\" ;; *) $pkg $sub_cmd $@ ;; esac } get_arch_pkg # need sudo or not [ $(id -u) != 0 ] \u0026\u0026 [ \"$pkg\" = \"/bin/pacman\" ] \u0026\u0026 sudo_prefix=\"sudo \" || sudo_prefix=\"\" [ $# -eq 0 ] \u0026\u0026 no_subcmd || pacman_like \"$@\" "},"title":"给 pacman 增加子命令 —— 在 Arch Linux 上像使用 apt、dnf 那样使用 pacman 或 AUR helper"},"/linux/setting/base/":{"data":{"":"一些很重要但设置一次后基本后不会管的 Linux 系统设置。\n这下面 xxxctl 都是 Systemd 的组件,虽然有争议,但确实为平时使用带来了不少方便。\n不过既然有的不用 Systemd 或不能用Systemd(像容器里),还是把通用命令和具体配置文件也列出来了。\n非必要不要直接修改配置文件。","主机名设置#主机名设置":"主机名,即 Hostname\nhostnamectl hostname 配置文件 查看主机名 hostnamectl hostname cat /etc/hostname 设置主机名 hostnamectl hostname [hostname] hostname [hostname]临时修改\nhostname -F /etc/hostname 立即根据配置文件更新主机名 将上述配置文件中内容改为所设主机名,重新登陆后生效 ","地区语言设置#地区语言设置":"查看当前语言设置主要涉及localectl、locale、locale-gen等。建议使用 localectl。\n生成语言文件:\nlocalectl locale-gen 生成语言文件 设置默认语言时自动生成 1. vim /etc/locale.gen,找到需要语言,如 zh_CN.UTF-8,取消注释。\n2. 执行 locale-gen 生成Locale 假如要将默认语言改为简体中文,对比如下:\nlocalectl locale 配置文件 查看当前语言 localectl status locale cat /etc/locale.conf\n某些会使用\n/etc/default/locale 查看已安装语言 localectl list-locales locale -a 设置默认语言 localectl set-locale LANG=zh_CN.UTF-8 配置文件内容改为LANG=zh_CN.UTF-8 关于“桌面”、“下载”等中文目录:\nXDG 用户目录 - Arch Linux 中文维基\n使用 LC_ALL=C.UTF-8 xdg-user-dirs-update --force 命令可以强制创建英语目录。","时间设置#时间设置":"日期时间、时区等的设置,涉及 timedatectl、date、tzselect 等。还是推荐 timedatectl。\n例子如下:\ntimedatectl date 和 tzselect 查看时间信息 timedatectl date 设置时间 timedatectl set-time \"2002-02-02 01:01:01\"\n或timedatectl set-time 01:01:01 date -s \"2002-02-02 01:01:01\"\n或date -s 01:01:01 设置时区 timedatectl set-timezone Asia/Shanghai tzselect 设置 NTP timedatectl set-ntp true 关于双系统时间不同步的问题:\nLinux Windows 双系统时间不一致 - 少数派\n系统时间#Windows_系统使用_UTC - Arch Linux 中文维基"},"title":"Linux 日常设置"},"/linux/setting/user/":{"data":{"":"","权限#权限":" 查看 修改文件权限 修改文件属主 修改文件属组 文件权限 ls -l chmod chown chgrp 未完待续","用户与组#用户与组":" 查看(我) 查看(已登陆) 创建 删除 修改 用户 whoami\nid w(登陆用户)\nwho(详细用户会话)\nusers(用户会话)\nuseradd userdel usermod\npasswd(改密码) 组 groups\nid groupadd groupdel groupmod 创建用户时一般会用 useradd -m,同时创建用户的主目录。也可以加上 -s /bin/bash 等指定用户登陆后使用的 Shell。\n各种详细用户建议查看各自的帮助,不再一一列出。"},"title":"Linux 用户与权限"},"/linux/termux/":{"data":{"":"手机上搞搞 Linux?我劝你三思。在此特别同意Termux第三方中文维基的介绍\n在看这个维基/使用Termux之前,请先学好Linux基础!而不是看到某些文章/视频就跃跃欲试!\nTermux 官网(中文) Termux Wiki Termux第三方中文维基 ","ssh-服务#SSH 服务":"如果感觉屏幕小、没有外置键盘,想在其他设备上访问,可以通过SSH服务。官方 Wiki 在这里。\n输入 apt install openssh 安装SSH,输入 sshd 启动SSH服务,然后就可以通过 SSH 客户端连接了。\n对客户端:\n主机名:使用 ifconfig(自带)或 ip a 查看当前设备ip,或者在系统设置的网络里查看。 端口号:默认端口号是 8022 用户名:安装时提示内会有形如 u0_a000 的用户名,如果没看到也可以使用 whoami 查看。 密码:之前未设置请使用 passwd 设置密码(都知道输入时不会显示字符吧)。 Wiki 里提到 Termux 没有初始化系统,所以每次都要手动运行 sshd。在 Wiki 里搜索自启动方法,找到一个解决方案:Termux-services。","termux-是什么#Termux 是什么":"参见教育网镜像站的帮助\nTermux is a terminal emulator and Linux environment bringing powerful terminal access to Android.\nTermux 是运行在 Android 上的 terminal。不需要root,运行于内部存储(不在SD卡上)。\n自带了一个包管理器,可以安装许多现代化的开发和系统维护工具。比如:\nneovim、tmux、zsh、clang、gcc…\n自带的包管理器 pkg 实际是给 apt 又包了一层,感觉没啥必要,直接用 apt 就可以了。","vs-code--code-server#VS Code / code-server":"很多人装 Termux 是为了临时敲一敲代码,纯命令行操作对大部分人来说又太难受。这个时候肯定需要一款方便的 GUI 编辑器,如 VS Code。\n但 Termux 没有 GUI,就算装了桌面有了 GUI 后 VS Code 也不能安装,因为 Termux 毕竟不是真 Linux,没有适合的版本。这个时候有几个办法:\n一是用 proot 跑一个 Linux 容器,装上桌面,用 Termux X11 等显示。 二是用“阉割的第三方网页版 VS Code” - code-server。 三是在容器里装 code-server,但,很多人之前这么做是因为没法直接装,现在没必要。 这里不套娃了,只讲一下第二个。\ncode-server 具体怎么整,(code-server)官方文档永远是你应该看的。只需要\nRun pkg install tur-repo Run pkg install code-server You can now start code server by simply running code-server. 安装并启动后浏览器打开127.0.0.1:8080,这里推荐 Firefox、Chrome、Edge 等支持 PWA 的浏览器,可以将其加到桌面。\n打开后你会发现它提示要密码,密码的配置文件在哪?官方文档告诉你在~/.config/code-server/config.yaml。这里可以使用 nano 或 vim 编辑(不会?请看文章开头)","使用注意事项#使用注意事项":"文件路径 如果你 pwd、cd 之类的在里面探索一圈,你会发现文件结构和平时 Linux 有差别。\n除去安卓限制导致文件位于 /data/data/com.termux/files 外,你会发现就算把 files/ 当为 / 也不对,etc 竟然也在 usr 中。这给我们平时编辑配置文件带来的不便。\n不过也有解决办法,官方提供了一个 $PREFIX 环境变量,指向了 usr 的绝对路径,只需在我们平时的习惯前加上这个环境变量就好了。比如 /etc/apt/sources.list 就可以用 $PREFIX/etc/apt/sources.list 代替。\n网络 如果手机没有 root 权限,那是用不了那些数字较小(小于 1024)的端口的,这点要注意。\n在高于 Android 10 的系统上,一些网络工具如 netstat 也无法使用了。","图形界面termux-x11#图形界面(Termux X11)":"Termux 本身是没有GUI支持的,我们可以通过 Termux X11 来获得GUI支持。\n之前常用的 VNC 也可以,但是现在有 x11 肯定还是用 x11 更好。\n如果不想看大段英文,可以参考这篇文章,正好是这两天更新了。里面Termux的X11与proot内Linux发行版的X11都有写。\nTermux X11:手機上的XWayland伺服器使用教學","安装及换源#安装及换源":"我们打开Termux 官网(中文),可以看到我们能在 F-droid 或 Github 上下载最新版本。下载安装后打开界面如下图。\n接下来为了下载方便就先要换源了,换源过程 教育网镜像站已经写的很清楚了,按照里面的操作。\n随后先 apt upgrade 升级一下软件,中间询问一路 y 就可以了。\n升级完成后需要第二次换源,因为下载一些工具时镜像源设置会刷新掉。如果你认真看的话升级过程中有询问,可以选 n。\n用 TUI 工具再次换源时会多一个“Mirror group(镜像组)”,请根据实际网络情况是选择单个镜像还是镜像组。\n第二次才出现是因为 termux 的应用本体已经很久没更新了,虽然是滚动发行版最终应用版本都一样样,但我觉得还是要定期发布更新的,你看 Arch 也会定时发布 iso。\n2024.06 终于更新了,现在只要换一次就好了。\n不过在 Github 发布之前,Google Play 就发布了更新,其和 Github 上的明显有不同。Play 版是没有换源的那个 TUI 工具的。","容器proot内装-linux-发行版#容器(proot)内装 Linux 发行版":"termux 可以通过 proot 容器运行 Linux 发行版,推荐使用 proot-distro 对其管理,可以查看官方仓库的介绍。\n首先安装 proot-distro 这个包:\napt install proot-distro 之后 proot-distro --help 看看帮助。\nproot-distro list列出支持的发行版。 proot-distro install xxx进行安装。\n如我要安装 Debian 就可以输入proot-distro install debian。 proot-distro login xxx登陆进容器中。\n指定用户可以加上--user xxx,如proot-distro login --user root debian 像 Ubuntu 22.04 的镜像大概只有 20MB,Alpina 更小,但是因为是从 Github 下载,速度挺慢的。\n不过官方仓库的 README 中 “Adding distribution” 说了存放 metadata 的位置,我们可以将其改为从 Github 代理网站下载。下面是一个例子,按需将 debian 改为你要的发行版。\ncd $PREFIX/etc/proot-distro cp debian.sh debian-bak.sh sed -i 's#https://github#https://ghp.ci/https://github#g' debian.sh proot-distro install debian 若该网站失效,请自行搜索“Github 代理”寻找可用网站。\n更多详细用法见帮助和仓库的 README。"},"title":"Termux的使用"},"/network/dns/":{"data":{"":"DNS - Domain Name System,域名系统\n域名,其实说白了就是给“IP 地址”起的“便于人类记忆的”别名,域名系统就是负责这个转换过程的。","hosts#hosts":"说到这里不得不提一下 hosts 文件了。\n学过计网的人应该知道,不管 OSI、TCP/IP 还是理论模型,统一的地址编排是靠 IP 层的 IP 地址。而 IP 地址这一串纯数字,记忆起来是比较麻烦的。\n因此,不管你是 Windows、Linux 还是 Android、iOS,你看你的系统里都会有一个 hosts 文件,这个文件里是一系列形如 IP 别名 的对应列表(最有名的的应该就是 localhost 了)来辅助人们用一串有意义的字符串别名去指代一个 IP。而一般一个 IP 对应一台主机,所以那个名称一般就叫“主机名”。当你访问“主机名”时,可以借助 hosts 文件自动将其转换为 IP 地址。\n所以呢,域名也算是一种“主机名”,这个 DNS 就可以看作是大型的、分布式、特殊规范化的“hosts 文件”。(我自己说的,方便理解)\n因为通过 hosts 能绕过 DNS 服务器的解析,所以前几年(大概我小学、初中时)这是访问 Google 等网站一个常用的绕过 “DNS 污染” 的方法。可惜现在技术早就升级了😁\n现在 hosts 依然广泛存在着。你访问域名(主机名)时,先去hosts中查询,如果hosts中没有,再去DNS中查询。","whois域名数据库查询#WHOIS(域名数据库查询)":"查询域名所有者。 可看 网络相关常用工具","域名层次空间#域名层次空间":"域名系统中的任何名称都是域名。在域名系统的层次结构中,各种域名都隶属于域名系统根域的下级。\n域名的第一级是顶级域,它包括通用顶级域,例如.com、.net和.org;以及国家和地区顶级域,例如.us、.cn和.tk等。顶级域名下一层是二级域名,一级一级地往下。\n顶级域(TLD) 单独列一下顶级域。\n基础结构域\n只有一个arpa,用于反向域名解析。有时被认为是通用顶级域 通用顶级域(gTLD)(共二十多个) 1985创立,共六个\n.com、.edu、.gov、.mil、.net、.org 2000年,新增\n.aero、.biz、.coop、.info、.museum、.name、.pro(所以 .name 和 .pro 也算是老牌域名了) 2005年,又公布一批\n(包括.xxx,但当时未启用) 国家顶级域(ccTLD)\n可看国家地区代码,基本遵守 ISO 3166-1 两字母代码 新通用顶级域名(New gTLD)\n2011 年 ICANN 理事会正式批准新通用顶级域名申请计划。 国际化顶级域(IDN TLD)\n国际化域名(IDN)使用特殊的文字或非拉丁字母组成,如蓝天救援.中国。国际化域名使用Punycode转写储存,都以 .xn-- 开头,比如前面的蓝天救援实际就是xn--rss04w53a688e.xn--fiqs8s。\n在 IDN 发展过程中也出现了国际化顶级域(IDN TLD),其中包括国际化国家或地区顶级域(IDN ccTLD)如 .中国。 各顶级域域名数据数量统计:\nDomain Name Stat Domains Project(非即时) ","域名解析#域名解析":"DNS 查询有两种方式:递归和迭代。\nDNS 客户端设置使用的 DNS 服务器一般都是递归服务器,它负责全权处理客户端的 DNS 查询请求,直到返回最终结果。而 DNS 服务器之间一般采用迭代查询方式。"},"title":"DNS 与域名"},"/network/http/":{"data":{"":"计网应用层的重点就是HTTP了吧,还有就是 SSL/TLS 相关的公钥加密(非对称加密)。\nDNS相关请看:DNS 与域名","http-常用状态码#HTTP 常用状态码":"先来点有趣的。这里当然先是查一查我们亲爱的 MDN 啦:HTTP 响应状态码 - HTTP|MDN\n状态码分类 (100–199) 信息响应,表示目前是协议的中间状态,还需要后续请求 (200–299) 成功响应 (300–399) 重定向消息 (400–499) 客户端错误响应 (500–599) 服务端错误响应 常用状态码 101 切换请求协议,从 HTTP 切换到 WebSocket 200 请求成功,有响应体 301 永久重定向:会缓存,类似的还有 308 302 临时重定向:不会缓存,类似的还有 303、307 304 协商缓存命中 400 请求错误 403 服务器禁止访问 404 资源未找到 500 服务器端错误 503 服务器繁忙 前几个月看到的梗图: 更多(梗图):有哪些是程序员才懂的梗?然然然:HTTP状态码","http-方法#HTTP 方法":"HTTP 方法有哪些? HTTP 定义了一组请求方法,以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作。\n每一个请求方法都实现了不同的语义,但一些共同的特征由一组共享:例如一个请求方法可以是安全的、幂等的或可缓存的。\nGET 方法 请求一个指定资源的表示形式,使用 GET 的请求应该只被用于获取数据。(但当前网络中绝大部分使用的都是 GET) HEAD 方法 请求一个与 GET 请求的响应相同的响应,但没有响应体。 POST 方法 用于将实体提交到指定的资源,通常导致在服务器上的状态变化或副作用。 PUT 方法 用有效载荷请求替换目标资源的所有当前表示。(由于自身不带验证机制,任何人都可以上传文件,因此存在安全性问题,一般不使用该方法。) DELETE 方法 删除指定的资源。(与 PUT 功能相反,并且同样不带验证机制) CONNECT 方法 建立一个到由目标资源标识的服务器的隧道。随后使用 SSL 和 TLS 协议把通信内容加密后经网络隧道传输。 OPTIONS 方法 用于描述目标资源的通信选项。(支持的方法) TRACE 方法 沿着到目标资源的路径执行一个消息环回测试。(追踪路径。发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个服务器就会减 1,当数值为 0 时就停止传输。) PATCH 方法 用于对资源应用部分修改。 HTTP 请求方法 - HTTP|MDN\nPOST和GET有哪些区别?各自应用场景? 使用场景 GET 用于获取资源,而 POST 用于传输实体主体。\n参数 GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。不能因为 POST 参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(Fiddler)查看。\nGET /test?name1=value1\u0026name2=value2 HTTP/1.1 POST /test HTTP/1.1 Host: example.com name1=value1\u0026name2=value2 因为 URL 只支持 ASCII 码,因此 GET 的参数中如果存在中文等字符就需要先进行 URL 编码。例如 中文 会转换为 %E4%B8%AD%E6%96%87,而空格会转换为 %20。POST 参数支持标准字符集。\n安全性 安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。\nGET 方法是安全的,而 POST 却不是,因为 POST 的目的是传送实体主体内容,这个内容可能是用户上传的表单数据,上传成功之后,服务器可能把这个数据存储到数据库中,因此状态也就发生了改变。\n安全的方法除了 GET 之外还有:HEAD、OPTIONS。\n不安全的方法除了 POST 之外还有 PUT、DELETE。\n幂等性 幂等的 HTTP 方法,同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。换句话说就是,幂等方法不应该具有副作用(统计用途除外)。\n所有的安全方法也都是幂等的。\n在正确实现的条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,而 POST 方法不是。\nGET /pageX HTTP/1.1 是幂等的,连续调用多次,客户端接收到的结果都是一样的:\nGET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 GET /pageX HTTP/1.1 POST /add_row HTTP/1.1 不是幂等的,如果调用多次,就会增加多行记录:\nPOST /add_row HTTP/1.1 -\u003e Adds a 1nd row POST /add_row HTTP/1.1 -\u003e Adds a 2nd row POST /add_row HTTP/1.1 -\u003e Adds a 3rd row DELETE /idX/delete HTTP/1.1 是幂等的,即使不同的请求接收到的状态码不一样:\nDELETE /idX/delete HTTP/1.1 -\u003e Returns 200 if idX exists DELETE /idX/delete HTTP/1.1 -\u003e Returns 404 as it just got deleted DELETE /idX/delete HTTP/1.1 -\u003e Returns 404 可缓存 如果要对响应进行缓存,需要满足以下条件:\n请求报文的 HTTP 方法本身是可缓存的,包括 GET 和 HEAD,但是 PUT 和 DELETE 不可缓存,POST 在多数情况下不可缓存的。 响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501。 响应报文的 Cache-Control 首部字段没有指定不进行缓存。 XMLHttpRequest\n为了阐述 POST 和 GET 的另一个区别,需要先了解 XMLHttpRequest:\nXMLHttpRequest 是一个 API,它为客户端提供了在客户端和服务器之间传输数据的功能。它提供了一个通过 URL 来获取数据的简单方式,并且不会使整个页面刷新。这使得网页只更新一部分页面而不会打扰到用户。XMLHttpRequest 在 AJAX 中被大量使用。 在使用 XMLHttpRequest 的 POST 方法时,浏览器会先发送 Header 再发送 Data。但并不是所有浏览器会这么做,例如火狐就不会。 而 GET 方法 Header 和 Data 会一起发送。 POST和GET有哪些区别?各自应用场景? - 帅地玩编程","http101120-的版本区别#HTTP1.0,1.1,2.0 的版本区别":"HTTP/1.0 1996年5月,HTTP/1.0 版本发布,为了提高系统的效率,HTTP/1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。\nHTTP/1.0中浏览器与服务器只保持短暂的连接,连接无法复用。也就是说每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。\nTCP连接的建立需要三次握手,是很耗费时间的一个过程。所以,HTTP/1.0版本的性能比较差。\nHTTP1.0 其实也可以强制开启长链接,例如接受Connection: keep-alive 这个字段,但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决办法。\nHTTP/1.1 为了解决HTTP/1.0存在的缺陷,HTTP/1.1于1999年诞生。相比较于HTTP/1.0来说,最主要的改进就是引入了持久连接。所谓的持久连接即TCP连接默认不关闭,可以被多个请求复用。\n客户端和服务器发现对方一段时间没有活动,就可以主动关闭连接。或者客户端在最后一个请求时,主动告诉服务端要关闭连接。\nHTTP/1.1版还引入了管道机制(pipelining),即在同一个TCP连接里面,客户端可以同时发送多个请求。这样就进一步改进了HTTP协议的效率。\n有了持久连接和管道,大大的提升了HTTP的效率。但是服务端还是顺序执行的,效率还有提升的空间。\nHTTP/2 HTTP/2 是 HTTP 协议自 1999 年 HTTP 1.1 发布后的首个更新,主要基于 SPDY 协议。\nHTTP/2 为了解决HTTP/1.1中仍然存在的效率问题,HTTP/2 采用了多路复用。即在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。能这样做有一个前提,就是HTTP/2进行了二进制分帧,即 HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码。而这个负责拆分、组装请求和二进制帧的一层就叫做二进制分帧层。\n除此之外,还有一些其他的优化,比如做Header压缩、服务端推送等。\nHeader压缩就是压缩对话。 服务端推送就是还没有收到浏览器的请求,服务器就把各种资源推送给浏览器(缓存)上。这样需要的时候就可以直接读取缓存了。 呃 目前,主流的HTTP协议是HTTP/2,部分为HTTP/1.1。\n这让我想起来之前知乎看到的一个回答 浏览器开两个窗口分别访问百度,各自窗口会单独创建tcp连接吗,还是复用之前的tcp? - 紫云飞 ,里面提到百度的主站是现在为数不多的HTTP/1.1了,看了看,确实。","不想写了#不想写了":" 计算机网络面试真题 - 帅地玩编程 HTTP 学习笔记(Cyc2018) - 【布客】八股文知识库 收藏夹翻出来的,计网面试题都总结好了,怎么办,不想写了😭。","连接管理#连接管理":"无连接与无状态 使用 TCP 作为传输层协议,但是HTTP本身是无连接的,即交换HTTP报文前不用建立 HTTP 连接。\nHTTP是无状态的,多次访问的响应应该相同。\n长连接与短连接(持久连接与非持久连接) 当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求其他网页元素对象(如图片资源)。如果每进行一次 HTTP 通信就要新建一个 TCP 连接,那么开销会很大。\n长连接只需要建立一次 TCP 连接就能进行多次 HTTP 通信。\n从 HTTP/1.1 开始默认是长连接的,如果要断开连接,需要由客户端或者服务器端提出断开,使用 Connection : close; 在 HTTP/1.1 之前默认是短连接的,如果需要使用长连接,则使用 Connection : Keep-Alive。\n流水线与非流水线 持久连接又分为非流水线和流水线两种方式。\n对于非流水线方式,客户在收到前一个响应后才能发出下一个请求,服务器发送完-一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。 而流水线方式下客户每遇到一个对象引用就立即发出一个请求,因而客户可以逐个地连续发出对各个引用对象的请求。这种方式减少了TCP连接中的空闲时间,提高了效率。\nHTTP/1.1 的默认方式是使用流水线的持久连接。"},"title":"HTTP - 超文本传输协议"},"/network/intranet/":{"data":{"":"广泛应用的 NAT 技术缓解了 IPv4 地址用尽的困境,这同时导致一个问题,就是我们普通用户是没有公网(IPv4)IP 的。 有时候我们开发时在自己电脑上搭了个 Web 服务想让别人预览一下,或是需要 SSH 远程连接,或者临时想访问本机其他服务,我们无法直接定位到这台机器。为了解决这个问题,就有了这里提到的“内网穿透”。\n用 IPv6 是一个办法,但现实是并不是所有设备都有 IPv6。\n我常用内网穿透工具如下。\n公司运营\n花生壳:花生壳是国内老牌的内网穿透工具,我家十多年前的路由器里都有提到过“花生壳”。他的姊妹产品之一向日葵也是很多人都用过的。\n需要注意的国内公司的内网穿透产品都是要实名认证的。向日葵添加新设备要用安装时的SN码绑定。\n免费套餐:1 Mbps 带宽、1 G/月的流量、固定子域名、自定义子域名\nNgrok:Ngrok 是一款流行的内网穿透工具。\n免费套餐:未知带宽、1 G/月的流量、1 G HTTP 请求数、固定子域名\n自托管\nfrp:frp 也是很流行的内网穿透工具。\n开源,所以你能看到不少相关的项目,像:Sakura Frp(要实名,没用过) Ngrok: 开源过旧版。\n开源,所以你能看到不少相关的项目,像:Sunny-Ngrok(没用过,现在支持Ngrok和frp) “公益”\ni996.me:用过两次,不用实名,通过微信公众号回复管理。\n套餐:2 Mbps 带宽、可自定义的子域名、自定义子域名 "},"title":"内网穿透工具"},"/network/ip/":{"data":{"":"","保留ip地址httpszhwikipediaorgwikie4bf9de79599ipe59cb0e59d80-保留ip地址#\u003ca href=\"https://zh.wikipedia.org/wiki/%E4%BF%9D%E7%95%99IP%E5%9C%B0%E5%9D%80\" title=\"保留IP地址\"\u003e保留IP地址\u003c/a\u003e":"保留IP地址 部分常见保留地址\nIPv4 IPv6 环回地址 127.0.0.0/8 ::1/128 专用网络 俗称“内网/局域网” 10.0.0.0/8 (单个A类网络)\n172.16.0.0/12 (16个连续B类网络)\n192.168.0.0/16 (256个连续C类网络) fc00::/7 电信级NAT 100.64.0.0/10 链路本地地址 169.254.0.0/16 fe80::/10 "},"title":"IP"},"/network/ssh/":{"data":{"":"","ssh-免密登录#SSH 免密登录":"SSH认证方式有两种:\n用户名密码认证 公钥私钥认证 上面什么都不做就登陆会使用第一种用户名密码认证,如果不配置密钥的话每次连接都要输入密码进行验证。下面说第二种方式。\n生成本地公私钥 本地终端中执行\nssh-keygen 生成的密钥文件就放在了 ~/.ssh 目录中,图为 Windows 的样例。\n添加到“已授权”文件中 将本地用户 ~/.ssh/id_rsa.pub 中的内容添加到被远程用户的 ~/.ssh/authorized_keys 文件中,这个本地用户以后就可以免密登录了。\n可以使用 ssh-copy-id,用法和 ssh 一样,只需把 ssh 换成 ssh-copy-id 即可。(Windows 上的 OpenSSH 好像没有?)\n如:\nssh-copy-id user@HostName 也可以自己复制粘贴(没有已授权文件的话自己创建一下)。 ","ssh登录命令#SSH登录命令":"直接输入 ssh 登陆命令的一般格式为 ssh user@HostName,如:\nssh root@0.0.0.0 如果需要指定端口就增加-p \u003cport\u003e,不指定端口使用默认的22端口,如:\nssh -p 8022 root@0.0.0.0 接下来输入密码登陆就可以了。\n配置文件 每次输入太长也不好记,可以自己设置一个别名,别名配置保存在 ~/.ssh/config 中。\n~是指当前用户的主目录。Unix-like 上即 ~ 或 $HOME 所指;Windows 上为 %USERPROFILE% 所指,在地址栏输入 %USERPROFILE% 即可进入。\n下面是一个例子,注释是 Github Copilot 提示的,我看是对的,说明有人写过,哈哈:\nHost demo # 主机别名,可以自定义 HostName 0.0.0.0 # 服务器地址 Port 8022 # 端口号,可以不写,默认22 User root # 登录用户名,可以不写,默认当前用户 写好保存之后就可以直接使用 ssh demo 登录了,和使用 ssh -p 8022 root@0.0.0.0 效果是一样的。","开启-sshd-服务#开启 SSHD 服务":"有些系统的 sshd 服务默认开启,如云服务器,可跳过该步。\n在将要被远程的系统的终端中输入 ssh 127.0.0.1,看到提示“Are you sure you want to continue connecting (yes/no/[fingerprint])?”可以 Ctrl + c 停止;提示“Connection refused”的,请先安装并开启 ssh 服务器。\nsshd 就是 ssh 的服务器。安装还是以 Ubuntu 等 Debian 系发行版为例:\nsudo apt install openssh-server 然后开启 sshd 服务,并设置自启动。\nsudo systemctl start sshd #启动服务 sudo systemctl enable sshd #设置自启动 Debian 系给 sshd 的 service 起名叫 ssh,不知怎么想得,不过 sshd 也还能用。","检查-ssh-客户端#检查 SSH 客户端":"如果使用专门的 SSH 客户端可跳过该步。\n检查一下本机(要远程连接别人的机器)有没有安装 SSH 客户端,终端中输入 ssh 查看输出,如果提示未找到命令则需要手动安装 OpenSSH。\n以 Ubuntu 等 Debian 系发行版为例:\nsudo apt install openssh-client "},"title":"SSH"},"/network/tools/":{"data":{"":"","#":"IP 相关 通用:\nip138\n国内很常用的一个 纯真\n比较全的一个 IP 数据库 本机:\nip111\n国内外双重查询(本机 IP) 126 getLocByIp\n网易(126)的API,可以获取 IP 及地理位置 Sukka\n查询本机 IP 地址及归属地 | 查看 DNS 出口 IP Sukka - 简版\n查询本机 IP 地址及归属地 IP查询\nIPV6 相关 WHOIS 查询 在线查询域名的相关信息,防止手头没电脑。\nhttps://whoisw.com 不会有人查不了个人 .cn 域名吧。 虽然 .top 也是中国某家企业运营的,但是总比不给隐私防护的 .cn 强吧。😁\n在线 Ping ITDOG 站长工具\n看各地的访问情况(尤其是国外网站有没有被q) 还能看域名是否有多个 IP DNS查询(域名查ip) nslookup、dig、ping https://www.itdog.cn/dns/ 等等,这种随便找 备案 工信部 ICP备案查询 公安部 联网备案查询 旁站查询 FOFA\n先拿它顶一下 "},"title":"计网常用工具"},"/software/browsers/ext-us/":{"data":{"":"浏览器扩展与用户脚本的介绍和推荐","浏览器扩展#浏览器扩展":"我觉得这个就不用介绍了吧。不过提一下,这叫扩展,不叫插件。浏览器插件是另外的东西。\n某些推荐扩展 翻译 Google 中国关停翻译情况下为数不多的支持网页翻译的。支持划词翻译和整页/双语对照翻译。\n腾讯翻译:火狐 | Chrome 去广告 最推荐的是 uBlock Origin,Adguard 好像用的人也不少。\n因为(SB)优酷把北京谋智告了,要求中国区下架所有去广告扩展,国内的Firefox 可能安装不了。可以去Github下载。\nuBlock Origin - Github(Firefox选不带Lite的) Adguard - Github 手机上支持扩展的浏览器 Firfox系\n请看左边《Firefox下载》,不再重复。 Chromium系\n可以配合下方离线扩展商店使用 狐猴浏览器\n国内开发,能方便地从 Edge 的扩展商店安装扩展,可以试试。 Kiwi Browser Yandex Browser\n俄罗斯搜索引擎出品,印象中没简中翻译,而且比较卡。反正先用上面的吧。 Chromuim系离线扩展商店 极简插件_Chrome扩展插件商店_优质crx应用 Chrome插件,谷歌浏览器插件下载-扩展迷 ","用户脚本userscript#用户脚本(UserScript)":"脚本及脚本管理器 脚本管理器是一种浏览器扩展,用来允许用户在网页中加载特定的程序代码,那些加载的代码就是用户脚本(UserScript)。更具体的说脚本其实就是JS(JavaScript)代码。\n用户脚本平时大多简称脚本,又叫浏览器脚本。还有人叫油猴脚本,因为油猴是第一个脚本管理器。很多人说的“油猴” - TamperMonkey 应该叫篡改猴,不是油猴,麻烦浪费2秒翻译一下。同上,脚本,不叫插件。\n(2023 更新)写了一篇文章:给 TamperMonkey 正名 - “我叫篡改猴” 因为有时候需要手机上浏览也需要一些脚本来优化阅读,所以我用的浏览器有个要求就是能装脚本。而套壳浏览器如Via、X等,虽然声称支持油猴函数等,但还是有些脚本不能被支持,如 GitHub 中文化插件 (2023 更新,现已支持)。所以最近两年转向了支持扩展的 Firefox。\n脚本托管网站 Greasy Fork - 安全、实用的用户脚本大全 用户脚本列表 - 脚本猫 另外再放一下我的:自用脚本集 by wcbing"},"title":"浏览器扩展与用户脚本"},"/software/browsers/firefox/":{"data":{"":"","价值观#价值观":" Firefox:造反有理 星星之火,正将燎原 Mozilla 宣言 Mozilla的使命:为所有人保持健康、开放且无障碍的互联网。 ","前言#前言":"\nFirefox是开源、自由软件,旨在保护隐私,其由Mozilla开发,前身是世界上第一个浏览器。\n它是现在极少数非 Chromuim 内核的浏览器,也是除了 Edge 和 Chrome 外同步功能最方便的跨平台浏览器(尤其是国内国内google被墙的情况下)。\nFirefox 分为国际版(Mozilla运营)和国内版(北京谋智运营),两者数据不互通,请一定注意。","手机端android#手机端(Android)":"Firefox for Android,代号fenix。\nAndroid 版已可以从网页安装任意扩展。\nAndroid版出于兼容性考虑,不能从网页安装扩展,只能依靠指定的扩展集,安装其中的扩展。官方扩展集内扩展较少,且正式版无法更换。而Beta/Nightly或第三方的 Iceraven(已内置一个比较丰富的扩展集)等可以自定义扩展集。\n国际版 国际版官方的下载渠道是 Play 商店,但它被墙了。不过幸好,开发者也在其他地方上传了预编译的程序。下面都是正式版的链接,beta、nightly等可以点进去找上级目录。\n以前最常用的Mozilla FTP服务器,但这个找起来稍微麻烦点:链接 Github,这个下载慢,但是可以留着提Issues啊:链接 国内版 国内应用商店都是国内版。\n注:如果不嫌弃的话,下载国内版也是能与国际版同步的,关闭设置内“本地服务”即可(如下图选项)","桌面端windowslinuxmacos#桌面端(Windows、Linux、macOS)":"直接去官网下载即可,官网也很好记。\n国内版(北京谋智):https://firefox.com.cn 国际版(Mozilla):https://firefox.com 在首页的“下载 Firefox”下方有个“下载其他平台和语言版本”,可以找到所有桌面平台的所有版本,包括正式版、Beta版等。\n手机端(Android、IOS)推荐的安装方式都是在应用商店下载,所以官网没有手机端下载链接。"},"title":"Firefox下载"},"/software/browsers/kernel-ua/":{"data":{"":"什么叫浏览器内核以及 UA(UserAgent)","uauseragent介绍及检测#UA(UserAgent)介绍及检测":"访问互联网内容时我们并不是直接看到原始内容,而是网页浏览器或邮件程序获取原始内容,我们再看其渲染的结果。这些程序就是我们的用户代理(程序),即 UserAgent。\n对服务器来说,使用什么用户代理是决定要交付什么样内容的很重要的参考,所以我们访问这些服务器时,也会将所使用的 UserAgent 放在报头中的 User-Agent 一项中。所以,可以说 User-Agent 的值其实就是浏览器(或其他客户端)的“身份码”。\n其历史可看:互联网的“套娃行为”有多凶残? - 奔跑中的奶酪\n在任意界面按下F12打开开发者模式,切换到“控制台”,输入如下内容即可查看浏览器UA。\nalert(navigator.userAgent) 在线检测 在线浏览器检测_ip33.com 浏览器内核检测工具 Browser kernel v2.1 ……这种太多啦 ","浏览器内核介绍#浏览器内核介绍":" 浏览器内核分为两部分:渲染引擎和JS引擎。由于JS引擎越来越独立,内核就倾向于只指渲染引擎。\n浏览器引擎,又称排版引擎、渲染引擎。主流浏览器引擎如下。\n发展历史相关视频、文章\n浏览器大战 - 奔跑中的奶酪 人类早期网上冲浪珍贵资料:第一次浏览器大战 - 奔跑中的奶酪 人类早期网上冲浪珍贵资料:第二次浏览器大战 - 奔跑中的奶酪 【果核视频】浏览器内核发展编年史 "},"title":"浏览器内核及UA"},"/software/dns/":{"data":{"":"","dns-缓存查看与清理#DNS 缓存查看与清理":"浏览器类 - Chrome/Chromium 地址栏中输入:chrome://net-internals/#dns\n浏览器类 - Firefox 地址栏中输入:about:networking#dns\n操作系统类 - Windows 查看 DNS 缓存:ipconfig /displaydns\n清空 DNS 缓存:ipconfig /flushdns"},"title":"DNS"},"/software/draw/":{"data":{"":"","思维导图#思维导图":"Draw.io画思维导图不怎么样,还是要找专门软件。 虽然说是思维导图,但实际是包括Mind Map在内的Thinking Map,还包括能转成思维导图的大纲笔记。\n思维导图现在最通用的两种格式是.xmind(XMind)和.mm(FreeMind),导出可编辑文件时最好选这两个,下面的几个例子都可以导出。\nXMind\n免费的够用了 Freeplane\nFreeMind继任者 百度脑图.km\n推荐,已开源 幕布\n大纲笔记 不推荐国内的收费软件。","文本绘图#文本绘图":"另外介绍两个纯文本绘图的,比较适合和(某些)Markdown软件一起用。\nMermaid PlantUML ","流程图等#流程图等":" Draw.io\n流程图,强烈推荐 Draw.io 教学\nB站,UP台湾人 流程图等首推Draw.io(或 app.diagrams.net),开源免费、功能强大、在线版打开即用。可以画流程图、(SQL转)E-R图、UML图、架构图等。\nhttps://www.zhihu.com/answer/2480766440\nDrawio现在已经基本统一了海外的在线做图市场,不停的被集成到各个基础平台,比如Confluence, GoogleDoc等,最近Drawio被google纳入旗下了。\nDraw.io还有Word扩展。至于国内,飞书、坚果云、迅捷画图、VisionOn等的流程图组件也是都是使用其开源代码构建或二次加工。“国产”的ProcessOn的流程图组件也是基于Draw.io团队开源的前一代产品。Visio收费且仅限Windows,不要再用Visio了。"},"title":"绘图软件"},"/software/windows/base-software/":{"data":{"":"(2021.8)本文写给普通人,都是一些经常会用到而且容易有广告的。要求是开箱即用,操作简单。需要折腾的(或者找破解版)就不推荐了。","再次提示#再次提示":"注意不要直接百度然后用下载站的下载器,就是 “高速下载” 那个下载器,以免被捆绑安装。\n最好在软件商店安装,推荐联想软件商店(网页版也行)和微软商店。\n今年(2022)315曝光了,很多下载站都下架了“高速下载器”,就是不知道能维持多久","压缩解压类任选一个#压缩解压类(任选一个)":" 360压缩 - 国际版 7-Zip 或者在 联想软件商店 里下载。设置里有关联文件类型 不推荐用BandiZip,也是韩国人开发的。基本就是个缝合怪,日常使用没有突出的优点,而且它现在也有广告。\nWinRAR - 烈火修改版|App热 不太推荐修改版软件,但是某些人就爱这口,留个链接备用。","安全管理类任选一个#安全管理类(任选一个)":" 联想电脑管家 和火绒有合作,添加了软件管理和驱动管理等,没有品牌限制。 火绒安全 用它主要是拦截弹窗和流氓软件的安装。推荐搭配 联想软件商店 和联想合作的火绒应用商店使用。 360安全卫士(极速版) 去选极速版,无广告。结果还是有一个“360安全”,不过杀毒没得说,老流氓还是能镇住小流氓的。 ","文件搜索#文件搜索":" Everything 一款文件、文件夹名称快速搜索软件 ","文档阅读#文档阅读":" MS office 几乎所有一线笔记本(联想、惠普、戴尔)和大部分二线笔记本都带家庭版授权,记得及时激活,毕竟花了钱的。 金山WPS 跨平台的国产办公软件,建议在不影响正常使用的情况下尽量“支持国产”。 如果嫌弃广告可以试试这个计算机等级考试官网的教育考试专用版。 稻壳阅读器🔺 支持PDF、EPUB、MOBI、TXT等常见的电子书籍文档,还支持知网的.caj文件。\n甚至可以查看.md和.chm等,但效果不佳。 ","本地看图视频听歌类#本地看图/视频/听歌类":" 自带播放器🔺 又不是不能用,Win10(较新版本)、Win11上自带的还不错。 万能联播🔺 爱奇艺出品。视频、音频、图片都支持,基本没有广告。 VLC 一个开源、自由、跨平台的播放器。去微软商店下载UWP版吧,原版太丑。 不要推荐potplayer,一是要求开箱即用,它的默认配置不行,操作也不符合国内大多数人的使用习惯;二是 FFmpeg 耻辱柱;三是它也有广告了,棒子的软件火了都会加广告","浏览器类任选一两个即可#浏览器类(任选一两个即可)":" Firefox 火狐国际版,开源、自由、跨平台。我最常用的浏览器。\n注意最好下载国际版,具体看Firefox下载。 Edge Windows自带。现在也算跨平台了。 Chrome 国内环境用着很难受,难同步、默认Google(很多人真的不会改)。有些网站为了兼容性推荐你用Chrome,直接上面的Edge就行。非要用的话记得改搜素引擎(推荐Bing,广告少而且新建标签页漂亮)。 360极速浏览器 唯一推荐的国产(大厂)浏览器。内核较新,广告较少。同步功能完善。\n有Linux版,虽然叫“360安全浏览器”但其实就是“极速”,密码同步方式不同。 QQ浏览器 虽然不推荐但不少同学用,当然它的外观和翻译功能做得确实不错 ","软件卸载#软件卸载":" HiBit Uninstaller 列出所有“安装”的软件并启动它们的卸载程序,卸载完还会扫描有没有残留的文件夹、注册表等垃圾。这个是单文件,建议放到桌面,点开就能用。 Geek Uninstaller 很多人推荐,但功能有些简陋。和上面的主要功能差不多。 ","软件安装#软件安装":"Windows上下载软件一般推荐官网,但寻找和更新比较麻烦,而且下载速度差异很大。应用商店有基本的审核,比直接搜索要安全一点,就是有的不全、更新不及时。\n微软商店里面还是有不少东西的,但是国内常用的软件很多都没有。\n火绒应用商店 或 联想应用商店(网页版)🔺 推荐 腾讯软件中心(网页版) 点击普通下载 360软件宝库(网页版) 点击普通下载 火绒应用商店是和联想应用商店合作的,内容较全,除了没账号基本一样。\n但是我建议在设置中关闭【快装功能】,否则别问别人你软件装哪了。","输入法#输入法":"Win10以上最好用自带的微软拼音。","进阶版#进阶版":"你可以去自行发现一些工具类软件、绿色版软件等,这几个博客是例子。\n果核剥壳 阿酷杂货铺 殁漂遥 …… 一些Windows工具 ","远程控制#远程控制":" 向日葵远程控制 出问题解决不了了就让别人帮你解决 "},"title":"Windows装机必备"},"/software/windows/windows-partition/":{"data":{"":"","#":"说实话,永远不要高估别人“会用电脑的水平”,或者说,“文件管理的水平”。\n很多人说软件装D盘、E盘,但是我见到很多听这些话的“小白”就是在“乱搞”,一个程序装另一个程序的文件夹里了,一个程序直接装D盘根目录了,这些都是挺常见的。其实还不如从根本上解决问题,把C盘搞大点然后直接装。游戏或者几十G的大型专业软件除外。\n而且固态硬盘上的分区越少越好。建议两个分区,一个装系统和软件,一个装资料、文件;胆子大的可以直接当C盘战士。在说一遍,记得把C盘分大一点!\n接下来是步骤。\n调整 D 盘分区大小 分区扩容时只能分配相邻的为分配的空间,所以我们需要调整 D 盘(具体看磁盘管理中你 C 盘和谁相邻)空间。\n你也可以直接删除 D 盘,用下一节提到的的“磁盘管理”中的“删除卷”功能删除。需要提示的是,删除分区前记得备份!备份! 把要删除的D盘中的文件复制到别的盘中去。\n只有系统分区工具可以不关机调整C盘,但其只能由后部压缩空间,这里需要先使用其他工具,如【DiskGenius】。\n下载并打开 DiskGenius,在 D 盘上右键,选择【调整分区大小】,分配出空间,注意空出的是前半部分。\n扩容 C 盘 在“开始”按钮处右键(或同时按Windows 和 x),选择【磁盘管理】。\n在 C 盘上右键,选择【扩展卷】,将前面得到的为分配空间分给 C 盘。"},"title":"Windows分区"},"/vscode/":{"data":{"":"搭建基本的开发环境,并说明之后如何在 VS Code 上使用。这个系列同时有 知乎专栏","1-vs-code基本操作#1. VS Code基本操作":" VS Code基本操作 ","2-开发环境---不同语言配置#2. 开发环境 - 不同语言配置":"无论用VS Code搭建什么语言的开发环境,只需记住一个流程:\n安装官方的SDK(编译器/解释器等等)-\u003e VS Code里安装相应的支持扩展 -\u003e 开始写代码\nPython C/C++ Java SE R X86 汇编 想看视频的还可以看之前的 B站视频","3-远程开发#3. 远程开发":" WSL安装使用 SSH使用 ","4-特色功能#4. 特色功能":" 代码片段 自定义代码片段,快捷输入。 配置文件 多套配置,随时切换。 "},"title":"VS Code 使用系列"},"/vscode/asm/":{"data":{"":"汇编语言,准确来说是x86汇编","0-vs-code#0. VS Code":"下文必看! 下载安装VS Code、基本使用等等。\n「Code」安装与基本操作","1-环境及扩展#1. 环境及扩展":"Win10及以上以无内置DOS支持,需要安装DOS模拟器。\n不过你可以安装这个扩展,内置3个模拟器和一些开发工具\nMASM/TASM: run MASM/TASM assembly in DOSBox 汇编语言开发插件\n选 TASM 可以使用 Turbo Debugger(TD) 调试,提供了TUI,看起来方便不少。\n安装完后打开asm文件右键可以运行、调试。","2-路径设置#2. 路径设置":"建议设置中打开如下选项,就不用手动挂载或在配置文件中指定目录了。\n前提是你使用VSCode时先打开一个文件夹(工作区)"},"title":"「Code」汇编"},"/vscode/bilibili/":{"data":{"":"视频版,不过是在Linux上演示的"},"title":"「Code」视频版-B站"},"/vscode/c-cpp/":{"data":{"":"也可点击查看知乎文章\n提前劝退提示:如果你只需要学习 C/C++,推荐国内老师改进的Dev-C++ - 小熊猫C++\n我可能会经常更新,改改错字或者变换一下句子的顺序,但是主体内容不会变。\n最后一次大更新:2022.03.24","-4-直接运行单文件#~ 4. 直接运行单文件":"~ 4.1 直接编译运行 其实我们学习时一般都是单文件程序,这时直接在终端中编译运行要比上面通过VS Code来调用 GDB 调试来运行方便多了。手动编译运行的方式:\n切换到当前目录 编译C: gcc \u003c源文件\u003e.c -o \u003c输出的程序名\u003e 编译C++: g++ \u003c源文件\u003e.cpp -o \u003c输出的程序名\u003e 想运行可以在终端里 ./\u003c程序名\u003e 运行,也可以直接双击运行(想双击运行请参照 3.3 最后一行防止运行完直接退出)。\n~ 4.2 Windows 上直接运行乱码问题 开始那篇文章说了,Windows中文版命令行编码为 GBK,直接编译可能会有乱码问题,解决方式一是将文件编码改为 GBK,具体方法请参考最开始的文章。\n但除了微软自家的VS,VS Code 等现代编辑器或IDE默认都是 UTF-8,改成 GBK 用 VS Code 调试时也会有乱码。所以建议全部新建 UTF-8。\n自己手动编译时在最后添加 -fexec-charset=gbk参数。这个参数的意思是让多字节字符串常量保存为指定编码(这里是gbk)。这样源文件编码是utf-8,也能直接运行。 或者先执行chcp 65001,将命令行编码临时切换到 UTF-8,这样也能正常显示。 有些麻烦是吧,都是Windows中文版的祸。\n~ 4.3 (存档,极不推荐)Code Runner 为什么不推荐,有很多原因。\n无法调试; 默认不是终端内打开,也不会运行时保存; 运行程序名没有后缀,如xyz.a.c用它运行会出错 ; 不能方便地自定义编译语句(GUI形式),自己改setting.json太麻烦; 现在各种语言的官方扩展也添加了类似按钮,更用不上了,这个还会误导选择。 如果非要用\n建议设置中打开**“Run in Terminal”**,否则默认只有输出,而且可能出现奇怪的问题。 另外建议将它的**“Save File Before Run”**也打开。又不然可能你调试时发现程序和你写的不一样,然后改了半天发现它没保存。 ","0-vs-code安装及使用#0. VS Code安装及使用":"下文必看! 下载安装VS Code、基本使用等等。\n「Code」安装与基本操作\n无论用VS Code搭建什么语言的开发环境,只需记住一个流程:\n安装官方的SDK(编译器/解释器等等)-\u003e VS Code里安装相应的支持扩展 -\u003e 开始写代码\n网上有很多配置方法(特别是C/C++),但是因为C/C++扩展在不停更新,很多已经过时了。特别是那些让你复制json,现在很多已经内置。\n现在简单使用不用手动配置 json 文件。多文件项目也不用建议用 json,建议直接用 make、cmake 等工具。","1-cc编译器配置#1. C/C++编译器配置":"上面也说了,VS Code只算是个编辑器,编译还是要靠专门的编译器的。常见编译器(编译套件)情况如下:\nMicrosoft Visual C++ MSVC (C++) GNU 编译套件\nGCC (C/C++/…) Clang (C/C++/…) Windows 默认 有移植版 MinGW 及其衍生项目 MinGW-w64 / TDM-GCC … 有,但需要借助MSVC或MinGW的库 Linux X 默认/常用 有 macOS X 有,但 gcc 默认是 clang 的别名 默认 GCC 中 C 语言编译器是 gcc,C++ 编译器是 g++,调试器是 gdb\nClang 中 C 语言编译器是 clang,C++ 编译器是 clang++,调试器是 lldb\nMSVC 中 C++ 编译器是 cl\nWindows 和 Linux 我们选择常用的 GCC(Windows 上用 TDM-GCC);macOS 上则是 Clang。\n1.1 Windows(安装版)- 推荐 下载:TDM-GCC - 联想软件商店 它不用你手动配置环境变量。\n启动程序,取消勾选图中红框标记的地方,以取消检查更新(因为太慢了),点击“Create”安装。\n安装完毕后需关闭所有打开的终端程序(包括 VS Code 等)确保环境变量生效。\n打开终端输入gcc,如果提示你“gcc.exe: 致命错误:没有输入文件”,说明已经成功。\n完成。\n~ 1.2 Windows(便携版)- 不看都行 有些人看其他教程里会让你下载便携版本的编译器(就是一个压缩包),以MinGW-w64为例,那么使用时需要先将解压得到的“…\\mingw64\\bin”目录加入环境变量。\n这是官方给的下载链接MinGW-w64 - SourceForge。下载后将其解压到某个非中文目录(推荐C盘新建一个目录)。\nWin10及以上版本在设置里搜素“环境变量”,点开会弹出一个“系统属性”,然后按照这个步骤选择解压后的“…/mingw64/bin”目录。选好后依次点确定保存。\n完毕后需关闭所有打开的终端程序(包括 VS Code 等)确保环境变量生效。\n打开终端输入gcc,如果提示你“gcc.exe: 致命错误:没有输入文件”,说明已经成功。\n1.3 Linux(含 WSL) 反正只要保证有gdb、gcc、g++就可以,在终端中分别输入gcc、g++和gdb,查看是否安装,没有的话自己用包管理器安装一下。如果有需要可以自己在最后加上make。\n这里以Ubuntu为例,我们使用apt安装编译器gcc和g++,另外系统可能自带 gdb,为了保险还是加上。\nsudo apt install gcc g++ gdb 1.4 macOS 确保安装了 Clang:\n您的 Mac 上可能已经安装了 Clang。 要验证它是否存在,请打开 macOS 终端窗口并输入以下命令:\nclang --version\n如果没有安装 Clang,输入以下命令安装命令行开发者工具:\nxcode-select --install","2-安装cc扩展#2. 安装C/C++扩展":"打开一个目录,新建一个文件保存为“xx.c”或“xx.cpp”。\n打开后它会自动提示安装C/C++扩展。(最近发现它会安装一个合集,其实不写大项目的话只装“C/C++”就行)\n然后可以写个 C 或 C++ 的 HelloWorld 试试\n// xx.c #include \u003cstdio.h\u003e int main() { printf(\"Hello World 哈哈\\n\"); return 0; } // xx.cpp #include \u003ciostream\u003e int main() { std::cout \u003c\u003c \"Hello World 哈哈\\n\"; return 0; } ","3-通过cc运行调试#3. 通过“C/C++”运行、调试":"注意!\nWindows 上使用时文件路径不要包含中文,否则 VS Code 不能正常启动调试器。 macOS 用户运行要看3.3 如果打开其他人的源文件,发现乱码,或者显示正常但底部显示编码为 GBK/GB2312(应该看过我开头的文章打开了编码猜测):请看开头那篇文章的 1.5 那节,确保最终将编码保存为 UTF-8。\n3.1 运行、调试的快捷按钮 请确保你的C/C++扩展版本大于1.9。\n第一个正式的版本是1.9.7\n这时打开相应的文件后右上角就会有运行和调试按钮。\n直接运行请点击“运行C/C++”按钮; 需要调试请打断点并点击“调试C/C++”按钮。 然后自行选择编译器(图中只有一个我就直接回车了)。\n选择 gcc 的话只能调试 C,选 g++ 的话 C/C++ 都可以调试。选错了将 .vscode 目录删除即可重新选择。\n运行时可能出现类似图中的蓝字,忽视即可。\n~ 3.2 (旧版本)调试及无断点“运行” 必须打开一个文件夹。\n自己提前按需要打断点,想直接运行就不打断点,再按F5就可以开始调试/运行了。\n第一次调试时依次选“C++ (GDB/LLDB)” - “gcc/g++”,会自动生成打开launch.json和调试面板,不用管它,切换到终端即可。\n运行时可能出现类似图中的蓝字,忽视即可。\n3.3 外部终端运行 适用于 macOS用户 或 喜欢运行在弹出式的外部终端、内置终端显示不正常等情况。\nWindows 上推荐前面两种,因为新建文件默认是 UTF-8 的,如果直接编译运行会乱码。但是扩展会自动 chcp 65001,将命令行切换到 UTF-8 代码页/编码下。但是这样在外部终端运行不会自动 chcp。\n现在没有特别便捷的修改方式,只能改 json 让它在外部运行。\n按下面操作,一键生成相应的调试配置。然后把“launch.json”中框起来的“false”改成“true”就行。\n注意需要在return 0;前加上system(\"pause\");或getchar();,否则程序运行完会直接关闭。\n下面的和终端中操作有关,是对新手来说稍微“高阶”的内容,可以留着等熟悉了当扩展看,现在不看也行。直接用GDB调试因为远不如上面通过VS code简单、直观,就不提了。\nWindows 上因为编码原因极不推荐直接这么做。"},"title":"「Code」C/CPP"},"/vscode/code-snippets/inedx/":{"data":{"":"VS Code 代码片段","代码片段介绍#代码片段介绍":"点击这里进行管理\n其语法为:\n{ \"名称\": { \"scope\": \"适用的文件类型,省略则为全局或指定的类型\", \"prefix\": \"用来触发的前缀\", \"body\": [ // 你的代码,每行都要用双引号引起来,每行之间要加逗号。 // 断点用“$+数字”表示,有默认值的用“{断点:默认值}”表示,最后要停的地方是$0。 \"${1:fun}()\", \"{\", \" $2\", \" return $0;\", \"}\" ] }, } ","自用cc代码片段#自用C/C++代码片段":"新建一个全局的 ,适用于c,cpp { \"c main body\": { \"scope\": \"c,cpp\", \"prefix\": \"cmain\", \"body\": [ \"#include \u003cstdio.h\u003e\\n\", \"int main() {\\n\\t$0\\n}\" ], }, \"long long int\": { \"scope\": \"c,cpp\", \"prefix\": \"LL\", \"body\": [ \"typedef long long LL;\" ], }, \"define the max\": { \"scope\": \"c,cpp\", \"prefix\": \"MAX\", \"body\": [ \"#define MAX $0\" ], }, \"n groups of data\": { \"scope\": \"c,cpp\", \"prefix\": \"ng\", \"body\": [ \"int ${1:n};\", \"scanf(\\\"%d\\\", \u0026${1:n});\", \"for (int ${2:i} = 0; ${2:i} \u003c ${1:n}; ${2:i}++) {\\n\\t$0\\n}\" ], }, \"n groups of data--\": { \"scope\": \"c,cpp\", \"prefix\": \"n--\", \"body\": [ \"int ${1:n};\", \"scanf(\\\"%d\\\", \u0026${1:n});\", \"while (${1:n}--) {\\n\\t$0\\n}\" ], }, \"for i++\": { \"scope\": \"c,cpp\", \"prefix\": \"fori\", \"body\": [ \"for (int ${1:i} = ${2:0}; ${1:i} \u003c ${3:size}; ${1:i}++) {\\n\\t$0\\n}\" ] }, \"for i--\": { \"scope\": \"c,cpp\", \"prefix\": \"for-\", \"body\": [ \"for (int ${1:i} = ${2:size - 1}; ${1:i} \u003e= 0; ${1:i}--) {\\n\\t$0\\n}\" ] }, \"the end of format-print\": { \"scope\": \"c,cpp\", \"prefix\": \"end\", \"body\": [ \"\\\" \\\\n\\\"[i == ${1:size} - 1];$0\" ] }, \"gcd\": { \"scope\": \"c,cpp\", \"prefix\": \"gcd\", \"body\": [ \"${1:LL} gcd(${1:LL} m, ${1:LL} n) {\", \"\\twhile (n != 0) {\", \"\\t\\t${1:LL} t = m % n;\", \"\\t\\tm = n;\", \"\\t\\tn = t;\", \"\\t}\", \"\\treturn m;\", \"}\" ] }, \"isPrime\": { \"scope\": \"c,cpp\", \"prefix\": \"isPrime\", \"body\": [ \"int isPrime(int n) {\", \"\\tif (n == 1 || n == 0)\", \"\\t\\treturn 0;\", \"\\tfor (int i = 2; i \u003c= n / i; i++)\", \"\\t\\tif (n % i == 0)\", \"\\t\\t\\treturn 0;\", \"\\treturn 1;\", \"}\" ] } } 这个是只适用于cpp的 { \"cpp main body\": { \"prefix\": \"cppmain\", \"body\": [ \"#include \u003ciostream\u003e\", \"using namespace std;\\n\", \"int main() {\", \"\\tios::sync_with_stdio(false);\\n\\tcin.tie(0);\", \"\\t$0\\n\\treturn 0;\\n}\" ], }, \"vector\u003cint\u003e\": { \"prefix\": \"vi\", \"body\": [ \"vector\u003cint\u003e \" ], }, \"n groups of data (cpp)\": { \"prefix\": \"ngc\", \"body\": [ \"int ${1:n};\", \"cin \u003e\u003e ${1:n};\", \"for (int ${2:i} = 0; ${2:i} \u003c ${1:n}; ${2:i}++) {\\n\\t$0\\n}\" ], }, \"n groups of data--\": { \"prefix\": \"n--\", \"body\": [ \"int ${1:n};\", \"cin \u003e\u003e ${1:n};\", \"while (${1:n}--) {\\n\\t$0\\n}\" ], }, \"LeetCode Lintcode\": { \"prefix\": \"lcode\", \"body\": [ \"#include \u003cbits/stdc++.h\u003e\\nusing namespace std;\\n$0\", \"int main() {\\n\\tSolution a;\\n\\n\\treturn 0;\\n}\" ] }, \"code forces\": { \"prefix\": \"cf\", \"body\": [ \"#include \u003ciostream\u003e\", \"#include \u003cvector\u003e\", \"using namespace std;\\n\", \"void solution() { \", \"\\t$0\\n}\", \"int main() {\", \"\\tios::sync_with_stdio(false);\\n\\tcin.tie(0);\", \"\\tint t;\\n\\tcin \u003e\u003e t;\", \"\\twhile (t--) {\\n\\t\\tsolution();\\n\\t}\", \"\\treturn 0;\\n}\" ], }, } "},"title":"「Code」代码片段"},"/vscode/java_se/":{"data":{"":"写写小文件vscode还是很舒服的","0-vs-code安装及使用#0. VS Code安装及使用":"下文必看! 下载安装VS Code、基本使用等等。\n「Code」安装与基本操作","1-jdk下载安装#1. JDK下载安装":"写过了,懒得复制了,请看\nJDK介绍和下载","2-开始使用#2. 开始使用":"用VS Code打开.java文件会自动提示安装Java扩展包,或者自己直接搜索安装。安装完即可正常编写Java了。\n新建一个Hello.java来写一个Java的Hello World试试\npublic class Hello{ //公共类名(这里是Hello)必须和你的文件名一样 public static void main(String[] args){ System.out.println(\"Hello World!\"); } } 某个类的主方法可以点击上方的Run运行。如果整个个文件有多个类可以点击右上角的运行。","3-新建项目#3. 新建项目":"安装完Java扩展包后,没打开文件夹时资源管理器中“打开的文件夹”会有一个如图“创建Java项目”的按钮(或者有一栏“Java Projects”,里面有个加号)\n点击之后如果有相应的框架可以用相应的框架构建项目,如果没有选择第一个“No build tools”。\n选择一个文件夹打开,按照提示输入项目名称会生成一个项目模板,里面自带一个App.java(就是个Hello World),可以自己运行试试。\n资源管理器左下方有一栏Java Projects,点开可以查看“项目视图”。在这里添加第三方包方便一点,不用手改json。"},"title":"「Code」Java SE"},"/vscode/python/":{"data":{"":"也可点击知乎文章","0-vs-code安装及使用#0. VS Code安装及使用":"下文必看! 下载安装VS Code、基本使用等等。\n「Code」安装与基本操作\n无论用VS Code搭建什么语言的开发环境,只需记住一个流程:\n安装官方的SDK(编译器/解释器等等)-\u003e VS Code里安装相应的支持扩展 -\u003e 开始写代码","1-python解释器安装#1. Python(解释器)安装":"1.1 Windows 上安装 直接在 Python 官网 下载 Python 并安装。\n安装时记得选择图中最下面的 Add xxx to Path 加入到环境变量。\n1.2 Linux/WSL 上安装 Python 有 Python2.X 和 Python3.X 两个不兼容版本,两者不能混用。可能是 Linux 上经常显式指明解释器的原因,为了兼容性,Python3.X 改为用 python3 命令,而默认的 python 命令仍然给 Python2.X 使用。\n很多 Linux 发行版都自带了 Python3,没有的话直接用包管理器安装即可。\n随着 Python2 的淘汰,Python2 用的也越来越少,各发行版新版本基本都不会安装Python2,大部分情况下 python 是一个无效的命令。这时有些 Linux 发行版就将其指向了 python3,因此使用 python 时一定要分清安装的是哪个版本。\n以 Debian 11 / Ubuntu 20.04 为例,自带了 Python3,而 python 命令无效。这种情况可以安装 python-is-python3 这个软件来让 python 命令作为 python3 的别名。使用 apt 安装一下:\nsudo apt install python-is-python3 另外,我们需要安装一下虚拟环境的工具。大部分 Linux 发行版为防止系统包管理和 Python 包管理(pip)冲突,并不能直接在系统中直接使用 pip,必须自己创建虚拟环境进行管理。\n还是以 Ubuntu 为例,使用 apt 安装一下:\nsudo apt install python3-venv ","2-pip换源建议#2. pip换源(建议)":"由于国内网络原因,很多 Python 库在线安装很慢甚至安装失败。\n可以自己手动将某个镜像源设置为pip默认源。这里以教育网的为例,终端里输入:\npip config set global.index-url https://mirrors.cernet.edu.cn/pypi/web/simple 国内常用 pip(pypi)源:\n校园网联合镜像站:https://mirrors.cernet.edu.cn/pypi/web/simple\n集合了不少高校的源和使用帮助,帮助文档 阿里云镜像:https://mirrors.aliyun.com/pypi/simple/\n能用,但速度一般 腾讯云镜像:https://mirrors.cloud.tencent.com/pypi/simple/ 至于很多人说的豆瓣镜像其实已经指向腾讯云镜像了,如果看到近几年的文章还这么写,那基本是抄袭多少年前的老文章了,就别看了。","3-开始使用#3. 开始使用":"用VS Code打开.py文件会自动提示安装 python扩展,或者自己直接搜索安装。\n它应该会自动安装智能提示扩展 - Pylance。\n接下来可以自己写一个简单程序,右上角点击运行(Run Python File)即可。\nprint('Hello World') a = input('请输入一个数字') print(a) ","4-创建虚拟环境#4. 创建虚拟环境":"虚拟环境是一个隔离的Python环境,允许用户安装和运行不同的Python包,而不会影响系统范围内的Python安装。\n如果要使用虚拟环境,我们可以切换到工作目录,打开终端并输入:\npython -m venv .venv 这会在目录里创建一个名为 .venv 虚拟环境。\n创建好虚拟环境后我们还需要在当前 Shell 环境中执行相应的激活脚本才能“激活”/“进入”虚拟环境,即设置一系列的环境变量。激活脚本放在 .venv 目录下,根据自己所用 Shell 选择即可。\n使用 VS Code 时可以直接在状态栏右下角(旁边一点)选择解释器路径,如果你有不同的虚拟环境也可以在这里切换。之后执行 Python 程序或打开终端时都会自动“激活”。\n2023.10 更新:Python 扩展也可以图形化的创建虚拟环境了,支持venv和conda。","5-jupyter-for-vs-code#5. Jupyter for VS Code":"VS Code 里也支持 Jupyter notebook,它可以分段运行程序,挺方便的。\n现在安装 Python 扩展会自动安装 Jupyter 扩展。(又不安装了)\n在扩展市场搜索“Jupyter”并安装。\n新建一个文件命名为xxx.ipynb,新建一个“代码”块,随便写几行代码。\n然后点击旁边的运行,它会让你选择解释器。随后,它会提示你安装一个内核(ipykernel)。点击安装,它会通过 pip 自动安装,安装完成即可正常使用。(不行的话手动输入pip install ipykernel)\n安装完成后即可使在VS Code 上愉快地使用 Jupyter notebook 了。"},"title":"「Code」Python"},"/vscode/r/":{"data":{"":" ","0-vs-code安装及使用#0. VS Code安装及使用":"下文必看! 下载安装VS Code、基本使用等等。\n「Code」安装与基本操作","1-r-安装配置#1. R 安装配置":"R 下载安装 在 R 官网 下载安装。\n国内下载慢可以在 R - 校园网联合镜像站 中下载,或在 CRAN - 校园网联合镜像站 中任选一个。\nCRAN 换源 要换源请阅读:CRAN 镜像使用帮助\n上面只说了 .Rprofile 在 Linux 上位于 ~,自己从 r - How to access and edit Rprofile? - Stack Overflow 回答中找到“通用打开方法”,测试出 Windows 上应该在 %USERPROFILE%\\Documents 也就是 C:\\User\\[username]\\Documents。 等我有时间向 MirrorZ 和 sjtug 提 PR向 MirrorZ 和 sjtug 提 PR 已合并","2-安装扩展和-lsp#2. 安装扩展和 LSP":"在 VS Code 中搜索安装 R 和 R Debugger 两个扩展。\n安装后会提示安装一个名叫 Languageserver 的 R 包: 点击 Yes 安装。如果提示因权限问题导致失败,请自行在 R Terminal 中执行:\ninstall.packages(\"languageserver\") 随后根据提示确认安装。","3-测试#3. 测试":"新建一个 .R 文件并写入以下内容。点击右上角的运行按钮测试能否正常运行。\n# 数据准备 info = c(1, 2, 4, 8) # 命名 names = c(\"Google\", \"Runoob\", \"Taobao\", \"Weibo\") # 涂色(可选) cols = c(\"#ED1C24\",\"#22B14C\",\"#FFC90E\",\"#3f48CC\") # 绘图 pie(info, labels=names, col=cols) 样例来源:R 绘图 - 饼图","4-jupyter-支持#4. Jupyter 支持":"打开 R Terminal,执行如下命令:\ninstall.packages('IRkernel') IRkernel::installspec() 之后就可以使用 Jupyter Notebook 中编写 R 程序了。\n第二行出错可以参考:r - Cannot get IRkernel::installspec() to work, jupyter-client not visible - Stack Overflow\n另可参考官方文档:R in Visual Studio Code"},"title":"「Code」R"},"/vscode/remote-ssh/":{"data":{"":"在 VS Code 中使用 SSH。","ssh-基础#SSH 基础":"请查看:SSH","如何使用#如何使用":"接下来可以打开\n文件(夹) 终端 进行使用。\n打开过的文件夹会在资源管理器中显示,可以方便以后快速打开。 ","安装扩展#安装扩展":"安装该扩展:SSH:Remote - SSH\n也可以直接安装这个远程开发的扩展包:Remote Development,包含WSL、SSH、Docker等。\n安装后打开侧栏的“远程资源管理器”(SSH Targets)即可看到 SSH 列表。如果你 ~/.ssh/config 有内容会显示,没有的话列表是空的。\n要自己添加的话点击“+”按钮 或点击VSCode左下角绿色按钮,选择下图所示选项 输入 SSH 登陆命令。\n不会?有没有看开头的文章。\n确定后选择将刚刚的配置储存到哪里,选第一个就行。 ","开始连接#开始连接":"点击如图“新窗口打开”或右下角的“Connect”,会打开一个新的窗口。 第一次连接可能需要你选择连接的是哪个平台。 随后输入密码,完成连接。 "},"title":"「Code」Remote - SSH"},"/vscode/remote-wsl/":{"data":{"":"可以点击 知乎文章 查看。","1wsl#1、WSL":"WSL(Windows Subsystem for Linux)是 Windows 上的“Linux 子系统”(官方翻译叫“适用于Linux的Windows子系统”,这个名字好拗口)。 现在提 WSL 基本都默认是 WSL2,WSL2 的本质是一个跑在虚拟机(Hyper-V)上的系统,但能直接和 Windows 进行交互。\n安装之后可在子系统进行开发环境的配置,更方便,而且对 Windows 系统本身影响较小。\n启用安装 在设置里搜索“Windows功能”并打开。\n对于大部分笔记本自带的 Windows(中文)家庭版,勾选“虚拟机平台”和“适用于 Linux 的 Windows 子系统”。 对于 Windows 专业版(Windows Pro),则勾选 “Hyper-V 平台”和“适用于 Linux 的 Windows 子系统”。 等待系统自动配置,重启。\n在 Microsoft Store 中搜索 Ubuntu 或 Debian(或者其他Linux发行版,没有老旧、停止维护的 CentOS 7),选择所需版本下载安装。\n等待下载安装完成,打开,第一次启动时需根据提示设置账户名和密码(密码输入时不会显示,不是bug)。\n设置完成后,即可在终端内进行正常操作。现在你就可以在Windows下使用Linux的环境进行开发了。\n提示 以后点击开始中的 Ubuntu / Debian 图标或终端中输入wsl即可启动WSL。 现在(2023)WSL2 已经支持 Systemd,如果你用的发行版没有开启,请查看 使用 systemd 通过 WSL 管理 Linux 服务。 WSL 可以操作“Windows上的分区”,其实际上是挂载在路径/mnt/下的。 WSL CLI工具 关闭 WSL:\nwsl --shutdown 删除(或重置)某个发行版:\nwsl --unregister \u003c发行版\u003e 设置(输入wsl时)默认发行版:\nwsl --setdefault \u003c发行版\u003e 其他帮助:\nwsl --help 换源 Ubuntu 的apt默认软件源是 Ubuntu 的主服务器,我个人测试速度一般都在1-4MB/s左右,用着还可以。但是一般比不上国内镜像源的速度。建议根据自己情况决定是否更换。\n通用的换源方式可以查看:开源镜像站合集\n建议根据自己情况决定是否更换。","2远程开发#2、远程开发":"安装扩展 WSL:Remote - WSL\n如果都用得到,也可以直接安装这个远程开发的扩展包,包含WSL、SSH、Docker。\n远程连接 在WSL的终端中输入code,系统自动下载所需文件(code-server)后启动 Windows 中的 VS Code 并自动与其进行连接。成功连接后VS Code左下方会有提示。\n如果没显示,再输入一次code试试。\n以后就可以直接点击那个绿色图标或者左侧活动栏中的“远程资源管理器”进行连接。","3如何使用#3、如何使用":"接下来可以打开\n文件(夹) 终端 进行使用。\n打开过的文件夹会在资源管理器中显示,可以方便以后快速打开。"},"title":"「Code」Remote - WSL"},"/vscode/vscode/":{"data":{"":"","安装启动#安装启动":"官网下载: Visual Studio Code(所有下载)\n2023.12 c炳:VS Code 官网下载服务换新的CDN啦,现在首页直接下载应该也很快。\nWindows上安装时建议将下面的选项都勾选上。\n安装完后启动的界面如下,可以改变主题和学习使用方法,建议先别管,先看下面。\n安装后第一次启动会在右下角提示你安装中文语言包,点安装会重启。这时再打开,下面就成中文了。\n不小心关了也可以在扩展市场搜索Chinese进行安装。","快捷键#快捷键":"这里不多说,只说几个个我写代码时最常用的(非常实用),更多快捷键菜单的各个选项旁边都有标明。\n界面\n缩放界面:Ctrl + +或者Ctrl + -\n打开设置:Ctrl + ,\n打开终端:Ctrl + `\n(反引号,在Esc和Tab键之间)\n代码\n代码格式化:Ctrl + Alt + f 或者 Ctrl + Shift + l\n(分别是 Windows 和 Linux 上的,可在右键菜单中查看)\n注释选中行:Ctrl + /\n(如果已经注释,再按一次会取消注释)\n重构\n替换变量名:F2\n(光标位于哪个变量,其所有出现过的地方都会同时改)\n替换选中内容:Ctrl + F2\n(选中的内容出现过的地方都会改,相当于Ctrl + H)","打开文件夹#打开文件夹":"VS Code里写像C语言、Java之类可以不建项目,但是有时要选择文件夹将其作为“工作区”,一是方便管理文件,二是为了确定文件路径、打开终端时的目录等。如果有配置文件也将会在该目录下创建.vscode文件夹。\n在“欢迎使用”或者“文件”菜单栏里选择“打开文件夹”打开任意一个文件夹,或者直接在资源管理器右击文件夹,“通过Code”打开。\n今年(2021)新加入了信任功能,第一次打开要添加信任。如果不想以后提醒,可以在“设置-安全性-Trust:Enabled”里关闭。","扩展商店#扩展商店":"点击左侧最后一个按钮,然后即可在搜索框搜索插件安装。\n安装扩展前一定要看扩展的说明!!!","编码相关#编码相关":"VS Code默认是使用UTF-8打开和保存的,所以如果不是UTF-8的,打开可能乱码(因为Windows中文版的命令行输出编码为GBK,遇到我会说明)。如果使用VS Code新建或编辑文件,请确认它是你需要的编码格式。\nVS Code更改编码十分方便,你可以点击右下角\n如果打开乱码,点击“通过编码重新打开”,选择正确编码。 要更改文件编码(前提是你文章没有乱码),选择“通过编码保存”。 建议修改默认打开选项。设置里搜索“编码”,打开图中第一个选项,打开文件时会自动推断文件的编码。"},"title":"「Code」安装与基本操作"}}