diff --git a/404.html b/404.html index d54fa92c..c397ae68 100644 --- a/404.html +++ b/404.html @@ -38,18 +38,18 @@ } - + -
跳至主要內容

404

页面不存在

这里什么也没有

- +
跳至主要內容

404

页面不存在

这 是 四 零 四 !

+ - - - + diff --git a/DailyRoutine.html b/DailyRoutine.html index 6c6b7ab8..5362034d 100644 --- a/DailyRoutine.html +++ b/DailyRoutine.html @@ -38,7 +38,7 @@ } - + @@ -52,10 +52,10 @@ Sleep, 500000 Run, PowerShell.exe -NoExit -Command &{dvr-scan -i output.mp4 -o %A_YYYY%-%A_MM%-%A_DD%_Scanned.avi}, D:\Backup\Libraries\Desktop
  • 使用 VLC 播放器可以以 31.25 倍的速度回放监控视频,并结合 ManicTime 来回顾当日内容。要轻松实现 VLC 的高倍速播放,可以在「菜单栏」->「视图」中开启「状态栏」。此外,通过剪映,可以达到 100 倍的播放速度。

  • 时间管理

    GTD 的存在是让大脑清空不混乱目的,明确知道下一步应该做什么。GTD 流程依次为捕获(Capture),明晰(Clarify),组织(Organize),回顾(Reflect),执行(Engage)

    执行时,将 GTD 按功能与目的划分为多个清单。

    当任务捕获到收集箱后,参考下方的固定流程将其整理不同的清单中。

    GTD 任务转移到清单

    从 GTD 流程角度,执行任务和计划。

    GTD 流程步骤

    GTD 工具原本用的是 Microsoft To Do,「我的一天」功能非常适合聚焦,但有次出现了同步问题,就转用滴答清单。滴答清单除基础 Todo 功能外,还能用日视图管理具体时间安排,添加跨天长时间任务,并在日历、看板和甘特图中查看。

    滴答清单的缺点也很明显,功能过于追求全,功能打磨得不够细节,无法满足定制需求。比如,没有任务跳过功能,对于循环任务只能点完成,导致记录与实际不符;跨越多天的任务不想在「今天清单」中出现出现,但一直在提醒,导致无法清空;过滤器逻辑单一,筛选元素教少。如果你的任务都可以一天内完成,不需要记录持续多天的计划,不需要买滴答的高级会员,基础功能足够满足你了。

    本节内容来自 Topbook 的 GTD 自我管理 - 时间管理教程open in new window,改变了我对 GTD 的认知,把事情做好,而不是把事情做完。建议完整阅读。

    日常习惯

    锚点在我……我会……庆祝
    20s 休息提示拿下眼镜,画板上添笔画后深蹲 15 个双手肘向后
    5mins 休息提示拿下眼镜,画板上添笔画后重力拉伸 15 次,2 组双手肘向后
    上完厕所洗好手,画板上添笔画后俯卧撑 15 个双手肘向后
    出书房画板上添笔画后俯卧撑 15 个双手肘向后
    午餐放下碗筷吃维生素想象自己发光
    午睡打开大排灯设置 30 分钟的闹钟想象自己发光
    洗澡打开花洒深蹲 15 个哼歌
    刷完牙放下牙刷俯卧撑 15 个双手肘向后
    晚上上床伸展并触碰脚趾;读书想象自己发光
    睡觉关灯打开白噪音想象自己发光

    休息选项:喝口水、洗脸、看看窗外、眼部按摩仪、按摩头皮。

    运动选项:跳绳、有氧拳击、B 站轻度健身操(Jo 姐?)。

    睡眠知识:睡眠时的体温理想情况下会比正常体温低二到三度,因此睡前应尽量降低低温,避免激烈运动。同时,手机屏幕等产生的光线会非常影响睡眠,建议尽量避免睡前使用手机。睡醒后应尽快暴露在室外,让自然光线把身体唤醒,只需要短短十分钟。

    美容仪器

    为了避免家里的美容仪器闲置浪费,我制定了定期使用计划。(请勿参考型号购买)


    1. 睡前淋浴有助于快速入睡open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/Fitness.html b/Fitness.html index baa95983..a7c99484 100644 --- a/Fitness.html +++ b/Fitness.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    健身计划

    约 3162 字大约 11 分钟...

    早餐必吃,午餐吃饱,晚餐少吃且不吃主食。

    消除饥饿感:10 秒内原地高抬腿快跑 20 次!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。

    晨间锻炼使用八段锦(12mins)热身。每天保持 9000 步open in new window,日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。

    K 歌减肥

    K 歌减肥open in new window容易吵到邻居,没找到隔音口罩,用发泄壶代替。

    • 每天唱三首歌,选择 key 比较高、换气多的歌效果会更好。比如三天三夜、死了都要爱......这些听起来就感觉会唱断气的歌。非母语的美声唱法所消耗的热量最大。唱歌的时候要一边按住 E 点,一边用力发声唱歌

      E 点
      E 点位置
    • 喊叫减肥:臀桥的同时,将眼睛、鼻孔和嘴巴都用尽全力张到最大,然后气沉丹田,用力地怒吼出声:啊——啊——啊!啊!啊!喊的时候一定要用全力,一直叫,叫足 3 分钟。如果声音过大,可以咬毛巾,降低音量。

      喊叫减肥动图
      喊叫减肥动图

    该方法类似于上面的《卡拉 OK 健康法》,里面提到唱 K 不仅可以增加肺活量,还有瘦身作用。这原理就和瑜伽中常用的腹式呼吸法差不多,利用腹部肌肉收缩,促进新陈代谢,吸收脂肪分解时所需的氧气,从而达到减肥效果。

    坐立减肥

    研究者开创了一种名叫比目鱼俯卧撑(SPU)open in new window的方式,可以在数个小时内将局部的氧化代谢提升到很高的水平。我们平时在站立和步行时都会用到比目鱼肌,而所谓的比目鱼肌俯卧撑就是尽最大可能使用这块肌肉。方法也很简单,如下方动图所示,你坐着的时候双脚处于放松状态,然后提起后脚跟,脚趾仍然需要紧贴地面不动。

    比目鱼俯卧撑演示图
    比目鱼俯卧撑演示图

    当你的后脚跟提到极限的时候,小腿的肌肉会产生紧张拉伸的感觉,然后你会自主地放松,将脚后跟放回地面。这样就完成了一次 SPU。

    健身理论

    • 早餐一定要吃!吃早餐的人比不吃早餐的人更容易减少体重。因为在睡觉的时候,身体的新陈代谢会减慢,而只有在你再次进食的时候,它才会回升。所以,如果你跳过早餐不吃,身体消耗卡路里的能力在午餐前都无法达到正常水平。这也就是为什么新的一天最好从一顿拥有 300 ~ 400 卡路里的早餐开始,它能立刻把你的新陈代谢带入「工作状态」。另外,早餐应该尽量多食用些高纤维食物。习惯吃高热量早餐的人更容易很快感到饥饿;而高纤维碳水化合物的消化和吸收时间更长,不会导致身体里血糖的迅速改变,你自然也就不那么容易饿了。
    • 高于或者低于靶心率 142~154 的运动算无效运动,基本没有减脂的作用。所以说,神马仰卧起坐瘦小腹,蹬腿瘦大腿都是扯淡,那些运动都达不到有氧运动的下限,根本燃烧不了脂肪。可进行适当的拉伸运动,开始 HIIT,然后用 5 分钟整理运动结束训练,然后接着进行全面的拉伸。

    每周健身 4 小时

    早上半小时内要吃早餐,饭前 60 个深蹲或推墙俯卧撑。早餐:蛋、小扁豆、菠菜。

    • 别吃水果,水果的糖分太多,可以一天一个牛油果
    • 瓶颈期时,加大蛋白摄入,早餐吃 3 个鸡蛋
    • 晚上冰敷:冰袋放在脖子后部和上斜方肌附近,保持 20 ~ 30 分钟。

    早饭前、睡前:各 5 ~ 10 分钟的冷水澡。先用热水把整个身体淋湿,大概用时 1~2 分钟。然后,用洗发水洗头、用洗面奶洗脸,把淋浴调成完全的冷水清洗头发和脸部,身体别的部分先别碰冷水。洗干净后,转身,背对淋浴喷头,让水浇在你的后脖颈下方和背部上方的区域,保持这个姿势 1 ~ 3 分钟不动。然后,转过身,正常清洗身体就可以了。

    室内健身

    注意

    本部分的内容,我不确定其来源,也未加以理解和消化,仅将其作为参考资料。

    如果你只是想降低体重,提高身体素质,那么 Slim in 6 和 P90 已经够了,可以来回多刷几周目,如果你还想对自己进行更深入的训练,那么就可以试试 Les Mills BodyCombat 和 T25,如果需要挑战自己,P90X 和 insanity 在等着你。

    在锻炼过程中,先把动作做标准,而不是勉强去跟上视频的动作数量,当你觉得自己需要休息,就停一下,不要 over do it,做好热身和关节保护,锻炼期间吃好睡好。

    Slim in 6

    这是一套专门针对无运动基础、体重基数大、身体状态较差的人的健身操,没有太剧烈的动作,基本没有跳跃动作,非常注意对膝盖等关节的保护,各种动作里糅合了大量拉伸,教练非常 nice。课程不复杂,只有三套主题操和一个核心肌肉附加训练和一个拉伸附件训练,每一套主题操反复做两周然后进入下一套,附加训练视自己的情况逐渐加入主题操之后。这套操好评如潮,无数购买者在官网留下评论表示坚持这套操给自己的身体带来了显著的良性变化,体重明显降低、线条更优美、体态更匀称等等......

    我上手便是做这套,但是虽然看的时候觉得也还挺容易的,真正做起来也并不是那么轻松,但是难度真的控制得很好,很多动作的难度和频率都刚好在让你觉得“吃力但是咬一咬牙就坚持下来并且很有成就感”的程度,这套操所需的东西仅仅是一张大一点的瑜伽垫,几条拉力绳,几个平方的空地,在哪都能做,我就是在办公室利用中午时间做的。

    当然这套操也有缺点,一个是从第二套主题操开始时间变得很长,如果做完附件训练,需要大概 1 个多小时,第三套更长一些。一个是相对比较枯燥,每天重复同样的动作,容易厌烦,这也是为什么我只做到第四周的一般就放弃的原因之一,另一个原因是我肩膀比较弱,这个操又有大量的保持手臂平举的动作......

    但是这三周多的效果是很明显的,我的体重有接近 5 公斤的下降幅度,最重要的是肺活量和肌肉力量有了很明显的提高,为进入下一步打好了基础。我推荐所有从零开始或者长期不运动的同学从这套操开始恢复,我相信如果能坚持做完六周,你们会感谢我的推荐的。

    哦,对了,这套操有很多深蹲动作,大家做的时候一定要注意正确的姿势,保护好膝盖。

    P90

    注意,这个是 P90 而不是 P90X,虽然只差一个字,但是难度有天壤之别,都是金牌教练豪顿的作品,P90 是他整个健身操系列的基石,也是面对缺乏运动基础的人来设计的,同样有很好的评价,这套训练是一天有氧一天肌肉抗阻训练的模式,但是强度都比较低,肌肉抗阻训练比起健身房差很远,但是对刚起步的人来说很合适。这套训练我没有系统性地做过,在放弃 Slim in 6 之后短暂地做过几天,因为跳的动作比较多,而且我不是很喜欢豪顿那样的块状肌肉,也没有打算进军 P90X,而且当时我的身体状态做 P90 已经感觉不到太大的效果了。

    P90 和 Slim in 6 一样,只需要一块垫子,哑铃或者拉力绳就可以做,推荐想进入 P90X 的同学从这个开始,这套操的难度和强度与 Slim in 6 是很接近的。

    Les Mills BodyCombat

    到我最喜欢的部分了,这是莱美健身房推出的一套搏击操,这套操总体上强度高于上面两个,这套操一共有十三个视频,分别是有氧搏击系列,HITT 系列和核心肌肉训练系列,然后根据每天做的视频不同,编排了三个 60 天的课程表,难度一个大于一个,我只做完了第一个。我之所以喜欢这套操的原因如下:跳跃动作不多、非常好玩、教练帅气逼人。

    这套操比起前面两个需要的空间略大,因为有一些滑步动作和一些各个方向的踢腿动作,但是也只是略大,器械也就是部分课程需要两只哑铃而已。这套操的有氧搏击部分我个人认为是最精华所在,它将拳击、跆拳道、泰拳等格斗技术的一些基础动作编排在一起,通过各种出拳、踢腿、顶膝等动作大量消耗热量,而且非常好玩,脑补能力稍微强一点的,提高一点中二值,一节课很容易就过去了。

    这套操的难度体现在 HITT 和核心肌肉训练部分,开始出现急速提高心率的剧烈动作和组合型动作,比如俯卧撑跳跃深蹲再跳趴俯卧撑,这部分需要锻炼者有不错的肺活量和肌肉力量基础,不然会承担比较高的运动受伤风险。

    推荐有了基础的大家来做这一套,我每天在办公室做完真的是全身湿透,桌子地板都要擦一遍,哪哪都是汗水,非常爽。

    T25

    这个的难度与 Les Mills BodyCombat 相仿,是大名鼎鼎的熊 T,也就是可怕的 insanity 健身操的教练推出的一套难度低于 insanity 的训练计划,你可以把他看做简化版的 insanity,里面的很多动作都会在 insanity 里面出现,只是频率和强度没那么大。

    这套在我刷完 Les Mills BodyCombat,进军 insanity 之前做过,真的很累,因为这套计划有很多都是 HIIT,短时间高强度的重复动作,比如 30 秒急速高抬腿马上接 30 秒虎跳之类的,但是 HIIT 的效果是非常明显的,坚持一段时间可以让你的身体素质在原有基础上进入一个新的阶段。

    对于所有想进军 insanity 的朋友,真诚推荐这一套作为预热,如果能很好地掌控这套,那么在 insanity 里你肯定能坚持下去。

    P90X 和 insanity

    把这两个放在一起,是因为它们在家庭训练计划界的地位实在是难分伯仲,大名鼎鼎的腹肌撕裂者就出自 P90X 的项目,而 insanity 更是让无数家庭健身者得到了梦寐以求的良好身体素质和美妙的身体线条。首先 P90X 我没有做过,原因和我不喜欢 P90 是一样的,我不喜欢豪顿那样的块状肌肉,所以对 P90X 里面大量的独立肌群抗阻训练无感,而 insanity 的熊 T 很少设计单一肌肉的训练动作,都是大量的 HIIT 和核心肌肉训练,更注重整体的塑造。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/ai/AIEnjoy.html b/ai/AIEnjoy.html index 20953ee5..fc52da73 100644 --- a/ai/AIEnjoy.html +++ b/ai/AIEnjoy.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    AiEnjoy

    约 810 字大约 3 分钟...

    AiEnjoy

    https://autoaigpt.cnopen in new window 是一个多功能网站,提供快速使用GPT、万能IT工具、博客资源、每日热棒、音乐欣赏和互动等服务。该网站汇集了丰富的资源,为用户提供了广泛的信息和工具,旨在满足用户对于技术、新闻和娱乐的需求。本报告将详细介绍https://autoaigpt.cnopen in new window 网站的各项功能和特点。

    GPT快速使用

    https://sensechat.vipopen in new window 网站提供了GPT(生成对抗网络)的快速使用功能。GPT是一种强大的人工智能技术,可以生成自然语言文本。通过https://sensechat.vipopen in new window ,用户可以轻松输入问题或主题,并获得由GPT生成的高质量、有用的回答或文章。这项功能适用于各种应用场景,包括研究、写作、学习和解决问题等。

    万能IT工具

    https://itools.siteopen in new window 网站提供了一系列万能IT工具,旨在帮助用户解决各种技术问题和提升工作效率。这些工具包括代码转换器、数据处理工具、图像处理工具、文本处理工具等。用户可以根据自己的需求选择适当的工具,并通过简单的操作完成复杂的任务。

    博客资源

    https://gpt-vip.topopen in new window 网站的博客资源栏目为用户提供了丰富的技术和行业相关文章。这些文章涵盖了各种主题,包括人工智能、数据科学、编程、网络安全、云计算等。用户可以通过阅读这些文章,获取最新的技术趋势、学习新知识和拓宽视野。

    每日热棒

    https://dailytops.eu.orgopen in new window 网站的每日热棒栏目提供了当天最热门的新闻和热点话题。用户可以通过浏览这些内容,了解国内外的时事动态、科技进展和社会热点。每日热棒栏目保持更新,确保用户始终掌握最新的信息。

    音乐欣赏

    https://autoaigpt.cnopen in new window 网站还提供了音乐欣赏功能,用户可以在这里收听各种风格和流派的音乐。无论是放松身心、提升工作效率还是享受音乐的美妙,用户都可以在这里找到适合自己的音乐作品。

    互动社区

    https://gpt-vip.topopen in new window 网站的互动社区为用户提供了交流和互动的平台。用户可以在社区中发表观点、提问问题、分享经验和结识新朋友。这个社区是一个开放、友好和知识共享的环境,让用户能够与其他用户共同成长和学习。

    结论

    https://autoaigpt.cnopen in new window 网站是一个多功能的网站,为用户提供了GPT快速使用、万能IT工具、博客资源、每日热棒、音乐欣赏和互动社区等服务。通过这个网站,用户可以获取到丰富的资源,包括高质量的文本生成、实用的IT工具、专业的技术文章、时事热点、音乐享受和交流互动。https://autoaigpt.cnopen in new window 致力于满足用户对于技术、新闻和娱乐的需求,为用户提供一个全方位的在线平台。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/ai/ChatGPT.html b/ai/ChatGPT.html index 1a0a619b..8ff53abe 100644 --- a/ai/ChatGPT.html +++ b/ai/ChatGPT.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    ChatGPT

    约 673 字大约 2 分钟...

    ChatGPT

    公司介绍

    OpenAI是一家致力于确保人工智能(AI)能够为所有人带来好处的人工智能研究实验室。该公司成立于2015年,由Elon Musk、Sam Altman等人联合创立,旨在推动友好AI的发展,避免其集中在少数几家公司或政府手中。OpenAI的使命是确保人工智能的广泛应用能够造福全人类。

    产品能力与目前模型

    OpenAI的最新产品是ChatGPT,这是一种基于GPT-3模型的对话AI。GPT-3是OpenAI的第三代生成预训练转换器,它是目前最大、最强大的语言模型之一。GPT-3拥有1750亿个训练参数,能够生成极其逼真的人类语言。

    OpenAI最近发布了GPT-4,这是一种更先进的语言模型。GPT-4拥有更多的训练参数,能够生成更高质量和更多样化的文本。GPT-4的发布标志着人工智能在理解和生成人类语言方面的又一重大突破。

    OpenAI也正在研发GPT-5。这个模型预计将拥有更多的训练参数,进一步提高语言生成的质量和多样性。

    功能与意义影响

    ChatGPT的功能强大且多样。它可以理解和生成语言,进行对话,帮助编程,提供写作建议,甚至可以创作诗歌和故事。这使得ChatGPT可以在各种场景中发挥作用,包括客户服务,教育,娱乐,内容创作等。

    ChatGPT的意义影响深远。首先,它是人工智能技术的重要突破,展示了AI在理解和生成人类语言方面的强大能力。其次,ChatGPT可以帮助人们更有效地完成各种任务,提高生产力。最后,ChatGPT的出现也引发了关于AI伦理和社会影响的重要讨论。

    如何使用

    使用ChatGPT非常简单。首先,你需要访问OpenAI的网站并注册账号。然后,你可以通过OpenAI的API来使用ChatGPT。你只需要发送一个包含你的对话内容的请求,ChatGPT就会返回一个生成的响应。你也可以通过设置一些参数来调整ChatGPT的行为,例如温度(决定输出的随机性)和最大令牌数(决定输出的长度)。

    总的来说,OpenAI的ChatGPT是一个强大的对话AI,它展示了人工智能在理解和生成人类语言方面的巨大潜力。无论你是开发者,创作者,还是普通用户,ChatGPT都能为你提供巨大的帮助。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/ai/Midjourney.html b/ai/Midjourney.html index 8fd85328..06e1d4c2 100644 --- a/ai/Midjourney.html +++ b/ai/Midjourney.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Midjourney

    约 686 字大约 2 分钟...

    Midjourney

    Midjourney是一款基于人工智能技术的绘画软件,它融合了深度学习算法的精髓,为用户提供了独特的绘画体验。在本文中,我们将探讨Midjourney所基于的技术以及它如何帮助用户创作个性化风格的绘画作品。

    Midjourney的技术基础

    Midjourney的核心技术基础是人工智能,具体而言,是深度学习算法。这些算法在绘画领域发挥了巨大的作用,让用户能够轻松地创造独特的艺术作品。这一技术能力的支持使Midjourney成为专业画家和绘画爱好者的理想选择。

    文字生成图片

    一种独特的生成方式是文字生成图片。Midjourney允许用户输入文字描述,然后将其转化为令人惊叹的绘画作品。无需绘画技能,用户可以用文字表达他们的创意,而Midjourney将会将其呈现为生动的图像。

    图片生成图片

    Midjourney还支持图片生成图片的方式。用户可以上传现有的图片,然后让人工智能技术将其转化为全新的绘画作品。这为用户提供了一种以既有图像为基础,创造出令人惊叹的艺术作品的方式。

    混合图片生成图片

    最后,Midjourney还提供了混合图片生成图片的选项。这意味着用户可以将文字和图片相结合,创造出充满创意的绘画作品。这种多元化的生成方式为用户提供了更多可能性,让他们能够实现他们的创意梦想。

    Midjourney的用户群体

    Midjourney的多样化生成方式使它适用于各种用户群体。专业画家可以利用这一工具来扩展他们的创作能力,将想法转化为艺术作品。同时,绘画爱好者也可以在无需绘画经验的情况下,轻松创建独特的绘画作品。无论您是想要展示专业技能还是纯粹追求兴趣,Midjourney都为您提供了一个创意的平台。

    结语

    Midjourney是一款基于人工智能技术的绘画软件,利用深度学习算法赋予用户无限的创造力。无论您是专业画家还是绘画爱好者,Midjourney都能满足您的需求,帮助您轻松创作个性化风格的绘画作品。不管您是追求艺术的极致还是寻找灵感的初学者,Midjourney都将引领您踏上一段充满创造力的绘画之旅。试试Midjourney,探索您的无限创意潜力吧!

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/ai/TaoAI/index.html b/ai/TaoAI/index.html index 96245b6e..87c950b8 100644 --- a/ai/TaoAI/index.html +++ b/ai/TaoAI/index.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    展望未来

    约 789 字大约 3 分钟...

    展望未来

    引言

    人工智能(AI)已经成为我们生活中不可或缺的一部分,从智能手机,自动驾驶汽车,到智能家居,AI的应用无处不在。AI不仅改变了我们的生活方式,也正在改变我们对世界的理解。本文将探讨AI在画画,对话,解决问题等多个方面的应用,以及它如何让我们的生活变得更美好。

    AI与艺术:AI的绘画能力

    AI的绘画能力已经达到了令人惊叹的程度。例如,Google的DeepDream可以生成梦幻般的图像,而OpenAI的DALL-E可以根据描述生成各种各样的图像。这些AI不仅可以复制人类的绘画风格,还可以创造出全新的艺术形式。

    AI的绘画能力不仅为艺术家提供了新的创作工具,也让那些没有绘画技巧的人能够创作出美丽的艺术作品。通过AI,艺术变得更加民主化,每个人都可以成为艺术家。

    AI与交流:AI的对话能力

    AI的对话能力也在不断提高。例如,OpenAI的GPT-3和ChatGPT可以进行自然语言处理,理解和生成人类语言,进行对话,写作,甚至创作诗歌和故事。这些AI可以用于各种应用,包括客户服务,教育,娱乐,内容创作等。

    AI的对话能力不仅可以帮助我们更有效地完成各种任务,也可以让我们与机器进行更自然的交流。通过AI,我们可以更好地理解和使用语言,更有效地传达我们的思想和情感。

    AI与问题解决:AI的解决问题能力

    AI的解决问题能力也在不断提高。例如,Google的AlphaGo和DeepMind的AlphaFold已经在围棋和蛋白质折叠等复杂问题上超越了人类。这些AI不仅可以解决我们无法解决的问题,也可以帮助我们找到新的解决问题的方法。

    AI的解决问题能力不仅可以提高我们的生产力,也可以帮助我们解决一些重要的全球问题,如气候变化,疾病,贫困等。通过AI,我们可以更好地理解和改变世界。

    结论:AI让生活更美好

    总的来说,AI正在各个方面改变我们的生活,让我们的生活变得更美好。AI的绘画能力让艺术变得更加民主化,AI的对话能力让我们与机器进行更自然的交流,AI的解决问题能力帮助我们解决一些重要的全球问题。

    然而,AI的发展也带来了一些挑战,如数据隐私,工作自动化,AI伦理等。我们需要在推动AI的发展的同时,也要关注这些挑战,并寻找解决方案。

    未来,AI将继续发展,带来更多的可能性。我们期待AI能够为我们的生活带来更多的美好。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/ai/index.html b/ai/index.html index 91d5fb1f..4264356a 100644 --- a/ai/index.html +++ b/ai/index.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Ai

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/AppNotes.html b/apps/AppNotes.html index 050fa93d..8e457cbb 100644 --- a/apps/AppNotes.html +++ b/apps/AppNotes.html @@ -38,7 +38,7 @@ } - + @@ -84,10 +84,10 @@

    TheBrain

    TheBrain 可以把知识无限扩充,都连接在一起。但将工作流导图放入 TheBrain 后发现并不合适,比较适合更细化的内容?

    Zinc

    Zincopen in new window 是一个进行全文索引的搜索引擎。它是 Elasticsearch 的轻量级替代品,运行在不到 100 MB 的 RAM 中。它使用 bluge 作为底层索引库。[4]

    原本想对 Windows 本地盘进行搜索,但应该只支持 json 处理过后的索引库,不能对本地硬盘进行索引。

    Zinc 初次启动

    1. 点击「系统属性」>「高级」>「环境变量」>「用户变量」,新建变量 ZINC_FIRST_ADMIN_USERZINC_FIRST_ADMIN_PASSWORD。这是后面要用到的账户密码,可自由设置,但密码需要包含大小写字母,

    2. 在应用目录下打开终端,执行命令:

    mkdir data
     .\zinc.exe
     

    成功执行后,打开 http://localhost:4080/,就能看到图形化界面了。

    全文索引-Bluge

    启动 Zinc,但需要有 Bluge 索引数据库,才能进行全文搜索。

    Blugeopen in new window 是基于 GO 的索引/搜索库,使用简单,有如基于磁盘和内存的索引功能。

    如果启动过程中报错,ZINC_FIRST_ADMIN_USER and ZINC_FIRST_ADMIN_PASSWORD must be set on first start. You should also change the credentials after first login.,可能是没有配置好环境变量,或是没有以管理员身份运行终端(win+X,A)所导致的。


    1. 注册免费 Teams 经典open in new window ↩︎

    2. Power Automate Desktop 免费 RPA 实现定时启动或按照频率运行自动化流的三种办法open in new window ↩︎

    3. How to Set Up an Automated Daily Template in Logseqopen in new window ↩︎

    4. 搜索引擎漫谈以及 Zinc 简介open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/Applist.html b/apps/Applist.html index 531ea73e..3d90afd9 100644 --- a/apps/Applist.html +++ b/apps/Applist.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    必备应用

    约 2100 字大约 7 分钟...

    Windows 自用软件,以开源软件为主。

    知识记录

    本地笔记:Logseq & Obsidian & 妙笔 & Joplin & Wiz 笔记 & OneNote

    在线笔记:Notion & 飞书 & flomo & Airtable & 简悦

    清单日历:滴答清单 & Trello & Habitify & 桌面日历 & Workflowy

    记忆复习:思源笔记 & SuperMemoopen in new window & kopiaopen in new window(备份) & Anki

    文本编辑:Visual Studio Code & Notepad++ & HbuilderX & WPS & office tab & MarkTextopen in new window & Slide & 方方格子 & Typora & Yu Writer & UltraEdit

    文字识别:TTimeopen in new window & 白描 & 天若 OCR & ABBYY Screenshot Reader OCR

    平面设计

    设计:Figma & SVG-Editoropen in new window & Stable Diffusionopen in new window(AI 绘图) & Photoshop & 字由 & GIMP & FastStone & illustrator & Dreamweaver & lightroom

    截图:Snipaste & ShareX & webshot & SETUNA

    图像管理:Honeyview & Eagle & PicGo 图床 & imageglass(界面好,但不支持全图拖拽和压缩包预览图片) & Google 相册 & 看图王 & 呱呱看图

    图像处理:PP 鸭(免费版单次 10 张)& gifski(动图)& RIOTopen in new window(压缩) & Inpaint(去水印) & PhotoZoom(无损放大) & 智图

    音频视频

    音频播放:foobar2000(MKing 皮肤open in new window)& MusicTagopen in new window & 163MusicLyricsopen in new window(云歌词下载,支持日文转罗马音)& Listen1 & 洛雪音乐助手open in new window & Moon FM(播客) & 百度音乐 & AIMP3 & 酷我 K 歌 & Airplay

    音频处理:Reaper+ Ultraschallopen in new window & Audacityopen in new window & iZotope rx9 & Audition & 神舌变声器 & Goldwave

    视频播放:Potplayeropen in new window & LAVFiltersopen in new window & madVRopen in new window & XySubFilter & VLC & 恒星播放器 & QQ 影音 & 暴风影音 & 射手,播放器设置参考 Potplayer + LAVFilters + madVR 配置教程open in new window

    视频剪辑:剪映 & LosslessCut(音频提取·视频切割合并) & ShanaEncoderopen in new window(视频压缩) & Quick Cutopen in new window (自动剪辑) & HandBrake(视频转换) & Premiere & Shotcut & 500th Video Converter & 小丸工具箱

    字幕工具:ChineseSubtitleConversionToolopen in new window(繁简转换)& Arctime Pro & VideoSrtopen in new window & 人人译视界

    视频下载:youtube-dlopen in new window & 哔哩下载姬open in new window & BBDownopen in new window(命令行式哔哩哔哩下载器)

    影视管理:tinyMediaManager(刮削),易影视(本地管理)

    屏幕录制

    录屏直播:OBS & Capturaopen in new window & SplitCamopen in new window (摄像头多开) & terminalizeropen in new window(终端录制) & ScreenToGifopen in new window & FlashBack Express

    换脸特效:Snap Camera(操作简单) & Avatarify Pythonopen in new window

    按键可视化:Carnacopen in new window & Keyvizopen in new window & ClickShowopen in new window & KeyCastOWopen in new window

    投屏工具:scrcpyopen in new window (手机投屏) & Macastopen in new window(手机视频投屏到电脑)& 蓝莓投屏

    效率工具

    快速启动:

    剪切板:Ditto & PinStack & CopyQ

    时间管理:ManicTime & Toggl Track & RescueTime(订阅)

    爬虫监测:OpenWebMonitor & spider-flowopen in new window

    本地搜索:Everything(拼音扩展open in new window) & AnyTXT Searcher(全文|OCR)& DocFetcher & Archivarius 3000

    文档管理

    重命名:FFRenamePro & SubRenameropen in new window(字幕批量重命名)& ReNamer & Bulk Rename Utility & 拖把更名器

    文本比较:Beyond Compare & WinMergeopen in new window(开源)

    局域网传输:FastCopyopen in new window & Snapdropopen in new window & LocalSendopen in new window & 局域网通讯 (酷安) & Send Anywhere & Pushbullet

    文件归档:Syncthing(异地同步) & GoodSync(同设备同步) & Dropitopen in new window(自动文件归档) & DropPointopen in new window(复制中转框)

    网盘同步:坚果云 & 阿里云盘 & 百度网盘 & 115 (转存脚本open in new window) & 亿方云 & 金山快盘 & 微云

    系统日常

    资源管理器:One Commanderopen in new window & Q-Diropen in new window & FreeCommander & QTTabBar(Win10) & 360 文件夹 & Clover(UI 不好看)

    浏览器:Chrome & Firefox(资源) & Brave(工具/书签) & Edge(移动端) & Tor & Vivaldi & Tor & 猎豹 & 360 & 搜狗 & Maxthon & 百度

    输入法:小狼毫 & Win+H(系统语音输入)& QuickCut & 讯飞语记 & 微软输入法 & 影子输入法 & 搜狗输入法 & 讯飞输入法 & 百度输入法

    通讯:TIM & 微信 & 飞书 & Telegram & Discord & 腾讯防撤回补丁open in new window & Slack & 钉耙 & 千牛 & 阿里旺旺

    下载:Aria2open in new window & IDM & Kinhdownopen in new window(百度云解析) & FDM(不支持 ed2k、磁力) & 迅雷

    杀毒:火绒 & 360 & 金山卫士

    压缩:Bandizip & PeaZip & 好压

    PDF:PDFelement & 文电通 & foxit 领鲜版(轻量编辑 PDF)

    硬件驱动:360 驱动大师 & Open Hardware Monitoropen in new window(旧电脑风扇转速) & Afterburneropen in new window(显卡风扇转速) & 图吧硬件工具箱open in new window & AIDA64 & SDI Snappy & 驱动精灵 & 鲁大师

    系统优化:PowerToysopen in new windowRBTrayopen in new window(最小化到托盘)、ContextMenuManageropen in new window(右键管理,遇过 bug,推荐火绒右键)、WizTree(磁盘空间分析)、优效日历、StartIsBack++、O&O ShutUp10++open in new window、Dism++、Windows Update Blockeropen in new window(禁止更新)

    低频工具

    编程工具:FileZilla(FTP)、PuTTY(SSH)、MobaXTerm(SSH)、GitHubDesktop、DBeaver(数据库open in new window)、Postman、Fiddler(手机抓包)、Regex Match Tracer

    翻译词典:DeepL & GoldenDict & 欧陆词典 & 有道词典 & QTranslate & Lingoes

    思维导图:TheBrain(无限思维扩展) & Xmind & MindManager

    虚拟机:VMware & VirtualBox

    远程管理:RustDesk & ToDesk & AnyDesk & Teamviewer & Remote Utilities & XT800

    卸载清理:IObit Uninstaller & Glary Utilities(注册表清理) & Geek Uninstaller

    护眼健康:Stretchlyopen in new window & EyeLoveU & iris & f.luxS

    偶尔使用:VeraCrypt(本地加密)、Recuva(文件恢复)、12306Bypassopen in new window、爱思助手、Bluestacks(安卓模拟器)、Ventoyopen in new window(制作可启动 U 盘)、微 PE 工具箱、傲梅分区open in new window

    飞书妙记:倍速、跳过空白片段、字幕搜索定位视频,将视频(最长 4 小时)转为文字大纲,了解视频梗概,建立基础认知。等到自己上手实操的时候,遇到问题直接搜索文字定位到相关内容,再看文字对应的视频截图确定配置细节。如果视频过大,可以提取音频来上传。[1]

    开源工具

    • Whipseropen in new window:自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。
    • Whisper Desktopopen in new window:Windows 本地音频转录的开源工具,支持音视频转录字幕,并且能够从麦克风捕获、转录或翻译实时音频。
    • CodeFormeropen in new window:使用 AI 算法修复图像和视频中的人脸。注意:路径与文件名不能出现中文。
    • AutoCutopen in new window:通过字幕来剪切视频
    • style2paintsopen in new window:一款给线稿上色的 AI 辅助工具。能够帮助用户给没有上色的图片,快速完成上色的 AI 工具,上色效果广受好评,完全免费开箱即用。
    • uncle-novelopen in new window:一个全网小说下载器及阅读器,可部署在 PC 和安卓上,目录解析与书源结合,支持有声小说与文本小说,可下载 mobi、epub、txt 格式文本小说。
    • VoceChatopen in new window:可以部署在网页的轻型客服系统?是否有其他开源选项。

    Android


    已弃

    • 全局手势:StrokesPlus.netopen in new window & WGestures
    • 桌面管理:Fences 3 & 火萤视频桌面 & UPUPOO & 360 桌面助手 & 搜狗桌面 & Q+
    • 进程管理:Process Lasso(避免老电脑卡顿?会自动删除启动项,不适合主力电脑)& Security Process Explorer(屏蔽垃圾进程)
    • 文件夹锁定/隐藏:Anvide Lock Folder
    • 桌面便签:小黄条、URNotes 意唯桌面便签 (2015 停止更新,复制经常出错)
    • 网络电台:龙卷风
    • 英文写作:易改
    • 流量管理:cFosSpeed
    • 游戏平台:VS & 4399
    • 客服:飞豆客服聊天助手 & mirai(qq 机器人)open in new window & 酷 Q(已关)
    • 其他:按键精灵、DisplayCal(屏幕)、One Quik(虚拟桌面切换)、Auslogics Disk Defrag(磁盘整理)、Reflector 3(手机投屏)、VoiceBot(声控游戏)
    • DockItopen in new window:主显示屏中,非全屏状态下,快速将窗口局部化。如何默认不全屏;应用不自动吸边?

    部分应用推荐来自 @vector090。


    1. 视频课程学习留档open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/ChatGPT.html b/apps/ChatGPT.html index a7980d1a..81f4049b 100644 --- a/apps/ChatGPT.html +++ b/apps/ChatGPT.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    ChatGPT

    约 5169 字大约 17 分钟...

    ChatGPT 是由 OpenAI 发布的聊天机器人模型,它不仅可以用于对话聊天,还能在专业领域提供有效的建议。为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 ChatGPT Shortcutopen in new window 页面。即使是初学者,你只需复制提示词,稍加修改后发送给 ChatGPT,就能获得指定输出,让你的生产力加倍!

    ChatGPT 客户端

    主要使用以下几个工具:

    第三方 API 客户端的优势:

    • 费用低:ChatGPT Plus 包月费用是 20 美元,平均而言每天需要 0.67 美元。相比之下,API 的费用每 1000 个 tokens 仅为 0.002 美元。这意味着,我使用 API 的话,每天可以使用 300 次 ChatGPT,而我每天实际也就只需要 100 次。
    • 限制少:API 限制相较于 ChatGPT 网页版也要少得多,最大 token 数量为 4096 个,而网页版仅有 2048 个。需要注意的是,提问和对话的所有文本内容都包括在 token 数量内。
    • 可移动性:ChatGPT 网页版对 IP 非常严格,使用人数多的服务商 IP 大多被封禁。与此相比,API 的限制要少得多,而且可以部署网页版,方便外出使用。

    ChatGPT Tips

    • 若要使用中文回复,请在倒数第二句插入条件 Respond in Chinese.
    • 为了保持描述的精确性,提示词请使用英文,而最后一句的定制条件可以使用任何语言,包括中文。
    • 后续回答中的定制条件可以使用引号 "" 框选,以防止被误认为是新的提示词。
    • 不要用 ChatGPT 解答数学问题,出错概率达 50%,推荐使用 Wolframopen in new window
    • ChatGPT Plus 目前不支持国内信用卡,偶尔出现过限流。
      • Depoy 虚拟卡:仅支持 USDT 充值,需通过 KYC 实名认证,月费 1 USD,充值费率为 1.35%(Min 1USD)。
      • VCC 虚拟卡:无需实名,开卡费 66 元,有效期一年,包一年代充。ChatGPT Plus 月费为 20 美元,按汇率折算人民币为 136 元,但商家实际收取 150 元,差价相当于支付了月费。

    Learn Prompting

    Learn Promptingopen in new window 有助于我们获得更好的效果,建议进阶学习。以下是一些 prompts 要点:

    • 在专业领域中,应尽量提供 Role Prompting(角色提示),比如「你是数学家」。
    • Prompt Debiasing(消除偏差):样本在提示中的分布和顺序可能会对 LLM 输出产生偏差。因此,样本选项应该均匀分布,并穿插出现。
    • Chain of Thought Prompting(思维链提示,CoT)是指指在样本中解释推理过程。LLM(大规模语言模型,比如 ChatGPT)在回答提示时会显示推理过程,这种对推理的解释通常会提升结果的准确性。例如,数学题中 LLM 提供的推理过程不对,你可以在 Prompt 中提供该步正确的范例。
      • 添加 Let's think step by step 可以让我们了解模型是如何逐步推理问题的,在算术、常识和符号推理任务中能有效改善结果。这个方法被称为 Zero Shot Chain of Thought,是 CoT 的简化替代版。
      • Self-Consistency(自我一致性)产生多个思维链而不仅仅是一个,然后以多数回答作为最终答案。

    相关信息

    下方内容为 ChatGPT Shortcutopen in new window 的初始版本,由于目录过长不方便使用,因此将不再更新,仅留作参考。

    文字

    写作

    点评/评鉴

    写作辅助

    • 文章标题生成器(Title Generator for written piecesopen in new window):我写的提示,根据文章内容生成相应语言的标题。
    • 中文写作助理:我写的提示,用于改进文字段落和句式。由于 ChatGPT token 数量的限制,超过 2048 字符的改写须使用 OpenAI Playground(4K token)。本提示暂未发到 Awesome ChatGPT Prompts,可自行复制使用。

      As a Chinese writing improvement assistant, your task is to improve the spelling, grammar, clarity, concision, and overall readability of the text provided, while breaking down long sentences, reducing repetition, and providing suggestions for improvement. Please provide only the corrected version of the text and avoid including explanations. Please begin by editing the following text: [insert original text here].

    • 同义词(Synonym finderopen in new window):输入 more of x,可列出 x 的多个同义词。
    • 箴言书(Aphorism Bookopen in new window):按要求输出鼓舞人心的名言和有意义的格言。
    • 疯子(Lunaticopen in new window):随机生成毫无逻辑的句子
    • 抄袭检查(Plagiarism Checkeropen in new window):判断输入句子是否在 ChatGPT 数据库中存在。
    • 写作建议(AI Writing Tutoropen in new window):提供写作改进方案和建议,但并不能直接帮你修改文档。(个人感觉只适合老师使用)

    生活

    趣味知识

    生活护理

    自我提升

    辩论/演讲

    心理/社交

    哲学

    老师/学术

    IT/编程

    程序员

    虽然说是编程,但 ChatGPT 是按照要求给出编程步骤的建议或简单的样例代码,这些代码只能作为测试,仍然需要专业程序员来修改。

    编程工具

    终端/解释器

    工具

    AI Prompt

    语言/翻译

    游戏

    导览

    其他工具

    行业顾问

    企业

    医疗

    金融

    音乐

    其他

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/Chrome.html b/apps/Chrome.html index ec20a0d9..821075a2 100644 --- a/apps/Chrome.html +++ b/apps/Chrome.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Chrome 扩展

    约 1150 字大约 4 分钟...

    常用 Chrome 扩展工具,链接多为 Chrome Web Store 项目页面。

    浏览器

    标签页

    链接批量

    图片视频

    监视爬虫

    网页优化

    实用工具

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/design.html b/apps/design.html index 03548caf..5f484360 100644 --- a/apps/design.html +++ b/apps/design.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    平面设计

    约 1529 字大约 5 分钟...

    电子白板

    在电子白板功能普及之前,我使用 Figma 对海报、图片素材进行简单剪辑,制作流程图。但是,电子白板的美观和自由度远远超过 Figma,我现在的流程图和示意图都是通过 Excalidraw 和 Canvas 完成的。

    Excalidraw

    Excalidrawopen in new window 是一款开源免费的手绘风格画图应用,可以简单地制作美观漂亮的流程图、示意图和开发架构图等常用图片,也支持插入图片,是一款自由便捷的电子白板应用。Excalidraw 已被集成到各类白板应用中。

    不过,Excalidraw 没有中文手写字体,需手动修改,比如 Excalidraw 官方版添加中文手写字体open in new windowObsidian 中文手写体设置open in new window网页端中文手写字体配置open in new window

    手绘样例

    Canvas

    Canvas(画布)是所有 UI 组件的「容器」。一个场景中,可以允许多个 canvas 对象存在,也允许 canvas 之间进行「嵌套」使用。需要注意的是,场景中的任何一个 UI 对象,都必定是某个 canvas 对象的「子级」。我最常用的是 Obsidian 和秒笔的 Canvas 功能:

    • Obsidian Canvas:可以将图片、视频、文本、网页、文件和 Excalidraw 聚合在一起,并建立连接线和分组。

      等后续替代本图
      Obsidian canvas 样例
    • 秒笔白板:支持聚合图片、文本、表格、清单、看板和 Excalidraw,但根据作者回复,妙笔的连接线和分组功能会在 2023 的下半年才摆上开发计划。

    一些页面图标路径是隐藏的,无法在前端获取,可以使用 ImageAssistantopen in new window 扩展提取页面所有图片,或者通过搜索引擎搜索,获取网站提交给搜索引擎的 logo 图片。

    如果获取的图标较小,可以使用 waifu2xopen in new window 进行最大降噪,然后多次放大 logo。其他放大算法会令 logo 变化,而 waifu2x 不会改变原图。

    如果图标 svg 不符合要求,可以使用 SVG-editopen in new window 进行简单编辑。

    Eagle

    Eagle 非常适合管理图片素材。其优势之一是去重,我的素材库有几十万个文件,无法一个个清理,但导入 Eagle 就可以去除重复素材。

    Eagle 导入流程:搜索文件夹中的 ZIP/RAR 文件,确认全部解压。

    字体

    字体是海报的灵魂,直接影响传播效果。商务性海报中,推荐使用阿里妈妈数黑体。另外,主标题不要使用纯黑色,建议使用 #1F2937

    以下是我常用的几种字体:

    • 阿里巴巴普惠体 2.0open in new window:简称「Alibaba PuHuiTi 2.0」,免费可商用,覆盖中英文。
    • 阿里妈妈数黑体open in new window:简称「Alimama ShuHeiTi」,数黑体为中文简体字库,适用于电商、广告、品牌形象、推广物料等场景。
    • 思源字体open in new window:简称「Source Han Sans」,这是比较规规矩矩的一款字体,谷歌出品。用在商务风 PPT,或者是用在正文中,阅读效果都很赞。
    • FOT-MatisseProopen in new window:原本为 EVA 的常用日语字体,也支持大部分的繁体。
    • 优设标题黑open in new window:简称「YouSheBiaoTiHei-2」,以黑体字型为基础,整体字形沉稳,同时采用较大字面和粗壮的笔画来强化力量感。每个字体水平倾斜 8° 的设计,赋予了字体极强的速度感,为了让字体倾斜后也能保持稳固,设计师将整体字身设定宽扁。而起笔和弯钩上独具匠心的尖角设计,不仅突显了设计的几何感,而且方便后期修改。
    • 优设好身体open in new window:简称「YSHaoShenTi-2」,一款亲和力、现代感极强的专业美术标题字体。它以圆体字型为基础,通过瘦高的字面、偏向几何的曲线,让整宽字体富有亲和力和时尚感。在同样的面积里,更窄的字面就意味着能容纳更多的信息,所以这款字体非常适用在需要体现亲和力与时尚感的各类品牌宣传广告和产品包装设计的标题上。
    • 851 手书体open in new window:851 手書き雑フォント,虽为日系字体但覆盖了大部分的中英文,是以硬笔为主的手写字型,我喜欢用在 Excalidraw。
    • 濑户体open in new window:简称「SetoFont」,是一款偏可爱风的字体,支持简体中文、繁体中文、日文。
    • 杨任东竹石体open in new window:手写字体,简称为「YRDZST」。
    • 得意黑字体open in new window:非手写字体,但用在 Excalidraw 也不错。
    • 锐字真言体open in new window:简称「Zhenyan」,真言体笔触浑厚有力,笔画曲折有度,字形个性鲜明,刚柔并济,落笔简洁有序,给人以遒劲有力、端正凝练的感受。直角与圆角的错落搭配使得字体婉转有度,落落大方,具有自己独到的风格!这款字体特别适用于文字标题、竞技视觉、广告设计、个性品牌设计推广、企业宣传及时尚品牌的设计应用。

    字体格式建议 OTC > OTF > TTC > TTF,如果只在 Windows 平台使用,TTC/TTF 体验更佳。如果您是一名设计师并进行大量的印刷设计,您可以使用 Adobe 软件进行大量工作。在这种情况下,建议使用 OTF 字体,因为 .otf 是 基于 postscript(类似于 PDF) 并由 Adobe 开发。OTF 格式还提供了更多风格的替代方案和字距调整选项,设计师可能会觉得这些 选项有用。如果您使用 MS Ofce 进行大量工作时,建议使用 TTF 字体,因为 .ttf 是由 Microsoft 和 Apple 开发的。例如:您只能将.ttf 字体嵌入到 MS Word 和 MS PowerPoint 中,而不能嵌入 .otf 字体。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/index.html b/apps/index.html index a19e977c..240a43f9 100644 --- a/apps/index.html +++ b/apps/index.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Apps

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/livestreaming/0_live_equipments.html b/apps/livestreaming/0_live_equipments.html index 27b6ced8..855b17d2 100644 --- a/apps/livestreaming/0_live_equipments.html +++ b/apps/livestreaming/0_live_equipments.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    直播入门攻略零 | 硬件篇:直播设备

    工具直播约 1611 字大约 5 分钟...

    直播已经成为一种主流的传播方式,几乎所有的行业都会使用它。经过两年的持续直播,我总结出了一套直播入门攻略,从设备、软件和技巧三个方面,帮助你快速入门直播,开始自己的直播之旅。

    本文是直播入门攻略的前置篇,主要介绍直播所需的设备,以及如何避免购买不必要的高价设备。直播设备可分为电脑、补光灯、稳定器(三脚架)、音频采集(收音器)和视频采集(摄像头)。

    电脑

    OBS 直播对电脑配置要求较高,建议使用三年内购买的主流配置台式机。台机推荐预算在一万元以上,显卡为 3060 以上,内存为 32G。

    补光灯

    露脸主播一定要配柔光灯或环形灯,可以提升颜值。如果带眼镜的话,可以用小型补光灯代替环形灯,以免反射出光圈影响视觉。补光灯可以放在正面 45 度成蝴蝶光(派拉蒙光),可以显瘦显轮廓;背后可以使用辅助光或一张白纸反光,以防止正面灯光太亮。

    三脚架

    三脚架主要有两类:桌面款,建议高度为 55cm;站立款,建议高度为 210cm。价位从 10-500 元不等,效果无明显区别,新手用户的三脚架预算建议不要超过 100 元。

    音频采集

    收音设备的费用从几元到几千元不等。手机的收音性能比绝大多数话筒好,如果你使用手机摄像方案,可以先不用购买收音器材。

    廉价麦克风存在收音范围窄、不清晰、多噪音等问题,但价格低廉、使用方便,适合新人测试使用。

    桌面直播多使用「声卡 + 话筒」方案,预算需要超过一千元。不要购买廉价的山寨声卡,还不如手机收音来得清晰。

    外出直播或进阶用户推荐 RODE 或 DJI 的无线麦克风,这两款音频水准都可以吊打同行。RODE 是老牌话筒厂家,音质有保障;DJI 麦克风推出不久,但集百家之长,设计非常人性化,小白使用也很方便。

    视频采集

    桌面摄像头、手机和微单相机都可以作为直播的视频采集来源。

    摄像头

    桌面摄像头的价格在 50-1000 元不等,但实际效果没有太大的区别。个人体验过罗技 C930 后,发现画面模糊不清晰,将问题反馈给客服后得知,画质不清晰是桌面摄像头的通病。

    不管是几十元的廉价摄像头还是上千元的罗技 C1000,它们的实际像素都只有 200 万。宣传中的 2000 万像素是通过软件放大的效果,画质并没有实质性的变化。入门用户可以选择 100 元的自动变焦摄像头。

    桌面摄像头搭配三角架可以调整更佳的角度,购买时要注意摄像头是否有三脚架接口

    手机

    如果室内没有桌面摄像头,而又想用电脑做直播推流,可以考虑用手机替代摄像头,步骤可参考下方介绍。

    相机

    相比摄像头的算法像素效果,只有相机才能达到真正意义上的高清直播。

    如果你的相机有外接视频接口(例如:HDMI、mini HDMI、SDI),可以通过视频采集卡将相机视频转为直播视频传入电脑。索尼、佳能等主流相机都有专门的直播软件,不需要采集卡就可以直接连接电脑进行直播。运动相机 GoPro 也已经支持相机直播传输,希望国内厂商也能跟上。

    将相机用作摄像头的费用较高,一般需要几千到几万,只建议已购买相机的主播采用此方案。

    手机作摄像头

    Camo

    Camoopen in new window 专用于 iOS 设备,连接数据线后可将 iPhone 或 iPad 变为直播摄像头。

    NDI

    NDI 是最稳定的,可自由调节拍摄参数。打开 NDI 应用后,需等待 NDI 界面周边出现绿框或红框,OBS 才可以识别到摄像头。不过 NDI 是收费应用,安卓用户可使用 NDI 调试 APKopen in new window

    IP Webcam

    IP Webcamopen in new window 在推流稳定性方面表现一般,偶尔出现丢帧,但对于个人直播使用来说,免费版本已经足够。你可以在 Google Play 上安装它,或使用国内的备用下载链接open in new window

    以下是 IP Webcam 的基本设置步骤:

    1. 滑动至应用底部,点击「开启服务器」,即可开始使用手机摄像头进行推流。
    2. 画面下方会显示一些类似 http://192.168.2.234:8080 的地址,请在局域网浏览器中打开此地址。
    3. 在浏览器中,你可以调整 IP 摄像头的推流设置。将流畅度设置为 90%,视频分辨率设为 720p,这可以有效减少卡顿。IP Webcam 的耗电量较低,适合长时间手机直播,并支持多种方式,包括视频和浏览器等。
    4. 在 OBS 中,选择「场景」>「来源」>「媒体源」,取消勾选本地文件,然后在「输入」中输入 IP 摄像头的视频地址,例如 http://192.168.2.234:8080/video。或者使用浏览器推流模式,在 OBS 中,选择「场景」>「来源」>「浏览器」,在「URL」中输入 IP 摄像头的全屏浏览器地址,例如 http://192.168.2.234:8080/jsfs.html。请注意:浏览器推流可能会导致闪烁。

    其他

    如果出现闪退等问题,可尝试使用 iriun webcam、DroidCam 和 ivcam。

    不推荐使用无他伴侣,尽管国内有大量教程介绍它,但使用中会出现很多问题,例如:摄影角度很难控制;无法使用 FaceRig 等变脸应用;直播 10 分钟后,摄像头经常自动与 OBS 断开连接;直播 2 小时后,OBS 无法检测到无他伴侣。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/livestreaming/1_obs_basic.html b/apps/livestreaming/1_obs_basic.html index 5143e55a..5dca577e 100644 --- a/apps/livestreaming/1_obs_basic.html +++ b/apps/livestreaming/1_obs_basic.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    直播入门攻略一 | OBS 篇:OBS 29 新手指南

    工具OBS直播约 2695 字大约 9 分钟...

    Open Broadcaster Softwareopen in new window(OBS)是一款免费开源的视频录制和直播应用,支持 Windows、Mac 和 Linux 平台。大部分直播软件都是基于 OBS 内核开发的。无论你准备在哪个平台直播,OBS 都是最推荐的直播入门软件。本文将从基础开始,为新手介绍 OBS 的界面、设置和直播使用方法。

    主界面

    OBS 界面看起来有些复杂,但可以分为菜单栏、预览区、主按钮区和运行状态四个区块。日常使用中,我们只需要接触主按钮区,它包括场景、来源、混音器、转场特效和控制按钮。

    OBS 主界面

    场景

    场景(Scenes)是指直播中不同的场面。不同的场景可以用于不同的领域或场合,例如自习室场景、街拍场景、个人访问、卖货直播。

    场景有四个按钮,从左到右依次为:添加场景,删除场景,向上移动场景,向下移动场景。

    场景按钮

    来源

    来源(Source)是指场景中的素材,比如摄像头画面、图像、音频等。来源区有 7 个按钮,上方两个为源属性和滤镜,下方 5 个按钮依次为:添加来源,删除来源,源属性,向上移动源,向下移动源。

    来源按钮

    混音器

    混音器(Audio Mixer)是直播的音频控制器。点击混音器左下角的齿轮按钮,进入「高级音频属性」,可管理所有的音频设备。

    混音器设置中,「音频监听」最为重要。默认为「关闭监听」,指音频仅对直播间观众播放,主播听不到。「仅监听 (输出静音)」表示观众听不到,但主播能听到,观众可通过主播话筒的收音听到声音。「监听并输出」表示主播和观众都能听到。「监听并输出」模式中,建议主播使用耳麦,而不是话筒,否则观众容易听不清主播说话的声音,话筒声音会被输出音频盖住。

    直播高级音频属性

    转场特效

    转场特效(Scene Transitions)指的是在两个场景或素材之间,采用渐变、移动、滑入滑出等技巧,实现场景或情节之间平滑过渡的效果。

    控制按钮

    控制按钮(Controls)区域集成了 OBS 的核心功能,按钮分别为「开始直播」「开始录制」「启动虚拟摄像机」「工作室模式」。

    「启动虚拟摄像机」是将 OBS 场景作为摄像头画面对外输出,适合将画面输出到不支持 OBS 推流的平台或软件。例如,抖音直播要求粉丝在一万以上才能使用 OBS 推流,而启用虚拟摄像头后,将直播摄像头设为「OBS-Camera」即可达到类似推流效果。

    「工作室模式」下,显示区域会分为两块:左侧为预览区,右侧为输出区。点击中间按钮「转场特效」,即可将左侧预览区输出到直播画面。

    工作室模式

    设置

    在使用 OBS 直播前,请先点击右上角菜单栏中的「文件」>「设置」,调整 OBS 的设置。

    直播

    点击「设置」>「直播」,将「服务」调整为自定义,服务器和推流码则按平台要求输入。

    推流服务器设置

    输出

    点击「设置」>「输出」,将「输出模式」设为高级,其他设置参考下方样例。

    • 「直播设置」>「编码器」中,如果你的显卡配置不错,尽量选硬件编码,如 NVIDIA NVENC H.264
    • 「编码器设置」>「比特率」用来设置直播的清晰度,推荐 4000-6000 Kbps。注意:直播并非越清晰越好,它对网络稳定性要求较高,过高的清晰度可能导致直播卡顿。我的自习室直播间只有 2500 Kbps。
    直播输出设置

    音频

    点击「设置」>「音频」>「通用」,将声道设为单声道。除非你是歌唱主播,否则无需使用立体声。

    视频

    点击「设置」>「视频」,按需设置直播分辨率,通常为 1920x10801280x720。如果你是做电商直播,需要进行竖屏直播,就将分辨率反过来设置,比如 1080x1920720x1280。「输出(画布)分辨率」与「基础(缩放)分辨率」建议设为相同数值,避免出现缩放问题。

    「常用帧率」在日常直播中只需要 30,游戏直播建议调整到 60。

    直播分辨率设置

    高级

    点击「设置」>「高级」,将「进程优先级」设为高,以降低电脑卡顿的概率。然后,启用「直播延迟」和「自动重连」功能,以避免直播事故的发生。「直播延迟」启用后,观众看到的直播画面会比实时要慢,延迟时间一般为 3~20 秒。

    OBS 高级设置

    直播来源

    了解 OBS 界面和设置后,我们回到主按钮区的「来源」,深入了解来源种类和滤镜。直播来源种类繁多,可以分为四类:静态来源、音频来源、视频来源和组合来源。

    直播来源

    静态来源

    • 文本(GDI+):添加文字,并可设置背景和移动效果。
    • 色源:添加指定色彩的纯色画面素材。
    • 图像:添加静态图像素材。
    • 图像幻灯片放映:以幻灯片形式播放指定图像文件。
    • 浏览器:以浏览器方式显示网址内容或打开本地 html 文件。

    音频来源

    • 音频输入采集:话筒输入。
    • 音频输出采集:音响输出。
    • 应用程序音频捕获:获取指定应用程序的音频输出。

    视频来源

    • 视频采集设备:捕获设备的视频画面,多用于摄像头。
    • 窗口采集:捕获指定程序的窗口画面。使用窗口采集时,窗口不能最小化,否则窗口会卡住不同步。
    • 游戏源:采集游戏画面。
    • 显示器采集:捕获单个显示器的完整视频画面。
    • 媒体源:播放本地或在线的音视频文件。
    • VLC 视频源:安装 VLCopen in new window 才能启用本来源。「VLC 视频源」用于多个音视频按序播放,支持字幕。

    组合输出

    • 场景:将指定场景作为来源输入当前场景中。
    • 来源镜像:将指定来源复制到当前场景。
    • 分组:将来源置于同一分组,可批量更改可见性和锁定状态。

    滤镜

    选择「来源」>「滤镜」,可对来源素材进行裁剪、过滤、增益等多种处理。滤镜可分为效果滤镜和音视频滤镜。下文将介绍几种常用滤镜。

    常用滤镜

    • 裁剪/填充:效果滤镜,对来源进行裁剪,剪去多余的部分。
    • 噪音阈值:音视频滤镜,当背景有噪音时,设置噪音阈值来控制底噪,降低噪音干扰。
    • 增益:音视频滤镜,当麦克风声音过大或过小时,可以通过增益滤镜调整音量,但是不宜设置数值过大,容易造成声音失真。

    色度键(抠图)

    「色度键」属于效果滤镜,能将指定颜色变为透明,多用于绿幕实时抠图,可以在直播时把绿幕替换为其他场景。

    色度键滤镜一键抠图
    色度键滤镜一键抠图

    模糊

    「模糊」属于效果滤镜,可将指定区域模糊化以维护隐私。推荐设置:类型设为「Dual Filtering(双重过滤)」,大小为 4,应用蒙版后可以选择模糊区域。与 Gaussian 类型相比,Dual Filtering 生成模糊效果最快,对配置要求更低。要使用模糊滤镜,需要安装插件 StreamFXopen in new window

    右侧为模糊效果
    模糊滤镜设置

    图像蒙版

    「图像蒙版/混合」属于效果滤镜,可在摄像头(视频采集设备)上添加定制外框。其中,最常用的应用是主播圆形头像。类型选择「Alpha 蒙版(Alpha 通道)」,路径选择头像形状图片。头像形状图片可任意定制,比如在 1920*1080 的画布上画一个圆形,并填充黑色,其他区域为透明,然后将其导出为 PNG 格式。如果你不想自己画,也可以使用下方示例图片。

    色彩校正

    色彩校正open in new window(Color Grading)属于效果滤镜,使用伽玛、对比度、亮度、饱和度、色调偏移、不透明度、颜色叠加、添加颜色来改变或校正最终画面的颜色和亮度。

    色彩校正

    应用 LUT

    「应用 LUT」属于效果滤镜。它使用 LUT 对画面进行色彩调整,相当于手机修图用的风格滤镜,能够大大提升画面效果。初期可以使用我的 LUT 设置open in new window,「路径」指向解压后的 png 文件。

    自制 LUT 文件参照下列步骤:

    1. 将 OBS 滤镜插件目录下的 original.png 复制到 Photoshop。
    2. 进入 Photoshop 右侧的调整界面,选择第二行的最右侧「创建新的颜色查找调节图层」。
    3. 载入自带的 3DLUT 文件,调整后导出为 png 文件。这个 png 就是直播能用的 LUT 文件。如果自带 LUT 不能满足需求,则使用 Premiere 调节定制 LUT cube 文件。

    常见问题

    直播延迟严重

    选择「设置」>「高级」,检查「直播延迟」是否启用了。主流机器不会导致直播严重延迟,出现延迟的原因多是因为启用了「直播延迟」设置。

    一直断开重连

    右下角弹出提示「OBS Studio 已断开连接。正在重新连接...」,这说明直播服务设置错误。选择「设置」>「直播」,更新服务器和推流码内容。注意:某些平台只要断开,推流码就会改变。

    后续

    我原本想一篇写完 OBS 的入门,但基础使用已经占据了较长篇幅。为了避免重蹈上一篇的覆辙,OBS 插件的介绍会放在篇二更新。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/livestreaming/2_obs_streamfx.html b/apps/livestreaming/2_obs_streamfx.html index 97f70e23..fc814ffa 100644 --- a/apps/livestreaming/2_obs_streamfx.html +++ b/apps/livestreaming/2_obs_streamfx.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件

    工具OBS直播约 1473 字大约 5 分钟...

    StreamFX 提供了来源镜像、模糊滤镜、着色器滤镜等多种效果,是 OBS 必装的效果插件。本文将介绍 StreamFX 的 28 种滤镜效果。

    安装 StreamFX

    StreamFX 发布页open in new window上按平台选择安装包。StreamFX for OBS 29 处于测试阶段,在升级此插件前,请按照卸载教程open in new window执行旧版清理。

    安装成功后,StreamFX 会出现在 OBS 上方的菜单栏上。下文中,我将使用不同滤镜处理样图,并提供对比图。

    样例原图

    来源镜像

    来源镜像open in new window(Source Mirror)是一种来源,而不是滤镜。它可以克隆任何源或场景,并将其应用于当前场景。对来源镜像叠加滤镜和任意效果,都不会对原始来源造成影响。

    3D 转换

    3D 转换open in new window(3D Transform)可以将 2D 图片的坐标系转换为三维,从而可以自由旋转、移动和缩放,形成类似星球大战中的字幕特效。

    3D 转换

    模糊

    模糊open in new window(Blur Filter)提供五种模糊类型:Box、Box Linear、Gaussian、Gaussian Liner 和 Dual-Filtering。一般来说,建议将类型设置为「Dual Filtering(双重过滤)」,大小为 4,应用蒙版后可以选择模糊区域。与 Gaussian 类型相比,Dual Filtering 生成模糊效果最快,对配置要求也更低。

    右侧为模糊效果
    模糊滤镜设置

    动态蒙版

    动态蒙版open in new window(Dynamic Mask)允许叠加任意来源或场景,并使用红色、绿色、蓝色和 alpha 通道建立画面蒙版。下图展示了使用红色通道叠加雨滴来源的效果。

    动态蒙版

    SDF 特效

    SDF 特效open in new window(Shader Signed Distance Field Effects)仅对拥有透明图层的画面有效,比如被移除背景后的摄像头画面。SDF 特效会对外观轮廓进行发光处理,并占用大量显存性能。![什么是 SDF?open in new window] !["SDF Effects" filter is undocumentedopen in new window]

    SDF 特效-外发光+变形

    着色器

    着色器滤镜位于 %ProgramFiles%/obs-studio/data/obs-plugins/StreamFX/examples/shaders/filter,后缀均为 .effect。切换着色器文件后,需点击「刷新选项和参数」。

    色彩滤镜

    • colorize:对画面重新着色,效果与色彩校正滤镜相似。

      colorize
    • posterize:向上下周围放入像素值。

      posterize
    • smaa:将画面的轮廓线条化。

      smaa

    位移变换

    • bulge_pinch:挤压滤镜,使图像的中心产生凸起或凹下的效果,可生成循环凸凹的动画。


    • displace:置换滤镜,可以产生弯曲,碎裂的图像效果。置换滤镜比较特殊的是设置完毕后,还需要选择一个图像文件作为位移图,滤镜根据位移图上的颜色值移动图像像素。

      displace
    • drunk:画面随机晃动

      drunk
    • swirl:漩涡打旋效果,可调整旋涡位置和大小,并可呈现漩涡的正反转动态效果。

      swirl
    • wave:波浪滤镜是通过坐标变换来模拟水波效果,使图像呈现出水波的扭曲特效。

      wave
    • zigzag:使图像产生同心圆状的波纹效果。

      zigzag

    画面遮盖

    • pixelation:像素化滤镜,可选择滤镜范围。

      pixelation
    • hexagonize:用六角形状元素重构画面,可调节蜂窝元素的大小。

      hexagonize
    • semiline:百叶窗栅格形滤镜,让画面像被一个关闭中的百叶窗遮盖。

      semiline
    • blur-gaussian:模糊滤镜效果(高斯),对硬件配置要求高。

    增强滤镜

    • vignette:晕影/虚光照,用以增强镜头感,突出拍摄主体,营造画面的意境氛围。

      vignette
    • rounded-rect:圆角矩形渲染

      rounded-rect
    • crt-curvature:将画面放置于 CRT 电视中,可调整画面曲率和四周的光晕颜色。

      crt-curvature
    • crt-scanlines:仿 CRT 扫描线效果。

      crt-scanlines
    • repeat:将画面复制排列,例图是 3x3 复制画面。

      repeat
    • fxaa:快速近似抗锯齿,是一种「比较廉价」的抗锯齿技术,多用于游戏直播/录制,适用于性能不高的电脑配置。

    N 卡滤镜

    本部分的滤镜需要需 NVIDIA 2060 及以上显卡,并安装 NVIDIA Video Effects & AR SDK Redistributableopen in new window。这些滤镜效果均可用 NVIDIA Broadcast 实现。

    • 画质提升open in new window(Upscaling):提升画质分辨率,可以将老式摄像头提升到 4K 画质。

    • 降噪open in new window(Denoising Filter):对画面进行降噪。

    • 自动帧open in new window(Auto-Framing):通过 NVIDIA AR 的自动追踪人脸技术,自动裁剪和放大用户、并且在用户移动时保持帧居中。

    • 英伟达背景移除open in new window(Virtual Greenscreen):无需绿幕也能帮你移除人像背景,移除效果略逊色于 NVIDIA Broadcast。样图是用的是漫画,如果是真人画面,移除效果会好很多。

      人像背景移除
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/livestreaming/3_obs_plugins.html b/apps/livestreaming/3_obs_plugins.html index 99d7aed2..08ba23e2 100644 --- a/apps/livestreaming/3_obs_plugins.html +++ b/apps/livestreaming/3_obs_plugins.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    直播入门攻略三 | 插件篇:OBS 进阶插件

    工具OBS直播约 974 字大约 3 分钟...

    OBS 与其他直播/录制应用最大的区别在于 OBS 社区,它给 OBS 带来了强大的扩展性。下文中我会介绍除 StreamFX 外的 15 款流行插件。(本文未完成,待填充)

    插件安装与卸载

    OBS 插件的安装模式有 Install(注册配置)和 Protable(便携)两种。便携模式的插件配置可以复制到其他电脑上使用。

    若要卸载 Windows 下的 OBS 便携模式插件,可以进入 %ProgramFiles%\obs-studio\data\obs-plugins%ProgramFiles%\obs-studio\obs-plugins\64bit,搜索插件名,然后删除相关文件。

    多平台直播:multi-rtmp

    multi-rtmpopen in new window 使得 OBS 支持多地址推流,以为着同时在多个平台上进行直播。

    开启多地址推流前,你需要点击控制按钮「开始直播」,然后再点「停止直播」。

    自动切换场景

    Advanced Scene Switcheropen in new window:使用「宏」来自动完成各种任务,按条件切换场景、来源。比如,电脑闲置 10 分钟后,让摄像头来源变为不可见。

    Move transition

    Move transitionopen in new window:记录来源的位置变化,生成元素移动的动画效果。比如,视频演讲时,将摄像头位置从屏幕右下移动到中央。

    Transition Table

    Transition Tableopen in new window:场景切换效果,设定不同场景间的切换规则。

    Source Dock

    Source Dockopen in new window:为单独场景或来源建立控制栏,使用小窗口预览场景。

    Source Copy

    Source Copyopen in new window:更方便地复制、保存场景设置。

    其他

    美化插件

    第三方的直播美化插件提供了时钟、榜单、弹幕、游戏等互动来源,用于美化直播间,新手可参考使用。美化插件免费版一般足够用了,比如 咩播open in new window智播open in new window

    弃用插件

    以下插件已弃用,仅作记录:

    更多

    如果你在上文中没有找到你需要的功能功能,可以访问 OBS 插件库open in new window进行搜索。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/livestreaming/4_live_effects.html b/apps/livestreaming/4_live_effects.html index de1489f3..cb6796b8 100644 --- a/apps/livestreaming/4_live_effects.html +++ b/apps/livestreaming/4_live_effects.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    直播入门攻略四 | 特效篇:美颜、变声、多开、虚拟主播

    工具直播约 1344 字大约 4 分钟...

    虽然 OBS 的功能已经非常强大,但通过第三方软件可以更简单地给我们带来美颜、变声、虚拟主播等特效。

    美颜

    推荐使用 YY 开播open in new window来实现直播美颜功能。

    打开 YY 开播,调用摄像头摄像,开启美颜功能。然后,在 OBS 中调用 YY 开播,如果有绿幕,可以添加「色度值」滤镜进行视频抠图。一旦配置好,下次启动 OBS 时,软件会自动调用 YY 开播开启美颜,无需重复配置。但是,「美颜 + 直播」对电脑配置的要求较高,如果直播画面出现明显卡顿,建议关闭 YY 开播。

    使用注意

    • 剧烈运动时,不要开美颜直播,否则容易卡顿。
    • 不要开启 YY 直播中除美颜外的功能,如虚拟背景、虚拟形象等,否则直播中的画面背景无法透明化。

    变声

    直播变声可以通过硬件和软件两种方式实现。软件变声器,如 MorphVOX Pro 和神舌,对使用者的语气要求较高。我在淘宝找人进行了声音精调,但效果仍然无法仿真。店家发的语气教程也没有太多参考价值,初学者很难入门。硬件变声器的效果更加糟糕,强烈不推荐。

    虚拟主播

    如果不想录脸直播,可以配合软件使用虚拟形象直播。此类换脸软件会占用较高的 CPU,需要使用三年内的主流配置。

    Snap Camera

    Snap Cameraopen in new window 是 SnapChat 的免费增强现实应用。它可以帮助你在电脑直播/录屏时实现挡脸头套、美化滤镜等特效。如果你熟悉 3D 建模,可以使用 Lens Studio 定制属于你自己的变脸特效。但需要注意的是,当你喝水、低头或脸部被遮挡时,脸部特效会失效。

    Snap Camera 效果图
    Snap Camera 效果图

    如果你无法使用 Snap Camera,可以尝试 FaceRig 和 PrprLive。

    FaceRig

    FaceRigopen in new window(Steam 已停售)可以通过对五官的动作捕捉,让卡通脸的表情进行同步变化,但不能对头部以下的部分进行捕捉和同步。使用时,需要打开 FaceRig 中的「切换广播」,否则 OBS 窗口会显示为黑屏。

    FaceRig 演示图
    FaceRig 演示图

    注意:百度搜索 FaceRig 的首个结果是虚假官网,价格高且无保障,不要在上面进行购买。

    PrprLive

    PrprLiveopen in new window 是国内的变脸软件,基础版免费,同样在 Steam 销售,付费前先试试基础版。

    动态素材

    为了丰富直播场景,可以使用带绿幕的视频来添加动态特效,或者借助类虚拟主播技术来实现交互。例如 Bongo Cat Mveropen in new window,它能实时同步键盘与鼠标状态,增加直播趣味性。如果你使用的是 Bongo Cat 全键盘同步模型,建议打乱映射规则,以防止隐私泄露。

    直播间的猫咪
    直播间的猫咪

    摄像头多开

    摄像头默认只能被一个应用调用。借助 SplitCamopen in new window,你能在摄像头画面上叠加元素,使用镜像、高亮滤镜微调画面,还能让摄像头画面同步给多个应用。

    例如,摄像头可以同时用于 OBS 直播和 Capture 录屏,在不同用途上可以叠加不同滤镜和特效,呈现出不同的画面。

    使用流程

    1. 打开 SplitCam,选择默认摄像头。
    2. Snap Camera、Capture 等第三方调用摄像头时,选择「SplitCam Video Driver」。

    其他应用

    NVIDIA BROADCAST

    如果你使用的是 NVIDIA 显卡,强烈推荐安装 NVIDIA Broadcastopen in new window。它利用 AI 的强大功能将标准网络摄像头和麦克风升级为高端智能设备,通过麦克风去噪、房间回声消除、虚拟背景、网络摄像头人像跟踪和视频降噪等 AI 功能,提高直播的视频和音频质量。通过 NVIDIA RTX GPU 上搭载的名为 Tensor Core 的专用 AI 处理器,AI 网络能够实时运行高质量的效果。

    小葫芦弹幕助手

    小葫芦弹幕助手open in new window可实时显示网友的互动和打赏,尤其适合游戏直播。但是,由于弹幕答谢、自动定时弹幕、手动弹幕等功能已暂停,不建议新手充值会员。

    如果不需要在直播界面中显示弹幕,不要安装小葫芦弹幕插件。安装后,会影响 OBS 窗口捕获功能,无法抓取基于 Electron 的应用界面,从而导致窗口捕捉黑屏。解决方法是删除 C:\Program Files\obs-studio\obs-plugins\64bit 目录内的 CalabashDanmuPlugin.dllCalabashWinCapture.dllObssDanmuInfo.dll,重启 OBS 即可恢复,但下次使用弹幕助手时,这三个文件会自动安装,黑屏问题复现,只能重新删除指定文件。

    小葫芦直播助手集成了 OBS 和弹幕助手的功能,但为了直播的扩展性,仍然建议从 OBS 入门。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/livestreaming/5_live_platforms.html b/apps/livestreaming/5_live_platforms.html index 87672aba..25a775d0 100644 --- a/apps/livestreaming/5_live_platforms.html +++ b/apps/livestreaming/5_live_platforms.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    直播入门攻略五 | 平台篇:主流直播平台介绍

    工具直播约 1096 字大约 4 分钟...

    主流直播平台有淘宝、京东、抖音、快手、视频号、哔哩哔哩、小红书、微博直播、斗鱼、虎牙和 YouTube。接下来,我将逐一介绍如何使用 PC 端的 OBS 在这些平台上进行直播。

    淘宝直播

    1. 下载淘宝直播客户端open in new window,打开后点击「我要开播」,进入直播间界面。

      淘宝直播设置
    2. 在左侧点击「添加元素」>「摄像头」,选择「OBS-Camera」,即可同步 OBS 直播画面。淘宝直播客户端也是基于 OBS,但不支持推流直播,只能通过虚拟摄像头同步画面。

    除了客户端,还可以通过直播中控台open in new window来设置淘宝直播间。

    抖音直播

    1. 下载直播伴侣电脑端open in new window,它可以适配西瓜视频、抖音、抖音火山版的直播。

    2. 在左侧点击「添加元素」>「采集」,选择「OBS-Camera」(摄像头较多时,可下滑选择),设置采集自定义音频设备为「OBS-Audio」,声音改为单声道。

      抖音直播设置

    以上为抖音新手的电脑直播步骤,如果你的抖音粉丝在一万以上,可以使用 OBS 模式推流open in new window

    快手直播

    快手直播无需 PC 客户端,可在快手云直播open in new window页面配置直播间,支持 OBS 模式推流直播。若直播断流超过 2 分钟或直播超过 7 天,则会自动下播。

    视频号直播

    要使用电脑直播视频号,需要先完成视频号认证open in new window

    视频号认证最重要的一环是有效关注数 1000 人以上,可疑和外挂用户都不包含在有效人数内。达到 1000 有效粉丝后,就可以在视频号助手网页端发起直播推流了。

    B 站直播

    哔哩哔哩可以在直播姬客户端open in new windowB 站直播间网页端open in new window上进行在线直播。直播封面必须包含图像,不支持纯文本封面。

    如果你主做 B 站直播,可以试试哔哩哔哩直播机器人神奇弹幕open in new window,它集成了弹幕姬、答谢姬、点歌姬、回复姬和工作流 (workflow),支持弹幕聊天、观众互动、自动点歌、数据统计、私信处理等功能。这个应用看起来很有趣,我还没有使用过。

    知乎直播

    知乎推流直播open in new window页面开启直播后,就可以使用知乎的电脑直播。

    知乎直播注意:

    • 推流直播不能与第三方连接谈话;手机直播不支持绿幕抠图。
    • 当你在电脑直播时,用手机进入知乎客户端,会提示「是否继续直播」,选择「继续」可进入直播界面与观众互动,选「忽略」则停止直播。
    • 如果直播时间超过一个月,小葫芦直播码会失效,无法继续使用小葫芦直播助手和弹幕助手。

    小红书直播

    小红书使用直播助手open in new window来设置推流,可以查看官方文档 了解开播步骤。

    当我登录直播助手时,提示「暂无直播权限,请联系运营及客服开通」,但手机却可以直播,这说明提示中的直播权限专指电脑端直播。因此,我在应用中提交了问题,但一直未收到客服回复。

    微博直播

    微博直播需先完成实名认证,然后在微博管理中心open in new window创建直播。详细的开播步骤,可以参考官方的微博 PC 开播教程open in new window

    Youtube 直播

    如果您在过去 90 天内没有进行 YouTube 直播,平台会要求验证您的频道。首次启用直播功能可能需要最长等待 24 小时。

    1. 打开 YouTube 直播控制室open in new window
    2. 点击直播标签页或为新直播安排时间。
    3. 从直播控制室复制直播网址和直播码,然后将其粘贴到编码器中。
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/livestreaming/6_live_positioning.html b/apps/livestreaming/6_live_positioning.html index 158e76d5..73251142 100644 --- a/apps/livestreaming/6_live_positioning.html +++ b/apps/livestreaming/6_live_positioning.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    直播入门攻略六 | 技巧篇:直播定位与策划

    工具直播约 1406 字大约 5 分钟...

    直播过几次了,但是你的直播间总是没有人看,偶尔来了人也不知道说什么。作为直播新手,遇到这种情况是很正常的。建议按照本文的章节,逐一比对,对你的直播进行定位和策划。

    直播定位

    开设直播前,从你的兴趣、能力和直播目的出发,确定直播定位。

    • 我是谁:我的职业/身份是什么。
    • 面向谁:目标用户画像:性别、年龄、兴趣、收入、消费能力、性格特征等。
    • 我能提供什么:核心竞争力:陪伴?专业知识?丰富经验?渠道资源?
    • 解决目标用户什么问题:排遣寂寞?选购答疑?

    定位完成后,把自己放在目标观众角度进行换位思考,调整直播定位。

    • 你喜欢哪类型的直播?喜欢谁的直播?为什么?每个主播至少列出 3 个吸引你的点。
    • 你不喜欢哪种直播?为什么?
    • 如果是你做直播,你希望是什么样的?你的底线是什么?有什么顾虑?顾虑和目标比起来,孰轻孰重?

    如果前期定位依然不清,可以观察头部主播、找到对标主播,模仿对标主播的直播间。

    开播时间

    保持长时间和持续开播,稳定开播频次与时间段

    例如,每周固定开播两到三场,每次直播不低于 30 分钟。直播频率和直播时长是做好直播的基础,如果开播时长和开播频率不稳定,系统就无法准确地进行推荐。

    新人直播有流量扶持,即使初期没有观众也要坚持开播。尽量选择白天等冷门时间段,竞争相对较小。

    娱乐直播保持 2.5 小时以上,电商直播保持 3.5 小时以上才会有官方稳定推流。

    直播策划

    选题

    直播选题决定直播前期自然流量的多少。

    新手直播流量不高时,主题尽量搭上最新热点,抓住热点,立即开始,利用现有内容,抢占黄金流量时间。但你的直播内容一定要与热点相关,否则牛头不对马嘴,自然流量也不会留下来。

    选定主题后,准备 15~20 分钟的脚本,在直播中循环使用。即使直播间没人,也不要停止说话,否则进入的自然流量会变少。

    标题

    直播标题控制在 8 个字,可以通过关键词搜索站内热门,从中参考直播标题。直播标题没有搜索权重,所以不需要堆砌关键词,只要能清楚地表达直播间主题就可以了。

    标题要素:

    • 突出主播特征,如:人物特质、性格。
    • 突出内容,如:才艺展示、音乐主题、户外和其他类别。
    • 突出玩法吸引,比如:各种秒杀活动、免费赠送等。
    • 突出实力,清楚地表现出你的能力,当然做解说也可以。

    预告

    开播前,一定要先发直播预告或短视频,以便让更多观众进入直播间。预告发布最好在开播前两小时完成。

    在开播页面,请提前设置好封面标题并勾选定位

    有特色的封面可以提升观众对直播间的兴趣,建议使用本人或与内容相关的图片作为封面。如果不知道如何设置好封面标题,可以参考其他观众较多的直播间。

    打开直播定位,可以让更多的同城观众看到你的直播间,对直播间的流量有非常大的帮助。

    环境

    灯光和环境声音决定了你的直播效果。

    直播间灯光要亮,露脸主播可以将灯光打在脸部的右前方 45 度,这能提升你的颜值。

    直播前,尽量关闭门窗和不必要的电器,降低直播间环境噪音,以避免干扰直播效果。

    直播互动

    开场前 10~15 分钟是暖场阶段,你可以先和观众互动,等人多了再正式开始主题。

    有新观众进入直播间时,要主动欢迎他们。有意识地引导用户关注、互动,呼吁点亮粉丝灯牌,及时感谢礼物。

    对于用户评论,要先读出弹幕,然后做出应答。粉丝提出意见对我们是有帮助的,一定要虚心接受并表示感谢。

    如果有团队配合,可以安排管理员维持直播间的秩序并活跃气氛,参与直播平台的官方活动,适当购买直播道具(宠粉红包福袋)。

    下播后,进行数据复盘,调整直播间的标题、封面和背景。

    开播锻炼

    开播前把脸部肌肉活动开。嘴张到最大,舌顶上颚 60 秒;嘴张到最大,尽量伸舌 30 秒。说话时,让嘴唇用力。

    总结

    经过两年的直播,我深知直播的硬件、软件和技巧只是锦上添花。若要体验直播,不想深入研究,只需拿出手机开播即可。开始直播时,可能会有很多疑问和顾虑,效果也不一定很好。但只有勇敢尝试新事物,不断开拓,我们的人生才会有更多可能性。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/apps/livestreaming/index.html b/apps/livestreaming/index.html index 51fe1578..32adf16c 100644 --- a/apps/livestreaming/index.html +++ b/apps/livestreaming/index.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Livestreaming

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/article/index.html b/article/index.html index 129a32f9..a5572226 100644 --- a/article/index.html +++ b/article/index.html @@ -38,7 +38,7 @@ } - + @@ -77,10 +77,10 @@

    主界面

    OBS 界面看起来有些复杂,但可以分为菜单栏、预览区、主按钮区和运行状态四个区块。日常使用中,我们只需要接触主按钮区,它包括场景、来源、混音器、转场特效和控制按钮。


    ...工具OBS直播大约 9 分钟
    直播入门攻略二 | StreamFX 篇:最强大的 OBS 插件

    StreamFX 提供了来源镜像、模糊滤镜、着色器滤镜等多种效果,是 OBS 必装的效果插件。本文将介绍 StreamFX 的 28 种滤镜效果。

    安装 StreamFX

    StreamFX 发布页上按平台选择安装包。StreamFX for OBS 29 处于测试阶段,在升级此插件前,请按照卸载教程执行旧版清理。


    ...工具OBS直播大约 5 分钟
    2
    3
    4
    5
    6
    - + - - - + diff --git a/assets/0_live_equipments.html-e619ead4.js b/assets/0_live_equipments.html-4208e56f.js similarity index 99% rename from assets/0_live_equipments.html-e619ead4.js rename to assets/0_live_equipments.html-4208e56f.js index 9382b0cf..ac73f947 100644 --- a/assets/0_live_equipments.html-e619ead4.js +++ b/assets/0_live_equipments.html-4208e56f.js @@ -1 +1 @@ -import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as h,o,c as d,a,b as e,d as t,e as i}from"./app-98132e77.js";const c={},p=i('

    直播已经成为一种主流的传播方式,几乎所有的行业都会使用它。经过两年的持续直播,我总结出了一套直播入门攻略,从设备、软件和技巧三个方面,帮助你快速入门直播,开始自己的直播之旅。

    本文是直播入门攻略的前置篇,主要介绍直播所需的设备,以及如何避免购买不必要的高价设备。直播设备可分为电脑、补光灯、稳定器(三脚架)、音频采集(收音器)和视频采集(摄像头)。

    电脑

    OBS 直播对电脑配置要求较高,建议使用三年内购买的主流配置台式机。台机推荐预算在一万元以上,显卡为 3060 以上,内存为 32G。

    补光灯

    露脸主播一定要配柔光灯或环形灯,可以提升颜值。如果带眼镜的话,可以用小型补光灯代替环形灯,以免反射出光圈影响视觉。补光灯可以放在正面 45 度成蝴蝶光(派拉蒙光),可以显瘦显轮廓;背后可以使用辅助光或一张白纸反光,以防止正面灯光太亮。

    三脚架

    三脚架主要有两类:桌面款,建议高度为 55cm;站立款,建议高度为 210cm。价位从 10-500 元不等,效果无明显区别,新手用户的三脚架预算建议不要超过 100 元。

    音频采集

    收音设备的费用从几元到几千元不等。手机的收音性能比绝大多数话筒好,如果你使用手机摄像方案,可以先不用购买收音器材。

    廉价麦克风存在收音范围窄、不清晰、多噪音等问题,但价格低廉、使用方便,适合新人测试使用。

    桌面直播多使用「声卡 + 话筒」方案,预算需要超过一千元。不要购买廉价的山寨声卡,还不如手机收音来得清晰。

    外出直播或进阶用户推荐 RODE 或 DJI 的无线麦克风,这两款音频水准都可以吊打同行。RODE 是老牌话筒厂家,音质有保障;DJI 麦克风推出不久,但集百家之长,设计非常人性化,小白使用也很方便。

    视频采集

    桌面摄像头、手机和微单相机都可以作为直播的视频采集来源。

    摄像头

    桌面摄像头的价格在 50-1000 元不等,但实际效果没有太大的区别。个人体验过罗技 C930 后,发现画面模糊不清晰,将问题反馈给客服后得知,画质不清晰是桌面摄像头的通病。

    不管是几十元的廉价摄像头还是上千元的罗技 C1000,它们的实际像素都只有 200 万。宣传中的 2000 万像素是通过软件放大的效果,画质并没有实质性的变化。入门用户可以选择 100 元的自动变焦摄像头。

    桌面摄像头搭配三角架可以调整更佳的角度,购买时要注意摄像头是否有三脚架接口

    手机

    如果室内没有桌面摄像头,而又想用电脑做直播推流,可以考虑用手机替代摄像头,步骤可参考下方介绍。

    相机

    相比摄像头的算法像素效果,只有相机才能达到真正意义上的高清直播。

    如果你的相机有外接视频接口(例如:HDMI、mini HDMI、SDI),可以通过视频采集卡将相机视频转为直播视频传入电脑。索尼、佳能等主流相机都有专门的直播软件,不需要采集卡就可以直接连接电脑进行直播。运动相机 GoPro 也已经支持相机直播传输,希望国内厂商也能跟上。

    将相机用作摄像头的费用较高,一般需要几千到几万,只建议已购买相机的主播采用此方案。

    手机作摄像头

    Camo

    ',27),s={href:"https://apps.apple.com/app/reincubate-camo/id1514199064?platform=iphone",target:"_blank",rel:"noopener noreferrer"},l=a("h3",{id:"ndi",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#ndi","aria-hidden":"true"},"#"),e(" NDI")],-1),_={href:"https://wwe.lanzoup.com/iQCMh00b946b",target:"_blank",rel:"noopener noreferrer"},m=a("h3",{id:"ip-webcam",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#ip-webcam","aria-hidden":"true"},"#"),e(" IP Webcam")],-1),f={href:"https://play.google.com/store/apps/details?id=com.pas.webcam",target:"_blank",rel:"noopener noreferrer"},b={href:"https://wwva.lanzouq.com/iQAFF1dic4qf",target:"_blank",rel:"noopener noreferrer"},u=i('

    以下是 IP Webcam 的基本设置步骤:

    1. 滑动至应用底部,点击「开启服务器」,即可开始使用手机摄像头进行推流。
    2. 画面下方会显示一些类似 http://192.168.2.234:8080 的地址,请在局域网浏览器中打开此地址。
    3. 在浏览器中,你可以调整 IP 摄像头的推流设置。将流畅度设置为 90%,视频分辨率设为 720p,这可以有效减少卡顿。IP Webcam 的耗电量较低,适合长时间手机直播,并支持多种方式,包括视频和浏览器等。
    4. 在 OBS 中,选择「场景」>「来源」>「媒体源」,取消勾选本地文件,然后在「输入」中输入 IP 摄像头的视频地址,例如 http://192.168.2.234:8080/video。或者使用浏览器推流模式,在 OBS 中,选择「场景」>「来源」>「浏览器」,在「URL」中输入 IP 摄像头的全屏浏览器地址,例如 http://192.168.2.234:8080/jsfs.html。请注意:浏览器推流可能会导致闪烁。

    其他

    如果出现闪退等问题,可尝试使用 iriun webcam、DroidCam 和 ivcam。

    不推荐使用无他伴侣,尽管国内有大量教程介绍它,但使用中会出现很多问题,例如:摄影角度很难控制;无法使用 FaceRig 等变脸应用;直播 10 分钟后,摄像头经常自动与 OBS 断开连接;直播 2 小时后,OBS 无法检测到无他伴侣。

    ',5);function I(x,g){const r=h("ExternalLinkIcon");return o(),d("div",null,[p,a("p",null,[a("a",s,[e("Camo"),t(r)]),e(" 专用于 iOS 设备,连接数据线后可将 iPhone 或 iPad 变为直播摄像头。")]),l,a("p",null,[e("NDI 是最稳定的,可自由调节拍摄参数。打开 NDI 应用后,需等待 NDI 界面周边出现绿框或红框,OBS 才可以识别到摄像头。不过 NDI 是收费应用,安卓用户可使用 "),a("a",_,[e("NDI 调试 APK"),t(r)]),e("。")]),m,a("p",null,[a("a",f,[e("IP Webcam"),t(r)]),e(" 在推流稳定性方面表现一般,偶尔出现丢帧,但对于个人直播使用来说,免费版本已经足够。你可以在 Google Play 上安装它,或使用"),a("a",b,[e("国内的备用下载链接"),t(r)]),e("。")]),u])}const N=n(c,[["render",I],["__file","0_live_equipments.html.vue"]]);export{N as default}; +import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as h,o,c as d,a,b as e,d as t,e as i}from"./app-91ee3df5.js";const c={},p=i('

    直播已经成为一种主流的传播方式,几乎所有的行业都会使用它。经过两年的持续直播,我总结出了一套直播入门攻略,从设备、软件和技巧三个方面,帮助你快速入门直播,开始自己的直播之旅。

    本文是直播入门攻略的前置篇,主要介绍直播所需的设备,以及如何避免购买不必要的高价设备。直播设备可分为电脑、补光灯、稳定器(三脚架)、音频采集(收音器)和视频采集(摄像头)。

    电脑

    OBS 直播对电脑配置要求较高,建议使用三年内购买的主流配置台式机。台机推荐预算在一万元以上,显卡为 3060 以上,内存为 32G。

    补光灯

    露脸主播一定要配柔光灯或环形灯,可以提升颜值。如果带眼镜的话,可以用小型补光灯代替环形灯,以免反射出光圈影响视觉。补光灯可以放在正面 45 度成蝴蝶光(派拉蒙光),可以显瘦显轮廓;背后可以使用辅助光或一张白纸反光,以防止正面灯光太亮。

    三脚架

    三脚架主要有两类:桌面款,建议高度为 55cm;站立款,建议高度为 210cm。价位从 10-500 元不等,效果无明显区别,新手用户的三脚架预算建议不要超过 100 元。

    音频采集

    收音设备的费用从几元到几千元不等。手机的收音性能比绝大多数话筒好,如果你使用手机摄像方案,可以先不用购买收音器材。

    廉价麦克风存在收音范围窄、不清晰、多噪音等问题,但价格低廉、使用方便,适合新人测试使用。

    桌面直播多使用「声卡 + 话筒」方案,预算需要超过一千元。不要购买廉价的山寨声卡,还不如手机收音来得清晰。

    外出直播或进阶用户推荐 RODE 或 DJI 的无线麦克风,这两款音频水准都可以吊打同行。RODE 是老牌话筒厂家,音质有保障;DJI 麦克风推出不久,但集百家之长,设计非常人性化,小白使用也很方便。

    视频采集

    桌面摄像头、手机和微单相机都可以作为直播的视频采集来源。

    摄像头

    桌面摄像头的价格在 50-1000 元不等,但实际效果没有太大的区别。个人体验过罗技 C930 后,发现画面模糊不清晰,将问题反馈给客服后得知,画质不清晰是桌面摄像头的通病。

    不管是几十元的廉价摄像头还是上千元的罗技 C1000,它们的实际像素都只有 200 万。宣传中的 2000 万像素是通过软件放大的效果,画质并没有实质性的变化。入门用户可以选择 100 元的自动变焦摄像头。

    桌面摄像头搭配三角架可以调整更佳的角度,购买时要注意摄像头是否有三脚架接口

    手机

    如果室内没有桌面摄像头,而又想用电脑做直播推流,可以考虑用手机替代摄像头,步骤可参考下方介绍。

    相机

    相比摄像头的算法像素效果,只有相机才能达到真正意义上的高清直播。

    如果你的相机有外接视频接口(例如:HDMI、mini HDMI、SDI),可以通过视频采集卡将相机视频转为直播视频传入电脑。索尼、佳能等主流相机都有专门的直播软件,不需要采集卡就可以直接连接电脑进行直播。运动相机 GoPro 也已经支持相机直播传输,希望国内厂商也能跟上。

    将相机用作摄像头的费用较高,一般需要几千到几万,只建议已购买相机的主播采用此方案。

    手机作摄像头

    Camo

    ',27),s={href:"https://apps.apple.com/app/reincubate-camo/id1514199064?platform=iphone",target:"_blank",rel:"noopener noreferrer"},l=a("h3",{id:"ndi",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#ndi","aria-hidden":"true"},"#"),e(" NDI")],-1),_={href:"https://wwe.lanzoup.com/iQCMh00b946b",target:"_blank",rel:"noopener noreferrer"},m=a("h3",{id:"ip-webcam",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#ip-webcam","aria-hidden":"true"},"#"),e(" IP Webcam")],-1),f={href:"https://play.google.com/store/apps/details?id=com.pas.webcam",target:"_blank",rel:"noopener noreferrer"},b={href:"https://wwva.lanzouq.com/iQAFF1dic4qf",target:"_blank",rel:"noopener noreferrer"},u=i('

    以下是 IP Webcam 的基本设置步骤:

    1. 滑动至应用底部,点击「开启服务器」,即可开始使用手机摄像头进行推流。
    2. 画面下方会显示一些类似 http://192.168.2.234:8080 的地址,请在局域网浏览器中打开此地址。
    3. 在浏览器中,你可以调整 IP 摄像头的推流设置。将流畅度设置为 90%,视频分辨率设为 720p,这可以有效减少卡顿。IP Webcam 的耗电量较低,适合长时间手机直播,并支持多种方式,包括视频和浏览器等。
    4. 在 OBS 中,选择「场景」>「来源」>「媒体源」,取消勾选本地文件,然后在「输入」中输入 IP 摄像头的视频地址,例如 http://192.168.2.234:8080/video。或者使用浏览器推流模式,在 OBS 中,选择「场景」>「来源」>「浏览器」,在「URL」中输入 IP 摄像头的全屏浏览器地址,例如 http://192.168.2.234:8080/jsfs.html。请注意:浏览器推流可能会导致闪烁。

    其他

    如果出现闪退等问题,可尝试使用 iriun webcam、DroidCam 和 ivcam。

    不推荐使用无他伴侣,尽管国内有大量教程介绍它,但使用中会出现很多问题,例如:摄影角度很难控制;无法使用 FaceRig 等变脸应用;直播 10 分钟后,摄像头经常自动与 OBS 断开连接;直播 2 小时后,OBS 无法检测到无他伴侣。

    ',5);function I(x,g){const r=h("ExternalLinkIcon");return o(),d("div",null,[p,a("p",null,[a("a",s,[e("Camo"),t(r)]),e(" 专用于 iOS 设备,连接数据线后可将 iPhone 或 iPad 变为直播摄像头。")]),l,a("p",null,[e("NDI 是最稳定的,可自由调节拍摄参数。打开 NDI 应用后,需等待 NDI 界面周边出现绿框或红框,OBS 才可以识别到摄像头。不过 NDI 是收费应用,安卓用户可使用 "),a("a",_,[e("NDI 调试 APK"),t(r)]),e("。")]),m,a("p",null,[a("a",f,[e("IP Webcam"),t(r)]),e(" 在推流稳定性方面表现一般,偶尔出现丢帧,但对于个人直播使用来说,免费版本已经足够。你可以在 Google Play 上安装它,或使用"),a("a",b,[e("国内的备用下载链接"),t(r)]),e("。")]),u])}const N=n(c,[["render",I],["__file","0_live_equipments.html.vue"]]);export{N as default}; diff --git a/assets/1_obs_basic.html-7a67d017.js b/assets/1_obs_basic.html-4df50bf0.js similarity index 99% rename from assets/1_obs_basic.html-7a67d017.js rename to assets/1_obs_basic.html-4df50bf0.js index b4c5b6a8..af94a6d0 100644 --- a/assets/1_obs_basic.html-7a67d017.js +++ b/assets/1_obs_basic.html-4df50bf0.js @@ -1 +1 @@ -import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as h,o as d,c as o,a,b as i,d as t,e as r}from"./app-98132e77.js";const l={},p={href:"https://obsproject.com/",target:"_blank",rel:"noopener noreferrer"},g=r('

    主界面

    OBS 界面看起来有些复杂,但可以分为菜单栏、预览区、主按钮区和运行状态四个区块。日常使用中,我们只需要接触主按钮区,它包括场景、来源、混音器、转场特效和控制按钮。

    OBS 主界面

    场景

    场景(Scenes)是指直播中不同的场面。不同的场景可以用于不同的领域或场合,例如自习室场景、街拍场景、个人访问、卖货直播。

    场景有四个按钮,从左到右依次为:添加场景,删除场景,向上移动场景,向下移动场景。

    场景按钮

    来源

    来源(Source)是指场景中的素材,比如摄像头画面、图像、音频等。来源区有 7 个按钮,上方两个为源属性和滤镜,下方 5 个按钮依次为:添加来源,删除来源,源属性,向上移动源,向下移动源。

    来源按钮

    混音器

    混音器(Audio Mixer)是直播的音频控制器。点击混音器左下角的齿轮按钮,进入「高级音频属性」,可管理所有的音频设备。

    混音器设置中,「音频监听」最为重要。默认为「关闭监听」,指音频仅对直播间观众播放,主播听不到。「仅监听 (输出静音)」表示观众听不到,但主播能听到,观众可通过主播话筒的收音听到声音。「监听并输出」表示主播和观众都能听到。「监听并输出」模式中,建议主播使用耳麦,而不是话筒,否则观众容易听不清主播说话的声音,话筒声音会被输出音频盖住。

    直播高级音频属性

    转场特效

    转场特效(Scene Transitions)指的是在两个场景或素材之间,采用渐变、移动、滑入滑出等技巧,实现场景或情节之间平滑过渡的效果。

    控制按钮

    控制按钮(Controls)区域集成了 OBS 的核心功能,按钮分别为「开始直播」「开始录制」「启动虚拟摄像机」「工作室模式」。

    「启动虚拟摄像机」是将 OBS 场景作为摄像头画面对外输出,适合将画面输出到不支持 OBS 推流的平台或软件。例如,抖音直播要求粉丝在一万以上才能使用 OBS 推流,而启用虚拟摄像头后,将直播摄像头设为「OBS-Camera」即可达到类似推流效果。

    「工作室模式」下,显示区域会分为两块:左侧为预览区,右侧为输出区。点击中间按钮「转场特效」,即可将左侧预览区输出到直播画面。

    工作室模式

    设置

    在使用 OBS 直播前,请先点击右上角菜单栏中的「文件」>「设置」,调整 OBS 的设置。

    直播

    点击「设置」>「直播」,将「服务」调整为自定义,服务器和推流码则按平台要求输入。

    推流服务器设置

    输出

    点击「设置」>「输出」,将「输出模式」设为高级,其他设置参考下方样例。

    直播输出设置

    音频

    点击「设置」>「音频」>「通用」,将声道设为单声道。除非你是歌唱主播,否则无需使用立体声。

    视频

    点击「设置」>「视频」,按需设置直播分辨率,通常为 1920x10801280x720。如果你是做电商直播,需要进行竖屏直播,就将分辨率反过来设置,比如 1080x1920720x1280。「输出(画布)分辨率」与「基础(缩放)分辨率」建议设为相同数值,避免出现缩放问题。

    「常用帧率」在日常直播中只需要 30,游戏直播建议调整到 60。

    直播分辨率设置

    高级

    点击「设置」>「高级」,将「进程优先级」设为高,以降低电脑卡顿的概率。然后,启用「直播延迟」和「自动重连」功能,以避免直播事故的发生。「直播延迟」启用后,观众看到的直播画面会比实时要慢,延迟时间一般为 3~20 秒。

    OBS 高级设置

    直播来源

    了解 OBS 界面和设置后,我们回到主按钮区的「来源」,深入了解来源种类和滤镜。直播来源种类繁多,可以分为四类:静态来源、音频来源、视频来源和组合来源。

    直播来源

    静态来源

    音频来源

    视频来源

    ',47),s=a("li",null,"视频采集设备:捕获设备的视频画面,多用于摄像头。",-1),c=a("li",null,"窗口采集:捕获指定程序的窗口画面。使用窗口采集时,窗口不能最小化,否则窗口会卡住不同步。",-1),f=a("li",null,"游戏源:采集游戏画面。",-1),u=a("li",null,"显示器采集:捕获单个显示器的完整视频画面。",-1),b=a("li",null,"媒体源:播放本地或在线的音视频文件。",-1),m={href:"https://www.videolan.org/vlc/",target:"_blank",rel:"noopener noreferrer"},x=r('

    组合输出

    滤镜

    选择「来源」>「滤镜」,可对来源素材进行裁剪、过滤、增益等多种处理。滤镜可分为效果滤镜和音视频滤镜。下文将介绍几种常用滤镜。

    常用滤镜

    色度键(抠图)

    「色度键」属于效果滤镜,能将指定颜色变为透明,多用于绿幕实时抠图,可以在直播时把绿幕替换为其他场景。

    色度键滤镜一键抠图
    色度键滤镜一键抠图

    模糊

    ',10),_={href:"https://github.com/Xaymar/obs-StreamFX/releases",target:"_blank",rel:"noopener noreferrer"},S=r('
    右侧为模糊效果
    模糊滤镜设置

    图像蒙版

    「图像蒙版/混合」属于效果滤镜,可在摄像头(视频采集设备)上添加定制外框。其中,最常用的应用是主播圆形头像。类型选择「Alpha 蒙版(Alpha 通道)」,路径选择头像形状图片。头像形状图片可任意定制,比如在 1920*1080 的画布上画一个圆形,并填充黑色,其他区域为透明,然后将其导出为 PNG 格式。如果你不想自己画,也可以使用下方示例图片。

    色彩校正

    ',6),B={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Color-Grade",target:"_blank",rel:"noopener noreferrer"},v=a("figure",null,[a("img",{src:"https://img.gpt-vip.top/2023-01-08-07-01-17.png",alt:"",tabindex:"0",loading:"lazy"}),a("figcaption",null,"色彩校正")],-1),O=a("h3",{id:"应用-lut",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#应用-lut","aria-hidden":"true"},"#"),i(" 应用 LUT")],-1),y={href:"https://wwva.lanzoue.com/iEyOs0k8kj3g",target:"_blank",rel:"noopener noreferrer"},z=r('

    自制 LUT 文件参照下列步骤:

    1. 将 OBS 滤镜插件目录下的 original.png 复制到 Photoshop。
    2. 进入 Photoshop 右侧的调整界面,选择第二行的最右侧「创建新的颜色查找调节图层」。
    3. 载入自带的 3DLUT 文件,调整后导出为 png 文件。这个 png 就是直播能用的 LUT 文件。如果自带 LUT 不能满足需求,则使用 Premiere 调节定制 LUT cube 文件。

    常见问题

    直播延迟严重

    选择「设置」>「高级」,检查「直播延迟」是否启用了。主流机器不会导致直播严重延迟,出现延迟的原因多是因为启用了「直播延迟」设置。

    一直断开重连

    右下角弹出提示「OBS Studio 已断开连接。正在重新连接...」,这说明直播服务设置错误。选择「设置」>「直播」,更新服务器和推流码内容。注意:某些平台只要断开,推流码就会改变。

    后续

    我原本想一篇写完 OBS 的入门,但基础使用已经占据了较长篇幅。为了避免重蹈上一篇的覆辙,OBS 插件的介绍会放在篇二更新。

    ',9);function L(k,T){const e=h("ExternalLinkIcon");return d(),o("div",null,[a("p",null,[a("a",p,[i("Open Broadcaster Software"),t(e)]),i("(OBS)是一款免费开源的视频录制和直播应用,支持 Windows、Mac 和 Linux 平台。大部分直播软件都是基于 OBS 内核开发的。无论你准备在哪个平台直播,OBS 都是最推荐的直播入门软件。本文将从基础开始,为新手介绍 OBS 的界面、设置和直播使用方法。")]),g,a("ul",null,[s,c,f,u,b,a("li",null,[i("VLC 视频源:安装 "),a("a",m,[i("VLC"),t(e)]),i(" 才能启用本来源。「VLC 视频源」用于多个音视频按序播放,支持字幕。")])]),x,a("p",null,[i("「模糊」属于效果滤镜,可将指定区域模糊化以维护隐私。推荐设置:类型设为「Dual Filtering(双重过滤)」,大小为 4,应用蒙版后可以选择模糊区域。与 Gaussian 类型相比,Dual Filtering 生成模糊效果最快,对配置要求更低。要使用模糊滤镜,需要安装插件 "),a("a",_,[i("StreamFX"),t(e)]),i("。")]),S,a("p",null,[a("a",B,[i("色彩校正"),t(e)]),i("(Color Grading)属于效果滤镜,使用伽玛、对比度、亮度、饱和度、色调偏移、不透明度、颜色叠加、添加颜色来改变或校正最终画面的颜色和亮度。")]),v,O,a("p",null,[i("「应用 LUT」属于效果滤镜。它使用 LUT 对画面进行色彩调整,相当于手机修图用的风格滤镜,能够大大提升画面效果。初期可以使用我的 "),a("a",y,[i("LUT 设置"),t(e)]),i(",「路径」指向解压后的 png 文件。")]),z])}const U=n(l,[["render",L],["__file","1_obs_basic.html.vue"]]);export{U as default}; +import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as h,o as d,c as o,a,b as i,d as t,e as r}from"./app-91ee3df5.js";const l={},p={href:"https://obsproject.com/",target:"_blank",rel:"noopener noreferrer"},g=r('

    主界面

    OBS 界面看起来有些复杂,但可以分为菜单栏、预览区、主按钮区和运行状态四个区块。日常使用中,我们只需要接触主按钮区,它包括场景、来源、混音器、转场特效和控制按钮。

    OBS 主界面

    场景

    场景(Scenes)是指直播中不同的场面。不同的场景可以用于不同的领域或场合,例如自习室场景、街拍场景、个人访问、卖货直播。

    场景有四个按钮,从左到右依次为:添加场景,删除场景,向上移动场景,向下移动场景。

    场景按钮

    来源

    来源(Source)是指场景中的素材,比如摄像头画面、图像、音频等。来源区有 7 个按钮,上方两个为源属性和滤镜,下方 5 个按钮依次为:添加来源,删除来源,源属性,向上移动源,向下移动源。

    来源按钮

    混音器

    混音器(Audio Mixer)是直播的音频控制器。点击混音器左下角的齿轮按钮,进入「高级音频属性」,可管理所有的音频设备。

    混音器设置中,「音频监听」最为重要。默认为「关闭监听」,指音频仅对直播间观众播放,主播听不到。「仅监听 (输出静音)」表示观众听不到,但主播能听到,观众可通过主播话筒的收音听到声音。「监听并输出」表示主播和观众都能听到。「监听并输出」模式中,建议主播使用耳麦,而不是话筒,否则观众容易听不清主播说话的声音,话筒声音会被输出音频盖住。

    直播高级音频属性

    转场特效

    转场特效(Scene Transitions)指的是在两个场景或素材之间,采用渐变、移动、滑入滑出等技巧,实现场景或情节之间平滑过渡的效果。

    控制按钮

    控制按钮(Controls)区域集成了 OBS 的核心功能,按钮分别为「开始直播」「开始录制」「启动虚拟摄像机」「工作室模式」。

    「启动虚拟摄像机」是将 OBS 场景作为摄像头画面对外输出,适合将画面输出到不支持 OBS 推流的平台或软件。例如,抖音直播要求粉丝在一万以上才能使用 OBS 推流,而启用虚拟摄像头后,将直播摄像头设为「OBS-Camera」即可达到类似推流效果。

    「工作室模式」下,显示区域会分为两块:左侧为预览区,右侧为输出区。点击中间按钮「转场特效」,即可将左侧预览区输出到直播画面。

    工作室模式

    设置

    在使用 OBS 直播前,请先点击右上角菜单栏中的「文件」>「设置」,调整 OBS 的设置。

    直播

    点击「设置」>「直播」,将「服务」调整为自定义,服务器和推流码则按平台要求输入。

    推流服务器设置

    输出

    点击「设置」>「输出」,将「输出模式」设为高级,其他设置参考下方样例。

    直播输出设置

    音频

    点击「设置」>「音频」>「通用」,将声道设为单声道。除非你是歌唱主播,否则无需使用立体声。

    视频

    点击「设置」>「视频」,按需设置直播分辨率,通常为 1920x10801280x720。如果你是做电商直播,需要进行竖屏直播,就将分辨率反过来设置,比如 1080x1920720x1280。「输出(画布)分辨率」与「基础(缩放)分辨率」建议设为相同数值,避免出现缩放问题。

    「常用帧率」在日常直播中只需要 30,游戏直播建议调整到 60。

    直播分辨率设置

    高级

    点击「设置」>「高级」,将「进程优先级」设为高,以降低电脑卡顿的概率。然后,启用「直播延迟」和「自动重连」功能,以避免直播事故的发生。「直播延迟」启用后,观众看到的直播画面会比实时要慢,延迟时间一般为 3~20 秒。

    OBS 高级设置

    直播来源

    了解 OBS 界面和设置后,我们回到主按钮区的「来源」,深入了解来源种类和滤镜。直播来源种类繁多,可以分为四类:静态来源、音频来源、视频来源和组合来源。

    直播来源

    静态来源

    音频来源

    视频来源

    ',47),s=a("li",null,"视频采集设备:捕获设备的视频画面,多用于摄像头。",-1),c=a("li",null,"窗口采集:捕获指定程序的窗口画面。使用窗口采集时,窗口不能最小化,否则窗口会卡住不同步。",-1),f=a("li",null,"游戏源:采集游戏画面。",-1),u=a("li",null,"显示器采集:捕获单个显示器的完整视频画面。",-1),b=a("li",null,"媒体源:播放本地或在线的音视频文件。",-1),m={href:"https://www.videolan.org/vlc/",target:"_blank",rel:"noopener noreferrer"},x=r('

    组合输出

    滤镜

    选择「来源」>「滤镜」,可对来源素材进行裁剪、过滤、增益等多种处理。滤镜可分为效果滤镜和音视频滤镜。下文将介绍几种常用滤镜。

    常用滤镜

    色度键(抠图)

    「色度键」属于效果滤镜,能将指定颜色变为透明,多用于绿幕实时抠图,可以在直播时把绿幕替换为其他场景。

    色度键滤镜一键抠图
    色度键滤镜一键抠图

    模糊

    ',10),_={href:"https://github.com/Xaymar/obs-StreamFX/releases",target:"_blank",rel:"noopener noreferrer"},S=r('
    右侧为模糊效果
    模糊滤镜设置

    图像蒙版

    「图像蒙版/混合」属于效果滤镜,可在摄像头(视频采集设备)上添加定制外框。其中,最常用的应用是主播圆形头像。类型选择「Alpha 蒙版(Alpha 通道)」,路径选择头像形状图片。头像形状图片可任意定制,比如在 1920*1080 的画布上画一个圆形,并填充黑色,其他区域为透明,然后将其导出为 PNG 格式。如果你不想自己画,也可以使用下方示例图片。

    色彩校正

    ',6),B={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Color-Grade",target:"_blank",rel:"noopener noreferrer"},v=a("figure",null,[a("img",{src:"https://img.gpt-vip.top/2023-01-08-07-01-17.png",alt:"",tabindex:"0",loading:"lazy"}),a("figcaption",null,"色彩校正")],-1),O=a("h3",{id:"应用-lut",tabindex:"-1"},[a("a",{class:"header-anchor",href:"#应用-lut","aria-hidden":"true"},"#"),i(" 应用 LUT")],-1),y={href:"https://wwva.lanzoue.com/iEyOs0k8kj3g",target:"_blank",rel:"noopener noreferrer"},z=r('

    自制 LUT 文件参照下列步骤:

    1. 将 OBS 滤镜插件目录下的 original.png 复制到 Photoshop。
    2. 进入 Photoshop 右侧的调整界面,选择第二行的最右侧「创建新的颜色查找调节图层」。
    3. 载入自带的 3DLUT 文件,调整后导出为 png 文件。这个 png 就是直播能用的 LUT 文件。如果自带 LUT 不能满足需求,则使用 Premiere 调节定制 LUT cube 文件。

    常见问题

    直播延迟严重

    选择「设置」>「高级」,检查「直播延迟」是否启用了。主流机器不会导致直播严重延迟,出现延迟的原因多是因为启用了「直播延迟」设置。

    一直断开重连

    右下角弹出提示「OBS Studio 已断开连接。正在重新连接...」,这说明直播服务设置错误。选择「设置」>「直播」,更新服务器和推流码内容。注意:某些平台只要断开,推流码就会改变。

    后续

    我原本想一篇写完 OBS 的入门,但基础使用已经占据了较长篇幅。为了避免重蹈上一篇的覆辙,OBS 插件的介绍会放在篇二更新。

    ',9);function L(k,T){const e=h("ExternalLinkIcon");return d(),o("div",null,[a("p",null,[a("a",p,[i("Open Broadcaster Software"),t(e)]),i("(OBS)是一款免费开源的视频录制和直播应用,支持 Windows、Mac 和 Linux 平台。大部分直播软件都是基于 OBS 内核开发的。无论你准备在哪个平台直播,OBS 都是最推荐的直播入门软件。本文将从基础开始,为新手介绍 OBS 的界面、设置和直播使用方法。")]),g,a("ul",null,[s,c,f,u,b,a("li",null,[i("VLC 视频源:安装 "),a("a",m,[i("VLC"),t(e)]),i(" 才能启用本来源。「VLC 视频源」用于多个音视频按序播放,支持字幕。")])]),x,a("p",null,[i("「模糊」属于效果滤镜,可将指定区域模糊化以维护隐私。推荐设置:类型设为「Dual Filtering(双重过滤)」,大小为 4,应用蒙版后可以选择模糊区域。与 Gaussian 类型相比,Dual Filtering 生成模糊效果最快,对配置要求更低。要使用模糊滤镜,需要安装插件 "),a("a",_,[i("StreamFX"),t(e)]),i("。")]),S,a("p",null,[a("a",B,[i("色彩校正"),t(e)]),i("(Color Grading)属于效果滤镜,使用伽玛、对比度、亮度、饱和度、色调偏移、不透明度、颜色叠加、添加颜色来改变或校正最终画面的颜色和亮度。")]),v,O,a("p",null,[i("「应用 LUT」属于效果滤镜。它使用 LUT 对画面进行色彩调整,相当于手机修图用的风格滤镜,能够大大提升画面效果。初期可以使用我的 "),a("a",y,[i("LUT 设置"),t(e)]),i(",「路径」指向解压后的 png 文件。")]),z])}const U=n(l,[["render",L],["__file","1_obs_basic.html.vue"]]);export{U as default}; diff --git a/assets/2017-04-18-wechat_multi_open.html-686aa5cc.js b/assets/2017-04-18-wechat_multi_open.html-729aed26.js similarity index 95% rename from assets/2017-04-18-wechat_multi_open.html-686aa5cc.js rename to assets/2017-04-18-wechat_multi_open.html-729aed26.js index 575437dc..c264074c 100644 --- a/assets/2017-04-18-wechat_multi_open.html-686aa5cc.js +++ b/assets/2017-04-18-wechat_multi_open.html-729aed26.js @@ -1 +1 @@ -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as n,c as p,a as o,b as e,d as a,e as c}from"./app-98132e77.js";const s={},d=c('

    由于工作原因,有时候我们需要在电脑上登录多个微信。但微信限制一个客户端只能登陆一个账号,PC 端 + 网页版就成了通用方案,操作效率下降许多。

    其实我们还有更好的办法。在微信 PC 版之余,同时安装微信 For Windows,就能实现客户端双开!

    微信 For Windows 安装

    打开「运行」对话框,输入并启动「应用商店」或「Microsoft Store」,搜索并安装 微信 For Windows

    安装好后,就能与微信 PC 版一齐启动,互不干扰。

    开机启动两个微信

    找到系统启动文件夹,文件夹路径为:%AppData%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup。或者打开「运行」对话框,输入命令「shell:startup」,回车即可打开「启动文件夹」。

    将微信 for windows 10 的快捷方式放到「启动」文件夹里。

    其他方法

    如果还需要继续多开微信,可以按住回车键,然后左键点击微信图标,需要开启几个就点击几次。

    也可以尝试 @刘舒怡 提到的办法:

    只要在 2 秒内快速连续双击打开软件,就能弹出很多登录界面,你想登多少个就登多少个

    ',15),g={href:"https://github.com/huiyadanli/RevokeMsgPatcher",target:"_blank",rel:"noopener noreferrer"},h={href:"https://wwva.lanzouq.com/irUIX187hz3c",target:"_blank",rel:"noopener noreferrer"},l=o("p",null,"然而,使用多开补丁存在一定风险。我仅尝试过其中的防撤回功能,建议在使用多开补丁时务必小心。",-1);function f(_,m){const t=i("ExternalLinkIcon");return n(),p("div",null,[d,o("p",null,[e("此外,已有开发者专门为微信和 QQ 制作了多开补丁。若需同时打开四个或更多窗口,可以试用 "),o("a",g,[e("RevokeMsgPatcher"),a(t)]),e(",国内下载链接:"),o("a",h,[e("RevokeMsgPatcher.v1.6.zip"),a(t)]),e("。")]),l])}const b=r(s,[["render",f],["__file","2017-04-18-wechat_multi_open.html.vue"]]);export{b as default}; +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as n,c as p,a as o,b as e,d as a,e as c}from"./app-91ee3df5.js";const s={},d=c('

    由于工作原因,有时候我们需要在电脑上登录多个微信。但微信限制一个客户端只能登陆一个账号,PC 端 + 网页版就成了通用方案,操作效率下降许多。

    其实我们还有更好的办法。在微信 PC 版之余,同时安装微信 For Windows,就能实现客户端双开!

    微信 For Windows 安装

    打开「运行」对话框,输入并启动「应用商店」或「Microsoft Store」,搜索并安装 微信 For Windows

    安装好后,就能与微信 PC 版一齐启动,互不干扰。

    开机启动两个微信

    找到系统启动文件夹,文件夹路径为:%AppData%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup。或者打开「运行」对话框,输入命令「shell:startup」,回车即可打开「启动文件夹」。

    将微信 for windows 10 的快捷方式放到「启动」文件夹里。

    其他方法

    如果还需要继续多开微信,可以按住回车键,然后左键点击微信图标,需要开启几个就点击几次。

    也可以尝试 @刘舒怡 提到的办法:

    只要在 2 秒内快速连续双击打开软件,就能弹出很多登录界面,你想登多少个就登多少个

    ',15),g={href:"https://github.com/huiyadanli/RevokeMsgPatcher",target:"_blank",rel:"noopener noreferrer"},h={href:"https://wwva.lanzouq.com/irUIX187hz3c",target:"_blank",rel:"noopener noreferrer"},l=o("p",null,"然而,使用多开补丁存在一定风险。我仅尝试过其中的防撤回功能,建议在使用多开补丁时务必小心。",-1);function f(_,m){const t=i("ExternalLinkIcon");return n(),p("div",null,[d,o("p",null,[e("此外,已有开发者专门为微信和 QQ 制作了多开补丁。若需同时打开四个或更多窗口,可以试用 "),o("a",g,[e("RevokeMsgPatcher"),a(t)]),e(",国内下载链接:"),o("a",h,[e("RevokeMsgPatcher.v1.6.zip"),a(t)]),e("。")]),l])}const b=r(s,[["render",f],["__file","2017-04-18-wechat_multi_open.html.vue"]]);export{b as default}; diff --git a/assets/2017-04-22-rss_feed43_feedex.html-4e3997c3.js b/assets/2017-04-22-rss_feed43_feedex.html-990961d6.js similarity index 99% rename from assets/2017-04-22-rss_feed43_feedex.html-4e3997c3.js rename to assets/2017-04-22-rss_feed43_feedex.html-990961d6.js index fc85e81b..d3c3f0ce 100644 --- a/assets/2017-04-22-rss_feed43_feedex.html-4e3997c3.js +++ b/assets/2017-04-22-rss_feed43_feedex.html-990961d6.js @@ -1,4 +1,4 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o,c,a as n,b as a,d as t,e as l}from"./app-98132e77.js";const i={},r=n("p",null,"迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。",-1),u=n("p",null,[n("strong",null,"► 开始烧制属于自己的 feed")],-1),d=n("h2",{id:"_1-进入网页",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#_1-进入网页","aria-hidden":"true"},"#"),a(" 1. 进入网页")],-1),g={href:"http://www.feed43.com/",target:"_blank",rel:"noopener noreferrer"},h=l(`

    2. 选定 RSS 网页

    在「Step1. Specify source page address (URL)」中输入目标网址,将 Page Source 中的内容复制到 txt 文档中,以便之后编写抓取规则。

    如果 Page Source 显示为乱码,可将 Encoding 设置为 UTF-8

    3. 定制 RSS 抓取规则

    「Global Search Pattern」是选择要搜索的范围,建议不填此项,这样会搜索整个页面。「Item (repeatable) Search Pattern」这部分最重要,是我们要抓取的内容。

    仔细查看上方获取到的 Page Source,找到需要抓取的元素,输入到「Item (repeatable) Search Pattern」。

    测试网址:http://news.163.com/special/0001386F/rank_whole.html

    需要抓取的源代码:

    <tr>
    +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o,c,a as n,b as a,d as t,e as l}from"./app-91ee3df5.js";const i={},r=n("p",null,"迷上 IFTTT 等自动化应用后,我需要为各种不同的网页定制 RSS 源。其中,最容易入门的工具是 FEED43。本文是一篇介绍如何使用 FEED43 定制 RSS 源的入门指南。",-1),u=n("p",null,[n("strong",null,"► 开始烧制属于自己的 feed")],-1),d=n("h2",{id:"_1-进入网页",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#_1-进入网页","aria-hidden":"true"},"#"),a(" 1. 进入网页")],-1),g={href:"http://www.feed43.com/",target:"_blank",rel:"noopener noreferrer"},h=l(`

    2. 选定 RSS 网页

    在「Step1. Specify source page address (URL)」中输入目标网址,将 Page Source 中的内容复制到 txt 文档中,以便之后编写抓取规则。

    如果 Page Source 显示为乱码,可将 Encoding 设置为 UTF-8

    3. 定制 RSS 抓取规则

    「Global Search Pattern」是选择要搜索的范围,建议不填此项,这样会搜索整个页面。「Item (repeatable) Search Pattern」这部分最重要,是我们要抓取的内容。

    仔细查看上方获取到的 Page Source,找到需要抓取的元素,输入到「Item (repeatable) Search Pattern」。

    测试网址:http://news.163.com/special/0001386F/rank_whole.html

    需要抓取的源代码:

    <tr>
       <td class="red">
         <span>2</span
         ><a href="更时尚更运动 车展实拍解析红旗 H5"
    diff --git a/assets/2017-07-28-office_2016_installer_error.html-da49ab72.js b/assets/2017-07-28-office_2016_installer_error.html-65070ba9.js
    similarity index 97%
    rename from assets/2017-07-28-office_2016_installer_error.html-da49ab72.js
    rename to assets/2017-07-28-office_2016_installer_error.html-65070ba9.js
    index 26a8fe7f..865515e0 100644
    --- a/assets/2017-07-28-office_2016_installer_error.html-da49ab72.js
    +++ b/assets/2017-07-28-office_2016_installer_error.html-65070ba9.js
    @@ -1 +1 @@
    -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as c,c as o,e as i}from"./app-98132e77.js";const l={},r=i('

    重新安装 Office 系统或更改安装组件时,经常提示:「找不到有效的安装源」,但实际这些文件都能在安装包内找到。这是由于注册表和组件而导致的报错,「找不到有效的安装源」并不是真实原因,解决方法查看下方。

    解决方法

    1. 打开 regedit.exe,在注册表中找到路径 计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Office\\Delivery\\SourceEngine\\Downloads\\{90160000-00BA-0804-1000-0000000FF1CE}-C\\Sources\\PROPLUS16(RG)-6186D162

    2. 修改 Path 数据,改为安装包位置,比如 F:\\5.软件资源\\系统重装\\SW_DVD5_Office_Professional_Plus_2016_64Bit_ChnSimp_MLF_X20-42426\\groove.zh-cn

    3. 在 C 盘建立安装组件:

      • 把安装包路径 \\groove.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-00BA-0804-1000-0000000FF1CE}-C 目录下 (如果没有这个目录就自己建立)。
      • 把安装包路径 \\proplus.ww\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-0011-0000-1000-0000000FF1CE}-C
    4. 将需要的程序文件放入 MSOCache 路径
      MSOCache 其它的目录下内容同样根据注册表的内容把它指示的光盘中的安装文件复制到相应的目录下。如果没有那个目录就要自己建立,类似的目录一共有 12 个。
      如果不想全装可以只选择需要的软件,下面以 Onenote 和 Access 为例。

      • Onenote 把安装包路径 \\onenote.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-00A1-0804-1000-0000000FF1CE}-CC
      • Access 把安装包路径 \\access.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-0015-0804-1000-0000000FF1CE}-C
    5. 最后进入安装包运行 setup.exe 安装正常。

    Office 组件报错大都是由于 MSOCache 目录被删,建议安装 Office 后不要删除该目录。使用优化工具时,要注意保留 MSOCache 目录及其下的文件。

    ',5),a=[r];function t(s,n){return c(),o("div",null,a)}const f=e(l,[["render",t],["__file","2017-07-28-office_2016_installer_error.html.vue"]]);export{f as default}; +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as c,c as o,e as i}from"./app-91ee3df5.js";const l={},r=i('

    重新安装 Office 系统或更改安装组件时,经常提示:「找不到有效的安装源」,但实际这些文件都能在安装包内找到。这是由于注册表和组件而导致的报错,「找不到有效的安装源」并不是真实原因,解决方法查看下方。

    解决方法

    1. 打开 regedit.exe,在注册表中找到路径 计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Office\\Delivery\\SourceEngine\\Downloads\\{90160000-00BA-0804-1000-0000000FF1CE}-C\\Sources\\PROPLUS16(RG)-6186D162

    2. 修改 Path 数据,改为安装包位置,比如 F:\\5.软件资源\\系统重装\\SW_DVD5_Office_Professional_Plus_2016_64Bit_ChnSimp_MLF_X20-42426\\groove.zh-cn

    3. 在 C 盘建立安装组件:

      • 把安装包路径 \\groove.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-00BA-0804-1000-0000000FF1CE}-C 目录下 (如果没有这个目录就自己建立)。
      • 把安装包路径 \\proplus.ww\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-0011-0000-1000-0000000FF1CE}-C
    4. 将需要的程序文件放入 MSOCache 路径
      MSOCache 其它的目录下内容同样根据注册表的内容把它指示的光盘中的安装文件复制到相应的目录下。如果没有那个目录就要自己建立,类似的目录一共有 12 个。
      如果不想全装可以只选择需要的软件,下面以 Onenote 和 Access 为例。

      • Onenote 把安装包路径 \\onenote.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-00A1-0804-1000-0000000FF1CE}-CC
      • Access 把安装包路径 \\access.zh-cn\\ 下的文件复制到 C:\\MSOCache\\All Users\\{90160000-0015-0804-1000-0000000FF1CE}-C
    5. 最后进入安装包运行 setup.exe 安装正常。

    Office 组件报错大都是由于 MSOCache 目录被删,建议安装 Office 后不要删除该目录。使用优化工具时,要注意保留 MSOCache 目录及其下的文件。

    ',5),a=[r];function t(s,n){return c(),o("div",null,a)}const f=e(l,[["render",t],["__file","2017-07-28-office_2016_installer_error.html.vue"]]);export{f as default}; diff --git a/assets/2017-07-29-onenote_2016_cannot_be_logged_in.html-9c7b9874.js b/assets/2017-07-29-onenote_2016_cannot_be_logged_in.html-daa34026.js similarity index 96% rename from assets/2017-07-29-onenote_2016_cannot_be_logged_in.html-9c7b9874.js rename to assets/2017-07-29-onenote_2016_cannot_be_logged_in.html-daa34026.js index 03e28aff..f6218de5 100644 --- a/assets/2017-07-29-onenote_2016_cannot_be_logged_in.html-9c7b9874.js +++ b/assets/2017-07-29-onenote_2016_cannot_be_logged_in.html-daa34026.js @@ -1 +1 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as c,c as i,a as e,b as t,d as l}from"./app-98132e77.js";const _={},r=e("p",null,"OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。",-1),s=e("figure",null,[e("img",{src:"https://pic4.zhimg.com/v2-d5945359b896ffd09d9973e9597ec06b_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),d={href:"http://live.com",target:"_blank",rel:"noopener noreferrer"},g=e("figure",null,[e("img",{src:"https://pic1.zhimg.com/v2-cc00b3039f755b92f9ae511c8b7debd0_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),p=e("p",null,"点击「IE 设置」>「Internet 选项」>「安全」>「自定义级别」,然后启用脚本选项的「Java 小程序脚本」和「活动脚本」。",-1),f=e("figure",null,[e("img",{src:"https://pic2.zhimg.com/v2-717bf3c8b62748b62a04219435b8a75d_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),m=e("figure",null,[e("img",{src:"https://pic4.zhimg.com/v2-25697b0c27aa8780c532b7a03a78dcbf_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),b=e("p",null,"完成设置后,即可正常登录并打开 OneNote。",-1),h=e("figure",null,[e("img",{src:"https://pic4.zhimg.com/v2-ff20ef8aa22215cba64b879775dfdf4f_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1);function u(v,x){const n=a("ExternalLinkIcon");return c(),i("div",null,[r,s,e("p",null,[t("打开 IE 浏览器,访问 "),e("a",d,[t("live.com"),l(n)]),t(",如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。")]),g,p,f,m,b,h])}const I=o(_,[["render",u],["__file","2017-07-29-onenote_2016_cannot_be_logged_in.html.vue"]]);export{I as default}; +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as c,c as i,a as e,b as t,d as l}from"./app-91ee3df5.js";const _={},r=e("p",null,"OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。",-1),s=e("figure",null,[e("img",{src:"https://pic4.zhimg.com/v2-d5945359b896ffd09d9973e9597ec06b_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),d={href:"http://live.com",target:"_blank",rel:"noopener noreferrer"},g=e("figure",null,[e("img",{src:"https://pic1.zhimg.com/v2-cc00b3039f755b92f9ae511c8b7debd0_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),p=e("p",null,"点击「IE 设置」>「Internet 选项」>「安全」>「自定义级别」,然后启用脚本选项的「Java 小程序脚本」和「活动脚本」。",-1),f=e("figure",null,[e("img",{src:"https://pic2.zhimg.com/v2-717bf3c8b62748b62a04219435b8a75d_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),m=e("figure",null,[e("img",{src:"https://pic4.zhimg.com/v2-25697b0c27aa8780c532b7a03a78dcbf_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),b=e("p",null,"完成设置后,即可正常登录并打开 OneNote。",-1),h=e("figure",null,[e("img",{src:"https://pic4.zhimg.com/v2-ff20ef8aa22215cba64b879775dfdf4f_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1);function u(v,x){const n=a("ExternalLinkIcon");return c(),i("div",null,[r,s,e("p",null,[t("打开 IE 浏览器,访问 "),e("a",d,[t("live.com"),l(n)]),t(",如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。")]),g,p,f,m,b,h])}const I=o(_,[["render",u],["__file","2017-07-29-onenote_2016_cannot_be_logged_in.html.vue"]]);export{I as default}; diff --git a/assets/2017-09-02-forced_shutdown.html-1f964250.js b/assets/2017-09-02-forced_shutdown.html-3a1481e0.js similarity index 98% rename from assets/2017-09-02-forced_shutdown.html-1f964250.js rename to assets/2017-09-02-forced_shutdown.html-3a1481e0.js index 04a46ce8..9ff7867d 100644 --- a/assets/2017-09-02-forced_shutdown.html-1f964250.js +++ b/assets/2017-09-02-forced_shutdown.html-3a1481e0.js @@ -1,4 +1,4 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as s,e as o}from"./app-98132e77.js";const i={},n=o(`

    晚上明明按下电脑的关机键,第二天早上却发现电脑开了一晚上?这是因为后台和 GUI 应用程序在阻止或取消关机,使得系统无法正常关机。为解决此问题,可以按照以下方法授予系统自动关机权限。

    手工操作

    1. 点击「开始菜单」,搜索「Regedit」,进入注册表编辑器。

    2. 打开窗口后,向注册表上方菜单输入路径 计算机\\HKEY_CURRENT_USER\\Control Panel\\Desktop

    3. 在右侧窗格中找到 AutoEndTasks 键值。若不存在,则新建一个名为 AutoEndTasks 的「字符串值」,并将键值的数值设为 1。AutoEndTasks 表示自动结束失去响应的程序任务。0 表示 false(默认值),而 1 表示 true,电脑会自动结束失去响应的程序。

    4. 查找或创建 WaitToKillAppTimeout 字符串值,并设定其数值为 2000。2000 以毫秒计,表示在程序失去响应后,系统将等待 2 秒后自动结束相应程序。

    按照以上步骤操作,即可设置电脑默认为强制关机。

    通过脚本修改

    如果你不愿手动修改注册表,可以选择以下三种脚本之一进行操作。

    注册表脚本修改

    复制下列命令并粘贴至文本编辑器(如记事本)中,保存文件,扩展名为 .reg,如 settings.reg。双击该文件即可将修改应用到注册表中。(脚本由 @daxixi 提供)

    Windows Registry Editor Version 5.00
    +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as s,e as o}from"./app-91ee3df5.js";const i={},n=o(`

    晚上明明按下电脑的关机键,第二天早上却发现电脑开了一晚上?这是因为后台和 GUI 应用程序在阻止或取消关机,使得系统无法正常关机。为解决此问题,可以按照以下方法授予系统自动关机权限。

    手工操作

    1. 点击「开始菜单」,搜索「Regedit」,进入注册表编辑器。

    2. 打开窗口后,向注册表上方菜单输入路径 计算机\\HKEY_CURRENT_USER\\Control Panel\\Desktop

    3. 在右侧窗格中找到 AutoEndTasks 键值。若不存在,则新建一个名为 AutoEndTasks 的「字符串值」,并将键值的数值设为 1。AutoEndTasks 表示自动结束失去响应的程序任务。0 表示 false(默认值),而 1 表示 true,电脑会自动结束失去响应的程序。

    4. 查找或创建 WaitToKillAppTimeout 字符串值,并设定其数值为 2000。2000 以毫秒计,表示在程序失去响应后,系统将等待 2 秒后自动结束相应程序。

    按照以上步骤操作,即可设置电脑默认为强制关机。

    通过脚本修改

    如果你不愿手动修改注册表,可以选择以下三种脚本之一进行操作。

    注册表脚本修改

    复制下列命令并粘贴至文本编辑器(如记事本)中,保存文件,扩展名为 .reg,如 settings.reg。双击该文件即可将修改应用到注册表中。(脚本由 @daxixi 提供)

    Windows Registry Editor Version 5.00
     
     [HKEY_CURRENT_USER\\Control Panel\\Desktop]
     "AutoEndTasks"="1"
    diff --git a/assets/2017-09-03-smb_lan_sharing.html-0c2306a0.js b/assets/2017-09-03-smb_lan_sharing.html-843523f8.js
    similarity index 96%
    rename from assets/2017-09-03-smb_lan_sharing.html-0c2306a0.js
    rename to assets/2017-09-03-smb_lan_sharing.html-843523f8.js
    index 9c867975..33361d51 100644
    --- a/assets/2017-09-03-smb_lan_sharing.html-0c2306a0.js
    +++ b/assets/2017-09-03-smb_lan_sharing.html-843523f8.js
    @@ -1 +1 @@
    -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as e,e as c}from"./app-98132e77.js";const t={},o=c('

    Windows 系统开启 SMB 协议:

    1. 打开「控制面板」窗口,在「类别」查看方式下单击「程序」。

    2. 打开「程序」窗口,单击「启用或关闭 windows 功能」。

    3. 打开「windows 功能」窗口,勾选 SMB 直通。

    4. 勾选「远程差分压缩 API 支持」。

    网上很多教程都要求关闭“远程差分压缩”复选框,这是对“远程差分压缩”的误解。

    官方解释:远程差分压缩 (RDC) 功能是一组应用程序编程接口 (API),这些应用程序可用于确定某个文件集是否发生了变化,如果是,就检测哪部分文件进行了更改。RDC 检测文件中数据的插入、删除和重新排列,使应用程序能够仅复制文件的已更改部分。这对于在有限带宽网络(如广域网 (WAN) 连接)上复制文件非常有用。

    ',4),p=[o];function n(g,l){return a(),e("div",null,p)}const s=i(t,[["render",n],["__file","2017-09-03-smb_lan_sharing.html.vue"]]);export{s as default}; +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as e,e as c}from"./app-91ee3df5.js";const t={},o=c('

    Windows 系统开启 SMB 协议:

    1. 打开「控制面板」窗口,在「类别」查看方式下单击「程序」。

    2. 打开「程序」窗口,单击「启用或关闭 windows 功能」。

    3. 打开「windows 功能」窗口,勾选 SMB 直通。

    4. 勾选「远程差分压缩 API 支持」。

    网上很多教程都要求关闭“远程差分压缩”复选框,这是对“远程差分压缩”的误解。

    官方解释:远程差分压缩 (RDC) 功能是一组应用程序编程接口 (API),这些应用程序可用于确定某个文件集是否发生了变化,如果是,就检测哪部分文件进行了更改。RDC 检测文件中数据的插入、删除和重新排列,使应用程序能够仅复制文件的已更改部分。这对于在有限带宽网络(如广域网 (WAN) 连接)上复制文件非常有用。

    ',4),p=[o];function n(g,l){return a(),e("div",null,p)}const s=i(t,[["render",n],["__file","2017-09-03-smb_lan_sharing.html.vue"]]);export{s as default}; diff --git a/assets/2017-10-18-light_cat_e8-c-epon_admin.html-0f81a2e3.js b/assets/2017-10-18-light_cat_e8-c-epon_admin.html-70760835.js similarity index 97% rename from assets/2017-10-18-light_cat_e8-c-epon_admin.html-0f81a2e3.js rename to assets/2017-10-18-light_cat_e8-c-epon_admin.html-70760835.js index 414ca3a5..eb28623d 100644 --- a/assets/2017-10-18-light_cat_e8-c-epon_admin.html-0f81a2e3.js +++ b/assets/2017-10-18-light_cat_e8-c-epon_admin.html-70760835.js @@ -1 +1 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as c,c as i,e as t}from"./app-98132e77.js";const a={},o=t('

    为什么要获得光猫超级密码?

    它可以用于端口映射(eMule high ID)和桥接模式(路由器掌控拨号,但不兼容固定电话)。网上关于光猫超级密码的获取攻略大多是在 2012-14 年发布的,现在已经不能使用了。

    破解测试环境

    运营商:上海电信
    光猫型号:贝尔 E8-C-EPON
    硬件版本:RG201O-CA_V1A2
    软件版本:E201OCAA2V11S

    光猫超级密码破解

    1. 地址栏输入 192.168.1.1,用户名:<光猫背面>,密码:<光猫背面>,登录管理界面。

    2. 在浏览器地址栏输入 192.168.1.1/backupsettings.txt,将 backupsettings.txt 文件导出并备份在电脑上。如果无法打开,请改为输入 192.168.1.1/backupsettings.conf,并做好备份。

    3. 打开下载的 backupsettings.txtbackupsettings.conf 文件,搜索 TeleComAccount,两个 password 之间就是超级密码。超级账号是 telecomadmin

    4. 输入地址 192.168.1.1,用刚获取的超级密码登录,然后可以进行端口映射和设备桥接。

    如果新安装的光猫无法获取超级密码,可以使用运营商的官方应用进行映射。

    ',7),d=[o];function n(r,p){return c(),i("div",null,d)}const g=e(a,[["render",n],["__file","2017-10-18-light_cat_e8-c-epon_admin.html.vue"]]);export{g as default}; +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as c,c as i,e as t}from"./app-91ee3df5.js";const a={},o=t('

    为什么要获得光猫超级密码?

    它可以用于端口映射(eMule high ID)和桥接模式(路由器掌控拨号,但不兼容固定电话)。网上关于光猫超级密码的获取攻略大多是在 2012-14 年发布的,现在已经不能使用了。

    破解测试环境

    运营商:上海电信
    光猫型号:贝尔 E8-C-EPON
    硬件版本:RG201O-CA_V1A2
    软件版本:E201OCAA2V11S

    光猫超级密码破解

    1. 地址栏输入 192.168.1.1,用户名:<光猫背面>,密码:<光猫背面>,登录管理界面。

    2. 在浏览器地址栏输入 192.168.1.1/backupsettings.txt,将 backupsettings.txt 文件导出并备份在电脑上。如果无法打开,请改为输入 192.168.1.1/backupsettings.conf,并做好备份。

    3. 打开下载的 backupsettings.txtbackupsettings.conf 文件,搜索 TeleComAccount,两个 password 之间就是超级密码。超级账号是 telecomadmin

    4. 输入地址 192.168.1.1,用刚获取的超级密码登录,然后可以进行端口映射和设备桥接。

    如果新安装的光猫无法获取超级密码,可以使用运营商的官方应用进行映射。

    ',7),d=[o];function n(r,p){return c(),i("div",null,d)}const g=e(a,[["render",n],["__file","2017-10-18-light_cat_e8-c-epon_admin.html.vue"]]);export{g as default}; diff --git a/assets/2017-10-18-light_cat_port_forwarding.html-c6876b92.js b/assets/2017-10-18-light_cat_port_forwarding.html-a94fa066.js similarity index 92% rename from assets/2017-10-18-light_cat_port_forwarding.html-c6876b92.js rename to assets/2017-10-18-light_cat_port_forwarding.html-a94fa066.js index 6867d2fc..17b21d37 100644 --- a/assets/2017-10-18-light_cat_port_forwarding.html-c6876b92.js +++ b/assets/2017-10-18-light_cat_port_forwarding.html-a94fa066.js @@ -1 +1 @@ -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as r,c,a as i,b as t,d as n,e as p}from"./app-98132e77.js";const g={},l={href:"https://gpt-vip.top/posts/2017-10-18-Light_cat_E8-C-EPON_admin.html",target:"_blank",rel:"noopener noreferrer"},f=p('

    光猫端口映射步骤:

    1. 登陆光猫管理地址 192.168.1.1,应用 → 高级 NAT 设置 →DMZ 设置,启用 DMZ 主机绑定路由器地址(路由器 WAN 口 IP 地址 -192.168.1.X)

    2. 登陆路由器管理地址 192.168.X.X。这里已梅林 AC5300 为图例。

    3. 在路由器设置选项中找到“端口转发”,按要求设置端口。我这是 eMule TCP 和 UDP 转发,设置完成后,变成 High ID。

    ',2);function s(_,d){const e=o("ExternalLinkIcon");return r(),c("div",null,[i("p",null,[t("光猫默认没有管理权限,需要先获得光猫的超管密码,参考"),i("a",l,[t("光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)"),n(e)]),t("。")]),f])}const u=a(g,[["render",s],["__file","2017-10-18-light_cat_port_forwarding.html.vue"]]);export{u as default}; +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as r,c,a as i,b as t,d as n,e as p}from"./app-91ee3df5.js";const g={},l={href:"https://gpt-vip.top/posts/2017-10-18-Light_cat_E8-C-EPON_admin.html",target:"_blank",rel:"noopener noreferrer"},f=p('

    光猫端口映射步骤:

    1. 登陆光猫管理地址 192.168.1.1,应用 → 高级 NAT 设置 →DMZ 设置,启用 DMZ 主机绑定路由器地址(路由器 WAN 口 IP 地址 -192.168.1.X)

    2. 登陆路由器管理地址 192.168.X.X。这里已梅林 AC5300 为图例。

    3. 在路由器设置选项中找到“端口转发”,按要求设置端口。我这是 eMule TCP 和 UDP 转发,设置完成后,变成 High ID。

    ',2);function s(_,d){const e=o("ExternalLinkIcon");return r(),c("div",null,[i("p",null,[t("光猫默认没有管理权限,需要先获得光猫的超管密码,参考"),i("a",l,[t("光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)"),n(e)]),t("。")]),f])}const u=a(g,[["render",s],["__file","2017-10-18-light_cat_port_forwarding.html.vue"]]);export{u as default}; diff --git a/assets/2018-01-19-forget_the_cdn.html-84186388.js b/assets/2018-01-19-forget_the_cdn.html-f63d4197.js similarity index 97% rename from assets/2018-01-19-forget_the_cdn.html-84186388.js rename to assets/2018-01-19-forget_the_cdn.html-f63d4197.js index 8f54b64f..b0557d05 100644 --- a/assets/2018-01-19-forget_the_cdn.html-84186388.js +++ b/assets/2018-01-19-forget_the_cdn.html-f63d4197.js @@ -1 +1 @@ -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{o,c as e,e as p}from"./app-98132e77.js";const n={},r=p("

    CDN 的全称是 Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN 系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet 网络拥挤的状况,提高用户访问网站的响应速度。

    国内 CDN 有阿里云、腾讯、百度、网宿、七牛云、又拍云等。

    这里以阿里云 CDN 为例。我之前使用阿里云全站 CDN,一直以为速度会加快。但命中率只有 7%,在更换为 ECS 后,命中率更降为 2%。

    更可怕的是,我提交工单后才得到的事实。CDN 运营商会根据 DNS 分配就近分配 CDN 节点,抓取网站缓存。

    第一反应:「不错啊。如果网站在北京,访客在上海,直接访问上海的节点,速度必然要快一些。」

    但事实并没有这么完美。CDN 是根据本地 DNS 来分配节点。

    你从上海放出访问申请,DNS 有可能帮你分配去广东的节点。极端情况下,有可能分配到不同运营商,导致无法打开网站。

    我进行了三个测试,本地网络环境都是上海电信,更换了 DNS 设置。

    第一次测试使用 114DNS,分配了广州鹏博士网络,网站打不开。提交工单后,客服反映这个节点是局域网节点,只有鹏博士网络才能打开。

    第二次测试使用电信默认 DNS,分配苏州电信,网站正常。

    第三次测试使用阿里云 DNS,分配杭州电信,网站正常

    后面两次虽然都能打开网站,但没有一个分配在上海电信,这种加速又能快多少呢?

    在网站配置足够、流量不大(日均访客 1000 以内) 时,不建议使用全站 CDN,这只会拖累访问体验。小网站只适合将图片部署在 CDN。

    ",13),s=[r];function c(_,N){return o(),e("div",null,s)}const l=t(n,[["render",c],["__file","2018-01-19-forget_the_cdn.html.vue"]]);export{l as default}; +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{o,c as e,e as p}from"./app-91ee3df5.js";const n={},r=p("

    CDN 的全称是 Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN 系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet 网络拥挤的状况,提高用户访问网站的响应速度。

    国内 CDN 有阿里云、腾讯、百度、网宿、七牛云、又拍云等。

    这里以阿里云 CDN 为例。我之前使用阿里云全站 CDN,一直以为速度会加快。但命中率只有 7%,在更换为 ECS 后,命中率更降为 2%。

    更可怕的是,我提交工单后才得到的事实。CDN 运营商会根据 DNS 分配就近分配 CDN 节点,抓取网站缓存。

    第一反应:「不错啊。如果网站在北京,访客在上海,直接访问上海的节点,速度必然要快一些。」

    但事实并没有这么完美。CDN 是根据本地 DNS 来分配节点。

    你从上海放出访问申请,DNS 有可能帮你分配去广东的节点。极端情况下,有可能分配到不同运营商,导致无法打开网站。

    我进行了三个测试,本地网络环境都是上海电信,更换了 DNS 设置。

    第一次测试使用 114DNS,分配了广州鹏博士网络,网站打不开。提交工单后,客服反映这个节点是局域网节点,只有鹏博士网络才能打开。

    第二次测试使用电信默认 DNS,分配苏州电信,网站正常。

    第三次测试使用阿里云 DNS,分配杭州电信,网站正常

    后面两次虽然都能打开网站,但没有一个分配在上海电信,这种加速又能快多少呢?

    在网站配置足够、流量不大(日均访客 1000 以内) 时,不建议使用全站 CDN,这只会拖累访问体验。小网站只适合将图片部署在 CDN。

    ",13),s=[r];function c(_,N){return o(),e("div",null,s)}const l=t(n,[["render",c],["__file","2018-01-19-forget_the_cdn.html.vue"]]);export{l as default}; diff --git a/assets/2018-01-31-hire_a_robot.html-4daf9d55.js b/assets/2018-01-31-hire_a_robot.html-5693ecc6.js similarity index 95% rename from assets/2018-01-31-hire_a_robot.html-4daf9d55.js rename to assets/2018-01-31-hire_a_robot.html-5693ecc6.js index 2f174214..9ec693a9 100644 --- a/assets/2018-01-31-hire_a_robot.html-4daf9d55.js +++ b/assets/2018-01-31-hire_a_robot.html-5693ecc6.js @@ -1 +1 @@ -import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as a,c as s,a as e,b as t,d as n,e as i}from"./app-98132e77.js";const c={},_=i('

    机器人会取代你工作!
    计算云会取代你工作!
    AI 会取代你的工作!

    我相信科技终究有一天会消灭所有工作,但我们这代人的无奈就是很难等到这一天。

    作为懒人、宅男,等不及了怎么办?

    既然还没被取代,那就雇个机器人帮你干活

    我每天第一件事是去各个网站看热门新闻、行业资料。以前是用 RSS,但 RSS 被视为落后,越来越多的网站不再提供 RSS 源。离开 RSS,我就一直没找到更合适的方法去将内容聚合起来,不得不在一个个网站间疲于奔命,逐渐不再看内容。

    RSS(Really Simple Syndication) 是一种描述和同步网站内容的格式,是使用最广泛的 XML 应用。简易信息聚合(也叫聚合内容)是一种 RSS 基于 XML 标准,在互联网上被广泛采用的内容包装和投递协议。

    ',7),p={href:"https://github.com/huginn/huginn",target:"_blank",rel:"noopener noreferrer"},u=e("blockquote",null,[e("p",null,"Huginn 是一个可以创建为你在线执行自动化任务的系统。Huginn 可以读取网页,监测事件并且执行符合你需求的动作。Huginn 通过 agents 创建并执行任务(事件流)。你可以将它看作是一个运行在你自己服务器上的 IFTTT 或 Zapier。")],-1),d=e("p",null,"Huginn 帮我将所有信息聚合成 RSS,24 小时帮我获取我要的内容。",-1),b={href:"http://news.163.com/rank",target:"_blank",rel:"noopener noreferrer"},h={href:"http://top.baidu.com/buzz?b=1",target:"_blank",rel:"noopener noreferrer"},k={href:"https://www.guokr.com/",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,"工作类:梅花、SocialBeta、数英网、艾瑞网",-1);function f(S,g){const o=r("ExternalLinkIcon");return a(),s("div",null,[_,e("p",null,[e("strong",null,[t("直到遇到了我的第一个机器人雇员 "),e("a",p,[t("Huginn"),n(o)])])]),u,d,e("ul",null,[e("li",null,[e("a",b,[t("网易热门新闻"),n(o)]),t(":抓取网易顶贴最多的 100 条新闻")]),e("li",null,[e("a",h,[t("百度实时热点"),n(o)]),t(":实时更新每天的百度热点")]),e("li",null,[e("a",k,[t("果壳网"),n(o)]),t(":果壳首页推荐,官方更新速度较慢,刚好可以了解些奇思妙想")]),m])])}const H=l(c,[["render",f],["__file","2018-01-31-hire_a_robot.html.vue"]]);export{H as default}; +import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as a,c as s,a as e,b as t,d as n,e as i}from"./app-91ee3df5.js";const c={},_=i('

    机器人会取代你工作!
    计算云会取代你工作!
    AI 会取代你的工作!

    我相信科技终究有一天会消灭所有工作,但我们这代人的无奈就是很难等到这一天。

    作为懒人、宅男,等不及了怎么办?

    既然还没被取代,那就雇个机器人帮你干活

    我每天第一件事是去各个网站看热门新闻、行业资料。以前是用 RSS,但 RSS 被视为落后,越来越多的网站不再提供 RSS 源。离开 RSS,我就一直没找到更合适的方法去将内容聚合起来,不得不在一个个网站间疲于奔命,逐渐不再看内容。

    RSS(Really Simple Syndication) 是一种描述和同步网站内容的格式,是使用最广泛的 XML 应用。简易信息聚合(也叫聚合内容)是一种 RSS 基于 XML 标准,在互联网上被广泛采用的内容包装和投递协议。

    ',7),p={href:"https://github.com/huginn/huginn",target:"_blank",rel:"noopener noreferrer"},u=e("blockquote",null,[e("p",null,"Huginn 是一个可以创建为你在线执行自动化任务的系统。Huginn 可以读取网页,监测事件并且执行符合你需求的动作。Huginn 通过 agents 创建并执行任务(事件流)。你可以将它看作是一个运行在你自己服务器上的 IFTTT 或 Zapier。")],-1),d=e("p",null,"Huginn 帮我将所有信息聚合成 RSS,24 小时帮我获取我要的内容。",-1),b={href:"http://news.163.com/rank",target:"_blank",rel:"noopener noreferrer"},h={href:"http://top.baidu.com/buzz?b=1",target:"_blank",rel:"noopener noreferrer"},k={href:"https://www.guokr.com/",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,"工作类:梅花、SocialBeta、数英网、艾瑞网",-1);function f(S,g){const o=r("ExternalLinkIcon");return a(),s("div",null,[_,e("p",null,[e("strong",null,[t("直到遇到了我的第一个机器人雇员 "),e("a",p,[t("Huginn"),n(o)])])]),u,d,e("ul",null,[e("li",null,[e("a",b,[t("网易热门新闻"),n(o)]),t(":抓取网易顶贴最多的 100 条新闻")]),e("li",null,[e("a",h,[t("百度实时热点"),n(o)]),t(":实时更新每天的百度热点")]),e("li",null,[e("a",k,[t("果壳网"),n(o)]),t(":果壳首页推荐,官方更新速度较慢,刚好可以了解些奇思妙想")]),m])])}const H=l(c,[["render",f],["__file","2018-01-31-hire_a_robot.html.vue"]]);export{H as default}; diff --git a/assets/2018-04-30-baota_deploy_vps.html-ffa462f1.js b/assets/2018-04-30-baota_deploy_vps.html-ad71fe89.js similarity index 96% rename from assets/2018-04-30-baota_deploy_vps.html-ffa462f1.js rename to assets/2018-04-30-baota_deploy_vps.html-ad71fe89.js index fe7ea5cc..79d03f65 100644 --- a/assets/2018-04-30-baota_deploy_vps.html-ffa462f1.js +++ b/assets/2018-04-30-baota_deploy_vps.html-ad71fe89.js @@ -1 +1 @@ -import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as a,c as s,a as t,b as e,d as r}from"./app-98132e77.js";const i={},c=t("p",null,"新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。",-1),p=t("p",null,"国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。",-1),_=t("blockquote",null,[t("p",null,"一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP")],-1),d=t("figure",null,[t("img",{src:"https://img.gpt-vip.top/20180430000000.jpg?imageMogr2/format/webp",alt:"宝塔面板界面图",tabindex:"0",loading:"lazy"}),t("figcaption",null,"宝塔面板界面图")],-1),h={href:"https://www.bt.cn/bbs/thread-1186-1-1.html",target:"_blank",rel:"noopener noreferrer"},m=t("h2",{id:"宝塔安装-lnmp-或-lamp-环境",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#宝塔安装-lnmp-或-lamp-环境","aria-hidden":"true"},"#"),e(" 宝塔安装 LNMP 或 LAMP 环境")],-1),g=t("p",null,[t("strong",null,"LNMP"),e(" 和 "),t("strong",null,"LAMP"),e(" 都是成熟的建站环境,根据自身需求选择其中之一即可。如果有特殊的定制需求,可以在左侧的「软件管理」中选择需要安装的环境。")],-1),u=t("figure",null,[t("img",{src:"https://img.gpt-vip.top/20180430000001.jpg?imageMogr2/format/webp",alt:"软件安装界面",tabindex:"0",loading:"lazy"}),t("figcaption",null,"软件安装界面")],-1);function f(b,x){const o=l("ExternalLinkIcon");return a(),s("div",null,[c,p,_,d,t("p",null,[e("宝塔安装说明:"),t("a",h,[e("https://www.bt.cn/bbs/thread-1186-1-1.html"),r(o)])]),m,g,u])}const w=n(i,[["render",f],["__file","2018-04-30-baota_deploy_vps.html.vue"]]);export{w as default}; +import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as a,c as s,a as t,b as e,d as r}from"./app-91ee3df5.js";const i={},c=t("p",null,"新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。",-1),p=t("p",null,"国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。",-1),_=t("blockquote",null,[t("p",null,"一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP")],-1),d=t("figure",null,[t("img",{src:"https://img.gpt-vip.top/20180430000000.jpg?imageMogr2/format/webp",alt:"宝塔面板界面图",tabindex:"0",loading:"lazy"}),t("figcaption",null,"宝塔面板界面图")],-1),h={href:"https://www.bt.cn/bbs/thread-1186-1-1.html",target:"_blank",rel:"noopener noreferrer"},m=t("h2",{id:"宝塔安装-lnmp-或-lamp-环境",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#宝塔安装-lnmp-或-lamp-环境","aria-hidden":"true"},"#"),e(" 宝塔安装 LNMP 或 LAMP 环境")],-1),g=t("p",null,[t("strong",null,"LNMP"),e(" 和 "),t("strong",null,"LAMP"),e(" 都是成熟的建站环境,根据自身需求选择其中之一即可。如果有特殊的定制需求,可以在左侧的「软件管理」中选择需要安装的环境。")],-1),u=t("figure",null,[t("img",{src:"https://img.gpt-vip.top/20180430000001.jpg?imageMogr2/format/webp",alt:"软件安装界面",tabindex:"0",loading:"lazy"}),t("figcaption",null,"软件安装界面")],-1);function f(b,x){const o=l("ExternalLinkIcon");return a(),s("div",null,[c,p,_,d,t("p",null,[e("宝塔安装说明:"),t("a",h,[e("https://www.bt.cn/bbs/thread-1186-1-1.html"),r(o)])]),m,g,u])}const w=n(i,[["render",f],["__file","2018-04-30-baota_deploy_vps.html.vue"]]);export{w as default}; diff --git a/assets/2018-05-01-jekyll_blog_on_github_pages.html-b6531d3d.js b/assets/2018-05-01-jekyll_blog_on_github_pages.html-4d0c642b.js similarity index 97% rename from assets/2018-05-01-jekyll_blog_on_github_pages.html-b6531d3d.js rename to assets/2018-05-01-jekyll_blog_on_github_pages.html-4d0c642b.js index d663713d..28004c81 100644 --- a/assets/2018-05-01-jekyll_blog_on_github_pages.html-b6531d3d.js +++ b/assets/2018-05-01-jekyll_blog_on_github_pages.html-4d0c642b.js @@ -1 +1 @@ -import{_ as a}from"./libaxuan-github-io-a3ff3974.js";import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as l,c as g,a as e,b as t,d as i,e as c}from"./app-98132e77.js";const p={},s=e("p",null,"一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。",-1),d=e("p",null,"偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。",-1),h=e("h3",{id:"搭建流程",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#搭建流程","aria-hidden":"true"},"#"),t(" 搭建流程")],-1),_={href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"},u={href:"http://jekyllthemes.org/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/Huxpro/huxpro.github.io",target:"_blank",rel:"noopener noreferrer"},m=c('
  • 点击 Fork, 将喜欢的模板复制到自己的 Github 仓库中。

  • 点击 Setting, 修改 Repository namexxx.github.io, xxx 是你的 Github 用户名。

  • 同一页面选择「Code and automation」>「Pages」>「Build and deployment」>「Branch」, 将 master branch 设为 Github Pages 来源,网站运行目录默认为 /(root)。设置好后,点击「Save」。

  • 最后,按页面提示访问链接 https://xxx.github.io/,新博客搭建完毕。

  • ',4);function b(x,k){const o=n("ExternalLinkIcon");return l(),g("div",null,[s,d,h,e("ol",null,[e("li",null,[e("p",null,[t("注册并登录 "),e("a",_,[t("Github"),i(o)]),t("。")])]),e("li",null,[e("p",null,[t("选择一个喜欢的 "),e("a",u,[t("Jekyll 模板"),i(o)]),t(", 进入对应的 Github 主页。我选了黄玄的 "),e("a",f,[t("Hux Blog"),i(o)]),t("。")])]),m])])}const B=r(p,[["render",b],["__file","2018-05-01-jekyll_blog_on_github_pages.html.vue"]]);export{B as default}; +import{_ as a}from"./libaxuan-github-io-a3ff3974.js";import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as l,c as g,a as e,b as t,d as i,e as c}from"./app-91ee3df5.js";const p={},s=e("p",null,"一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。",-1),d=e("p",null,"偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。",-1),h=e("h3",{id:"搭建流程",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#搭建流程","aria-hidden":"true"},"#"),t(" 搭建流程")],-1),_={href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"},u={href:"http://jekyllthemes.org/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/Huxpro/huxpro.github.io",target:"_blank",rel:"noopener noreferrer"},m=c('
  • 点击 Fork, 将喜欢的模板复制到自己的 Github 仓库中。

  • 点击 Setting, 修改 Repository namexxx.github.io, xxx 是你的 Github 用户名。

  • 同一页面选择「Code and automation」>「Pages」>「Build and deployment」>「Branch」, 将 master branch 设为 Github Pages 来源,网站运行目录默认为 /(root)。设置好后,点击「Save」。

  • 最后,按页面提示访问链接 https://xxx.github.io/,新博客搭建完毕。

  • ',4);function b(x,k){const o=n("ExternalLinkIcon");return l(),g("div",null,[s,d,h,e("ol",null,[e("li",null,[e("p",null,[t("注册并登录 "),e("a",_,[t("Github"),i(o)]),t("。")])]),e("li",null,[e("p",null,[t("选择一个喜欢的 "),e("a",u,[t("Jekyll 模板"),i(o)]),t(", 进入对应的 Github 主页。我选了黄玄的 "),e("a",f,[t("Hux Blog"),i(o)]),t("。")])]),m])])}const B=r(p,[["render",b],["__file","2018-05-01-jekyll_blog_on_github_pages.html.vue"]]);export{B as default}; diff --git a/assets/2018-05-02-jekyll_blog_on_vps.html-2a013007.js b/assets/2018-05-02-jekyll_blog_on_vps.html-77a2f885.js similarity index 89% rename from assets/2018-05-02-jekyll_blog_on_vps.html-2a013007.js rename to assets/2018-05-02-jekyll_blog_on_vps.html-77a2f885.js index 35ce914c..a8a42751 100644 --- a/assets/2018-05-02-jekyll_blog_on_vps.html-2a013007.js +++ b/assets/2018-05-02-jekyll_blog_on_vps.html-77a2f885.js @@ -1 +1 @@ -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as c,o as r,c as n,a as l,b as e,d as s,e as a}from"./app-98132e77.js";const _={},i=l("p",null,"Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。",-1),d={href:"https://www.jekyll.com.cn/docs/quickstart/",target:"_blank",rel:"noopener noreferrer"},p=a("
    1. 使用 RVM 安装 Ruby (rvm -> ruby -> gem 网上大量教程就不赘述了)

    2. 安装 jekyll:gem install jekyll

    3. 进入 jekyll 网站,执行命令行 jekyll build,生成 Jekyll 静态网页。

    4. 网站的执行目录需要指定在 _site,这是 Jekyll 生成的静态页面目录。之后每次更新博客,都需要进入服务器执行一次 jekyll build,重新生成静态页面。

    愿意折腾的话,可以使用 Travis CI 和 Docker 完成全自动化更新。

    ",2);function k(m,y){const o=c("ExternalLinkIcon");return r(),n("div",null,[i,l("p",null,[e("Jekyll 环境官方"),l("a",d,[e("安装指南"),s(o)]),e(":")]),p])}const b=t(_,[["render",k],["__file","2018-05-02-jekyll_blog_on_vps.html.vue"]]);export{b as default}; +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as c,o as r,c as n,a as l,b as e,d as s,e as a}from"./app-91ee3df5.js";const _={},i=l("p",null,"Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。",-1),d={href:"https://www.jekyll.com.cn/docs/quickstart/",target:"_blank",rel:"noopener noreferrer"},p=a("
    1. 使用 RVM 安装 Ruby (rvm -> ruby -> gem 网上大量教程就不赘述了)

    2. 安装 jekyll:gem install jekyll

    3. 进入 jekyll 网站,执行命令行 jekyll build,生成 Jekyll 静态网页。

    4. 网站的执行目录需要指定在 _site,这是 Jekyll 生成的静态页面目录。之后每次更新博客,都需要进入服务器执行一次 jekyll build,重新生成静态页面。

    愿意折腾的话,可以使用 Travis CI 和 Docker 完成全自动化更新。

    ",2);function k(m,y){const o=c("ExternalLinkIcon");return r(),n("div",null,[i,l("p",null,[e("Jekyll 环境官方"),l("a",d,[e("安装指南"),s(o)]),e(":")]),p])}const b=t(_,[["render",k],["__file","2018-05-02-jekyll_blog_on_vps.html.vue"]]);export{b as default}; diff --git a/assets/2018-05-03-jekyll_blog_autodeploy.html-3440f2df.js b/assets/2018-05-03-jekyll_blog_autodeploy.html-fe7f76ca.js similarity index 99% rename from assets/2018-05-03-jekyll_blog_autodeploy.html-3440f2df.js rename to assets/2018-05-03-jekyll_blog_autodeploy.html-fe7f76ca.js index 3339a1f1..d10e590e 100644 --- a/assets/2018-05-03-jekyll_blog_autodeploy.html-3440f2df.js +++ b/assets/2018-05-03-jekyll_blog_autodeploy.html-fe7f76ca.js @@ -1,4 +1,4 @@ -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o,c as r,a as n,b as s,d as e,e as i}from"./app-98132e77.js";const c={},p=i(`

    Github 上搭建 Jekyll 是最方便的,空间免费、流量免费、部署简单。但 Github 属于被墙状态,将博客部署在那,速度实在太慢。在玩了几天后,我开始在服务器上直接搭建 Jekyll 博客。

    服务器搭建需要人工执行 jekyll build, 完全背离了最开始搭建博客的初衷-方便。之后结合了网络上多个自动化方案,选定入门成本最低的 Github -> Travis CI -> Docker-> VPS

    搭建思路

    • 本地提交博客 Markdown 文件 到 Github 源文件 repository
    • Github 触发 Travis CI 执行自动编译
    • Travis CI 编译后 push 静态文件到 Github 静态文件 repository
    • Travis CI 通知 Docker 重建镜像(预计 5 分钟)
    • 服务器休眠 5 分钟后,Travis CI 通知服务器
    • 服务器拉取最新镜像,然后停止并删除原容器,用最新镜像重建容器

    Travis CI 基本配置

    Travis CI 对于开源项目完全免费,并且能自动感知到 Github 的 commit,帮我们解决了静态文件生成问题。

    先用 Github 登录 Travis CI,然后点击最右侧的头像,开启想要使用 Travis CI 的项目

    点击设置按钮,进入项目设置

    静态文件更新

    Travis CI push 静态文件到 Github 通过 Github 的 token 实现授权,push 代码如下

    after_success:
    +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o,c as r,a as n,b as s,d as e,e as i}from"./app-91ee3df5.js";const c={},p=i(`

    Github 上搭建 Jekyll 是最方便的,空间免费、流量免费、部署简单。但 Github 属于被墙状态,将博客部署在那,速度实在太慢。在玩了几天后,我开始在服务器上直接搭建 Jekyll 博客。

    服务器搭建需要人工执行 jekyll build, 完全背离了最开始搭建博客的初衷-方便。之后结合了网络上多个自动化方案,选定入门成本最低的 Github -> Travis CI -> Docker-> VPS

    搭建思路

    • 本地提交博客 Markdown 文件 到 Github 源文件 repository
    • Github 触发 Travis CI 执行自动编译
    • Travis CI 编译后 push 静态文件到 Github 静态文件 repository
    • Travis CI 通知 Docker 重建镜像(预计 5 分钟)
    • 服务器休眠 5 分钟后,Travis CI 通知服务器
    • 服务器拉取最新镜像,然后停止并删除原容器,用最新镜像重建容器

    Travis CI 基本配置

    Travis CI 对于开源项目完全免费,并且能自动感知到 Github 的 commit,帮我们解决了静态文件生成问题。

    先用 Github 登录 Travis CI,然后点击最右侧的头像,开启想要使用 Travis CI 的项目

    点击设置按钮,进入项目设置

    静态文件更新

    Travis CI push 静态文件到 Github 通过 Github 的 token 实现授权,push 代码如下

    after_success:
       - git clone https://github.com/rockbenben/rockbenben.github.io.git
       - cd rockbenben.github.io && rm -rf * && cp -r ../_site/* .
       - git config user.name "rockbenben"
    diff --git a/assets/2018-05-04-audition_cut_mp3.html-d3ab3139.js b/assets/2018-05-04-audition_cut_mp3.html-2e73aabd.js
    similarity index 96%
    rename from assets/2018-05-04-audition_cut_mp3.html-d3ab3139.js
    rename to assets/2018-05-04-audition_cut_mp3.html-2e73aabd.js
    index d33a13ba..c7ab2072 100644
    --- a/assets/2018-05-04-audition_cut_mp3.html-d3ab3139.js
    +++ b/assets/2018-05-04-audition_cut_mp3.html-2e73aabd.js
    @@ -1 +1 @@
    -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c as o,e as g}from"./app-98132e77.js";const p={},a=g('

    很久没剪音频了,突然被朋友拜托,才发现 Audition 剪切音频有多非人性,操作跟 10 年前的软件相比,没任何进步。

    简易剪切流程

    1. 在 Audition 中打开音频文件。

    2. 选定要删除的音频部分:左键按住在删除音频起点,然后拉动到删除音频重点,放开左键。

    3. 点击右键,选择删除。刚才选择的音频就被删除了。

    4. 在混音器中点击,用鼠标滚轮放大音频的可选间距,重复上面 3 步,继续剪切音频。

    5. 精修完后,点击「文件」>「另存为」,就可以保存我们的音频文件了。

    PS:原本是想用时间来截取音频,但找遍 Audition 菜单,也没发现能按时间来剪切的选项。最后还是靠鼠标完成的。。

    ',4),n=[a];function e(r,l){return t(),o("div",null,n)}const f=i(p,[["render",e],["__file","2018-05-04-audition_cut_mp3.html.vue"]]);export{f as default}; +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c as o,e as g}from"./app-91ee3df5.js";const p={},a=g('

    很久没剪音频了,突然被朋友拜托,才发现 Audition 剪切音频有多非人性,操作跟 10 年前的软件相比,没任何进步。

    简易剪切流程

    1. 在 Audition 中打开音频文件。

    2. 选定要删除的音频部分:左键按住在删除音频起点,然后拉动到删除音频重点,放开左键。

    3. 点击右键,选择删除。刚才选择的音频就被删除了。

    4. 在混音器中点击,用鼠标滚轮放大音频的可选间距,重复上面 3 步,继续剪切音频。

    5. 精修完后,点击「文件」>「另存为」,就可以保存我们的音频文件了。

    PS:原本是想用时间来截取音频,但找遍 Audition 菜单,也没发现能按时间来剪切的选项。最后还是靠鼠标完成的。。

    ',4),n=[a];function e(r,l){return t(),o("div",null,n)}const f=i(p,[["render",e],["__file","2018-05-04-audition_cut_mp3.html.vue"]]);export{f as default}; diff --git a/assets/2018-05-15-aria2_a_new_download_tool.html-3f3f16e9.js b/assets/2018-05-15-aria2_a_new_download_tool.html-a1e3564b.js similarity index 99% rename from assets/2018-05-15-aria2_a_new_download_tool.html-3f3f16e9.js rename to assets/2018-05-15-aria2_a_new_download_tool.html-a1e3564b.js index b78389cd..d7fde35a 100644 --- a/assets/2018-05-15-aria2_a_new_download_tool.html-3f3f16e9.js +++ b/assets/2018-05-15-aria2_a_new_download_tool.html-a1e3564b.js @@ -1,4 +1,4 @@ -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as s,c as l,a as e,b as o,d as n,e as r}from"./app-98132e77.js";const c={},d=r('

    迅雷已经用了 10 年,一直将它视为最快也最方便的下载工具,也一直购买迅雷会员。

    但是,迅雷已经堕落

    • thunder:\\\\ 迅雷专属链接越来越少,下载基本是磁力链接和 BT 种子;
    • 迅雷会员加速不再有效,大量资源速度为 0(会员虽然还有一年多,但已经没用了);
    • 迅雷关闭旧版功能,迫使大家升级迅雷 U 享版,但升级后,发现新版迅雷会强制接收所有下载。

      有些小文件,我只想用浏览器直接下载,而一些不想下载的链接,也会被迅雷非常敏感地感应到,强制下载,真的特别流氓。

    为什么选择 Aria2?

    Aria2 下载功能比较全面,支持 BT 和磁力链接,性能也相当不错,速度不比迅雷慢

    虽然没有原生应用界面,配置也比较麻烦,但这些可以通过懒人包轻松解决。

    真·懒人包

    Aria2 真·懒人包无需配置,下载即可使用,适合不想折腾的人。

    ',8),h={href:"https://www.seoipo.com/software/Aria2/",target:"_blank",rel:"noopener noreferrer"},u=e("p",null,[o("将懒人包解压到 "),e("code",null,"D:\\Aria2"),o(",点击 "),e("code",null,"AriaNg 启动器.exe"),o(" 即可开始下载。两个启动器任选其一,都集成了后端服务和前端 UI,无需启动其他程序。包内均为开源绿色软件,不涉及任何隐私和安装,AutoHotkey 插件容易被误报。")],-1),p=e("p",null,"2023.05.14 重构启动器,更新 Aria2 1.36.0,AriaNG 1.3.5,并增加 bt-tracker 至 124 个,以便 BT 和磁力链接提速。",-1),_=e("p",null,"新增功能:任务开始、完成和出错时,会推送系统通知,可在 aria2.conf 的特别功能区块中设置通知的开启与关闭,此功能由 @我真的爱发明 提出。",-1),f=e("hr",null,null,-1),g=e("p",null,"如果不想使用懒人包,想了解 Aria2 背后的设置,请往下看配置步骤。",-1),m=e("h2",{id:"aria2-设置",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#aria2-设置","aria-hidden":"true"},"#"),o(" Aria2 设置")],-1),b={href:"https://aria2c.com/archiver/aria2.zip",target:"_blank",rel:"noopener noreferrer"},A={href:"https://wwz.lanzouf.com/iROZE0eai3xe",target:"_blank",rel:"noopener noreferrer"},k=e("code",null,"D:\\Aria2",-1),v={href:"https://github.com/aria2/aria2/releases",target:"_blank",rel:"noopener noreferrer"},w={href:"https://github.com/aria2/aria2/releases/download/release-1.36.0/aria2-1.36.0-win-64bit-build1.zip",target:"_blank",rel:"noopener noreferrer"},x=e("code",null,"aria2c.exe",-1),N=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20191210232831.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"GitHub 官方仓库下载 Aria2")],-1),T=e("li",null,[e("p",null,[o("点击 "),e("code",null,"aria2.exe"),o(" 启动 aria2,系统托盘区会同步出现应用图标。")])],-1),z={href:"https://wwz.lanzouf.com/iwv6f0eadq9i",target:"_blank",rel:"noopener noreferrer"},B=e("code",null,"aria2.conf",-1),y={href:"https://aria2.github.io/manual/en/html/aria2c.html",target:"_blank",rel:"noopener noreferrer"},D=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote1"},"[1]"),e("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),C=r(`

    修改默认下载目录:

    # 文件的保存路径 (可使用绝对路径或相对路径), 默认:当前启动位置
    +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as s,c as l,a as e,b as o,d as n,e as r}from"./app-91ee3df5.js";const c={},d=r('

    迅雷已经用了 10 年,一直将它视为最快也最方便的下载工具,也一直购买迅雷会员。

    但是,迅雷已经堕落

    • thunder:\\\\ 迅雷专属链接越来越少,下载基本是磁力链接和 BT 种子;
    • 迅雷会员加速不再有效,大量资源速度为 0(会员虽然还有一年多,但已经没用了);
    • 迅雷关闭旧版功能,迫使大家升级迅雷 U 享版,但升级后,发现新版迅雷会强制接收所有下载。

      有些小文件,我只想用浏览器直接下载,而一些不想下载的链接,也会被迅雷非常敏感地感应到,强制下载,真的特别流氓。

    为什么选择 Aria2?

    Aria2 下载功能比较全面,支持 BT 和磁力链接,性能也相当不错,速度不比迅雷慢

    虽然没有原生应用界面,配置也比较麻烦,但这些可以通过懒人包轻松解决。

    真·懒人包

    Aria2 真·懒人包无需配置,下载即可使用,适合不想折腾的人。

    ',8),h={href:"https://www.seoipo.com/software/Aria2/",target:"_blank",rel:"noopener noreferrer"},u=e("p",null,[o("将懒人包解压到 "),e("code",null,"D:\\Aria2"),o(",点击 "),e("code",null,"AriaNg 启动器.exe"),o(" 即可开始下载。两个启动器任选其一,都集成了后端服务和前端 UI,无需启动其他程序。包内均为开源绿色软件,不涉及任何隐私和安装,AutoHotkey 插件容易被误报。")],-1),p=e("p",null,"2023.05.14 重构启动器,更新 Aria2 1.36.0,AriaNG 1.3.5,并增加 bt-tracker 至 124 个,以便 BT 和磁力链接提速。",-1),_=e("p",null,"新增功能:任务开始、完成和出错时,会推送系统通知,可在 aria2.conf 的特别功能区块中设置通知的开启与关闭,此功能由 @我真的爱发明 提出。",-1),f=e("hr",null,null,-1),g=e("p",null,"如果不想使用懒人包,想了解 Aria2 背后的设置,请往下看配置步骤。",-1),m=e("h2",{id:"aria2-设置",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#aria2-设置","aria-hidden":"true"},"#"),o(" Aria2 设置")],-1),b={href:"https://aria2c.com/archiver/aria2.zip",target:"_blank",rel:"noopener noreferrer"},A={href:"https://wwz.lanzouf.com/iROZE0eai3xe",target:"_blank",rel:"noopener noreferrer"},k=e("code",null,"D:\\Aria2",-1),v={href:"https://github.com/aria2/aria2/releases",target:"_blank",rel:"noopener noreferrer"},w={href:"https://github.com/aria2/aria2/releases/download/release-1.36.0/aria2-1.36.0-win-64bit-build1.zip",target:"_blank",rel:"noopener noreferrer"},x=e("code",null,"aria2c.exe",-1),N=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20191210232831.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"GitHub 官方仓库下载 Aria2")],-1),T=e("li",null,[e("p",null,[o("点击 "),e("code",null,"aria2.exe"),o(" 启动 aria2,系统托盘区会同步出现应用图标。")])],-1),z={href:"https://wwz.lanzouf.com/iwv6f0eadq9i",target:"_blank",rel:"noopener noreferrer"},B=e("code",null,"aria2.conf",-1),y={href:"https://aria2.github.io/manual/en/html/aria2c.html",target:"_blank",rel:"noopener noreferrer"},D=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote1"},"[1]"),e("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),C=r(`

    修改默认下载目录:

    # 文件的保存路径 (可使用绝对路径或相对路径), 默认:当前启动位置
     # D:\\Download 是我的默认下载目录,可以改为你自己的下载路径
     dir=D:\\Download
     

    修改服务器默认连接数:

    # 同一服务器连接数,添加时可指定,默认:1
    diff --git a/assets/2018-05-24-airtable_noob.html-df5069f8.js b/assets/2018-05-24-airtable_noob.html-4630ee41.js
    similarity index 98%
    rename from assets/2018-05-24-airtable_noob.html-df5069f8.js
    rename to assets/2018-05-24-airtable_noob.html-4630ee41.js
    index b4ee9480..3de99042 100644
    --- a/assets/2018-05-24-airtable_noob.html-df5069f8.js
    +++ b/assets/2018-05-24-airtable_noob.html-4630ee41.js
    @@ -1 +1 @@
    -import{_ as p}from"./plugin-vue_export-helper-c27b6911.js";import{r as g,o,c as n,a as i,b as a,d as e,e as r}from"./app-98132e77.js";const l={},s=i("p",null,[a("Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的"),i("strong",null,"私人定制资料库"),a("。")],-1),f=i("p",null,"之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。",-1),c=i("p",null,"这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。",-1),d=i("h2",{id:"建立空白-airtable",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#建立空白-airtable","aria-hidden":"true"},"#"),a(" 建立空白 Airtable")],-1),m={href:"https://airtable.com/",target:"_blank",rel:"noopener noreferrer"},b=r('
  • 点击「Add a base」, 然后选择「Start from scratch」, 从空白表格启动。

  • 进入刚刚新建的表格,界面跟 Excel 蛮像的。

  • 在第一栏单击右键,唤出 field 栏目选项,可以更改 filed 栏目类型和名称。

  • filed 栏目类型可以设为文本、链接、附件、单选多选等多种玩法,在使用中可以多试试。

  • ',4),h={href:"https://support.airtable.com/hc/en-us/articles/203229705",target:"_blank",rel:"noopener noreferrer"},u=r('

    应用 Airtable

    既然 Airtable 是个资料库,我们需要先为这个资料库准备个主题。

    想想自己有什么需求,怎么的资料库才可以帮助你?

    我喜欢玩一些新奇软件。这些软件的入门学习大多会超过 3 小时。从产生学习冲动到实际学习,中间间隔一个月。等实际学习入门的时候,收集的信息早已忘光,不得不重新收集。

    因此,我需要一个能汇集「入门学习资源」的资料库。

    1. 按资源需求,列出应用名、资源说明、链接、进度。

    2. 点击「Group」,按类别重组表格。

      选定后,表格会按类型分开显示,界面简洁许多。(Group 是我个人最爱的功能,太漂亮了)。

      当表格越来越多后,我们可以使用「Hide fields」和「Filter」来只显示需要的元素。

    Hide fields : 取消后,隐藏不需要的 fields 栏目。

    FilterGroup 功能类似,都是通过特定条件,过滤出符合要求的 fields

    以上的内容虽然和 Excel 有些不同,但大都能通过 Excel 实现。Airtable 与众不同的是视图变形功能,同样的内容却能通过不同的图表形式传达出来。

    Airtable 变形记

    Airtable 拥有 Grid、Form、Calendar、Gallery、Kanban 这 5 种视图。

    Grid view 是默认的格子视图,我们接下来一个个了解另外 4 种视图。

    Form view 表单视图

    Form view 表单视图是调查问卷(协同工作?)工具。其他人可以通过加密链接,为你添加表格数据。

    打开加密链接后,看到如下视图,填写后发送。

    切换到 Grid view,刚才添加的数据已经添加如表格了。

    Calendar view 日期视图

    Calendar view 日期视图是日程安排表,一定要包含日期 field

    所有的项目都按设定日期排列了。这个表格的第一列名字大都相同,所以看不出区别。

    点击单个事件,会有具体说明。

    Gallery view 把每行数据变成一个卡片。

    Kanban view 看板视图

    Kanban view 将数据重新排列为一个个看板。 (Kanban 这名字简洁明了,Airtable 开发团队里有国人?)

    如果表中没有「Single select」或「Collaborator」的 fields , Airtable 会提示新建 field 来命名看板,普通用户建议选第一个「Create a new single select field」。

    Kanban 的界面和操作类似于 Trello,手动拖动卡片就可以操作。

    参考资料:

    ',39),_={href:"http://www.playpcesor.com/2016/06/airtable.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://sspai.com/post/36402",target:"_blank",rel:"noopener noreferrer"};function w(x,y){const t=g("ExternalLinkIcon");return o(),n("div",null,[s,f,c,d,i("ol",null,[i("li",null,[i("p",null,[a("注册并登录 "),i("a",m,[a("Airtable"),e(t)]),a("。")])]),b]),i("p",null,[a("更多玩法,参考"),i("a",h,[a("官方说明文档"),e(t)]),a("。")]),u,i("ul",null,[i("li",null,[i("a",_,[a("Airtable 最強大線上表格製作,免費資料庫重整任何事"),e(t)])]),i("li",null,[i("a",v,[a("重新想像 Excel 该有的样子:Airtable 评测"),e(t)])])])])}const A=p(l,[["render",w],["__file","2018-05-24-airtable_noob.html.vue"]]);export{A as default}; +import{_ as p}from"./plugin-vue_export-helper-c27b6911.js";import{r as g,o,c as n,a as i,b as a,d as e,e as r}from"./app-91ee3df5.js";const l={},s=i("p",null,[a("Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的"),i("strong",null,"私人定制资料库"),a("。")],-1),f=i("p",null,"之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。",-1),c=i("p",null,"这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。",-1),d=i("h2",{id:"建立空白-airtable",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#建立空白-airtable","aria-hidden":"true"},"#"),a(" 建立空白 Airtable")],-1),m={href:"https://airtable.com/",target:"_blank",rel:"noopener noreferrer"},b=r('
  • 点击「Add a base」, 然后选择「Start from scratch」, 从空白表格启动。

  • 进入刚刚新建的表格,界面跟 Excel 蛮像的。

  • 在第一栏单击右键,唤出 field 栏目选项,可以更改 filed 栏目类型和名称。

  • filed 栏目类型可以设为文本、链接、附件、单选多选等多种玩法,在使用中可以多试试。

  • ',4),h={href:"https://support.airtable.com/hc/en-us/articles/203229705",target:"_blank",rel:"noopener noreferrer"},u=r('

    应用 Airtable

    既然 Airtable 是个资料库,我们需要先为这个资料库准备个主题。

    想想自己有什么需求,怎么的资料库才可以帮助你?

    我喜欢玩一些新奇软件。这些软件的入门学习大多会超过 3 小时。从产生学习冲动到实际学习,中间间隔一个月。等实际学习入门的时候,收集的信息早已忘光,不得不重新收集。

    因此,我需要一个能汇集「入门学习资源」的资料库。

    1. 按资源需求,列出应用名、资源说明、链接、进度。

    2. 点击「Group」,按类别重组表格。

      选定后,表格会按类型分开显示,界面简洁许多。(Group 是我个人最爱的功能,太漂亮了)。

      当表格越来越多后,我们可以使用「Hide fields」和「Filter」来只显示需要的元素。

    Hide fields : 取消后,隐藏不需要的 fields 栏目。

    FilterGroup 功能类似,都是通过特定条件,过滤出符合要求的 fields

    以上的内容虽然和 Excel 有些不同,但大都能通过 Excel 实现。Airtable 与众不同的是视图变形功能,同样的内容却能通过不同的图表形式传达出来。

    Airtable 变形记

    Airtable 拥有 Grid、Form、Calendar、Gallery、Kanban 这 5 种视图。

    Grid view 是默认的格子视图,我们接下来一个个了解另外 4 种视图。

    Form view 表单视图

    Form view 表单视图是调查问卷(协同工作?)工具。其他人可以通过加密链接,为你添加表格数据。

    打开加密链接后,看到如下视图,填写后发送。

    切换到 Grid view,刚才添加的数据已经添加如表格了。

    Calendar view 日期视图

    Calendar view 日期视图是日程安排表,一定要包含日期 field

    所有的项目都按设定日期排列了。这个表格的第一列名字大都相同,所以看不出区别。

    点击单个事件,会有具体说明。

    Gallery view 把每行数据变成一个卡片。

    Kanban view 看板视图

    Kanban view 将数据重新排列为一个个看板。 (Kanban 这名字简洁明了,Airtable 开发团队里有国人?)

    如果表中没有「Single select」或「Collaborator」的 fields , Airtable 会提示新建 field 来命名看板,普通用户建议选第一个「Create a new single select field」。

    Kanban 的界面和操作类似于 Trello,手动拖动卡片就可以操作。

    参考资料:

    ',39),_={href:"http://www.playpcesor.com/2016/06/airtable.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://sspai.com/post/36402",target:"_blank",rel:"noopener noreferrer"};function w(x,y){const t=g("ExternalLinkIcon");return o(),n("div",null,[s,f,c,d,i("ol",null,[i("li",null,[i("p",null,[a("注册并登录 "),i("a",m,[a("Airtable"),e(t)]),a("。")])]),b]),i("p",null,[a("更多玩法,参考"),i("a",h,[a("官方说明文档"),e(t)]),a("。")]),u,i("ul",null,[i("li",null,[i("a",_,[a("Airtable 最強大線上表格製作,免費資料庫重整任何事"),e(t)])]),i("li",null,[i("a",v,[a("重新想像 Excel 该有的样子:Airtable 评测"),e(t)])])])])}const A=p(l,[["render",w],["__file","2018-05-24-airtable_noob.html.vue"]]);export{A as default}; diff --git a/assets/2018-06-08-baizhuo_gp1700.html-54f6f90e.js b/assets/2018-06-08-baizhuo_gp1700.html-bfb2c8f8.js similarity index 97% rename from assets/2018-06-08-baizhuo_gp1700.html-54f6f90e.js rename to assets/2018-06-08-baizhuo_gp1700.html-bfb2c8f8.js index 5c3ddf4c..ff9e2eae 100644 --- a/assets/2018-06-08-baizhuo_gp1700.html-54f6f90e.js +++ b/assets/2018-06-08-baizhuo_gp1700.html-bfb2c8f8.js @@ -1 +1 @@ -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c as a,e}from"./app-98132e77.js";const o={},r=e('

    宽带升级到千兆网络后,电信全面更新了光猫,关闭了的光猫管理地址,只能通过官方 APP「网络管家」管理光猫。

    电信「网络管家」功能

    • 重启光猫;
    • 开启 UPnp;
    • 开启 DMZ 主机,建立端口映射;
    • 建立虚拟服务器,内网穿透访问。

    开启光猫端口映射、内网穿透

    1. 登录路由器管理地址 192.168.X.X。这里以梅林 AC5300 为图例。

    2. 打开电信官方 APP「网络管家」,依次点击中间的「路由器图标」→「高级设置」→「DMZ 主机」,启用 DMZ 主机并绑定刚刚获得的路由器 WAN IP 地址 - 192.168.1.X 。

    3. 光猫内网穿透:当外网要访问局域网(192.168.1.3:1194)时,进入网络管家中「高级设置」→「虚拟服务器」,添加内部 IP 192.168.1.3、内部端口号 1194 和服务器端口号。服务器端口号可根据需求设置。假设光猫 IP 为 180.154.109.143,外网只需访问「180.154.109.143:12345」就可以计入局域网(192.168.1.3:1194)。

    4. 路由端口转发:进入路由器「高级设置」-「外部网络(WAN)」-「端口转发」,按要求设置端口。我这是 eMule TCP 和 UDP 转发,设置完成后,变成 High ID。

    PS. 新版光猫不需要管理员权限就可以获取端口映射、DMZ、UPnp 等权限,但光猫桥接功能也很难破解了。

    ',6),p=[r];function g(n,l){return t(),a("div",null,p)}const f=i(o,[["render",g],["__file","2018-06-08-baizhuo_gp1700.html.vue"]]);export{f as default}; +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c as a,e}from"./app-91ee3df5.js";const o={},r=e('

    宽带升级到千兆网络后,电信全面更新了光猫,关闭了的光猫管理地址,只能通过官方 APP「网络管家」管理光猫。

    电信「网络管家」功能

    • 重启光猫;
    • 开启 UPnp;
    • 开启 DMZ 主机,建立端口映射;
    • 建立虚拟服务器,内网穿透访问。

    开启光猫端口映射、内网穿透

    1. 登录路由器管理地址 192.168.X.X。这里以梅林 AC5300 为图例。

    2. 打开电信官方 APP「网络管家」,依次点击中间的「路由器图标」→「高级设置」→「DMZ 主机」,启用 DMZ 主机并绑定刚刚获得的路由器 WAN IP 地址 - 192.168.1.X 。

    3. 光猫内网穿透:当外网要访问局域网(192.168.1.3:1194)时,进入网络管家中「高级设置」→「虚拟服务器」,添加内部 IP 192.168.1.3、内部端口号 1194 和服务器端口号。服务器端口号可根据需求设置。假设光猫 IP 为 180.154.109.143,外网只需访问「180.154.109.143:12345」就可以计入局域网(192.168.1.3:1194)。

    4. 路由端口转发:进入路由器「高级设置」-「外部网络(WAN)」-「端口转发」,按要求设置端口。我这是 eMule TCP 和 UDP 转发,设置完成后,变成 High ID。

    PS. 新版光猫不需要管理员权限就可以获取端口映射、DMZ、UPnp 等权限,但光猫桥接功能也很难破解了。

    ',6),p=[r];function g(n,l){return t(),a("div",null,p)}const f=i(o,[["render",g],["__file","2018-06-08-baizhuo_gp1700.html.vue"]]);export{f as default}; diff --git a/assets/2018-06-10-koolproxy_https.html-6795dc71.js b/assets/2018-06-10-koolproxy_https.html-e0e271b0.js similarity index 97% rename from assets/2018-06-10-koolproxy_https.html-6795dc71.js rename to assets/2018-06-10-koolproxy_https.html-e0e271b0.js index c02c1197..f24d60f2 100644 --- a/assets/2018-06-10-koolproxy_https.html-6795dc71.js +++ b/assets/2018-06-10-koolproxy_https.html-e0e271b0.js @@ -1 +1 @@ -import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as s,c as p,a as o,b as t,d as n}from"./app-98132e77.js";const a={},c=o("div",{class:"hint-container warning"},[o("p",{class:"hint-container-title"},"注意"),o("p",null,"KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。")],-1),_=o("p",null,"koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。)",-1),i=o("p",null,"为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证书。但我访问证书地址 110.110.110.110 时,却被提示无法访问。",-1),h=o("p",null,"这是我们需要进入路由器后台,对证书地址进行操作。",-1),d=o("p",null,[t("进入路由器后台,一般设置-Tools-Run Cmd ,运行命令 "),o("code",null,"iptables -t nat -I PREROUTING -d 110.110.110.110 -p tcp --dport 80 -j REDIRECT --to 3000"),t("。重启后,该命令失效。")],-1),u=o("figure",null,[o("img",{src:"https://img.gpt-vip.top/20180610143928.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),o("figcaption")],-1),m={href:"http://koolshare.cn/thread-80430-1-1.html",target:"_blank",rel:"noopener noreferrer"},x=o("p",null,[t("保存 Koolproxy 设置后,一定要"),o("strong",null,"重启路由"),t(",否则可能部分屏蔽设置未成功生效。")],-1),f=o("p",null,[o("strong",null,"参考资料:")],-1),g={href:"https://github.com/koolproxy/merlin-koolproxy",target:"_blank",rel:"noopener noreferrer"},k={href:"http://koolshare.cn/thread-81712-1-1.html",target:"_blank",rel:"noopener noreferrer"};function y(b,E){const e=r("ExternalLinkIcon");return s(),p("div",null,[c,_,i,h,d,u,o("p",null,[t("运行命令后,就可以下载 https 证书,之后的设置参考 "),o("a",m,[t("Merlin 版 Koolproxy3.1.x 使用教程"),n(e)]),t("。")]),x,f,o("ul",null,[o("li",null,[o("a",g,[t("koolproxy 项目地址"),n(e)])]),o("li",null,[o("a",k,[t("失效链接"),n(e)])])])])}const R=l(a,[["render",y],["__file","2018-06-10-koolproxy_https.html.vue"]]);export{R as default}; +import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as s,c as p,a as o,b as t,d as n}from"./app-91ee3df5.js";const a={},c=o("div",{class:"hint-container warning"},[o("p",{class:"hint-container-title"},"注意"),o("p",null,"KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。")],-1),_=o("p",null,"koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。)",-1),i=o("p",null,"为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证书。但我访问证书地址 110.110.110.110 时,却被提示无法访问。",-1),h=o("p",null,"这是我们需要进入路由器后台,对证书地址进行操作。",-1),d=o("p",null,[t("进入路由器后台,一般设置-Tools-Run Cmd ,运行命令 "),o("code",null,"iptables -t nat -I PREROUTING -d 110.110.110.110 -p tcp --dport 80 -j REDIRECT --to 3000"),t("。重启后,该命令失效。")],-1),u=o("figure",null,[o("img",{src:"https://img.gpt-vip.top/20180610143928.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),o("figcaption")],-1),m={href:"http://koolshare.cn/thread-80430-1-1.html",target:"_blank",rel:"noopener noreferrer"},x=o("p",null,[t("保存 Koolproxy 设置后,一定要"),o("strong",null,"重启路由"),t(",否则可能部分屏蔽设置未成功生效。")],-1),f=o("p",null,[o("strong",null,"参考资料:")],-1),g={href:"https://github.com/koolproxy/merlin-koolproxy",target:"_blank",rel:"noopener noreferrer"},k={href:"http://koolshare.cn/thread-81712-1-1.html",target:"_blank",rel:"noopener noreferrer"};function y(b,E){const e=r("ExternalLinkIcon");return s(),p("div",null,[c,_,i,h,d,u,o("p",null,[t("运行命令后,就可以下载 https 证书,之后的设置参考 "),o("a",m,[t("Merlin 版 Koolproxy3.1.x 使用教程"),n(e)]),t("。")]),x,f,o("ul",null,[o("li",null,[o("a",g,[t("koolproxy 项目地址"),n(e)])]),o("li",null,[o("a",k,[t("失效链接"),n(e)])])])])}const R=l(a,[["render",y],["__file","2018-06-10-koolproxy_https.html.vue"]]);export{R as default}; diff --git a/assets/2018-06-19-iptv_direckly.html-128e9a53.js b/assets/2018-06-19-iptv_direckly.html-e7371f49.js similarity index 97% rename from assets/2018-06-19-iptv_direckly.html-128e9a53.js rename to assets/2018-06-19-iptv_direckly.html-e7371f49.js index e1047fa2..e073c8a1 100644 --- a/assets/2018-06-19-iptv_direckly.html-128e9a53.js +++ b/assets/2018-06-19-iptv_direckly.html-e7371f49.js @@ -1 +1 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as i,c as a,a as e,b as t,d as r,e as s}from"./app-98132e77.js";const h={},c=e("p",null,"随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。",-1),p={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list",target:"_blank",rel:"noopener noreferrer"},g=e("strong",null,"仅限上海电信",-1),_=e("strong",null,"慢 15 秒",-1),u={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list/issues/28",target:"_blank",rel:"noopener noreferrer"},d=e("blockquote",null,[e("p",null,[t("这个播放列表使用 IPTV 的频道 回放 功能。IPTV 直播用的是专网组播,无法直接通过 Internet 播放。"),e("br"),t(" 因为不是所有频道都支持回放,所以这个列表里的频道 必然少于 IPTV 的直播频道。"),e("br"),t(" 还有部分频道的回放地址播放错误,所以也没有收录。")])],-1),f={href:"https://github.com/fanmingming/live",target:"_blank",rel:"noopener noreferrer"},m=e("h2",{id:"提取直播源列表",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#提取直播源列表","aria-hidden":"true"},"#"),t(" 提取直播源列表")],-1),P={href:"https://htmlpreview.github.io/?https://raw.githubusercontent.com/lucifersun/China-Telecom-ShangHai-IPTV-list/master/IPTV.html",target:"_blank",rel:"noopener noreferrer"},b=e("strong",null,"视频直播源列表",-1),I=e("strong",null,"ANSI 编码",-1),T=s('

    电视盒子直播

    1. 电视盒子上安装 APP-「超级直播」。

    2. 进入「超级直播」应用后,点击「设置」-「二维码扫一扫 开启更多功能」,调出隐藏管理地址 192.168.2.203:9188

    3. 用与电视盒子位于同一局域网的电脑或手机访问隐藏管理地址,点击「我」-「上次自定义 (tv.txt)」-「上传」,上传刚保存好的 tv.txt。

    4. 将「超级直播」的播放列表切换到自定义,直接观看导入的电视节目。

    PC 端电视直播

    ',4),V={href:"http://www.potplayer.org/",target:"_blank",rel:"noopener noreferrer"},v=e("li",null,[e("p",null,"复制节目 rtsp 直播源链接,打开 Potplayer , 右键单击主界面 >「打开」>「打开剪贴板」。"),e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20180619140722.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")])],-1),k=e("p",null,"这样就可以在 PC 端看电视了。",-1),x=e("p",null,"参考资料:",-1),w={href:"http://koolshare.cn/thread-133246-1-1.html",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list",target:"_blank",rel:"noopener noreferrer"},y={href:"http://htmlpreview.github.io/?https://raw.githubusercontent.com/lucifersun/China-Telecom-ShangHai-IPTV-list/master/iptvplayseek.html",target:"_blank",rel:"noopener noreferrer"};function S(H,N){const n=l("ExternalLinkIcon");return i(),a("div",null,[c,e("p",null,[t("如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的"),e("a",p,[t("上海电信 IPTV 视频回放源"),r(n)]),t("(原理上"),g,t(")。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播"),_,t(",对普通用户来说已经足够了。回放服务器已屏蔽公网 IP 的访问,仅限 vlan85 的 B 平面专网 IP 访问,参考:"),e("a",u,[t("电信公网疑似已屏蔽回放源 IP · Issue #28"),r(n)])]),d,e("p",null,[t("如果你没有 IPTV,推荐使用 fanmingming 的 "),e("a",f,[t("live"),r(n)]),t(" 项目,这是一个国内可直连的直播源分享项目,直播源支持 IPv4/IPv6 双栈访问。")]),m,e("p",null,[t("进入"),e("a",P,[t("上海电信 IPTV 视频流地址"),r(n)]),t("。点击「生成 txt 内容」,然后复制下方的"),b,t(",保存为 tv.txt,并将 tv.txt 文本转为 "),I,t("(避免节目名会出现中文乱码)。")]),T,e("ol",null,[e("li",null,[e("p",null,[t("PC 端安排 "),e("a",V,[t("Potplayer"),r(n)]),t("。")])]),v]),k,x,e("ul",null,[e("li",null,[e("a",w,[t("丢了你的 iptv 吧!上海电信 IPTV 直播源"),r(n)])]),e("li",null,[e("a",C,[t("上海电信 IPTV 视频流项目主页"),r(n)])]),e("li",null,[e("a",y,[t("上海电信 IPTV 视频流地址"),r(n)])])])])}const E=o(h,[["render",S],["__file","2018-06-19-iptv_direckly.html.vue"]]);export{E as default}; +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as i,c as a,a as e,b as t,d as r,e as s}from"./app-91ee3df5.js";const h={},c=e("p",null,"随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。",-1),p={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list",target:"_blank",rel:"noopener noreferrer"},g=e("strong",null,"仅限上海电信",-1),_=e("strong",null,"慢 15 秒",-1),u={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list/issues/28",target:"_blank",rel:"noopener noreferrer"},d=e("blockquote",null,[e("p",null,[t("这个播放列表使用 IPTV 的频道 回放 功能。IPTV 直播用的是专网组播,无法直接通过 Internet 播放。"),e("br"),t(" 因为不是所有频道都支持回放,所以这个列表里的频道 必然少于 IPTV 的直播频道。"),e("br"),t(" 还有部分频道的回放地址播放错误,所以也没有收录。")])],-1),f={href:"https://github.com/fanmingming/live",target:"_blank",rel:"noopener noreferrer"},m=e("h2",{id:"提取直播源列表",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#提取直播源列表","aria-hidden":"true"},"#"),t(" 提取直播源列表")],-1),P={href:"https://htmlpreview.github.io/?https://raw.githubusercontent.com/lucifersun/China-Telecom-ShangHai-IPTV-list/master/IPTV.html",target:"_blank",rel:"noopener noreferrer"},b=e("strong",null,"视频直播源列表",-1),I=e("strong",null,"ANSI 编码",-1),T=s('

    电视盒子直播

    1. 电视盒子上安装 APP-「超级直播」。

    2. 进入「超级直播」应用后,点击「设置」-「二维码扫一扫 开启更多功能」,调出隐藏管理地址 192.168.2.203:9188

    3. 用与电视盒子位于同一局域网的电脑或手机访问隐藏管理地址,点击「我」-「上次自定义 (tv.txt)」-「上传」,上传刚保存好的 tv.txt。

    4. 将「超级直播」的播放列表切换到自定义,直接观看导入的电视节目。

    PC 端电视直播

    ',4),V={href:"http://www.potplayer.org/",target:"_blank",rel:"noopener noreferrer"},v=e("li",null,[e("p",null,"复制节目 rtsp 直播源链接,打开 Potplayer , 右键单击主界面 >「打开」>「打开剪贴板」。"),e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20180619140722.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")])],-1),k=e("p",null,"这样就可以在 PC 端看电视了。",-1),x=e("p",null,"参考资料:",-1),w={href:"http://koolshare.cn/thread-133246-1-1.html",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/lucifersun/China-Telecom-ShangHai-IPTV-list",target:"_blank",rel:"noopener noreferrer"},y={href:"http://htmlpreview.github.io/?https://raw.githubusercontent.com/lucifersun/China-Telecom-ShangHai-IPTV-list/master/iptvplayseek.html",target:"_blank",rel:"noopener noreferrer"};function S(H,N){const n=l("ExternalLinkIcon");return i(),a("div",null,[c,e("p",null,[t("如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的"),e("a",p,[t("上海电信 IPTV 视频回放源"),r(n)]),t("(原理上"),g,t(")。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播"),_,t(",对普通用户来说已经足够了。回放服务器已屏蔽公网 IP 的访问,仅限 vlan85 的 B 平面专网 IP 访问,参考:"),e("a",u,[t("电信公网疑似已屏蔽回放源 IP · Issue #28"),r(n)])]),d,e("p",null,[t("如果你没有 IPTV,推荐使用 fanmingming 的 "),e("a",f,[t("live"),r(n)]),t(" 项目,这是一个国内可直连的直播源分享项目,直播源支持 IPv4/IPv6 双栈访问。")]),m,e("p",null,[t("进入"),e("a",P,[t("上海电信 IPTV 视频流地址"),r(n)]),t("。点击「生成 txt 内容」,然后复制下方的"),b,t(",保存为 tv.txt,并将 tv.txt 文本转为 "),I,t("(避免节目名会出现中文乱码)。")]),T,e("ol",null,[e("li",null,[e("p",null,[t("PC 端安排 "),e("a",V,[t("Potplayer"),r(n)]),t("。")])]),v]),k,x,e("ul",null,[e("li",null,[e("a",w,[t("丢了你的 iptv 吧!上海电信 IPTV 直播源"),r(n)])]),e("li",null,[e("a",C,[t("上海电信 IPTV 视频流项目主页"),r(n)])]),e("li",null,[e("a",y,[t("上海电信 IPTV 视频流地址"),r(n)])])])])}const E=o(h,[["render",S],["__file","2018-06-19-iptv_direckly.html.vue"]]);export{E as default}; diff --git a/assets/2018-10-07-huginn_scraping_any_website.html-dee30096.js b/assets/2018-10-07-huginn_scraping_any_website.html-83a0d670.js similarity index 98% rename from assets/2018-10-07-huginn_scraping_any_website.html-dee30096.js rename to assets/2018-10-07-huginn_scraping_any_website.html-83a0d670.js index 99b23b51..d0648031 100644 --- a/assets/2018-10-07-huginn_scraping_any_website.html-dee30096.js +++ b/assets/2018-10-07-huginn_scraping_any_website.html-83a0d670.js @@ -1 +1 @@ -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as s,c as l,a as e,b as t,d as o,e as i}from"./app-98132e77.js";const p={},g=i('

    烧制网页 RSS 源,主要有 FEED43Huginn 两种方法。

    • FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。
    • Huginn:自由度高,能自定义抓取频率、内容结构、js 结果、输出样式等;需要搭建服务器,学习 Huginn 抓取规则。

    Huginn 准备工作

    ',3),c=e("li",null,[e("p",null,"准备 NAS 或 Debian/Ubuntu 环境的服务器;")],-1),h={href:"https://github.com/huginn/huginn/blob/master/doc/docker/install.md",target:"_blank",rel:"noopener noreferrer"},d={href:"https://github.com/huginn/huginn/blob/master/doc/manual/installation.md",target:"_blank",rel:"noopener noreferrer"},u={href:"https://phantomjscloud.com/",target:"_blank",rel:"noopener noreferrer"},f=e("strong",null,"PhantomJs Cloud",-1),_=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20181006010447.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),m=i('

    PhantomJs 网页抓取

    新建 Huginn 任务组 Scenario「国内应急新闻」,样例抓取链接为 http://www.cneb.gov.cn/guoneinews/

    页面缓存

    使用 Phantom Js Cloud Agent,获得动态网页缓存。

    解析网页内容

    使用 WebsiteAgent,抓取网页内容。

    获取内容路径

    使用火狐浏览器打开目标页面,获取 css path 路径。

    1. 按下 F12, 然后点击 Developer Tools 左上角的检查指针

    2. 选中要抓取的部分。

    3. 回到 Developer Tools 窗口,右键选中的蓝色部分,获取 css path、Xpath。这里以 css path 为例。

    4. 初始 css path 路径,html body div.area.areabg1 div.area-half.right div.tabBox div.tabContents.active table tbody tr td.red a

    5. css path 原始路径过长,删去不带 .# 的节点(节点间以空格“ ”分割),并删去每个节点在 .# 前的第一个标签,得到 .area.areabg1 .area-half.right .tabBox .tabContents.active .red a

    6. 前半部分对节点定位无用,继续省略(比如:中国上海,省略掉中国,大家也知道上海在哪),获得短路径 .tabContents.active .red a

    特殊路径处理

    • 有些路径中的节点带空格,如 <div class="packery-item article">,路径中的空格由 . 代替,截取为 .packery-item.article
    • 当抓取多种 css path 规则时,用逗号分割,比如 "css": ".focus-title .current a , .stress h2 a",

    导出 RSS

    使用 DataOutputAgent,将抓取内容导出为 RSS。

    回到 Scenarios,点击 Data Output Agent 旁的按钮「Actions」>「Show」,复制导出的 xml 链接 http://xxx.xxx/users/1/web_requests/xxx/xxxx.xml

    ',19),b={href:"https://pan.baidu.com/s/1JdsFkLN9kczR9C92tKi83A",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/huginn/huginn/wiki/Browser-Emulation-Using-PhantomJs-Cloud",target:"_blank",rel:"noopener noreferrer"},x={href:"https://wechat.privacyhide.com/",target:"_blank",rel:"noopener noreferrer"},v=e("h2",{id:"rss-合集",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#rss-合集","aria-hidden":"true"},"#"),t(" RSS 合集")],-1),k=e("p",null,"汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),w={href:"https://gpt-vip.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},R={href:"https://gpt-vip.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://gpt-vip.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},H={href:"https://gpt-vip.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},C={href:"https://gpt-vip.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},E={href:"https://gpt-vip.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"};function z(A,D){const n=r("ExternalLinkIcon");return s(),l("div",null,[g,e("ul",null,[c,e("li",null,[e("p",null,[t("参考 "),e("a",h,[t("deploy Huginn inside of Docker"),o(n)]),t("、"),e("a",d,[t("installation guide for Debian/Ubuntu"),o(n)]),t(" 来搭建 Huginn。")])]),e("li",null,[e("p",null,[t("注册 "),e("a",u,[t("PhantomJs Cloud"),o(n)]),t(" ,然后将 API key 保存在 Huginn 的 Credentials 中。很多网站是用 JS 加载动态内容,因此需要 "),f,t(" 来抓取页面 JS 缓存。免费版每天限制抓取 500 次页面,需求不大可建立多个账号使用不同 API key,足够个人使用。")]),_])]),m,e("p",null,[e("a",b,[t("点击网盘下载"),o(n)]),t("国内应急新闻的详细设置,导入到 Huginn 即可使用。其他问题参考 "),e("a",S,[t("PhantomJs Cloud 英文攻略"),o(n)]),t("。")]),e("p",null,[t("微信的屏蔽措施非常之多,公众号抓取可以尝试 "),e("a",x,[t("wechat-feeds"),o(n)]),t("。")]),v,k,e("ul",null,[e("li",null,[e("p",null,[e("a",w,[t("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),o(n)])])]),e("li",null,[e("p",null,[e("a",R,[t("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),o(n)])])]),e("li",null,[e("p",null,[e("a",y,[t("RSS 速成篇:RSSHub 捡现成的轮子"),o(n)])])]),e("li",null,[e("p",null,[e("a",H,[t("RSS 速成篇 2:RSSHub 自部署"),o(n)])])]),e("li",null,[e("p",null,[e("a",C,[t("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),o(n)])])]),e("li",null,[e("p",null,[e("a",E,[t("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),o(n)])])])])])}const P=a(p,[["render",z],["__file","2018-10-07-huginn_scraping_any_website.html.vue"]]);export{P as default}; +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as s,c as l,a as e,b as t,d as o,e as i}from"./app-91ee3df5.js";const p={},g=i('

    烧制网页 RSS 源,主要有 FEED43Huginn 两种方法。

    • FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。
    • Huginn:自由度高,能自定义抓取频率、内容结构、js 结果、输出样式等;需要搭建服务器,学习 Huginn 抓取规则。

    Huginn 准备工作

    ',3),c=e("li",null,[e("p",null,"准备 NAS 或 Debian/Ubuntu 环境的服务器;")],-1),h={href:"https://github.com/huginn/huginn/blob/master/doc/docker/install.md",target:"_blank",rel:"noopener noreferrer"},d={href:"https://github.com/huginn/huginn/blob/master/doc/manual/installation.md",target:"_blank",rel:"noopener noreferrer"},u={href:"https://phantomjscloud.com/",target:"_blank",rel:"noopener noreferrer"},f=e("strong",null,"PhantomJs Cloud",-1),_=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20181006010447.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),m=i('

    PhantomJs 网页抓取

    新建 Huginn 任务组 Scenario「国内应急新闻」,样例抓取链接为 http://www.cneb.gov.cn/guoneinews/

    页面缓存

    使用 Phantom Js Cloud Agent,获得动态网页缓存。

    解析网页内容

    使用 WebsiteAgent,抓取网页内容。

    获取内容路径

    使用火狐浏览器打开目标页面,获取 css path 路径。

    1. 按下 F12, 然后点击 Developer Tools 左上角的检查指针

    2. 选中要抓取的部分。

    3. 回到 Developer Tools 窗口,右键选中的蓝色部分,获取 css path、Xpath。这里以 css path 为例。

    4. 初始 css path 路径,html body div.area.areabg1 div.area-half.right div.tabBox div.tabContents.active table tbody tr td.red a

    5. css path 原始路径过长,删去不带 .# 的节点(节点间以空格“ ”分割),并删去每个节点在 .# 前的第一个标签,得到 .area.areabg1 .area-half.right .tabBox .tabContents.active .red a

    6. 前半部分对节点定位无用,继续省略(比如:中国上海,省略掉中国,大家也知道上海在哪),获得短路径 .tabContents.active .red a

    特殊路径处理

    • 有些路径中的节点带空格,如 <div class="packery-item article">,路径中的空格由 . 代替,截取为 .packery-item.article
    • 当抓取多种 css path 规则时,用逗号分割,比如 "css": ".focus-title .current a , .stress h2 a",

    导出 RSS

    使用 DataOutputAgent,将抓取内容导出为 RSS。

    回到 Scenarios,点击 Data Output Agent 旁的按钮「Actions」>「Show」,复制导出的 xml 链接 http://xxx.xxx/users/1/web_requests/xxx/xxxx.xml

    ',19),b={href:"https://pan.baidu.com/s/1JdsFkLN9kczR9C92tKi83A",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/huginn/huginn/wiki/Browser-Emulation-Using-PhantomJs-Cloud",target:"_blank",rel:"noopener noreferrer"},x={href:"https://wechat.privacyhide.com/",target:"_blank",rel:"noopener noreferrer"},v=e("h2",{id:"rss-合集",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#rss-合集","aria-hidden":"true"},"#"),t(" RSS 合集")],-1),k=e("p",null,"汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),w={href:"https://gpt-vip.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},R={href:"https://gpt-vip.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://gpt-vip.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},H={href:"https://gpt-vip.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},C={href:"https://gpt-vip.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},E={href:"https://gpt-vip.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"};function z(A,D){const n=r("ExternalLinkIcon");return s(),l("div",null,[g,e("ul",null,[c,e("li",null,[e("p",null,[t("参考 "),e("a",h,[t("deploy Huginn inside of Docker"),o(n)]),t("、"),e("a",d,[t("installation guide for Debian/Ubuntu"),o(n)]),t(" 来搭建 Huginn。")])]),e("li",null,[e("p",null,[t("注册 "),e("a",u,[t("PhantomJs Cloud"),o(n)]),t(" ,然后将 API key 保存在 Huginn 的 Credentials 中。很多网站是用 JS 加载动态内容,因此需要 "),f,t(" 来抓取页面 JS 缓存。免费版每天限制抓取 500 次页面,需求不大可建立多个账号使用不同 API key,足够个人使用。")]),_])]),m,e("p",null,[e("a",b,[t("点击网盘下载"),o(n)]),t("国内应急新闻的详细设置,导入到 Huginn 即可使用。其他问题参考 "),e("a",S,[t("PhantomJs Cloud 英文攻略"),o(n)]),t("。")]),e("p",null,[t("微信的屏蔽措施非常之多,公众号抓取可以尝试 "),e("a",x,[t("wechat-feeds"),o(n)]),t("。")]),v,k,e("ul",null,[e("li",null,[e("p",null,[e("a",w,[t("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),o(n)])])]),e("li",null,[e("p",null,[e("a",R,[t("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),o(n)])])]),e("li",null,[e("p",null,[e("a",y,[t("RSS 速成篇:RSSHub 捡现成的轮子"),o(n)])])]),e("li",null,[e("p",null,[e("a",H,[t("RSS 速成篇 2:RSSHub 自部署"),o(n)])])]),e("li",null,[e("p",null,[e("a",C,[t("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),o(n)])])]),e("li",null,[e("p",null,[e("a",E,[t("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),o(n)])])])])])}const P=a(p,[["render",z],["__file","2018-10-07-huginn_scraping_any_website.html.vue"]]);export{P as default}; diff --git a/assets/2018-12-28-voice_input_try.html-9a3c4032.js b/assets/2018-12-28-voice_input_try.html-cdadb97c.js similarity index 98% rename from assets/2018-12-28-voice_input_try.html-9a3c4032.js rename to assets/2018-12-28-voice_input_try.html-cdadb97c.js index d0c12713..87ffcf71 100644 --- a/assets/2018-12-28-voice_input_try.html-9a3c4032.js +++ b/assets/2018-12-28-voice_input_try.html-cdadb97c.js @@ -1 +1 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as r,c,a as e,b as t,d as a,e as p}from"./app-98132e77.js";const d={},l=p('

    从 XP 时代开始,我幻想用语音转文字。后来,手机提前实现了这功能,电脑端的语音录入却一直没进展。

    为了能在 PC 上用语音打字,我从 2013 折腾到 2022,经历了各种硬件和软件,终于找到最适合 PC 端的语音输入方案。

    讯飞 + 小麦克风

    2013 年,讯飞推出 PC 版输入法。我以为 PC 语音输入的时代已经来临,买了个十几块的小麦克风,尝试语音转文字。

    可测试结果却让人大跌眼镜,语音识别准确率异常的低。即便我把麦放在嘴边,依然无法录清楚,超过 80% 内容识别错误。

    过低的识别率,让我怀疑是麦克风的收音出了问题,要想语音打字就需要换个好点的话筒。但囊中羞涩,只能暂停尝试。

    讯飞 + Blue Yeti

    过了几年,经济宽裕点后,下单网红录音话筒 Blue Yeti,幻想着 4 位数的话筒能带来完美的收音识别效果。

    Blue Yeti
    Blue Yeti

    但事实却是再度被打击

    对 Blue Yeti 的收音测试中,再次发现大量杂音,收货当天就直接退货。

    十几元的麦克风和一千元的话筒收音效果差不多,语音输入的识别率也都超低。这让我猜测,语音输入识别率低与硬件无关,而是 PC 端的语音输入方案尚未成熟,是软件方面导致的问题。

    就这样,我再次暂停了 PC 上的语音输入尝试。

    外置声卡 + 动圈话筒

    之后,用了 5 年的音箱出现问题,我升级了音响,并顺势添置了外置声卡,视听体验大幅提升。玩着玩着,突然想起我的语音输入梦,决定再尝试一次。

    有了外置声卡,麦克风的选择多了许多,可以连接卡侬线接口的话筒了。

    麦克风分为两类:电容麦、动圈麦。

    电容麦收音好,但比较娇贵,怕潮怕摔,不能用桌面话筒架,适合用悬臂挂在空中,每次用完之后需要收起来。动圈麦的灵敏度和还原度都低于电容麦,存放和使用没什么要求,费用也会低些。

    电容麦克风太麻烦,就选了简单的动圈麦 - 舒伯乐 PRO248S。

    选好话筒后,又配了麦克风支架和卡侬线,连上原本的外置声卡,搞定语音输出的硬件配置。

    收音设备
    收音设备

    输入法之争

    音频硬件搞定后,开始折腾语音输入法。

    虽然讯飞在语音输入领域的牌子最响,但是讯飞 PC 输入法并不受重视,长年不更新。所以,我尝试了其他输入法的语音功能。测试中,搜狗的语音识别功能并不比讯飞弱,缺点也只有无法设置语音输入快捷键,整体体验上佳。于是,语音输入法切换成了搜狗。

    然而,有次备份系统设置,我发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,这次词库无法从云端删除,只要你输入过一次,搜狗就永远记住了

    这哪里是输入法,根本是键盘记录器

    国内其他输入法在这点上也都半斤八两,为了不被键盘记录器惦记,我只能切换为开源的小狼毫输入法。

    ',27),s={href:"https://github.com/HaujetZhao/QuickCut",target:"_blank",rel:"noopener noreferrer"},h=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-25-18-08-06.png?imageMogr2/thumbnail/500x",alt:"Quick Cut 界面",tabindex:"0",loading:"lazy"}),e("figcaption",null,"Quick Cut 界面")],-1),u=e("p",null,"Quick Cut 的缺点:语音输入时,要一直按大写键,不适合长语音录入;触发键无法更改,大写键与我的常用脚本冲突了。因此,长时间的语音输入只能借助手机上的飞书妙记来完成转录。",-1),g=e("h2",{id:"最终方案-微软语音输入",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#最终方案-微软语音输入","aria-hidden":"true"},"#"),t(" 最终方案:微软语音输入")],-1),f={href:"https://support.microsoft.com/zh-cn/windows/%E4%BD%BF%E7%94%A8%E8%AF%AD%E9%9F%B3%E9%94%AE%E5%85%A5%E6%9D%A5%E8%AF%B4%E8%AF%9D-%E8%80%8C%E4%B8%8D%E6%98%AF%E5%9C%A8%E7%94%B5%E8%84%91%E4%B8%8A%E9%94%AE%E5%85%A5-fec94565-c4bd-329d-e59a-af033fa5689f",target:"_blank",rel:"noopener noreferrer"},_=p('

    微软自带的语音输入,快捷键 Win + H。3 块钱的麦克风,距离 50 厘米,很低的声音读出来了。

    测试后,发现微软语音输入确实是好用,甚至好用到有点恐怖。测试中,我临时有事,走到另外一个房间和家人说话,回来后发现刚刚的对话也被微软语音输入正确识别。

    微软语音输入
    微软语音输入

    微软语音输入非常敏感,距离远、声音低也能识别。这样我不用为语音输入而特意移动话筒,可以继续把话筒放在不遮挡视野的远角。

    「语音键入功能在此应用上受限制」在 Notepad++ 和微信都出现了,Visual Studio Code 没出现,但实际上这提示对语音输入并没造成影响,平常可以忽略这个提示。

    虽然微软语音输入的识别率只有 85%,不如阿里云方案的 95%,可系统自带的优势太明显,微软语音输入体验感非常顺滑。

    启动快捷键 Win + H,语音识别立即会启动。如果中途没说话,应用会自动暂停,并对前面的输入进行整理,插入合适的标点符号。停止超过一分钟,语音识别才会暂停,等待再次启动。换言之,微软语音输入能一键完成长语音录入。

    之前的麦克风放着放着就坏了,所以我没测 @李乐 说的低价麦克风的语音输入效果。不过,微软输入的软件优化非常好,按照目前效果推测,用便宜的麦克风也能实现完美的收音效果。综合来说,微软语音输入是当前最完美也是兼容性最高的语音输入方案。

    总结与展望

    语音输入的 3 种方案:

    • 文章输入:微软语音输入 + 外置声卡 + 动圈话筒,兼容性最高,使用方便,但精度一般,用于文章草稿阶段。
    • 一句话输入:Quick Cut + 外置声卡 + 动圈话筒,一句话识别精度最高,适合聊天时使用。
    • 语音转录:飞书妙记 + 手机,录音转文字,长语音的识别率超高。

    与 2018 年相比,2022 年的语音输入方案已经完善了许多。硬件已经不再是问题了,便宜的话筒也能达到语音输入标准。语音识别进步明显,在 AI 技术的加持下,短句识别率从 90% 上升到 95%,长句识别率则从 50% 上升到 70%,标点符号均能正确插入。

    目前语音输入算法在提升最后 10% 的准确率,期待早日达到「口述与键盘输入完全一致」的一天。

    ',13);function m(b,E){const i=n("ExternalLinkIcon");return r(),c("div",null,[l,e("p",null,[t("语音输入则转用开源的 "),e("a",s,[t("Quick Cut"),a(i)]),t(",使用阿里云、腾讯云的商用语音接口,识别率比免费的搜狗和讯飞都高。")]),h,u,g,e("p",null,[t("面对 Quick Cut 的长语音输入难题时,@李乐 推荐了微软语音输入-"),e("a",f,[t("使用语音键入来说话,而不是在电脑上键入"),a(i)]),t("。")]),_])}const k=o(d,[["render",m],["__file","2018-12-28-voice_input_try.html.vue"]]);export{k as default}; +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as r,c,a as e,b as t,d as a,e as p}from"./app-91ee3df5.js";const d={},l=p('

    从 XP 时代开始,我幻想用语音转文字。后来,手机提前实现了这功能,电脑端的语音录入却一直没进展。

    为了能在 PC 上用语音打字,我从 2013 折腾到 2022,经历了各种硬件和软件,终于找到最适合 PC 端的语音输入方案。

    讯飞 + 小麦克风

    2013 年,讯飞推出 PC 版输入法。我以为 PC 语音输入的时代已经来临,买了个十几块的小麦克风,尝试语音转文字。

    可测试结果却让人大跌眼镜,语音识别准确率异常的低。即便我把麦放在嘴边,依然无法录清楚,超过 80% 内容识别错误。

    过低的识别率,让我怀疑是麦克风的收音出了问题,要想语音打字就需要换个好点的话筒。但囊中羞涩,只能暂停尝试。

    讯飞 + Blue Yeti

    过了几年,经济宽裕点后,下单网红录音话筒 Blue Yeti,幻想着 4 位数的话筒能带来完美的收音识别效果。

    Blue Yeti
    Blue Yeti

    但事实却是再度被打击

    对 Blue Yeti 的收音测试中,再次发现大量杂音,收货当天就直接退货。

    十几元的麦克风和一千元的话筒收音效果差不多,语音输入的识别率也都超低。这让我猜测,语音输入识别率低与硬件无关,而是 PC 端的语音输入方案尚未成熟,是软件方面导致的问题。

    就这样,我再次暂停了 PC 上的语音输入尝试。

    外置声卡 + 动圈话筒

    之后,用了 5 年的音箱出现问题,我升级了音响,并顺势添置了外置声卡,视听体验大幅提升。玩着玩着,突然想起我的语音输入梦,决定再尝试一次。

    有了外置声卡,麦克风的选择多了许多,可以连接卡侬线接口的话筒了。

    麦克风分为两类:电容麦、动圈麦。

    电容麦收音好,但比较娇贵,怕潮怕摔,不能用桌面话筒架,适合用悬臂挂在空中,每次用完之后需要收起来。动圈麦的灵敏度和还原度都低于电容麦,存放和使用没什么要求,费用也会低些。

    电容麦克风太麻烦,就选了简单的动圈麦 - 舒伯乐 PRO248S。

    选好话筒后,又配了麦克风支架和卡侬线,连上原本的外置声卡,搞定语音输出的硬件配置。

    收音设备
    收音设备

    输入法之争

    音频硬件搞定后,开始折腾语音输入法。

    虽然讯飞在语音输入领域的牌子最响,但是讯飞 PC 输入法并不受重视,长年不更新。所以,我尝试了其他输入法的语音功能。测试中,搜狗的语音识别功能并不比讯飞弱,缺点也只有无法设置语音输入快捷键,整体体验上佳。于是,语音输入法切换成了搜狗。

    然而,有次备份系统设置,我发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,这次词库无法从云端删除,只要你输入过一次,搜狗就永远记住了

    这哪里是输入法,根本是键盘记录器

    国内其他输入法在这点上也都半斤八两,为了不被键盘记录器惦记,我只能切换为开源的小狼毫输入法。

    ',27),s={href:"https://github.com/HaujetZhao/QuickCut",target:"_blank",rel:"noopener noreferrer"},h=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-25-18-08-06.png?imageMogr2/thumbnail/500x",alt:"Quick Cut 界面",tabindex:"0",loading:"lazy"}),e("figcaption",null,"Quick Cut 界面")],-1),u=e("p",null,"Quick Cut 的缺点:语音输入时,要一直按大写键,不适合长语音录入;触发键无法更改,大写键与我的常用脚本冲突了。因此,长时间的语音输入只能借助手机上的飞书妙记来完成转录。",-1),g=e("h2",{id:"最终方案-微软语音输入",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#最终方案-微软语音输入","aria-hidden":"true"},"#"),t(" 最终方案:微软语音输入")],-1),f={href:"https://support.microsoft.com/zh-cn/windows/%E4%BD%BF%E7%94%A8%E8%AF%AD%E9%9F%B3%E9%94%AE%E5%85%A5%E6%9D%A5%E8%AF%B4%E8%AF%9D-%E8%80%8C%E4%B8%8D%E6%98%AF%E5%9C%A8%E7%94%B5%E8%84%91%E4%B8%8A%E9%94%AE%E5%85%A5-fec94565-c4bd-329d-e59a-af033fa5689f",target:"_blank",rel:"noopener noreferrer"},_=p('

    微软自带的语音输入,快捷键 Win + H。3 块钱的麦克风,距离 50 厘米,很低的声音读出来了。

    测试后,发现微软语音输入确实是好用,甚至好用到有点恐怖。测试中,我临时有事,走到另外一个房间和家人说话,回来后发现刚刚的对话也被微软语音输入正确识别。

    微软语音输入
    微软语音输入

    微软语音输入非常敏感,距离远、声音低也能识别。这样我不用为语音输入而特意移动话筒,可以继续把话筒放在不遮挡视野的远角。

    「语音键入功能在此应用上受限制」在 Notepad++ 和微信都出现了,Visual Studio Code 没出现,但实际上这提示对语音输入并没造成影响,平常可以忽略这个提示。

    虽然微软语音输入的识别率只有 85%,不如阿里云方案的 95%,可系统自带的优势太明显,微软语音输入体验感非常顺滑。

    启动快捷键 Win + H,语音识别立即会启动。如果中途没说话,应用会自动暂停,并对前面的输入进行整理,插入合适的标点符号。停止超过一分钟,语音识别才会暂停,等待再次启动。换言之,微软语音输入能一键完成长语音录入。

    之前的麦克风放着放着就坏了,所以我没测 @李乐 说的低价麦克风的语音输入效果。不过,微软输入的软件优化非常好,按照目前效果推测,用便宜的麦克风也能实现完美的收音效果。综合来说,微软语音输入是当前最完美也是兼容性最高的语音输入方案。

    总结与展望

    语音输入的 3 种方案:

    • 文章输入:微软语音输入 + 外置声卡 + 动圈话筒,兼容性最高,使用方便,但精度一般,用于文章草稿阶段。
    • 一句话输入:Quick Cut + 外置声卡 + 动圈话筒,一句话识别精度最高,适合聊天时使用。
    • 语音转录:飞书妙记 + 手机,录音转文字,长语音的识别率超高。

    与 2018 年相比,2022 年的语音输入方案已经完善了许多。硬件已经不再是问题了,便宜的话筒也能达到语音输入标准。语音识别进步明显,在 AI 技术的加持下,短句识别率从 90% 上升到 95%,长句识别率则从 50% 上升到 70%,标点符号均能正确插入。

    目前语音输入算法在提升最后 10% 的准确率,期待早日达到「口述与键盘输入完全一致」的一天。

    ',13);function m(b,E){const i=n("ExternalLinkIcon");return r(),c("div",null,[l,e("p",null,[t("语音输入则转用开源的 "),e("a",s,[t("Quick Cut"),a(i)]),t(",使用阿里云、腾讯云的商用语音接口,识别率比免费的搜狗和讯飞都高。")]),h,u,g,e("p",null,[t("面对 Quick Cut 的长语音输入难题时,@李乐 推荐了微软语音输入-"),e("a",f,[t("使用语音键入来说话,而不是在电脑上键入"),a(i)]),t("。")]),_])}const k=o(d,[["render",m],["__file","2018-12-28-voice_input_try.html.vue"]]);export{k as default}; diff --git a/assets/2019-03-31-openvpn_back_to_home.html-1471496a.js b/assets/2019-03-31-openvpn_back_to_home.html-32e1d384.js similarity index 95% rename from assets/2019-03-31-openvpn_back_to_home.html-1471496a.js rename to assets/2019-03-31-openvpn_back_to_home.html-32e1d384.js index 07c05de0..bc13256e 100644 --- a/assets/2019-03-31-openvpn_back_to_home.html-1471496a.js +++ b/assets/2019-03-31-openvpn_back_to_home.html-32e1d384.js @@ -1 +1 @@ -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o as r,c as i,a as e,b as o,d as n,e as s}from"./app-98132e77.js";const c={},l=e("p",null,"有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。",-1),_=e("h2",{id:"内网穿透",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#内网穿透","aria-hidden":"true"},"#"),o(" 内网穿透")],-1),d={href:"http://home.xxx.com",target:"_blank",rel:"noopener noreferrer"},g=e("p",null,"梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。",-1),h=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20190331203233.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),m=e("p",null,"电信分配的公网 IP 经常会更换,每次都需要重定向子域名。在路由器 koolshare - 软件中心中安装 Aliddns,帮助更新家的公网 IP。插件中输入定向子域名和阿里云的 appkey,配置就完成了。如果没有自动在阿里云解析,可以先手动解析设置。",-1),f={href:"https://gpt-vip.top/posts/2018-06-08-Baizhuo_GP1700.html",target:"_blank",rel:"noopener noreferrer"},u=s('

    OpenVPN 配置

    内网穿透完成后,开始 OpenVPN 配置。梅林路由器进入「高级设置」→「VPN」→「虚拟专用网(VPN)服务器」,开启路由器自带的 OpenVPN。

    高级配置红色的部分有修改,特别是VPN 子网必须修改为与路由器不同的号段,如 192.168.3.0。如果使用默认子网,会无法顺利翻墙。

    应用设置后,点击「一般设置」,并导出 .ovpn 文件。打开该配置文件,将远程端口改为光猫上虚拟服务器映射的端口。

    最后,手机导入 .ovpn 设置文件,就可以上网回家了!

    ',7);function x(b,v){const t=p("ExternalLinkIcon");return r(),i("div",null,[l,_,e("p",null,[o("连接家中内网,家里必须有个固定的访问地址。我将子域名 "),e("a",d,[o("home.xxx.com"),n(t)]),o(" 指向家中 IP。")]),g,h,m,e("p",null,[o("光猫设置参考"),e("a",f,[o("光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射"),n(t)]),o("。")]),u])}const V=a(c,[["render",x],["__file","2019-03-31-openvpn_back_to_home.html.vue"]]);export{V as default}; +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o as r,c as i,a as e,b as o,d as n,e as s}from"./app-91ee3df5.js";const c={},l=e("p",null,"有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。",-1),_=e("h2",{id:"内网穿透",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#内网穿透","aria-hidden":"true"},"#"),o(" 内网穿透")],-1),d={href:"http://home.xxx.com",target:"_blank",rel:"noopener noreferrer"},g=e("p",null,"梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。",-1),h=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20190331203233.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),m=e("p",null,"电信分配的公网 IP 经常会更换,每次都需要重定向子域名。在路由器 koolshare - 软件中心中安装 Aliddns,帮助更新家的公网 IP。插件中输入定向子域名和阿里云的 appkey,配置就完成了。如果没有自动在阿里云解析,可以先手动解析设置。",-1),f={href:"https://gpt-vip.top/posts/2018-06-08-Baizhuo_GP1700.html",target:"_blank",rel:"noopener noreferrer"},u=s('

    OpenVPN 配置

    内网穿透完成后,开始 OpenVPN 配置。梅林路由器进入「高级设置」→「VPN」→「虚拟专用网(VPN)服务器」,开启路由器自带的 OpenVPN。

    高级配置红色的部分有修改,特别是VPN 子网必须修改为与路由器不同的号段,如 192.168.3.0。如果使用默认子网,会无法顺利翻墙。

    应用设置后,点击「一般设置」,并导出 .ovpn 文件。打开该配置文件,将远程端口改为光猫上虚拟服务器映射的端口。

    最后,手机导入 .ovpn 设置文件,就可以上网回家了!

    ',7);function x(b,v){const t=p("ExternalLinkIcon");return r(),i("div",null,[l,_,e("p",null,[o("连接家中内网,家里必须有个固定的访问地址。我将子域名 "),e("a",d,[o("home.xxx.com"),n(t)]),o(" 指向家中 IP。")]),g,h,m,e("p",null,[o("光猫设置参考"),e("a",f,[o("光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射"),n(t)]),o("。")]),u])}const V=a(c,[["render",x],["__file","2019-03-31-openvpn_back_to_home.html.vue"]]);export{V as default}; diff --git a/assets/2019-04-01-rsshub_noob.html-ff8a167f.js b/assets/2019-04-01-rsshub_noob.html-2d0e0a3e.js similarity index 98% rename from assets/2019-04-01-rsshub_noob.html-ff8a167f.js rename to assets/2019-04-01-rsshub_noob.html-2d0e0a3e.js index 9891d140..ad837dd3 100644 --- a/assets/2019-04-01-rsshub_noob.html-ff8a167f.js +++ b/assets/2019-04-01-rsshub_noob.html-2d0e0a3e.js @@ -1 +1 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as r,c as s,a as e,b as t,d as l}from"./app-98132e77.js";const a={},p=e("p",null,"RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。",-1),_=e("strong",null,"RSSHub",-1),h={href:"https://docs.rsshub.app/",target:"_blank",rel:"noopener noreferrer"},u=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20190331012441.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),d=e("h2",{id:"bilibili-番剧抓取示例",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#bilibili-番剧抓取示例","aria-hidden":"true"},"#"),t(" bilibili 番剧抓取示例")],-1),c={href:"https://docs.rsshub.app/social-media.html#bilibili",target:"_blank",rel:"noopener noreferrer"},b=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20190406131343.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),S=e("li",null,[e("p",null,[t("准备抓取番剧《盾之勇者成名录》的更新,番剧主页链接为 "),e("code",null,"https://www.bilibili.com/bangumi/media/md4316482/"),t(",mediaid 为 "),e("code",null,"4316482"),t("。")])],-1),g=e("li",null,[e("p",null,[t("按照路由参数,修改 RSS 链接 "),e("code",null,"https://rsshub.app/bilibili/bangumi/media/4316482"),t(",然后在 RSS 阅读器中打开。")]),e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20190406134022.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")])],-1),f=e("p",null,"附注:虽然 RSSHub 使用非常简单,但由于现已过于流行,微博、知乎等已开始反爬限制。若动手能力强,建议按下方教程自行部署或选择 Huginn。",-1),m=e("h2",{id:"rss-合集",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#rss-合集","aria-hidden":"true"},"#"),t(" RSS 合集")],-1),R=e("p",null,"汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),H={href:"https://gpt-vip.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},k={href:"https://gpt-vip.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://gpt-vip.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},x={href:"https://gpt-vip.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},w={href:"https://gpt-vip.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},E={href:"https://gpt-vip.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"};function y(N,z){const n=i("ExternalLinkIcon");return r(),s("div",null,[p,e("p",null,[_,t(" 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 "),e("a",h,[t("RSSHub 官网"),l(n)]),t(",便可定期获取主流媒体的 RSS 项目更新。")]),u,d,e("ol",null,[e("li",null,[e("p",null,[t("打开 "),e("a",c,[t("RSSHub bilibili 专区"),l(n)]),t(",在此可根据番剧、UP 主等定制 RSS。")]),b]),S,g]),f,m,R,e("ul",null,[e("li",null,[e("p",null,[e("a",H,[t("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),l(n)])])]),e("li",null,[e("p",null,[e("a",k,[t("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),l(n)])])]),e("li",null,[e("p",null,[e("a",v,[t("RSS 速成篇:RSSHub 捡现成的轮子"),l(n)])])]),e("li",null,[e("p",null,[e("a",x,[t("RSS 速成篇 2:RSSHub 自部署"),l(n)])])]),e("li",null,[e("p",null,[e("a",w,[t("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),l(n)])])]),e("li",null,[e("p",null,[e("a",E,[t("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),l(n)])])])])])}const V=o(a,[["render",y],["__file","2019-04-01-rsshub_noob.html.vue"]]);export{V as default}; +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as r,c as s,a as e,b as t,d as l}from"./app-91ee3df5.js";const a={},p=e("p",null,"RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。",-1),_=e("strong",null,"RSSHub",-1),h={href:"https://docs.rsshub.app/",target:"_blank",rel:"noopener noreferrer"},u=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20190331012441.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),d=e("h2",{id:"bilibili-番剧抓取示例",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#bilibili-番剧抓取示例","aria-hidden":"true"},"#"),t(" bilibili 番剧抓取示例")],-1),c={href:"https://docs.rsshub.app/social-media.html#bilibili",target:"_blank",rel:"noopener noreferrer"},b=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20190406131343.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),S=e("li",null,[e("p",null,[t("准备抓取番剧《盾之勇者成名录》的更新,番剧主页链接为 "),e("code",null,"https://www.bilibili.com/bangumi/media/md4316482/"),t(",mediaid 为 "),e("code",null,"4316482"),t("。")])],-1),g=e("li",null,[e("p",null,[t("按照路由参数,修改 RSS 链接 "),e("code",null,"https://rsshub.app/bilibili/bangumi/media/4316482"),t(",然后在 RSS 阅读器中打开。")]),e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20190406134022.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")])],-1),f=e("p",null,"附注:虽然 RSSHub 使用非常简单,但由于现已过于流行,微博、知乎等已开始反爬限制。若动手能力强,建议按下方教程自行部署或选择 Huginn。",-1),m=e("h2",{id:"rss-合集",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#rss-合集","aria-hidden":"true"},"#"),t(" RSS 合集")],-1),R=e("p",null,"汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),H={href:"https://gpt-vip.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},k={href:"https://gpt-vip.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://gpt-vip.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},x={href:"https://gpt-vip.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},w={href:"https://gpt-vip.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},E={href:"https://gpt-vip.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"};function y(N,z){const n=i("ExternalLinkIcon");return r(),s("div",null,[p,e("p",null,[_,t(" 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 "),e("a",h,[t("RSSHub 官网"),l(n)]),t(",便可定期获取主流媒体的 RSS 项目更新。")]),u,d,e("ol",null,[e("li",null,[e("p",null,[t("打开 "),e("a",c,[t("RSSHub bilibili 专区"),l(n)]),t(",在此可根据番剧、UP 主等定制 RSS。")]),b]),S,g]),f,m,R,e("ul",null,[e("li",null,[e("p",null,[e("a",H,[t("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),l(n)])])]),e("li",null,[e("p",null,[e("a",k,[t("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),l(n)])])]),e("li",null,[e("p",null,[e("a",v,[t("RSS 速成篇:RSSHub 捡现成的轮子"),l(n)])])]),e("li",null,[e("p",null,[e("a",x,[t("RSS 速成篇 2:RSSHub 自部署"),l(n)])])]),e("li",null,[e("p",null,[e("a",w,[t("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),l(n)])])]),e("li",null,[e("p",null,[e("a",E,[t("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),l(n)])])])])])}const V=o(a,[["render",y],["__file","2019-04-01-rsshub_noob.html.vue"]]);export{V as default}; diff --git a/assets/2019-08-26-scrcpy_screen_projection.html-77d605ce.js b/assets/2019-08-26-scrcpy_screen_projection.html-12960a67.js similarity index 99% rename from assets/2019-08-26-scrcpy_screen_projection.html-77d605ce.js rename to assets/2019-08-26-scrcpy_screen_projection.html-12960a67.js index 75e58a11..e42fcde7 100644 --- a/assets/2019-08-26-scrcpy_screen_projection.html-77d605ce.js +++ b/assets/2019-08-26-scrcpy_screen_projection.html-12960a67.js @@ -1,4 +1,4 @@ -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as t,c as o,a as e,b as n,d as s,e as c}from"./app-98132e77.js";const p={},l={href:"https://github.com/Genymobile/scrcpy",target:"_blank",rel:"noopener noreferrer"},d=e("p",null,"市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。",-1),u={href:"https://github.com/Genymobile/scrcpy/releases/download/v2.2/scrcpy-win64-v2.2.zip",target:"_blank",rel:"noopener noreferrer"},m={href:"https://wwva.lanzouq.com/iEdcP1dhfduf",target:"_blank",rel:"noopener noreferrer"},h=c(`

    有线投屏

    1. 下载并解压 scrcpy。
    2. 在手机上启用 开发者选项USB 调试。要开启开发者选项,通常需要点击手机上的「设置/系统」>「关于手机」,然后连续点击版本号七次。返回上一屏幕后,你将在底部找到开发者选项。
    3. 使用数据线连接手机和电脑。手机上会弹出一个授权请求,请选择「允许 USB 调试」。
    4. 双击已解压的 scrcpy.exe 文件,即可开始有线投屏。

    若需在手机黑屏时继续投屏,请按以下步骤操作:当手机屏幕亮起并解锁后,连接至电脑,然后输入命令 .\\scrcpy --turn-screen-off。此操作会关闭手机屏幕,但投屏功能继续正常运行。

    无线投屏

    无线投屏的前提是,电脑和手机处于同一局域网中。

    有线投屏中的前三步也适用于无线投屏,完成这些步骤后,打开 PowerShell(~ cmd),依次输入操作命令。

    # a.将命令目录切换到 scrcpy 文件夹。如果使用的是 Windows 11,在 scrcpy 文件夹中右键点击「在终端中打开」,会自动切换到当前路径。
    +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as t,c as o,a as e,b as n,d as s,e as c}from"./app-91ee3df5.js";const p={},l={href:"https://github.com/Genymobile/scrcpy",target:"_blank",rel:"noopener noreferrer"},d=e("p",null,"市面上主流的多屏协同软件大多都是基于 scrcpy 开发的套壳产品,而且 bug 也没有得到修复,因此建议直接使用官方的 scrcpy。",-1),u={href:"https://github.com/Genymobile/scrcpy/releases/download/v2.2/scrcpy-win64-v2.2.zip",target:"_blank",rel:"noopener noreferrer"},m={href:"https://wwva.lanzouq.com/iEdcP1dhfduf",target:"_blank",rel:"noopener noreferrer"},h=c(`

    有线投屏

    1. 下载并解压 scrcpy。
    2. 在手机上启用 开发者选项USB 调试。要开启开发者选项,通常需要点击手机上的「设置/系统」>「关于手机」,然后连续点击版本号七次。返回上一屏幕后,你将在底部找到开发者选项。
    3. 使用数据线连接手机和电脑。手机上会弹出一个授权请求,请选择「允许 USB 调试」。
    4. 双击已解压的 scrcpy.exe 文件,即可开始有线投屏。

    若需在手机黑屏时继续投屏,请按以下步骤操作:当手机屏幕亮起并解锁后,连接至电脑,然后输入命令 .\\scrcpy --turn-screen-off。此操作会关闭手机屏幕,但投屏功能继续正常运行。

    无线投屏

    无线投屏的前提是,电脑和手机处于同一局域网中。

    有线投屏中的前三步也适用于无线投屏,完成这些步骤后,打开 PowerShell(~ cmd),依次输入操作命令。

    # a.将命令目录切换到 scrcpy 文件夹。如果使用的是 Windows 11,在 scrcpy 文件夹中右键点击「在终端中打开」,会自动切换到当前路径。
     cd D:\\Libraries\\Desktop\\scrcpy-win64-v2.2
     ​
     # b.在手机端开启「开发者选项」和「USB 调试」,然后使用数据线将手机和电脑连接,并允许 USB 调试,开启手机端口。
    diff --git a/assets/2020-03-25-rsshub_on_vps.html-35d6b536.js b/assets/2020-03-25-rsshub_on_vps.html-34bfaac9.js
    similarity index 97%
    rename from assets/2020-03-25-rsshub_on_vps.html-35d6b536.js
    rename to assets/2020-03-25-rsshub_on_vps.html-34bfaac9.js
    index 1fb99260..633c8950 100644
    --- a/assets/2020-03-25-rsshub_on_vps.html-35d6b536.js
    +++ b/assets/2020-03-25-rsshub_on_vps.html-34bfaac9.js
    @@ -1 +1 @@
    -import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as r,c as i,a as e,b as t,d as o,e as a}from"./app-98132e77.js";const p={},h=e("p",null,[t("RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好"),e("strong",null,"域名和服务器"),t("。")],-1),u=e("p",null,"新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。",-1),_=e("h2",{id:"部署步骤",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#部署步骤","aria-hidden":"true"},"#"),t(" 部署步骤")],-1),c=e("li",null,[e("p",null,[t("将 RSSHub 代码下载到根目录 root,执行命令 "),e("code",null,"git clone https://github.com/DIYgod/RSSHub.git"),t("。")])],-1),d={href:"https://www.bt.cn/bbs/thread-19376-1-1.html",target:"_blank",rel:"noopener noreferrer"},b=a('
  • 登陆宝塔面板,点击「软件商店」-「运行环境」,安装PM2 管理器

  • 点击 PM2 管理器右侧的设置,按图中红字添加项目路径,启动文件名称为 lib

  • 添加后,点击项目中的「映射」,输入指定域名,如 rsshub.xxx.com,服务器的 1200 端口将指向该域名。映射域名需解析到服务器 IP。

  • ',3),g=e("p",null,[t("程序运行时,如果遇到报错,可以直接用命令运行 pm2,如 "),e("code",null,"pm2 start /root/RSSHub/lib/index.js --name rsshub"),t("。")],-1),S=e("h2",{id:"使用步骤",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#使用步骤","aria-hidden":"true"},"#"),t(" 使用步骤")],-1),f={href:"https://docs.rsshub.app/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://docs.rsshub.app/social-media.html#bilibili",target:"_blank",rel:"noopener noreferrer"},R=e("code",null,"https://rsshub.app/bilibili/bangumi/media/9192",-1),x=e("code",null,"https://rsshub.app",-1),H=e("code",null,"http://rsshub.xxx.com/bilibili/bangumi/media/9192",-1),v=e("code",null,"mode=fulltext",-1),k=e("code",null,"https://rsshub.xxx.com/guokr/scientific?mode=fulltext",-1),w={href:"https://docs.rsshub.app/parameter.html",target:"_blank",rel:"noopener noreferrer"},E=e("h2",{id:"rsshub-vs-huginn",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#rsshub-vs-huginn","aria-hidden":"true"},"#"),t(" RSSHub VS. Huginn")],-1),M=e("ul",null,[e("li",null,"RSSHub:使用简单,使用现成的抓取规则,适用于国内主流网站;但无法抓取对小众网站,必须 RSSHub 官方定制订阅源。"),e("li",null,"Huginn:适用于所有网站,可设定抓取频率、内容结构、js 结果、输出样式等;但部署、配置复杂,入门门槛高,需要针对网站单独定制抓取规则。")],-1),N=e("h2",{id:"rss-合集",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#rss-合集","aria-hidden":"true"},"#"),t(" RSS 合集")],-1),P=e("p",null,"汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),V={href:"https://gpt-vip.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://gpt-vip.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},I={href:"https://gpt-vip.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},z={href:"https://gpt-vip.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},B={href:"https://gpt-vip.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},j={href:"https://gpt-vip.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"};function D(F,L){const n=s("ExternalLinkIcon");return r(),i("div",null,[h,u,_,e("ol",null,[c,e("li",null,[e("p",null,[t("安装宝塔面板,查看"),e("a",d,[t("官方安装教程"),o(n)]),t("。")])]),b]),g,S,e("ol",null,[e("li",null,[e("p",null,[t("打开 "),e("a",f,[t("RSSHub 接口指南"),o(n)]),t(",搜索需要订阅的网站。RSSHub 支持国内大部分的主流网站。")])]),e("li",null,[e("p",null,[t("根据 "),e("a",m,[t("bilibili 番剧路由"),o(n)]),t("的文档,将生成源 "),R,t(" 其中的域名 "),x,t(" 替换为你自部署的域名,如 "),H,t("。")])])]),e("p",null,[t("另外 RSSHub 支持很多实用的参数,比如内容过滤、全文输出等。全文输出参数为 "),v,t(",应用举例:果壳科学人全文输出 "),k,t("。其他可以在"),e("a",w,[t("通用参数"),o(n)]),t("官方文档了解具体使用方法。")]),E,M,N,P,e("ul",null,[e("li",null,[e("p",null,[e("a",V,[t("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),o(n)])])]),e("li",null,[e("p",null,[e("a",y,[t("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),o(n)])])]),e("li",null,[e("p",null,[e("a",I,[t("RSS 速成篇:RSSHub 捡现成的轮子"),o(n)])])]),e("li",null,[e("p",null,[e("a",z,[t("RSS 速成篇 2:RSSHub 自部署"),o(n)])])]),e("li",null,[e("p",null,[e("a",B,[t("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),o(n)])])]),e("li",null,[e("p",null,[e("a",j,[t("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),o(n)])])])])])}const J=l(p,[["render",D],["__file","2020-03-25-rsshub_on_vps.html.vue"]]);export{J as default}; +import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as r,c as i,a as e,b as t,d as o,e as a}from"./app-91ee3df5.js";const p={},h=e("p",null,[t("RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好"),e("strong",null,"域名和服务器"),t("。")],-1),u=e("p",null,"新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。",-1),_=e("h2",{id:"部署步骤",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#部署步骤","aria-hidden":"true"},"#"),t(" 部署步骤")],-1),c=e("li",null,[e("p",null,[t("将 RSSHub 代码下载到根目录 root,执行命令 "),e("code",null,"git clone https://github.com/DIYgod/RSSHub.git"),t("。")])],-1),d={href:"https://www.bt.cn/bbs/thread-19376-1-1.html",target:"_blank",rel:"noopener noreferrer"},b=a('
  • 登陆宝塔面板,点击「软件商店」-「运行环境」,安装PM2 管理器

  • 点击 PM2 管理器右侧的设置,按图中红字添加项目路径,启动文件名称为 lib

  • 添加后,点击项目中的「映射」,输入指定域名,如 rsshub.xxx.com,服务器的 1200 端口将指向该域名。映射域名需解析到服务器 IP。

  • ',3),g=e("p",null,[t("程序运行时,如果遇到报错,可以直接用命令运行 pm2,如 "),e("code",null,"pm2 start /root/RSSHub/lib/index.js --name rsshub"),t("。")],-1),S=e("h2",{id:"使用步骤",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#使用步骤","aria-hidden":"true"},"#"),t(" 使用步骤")],-1),f={href:"https://docs.rsshub.app/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://docs.rsshub.app/social-media.html#bilibili",target:"_blank",rel:"noopener noreferrer"},R=e("code",null,"https://rsshub.app/bilibili/bangumi/media/9192",-1),x=e("code",null,"https://rsshub.app",-1),H=e("code",null,"http://rsshub.xxx.com/bilibili/bangumi/media/9192",-1),v=e("code",null,"mode=fulltext",-1),k=e("code",null,"https://rsshub.xxx.com/guokr/scientific?mode=fulltext",-1),w={href:"https://docs.rsshub.app/parameter.html",target:"_blank",rel:"noopener noreferrer"},E=e("h2",{id:"rsshub-vs-huginn",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#rsshub-vs-huginn","aria-hidden":"true"},"#"),t(" RSSHub VS. Huginn")],-1),M=e("ul",null,[e("li",null,"RSSHub:使用简单,使用现成的抓取规则,适用于国内主流网站;但无法抓取对小众网站,必须 RSSHub 官方定制订阅源。"),e("li",null,"Huginn:适用于所有网站,可设定抓取频率、内容结构、js 结果、输出样式等;但部署、配置复杂,入门门槛高,需要针对网站单独定制抓取规则。")],-1),N=e("h2",{id:"rss-合集",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#rss-合集","aria-hidden":"true"},"#"),t(" RSS 合集")],-1),P=e("p",null,"汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。",-1),V={href:"https://gpt-vip.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://gpt-vip.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},I={href:"https://gpt-vip.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},z={href:"https://gpt-vip.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},B={href:"https://gpt-vip.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},j={href:"https://gpt-vip.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"};function D(F,L){const n=s("ExternalLinkIcon");return r(),i("div",null,[h,u,_,e("ol",null,[c,e("li",null,[e("p",null,[t("安装宝塔面板,查看"),e("a",d,[t("官方安装教程"),o(n)]),t("。")])]),b]),g,S,e("ol",null,[e("li",null,[e("p",null,[t("打开 "),e("a",f,[t("RSSHub 接口指南"),o(n)]),t(",搜索需要订阅的网站。RSSHub 支持国内大部分的主流网站。")])]),e("li",null,[e("p",null,[t("根据 "),e("a",m,[t("bilibili 番剧路由"),o(n)]),t("的文档,将生成源 "),R,t(" 其中的域名 "),x,t(" 替换为你自部署的域名,如 "),H,t("。")])])]),e("p",null,[t("另外 RSSHub 支持很多实用的参数,比如内容过滤、全文输出等。全文输出参数为 "),v,t(",应用举例:果壳科学人全文输出 "),k,t("。其他可以在"),e("a",w,[t("通用参数"),o(n)]),t("官方文档了解具体使用方法。")]),E,M,N,P,e("ul",null,[e("li",null,[e("p",null,[e("a",V,[t("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),o(n)])])]),e("li",null,[e("p",null,[e("a",y,[t("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),o(n)])])]),e("li",null,[e("p",null,[e("a",I,[t("RSS 速成篇:RSSHub 捡现成的轮子"),o(n)])])]),e("li",null,[e("p",null,[e("a",z,[t("RSS 速成篇 2:RSSHub 自部署"),o(n)])])]),e("li",null,[e("p",null,[e("a",B,[t("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),o(n)])])]),e("li",null,[e("p",null,[e("a",j,[t("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),o(n)])])])])])}const J=l(p,[["render",D],["__file","2020-03-25-rsshub_on_vps.html.vue"]]);export{J as default}; diff --git a/assets/2020-09-13-wifi_speed_up.html-e705b214.js b/assets/2020-09-13-wifi_speed_up.html-e025d303.js similarity index 97% rename from assets/2020-09-13-wifi_speed_up.html-e705b214.js rename to assets/2020-09-13-wifi_speed_up.html-e025d303.js index d60624c0..6bb23267 100644 --- a/assets/2020-09-13-wifi_speed_up.html-e705b214.js +++ b/assets/2020-09-13-wifi_speed_up.html-e025d303.js @@ -1 +1 @@ -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as e,c as a,e as t}from"./app-98132e77.js";const p={},r=t('

    拖慢 WIFI 速度的最大元凶是无线信号合并

    「双频合一」、「Smart Connect」听起来很美,信号不好就立刻切换信号更强的频道,速度慢就切换为更快的频道,似乎是个完美的方案。但使用后就知道它们的规则多傻了,速度慢到让你想用手机流量。任何将无线信号合一的功能都不推荐使用。

    先关闭路由器的合频功能,然后针对无线模式、频道带宽、频道/信道逐步调整,避免 wifi 无故自动断开,提升 wifi 速度和稳定性。

    无线模式

    无线模式其实是选择 wifi 协议,如 802.11b、802.11g、802.11n 等。兼容旧版本协议,会拖慢 wifi 的速度。

    建议建议 2.4GHz 频段的频道带宽设为「N only」,5GHz 频段的频道带宽设为「N/AC mixed」。Legacy 模式为兼容模式,适合家里有 10 年前的设备需求。

    频道带宽

    频道带宽一般为 20、40、80MHz,一些厂商如华为有自己的 160MHz。频道带宽越大,wifi 速度越快,但穿透性也随之变弱,覆盖范围变小。

    建议 2.4GHz 频段的频道带宽设为「20/40MHz」,5GHz 频段的频道带宽设为「80MHz」。这样可以保证 wifi 近距离的链接速度,同时也保证了 wifi 的覆盖范围。

    调整信道

    无线信道/频道是路由与手机的接收频道,通常家用路由有 161 条信道。当越多设备使用相同信道,会造成信道堵塞,减慢无线速度。

    家庭只需要考虑自家和邻居的网络,无线环境较为简单。建议通过「Wifi 分析仪」找到并固定无线信道,避免无线疯狂切换信道,影响无线稳定性。

    手机安装「Wifi 分析仪」,点击应用右上角的眼睛,选中「信道评级」。信道评级将显示选中 wifi 的最佳信道选择。切换上方的 wifi 名称,查看其它 wifi 的推荐信道。

    找到最佳信道后,在路由器中固定无线网络的信道/频道。目前国内大部分路由都不支持 wifi 信道手工调整,只有华硕等少数路由支持,建议新购路由先跟店家确认是否支持手工调整信道。

    ',15),n=[r];function o(f,c){return e(),a("div",null,n)}const h=i(p,[["render",o],["__file","2020-09-13-wifi_speed_up.html.vue"]]);export{h as default}; +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as e,c as a,e as t}from"./app-91ee3df5.js";const p={},r=t('

    拖慢 WIFI 速度的最大元凶是无线信号合并

    「双频合一」、「Smart Connect」听起来很美,信号不好就立刻切换信号更强的频道,速度慢就切换为更快的频道,似乎是个完美的方案。但使用后就知道它们的规则多傻了,速度慢到让你想用手机流量。任何将无线信号合一的功能都不推荐使用。

    先关闭路由器的合频功能,然后针对无线模式、频道带宽、频道/信道逐步调整,避免 wifi 无故自动断开,提升 wifi 速度和稳定性。

    无线模式

    无线模式其实是选择 wifi 协议,如 802.11b、802.11g、802.11n 等。兼容旧版本协议,会拖慢 wifi 的速度。

    建议建议 2.4GHz 频段的频道带宽设为「N only」,5GHz 频段的频道带宽设为「N/AC mixed」。Legacy 模式为兼容模式,适合家里有 10 年前的设备需求。

    频道带宽

    频道带宽一般为 20、40、80MHz,一些厂商如华为有自己的 160MHz。频道带宽越大,wifi 速度越快,但穿透性也随之变弱,覆盖范围变小。

    建议 2.4GHz 频段的频道带宽设为「20/40MHz」,5GHz 频段的频道带宽设为「80MHz」。这样可以保证 wifi 近距离的链接速度,同时也保证了 wifi 的覆盖范围。

    调整信道

    无线信道/频道是路由与手机的接收频道,通常家用路由有 161 条信道。当越多设备使用相同信道,会造成信道堵塞,减慢无线速度。

    家庭只需要考虑自家和邻居的网络,无线环境较为简单。建议通过「Wifi 分析仪」找到并固定无线信道,避免无线疯狂切换信道,影响无线稳定性。

    手机安装「Wifi 分析仪」,点击应用右上角的眼睛,选中「信道评级」。信道评级将显示选中 wifi 的最佳信道选择。切换上方的 wifi 名称,查看其它 wifi 的推荐信道。

    找到最佳信道后,在路由器中固定无线网络的信道/频道。目前国内大部分路由都不支持 wifi 信道手工调整,只有华硕等少数路由支持,建议新购路由先跟店家确认是否支持手工调整信道。

    ',15),n=[r];function o(f,c){return e(),a("div",null,n)}const h=i(p,[["render",o],["__file","2020-09-13-wifi_speed_up.html.vue"]]);export{h as default}; diff --git a/assets/2020-09-22-uefi_asus_board.html-e2f2348b.js b/assets/2020-09-22-uefi_asus_board.html-a8de8dd5.js similarity index 94% rename from assets/2020-09-22-uefi_asus_board.html-e2f2348b.js rename to assets/2020-09-22-uefi_asus_board.html-a8de8dd5.js index 8812beb7..a506fc7e 100644 --- a/assets/2020-09-22-uefi_asus_board.html-e2f2348b.js +++ b/assets/2020-09-22-uefi_asus_board.html-a8de8dd5.js @@ -1 +1 @@ -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{o,c as _,a as e}from"./app-98132e77.js";const n={},s=e("p",null,"电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。",-1),c=e("p",null,"电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。",-1),a=e("figure",null,[e("img",{src:"https://pic4.zhimg.com/v2-8a26bd62460f662caad3dba696c54efb_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"华硕主板设置截图")],-1),l=e("p",null,"设置完成后,Win10 就可以正常更新了。",-1),i=e("p",null,"有人反馈「改了启动不了系统」,这是由于系统硬件与你新的设置冲突造成的,并不会造成系统破坏。只需重新进入 BIOS,将设置改回或将 BIOS 还原为默认设置,即可进入系统。",-1),r=[s,c,a,l,i];function d(u,f){return o(),_("div",null,r)}const m=t(n,[["render",d],["__file","2020-09-22-uefi_asus_board.html.vue"]]);export{m as default}; +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{o,c as _,a as e}from"./app-91ee3df5.js";const n={},s=e("p",null,"电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。",-1),c=e("p",null,"电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。",-1),a=e("figure",null,[e("img",{src:"https://pic4.zhimg.com/v2-8a26bd62460f662caad3dba696c54efb_r.jpg",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"华硕主板设置截图")],-1),l=e("p",null,"设置完成后,Win10 就可以正常更新了。",-1),i=e("p",null,"有人反馈「改了启动不了系统」,这是由于系统硬件与你新的设置冲突造成的,并不会造成系统破坏。只需重新进入 BIOS,将设置改回或将 BIOS 还原为默认设置,即可进入系统。",-1),r=[s,c,a,l,i];function d(u,f){return o(),_("div",null,r)}const m=t(n,[["render",d],["__file","2020-09-22-uefi_asus_board.html.vue"]]);export{m as default}; diff --git a/assets/2020-11-27-rime_input.html-a8789cf3.js b/assets/2020-11-27-rime_input.html-962a2c1f.js similarity index 99% rename from assets/2020-11-27-rime_input.html-a8789cf3.js rename to assets/2020-11-27-rime_input.html-962a2c1f.js index c28a1433..bb6ef64b 100644 --- a/assets/2020-11-27-rime_input.html-a8789cf3.js +++ b/assets/2020-11-27-rime_input.html-962a2c1f.js @@ -1,4 +1,4 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as i,c as l,a as n,b as e,d as a,e as s}from"./app-98132e77.js";const c={},p=n("p",null,[e("常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个"),n("strong",null,"键盘记录器"),e("。")],-1),d=n("p",null,"之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录慢且难以转移;只有小狼毫开源、稳定,而且又能多设备同步词库。",-1),u={href:"https://github.com/rime/weasel/releases/download/0.15.0/weasel-0.15.0.0-installer.exe",target:"_blank",rel:"noopener noreferrer"},h={href:"https://wwva.lanzoum.com/iTAcP0ynxmfi",target:"_blank",rel:"noopener noreferrer"},_=s('

    基础设置

    安装小狼毫时,不要修改用户文件夹位置,否则后续输入法定制容易出错。安装完成后,右键单击任务栏的小狼毫图标,点击「输入法设定」,勾选输入法(推荐「朙月拼音·简化字」),点击「中」,选择皮肤后即可使用小狼毫输入法。[1][2]

    ',2),m={href:"https://github.com/fkxxyz/rime-cloverpinyin",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/ssnhd/rime",target:"_blank",rel:"noopener noreferrer"},k={href:"https://blog.csdn.net/qq_42204675/article/details/86422450",target:"_blank",rel:"noopener noreferrer"},b=n("h2",{id:"扩充词库",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#扩充词库","aria-hidden":"true"},"#"),e(" 扩充词库")],-1),y={href:"https://github.com/Chernfalin/better-rime-dict",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/Chernfalin/SuperRimeDict",target:"_blank",rel:"noopener noreferrer"},v={href:"https://gist.github.com/lotem/5440677",target:"_blank",rel:"noopener noreferrer"},x={href:"https://github.com/rime-aca/dictionaries",target:"_blank",rel:"noopener noreferrer"},E=n("p",null,"从容量上来说,SuperRime 词库 > BetterRime 词库 > Rime 擴充詞庫,但词库越大错误收录也越多,建议按实际需求选择词库。",-1),w=n("p",null,[e("词库解压后,修改 "),n("code",null,"luna_pinyin.extended.dict.yaml"),e(",选择词库范围。"),n("code",null,"mysymbols.yaml"),e(" 对全角和半角符号都做了优化,有其他需求可以自行修改。")],-1),q=n("h2",{id:"双拼方案",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#双拼方案","aria-hidden":"true"},"#"),e(" 双拼方案")],-1),A={href:"https://github.com/rime/rime-double-pinyin",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/rime/rime-double-pinyin/blob/master/double_pinyin_flypy.schema.yaml",target:"_blank",rel:"noopener noreferrer"},B={href:"https://github.com/functoreality/rime-flypy-zrmfast",target:"_blank",rel:"noopener noreferrer"},R={href:"https://blog.csdn.net/neninee/article/details/83692270",target:"_blank",rel:"noopener noreferrer"},C=n("code",null,"double_pinyin_flypy.schema.yaml",-1),W={href:"https://github.com/rime/rime-double-pinyin/issues/6#issuecomment-754367706",target:"_blank",rel:"noopener noreferrer"},z=n("code",null,"- 'xform/^(.*)$/\\U$1\\E\\t | $1/'",-1),D=n("code",null,"{原始输出}|{对应拼音}",-1),j=s(`
    translator:
    +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as i,c as l,a as n,b as e,d as a,e as s}from"./app-91ee3df5.js";const c={},p=n("p",null,[e("常年使用搜狗输入法,备份时发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,词库无法从云端删除,只要你输入过一次,搜狗就永远记住了。这哪里是输入法,根本是个"),n("strong",null,"键盘记录器"),e("。")],-1),d=n("p",null,"之后,我尝试了各种输入法:百度、讯飞、手心等依旧是键盘记录器;影子输入法开源但不稳定;谷歌拼音停止更新;微软拼音词库收录慢且难以转移;只有小狼毫开源、稳定,而且又能多设备同步词库。",-1),u={href:"https://github.com/rime/weasel/releases/download/0.15.0/weasel-0.15.0.0-installer.exe",target:"_blank",rel:"noopener noreferrer"},h={href:"https://wwva.lanzoum.com/iTAcP0ynxmfi",target:"_blank",rel:"noopener noreferrer"},_=s('

    基础设置

    安装小狼毫时,不要修改用户文件夹位置,否则后续输入法定制容易出错。安装完成后,右键单击任务栏的小狼毫图标,点击「输入法设定」,勾选输入法(推荐「朙月拼音·简化字」),点击「中」,选择皮肤后即可使用小狼毫输入法。[1][2]

    ',2),m={href:"https://github.com/fkxxyz/rime-cloverpinyin",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/ssnhd/rime",target:"_blank",rel:"noopener noreferrer"},k={href:"https://blog.csdn.net/qq_42204675/article/details/86422450",target:"_blank",rel:"noopener noreferrer"},b=n("h2",{id:"扩充词库",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#扩充词库","aria-hidden":"true"},"#"),e(" 扩充词库")],-1),y={href:"https://github.com/Chernfalin/better-rime-dict",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/Chernfalin/SuperRimeDict",target:"_blank",rel:"noopener noreferrer"},v={href:"https://gist.github.com/lotem/5440677",target:"_blank",rel:"noopener noreferrer"},x={href:"https://github.com/rime-aca/dictionaries",target:"_blank",rel:"noopener noreferrer"},E=n("p",null,"从容量上来说,SuperRime 词库 > BetterRime 词库 > Rime 擴充詞庫,但词库越大错误收录也越多,建议按实际需求选择词库。",-1),w=n("p",null,[e("词库解压后,修改 "),n("code",null,"luna_pinyin.extended.dict.yaml"),e(",选择词库范围。"),n("code",null,"mysymbols.yaml"),e(" 对全角和半角符号都做了优化,有其他需求可以自行修改。")],-1),q=n("h2",{id:"双拼方案",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#双拼方案","aria-hidden":"true"},"#"),e(" 双拼方案")],-1),A={href:"https://github.com/rime/rime-double-pinyin",target:"_blank",rel:"noopener noreferrer"},S={href:"https://github.com/rime/rime-double-pinyin/blob/master/double_pinyin_flypy.schema.yaml",target:"_blank",rel:"noopener noreferrer"},B={href:"https://github.com/functoreality/rime-flypy-zrmfast",target:"_blank",rel:"noopener noreferrer"},R={href:"https://blog.csdn.net/neninee/article/details/83692270",target:"_blank",rel:"noopener noreferrer"},C=n("code",null,"double_pinyin_flypy.schema.yaml",-1),W={href:"https://github.com/rime/rime-double-pinyin/issues/6#issuecomment-754367706",target:"_blank",rel:"noopener noreferrer"},z=n("code",null,"- 'xform/^(.*)$/\\U$1\\E\\t | $1/'",-1),D=n("code",null,"{原始输出}|{对应拼音}",-1),j=s(`
    translator:
       dictionary: luna_pinyin
       prism: double_pinyin_flypy
       preedit_format:
    diff --git a/assets/2021-01-02-keepass_the_real_lastpassword.html-3a5bee1b.js b/assets/2021-01-02-keepass_the_real_lastpassword.html-a32e6819.js
    similarity index 99%
    rename from assets/2021-01-02-keepass_the_real_lastpassword.html-3a5bee1b.js
    rename to assets/2021-01-02-keepass_the_real_lastpassword.html-a32e6819.js
    index 6615ed47..cfb93456 100644
    --- a/assets/2021-01-02-keepass_the_real_lastpassword.html-3a5bee1b.js
    +++ b/assets/2021-01-02-keepass_the_real_lastpassword.html-a32e6819.js
    @@ -1 +1 @@
    -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as h,c as i,a as e,b as t,d as s,e as o}from"./app-98132e77.js";const l={},d=e("p",null,"用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。",-1),c=e("p",null,[t("之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择"),e("strong",null,"开源免费且自动填充超强"),t("的 KeePass。")],-1),p=e("p",null,[t("KeePass 的密码保存在本地的 "),e("code",null,".kdbx"),t(" 数据库中,让你真正掌握自己的账号密码。搭配坚果云或同步盘的 KeePass,能实现密码多端同步,让手机与电脑使用同一密码库。")],-1),_={href:"https://keepass.info/download.html",target:"_blank",rel:"noopener noreferrer"},f=e("code",null,"Keepass2Android",-1),u=e("code",null,"Strongbox",-1),g=e("code",null,"KeePassium",-1),k=o('

    接着我会逐步介绍 KeePass 的配置和插件,也可以直接拖到文章底部,下载懒人包,开箱即用。

    KeePass 设置

    选项设置

    点击菜单栏上的「工具」>「选项」>「外观」,在「主窗口」中勾选「最小化到系统托盘(而不是任务栏)」和「关闭按钮 [X] 最小化主窗口,而不是退出程序」。

    然后从「选项」中选择「集成」,将「全局自动输入」设为 Ctrl+Alt+A,「全局自动输入(仅密码)」设为 Ctrl+Alt+Shift+A。

    自动输入规则

    选中左侧的数据库,右键单击「编辑群组」>「自动输入」,替换默认规则为 ^{SPACE}{DELAY 100}{CLEARFIELD}{USERNAME}{TAB}{PASSWORD}{DELAY 100}{ENTER}^{SPACE}[1]

    ^{SPACE}Ctrl+Space,该热键能关闭或启用当前输入法。关闭输入法后,默认为美式键盘输入。

    Ctrl+Space 需在输入法编辑状态下才能生效,而密码区都禁用输入法编辑。因此,输入密码完成后,可能输入法并未重置,要按 Ctrl+Space 才能正常启用输入法。

    匹配多个网址

    KeePass 不能在一个条目填写多个匹配网址,但不同条目可以共享用户名、密码等字段数据,并且通过更改被引用的数据条目,所有其他条目也会同步使用更新值。[2]

    比如 163.comyoudao.com 都使用网易账户,账号密码相同,根据网址建立了 2 个条目。首先,在 163 条目输入实际的账户密码,将其作为网易账户的主条目。然后,双击进入 youdao 条目,点击 Edit Entry 界面左下角的「工具」>「插入字段引用」>「在用户名/密码字段」,选中需要引用的条目。设置好后,字段旁边会出现分享符,表明这是引用字段,该字段数值会跟随主条目更新。引用字段的实际内容类似 {REF:P@I:8CC19B988F0F9D499459B741753BEE5F},更改账户密码只能在主条目上进行。

    引用字段设置步骤

    必备插件

    KeePass 需要配置插件,才能实现密码自动输入。下载插件并放入指定文件夹 \\Plugins,重启 KeePass 即可使插件生效。

    KeePassHttp

    ',16),b={href:"https://github.com/pfn/keepasshttp",target:"_blank",rel:"noopener noreferrer"},P=e("p",null,"如果网页有不能被识别用户名或密码框,可使用 KeePassHttp-Connector 的「Choose own credential fields for this page」功能。",-1),K=e("h3",{id:"kpenhancedentryview",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#kpenhancedentryview","aria-hidden":"true"},"#"),t(" KPEnhancedEntryView")],-1),m={href:"https://keepass.info/plugins.html#kpenhentryview",target:"_blank",rel:"noopener noreferrer"},y=e("ul",null,[e("li",null,"在主界面中点击「显示」>「窗口布局」>「平铺」;"),e("li",null,"在主界面中点击「显示」>「列设置」,只选择:「标题」>「确定」。大家也可以按自己要求选择。")],-1),x=e("h3",{id:"autotypesearch",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#autotypesearch","aria-hidden":"true"},"#"),t(" AutoTypeSearch")],-1),w={href:"https://keepass.info/plugins.html#atsearch",target:"_blank",rel:"noopener noreferrer"},C=e("code",null,"Ctrl+Shift+A",-1),E=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20191013083950.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"AutoTypeSearch 通用设置")],-1),T=e("h3",{id:"kp-entry-templates",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#kp-entry-templates","aria-hidden":"true"},"#"),t(" KP Entry Templates")],-1),A={href:"https://github.com/mitchcapper/KPEntryTemplates",target:"_blank",rel:"noopener noreferrer"},S=e("ol",null,[e("li",null,"点击 KeePass 主界面的「文件」>「数据库设置」>「高级」,在「模板记录组」中选择一个群组,点击「确定」;"),e("li",null,"返回主界面,点击步骤 1 中选择的群组,按 Ctrl+I(或点击上方工具栏的钥匙图标)添加记录;"),e("li",null,[t("点击「自动输入」,勾选「双通道自动输入混淆」("),e("strong",null,"以后用模板添加记录时就不需要再勾选,一劳永逸"),t(");")]),e("li",null,"点击最左边的「Template」>「Init As Template」,配置好所需模板,点击「确定」。")],-1),v=e("h3",{id:"kpsourceforgeupdatechecker",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#kpsourceforgeupdatechecker","aria-hidden":"true"},"#"),t(" KPSourceForgeUpdateChecker")],-1),B={href:"https://sourceforge.net/projects/kpsfupdatechecker/reviews",target:"_blank",rel:"noopener noreferrer"},F=e("h2",{id:"可选插件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#可选插件","aria-hidden":"true"},"#"),t(" 可选插件")],-1),N=e("h3",{id:"early-update-check",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#early-update-check","aria-hidden":"true"},"#"),t(" Early update Check")],-1),H={href:"https://github.com/Rookiestyle/EarlyUpdateCheck",target:"_blank",rel:"noopener noreferrer"},R=e("h3",{id:"keetraytotp",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#keetraytotp","aria-hidden":"true"},"#"),t(" KeeTrayTOTP")],-1),D={href:"https://github.com/victor-rds/KeeTrayTOTP/releases/",target:"_blank",rel:"noopener noreferrer"},O={href:"https://www.cnblogs.com/tielemao/p/9613839.html",target:"_blank",rel:"noopener noreferrer"},I=e("h3",{id:"webautotype",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#webautotype","aria-hidden":"true"},"#"),t(" WebAutoType")],-1),L={href:"https://keepass.info/plugins.html#webautotype",target:"_blank",rel:"noopener noreferrer"},M=e("h3",{id:"yet-another-favicon-downloader",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#yet-another-favicon-downloader","aria-hidden":"true"},"#"),t(" Yet Another Favicon Downloader")],-1),U={href:"https://keepass.info/plugins.html#yafd",target:"_blank",rel:"noopener noreferrer"},V=e("h3",{id:"hibp-offline-check",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#hibp-offline-check","aria-hidden":"true"},"#"),t(" HIBP Offline Check")],-1),z={href:"https://github.com/mihaifm/HIBPOfflineCheck",target:"_blank",rel:"noopener noreferrer"},W={href:"https://haveibeenpwned.com/",target:"_blank",rel:"noopener noreferrer"},j=e("h3",{id:"keepassrpc",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#keepassrpc","aria-hidden":"true"},"#"),t(" KeePassRPC")],-1),X={href:"https://github.com/kee-org/keepassrpc/releases/",target:"_blank",rel:"noopener noreferrer"},Y=e("strong",null,"自动填充密码并登录",-1),q=e("p",null,"其他插件不能自动登录,只有 Kee 能做到该功能。使用 Kee 的自动登录功能后,少数页面会出现循环登录,需暂停 Kee 扩展来停止循环错误。",-1),G=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-05-14-29-32.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"Kee 设置")],-1),J=e("h3",{id:"keepassnatmsg",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#keepassnatmsg","aria-hidden":"true"},"#"),t(" KeePassNatMsg")],-1),Z=e("p",null,"浏览器插件 KeePassHttp-Connector 已不再更新,有段时间甚至不兼容新版 KeePass。",-1),Q={href:"https://github.com/smorks/keepassnatmsg",target:"_blank",rel:"noopener noreferrer"},$=o('

    如果报错「proxy download error」,备份并删除文件夹 C:\\Users%Username%\\AppData\\Local\\KeePassNatMsg,然后重新加载 Native Messaging Host。

    常见问题

    多账户排序

    同一网址有多个账户密码时,无将其中一个账户密码默认置顶。通过插件 KeePassHttp 和 KeePassNatMsg,能按 username 或 title 对账户进行排序。

    为什么不选 KeepassXC

    KeepassXC 基于 KeePass 开发,界面更美观,应用设置更简单,并开发了专属的浏览器插件。

    入门 KeepassXC 也比 KeePass 来得轻松,但 KeePass 操控和定制性更强。密码库的使用是以年为单位,比起节约一两天的时间,个人推荐使用 KeePass 原版定制你自己的密码库。

    KeePass 懒人包

    ',8),ee={href:"https://wwz.lanzouy.com/iJ6yA0bve7wb",target:"_blank",rel:"noopener noreferrer"},te={href:"https://pan.baidu.com/s/1dm0djnDGq8SOsTPy3jByZg?pwd=nrwj",target:"_blank",rel:"noopener noreferrer"},ae=o('

    KeePass 懒人包为绿色版,集成了常用插件,建立数据库即可使用 KeePass。

    建立数据库:

    1. 解压懒人包,打开程序 KeePass.exe

    2. 屏幕右下角托盘处,打开 KeePass。

    3. 菜单栏上点击「文件」>「新建」,建立属于你的密码数据库。

      KeePass 懒人包设置

    懒人包集成插件:AutoTypeSearch,Entry Templates,KeePassHttp,KeePassNatMsg,KeePassRpc,KeeTrayTOTP,KPEnhancedEntryView,SourceForgeUpdateChecker,WebAutoType。


    ',5),se={class:"footnotes"},oe={class:"footnotes-list"},re={id:"footnote1",class:"footnote-item"},ne={href:"https://blog.csdn.net/SingWarm/article/details/90669580",target:"_blank",rel:"noopener noreferrer"},he=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),ie={id:"footnote2",class:"footnote-item"},le={href:"https://keepass.info/help/base/fieldrefs.html",target:"_blank",rel:"noopener noreferrer"},de=e("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1);function ce(pe,_e){const a=n("ExternalLinkIcon");return h(),i("div",null,[d,c,p,e("p",null,[t("KeePass 官网下载(Windows):"),e("a",_,[t("https://keepass.info/download.html"),s(a)]),t("。安卓推荐 "),f,t(",iOS/Mac 推荐 "),u,t(" 或 "),g,t("。")]),k,e("p",null,[e("a",b,[t("KeePassHttp"),s(a)]),t(" 是 Keepass 的连接核心,搭配浏览器插件 KeePassHttp-Connector,可以实现浏览器自动填充密码效果。")]),P,K,e("p",null,[e("a",m,[t("KPEnhancedEntryView"),s(a)]),t(" 增强视觉效果,为达到最佳显示效果,按以下配置:")]),y,x,e("p",null,[e("a",w,[t("AutoTypeSearch"),s(a)]),t(" 提供全局框,输入热键 "),C,t(" 后,搜索关键词输入密码。")]),E,T,e("p",null,[e("a",A,[t("KP Entry Templates"),s(a)]),t(" 可以设置保存模板,配置方法如下:")]),S,v,e("p",null,[e("a",B,[t("KPSourceForgeUpdateChecker"),s(a)]),t(" 可以帮助检查 KeePass 及其插件是否有更新,功能从菜单栏上点击「帮助」>「检查更新」进入,会使用 SourceForge 上的插件更新信息。")]),F,N,e("p",null,[e("a",H,[t("Early Update Check"),s(a)]),t(" 可以一键式更新 KeePass 及其插件,支持安装包和便携版的安装方式。")]),R,e("p",null,[t("如果你有更高安全要求,"),e("a",D,[t("KeeTrayTOTP"),s(a)]),t(" 能增加二次动态验证,使用参考"),e("a",O,[t("使用 KeePass 管理两步验证"),s(a)]),t("。")]),I,e("p",null,[e("a",L,[t("WebAutoType"),s(a)]),t(" 是很多人的推荐插件,启动密码热键后会自动匹配当前网址、标题。这对于已经有大量密码的人来说,并不实用,可不安装。")]),M,e("p",null,[e("a",U,[t("Yet Another Favicon Downloader"),s(a)]),t(" 插件能自动匹配下载网站图标,但会大幅增加数据库的大小。不在意界面美观度的话,无需安装 Yet Another Favicon Downloader。")]),V,e("p",null,[e("a",z,[t("HIBP Offline Check"),s(a)]),t(" 可以使用 "),e("a",W,[t("have i been pwned?"),s(a)]),t(" 在线检查密码库,也能使用本地数据库离线检查。")]),j,e("p",null,[e("a",X,[t("KeePassRPC"),s(a)]),t(" 搭配浏览器插件 Kee,能实现"),Y,t("。")]),q,G,J,Z,e("p",null,[t("如果遇到不兼容,可使用 "),e("a",Q,[t("KeePassNatMsg"),s(a)]),t(" 和 KeePassXC-Browser 连接浏览器,本方案不支持搜狗浏览器。")]),$,e("p",null,[t("2022.09.17 更新懒人包:"),e("a",ee,[t("蓝奏云"),s(a)]),t(","),e("a",te,[t("百度云盘"),s(a)]),t(" 提取码:nrwj。")]),ae,e("section",se,[e("ol",oe,[e("li",re,[e("p",null,[e("a",ne,[t("Keepass 教程之二——完美的通用自动输入规则"),s(a)]),t(),he])]),e("li",ie,[e("p",null,[e("a",le,[t("Field References-KeePass"),s(a)]),t(),de])])])])])}const ge=r(l,[["render",ce],["__file","2021-01-02-keepass_the_real_lastpassword.html.vue"]]);export{ge as default}; +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as h,c as i,a as e,b as t,d as s,e as o}from"./app-91ee3df5.js";const l={},d=e("p",null,"用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。",-1),c=e("p",null,[t("之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择"),e("strong",null,"开源免费且自动填充超强"),t("的 KeePass。")],-1),p=e("p",null,[t("KeePass 的密码保存在本地的 "),e("code",null,".kdbx"),t(" 数据库中,让你真正掌握自己的账号密码。搭配坚果云或同步盘的 KeePass,能实现密码多端同步,让手机与电脑使用同一密码库。")],-1),_={href:"https://keepass.info/download.html",target:"_blank",rel:"noopener noreferrer"},f=e("code",null,"Keepass2Android",-1),u=e("code",null,"Strongbox",-1),g=e("code",null,"KeePassium",-1),k=o('

    接着我会逐步介绍 KeePass 的配置和插件,也可以直接拖到文章底部,下载懒人包,开箱即用。

    KeePass 设置

    选项设置

    点击菜单栏上的「工具」>「选项」>「外观」,在「主窗口」中勾选「最小化到系统托盘(而不是任务栏)」和「关闭按钮 [X] 最小化主窗口,而不是退出程序」。

    然后从「选项」中选择「集成」,将「全局自动输入」设为 Ctrl+Alt+A,「全局自动输入(仅密码)」设为 Ctrl+Alt+Shift+A。

    自动输入规则

    选中左侧的数据库,右键单击「编辑群组」>「自动输入」,替换默认规则为 ^{SPACE}{DELAY 100}{CLEARFIELD}{USERNAME}{TAB}{PASSWORD}{DELAY 100}{ENTER}^{SPACE}[1]

    ^{SPACE}Ctrl+Space,该热键能关闭或启用当前输入法。关闭输入法后,默认为美式键盘输入。

    Ctrl+Space 需在输入法编辑状态下才能生效,而密码区都禁用输入法编辑。因此,输入密码完成后,可能输入法并未重置,要按 Ctrl+Space 才能正常启用输入法。

    匹配多个网址

    KeePass 不能在一个条目填写多个匹配网址,但不同条目可以共享用户名、密码等字段数据,并且通过更改被引用的数据条目,所有其他条目也会同步使用更新值。[2]

    比如 163.comyoudao.com 都使用网易账户,账号密码相同,根据网址建立了 2 个条目。首先,在 163 条目输入实际的账户密码,将其作为网易账户的主条目。然后,双击进入 youdao 条目,点击 Edit Entry 界面左下角的「工具」>「插入字段引用」>「在用户名/密码字段」,选中需要引用的条目。设置好后,字段旁边会出现分享符,表明这是引用字段,该字段数值会跟随主条目更新。引用字段的实际内容类似 {REF:P@I:8CC19B988F0F9D499459B741753BEE5F},更改账户密码只能在主条目上进行。

    引用字段设置步骤

    必备插件

    KeePass 需要配置插件,才能实现密码自动输入。下载插件并放入指定文件夹 \\Plugins,重启 KeePass 即可使插件生效。

    KeePassHttp

    ',16),b={href:"https://github.com/pfn/keepasshttp",target:"_blank",rel:"noopener noreferrer"},P=e("p",null,"如果网页有不能被识别用户名或密码框,可使用 KeePassHttp-Connector 的「Choose own credential fields for this page」功能。",-1),K=e("h3",{id:"kpenhancedentryview",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#kpenhancedentryview","aria-hidden":"true"},"#"),t(" KPEnhancedEntryView")],-1),m={href:"https://keepass.info/plugins.html#kpenhentryview",target:"_blank",rel:"noopener noreferrer"},y=e("ul",null,[e("li",null,"在主界面中点击「显示」>「窗口布局」>「平铺」;"),e("li",null,"在主界面中点击「显示」>「列设置」,只选择:「标题」>「确定」。大家也可以按自己要求选择。")],-1),x=e("h3",{id:"autotypesearch",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#autotypesearch","aria-hidden":"true"},"#"),t(" AutoTypeSearch")],-1),w={href:"https://keepass.info/plugins.html#atsearch",target:"_blank",rel:"noopener noreferrer"},C=e("code",null,"Ctrl+Shift+A",-1),E=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20191013083950.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"AutoTypeSearch 通用设置")],-1),T=e("h3",{id:"kp-entry-templates",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#kp-entry-templates","aria-hidden":"true"},"#"),t(" KP Entry Templates")],-1),A={href:"https://github.com/mitchcapper/KPEntryTemplates",target:"_blank",rel:"noopener noreferrer"},S=e("ol",null,[e("li",null,"点击 KeePass 主界面的「文件」>「数据库设置」>「高级」,在「模板记录组」中选择一个群组,点击「确定」;"),e("li",null,"返回主界面,点击步骤 1 中选择的群组,按 Ctrl+I(或点击上方工具栏的钥匙图标)添加记录;"),e("li",null,[t("点击「自动输入」,勾选「双通道自动输入混淆」("),e("strong",null,"以后用模板添加记录时就不需要再勾选,一劳永逸"),t(");")]),e("li",null,"点击最左边的「Template」>「Init As Template」,配置好所需模板,点击「确定」。")],-1),v=e("h3",{id:"kpsourceforgeupdatechecker",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#kpsourceforgeupdatechecker","aria-hidden":"true"},"#"),t(" KPSourceForgeUpdateChecker")],-1),B={href:"https://sourceforge.net/projects/kpsfupdatechecker/reviews",target:"_blank",rel:"noopener noreferrer"},F=e("h2",{id:"可选插件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#可选插件","aria-hidden":"true"},"#"),t(" 可选插件")],-1),N=e("h3",{id:"early-update-check",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#early-update-check","aria-hidden":"true"},"#"),t(" Early update Check")],-1),H={href:"https://github.com/Rookiestyle/EarlyUpdateCheck",target:"_blank",rel:"noopener noreferrer"},R=e("h3",{id:"keetraytotp",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#keetraytotp","aria-hidden":"true"},"#"),t(" KeeTrayTOTP")],-1),D={href:"https://github.com/victor-rds/KeeTrayTOTP/releases/",target:"_blank",rel:"noopener noreferrer"},O={href:"https://www.cnblogs.com/tielemao/p/9613839.html",target:"_blank",rel:"noopener noreferrer"},I=e("h3",{id:"webautotype",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#webautotype","aria-hidden":"true"},"#"),t(" WebAutoType")],-1),L={href:"https://keepass.info/plugins.html#webautotype",target:"_blank",rel:"noopener noreferrer"},M=e("h3",{id:"yet-another-favicon-downloader",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#yet-another-favicon-downloader","aria-hidden":"true"},"#"),t(" Yet Another Favicon Downloader")],-1),U={href:"https://keepass.info/plugins.html#yafd",target:"_blank",rel:"noopener noreferrer"},V=e("h3",{id:"hibp-offline-check",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#hibp-offline-check","aria-hidden":"true"},"#"),t(" HIBP Offline Check")],-1),z={href:"https://github.com/mihaifm/HIBPOfflineCheck",target:"_blank",rel:"noopener noreferrer"},W={href:"https://haveibeenpwned.com/",target:"_blank",rel:"noopener noreferrer"},j=e("h3",{id:"keepassrpc",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#keepassrpc","aria-hidden":"true"},"#"),t(" KeePassRPC")],-1),X={href:"https://github.com/kee-org/keepassrpc/releases/",target:"_blank",rel:"noopener noreferrer"},Y=e("strong",null,"自动填充密码并登录",-1),q=e("p",null,"其他插件不能自动登录,只有 Kee 能做到该功能。使用 Kee 的自动登录功能后,少数页面会出现循环登录,需暂停 Kee 扩展来停止循环错误。",-1),G=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-05-14-29-32.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"Kee 设置")],-1),J=e("h3",{id:"keepassnatmsg",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#keepassnatmsg","aria-hidden":"true"},"#"),t(" KeePassNatMsg")],-1),Z=e("p",null,"浏览器插件 KeePassHttp-Connector 已不再更新,有段时间甚至不兼容新版 KeePass。",-1),Q={href:"https://github.com/smorks/keepassnatmsg",target:"_blank",rel:"noopener noreferrer"},$=o('

    如果报错「proxy download error」,备份并删除文件夹 C:\\Users%Username%\\AppData\\Local\\KeePassNatMsg,然后重新加载 Native Messaging Host。

    常见问题

    多账户排序

    同一网址有多个账户密码时,无将其中一个账户密码默认置顶。通过插件 KeePassHttp 和 KeePassNatMsg,能按 username 或 title 对账户进行排序。

    为什么不选 KeepassXC

    KeepassXC 基于 KeePass 开发,界面更美观,应用设置更简单,并开发了专属的浏览器插件。

    入门 KeepassXC 也比 KeePass 来得轻松,但 KeePass 操控和定制性更强。密码库的使用是以年为单位,比起节约一两天的时间,个人推荐使用 KeePass 原版定制你自己的密码库。

    KeePass 懒人包

    ',8),ee={href:"https://wwz.lanzouy.com/iJ6yA0bve7wb",target:"_blank",rel:"noopener noreferrer"},te={href:"https://pan.baidu.com/s/1dm0djnDGq8SOsTPy3jByZg?pwd=nrwj",target:"_blank",rel:"noopener noreferrer"},ae=o('

    KeePass 懒人包为绿色版,集成了常用插件,建立数据库即可使用 KeePass。

    建立数据库:

    1. 解压懒人包,打开程序 KeePass.exe

    2. 屏幕右下角托盘处,打开 KeePass。

    3. 菜单栏上点击「文件」>「新建」,建立属于你的密码数据库。

      KeePass 懒人包设置

    懒人包集成插件:AutoTypeSearch,Entry Templates,KeePassHttp,KeePassNatMsg,KeePassRpc,KeeTrayTOTP,KPEnhancedEntryView,SourceForgeUpdateChecker,WebAutoType。


    ',5),se={class:"footnotes"},oe={class:"footnotes-list"},re={id:"footnote1",class:"footnote-item"},ne={href:"https://blog.csdn.net/SingWarm/article/details/90669580",target:"_blank",rel:"noopener noreferrer"},he=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),ie={id:"footnote2",class:"footnote-item"},le={href:"https://keepass.info/help/base/fieldrefs.html",target:"_blank",rel:"noopener noreferrer"},de=e("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1);function ce(pe,_e){const a=n("ExternalLinkIcon");return h(),i("div",null,[d,c,p,e("p",null,[t("KeePass 官网下载(Windows):"),e("a",_,[t("https://keepass.info/download.html"),s(a)]),t("。安卓推荐 "),f,t(",iOS/Mac 推荐 "),u,t(" 或 "),g,t("。")]),k,e("p",null,[e("a",b,[t("KeePassHttp"),s(a)]),t(" 是 Keepass 的连接核心,搭配浏览器插件 KeePassHttp-Connector,可以实现浏览器自动填充密码效果。")]),P,K,e("p",null,[e("a",m,[t("KPEnhancedEntryView"),s(a)]),t(" 增强视觉效果,为达到最佳显示效果,按以下配置:")]),y,x,e("p",null,[e("a",w,[t("AutoTypeSearch"),s(a)]),t(" 提供全局框,输入热键 "),C,t(" 后,搜索关键词输入密码。")]),E,T,e("p",null,[e("a",A,[t("KP Entry Templates"),s(a)]),t(" 可以设置保存模板,配置方法如下:")]),S,v,e("p",null,[e("a",B,[t("KPSourceForgeUpdateChecker"),s(a)]),t(" 可以帮助检查 KeePass 及其插件是否有更新,功能从菜单栏上点击「帮助」>「检查更新」进入,会使用 SourceForge 上的插件更新信息。")]),F,N,e("p",null,[e("a",H,[t("Early Update Check"),s(a)]),t(" 可以一键式更新 KeePass 及其插件,支持安装包和便携版的安装方式。")]),R,e("p",null,[t("如果你有更高安全要求,"),e("a",D,[t("KeeTrayTOTP"),s(a)]),t(" 能增加二次动态验证,使用参考"),e("a",O,[t("使用 KeePass 管理两步验证"),s(a)]),t("。")]),I,e("p",null,[e("a",L,[t("WebAutoType"),s(a)]),t(" 是很多人的推荐插件,启动密码热键后会自动匹配当前网址、标题。这对于已经有大量密码的人来说,并不实用,可不安装。")]),M,e("p",null,[e("a",U,[t("Yet Another Favicon Downloader"),s(a)]),t(" 插件能自动匹配下载网站图标,但会大幅增加数据库的大小。不在意界面美观度的话,无需安装 Yet Another Favicon Downloader。")]),V,e("p",null,[e("a",z,[t("HIBP Offline Check"),s(a)]),t(" 可以使用 "),e("a",W,[t("have i been pwned?"),s(a)]),t(" 在线检查密码库,也能使用本地数据库离线检查。")]),j,e("p",null,[e("a",X,[t("KeePassRPC"),s(a)]),t(" 搭配浏览器插件 Kee,能实现"),Y,t("。")]),q,G,J,Z,e("p",null,[t("如果遇到不兼容,可使用 "),e("a",Q,[t("KeePassNatMsg"),s(a)]),t(" 和 KeePassXC-Browser 连接浏览器,本方案不支持搜狗浏览器。")]),$,e("p",null,[t("2022.09.17 更新懒人包:"),e("a",ee,[t("蓝奏云"),s(a)]),t(","),e("a",te,[t("百度云盘"),s(a)]),t(" 提取码:nrwj。")]),ae,e("section",se,[e("ol",oe,[e("li",re,[e("p",null,[e("a",ne,[t("Keepass 教程之二——完美的通用自动输入规则"),s(a)]),t(),he])]),e("li",ie,[e("p",null,[e("a",le,[t("Field References-KeePass"),s(a)]),t(),de])])])])])}const ge=r(l,[["render",ce],["__file","2021-01-02-keepass_the_real_lastpassword.html.vue"]]);export{ge as default}; diff --git a/assets/2021-01-27-blog_jekyll_to_wordpress.html-e2e3eb99.js b/assets/2021-01-27-blog_jekyll_to_wordpress.html-836fb9a5.js similarity index 98% rename from assets/2021-01-27-blog_jekyll_to_wordpress.html-e2e3eb99.js rename to assets/2021-01-27-blog_jekyll_to_wordpress.html-836fb9a5.js index 313dfc33..32ec0322 100644 --- a/assets/2021-01-27-blog_jekyll_to_wordpress.html-e2e3eb99.js +++ b/assets/2021-01-27-blog_jekyll_to_wordpress.html-836fb9a5.js @@ -1,4 +1,4 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as p,c as l,a as n,b as s,d as t,e as c}from"./app-98132e77.js";const i={},r=n("p",null,"2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。",-1),u=n("p",null,"2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感想记录转移到知识输出。",-1),d=n("p",null,"Jekyll 用着太舒服,不知不觉就过了三年。但随着文章越来越多,修改也愈加困难,甚至逐渐习惯只更新专栏,而将博客仅作初版发布。Jekyll 已经失去了知识记录参考的初衷,决定将博客从 Jekyll 迁移到 WordPress,文章的初次排版编辑依旧使用 Markdown。",-1),k=n("figure",null,[n("img",{src:"https://img.gpt-vip.top/20210128124408.png?imageMogr2/thumbnail/500x",alt:"",tabindex:"0",loading:"lazy"}),n("figcaption")],-1),g=n("h2",{id:"迁移步骤",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#迁移步骤","aria-hidden":"true"},"#"),s(" 迁移步骤")],-1),m={href:"https://github.com/Huxpro/huxpro.github.io",target:"_blank",rel:"noopener noreferrer"},_=c(`
    1. 复制博客主目录下的 feed.xml 文件,重命名为「feed-wp.xml」。如果目录内不存在 feed.xml,可尝试 rss.xml 或 atom.xml。

    2. 修改 feed-wp.xml 文件中的 for post in site.posts limit:100 %,该项为 rss 最低生成量,我们导出所有文章,因此将该值修改为 100。

    3. 参照下方内容,按 WordPress 所需 rss 格式修改 feed-wp.xml 文件的 item 部分,并在文件顶部的 <rss> 元素内添加 xmlns:content="http://purl.org/rss/1.0/modules/content/",避免 xml 格式报错。

      <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" >
      +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as p,c as l,a as n,b as s,d as t,e as c}from"./app-91ee3df5.js";const i={},r=n("p",null,"2005 年开始在 MSN space 写博客,期间配合 Google Sidewiki(短命) 记录感想。六年后,MSN space 关闭,旧博客被动转移到 WordPress 托管,暂停使用博客。",-1),u=n("p",null,"2018 年偶尔接触到 Jekyll,被其简洁的界面和便捷性打动,博客复活。本地用 Markdown 编辑排版,同步 github 发布,博客方向则从感想记录转移到知识输出。",-1),d=n("p",null,"Jekyll 用着太舒服,不知不觉就过了三年。但随着文章越来越多,修改也愈加困难,甚至逐渐习惯只更新专栏,而将博客仅作初版发布。Jekyll 已经失去了知识记录参考的初衷,决定将博客从 Jekyll 迁移到 WordPress,文章的初次排版编辑依旧使用 Markdown。",-1),k=n("figure",null,[n("img",{src:"https://img.gpt-vip.top/20210128124408.png?imageMogr2/thumbnail/500x",alt:"",tabindex:"0",loading:"lazy"}),n("figcaption")],-1),g=n("h2",{id:"迁移步骤",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#迁移步骤","aria-hidden":"true"},"#"),s(" 迁移步骤")],-1),m={href:"https://github.com/Huxpro/huxpro.github.io",target:"_blank",rel:"noopener noreferrer"},_=c(`
      1. 复制博客主目录下的 feed.xml 文件,重命名为「feed-wp.xml」。如果目录内不存在 feed.xml,可尝试 rss.xml 或 atom.xml。

      2. 修改 feed-wp.xml 文件中的 for post in site.posts limit:100 %,该项为 rss 最低生成量,我们导出所有文章,因此将该值修改为 100。

      3. 参照下方内容,按 WordPress 所需 rss 格式修改 feed-wp.xml 文件的 item 部分,并在文件顶部的 <rss> 元素内添加 xmlns:content="http://purl.org/rss/1.0/modules/content/",避免 xml 格式报错。

        <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" >
           <item>
             <title>标题</title>
             <pubDate>发布日期</pubDate>
        diff --git a/assets/2021-05-31-principles_criticism_and_self-criticism.html-8d8f69c9.js b/assets/2021-05-31-principles_criticism_and_self-criticism.html-efcfbef6.js
        similarity index 98%
        rename from assets/2021-05-31-principles_criticism_and_self-criticism.html-8d8f69c9.js
        rename to assets/2021-05-31-principles_criticism_and_self-criticism.html-efcfbef6.js
        index 693554a9..3aac63c4 100644
        --- a/assets/2021-05-31-principles_criticism_and_self-criticism.html-8d8f69c9.js
        +++ b/assets/2021-05-31-principles_criticism_and_self-criticism.html-efcfbef6.js
        @@ -1 +1 @@
        -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as s,c as a,a as t,b as l,d as n,e as i}from"./app-98132e77.js";const p={},d=i('

        读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。

        理论支撑

        党的三大作风《原则》个人生活
        理论联系实际的作风,一切从实际出发拥抱现实,应对现实实事求是
        相信群众,依靠群众,尊重群众,向群众学习,对群众负责头脑极度开放公开分享想法
        对自身的缺点、错误认真地进行自我检查,提出纠正的方法发现问题,不容忍问题批评和自我批评

        中国共产党的三大作风有:

        第一,理论联系实际的作风,就是坚持实事求是,一切从实际出发,把马克思主义的普遍真理同中国革命的具体实践相结合,也就是运用马克思主义的立场、观点和方法,去分析、研究和解决中国革命的实际问题。

        第二,密切联系群众的作风,就是相信群众,依靠群众,尊重群众,向群众学习,对群众负责的作风,也就是要坚持历史唯物主义关于历史是人民群众创造的观点和辩证唯物主义认识论关于人民群众是认识的主体的观点,坚持党的群众路线和群众观点,实行“从群众中来,到群众中去”的工作方法,就是要求党一刻也不能脱离群众,一刻也不能放松群众工作,要为广大群众求解放,谋幸福。

        第三,批评和自我批评的作风,就是对党内、同志之间在思想上、作风上、工作中存在的缺点、错误,真诚而又严肃地提出批评,帮助犯错误的同志提高认识,取得进步;对自身的缺点、错误认真地进行自我检查,提出纠正的方法,取得深刻教训。

        融入到个人生活中变为:

        第一,理论联系实际的作风,就是坚持实事求是,一切从实际出发,把理论知识与个人生活相结合,也就是站在客观角度,去分析、研究和解决个人生活的实际问题。

        第二,头脑极度透明,公开分享想法,在不擅长的领域请教擅长的其他人,不要固守你对事物「应该」是怎样的看法。

        第三,批评和自我批评的作风,就是对朋友、家人之间在思想上、工作中存在的缺点、错误,真诚而又严肃地提出批评,帮助其他人提高认识,取得进步;对自身的缺点、错误认真地进行自我检查,提出纠正的方法,取得深刻教训。

        以下是我给自己制订的方案,可结合自己的实际生活做出调整。

        实事求是地制订方案

        根据「你想要什么;事实是什么;面对事实,你如何实现目标」设定目标,然后写下清晰具体的方案,让任何人都能对照方案执行。

        方案要求:

        • 有明确的目标。
        • 找到问题:找到阻碍你实现这些目标的问题,准确诊断问题,发掘问题的根源,并且不容忍问题。
        • 制订方案:规划可以解决问题的方案,并严格执行。做一切必要的事来践行这些方案,实现成果。
        • 执行方案需要严格遵守方案的自律,如果执行中出现问题,思考该步任务是否符合目标。

        头脑透明地分享想法

        公开想法:让其他人无比清晰地看到你在做什么、为什么这么做。头脑越透明,越不会自欺,其他人也会给你诚实的反馈。

        同时注意:

        • 不要固守你对事物「应该」是怎样的看法,这将使你无法了解真实的情况。
        • 在不擅长的领域请教擅长的其他人,或外包,或使用成熟的工具,或查看教程攻略。
        • 不要把不好的结果归咎于任何人,从自己身上找原因。

        批评和自我批评

        每月固定一个时间 (月底),对自身行为进行反思,并与家人、朋友分享自己的现状,征求他们的意见、批评。不用担心其他人的看法,不要担心自己的形象,而关心如何实现目标。

        行动计划

        按上列原则,制定行动计划 (不断调整):

        每日

        ',21),c=t("p",null,[t("strong",null,"早上创造美好情绪"),l(":赞美、仪式感、吃好吃的、看搞笑视频、听歌。")],-1),h=t("li",null,"唱歌:唱一首你喜欢的歌。(为减肥,我选择了外语美声歌曲,秋山雅史 - 千の風になって)",-1),u=t("li",null,"录自拍视频:说一句话(当日目标?)鼓励自己。录制内容在前一天准备好,目的是给你带来积极情绪。",-1),_={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},f=i("
      4. 人际连接:通过直播连麦与陌生人沟通 15 分钟。如:抖音 PK 语音直播。

        • 别人很重要:帮助别人,能让人更健康、更幸福。心情不好事,就去帮助其他人,心情会更好。
        • 表扬和自我表扬:赞美自己、家人,发挥标志性优势,总比弥补缺点更有效。
      5. 微习惯

        • 工作 20 分钟休息 20 秒,做 10 个深蹲。
        • 出书房或上完厕所,做 10 个俯卧撑。
        • 俯卧撑、深蹲前,在磁性板上写正字来记录,一个笔画代表一组(10 个)。
      6. 间隔学习:通过 SuperMemo 的记忆模型,复习心理认知、沟通理论、行为反思在内的笔记。

      7. 当日回顾:记录 3 件好事,总结好事发生的原因,给家人分享好事。
        这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。

      8. ",4),g=t("p",null,[t("strong",null,"定期"),l(":")],-1),x=t("strong",null,"月底反思",-1),b={href:"https://allisonseboldt.com/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://justinjackson.ca/bootstrap",target:"_blank",rel:"noopener noreferrer"},k=t("li",null,[t("strong",null,"积极自我介绍"),l(":每隔三个月,讲述一个「最佳的我」的故事,植入你的优势,进行自我肯定。")],-1),y=t("p",null,[t("strong",null,"公开记录"),l(":")],-1),v={href:"https://gpt-vip.top/",target:"_blank",rel:"noopener noreferrer"},q={href:"https://gpt-vip.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},N=t("li",null,[t("p",null,"微习惯视频:监督运动习惯。拍摄视频时,使用关键句「切掉/保留」,配合 Quickcut 快速剪辑视频。")],-1),V=t("p",null,"下一步,寻找更多的党组理论根据和执行书籍资料,相信一个成熟的组织不是无故崛起,更不会无故持续这么些年。",-1);function w(B,E){const e=o("ExternalLinkIcon");return s(),a("div",null,[d,t("ul",null,[t("li",null,[c,t("ul",null,[h,u,t("li",null,[l("参考"),t("a",_,[l("积极心理学"),n(e)]),l(",收集积极情绪材料放在醒目的地方:家人的照片、取得的成绩、美好的回忆、憧憬的未来、向往的地方、喜欢的艺术 (音乐、名画、诗句)。")])])]),f]),g,t("ul",null,[t("li",null,[x,l(":检查日记和成果,对当月进行复盘,并将其同步给家人,征求意见、批评并记录。 "),t("ul",null,[t("li",null,[l("复盘笔记参照 "),t("a",b,[l("Allison Seboldt"),n(e)]),l(",作者每个月都会进行「回顾」,分享他的收入并反思上个月的成就。")]),t("li",null,[l("读 "),t("a",m,[l("JustinJ ackson"),n(e)]),l(" – 作者在 2018 年初创办  Transistor  以来,一直在分享他的项目。他整理了在此过程中学到的许多经验教训。")])])]),k]),y,t("ul",null,[t("li",null,[t("p",null,[t("a",v,[l("学习笔记"),n(e)]),l(":将对工具、工作方式和生活的思考记录发布在公开页面,欢迎大家的点评。")])]),t("li",null,[t("p",null,[l("工作视频:"),t("a",q,[l("自我监控视频"),n(e)]),l(",记录私密工作状态,方便当日回顾。")])]),N]),V])}const j=r(p,[["render",w],["__file","2021-05-31-principles_criticism_and_self-criticism.html.vue"]]);export{j as default}; +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as s,c as a,a as t,b as l,d as n,e as i}from"./app-91ee3df5.js";const p={},d=i('

        读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。

        理论支撑

        党的三大作风《原则》个人生活
        理论联系实际的作风,一切从实际出发拥抱现实,应对现实实事求是
        相信群众,依靠群众,尊重群众,向群众学习,对群众负责头脑极度开放公开分享想法
        对自身的缺点、错误认真地进行自我检查,提出纠正的方法发现问题,不容忍问题批评和自我批评

        中国共产党的三大作风有:

        第一,理论联系实际的作风,就是坚持实事求是,一切从实际出发,把马克思主义的普遍真理同中国革命的具体实践相结合,也就是运用马克思主义的立场、观点和方法,去分析、研究和解决中国革命的实际问题。

        第二,密切联系群众的作风,就是相信群众,依靠群众,尊重群众,向群众学习,对群众负责的作风,也就是要坚持历史唯物主义关于历史是人民群众创造的观点和辩证唯物主义认识论关于人民群众是认识的主体的观点,坚持党的群众路线和群众观点,实行“从群众中来,到群众中去”的工作方法,就是要求党一刻也不能脱离群众,一刻也不能放松群众工作,要为广大群众求解放,谋幸福。

        第三,批评和自我批评的作风,就是对党内、同志之间在思想上、作风上、工作中存在的缺点、错误,真诚而又严肃地提出批评,帮助犯错误的同志提高认识,取得进步;对自身的缺点、错误认真地进行自我检查,提出纠正的方法,取得深刻教训。

        融入到个人生活中变为:

        第一,理论联系实际的作风,就是坚持实事求是,一切从实际出发,把理论知识与个人生活相结合,也就是站在客观角度,去分析、研究和解决个人生活的实际问题。

        第二,头脑极度透明,公开分享想法,在不擅长的领域请教擅长的其他人,不要固守你对事物「应该」是怎样的看法。

        第三,批评和自我批评的作风,就是对朋友、家人之间在思想上、工作中存在的缺点、错误,真诚而又严肃地提出批评,帮助其他人提高认识,取得进步;对自身的缺点、错误认真地进行自我检查,提出纠正的方法,取得深刻教训。

        以下是我给自己制订的方案,可结合自己的实际生活做出调整。

        实事求是地制订方案

        根据「你想要什么;事实是什么;面对事实,你如何实现目标」设定目标,然后写下清晰具体的方案,让任何人都能对照方案执行。

        方案要求:

        • 有明确的目标。
        • 找到问题:找到阻碍你实现这些目标的问题,准确诊断问题,发掘问题的根源,并且不容忍问题。
        • 制订方案:规划可以解决问题的方案,并严格执行。做一切必要的事来践行这些方案,实现成果。
        • 执行方案需要严格遵守方案的自律,如果执行中出现问题,思考该步任务是否符合目标。

        头脑透明地分享想法

        公开想法:让其他人无比清晰地看到你在做什么、为什么这么做。头脑越透明,越不会自欺,其他人也会给你诚实的反馈。

        同时注意:

        • 不要固守你对事物「应该」是怎样的看法,这将使你无法了解真实的情况。
        • 在不擅长的领域请教擅长的其他人,或外包,或使用成熟的工具,或查看教程攻略。
        • 不要把不好的结果归咎于任何人,从自己身上找原因。

        批评和自我批评

        每月固定一个时间 (月底),对自身行为进行反思,并与家人、朋友分享自己的现状,征求他们的意见、批评。不用担心其他人的看法,不要担心自己的形象,而关心如何实现目标。

        行动计划

        按上列原则,制定行动计划 (不断调整):

        每日

        ',21),c=t("p",null,[t("strong",null,"早上创造美好情绪"),l(":赞美、仪式感、吃好吃的、看搞笑视频、听歌。")],-1),h=t("li",null,"唱歌:唱一首你喜欢的歌。(为减肥,我选择了外语美声歌曲,秋山雅史 - 千の風になって)",-1),u=t("li",null,"录自拍视频:说一句话(当日目标?)鼓励自己。录制内容在前一天准备好,目的是给你带来积极情绪。",-1),_={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},f=i("
      9. 人际连接:通过直播连麦与陌生人沟通 15 分钟。如:抖音 PK 语音直播。

        • 别人很重要:帮助别人,能让人更健康、更幸福。心情不好事,就去帮助其他人,心情会更好。
        • 表扬和自我表扬:赞美自己、家人,发挥标志性优势,总比弥补缺点更有效。
      10. 微习惯

        • 工作 20 分钟休息 20 秒,做 10 个深蹲。
        • 出书房或上完厕所,做 10 个俯卧撑。
        • 俯卧撑、深蹲前,在磁性板上写正字来记录,一个笔画代表一组(10 个)。
      11. 间隔学习:通过 SuperMemo 的记忆模型,复习心理认知、沟通理论、行为反思在内的笔记。

      12. 当日回顾:记录 3 件好事,总结好事发生的原因,给家人分享好事。
        这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。

      13. ",4),g=t("p",null,[t("strong",null,"定期"),l(":")],-1),x=t("strong",null,"月底反思",-1),b={href:"https://allisonseboldt.com/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://justinjackson.ca/bootstrap",target:"_blank",rel:"noopener noreferrer"},k=t("li",null,[t("strong",null,"积极自我介绍"),l(":每隔三个月,讲述一个「最佳的我」的故事,植入你的优势,进行自我肯定。")],-1),y=t("p",null,[t("strong",null,"公开记录"),l(":")],-1),v={href:"https://gpt-vip.top/",target:"_blank",rel:"noopener noreferrer"},q={href:"https://gpt-vip.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},N=t("li",null,[t("p",null,"微习惯视频:监督运动习惯。拍摄视频时,使用关键句「切掉/保留」,配合 Quickcut 快速剪辑视频。")],-1),V=t("p",null,"下一步,寻找更多的党组理论根据和执行书籍资料,相信一个成熟的组织不是无故崛起,更不会无故持续这么些年。",-1);function w(B,E){const e=o("ExternalLinkIcon");return s(),a("div",null,[d,t("ul",null,[t("li",null,[c,t("ul",null,[h,u,t("li",null,[l("参考"),t("a",_,[l("积极心理学"),n(e)]),l(",收集积极情绪材料放在醒目的地方:家人的照片、取得的成绩、美好的回忆、憧憬的未来、向往的地方、喜欢的艺术 (音乐、名画、诗句)。")])])]),f]),g,t("ul",null,[t("li",null,[x,l(":检查日记和成果,对当月进行复盘,并将其同步给家人,征求意见、批评并记录。 "),t("ul",null,[t("li",null,[l("复盘笔记参照 "),t("a",b,[l("Allison Seboldt"),n(e)]),l(",作者每个月都会进行「回顾」,分享他的收入并反思上个月的成就。")]),t("li",null,[l("读 "),t("a",m,[l("JustinJ ackson"),n(e)]),l(" – 作者在 2018 年初创办  Transistor  以来,一直在分享他的项目。他整理了在此过程中学到的许多经验教训。")])])]),k]),y,t("ul",null,[t("li",null,[t("p",null,[t("a",v,[l("学习笔记"),n(e)]),l(":将对工具、工作方式和生活的思考记录发布在公开页面,欢迎大家的点评。")])]),t("li",null,[t("p",null,[l("工作视频:"),t("a",q,[l("自我监控视频"),n(e)]),l(",记录私密工作状态,方便当日回顾。")])]),N]),V])}const j=r(p,[["render",w],["__file","2021-05-31-principles_criticism_and_self-criticism.html.vue"]]);export{j as default}; diff --git a/assets/2021-10-23-nas_with_rsshub_and_huginn.html-137e95eb.js b/assets/2021-10-23-nas_with_rsshub_and_huginn.html-19412ee5.js similarity index 98% rename from assets/2021-10-23-nas_with_rsshub_and_huginn.html-137e95eb.js rename to assets/2021-10-23-nas_with_rsshub_and_huginn.html-19412ee5.js index b1c1a718..da311353 100644 --- a/assets/2021-10-23-nas_with_rsshub_and_huginn.html-137e95eb.js +++ b/assets/2021-10-23-nas_with_rsshub_and_huginn.html-19412ee5.js @@ -1,4 +1,4 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o as l,c as i,a as n,b as e,d as t,e as a}from"./app-98132e77.js";const r={},c=a('

        作为一个重度 RSS 用户,我获取的 90% 的新闻和信息都来自于 RSS 源。我使用 RSSHub 来生成主流媒体的 RSS,使用 Huginn 来定制个性化的 RSS,同时使用 TinyTinyRSS 来过滤并阅读 RSS。这些服务帮助我将阅读时间从原来的 3 个小时减少到 1 个小时

        这些服务最初托管在一台配置较低的 1 核 1G 服务器上。然而,由于配置过低,服务器频繁重启,维护成本不断上升。后来,我尝试了一些配置较高的国外服务器,例如 2 核 4G 低端服务器,但遇到了严重的超售和性能不稳定的问题。总的来说,购买国外的低端服务器(特别是俄罗斯服务器)就是把钱扔进水里。

        因此,相较于升级高配服务器或者使用不靠谱的国外 VPS,NAS 成为了一个高性价比的选择。当然,这也面临着许多问题,我们需要一步步地去解决。

        事前准备

        • NAS
        • 域名 (子域名既可)
        • 带动态 DNS 的路由器 (推荐 openwrt 软路由)

        Docker 镜像安装

        1. NAS 管理后台 > 套件中心 > 搜索并安装「Docker」,随后在 Docker 容器中安装所需服务。

        2. 在 Docker 注册表中搜索对应的镜像,选中有最多星的项目,然后点击下载。

        3. 镜像下载完成后,进入「映像」,选中刚下载好的镜像,点击启动。

        4. 在高级设置中的端口设置,将本地端口从自动改为一个固定的端口,这样以后就可以方便地进行端口映射,避免 NAS 重启后本地端口发生变化。

        域名绑定

        ',8),u=n("li",null,[n("p",null,[n("strong",null,"关闭光猫路由"),e(":通过电话联系宽带运营商,要求关闭光猫的路由功能。对于那些默认不提供公网 IP 的运营商,也可以在这个环节让运营商给你分配一个公网 IP。如果碰到死板的客服,找你要开通理由,不要正面回答。")])],-1),d=n("li",null,[n("p",null,"家用宽带通常使用动态 IP,且无法提供对外的 80 接口。可以使用动态 DNS 插件来实现域名与家庭宽带 IP 的实时绑定,以达到固定链接打开 NAS 服务的效果。")],-1),S=n("p",null,[n("strong",null,"动态 DNS(DDNS) 设置"),e(",以下以 OpenWrt+Cloudflare 为例。")],-1),h={href:"https://p3terx.com/archives/openwrt-cloudflare-ddns.html",target:"_blank",rel:"noopener noreferrer"},g=n("code",null,"ddns-scripts_cloudflare.com-v4",-1),_={href:"https://dash.cloudflare.com/profile/api-tokens",target:"_blank",rel:"noopener noreferrer"},f={href:"https://ram.console.aliyun.com/users",target:"_blank",rel:"noopener noreferrer"},m=n("figure",null,[n("img",{src:"https://img.gpt-vip.top/2022-05-05-14-41-31.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),n("figcaption")],-1),k=a(`

        如果你使用的是内网宽带,无法提供公网 IP,可以使用花生壳等内网穿透工具来达到类似的效果。

        RSS 转码

        由于国内运营商禁用了家庭宽带的 80 和 443 端口,使得无法隐藏 NAS 服务端口,只能采用 home.xxx.com:34567 这样的链接。同时,绝大多数主流 RSS 阅读器都无法支持带有端口号的 RSS 源配置,即便通过 DNS 设置域名隐式跳转,端口链接依然会被识别。这一问题使得部署在 NAS 上的 RSS 源无法直接被读取。例如,在使用 Tiny Tiny RSS 订阅 NAS 的 RSS 源时,常会出现报错,无法准确读取带有端口或 HTTPS 的 RSS 源。

        为了顺利读取 NAS 的 RSS 源内容,我使用 PHP 制作了一个转录链接 https://rss.aishort.top/?type=yyy。该 PHP 文件整合了所有 RSS 源,并通过链接参数进行区分。通过 PHP 将 NAS 上的 Huginn 和 RSSHub 的 RSS 内容聚合到服务器,PHP 根据链接参数获取并输出对应的 XML,从而实现与各类阅读器的兼容。而且 PHP 具有私密性,不会泄漏 NAS 域名和端口;输出链接可替换,方便后续更新维护。

        虽然需要在另一台服务器上部署 PHP 转录,但与购买用于抓取 RSS 所需的高配服务器相比,这一方案的性价比更高。如果你已有服务器,可按照我的方式直接部署。

        ## 网站目录新建 rss.php 文件,然后放入如下代码
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o as l,c as i,a as n,b as e,d as t,e as a}from"./app-91ee3df5.js";const r={},c=a('

        作为一个重度 RSS 用户,我获取的 90% 的新闻和信息都来自于 RSS 源。我使用 RSSHub 来生成主流媒体的 RSS,使用 Huginn 来定制个性化的 RSS,同时使用 TinyTinyRSS 来过滤并阅读 RSS。这些服务帮助我将阅读时间从原来的 3 个小时减少到 1 个小时

        这些服务最初托管在一台配置较低的 1 核 1G 服务器上。然而,由于配置过低,服务器频繁重启,维护成本不断上升。后来,我尝试了一些配置较高的国外服务器,例如 2 核 4G 低端服务器,但遇到了严重的超售和性能不稳定的问题。总的来说,购买国外的低端服务器(特别是俄罗斯服务器)就是把钱扔进水里。

        因此,相较于升级高配服务器或者使用不靠谱的国外 VPS,NAS 成为了一个高性价比的选择。当然,这也面临着许多问题,我们需要一步步地去解决。

        事前准备

        • NAS
        • 域名 (子域名既可)
        • 带动态 DNS 的路由器 (推荐 openwrt 软路由)

        Docker 镜像安装

        1. NAS 管理后台 > 套件中心 > 搜索并安装「Docker」,随后在 Docker 容器中安装所需服务。

        2. 在 Docker 注册表中搜索对应的镜像,选中有最多星的项目,然后点击下载。

        3. 镜像下载完成后,进入「映像」,选中刚下载好的镜像,点击启动。

        4. 在高级设置中的端口设置,将本地端口从自动改为一个固定的端口,这样以后就可以方便地进行端口映射,避免 NAS 重启后本地端口发生变化。

        域名绑定

        ',8),u=n("li",null,[n("p",null,[n("strong",null,"关闭光猫路由"),e(":通过电话联系宽带运营商,要求关闭光猫的路由功能。对于那些默认不提供公网 IP 的运营商,也可以在这个环节让运营商给你分配一个公网 IP。如果碰到死板的客服,找你要开通理由,不要正面回答。")])],-1),d=n("li",null,[n("p",null,"家用宽带通常使用动态 IP,且无法提供对外的 80 接口。可以使用动态 DNS 插件来实现域名与家庭宽带 IP 的实时绑定,以达到固定链接打开 NAS 服务的效果。")],-1),S=n("p",null,[n("strong",null,"动态 DNS(DDNS) 设置"),e(",以下以 OpenWrt+Cloudflare 为例。")],-1),h={href:"https://p3terx.com/archives/openwrt-cloudflare-ddns.html",target:"_blank",rel:"noopener noreferrer"},g=n("code",null,"ddns-scripts_cloudflare.com-v4",-1),_={href:"https://dash.cloudflare.com/profile/api-tokens",target:"_blank",rel:"noopener noreferrer"},f={href:"https://ram.console.aliyun.com/users",target:"_blank",rel:"noopener noreferrer"},m=n("figure",null,[n("img",{src:"https://img.gpt-vip.top/2022-05-05-14-41-31.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),n("figcaption")],-1),k=a(`

        如果你使用的是内网宽带,无法提供公网 IP,可以使用花生壳等内网穿透工具来达到类似的效果。

        RSS 转码

        由于国内运营商禁用了家庭宽带的 80 和 443 端口,使得无法隐藏 NAS 服务端口,只能采用 home.xxx.com:34567 这样的链接。同时,绝大多数主流 RSS 阅读器都无法支持带有端口号的 RSS 源配置,即便通过 DNS 设置域名隐式跳转,端口链接依然会被识别。这一问题使得部署在 NAS 上的 RSS 源无法直接被读取。例如,在使用 Tiny Tiny RSS 订阅 NAS 的 RSS 源时,常会出现报错,无法准确读取带有端口或 HTTPS 的 RSS 源。

        为了顺利读取 NAS 的 RSS 源内容,我使用 PHP 制作了一个转录链接 https://rss.aishort.top/?type=yyy。该 PHP 文件整合了所有 RSS 源,并通过链接参数进行区分。通过 PHP 将 NAS 上的 Huginn 和 RSSHub 的 RSS 内容聚合到服务器,PHP 根据链接参数获取并输出对应的 XML,从而实现与各类阅读器的兼容。而且 PHP 具有私密性,不会泄漏 NAS 域名和端口;输出链接可替换,方便后续更新维护。

        虽然需要在另一台服务器上部署 PHP 转录,但与购买用于抓取 RSS 所需的高配服务器相比,这一方案的性价比更高。如果你已有服务器,可按照我的方式直接部署。

        ## 网站目录新建 rss.php 文件,然后放入如下代码
         ## yyy 代表链接参数,方便区分不同 rss 源,qqq 代表内部 rss 源路径
         ## 注意:如果链接参数 yyy 参数中有中文,可用 UrlEncode 编码,避免 rss 阅读器报错。
         <?php
        diff --git a/assets/2022-01-23-wechat_lucky_money_cover.html-d0ec6f25.js b/assets/2022-01-23-wechat_lucky_money_cover.html-a23b271c.js
        similarity index 97%
        rename from assets/2022-01-23-wechat_lucky_money_cover.html-d0ec6f25.js
        rename to assets/2022-01-23-wechat_lucky_money_cover.html-a23b271c.js
        index e6d740e6..4d3e2c8c 100644
        --- a/assets/2022-01-23-wechat_lucky_money_cover.html-d0ec6f25.js
        +++ b/assets/2022-01-23-wechat_lucky_money_cover.html-a23b271c.js
        @@ -1 +1 @@
        -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as r,c,a as e,b as t,d as n,e as s}from"./app-98132e77.js";const d={},h=e("p",null,"上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。",-1),p=e("p",null,"春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。",-1),l=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-05-16-09-18.png?imageMogr2/thumbnail/240x",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),g=e("p",null,"红包封面的设计并不复杂,新手也能轻松设计,但注册前提是要有至少 100 粉丝的视频号或公众号。",-1),_=e("p",null,"接下来,我会介绍微信红包注册和定制流程。",-1),m=e("h2",{id:"封面平台注册",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#封面平台注册","aria-hidden":"true"},"#"),t(" 封面平台注册")],-1),f={href:"https://cover.weixin.qq.com/",target:"_blank",rel:"noopener noreferrer"},u=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-05-16-09-39.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),x=e("p",null,"个人认证环节需要有 100 粉丝以上的视频号或公众号。",-1),b=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-05-16-09-52.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),v=e("p",null,"如果没有红包封面额度,可以自行购买。封面费用为 1 元/个,购买 n 个,则 n 个用户可以使用此款红包封面,有效期为半年。微信用户领取后,可在 3 个月内无限次使用该封面。",-1),k=e("h2",{id:"红包封面设计",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#红包封面设计","aria-hidden":"true"},"#"),t(" 红包封面设计")],-1),y={href:"https://cover.weixin.qq.com/cgi-bin/mmcover-bin/readtemplate?t=page/index#/doc?page=design&index=-1",target:"_blank",rel:"noopener noreferrer"},w=s('

        整个流程非常简单,即使不懂设计模板也能轻松上手。零基础用户可以使用小画家,有图层概念的用户可以使用 Figma。无论使用什么工具,只要上传喜欢的图片,就可以完成红包设计。

        示例基础图片 (推荐手写字体:杨任东竹石体)
        示例基础图片 (推荐手写字体:杨任东竹石体)

        常见问题

        封面名称

        红包封面会展示公众号名称和头像,名称一年可修改两次,头像一个月可申请修改 5 次。我提交的封面名称与公众号无关,平台并未拒绝。

        红包审核

        红包审核需要 3 个工作日。如果审核期间接近放假,建议同时提交三个红包封面,以免到了春节,红包尚未审核通过。

        红包图片

        微信红包封面的肖像需要授权,不过我提交的全家福红包通过了。尽量不要使用网络上的图片作为红包封面,容易因版权问题而被驳回。

        ',10);function z(M,q){const a=o("ExternalLinkIcon");return r(),c("div",null,[h,p,l,g,_,m,e("p",null,[t("首次使用"),e("a",f,[t("微信红包封面开放平台"),n(a)]),t(",需要注册并实名认证。如果使用个人身份认证,注册中无付费环节。")]),u,x,b,v,k,e("p",null,[t("完成注册环节后,即可定制红包封面。微信提供了 PSD 和 Sketch 的红包封面模板,红包设计可参考"),e("a",y,[t("微信红包封面官方文档"),n(a)]),t("。")]),w])}const B=i(d,[["render",z],["__file","2022-01-23-wechat_lucky_money_cover.html.vue"]]);export{B as default}; +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as r,c,a as e,b as t,d as n,e as s}from"./app-91ee3df5.js";const d={},h=e("p",null,"上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。",-1),p=e("p",null,"春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。",-1),l=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-05-16-09-18.png?imageMogr2/thumbnail/240x",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),g=e("p",null,"红包封面的设计并不复杂,新手也能轻松设计,但注册前提是要有至少 100 粉丝的视频号或公众号。",-1),_=e("p",null,"接下来,我会介绍微信红包注册和定制流程。",-1),m=e("h2",{id:"封面平台注册",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#封面平台注册","aria-hidden":"true"},"#"),t(" 封面平台注册")],-1),f={href:"https://cover.weixin.qq.com/",target:"_blank",rel:"noopener noreferrer"},u=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-05-16-09-39.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),x=e("p",null,"个人认证环节需要有 100 粉丝以上的视频号或公众号。",-1),b=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-05-16-09-52.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),v=e("p",null,"如果没有红包封面额度,可以自行购买。封面费用为 1 元/个,购买 n 个,则 n 个用户可以使用此款红包封面,有效期为半年。微信用户领取后,可在 3 个月内无限次使用该封面。",-1),k=e("h2",{id:"红包封面设计",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#红包封面设计","aria-hidden":"true"},"#"),t(" 红包封面设计")],-1),y={href:"https://cover.weixin.qq.com/cgi-bin/mmcover-bin/readtemplate?t=page/index#/doc?page=design&index=-1",target:"_blank",rel:"noopener noreferrer"},w=s('

        整个流程非常简单,即使不懂设计模板也能轻松上手。零基础用户可以使用小画家,有图层概念的用户可以使用 Figma。无论使用什么工具,只要上传喜欢的图片,就可以完成红包设计。

        示例基础图片 (推荐手写字体:杨任东竹石体)
        示例基础图片 (推荐手写字体:杨任东竹石体)

        常见问题

        封面名称

        红包封面会展示公众号名称和头像,名称一年可修改两次,头像一个月可申请修改 5 次。我提交的封面名称与公众号无关,平台并未拒绝。

        红包审核

        红包审核需要 3 个工作日。如果审核期间接近放假,建议同时提交三个红包封面,以免到了春节,红包尚未审核通过。

        红包图片

        微信红包封面的肖像需要授权,不过我提交的全家福红包通过了。尽量不要使用网络上的图片作为红包封面,容易因版权问题而被驳回。

        ',10);function z(M,q){const a=o("ExternalLinkIcon");return r(),c("div",null,[h,p,l,g,_,m,e("p",null,[t("首次使用"),e("a",f,[t("微信红包封面开放平台"),n(a)]),t(",需要注册并实名认证。如果使用个人身份认证,注册中无付费环节。")]),u,x,b,v,k,e("p",null,[t("完成注册环节后,即可定制红包封面。微信提供了 PSD 和 Sketch 的红包封面模板,红包设计可参考"),e("a",y,[t("微信红包封面官方文档"),n(a)]),t("。")]),w])}const B=i(d,[["render",z],["__file","2022-01-23-wechat_lucky_money_cover.html.vue"]]);export{B as default}; diff --git a/assets/2022-02-19-microsoft_store_fixed.html-1e9a9ea6.js b/assets/2022-02-19-microsoft_store_fixed.html-e75f83d9.js similarity index 95% rename from assets/2022-02-19-microsoft_store_fixed.html-1e9a9ea6.js rename to assets/2022-02-19-microsoft_store_fixed.html-e75f83d9.js index 2345787d..d40337d1 100644 --- a/assets/2022-02-19-microsoft_store_fixed.html-1e9a9ea6.js +++ b/assets/2022-02-19-microsoft_store_fixed.html-e75f83d9.js @@ -1 +1 @@ -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as n,c as r,a as t,b as i,d as p,e as g}from"./app-98132e77.js";const s={},c=g('

        Microsoft store 页面无法打开,提示需要联网或刷新。多数教程将原因归咎于系统更新或 DNS 设置,但实际上是你的 IE 设置被更改了

        特别是国内的网银用户,每次登录建行,U 盾都会修改 Internet 选项,从而导致 TLS 版本过低无法连接应用商店。

        解决方法

        1. 选择「开始菜单」>「搜索栏」,搜索「Internet 选项」。

        2. Internet 属性中点击「高级」。

        3. 勾选「使用 TLS 1.2」和「使用 TLS 1.3」。

        网银用户会重复出现该问题,重新执行上方步骤勾选 TLS 即可。

        其他尝试

        @果子:取消代理服务器

        ① 除了在[internet 选项]窗口中-[高级]-勾选[TLS1.2 、TSL1.3],
        ② 要再加一步:在[internet 选项]窗口中-[连接]-[局域网设置]-取消勾选[代理服务器]相关选项。就能打开微软商店了!不过以后要挂梯的时候,好像得把[代理]勾选回来。

        @一头愚鹅:不要开代理

        ',10),l={href:"https://answers.microsoft.com/zh-hans/windows/forum/all/microsoft/43acd62e-a11e-449c-9fa4-50931ad38565",target:"_blank",rel:"noopener noreferrer"},f=t("h2",{id:"解决流程-gif",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#解决流程-gif","aria-hidden":"true"},"#"),i(" 解决流程 GIF")],-1),d=t("figure",null,[t("img",{src:"https://img.gpt-vip.top/IE_SSL_Setting_win11.webp",alt:"win11-ie 高级设置.gif",tabindex:"0",loading:"lazy"}),t("figcaption",null,"win11-ie 高级设置.gif")],-1);function h(m,_){const e=o("ExternalLinkIcon");return n(),r("div",null,[c,t("p",null,[i("如果你依然无法访问,则尝试重置网络连接、DNS、缓存、应用商店设置,操作参考 "),t("a",l,[i("Microsoft Store 打不开,代码:0x80131500"),p(e)]),i("。")]),f,d])}const b=a(s,[["render",h],["__file","2022-02-19-microsoft_store_fixed.html.vue"]]);export{b as default}; +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as n,c as r,a as t,b as i,d as p,e as g}from"./app-91ee3df5.js";const s={},c=g('

        Microsoft store 页面无法打开,提示需要联网或刷新。多数教程将原因归咎于系统更新或 DNS 设置,但实际上是你的 IE 设置被更改了

        特别是国内的网银用户,每次登录建行,U 盾都会修改 Internet 选项,从而导致 TLS 版本过低无法连接应用商店。

        解决方法

        1. 选择「开始菜单」>「搜索栏」,搜索「Internet 选项」。

        2. Internet 属性中点击「高级」。

        3. 勾选「使用 TLS 1.2」和「使用 TLS 1.3」。

        网银用户会重复出现该问题,重新执行上方步骤勾选 TLS 即可。

        其他尝试

        @果子:取消代理服务器

        ① 除了在[internet 选项]窗口中-[高级]-勾选[TLS1.2 、TSL1.3],
        ② 要再加一步:在[internet 选项]窗口中-[连接]-[局域网设置]-取消勾选[代理服务器]相关选项。就能打开微软商店了!不过以后要挂梯的时候,好像得把[代理]勾选回来。

        @一头愚鹅:不要开代理

        ',10),l={href:"https://answers.microsoft.com/zh-hans/windows/forum/all/microsoft/43acd62e-a11e-449c-9fa4-50931ad38565",target:"_blank",rel:"noopener noreferrer"},f=t("h2",{id:"解决流程-gif",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#解决流程-gif","aria-hidden":"true"},"#"),i(" 解决流程 GIF")],-1),d=t("figure",null,[t("img",{src:"https://img.gpt-vip.top/IE_SSL_Setting_win11.webp",alt:"win11-ie 高级设置.gif",tabindex:"0",loading:"lazy"}),t("figcaption",null,"win11-ie 高级设置.gif")],-1);function h(m,_){const e=o("ExternalLinkIcon");return n(),r("div",null,[c,t("p",null,[i("如果你依然无法访问,则尝试重置网络连接、DNS、缓存、应用商店设置,操作参考 "),t("a",l,[i("Microsoft Store 打不开,代码:0x80131500"),p(e)]),i("。")]),f,d])}const b=a(s,[["render",h],["__file","2022-02-19-microsoft_store_fixed.html.vue"]]);export{b as default}; diff --git a/assets/2022-03-17-rss_persistent_link_collection.html-e84a2cfd.js b/assets/2022-03-17-rss_persistent_link_collection.html-c9140bfa.js similarity index 97% rename from assets/2022-03-17-rss_persistent_link_collection.html-e84a2cfd.js rename to assets/2022-03-17-rss_persistent_link_collection.html-c9140bfa.js index 1dcbed49..cf405419 100644 --- a/assets/2022-03-17-rss_persistent_link_collection.html-e84a2cfd.js +++ b/assets/2022-03-17-rss_persistent_link_collection.html-c9140bfa.js @@ -1 +1 @@ -import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as l,c as p,a as t,b as e,d as n,e as i}from"./app-98132e77.js";const a={},h=t("p",null,"越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。",-1),c=t("p",null,"如果有兴趣自己制作 RSS,可查看文章底部教程。",-1),_=t("h2",{id:"每日热点",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#每日热点","aria-hidden":"true"},"#"),e(" 每日热点")],-1),d=t("p",null,"整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。",-1),u=t("li",null,[t("p",null,[t("strong",null,"百度实时热点"),e(":"),t("code",null,"https://rss.aishort.top/?type=baidu"),t("br"),e(" 实时收录百度热搜内容,并显示热搜指数和简介。")]),t("figure",null,[t("img",{src:"https://img.gpt-vip.top/2022-05-05-17-21-49.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),t("figcaption")])],-1),g=t("strong",null,"国内应急新闻",-1),S=t("code",null,"https://rss.aishort.top/?type=cneb",-1),f=t("br",null,null,-1),b={href:"http://www.cneb.gov.cn/guoneinews/",target:"_blank",rel:"noopener noreferrer"},m=t("figure",null,[t("img",{src:"https://img.gpt-vip.top/2022-05-05-17-22-08.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),t("figcaption")],-1),R=t("li",null,[t("p",null,[t("strong",null,"瓦斯阅读"),e(":"),t("code",null,"https://rss.aishort.top/?type=wasi"),t("br"),e(" 通过瓦斯阅读,获取当天最热门的微信文章。微信图片不支持第三方显示,因此 RSS 阅读器内只显示文字内容,点击文章链接后,可阅读完整公众号文章。")]),t("figure",null,[t("img",{src:"https://img.gpt-vip.top/2022-05-05-17-22-32.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),t("figcaption")])],-1),k=i('

        互联网资讯

        整合互联网资讯媒体,偏重于前端科技、电子硬件、手机应用。

        • 36krhttps://rss.aishort.top/?type=36kr

        • 虎嗅网https://rss.aishort.top/?type=huxiu

        • 艾瑞网https://rss.aishort.top/?type=iresearch

        • 爱范儿|AppSolutionhttps://rss.aishort.top/?type=AppSolution

        奇思妙想

        每天吸收些稀奇古怪的知识,期待引发后续的灵机一动。

        • 果壳网https://rss.aishort.top/?type=guokr

        • 知乎想法热榜https://rss.aishort.top/?type=zhihu

        教程:自制 RSS

        以上提供的 RSS 链接都是使用 RSSHub 和 Huginn 制作的。如果你也想制作 RSS,可以参考以下教程:

        ',8),x={href:"https://gpt-vip.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://gpt-vip.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://gpt-vip.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},w={href:"https://gpt-vip.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},H={href:"https://gpt-vip.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},E={href:"https://gpt-vip.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"};function N(z,V){const o=r("ExternalLinkIcon");return l(),p("div",null,[h,c,_,d,t("ul",null,[u,t("li",null,[t("p",null,[g,e(":"),S,f,e(" 采集自"),t("a",b,[e("国家应急广播"),n(o)]),e(",配合 rss 阅读器过滤,及时获取当地应急通知。")]),m]),R]),k,t("ul",null,[t("li",null,[t("p",null,[t("a",x,[e("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),n(o)])])]),t("li",null,[t("p",null,[t("a",v,[e("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),n(o)])])]),t("li",null,[t("p",null,[t("a",y,[e("RSS 速成篇:RSSHub 捡现成的轮子"),n(o)])])]),t("li",null,[t("p",null,[t("a",w,[e("RSS 速成篇 2:RSSHub 自部署"),n(o)])])]),t("li",null,[t("p",null,[t("a",H,[e("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),n(o)])])]),t("li",null,[t("p",null,[t("a",E,[e("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),n(o)])])])])])}const M=s(a,[["render",N],["__file","2022-03-17-rss_persistent_link_collection.html.vue"]]);export{M as default}; +import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as l,c as p,a as t,b as e,d as n,e as i}from"./app-91ee3df5.js";const a={},h=t("p",null,"越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。",-1),c=t("p",null,"如果有兴趣自己制作 RSS,可查看文章底部教程。",-1),_=t("h2",{id:"每日热点",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#每日热点","aria-hidden":"true"},"#"),e(" 每日热点")],-1),d=t("p",null,"整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。",-1),u=t("li",null,[t("p",null,[t("strong",null,"百度实时热点"),e(":"),t("code",null,"https://rss.aishort.top/?type=baidu"),t("br"),e(" 实时收录百度热搜内容,并显示热搜指数和简介。")]),t("figure",null,[t("img",{src:"https://img.gpt-vip.top/2022-05-05-17-21-49.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),t("figcaption")])],-1),g=t("strong",null,"国内应急新闻",-1),S=t("code",null,"https://rss.aishort.top/?type=cneb",-1),f=t("br",null,null,-1),b={href:"http://www.cneb.gov.cn/guoneinews/",target:"_blank",rel:"noopener noreferrer"},m=t("figure",null,[t("img",{src:"https://img.gpt-vip.top/2022-05-05-17-22-08.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),t("figcaption")],-1),R=t("li",null,[t("p",null,[t("strong",null,"瓦斯阅读"),e(":"),t("code",null,"https://rss.aishort.top/?type=wasi"),t("br"),e(" 通过瓦斯阅读,获取当天最热门的微信文章。微信图片不支持第三方显示,因此 RSS 阅读器内只显示文字内容,点击文章链接后,可阅读完整公众号文章。")]),t("figure",null,[t("img",{src:"https://img.gpt-vip.top/2022-05-05-17-22-32.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),t("figcaption")])],-1),k=i('

        互联网资讯

        整合互联网资讯媒体,偏重于前端科技、电子硬件、手机应用。

        • 36krhttps://rss.aishort.top/?type=36kr

        • 虎嗅网https://rss.aishort.top/?type=huxiu

        • 艾瑞网https://rss.aishort.top/?type=iresearch

        • 爱范儿|AppSolutionhttps://rss.aishort.top/?type=AppSolution

        奇思妙想

        每天吸收些稀奇古怪的知识,期待引发后续的灵机一动。

        • 果壳网https://rss.aishort.top/?type=guokr

        • 知乎想法热榜https://rss.aishort.top/?type=zhihu

        教程:自制 RSS

        以上提供的 RSS 链接都是使用 RSSHub 和 Huginn 制作的。如果你也想制作 RSS,可以参考以下教程:

        ',8),x={href:"https://gpt-vip.top/posts/2017-04-22-rss_feed43_feedex.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://gpt-vip.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},y={href:"https://gpt-vip.top/posts/2019-04-01-rsshub_noob.html",target:"_blank",rel:"noopener noreferrer"},w={href:"https://gpt-vip.top/posts/2020-03-25-rsshub_on_vps.html",target:"_blank",rel:"noopener noreferrer"},H={href:"https://gpt-vip.top/posts/2021-10-23-nas_with_rsshub_and_huginn.html",target:"_blank",rel:"noopener noreferrer"},E={href:"https://gpt-vip.top/posts/2022-03-17-rss_persistent_link_collection.html",target:"_blank",rel:"noopener noreferrer"};function N(z,V){const o=r("ExternalLinkIcon");return l(),p("div",null,[h,c,_,d,t("ul",null,[u,t("li",null,[t("p",null,[g,e(":"),S,f,e(" 采集自"),t("a",b,[e("国家应急广播"),n(o)]),e(",配合 rss 阅读器过滤,及时获取当地应急通知。")]),m]),R]),k,t("ul",null,[t("li",null,[t("p",null,[t("a",x,[e("RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源"),n(o)])])]),t("li",null,[t("p",null,[t("a",v,[e("RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)"),n(o)])])]),t("li",null,[t("p",null,[t("a",y,[e("RSS 速成篇:RSSHub 捡现成的轮子"),n(o)])])]),t("li",null,[t("p",null,[t("a",w,[e("RSS 速成篇 2:RSSHub 自部署"),n(o)])])]),t("li",null,[t("p",null,[t("a",H,[e("RSS 完结篇:节省千元服务费,RSSHub、Huginn 转移 NAS"),n(o)])])]),t("li",null,[t("p",null,[t("a",E,[e("RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效"),n(o)])])])])])}const M=s(a,[["render",N],["__file","2022-03-17-rss_persistent_link_collection.html.vue"]]);export{M as default}; diff --git a/assets/2022-03-21-winget_the_strongest_software_manager_for_windows.html-3b89a013.js b/assets/2022-03-21-winget_the_strongest_software_manager_for_windows.html-dad3668b.js similarity index 98% rename from assets/2022-03-21-winget_the_strongest_software_manager_for_windows.html-3b89a013.js rename to assets/2022-03-21-winget_the_strongest_software_manager_for_windows.html-dad3668b.js index 92f45e6b..587dccec 100644 --- a/assets/2022-03-21-winget_the_strongest_software_manager_for_windows.html-3b89a013.js +++ b/assets/2022-03-21-winget_the_strongest_software_manager_for_windows.html-dad3668b.js @@ -1 +1 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as s,c as g,a as e,b as t,d as a,e as n}from"./app-98132e77.js";const l={},p=e("p",null,"矿难、WIN11、DDR5、40 代显卡纷至沓来,更换电脑的高峰期马上来临。可惜我的生产力工具等不了,只能 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配好了,软件又成了个大问题。常用软件超过 60 个,之前每个软件,都去对应官网寻找最新版,然后单独进行设置安装,需要耗费大量的时间精力。",-1),d=e("p",null,[t("曾经一度尝试过国内的软件管理器,能批量下载软件,但依旧免不了单独安装设置。另外,让 360、金山、腾讯来管理你的软件系统,你真的放心?相较而言,Windows 原生程序管理工具 winget 和 WebGUI winstall 使用更简单,"),e("strong",null,"应用均为官方来源下载,一键批量静默安装应用,是快速部署程序的绝佳方案"),t("。")],-1),c=e("h2",{id:"原生程序管理-winget",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#原生程序管理-winget","aria-hidden":"true"},"#"),t(" 原生程序管理-winget")],-1),h={href:"https://docs.microsoft.com/zh-cn/windows/package-manager/winget/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/microsoft/winget-cli/releases",target:"_blank",rel:"noopener noreferrer"},w={href:"https://wwz.lanzouf.com/ixZL701smc4d",target:"_blank",rel:"noopener noreferrer"},m=e("code",null,".msixbundle",-1),_=n('

        安装应用安装程序后,可以通过在命令提示符 (cmd) 下键入「winget」来运行程序命令。

        winget install appName

        执行 winget install 命令,就能完成指定程序的下载、哈希验证、静默设置安装三个步骤,不需要人工干预。

        winget search appName

        当未找到或不确定 appName 时,使用 winget search 可以锁定程序名称。以「飞书」为例,飞书不支持中文锁定,搜索后发现有国内版「Feishu」和海外版「Lark」两个版本,国内版使用命令 winget install feishu

        winget upgrade --all

        • winget upgrade 列出所有支持 winget 升级的程序,然后使用 winget upgrade ID 升级指定程序。
        • winget upgrade --all 会静默升级所有支持 winget 的程序,适合更新强迫症患者。不过,该升级流程暂时没有筛选办法,无法单独剔除应用。
        • winget upgrade --all --include-unknown 升级包括未知版本在内的所有应用,一般用不到,适用于强迫症患者。

        Microsoft Store 应用

        Microsoft Store 不支持 winget 官方源,因此 winget 不能使用应用名称安装商店应用。

        winget 安装 Microsoft Store 应用前,需要 winget search 命令找到应用 id 和来源。msstore 源指 Miscrosoft Store,其使用唯一标识符作为程序包的“Id”。因此,snipaste 安装命令为 winget install 9P1WXPKB68KX -s msstore

        安装中会要求接受协议,点 Y 确认即可。

        批量部署程序-winstall

        ',17),u={href:"https://winstall.app/",target:"_blank",rel:"noopener noreferrer"},b=n('

        操作非常简单,winstall 页面选中程序,即可打包程序组或生成批量安装命令。

        winstall 的应用搜索继承了 winget 的问题,部分国产软件不支持中文搜索,比如「坚果云」只支持英文名称「Nutstore」。希望这一问题,可以随着国内用户群增多而被解决。

        winget 搜索
        winget 搜索
        winstall 搜索
        winstall 搜索

        winstall 页面选好程序后,导出自动生成的批量安装命令,并在命令提示符 (cmd) 中执行,系统将自动下载并静默配置程序。

        常见问题

        尝试更新源时失败

        ',9),x={href:"https://github.com/microsoft/winget-cli/releases",target:"_blank",rel:"noopener noreferrer"},M={href:"https://gpt-vip.top/posts/2022-02-19-microsoft_store_fixed.html#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95",target:"_blank",rel:"noopener noreferrer"},k=e("h3",{id:"其他问题",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#其他问题","aria-hidden":"true"},"#"),t(" 其他问题")],-1),v=e("ul",null,[e("li",null,"批量安装应用中,winstall 不定期出现崩溃,原因未知。"),e("li",null,"winget install 不能检测当前版本软件是否安装,容易造成重复安装应用,拖慢部署时间。"),e("li",null,"部分应用安装后容易有 bug,比如剪映有卡顿问题,手动安装后恢复正常。")],-1),z=e("h2",{id:"总结",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#总结","aria-hidden":"true"},"#"),t(" 总结")],-1),W=e("p",null,"在我的常用软件列表中有 50 个应用支持 winget 批量静默安装,剩余 10 个需手工安装,覆盖率在 80% 以上,足够满足大部分人的需求。",-1),y=e("p",null,"winget 用一个命令行能静默安装上百个软件,节省了大量装机时间。对于系统重装、批量装机、快速设置新工作环境,winget 和 winstall 是必不可少的装机神器。",-1);function N(B,E){const i=r("ExternalLinkIcon");return s(),g("div",null,[p,d,c,e("p",null,[e("a",h,[t("winget"),a(i)]),t(" 是 Windows 程序包管理器的命令行工具。在 Windows 10 和 Windows 11 计算机上,使用 winget 命令行工具来发现、安装、升级、删除和配置应用程序。早期版本的 Windows 不支持 winget,需在 "),e("a",f,[t("winget 官方"),a(i)]),t("或"),e("a",w,[t("国内搬运"),a(i)]),t(" 下载后缀为 "),m,t(" 的应用安装程序。")]),_,e("p",null,[e("a",u,[t("winstall"),a(i)]),t(" 是 winget install 的网页管理工具。借助 winstall,用户不懂代码,也能轻松使用 winget,一次性安装所有应用程序。")]),b,e("p",null,[t("国内使用 winget 容易出现问题「尝试更新源时失败」,下载 "),e("a",x,[t("winget 官方最新包"),a(i)]),t("可解决问题。")]),e("p",null,[t("另一个可能是 Internet 选项的 TLS 版本设置过低,开启 TLS 1.2 即可恢复,具体操作查看 "),e("a",M,[t("Windows 应用商店 (Microsoft store) 打不开?"),a(i)]),t("。")]),k,v,z,W,y])}const L=o(l,[["render",N],["__file","2022-03-21-winget_the_strongest_software_manager_for_windows.html.vue"]]);export{L as default}; +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as s,c as g,a as e,b as t,d as a,e as n}from"./app-91ee3df5.js";const l={},p=e("p",null,"矿难、WIN11、DDR5、40 代显卡纷至沓来,更换电脑的高峰期马上来临。可惜我的生产力工具等不了,只能 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配好了,软件又成了个大问题。常用软件超过 60 个,之前每个软件,都去对应官网寻找最新版,然后单独进行设置安装,需要耗费大量的时间精力。",-1),d=e("p",null,[t("曾经一度尝试过国内的软件管理器,能批量下载软件,但依旧免不了单独安装设置。另外,让 360、金山、腾讯来管理你的软件系统,你真的放心?相较而言,Windows 原生程序管理工具 winget 和 WebGUI winstall 使用更简单,"),e("strong",null,"应用均为官方来源下载,一键批量静默安装应用,是快速部署程序的绝佳方案"),t("。")],-1),c=e("h2",{id:"原生程序管理-winget",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#原生程序管理-winget","aria-hidden":"true"},"#"),t(" 原生程序管理-winget")],-1),h={href:"https://docs.microsoft.com/zh-cn/windows/package-manager/winget/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/microsoft/winget-cli/releases",target:"_blank",rel:"noopener noreferrer"},w={href:"https://wwz.lanzouf.com/ixZL701smc4d",target:"_blank",rel:"noopener noreferrer"},m=e("code",null,".msixbundle",-1),_=n('

        安装应用安装程序后,可以通过在命令提示符 (cmd) 下键入「winget」来运行程序命令。

        winget install appName

        执行 winget install 命令,就能完成指定程序的下载、哈希验证、静默设置安装三个步骤,不需要人工干预。

        winget search appName

        当未找到或不确定 appName 时,使用 winget search 可以锁定程序名称。以「飞书」为例,飞书不支持中文锁定,搜索后发现有国内版「Feishu」和海外版「Lark」两个版本,国内版使用命令 winget install feishu

        winget upgrade --all

        • winget upgrade 列出所有支持 winget 升级的程序,然后使用 winget upgrade ID 升级指定程序。
        • winget upgrade --all 会静默升级所有支持 winget 的程序,适合更新强迫症患者。不过,该升级流程暂时没有筛选办法,无法单独剔除应用。
        • winget upgrade --all --include-unknown 升级包括未知版本在内的所有应用,一般用不到,适用于强迫症患者。

        Microsoft Store 应用

        Microsoft Store 不支持 winget 官方源,因此 winget 不能使用应用名称安装商店应用。

        winget 安装 Microsoft Store 应用前,需要 winget search 命令找到应用 id 和来源。msstore 源指 Miscrosoft Store,其使用唯一标识符作为程序包的“Id”。因此,snipaste 安装命令为 winget install 9P1WXPKB68KX -s msstore

        安装中会要求接受协议,点 Y 确认即可。

        批量部署程序-winstall

        ',17),u={href:"https://winstall.app/",target:"_blank",rel:"noopener noreferrer"},b=n('

        操作非常简单,winstall 页面选中程序,即可打包程序组或生成批量安装命令。

        winstall 的应用搜索继承了 winget 的问题,部分国产软件不支持中文搜索,比如「坚果云」只支持英文名称「Nutstore」。希望这一问题,可以随着国内用户群增多而被解决。

        winget 搜索
        winget 搜索
        winstall 搜索
        winstall 搜索

        winstall 页面选好程序后,导出自动生成的批量安装命令,并在命令提示符 (cmd) 中执行,系统将自动下载并静默配置程序。

        常见问题

        尝试更新源时失败

        ',9),x={href:"https://github.com/microsoft/winget-cli/releases",target:"_blank",rel:"noopener noreferrer"},M={href:"https://gpt-vip.top/posts/2022-02-19-microsoft_store_fixed.html#%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95",target:"_blank",rel:"noopener noreferrer"},k=e("h3",{id:"其他问题",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#其他问题","aria-hidden":"true"},"#"),t(" 其他问题")],-1),v=e("ul",null,[e("li",null,"批量安装应用中,winstall 不定期出现崩溃,原因未知。"),e("li",null,"winget install 不能检测当前版本软件是否安装,容易造成重复安装应用,拖慢部署时间。"),e("li",null,"部分应用安装后容易有 bug,比如剪映有卡顿问题,手动安装后恢复正常。")],-1),z=e("h2",{id:"总结",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#总结","aria-hidden":"true"},"#"),t(" 总结")],-1),W=e("p",null,"在我的常用软件列表中有 50 个应用支持 winget 批量静默安装,剩余 10 个需手工安装,覆盖率在 80% 以上,足够满足大部分人的需求。",-1),y=e("p",null,"winget 用一个命令行能静默安装上百个软件,节省了大量装机时间。对于系统重装、批量装机、快速设置新工作环境,winget 和 winstall 是必不可少的装机神器。",-1);function N(B,E){const i=r("ExternalLinkIcon");return s(),g("div",null,[p,d,c,e("p",null,[e("a",h,[t("winget"),a(i)]),t(" 是 Windows 程序包管理器的命令行工具。在 Windows 10 和 Windows 11 计算机上,使用 winget 命令行工具来发现、安装、升级、删除和配置应用程序。早期版本的 Windows 不支持 winget,需在 "),e("a",f,[t("winget 官方"),a(i)]),t("或"),e("a",w,[t("国内搬运"),a(i)]),t(" 下载后缀为 "),m,t(" 的应用安装程序。")]),_,e("p",null,[e("a",u,[t("winstall"),a(i)]),t(" 是 winget install 的网页管理工具。借助 winstall,用户不懂代码,也能轻松使用 winget,一次性安装所有应用程序。")]),b,e("p",null,[t("国内使用 winget 容易出现问题「尝试更新源时失败」,下载 "),e("a",x,[t("winget 官方最新包"),a(i)]),t("可解决问题。")]),e("p",null,[t("另一个可能是 Internet 选项的 TLS 版本设置过低,开启 TLS 1.2 即可恢复,具体操作查看 "),e("a",M,[t("Windows 应用商店 (Microsoft store) 打不开?"),a(i)]),t("。")]),k,v,z,W,y])}const L=o(l,[["render",N],["__file","2022-03-21-winget_the_strongest_software_manager_for_windows.html.vue"]]);export{L as default}; diff --git a/assets/2022-04-21-uivision_rpa.html-c38d8375.js b/assets/2022-04-21-uivision_rpa.html-885ce6b0.js similarity index 98% rename from assets/2022-04-21-uivision_rpa.html-c38d8375.js rename to assets/2022-04-21-uivision_rpa.html-885ce6b0.js index 0875e272..98f9992f 100644 --- a/assets/2022-04-21-uivision_rpa.html-c38d8375.js +++ b/assets/2022-04-21-uivision_rpa.html-885ce6b0.js @@ -1 +1 @@ -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as l,c as p,a as e,b as i,d as a,e as n}from"./app-98132e77.js";const c={},s=n('

        无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。

        Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。

        但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个?

        当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90% 的人学了只是浪费时间。花 3 个月编程,也不一定能解决我们的基础功能需求。

        请把你的时间花在更重要的事情上,克服知识焦虑。学一百种热门语言,不如熟练掌握一个好的工具。

        以下内容只适合不想学 Python,不懂编程,又想使用自动化和爬虫的小白,高手可以关闭页面了。

        UI.Vision RPA 是一款开源的全平台自动化工具,无需懂编程,即可完成网页和桌面自动化操作,包括文件上传、表单填写、内容抓取、定时截图、爬虫抓取等。

        安装 UI.Vision

        UI.Vision RPA 的主体是浏览器插件,只需去应用商店即可完成安装。

        ',10),d={href:"https://chrome.google.com/webstore/detail/uivision-rpa/gcbalfbdmfieckjlnblleoemohcganoc",target:"_blank",rel:"noopener noreferrer"},h={href:"https://addons.mozilla.org/zh-CN/firefox/addon/rpa/",target:"_blank",rel:"noopener noreferrer"},g={href:"https://microsoftedge.microsoft.com/addons/detail/uivision-rpa-%E6%B5%8F%E8%A7%88%E5%99%A8%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7/goapmjinbaeomoemgdcnnhoedopjnddd",target:"_blank",rel:"noopener noreferrer"},u=n('

        零门槛入门

        UI.Vision RPA 的运行脚本叫做「宏」。界面很简单,左侧是宏的范例库和本地文件,右侧是宏的运行和反馈区。

        UI.Vision 应用界面
        UI.Vision 应用界面

        打开 UI.Vision 插件,点击右上角按钮「Record」,插件会把你的操作录制为宏脚本。

        执行时,选中左侧保存的宏,然后点击右上角的按钮「Play Macro」,即可回放指定宏。点击「Play Loop」,则可让宏循环运行。

        自动化运行 GIF
        自动化运行 GIF

        第一次使用

        以范例库中的 DemoAutofill 为例,这是网页自动填充在线表格的宏,点击右上方的「Step」按钮逐步运行宏。有进阶需求的话,把范例一个个拆解学习,了解命令的使用方式。

        • 前 1-3 步使用「store」命令,对宏进行基本设置,如运行速度、超时等待、页面最长载入时间。点击命令右侧的「info for this command」可查看当前命令的官方文档。

        • 第 4 步使用「open」命令,打开指定网址。

        • 第 5-8 步使用「click」命令,依次点击指定按钮。

          UI.Vision 点击命令
          UI.Vision 点击命令
        • 第 9 步使用「pause」命令,延时 500 毫秒。

        • 第 10 步使用「captureScreenshot」命令,对可见网页部分截图,记录运行步骤。

        • 第 11 步使用「clickAndWait」命令,单击指定按钮后等待页面加载。

        • 第 12-13 步使用「type」命令,在指定区域输出指定文字。

        • 第 14 步使用「captureScreenshot」命令,对可见网页部分截图,记录运行步骤。

          第 15 步使用「pause」命令,延时 1000 毫秒。

          第 16 步使用「clickAndWait」命令,单击指定按钮后等待页面加载。

          第 17 步使用「captureScreenshot」命令,对可见网页部分截图,记录运行步骤。

        • 第 18 步使用「echo」命令,调用浏览器通知模块,弹出指定提示。

        • 第 19 步使用「comment」命令,注释当前步骤,无实际作用。

          第 20 步使用「open」命令,打开指定网址。

        • 最后一步使用「assertTitle」命令,获取网站的标题,并检查是否与指定文本相符合,判断宏是否运行成功。

        不同变量重复运行

        ',10),f={href:"https://ui.vision/rpa/docs/selenium-ide/csvread",target:"_blank",rel:"noopener noreferrer"},m=n('
        1. 点击 UI.Vision 右下角的「CSV」>「Import CSV」,用 CSV 文件导入批量处理内容。
        2. 使用「csvReadArray」命令,Target 输入文件名「1.csv」,Value 输入分组名「link」。
        3. 使用「executeScript」命令,Target 输入计算脚本 return ${!LOOP} - 1;,Value 输入自定义变量名 num。数组序号以 0 开始而循环序号 ${!LOOP} 以 1 起始,所以数组序号为 ${!LOOP}-1
        4. 使用「open」命令,Target 输入变量参数 ${link[${num}]}${link[x]} 指 link 数组中序号为 x 的成员。
        5. 使用「pause」命令,Target 输入延时时间,单位为毫秒。
        6. 点击右上角「Play Macro」旁边的下拉按钮,然后点击「Play Loop」,有多少行文本需要处理,就循环多少次。

        常见问题

        录制脚本无法使用

        如果脚本中使用了热键,这是无法被录制的,需要你手工添加 XType 命令。

        如果脚本点击不成功,可以将对映步骤的 Click 命令改为 XClick

        浏览器外使用 RPA

        1. 地址栏输入 chrome://extensions/,找到扩展 UI.Vision RPA,点击按钮「详情」,启用「允许访问文件网址」。
        2. 右键单击指定脚本,点击「Create autorun HTML」,将自动输出两个 html 文件。
        3. 点击与脚本同名的 html 即可启动脚本。

        本地运行自动化报错

        本地运行自动化文件,报错 No tab with id

        这是自动化内存泄漏造成的报错,需要手动点击右上角的「Play Macro」按钮执行命令。
        如果你不想手动执行,可以用编辑器打开与脚本同名的 html 文件,找到 href="ui.vision.html?direct=1,在这后面加入参数 &continueInLastUsedTab=0

        总结

        UI.Vision RPA 操作简单,定制脚本宏只需录制和完善两步。

        • 录制:手动操作一次并录制宏,该环节基本能完成 80% 的功能转换。
        • 完善:补充或修改部分命令宏,多为延时、截图等不被录制的简单命令。

        除 UI.Vision RPA 外,iMacros 和 Selenium IDE 也是热门的全平台自动化工具,都依托于浏览器插件。

        这类自动化工具不用花大量时间学习,直接帮你解决问题,但并不能完全取代 Python 等编程语言。如果你依然有进阶需求,那努力去学编程吧,否则请先学会用工具。

        参考资料

        ',16),_={href:"https://www.appinn.com/ui-vision-rpa/",target:"_blank",rel:"noopener noreferrer"},b={href:"https://ui.vision/rpa/docs/selenium-ide",target:"_blank",rel:"noopener noreferrer"},V={href:"https://github.com/LoveOctocat/UI.Vision-Kantu-ZH",target:"_blank",rel:"noopener noreferrer"};function x(I,k){const o=t("ExternalLinkIcon");return l(),p("div",null,[s,e("ul",null,[e("li",null,[i("Chrome 插件:"),e("a",d,[i("https://chrome.google.com/webstore/detail/uivision-rpa/gcbalfbdmfieckjlnblleoemohcganoc"),a(o)])]),e("li",null,[i("Firefox 插件:"),e("a",h,[i("https://addons.mozilla.org/zh-CN/firefox/addon/rpa/"),a(o)])]),e("li",null,[i("Edge 插件:"),e("a",g,[i("https://microsoftedge.microsoft.com/addons/detail/uivision-rpa-浏览器自动化工具/goapmjinbaeomoemgdcnnhoedopjnddd"),a(o)])])]),u,e("p",null,[i("用不同的变量文本进行重复的网页操作,需要使用 UI.Vision 的 "),e("a",f,[i("csvRead"),a(o)]),i(" 命令。下面以「依次打开不同链接」为例。")]),m,e("ul",null,[e("li",null,[e("a",_,[i("UI.Vision RPA 浏览器自动化工具:表单填写、网页内容抓取、网页操作录制"),a(o)])]),e("li",null,[e("a",b,[i("UI.Vision 命令官方文档"),a(o)])]),e("li",null,[e("a",V,[i("白话 UI.Vision Kantu 插件"),a(o)])])])])}const U=r(c,[["render",x],["__file","2022-04-21-uivision_rpa.html.vue"]]);export{U as default}; +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as l,c as p,a as e,b as i,d as a,e as n}from"./app-91ee3df5.js";const c={},s=n('

        无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。

        Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。

        但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个?

        当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90% 的人学了只是浪费时间。花 3 个月编程,也不一定能解决我们的基础功能需求。

        请把你的时间花在更重要的事情上,克服知识焦虑。学一百种热门语言,不如熟练掌握一个好的工具。

        以下内容只适合不想学 Python,不懂编程,又想使用自动化和爬虫的小白,高手可以关闭页面了。

        UI.Vision RPA 是一款开源的全平台自动化工具,无需懂编程,即可完成网页和桌面自动化操作,包括文件上传、表单填写、内容抓取、定时截图、爬虫抓取等。

        安装 UI.Vision

        UI.Vision RPA 的主体是浏览器插件,只需去应用商店即可完成安装。

        ',10),d={href:"https://chrome.google.com/webstore/detail/uivision-rpa/gcbalfbdmfieckjlnblleoemohcganoc",target:"_blank",rel:"noopener noreferrer"},h={href:"https://addons.mozilla.org/zh-CN/firefox/addon/rpa/",target:"_blank",rel:"noopener noreferrer"},g={href:"https://microsoftedge.microsoft.com/addons/detail/uivision-rpa-%E6%B5%8F%E8%A7%88%E5%99%A8%E8%87%AA%E5%8A%A8%E5%8C%96%E5%B7%A5%E5%85%B7/goapmjinbaeomoemgdcnnhoedopjnddd",target:"_blank",rel:"noopener noreferrer"},u=n('

        零门槛入门

        UI.Vision RPA 的运行脚本叫做「宏」。界面很简单,左侧是宏的范例库和本地文件,右侧是宏的运行和反馈区。

        UI.Vision 应用界面
        UI.Vision 应用界面

        打开 UI.Vision 插件,点击右上角按钮「Record」,插件会把你的操作录制为宏脚本。

        执行时,选中左侧保存的宏,然后点击右上角的按钮「Play Macro」,即可回放指定宏。点击「Play Loop」,则可让宏循环运行。

        自动化运行 GIF
        自动化运行 GIF

        第一次使用

        以范例库中的 DemoAutofill 为例,这是网页自动填充在线表格的宏,点击右上方的「Step」按钮逐步运行宏。有进阶需求的话,把范例一个个拆解学习,了解命令的使用方式。

        • 前 1-3 步使用「store」命令,对宏进行基本设置,如运行速度、超时等待、页面最长载入时间。点击命令右侧的「info for this command」可查看当前命令的官方文档。

        • 第 4 步使用「open」命令,打开指定网址。

        • 第 5-8 步使用「click」命令,依次点击指定按钮。

          UI.Vision 点击命令
          UI.Vision 点击命令
        • 第 9 步使用「pause」命令,延时 500 毫秒。

        • 第 10 步使用「captureScreenshot」命令,对可见网页部分截图,记录运行步骤。

        • 第 11 步使用「clickAndWait」命令,单击指定按钮后等待页面加载。

        • 第 12-13 步使用「type」命令,在指定区域输出指定文字。

        • 第 14 步使用「captureScreenshot」命令,对可见网页部分截图,记录运行步骤。

          第 15 步使用「pause」命令,延时 1000 毫秒。

          第 16 步使用「clickAndWait」命令,单击指定按钮后等待页面加载。

          第 17 步使用「captureScreenshot」命令,对可见网页部分截图,记录运行步骤。

        • 第 18 步使用「echo」命令,调用浏览器通知模块,弹出指定提示。

        • 第 19 步使用「comment」命令,注释当前步骤,无实际作用。

          第 20 步使用「open」命令,打开指定网址。

        • 最后一步使用「assertTitle」命令,获取网站的标题,并检查是否与指定文本相符合,判断宏是否运行成功。

        不同变量重复运行

        ',10),f={href:"https://ui.vision/rpa/docs/selenium-ide/csvread",target:"_blank",rel:"noopener noreferrer"},m=n('
        1. 点击 UI.Vision 右下角的「CSV」>「Import CSV」,用 CSV 文件导入批量处理内容。
        2. 使用「csvReadArray」命令,Target 输入文件名「1.csv」,Value 输入分组名「link」。
        3. 使用「executeScript」命令,Target 输入计算脚本 return ${!LOOP} - 1;,Value 输入自定义变量名 num。数组序号以 0 开始而循环序号 ${!LOOP} 以 1 起始,所以数组序号为 ${!LOOP}-1
        4. 使用「open」命令,Target 输入变量参数 ${link[${num}]}${link[x]} 指 link 数组中序号为 x 的成员。
        5. 使用「pause」命令,Target 输入延时时间,单位为毫秒。
        6. 点击右上角「Play Macro」旁边的下拉按钮,然后点击「Play Loop」,有多少行文本需要处理,就循环多少次。

        常见问题

        录制脚本无法使用

        如果脚本中使用了热键,这是无法被录制的,需要你手工添加 XType 命令。

        如果脚本点击不成功,可以将对映步骤的 Click 命令改为 XClick

        浏览器外使用 RPA

        1. 地址栏输入 chrome://extensions/,找到扩展 UI.Vision RPA,点击按钮「详情」,启用「允许访问文件网址」。
        2. 右键单击指定脚本,点击「Create autorun HTML」,将自动输出两个 html 文件。
        3. 点击与脚本同名的 html 即可启动脚本。

        本地运行自动化报错

        本地运行自动化文件,报错 No tab with id

        这是自动化内存泄漏造成的报错,需要手动点击右上角的「Play Macro」按钮执行命令。
        如果你不想手动执行,可以用编辑器打开与脚本同名的 html 文件,找到 href="ui.vision.html?direct=1,在这后面加入参数 &continueInLastUsedTab=0

        总结

        UI.Vision RPA 操作简单,定制脚本宏只需录制和完善两步。

        • 录制:手动操作一次并录制宏,该环节基本能完成 80% 的功能转换。
        • 完善:补充或修改部分命令宏,多为延时、截图等不被录制的简单命令。

        除 UI.Vision RPA 外,iMacros 和 Selenium IDE 也是热门的全平台自动化工具,都依托于浏览器插件。

        这类自动化工具不用花大量时间学习,直接帮你解决问题,但并不能完全取代 Python 等编程语言。如果你依然有进阶需求,那努力去学编程吧,否则请先学会用工具。

        参考资料

        ',16),_={href:"https://www.appinn.com/ui-vision-rpa/",target:"_blank",rel:"noopener noreferrer"},b={href:"https://ui.vision/rpa/docs/selenium-ide",target:"_blank",rel:"noopener noreferrer"},V={href:"https://github.com/LoveOctocat/UI.Vision-Kantu-ZH",target:"_blank",rel:"noopener noreferrer"};function x(I,k){const o=t("ExternalLinkIcon");return l(),p("div",null,[s,e("ul",null,[e("li",null,[i("Chrome 插件:"),e("a",d,[i("https://chrome.google.com/webstore/detail/uivision-rpa/gcbalfbdmfieckjlnblleoemohcganoc"),a(o)])]),e("li",null,[i("Firefox 插件:"),e("a",h,[i("https://addons.mozilla.org/zh-CN/firefox/addon/rpa/"),a(o)])]),e("li",null,[i("Edge 插件:"),e("a",g,[i("https://microsoftedge.microsoft.com/addons/detail/uivision-rpa-浏览器自动化工具/goapmjinbaeomoemgdcnnhoedopjnddd"),a(o)])])]),u,e("p",null,[i("用不同的变量文本进行重复的网页操作,需要使用 UI.Vision 的 "),e("a",f,[i("csvRead"),a(o)]),i(" 命令。下面以「依次打开不同链接」为例。")]),m,e("ul",null,[e("li",null,[e("a",_,[i("UI.Vision RPA 浏览器自动化工具:表单填写、网页内容抓取、网页操作录制"),a(o)])]),e("li",null,[e("a",b,[i("UI.Vision 命令官方文档"),a(o)])]),e("li",null,[e("a",V,[i("白话 UI.Vision Kantu 插件"),a(o)])])])])}const U=r(c,[["render",x],["__file","2022-04-21-uivision_rpa.html.vue"]]);export{U as default}; diff --git a/assets/2022-06-07-blog_md_to_wordpress.html-5cb26d50.js b/assets/2022-06-07-blog_md_to_wordpress.html-03230112.js similarity index 99% rename from assets/2022-06-07-blog_md_to_wordpress.html-5cb26d50.js rename to assets/2022-06-07-blog_md_to_wordpress.html-03230112.js index c0914dbf..3e683b03 100644 --- a/assets/2022-06-07-blog_md_to_wordpress.html-5cb26d50.js +++ b/assets/2022-06-07-blog_md_to_wordpress.html-03230112.js @@ -1,4 +1,4 @@ -import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as d,o as s,c as a,a as e,b as o,d as i,e as t}from"./app-98132e77.js";const l={},c=e("h2",{id:"博客探索",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#博客探索","aria-hidden":"true"},"#"),o(" 博客探索")],-1),h=e("p",null,"2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​",-1),p={href:"https://jekyllrb.com/",target:"_blank",rel:"noopener noreferrer"},u=t('

        到了 2021 年,随着文章和发布渠道的增多,文章的修改和管理变得愈加困难。慢慢地,我开始习惯本地 Markdown 只做初稿排版,更新则只在外部平台上进行。​

        我的文章都是工具教程类,要随着工具的更新而修改,有时甚至要对几年前发布的文章进行更新。因此,针对少量平台更新的策略,带来了文章版本混乱,让博客偏离了知识记录的初衷。为了保证文章版本统一,我把博客从 Jekyll 迁移到 WordPress,准备以 WordPress 作为统一版。

        Jekyll 博客
        Jekyll 博客

        然而,WordPress 方案很快就被放弃了。原因除了 WordPress 糟糕的编辑体验,更重要的是,我遇到了 Notion。其界面美观,编辑方便,支持对外展示,能导出为 Markdown、HTML 文件。​

        可是,没什么平台是完美的。Notion 不支持同步本地 markdown 内容,图床不能在站外使用,国内访问速度成谜。这令 Notion 只适合个人分享,而非博客网站。我用 Notion,纯属垂涎美色。​

        2022 年,由于疫情被封控在家两个月。时间多了,我继续折腾博客,希望找到一个界面美观,能自动发布且具备本地管理功能的博客方案。

        博客方案

        最初,我幻想着修改一篇文章同步到多个平台,但找了许久也没有合适的。网上所谓的一键分发软件,实际上是通过网页操作来完成发布,并不能自动修改更新。​

        剔除掉这类不现实的想法后,新的博客方案以 Markdown 版本为主,自动同步 WordPress,最后手动同步主要分发平台。​

        最终方案如下:​

        1. 初稿:Markdown 本地编辑文章,使用七牛云自建图床。​

        2. 发布:同步本地 Markdown 文本,自动发布,保持主要平台内容为最新。​

        3. 管理:本地更新修改 Markdown 文件,docsify 页面整合文本内容,博客后台管理文章版本。​

        4. 订阅:用户能通过 RSS、邮件或微信来订阅博客更新。

        WP 发布工具

        工具说明

        ',13),g={href:"https://github.com/zhaoolee/WordPressXMLRPCTools",target:"_blank",rel:"noopener noreferrer"},_={href:"http://README.md",target:"_blank",rel:"noopener noreferrer"},b=e("p",null,"基于 WordPressXMLRPCTools,我做了三点修改:​",-1),f=t("
      14. 发布设置:修改 main.py 文件。

        • 修复无法覆盖更新文章的 bug。
        • 调整项目页的时间格式。
        • 页首添加文章编辑时间,默认为格林尼治标准时间,比北京晚 8 小时。
        • 将文章页尾部的本文永久更新地址从标题格式调整为常规字母。
      15. 草稿箱:_post 路径内新建 TEMP 文件夹,用于存放文章草稿。WordPress 推送程序会忽略 _post 子文件夹的内容,换言之,TEMP 文件夹不会发布到 WordPress 网站。

      16. ",2),m=e("code",null,".nojekyll",-1),k=e("code",null,"index.html",-1),P=e("code",null,"_sidebar.md",-1),y={href:"https://rockbenben.github.io/Blog_WP/",target:"_blank",rel:"noopener noreferrer"},w=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-26-20-12-56.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"docsify 页面效果")],-1),x=e("h3",{id:"使用流程",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#使用流程","aria-hidden":"true"},"#"),o(" 使用流程")],-1),W={href:"https://github.com/rockbenben/Blog_WP",target:"_blank",rel:"noopener noreferrer"},M=e("li",null,[o("回到你新建的 repo,删除 _post 文件夹中的所有文件,参照主目录下 "),e("code",null,"example_article.md"),o(" 的格式编辑文章。注意:md 文件名不能包含大写字母。")],-1),v={href:"https://github.com/zhaoolee/WordPressXMLRPCTools#%E7%94%A8github-actions%E5%86%99markdown%E6%96%87%E7%AB%A0%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0%E5%88%B0wordpress",target:"_blank",rel:"noopener noreferrer"},E=e("li",null,[o("修改主目录下的 "),e("code",null,"index.html"),o(" 和 "),e("code",null,"_sidebar.md"),o(" 文件,调整 docsify 网页设置。 "),e("ul",null,[e("li",null,[e("code",null,"index.html"),o(" 修改 docsify 网页标题、描述和关键词。")]),e("li",null,[e("code",null,"_sidebar.md"),o(" 修改 docsify 网页侧边栏,加入博客文章的标题和位置。")])])],-1),A=t('

        WP 发布常见问题

        文章发布不成功

        _post 文件夹添加了文档,但同步后,README.md 和 WordPress 并没有添加文章。

        检查以下两点:

        • 文章后缀必须为「.md」,不支持「.markdown」或其他后缀格式。

        • 进入 repo 页面中的 Actions,检查最近一次的 update 是否正确。根据报错代码,寻找错误原因。

        Error: git denied to github-actions[bot]

        遇到 GitHub Actions 报错:git denied to github-actions[bot]Process completed with exit code 128

        点击该 repository 的「Setting」>「Code and automation」>「Actions」>「General」,然后在 Workflow permissions 中开启「Read and write permissions」。

        Error: Process completed with exit code 1

        遇到 GitHub Actions 报错:Error: Process completed with exit code 1,可能是文章内容触发了服务器的安全规则,拒绝了文章的同步。

        如果出现该项报错,暂时关闭服务器防火墙,可解决问题。同步完成后,记得重新开启防火墙。

        无法覆盖更新原文章 ​

        修改旧文章并同步后,WordPress 站的文章没同步修改,而是新增了一篇相同的文章。

        • 检查 md 文件名有没有出现大写字母,有没有更改文件名。
        • 进入 WordPress 后台,点击「设置」>「固定链接」,选中自定义结构,并将文章链接设为 /p/%postname%

        如果修改版在检查后依然出现此问题,建议手动将新文章内容覆盖旧文章,然后删除新文章。​ 这个 bug 可以当作是强提醒。当 WordPress 新增了旧文章,你就被提醒要在其他平台修改该文章,让文章版本保持统一。

        WordPress 发布时间与实际不符 ​

        同步文章后,WordPress 显示的文章发布时间是 GitHub push 时间,而非文章真实的发布时间。​

        如果你将旧文章转移到 WordPress,文章的发布时间需在 WordPress 后台手动修改,无法在 Markdown 文件中指定 WordPress 显示的发布时间。

        有序列表编号有误

        文章中设定的编号是 3,但同步到 WordPress 后,变成了 1

        有序列表中穿插了图片、段落,编号就会重置到 1。去除图片与旧序列的空行,就能识别正确编号。

        无序列表只有一个层级

        Markdown 转 WordPRess 文章时,默认规则无法识别缩进级别。多层级列表只会显示一个层级,其他层级的列表都被提到第一层级。

        本地管理 Markdown 文章

        如果用 Windows 资源管理器管理 Markdown 文章,会存在 3 个问题:

        • 资源管理器的视觉效果非常难看。
        • Markdown 文件名称不能展示关键信息,较难定位文档。文章越多,管理越困难。
        • 无法对文章内容进行本地检索,只能通过文件名称猜测内容。
        难以管理的本地文档

        为解决这些问题,我借助飞书表格、RunAny 和 docsify 重构本地文章管理方案。

        飞书文档管理

        飞书文档功能与 Notion、Airtable 类似,可将文字、链接、图片聚合在同一页面,操作便捷。

        打开飞书多维表格,填入本地 Markdown 文章的标题、本地位置、链接、标签和封面,即可聚合本地文章的关键信息。将表格视图切换为「画册视图」,文档管理界面更达到 90% 的 Notion 视觉效果。

        飞书表格视图
        飞书画册视图

        RunAny 文档直达 ​

        在线文档中,无法像打开超链接一样直接打开本地文件。若要节省中间打开时间,可以使用 RunAny。​

        ',35),B={href:"https://hui-zz.gitee.io/runany/#/",target:"_blank",rel:"noopener noreferrer"},R=e("code",null,"Code.exe",-1),N=e("code",null,"notepad++.exe",-1),z=t(`
        ;将 Runany 主目录下的 RunAny.ini 文件内的「编辑」模块替换为下方命令
        +import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as d,o as s,c as a,a as e,b as o,d as i,e as t}from"./app-91ee3df5.js";const l={},c=e("h2",{id:"博客探索",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#博客探索","aria-hidden":"true"},"#"),o(" 博客探索")],-1),h=e("p",null,"2005 年,我开始用博客记录感想,发布在 MSN space 平台和短命的 Google Sidewiki 上。六年后,MSN space 关闭,博客被转移到 WordPress 托管,我改用 Blogger,没多久就暂停了博客。​",-1),p={href:"https://jekyllrb.com/",target:"_blank",rel:"noopener noreferrer"},u=t('

        到了 2021 年,随着文章和发布渠道的增多,文章的修改和管理变得愈加困难。慢慢地,我开始习惯本地 Markdown 只做初稿排版,更新则只在外部平台上进行。​

        我的文章都是工具教程类,要随着工具的更新而修改,有时甚至要对几年前发布的文章进行更新。因此,针对少量平台更新的策略,带来了文章版本混乱,让博客偏离了知识记录的初衷。为了保证文章版本统一,我把博客从 Jekyll 迁移到 WordPress,准备以 WordPress 作为统一版。

        Jekyll 博客
        Jekyll 博客

        然而,WordPress 方案很快就被放弃了。原因除了 WordPress 糟糕的编辑体验,更重要的是,我遇到了 Notion。其界面美观,编辑方便,支持对外展示,能导出为 Markdown、HTML 文件。​

        可是,没什么平台是完美的。Notion 不支持同步本地 markdown 内容,图床不能在站外使用,国内访问速度成谜。这令 Notion 只适合个人分享,而非博客网站。我用 Notion,纯属垂涎美色。​

        2022 年,由于疫情被封控在家两个月。时间多了,我继续折腾博客,希望找到一个界面美观,能自动发布且具备本地管理功能的博客方案。

        博客方案

        最初,我幻想着修改一篇文章同步到多个平台,但找了许久也没有合适的。网上所谓的一键分发软件,实际上是通过网页操作来完成发布,并不能自动修改更新。​

        剔除掉这类不现实的想法后,新的博客方案以 Markdown 版本为主,自动同步 WordPress,最后手动同步主要分发平台。​

        最终方案如下:​

        1. 初稿:Markdown 本地编辑文章,使用七牛云自建图床。​

        2. 发布:同步本地 Markdown 文本,自动发布,保持主要平台内容为最新。​

        3. 管理:本地更新修改 Markdown 文件,docsify 页面整合文本内容,博客后台管理文章版本。​

        4. 订阅:用户能通过 RSS、邮件或微信来订阅博客更新。

        WP 发布工具

        工具说明

        ',13),g={href:"https://github.com/zhaoolee/WordPressXMLRPCTools",target:"_blank",rel:"noopener noreferrer"},_={href:"http://README.md",target:"_blank",rel:"noopener noreferrer"},b=e("p",null,"基于 WordPressXMLRPCTools,我做了三点修改:​",-1),f=t("
      17. 发布设置:修改 main.py 文件。

        • 修复无法覆盖更新文章的 bug。
        • 调整项目页的时间格式。
        • 页首添加文章编辑时间,默认为格林尼治标准时间,比北京晚 8 小时。
        • 将文章页尾部的本文永久更新地址从标题格式调整为常规字母。
      18. 草稿箱:_post 路径内新建 TEMP 文件夹,用于存放文章草稿。WordPress 推送程序会忽略 _post 子文件夹的内容,换言之,TEMP 文件夹不会发布到 WordPress 网站。

      19. ",2),m=e("code",null,".nojekyll",-1),k=e("code",null,"index.html",-1),P=e("code",null,"_sidebar.md",-1),y={href:"https://rockbenben.github.io/Blog_WP/",target:"_blank",rel:"noopener noreferrer"},w=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-05-26-20-12-56.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"docsify 页面效果")],-1),x=e("h3",{id:"使用流程",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#使用流程","aria-hidden":"true"},"#"),o(" 使用流程")],-1),W={href:"https://github.com/rockbenben/Blog_WP",target:"_blank",rel:"noopener noreferrer"},M=e("li",null,[o("回到你新建的 repo,删除 _post 文件夹中的所有文件,参照主目录下 "),e("code",null,"example_article.md"),o(" 的格式编辑文章。注意:md 文件名不能包含大写字母。")],-1),v={href:"https://github.com/zhaoolee/WordPressXMLRPCTools#%E7%94%A8github-actions%E5%86%99markdown%E6%96%87%E7%AB%A0%E8%87%AA%E5%8A%A8%E6%9B%B4%E6%96%B0%E5%88%B0wordpress",target:"_blank",rel:"noopener noreferrer"},E=e("li",null,[o("修改主目录下的 "),e("code",null,"index.html"),o(" 和 "),e("code",null,"_sidebar.md"),o(" 文件,调整 docsify 网页设置。 "),e("ul",null,[e("li",null,[e("code",null,"index.html"),o(" 修改 docsify 网页标题、描述和关键词。")]),e("li",null,[e("code",null,"_sidebar.md"),o(" 修改 docsify 网页侧边栏,加入博客文章的标题和位置。")])])],-1),A=t('

        WP 发布常见问题

        文章发布不成功

        _post 文件夹添加了文档,但同步后,README.md 和 WordPress 并没有添加文章。

        检查以下两点:

        • 文章后缀必须为「.md」,不支持「.markdown」或其他后缀格式。

        • 进入 repo 页面中的 Actions,检查最近一次的 update 是否正确。根据报错代码,寻找错误原因。

        Error: git denied to github-actions[bot]

        遇到 GitHub Actions 报错:git denied to github-actions[bot]Process completed with exit code 128

        点击该 repository 的「Setting」>「Code and automation」>「Actions」>「General」,然后在 Workflow permissions 中开启「Read and write permissions」。

        Error: Process completed with exit code 1

        遇到 GitHub Actions 报错:Error: Process completed with exit code 1,可能是文章内容触发了服务器的安全规则,拒绝了文章的同步。

        如果出现该项报错,暂时关闭服务器防火墙,可解决问题。同步完成后,记得重新开启防火墙。

        无法覆盖更新原文章 ​

        修改旧文章并同步后,WordPress 站的文章没同步修改,而是新增了一篇相同的文章。

        • 检查 md 文件名有没有出现大写字母,有没有更改文件名。
        • 进入 WordPress 后台,点击「设置」>「固定链接」,选中自定义结构,并将文章链接设为 /p/%postname%

        如果修改版在检查后依然出现此问题,建议手动将新文章内容覆盖旧文章,然后删除新文章。​ 这个 bug 可以当作是强提醒。当 WordPress 新增了旧文章,你就被提醒要在其他平台修改该文章,让文章版本保持统一。

        WordPress 发布时间与实际不符 ​

        同步文章后,WordPress 显示的文章发布时间是 GitHub push 时间,而非文章真实的发布时间。​

        如果你将旧文章转移到 WordPress,文章的发布时间需在 WordPress 后台手动修改,无法在 Markdown 文件中指定 WordPress 显示的发布时间。

        有序列表编号有误

        文章中设定的编号是 3,但同步到 WordPress 后,变成了 1

        有序列表中穿插了图片、段落,编号就会重置到 1。去除图片与旧序列的空行,就能识别正确编号。

        无序列表只有一个层级

        Markdown 转 WordPRess 文章时,默认规则无法识别缩进级别。多层级列表只会显示一个层级,其他层级的列表都被提到第一层级。

        本地管理 Markdown 文章

        如果用 Windows 资源管理器管理 Markdown 文章,会存在 3 个问题:

        • 资源管理器的视觉效果非常难看。
        • Markdown 文件名称不能展示关键信息,较难定位文档。文章越多,管理越困难。
        • 无法对文章内容进行本地检索,只能通过文件名称猜测内容。
        难以管理的本地文档

        为解决这些问题,我借助飞书表格、RunAny 和 docsify 重构本地文章管理方案。

        飞书文档管理

        飞书文档功能与 Notion、Airtable 类似,可将文字、链接、图片聚合在同一页面,操作便捷。

        打开飞书多维表格,填入本地 Markdown 文章的标题、本地位置、链接、标签和封面,即可聚合本地文章的关键信息。将表格视图切换为「画册视图」,文档管理界面更达到 90% 的 Notion 视觉效果。

        飞书表格视图
        飞书画册视图

        RunAny 文档直达 ​

        在线文档中,无法像打开超链接一样直接打开本地文件。若要节省中间打开时间,可以使用 RunAny。​

        ',35),B={href:"https://hui-zz.gitee.io/runany/#/",target:"_blank",rel:"noopener noreferrer"},R=e("code",null,"Code.exe",-1),N=e("code",null,"notepad++.exe",-1),z=t(`
        ;将 Runany 主目录下的 RunAny.ini 文件内的「编辑」模块替换为下方命令
         -编辑(&Edit)
          --编程|cmd bat md ahk html js css json yml yaml py
          vscode|Code.exe
        diff --git a/assets/2022-08-22-learndata_blog_to_knowledge_management.html-c9ec70fe.js b/assets/2022-08-22-learndata_blog_to_knowledge_management.html-f983111f.js
        similarity index 99%
        rename from assets/2022-08-22-learndata_blog_to_knowledge_management.html-c9ec70fe.js
        rename to assets/2022-08-22-learndata_blog_to_knowledge_management.html-f983111f.js
        index 67dfc815..6f595364 100644
        --- a/assets/2022-08-22-learndata_blog_to_knowledge_management.html-c9ec70fe.js
        +++ b/assets/2022-08-22-learndata_blog_to_knowledge_management.html-f983111f.js
        @@ -1 +1 @@
        -import{_ as t}from"./流程2-453dc6f5.js";import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as l,c as p,a,b as e,d as n,e as r}from"./app-98132e77.js";const d={},h=a("p",null,[e("知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。"),a("strong",null,"笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。")],-1),g=a("p",null,"这么简单的事,我之前却一直没看透,总是把笔记与知识理解划上了等号。当要用到曾摘录的笔记时,就在各类知识管理软件里翻找,折腾一番才找到需要的笔记,有时甚至出现「自己不清楚放在哪里,也不清楚是否有」的情况。记笔记花了一个小时,下次寻找与重新消化又耗费了一个小时,原本为效率而生的知识管理软件变成了时间杀手。",-1),c=a("p",null,[e("另一方面,我们在使用知识管理软件的美观界面和强大功能的同时,也被这些软件所限制,无法完全按照自己的想法输出笔记。比如,你有了一双翅膀,"),a("strong",null,"Markdown 文本是自由的天地,而进入 Notion 则被隔成一个个小房间"),e(",你在房间里待着很舒服,可一旦想去其他房间,就必须脱离 block,不比 Markdown 可以自由飞翔。")],-1),u=a("figure",null,[a("img",{src:"https://img.gpt-vip.top/2022-08-22-18-02-07.png",alt:"",tabindex:"0",loading:"lazy"}),a("figcaption",null,"Markdown VS Notion")],-1),b={href:"https://github.com/libaxuan/LearnHubs",target:"_blank",rel:"noopener noreferrer"},f={href:"https://gpt-vip.top/",target:"_blank",rel:"noopener noreferrer"},_=r('
        笔记/博客自动化发布

        LearnHubs 的笔记和文章格式是 Markdown,输出不受到应用的局限。LearnHubs 看起来像由文章组成的博客,但它的笔记是独立的知识点,是所有知识的终点站,是整理后的知识库。通过 LearnHubs 可以搜索和整理知识,不再需要来回翻找。把博客转为知识库后,我明显感到学习和知识使用的效率得到提高,开始摆脱「工具奴隶」和「效率中毒」陷阱。

        笔记 + 文章 = LearnHubs 知识库

        为什么用网页管理笔记

        公开想法

        知识管理/笔记软件具有天然的私密性,不对外公开。但是,我的笔记大部分来自互联网,需要对谁保密?

        我非常赞同 Ray Dalio 在《原则》中提到的「头脑极度透明,公开分享想法」。

        让其他人无比清晰地看到你在做什么、为什么这么做。头脑越透明,越不会自欺,其他人也会给你诚实的反馈。

        作为国内最早一批介绍 Aria2 的人,我曾经写过一篇 Aria2 教程。文章后来被多个网站参考/抄袭,覆盖了 Aria2 某度搜索前三页。在那篇文章的评论区,有好几条留言批评文章逻辑差看不懂的,经常有热心人帮我怼回去。其实,那篇文章的初版真的很糟糕。那篇文章是在大家的反馈下,迭代了三个版本才开始变得完整和逻辑化。这些反馈也是我坚持写博客的原动力。这跟费曼学习法的道理相通,当你写文章帮助其他人时,你也在加深自己对知识的理解。建立 LearnHubs 不到一个月,但我从中获取的正反馈已超过私有笔记一年的收获。笔记公开化是有百利而无一害。

        输出分享

        ',10),m={href:"https://gpt-vip.top/family/Maintenance.html#%E9%80%9A%E9%A9%AC%E6%A1%B6",target:"_blank",rel:"noopener noreferrer"},L=r('
        生活知识页面样例

        被动消化知识

        如果只是公开分享,LearnHubs 与笔记软件并无区别,它的优点更在于网页有限的笔记数量。虽然网页可以无限地存放笔记,但打开页面只能看到少量的几十篇内容。一旦笔记堆积过多,你就像触发了整理开关似的,对笔记开始消化重构。这就是网页容量上的无限性和视觉/直觉上的有限性,存储是无限但视觉上只能有很小的一块。这里的直觉指,看一眼界面就能找到所需知识点的效果。

        比如,当我的代码区块笔记存放超过 10 篇时,每次查找代码笔记都需要 10 选 1,知识查找时间也翻倍了。我意识到节点过多,不能让自己将时间花在查询上。因此,我将代码笔记分为 Basic 和 FrontEnd 两块,总结划分的同时,编程知识也再次得到消化。

        而网页与笔记软件的区别也正在于此,LearnHubs 的主页、侧边栏和导航栏就是能展示的路径,你必须不断对笔记提纯才能提高使用率。否则,如果你只是「积累」笔记而非消化知识,无论使用什么工具和方法,成效都是 0。

        漂亮决定生产力

        另外,网页可以自由调整外观样式,更换为你喜欢的界面。这也是为什么 LearnHubs 放弃了初版的 docsify 框架,改为复杂得多的 VuePress 框架。docsify 的官方模板太过简单,没有界面设计模块,难以满足知识管理界面必须直观漂亮的要求,而这一点直接决定了生产力,不能让步。

        知识管理/笔记软件将 Markdown 文件作为一个个区块,而网页可以将其视为一体。LearnHubs 支持多级侧边栏和目录,让阅读和查找变得更加简单。

        LearnHubs 页面布局

        为什么不用 Obsidian

        @北鸮 提到「脱离 Notion 可以理解,Markdown 很自由,那为啥不用 Obsidian 呢?也有标题,也有标签,也可以有层级,开源软件还有 Logseq 替代」。

        Obsidian 等双链笔记的设计初衷很好,可以让我们自由地在不同知识点间切换,节省搜索和关联的时间。但是,知识点的联系是靠人工打标签来建立的,而不是根据关键词自动建立图谱关系,这与 URL 链接有什么区别?因此,我认为双链笔记并不适合知识库(如果对双链笔记理解有误,欢迎纠正)。

        我的 Obsidian 图谱,只有右下角简悦抓取的素材有相同标签而聚作一团

        建立知识点联系后,双链笔记可以轻松处理成千上万个文档,按条件整合文本,便于阅读。但是,大多数人常用的知识范围不会超过一百。如果你的个人笔记超过千篇,要么你是科研大佬,要么你没有消化这些笔记,只是在记笔记。

        除了博客,我只有 37 篇笔记,而且按功能划分为 7 个区块。你觉得这点文件,用树状管理方便,还是用双链笔记打一堆标签来得好?即使有时标题里找不到某个关键词,我也可以用全文搜索达到目的。我个人会倾向于简单方便的树状标题管理。

        抛弃知识软件 ≠ 不用

        选择 Markdown 就得卸载知识软件吗?

        抛弃知识软件并不是不用,而是将其视为知识的中转站。知识软件的趋势是 ALL IN ONE,记录全能成了标榜的主打功能。但是,光收集而不应用的知识等于零,只会增加你后续的使用成本。

        对我来说,知识软件是功能清晰的素材库。我会不断清空素材库,将小的知识点融入 LearnHubs 笔记区,成体系内容则写成博客,以确保 LearnHubs 成为知识库的终点。

        知识类素材库
        • Logseq 将信息节点化,能按日期整合文本,因此我用它来记录笔记,并定期生成周报和月报回顾。
        • 飞书文档自带侧边目录栏,对长文档优化很好,因此我用它记录工作心得,定期形成工作流程并在公司分享。
        • WonderPen 带多层级标题,当一点头绪方向都没有时,素材就可以直接放这里。
        • Notion 貌似全能,但其可替代性也最高,知识库迁移到 LearnHubs 后,Notion 仅用来存放涉及个人信息和不方便转移的旧文档。
        • Airtable 表格功能最强,虽然已经被其他软件赶上,但前期存储的大量数据仍然放在这里。
        • SuperMemo 与 Anki 功能类似,可以帮助定期复习需要重复记忆的知识点。

        而对于 Obsidian,我将其视为笔记的备份站。通过 GoodSync,LearnHubs 笔记发生修改后,相关更新会实时同步到 Obsidian,完成笔记的备份。期待有一天 Obsidian 完善双链功能,帮助笔记自动打上标签,到时备份笔记就能正式使用,我也能无缝切换到新的知识管理应用。

        如果你也想试试……

        如何把博客转换为知识库,建立属于你的 LearnHubs 知识管理网站?

        ',24),k={href:"https://gpt-vip.top/#%F0%9F%94%A3-%E9%85%8D%E7%BD%AE-learndata",target:"_blank",rel:"noopener noreferrer"},x=r('

        笔记结构可以参考我的分类。这没有绝对的界限,只要看到自己觉得有价值的知识点,都可以往 LearnHubs 里添加。但是,不要全文本地化收藏,简单提取用链接引用即可。除少量精品外,网络时代的文章隔几年就会失效,没必要收藏为一篇篇的笔记。当下次需要使用这个知识点时,再考虑整理事宜,否则,长时间用不到的知识,又有什么整理的价值呢。

        • 置顶:日常习惯、健身、阅读;
        • 代码:常用代码的学习和使用笔记;
        • 软件应用:常用应用、Chrome 扩展和相关教程;
        • 页面开发:页面插件和框架生成工具;
        • 网站部署:网站相关的工具和知识收集;
        • Linux 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署;
        • 系统问题:Windows 系统优化和相关问题;
        • 生活区:说明书、生活记录和小技巧;
        • 博客区:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。

        最后

        两个月前,我在 WordPress 博客篇中喊着「md2wordpress 是最后一次博客方案」,但由于 WordPress 与 Markdown 各种不兼容,写完没多久就换到支持原生 Markdown 解析的 VuePress。

        这次我不想再立 Flag 了,只希望能放过自己。每进行一次知识迁移,真是大伤,休息一段时间吧。

        ',5),H={href:"https://gpt-vip.top/",target:"_blank",rel:"noopener noreferrer"};function w(M,v){const i=s("ExternalLinkIcon");return l(),p("div",null,[h,g,c,u,a("p",null,[e("突破迷思后,我基于 VuePress 和 vuepress-theme-hope 建立了 "),a("a",b,[e("LearnHubs"),n(i)]),e(" 项目,将知识笔记、生活记录、博客和任何认为有价值的记录转换为 Markdown 文本,然后推送到 GitHub 生成 Pages 静态页面,并同步到国内云服务器,形成 "),a("a",f,[e("LearnHubs - 开源笔记"),n(i)]),e("。")]),_,a("p",null,[e("其次,网页形式使笔记更容易分享。除了效率工具的心得,我还在 LearnHubs 上放置了生活技巧、购物评价和说明书。当家人或朋友需要帮助时,可以直接访问网页,无需安装应用程序或折腾账户分享,比如我经常分享的"),a("a",m,[e("通马桶技巧"),n(i)]),e(" 和疏通器说明书。")]),L,a("p",null,[e("首先,确保你有 GitHub 账号,懂 Markdown 和基础 HTML 知识。然后,按照 "),a("a",k,[e("LearnHubs 部署教程"),n(i)]),e("完成搭建和配置。如果你的笔记已经用 Markdown 格式编写,只需把文档放在 docs 目录下,就可以建立自己的知识库。")]),x,a("p",null,[e("如果你有兴趣尝试 "),a("a",H,[e("LearnHubs"),n(i)]),e(",欢迎通过链接访问并复制模板尝试。具体的操作方法与常见问答我都写在博客中。如果有进一步的问题或讨论,欢迎在评论区留言。")])])}const E=o(d,[["render",w],["__file","2022-08-22-learndata_blog_to_knowledge_management.html.vue"]]);export{E as default}; +import{_ as t}from"./流程2-453dc6f5.js";import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as l,c as p,a,b as e,d as n,e as r}from"./app-91ee3df5.js";const d={},h=a("p",null,[e("知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。"),a("strong",null,"笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。")],-1),g=a("p",null,"这么简单的事,我之前却一直没看透,总是把笔记与知识理解划上了等号。当要用到曾摘录的笔记时,就在各类知识管理软件里翻找,折腾一番才找到需要的笔记,有时甚至出现「自己不清楚放在哪里,也不清楚是否有」的情况。记笔记花了一个小时,下次寻找与重新消化又耗费了一个小时,原本为效率而生的知识管理软件变成了时间杀手。",-1),c=a("p",null,[e("另一方面,我们在使用知识管理软件的美观界面和强大功能的同时,也被这些软件所限制,无法完全按照自己的想法输出笔记。比如,你有了一双翅膀,"),a("strong",null,"Markdown 文本是自由的天地,而进入 Notion 则被隔成一个个小房间"),e(",你在房间里待着很舒服,可一旦想去其他房间,就必须脱离 block,不比 Markdown 可以自由飞翔。")],-1),u=a("figure",null,[a("img",{src:"https://img.gpt-vip.top/2022-08-22-18-02-07.png",alt:"",tabindex:"0",loading:"lazy"}),a("figcaption",null,"Markdown VS Notion")],-1),b={href:"https://github.com/libaxuan/LearnHubs",target:"_blank",rel:"noopener noreferrer"},f={href:"https://gpt-vip.top/",target:"_blank",rel:"noopener noreferrer"},_=r('
        笔记/博客自动化发布

        LearnHubs 的笔记和文章格式是 Markdown,输出不受到应用的局限。LearnHubs 看起来像由文章组成的博客,但它的笔记是独立的知识点,是所有知识的终点站,是整理后的知识库。通过 LearnHubs 可以搜索和整理知识,不再需要来回翻找。把博客转为知识库后,我明显感到学习和知识使用的效率得到提高,开始摆脱「工具奴隶」和「效率中毒」陷阱。

        笔记 + 文章 = LearnHubs 知识库

        为什么用网页管理笔记

        公开想法

        知识管理/笔记软件具有天然的私密性,不对外公开。但是,我的笔记大部分来自互联网,需要对谁保密?

        我非常赞同 Ray Dalio 在《原则》中提到的「头脑极度透明,公开分享想法」。

        让其他人无比清晰地看到你在做什么、为什么这么做。头脑越透明,越不会自欺,其他人也会给你诚实的反馈。

        作为国内最早一批介绍 Aria2 的人,我曾经写过一篇 Aria2 教程。文章后来被多个网站参考/抄袭,覆盖了 Aria2 某度搜索前三页。在那篇文章的评论区,有好几条留言批评文章逻辑差看不懂的,经常有热心人帮我怼回去。其实,那篇文章的初版真的很糟糕。那篇文章是在大家的反馈下,迭代了三个版本才开始变得完整和逻辑化。这些反馈也是我坚持写博客的原动力。这跟费曼学习法的道理相通,当你写文章帮助其他人时,你也在加深自己对知识的理解。建立 LearnHubs 不到一个月,但我从中获取的正反馈已超过私有笔记一年的收获。笔记公开化是有百利而无一害。

        输出分享

        ',10),m={href:"https://gpt-vip.top/family/Maintenance.html#%E9%80%9A%E9%A9%AC%E6%A1%B6",target:"_blank",rel:"noopener noreferrer"},L=r('
        生活知识页面样例

        被动消化知识

        如果只是公开分享,LearnHubs 与笔记软件并无区别,它的优点更在于网页有限的笔记数量。虽然网页可以无限地存放笔记,但打开页面只能看到少量的几十篇内容。一旦笔记堆积过多,你就像触发了整理开关似的,对笔记开始消化重构。这就是网页容量上的无限性和视觉/直觉上的有限性,存储是无限但视觉上只能有很小的一块。这里的直觉指,看一眼界面就能找到所需知识点的效果。

        比如,当我的代码区块笔记存放超过 10 篇时,每次查找代码笔记都需要 10 选 1,知识查找时间也翻倍了。我意识到节点过多,不能让自己将时间花在查询上。因此,我将代码笔记分为 Basic 和 FrontEnd 两块,总结划分的同时,编程知识也再次得到消化。

        而网页与笔记软件的区别也正在于此,LearnHubs 的主页、侧边栏和导航栏就是能展示的路径,你必须不断对笔记提纯才能提高使用率。否则,如果你只是「积累」笔记而非消化知识,无论使用什么工具和方法,成效都是 0。

        漂亮决定生产力

        另外,网页可以自由调整外观样式,更换为你喜欢的界面。这也是为什么 LearnHubs 放弃了初版的 docsify 框架,改为复杂得多的 VuePress 框架。docsify 的官方模板太过简单,没有界面设计模块,难以满足知识管理界面必须直观漂亮的要求,而这一点直接决定了生产力,不能让步。

        知识管理/笔记软件将 Markdown 文件作为一个个区块,而网页可以将其视为一体。LearnHubs 支持多级侧边栏和目录,让阅读和查找变得更加简单。

        LearnHubs 页面布局

        为什么不用 Obsidian

        @北鸮 提到「脱离 Notion 可以理解,Markdown 很自由,那为啥不用 Obsidian 呢?也有标题,也有标签,也可以有层级,开源软件还有 Logseq 替代」。

        Obsidian 等双链笔记的设计初衷很好,可以让我们自由地在不同知识点间切换,节省搜索和关联的时间。但是,知识点的联系是靠人工打标签来建立的,而不是根据关键词自动建立图谱关系,这与 URL 链接有什么区别?因此,我认为双链笔记并不适合知识库(如果对双链笔记理解有误,欢迎纠正)。

        我的 Obsidian 图谱,只有右下角简悦抓取的素材有相同标签而聚作一团

        建立知识点联系后,双链笔记可以轻松处理成千上万个文档,按条件整合文本,便于阅读。但是,大多数人常用的知识范围不会超过一百。如果你的个人笔记超过千篇,要么你是科研大佬,要么你没有消化这些笔记,只是在记笔记。

        除了博客,我只有 37 篇笔记,而且按功能划分为 7 个区块。你觉得这点文件,用树状管理方便,还是用双链笔记打一堆标签来得好?即使有时标题里找不到某个关键词,我也可以用全文搜索达到目的。我个人会倾向于简单方便的树状标题管理。

        抛弃知识软件 ≠ 不用

        选择 Markdown 就得卸载知识软件吗?

        抛弃知识软件并不是不用,而是将其视为知识的中转站。知识软件的趋势是 ALL IN ONE,记录全能成了标榜的主打功能。但是,光收集而不应用的知识等于零,只会增加你后续的使用成本。

        对我来说,知识软件是功能清晰的素材库。我会不断清空素材库,将小的知识点融入 LearnHubs 笔记区,成体系内容则写成博客,以确保 LearnHubs 成为知识库的终点。

        知识类素材库
        • Logseq 将信息节点化,能按日期整合文本,因此我用它来记录笔记,并定期生成周报和月报回顾。
        • 飞书文档自带侧边目录栏,对长文档优化很好,因此我用它记录工作心得,定期形成工作流程并在公司分享。
        • WonderPen 带多层级标题,当一点头绪方向都没有时,素材就可以直接放这里。
        • Notion 貌似全能,但其可替代性也最高,知识库迁移到 LearnHubs 后,Notion 仅用来存放涉及个人信息和不方便转移的旧文档。
        • Airtable 表格功能最强,虽然已经被其他软件赶上,但前期存储的大量数据仍然放在这里。
        • SuperMemo 与 Anki 功能类似,可以帮助定期复习需要重复记忆的知识点。

        而对于 Obsidian,我将其视为笔记的备份站。通过 GoodSync,LearnHubs 笔记发生修改后,相关更新会实时同步到 Obsidian,完成笔记的备份。期待有一天 Obsidian 完善双链功能,帮助笔记自动打上标签,到时备份笔记就能正式使用,我也能无缝切换到新的知识管理应用。

        如果你也想试试……

        如何把博客转换为知识库,建立属于你的 LearnHubs 知识管理网站?

        ',24),k={href:"https://gpt-vip.top/#%F0%9F%94%A3-%E9%85%8D%E7%BD%AE-learndata",target:"_blank",rel:"noopener noreferrer"},x=r('

        笔记结构可以参考我的分类。这没有绝对的界限,只要看到自己觉得有价值的知识点,都可以往 LearnHubs 里添加。但是,不要全文本地化收藏,简单提取用链接引用即可。除少量精品外,网络时代的文章隔几年就会失效,没必要收藏为一篇篇的笔记。当下次需要使用这个知识点时,再考虑整理事宜,否则,长时间用不到的知识,又有什么整理的价值呢。

        • 置顶:日常习惯、健身、阅读;
        • 代码:常用代码的学习和使用笔记;
        • 软件应用:常用应用、Chrome 扩展和相关教程;
        • 页面开发:页面插件和框架生成工具;
        • 网站部署:网站相关的工具和知识收集;
        • Linux 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署;
        • 系统问题:Windows 系统优化和相关问题;
        • 生活区:说明书、生活记录和小技巧;
        • 博客区:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。

        最后

        两个月前,我在 WordPress 博客篇中喊着「md2wordpress 是最后一次博客方案」,但由于 WordPress 与 Markdown 各种不兼容,写完没多久就换到支持原生 Markdown 解析的 VuePress。

        这次我不想再立 Flag 了,只希望能放过自己。每进行一次知识迁移,真是大伤,休息一段时间吧。

        ',5),H={href:"https://gpt-vip.top/",target:"_blank",rel:"noopener noreferrer"};function w(M,v){const i=s("ExternalLinkIcon");return l(),p("div",null,[h,g,c,u,a("p",null,[e("突破迷思后,我基于 VuePress 和 vuepress-theme-hope 建立了 "),a("a",b,[e("LearnHubs"),n(i)]),e(" 项目,将知识笔记、生活记录、博客和任何认为有价值的记录转换为 Markdown 文本,然后推送到 GitHub 生成 Pages 静态页面,并同步到国内云服务器,形成 "),a("a",f,[e("LearnHubs - 开源笔记"),n(i)]),e("。")]),_,a("p",null,[e("其次,网页形式使笔记更容易分享。除了效率工具的心得,我还在 LearnHubs 上放置了生活技巧、购物评价和说明书。当家人或朋友需要帮助时,可以直接访问网页,无需安装应用程序或折腾账户分享,比如我经常分享的"),a("a",m,[e("通马桶技巧"),n(i)]),e(" 和疏通器说明书。")]),L,a("p",null,[e("首先,确保你有 GitHub 账号,懂 Markdown 和基础 HTML 知识。然后,按照 "),a("a",k,[e("LearnHubs 部署教程"),n(i)]),e("完成搭建和配置。如果你的笔记已经用 Markdown 格式编写,只需把文档放在 docs 目录下,就可以建立自己的知识库。")]),x,a("p",null,[e("如果你有兴趣尝试 "),a("a",H,[e("LearnHubs"),n(i)]),e(",欢迎通过链接访问并复制模板尝试。具体的操作方法与常见问答我都写在博客中。如果有进一步的问题或讨论,欢迎在评论区留言。")])])}const E=o(d,[["render",w],["__file","2022-08-22-learndata_blog_to_knowledge_management.html.vue"]]);export{E as default}; diff --git a/assets/2022-11-03-ffmpeg_screen_recording.html-ed4c4934.js b/assets/2022-11-03-ffmpeg_screen_recording.html-880b90b9.js similarity index 99% rename from assets/2022-11-03-ffmpeg_screen_recording.html-ed4c4934.js rename to assets/2022-11-03-ffmpeg_screen_recording.html-880b90b9.js index 2063f230..41fa6add 100644 --- a/assets/2022-11-03-ffmpeg_screen_recording.html-ed4c4934.js +++ b/assets/2022-11-03-ffmpeg_screen_recording.html-880b90b9.js @@ -1 +1 @@ -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as i,c as d,a as e,b as o,d as r,e as n}from"./app-98132e77.js";const l={},c=e("blockquote",null,[e("p",null,"当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。")],-1),f={href:"https://gpt-vip.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},p={href:"https://www.videolan.org/vlc/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://obsproject.com/",target:"_blank",rel:"noopener noreferrer"},_={href:"https://github.com/MathewSachin/Captura/releases/tag/v8.0.0",target:"_blank",rel:"noopener noreferrer"},g=e("p",null,"免费的不行,那么收费的会不会好点呢?",-1),u={href:"https://www.bandicam.cn/",target:"_blank",rel:"noopener noreferrer"},m=e("p",null,"再后,我测试了其他几款录屏应用:",-1),b=e("li",null,"相机:Windows 自带应用,录制方便,但输出选项较少,限制多。",-1),F={href:"https://www.flashbackrecorder.com/zh/express/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://mirillis.com/zh/products/action.html",target:"_blank",rel:"noopener noreferrer"},k={href:"https://ohsoft.net/eng/ocam/intro.php?cate=1002",target:"_blank",rel:"noopener noreferrer"},v={href:"https://getsharex.com/",target:"_blank",rel:"noopener noreferrer"},w=n('

        我一共试了 9 款录屏软件,体验都不太好,软件普遍存在无法自定义画面、不兼容、稳定性低的问题。再加上自我监控方案的单次录制时间超过 12 小时,理想的帧率(0.02 帧)远超出应用最低 15-30 帧的下限。因此,我需要另外找一款稳定、兼容性高、又能自由定制录屏方案的工具,最终找到的是 FFmpeg。

        为什么 FFmpeg

        FFmpeg 是处理多媒体内容 (如音频、视频、字幕和相关元数据) 的库和工具的集合,支持在 Linux、MacOS 和 Windows 平台上运行。它提供了录制、转换以及流化音视频的完整解决方案。

        上文尝试的录屏、视频处理工具几乎都是基于 FFmpeg 而开发的。不仅能实现它们的所有功能,还具有超高的稳定性和兼容性。与 FFmpeg 相比,现成的录屏应用的优势仅在于其美观的界面和简单易上手的录制方案。

        若要跳出软件的限制,自由地定制录屏效果,避免莫名其妙的 bug,更底层的 FFmpeg 反而是更稳定有效的方案。命令行录制看起来复杂,但实际上只需要熟悉十几个参数,你就能定制专属录屏方案,个人感觉比熟悉 Bandicam 的软件界面更简单。

        以我在 Windows 上的桌面录制方案为例,从多屏幕中指定一个 2K 区域进行录制,并在画面右下角添加 360P 的摄像头录制角度,然后以帧率 0.02 输出监控视频。按 q 则停止录制。

        输出画面如图例

        录屏准备

        配置 FFmpeg

        ',9),C={href:"https://github.com/BtbN/FFmpeg-Builds/releases/tag/latest",target:"_blank",rel:"noopener noreferrer"},B=e("code",null,"ffmpeg-master-latest-win64-gpl.zip",-1),S=n('
      20. 将 FFmpeg 解压到任意文件夹,比如 D:\\Backup\\Libraries\\Documents\\ffmpeg

      21. 开始栏搜索「编辑系统环境变量」,点击进入「环境变量」。

      22. 新建用户变量 FFMPEG_HOME,变量值设为刚才的解压路径 D:\\Backup\\Libraries\\Documents\\ffmpeg

        FFmpeg 全局变量设置
      23. ',3),A=e("p",null,"配置完成后,在终端输入 ffmpeg 即可启动。",-1),y=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-11-01-18-17-13.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"FFmpeg 配置成功")],-1),M=e("h3",{id:"配置视频-音频设备",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#配置视频-音频设备","aria-hidden":"true"},"#"),o(" 配置视频/音频设备")],-1),z={href:"https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases",target:"_blank",rel:"noopener noreferrer"},D=n('

        通过命令 ffmpeg -list_devices true -f dshow -i dummy 查看支持的 Windows DirectShow 输入设备,采集视频和音频设备,包含设备名称,设备类型等信息。[1] 这里得到了视频设备「USB2.0 PC CAMERA」和音频设备「Analogue 1/2 (Audient iD4)」,之后会用到。

        查看视频/音频设备列表

        录制屏幕

        从坐标 0:0 开始圈定出一个 2560x1440 的屏幕范围,然后以 每 50 秒截图 1 帧,输出为 mp4 格式的视频,录制命令为 ffmpeg -f gdigrab -r 20/1001 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 output.mp4[2]

        以下是录制命令的说明:

        ',5),E=e("code",null,"-f gdigrab",-1),P={href:"https://ffmpeg.org/ffmpeg-all.html#gdigrab",target:"_blank",rel:"noopener noreferrer"},L={href:"https://ffmpeg.org/ffmpeg-devices.html#avfoundation",target:"_blank",rel:"noopener noreferrer"},W={href:"https://ffmpeg.org/ffmpeg-all.html#x11grab",target:"_blank",rel:"noopener noreferrer"},R=n('
      24. -r 20/1001 帧率为 0.02,每 50 秒录制一帧。主流大家喜欢用 -r 30 录制,但由于这是用于每日监测,所以我采用了超低帧率。
      25. -c:v libx264 是用于设置视频编解码器,一般可不填使用默认配置,-c:a 为音频编码。[3]
      26. -draw_mouse 1 在 gdigrab 录制的视频中显示鼠标。
      27. -offset_x 0 -offset_y 0 -video_size 2560x1440 为起始坐标和选定录制范围。坐标可使用截图软件获取,比如我用 Snipaste,点击 F1 后进入截图界面,鼠标经过当前区域就会显示坐标。
      28. -s 1280x720 用 scale 方法,设置视频分辨率为 720p。
      29. -i desktop 为输入设备,指代显示屏。
      30. out.mp4 为输出视频的名字与格式。默认保存在命令运行文件夹,可以在此处设置输出位置,如 D:\\Backup\\Libraries\\Desktop\\out.mp4。或使用时间对视频命名,将 out.mp4 替换为 -f segment -segment_time 2 -strftime 1 %Y-%m-%d_%H-%M-%S.mp4,视频样例名为 2022-11-06_10-53-17.mp4
      31. ',7),U=n('

        除上方命令外,FFmpeg 还有许多参数可以设置,比如 -pix_fmt yuv420p -preset ultrafast 提升编码速度,-filter:v 'setpts=0.1*PTS' 减少视频抽样,但 setpts 不是视频加速,对于低帧率的视频影响很小。[4] [5]

        录制摄像头

        然后,我们使用上方获取的视频设备,即可用摄像头进行录制,如 ffmpeg -f dshow -i video='USB2.0 PC CAMERA' output.mp4

        如果录屏的同时需要录制音频,则在命令中加入之前获取的音频设备,命令变为 ffmpeg -f dshow -i audio='Analogue 1/2 (Audient iD4)' -f dshow -i video='USB2.0 PC CAMERA' output.mp4

        输出视频:画中画

        清楚如何用 FFmpeg 录制屏幕、摄像头和音频后,我需要将他们放置于同一画面中,将摄像头画面放在录制画面的右下侧,并用 overlay 方法将其置于屏幕画面的上方,遮挡对应区域。[6] [7]

        综合了以上三步,最终的录制命令为:ffmpeg -f gdigrab -r 1 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 -b:v 0 -crf 32 -f segment -segment_time 2 -strftime 1 %Y-%m-%d_%H-%M-%S.mp4 -f dshow -i audio='Analogue 1/2 (Audient iD4)' -f dshow -s 640x480 -i video='USB2.0 PC CAMERA' -filter_complex 'overlay=W-w-1:H-h-50' -y

        • -b:v 0 -crf 32 是将视频比特率设置为最小,同时使用恒定质量,CRF 的范围可以从 0(最佳质量)到 63(最小文件大小)。
        • overlay=W-w-1:H-h-1 这是一个坐标,指浮层放在右下角,距离边缘 1px。
        • -y 遇到选项时,默认执行 yes 命令,比如覆盖同名的视频文件。

        命令中的录制帧率较低,但不会影响同时录制的音频。之后的录屏只需在终端中运行这段命令,就会自动录制屏幕,在终端上按 q 即可停止录制。使用 FFmpeg 后,我的录屏再也没有莫名其妙的崩溃了。

        常见问题

        Could not set video options

        报错 Could not set video options,多是由于录制设置的帧率、分辨率超出设备范围造成的。使用命令 ffmpeg -f dshow -list_options true -i video='USB2.0 PC CAMERA' -loglevel debug 检查设备的输出属性,调整录制属性。

        real-time buffer

        ',13),V=e("code",null,"real-time buffer [xxxxxx] [video input] too full or near too full (181% of size: 3041280 [rtbufsize parameter])! frame dropped!",-1),H={href:"https://github.com/rdp/screen-capture-recorder-to-video-windows-free/issues/136",target:"_blank",rel:"noopener noreferrer"},O=n('

        摄像头分辨率错误

        如果摄像头画面出现裁切,分辨率与预期不同,可以检查摄像头录制属性和摄像头应用输出分辨率。例如,部分版本的 SplitCam Video Driver 将外场景尺寸固定为 4:3,导致输出画面被裁剪,因此只能更换其他视频输入源。

        录制画面偏移

        如果录制画面比例异常或画幅偏移,这可能是 Windows 的屏幕缩放造成的。可以在 ffmpeg.exe 的属性中勾选「高 DPI 缩放替代」来解决这个问题。

        脚本启动报错

        使用 AutoHotkey 等外部脚本启用录屏命令时,报错 Could not find video device with name [USB2.0],而正确设备名是「USB2.0 PC CAMERA」。检查录制命令中是否使用了双引号,需将双引号 " 替换为单引号 '

        后续

        如果读了 FFmpeg 的文档,就会发现这个工具异常强大,很多采用 FFmpeg 的工具都没有将它的功能性发挥到极致,以比较普适的功能尽可能地换取软件操作的易用性。而对于像我这样有一个比较小众、甚至特殊需求的人来说,已经打包好的图形界面应用就很有可能力有不逮。这时,FFmpeg 这种底层的命令行工具可能就是唯一的选择,而且用了之后会发现,它在功能强大的同时还更加稳定,自定义能力也更强。而且,如果跨过了起初对于命令行的恐惧,理解和上手其实也不算多难。

        此外,FFmpeg 的功能不止录屏,它还有诸如连续截图、视频转帧率改大小等多种玩法,非常强大。

        ',9),N={href:"https://ffmpeg.guide/",target:"_blank",rel:"noopener noreferrer"},q=e("p",null,"当然,本文的目的是分享我监控自己的延伸,分享使用 FFmpeg 录屏的入门方法,而非完全掌握,因此只介绍了录屏相关的核心命令。如果有需要,还是推荐研究一下官方文档,或者跟着我做的试一试,说不定就有新收获。",-1),I={href:"https://sspai.com/post/76637",target:"_blank",rel:"noopener noreferrer"},j=e("hr",{class:"footnotes-sep"},null,-1),G={class:"footnotes"},T={class:"footnotes-list"},Y={id:"footnote1",class:"footnote-item"},J={href:"https://blog.csdn.net/m0_60352504/article/details/126762161",target:"_blank",rel:"noopener noreferrer"},K=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),X={id:"footnote2",class:"footnote-item"},Q={href:"https://blog.csdn.net/JineD/article/details/123057086",target:"_blank",rel:"noopener noreferrer"},Z=e("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),$={id:"footnote3",class:"footnote-item"},ee={href:"https://ffmpeg.org/ffmpeg-codecs.html#libx265",target:"_blank",rel:"noopener noreferrer"},oe=e("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),te={id:"footnote4",class:"footnote-item"},re={href:"https://magiclen.org/x265-preset/",target:"_blank",rel:"noopener noreferrer"},ne=e("a",{href:"#footnote-ref4",class:"footnote-backref"},"↩︎",-1),ae={id:"footnote5",class:"footnote-item"},se={href:"https://blog.csdn.net/zhying719/article/details/123059209",target:"_blank",rel:"noopener noreferrer"},ie=e("a",{href:"#footnote-ref5",class:"footnote-backref"},"↩︎",-1),de={id:"footnote6",class:"footnote-item"},le={href:"https://www.cnblogs.com/leisure_chn/p/10434209.html",target:"_blank",rel:"noopener noreferrer"},ce=e("a",{href:"#footnote-ref6",class:"footnote-backref"},"↩︎",-1),fe={id:"footnote7",class:"footnote-item"},pe={href:"https://blog.csdn.net/guanyijun123/article/details/121270650",target:"_blank",rel:"noopener noreferrer"},he=e("a",{href:"#footnote-ref7",class:"footnote-backref"},"↩︎",-1);function _e(ge,ue){const t=s("ExternalLinkIcon");return i(),d("div",null,[c,e("p",null,[o("开始"),e("a",f,[o("自我监控"),r(t)]),o("后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。")]),e("p",null,[o("最初,我使用了免费开源的 "),e("a",p,[o("VLC"),r(t)]),o(",这也是我监控文章中采用的方案。它能调节输出视频的编码、帧率、格式,但操作麻烦,而且不能同时录屏和摄像头,暂停录制也容易导致程序崩溃。")]),e("p",null,[o("然后,我尝试了 "),e("a",h,[o("OBS"),r(t)]),o(",它的录制功能极其强大,可以任意添加摄像头、文字、图像等,但输出限制多,生成的视频体积过大。同时,OBS 不支持录制画面与直播画面分开,而我平常习惯边开直播边工作,这令我只能放弃 OBS 录屏。")]),e("p",null,[o("接着,我发现了 7.8k Star 的 "),e("a",_,[o("Captura"),r(t)]),o(",它的自由度较高,能自定义叠加元素,但项目已于 2018 年停止更新,使用时经常碰到莫名其妙的报错,很不稳定。")]),g,e("p",null,[o("我用 "),e("a",u,[o("Bandicam"),r(t)]),o(" 录制了一周的视频。与 Captura 相比,Bandicam 的稳定性有了很大的提升,不会突然崩溃,还有降噪和内录扬声器功能,但它偶尔会丢失摄像头,导致无法自动录屏。")]),m,e("ul",null,[b,e("li",null,[e("a",F,[o("FlashBack Express"),r(t)]),o(":能调节帧率,画面镜像,虚化背景,但免费版只支持 2 小时内的录制。")]),e("li",null,[e("a",x,[o("Mirillis Action!"),r(t)]),o(":高帧率录制游戏,自动分割视频,自定义叠加元素,但输入帧率不能自由调整,最低只能 15 帧,试用期 30 天。")]),e("li",null,[e("a",k,[o("oCam"),r(t)]),o(":打着免费招牌但有弹窗广告,且输出视频偏大。")]),e("li",null,[e("a",v,[o("ShareX"),r(t)]),o(":免费开源强大的截图软件,具备录屏功能,能调节编码和帧率,但只能单一录屏或录像。")])]),w,e("ol",null,[e("li",null,[e("p",null,[o("下载最新版 "),e("a",C,[o("FFmpeg"),r(t)]),o(",Windows 环境选择 "),B,o(",GPL 版本包含了所有依赖项。")])]),S]),A,y,M,e("p",null,[o("FFmpeg 的录制命令 gdigrab 不支持音频录制,也不支持直接调用摄像头,此时需使用开源的 "),e("a",z,[o("screen-capture-recorder-to-video-windows-free"),r(t)]),o(" 增强 FFmpeg 的录制功能,其最新版本为 0.12.12。")]),D,e("ul",null,[e("li",null,[E,o(" 使用 FFmpeg 内置的 Windows 屏幕录制命令 "),e("a",P,[o("gdigrab"),r(t)]),o(",录制对象可为全屏、指定范围和指定程序。MacOS 录屏方法为 "),e("a",L,[o("AVFoundation"),r(t)]),o(",Linux 录屏方法为 "),e("a",W,[o("x11grab"),r(t)]),o("。")]),R]),U,e("p",null,[o("报错 "),V,o(",解决方案参考 "),e("a",H,[o("issue 136"),r(t)]),o("。尽管我仍然遇到了这个错误,但它并未影响录屏的效果。")]),O,e("p",null,[o("前几天,群里有人分享了快速生成 FFmpeg 命令的工具 "),e("a",N,[o("FFmpeg.guide"),r(t)]),o("。本以为能帮新手快速入门,使用后却感觉不实用。FFmpeg 最快入门的方法还是得看官方文档,也有一些爱好者整理翻译了相关的中文/视频教程。前期会耗费一些时间,但只要定制好自己要的命令,之后就能一直使用。")]),q,e("p",null,[o("本文于「"),e("a",I,[o("少数派首发"),r(t)]),o("」。")]),j,e("section",G,[e("ol",T,[e("li",Y,[e("p",null,[e("a",J,[o("ffmpeg 录屏命令"),r(t)]),o(),K])]),e("li",X,[e("p",null,[e("a",Q,[o("ffmpeg 基础使用"),r(t)]),o(),Z])]),e("li",$,[e("p",null,[e("a",ee,[o("libx265 编码说明"),r(t)]),o(),oe])]),e("li",te,[e("p",null,[e("a",re,[o("x265 的 preset 与编码速度、视频画质以及比特率的关联"),r(t)]),o(),ne])]),e("li",ae,[e("p",null,[e("a",se,[o("FFmpeg 音视频倍速控制"),r(t)]),o(),ie])]),e("li",de,[e("p",null,[e("a",le,[o("FFmpeg 中 overlay 滤镜用法 - 水印及画中画"),r(t)]),o(),ce])]),e("li",fe,[e("p",null,[e("a",pe,[o("ffmpeg 调整缩放裁剪视频的基础知识 (转)"),r(t)]),o(),he])])])])])}const Fe=a(l,[["render",_e],["__file","2022-11-03-ffmpeg_screen_recording.html.vue"]]);export{Fe as default}; +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as i,c as d,a as e,b as o,d as r,e as n}from"./app-91ee3df5.js";const l={},c=e("blockquote",null,[e("p",null,"当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。")],-1),f={href:"https://gpt-vip.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},p={href:"https://www.videolan.org/vlc/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://obsproject.com/",target:"_blank",rel:"noopener noreferrer"},_={href:"https://github.com/MathewSachin/Captura/releases/tag/v8.0.0",target:"_blank",rel:"noopener noreferrer"},g=e("p",null,"免费的不行,那么收费的会不会好点呢?",-1),u={href:"https://www.bandicam.cn/",target:"_blank",rel:"noopener noreferrer"},m=e("p",null,"再后,我测试了其他几款录屏应用:",-1),b=e("li",null,"相机:Windows 自带应用,录制方便,但输出选项较少,限制多。",-1),F={href:"https://www.flashbackrecorder.com/zh/express/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://mirillis.com/zh/products/action.html",target:"_blank",rel:"noopener noreferrer"},k={href:"https://ohsoft.net/eng/ocam/intro.php?cate=1002",target:"_blank",rel:"noopener noreferrer"},v={href:"https://getsharex.com/",target:"_blank",rel:"noopener noreferrer"},w=n('

        我一共试了 9 款录屏软件,体验都不太好,软件普遍存在无法自定义画面、不兼容、稳定性低的问题。再加上自我监控方案的单次录制时间超过 12 小时,理想的帧率(0.02 帧)远超出应用最低 15-30 帧的下限。因此,我需要另外找一款稳定、兼容性高、又能自由定制录屏方案的工具,最终找到的是 FFmpeg。

        为什么 FFmpeg

        FFmpeg 是处理多媒体内容 (如音频、视频、字幕和相关元数据) 的库和工具的集合,支持在 Linux、MacOS 和 Windows 平台上运行。它提供了录制、转换以及流化音视频的完整解决方案。

        上文尝试的录屏、视频处理工具几乎都是基于 FFmpeg 而开发的。不仅能实现它们的所有功能,还具有超高的稳定性和兼容性。与 FFmpeg 相比,现成的录屏应用的优势仅在于其美观的界面和简单易上手的录制方案。

        若要跳出软件的限制,自由地定制录屏效果,避免莫名其妙的 bug,更底层的 FFmpeg 反而是更稳定有效的方案。命令行录制看起来复杂,但实际上只需要熟悉十几个参数,你就能定制专属录屏方案,个人感觉比熟悉 Bandicam 的软件界面更简单。

        以我在 Windows 上的桌面录制方案为例,从多屏幕中指定一个 2K 区域进行录制,并在画面右下角添加 360P 的摄像头录制角度,然后以帧率 0.02 输出监控视频。按 q 则停止录制。

        输出画面如图例

        录屏准备

        配置 FFmpeg

        ',9),C={href:"https://github.com/BtbN/FFmpeg-Builds/releases/tag/latest",target:"_blank",rel:"noopener noreferrer"},B=e("code",null,"ffmpeg-master-latest-win64-gpl.zip",-1),S=n('
      32. 将 FFmpeg 解压到任意文件夹,比如 D:\\Backup\\Libraries\\Documents\\ffmpeg

      33. 开始栏搜索「编辑系统环境变量」,点击进入「环境变量」。

      34. 新建用户变量 FFMPEG_HOME,变量值设为刚才的解压路径 D:\\Backup\\Libraries\\Documents\\ffmpeg

        FFmpeg 全局变量设置
      35. ',3),A=e("p",null,"配置完成后,在终端输入 ffmpeg 即可启动。",-1),y=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-11-01-18-17-13.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"FFmpeg 配置成功")],-1),M=e("h3",{id:"配置视频-音频设备",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#配置视频-音频设备","aria-hidden":"true"},"#"),o(" 配置视频/音频设备")],-1),z={href:"https://github.com/rdp/screen-capture-recorder-to-video-windows-free/releases",target:"_blank",rel:"noopener noreferrer"},D=n('

        通过命令 ffmpeg -list_devices true -f dshow -i dummy 查看支持的 Windows DirectShow 输入设备,采集视频和音频设备,包含设备名称,设备类型等信息。[1] 这里得到了视频设备「USB2.0 PC CAMERA」和音频设备「Analogue 1/2 (Audient iD4)」,之后会用到。

        查看视频/音频设备列表

        录制屏幕

        从坐标 0:0 开始圈定出一个 2560x1440 的屏幕范围,然后以 每 50 秒截图 1 帧,输出为 mp4 格式的视频,录制命令为 ffmpeg -f gdigrab -r 20/1001 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 output.mp4[2]

        以下是录制命令的说明:

        ',5),E=e("code",null,"-f gdigrab",-1),P={href:"https://ffmpeg.org/ffmpeg-all.html#gdigrab",target:"_blank",rel:"noopener noreferrer"},L={href:"https://ffmpeg.org/ffmpeg-devices.html#avfoundation",target:"_blank",rel:"noopener noreferrer"},W={href:"https://ffmpeg.org/ffmpeg-all.html#x11grab",target:"_blank",rel:"noopener noreferrer"},R=n('
      36. -r 20/1001 帧率为 0.02,每 50 秒录制一帧。主流大家喜欢用 -r 30 录制,但由于这是用于每日监测,所以我采用了超低帧率。
      37. -c:v libx264 是用于设置视频编解码器,一般可不填使用默认配置,-c:a 为音频编码。[3]
      38. -draw_mouse 1 在 gdigrab 录制的视频中显示鼠标。
      39. -offset_x 0 -offset_y 0 -video_size 2560x1440 为起始坐标和选定录制范围。坐标可使用截图软件获取,比如我用 Snipaste,点击 F1 后进入截图界面,鼠标经过当前区域就会显示坐标。
      40. -s 1280x720 用 scale 方法,设置视频分辨率为 720p。
      41. -i desktop 为输入设备,指代显示屏。
      42. out.mp4 为输出视频的名字与格式。默认保存在命令运行文件夹,可以在此处设置输出位置,如 D:\\Backup\\Libraries\\Desktop\\out.mp4。或使用时间对视频命名,将 out.mp4 替换为 -f segment -segment_time 2 -strftime 1 %Y-%m-%d_%H-%M-%S.mp4,视频样例名为 2022-11-06_10-53-17.mp4
      43. ',7),U=n('

        除上方命令外,FFmpeg 还有许多参数可以设置,比如 -pix_fmt yuv420p -preset ultrafast 提升编码速度,-filter:v 'setpts=0.1*PTS' 减少视频抽样,但 setpts 不是视频加速,对于低帧率的视频影响很小。[4] [5]

        录制摄像头

        然后,我们使用上方获取的视频设备,即可用摄像头进行录制,如 ffmpeg -f dshow -i video='USB2.0 PC CAMERA' output.mp4

        如果录屏的同时需要录制音频,则在命令中加入之前获取的音频设备,命令变为 ffmpeg -f dshow -i audio='Analogue 1/2 (Audient iD4)' -f dshow -i video='USB2.0 PC CAMERA' output.mp4

        输出视频:画中画

        清楚如何用 FFmpeg 录制屏幕、摄像头和音频后,我需要将他们放置于同一画面中,将摄像头画面放在录制画面的右下侧,并用 overlay 方法将其置于屏幕画面的上方,遮挡对应区域。[6] [7]

        综合了以上三步,最终的录制命令为:ffmpeg -f gdigrab -r 1 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 -b:v 0 -crf 32 -f segment -segment_time 2 -strftime 1 %Y-%m-%d_%H-%M-%S.mp4 -f dshow -i audio='Analogue 1/2 (Audient iD4)' -f dshow -s 640x480 -i video='USB2.0 PC CAMERA' -filter_complex 'overlay=W-w-1:H-h-50' -y

        • -b:v 0 -crf 32 是将视频比特率设置为最小,同时使用恒定质量,CRF 的范围可以从 0(最佳质量)到 63(最小文件大小)。
        • overlay=W-w-1:H-h-1 这是一个坐标,指浮层放在右下角,距离边缘 1px。
        • -y 遇到选项时,默认执行 yes 命令,比如覆盖同名的视频文件。

        命令中的录制帧率较低,但不会影响同时录制的音频。之后的录屏只需在终端中运行这段命令,就会自动录制屏幕,在终端上按 q 即可停止录制。使用 FFmpeg 后,我的录屏再也没有莫名其妙的崩溃了。

        常见问题

        Could not set video options

        报错 Could not set video options,多是由于录制设置的帧率、分辨率超出设备范围造成的。使用命令 ffmpeg -f dshow -list_options true -i video='USB2.0 PC CAMERA' -loglevel debug 检查设备的输出属性,调整录制属性。

        real-time buffer

        ',13),V=e("code",null,"real-time buffer [xxxxxx] [video input] too full or near too full (181% of size: 3041280 [rtbufsize parameter])! frame dropped!",-1),H={href:"https://github.com/rdp/screen-capture-recorder-to-video-windows-free/issues/136",target:"_blank",rel:"noopener noreferrer"},O=n('

        摄像头分辨率错误

        如果摄像头画面出现裁切,分辨率与预期不同,可以检查摄像头录制属性和摄像头应用输出分辨率。例如,部分版本的 SplitCam Video Driver 将外场景尺寸固定为 4:3,导致输出画面被裁剪,因此只能更换其他视频输入源。

        录制画面偏移

        如果录制画面比例异常或画幅偏移,这可能是 Windows 的屏幕缩放造成的。可以在 ffmpeg.exe 的属性中勾选「高 DPI 缩放替代」来解决这个问题。

        脚本启动报错

        使用 AutoHotkey 等外部脚本启用录屏命令时,报错 Could not find video device with name [USB2.0],而正确设备名是「USB2.0 PC CAMERA」。检查录制命令中是否使用了双引号,需将双引号 " 替换为单引号 '

        后续

        如果读了 FFmpeg 的文档,就会发现这个工具异常强大,很多采用 FFmpeg 的工具都没有将它的功能性发挥到极致,以比较普适的功能尽可能地换取软件操作的易用性。而对于像我这样有一个比较小众、甚至特殊需求的人来说,已经打包好的图形界面应用就很有可能力有不逮。这时,FFmpeg 这种底层的命令行工具可能就是唯一的选择,而且用了之后会发现,它在功能强大的同时还更加稳定,自定义能力也更强。而且,如果跨过了起初对于命令行的恐惧,理解和上手其实也不算多难。

        此外,FFmpeg 的功能不止录屏,它还有诸如连续截图、视频转帧率改大小等多种玩法,非常强大。

        ',9),N={href:"https://ffmpeg.guide/",target:"_blank",rel:"noopener noreferrer"},q=e("p",null,"当然,本文的目的是分享我监控自己的延伸,分享使用 FFmpeg 录屏的入门方法,而非完全掌握,因此只介绍了录屏相关的核心命令。如果有需要,还是推荐研究一下官方文档,或者跟着我做的试一试,说不定就有新收获。",-1),I={href:"https://sspai.com/post/76637",target:"_blank",rel:"noopener noreferrer"},j=e("hr",{class:"footnotes-sep"},null,-1),G={class:"footnotes"},T={class:"footnotes-list"},Y={id:"footnote1",class:"footnote-item"},J={href:"https://blog.csdn.net/m0_60352504/article/details/126762161",target:"_blank",rel:"noopener noreferrer"},K=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),X={id:"footnote2",class:"footnote-item"},Q={href:"https://blog.csdn.net/JineD/article/details/123057086",target:"_blank",rel:"noopener noreferrer"},Z=e("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),$={id:"footnote3",class:"footnote-item"},ee={href:"https://ffmpeg.org/ffmpeg-codecs.html#libx265",target:"_blank",rel:"noopener noreferrer"},oe=e("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1),te={id:"footnote4",class:"footnote-item"},re={href:"https://magiclen.org/x265-preset/",target:"_blank",rel:"noopener noreferrer"},ne=e("a",{href:"#footnote-ref4",class:"footnote-backref"},"↩︎",-1),ae={id:"footnote5",class:"footnote-item"},se={href:"https://blog.csdn.net/zhying719/article/details/123059209",target:"_blank",rel:"noopener noreferrer"},ie=e("a",{href:"#footnote-ref5",class:"footnote-backref"},"↩︎",-1),de={id:"footnote6",class:"footnote-item"},le={href:"https://www.cnblogs.com/leisure_chn/p/10434209.html",target:"_blank",rel:"noopener noreferrer"},ce=e("a",{href:"#footnote-ref6",class:"footnote-backref"},"↩︎",-1),fe={id:"footnote7",class:"footnote-item"},pe={href:"https://blog.csdn.net/guanyijun123/article/details/121270650",target:"_blank",rel:"noopener noreferrer"},he=e("a",{href:"#footnote-ref7",class:"footnote-backref"},"↩︎",-1);function _e(ge,ue){const t=s("ExternalLinkIcon");return i(),d("div",null,[c,e("p",null,[o("开始"),e("a",f,[o("自我监控"),r(t)]),o("后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。")]),e("p",null,[o("最初,我使用了免费开源的 "),e("a",p,[o("VLC"),r(t)]),o(",这也是我监控文章中采用的方案。它能调节输出视频的编码、帧率、格式,但操作麻烦,而且不能同时录屏和摄像头,暂停录制也容易导致程序崩溃。")]),e("p",null,[o("然后,我尝试了 "),e("a",h,[o("OBS"),r(t)]),o(",它的录制功能极其强大,可以任意添加摄像头、文字、图像等,但输出限制多,生成的视频体积过大。同时,OBS 不支持录制画面与直播画面分开,而我平常习惯边开直播边工作,这令我只能放弃 OBS 录屏。")]),e("p",null,[o("接着,我发现了 7.8k Star 的 "),e("a",_,[o("Captura"),r(t)]),o(",它的自由度较高,能自定义叠加元素,但项目已于 2018 年停止更新,使用时经常碰到莫名其妙的报错,很不稳定。")]),g,e("p",null,[o("我用 "),e("a",u,[o("Bandicam"),r(t)]),o(" 录制了一周的视频。与 Captura 相比,Bandicam 的稳定性有了很大的提升,不会突然崩溃,还有降噪和内录扬声器功能,但它偶尔会丢失摄像头,导致无法自动录屏。")]),m,e("ul",null,[b,e("li",null,[e("a",F,[o("FlashBack Express"),r(t)]),o(":能调节帧率,画面镜像,虚化背景,但免费版只支持 2 小时内的录制。")]),e("li",null,[e("a",x,[o("Mirillis Action!"),r(t)]),o(":高帧率录制游戏,自动分割视频,自定义叠加元素,但输入帧率不能自由调整,最低只能 15 帧,试用期 30 天。")]),e("li",null,[e("a",k,[o("oCam"),r(t)]),o(":打着免费招牌但有弹窗广告,且输出视频偏大。")]),e("li",null,[e("a",v,[o("ShareX"),r(t)]),o(":免费开源强大的截图软件,具备录屏功能,能调节编码和帧率,但只能单一录屏或录像。")])]),w,e("ol",null,[e("li",null,[e("p",null,[o("下载最新版 "),e("a",C,[o("FFmpeg"),r(t)]),o(",Windows 环境选择 "),B,o(",GPL 版本包含了所有依赖项。")])]),S]),A,y,M,e("p",null,[o("FFmpeg 的录制命令 gdigrab 不支持音频录制,也不支持直接调用摄像头,此时需使用开源的 "),e("a",z,[o("screen-capture-recorder-to-video-windows-free"),r(t)]),o(" 增强 FFmpeg 的录制功能,其最新版本为 0.12.12。")]),D,e("ul",null,[e("li",null,[E,o(" 使用 FFmpeg 内置的 Windows 屏幕录制命令 "),e("a",P,[o("gdigrab"),r(t)]),o(",录制对象可为全屏、指定范围和指定程序。MacOS 录屏方法为 "),e("a",L,[o("AVFoundation"),r(t)]),o(",Linux 录屏方法为 "),e("a",W,[o("x11grab"),r(t)]),o("。")]),R]),U,e("p",null,[o("报错 "),V,o(",解决方案参考 "),e("a",H,[o("issue 136"),r(t)]),o("。尽管我仍然遇到了这个错误,但它并未影响录屏的效果。")]),O,e("p",null,[o("前几天,群里有人分享了快速生成 FFmpeg 命令的工具 "),e("a",N,[o("FFmpeg.guide"),r(t)]),o("。本以为能帮新手快速入门,使用后却感觉不实用。FFmpeg 最快入门的方法还是得看官方文档,也有一些爱好者整理翻译了相关的中文/视频教程。前期会耗费一些时间,但只要定制好自己要的命令,之后就能一直使用。")]),q,e("p",null,[o("本文于「"),e("a",I,[o("少数派首发"),r(t)]),o("」。")]),j,e("section",G,[e("ol",T,[e("li",Y,[e("p",null,[e("a",J,[o("ffmpeg 录屏命令"),r(t)]),o(),K])]),e("li",X,[e("p",null,[e("a",Q,[o("ffmpeg 基础使用"),r(t)]),o(),Z])]),e("li",$,[e("p",null,[e("a",ee,[o("libx265 编码说明"),r(t)]),o(),oe])]),e("li",te,[e("p",null,[e("a",re,[o("x265 的 preset 与编码速度、视频画质以及比特率的关联"),r(t)]),o(),ne])]),e("li",ae,[e("p",null,[e("a",se,[o("FFmpeg 音视频倍速控制"),r(t)]),o(),ie])]),e("li",de,[e("p",null,[e("a",le,[o("FFmpeg 中 overlay 滤镜用法 - 水印及画中画"),r(t)]),o(),ce])]),e("li",fe,[e("p",null,[e("a",pe,[o("ffmpeg 调整缩放裁剪视频的基础知识 (转)"),r(t)]),o(),he])])])])])}const Fe=a(l,[["render",_e],["__file","2022-11-03-ffmpeg_screen_recording.html.vue"]]);export{Fe as default}; diff --git a/assets/2023-01-26-whiteboard_gtd.html-231fa5a2.js b/assets/2023-01-26-whiteboard_gtd.html-e1f12218.js similarity index 99% rename from assets/2023-01-26-whiteboard_gtd.html-231fa5a2.js rename to assets/2023-01-26-whiteboard_gtd.html-e1f12218.js index efeaa198..a2ef9d74 100644 --- a/assets/2023-01-26-whiteboard_gtd.html-231fa5a2.js +++ b/assets/2023-01-26-whiteboard_gtd.html-e1f12218.js @@ -1 +1 @@ -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as i,e}from"./app-98132e77.js";const r={},d=e('

        摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 GTD 补充记录方案。

        在数字化和网络化的时代,日常记录从纸质转移到电子存储,它带来了无限的容量和随时随地使用的便利。然而,这也带来了新的问题:如果没有打开应用程序,记录就无法提醒,容易忘记重要事情。即使设置了定时提醒,提醒时间也不一定是最佳处理时间,因此可能会延迟或取消,从而导致遗忘。为了解决这个问题,我使用白板墙贴来记录生活/工作清单。

        Website Creator Cartoon
        源图:Storyset

        为什么是白板?

        在中学时,我没有电脑和手机,就曾把最初的 GTD 记录在玻璃桌面上,若记录失效或不再需要,只需擦掉即可。白板墙贴与当时的玻璃桌面效果类似,只是换到墙上了。我在书房和走廊各贴了一块白板,书房的墙贴用来提醒当天要做什么,走廊的墙贴用来提醒日常生活仪式。无论走到哪里,都不会错过重要提醒。特别是在不确定下一步该做什么时,我只要转身,就能看到工作清单,非常直观和便捷。

        透明/白色静电墙贴

        与电子记录相比,白板没有软件框架限制。它可以用于绘制思维导图,帮助人们更清晰地组织思路;也可以用多种颜色的记号笔随意书写和涂鸦,以原始的方式表达自己的想法。因此,白板是记录、展示信息和思考的极佳工具。

        Scrum board
        Scrum board

        白板类型

        白板墙贴源自 @chen 在群里分享的一个很棒的主意:使用静电墙贴作为白板,可以随时记录。在尝试的过程中,我更换了三种材质:透明静电墙贴、白色静电墙贴和 PVC 墙贴(吸磁软白板贴)。

        类型透明/白板静电墙贴PVC 墙贴(非静电)支架式白板
        优点安装方便;轻松固定在墙上;费用低。磁吸;字迹擦拭方便;
        黑色、白色、绿色、黛灰等多种背景可供选择。
        双面书写;易写易擦;可吸附性;可自由升降;可 360° 翻转;带刹车滑轮。
        缺点字迹在 24 小时后会在墙贴上留下凸起的痕迹;红色、蓝色等非黑色笔迹很难擦干净。需要使用双面胶固定;难以将其平整地贴在墙上。安装麻烦,无法贴上墙,占地方。
        费用20 元(120cm x 200cm)160 元(120cm x 200cm)280 元(100cm x 200cm)

        我的方案

        在我的方案中,记录的想法分为日常仪式和生活/工作两类。日常仪式记录在走廊白板上,生活/工作记录则输出在书房白板上。下面我将简要介绍白板内容和思路。

        记录输入流

        书房白板

        我最常待的地方是书房,所以把日常记录都放在书房白板上,用来记录当日清单、锻炼进度、思维导图、项目跟进和临时安排。书房白板使用率较高,因此建议使用易写易擦的 PVC 墙贴(吸磁软白板贴)。

        书房白板

        在白板上半部分,我放置了经常查看的目标,这也是视线的第一触达点;而下半部分则用于日常书写和记录,以便转身就能记录即时想法。

        PVC 墙贴(非静电)

        走廊白板

        走廊白板是对书房白板的补充,可以在书房之外的区域提醒生活仪式等内容,例如:每天早上喝杯热水自测体脂,晚上进行当日回顾和睡前准备。走廊白板擦写频率较低,可以使用便宜的静电墙贴。如果需要修改走廊白板的提示,可以用纸巾沾水擦拭。

        走廊白板

        电子记录

        使用白板墙贴记录 GTD 并不意味着放弃数字化记录。相反,我可以将白板墙贴与电子记录结合起来,使用电子记录来存储详细信息,而使用白板墙贴来提醒重要事项。在「当日检视」的环节中,我会同步书房白板和电子 GTD,以确保两者的内容保持一致。这样,我就可以在保持良好的效率和组织性的同时,还可以提高记录的可靠性和可追溯性。

        更多

        如果您选择了 PVC 墙贴方案,请注意不要使用洗洁精、酒精或湿纸巾擦拭白板,否则可能会损害白板,导致后续难以彻底清洁。

        通过使用白板墙贴记录 GTD,我发现它不仅可以帮助我更好地管理时间和任务,还可以提高工作效率。因为白板墙贴是实体物品,我可以随时随地看到它,而且它是直观的,使我一目了然地了解自己的任务和进度。此外,白板墙贴可以随时更新和修改,让我可以随时调整计划和任务。白板工具填补了笔记/清单应用和个人定制需求之间的空隙。

        ',27),p=[d];function n(o,g){return a(),i("div",null,p)}const f=t(r,[["render",n],["__file","2023-01-26-whiteboard_gtd.html.vue"]]);export{f as default}; +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as i,e}from"./app-91ee3df5.js";const r={},d=e('

        摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 GTD 补充记录方案。

        在数字化和网络化的时代,日常记录从纸质转移到电子存储,它带来了无限的容量和随时随地使用的便利。然而,这也带来了新的问题:如果没有打开应用程序,记录就无法提醒,容易忘记重要事情。即使设置了定时提醒,提醒时间也不一定是最佳处理时间,因此可能会延迟或取消,从而导致遗忘。为了解决这个问题,我使用白板墙贴来记录生活/工作清单。

        Website Creator Cartoon
        源图:Storyset

        为什么是白板?

        在中学时,我没有电脑和手机,就曾把最初的 GTD 记录在玻璃桌面上,若记录失效或不再需要,只需擦掉即可。白板墙贴与当时的玻璃桌面效果类似,只是换到墙上了。我在书房和走廊各贴了一块白板,书房的墙贴用来提醒当天要做什么,走廊的墙贴用来提醒日常生活仪式。无论走到哪里,都不会错过重要提醒。特别是在不确定下一步该做什么时,我只要转身,就能看到工作清单,非常直观和便捷。

        透明/白色静电墙贴

        与电子记录相比,白板没有软件框架限制。它可以用于绘制思维导图,帮助人们更清晰地组织思路;也可以用多种颜色的记号笔随意书写和涂鸦,以原始的方式表达自己的想法。因此,白板是记录、展示信息和思考的极佳工具。

        Scrum board
        Scrum board

        白板类型

        白板墙贴源自 @chen 在群里分享的一个很棒的主意:使用静电墙贴作为白板,可以随时记录。在尝试的过程中,我更换了三种材质:透明静电墙贴、白色静电墙贴和 PVC 墙贴(吸磁软白板贴)。

        类型透明/白板静电墙贴PVC 墙贴(非静电)支架式白板
        优点安装方便;轻松固定在墙上;费用低。磁吸;字迹擦拭方便;
        黑色、白色、绿色、黛灰等多种背景可供选择。
        双面书写;易写易擦;可吸附性;可自由升降;可 360° 翻转;带刹车滑轮。
        缺点字迹在 24 小时后会在墙贴上留下凸起的痕迹;红色、蓝色等非黑色笔迹很难擦干净。需要使用双面胶固定;难以将其平整地贴在墙上。安装麻烦,无法贴上墙,占地方。
        费用20 元(120cm x 200cm)160 元(120cm x 200cm)280 元(100cm x 200cm)

        我的方案

        在我的方案中,记录的想法分为日常仪式和生活/工作两类。日常仪式记录在走廊白板上,生活/工作记录则输出在书房白板上。下面我将简要介绍白板内容和思路。

        记录输入流

        书房白板

        我最常待的地方是书房,所以把日常记录都放在书房白板上,用来记录当日清单、锻炼进度、思维导图、项目跟进和临时安排。书房白板使用率较高,因此建议使用易写易擦的 PVC 墙贴(吸磁软白板贴)。

        书房白板

        在白板上半部分,我放置了经常查看的目标,这也是视线的第一触达点;而下半部分则用于日常书写和记录,以便转身就能记录即时想法。

        PVC 墙贴(非静电)

        走廊白板

        走廊白板是对书房白板的补充,可以在书房之外的区域提醒生活仪式等内容,例如:每天早上喝杯热水自测体脂,晚上进行当日回顾和睡前准备。走廊白板擦写频率较低,可以使用便宜的静电墙贴。如果需要修改走廊白板的提示,可以用纸巾沾水擦拭。

        走廊白板

        电子记录

        使用白板墙贴记录 GTD 并不意味着放弃数字化记录。相反,我可以将白板墙贴与电子记录结合起来,使用电子记录来存储详细信息,而使用白板墙贴来提醒重要事项。在「当日检视」的环节中,我会同步书房白板和电子 GTD,以确保两者的内容保持一致。这样,我就可以在保持良好的效率和组织性的同时,还可以提高记录的可靠性和可追溯性。

        更多

        如果您选择了 PVC 墙贴方案,请注意不要使用洗洁精、酒精或湿纸巾擦拭白板,否则可能会损害白板,导致后续难以彻底清洁。

        通过使用白板墙贴记录 GTD,我发现它不仅可以帮助我更好地管理时间和任务,还可以提高工作效率。因为白板墙贴是实体物品,我可以随时随地看到它,而且它是直观的,使我一目了然地了解自己的任务和进度。此外,白板墙贴可以随时更新和修改,让我可以随时调整计划和任务。白板工具填补了笔记/清单应用和个人定制需求之间的空隙。

        ',27),p=[d];function n(o,g){return a(),i("div",null,p)}const f=t(r,[["render",n],["__file","2023-01-26-whiteboard_gtd.html.vue"]]);export{f as default}; diff --git a/assets/2023-09-05-virtual_positioning.html-9ed76263.js b/assets/2023-09-05-virtual_positioning.html-207d330d.js similarity index 98% rename from assets/2023-09-05-virtual_positioning.html-9ed76263.js rename to assets/2023-09-05-virtual_positioning.html-207d330d.js index 5293b123..49c9671e 100644 --- a/assets/2023-09-05-virtual_positioning.html-9ed76263.js +++ b/assets/2023-09-05-virtual_positioning.html-207d330d.js @@ -1 +1 @@ -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as e,e as t}from"./app-98132e77.js";const r={},n=t('

        这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。

        家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗?

        虚拟定位

        1. 首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器为例,但其他模拟器的操作也相似。

        2. 在模拟器中打开要修改定位的应用,点击应用的定位图标。

        3. 选择「地图定位」,点击你想设定的地点。当提示「设置该坐标点为当前位置?」后,点击确定,返回至微信界面,即可看到虚拟定位已启用。

        4. 更改定位后,为了确认位置是否准确,建议你在应用内使用位置服务进行检查。例如,如果想要核实微信上的位置,你可以尝试给「文件传输助手」发送位置信息。

        常见问题

        无法虚拟定位

        如果你已经按照上述步骤进行设置,但仍然不能虚拟定位,这可能是由于模拟器没有正确获取位置信息。为了验证这一点,你可以在模拟器中的微信应用里,给好友发送实时位置分享,看是否能正确显示。

        手机修改定位

        我曾尝试在手机上使用如 fakegps 这样的工具来修改位置,但只有高德地图更改成功,其他都失败了。据了解,这可能与 Android 10 或更高版本的系统有关。如果你使用的是 Android 9 或更早版本的手机,你或许可以尝试使用旧版本的微信来更改定位。

        关于虚拟签到

        虽然企业微信、钉钉等打卡软件也可用此法签到,但请勿滥用。有记者曾在三家价格分别为 5 元、10 元、20 元的网店购买更改定位服务,结果发现这些商家仅是远程登录客户的微信账号,然后使用特定工具修改定位,操作流程与上文所述类似。

        ',11),o=[n];function p(d,c){return a(),e("div",null,o)}const s=i(r,[["render",p],["__file","2023-09-05-virtual_positioning.html.vue"]]);export{s as default}; +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as e,e as t}from"./app-91ee3df5.js";const r={},n=t('

        这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。

        家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗?

        虚拟定位

        1. 首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器为例,但其他模拟器的操作也相似。

        2. 在模拟器中打开要修改定位的应用,点击应用的定位图标。

        3. 选择「地图定位」,点击你想设定的地点。当提示「设置该坐标点为当前位置?」后,点击确定,返回至微信界面,即可看到虚拟定位已启用。

        4. 更改定位后,为了确认位置是否准确,建议你在应用内使用位置服务进行检查。例如,如果想要核实微信上的位置,你可以尝试给「文件传输助手」发送位置信息。

        常见问题

        无法虚拟定位

        如果你已经按照上述步骤进行设置,但仍然不能虚拟定位,这可能是由于模拟器没有正确获取位置信息。为了验证这一点,你可以在模拟器中的微信应用里,给好友发送实时位置分享,看是否能正确显示。

        手机修改定位

        我曾尝试在手机上使用如 fakegps 这样的工具来修改位置,但只有高德地图更改成功,其他都失败了。据了解,这可能与 Android 10 或更高版本的系统有关。如果你使用的是 Android 9 或更早版本的手机,你或许可以尝试使用旧版本的微信来更改定位。

        关于虚拟签到

        虽然企业微信、钉钉等打卡软件也可用此法签到,但请勿滥用。有记者曾在三家价格分别为 5 元、10 元、20 元的网店购买更改定位服务,结果发现这些商家仅是远程登录客户的微信账号,然后使用特定工具修改定位,操作流程与上文所述类似。

        ',11),o=[n];function p(d,c){return a(),e("div",null,o)}const s=i(r,[["render",p],["__file","2023-09-05-virtual_positioning.html.vue"]]);export{s as default}; diff --git a/assets/2023-10-07-clone-voice.html-f30f240f.js b/assets/2023-10-07-clone-voice.html-6e673596.js similarity index 99% rename from assets/2023-10-07-clone-voice.html-f30f240f.js rename to assets/2023-10-07-clone-voice.html-6e673596.js index e65cb358..1198b38c 100644 --- a/assets/2023-10-07-clone-voice.html-f30f240f.js +++ b/assets/2023-10-07-clone-voice.html-6e673596.js @@ -1,4 +1,4 @@ -import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as l,c,d as a,a as e,b as n,e as t}from"./app-98132e77.js";const h={},d=e("p",null,"每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。",-1),p=e("p",null,"你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声音已经在众多影视作品中被重复使用。与之不同,AI 克隆技术能提供前所未有的个性化和定制体验。",-1),_=e("p",null,"艾什莉的播客就是一个典型例子,她利用 AI 生成了根据当日新闻热点定制的讲稿,再用 AI 克隆的自己的声音进行朗读,配上背景音乐,既经济又高效。",-1),u={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning",target:"_blank",rel:"noopener noreferrer"},g=e("h2",{id:"收集语音样本",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#收集语音样本","aria-hidden":"true"},"#"),n(" 收集语音样本")],-1),f=e("p",null,[n("克隆声音的第一步是准备自己的声音样本。确保录音中只有你的声音,且语音清晰、语速均匀。录音完成后,需检查 "),e("code",null,"final_annotation"),n(" 等 txt 文件的音频转写情况,确认停顿和文字是否正确。")],-1),m=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2023-10-08-21-53-46.png?imageMogr2/format/webp/thumbnail/400x",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),b={href:"https://weixinxcxdb.oss-cn-beijing.aliyuncs.com/gwYinPinKu/BZNSYP.rar",target:"_blank",rel:"noopener noreferrer"},v=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2023-10-11-10-22-27.png?imageMogr2/format/webp/thumbnail/400x",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),k=e("h2",{id:"云端训练模型",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#云端训练模型","aria-hidden":"true"},"#"),n(" 云端训练模型")],-1),x={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning/blob/main/README_ZH.md",target:"_blank",rel:"noopener noreferrer"},y={href:"https://colab.research.google.com/drive/1pn1xnFfdLK63gVXDwV4zCXfVeo8c-I-0?usp=sharing",target:"_blank",rel:"noopener noreferrer"},T=e("code",null,"max_epochs",-1),C=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2023-10-07-07-37-52.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),w=e("p",null,"我曾在 Colab 上用 8 分钟的 B 站视频进行训练,但三小时后由于超出免费额度被终止。后来我在配备了 3080Ti 的本地设备上进行训练,4 小时后便完成了调试。",-1),P=e("h2",{id:"本地训练模型",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#本地训练模型","aria-hidden":"true"},"#"),n(" 本地训练模型")],-1),V={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning/blob/main/LOCAL.md",target:"_blank",rel:"noopener noreferrer"},j={href:"https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/",target:"_blank",rel:"noopener noreferrer"},I=e("code",null,"pip install --upgrade numpy",-1),z={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/sampled_audio4ft_v2.zip",target:"_blank",rel:"noopener noreferrer"},S=e("p",null,"第 7 步 (下载模型与配置):",-1),D={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/D_0.pth",target:"_blank",rel:"noopener noreferrer"},L={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/G_0.pth",target:"_blank",rel:"noopener noreferrer"},E={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/config.json",target:"_blank",rel:"noopener noreferrer"},G={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/D_0-p.pth",target:"_blank",rel:"noopener noreferrer"},M={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/G_0-p.pth",target:"_blank",rel:"noopener noreferrer"},O={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/config.json",target:"_blank",rel:"noopener noreferrer"},U={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/pretrained_models/D_trilingual.pth",target:"_blank",rel:"noopener noreferrer"},A={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/pretrained_models/G_trilingual.pth",target:"_blank",rel:"noopener noreferrer"},B={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/configs/uma_trilingual.json",target:"_blank",rel:"noopener noreferrer"},N=t("
      44. 选择上方一种模型进行下载。完成下载后,将 G 模型重命名为 G_0.pth,将 D 模型重命名为 D_0.pth,并将配置文件 .json 重命名为 finetune_speaker.jsonG_0.pthD_0.pth 放入 pretrained_models 目录,finetune_speaker.json 放入 config 目录。特别注意,要保证 json 文件是直接下载而非复制粘贴,以防后续步骤中打开 inference 出现问题。
      45. ",1),F={href:"http://LOCAL.md",target:"_blank",rel:"noopener noreferrer"},H=t(`
      46. 第 9 步:运行以下命令:

        python scripts/video2audio.py
        +import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as l,c,d as a,a as e,b as n,e as t}from"./app-91ee3df5.js";const h={},d=e("p",null,"每个人的声音都是独一无二的,克隆自己的声音可以用于制作高度个性化的内容,如播客、视频、音乐等。",-1),p=e("p",null,"你的声音是个人品牌的重要组成部分。利用人工智能,你可以不需要亲自录音就能生成大量优质音频内容,节省时间的同时确保内容质量和一致性。市场上虽有众多第三方语音生成技术,但它们大多数使用通用或他人的声音,导致内容缺乏个性化特质。例如,「注意看,这个男人叫小帅」的声音已经在众多影视作品中被重复使用。与之不同,AI 克隆技术能提供前所未有的个性化和定制体验。",-1),_=e("p",null,"艾什莉的播客就是一个典型例子,她利用 AI 生成了根据当日新闻热点定制的讲稿,再用 AI 克隆的自己的声音进行朗读,配上背景音乐,既经济又高效。",-1),u={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning",target:"_blank",rel:"noopener noreferrer"},g=e("h2",{id:"收集语音样本",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#收集语音样本","aria-hidden":"true"},"#"),n(" 收集语音样本")],-1),f=e("p",null,[n("克隆声音的第一步是准备自己的声音样本。确保录音中只有你的声音,且语音清晰、语速均匀。录音完成后,需检查 "),e("code",null,"final_annotation"),n(" 等 txt 文件的音频转写情况,确认停顿和文字是否正确。")],-1),m=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2023-10-08-21-53-46.png?imageMogr2/format/webp/thumbnail/400x",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),b={href:"https://weixinxcxdb.oss-cn-beijing.aliyuncs.com/gwYinPinKu/BZNSYP.rar",target:"_blank",rel:"noopener noreferrer"},v=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2023-10-11-10-22-27.png?imageMogr2/format/webp/thumbnail/400x",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),k=e("h2",{id:"云端训练模型",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#云端训练模型","aria-hidden":"true"},"#"),n(" 云端训练模型")],-1),x={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning/blob/main/README_ZH.md",target:"_blank",rel:"noopener noreferrer"},y={href:"https://colab.research.google.com/drive/1pn1xnFfdLK63gVXDwV4zCXfVeo8c-I-0?usp=sharing",target:"_blank",rel:"noopener noreferrer"},T=e("code",null,"max_epochs",-1),C=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2023-10-07-07-37-52.png?imageMogr2/format/webp",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption")],-1),w=e("p",null,"我曾在 Colab 上用 8 分钟的 B 站视频进行训练,但三小时后由于超出免费额度被终止。后来我在配备了 3080Ti 的本地设备上进行训练,4 小时后便完成了调试。",-1),P=e("h2",{id:"本地训练模型",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#本地训练模型","aria-hidden":"true"},"#"),n(" 本地训练模型")],-1),V={href:"https://github.com/Plachtaa/VITS-fast-fine-tuning/blob/main/LOCAL.md",target:"_blank",rel:"noopener noreferrer"},j={href:"https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/",target:"_blank",rel:"noopener noreferrer"},I=e("code",null,"pip install --upgrade numpy",-1),z={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/sampled_audio4ft_v2.zip",target:"_blank",rel:"noopener noreferrer"},S=e("p",null,"第 7 步 (下载模型与配置):",-1),D={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/D_0.pth",target:"_blank",rel:"noopener noreferrer"},L={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/G_0.pth",target:"_blank",rel:"noopener noreferrer"},E={href:"https://huggingface.co/datasets/Plachta/sampled_audio4ft/resolve/main/VITS-Chinese/config.json",target:"_blank",rel:"noopener noreferrer"},G={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/D_0-p.pth",target:"_blank",rel:"noopener noreferrer"},M={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/G_0-p.pth",target:"_blank",rel:"noopener noreferrer"},O={href:"https://huggingface.co/spaces/sayashi/vits-uma-genshin-honkai/resolve/main/model/config.json",target:"_blank",rel:"noopener noreferrer"},U={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/pretrained_models/D_trilingual.pth",target:"_blank",rel:"noopener noreferrer"},A={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/pretrained_models/G_trilingual.pth",target:"_blank",rel:"noopener noreferrer"},B={href:"https://huggingface.co/spaces/Plachta/VITS-Umamusume-voice-synthesizer/resolve/main/configs/uma_trilingual.json",target:"_blank",rel:"noopener noreferrer"},N=t("
      47. 选择上方一种模型进行下载。完成下载后,将 G 模型重命名为 G_0.pth,将 D 模型重命名为 D_0.pth,并将配置文件 .json 重命名为 finetune_speaker.jsonG_0.pthD_0.pth 放入 pretrained_models 目录,finetune_speaker.json 放入 config 目录。特别注意,要保证 json 文件是直接下载而非复制粘贴,以防后续步骤中打开 inference 出现问题。
      48. ",1),F={href:"http://LOCAL.md",target:"_blank",rel:"noopener noreferrer"},H=t(`
      49. 第 9 步:运行以下命令:

        python scripts/video2audio.py
         python scripts/denoise_audio.py
         
         python scripts/long_audio_transcribe.py --languages C --whisper_size large-v2
        diff --git a/assets/2023-10-29-switch-firmware-updates.html-cc747634.js b/assets/2023-10-29-switch-firmware-updates.html-d29af532.js
        similarity index 98%
        rename from assets/2023-10-29-switch-firmware-updates.html-cc747634.js
        rename to assets/2023-10-29-switch-firmware-updates.html-d29af532.js
        index 1d6a6d45..1483626a 100644
        --- a/assets/2023-10-29-switch-firmware-updates.html-cc747634.js
        +++ b/assets/2023-10-29-switch-firmware-updates.html-d29af532.js
        @@ -1 +1 @@
        -import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as l,c as i,a as e,b as t,d as n,e as r}from"./app-98132e77.js";const h={},d=e("p",null,"家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。",-1),c=e("p",null,"注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最新的版本,也就是 17。",-1),_=e("p",null,"以下是我进行升级的步骤:",-1),u=e("h2",{id:"更新注入器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#更新注入器","aria-hidden":"true"},"#"),t(" 更新注入器")],-1),p=e("p",null,"首先,我需要更新注入器,我使用的是 ns-ATMOSPHERE 注入器,它看起来像一个白色的 USB 设备。由于注入器的版本低于 Hekate 4.2,所以我需要更新 payload。",-1),f={href:"https://www.mediafire.com/file/av2yur8zse5h016/Setup+NS-Atmosphere+programmer+v0.3.exe/file",target:"_blank",rel:"noopener noreferrer"},m={href:"https://gbatemp.net/attachments/ns-atmosphere-v0-4-rar.274028/",target:"_blank",rel:"noopener noreferrer"},S=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote1"},"[1]"),e("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),b=e("li",null,[e("p",null,"打开 ns-ATMOSPHERE 的 ON 按钮,双击 RST 按钮,然后使用 USB 连接到 PC 端。此时 ns-ATMOSPHERE 将亮起粉灯。如果未出现粉灯,表示未被识别,可以尝试更换 USB 端口或重新尝试之前的操作。")],-1),w={href:"https://github.com/CTCaer/hekate/releases",target:"_blank",rel:"noopener noreferrer"},g=e("code",null,"hekate_ctcaer_6.0.7_Nyx_1.5.6.zip",-1),k=e("code",null,"hekate_ctcaer_6.0.7.bin",-1),B={href:"https://www.twitch.tv/videos/346892592",target:"_blank",rel:"noopener noreferrer"},T={href:"https://www.cnblogs.com/letleon/p/NS_Atmosphere_payload_Programmer_aliyundrive_backup.html",target:"_blank",rel:"noopener noreferrer"},M=e("h2",{id:"大气层-主机升级",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#大气层-主机升级","aria-hidden":"true"},"#"),t(" 大气层&主机升级")],-1),A=e("h3",{id:"固件准备",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#固件准备","aria-hidden":"true"},"#"),t(" 固件准备")],-1),C={href:"https://github.com/Yuanbanba/Atmosphere/releases",target:"_blank",rel:"noopener noreferrer"},D={href:"https://darthsternie.net/switch-firmwares/",target:"_blank",rel:"noopener noreferrer"},N=e("h3",{id:"升级流程",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#升级流程","aria-hidden":"true"},"#"),t(" 升级流程")],-1),I=e("li",null,"关机后,取出后盖板上的 SD 卡,并将其连接到计算机。",-1),R=e("li",null,"在 SD 卡的根目录保留可能存在的 emuMMC 和 nintendo 文件夹,其他文件全部删除。(如果你有补丁或金手指,请务必自行备份。)",-1),x=e("li",null,"复制大气层文件和解压后的离线升级固件到 SD 卡的根目录。",-1),E=e("code",null,"虚拟(破解)系统",-1),P={href:"https://switch.homebrew.guide/emummc/emummc.html",target:"_blank",rel:"noopener noreferrer"},v=e("li",null,"最后,进入系统后,打开「相册」,启动 daybreak 插件,然后选择安装离线固件包。随后全部选择右侧的选项并按下 A,安装完成后重启系统即完成升级。",-1),y=r('

        进入大气层系统

        1. 在关机状态下,拆下右侧手柄(红色手柄)。如果已经开机,长按电源键约 8 秒,选择关闭电源。
        2. 将短接器插入右侧手柄的空槽中,确保插到底。
        3. 打开注入器的开关,等到灯亮起后插入 ns 的充电口。
        4. 按住音量键 +,然后按下电源键,稍等片刻,大气层界面将会出现,此时可以拔下盒子和短接器,然后接上右手柄。
        5. 大气层系统中点击「启动」,选择第二个选项 - 虚拟(破解)系统。

        安装游戏

        DBI

        ',4),F={href:"https://nswtl.info/switch-eng/games.html",target:"_blank",rel:"noopener noreferrer"},U=r("
        1. 使用 USB 将 Switch 连接到 PC。
        2. 进入「相册」,启动 DBI,按 X 来运行 Run MTP Responder。此时,PC 端将出现 Switch 设备。
        3. 打开 PC 上出现的 Switch 设备,根据你想安装游戏的位置,将游戏复制到 5: SD Card install6: NAND install
        4. 安装结束后,按 B 停止 MTP 服务器并卸载 MTP 设备,然后再按 B 关闭 DBI。

        如果你安装的是需要网络登录的游戏,例如《Just Dance 2023》,请确保按照游戏包中提供的离线激活提示进行操作。在安装前,需将离线激活和 Mod 文件移出安装包,以避免出现 not acceptable 的错误提示。

        ",2),L={href:"https://github.com/rashevskyv/dbi/blob/main/README_ENG.md",target:"_blank",rel:"noopener noreferrer"},O=e("h3",{id:"ns-usbloader",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ns-usbloader","aria-hidden":"true"},"#"),t(" NS-USBloader")],-1),G={href:"https://github.com/developersu/ns-usbloader",target:"_blank",rel:"noopener noreferrer"},H=e("p",null,"然而,在安装游戏前,你需要在 NS-USBloader 的左侧,点击设置按钮,然后选择右侧的「下载并安装驱动程序」。如果不执行此步,Switch 可能会提示 USB 设备不兼容。",-1),W=e("h2",{id:"游戏资源",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#游戏资源","aria-hidden":"true"},"#"),t(" 游戏资源")],-1),z={href:"https://nswtl.info/",target:"_blank",rel:"noopener noreferrer"},V={href:"https://www.3dmgame.com/games/ns_all_1/",target:"_blank",rel:"noopener noreferrer"},j=e("code",null,"1: SD Card\\atmosphere\\contents",-1),Y=e("code",null,"L",-1),J=e("code",null,"L",-1),K={href:"https://www.gamer520.com/jinshouzhi",target:"_blank",rel:"noopener noreferrer"},X=e("p",null,"部分游戏列表:",-1),Z=e("ul",null,[e("li",null,"健身游戏:舞力全开(Just Dance),有氧拳击 2(Fitness Boxing 2),健身拳击:北斗神拳(Fitness Boxing - Fist of the North Star),健身环大冒险(Ring Fit Adventure),健身巡游(Fitness Circuit),Nintendo Switch Sports。"),e("li",null,"Mario 系列:超级马里奥兄弟:惊奇(Super Mario Bros. Wonder),马里奥派对:超级巨星(Mario Party Superstars),马里奥和疯狂兔子:星耀之愿(Mario plus Rabbids - Sparks of Hope)。"),e("li",null,"休闲游戏:世界游戏大全 51(Clubhouse Games 51 Worldwide Classics),太鼓达人(Taiko no Tatsujin),胡闹厨房(Overcooked),大富翁 11。"),e("li",null,"动作冒险:双人成行(It Takes Two),荒野大镖客:救赎(Red Dead: Redemption),塞尔达传说:旷野之息(The Legend of Zelda - Breath of the Wild),女神异闻录 5(Persona 5 Royal),十三机兵防卫圈(13 Sentinels Aegis Rim),AI 梦境档案(AI The Somnium Files)。"),e("li",null,"格斗游戏:真人快打 1(Mortal Kombat 1),IGS 经典街机合集(IGS Classic Arcade Collection)。"),e("li",null,"竞技游戏:FIFA 23,NBA 2K24,曼岛 TT 赛:边缘竞速 3(TT Isle Of Man: Ride on the Edge 3)。"),e("li",null,"真人影视互动:春逝百年抄(The Centennial Case: a Shijima Story),十个约会(Ten Dates)。")],-1),q=e("hr",{class:"footnotes-sep"},null,-1),Q={class:"footnotes"},$={class:"footnotes-list"},ee={id:"footnote1",class:"footnote-item"},te={href:"https://gbatemp.net/threads/ns-atmosphere-software-mirror.571116/",target:"_blank",rel:"noopener noreferrer"},oe=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function ne(re,se){const o=a("ExternalLinkIcon");return l(),i("div",null,[d,c,_,u,p,e("ol",null,[e("li",null,[e("p",null,[t("在 Windows 系统上安装 NS-Atmosphere Programmer。由于该应用的开发商已经跑路,我在 GBATEMP 论坛上找到两个版本,可以自行选择:"),e("a",f,[t("0.3 STEUP"),n(o)]),t(","),e("a",m,[t("0.4 Protable"),n(o)]),t("。"),S])]),b,e("li",null,[e("p",null,[t("打开下载好的 NS-Atmosphere Programmer,点击 Refresh 来识别端口,然后点击 Browse 选择需要注入的 payload bin。在这里使用的是 "),e("a",w,[t("hekate"),n(o)]),t(",从其发布页面下载最新版本的 "),g,t(",然后解压得到 "),k,t(",这就是要注入的 bin。")])])]),e("p",null,[t("如果有不清楚的地方,你可以观看 "),e("a",B,[t("NS Atmosphere Dongle Tutorial!"),n(o)]),t(" 这个视频教程,或者查看这篇更详细的"),e("a",T,[t("注入器更新教程"),n(o)]),t("。")]),M,A,e("p",null,[t("接下来,我需要准备大气层和主机的升级。我使用了 "),e("a",C,[t("Yuanbanba/Atmosphere"),n(o)]),t(" 这个整合包,其中包含了大气层的迷你版本、Tesla 插件包以及相册 NRO 软件包,非常适合懒人使用。")]),e("p",null,[t("至于 Switch 最新的离线升级固件,我在 "),e("a",D,[t("Switch Firmwares"),n(o)]),t(" 上找到了。需要注意的是,这些固件分为全球版和国行版,建议选择全球版。")]),N,e("ol",null,[I,R,x,e("li",null,[t("如果你有 emuMMC 文件夹,则选择启动 "),E,t(";如果没有,则参考 "),e("a",P,[t("Create an emuMMC"),n(o)]),t(" 教程创建 emuMMC 虚拟系统。请注意,创建 emuMMC 虚拟系统将占据 SD 卡 29G 的空间,并清空和重新分区 SD 卡,创建后需重新复制大气层文件和固件。")]),v]),y,e("p",null,[t("关于大气层安装游戏和 DLC 的方法,请参考 "),e("a",F,[t("Installation of games, DLC, updates"),n(o)]),t(":")]),U,e("p",null,[t("DBI 是大气层增强包的内置插件。如果不使用增强包,你也可以手动安装 DBI,具体流程请参考 "),e("a",L,[t("DBI 安装及使用说明"),n(o)]),t("。")]),O,e("p",null,[t("如果你不喜欢 DBI 的界面,也可以使用 Awoo Installer 通过 "),e("a",G,[t("NS-USBloader"),n(o)]),t(" 来安装 Switch 游戏。")]),H,W,e("p",null,[t("游戏资源可在 "),e("a",z,[t("SWITCH TORRENT LIBRARY"),n(o)]),t(" 上获取。这是最大且免费的游戏库,适用于 Nintendo Switch 和其他平台。在测试中,我找到了所有需要的游戏。")]),e("p",null,[t("点击页面上的标题区域,将跳转至 Telegram Bot。向机器人发送游戏的英文名称,机器人将回复游戏的种子文件和版本说明。游戏的英文名称可以在 "),e("a",V,[t("3DMGAME Switch 专区"),n(o)]),t("中查找。")]),e("p",null,[t("如果需要金手指,可以在 DBI 游戏安装的第三步将金手指文件复制到 "),j,t(" 文件夹中。然后,进入相册,打开 Edizon,按下 "),Y,t(" 键进入系统模块管理,开启 Tesla 插件。在需要开启金手指的游戏中,按住 "),J,t(" 键再按向下方向键,即可激活金手指菜单。金手指资源见 "),e("a",K,[t("Switch520"),n(o)]),t("。")]),X,Z,q,e("section",Q,[e("ol",$,[e("li",ee,[e("p",null,[e("a",te,[t("NS Atmosphere Software Mirror"),n(o)]),t(),oe])])])])])}const ie=s(h,[["render",ne],["__file","2023-10-29-switch-firmware-updates.html.vue"]]);export{ie as default}; +import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as l,c as i,a as e,b as t,d as n,e as r}from"./app-91ee3df5.js";const h={},d=e("p",null,"家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。",-1),c=e("p",null,"注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最新的版本,也就是 17。",-1),_=e("p",null,"以下是我进行升级的步骤:",-1),u=e("h2",{id:"更新注入器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#更新注入器","aria-hidden":"true"},"#"),t(" 更新注入器")],-1),p=e("p",null,"首先,我需要更新注入器,我使用的是 ns-ATMOSPHERE 注入器,它看起来像一个白色的 USB 设备。由于注入器的版本低于 Hekate 4.2,所以我需要更新 payload。",-1),f={href:"https://www.mediafire.com/file/av2yur8zse5h016/Setup+NS-Atmosphere+programmer+v0.3.exe/file",target:"_blank",rel:"noopener noreferrer"},m={href:"https://gbatemp.net/attachments/ns-atmosphere-v0-4-rar.274028/",target:"_blank",rel:"noopener noreferrer"},S=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote1"},"[1]"),e("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),b=e("li",null,[e("p",null,"打开 ns-ATMOSPHERE 的 ON 按钮,双击 RST 按钮,然后使用 USB 连接到 PC 端。此时 ns-ATMOSPHERE 将亮起粉灯。如果未出现粉灯,表示未被识别,可以尝试更换 USB 端口或重新尝试之前的操作。")],-1),w={href:"https://github.com/CTCaer/hekate/releases",target:"_blank",rel:"noopener noreferrer"},g=e("code",null,"hekate_ctcaer_6.0.7_Nyx_1.5.6.zip",-1),k=e("code",null,"hekate_ctcaer_6.0.7.bin",-1),B={href:"https://www.twitch.tv/videos/346892592",target:"_blank",rel:"noopener noreferrer"},T={href:"https://www.cnblogs.com/letleon/p/NS_Atmosphere_payload_Programmer_aliyundrive_backup.html",target:"_blank",rel:"noopener noreferrer"},M=e("h2",{id:"大气层-主机升级",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#大气层-主机升级","aria-hidden":"true"},"#"),t(" 大气层&主机升级")],-1),A=e("h3",{id:"固件准备",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#固件准备","aria-hidden":"true"},"#"),t(" 固件准备")],-1),C={href:"https://github.com/Yuanbanba/Atmosphere/releases",target:"_blank",rel:"noopener noreferrer"},D={href:"https://darthsternie.net/switch-firmwares/",target:"_blank",rel:"noopener noreferrer"},N=e("h3",{id:"升级流程",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#升级流程","aria-hidden":"true"},"#"),t(" 升级流程")],-1),I=e("li",null,"关机后,取出后盖板上的 SD 卡,并将其连接到计算机。",-1),R=e("li",null,"在 SD 卡的根目录保留可能存在的 emuMMC 和 nintendo 文件夹,其他文件全部删除。(如果你有补丁或金手指,请务必自行备份。)",-1),x=e("li",null,"复制大气层文件和解压后的离线升级固件到 SD 卡的根目录。",-1),E=e("code",null,"虚拟(破解)系统",-1),P={href:"https://switch.homebrew.guide/emummc/emummc.html",target:"_blank",rel:"noopener noreferrer"},v=e("li",null,"最后,进入系统后,打开「相册」,启动 daybreak 插件,然后选择安装离线固件包。随后全部选择右侧的选项并按下 A,安装完成后重启系统即完成升级。",-1),y=r('

        进入大气层系统

        1. 在关机状态下,拆下右侧手柄(红色手柄)。如果已经开机,长按电源键约 8 秒,选择关闭电源。
        2. 将短接器插入右侧手柄的空槽中,确保插到底。
        3. 打开注入器的开关,等到灯亮起后插入 ns 的充电口。
        4. 按住音量键 +,然后按下电源键,稍等片刻,大气层界面将会出现,此时可以拔下盒子和短接器,然后接上右手柄。
        5. 大气层系统中点击「启动」,选择第二个选项 - 虚拟(破解)系统。

        安装游戏

        DBI

        ',4),F={href:"https://nswtl.info/switch-eng/games.html",target:"_blank",rel:"noopener noreferrer"},U=r("
        1. 使用 USB 将 Switch 连接到 PC。
        2. 进入「相册」,启动 DBI,按 X 来运行 Run MTP Responder。此时,PC 端将出现 Switch 设备。
        3. 打开 PC 上出现的 Switch 设备,根据你想安装游戏的位置,将游戏复制到 5: SD Card install6: NAND install
        4. 安装结束后,按 B 停止 MTP 服务器并卸载 MTP 设备,然后再按 B 关闭 DBI。

        如果你安装的是需要网络登录的游戏,例如《Just Dance 2023》,请确保按照游戏包中提供的离线激活提示进行操作。在安装前,需将离线激活和 Mod 文件移出安装包,以避免出现 not acceptable 的错误提示。

        ",2),L={href:"https://github.com/rashevskyv/dbi/blob/main/README_ENG.md",target:"_blank",rel:"noopener noreferrer"},O=e("h3",{id:"ns-usbloader",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ns-usbloader","aria-hidden":"true"},"#"),t(" NS-USBloader")],-1),G={href:"https://github.com/developersu/ns-usbloader",target:"_blank",rel:"noopener noreferrer"},H=e("p",null,"然而,在安装游戏前,你需要在 NS-USBloader 的左侧,点击设置按钮,然后选择右侧的「下载并安装驱动程序」。如果不执行此步,Switch 可能会提示 USB 设备不兼容。",-1),W=e("h2",{id:"游戏资源",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#游戏资源","aria-hidden":"true"},"#"),t(" 游戏资源")],-1),z={href:"https://nswtl.info/",target:"_blank",rel:"noopener noreferrer"},V={href:"https://www.3dmgame.com/games/ns_all_1/",target:"_blank",rel:"noopener noreferrer"},j=e("code",null,"1: SD Card\\atmosphere\\contents",-1),Y=e("code",null,"L",-1),J=e("code",null,"L",-1),K={href:"https://www.gamer520.com/jinshouzhi",target:"_blank",rel:"noopener noreferrer"},X=e("p",null,"部分游戏列表:",-1),Z=e("ul",null,[e("li",null,"健身游戏:舞力全开(Just Dance),有氧拳击 2(Fitness Boxing 2),健身拳击:北斗神拳(Fitness Boxing - Fist of the North Star),健身环大冒险(Ring Fit Adventure),健身巡游(Fitness Circuit),Nintendo Switch Sports。"),e("li",null,"Mario 系列:超级马里奥兄弟:惊奇(Super Mario Bros. Wonder),马里奥派对:超级巨星(Mario Party Superstars),马里奥和疯狂兔子:星耀之愿(Mario plus Rabbids - Sparks of Hope)。"),e("li",null,"休闲游戏:世界游戏大全 51(Clubhouse Games 51 Worldwide Classics),太鼓达人(Taiko no Tatsujin),胡闹厨房(Overcooked),大富翁 11。"),e("li",null,"动作冒险:双人成行(It Takes Two),荒野大镖客:救赎(Red Dead: Redemption),塞尔达传说:旷野之息(The Legend of Zelda - Breath of the Wild),女神异闻录 5(Persona 5 Royal),十三机兵防卫圈(13 Sentinels Aegis Rim),AI 梦境档案(AI The Somnium Files)。"),e("li",null,"格斗游戏:真人快打 1(Mortal Kombat 1),IGS 经典街机合集(IGS Classic Arcade Collection)。"),e("li",null,"竞技游戏:FIFA 23,NBA 2K24,曼岛 TT 赛:边缘竞速 3(TT Isle Of Man: Ride on the Edge 3)。"),e("li",null,"真人影视互动:春逝百年抄(The Centennial Case: a Shijima Story),十个约会(Ten Dates)。")],-1),q=e("hr",{class:"footnotes-sep"},null,-1),Q={class:"footnotes"},$={class:"footnotes-list"},ee={id:"footnote1",class:"footnote-item"},te={href:"https://gbatemp.net/threads/ns-atmosphere-software-mirror.571116/",target:"_blank",rel:"noopener noreferrer"},oe=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function ne(re,se){const o=a("ExternalLinkIcon");return l(),i("div",null,[d,c,_,u,p,e("ol",null,[e("li",null,[e("p",null,[t("在 Windows 系统上安装 NS-Atmosphere Programmer。由于该应用的开发商已经跑路,我在 GBATEMP 论坛上找到两个版本,可以自行选择:"),e("a",f,[t("0.3 STEUP"),n(o)]),t(","),e("a",m,[t("0.4 Protable"),n(o)]),t("。"),S])]),b,e("li",null,[e("p",null,[t("打开下载好的 NS-Atmosphere Programmer,点击 Refresh 来识别端口,然后点击 Browse 选择需要注入的 payload bin。在这里使用的是 "),e("a",w,[t("hekate"),n(o)]),t(",从其发布页面下载最新版本的 "),g,t(",然后解压得到 "),k,t(",这就是要注入的 bin。")])])]),e("p",null,[t("如果有不清楚的地方,你可以观看 "),e("a",B,[t("NS Atmosphere Dongle Tutorial!"),n(o)]),t(" 这个视频教程,或者查看这篇更详细的"),e("a",T,[t("注入器更新教程"),n(o)]),t("。")]),M,A,e("p",null,[t("接下来,我需要准备大气层和主机的升级。我使用了 "),e("a",C,[t("Yuanbanba/Atmosphere"),n(o)]),t(" 这个整合包,其中包含了大气层的迷你版本、Tesla 插件包以及相册 NRO 软件包,非常适合懒人使用。")]),e("p",null,[t("至于 Switch 最新的离线升级固件,我在 "),e("a",D,[t("Switch Firmwares"),n(o)]),t(" 上找到了。需要注意的是,这些固件分为全球版和国行版,建议选择全球版。")]),N,e("ol",null,[I,R,x,e("li",null,[t("如果你有 emuMMC 文件夹,则选择启动 "),E,t(";如果没有,则参考 "),e("a",P,[t("Create an emuMMC"),n(o)]),t(" 教程创建 emuMMC 虚拟系统。请注意,创建 emuMMC 虚拟系统将占据 SD 卡 29G 的空间,并清空和重新分区 SD 卡,创建后需重新复制大气层文件和固件。")]),v]),y,e("p",null,[t("关于大气层安装游戏和 DLC 的方法,请参考 "),e("a",F,[t("Installation of games, DLC, updates"),n(o)]),t(":")]),U,e("p",null,[t("DBI 是大气层增强包的内置插件。如果不使用增强包,你也可以手动安装 DBI,具体流程请参考 "),e("a",L,[t("DBI 安装及使用说明"),n(o)]),t("。")]),O,e("p",null,[t("如果你不喜欢 DBI 的界面,也可以使用 Awoo Installer 通过 "),e("a",G,[t("NS-USBloader"),n(o)]),t(" 来安装 Switch 游戏。")]),H,W,e("p",null,[t("游戏资源可在 "),e("a",z,[t("SWITCH TORRENT LIBRARY"),n(o)]),t(" 上获取。这是最大且免费的游戏库,适用于 Nintendo Switch 和其他平台。在测试中,我找到了所有需要的游戏。")]),e("p",null,[t("点击页面上的标题区域,将跳转至 Telegram Bot。向机器人发送游戏的英文名称,机器人将回复游戏的种子文件和版本说明。游戏的英文名称可以在 "),e("a",V,[t("3DMGAME Switch 专区"),n(o)]),t("中查找。")]),e("p",null,[t("如果需要金手指,可以在 DBI 游戏安装的第三步将金手指文件复制到 "),j,t(" 文件夹中。然后,进入相册,打开 Edizon,按下 "),Y,t(" 键进入系统模块管理,开启 Tesla 插件。在需要开启金手指的游戏中,按住 "),J,t(" 键再按向下方向键,即可激活金手指菜单。金手指资源见 "),e("a",K,[t("Switch520"),n(o)]),t("。")]),X,Z,q,e("section",Q,[e("ol",$,[e("li",ee,[e("p",null,[e("a",te,[t("NS Atmosphere Software Mirror"),n(o)]),t(),oe])])])])])}const ie=s(h,[["render",ne],["__file","2023-10-29-switch-firmware-updates.html.vue"]]);export{ie as default}; diff --git a/assets/2023-12-12-eu.org-free-domain.html-f7601d31.js b/assets/2023-12-12-eu.org-free-domain.html-222ae98a.js similarity index 97% rename from assets/2023-12-12-eu.org-free-domain.html-f7601d31.js rename to assets/2023-12-12-eu.org-free-domain.html-222ae98a.js index 6b776554..9faf5173 100644 --- a/assets/2023-12-12-eu.org-free-domain.html-f7601d31.js +++ b/assets/2023-12-12-eu.org-free-domain.html-222ae98a.js @@ -1 +1 @@ -import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as i,c as a,a as e,b as o,d as t,e as s}from"./app-98132e77.js";const c="/img/eu.org-freedomain.jpg",d={},_={id:"如何免费白嫖域名-获取永久免费顶级域名-eu-org",tabindex:"-1"},h=e("a",{class:"header-anchor",href:"#如何免费白嫖域名-获取永久免费顶级域名-eu-org","aria-hidden":"true"},"#",-1),u={href:"http://xn--3iqt7euxcmgr8o520b470adqi9qv9vz.eu.org",target:"_blank",rel:"noopener noreferrer"},g=s('

        介绍

        欢迎阅读本教程,本文将详细介绍如何通过免费域名服务.eu.org获取永久免费的顶级域名。.eu.org域名服务成立于1996年,旨在为无力支付高额域名费用的用户和非盈利组织提供免费、不限量的顶级域名,有效期至少延长到2030年。

        看效果:

        步骤一:注册账号

        ',5),p={href:"https://nic.eu.org/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://nic.eu.org/arf/en/contact/create/",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,[o("在注册页面中填写以下信息: "),e("ul",null,[e("li",null,"Name:填写英文名字,建议使用真实姓名。"),e("li",null,"E-mail:填写常用邮箱,用于接收申请通知。建议使用Gmail或Outlook,避免使用QQ邮箱。"),e("li",null,"地址:填写英文地址,按照从小到大的顺序填写。地址的准确性不是很重要,但也不要填写明显错误的地址。"),e("li",null,"Country:选择所在国家,如实选择即可。"),e("li",null,"Phone和Fax:可选择不填。"),e("li",null,"勾选Private选项:保护个人信息,避免被WHOIS查询到。"),e("li",null,"勾选accept the domain policy。"),e("li",null,"输入密码并确认。")])],-1),x=e("h2",{id:"步骤二-激活账号",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#步骤二-激活账号","aria-hidden":"true"},"#"),o(" 步骤二:激活账号")],-1),b={href:"http://EU.org",target:"_blank",rel:"noopener noreferrer"},k=e("li",null,"使用分配给你的用户名和刚刚设置的密码登录。",-1),N=e("h2",{id:"步骤三-申请新域名",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#步骤三-申请新域名","aria-hidden":"true"},"#"),o(" 步骤三:申请新域名")],-1),D=e("li",null,"登录后,你将看到个人主页,上面是你的用户名,下面是你持有的域名列表(如果是新用户,则列表为空)。",-1),S=e("li",null,"点击“New Domain”按钮,申请一个新域名。",-1),E={href:"http://xn--example-ff6kt45e.eu.org",target:"_blank",rel:"noopener noreferrer"},v=e("li",null,"Organization栏一般不需要修改,保持之前注册时填写的信息即可。",-1),P=e("li",null,"Administrative contact是域名的管理联系人,默认为自己,申请成功后可以转让给其他用户。",-1),C=e("li",null,"Technical contact是域名的技术联系人,默认为自己,也可以填写其他人的ID或注册一个新账号。",-1),I=e("li",null,"域名服务器设置:由于.eu.org组织不提供DNS服务,你需要选择其他DNS服务提供商。下面以DNSPod为例进行说明。",-1),O=e("h2",{id:"步骤四-设置域名服务器-以dnspod为例",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#步骤四-设置域名服务器-以dnspod为例","aria-hidden":"true"},"#"),o(" 步骤四:设置域名服务器(以DNSPod为例)")],-1),V=e("li",null,"在申请页上选择“Check for correctness of server names”选项(第一个选项)。",-1),X={href:"https://console.dnspod.cn/dns/list",target:"_blank",rel:"noopener noreferrer"},q=e("li",null,"在控制台的“我的域名”中,找到你要设置的域名。",-1),y=e("li",null,"在域名列表中点击该域名,进入域名详情页。",-1),z=e("li",null,"在域名详情页中,找到“DNS设置”或类似选项。",-1),B=e("li",null,"根据.eu.org的要求,设置域名服务器。DNSPod会进行简单的验证,无需进行SOA验证。",-1),F=e("li",null,"完成域名服务器设置后,返回.eu.org申请页面,继续提交申请。",-1),w=e("p",null,"恭喜!你已经完成了免费获取永久免费顶级域名.eu.org的申请流程。",-1),A=e("p",null,"请注意,.eu.org域名的审核周期可能较长,可能需要数个月的时间。申请通过后,你将拥有一个永久免费的顶级域名,可用于个人或非盈利组织的网站搭建等用途。",-1),L=e("p",null,"最后附小编的域名list, 请耐心等待哦!",-1);function Q(T,U){const n=r("ExternalLinkIcon");return i(),a("div",null,[e("h1",_,[h,o(" 如何免费白嫖域名:"),e("a",u,[o("获取永久免费顶级域名.eu.org"),t(n)])]),g,e("ol",null,[e("li",null,[o("打开"),e("a",p,[o("eu.org官网"),t(n)]),o(",点击注册链接:"),e("a",f,[o("https://nic.eu.org/arf/en/contact/create/"),t(n)])]),m]),x,e("ol",null,[e("li",null,[o("注册成功后,你将收到一封主题为“new "),e("a",b,[o("EU.org"),t(n)]),o(" contact XXXX-FREE”的邮件,点击邮件中的激活链接。")]),k]),N,e("ol",null,[D,S,e("li",null,[o("在“Complete domain name”栏中填入你想要申请的完整域名,需要包含.eu.org后缀,"),e("a",E,[o("例如example.eu.org"),t(n)]),o("。")]),v,P,C,I]),O,e("ol",null,[V,e("li",null,[o("登录"),e("a",X,[o("DNSPod控制台"),t(n)]),o("。")]),q,y,z,B,F]),w,A,L])}const H=l(d,[["render",Q],["__file","2023-12-12-eu.org-free-domain.html.vue"]]);export{H as default}; +import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as i,c as a,a as e,b as o,d as t,e as s}from"./app-91ee3df5.js";const c="/img/eu.org-freedomain.jpg",d={},_={id:"如何免费白嫖域名-获取永久免费顶级域名-eu-org",tabindex:"-1"},h=e("a",{class:"header-anchor",href:"#如何免费白嫖域名-获取永久免费顶级域名-eu-org","aria-hidden":"true"},"#",-1),u={href:"http://xn--3iqt7euxcmgr8o520b470adqi9qv9vz.eu.org",target:"_blank",rel:"noopener noreferrer"},g=s('

        介绍

        欢迎阅读本教程,本文将详细介绍如何通过免费域名服务.eu.org获取永久免费的顶级域名。.eu.org域名服务成立于1996年,旨在为无力支付高额域名费用的用户和非盈利组织提供免费、不限量的顶级域名,有效期至少延长到2030年。

        看效果:

        步骤一:注册账号

        ',5),p={href:"https://nic.eu.org/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://nic.eu.org/arf/en/contact/create/",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,[o("在注册页面中填写以下信息: "),e("ul",null,[e("li",null,"Name:填写英文名字,建议使用真实姓名。"),e("li",null,"E-mail:填写常用邮箱,用于接收申请通知。建议使用Gmail或Outlook,避免使用QQ邮箱。"),e("li",null,"地址:填写英文地址,按照从小到大的顺序填写。地址的准确性不是很重要,但也不要填写明显错误的地址。"),e("li",null,"Country:选择所在国家,如实选择即可。"),e("li",null,"Phone和Fax:可选择不填。"),e("li",null,"勾选Private选项:保护个人信息,避免被WHOIS查询到。"),e("li",null,"勾选accept the domain policy。"),e("li",null,"输入密码并确认。")])],-1),x=e("h2",{id:"步骤二-激活账号",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#步骤二-激活账号","aria-hidden":"true"},"#"),o(" 步骤二:激活账号")],-1),b={href:"http://EU.org",target:"_blank",rel:"noopener noreferrer"},k=e("li",null,"使用分配给你的用户名和刚刚设置的密码登录。",-1),N=e("h2",{id:"步骤三-申请新域名",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#步骤三-申请新域名","aria-hidden":"true"},"#"),o(" 步骤三:申请新域名")],-1),D=e("li",null,"登录后,你将看到个人主页,上面是你的用户名,下面是你持有的域名列表(如果是新用户,则列表为空)。",-1),S=e("li",null,"点击“New Domain”按钮,申请一个新域名。",-1),E={href:"http://xn--example-ff6kt45e.eu.org",target:"_blank",rel:"noopener noreferrer"},v=e("li",null,"Organization栏一般不需要修改,保持之前注册时填写的信息即可。",-1),P=e("li",null,"Administrative contact是域名的管理联系人,默认为自己,申请成功后可以转让给其他用户。",-1),C=e("li",null,"Technical contact是域名的技术联系人,默认为自己,也可以填写其他人的ID或注册一个新账号。",-1),I=e("li",null,"域名服务器设置:由于.eu.org组织不提供DNS服务,你需要选择其他DNS服务提供商。下面以DNSPod为例进行说明。",-1),O=e("h2",{id:"步骤四-设置域名服务器-以dnspod为例",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#步骤四-设置域名服务器-以dnspod为例","aria-hidden":"true"},"#"),o(" 步骤四:设置域名服务器(以DNSPod为例)")],-1),V=e("li",null,"在申请页上选择“Check for correctness of server names”选项(第一个选项)。",-1),X={href:"https://console.dnspod.cn/dns/list",target:"_blank",rel:"noopener noreferrer"},q=e("li",null,"在控制台的“我的域名”中,找到你要设置的域名。",-1),y=e("li",null,"在域名列表中点击该域名,进入域名详情页。",-1),z=e("li",null,"在域名详情页中,找到“DNS设置”或类似选项。",-1),B=e("li",null,"根据.eu.org的要求,设置域名服务器。DNSPod会进行简单的验证,无需进行SOA验证。",-1),F=e("li",null,"完成域名服务器设置后,返回.eu.org申请页面,继续提交申请。",-1),w=e("p",null,"恭喜!你已经完成了免费获取永久免费顶级域名.eu.org的申请流程。",-1),A=e("p",null,"请注意,.eu.org域名的审核周期可能较长,可能需要数个月的时间。申请通过后,你将拥有一个永久免费的顶级域名,可用于个人或非盈利组织的网站搭建等用途。",-1),L=e("p",null,"最后附小编的域名list, 请耐心等待哦!",-1);function Q(T,U){const n=r("ExternalLinkIcon");return i(),a("div",null,[e("h1",_,[h,o(" 如何免费白嫖域名:"),e("a",u,[o("获取永久免费顶级域名.eu.org"),t(n)])]),g,e("ol",null,[e("li",null,[o("打开"),e("a",p,[o("eu.org官网"),t(n)]),o(",点击注册链接:"),e("a",f,[o("https://nic.eu.org/arf/en/contact/create/"),t(n)])]),m]),x,e("ol",null,[e("li",null,[o("注册成功后,你将收到一封主题为“new "),e("a",b,[o("EU.org"),t(n)]),o(" contact XXXX-FREE”的邮件,点击邮件中的激活链接。")]),k]),N,e("ol",null,[D,S,e("li",null,[o("在“Complete domain name”栏中填入你想要申请的完整域名,需要包含.eu.org后缀,"),e("a",E,[o("例如example.eu.org"),t(n)]),o("。")]),v,P,C,I]),O,e("ol",null,[V,e("li",null,[o("登录"),e("a",X,[o("DNSPod控制台"),t(n)]),o("。")]),q,y,z,B,F]),w,A,L])}const H=l(d,[["render",Q],["__file","2023-12-12-eu.org-free-domain.html.vue"]]);export{H as default}; diff --git a/assets/2023-12-12-sd-op.html-85f49dd3.js b/assets/2023-12-12-sd-op.html-61766708.js similarity index 98% rename from assets/2023-12-12-sd-op.html-85f49dd3.js rename to assets/2023-12-12-sd-op.html-61766708.js index 6dabcf14..c93d3512 100644 --- a/assets/2023-12-12-sd-op.html-85f49dd3.js +++ b/assets/2023-12-12-sd-op.html-61766708.js @@ -1,4 +1,4 @@ -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as r,c as d,a as e,b as t,d as n,e as a}from"./app-98132e77.js";const l={},c=e("h1",{id:"stable-video-diffusion-安装详细教程-简单界面介绍",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#stable-video-diffusion-安装详细教程-简单界面介绍","aria-hidden":"true"},"#"),t(" stable-video-diffusion 安装详细教程,简单界面介绍")],-1),h=e("figure",null,[e("img",{src:"https://i0.wp.com/jdssl.top/wp-content/uploads/2023/11/3-1.jpg?fit=1024%2C576&ssl=1",alt:"img",tabindex:"0",loading:"lazy"}),e("figcaption",null,"img")],-1),p=e("p",null,"外部视频",-1),u=e("iframe",{class:"elementor-video",frameborder:"0",allowfullscreen:"",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",title:"火爆的AI视频神器,免费安装开源轻量,图片秒变商业级4k高品质视频,好玩很酷!本地安装comfyui使用Stable Video Diffusion最新模型详细教程,ai自动流畅补帧放大视频创作助手",width:"640",height:"360",src:"https://www.youtube.com/embed/K6ryak7x_co?controls=1&rel=0&playsinline=0&modestbranding=0&autoplay=0&enablejsapi=1&origin=https%3A%2F%2Fjdssl.top&widgetid=1",id:"widget2",style:{"box-sizing":"border-box",border:"none","font-size":"13px","font-style":"inherit","font-weight":"inherit",margin:"0px",outline:"0px",padding:"0px","vertical-align":"baseline","max-width":"100%",width:"646.594px","line-height":"1",height:"363.703px",display:"flex","background-color":"rgb(0, 0, 0)"}},null,-1),f={href:"https://www.python.org/downloads/release/python-3100/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe",target:"_blank",rel:"noopener noreferrer"},g={href:"https://git-scm.com/download/win",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/git-for-windows/git/releases/download/v2.43.0.windows.1/Git-2.43.0-64-bit.exe",target:"_blank",rel:"noopener noreferrer"},_={href:"https://replicate.com/stability-ai/stable-video-diffusion?input=form&output=preview",target:"_blank",rel:"noopener noreferrer"},w=e("h5",{id:"模型下载",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#模型下载","aria-hidden":"true"},"#"),t(),e("strong",null,"模型下载:")],-1),v={id:"网址-stable-video-diffusion-img2vid",tabindex:"-1"},y=e("a",{class:"header-anchor",href:"#网址-stable-video-diffusion-img2vid","aria-hidden":"true"},"#",-1),x={href:"https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/tree/main",target:"_blank",rel:"noopener noreferrer"},k={href:"https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/blob/main/svd.safetensors",target:"_blank",rel:"noopener noreferrer"},I={href:"https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/blob/main/svd_image_decoder.safetensors",target:"_blank",rel:"noopener noreferrer"},U=e("h6",{id:"comfy-ui地址",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#comfy-ui地址","aria-hidden":"true"},"#"),t(),e("strong",null,"comfy****UI地址:")],-1),C={href:"https://github.com/comfyanonymous/ComfyUI",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/comfyanonymous/ComfyUI/releases/download/latest/ComfyUI_windows_portable_nvidia_cu121_or_cpu.7z",target:"_blank",rel:"noopener noreferrer"},A=a(`
        下载安装comfyui manager
        git clone https://github.com/ltdrdata/ComfyUI-Manager
        +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as r,c as d,a as e,b as t,d as n,e as a}from"./app-91ee3df5.js";const l={},c=e("h1",{id:"stable-video-diffusion-安装详细教程-简单界面介绍",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#stable-video-diffusion-安装详细教程-简单界面介绍","aria-hidden":"true"},"#"),t(" stable-video-diffusion 安装详细教程,简单界面介绍")],-1),h=e("figure",null,[e("img",{src:"https://i0.wp.com/jdssl.top/wp-content/uploads/2023/11/3-1.jpg?fit=1024%2C576&ssl=1",alt:"img",tabindex:"0",loading:"lazy"}),e("figcaption",null,"img")],-1),p=e("p",null,"外部视频",-1),u=e("iframe",{class:"elementor-video",frameborder:"0",allowfullscreen:"",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",title:"火爆的AI视频神器,免费安装开源轻量,图片秒变商业级4k高品质视频,好玩很酷!本地安装comfyui使用Stable Video Diffusion最新模型详细教程,ai自动流畅补帧放大视频创作助手",width:"640",height:"360",src:"https://www.youtube.com/embed/K6ryak7x_co?controls=1&rel=0&playsinline=0&modestbranding=0&autoplay=0&enablejsapi=1&origin=https%3A%2F%2Fjdssl.top&widgetid=1",id:"widget2",style:{"box-sizing":"border-box",border:"none","font-size":"13px","font-style":"inherit","font-weight":"inherit",margin:"0px",outline:"0px",padding:"0px","vertical-align":"baseline","max-width":"100%",width:"646.594px","line-height":"1",height:"363.703px",display:"flex","background-color":"rgb(0, 0, 0)"}},null,-1),f={href:"https://www.python.org/downloads/release/python-3100/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://www.python.org/ftp/python/3.10.0/python-3.10.0-amd64.exe",target:"_blank",rel:"noopener noreferrer"},g={href:"https://git-scm.com/download/win",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/git-for-windows/git/releases/download/v2.43.0.windows.1/Git-2.43.0-64-bit.exe",target:"_blank",rel:"noopener noreferrer"},_={href:"https://replicate.com/stability-ai/stable-video-diffusion?input=form&output=preview",target:"_blank",rel:"noopener noreferrer"},w=e("h5",{id:"模型下载",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#模型下载","aria-hidden":"true"},"#"),t(),e("strong",null,"模型下载:")],-1),v={id:"网址-stable-video-diffusion-img2vid",tabindex:"-1"},y=e("a",{class:"header-anchor",href:"#网址-stable-video-diffusion-img2vid","aria-hidden":"true"},"#",-1),x={href:"https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/tree/main",target:"_blank",rel:"noopener noreferrer"},k={href:"https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/blob/main/svd.safetensors",target:"_blank",rel:"noopener noreferrer"},I={href:"https://huggingface.co/stabilityai/stable-video-diffusion-img2vid/blob/main/svd_image_decoder.safetensors",target:"_blank",rel:"noopener noreferrer"},U=e("h6",{id:"comfy-ui地址",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#comfy-ui地址","aria-hidden":"true"},"#"),t(),e("strong",null,"comfy****UI地址:")],-1),C={href:"https://github.com/comfyanonymous/ComfyUI",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/comfyanonymous/ComfyUI/releases/download/latest/ComfyUI_windows_portable_nvidia_cu121_or_cpu.7z",target:"_blank",rel:"noopener noreferrer"},A=a(`
        下载安装comfyui manager
        git clone https://github.com/ltdrdata/ComfyUI-Manager
         
        comfyUI-Manager界面地址
        `,3),D={href:"https://github.com/ltdrdata/ComfyUI-Manager",target:"_blank",rel:"noopener noreferrer"},V=a(`
        若开启comfvui后没有manager菜单,重复以上comfvui-manager界面安装方式重新安装。
         

        模型放置文件目录:

        D:\\stable\\new_ComfyUI_windows_portable_nvidia_cu121_or_cpu\\ComfyUI_windows_portable\\ComfyUI\\models\\checkpoints

        Nvidia用户应使用以下命令安装pytorch:
        pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu121
         
        故障排除

        如果出现“未启用CUDA编译的火炬”错误,请使用以下命令卸载火炬:

        pip uninstall torch
        diff --git a/assets/2023-12-13-awesome-selfhosted-cn.html-23fa1920.js b/assets/2023-12-13-awesome-selfhosted-cn.html-efdae3a2.js
        similarity index 99%
        rename from assets/2023-12-13-awesome-selfhosted-cn.html-23fa1920.js
        rename to assets/2023-12-13-awesome-selfhosted-cn.html-efdae3a2.js
        index bb6b40b5..be967723 100644
        --- a/assets/2023-12-13-awesome-selfhosted-cn.html-23fa1920.js
        +++ b/assets/2023-12-13-awesome-selfhosted-cn.html-efdae3a2.js
        @@ -1 +1 @@
        -import{_ as h}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as c,c as d,a as e,b as o,d as r,w as a,f as i,e as n}from"./app-98132e77.js";const _={},u={href:"https://github.com/Kickball/awesome-selfhosted/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/Kickball",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/haiiiiiyun/self-hosted-cn",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/Kickball/awesome-Selfhosted",target:"_blank",rel:"noopener noreferrer"},b=e("p",null,"Selfhosting is the process of locally hosting and managing applications instead of renting from SaaS providers.",-1),m={href:"https://en.wikipedia.org/wiki/Free_software",target:"_blank",rel:"noopener noreferrer"},k={href:"https://en.wikipedia.org/wiki/Network_service",target:"_blank",rel:"noopener noreferrer"},w={href:"https://en.wikipedia.org/wiki/Web_application",target:"_blank",rel:"noopener noreferrer"},P=n('

        See Contributing.

        =================


        ',4),y=e("h2",{id:"分析",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#分析","aria-hidden":"true"},"#"),o(" 分析")],-1),S=e("p",null,[e("em",null,"Web Analytics")],-1),v={href:"http://www.awstats.org/",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/eldy/awstats",target:"_blank",rel:"noopener noreferrer"},A=e("code",null,"GPLv3",-1),L=e("code",null,"Perl",-1),M={href:"https://count.ly",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/countly",target:"_blank",rel:"noopener noreferrer"},x=e("code",null,"AGPLv3",-1),T=e("code",null,"Javascript",-1),I={href:"http://druid.io/",target:"_blank",rel:"noopener noreferrer"},E={href:"https://github.com/druid-io/druid/",target:"_blank",rel:"noopener noreferrer"},D=e("code",null,"Apache",-1),B=e("code",null,"Java",-1),H={href:"http://goaccess.io/",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/allinurl/goaccess",target:"_blank",rel:"noopener noreferrer"},R=e("code",null,"GPLv2",-1),O=e("code",null,"C",-1),F={href:"http://www.openwebanalytics.com/",target:"_blank",rel:"noopener noreferrer"},N={href:"https://github.com/padams/Open-Web-Analytics/",target:"_blank",rel:"noopener noreferrer"},z=e("code",null,"GPLv2",-1),W=e("code",null,"PHP",-1),J={href:"https://piwik.org/",target:"_blank",rel:"noopener noreferrer"},U={href:"https://github.com/piwik/",target:"_blank",rel:"noopener noreferrer"},V=e("code",null,"GPLv3",-1),q=e("code",null,"PHP",-1),K={href:"https://serposcope.serphacker.com/",target:"_blank",rel:"noopener noreferrer"},X={href:"https://github.com/serphacker/serposcope",target:"_blank",rel:"noopener noreferrer"},Y=e("code",null,"MIT",-1),Z=e("code",null,"Java",-1),Q={href:"http://snowplowanalytics.com/",target:"_blank",rel:"noopener noreferrer"},$={href:"https://github.com/snowplow/",target:"_blank",rel:"noopener noreferrer"},ee=e("code",null,"Apache",-1),oe=e("code",null,"Scala",-1),re={href:"https://www.thinkup.com/",target:"_blank",rel:"noopener noreferrer"},te={href:"https://github.com/ThinkUpLLC/ThinkUp",target:"_blank",rel:"noopener noreferrer"},ne=e("code",null,"GPLv3",-1),se=e("code",null,"PHP",-1),le=e("p",null,[e("em",null,"Business Intelligence")],-1),ae={href:"http://www.metabase.com/",target:"_blank",rel:"noopener noreferrer"},ie={href:"https://github.com/metabase/metabase",target:"_blank",rel:"noopener noreferrer"},he=e("code",null,"AGPLv3",-1),ce=e("code",null,"Clojure",-1),de={href:"http://redash.io",target:"_blank",rel:"noopener noreferrer"},_e={href:"https://demo.redash.io",target:"_blank",rel:"noopener noreferrer"},ue={href:"https://github.com/getredash/redash",target:"_blank",rel:"noopener noreferrer"},pe=e("code",null,"BSD",-1),fe=e("code",null,"Python",-1),ge=e("h2",{id:"自动化",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#自动化","aria-hidden":"true"},"#"),o(" 自动化")],-1),be={href:"http://www.alltubedownload.net",target:"_blank",rel:"noopener noreferrer"},me={href:"https://github.com/rg3/youtube-dl",target:"_blank",rel:"noopener noreferrer"},ke={href:"https://rg3.github.io/youtube-dl/supportedsites.html",target:"_blank",rel:"noopener noreferrer"},we={href:"http://www.alltubedownload.net",target:"_blank",rel:"noopener noreferrer"},Pe={href:"https://github.com/Rudloff/alltube",target:"_blank",rel:"noopener noreferrer"},ye=e("code",null,"GPL",-1),Se=e("code",null,"PHP",-1),ve={href:"https://amiunique.org/",target:"_blank",rel:"noopener noreferrer"},Ce={href:"https://github.com/DIVERSIFY-project/amiunique",target:"_blank",rel:"noopener noreferrer"},Ae=e("code",null,"MIT",-1),Le=e("code",null,"Java",-1),Me={href:"https://bip.io/",target:"_blank",rel:"noopener noreferrer"},Ge={href:"https://github.com/bipio-server/bipio",target:"_blank",rel:"noopener noreferrer"},xe=e("code",null,"GPLv3",-1),Te=e("code",null,"Nodejs",-1),Ie={href:"https://couchpota.to/",target:"_blank",rel:"noopener noreferrer"},Ee={href:"https://github.com/CouchPotato/CouchPotatoServer/",target:"_blank",rel:"noopener noreferrer"},De=e("code",null,"GPLv3",-1),Be=e("code",null,"Python",-1),He={href:"https://github.com/rembo10/headphones",target:"_blank",rel:"noopener noreferrer"},je=e("code",null,"GPLv3",-1),Re=e("code",null,"Python",-1),Oe={href:"https://healthchecks.io/",target:"_blank",rel:"noopener noreferrer"},Fe={href:"https://github.com/healthchecks/healthchecks",target:"_blank",rel:"noopener noreferrer"},Ne=e("code",null,"BSD",-1),ze=e("code",null,"Python",-1),We={href:"https://github.com/cantino/huginn",target:"_blank",rel:"noopener noreferrer"},Je=e("code",null,"MIT",-1),Ue=e("code",null,"Ruby",-1),Ve={href:"https://http2pic.haschek.at/",target:"_blank",rel:"noopener noreferrer"},qe={href:"https://github.com/chrisiaut/http2pic",target:"_blank",rel:"noopener noreferrer"},Ke=e("code",null,"Apache 2.0",-1),Xe=e("code",null,"PHP/Javascript",-1),Ye={href:"http://nodered.org/",target:"_blank",rel:"noopener noreferrer"},Ze={href:"https://github.com/node-red/node-red",target:"_blank",rel:"noopener noreferrer"},Qe=e("code",null,"Apache",-1),$e=e("code",null,"Nodejs",-1),eo={href:"http://www.openhab.org",target:"_blank",rel:"noopener noreferrer"},oo={href:"https://github.com/openhab/openhab",target:"_blank",rel:"noopener noreferrer"},ro=e("code",null,"EPLv1",-1),to=e("code",null,"Java",-1),no={href:"https://github.com/sebsauvage/rss-bridge",target:"_blank",rel:"noopener noreferrer"},so=e("code",null,"Public domain",-1),lo=e("code",null,"PHP",-1),ao={href:"http://sickrage.github.io/",target:"_blank",rel:"noopener noreferrer"},io={href:"https://github.com/SickRage/SickRage/",target:"_blank",rel:"noopener noreferrer"},ho=e("code",null,"GPLv3",-1),co=e("code",null,"Python",-1),_o={href:"https://sonarr.tv/",target:"_blank",rel:"noopener noreferrer"},uo={href:"https://github.com/Sonarr/Sonarr",target:"_blank",rel:"noopener noreferrer"},po=e("code",null,"GPLv3",-1),fo=e("code",null,"C#",-1),go={href:"http://trigger-happy.eu/",target:"_blank",rel:"noopener noreferrer"},bo={href:"https://github.com/foxmask/django-th",target:"_blank",rel:"noopener noreferrer"},mo=e("code",null,"BSD",-1),ko=e("code",null,"Python",-1),wo={href:"https://github.com/jchampemont/WTFDYUM",target:"_blank",rel:"noopener noreferrer"},Po={href:"https://www.wtfdyu.me/",target:"_blank",rel:"noopener noreferrer"},yo={href:"https://github.com/jchampemont/WTFDYUM",target:"_blank",rel:"noopener noreferrer"},So=e("code",null,"Apache",-1),vo=e("code",null,"Java",-1),Co={href:"https://s8f.org/zenbot.html",target:"_blank",rel:"noopener noreferrer"},Ao={href:"https://zenbot.s8f.org/",target:"_blank",rel:"noopener noreferrer"},Lo={href:"https://github.com/carlos8f/zenbot",target:"_blank",rel:"noopener noreferrer"},Mo=e("code",null,"MIT",-1),Go=e("code",null,"Node.js",-1),xo=e("h2",{id:"博客平台",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#博客平台","aria-hidden":"true"},"#"),o(" 博客平台")],-1),To=e("a",{href:"#static-site-generators"},"Static Site Generators",-1),Io=e("a",{href:"#content-management-systems-cms"},"Content Management Systems",-1),Eo={href:"http://www.weblogmatrix.org/",target:"_blank",rel:"noopener noreferrer"},Do={href:"https://anchorcms.com/",target:"_blank",rel:"noopener noreferrer"},Bo={href:"https://github.com/anchorcms/anchor-cms",target:"_blank",rel:"noopener noreferrer"},Ho=e("code",null,"GPLv3",-1),jo=e("code",null,"PHP",-1),Ro={href:"https://antville.org",target:"_blank",rel:"noopener noreferrer"},Oo={href:"https://github.com/antville/antville",target:"_blank",rel:"noopener noreferrer"},Fo=e("code",null,"Apache",-1),No=e("code",null,"Javascript",-1),zo={href:"http://lehollandaisvolant.net/blogotext/en/",target:"_blank",rel:"noopener noreferrer"},Wo={href:"https://github.com/timovn/blogotext",target:"_blank",rel:"noopener noreferrer"},Jo=e("code",null,"MIT",-1),Uo=e("code",null,"PHP",-1),Vo={href:"https://github.com/chyrp/chyrp",target:"_blank",rel:"noopener noreferrer"},qo=e("code",null,"MIT",-1),Ko=e("code",null,"PHP",-1),Xo={href:"http://dotclear.org/",target:"_blank",rel:"noopener noreferrer"},Yo={href:"https://hg.dotclear.org/dotclear",target:"_blank",rel:"noopener noreferrer"},Zo=e("code",null,"GPLv2",-1),Qo=e("code",null,"PHP",-1),$o={href:"https://ghost.org/",target:"_blank",rel:"noopener noreferrer"},er={href:"https://github.com/TryGhost/Ghost",target:"_blank",rel:"noopener noreferrer"},or=e("code",null,"MIT",-1),rr=e("code",null,"Nodejs",-1),tr={href:"https://www.htmly.com/",target:"_blank",rel:"noopener noreferrer"},nr={href:"https://www.htmly.com/demo/",target:"_blank",rel:"noopener noreferrer"},sr={href:"https://github.com/danpros/htmly",target:"_blank",rel:"noopener noreferrer"},lr=e("code",null,"GPLv2",-1),ar=e("code",null,"PHP",-1),ir={href:"https://withknown.com/",target:"_blank",rel:"noopener noreferrer"},hr={href:"https://github.com/idno/idno",target:"_blank",rel:"noopener noreferrer"},cr=e("code",null,"Apache",-1),dr=e("code",null,"PHP",-1),_r={href:"http://noddity.com/",target:"_blank",rel:"noopener noreferrer"},ur={href:"https://github.com/TehShrike/noddity",target:"_blank",rel:"noopener noreferrer"},pr=e("code",null,"WTFPL",-1),fr=e("code",null,"Nodejs",-1),gr={href:"http://www.pluxml.org/",target:"_blank",rel:"noopener noreferrer"},br={href:"https://github.com/pluxml/PluXml",target:"_blank",rel:"noopener noreferrer"},mr=e("code",null,"GPL",-1),kr=e("code",null,"PHP",-1),wr={href:"https://www.postleaf.org/",target:"_blank",rel:"noopener noreferrer"},Pr={href:"https://github.com/Postleaf/postleaf",target:"_blank",rel:"noopener noreferrer"},yr=e("code",null,"GPLv3",-1),Sr=e("code",null,"PHP",-1),vr={href:"https://wagtail.io/",target:"_blank",rel:"noopener noreferrer"},Cr={href:"https://github.com/torchbox/wagtail",target:"_blank",rel:"noopener noreferrer"},Ar=e("code",null,"BSD",-1),Lr=e("code",null,"Python",-1),Mr={href:"https://wordpress.org/",target:"_blank",rel:"noopener noreferrer"},Gr={href:"https://github.com/WordPress/WordPress",target:"_blank",rel:"noopener noreferrer"},xr=e("code",null,"GPLv2",-1),Tr=e("code",null,"PHP",-1),Ir=e("h2",{id:"书签-链接共享",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#书签-链接共享","aria-hidden":"true"},"#"),o(" 书签 & 链接共享")],-1),Er={href:"https://github.com/bookieio/Bookie",target:"_blank",rel:"noopener noreferrer"},Dr={href:"http://delicious.com",target:"_blank",rel:"noopener noreferrer"},Br=e("code",null,"AGPLv3",-1),Hr=e("code",null,"Python",-1),jr={href:"https://docs.services.mozilla.com/howtos/run-fxa.html",target:"_blank",rel:"noopener noreferrer"},Rr={href:"https://github.com/mozilla/fxa-auth-server/",target:"_blank",rel:"noopener noreferrer"},Or=e("code",null,"MPLv2",-1),Fr=e("code",null,"Nodejs",-1),Nr={href:"https://docs.services.mozilla.com/howtos/run-fxa.html",target:"_blank",rel:"noopener noreferrer"},zr={href:"https://github.com/mozilla/fxa-content-server/",target:"_blank",rel:"noopener noreferrer"},Wr=e("code",null,"MPLv2",-1),Jr=e("code",null,"Java",-1),Ur={href:"https://docs.services.mozilla.com/howtos/run-sync-1.5.html",target:"_blank",rel:"noopener noreferrer"},Vr={href:"https://github.com/mozilla-services/syncserver",target:"_blank",rel:"noopener noreferrer"},qr=e("code",null,"MPLv2",-1),Kr=e("code",null,"Python",-1),Xr={href:"https://lobste.rs",target:"_blank",rel:"noopener noreferrer"},Yr={href:"https://github.com/jcs/lobsters",target:"_blank",rel:"noopener noreferrer"},Zr=e("code",null,"BSD",-1),Qr=e("code",null,"Ruby",-1),$r={href:"http://nofussbm.herokuapp.com/signup.html",target:"_blank",rel:"noopener noreferrer"},et={href:"https://github.com/mapio/nofussbm",target:"_blank",rel:"noopener noreferrer"},ot=e("code",null,"GPLv3",-1),rt=e("code",null,"Python",-1),tt={href:"http://getpinry.com/",target:"_blank",rel:"noopener noreferrer"},nt={href:"https://github.com/pinry/pinry",target:"_blank",rel:"noopener noreferrer"},st=e("code",null,"BSD",-1),lt=e("code",null,"Python",-1),at={href:"https://saveto.co/",target:"_blank",rel:"noopener noreferrer"},it={href:"https://github.com/saveto-co/saveto",target:"_blank",rel:"noopener noreferrer"},ht=e("code",null,"MIT",-1),ct=e("code",null,"Nodejs",-1),dt={href:"https://github.com/shaarli/Shaarli",target:"_blank",rel:"noopener noreferrer"},_t={href:"http://shaarlidemo.tuxfamily.org/#demo",target:"_blank",rel:"noopener noreferrer"},ut=e("code",null,"Zlib",-1),pt=e("code",null,"PHP",-1),ft={href:"https://unmark.it/",target:"_blank",rel:"noopener noreferrer"},gt={href:"https://github.com/plainmade/unmark",target:"_blank",rel:"noopener noreferrer"},bt=e("code",null,"MIT",-1),mt=e("code",null,"PHP",-1),kt=e("h2",{id:"日历和地址薄",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#日历和地址薄","aria-hidden":"true"},"#"),o(" 日历和地址薄")],-1),wt=e("p",null,[o("Some "),e("a",{href:"#groupware"},"Groupware"),o(" solutions also feature calendar/address book editing and synchronization.")],-1),Pt={href:"http://agendav.org/",target:"_blank",rel:"noopener noreferrer"},yt={href:"https://github.com/adobo/agendav",target:"_blank",rel:"noopener noreferrer"},St=e("code",null,"GPLv3",-1),vt=e("code",null,"PHP",-1),Ct={href:"http://baikal-server.com/",target:"_blank",rel:"noopener noreferrer"},At={href:"https://github.com/fruux/Baikal",target:"_blank",rel:"noopener noreferrer"},Lt=e("code",null,"GPLv3",-1),Mt=e("code",null,"PHP",-1),Gt={href:"http://trac.calendarserver.org/",target:"_blank",rel:"noopener noreferrer"},xt=e("code",null,"Apache",-1),Tt=e("code",null,"Python",-1),It={href:"http://keithp.com/calypso/",target:"_blank",rel:"noopener noreferrer"},Et={href:"http://keithp.com/cgi-bin/gitweb.cgi?p=calypso.git;a=tree",target:"_blank",rel:"noopener noreferrer"},Dt=e("code",null,"GPLv3",-1),Bt=e("code",null,"Python",-1),Ht={href:"http://www.davical.org/",target:"_blank",rel:"noopener noreferrer"},jt={href:"https://gitlab.com/davical-project/davical",target:"_blank",rel:"noopener noreferrer"},Rt=e("code",null,"MIT",-1),Ot=e("code",null,"PHP",-1),Ft={href:"https://doc.owncloud.org/server/9.0/user_manual/pim/calendar.html",target:"_blank",rel:"noopener noreferrer"},Nt={href:"https://github.com/owncloud/calendar-rework",target:"_blank",rel:"noopener noreferrer"},zt=e("code",null,"AGPLv3",-1),Wt=e("code",null,"PHP",-1),Jt={href:"http://radicale.org/",target:"_blank",rel:"noopener noreferrer"},Ut={href:"https://github.com/Kozea/Radicale",target:"_blank",rel:"noopener noreferrer"},Vt=e("code",null,"GPLv3",-1),qt=e("code",null,"Python",-1),Kt={href:"http://sabre.io/",target:"_blank",rel:"noopener noreferrer"},Xt={href:"https://github.com/fruux/sabre-dav",target:"_blank",rel:"noopener noreferrer"},Yt=e("code",null,"MIT",-1),Zt=e("code",null,"PHP",-1),Qt={href:"https://www.inf-it.com/open-source/clients/infcloud/",target:"_blank",rel:"noopener noreferrer"},$t={href:"https://www.inf-it.com/infcloud/",target:"_blank",rel:"noopener noreferrer"},en={href:"https://www.inf-it.com/InfCloud_0.13.1.zip",target:"_blank",rel:"noopener noreferrer"},on=e("code",null,"AGPLv3",-1),rn=e("code",null,"Javascript",-1),tn=e("h2",{id:"通讯系统",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#通讯系统","aria-hidden":"true"},"#"),o(" 通讯系统")],-1),nn=e("h3",{id:"定制",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#定制","aria-hidden":"true"},"#"),o(" 定制")],-1),sn={href:"https://actor.im/",target:"_blank",rel:"noopener noreferrer"},ln={href:"https://app.actor.im",target:"_blank",rel:"noopener noreferrer"},an={href:"https://github.com/actorapp/actor-platform",target:"_blank",rel:"noopener noreferrer"},hn=e("code",null,"AGPLv3",-1),cn=e("code",null,"Scala",-1),dn={href:"https://github.com/rafael-santiago/cherry",target:"_blank",rel:"noopener noreferrer"},_n=e("code",null,"GPLv2",-1),un=e("code",null,"Go",-1),pn={href:"https://freenetproject.org/index.html",target:"_blank",rel:"noopener noreferrer"},fn={href:"https://github.com/freenet/fred",target:"_blank",rel:"noopener noreferrer"},gn=e("code",null,"GPLv2",-1),bn=e("code",null,"Java",-1),mn={href:"http://moose-team.github.io/friends/",target:"_blank",rel:"noopener noreferrer"},kn={href:"https://github.com/moose-team/friends",target:"_blank",rel:"noopener noreferrer"},wn=e("code",null,"MIT",-1),Pn=e("code",null,"Nodejs",-1),yn={href:"https://gnunet.org/",target:"_blank",rel:"noopener noreferrer"},Sn={href:"https://gnunet.org/svn/",target:"_blank",rel:"noopener noreferrer"},vn=e("code",null,"GPLv3",-1),Cn=e("code",null,"C",-1),An={href:"https://jitsi.org/Projects/JitsiMeet",target:"_blank",rel:"noopener noreferrer"},Ln={href:"https://github.com/jitsi/jitsi-meet",target:"_blank",rel:"noopener noreferrer"},Mn=e("code",null,"MIT",-1),Gn=e("code",null,"Javascript",-1),xn={href:"https://jitsi.org/Projects/JitsiVideobridge",target:"_blank",rel:"noopener noreferrer"},Tn={href:"https://github.com/jitsi/jitsi-videobridge",target:"_blank",rel:"noopener noreferrer"},In=e("code",null,"Apache",-1),En=e("code",null,"Java",-1),Dn={href:"http://getkandan.com/",target:"_blank",rel:"noopener noreferrer"},Bn={href:"https://github.com/kandanapp/kandan",target:"_blank",rel:"noopener noreferrer"},Hn=e("code",null,"AGPLv3",-1),jn=e("code",null,"Ruby",-1),Rn={href:"http://sdelements.github.io/lets-chat/",target:"_blank",rel:"noopener noreferrer"},On={href:"https://github.com/sdelements/lets-chat",target:"_blank",rel:"noopener noreferrer"},Fn=e("code",null,"MIT",-1),Nn=e("code",null,"Nodejs",-1),zn={href:"http://livehelperchat.com/",target:"_blank",rel:"noopener noreferrer"},Wn={href:"https://github.com/LiveHelperChat/livehelperchat",target:"_blank",rel:"noopener noreferrer"},Jn=e("code",null,"Apache",-1),Un=e("code",null,"PHP",-1),Vn={href:"http://www.mattermost.org/",target:"_blank",rel:"noopener noreferrer"},qn={href:"https://about.gitlab.com/",target:"_blank",rel:"noopener noreferrer"},Kn={href:"https://github.com/mattermost/platform",target:"_blank",rel:"noopener noreferrer"},Xn=e("code",null,"AGPLv3/Apache",-1),Yn=e("code",null,"Go",-1),Zn={href:"https://mibew.org",target:"_blank",rel:"noopener noreferrer"},Qn={href:"https://mibew.org/demo2",target:"_blank",rel:"noopener noreferrer"},$n={href:"https://github.com/Mibew/mibew",target:"_blank",rel:"noopener noreferrer"},es=e("code",null,"Apache",-1),os=e("code",null,"PHP",-1),rs={href:"http://wiki.mumble.info/wiki/Main_Page",target:"_blank",rel:"noopener noreferrer"},ts={href:"https://github.com/mumble-voip/mumble",target:"_blank",rel:"noopener noreferrer"},ns=e("code",null,"BSD",-1),ss=e("code",null,"C++",-1),ls={href:"https://bitbucket.org/Flandoo/mumblecop",target:"_blank",rel:"noopener noreferrer"},as=e("code",null,"MIT",-1),is=e("code",null,"Ruby",-1),hs={href:"https://github.com/IgorAntun/node-chat",target:"_blank",rel:"noopener noreferrer"},cs=e("code",null,"MIT",-1),ds=e("code",null,"Nodejs",-1),_s={href:"http://retroshare.org",target:"_blank",rel:"noopener noreferrer"},us={href:"https://github.com/RetroShare/RetroShare",target:"_blank",rel:"noopener noreferrer"},ps=e("code",null,"GPLv2",-1),fs=e("code",null,"С++",-1),gs={href:"https://rocket.chat/",target:"_blank",rel:"noopener noreferrer"},bs={href:"http://Gitter.im",target:"_blank",rel:"noopener noreferrer"},ms={href:"https://github.com/RocketChat/Rocket.Chat",target:"_blank",rel:"noopener noreferrer"},ks=e("code",null,"MIT",-1),ws=e("code",null,"Nodejs",-1),Ps={href:"https://matrix.org/blog/project/synapse/",target:"_blank",rel:"noopener noreferrer"},ys={href:"https://matrix.org/",target:"_blank",rel:"noopener noreferrer"},Ss={href:"https://github.com/matrix-org/synapse",target:"_blank",rel:"noopener noreferrer"},vs=e("code",null,"Apache",-1),Cs=e("code",null,"Python",-1),As={href:"https://matrix.org/blog/project/matrix-console-web/",target:"_blank",rel:"noopener noreferrer"},Ls={href:"https://github.com/matrix-org/matrix-angular-sdk",target:"_blank",rel:"noopener noreferrer"},Ms=e("code",null,"Apache",-1),Gs=e("code",null,"Javascript",-1),xs={href:"https://matrix.org/blog/project/vector/",target:"_blank",rel:"noopener noreferrer"},Ts={href:"https://github.com/vector-im/vector-web",target:"_blank",rel:"noopener noreferrer"},Is=e("code",null,"Apache",-1),Es=e("code",null,"Javascript",-1),Ds={href:"https://www.syndie.de",target:"_blank",rel:"noopener noreferrer"},Bs=e("code",null,"CC0",-1),Hs=e("code",null,"Java",-1),js={href:"https://github.com/typpo/textbelt",target:"_blank",rel:"noopener noreferrer"},Rs=e("code",null,"⚠",-1),Os=e("code",null,"MIT",-1),Fs=e("code",null,"Javascript",-1),Ns={href:"https://tox.chat/",target:"_blank",rel:"noopener noreferrer"},zs={href:"https://github.com/irungentoo/toxcore",target:"_blank",rel:"noopener noreferrer"},Ws=e("code",null,"GPLv3",-1),Js=e("code",null,"C",-1),Us={href:"https://blog.trailofbits.com/2015/12/15/self-hosted-video-chat-with-tuber/",target:"_blank",rel:"noopener noreferrer"},Vs={href:"https://github.com/trailofbits/tubertc",target:"_blank",rel:"noopener noreferrer"},qs=e("code",null,"MIT",-1),Ks=e("code",null,"Javascript",-1),Xs={href:"https://zulip.org",target:"_blank",rel:"noopener noreferrer"},Ys={href:"https://github.com/zulip/zulip",target:"_blank",rel:"noopener noreferrer"},Zs=e("code",null,"Apache/Other",-1),Qs=e("code",null,"Python",-1),$s=e("h3",{id:"email",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#email","aria-hidden":"true"},"#"),o(" Email")],-1),el=e("h4",{id:"完整方案",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#完整方案","aria-hidden":"true"},"#"),o(" 完整方案")],-1),ol=e("p",null,[e("em",null,"simple deployment of a mail server, e.g. for inexperienced or impatient admins.")],-1),rl={href:"http://www.citadel.org/",target:"_blank",rel:"noopener noreferrer"},tl={href:"http://code.citadel.org/?p=citadel.git;a=summary",target:"_blank",rel:"noopener noreferrer"},nl=e("code",null,"GPLv3",-1),sl=e("code",null,"C",-1),ll={href:"http://www.iredmail.org/",target:"_blank",rel:"noopener noreferrer"},al={href:"https://bitbucket.org/zhb/iredmail/commits/",target:"_blank",rel:"noopener noreferrer"},il=e("code",null,"GPLv3",-1),hl=e("code",null,"Shell",-1),cl={href:"https://mailcow.email/",target:"_blank",rel:"noopener noreferrer"},dl={href:"https://github.com/andryyy/mailcow",target:"_blank",rel:"noopener noreferrer"},_l=e("code",null,"GPLv2",-1),ul=e("code",null,"PHP",-1),pl={href:"https://mailinabox.email/",target:"_blank",rel:"noopener noreferrer"},fl={href:"https://github.com/mail-in-a-box/mailinabox",target:"_blank",rel:"noopener noreferrer"},gl=e("code",null,"CC0",-1),bl=e("code",null,"Shell",-1),ml={href:"http://modoboa.org/en/",target:"_blank",rel:"noopener noreferrer"},kl={href:"https://github.com/tonioo/modoboa",target:"_blank",rel:"noopener noreferrer"},wl=e("code",null,"MIT",-1),Pl=e("code",null,"Python",-1),yl=e("h4",{id:"邮件传输代理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#邮件传输代理","aria-hidden":"true"},"#"),o(" 邮件传输代理")],-1),Sl=e("p",null,[e("em",null,"MTAs / SMTP servers")],-1),vl={href:"http://www.courier-mta.org/",target:"_blank",rel:"noopener noreferrer"},Cl={href:"http://www.courier-mta.org/repo.html",target:"_blank",rel:"noopener noreferrer"},Al=e("code",null,"GPLv3",-1),Ll=e("code",null,"C",-1),Ml={href:"https://www.exim.org/",target:"_blank",rel:"noopener noreferrer"},Gl={href:"http://git.exim.org/exim.git",target:"_blank",rel:"noopener noreferrer"},xl=e("code",null,"GPLv3",-1),Tl=e("code",null,"C",-1),Il={href:"http://haraka.github.io/",target:"_blank",rel:"noopener noreferrer"},El={href:"https://github.com/haraka/Haraka",target:"_blank",rel:"noopener noreferrer"},Dl=e("code",null,"MIT",-1),Bl=e("code",null,"Javascript",-1),Hl={href:"http://mailcatcher.me/",target:"_blank",rel:"noopener noreferrer"},jl={href:"https://github.com/sj26/mailcatcher",target:"_blank",rel:"noopener noreferrer"},Rl=e("code",null,"MIT",-1),Ol=e("code",null,"Ruby",-1),Fl={href:"https://github.com/m242/maildrop",target:"_blank",rel:"noopener noreferrer"},Nl=e("code",null,"MIT",-1),zl=e("code",null,"Scala",-1),Wl={href:"https://github.com/mailhog/MailHog",target:"_blank",rel:"noopener noreferrer"},Jl=e("code",null,"MIT",-1),Ul=e("code",null,"Go",-1),Vl={href:"https://opensmtpd.org/",target:"_blank",rel:"noopener noreferrer"},ql={href:"http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.sbin/smtpd/",target:"_blank",rel:"noopener noreferrer"},Kl=e("code",null,"ISC",-1),Xl=e("code",null,"C",-1),Yl={href:"http://www.postfix.org/",target:"_blank",rel:"noopener noreferrer"},Zl=e("code",null,"IPL",-1),Ql=e("code",null,"C",-1),$l={href:"http://www.qmail.org/top.html",target:"_blank",rel:"noopener noreferrer"},ea={href:"https://sources.debian.net/src/netqmail/1.06-5/",target:"_blank",rel:"noopener noreferrer"},oa=e("code",null,"CC0",-1),ra=e("code",null,"C",-1),ta={href:"http://www.sendmail.com/sm/open_source/",target:"_blank",rel:"noopener noreferrer"},na=e("code",null,"SENDMAIL",-1),sa=e("code",null,"C",-1),la={href:"http://slimta.org",target:"_blank",rel:"noopener noreferrer"},aa={href:"https://github.com/slimta/python-slimta",target:"_blank",rel:"noopener noreferrer"},ia=e("code",null,"MIT",-1),ha=e("code",null,"Python",-1),ca=e("h4",{id:"邮件发送代理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#邮件发送代理","aria-hidden":"true"},"#"),o(" 邮件发送代理")],-1),da=e("p",null,[e("em",null,"MDAs - IMAP/POP3 software")],-1),_a={href:"http://cyrusimap.org/",target:"_blank",rel:"noopener noreferrer"},ua={href:"https://github.com/cyrusimap/cyrus-imapd",target:"_blank",rel:"noopener noreferrer"},pa=e("code",null,"BSD",-1),fa=e("code",null,"C",-1),ga={href:"http://www.dovecot.org/",target:"_blank",rel:"noopener noreferrer"},ba={href:"https://github.com/dovecot/core",target:"_blank",rel:"noopener noreferrer"},ma=e("code",null,"MIT/LGPLv2",-1),ka=e("code",null,"C",-1),wa={href:"http://www.mailpiler.org/wiki/start",target:"_blank",rel:"noopener noreferrer"},Pa={href:"https://bitbucket.org/jsuto/piler",target:"_blank",rel:"noopener noreferrer"},ya=e("code",null,"GPLv3",-1),Sa=e("code",null,"C",-1),va=e("h4",{id:"邮件列表和时讯",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#邮件列表和时讯","aria-hidden":"true"},"#"),o(" 邮件列表和时讯")],-1),Ca=e("p",null,[e("em",null,"Mailing lists servers and mass mailing software - one message to many recipients.")],-1),Aa={href:"http://dadamailproject.com/",target:"_blank",rel:"noopener noreferrer"},La={href:"https://github.com/justingit/dada-mail",target:"_blank",rel:"noopener noreferrer"},Ma=e("code",null,"GPLv2",-1),Ga=e("code",null,"Perl",-1),xa={href:"https://www.gnu.org/software/mailman/",target:"_blank",rel:"noopener noreferrer"},Ta=e("code",null,"GPL",-1),Ia=e("code",null,"Python",-1),Ea={href:"https://mailtrain.org/",target:"_blank",rel:"noopener noreferrer"},Da={href:"https://github.com/andris9/mailtrain",target:"_blank",rel:"noopener noreferrer"},Ba=e("code",null,"GPLv3",-1),Ha=e("code",null,"Nodejs",-1),ja={href:"https://www.mautic.org/",target:"_blank",rel:"noopener noreferrer"},Ra={href:"https://github.com/mautic/mautic",target:"_blank",rel:"noopener noreferrer"},Oa=e("code",null,"GPLv3",-1),Fa=e("code",null,"PHP",-1),Na={href:"https://phplist.org",target:"_blank",rel:"noopener noreferrer"},za={href:"https://github.com/phpList/",target:"_blank",rel:"noopener noreferrer"},Wa=e("code",null,"AGPLv3",-1),Ja=e("code",null,"PHP",-1),Ua={href:"https://www.sympa.org/",target:"_blank",rel:"noopener noreferrer"},Va=e("code",null,"GPLv2",-1),qa=e("code",null,"Perl",-1),Ka=e("h4",{id:"webmail-客户端",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#webmail-客户端","aria-hidden":"true"},"#"),o(" Webmail 客户端")],-1),Xa={href:"http://cypht.org/index.html",target:"_blank",rel:"noopener noreferrer"},Ya={href:"https://github.com/jasonmunro/hm3",target:"_blank",rel:"noopener noreferrer"},Za=e("code",null,"GPLv2",-1),Qa=e("code",null,"PHP",-1),$a={href:"https://www.mailpile.is/",target:"_blank",rel:"noopener noreferrer"},ei={href:"https://github.com/mailpile/Mailpile",target:"_blank",rel:"noopener noreferrer"},oi=e("code",null,"AGPLv3",-1),ri=e("code",null,"Python",-1),ti={href:"http://www.rainloop.net/",target:"_blank",rel:"noopener noreferrer"},ni={href:"http://demo.rainloop.net/",target:"_blank",rel:"noopener noreferrer"},si={href:"https://github.com/RainLoop/rainloop-webmail",target:"_blank",rel:"noopener noreferrer"},li=e("code",null,"AGPLv3",-1),ai=e("code",null,"PHP",-1),ii={href:"https://roundcube.net",target:"_blank",rel:"noopener noreferrer"},hi={href:"https://roundcube.net/screens/",target:"_blank",rel:"noopener noreferrer"},ci={href:"https://github.com/roundcube/roundcubemail/",target:"_blank",rel:"noopener noreferrer"},di=e("code",null,"GPLv3",-1),_i=e("code",null,"PHP",-1),ui={href:"http://squirrelmail.org",target:"_blank",rel:"noopener noreferrer"},pi={href:"https://sourceforge.net/p/squirrelmail/code/HEAD/tree/",target:"_blank",rel:"noopener noreferrer"},fi=e("code",null,"GPLv2",-1),gi=e("code",null,"PHP",-1),bi={href:"http://www.afterlogic.org/webmail-lite",target:"_blank",rel:"noopener noreferrer"},mi={href:"https://github.com/afterlogic/webmail-lite",target:"_blank",rel:"noopener noreferrer"},ki=e("code",null,"GPLv3",-1),wi=e("code",null,"PHP",-1),Pi=e("h3",{id:"irc",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#irc","aria-hidden":"true"},"#"),o(" IRC")],-1),yi={href:"https://en.wikipedia.org/wiki/Internet_Relay_Chat",target:"_blank",rel:"noopener noreferrer"},Si={href:"http://convos.by/",target:"_blank",rel:"noopener noreferrer"},vi={href:"http://demo.convos.by",target:"_blank",rel:"noopener noreferrer"},Ci={href:"http://github.com/nordaaker/convos",target:"_blank",rel:"noopener noreferrer"},Ai=e("code",null,"ARTv2",-1),Li=e("code",null,"Perl",-1),Mi={href:"http://ircanywhere.com/",target:"_blank",rel:"noopener noreferrer"},Gi={href:"https://github.com/ircanywhere/ircanywhere",target:"_blank",rel:"noopener noreferrer"},xi=e("code",null,"GPLv2",-1),Ti=e("code",null,"Nodejs",-1),Ii={href:"http://quassel-irc.org/",target:"_blank",rel:"noopener noreferrer"},Ei={href:"https://github.com/quassel/quassel",target:"_blank",rel:"noopener noreferrer"},Di=e("code",null,"GPLv2",-1),Bi=e("code",null,"C++",-1),Hi={href:"https://robustirc.net/",target:"_blank",rel:"noopener noreferrer"},ji={href:"https://github.com/robustirc/robustirc",target:"_blank",rel:"noopener noreferrer"},Ri=e("code",null,"BSD",-1),Oi=e("code",null,"Go",-1),Fi={href:"https://thelounge.github.io/",target:"_blank",rel:"noopener noreferrer"},Ni={href:"https://avatar.playat.ch:1000/",target:"_blank",rel:"noopener noreferrer"},zi={href:"https://github.com/thelounge/lounge",target:"_blank",rel:"noopener noreferrer"},Wi=e("code",null,"MIT",-1),Ji=e("code",null,"Nodejs",-1),Ui={href:"https://weechat.org/",target:"_blank",rel:"noopener noreferrer"},Vi=e("code",null,"GPLv3",-1),qi=e("code",null,"C",-1),Ki={href:"http://wiki.znc.in/ZNC",target:"_blank",rel:"noopener noreferrer"},Xi={href:"https://github.com/znc/znc",target:"_blank",rel:"noopener noreferrer"},Yi=e("code",null,"Apache",-1),Zi=e("code",null,"C++",-1),Qi=e("h3",{id:"sip",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#sip","aria-hidden":"true"},"#"),o(" SIP")],-1),$i={href:"https://en.wikipedia.org/wiki/Session_Initiation_Protocol",target:"_blank",rel:"noopener noreferrer"},eh={href:"http://www.asterisk.org/",target:"_blank",rel:"noopener noreferrer"},oh=e("code",null,"GPLv2",-1),rh=e("code",null,"C",-1),th={href:"https://freeswitch.org/",target:"_blank",rel:"noopener noreferrer"},nh={href:"https://freeswitch.org/stash/projects/FS/repos/freeswitch/browse",target:"_blank",rel:"noopener noreferrer"},sh=e("code",null,"MPLv2",-1),lh=e("code",null,"C",-1),ah={href:"http://www.kamailio.org/w/",target:"_blank",rel:"noopener noreferrer"},ih={href:"https://github.com/kamailio/kamailio",target:"_blank",rel:"noopener noreferrer"},hh=e("code",null,"GPLv2",-1),ch=e("code",null,"C",-1),dh={href:"https://dev.guardianproject.info/projects/ostel/wiki/Server_Documentation",target:"_blank",rel:"noopener noreferrer"},_h=e("code",null,"GPLv3",-1),uh=e("code",null,"Ruby",-1),ph=e("h3",{id:"ipbx",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ipbx","aria-hidden":"true"},"#"),o(" IPBX")],-1),fh={href:"https://en.wikipedia.org/wiki/IP_PBX",target:"_blank",rel:"noopener noreferrer"},gh={href:"http://www.elastix.org",target:"_blank",rel:"noopener noreferrer"},bh={href:"https://svn.code.sf.net/p/elastix/code/trunk/",target:"_blank",rel:"noopener noreferrer"},mh=e("code",null,"GPLv2",-1),kh=e("code",null,"PHP",-1),wh={href:"http://www.freepbx.org",target:"_blank",rel:"noopener noreferrer"},Ph={href:"http://git.freepbx.org/projects/FREEPBX",target:"_blank",rel:"noopener noreferrer"},yh=e("code",null,"GPLv2",-1),Sh=e("code",null,"PHP",-1),vh={href:"http://www.xivo.io",target:"_blank",rel:"noopener noreferrer"},Ch={href:"https://github.com/xivo-pbx",target:"_blank",rel:"noopener noreferrer"},Ah=e("code",null,"GPLv3",-1),Lh=e("code",null,"Python",-1),Mh=e("h3",{id:"社交网络与论坛",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#社交网络与论坛","aria-hidden":"true"},"#"),o(" 社交网络与论坛")],-1),Gh={href:"https://github.com/abilian/abilian-sbe",target:"_blank",rel:"noopener noreferrer"},xh=e("code",null,"LGPLv2",-1),Th=e("code",null,"Python",-1),Ih={href:"https://www.getanahita.com/",target:"_blank",rel:"noopener noreferrer"},Eh={href:"https://github.com/anahitasocial",target:"_blank",rel:"noopener noreferrer"},Dh=e("code",null,"GPLv3",-1),Bh=e("code",null,"PHP",-1),Hh={href:"http://trybootcamp.vitorfs.com",target:"_blank",rel:"noopener noreferrer"},jh={href:"https://github.com/vitorfs/bootcamp",target:"_blank",rel:"noopener noreferrer"},Rh=e("code",null,"MIT",-1),Oh=e("code",null,"Python",-1),Fh={href:"http://buddycloud.com/",target:"_blank",rel:"noopener noreferrer"},Nh={href:"https://github.com/buddycloud",target:"_blank",rel:"noopener noreferrer"},zh=e("code",null,"Apache",-1),Wh=e("code",null,"Java",-1),Jh={href:"https://buddypress.org/about/",target:"_blank",rel:"noopener noreferrer"},Uh={href:"http://WordPress.org",target:"_blank",rel:"noopener noreferrer"},Vh={href:"https://buddypress.svn.wordpress.org/trunk/",target:"_blank",rel:"noopener noreferrer"},qh=e("code",null,"GPLv2",-1),Kh=e("code",null,"PHP",-1),Xh={href:"https://diasporafoundation.org/",target:"_blank",rel:"noopener noreferrer"},Yh={href:"http://podupti.me/random.php",target:"_blank",rel:"noopener noreferrer"},Zh={href:"https://github.com/diaspora/diaspora",target:"_blank",rel:"noopener noreferrer"},Qh=e("code",null,"AGPLv3",-1),$h=e("code",null,"Ruby",-1),ec={href:"http://www.discourse.org/",target:"_blank",rel:"noopener noreferrer"},oc={href:"https://github.com/discourse/discourse",target:"_blank",rel:"noopener noreferrer"},rc=e("code",null,"GPLv2",-1),tc=e("code",null,"Ruby",-1),nc={href:"https://elgg.org/",target:"_blank",rel:"noopener noreferrer"},sc={href:"https://github.com/Elgg/Elgg",target:"_blank",rel:"noopener noreferrer"},lc=e("code",null,"GPLv2",-1),ac=e("code",null,"PHP",-1),ic={href:"http://flarum.org",target:"_blank",rel:"noopener noreferrer"},hc={href:"https://github.com/flarum/flarum",target:"_blank",rel:"noopener noreferrer"},cc=e("code",null,"MIT",-1),dc=e("code",null,"PHP",-1),_c={href:"https://flaskbb.org/",target:"_blank",rel:"noopener noreferrer"},uc={href:"https://github.com/sh4nks/flaskbb",target:"_blank",rel:"noopener noreferrer"},pc=e("code",null,"BSD",-1),fc=e("code",null,"Python",-1),gc={href:"http://fluxbb.org/",target:"_blank",rel:"noopener noreferrer"},bc={href:"https://github.com/fluxbb/fluxbb",target:"_blank",rel:"noopener noreferrer"},mc=e("code",null,"GPLv2",-1),kc=e("code",null,"PHP",-1),wc={href:"http://friendica.com/",target:"_blank",rel:"noopener noreferrer"},Pc={href:"https://github.com/friendica/friendica",target:"_blank",rel:"noopener noreferrer"},yc=e("code",null,"AGPLv3",-1),Sc=e("code",null,"PHP",-1),vc={href:"https://gnu.io/social/",target:"_blank",rel:"noopener noreferrer"},Cc={href:"https://git.gnu.io/gnu/gnu-social",target:"_blank",rel:"noopener noreferrer"},Ac=e("code",null,"AGPLv3",-1),Lc=e("code",null,"PHP",-1),Mc={href:"https://github.com/redmatrix/hubzilla",target:"_blank",rel:"noopener noreferrer"},Gc=e("code",null,"MIT",-1),xc=e("code",null,"PHP",-1),Tc={href:"https://www.humhub.org/",target:"_blank",rel:"noopener noreferrer"},Ic={href:"https://github.com/humhub/humhub",target:"_blank",rel:"noopener noreferrer"},Ec=e("code",null,"AGPLv3",-1),Dc=e("code",null,"PHP",-1),Bc={href:"http://posativ.org/isso/",target:"_blank",rel:"noopener noreferrer"},Hc={href:"https://github.com/posativ/isso",target:"_blank",rel:"noopener noreferrer"},jc=e("code",null,"MIT",-1),Rc=e("code",null,"Python",-1),Oc={href:"https://jappix.com/",target:"_blank",rel:"noopener noreferrer"},Fc={href:"https://github.com/jappix/jappix",target:"_blank",rel:"noopener noreferrer"},Nc=e("code",null,"AGPLv3",-1),zc=e("code",null,"PHP",-1),Wc={href:"https://www.loomio.org/",target:"_blank",rel:"noopener noreferrer"},Jc={href:"https://github.com/loomio/loomio",target:"_blank",rel:"noopener noreferrer"},Uc=e("code",null,"AGPLv3",-1),Vc=e("code",null,"Ruby",-1),qc={href:"https://movim.eu/",target:"_blank",rel:"noopener noreferrer"},Kc={href:"https://github.com/movim/movim",target:"_blank",rel:"noopener noreferrer"},Xc=e("code",null,"AGPLv3",-1),Yc=e("code",null,"PHP",-1),Zc={href:"http://www.mybb.com/",target:"_blank",rel:"noopener noreferrer"},Qc={href:"https://github.com/mybb/mybb",target:"_blank",rel:"noopener noreferrer"},$c=e("code",null,"LGPLv3",-1),ed=e("code",null,"PHP",-1),od={href:"http://newebe.org/",target:"_blank",rel:"noopener noreferrer"},rd={href:"https://github.com/gelnior/newebe",target:"_blank",rel:"noopener noreferrer"},td=e("code",null,"AGPLv3",-1),nd=e("code",null,"Python",-1),sd={href:"https://nodebb.org/",target:"_blank",rel:"noopener noreferrer"},ld={href:"https://github.com/NodeBB/NodeBB",target:"_blank",rel:"noopener noreferrer"},ad=e("code",null,"GPLv3",-1),id=e("code",null,"Nodejs",-1),hd={href:"https://www.opensource-socialnetwork.org/",target:"_blank",rel:"noopener noreferrer"},cd={href:"https://github.com/opensource-socialnetwork/opensource-socialnetwork",target:"_blank",rel:"noopener noreferrer"},dd=e("code",null,"GPLv2",-1),_d=e("code",null,"PHP",-1),ud={href:"http://www.oxwall.org/",target:"_blank",rel:"noopener noreferrer"},pd={href:"https://bitbucket.org/oxwall/public",target:"_blank",rel:"noopener noreferrer"},fd=e("code",null,"CPALv1",-1),gd=e("code",null,"PHP",-1),bd={href:"https://www.phpbb.com/",target:"_blank",rel:"noopener noreferrer"},md={href:"https://github.com/phpbb/phpbb",target:"_blank",rel:"noopener noreferrer"},kd=e("code",null,"GPLv2",-1),wd=e("code",null,"PHP",-1),Pd={href:"https://github.com/pixelpark/ppnet",target:"_blank",rel:"noopener noreferrer"},yd=e("code",null,"MIT",-1),Sd=e("code",null,"Javascript",-1),vd={href:"http://pump.io/",target:"_blank",rel:"noopener noreferrer"},Cd={href:"https://github.com/e14n/pump.io",target:"_blank",rel:"noopener noreferrer"},Ad=e("code",null,"Apache",-1),Ld=e("code",null,"Nodejs",-1),Md={href:"https://www.reddit.com/",target:"_blank",rel:"noopener noreferrer"},Gd={href:"https://www.reddit.com/",target:"_blank",rel:"noopener noreferrer"},xd={href:"https://github.com/reddit/reddit",target:"_blank",rel:"noopener noreferrer"},Td=e("code",null,"CPALv1",-1),Id=e("code",null,"Python",-1),Ed={href:"https://github.com/redmatrix/redmatrix",target:"_blank",rel:"noopener noreferrer"},Dd=e("code",null,"MIT",-1),Bd=e("code",null,"PHP",-1),Hd={href:"http://twister.net.co/",target:"_blank",rel:"noopener noreferrer"},jd={href:"https://github.com/miguelfreitas/twister-core",target:"_blank",rel:"noopener noreferrer"},Rd=e("code",null,"BSD/MIT",-1),Od=e("code",null,"C++",-1),Fd={href:"https://vanillaforums.org/",target:"_blank",rel:"noopener noreferrer"},Nd={href:"https://github.com/vanilla/vanilla",target:"_blank",rel:"noopener noreferrer"},zd=e("code",null,"GPLv2",-1),Wd=e("code",null,"PHP",-1),Jd=e("h3",{id:"xmpp",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#xmpp","aria-hidden":"true"},"#"),o(" XMPP")],-1),Ud={href:"https://en.wikipedia.org/wiki/XMPP",target:"_blank",rel:"noopener noreferrer"},Vd=e("h4",{id:"xmpp-服务器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#xmpp-服务器","aria-hidden":"true"},"#"),o(" XMPP 服务器")],-1),qd={href:"https://www.ejabberd.im/",target:"_blank",rel:"noopener noreferrer"},Kd={href:"https://github.com/processone/ejabberd",target:"_blank",rel:"noopener noreferrer"},Xd=e("code",null,"GPL",-1),Yd=e("code",null,"Erlang",-1),Zd={href:"http://kontalk.org/",target:"_blank",rel:"noopener noreferrer"},Qd={href:"https://github.com/kontalk",target:"_blank",rel:"noopener noreferrer"},$d=e("code",null,"GPLv3",-1),e_=e("code",null,"Java",-1),o_={href:"https://lightwitch.org/metronome",target:"_blank",rel:"noopener noreferrer"},r_={href:"http://code.lightwitch.org/",target:"_blank",rel:"noopener noreferrer"},t_=e("code",null,"MIT",-1),n_=e("code",null,"Lua",-1),s_={href:"https://www.erlang-solutions.com/products/mongooseim.html",target:"_blank",rel:"noopener noreferrer"},l_={href:"https://github.com/esl/MongooseIM",target:"_blank",rel:"noopener noreferrer"},a_=e("code",null,"MIT",-1),i_=e("code",null,"Erlang",-1),h_={href:"http://www.igniterealtime.org/projects/openfire/",target:"_blank",rel:"noopener noreferrer"},c_={href:"https://github.com/igniterealtime/Openfire",target:"_blank",rel:"noopener noreferrer"},d_=e("code",null,"Apache",-1),__=e("code",null,"Java",-1),u_={href:"http://prosody.im/",target:"_blank",rel:"noopener noreferrer"},p_={href:"http://hg.prosody.im/",target:"_blank",rel:"noopener noreferrer"},f_=e("code",null,"MIT",-1),g_=e("code",null,"Lua",-1),b_={href:"http://www.tigase.net/content/tigase-xmpp-server",target:"_blank",rel:"noopener noreferrer"},m_=e("code",null,"GPLv3",-1),k_=e("code",null,"Java",-1),w_=e("h4",{id:"xmpp-web-客户端",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#xmpp-web-客户端","aria-hidden":"true"},"#"),o(" XMPP Web 客户端")],-1),P_={href:"http://candy-chat.github.io/candy/",target:"_blank",rel:"noopener noreferrer"},y_={href:"https://github.com/candy-chat/candy",target:"_blank",rel:"noopener noreferrer"},S_=e("code",null,"MIT",-1),v_=e("code",null,"Javascript",-1),C_={href:"https://conversejs.org/",target:"_blank",rel:"noopener noreferrer"},A_={href:"https://github.com/jcbrand/converse.js",target:"_blank",rel:"noopener noreferrer"},L_=e("code",null,"MPLv2",-1),M_=e("code",null,"Javascript",-1),G_={href:"http://getkaiwa.com/",target:"_blank",rel:"noopener noreferrer"},x_={href:"https://github.com/digicoop/kaiwa",target:"_blank",rel:"noopener noreferrer"},T_=e("code",null,"MIT",-1),I_=e("code",null,"NodeJS",-1),E_={href:"http://www.salut-a-toi.org/",target:"_blank",rel:"noopener noreferrer"},D_={href:"http://repos.goffi.org/sat",target:"_blank",rel:"noopener noreferrer"},B_=e("code",null,"AGPLv3",-1),H_=e("code",null,"Python",-1),j_={href:"http://wiki.goffi.org/wiki/Libervia/en",target:"_blank",rel:"noopener noreferrer"},R_={href:"http://repos.goffi.org/libervia",target:"_blank",rel:"noopener noreferrer"},O_=e("code",null,"AGPLv3",-1),F_=e("code",null,"Python",-1),N_=e("h2",{id:"内容管理系统-cms",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#内容管理系统-cms","aria-hidden":"true"},"#"),o(" 内容管理系统 (CMS)")],-1),z_=e("p",null,[o("CMS are a practical way to setup a website with many features. CMS often come with third party plugins, themes and functionality that is easy to add and customize to your needs. See also "),e("a",{href:"#blogging-platforms"},"Blogging Platforms"),o(" and "),e("a",{href:"#static-site-generators"},"Static Site Generators")],-1),W_={href:"http://www.99ko.org/",target:"_blank",rel:"noopener noreferrer"},J_={href:"https://github.com/99ko-project/99ko-cms",target:"_blank",rel:"noopener noreferrer"},U_={href:"http://apostrophenow.org/",target:"_blank",rel:"noopener noreferrer"},V_={href:"http://demo.apostrophenow.com/",target:"_blank",rel:"noopener noreferrer"},q_={href:"https://github.com/punkave/apostrophe",target:"_blank",rel:"noopener noreferrer"},K_=e("code",null,"MIT",-1),X_=e("code",null,"NodeJS",-1),Y_={href:"http://bauncms.com/",target:"_blank",rel:"noopener noreferrer"},Z_={href:"https://github.com/BaunCMS/Baun",target:"_blank",rel:"noopener noreferrer"},Q_=e("code",null,"MIT",-1),$_=e("code",null,"PHP",-1),eu={href:"https://www.bigtreecms.org/",target:"_blank",rel:"noopener noreferrer"},ou={href:"https://github.com/bigtreecms/BigTree-CMS",target:"_blank",rel:"noopener noreferrer"},ru=e("code",null,"LGPLv2",-1),tu=e("code",null,"PHP",-1),nu={href:"http://www.cmsmadesimple.org/",target:"_blank",rel:"noopener noreferrer"},su={href:"http://svn.cmsmadesimple.org/svn/cmsmadesimple/trunk/",target:"_blank",rel:"noopener noreferrer"},lu=e("code",null,"GPL",-1),au=e("code",null,"PHP",-1),iu={href:"http://www.concrete5.org/",target:"_blank",rel:"noopener noreferrer"},hu={href:"https://github.com/concrete5/concrete5",target:"_blank",rel:"noopener noreferrer"},cu=e("code",null,"MIT",-1),du=e("code",null,"PHP",-1),_u={href:"http://www.couchcms.com/",target:"_blank",rel:"noopener noreferrer"},uu={href:"https://github.com/CouchCMS/CouchCMS",target:"_blank",rel:"noopener noreferrer"},pu=e("code",null,"CPALv1",-1),fu=e("code",null,"PHP",-1),gu={href:"http://getdirectus.com/",target:"_blank",rel:"noopener noreferrer"},bu={href:"https://github.com/directus/directus",target:"_blank",rel:"noopener noreferrer"},mu=e("code",null,"GPL",-1),ku=e("code",null,"PHP",-1),wu={href:"https://www.drupal.org/",target:"_blank",rel:"noopener noreferrer"},Pu={href:"http://cgit.drupalcode.org/drupal",target:"_blank",rel:"noopener noreferrer"},yu=e("code",null,"GPL",-1),Su=e("code",null,"PHP",-1),vu={href:"http://www.elabftw.net",target:"_blank",rel:"noopener noreferrer"},Cu={href:"https://github.com/elabftw/elabftw",target:"_blank",rel:"noopener noreferrer"},Au={href:"https://demo.elabftw.net",target:"_blank",rel:"noopener noreferrer"},Lu=e("code",null,"AGPLv3",-1),Mu=e("code",null,"PHP",-1),Gu={href:"http://get-simple.info/",target:"_blank",rel:"noopener noreferrer"},xu=e("code",null,"GPLv3",-1),Tu={href:"https://www.impresspages.org/",target:"_blank",rel:"noopener noreferrer"},Iu={href:"https://www.impresspages.org/demo",target:"_blank",rel:"noopener noreferrer"},Eu={href:"https://github.com/impresspages/ImpressPages",target:"_blank",rel:"noopener noreferrer"},Du=e("code",null,"GPLv3",-1),Bu=e("code",null,"MIT",-1),Hu=e("code",null,"PHP",-1),ju={href:"https://www.joomla.org/",target:"_blank",rel:"noopener noreferrer"},Ru={href:"http://joomlacode.org/gf/project/joomla/scmsvn/",target:"_blank",rel:"noopener noreferrer"},Ou=e("code",null,"GPL",-1),Fu=e("code",null,"PHP",-1),Nu={href:"http://keystonejs.com/",target:"_blank",rel:"noopener noreferrer"},zu={href:"http://demo.keystonejs.com/",target:"_blank",rel:"noopener noreferrer"},Wu={href:"https://github.com/keystonejs/keystone",target:"_blank",rel:"noopener noreferrer"},Ju=e("code",null,"MIT",-1),Uu=e("code",null,"NodeJS",-1),Vu={href:"http://modx.com/",target:"_blank",rel:"noopener noreferrer"},qu={href:"https://github.com/modxcms/revolution",target:"_blank",rel:"noopener noreferrer"},Ku=e("code",null,"GPLv2",-1),Xu=e("code",null,"PHP",-1),Yu={href:"https://www.neos.io",target:"_blank",rel:"noopener noreferrer"},Zu={href:"https://git.typo3.org/Packages/TYPO3.Neos.git",target:"_blank",rel:"noopener noreferrer"},Qu=e("code",null,"GPLv3",-1),$u=e("code",null,"PHP",-1),ep={href:"http://octobercms.com/",target:"_blank",rel:"noopener noreferrer"},op={href:"https://github.com/octobercms/october",target:"_blank",rel:"noopener noreferrer"},rp=e("code",null,"MIT",-1),tp=e("code",null,"PHP",-1),np={href:"http://omeka.org",target:"_blank",rel:"noopener noreferrer"},sp={href:"http://omeka.org/showcase/",target:"_blank",rel:"noopener noreferrer"},lp={href:"https://github.com/omeka/Omeka",target:"_blank",rel:"noopener noreferrer"},ap=e("code",null,"GPLv3",-1),ip=e("code",null,"PHP",-1),hp={href:"https://pagekit.com/",target:"_blank",rel:"noopener noreferrer"},cp={href:"https://github.com/pagekit/pagekit",target:"_blank",rel:"noopener noreferrer"},dp=e("code",null,"MIT",-1),_p=e("code",null,"PHP",-1),up={href:"http://picocms.org/",target:"_blank",rel:"noopener noreferrer"},pp={href:"https://github.com/picocms/Pico",target:"_blank",rel:"noopener noreferrer"},fp=e("code",null,"MIT",-1),gp=e("code",null,"PHP",-1),bp={href:"https://www.pimcore.org/",target:"_blank",rel:"noopener noreferrer"},mp={href:"https://github.com/pimcore/pimcore",target:"_blank",rel:"noopener noreferrer"},kp=e("code",null,"BSD",-1),wp=e("code",null,"PHP",-1),Pp={href:"https://plone.org/",target:"_blank",rel:"noopener noreferrer"},yp={href:"https://github.com/plone",target:"_blank",rel:"noopener noreferrer"},Sp=e("code",null,"Zope",-1),vp=e("code",null,"Python",-1),Cp={href:"http://publify.co/",target:"_blank",rel:"noopener noreferrer"},Ap={href:"http://demo.publify.co/",target:"_blank",rel:"noopener noreferrer"},Lp={href:"https://github.com/publify/publify",target:"_blank",rel:"noopener noreferrer"},Mp=e("code",null,"MIT",-1),Gp=e("code",null,"Ruby",-1),xp=e("a",{href:"http:/redaxscript.com"},"Redaxscript",-1),Tp={href:"http://demo.redaxscript.com/demo/login",target:"_blank",rel:"noopener noreferrer"},Ip={href:"https://github.com/redaxmedia/redaxscript",target:"_blank",rel:"noopener noreferrer"},Ep=e("code",null,"GPLv3",-1),Dp=e("code",null,"PHP",-1),Bp={href:"https://www.roadiz.io/",target:"_blank",rel:"noopener noreferrer"},Hp={href:"https://github.com/roadiz/roadiz/",target:"_blank",rel:"noopener noreferrer"},jp=e("code",null,"MIT",-1),Rp=e("code",null,"PHP",-1),Op={href:"https://www.silverstripe.org",target:"_blank",rel:"noopener noreferrer"},Fp={href:"http://demo.silverstripe.org/",target:"_blank",rel:"noopener noreferrer"},Np={href:"https://github.com/silverstripe",target:"_blank",rel:"noopener noreferrer"},zp=e("code",null,"BSD",-1),Wp=e("code",null,"PHP",-1),Jp={href:"http://www.sphido.org/",target:"_blank",rel:"noopener noreferrer"},Up={href:"https://github.com/sphido/cms",target:"_blank",rel:"noopener noreferrer"},Vp=e("code",null,"MIT",-1),qp=e("code",null,"PHP",-1),Kp={href:"http://www.spip.net/fr",target:"_blank",rel:"noopener noreferrer"},Xp={href:"https://core.spip.net/projects/spip/repository",target:"_blank",rel:"noopener noreferrer"},Yp=e("code",null,"GPLv2",-1),Zp=e("code",null,"PHP",-1),Qp={href:"http://www.subrion.org",target:"_blank",rel:"noopener noreferrer"},$p={href:"http://demos.subrion.com",target:"_blank",rel:"noopener noreferrer"},ef={href:"https://github.com/intelliants/subrion",target:"_blank",rel:"noopener noreferrer"},of=e("code",null,"GPLv3",-1),rf=e("code",null,"PHP",-1),tf={href:"http://textpattern.com/",target:"_blank",rel:"noopener noreferrer"},nf={href:"http://textpattern.co/demo",target:"_blank",rel:"noopener noreferrer"},sf={href:"https://github.com/textpattern/textpattern",target:"_blank",rel:"noopener noreferrer"},lf=e("code",null,"GPLv2",-1),af=e("code",null,"PHP",-1),hf={href:"https://typo3.org/",target:"_blank",rel:"noopener noreferrer"},cf={href:"https://github.com/TYPO3/TYPO3.CMS",target:"_blank",rel:"noopener noreferrer"},df=e("code",null,"GPLv2",-1),_f=e("code",null,"PHP",-1),uf={href:"https://umbraco.com/",target:"_blank",rel:"noopener noreferrer"},pf={href:"https://github.com/umbraco/Umbraco-CMS",target:"_blank",rel:"noopener noreferrer"},ff=e("code",null,"MIT",-1),gf=e("code",null,".NET",-1),bf={href:"https://wordpress.org/",target:"_blank",rel:"noopener noreferrer"},mf={href:"https://github.com/WordPress/WordPress",target:"_blank",rel:"noopener noreferrer"},kf=e("code",null,"GPLv2",-1),wf=e("code",null,"PHP",-1),Pf=e("p",null,[e("em",null,"Recipe management")],-1),yf={href:"http://www.openeats.org/",target:"_blank",rel:"noopener noreferrer"},Sf={href:"https://github.com/qgriffith/OpenEats",target:"_blank",rel:"noopener noreferrer"},vf=e("code",null,"BSD",-1),Cf=e("code",null,"Python/Django",-1),Af=e("h3",{id:"电子商务",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#电子商务","aria-hidden":"true"},"#"),o(" 电子商务")],-1),Lf={href:"https://www.attendize.com/",target:"_blank",rel:"noopener noreferrer"},Mf={href:"https://www.attendize.com/documentation.php#demo",target:"_blank",rel:"noopener noreferrer"},Gf={href:"https://github.com/attendize/attendize",target:"_blank",rel:"noopener noreferrer"},xf=e("code",null,"AAL",-1),Tf=e("code",null,"PHP",-1),If={href:"https://www.coreshop.org",target:"_blank",rel:"noopener noreferrer"},Ef={href:"https://github.com/coreshop/CoreShop",target:"_blank",rel:"noopener noreferrer"},Df=e("code",null,"GPLv3",-1),Bf=e("code",null,"PHP",-1),Hf={href:"https://magento.com/",target:"_blank",rel:"noopener noreferrer"},jf={href:"https://magento.com/schedule-a-demo",target:"_blank",rel:"noopener noreferrer"},Rf={href:"https://github.com/magento/magento2",target:"_blank",rel:"noopener noreferrer"},Of=e("code",null,"OSLv3",-1),Ff=e("code",null,"PHP",-1),Nf={href:"https://microweber.com/",target:"_blank",rel:"noopener noreferrer"},zf={href:"http://demo.microweber.org/",target:"_blank",rel:"noopener noreferrer"},Wf={href:"https://github.com/microweber/microweber",target:"_blank",rel:"noopener noreferrer"},Jf=e("code",null,"Apache",-1),Uf=e("code",null,"PHP",-1),Vf={href:"https://www.opencart.com",target:"_blank",rel:"noopener noreferrer"},qf={href:"https://github.com/opencart/opencart",target:"_blank",rel:"noopener noreferrer"},Kf=e("code",null,"GPLv3",-1),Xf=e("code",null,"PHP",-1),Yf={href:"http://open-classifieds.com/",target:"_blank",rel:"noopener noreferrer"},Zf={href:"https://github.com/open-classifieds/openclassifieds2",target:"_blank",rel:"noopener noreferrer"},Qf=e("code",null,"GPL",-1),$f=e("code",null,"PHP",-1),eg={href:"https://open-eshop.com/",target:"_blank",rel:"noopener noreferrer"},og={href:"https://github.com/open-classifieds/open-eshop",target:"_blank",rel:"noopener noreferrer"},rg=e("code",null,"GPL",-1),tg=e("code",null,"PHP",-1),ng={href:"http://oxidforge.org",target:"_blank",rel:"noopener noreferrer"},sg={href:"http://demoshop.oxid-esales.com/community-edition/",target:"_blank",rel:"noopener noreferrer"},lg={href:"https://github.com/OXID-eSales/oxideshop_ce",target:"_blank",rel:"noopener noreferrer"},ag=e("code",null,"GPLv3",-1),ig=e("code",null,"PHP",-1),hg={href:"https://www.prestashop.com/",target:"_blank",rel:"noopener noreferrer"},cg={href:"http://demo.prestashop.com/",target:"_blank",rel:"noopener noreferrer"},dg={href:"https://github.com/PrestaShop/PrestaShop",target:"_blank",rel:"noopener noreferrer"},_g=e("code",null,"OSLv3",-1),ug=e("code",null,"PHP",-1),pg={href:"https://www.shoop.io/",target:"_blank",rel:"noopener noreferrer"},fg={href:"https://demo1.shoop.io/",target:"_blank",rel:"noopener noreferrer"},gg={href:"https://demo2.shoop.io/",target:"_blank",rel:"noopener noreferrer"},bg={href:"https://github.com/shoopio/shoop",target:"_blank",rel:"noopener noreferrer"},mg=e("code",null,"AGPLv3",-1),kg=e("code",null,"Python",-1),wg={href:"http://sylius.org/",target:"_blank",rel:"noopener noreferrer"},Pg={href:"http://sylius.org/demo",target:"_blank",rel:"noopener noreferrer"},yg={href:"https://github.com/Sylius/Sylius",target:"_blank",rel:"noopener noreferrer"},Sg=e("code",null,"MIT",-1),vg=e("code",null,"PHP",-1),Cg={href:"http://thelia.net/",target:"_blank",rel:"noopener noreferrer"},Ag={href:"http://demo.thelia.net/",target:"_blank",rel:"noopener noreferrer"},Lg={href:"https://github.com/thelia/thelia",target:"_blank",rel:"noopener noreferrer"},Mg=e("code",null,"LGPL",-1),Gg=e("code",null,"PHP",-1),xg={href:"https://www.woothemes.com/woocommerce/",target:"_blank",rel:"noopener noreferrer"},Tg={href:"https://github.com/woothemes/woocommerce",target:"_blank",rel:"noopener noreferrer"},Ig=e("code",null,"GPL",-1),Eg=e("code",null,"PHP",-1),Dg=e("h2",{id:"dns",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#dns","aria-hidden":"true"},"#"),o(" DNS")],-1),Bg={href:"https://github.com/n1trux/awesome-sysadmin#dns",target:"_blank",rel:"noopener noreferrer"},Hg=e("h2",{id:"文档归档",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#文档归档","aria-hidden":"true"},"#"),o(" 文档归档")],-1),jg={href:"https://www.cups.org/",target:"_blank",rel:"noopener noreferrer"},Rg={href:"https://www.cups.org/software.php",target:"_blank",rel:"noopener noreferrer"},Og=e("code",null,"GPLv2",-1),Fg=e("code",null,"C",-1),Ng={href:"https://github.com/danielquinn/paperless",target:"_blank",rel:"noopener noreferrer"},zg=e("code",null,"GPLv3",-1),Wg=e("code",null,"Python",-1),Jg={href:"http://sane-project.org/",target:"_blank",rel:"noopener noreferrer"},Ug={href:"http://www.sane-project.org/cvs.html",target:"_blank",rel:"noopener noreferrer"},Vg=e("code",null,"GPLv2",-1),qg=e("code",null,"C",-1),Kg=e("h2",{id:"企业资源规划-erp",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#企业资源规划-erp","aria-hidden":"true"},"#"),o(" 企业资源规划 ERP")],-1),Xg={href:"https://erpnext.com",target:"_blank",rel:"noopener noreferrer"},Yg={href:"https://demo.erpnext.com",target:"_blank",rel:"noopener noreferrer"},Zg={href:"https://github.com/frappe/erpnext",target:"_blank",rel:"noopener noreferrer"},Qg=e("code",null,"GPLv3",-1),$g=e("code",null,"Python",-1),eb={href:"http://odoo.com",target:"_blank",rel:"noopener noreferrer"},ob={href:"https://demo.odoo.com/",target:"_blank",rel:"noopener noreferrer"},rb={href:"https://github.com/odoo/odoo",target:"_blank",rel:"noopener noreferrer"},tb=e("code",null,"LGPLv3",-1),nb=e("code",null,"Python",-1),sb={href:"http://www.tryton.org/",target:"_blank",rel:"noopener noreferrer"},lb={href:"http://demo.tryton.org/",target:"_blank",rel:"noopener noreferrer"},ab={href:"https://hg.tryton.org/",target:"_blank",rel:"noopener noreferrer"},ib=e("code",null,"GPLv3",-1),hb=e("code",null,"Python/Javascript",-1),cb=e("h2",{id:"联合身份-认证",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#联合身份-认证","aria-hidden":"true"},"#"),o(" 联合身份/认证")],-1),db={href:"http://freeradius.org/",target:"_blank",rel:"noopener noreferrer"},_b={href:"https://github.com/FreeRADIUS/freeradius-server",target:"_blank",rel:"noopener noreferrer"},ub=e("code",null,"GPLv2",-1),pb=e("code",null,"C",-1),fb={href:"http://www.daloradius.com",target:"_blank",rel:"noopener noreferrer"},gb={href:"https://github.com/lirantal/daloradius",target:"_blank",rel:"noopener noreferrer"},bb=e("code",null,"GPLv2",-1),mb={href:"https://www.freeipa.org/",target:"_blank",rel:"noopener noreferrer"},kb=e("code",null,"Multiple",-1),wb=e("code",null,"C",-1),Pb={href:"https://indieauth.com",target:"_blank",rel:"noopener noreferrer"},yb={href:"http://microformats.org/wiki/relmeauth",target:"_blank",rel:"noopener noreferrer"},Sb=e("code",null,"Apache",-1),vb=e("code",null,"Ruby",-1),Cb={href:"https://www.libravatar.org/",target:"_blank",rel:"noopener noreferrer"},Ab={href:"https://www.libravatar.org/account/new/",target:"_blank",rel:"noopener noreferrer"},Lb={href:"https://github.com/libravatar/libravatar",target:"_blank",rel:"noopener noreferrer"},Mb=e("code",null,"AGPLv3",-1),Gb=e("code",null,"Python",-1),xb={href:"https://pki.openca.org/projects/ocspd/",target:"_blank",rel:"noopener noreferrer"},Tb={href:"https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol",target:"_blank",rel:"noopener noreferrer"},Ib={href:"http://openid.net/developers/libraries/",target:"_blank",rel:"noopener noreferrer"},Eb={href:"https://www.osiam.org",target:"_blank",rel:"noopener noreferrer"},Db={href:"https://github.com/osiam/osiam",target:"_blank",rel:"noopener noreferrer"},Bb=e("code",null,"MIT",-1),Hb=e("code",null,"Java",-1),jb=e("h2",{id:"feed-阅读器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#feed-阅读器","aria-hidden":"true"},"#"),o(" Feed 阅读器")],-1),Rb={href:"https://www.commafeed.com/",target:"_blank",rel:"noopener noreferrer"},Ob={href:"https://github.com/Athou/commafeed",target:"_blank",rel:"noopener noreferrer"},Fb=e("code",null,"Java",-1),Nb={href:"https://github.com/piero-la-lune/Creaky-Coot",target:"_blank",rel:"noopener noreferrer"},zb=e("code",null,"PHP",-1),Wb={href:"https://feedbin.com/",target:"_blank",rel:"noopener noreferrer"},Jb={href:"https://github.com/feedbin/feedbin",target:"_blank",rel:"noopener noreferrer"},Ub=e("code",null,"Ruby",-1),Vb={href:"https://feedhq.org/",target:"_blank",rel:"noopener noreferrer"},qb={href:"https://github.com/feedhq/feedhq",target:"_blank",rel:"noopener noreferrer"},Kb=e("code",null,"Python",-1),Xb={href:"http://freshrss.org/",target:"_blank",rel:"noopener noreferrer"},Yb={href:"http://demo.freshrss.org/i/",target:"_blank",rel:"noopener noreferrer"},Zb={href:"https://github.com/FreshRSS/FreshRSS",target:"_blank",rel:"noopener noreferrer"},Qb={href:"https://github.com/Alkarex/EasyRSS",target:"_blank",rel:"noopener noreferrer"},$b=e("code",null,"AGPLv3",-1),e1=e("code",null,"PHP",-1),o1={href:"http://1pxsolidblack.pl/jarr-en.html",target:"_blank",rel:"noopener noreferrer"},r1={href:"https://jarr.info/login?next=%2F",target:"_blank",rel:"noopener noreferrer"},t1={href:"https://github.com/jaesivsm/JARR",target:"_blank",rel:"noopener noreferrer"},n1=e("code",null,"AGPLv3",-1),s1=e("code",null,"Python",-1),l1={href:"http://tontof.net/kriss/feed/",target:"_blank",rel:"noopener noreferrer"},a1={href:"http://tontof.net/feed/",target:"_blank",rel:"noopener noreferrer"},i1={href:"https://github.com/tontof/kriss_feed/",target:"_blank",rel:"noopener noreferrer"},h1=e("code",null,"PHP",-1),c1={href:"http://leed.idleman.fr",target:"_blank",rel:"noopener noreferrer"},d1={href:"https://github.com/ldleman/Leed",target:"_blank",rel:"noopener noreferrer"},_1=e("code",null,"PHP",-1),u1={href:"https://github.com/socketubs/leselys",target:"_blank",rel:"noopener noreferrer"},p1=e("code",null,"Python",-1),f1={href:"http://cubny.com/lite-reader/",target:"_blank",rel:"noopener noreferrer"},g1={href:"https://github.com/cubny/lite-reader",target:"_blank",rel:"noopener noreferrer"},b1=e("code",null,"PHP",-1),m1={href:"http://moonmoon.org/",target:"_blank",rel:"noopener noreferrer"},k1={href:"https://github.com/mauricesvay/moonmoon",target:"_blank",rel:"noopener noreferrer"},w1=e("code",null,"BSD",-1),P1=e("code",null,"PHP",-1),y1={href:"https://miniflux.net/",target:"_blank",rel:"noopener noreferrer"},S1={href:"https://github.com/miniflux/miniflux",target:"_blank",rel:"noopener noreferrer"},v1=e("code",null,"PHP",-1),C1={href:"https://github.com/samuelclay/NewsBlur",target:"_blank",rel:"noopener noreferrer"},A1=e("code",null,"Python",-1),L1={href:"http://reader.nunux.org/",target:"_blank",rel:"noopener noreferrer"},M1={href:"https://github.com/ncarlier/nunux-reader",target:"_blank",rel:"noopener noreferrer"},G1=e("code",null,"GPLv3",-1),x1=e("code",null,"Nodejs",-1),T1={href:"http://readerself.com/",target:"_blank",rel:"noopener noreferrer"},I1={href:"https://github.com/readerself/readerself",target:"_blank",rel:"noopener noreferrer"},E1=e("code",null,"PHP",-1),D1={href:"https://github.com/pabloprieto/Readr",target:"_blank",rel:"noopener noreferrer"},B1=e("code",null,"PHP",-1),H1={href:"http://www.allthingsrss.com/rss2email/",target:"_blank",rel:"noopener noreferrer"},j1=e("code",null,"GPL",-1),R1=e("code",null,"Python",-1),O1={href:"http://www.rssminer.net/",target:"_blank",rel:"noopener noreferrer"},F1={href:"https://github.com/shenfeng/rssminer",target:"_blank",rel:"noopener noreferrer"},N1=e("code",null,"Clojure",-1),z1={href:"https://github.com/pietheinstrengholt/rssmonster",target:"_blank",rel:"noopener noreferrer"},W1=e("code",null,"MIT",-1),J1=e("code",null,"PHP",-1),U1={href:"https://github.com/herrbischoff/screaming-liquid-tiger",target:"_blank",rel:"noopener noreferrer"},V1=e("code",null,"MIT",-1),q1=e("code",null,"PHP",-1),K1={href:"http://selfoss.aditu.de/",target:"_blank",rel:"noopener noreferrer"},X1={href:"https://github.com/SSilence/selfoss",target:"_blank",rel:"noopener noreferrer"},Y1=e("code",null,"AGPLv3",-1),Z1=e("code",null,"PHP",-1),Q1={href:"https://github.com/swanson/stringer",target:"_blank",rel:"noopener noreferrer"},$1=e("code",null,"MIT",-1),em=e("code",null,"Ruby",-1),om={href:"https://tt-rss.org/gitlab/fox/tt-rss",target:"_blank",rel:"noopener noreferrer"},rm={href:"http://framanews.org/",target:"_blank",rel:"noopener noreferrer"},tm=e("code",null,"GPLv3",-1),nm=e("code",null,"PHP",-1),sm={href:"http://gritttt-rss.nicolashoening.de/",target:"_blank",rel:"noopener noreferrer"},lm={href:"https://github.com/nhoening/gritttt-rss",target:"_blank",rel:"noopener noreferrer"},am=e("code",null,"BSD",-1),im=e("code",null,"Python",-1),hm={href:"https://github.com/mboinet/ttrss-mobile",target:"_blank",rel:"noopener noreferrer"},cm=e("code",null,"AGPLv3",-1),dm=e("code",null,"Nodejs",-1),_m={href:"https://github.com/kucrut/ttrss-reader",target:"_blank",rel:"noopener noreferrer"},um=e("code",null,"GPLv2",-1),pm=e("code",null,"Javascript",-1),fm=n('

        文件共享和同步

        Some Groupware solutions also feature file sharing and synchronization.

        分布式文件系统

        ',3),gm={href:"https://camlistore.org/",target:"_blank",rel:"noopener noreferrer"},bm={href:"https://github.com/camlistore/camlistore",target:"_blank",rel:"noopener noreferrer"},mm=e("code",null,"Apache",-1),km=e("code",null,"Go",-1),wm={href:"https://www.gluster.org",target:"_blank",rel:"noopener noreferrer"},Pm={href:"https://github.com/gluster/glusterfs",target:"_blank",rel:"noopener noreferrer"},ym=e("code",null,"LGPLv3/GPLv2",-1),Sm=e("code",null,"C",-1),vm={href:"https://github.com/ipfs/go-ipfs",target:"_blank",rel:"noopener noreferrer"},Cm={href:"http://ipfs.io/",target:"_blank",rel:"noopener noreferrer"},Am={href:"http://ori.scs.stanford.edu/",target:"_blank",rel:"noopener noreferrer"},Lm={href:"https://bitbucket.org/orifs/ori/wiki/Home",target:"_blank",rel:"noopener noreferrer"},Mm=e("code",null,"MIT",-1),Gm=e("code",null,"C++",-1),xm={href:"http://docs.openstack.org/developer/swift/",target:"_blank",rel:"noopener noreferrer"},Tm={href:"https://www.tahoe-lafs.org/trac/tahoe-lafs",target:"_blank",rel:"noopener noreferrer"},Im=e("h4",{id:"文件传输-同步",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#文件传输-同步","aria-hidden":"true"},"#"),o(" 文件传输/同步")],-1),Em={href:"http://git-annex.branchable.com/assistant/quickstart/",target:"_blank",rel:"noopener noreferrer"},Dm={href:"https://kinto.readthedocs.org",target:"_blank",rel:"noopener noreferrer"},Bm={href:"https://github.com/Kinto",target:"_blank",rel:"noopener noreferrer"},Hm=e("code",null,"Apache 2.0",-1),jm=e("code",null,"Python",-1),Rm={href:"https://nextcloud.com/",target:"_blank",rel:"noopener noreferrer"},Om={href:"https://github.com/nextcloud/server",target:"_blank",rel:"noopener noreferrer"},Fm=e("code",null,"MIT",-1),Nm=e("code",null,"PHP",-1),zm={href:"http://www.openssh.com/",target:"_blank",rel:"noopener noreferrer"},Wm={href:"http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh",target:"_blank",rel:"noopener noreferrer"},Jm=e("code",null,"BSD",-1),Um=e("code",null,"C",-1),Vm={href:"https://www.samba.org/",target:"_blank",rel:"noopener noreferrer"},qm={href:"https://git.samba.org/samba.git/",target:"_blank",rel:"noopener noreferrer"},Km=e("code",null,"GPLv3",-1),Xm=e("code",null,"C",-1),Ym={href:"https://www.seafile.com/en/home/",target:"_blank",rel:"noopener noreferrer"},Zm={href:"https://seacloud.cc/demo",target:"_blank",rel:"noopener noreferrer"},Qm=e("code",null,"GPLv2",-1),$m={href:"http://sparkleshare.org/",target:"_blank",rel:"noopener noreferrer"},ek={href:"https://www.syncany.org/",target:"_blank",rel:"noopener noreferrer"},ok=e("code",null,"GPLv3",-1),rk=e("code",null,"Java",-1),tk={href:"https://syncthing.net/",target:"_blank",rel:"noopener noreferrer"},nk={href:"https://github.com/syncthing/syncthing",target:"_blank",rel:"noopener noreferrer"},sk=e("code",null,"MPLv2",-1),lk=e("code",null,"Go",-1),ak={href:"https://z-push.org/",target:"_blank",rel:"noopener noreferrer"},ik={href:"https://en.wikipedia.org/wiki/ActiveSync",target:"_blank",rel:"noopener noreferrer"},hk={href:"https://owncloud.org/",target:"_blank",rel:"noopener noreferrer"},ck=e("code",null,"AGPLv3",-1),dk=e("code",null,"PHP",-1),_k={href:"https://pydio.com/",target:"_blank",rel:"noopener noreferrer"},uk={href:"https://www.cis.upenn.edu/~bcpierce/unison/",target:"_blank",rel:"noopener noreferrer"},pk=e("code",null,"GPLv3",-1),fk=e("code",null,"OCaml",-1),gk=e("h4",{id:"点对点文件共享",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#点对点文件共享","aria-hidden":"true"},"#"),o(" 点对点文件共享")],-1),bk={href:"http://file.pizza/",target:"_blank",rel:"noopener noreferrer"},mk={href:"https://github.com/kern/filepizza",target:"_blank",rel:"noopener noreferrer"},kk=e("code",null,"BSD",-1),wk=e("code",null,"Nodejs",-1),Pk={href:"https://filetea.me/",target:"_blank",rel:"noopener noreferrer"},yk={href:"https://github.com/elima/FileTea",target:"_blank",rel:"noopener noreferrer"},Sk=e("code",null,"AGPLv3",-1),vk=e("code",null,"C",-1),Ck={href:"https://github.com/feross/instant.io",target:"_blank",rel:"noopener noreferrer"},Ak={href:"https://instant.io",target:"_blank",rel:"noopener noreferrer"},Lk=e("code",null,"MIT",-1),Mk=e("code",null,"Nodejs",-1),Gk={href:"http://erdgeist.org/arts/software/opentracker/",target:"_blank",rel:"noopener noreferrer"},xk={href:"http://erdgeist.org/gitweb/opentracker/",target:"_blank",rel:"noopener noreferrer"},Tk=e("code",null,"Public domain",-1),Ik=e("code",null,"C",-1),Ek={href:"https://github.com/peer5/sharefest",target:"_blank",rel:"noopener noreferrer"},Dk={href:"https://www.sharefest.me/",target:"_blank",rel:"noopener noreferrer"},Bk=e("code",null,"Apache 2.0",-1),Hk=e("code",null,"Nodejs",-1),jk=e("h4",{id:"单击-拖放上传",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#单击-拖放上传","aria-hidden":"true"},"#"),o(" 单击/拖放上传")],-1),Rk={href:"https://github.com/broncowdd/BoZoN",target:"_blank",rel:"noopener noreferrer"},Ok=e("code",null,"AGPLv3",-1),Fk=e("code",null,"PHP",-1),Nk={href:"https://coquelicot.potager.org/",target:"_blank",rel:"noopener noreferrer"},zk=e("code",null,"AGPLv3",-1),Wk={href:"http://projet.idleman.fr/dropcenter/",target:"_blank",rel:"noopener noreferrer"},Jk={href:"https://github.com/silverwind/droppy",target:"_blank",rel:"noopener noreferrer"},Uk={href:"http://droppy.silverwind.io/",target:"_blank",rel:"noopener noreferrer"},Vk=e("code",null,"BSD",-1),qk=e("code",null,"Nodejs",-1),Kk={href:"https://github.com/imgbi/img.bi",target:"_blank",rel:"noopener noreferrer"},Xk={href:"http://img.bi",target:"_blank",rel:"noopener noreferrer"},Yk=e("code",null,"GPLv3",-1),Zk=e("code",null,"Nodejs",-1),Qk={href:"https://ipfs.pics/",target:"_blank",rel:"noopener noreferrer"},$k={href:"https://github.com/ipfspics/server",target:"_blank",rel:"noopener noreferrer"},ew=e("code",null,"AGPLv3",-1),ow=e("code",null,"PHP",-1),rw={href:"https://gitlab.com/mojo42/Jirafeau/wikis/home",target:"_blank",rel:"noopener noreferrer"},tw={href:"http://jirafeau.net/",target:"_blank",rel:"noopener noreferrer"},nw={href:"http://home.gna.org/jyraphe/",target:"_blank",rel:"noopener noreferrer"},sw={href:"https://github.com/andreimarcu/linx-server",target:"_blank",rel:"noopener noreferrer"},lw={href:"https://linx.li/",target:"_blank",rel:"noopener noreferrer"},aw=e("code",null,"GPLv3",-1),iw=e("code",null,"Go",-1),hw={href:"https://git.framasoft.org/luc/lufi",target:"_blank",rel:"noopener noreferrer"},cw={href:"https://demo.lufi.io",target:"_blank",rel:"noopener noreferrer"},dw={href:"https://git.framasoft.org/luc/lufi/tree/master",target:"_blank",rel:"noopener noreferrer"},_w=e("code",null,"AGPLv3",-1),uw=e("code",null,"Perl",-1),pw={href:"https://github.com/ldidry/lutim",target:"_blank",rel:"noopener noreferrer"},fw={href:"https://mediacru.sh/",target:"_blank",rel:"noopener noreferrer"},gw={href:"https://github.com/MediaCrush/MediaCrush",target:"_blank",rel:"noopener noreferrer"},bw={href:"https://minio.io/",target:"_blank",rel:"noopener noreferrer"},mw={href:"https://github.com/minio/minio",target:"_blank",rel:"noopener noreferrer"},kw=e("code",null,"Apache",-1),ww=e("code",null,"Go",-1),Pw={href:"https://github.com/ethanal/nimbus",target:"_blank",rel:"noopener noreferrer"},yw=e("code",null,"MIT",-1),Sw=e("code",null,"Python",-1),vw={href:"https://onionshare.org/",target:"_blank",rel:"noopener noreferrer"},Cw={href:"https://www.pictshare.net/",target:"_blank",rel:"noopener noreferrer"},Aw={href:"https://www.pictshare.net/",target:"_blank",rel:"noopener noreferrer"},Lw={href:"https://github.com/chrisiaut/pictshare",target:"_blank",rel:"noopener noreferrer"},Mw=e("code",null,"Apache",-1),Gw=e("code",null,"PHP/Javascript",-1),xw={href:"https://github.com/Pomf/Pomf",target:"_blank",rel:"noopener noreferrer"},Tw={href:"http://Pomf.se",target:"_blank",rel:"noopener noreferrer"},Iw=e("code",null,"MIT",-1),Ew=e("code",null,"PHP/Nodejs",-1),Dw={href:"http://www.projectsend.org/",target:"_blank",rel:"noopener noreferrer"},Bw={href:"https://github.com/ignacionelson/ProjectSend",target:"_blank",rel:"noopener noreferrer"},Hw=e("code",null,"GPLv2",-1),jw=e("code",null,"PHP",-1),Rw={href:"https://transfer.sh",target:"_blank",rel:"noopener noreferrer"},Ow={href:"https://transfer.sh",target:"_blank",rel:"noopener noreferrer"},Fw={href:"https://github.com/dutchcoders/transfer.sh",target:"_blank",rel:"noopener noreferrer"},Nw=e("code",null,"MIT",-1),zw=e("code",null,"Go",-1),Ww={href:"https://uguu.se/",target:"_blank",rel:"noopener noreferrer"},Jw={href:"https://github.com/nokonoko/uguu",target:"_blank",rel:"noopener noreferrer"},Uw=e("code",null,"MIT",-1),Vw=e("code",null,"PHP",-1),qw={href:"https://github.com/Upload/Up1",target:"_blank",rel:"noopener noreferrer"},Kw={href:"https://up1.ca/",target:"_blank",rel:"noopener noreferrer"},Xw=e("code",null,"MIT",-1),Yw=e("code",null,"Nodejs",-1),Zw={href:"https://u.pste.pw",target:"_blank",rel:"noopener noreferrer"},Qw={href:"https://github.com/TheReverend403/uPste",target:"_blank",rel:"noopener noreferrer"},$w=e("code",null,"AGPLv3",-1),e2=e("code",null,"PHP",-1),o2={href:"http://www.youtransfer.io",target:"_blank",rel:"noopener noreferrer"},r2={href:"http://demo.youtransfer.io/",target:"_blank",rel:"noopener noreferrer"},t2={href:"https://github.com/remie/YouTransfer",target:"_blank",rel:"noopener noreferrer"},n2=e("code",null,"Apache",-1),s2=e("code",null,"Nodejs",-1),l2=e("h4",{id:"基于-web-的文件管理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#基于-web-的文件管理","aria-hidden":"true"},"#"),o(" 基于 Web 的文件管理")],-1),a2={href:"http://adamwhitcroft.com/apaxy/",target:"_blank",rel:"noopener noreferrer"},i2={href:"https://github.com/AdamWhitcroft/Apaxy",target:"_blank",rel:"noopener noreferrer"},h2=e("code",null,"Public domain",-1),c2=e("code",null,"CSS",-1),d2={href:"http://www.directorylister.com/",target:"_blank",rel:"noopener noreferrer"},_2={href:"https://github.com/DirectoryLister/DirectoryLister",target:"_blank",rel:"noopener noreferrer"},u2=e("code",null,"MIT",-1),p2=e("code",null,"PHP",-1),f2={href:"http://encode-explorer.siineiolekala.net/",target:"_blank",rel:"noopener noreferrer"},g2={href:"http://encode-explorer.siineiolekala.net/explorer/index.php",target:"_blank",rel:"noopener noreferrer"},b2={href:"https://github.com/marekrei/encode-explorer",target:"_blank",rel:"noopener noreferrer"},m2=e("code",null,"MIT",-1),k2=e("code",null,"PHP",-1),w2={href:"http://extplorer.sourceforge.net/",target:"_blank",rel:"noopener noreferrer"},P2={href:"https://github.com/soyuka/explorer",target:"_blank",rel:"noopener noreferrer"},y2={href:"https://github.com/soyuka/explorer",target:"_blank",rel:"noopener noreferrer"},S2=e("code",null,"MIT",-1),v2=e("code",null,"Nodejs",-1),C2={href:"https://github.com/xataz/gobrowser",target:"_blank",rel:"noopener noreferrer"},A2={href:"https://github.com/xataz/gobrowser",target:"_blank",rel:"noopener noreferrer"},L2=e("code",null,"GPLv3",-1),M2=e("code",null,"Go",-1),G2={href:"https://larsjung.de/h5ai/",target:"_blank",rel:"noopener noreferrer"},x2={href:"https://larsjung.de/h5ai/demo/",target:"_blank",rel:"noopener noreferrer"},T2={href:"https://github.com/lrsjng/h5ai",target:"_blank",rel:"noopener noreferrer"},I2=e("code",null,"MIT",-1),E2=e("code",null,"PHP/Javascript",-1),D2={href:"http://www.monstaftp.com/",target:"_blank",rel:"noopener noreferrer"},B2={href:"http://mftp.live/",target:"_blank",rel:"noopener noreferrer"},H2={href:"https://github.com/MonstaApps/Monsta-FTP",target:"_blank",rel:"noopener noreferrer"},j2=e("code",null,"GPLv3",-1),R2=e("code",null,"PHP",-1),O2={href:"http://www.resourcespace.org",target:"_blank",rel:"noopener noreferrer"},F2={href:"http://www.resourcespace.org/trial",target:"_blank",rel:"noopener noreferrer"},N2={href:"http://www.resourcespace.org/svn",target:"_blank",rel:"noopener noreferrer"},z2=e("code",null,"BSD/Other",-1),W2=e("code",null,"PHP",-1),J2={href:"https://sprut.io",target:"_blank",rel:"noopener noreferrer"},U2={href:"https://demo.sprut.io:9443",target:"_blank",rel:"noopener noreferrer"},V2={href:"https://github.com/LTD-Beget/sprutio",target:"_blank",rel:"noopener noreferrer"},q2=e("code",null,"GPLv3",-1),K2=e("code",null,"Python",-1),X2=e("h2",{id:"游戏",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#游戏","aria-hidden":"true"},"#"),o(" 游戏")],-1),Y2={href:"https://github.com/Q42/0hh1",target:"_blank",rel:"noopener noreferrer"},Z2={href:"http://0hh1.com/",target:"_blank",rel:"noopener noreferrer"},Q2=e("code",null,"MIT",-1),$2=e("code",null,"HTML5",-1),eP={href:"https://github.com/doublespeakgames/adarkroom",target:"_blank",rel:"noopener noreferrer"},oP={href:"http://adarkroom.doublespeakgames.com/",target:"_blank",rel:"noopener noreferrer"},rP=e("code",null,"MPLv2",-1),tP=e("code",null,"HTML5",-1),nP={href:"https://github.com/huytd/agar.io-clone",target:"_blank",rel:"noopener noreferrer"},sP={href:"http://Agar.io",target:"_blank",rel:"noopener noreferrer"},lP={href:"http://Socket.IO",target:"_blank",rel:"noopener noreferrer"},aP=e("code",null,"MIT",-1),iP=e("code",null,"Nodejs",-1),hP={href:"https://github.com/ellisonleao/clumsy-bird",target:"_blank",rel:"noopener noreferrer"},cP={href:"http://www.ellison.rocks/clumsy-bird/",target:"_blank",rel:"noopener noreferrer"},dP=e("code",null,"MIT",-1),_P=e("code",null,"Nodejs",-1),uP={href:"https://github.com/Kshitij-Banerjee/Cubiks-2048",target:"_blank",rel:"noopener noreferrer"},pP={href:"https://kshitij-banerjee.github.io/Cubiks-2048/",target:"_blank",rel:"noopener noreferrer"},fP=e("code",null,"CCBYNCv4",-1),gP=e("code",null,"HTML5",-1),bP={href:"https://github.com/Hextris/hextris",target:"_blank",rel:"noopener noreferrer"},mP={href:"http://hextris.io/",target:"_blank",rel:"noopener noreferrer"},kP=e("code",null,"GPLv3",-1),wP=e("code",null,"HTML5",-1),PP={href:"https://github.com/abrenaut/posio/",target:"_blank",rel:"noopener noreferrer"},yP={href:"https://posio.abrenaut.com/",target:"_blank",rel:"noopener noreferrer"},SP=e("code",null,"MIT",-1),vP=e("code",null,"Python",-1),CP={href:"http://tournamentmango.com/",target:"_blank",rel:"noopener noreferrer"},AP={href:"https://github.com/seiyria/tournamentmango",target:"_blank",rel:"noopener noreferrer"},LP=e("code",null,"MIT",-1),MP=e("code",null,"Javascript",-1),GP=e("h2",{id:"网关",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#网关","aria-hidden":"true"},"#"),o(" 网关")],-1),xP={href:"https://github.com/liftoff/GateOne/",target:"_blank",rel:"noopener noreferrer"},TP=e("code",null,"AGPLv3",-1),IP={href:"http://guac-dev.org/",target:"_blank",rel:"noopener noreferrer"},EP={href:"https://github.com/glyptodon/",target:"_blank",rel:"noopener noreferrer"},DP=e("code",null,"MIT",-1),BP=e("code",null,"Java/C",-1),HP=e("h2",{id:"groupware-群件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#groupware-群件","aria-hidden":"true"},"#"),o(" Groupware 群件")],-1),jP={href:"http://www.citadel.org/doku.php",target:"_blank",rel:"noopener noreferrer"},RP={href:"http://www.citadel.org/doku.php/installation:source",target:"_blank",rel:"noopener noreferrer"},OP=e("code",null,"GPLv3",-1),FP=e("code",null,"C",-1),NP={href:"https://cozy.io",target:"_blank",rel:"noopener noreferrer"},zP={href:"https://github.com/cozy",target:"_blank",rel:"noopener noreferrer"},WP=e("code",null,"GPLv3",-1),JP=e("code",null,"Nodejs",-1),UP={href:"http://www.egroupware.org/",target:"_blank",rel:"noopener noreferrer"},VP={href:"https://github.com/EGroupware/egroupware",target:"_blank",rel:"noopener noreferrer"},qP=e("code",null,"GPLv2",-1),KP=e("code",null,"PHP",-1),XP={href:"http://www.horde.org/",target:"_blank",rel:"noopener noreferrer"},YP={href:"http://demo.horde.org/login.php",target:"_blank",rel:"noopener noreferrer"},ZP={href:"https://github.com/horde/horde",target:"_blank",rel:"noopener noreferrer"},QP=e("code",null,"GPLv2",-1),$P={href:"https://kolab.org/",target:"_blank",rel:"noopener noreferrer"},ey={href:"https://git.kolab.org/",target:"_blank",rel:"noopener noreferrer"},oy=e("code",null,"Multiple",-1),ry=e("code",null,"C++/Python/PHP",-1),ty={href:"https://kopano.com/",target:"_blank",rel:"noopener noreferrer"},ny={href:"http://demo.kopano.com",target:"_blank",rel:"noopener noreferrer"},sy={href:"https://stash.kopano.io",target:"_blank",rel:"noopener noreferrer"},ly=e("code",null,"AGPLv3",-1),ay=e("code",null,"C/Python/PHP",-1),iy={href:"http://www.mayan-edms.com",target:"_blank",rel:"noopener noreferrer"},hy={href:"http://demo.mayan-edms.com",target:"_blank",rel:"noopener noreferrer"},cy={href:"https://gitlab.com/mayan-edms/mayan-edms",target:"_blank",rel:"noopener noreferrer"},dy=e("code",null,"Apache",-1),_y=e("code",null,"Python/Django",-1),uy={href:"https://openmeetings.apache.org/index.html",target:"_blank",rel:"noopener noreferrer"},py={href:"https://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/",target:"_blank",rel:"noopener noreferrer"},fy=e("code",null,"Apache 2.0",-1),gy=e("code",null,"Java",-1),by={href:"http://www.sogo.nu/",target:"_blank",rel:"noopener noreferrer"},my={href:"http://www.sogo.nu/tour/online_demo.html",target:"_blank",rel:"noopener noreferrer"},ky={href:"http://www.sogo.nu/development/source_code.html",target:"_blank",rel:"noopener noreferrer"},wy=e("code",null,"GPLv1/LGPLv2",-1),Py=e("code",null,"Objective-C",-1),yy={href:"https://www.tine20.org",target:"_blank",rel:"noopener noreferrer"},Sy={href:"https://demo.tine20.net",target:"_blank",rel:"noopener noreferrer"},vy={href:"https://packages.tine20.com/maintenance/source/",target:"_blank",rel:"noopener noreferrer"},Cy=e("code",null,"AGPLv3/Other",-1),Ay=e("code",null,"PHP",-1),Ly={href:"https://www.zimbra.com/downloads/",target:"_blank",rel:"noopener noreferrer"},My={href:"https://www.zimbra.com/open-source-email-overview/",target:"_blank",rel:"noopener noreferrer"},Gy=e("code",null,"GPLv2/CPALv1",-1),xy=e("code",null,"Java",-1),Ty=e("h2",{id:"学习和课程",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#学习和课程","aria-hidden":"true"},"#"),o(" 学习和课程")],-1),Iy={href:"https://chamilo.org/chamilo-lms/",target:"_blank",rel:"noopener noreferrer"},Ey={href:"https://github.com/chamilo/chamilo-lms",target:"_blank",rel:"noopener noreferrer"},Dy=e("code",null,"GPLv3",-1),By=e("code",null,"PHP",-1),Hy={href:"https://www.edx.org/",target:"_blank",rel:"noopener noreferrer"},jy={href:"https://www.edx.org/",target:"_blank",rel:"noopener noreferrer"},Ry={href:"https://github.com/edx/",target:"_blank",rel:"noopener noreferrer"},Oy=e("code",null,"AGPLv3",-1),Fy=e("code",null,"Python",-1),Ny={href:"http://www.lxhive.com/",target:"_blank",rel:"noopener noreferrer"},zy={href:"https://github.com/Brightcookie/lxHive",target:"_blank",rel:"noopener noreferrer"},Wy=e("code",null,"GPLv3",-1),Jy=e("code",null,"PHP",-1),Uy={href:"https://mahara.org/",target:"_blank",rel:"noopener noreferrer"},Vy={href:"https://github.com/MaharaProject/mahara",target:"_blank",rel:"noopener noreferrer"},qy=e("code",null,"GPLv3",-1),Ky=e("code",null,"PHP",-1),Xy={href:"https://moodle.org/",target:"_blank",rel:"noopener noreferrer"},Yy={href:"https://moodle.org/demo/",target:"_blank",rel:"noopener noreferrer"},Zy={href:"https://git.moodle.org/gw",target:"_blank",rel:"noopener noreferrer"},Qy=e("code",null,"GPL",-1),$y=e("code",null,"PHP",-1),e3={href:"https://documen.tician.de/relate/",target:"_blank",rel:"noopener noreferrer"},o3={href:"https://github.com/inducer/relate/",target:"_blank",rel:"noopener noreferrer"},r3=e("code",null,"MIT",-1),t3=e("code",null,"Python",-1),n3={href:"https://www.sakaiproject.org/",target:"_blank",rel:"noopener noreferrer"},s3={href:"https://www.sakaiproject.org/try-sakai",target:"_blank",rel:"noopener noreferrer"},l3={href:"https://github.com/sakaiproject/sakai",target:"_blank",rel:"noopener noreferrer"},a3=e("code",null,"ECLv2",-1),i3=e("code",null,"Java",-1),h3={href:"http://schooltool.org/",target:"_blank",rel:"noopener noreferrer"},c3={href:"http://bazaar.launchpad.net/~schooltool-owners/schooltool/2.8/files",target:"_blank",rel:"noopener noreferrer"},d3=e("code",null,"GPLv2",-1),_3=e("code",null,"Python",-1),u3=e("h2",{id:"地图-gps",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#地图-gps","aria-hidden":"true"},"#"),o(" 地图 & GPS")],-1),p3={href:"https://graphhopper.com/",target:"_blank",rel:"noopener noreferrer"},f3={href:"https://github.com/graphhopper/graphhopper",target:"_blank",rel:"noopener noreferrer"},g3={href:"https://github.com/MapBBCode/share.mapbbcode.org",target:"_blank",rel:"noopener noreferrer"},b3={href:"http://share.mapbbcode.org/",target:"_blank",rel:"noopener noreferrer"},m3=e("code",null,"WTFPL/Other",-1),k3=e("code",null,"PHP/Javascript",-1),w3={href:"http://www.opengts.org/",target:"_blank",rel:"noopener noreferrer"},P3={href:"http://track.opengts.org/track/Track",target:"_blank",rel:"noopener noreferrer"},y3={href:"https://sourceforge.net/projects/opengts/files/server-base/",target:"_blank",rel:"noopener noreferrer"},S3=e("code",null,"Apache",-1),v3=e("code",null,"Java",-1),C3={href:"http://www.openstreetmap.org/",target:"_blank",rel:"noopener noreferrer"},A3={href:"https://github.com/openstreetmap/openstreetmap-website",target:"_blank",rel:"noopener noreferrer"},L3={href:"https://www.traccar.org/",target:"_blank",rel:"noopener noreferrer"},M3={href:"http://demo.traccar.org/",target:"_blank",rel:"noopener noreferrer"},G3={href:"https://github.com/tananaev?tab=repositories",target:"_blank",rel:"noopener noreferrer"},x3=e("code",null,"Apache",-1),T3={href:"https://umap.openstreetmap.fr/en/",target:"_blank",rel:"noopener noreferrer"},I3={href:"https://github.com/umap-project/umap",target:"_blank",rel:"noopener noreferrer"},E3=e("code",null,"WTFPL",-1),D3=e("code",null,"Python/Django",-1),B3=e("h2",{id:"媒体流",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#媒体流","aria-hidden":"true"},"#"),o(" 媒体流")],-1),H3={href:"https://en.wikipedia.org/wiki/List_of_streaming_media_systems",target:"_blank",rel:"noopener noreferrer"},j3={href:"https://en.wikipedia.org/wiki/Comparison_of_streaming_media_systems",target:"_blank",rel:"noopener noreferrer"},R3=e("h3",{id:"语音流",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#语音流","aria-hidden":"true"},"#"),o(" 语音流")],-1),O3={href:"https://www.sourcefabric.org/en/airtime/",target:"_blank",rel:"noopener noreferrer"},F3={href:"https://github.com/sourcefabric/Airtime",target:"_blank",rel:"noopener noreferrer"},N3=e("code",null,"AGPLv3",-1),z3=e("code",null,"PHP",-1),W3={href:"http://ampache.org/",target:"_blank",rel:"noopener noreferrer"},J3={href:"http://play.dogmazic.net/",target:"_blank",rel:"noopener noreferrer"},U3={href:"https://github.com/ampache/ampache",target:"_blank",rel:"noopener noreferrer"},V3=e("code",null,"AGPLv3",-1),q3=e("code",null,"PHP",-1),K3={href:"http://www.fomori.org/cherrymusic/",target:"_blank",rel:"noopener noreferrer"},X3={href:"https://github.com/devsnd/cherrymusic",target:"_blank",rel:"noopener noreferrer"},Y3=e("code",null,"GPLv3",-1),Z3=e("code",null,"Python",-1),Q3={href:"https://github.com/jkbrzt/cloudtunes",target:"_blank",rel:"noopener noreferrer"},$3=e("code",null,"MIT",-1),eS=e("code",null,"Python/Javascript",-1),oS={href:"https://gnu.io/fm/",target:"_blank",rel:"noopener noreferrer"},rS={href:"http://last.fm",target:"_blank",rel:"noopener noreferrer"},tS={href:"http://git.savannah.gnu.org/cgit/librefm.git/",target:"_blank",rel:"noopener noreferrer"},nS=e("code",null,"AGPLv3",-1),sS=e("code",null,"PHP",-1),lS={href:"http://groovebasin.com/",target:"_blank",rel:"noopener noreferrer"},aS={href:"https://github.com/andrewrk/groovebasin",target:"_blank",rel:"noopener noreferrer"},iS=e("code",null,"MIT",-1),hS=e("code",null,"Nodejs",-1),cS={href:"http://www.icecast.org/",target:"_blank",rel:"noopener noreferrer"},dS={href:"https://git.xiph.org/?p=icecast-server.git;a=summary",target:"_blank",rel:"noopener noreferrer"},_S=e("code",null,"GPLv2",-1),uS=e("code",null,"C",-1),pS={href:"http://koel.phanan.net/",target:"_blank",rel:"noopener noreferrer"},fS={href:"https://github.com/phanan/koel",target:"_blank",rel:"noopener noreferrer"},gS=e("code",null,"MIT",-1),bS=e("code",null,"PHP",-1),mS={href:"http://libresonic.org/",target:"_blank",rel:"noopener noreferrer"},kS=e("code",null,"GPLv3",-1),wS=e("code",null,"Java",-1),PS={href:"http://mopidy.readthedocs.org/",target:"_blank",rel:"noopener noreferrer"},yS={href:"https://github.com/mopidy/mopidy",target:"_blank",rel:"noopener noreferrer"},SS=e("code",null,"Apache",-1),vS=e("code",null,"Python",-1),CS={href:"https://github.com/martijnboland/moped",target:"_blank",rel:"noopener noreferrer"},AS=e("code",null,"MIT",-1),LS=e("code",null,"Javascript",-1),MS={href:"https://github.com/pimusicbox/mopidy-musicbox-webclient",target:"_blank",rel:"noopener noreferrer"},GS=e("code",null,"Apache",-1),xS=e("code",null,"Javascript",-1),TS={href:"https://github.com/Lesterpig/mopidy-party",target:"_blank",rel:"noopener noreferrer"},IS=e("code",null,"Apache",-1),ES=e("code",null,"Python/Javascript",-1),DS={href:"http://www.musicpd.org/",target:"_blank",rel:"noopener noreferrer"},BS=e("code",null,"GPLv2",-1),HS=e("code",null,"C++",-1),jS={href:"http://www.ympd.org/",target:"_blank",rel:"noopener noreferrer"},RS={href:"https://github.com/notandy/ympd",target:"_blank",rel:"noopener noreferrer"},OS=e("code",null,"GPLv2",-1),FS=e("code",null,"C",-1),NS={href:"https://www.sonerezh.bzh/",target:"_blank",rel:"noopener noreferrer"},zS={href:"https://www.sonerezh.bzh/demo/",target:"_blank",rel:"noopener noreferrer"},WS={href:"https://www.sonerezh.bzh/docs/",target:"_blank",rel:"noopener noreferrer"},JS={href:"https://github.com/sonerezh/sonerezh",target:"_blank",rel:"noopener noreferrer"},US=e("code",null,"GPLv3",-1),VS=e("code",null,"PHP",-1),qS=e("h3",{id:"视频流",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#视频流","aria-hidden":"true"},"#"),o(" 视频流")],-1),KS={href:"https://github.com/calzoneman/sync",target:"_blank",rel:"noopener noreferrer"},XS={href:"http://cytu.be",target:"_blank",rel:"noopener noreferrer"},YS=e("code",null,"MIT",-1),ZS=e("code",null,"Nodejs",-1),QS={href:"https://github.com/MediaBrowser/Emby",target:"_blank",rel:"noopener noreferrer"},$S=e("code",null,"GPLv2",-1),ev={href:"http://flumotion.net/",target:"_blank",rel:"noopener noreferrer"},ov={href:"https://github.com/Flumotion/flumotion",target:"_blank",rel:"noopener noreferrer"},rv=e("code",null,"LGPLv2",-1),tv=e("code",null,"Python",-1),nv={href:"http://htpc.io/",target:"_blank",rel:"noopener noreferrer"},sv=e("code",null,"MIT",-1),lv={href:"http://www.icecast.org/",target:"_blank",rel:"noopener noreferrer"},av={href:"https://git.xiph.org/?p=icecast-server.git;a=summary",target:"_blank",rel:"noopener noreferrer"},iv=e("code",null,"GPLv2",-1),hv=e("code",null,"C",-1),cv={href:"http://sourceforge.net/projects/minidlna/",target:"_blank",rel:"noopener noreferrer"},dv=e("code",null,"GPLv2",-1),_v=e("code",null,"C",-1),uv={href:"https://datarhei.github.io/restreamer/",target:"_blank",rel:"noopener noreferrer"},pv={href:"https://github.com/datarhei/restreamer",target:"_blank",rel:"noopener noreferrer"},fv=e("code",null,"Apache",-1),gv=e("code",null,"Nodejs",-1),bv={href:"https://wiki.gnome.org/action/show/Projects/Rygel",target:"_blank",rel:"noopener noreferrer"},mv=e("code",null,"GPLv3",-1),kv=e("code",null,"C",-1),wv={href:"https://github.com/dularion/streama",target:"_blank",rel:"noopener noreferrer"},Pv=e("code",null,"MIT",-1),yv=e("code",null,"Java",-1),Sv={href:"https://github.com/ZoneMinder/ZoneMinder",target:"_blank",rel:"noopener noreferrer"},vv=e("code",null,"GPLv2",-1),Cv=e("code",null,"PHP",-1),Av=e("h2",{id:"杂项-其它",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#杂项-其它","aria-hidden":"true"},"#"),o(" 杂项/其它")],-1),Lv={href:"http://easybook-project.org/",target:"_blank",rel:"noopener noreferrer"},Mv={href:"https://github.com/javiereguiluz/easybook",target:"_blank",rel:"noopener noreferrer"},Gv=e("code",null,"MIT",-1),xv=e("code",null,"PHP",-1),Tv={href:"https://geneweb.tuxfamily.org/wiki/GeneWeb",target:"_blank",rel:"noopener noreferrer"},Iv={href:"https://demo.geneweb.tuxfamily.org/gw7/",target:"_blank",rel:"noopener noreferrer"},Ev={href:"https://github.com/geneweb/geneweb",target:"_blank",rel:"noopener noreferrer"},Dv=e("code",null,"GPLv2",-1),Bv=e("code",null,"OCAML",-1),Hv={href:"https://github.com/securestate/king-phisher",target:"_blank",rel:"noopener noreferrer"},jv=e("code",null,"BSD",-1),Rv=e("code",null,"Python",-1),Ov={href:"https://github.com/drichard/mindmaps",target:"_blank",rel:"noopener noreferrer"},Fv={href:"http://drichard.org/mindmaps/",target:"_blank",rel:"noopener noreferrer"},Nv=e("code",null,"AGPLv3",-1),zv=e("code",null,"HTML5",-1),Wv={href:"http://www.paraio.org",target:"_blank",rel:"noopener noreferrer"},Jv={href:"https://github.com/erudika/para",target:"_blank",rel:"noopener noreferrer"},Uv=e("code",null,"Apache",-1),Vv=e("code",null,"Java",-1),qv={href:"https://skygear.io",target:"_blank",rel:"noopener noreferrer"},Kv={href:"https://portal.skygear.io",target:"_blank",rel:"noopener noreferrer"},Xv={href:"https://github.com/SkygearIO/skygear-server",target:"_blank",rel:"noopener noreferrer"},Yv=e("code",null,"Apache",-1),Zv=e("code",null,"Go",-1),Qv={href:"https://www.webtrees.net",target:"_blank",rel:"noopener noreferrer"},$v={href:"https://dev.webtrees.net/demo-stable/index.php?ctype=gedcom&ged=demo",target:"_blank",rel:"noopener noreferrer"},e8={href:"https://github.com/fisharebest/webtrees",target:"_blank",rel:"noopener noreferrer"},o8=e("code",null,"GPLv3",-1),r8=e("code",null,"PHP",-1),t8=e("h2",{id:"资金、预算和管理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#资金、预算和管理","aria-hidden":"true"},"#"),o(" 资金、预算和管理")],-1),n8={href:"https://github.com/arecker/bennedetto",target:"_blank",rel:"noopener noreferrer"},s8=e("code",null,"GPLv3",-1),l8=e("code",null,"Python",-1),a8={href:"http://www.economizzer.org/",target:"_blank",rel:"noopener noreferrer"},i8={href:"https://github.com/gugoan/economizzer",target:"_blank",rel:"noopener noreferrer"},h8=e("code",null,"MIT",-1),c8=e("code",null,"PHP",-1),d8={href:"https://github.com/gaynetdinov/ex_money",target:"_blank",rel:"noopener noreferrer"},_8=e("code",null,"ISC",-1),u8=e("code",null,"Elixir",-1),p8={href:"https://jc5.github.io/firefly-iii/",target:"_blank",rel:"noopener noreferrer"},f8=e("code",null,"MIT",-1),g8=e("code",null,"PHP",-1),b8={href:"http://galette.eu/dc/",target:"_blank",rel:"noopener noreferrer"},m8={href:"http://git.tuxfamily.org/galette/galette.git/",target:"_blank",rel:"noopener noreferrer"},k8=e("code",null,"GPLv3",-1),w8=e("code",null,"PHP",-1),P8={href:"http://www.glpi-project.org/spip.php?lang=en",target:"_blank",rel:"noopener noreferrer"},y8={href:"https://forge.glpi-project.org/projects/glpi",target:"_blank",rel:"noopener noreferrer"},S8=e("code",null,"GPLv2",-1),v8=e("code",null,"PHP",-1),C8={href:"http://grr.devome.com/?lang=en",target:"_blank",rel:"noopener noreferrer"},A8={href:"http://grr.devome.com/demo/week_all.php?year=2015&month=07&day=28&area=94",target:"_blank",rel:"noopener noreferrer"},L8=e("em",null,"administrateur/azerty",-1),M8=e("code",null,"GPLv2",-1),G8=e("code",null,"PHP",-1),x8={href:"http://hospitalrun.io/",target:"_blank",rel:"noopener noreferrer"},T8={href:"https://github.com/HospitalRun/hospitalrun-server",target:"_blank",rel:"noopener noreferrer"},I8={href:"http://hospitalrun.io/demo/",target:"_blank",rel:"noopener noreferrer"},E8=e("code",null,"GPLv3",-1),D8=e("code",null,"Nodejs/Ember",-1),B8={href:"https://inventaire.io/welcome",target:"_blank",rel:"noopener noreferrer"},H8={href:"https://github.com/inventaire/inventaire",target:"_blank",rel:"noopener noreferrer"},j8=e("code",null,"AGPLv3",-1),R8=e("code",null,"Nodejs",-1),O8={href:"https://www.invoiceninja.org/",target:"_blank",rel:"noopener noreferrer"},F8={href:"https://app.invoiceninja.com/invoices/create",target:"_blank",rel:"noopener noreferrer"},N8={href:"https://github.com/invoiceninja/invoiceninja",target:"_blank",rel:"noopener noreferrer"},z8=e("code",null,"AAL",-1),W8=e("code",null,"PHP",-1),J8={href:"https://invoiceplane.com/",target:"_blank",rel:"noopener noreferrer"},U8={href:"https://demo.invoiceplane.com",target:"_blank",rel:"noopener noreferrer"},V8={href:"https://github.com/InvoicePlane/InvoicePlane",target:"_blank",rel:"noopener noreferrer"},q8=e("code",null,"MIT",-1),K8={href:"http://ihatemoney.org/",target:"_blank",rel:"noopener noreferrer"},X8={href:"https://github.com/spiral-project/ihatemoney",target:"_blank",rel:"noopener noreferrer"},Y8=e("code",null,"BSD",-1),Z8=e("code",null,"Python",-1),Q8={href:"http://www.tryton.org/",target:"_blank",rel:"noopener noreferrer"},$8={href:"http://demo.tryton.org",target:"_blank",rel:"noopener noreferrer"},e9={href:"https://hg.tryton.org",target:"_blank",rel:"noopener noreferrer"},o9=e("code",null,"GPLv3",-1),r9=e("code",null,"Python",-1),t9={href:"https://koha-community.org/",target:"_blank",rel:"noopener noreferrer"},n9={href:"https://github.com/Koha-Community/Koha",target:"_blank",rel:"noopener noreferrer"},s9=e("code",null,"GPLv3",-1),l9=e("code",null,"Perl",-1),a9={href:"https://www.partkeepr.org",target:"_blank",rel:"noopener noreferrer"},i9={href:"https://demo.partkeepr.org/",target:"_blank",rel:"noopener noreferrer"},h9={href:"https://github.com/partkeepr/PartKeepr",target:"_blank",rel:"noopener noreferrer"},c9=e("code",null,"GPLv3",-1),d9=e("code",null,"PHP",-1),_9={href:"https://dev.sigpipe.me/dashie/StockazNG",target:"_blank",rel:"noopener noreferrer"},u9=e("code",null,"MIT",-1),p9=e("code",null,"Python",-1),f9=e("h2",{id:"监测",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#监测","aria-hidden":"true"},"#"),o(" 监测")],-1),g9={href:"https://github.com/n1trux/awesome-sysadmin#monitoring",target:"_blank",rel:"noopener noreferrer"},b9={href:"https://github.com/n1trux/awesome-sysadmin#metric--metric-collection",target:"_blank",rel:"noopener noreferrer"},m9=e("h2",{id:"笔记-编辑器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#笔记-编辑器","aria-hidden":"true"},"#"),o(" 笔记 & 编辑器")],-1),k9={href:"http://dillinger.io/",target:"_blank",rel:"noopener noreferrer"},w9={href:"https://github.com/joemccann/dillinger/",target:"_blank",rel:"noopener noreferrer"},P9=e("code",null,"MIT",-1),y9=e("code",null,"Nodejs",-1),S9={href:"https://github.com/yosko/jotter",target:"_blank",rel:"noopener noreferrer"},v9={href:"http://tools.yosko.net/demos/jotter/",target:"_blank",rel:"noopener noreferrer"},C9=e("code",null,"LGPLv3",-1),A9=e("code",null,"PHP",-1),L9={href:"https://laverna.cc/",target:"_blank",rel:"noopener noreferrer"},M9={href:"https://laverna.cc/index.html#notes",target:"_blank",rel:"noopener noreferrer"},G9={href:"https://github.com/Laverna/laverna",target:"_blank",rel:"noopener noreferrer"},x9=e("code",null,"MPLv2",-1),T9=e("code",null,"Nodejs",-1),I9={href:"http://leanote.org/",target:"_blank",rel:"noopener noreferrer"},E9={href:"https://leanote.com/note",target:"_blank",rel:"noopener noreferrer"},D9={href:"https://github.com/leanote/leanote",target:"_blank",rel:"noopener noreferrer"},B9=e("code",null,"GPLv2",-1),H9=e("code",null,"Go",-1),j9={href:"http://georgeosddev.github.com/markdown-edit/",target:"_blank",rel:"noopener noreferrer"},R9={href:"https://github.com/georgeOsdDev/markdown-edit",target:"_blank",rel:"noopener noreferrer"},O9=e("code",null,"MIT",-1),F9=e("code",null,"HTML5",-1),N9={href:"https://github.com/pereorga/minimalist-web-notepad",target:"_blank",rel:"noopener noreferrer"},z9={href:"http://notepad.cc",target:"_blank",rel:"noopener noreferrer"},W9=e("code",null,"Apache",-1),J9=e("code",null,"PHP",-1),U9={href:"https://github.com/SSilence/notes",target:"_blank",rel:"noopener noreferrer"},V9=e("code",null,"GPLv3",-1),q9=e("code",null,"PHP",-1),K9={href:"https://github.com/FoxUSA/OpenNote",target:"_blank",rel:"noopener noreferrer"},X9={href:"https://foxusa.github.io/OpenNote/OpenNote/#/folder",target:"_blank",rel:"noopener noreferrer"},Y9=e("code",null,"MIT",-1),Z9=e("code",null,"HTML5",-1),Q9={href:"http://paperwork.rocks",target:"_blank",rel:"noopener noreferrer"},$9={href:"https://github.com/twostairs/paperwork",target:"_blank",rel:"noopener noreferrer"},eC=e("code",null,"MIT",-1),oC=e("code",null,"PHP",-1),rC={href:"https://www.sharelatex.com/",target:"_blank",rel:"noopener noreferrer"},tC={href:"https://github.com/sharelatex/sharelatex",target:"_blank",rel:"noopener noreferrer"},nC=e("code",null,"AGPLv3",-1),sC=e("code",null,"Ruby",-1),lC={href:"https://turtl.it/",target:"_blank",rel:"noopener noreferrer"},aC={href:"https://github.com/turtl",target:"_blank",rel:"noopener noreferrer"},iC=e("code",null,"GPLv3",-1),hC=e("code",null,"CommonLisp",-1),cC=e("h2",{id:"办公套件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#办公套件","aria-hidden":"true"},"#"),o(" 办公套件")],-1),dC={href:"https://ethercalc.org/",target:"_blank",rel:"noopener noreferrer"},_C={href:"https://github.com/audreyt/ethercalc",target:"_blank",rel:"noopener noreferrer"},uC=e("code",null,"CPALv1/Other",-1),pC=e("code",null,"Nodejs",-1),fC={href:"http://etherpad.org/",target:"_blank",rel:"noopener noreferrer"},gC=e("code",null,"Apache",-1),bC={href:"https://github.com/gobby/gobby/wiki/Dedicated%20Server",target:"_blank",rel:"noopener noreferrer"},mC={href:"https://github.com/gobby/gobby/wiki",target:"_blank",rel:"noopener noreferrer"},kC={href:"https://github.com/gobby/gobby",target:"_blank",rel:"noopener noreferrer"},wC=e("code",null,"MIT",-1),PC=e("code",null,"C++",-1),yC={href:"http://onlyoffice.org/",target:"_blank",rel:"noopener noreferrer"},SC={href:"https://github.com/ONLYOFFICE/DocumentServer",target:"_blank",rel:"noopener noreferrer"},vC=e("code",null,"AGPLv3",-1),CC=e("code",null,"Nodejs",-1),AC={href:"http://phpoffice.github.io/",target:"_blank",rel:"noopener noreferrer"},LC=e("code",null,"LGPLv3",-1),MC=e("code",null,"PHP",-1),GC={href:"http://webodf.org/",target:"_blank",rel:"noopener noreferrer"},xC={href:"https://github.com/kogmbh/WebODF",target:"_blank",rel:"noopener noreferrer"},TC=e("code",null,"AGPLv3",-1),IC=e("code",null,"Javascript",-1),EC={href:"https://doc.owncloud.org/server/8.2/user_manual/documents.html",target:"_blank",rel:"noopener noreferrer"},DC={href:"https://github.com/owncloud/documents",target:"_blank",rel:"noopener noreferrer"},BC=e("code",null,"AGPLv3",-1),HC=e("code",null,"PHP",-1),jC=e("h2",{id:"密码管理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#密码管理","aria-hidden":"true"},"#"),o(" 密码管理")],-1),RC={href:"https://keeweb.info/",target:"_blank",rel:"noopener noreferrer"},OC={href:"https://github.com/keeweb/keeweb",target:"_blank",rel:"noopener noreferrer"},FC=e("code",null,"MIT",-1),NC=e("code",null,"Javascript",-1),zC={href:"http://www.ppma.pw",target:"_blank",rel:"noopener noreferrer"},WC={href:"https://github.com/pklink/ppma",target:"_blank",rel:"noopener noreferrer"},JC=e("code",null,"BSD",-1),UC=e("code",null,"PHP",-1),VC={href:"http://rattic.org/",target:"_blank",rel:"noopener noreferrer"},qC={href:"https://github.com/tildaslash/RatticWeb",target:"_blank",rel:"noopener noreferrer"},KC={href:"https://demo.rattic.org/cred/list/",target:"_blank",rel:"noopener noreferrer"},XC={href:"http://www.syspass.org/",target:"_blank",rel:"noopener noreferrer"},YC={href:"https://github.com/nuxsmin/sysPass",target:"_blank",rel:"noopener noreferrer"},ZC={href:"http://demo.syspass.org/",target:"_blank",rel:"noopener noreferrer"},QC=e("code",null,"GPLv3",-1),$C=e("code",null,"PHP",-1),e5={href:"http://teampass.net/",target:"_blank",rel:"noopener noreferrer"},o5={href:"https://github.com/nilsteampassnet/TeamPass/",target:"_blank",rel:"noopener noreferrer"},r5=e("code",null,"GPLv3",-1),t5=e("code",null,"PHP",-1),n5=e("h2",{id:"pastebins",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#pastebins","aria-hidden":"true"},"#"),o(" Pastebins")],-1),s5={href:"https://github.com/sametmax/0bin",target:"_blank",rel:"noopener noreferrer"},l5=e("code",null,"WTFPL",-1),a5=e("code",null,"Python",-1),i5={href:"https://cryptonote.me/",target:"_blank",rel:"noopener noreferrer"},h5={href:"https://github.com/alainmeier/cryptonote",target:"_blank",rel:"noopener noreferrer"},c5=e("code",null,"BSD",-1),d5=e("code",null,"Ruby",-1),_5={href:"https://gitlab.deblan.org/deblan/gist",target:"_blank",rel:"noopener noreferrer"},u5=e("code",null,"GPLv3",-1),p5=e("code",null,"PHP",-1),f5={href:"http://hastebin.com/about.md",target:"_blank",rel:"noopener noreferrer"},g5={href:"http://hastebin.com/",target:"_blank",rel:"noopener noreferrer"},b5={href:"https://github.com/seejohnrun/haste-server",target:"_blank",rel:"noopener noreferrer"},m5=e("code",null,"MIT",-1),k5=e("code",null,"Nodejs",-1),w5={href:"https://github.com/petermaloney/localpaste",target:"_blank",rel:"noopener noreferrer"},P5=e("code",null,"GPLv2",-1),y5=e("code",null,"Python",-1),S5={href:"https://notehub.org",target:"_blank",rel:"noopener noreferrer"},v5={href:"https://notehub.org",target:"_blank",rel:"noopener noreferrer"},C5={href:"https://github.com/chmllr/NoteHub",target:"_blank",rel:"noopener noreferrer"},A5=e("code",null,"MIT",-1),L5=e("code",null,"Nodejs",-1),M5={href:"https://p.pantsu.cat",target:"_blank",rel:"noopener noreferrer"},G5={href:"https://p.pantsu.cat",target:"_blank",rel:"noopener noreferrer"},x5={href:"https://github.com/ewhal/Pastebin",target:"_blank",rel:"noopener noreferrer"},T5=e("code",null,"MIT",-1),I5=e("code",null,"Go",-1),E5={href:"http://pastedown.ctrl-c.us/",target:"_blank",rel:"noopener noreferrer"},D5={href:"https://github.com/cespare/pastedown",target:"_blank",rel:"noopener noreferrer"},B5=e("code",null,"MIT",-1),H5=e("code",null,"Go",-1),j5={href:"https://github.com/ptpb/pb",target:"_blank",rel:"noopener noreferrer"},R5={href:"https://ptpb.pw/",target:"_blank",rel:"noopener noreferrer"},O5=e("code",null,"GPLv3",-1),F5=e("code",null,"Python/Flask",-1),N5={href:"https://github.com/bhanderson/pbnh",target:"_blank",rel:"noopener noreferrer"},z5=e("code",null,"MIT",-1),W5=e("code",null,"Python/Flask",-1),J5={href:"https://pste.pw",target:"_blank",rel:"noopener noreferrer"},U5={href:"https://github.com/FoxDev/Phaste",target:"_blank",rel:"noopener noreferrer"},V5=e("code",null,"AGPLv3",-1),q5=e("code",null,"PHP",-1),K5={href:"https://snipt.net/",target:"_blank",rel:"noopener noreferrer"},X5={href:"https://github.com/nicksergeant/snipt/",target:"_blank",rel:"noopener noreferrer"},Y5=e("code",null,"BSD",-1),Z5=e("code",null,"Python",-1),Q5={href:"http://sayakb.github.io/sticky-notes/",target:"_blank",rel:"noopener noreferrer"},$5={href:"https://github.com/sayakb/sticky-notes",target:"_blank",rel:"noopener noreferrer"},e4=e("code",null,"PHP",-1),o4={href:"https://github.com/claudehohl/Stikked",target:"_blank",rel:"noopener noreferrer"},r4=e("code",null,"GPLv3",-1),t4=e("code",null,"PHP",-1),n4={href:"https://github.com/andreineculau/tastebin",target:"_blank",rel:"noopener noreferrer"},s4=e("code",null,"Apache",-1),l4=e("code",null,"Nodejs",-1),a4={href:"https://github.com/elrido/ZeroBin/wiki",target:"_blank",rel:"noopener noreferrer"},i4={href:"https://zerobin.dssr.ch/",target:"_blank",rel:"noopener noreferrer"},h4={href:"https://github.com/elrido/ZeroBin",target:"_blank",rel:"noopener noreferrer"},c4=e("code",null,"Zlib",-1),d4=e("code",null,"PHP",-1),_4=e("h2",{id:"个人仪表盘",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#个人仪表盘","aria-hidden":"true"},"#"),o(" 个人仪表盘")],-1),u4={href:"http://shopify.github.io/dashing/",target:"_blank",rel:"noopener noreferrer"},p4={href:"http://dashingdemo.herokuapp.com/sample",target:"_blank",rel:"noopener noreferrer"},f4={href:"https://github.com/Shopify/dashing",target:"_blank",rel:"noopener noreferrer"},g4=e("code",null,"MIT",-1),b4=e("code",null,"Ruby",-1),m4={href:"https://github.com/foxmask/dj-diabetes",target:"_blank",rel:"noopener noreferrer"},k4=e("code",null,"BSD",-1),w4=e("code",null,"Python",-1),P4={href:"https://freeboard.io",target:"_blank",rel:"noopener noreferrer"},y4={href:"https://github.com/freeboard/freeboard",target:"_blank",rel:"noopener noreferrer"},S4=e("code",null,"MIT",-1),v4=e("code",null,"Nodejs",-1),C4={href:"http://grafana.org/",target:"_blank",rel:"noopener noreferrer"},A4={href:"https://github.com/grafana",target:"_blank",rel:"noopener noreferrer"},L4=e("code",null,"Apache",-1),M4=e("code",null,"Go",-1),G4={href:"http://habitica.com/",target:"_blank",rel:"noopener noreferrer"},x4={href:"https://github.com/HabitRPG/habitrpg",target:"_blank",rel:"noopener noreferrer"},T4=e("code",null,"GPLv3/Other",-1),I4=e("code",null,"Nodejs",-1),E4={href:"http://phant.io/",target:"_blank",rel:"noopener noreferrer"},D4={href:"https://data.sparkfun.com/",target:"_blank",rel:"noopener noreferrer"},B4={href:"https://github.com/sparkfun/phant",target:"_blank",rel:"noopener noreferrer"},H4=e("code",null,"GPLv3",-1),j4=e("code",null,"Nodejs",-1),R4={href:"https://github.com/Reportr/dashboard",target:"_blank",rel:"noopener noreferrer"},O4={href:"https://github.com/Reportr/dashboard",target:"_blank",rel:"noopener noreferrer"},F4={href:"https://thingspeak.com/",target:"_blank",rel:"noopener noreferrer"},N4={href:"https://thingspeak.com/channels/public",target:"_blank",rel:"noopener noreferrer"},z4={href:"https://github.com/iobridge/thingspeak",target:"_blank",rel:"noopener noreferrer"},W4=e("code",null,"GPL",-1),J4=e("code",null,"Ruby",-1),U4={href:"http://allegro.tech/tipboard/",target:"_blank",rel:"noopener noreferrer"},V4={href:"https://github.com/allegro/tipboard",target:"_blank",rel:"noopener noreferrer"},q4=e("code",null,"Apache",-1),K4=e("code",null,"Python",-1),X4={href:"https://github.com/rolandgeider/wger",target:"_blank",rel:"noopener noreferrer"},Y4={href:"https://wger.de",target:"_blank",rel:"noopener noreferrer"},Z4=e("code",null,"AGPLv3",-1),Q4=e("code",null,"Python",-1),$4=e("h2",{id:"照片和视频库",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#照片和视频库","aria-hidden":"true"},"#"),o(" 照片和视频库")],-1),e0={href:"https://github.com/Chevereto/Chevereto-2.X",target:"_blank",rel:"noopener noreferrer"},o0={href:"https://github.com/Chevereto/Chevereto-2.X",target:"_blank",rel:"noopener noreferrer"},r0=e("code",null,"MIT",-1),t0=e("code",null,"PHP",-1),n0={href:"http://cumulusclips.org/",target:"_blank",rel:"noopener noreferrer"},s0={href:"https://tube.devosi.org/",target:"_blank",rel:"noopener noreferrer"},l0=e("code",null,"GPLv2",-1),a0=e("code",null,"PHP",-1),i0={href:"http://koken.me/",target:"_blank",rel:"noopener noreferrer"},h0=e("code",null,"PHP",-1),c0={href:"http://lychee.electerious.com/",target:"_blank",rel:"noopener noreferrer"},d0={href:"https://github.com/electerious/Lychee",target:"_blank",rel:"noopener noreferrer"},_0=e("code",null,"MIT",-1),u0=e("code",null,"PHP",-1),p0={href:"http://mediadrop.net/",target:"_blank",rel:"noopener noreferrer"},f0={href:"https://github.com/mediadrop/mediadrop",target:"_blank",rel:"noopener noreferrer"},g0=e("code",null,"GPLv3",-1),b0=e("code",null,"Python",-1),m0={href:"http://mediagoblin.org",target:"_blank",rel:"noopener noreferrer"},k0=e("code",null,"AGPLv3",-1),w0=e("code",null,"Python",-1),P0={href:"https://github.com/sebsauvage/MinigalNano",target:"_blank",rel:"noopener noreferrer"},y0={href:"http://boards.tomcanac.com/",target:"_blank",rel:"noopener noreferrer"},S0=e("code",null,"CC BY-SA 3.0",-1),v0=e("code",null,"PHP",-1),C0={href:"https://github.com/hillman/phog",target:"_blank",rel:"noopener noreferrer"},A0=e("code",null,"Python",-1),L0={href:"http://blog.zx2c4.com/567",target:"_blank",rel:"noopener noreferrer"},M0={href:"http://photos.jasondonenfeld.com/",target:"_blank",rel:"noopener noreferrer"},G0=e("code",null,"GPLv2",-1),x0=e("code",null,"Javascript",-1),T0={href:"https://github.com/thibaud-rohmer/PhotoLight",target:"_blank",rel:"noopener noreferrer"},I0=e("code",null,"GPLv3",-1),E0=e("code",null,"PHP",-1),D0={href:"http://www.photoshow-gallery.com/",target:"_blank",rel:"noopener noreferrer"},B0={href:"https://github.com/thibaud-rohmer/PhotoShow",target:"_blank",rel:"noopener noreferrer"},H0=e("code",null,"Javascript",-1),j0=e("code",null,"GPLv3",-1),R0={href:"http://piwigo.org/",target:"_blank",rel:"noopener noreferrer"},O0=e("code",null,"GPLv2",-1),F0=e("code",null,"PHP",-1),N0={href:"http://blog.plumi.org/",target:"_blank",rel:"noopener noreferrer"},z0={href:"https://github.com/plumi/plumi.app",target:"_blank",rel:"noopener noreferrer"},W0=e("code",null,"GPLv2",-1),J0=e("code",null,"Python",-1),U0={href:"https://github.com/dmpop/pygmyfoto",target:"_blank",rel:"noopener noreferrer"},V0=e("code",null,"PHP",-1),q0={href:"http://shot.io/",target:"_blank",rel:"noopener noreferrer"},K0={href:"https://github.com/AliasIO/Shot.io",target:"_blank",rel:"noopener noreferrer"},X0=e("code",null,"GPLv3",-1),Y0=e("code",null,"PHP",-1),Z0={href:"https://github.com/saimn/sigal",target:"_blank",rel:"noopener noreferrer"},Q0=e("code",null,"MIT",-1),$0=e("code",null,"Python",-1),e6={href:"http://www.ubergallery.net",target:"_blank",rel:"noopener noreferrer"},o6={href:"https://github.com/UberGallery/UberGallery",target:"_blank",rel:"noopener noreferrer"},r6=e("code",null,"MIT",-1),t6=e("code",null,"PHP",-1),n6={href:"http://videobin.org/code",target:"_blank",rel:"noopener noreferrer"},s6={href:"http://videobin.org/",target:"_blank",rel:"noopener noreferrer"},l6={href:"https://r-w-x.org/videobin.git",target:"_blank",rel:"noopener noreferrer"},a6=e("code",null,"GPLv3",-1),i6=e("code",null,"Python",-1),h6={href:"http://www.zenphoto.org/",target:"_blank",rel:"noopener noreferrer"},c6={href:"https://github.com/zenphoto/zenphoto",target:"_blank",rel:"noopener noreferrer"},d6=e("code",null,"GPLv2",-1),_6=e("code",null,"PHP",-1),u6=e("h2",{id:"投票与事件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#投票与事件","aria-hidden":"true"},"#"),o(" 投票与事件")],-1),p6={href:"http://primelife.ercim.eu/results/opensource/63-dudle",target:"_blank",rel:"noopener noreferrer"},f6={href:"https://dudle.inf.tu-dresden.de/",target:"_blank",rel:"noopener noreferrer"},g6=e("code",null,"AGPLv3",-1),b6=e("code",null,"Ruby",-1),m6={href:"https://framadate.org/",target:"_blank",rel:"noopener noreferrer"},k6={href:"https://framadate.org/aqg259dth55iuhwm",target:"_blank",rel:"noopener noreferrer"},w6={href:"https://git.framasoft.org/framasoft/framadate",target:"_blank",rel:"noopener noreferrer"},P6=e("code",null,"CeCILL-B",-1),y6=e("code",null,"PHP",-1),S6={href:"http://kyela.net/",target:"_blank",rel:"noopener noreferrer"},v6={href:"http://kyela.net/55232734237c8/",target:"_blank",rel:"noopener noreferrer"},C6={href:"https://github.com/abienvenu/Kyela",target:"_blank",rel:"noopener noreferrer"},A6={href:"https://www.limesurvey.org",target:"_blank",rel:"noopener noreferrer"},L6={href:"https://demo.limesurvey.org",target:"_blank",rel:"noopener noreferrer"},M6={href:"https://github.com/nearbycoder/materialpoll",target:"_blank",rel:"noopener noreferrer"},G6={href:"http://strawpoll.me",target:"_blank",rel:"noopener noreferrer"},x6={href:"http://materialpoll.tk",target:"_blank",rel:"noopener noreferrer"},T6={href:"https://github.com/nearbycoder/materialpoll",target:"_blank",rel:"noopener noreferrer"},I6={href:"https://nuages.domainepublic.net/",target:"_blank",rel:"noopener noreferrer"},E6={href:"http://git.domainepublic.net/?p=nuages.git;a=tree",target:"_blank",rel:"noopener noreferrer"},D6=e("code",null,"GPLv3",-1),B6=e("code",null,"Python/Django",-1),H6={href:"https://tellform.com",target:"_blank",rel:"noopener noreferrer"},j6={href:"https://stage.tellform.com/#!/forms/57196d592601ed12074eecc0",target:"_blank",rel:"noopener noreferrer"},R6={href:"https://github.com/whitef0x0/tellform",target:"_blank",rel:"noopener noreferrer"},O6=e("code",null,"MIT",-1),F6=e("code",null,"Nodejs",-1),N6=e("h2",{id:"代理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#代理","aria-hidden":"true"},"#"),o(" 代理")],-1),z6={href:"https://github.com/thekvs/microproxy",target:"_blank",rel:"noopener noreferrer"},W6={href:"https://github.com/thekvs/microproxy",target:"_blank",rel:"noopener noreferrer"},J6=e("code",null,"MIT",-1),U6=e("code",null,"Go",-1),V6={href:"https://github.com/joshdick/miniProxy/",target:"_blank",rel:"noopener noreferrer"},q6={href:"https://github.com/joshdick/miniProxy/",target:"_blank",rel:"noopener noreferrer"},K6=e("code",null,"GPLv3",-1),X6=e("code",null,"PHP",-1),Y6={href:"http://lehollandaisvolant.net/tout/oranjeproxy/",target:"_blank",rel:"noopener noreferrer"},Z6={href:"https://github.com/AmauryCarrade/OranjeProxy",target:"_blank",rel:"noopener noreferrer"},Q6=e("code",null,"GPLv2",-1),$6=e("code",null,"PHP",-1),e7={href:"http://www.apsis.ch/pound/",target:"_blank",rel:"noopener noreferrer"},o7={href:"http://www.apsis.ch/pound/",target:"_blank",rel:"noopener noreferrer"},r7=e("code",null,"GPLv2",-1),t7=e("code",null,"C",-1),n7={href:"http://www.privoxy.org",target:"_blank",rel:"noopener noreferrer"},s7=e("code",null,"GPLv2",-1),l7=e("code",null,"C",-1),a7={href:"http://www.scotty-transporter.org/",target:"_blank",rel:"noopener noreferrer"},i7={href:"https://github.com/SSilence/scotty",target:"_blank",rel:"noopener noreferrer"},h7=e("code",null,"GPLv3",-1),c7=e("code",null,"Java",-1),d7={href:"http://www.squid-cache.org/",target:"_blank",rel:"noopener noreferrer"},_7={href:"http://bazaar.launchpad.net/~squid/squid/3-trunk/files",target:"_blank",rel:"noopener noreferrer"},u7=e("code",null,"GPLv2",-1),p7=e("code",null,"C",-1),f7={href:"https://swiperproxy.github.io/",target:"_blank",rel:"noopener noreferrer"},g7={href:"http://proxy.donttrustrobots.nl/",target:"_blank",rel:"noopener noreferrer"},b7={href:"https://github.com/swiperproxy/swiperproxy",target:"_blank",rel:"noopener noreferrer"},m7=e("code",null,"MIT",-1),k7={href:"https://banu.com/tinyproxy/",target:"_blank",rel:"noopener noreferrer"},w7={href:"https://git.banu.com/tinyproxy/",target:"_blank",rel:"noopener noreferrer"},P7=e("code",null,"GPLv2",-1),y7=e("code",null,"C",-1),S7={href:"https://traefik.io/",target:"_blank",rel:"noopener noreferrer"},v7={href:"https://github.com/containous/traefik",target:"_blank",rel:"noopener noreferrer"},C7=e("code",null,"MIT",-1),A7=e("code",null,"Go",-1),L7=e("h2",{id:"稍后阅读列表",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#稍后阅读列表","aria-hidden":"true"},"#"),o(" 稍后阅读列表")],-1),M7={href:"http://keeper.nunux.org/",target:"_blank",rel:"noopener noreferrer"},G7={href:"https://github.com/ncarlier/nunux-keeper",target:"_blank",rel:"noopener noreferrer"},x7=e("code",null,"GPLv3",-1),T7=e("code",null,"Nodejs",-1),I7={href:"https://github.com/memiks/readityourself",target:"_blank",rel:"noopener noreferrer"},E7={href:"http://www.readityourself.net/",target:"_blank",rel:"noopener noreferrer"},D7=e("code",null,"MIT",-1),B7=e("code",null,"PHP",-1),H7={href:"https://www.wallabag.org/?lang=fr_fr",target:"_blank",rel:"noopener noreferrer"},j7={href:"http://demo.wallabag.org/",target:"_blank",rel:"noopener noreferrer"},R7={href:"http://www.framabag.org/",target:"_blank",rel:"noopener noreferrer"},O7={href:"https://github.com/wallabag/wallabag",target:"_blank",rel:"noopener noreferrer"},F7=e("code",null,"MIT",-1),N7=e("code",null,"PHP",-1),z7=e("h2",{id:"搜索引擎",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#搜索引擎","aria-hidden":"true"},"#"),o(" 搜索引擎")],-1),W7={href:"http://www.gigablast.com/",target:"_blank",rel:"noopener noreferrer"},J7={href:"http://www.gigablast.com/",target:"_blank",rel:"noopener noreferrer"},U7={href:"https://github.com/gigablast/open-source-search-engine",target:"_blank",rel:"noopener noreferrer"},V7=e("code",null,"Apache",-1),q7=e("code",null,"C++",-1),K7={href:"https://github.com/asciimoo/searx",target:"_blank",rel:"noopener noreferrer"},X7={href:"https://searx.me/",target:"_blank",rel:"noopener noreferrer"},Y7={href:"https://github.com/asciimoo/searx/wiki/Searx-instances",target:"_blank",rel:"noopener noreferrer"},Z7={href:"https://beniz.github.io/seeks/",target:"_blank",rel:"noopener noreferrer"},Q7=e("code",null,"AGPLv3",-1),$7=e("code",null,"C++",-1),eA={href:"http://yacy.net/en/index.html",target:"_blank",rel:"noopener noreferrer"},oA=e("code",null,"GPL2",-1),rA=e("code",null,"Java",-1),tA=n('

        软件开发

        项目管理

        See also Ticketing, Task management/To-do lists*

        ',3),nA={href:"https://bloodhound.apache.org/",target:"_blank",rel:"noopener noreferrer"},sA=e("code",null,"Apache",-1),lA=e("code",null,"Python",-1),aA={href:"https://www.casebox.org",target:"_blank",rel:"noopener noreferrer"},iA={href:"https://www.fossil-scm.org/index.html/doc/trunk/www/index.wiki",target:"_blank",rel:"noopener noreferrer"},hA=e("code",null,"BSD",-1),cA=e("code",null,"C",-1),dA={href:"https://gitbucket.github.io/gitbucket-news/",target:"_blank",rel:"noopener noreferrer"},_A={href:"https://github.com/gitbucket/gitbucket",target:"_blank",rel:"noopener noreferrer"},uA={href:"http://gitlab.org/",target:"_blank",rel:"noopener noreferrer"},pA={href:"https://git.framasoft.org/",target:"_blank",rel:"noopener noreferrer"},fA={href:"http://gitlist.org/",target:"_blank",rel:"noopener noreferrer"},gA={href:"https://github.com/klaussilveira/gitlist",target:"_blank",rel:"noopener noreferrer"},bA={href:"http://gitprep.yukikimoto.com/",target:"_blank",rel:"noopener noreferrer"},mA={href:"https://github.com/yuki-kimoto/gitprep",target:"_blank",rel:"noopener noreferrer"},kA={href:"http://perlcodesample.sakura.ne.jp/gitprep/gitprep.cgi",target:"_blank",rel:"noopener noreferrer"},wA={href:"https://github.com/gogits/gogs",target:"_blank",rel:"noopener noreferrer"},PA={href:"https://try.gogs.io/",target:"_blank",rel:"noopener noreferrer"},yA={href:"https://kallithea-scm.org/",target:"_blank",rel:"noopener noreferrer"},SA={href:"https://kallithea-scm.org/repos/kallithea",target:"_blank",rel:"noopener noreferrer"},vA=e("code",null,"GPLv3",-1),CA=e("code",null,"Python",-1),AA={href:"https://github.com/jonashaag/klaus/",target:"_blank",rel:"noopener noreferrer"},LA={href:"http://klausdemo.lophus.org/",target:"_blank",rel:"noopener noreferrer"},MA=e("code",null,"ISC",-1),GA=e("code",null,"Python",-1),xA={href:"http://lavagna.io",target:"_blank",rel:"noopener noreferrer"},TA={href:"https://github.com/digitalfondue/lavagna",target:"_blank",rel:"noopener noreferrer"},IA=e("code",null,"GPLv3",-1),EA=e("code",null,"Java",-1),DA={href:"https://www.openproject.org",target:"_blank",rel:"noopener noreferrer"},BA={href:"http://phabricator.org/",target:"_blank",rel:"noopener noreferrer"},HA={href:"https://secure.phabricator.com/",target:"_blank",rel:"noopener noreferrer"},jA={href:"https://github.com/phacility/phabricator",target:"_blank",rel:"noopener noreferrer"},RA=e("code",null,"Apache",-1),OA=e("code",null,"PHP",-1),FA={href:"http://www.redmine.org/",target:"_blank",rel:"noopener noreferrer"},NA=e("code",null,"GPLv2",-1),zA=e("code",null,"Ruby",-1),WA={href:"https://taiga.io/",target:"_blank",rel:"noopener noreferrer"},JA={href:"https://github.com/taigaio",target:"_blank",rel:"noopener noreferrer"},UA={href:"http://www.thebuggenie.com/",target:"_blank",rel:"noopener noreferrer"},VA={href:"http://trac.edgewall.org/",target:"_blank",rel:"noopener noreferrer"},qA={href:"http://www.phproject.org/",target:"_blank",rel:"noopener noreferrer"},KA={href:"http://demo.phproject.org/",target:"_blank",rel:"noopener noreferrer"},XA={href:"https://github.com/Alanaktion/phproject",target:"_blank",rel:"noopener noreferrer"},YA=e("code",null,"GPLv3",-1),ZA=n('

        Bug 跟踪

        See Ticketing

        IDE/工具

        ',3),QA={href:"http://codiad.com/",target:"_blank",rel:"noopener noreferrer"},$A={href:"https://github.com/Codiad/Codiad",target:"_blank",rel:"noopener noreferrer"},eL={href:"http://www.eclipse.org/che/",target:"_blank",rel:"noopener noreferrer"},oL={href:"https://github.com/eclipse/che",target:"_blank",rel:"noopener noreferrer"},rL=e("code",null,"EPLv1",-1),tL=e("code",null,"Docker/Java",-1),nL={href:"https://icecoder.net/",target:"_blank",rel:"noopener noreferrer"},sL={href:"http://demo.icecoder.net/ICEcoder/",target:"_blank",rel:"noopener noreferrer"},lL={href:"https://github.com/mattpass/ICEcoder",target:"_blank",rel:"noopener noreferrer"},aL=e("code",null,"MIT",-1),iL=e("code",null,"PHP",-1),hL={href:"http://jsbin.com/",target:"_blank",rel:"noopener noreferrer"},cL={href:"https://github.com/jsbin/jsbin",target:"_blank",rel:"noopener noreferrer"},dL=e("code",null,"MIT",-1),_L=e("code",null,"Nodejs",-1),uL={href:"http://www.koding.com/",target:"_blank",rel:"noopener noreferrer"},pL={href:"https://github.com/koding/koding",target:"_blank",rel:"noopener noreferrer"},fL=e("code",null,"Apache",-1),gL=e("code",null,"Nodejs",-1),bL={href:"http://micro.glark.io",target:"_blank",rel:"noopener noreferrer"},mL={href:"http://micro.glark.io",target:"_blank",rel:"noopener noreferrer"},kL={href:"https://github.com/Bluefinch/microglark",target:"_blank",rel:"noopener noreferrer"},wL=e("code",null,"AGPLv3",-1),PL=e("code",null,"Javascript",-1),yL={href:"http://regexr.com/",target:"_blank",rel:"noopener noreferrer"},SL={href:"https://github.com/gskinner/regexr/",target:"_blank",rel:"noopener noreferrer"},vL=e("code",null,"MIT",-1),CL=e("code",null,"Nodejs",-1),AL={href:"https://www.rstudio.com/products/rstudio/#Server",target:"_blank",rel:"noopener noreferrer"},LL={href:"https://github.com/rstudio/rstudio/",target:"_blank",rel:"noopener noreferrer"},ML=e("code",null,"AGPLv3",-1),GL=e("code",null,"Java/C++",-1),xL={href:"https://github.com/b3log/wide",target:"_blank",rel:"noopener noreferrer"},TL={href:"http://wide.b3log.org/signup",target:"_blank",rel:"noopener noreferrer"},IL=e("code",null,"Apache",-1),EL=e("code",null,"Go",-1),DL=e("h3",{id:"持续集成",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#持续集成","aria-hidden":"true"},"#"),o(" 持续集成")],-1),BL={href:"https://concourse.ci/",target:"_blank",rel:"noopener noreferrer"},HL={href:"https://ci.concourse.ci/",target:"_blank",rel:"noopener noreferrer"},jL={href:"https://github.com/concourse/concourse",target:"_blank",rel:"noopener noreferrer"},RL=e("code",null,"Apache",-1),OL=e("code",null,"Go",-1),FL={href:"https://drone.io/",target:"_blank",rel:"noopener noreferrer"},NL={href:"https://github.com/drone/drone",target:"_blank",rel:"noopener noreferrer"},zL=e("code",null,"Apache",-1),WL=e("code",null,"Go",-1),JL={href:"https://factor.io/",target:"_blank",rel:"noopener noreferrer"},UL={href:"https://github.com/factor-io/factor",target:"_blank",rel:"noopener noreferrer"},VL=e("code",null,"MIT",-1),qL=e("code",null,"Ruby",-1),KL={href:"https://jenkins-ci.org/",target:"_blank",rel:"noopener noreferrer"},XL={href:"https://github.com/jenkinsci/jenkins/",target:"_blank",rel:"noopener noreferrer"},YL=e("code",null,"MIT",-1),ZL=e("code",null,"Java",-1),QL={href:"https://www.phptesting.org/",target:"_blank",rel:"noopener noreferrer"},$L={href:"https://github.com/block8/phpci",target:"_blank",rel:"noopener noreferrer"},eM=e("code",null,"BSD",-1),oM=e("code",null,"PHP",-1),rM={href:"http://stridercd.com/",target:"_blank",rel:"noopener noreferrer"},tM={href:"https://github.com/Strider-CD/strider",target:"_blank",rel:"noopener noreferrer"},nM=e("code",null,"BSD",-1),sM=e("code",null,"Node.js",-1),lM=e("h3",{id:"文档生成器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#文档生成器","aria-hidden":"true"},"#"),o(" 文档生成器")],-1),aM=e("p",null,[o("See also "),e("a",{href:"#static-site-generators"},"Static site generators")],-1),iM={href:"http://haldean.org/",target:"_blank",rel:"noopener noreferrer"},hM={href:"https://github.com/haldean/docstore",target:"_blank",rel:"noopener noreferrer"},cM={href:"http://ricostacruz.com/flatdoc/",target:"_blank",rel:"noopener noreferrer"},dM=e("code",null,"MIT",-1),_M=e("code",null,"Javascript",-1),uM={href:"https://github.com/mil/markdown-tree",target:"_blank",rel:"noopener noreferrer"},pM={href:"https://docs.readthedocs.org/en/latest/install.html",target:"_blank",rel:"noopener noreferrer"},fM={href:"https://readthedocs.org/projects/",target:"_blank",rel:"noopener noreferrer"},gM={href:"https://github.com/rtfd/readthedocs.org",target:"_blank",rel:"noopener noreferrer"},bM=e("code",null,"MIT",-1),mM=e("code",null,"Python",-1),kM=e("h2",{id:"静态网站生成器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#静态网站生成器","aria-hidden":"true"},"#"),o(" 静态网站生成器")],-1),wM={href:"https://staticsitegenerators.net",target:"_blank",rel:"noopener noreferrer"},PM={href:"https://www.staticgen.com",target:"_blank",rel:"noopener noreferrer"},yM=e("h2",{id:"任务管理-to-do-列表",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#任务管理-to-do-列表","aria-hidden":"true"},"#"),o(" 任务管理/To-do 列表")],-1),SM=e("p",null,[e("em",null,[o("See also "),e("a",{href:"#project-management"},"Project Management"),o(" and "),e("a",{href:"#ticketing"},"Ticketing"),o(".")])],-1),vM={href:"https://github.com/infews/bulldog",target:"_blank",rel:"noopener noreferrer"},CM=e("code",null,"MIT",-1),AM=e("code",null,"HTML5",-1),LM={href:"https://github.com/arshad/crepido",target:"_blank",rel:"noopener noreferrer"},MM=e("code",null,"MIT",-1),GM=e("code",null,"Javascript/Others",-1),xM={href:"http://kanboard.net/",target:"_blank",rel:"noopener noreferrer"},TM=e("code",null,"MIT",-1),IM={href:"http://www.mytinytodo.net/",target:"_blank",rel:"noopener noreferrer"},EM=e("code",null,"GPLv2",-1),DM={href:"https://github.com/chr15m/omgnata",target:"_blank",rel:"noopener noreferrer"},BM={href:"https://chr15m.github.io/omgnata/",target:"_blank",rel:"noopener noreferrer"},HM=e("code",null,"GPLv3",-1),jM=e("code",null,"ClojureScript",-1),RM={href:"http://restya.com/board/",target:"_blank",rel:"noopener noreferrer"},OM={href:"http://restya.com/board/demo.html",target:"_blank",rel:"noopener noreferrer"},FM={href:"https://github.com/RestyaPlatform/board",target:"_blank",rel:"noopener noreferrer"},NM=e("code",null,"OSLv3",-1),zM=e("code",null,"PHP",-1),WM={href:"http://taskboard.matthewross.me/",target:"_blank",rel:"noopener noreferrer"},JM={href:"https://github.com/kiswa/TaskBoard",target:"_blank",rel:"noopener noreferrer"},UM=e("code",null,"MIT",-1),VM={href:"http://www.taskfreak.com/original",target:"_blank",rel:"noopener noreferrer"},qM={href:"http://demo.taskfreak.com/",target:"_blank",rel:"noopener noreferrer"},KM={href:"https://github.com/thewhitetulip/Tasks",target:"_blank",rel:"noopener noreferrer"},XM=e("code",null,"MIT",-1),YM=e("code",null,"Go",-1),ZM={href:"https://github.com/RaymiiOrg/tasks.php",target:"_blank",rel:"noopener noreferrer"},QM=e("code",null,"MIT",-1),$M={href:"https://taskwarrior.org/",target:"_blank",rel:"noopener noreferrer"},eG={href:"https://taskwarrior.org/download/#git",target:"_blank",rel:"noopener noreferrer"},oG=e("code",null,"MIT",-1),rG=e("code",null,"C++",-1),tG={href:"https://github.com/satrun77/tinyissue",target:"_blank",rel:"noopener noreferrer"},nG=e("code",null,"MIT",-1),sG=e("code",null,"PHP",-1),lG={href:"http://www.getontracks.org/",target:"_blank",rel:"noopener noreferrer"},aG={href:"https://en.wikipedia.org/wiki/Getting_Things_Done",target:"_blank",rel:"noopener noreferrer"},iG={href:"https://github.com/TracksApp/tracks",target:"_blank",rel:"noopener noreferrer"},hG=e("code",null,"GPLv2",-1),cG=e("code",null,"Ruby",-1),dG={href:"https://wekan.io/",target:"_blank",rel:"noopener noreferrer"},_G={href:"https://oasis.sandstorm.io/appdemo/m86q05rdvj14yvn78ghaxynqz7u2svw6rnttptxx49g1785cdv1h",target:"_blank",rel:"noopener noreferrer"},uG={href:"https://github.com/wekan/wekan",target:"_blank",rel:"noopener noreferrer"},pG=e("code",null,"MIT",-1),fG=e("code",null,"Javascript/Meteor",-1),gG=e("h2",{id:"ticketing",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ticketing","aria-hidden":"true"},"#"),o(" Ticketing")],-1),bG=e("p",null,[e("em",null,[o("See also "),e("a",{href:"#task-managementto-do-lists"},"Task management/To-do lists"),o(" and "),e("a",{href:"#project-management"},"Project Management")])],-1),mG={href:"https://www.bugzilla.org/",target:"_blank",rel:"noopener noreferrer"},kG=e("code",null,"MPLv2",-1),wG=e("code",null,"Perl",-1),PG={href:"http://bumpy-booby.derivoile.fr/",target:"_blank",rel:"noopener noreferrer"},yG={href:"https://github.com/piero-la-lune/Bumpy-Booby",target:"_blank",rel:"noopener noreferrer"},SG=e("code",null,"MIT",-1),vG=e("code",null,"PHP",-1),CG={href:"http://www.cerberusweb.com/",target:"_blank",rel:"noopener noreferrer"},AG={href:"https://github.com/Taskulu/deskulu",target:"_blank",rel:"noopener noreferrer"},LG={href:"https://help.taskulu.com",target:"_blank",rel:"noopener noreferrer"},MG=e("code",null,"GPLv2",-1),GG=e("code",null,"PHP",-1),xG={href:"http://diamantedesk.com/",target:"_blank",rel:"noopener noreferrer"},TG={href:"http://diamantedesk.com/demo/",target:"_blank",rel:"noopener noreferrer"},IG={href:"https://github.com/eltrino/diamantedesk-application",target:"_blank",rel:"noopener noreferrer"},EG=e("code",null,"OSLv3",-1),DG=e("code",null,"PHP",-1),BG={href:"http://www.flyspray.org/",target:"_blank",rel:"noopener noreferrer"},HG={href:"https://github.com/Flyspray/flyspray",target:"_blank",rel:"noopener noreferrer"},jG=e("code",null,"GPLv2",-1),RG={href:"https://github.com/bkeepers/gaskit",target:"_blank",rel:"noopener noreferrer"},OG=e("code",null,"GPL",-1),FG={href:"https://github.com/huboard/huboard",target:"_blank",rel:"noopener noreferrer"},NG=e("code",null,"⚠ ",-1),zG=e("code",null,"MIT",-1),WG=e("code",null,"Ruby",-1),JG={href:"https://www.mantisbt.org/",target:"_blank",rel:"noopener noreferrer"},UG={href:"https://www.mantisbt.org/bugs/my_view_page.php",target:"_blank",rel:"noopener noreferrer"},VG={href:"https://github.com/mantisbt/mantisbt",target:"_blank",rel:"noopener noreferrer"},qG=e("code",null,"GPLv2",-1),KG={href:"http://osticket.com/",target:"_blank",rel:"noopener noreferrer"},XG={href:"http://www.otrs.com/",target:"_blank",rel:"noopener noreferrer"},YG={href:"https://www.bestpractical.com/rt/",target:"_blank",rel:"noopener noreferrer"},ZG={href:"http://www.thebuggenie.com",target:"_blank",rel:"noopener noreferrer"},QG=e("h2",{id:"短-url",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#短-url","aria-hidden":"true"},"#"),o(" 短 URL")],-1),$G={href:"https://github.com/ldidry/lstu",target:"_blank",rel:"noopener noreferrer"},ex=e("em",null,"Let's SHorten That Url",-1),ox={href:"https://github.com/ethanal/nimbus",target:"_blank",rel:"noopener noreferrer"},rx=e("code",null,"MIT",-1),tx=e("code",null,"Python",-1),nx={href:"https://project.polr.me/",target:"_blank",rel:"noopener noreferrer"},sx={href:"https://github.com/Cydrobolt/polr",target:"_blank",rel:"noopener noreferrer"},lx={href:"http://yourls.org/",target:"_blank",rel:"noopener noreferrer"},ax={href:"https://github.com/YOURLS/YOURLS/",target:"_blank",rel:"noopener noreferrer"},ix={href:"https://github.com/YOURLS/YOURLS/wiki",target:"_blank",rel:"noopener noreferrer"},hx=e("code",null,"MIT",-1),cx=e("h2",{id:"vpn",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#vpn","aria-hidden":"true"},"#"),o(" VPN")],-1),dx={href:"https://github.com/n1trux/awesome-sysadmin#vpn",target:"_blank",rel:"noopener noreferrer"},_x=e("h2",{id:"web-服务器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#web-服务器","aria-hidden":"true"},"#"),o(" Web 服务器")],-1),ux={href:"https://github.com/n1trux/awesome-sysadmin#web",target:"_blank",rel:"noopener noreferrer"},px=e("h2",{id:"wikis",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#wikis","aria-hidden":"true"},"#"),o(" Wikis")],-1),fx=e("a",{href:"#documentation-generators"},"Documentation Generators",-1),gx={href:"http://www.wikimatrix.org/",target:"_blank",rel:"noopener noreferrer"},bx={href:"http://wikiindex.org/Category:Wiki_Engine",target:"_blank",rel:"noopener noreferrer"},mx={href:"https://en.wikipedia.org/wiki/List_of_wiki_software",target:"_blank",rel:"noopener noreferrer"},kx={href:"https://en.wikipedia.org/wiki/Comparison_of_wiki_software",target:"_blank",rel:"noopener noreferrer"},wx={href:"http://projet.idleman.fr/blazekiss/",target:"_blank",rel:"noopener noreferrer"},Px={href:"https://github.com/ldleman/blazekiss",target:"_blank",rel:"noopener noreferrer"},yx=e("code",null,"GPLv3",-1),Sx=e("code",null,"PHP",-1),vx={href:"https://www.bookstackapp.com/",target:"_blank",rel:"noopener noreferrer"},Cx={href:"https://www.bookstackapp.com/#demo",target:"_blank",rel:"noopener noreferrer"},Ax={href:"https://github.com/ssddanbrown/BookStack",target:"_blank",rel:"noopener noreferrer"},Lx=e("code",null,"MIT",-1),Mx=e("code",null,"PHP",-1),Gx={href:"https://github.com/fredoliveira/commonplace",target:"_blank",rel:"noopener noreferrer"},xx=e("code",null,"Ruby",-1),Tx={href:"https://www.dokuwiki.org/DokuWiki",target:"_blank",rel:"noopener noreferrer"},Ix=e("code",null,"GPL",-1),Ex=e("code",null,"PHP",-1),Dx={href:"https://github.com/jgm/gitit",target:"_blank",rel:"noopener noreferrer"},Bx={href:"http://gitit.johnmacfarlane.net/",target:"_blank",rel:"noopener noreferrer"},Hx=e("code",null,"GPLv2",-1),jx=e("code",null,"Haskell",-1),Rx={href:"https://github.com/gollum/gollum",target:"_blank",rel:"noopener noreferrer"},Ox=e("code",null,"MIT",-1),Fx=e("code",null,"Ruby",-1),Nx={href:"http://gruik.io/",target:"_blank",rel:"noopener noreferrer"},zx={href:"https://github.com/grena/gruik",target:"_blank",rel:"noopener noreferrer"},Wx=e("code",null,"GPLv3",-1),Jx=e("code",null,"PHP",-1),Ux={href:"https://github.com/claudioc/jingo",target:"_blank",rel:"noopener noreferrer"},Vx={href:"http://jingo.cica.li:6067/wiki/home",target:"_blank",rel:"noopener noreferrer"},qx={href:"https://github.com/claudioc/jingo",target:"_blank",rel:"noopener noreferrer"},Kx=e("code",null,"MIT",-1),Xx=e("code",null,"NodeJS",-1),Yx={href:"https://www.mediawiki.org/wiki/MediaWiki",target:"_blank",rel:"noopener noreferrer"},Zx={href:"https://phabricator.wikimedia.org/diffusion/MW/",target:"_blank",rel:"noopener noreferrer"},Qx=e("code",null,"GPLv2",-1),$x=e("code",null,"PHP",-1),eT={href:"https://moinmo.in/",target:"_blank",rel:"noopener noreferrer"},oT={href:"http://hg.moinmo.in/moin",target:"_blank",rel:"noopener noreferrer"},rT=e("code",null,"GPLv2",-1),tT=e("code",null,"Python",-1),nT={href:"https://github.com/minad/olelo",target:"_blank",rel:"noopener noreferrer"},sT={href:"http://gitwiki.org/",target:"_blank",rel:"noopener noreferrer"},lT=e("code",null,"MIT",-1),aT=e("code",null,"Ruby",-1),iT={href:"https://github.com/sbrl/Pepperminty-Wiki/",target:"_blank",rel:"noopener noreferrer"},hT={href:"https://starbeamrainbowlabs.com/labs/peppermint/build/",target:"_blank",rel:"noopener noreferrer"},cT=e("code",null,"MPLv2",-1),dT=e("code",null,"PHP",-1),_T={href:"http://www.pmwiki.org",target:"_blank",rel:"noopener noreferrer"},uT=e("code",null,"GPLv3",-1),pT=e("code",null,"PHP",-1),fT={href:"http://raneto.com/",target:"_blank",rel:"noopener noreferrer"},gT=e("code",null,"MIT",-1),bT=e("code",null,"NodeJS",-1),mT={href:"http://realms.io/",target:"_blank",rel:"noopener noreferrer"},kT={href:"https://github.com/scragg0x/realms-wiki",target:"_blank",rel:"noopener noreferrer"},wT=e("code",null,"GPLv2",-1),PT=e("code",null,"Python",-1),yT={href:"http://redaxscript.com/",target:"_blank",rel:"noopener noreferrer"},ST={href:"https://github.com/redaxmedia/redaxscript",target:"_blank",rel:"noopener noreferrer"},vT=e("code",null,"GPLv3",-1),CT=e("code",null,"PHP",-1),AT={href:"http://tiddlywiki.com/",target:"_blank",rel:"noopener noreferrer"},LT={href:"https://github.com/Jermolene/TiddlyWiki5",target:"_blank",rel:"noopener noreferrer"},MT=e("code",null,"BSD",-1),GT=e("code",null,"Javascript/Nodejs",-1),xT={href:"https://tiki.org",target:"_blank",rel:"noopener noreferrer"},TT={href:"https://tiki.org/Demo",target:"_blank",rel:"noopener noreferrer"},IT={href:"https://sourceforge.net/p/tikiwiki/code/HEAD/tree/",target:"_blank",rel:"noopener noreferrer"},ET=e("code",null,"LGPLv2",-1),DT=e("code",null,"PHP",-1),BT={href:"https://www.wikifeat.org/app/wikis/wikifeat/pages/welcome",target:"_blank",rel:"noopener noreferrer"},HT={href:"https://github.com/rhinoman/wikifeat",target:"_blank",rel:"noopener noreferrer"},jT=e("code",null,"BSD",-1),RT=e("code",null,"GO",-1),OT={href:"http://wikiss.tuxfamily.org/",target:"_blank",rel:"noopener noreferrer"},FT={href:"https://svnweb.tuxfamily.org/listing.php?repname=wikiss/svn&path=%2F&sc=0",target:"_blank",rel:"noopener noreferrer"},NT=e("code",null,"GPLv2",-1),zT=e("code",null,"PHP",-1),WT={href:"http://wikitten.vizuina.com/",target:"_blank",rel:"noopener noreferrer"},JT={href:"https://github.com/victorstanciu/Wikitten",target:"_blank",rel:"noopener noreferrer"},UT=e("code",null,"MIT",-1),VT=e("code",null,"PHP",-1),qT=e("h2",{id:"自托管解决方案",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#自托管解决方案","aria-hidden":"true"},"#"),o(" 自托管解决方案")],-1),KT={href:"https://arkos.io/",target:"_blank",rel:"noopener noreferrer"},XT={href:"https://git.coderouge.co/groups/arkOS",target:"_blank",rel:"noopener noreferrer"},YT={href:"https://github.com/cznweb",target:"_blank",rel:"noopener noreferrer"},ZT=e("code",null,"MIT/GPL",-1),QT=e("code",null,"Nodejs/Other",-1),$T={href:"https://cloudron.io",target:"_blank",rel:"noopener noreferrer"},eI={href:"https://git.cloudron.io/groups/cloudron",target:"_blank",rel:"noopener noreferrer"},oI=e("code",null,"AGPLv3",-1),rI=e("code",null,"Nodejs/Docker",-1),tI={href:"https://dfabric.github.io/DPlatform-ShellCore/",target:"_blank",rel:"noopener noreferrer"},nI={href:"https://github.com/j8r/DPlatform",target:"_blank",rel:"noopener noreferrer"},sI=e("code",null,"MIT",-1),lI=e("code",null,"Shell",-1),aI={href:"https://github.com/bashrc/freedombone",target:"_blank",rel:"noopener noreferrer"},iI=e("code",null,"GPLv3",-1),hI=e("code",null,"Shell",-1),cI={href:"https://wiki.debian.org/FreedomBox",target:"_blank",rel:"noopener noreferrer"},dI=e("code",null,"GPLv3",-1),_I=e("code",null,"Python/Other",-1),uI={href:"https://piratebox.cc/start",target:"_blank",rel:"noopener noreferrer"},pI={href:"https://github.com/PirateBox-Dev",target:"_blank",rel:"noopener noreferrer"},fI=e("code",null,"GPLv3",-1),gI=e("code",null,"Python/Other",-1),bI={href:"http://puffin.rocks/",target:"_blank",rel:"noopener noreferrer"},mI={href:"http://puffin.rocks/",target:"_blank",rel:"noopener noreferrer"},kI={href:"https://github.com/puffinrocks/puffin",target:"_blank",rel:"noopener noreferrer"},wI=e("code",null,"AGPLv3",-1),PI=e("code",null,"Python/Docker",-1),yI={href:"https://sandstorm.io/",target:"_blank",rel:"noopener noreferrer"},SI={href:"https://demo.sandstorm.io/",target:"_blank",rel:"noopener noreferrer"},vI={href:"https://github.com/sandstorm-io/sandstorm",target:"_blank",rel:"noopener noreferrer"},CI=e("code",null,"Apache",-1),AI=e("code",null,"C++/Other",-1),LI={href:"https://github.com/sovereign/sovereign",target:"_blank",rel:"noopener noreferrer"},MI=e("code",null,"GPLv3",-1),GI=e("code",null,"YAML/Other",-1),xI={href:"http://ubos.net/",target:"_blank",rel:"noopener noreferrer"},TI={href:"http://ubos.net/about/",target:"_blank",rel:"noopener noreferrer"},II=e("code",null,"GPLv3",-1),EI=e("code",null,"Perl/Other",-1),DI={href:"http://WikiSuite.org",target:"_blank",rel:"noopener noreferrer"},BI={href:"http://wikisuite.org/Source",target:"_blank",rel:"noopener noreferrer"},HI=e("code",null,"Multiple",-1),jI=e("code",null,"ClearOS",-1),RI={href:"https://yunohost.org/",target:"_blank",rel:"noopener noreferrer"},OI={href:"https://github.com/YunoHost",target:"_blank",rel:"noopener noreferrer"},FI=e("code",null,"AGPLv3",-1),NI=e("code",null,"Python/Other",-1),zI=e("hr",null,null,-1),WI=e("h2",{id:"许可列表",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#许可列表","aria-hidden":"true"},"#"),o(" 许可列表")],-1),JI=e("li",null,[e("code",null,"⚠"),o(" - Depends on a third party network service")],-1),UI=e("code",null,"AAL",-1),VI={href:"https://opensource.org/licenses/AAL",target:"_blank",rel:"noopener noreferrer"},qI=e("code",null,"AGPLv3",-1),KI={href:"https://www.gnu.org/licenses/agpl-3.0",target:"_blank",rel:"noopener noreferrer"},XI=e("code",null,"Apache",-1),YI={href:"http://www.apache.org/licenses/",target:"_blank",rel:"noopener noreferrer"},ZI=e("code",null,"ARTv2",-1),QI={href:"http://opensource.org/licenses/Artistic-2.0",target:"_blank",rel:"noopener noreferrer"},$I=e("code",null,"BSD",-1),eE={href:"https://www.freebsd.org/copyright/license.html",target:"_blank",rel:"noopener noreferrer"},oE=e("code",null,"CCBYNCSAv3",-1),rE={href:"https://creativecommons.org/licenses/by-nc-sa/3.0/",target:"_blank",rel:"noopener noreferrer"},tE=e("code",null,"CCBYNCv4",-1),nE={href:"https://creativecommons.org/licenses/by-nc/4.0/",target:"_blank",rel:"noopener noreferrer"},sE=e("code",null,"CC0",-1),lE={href:"https://creativecommons.org/about/cc0/",target:"_blank",rel:"noopener noreferrer"},aE=e("code",null,"CeCILL-B",-1),iE={href:"http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt",target:"_blank",rel:"noopener noreferrer"},hE=e("code",null,"CPALv1",-1),cE={href:"http://opensource.org/licenses/CPAL-1.0",target:"_blank",rel:"noopener noreferrer"},dE=e("code",null,"ECLv2",-1),_E={href:"http://opensource.org/licenses/ECL-2.0",target:"_blank",rel:"noopener noreferrer"},uE=e("code",null,"EPLv1",-1),pE={href:"https://www.eclipse.org/legal/epl-v10.html",target:"_blank",rel:"noopener noreferrer"},fE=e("code",null,"GPL",-1),gE={href:"https://www.gnu.org/licenses/gpl-1.0",target:"_blank",rel:"noopener noreferrer"},bE=e("code",null,"GPLv2",-1),mE={href:"https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html",target:"_blank",rel:"noopener noreferrer"},kE=e("code",null,"GPLv3",-1),wE={href:"http://www.gnu.org/licenses/gpl-3.0.en.html",target:"_blank",rel:"noopener noreferrer"},PE=e("code",null,"IPL",-1),yE={href:"https://opensource.org/licenses/IPL-1.0",target:"_blank",rel:"noopener noreferrer"},SE=e("code",null,"ISC",-1),vE={href:"https://www.isc.org/downloads/software-support-policy/isc-license/",target:"_blank",rel:"noopener noreferrer"},CE=e("code",null,"LGPLv2",-1),AE={href:"http://opensource.org/licenses/LGPL-2.1",target:"_blank",rel:"noopener noreferrer"},LE=e("code",null,"LGPLv3",-1),ME={href:"http://opensource.org/licenses/LGPL-3.0",target:"_blank",rel:"noopener noreferrer"},GE=e("code",null,"MIT",-1),xE={href:"http://opensource.org/licenses/MIT",target:"_blank",rel:"noopener noreferrer"},TE=e("code",null,"MPLv2",-1),IE={href:"https://www.mozilla.org/MPL/2.0/index.txt",target:"_blank",rel:"noopener noreferrer"},EE=e("code",null,"OSLv3",-1),DE={href:"https://opensource.org/licenses/osl-3.0.php",target:"_blank",rel:"noopener noreferrer"},BE=e("code",null,"SENDMAIL",-1),HE={href:"https://www.sendmail.com/pdfs/open_source/sendmail_license.pdf",target:"_blank",rel:"noopener noreferrer"},jE=e("code",null,"Zlib",-1),RE={href:"https://opensource.org/licenses/Zlib",target:"_blank",rel:"noopener noreferrer"},OE=e("code",null,"Zope",-1),FE={href:"http://opensource.org/licenses/ZPL-2.0",target:"_blank",rel:"noopener noreferrer"},NE=e("hr",null,null,-1),zE=e("h2",{id:"外链",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#外链","aria-hidden":"true"},"#"),o(" 外链")],-1),WE={href:"https://chat.awesome-selfhosted.com",target:"_blank",rel:"noopener noreferrer"},JE={href:"https://github.com/onurakpolat/awesome-bigdata",target:"_blank",rel:"noopener noreferrer"},UE={href:"https://github.com/n1trux/awesome-sysadmin",target:"_blank",rel:"noopener noreferrer"},VE={href:"https://prism-break.org/en/",target:"_blank",rel:"noopener noreferrer"},qE={href:"https://www.privacytools.io/",target:"_blank",rel:"noopener noreferrer"},KE={href:"https://redecentralize.github.io/alternative-internet/",target:"_blank",rel:"noopener noreferrer"},XE={href:"https://freedns.afraid.org/domain/registry/",target:"_blank",rel:"noopener noreferrer"},YE={href:"https://pagekite.net/",target:"_blank",rel:"noopener noreferrer"},ZE={href:"https://www.reddit.com/r/selfhosted",target:"_blank",rel:"noopener noreferrer"},QE={href:"http://www.auto-hebergement.fr/",target:"_blank",rel:"noopener noreferrer"},$E=e("hr",null,null,-1),eD=e("h2",{id:"贡献",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#贡献","aria-hidden":"true"},"#"),o(" 贡献")],-1),oD=n('

        作者

        The list of authors can be found here.

        许可

        This list is under the Creative Commons Attribution-ShareAlike 3.0 Unported License.

        ',4);function rD(tD,nD){const t=l("ExternalLinkIcon"),s=l("RouterLink");return c(),d("div",null,[e("p",null,[e("a",u,[o("Awesome-Selfhosted"),r(t)]),o(" 是由 "),e("a",p,[o("Edward D"),r(t)]),o(" 发起和维护资源列表,收集了许多可以在本地搭建的网络服务和 Web 应用列表。")]),e("p",null,[e("a",f,[o("Awesome-Selfhosted-cn"),r(t)]),o(" 则是依据 "),e("a",g,[o("Awesome-Selfhosted"),r(t)]),o(" 翻译而来。也欢迎你帮助推荐和提供建议!")]),b,e("p",null,[o("This is a list of "),e("a",m,[o("Free"),r(t)]),o(" Software "),e("a",k,[o("network services"),r(t)]),o(" and "),e("a",w,[o("web applications"),r(t)]),o(" which can be hosted locally. Non-Free software is listed on the "),r(s,{to:"/_posts/non-free.html"},{default:a(()=>[o("Non-Free")]),_:1}),o(" page.")]),P,i(" BEGIN SOFTWARE LIST "),y,S,e("ul",null,[e("li",null,[e("a",v,[o("AWStats"),r(t)]),o(" - Generates web, streaming, ftp or mail server statistics graphically. ("),e("a",C,[o("Source Code"),r(t)]),o(") "),A,o(),L]),e("li",null,[e("a",M,[o("Countly"),r(t)]),o(" - Real time mobile & web analytics, crash reporting and push notifications platform. ("),e("a",G,[o("Source Code"),r(t)]),o(") "),x,o(),T]),e("li",null,[e("a",I,[o("Druid"),r(t)]),o(" - A distributed, column-oriented, real-time analytics data store. ("),e("a",E,[o("Source Code"),r(t)]),o(") "),D,o(),B]),e("li",null,[e("a",H,[o("GoAccess"),r(t)]),o(" - Real-time web log analyzer and interactive viewer that runs in a terminal. ("),e("a",j,[o("Source Code"),r(t)]),o(") "),R,o(),O]),e("li",null,[e("a",F,[o("Open Web Analytics"),r(t)]),o(" - Google Analytics and Piwik alternative. ("),e("a",N,[o("Source Code"),r(t)]),o(") "),z,o(),W]),e("li",null,[e("a",J,[o("Piwik"),r(t)]),o(" - Leading open-source analytics platform that gives you more than just powerful analytics. ("),e("a",U,[o("Source Code"),r(t)]),o(") "),V,o(),q]),e("li",null,[e("a",K,[o("Serposcope"),r(t)]),o(" - Serposcope is a free and open-source rank tracker to monitor websites ranking in Google and improve your SEO performances. ("),e("a",X,[o("Source Code"),r(t)]),o(") "),Y,o(),Z]),e("li",null,[e("a",Q,[o("Snowplow"),r(t)]),o(" - Have every single event, from your websites, mobile apps, desktop applications and server-side systems, stored in your own data warehouse and available to action in real-time. ("),e("a",$,[o("Source Code"),r(t)]),o(") "),ee,o(),oe]),e("li",null,[e("a",re,[o("ThinkUp"),r(t)]),o(" - Insights into your social networking activity on Twitter, Facebook, Instagram, and beyond. ("),e("a",te,[o("Source Code"),r(t)]),o(") "),ne,o(),se])]),le,e("ul",null,[e("li",null,[e("a",ae,[o("Metabase"),r(t)]),o(" - Simple Dashboarding and GUI Query tool, Nightly Emails and Slack Integration w/ PostgreSQL, MySQL, Redshift and other DBs. ("),e("a",ie,[o("Source Code"),r(t)]),o(") "),he,o(),ce]),e("li",null,[e("a",de,[o("Redash"),r(t)]),o(' - connect to over 18 types of databases (SQL and "NoSQL"), query your data, visualize it and create dashboards. Everything has a URL that can be shared. Slack and HipChat integration. ('),e("a",_e,[o("Demo"),r(t)]),o(", "),e("a",ue,[o("Source Code"),r(t)]),o(") "),pe,o(),fe])]),ge,e("ul",null,[e("li",null,[e("a",be,[o("Alltube"),r(t)]),o(" - A web interface for "),e("a",me,[o("youtube-dl"),r(t)]),o(", a program to download videos and audio from "),e("a",ke,[o("more than 100 websites"),r(t)]),o(". ("),e("a",we,[o("Demo"),r(t)]),o(", "),e("a",Pe,[o("Source Code"),r(t)]),o(") "),ye,o(),Se]),e("li",null,[e("a",ve,[o("AmIUnique"),r(t)]),o(" - Learn how identifiable you are on the Internet (browser fingerprinting tool). ("),e("a",Ce,[o("Source code"),r(t)]),o(),Ae,o(),Le]),e("li",null,[e("a",Me,[o("bip.io"),r(t)]),o(" - Web Automation For People And Robots - Drag, Drop, and Connect The Services You Love. ("),e("a",Ge,[o("Source Code"),r(t)]),o(") "),xe,o(),Te]),e("li",null,[e("a",Ie,[o("CouchPotato"),r(t)]),o(" - CouchPotato is an automatic Video Library Manager for Movies. Automatic torrent/nzb searching, downloading, and processing at the qualities you want. ("),e("a",Ee,[o("Source Code"),r(t)]),o(") "),De,o(),Be]),e("li",null,[e("a",He,[o("Headphones"),r(t)]),o(" - An automated music downloader for NZB and Torrent, written in Python. It supports SABnzbd, NZBget, Transmission, µTorrent, Deluge and Blackhole. "),je,o(),Re]),e("li",null,[e("a",Oe,[o("Healthchecks"),r(t)]),o(" - Django app which listens for pings and sends alerts when pings are late. ("),e("a",Fe,[o("Source Code"),r(t)]),o(") "),Ne,o(),ze]),e("li",null,[e("a",We,[o("Huginn"),r(t)]),o(" - Allows you to build agents that monitor and act on your behalf - "),Je,o(),Ue]),e("li",null,[e("a",Ve,[o("Http2pic"),r(t)]),o(" - Website screenshots/renderer. It uses the wkhtmltox to render websites with various options. ("),e("a",qe,[o("Source Code"),r(t)]),o(") "),Ke,o(),Xe]),e("li",null,[e("a",Ye,[o("Node RED"),r(t)]),o(" - A browser-based flow editor that helps you wiring hardware devices, APIs and online services to create IoT solutions. ("),e("a",Ze,[o("Source Code"),r(t)]),o(") "),Qe,o(),$e]),e("li",null,[e("a",eo,[o("openHAB"),r(t)]),o(" - Vendor and technology agnostic open source software for home automation. ("),e("a",oo,[o("Source Code"),r(t)]),o(") "),ro,o(),to]),e("li",null,[e("a",no,[o("RSS-Bridge"),r(t)]),o(" - rss-bridge is a PHP project capable of generating ATOM feeds for websites which don't have one. "),so,o(),lo]),e("li",null,[e("a",ao,[o("SickRage"),r(t)]),o(" - SickRage is an automatic Video Library Manager for TV Shows. Automatic torrent/nzb searching, downloading, and processing at the qualities you want. ("),e("a",io,[o("Source Code"),r(t)]),o(") "),ho,o(),co]),e("li",null,[e("a",_o,[o("Sonarr"),r(t)]),o(" - An automatic TV Shows downloader and manager for Usenet and BitTorrent. It can grab, sort and rename new episodes and automatically upgrade the quality of files already downloaded when a better quality format becomes available. ("),e("a",uo,[o("Source Code"),r(t)]),o(") "),po,o(),fo]),e("li",null,[e("a",go,[o("TriggerHappy"),r(t)]),o(" - An opensource clone of IFTTT, a bridge between your internet services. ("),e("a",bo,[o("Source Code"),r(t)]),o(") "),mo,o(),ko]),e("li",null,[e("a",wo,[o("WTFDYUM"),r(t)]),o(" a.k.a Why The Fuck Did You Unfollow Me - Find out who stops following you on Twitter. ("),e("a",Po,[o("Demo"),r(t)]),o(", "),e("a",yo,[o("Source Code"),r(t)]),o(") "),So,o(),vo]),e("li",null,[e("a",Co,[o("Zenbot 3"),r(t)]),o(" - Zenbot is a lightweight, extendable, artificially intelligent trading bot for Bitcoin, Ether, Litecoin, and more. ("),e("a",Ao,[o("Demo"),r(t)]),o(", "),e("a",Lo,[o("Source Code"),r(t)]),o(") "),Mo,o(),Go])]),xo,e("p",null,[o("See also "),To,o(", "),Io,o(" and "),e("a",Eo,[o("WeblogMatrix"),r(t)])]),e("ul",null,[e("li",null,[e("a",Do,[o("Anchor CMS"),r(t)]),o(" - Anchor is a free, lightweight, faster-than-a-bullet, simple blogging system, made for art–directed posts. ("),e("a",Bo,[o("Source Code"),r(t)]),o(") "),Ho,o(),jo]),e("li",null,[e("a",Ro,[o("Antville"),r(t)]),o(" - Antville is a free, open source project aimed at the development of a high performance, feature rich weblog hosting software. ("),e("a",Oo,[o("Source Code"),r(t)]),o(") "),Fo,o(),No]),e("li",null,[e("a",zo,[o("Blogotext"),r(t)]),o(" - A free blog-engine written in PHP and using SQLite. This offers you both an unmatched simplicity during installation and great performances. ("),e("a",Wo,[o("Source Code"),r(t)]),o(") "),Jo,o(),Uo]),e("li",null,[e("a",Vo,[o("Chyrp"),r(t)]),o(" - An extra-awesome, extra-lightweight blog engine. "),qo,o(),Ko]),e("li",null,[e("a",Xo,[o("Dotclear"),r(t)]),o(" - Take control over your blog! ("),e("a",Yo,[o("Source Code"),r(t)]),o(") "),Zo,o(),Qo]),e("li",null,[e("a",$o,[o("Ghost"),r(t)]),o(" - Just a blogging platform. ("),e("a",er,[o("Source Code"),r(t)]),o(") "),or,o(),rr]),e("li",null,[e("a",tr,[o("htmly"),r(t)]),o(" - Databaseless Blogging Platform (Flat-File Blog). ("),e("a",nr,[o("Demo"),r(t)]),o(", "),e("a",sr,[o("Source Code"),r(t)]),o(") "),lr,o(),ar]),e("li",null,[e("a",ir,[o("Known"),r(t)]),o(" - A single website for all your content. ("),e("a",hr,[o("Source Code"),r(t)]),o(") "),cr,o(),dr]),e("li",null,[e("a",_r,[o("Noddity"),r(t)]),o(" - It's a blog, it's a wiki, it's a fast CMS! ("),e("a",ur,[o("Source Code"),r(t)]),o(") "),pr,o(),fr]),e("li",null,[e("a",gr,[o("PluXml"),r(t)]),o(" - XML-based blog/CMS platform. ("),e("a",br,[o("Source Code"),r(t)]),o(") "),mr,o(),kr]),e("li",null,[e("a",wr,[o("Postleaf"),r(t)]),o(" - An open source blogging platform with inline editing, handlebar templates, and a beautiful user interface. ("),e("a",Pr,[o("Source Code"),r(t)]),o(") "),yr,o(),Sr]),e("li",null,[e("a",vr,[o("Wagtail"),r(t)]),o(" - A Django content management system focused on flexibility and user experience. ("),e("a",Cr,[o("Source Code"),r(t)]),o(") "),Ar,o(),Lr]),e("li",null,[e("a",Mr,[o("WordPress"),r(t)]),o(" - Create a beautiful website or blog. ("),e("a",Gr,[o("Source Code"),r(t)]),o(") "),xr,o(),Tr])]),Ir,e("ul",null,[e("li",null,[e("a",Er,[o("Bookie"),r(t)]),o(" - Python based "),e("a",Dr,[o("delicious.com"),r(t)]),o(" replacement. "),Br,o(),Hr]),e("li",null,[e("a",jr,[o("Firefox Auth Server"),r(t)]),o(" - This project implements the core server-side API for Firefox Accounts. ("),e("a",Rr,[o("Source Code"),r(t)]),o(") "),Or,o(),Fr]),e("li",null,[e("a",Nr,[o("Firefox Content Server"),r(t)]),o(" - Static server that hosts Firefox Account sign up, sign in, email verification, etc. flows. ("),e("a",zr,[o("Source Code"),r(t)]),o(") "),Wr,o(),Jr]),e("li",null,[e("a",Ur,[o("Firefox Sync Server"),r(t)]),o(" - Sync Firefox bookmarks, passwords, history, tabs, preferences. ("),e("a",Vr,[o("Source Code"),r(t)]),o(") "),qr,o(),Kr]),e("li",null,[e("a",Xr,[o("Lobsters"),r(t)]),o(" - Run your own link aggregation site. ("),e("a",Yr,[o("Source Code"),r(t)]),o(") "),Zr,o(),Qr]),e("li",null,[e("a",$r,[o("No Fuss Bookmarks"),r(t)]),o(" - Very simple software and service to store bookmarks especially designed for hackers (that don't need fancy interfaces, but nice API). ("),e("a",et,[o("Source Code"),r(t)]),o(") "),ot,o(),rt]),e("li",null,[e("a",tt,[o("Pinry"),r(t)]),o(" - The tiling image board system for people who want to save, tag, and share images, videos, and webpages. ("),e("a",nt,[o("Source Code"),r(t)]),o(") "),st,o(),lt]),e("li",null,[e("a",at,[o("saveto.co"),r(t)]),o(" - An open source, home for the best links on the web. ("),e("a",it,[o("Source Code"),r(t)]),o(") "),ht,o(),ct]),e("li",null,[e("a",dt,[o("Shaarli"),r(t)]),o(" - Personal, minimalist, super-fast, no-database bookmarking and link sharing plaform. ("),e("a",_t,[o("Demo"),r(t)]),o(") "),ut,o(),pt]),e("li",null,[e("a",ft,[o("unmark"),r(t)]),o(" - An open source to do app for links. ("),e("a",gt,[o("Source Code"),r(t)]),o(") "),bt,o(),mt])]),kt,wt,e("ul",null,[e("li",null,[e("a",Pt,[o("AgenDAV"),r(t)]),o(" - Multilanguage CalDAV web client with a rich AJAX interface and shared calendars support. ("),e("a",yt,[o("Source Code"),r(t)]),o(") "),St,o(),vt]),e("li",null,[e("a",Ct,[o("Baïkal"),r(t)]),o(" - Lightweight CalDAV+CardDAV server. ("),e("a",At,[o("Source Code"),r(t)]),o(") "),Lt,o(),Mt]),e("li",null,[e("a",Gt,[o("CalendarServer"),r(t)]),o(" - A standards-compliant server implementing the CalDAV and CardDAV protocols. "),xt,o(),Tt]),e("li",null,[e("a",It,[o("calypso"),r(t)]),o(" - A python-based CalDAV/CardDAV server. ("),e("a",Et,[o("Source Code"),r(t)]),o(") "),Dt,o(),Bt]),e("li",null,[e("a",Ht,[o("DAViCal"),r(t)]),o(" - A server for calendar sharing (CalDAV). ("),e("a",jt,[o("Source Code"),r(t)]),o(") "),Rt,o(),Ot]),e("li",null,[e("a",Ft,[o("ownCloud calendar"),r(t)]),o(" - The ownCloud Calendar app enables you to create and edit events, synchronize to other calendars you might use, and create new, personalized calendars. ("),e("a",Nt,[o("Source Code"),r(t)]),o(") "),zt,o(),Wt]),e("li",null,[e("a",Jt,[o("Radicale"),r(t)]),o(" - A Simple Calendar and Contact Server. ("),e("a",Ut,[o("Source Code"),r(t)]),o(") "),Vt,o(),qt]),e("li",null,[e("a",Kt,[o("sabre/dav"),r(t)]),o(" - A open source CardDAV, CalDAV and WebDAV server. ("),e("a",Xt,[o("Source Code"),r(t)]),o(") "),Yt,o(),Zt]),e("li",null,[e("a",Qt,[o("InfCloud"),r(t)]),o(" - An open source CalDAV/CardDAV web client implementation. ("),e("a",$t,[o("Demo"),r(t)]),o(", "),e("a",en,[o("Source Code"),r(t)]),o(") "),on,o(),rn])]),tn,nn,e("ul",null,[e("li",null,[e("a",sn,[o("Actor"),r(t)]),o(" - Actor is a fast, open source messaging platform with rich mobile and web clients. ("),e("a",ln,[o("Demo"),r(t)]),o(", "),e("a",an,[o("Source Code"),r(t)]),o(") "),hn,o(),cn]),e("li",null,[e("a",dn,[o("Cherry"),r(t)]),o(" - A tiny webchat server. "),_n,o(),un]),e("li",null,[e("a",pn,[o("Freenet"),r(t)]),o(' - Anonymously share files, browse and publish "freesites" (web sites accessible only through Freenet) and chat on forums. ('),e("a",fn,[o("Source Code"),r(t)]),o(") "),gn,o(),bn]),e("li",null,[e("a",mn,[o("Friends"),r(t)]),o(" - P2P chat powered by the web. ("),e("a",kn,[o("Source Code"),r(t)]),o(") "),wn,o(),Pn]),e("li",null,[e("a",yn,[o("GNUNet"),r(t)]),o(" - Free software framework for decentralized, peer-to-peer networking. ("),e("a",Sn,[o("Source Code"),r(t)]),o(") "),vn,o(),Cn]),e("li",null,[e("a",An,[o("Jitsi Meet"),r(t)]),o(" - Jitsi Meet is an OpenSource (MIT) WebRTC Javascript application that uses Jitsi Videobridge to provide high quality, scalable video conferences. ("),e("a",Ln,[o("Source Code"),r(t)]),o(") "),Mn,o(),Gn]),e("li",null,[e("a",xn,[o("Jitsi Video Bridge"),r(t)]),o(" - WebRTC compatible Selective Forwarding Unit (SFU) that allows for multiuser video communication. ("),e("a",Tn,[o("Source Code"),r(t)]),o(") "),In,o(),En]),e("li",null,[e("a",Dn,[o("Kandan"),r(t)]),o(" - Kandan is an Open Source Alternative to HipChat. ("),e("a",Bn,[o("Source Code"),r(t)]),o(") "),Hn,o(),jn]),e("li",null,[e("a",Rn,[o("Lets-Chat"),r(t)]),o(" - A self hosted chat suite written in Node. ("),e("a",On,[o("Source Code"),r(t)]),o(") "),Fn,o(),Nn]),e("li",null,[e("a",zn,[o("Live Helper Chat"),r(t)]),o(" - Live Support chat for your website. ("),e("a",Wn,[o("Source Code"),r(t)]),o(") "),Jn,o(),Un]),e("li",null,[e("a",Vn,[o("Mattermost"),r(t)]),o(" - Open-source, on-prem Slack-alternative. It can be integrated with "),e("a",qn,[o("Gitlab"),r(t)]),o(". ("),e("a",Kn,[o("Source Code"),r(t)]),o(") "),Xn,o(),Yn]),e("li",null,[e("a",Zn,[o("Mibew"),r(t)]),o(" - Mibew Messenger is an open-source live support application written in PHP and MySQL. It enables one-on-one chat assistance in real-time directly from your website. ("),e("a",Qn,[o("Demo"),r(t)]),o(", "),e("a",$n,[o("Source Code"),r(t)]),o(") "),es,o(),os]),e("li",null,[e("a",rs,[o("Mumble"),r(t)]),o(" - Low-latency, high quality voice/text chat software. ("),e("a",ts,[o("Source Code"),r(t)]),o(") "),ns,o(),ss,e("ul",null,[e("li",null,[e("a",ls,[o("Mumblecop"),r(t)]),o(" - Stream audio from youtube and soundcloud, simulate dice rolls, or write your own commands with a simple plugin format. "),as,o(),is])])]),e("li",null,[e("a",hs,[o("Node-Chat"),r(t)]),o(" - A not-so-basic open-source chat with admin features. "),cs,o(),ds]),e("li",null,[e("a",_s,[o("RetroShare"),r(t)]),o(" - Secured and decentralized communication system. Offers decentralized chat, forums, messaging, file transfer. ("),e("a",us,[o("Source Code"),r(t)]),o(") "),ps,o(),fs]),e("li",null,[e("a",gs,[o("Rocket.Chat"),r(t)]),o(" – Teamchat solution similar to "),e("a",bs,[o("Gitter.im"),r(t)]),o(" or Slack. ("),e("a",ms,[o("Source Code"),r(t)]),o(") "),ks,o(),ws]),e("li",null,[e("a",Ps,[o("Synapse"),r(t)]),o(" - A server for "),e("a",ys,[o("Matrix"),r(t)]),o(", an open standard for decentralized persistent communication. ("),e("a",Ss,[o("Source Code"),r(t)]),o(") "),vs,o(),Cs,e("ul",null,[e("li",null,[e("a",As,[o("Matrix Console Web"),r(t)]),o(" - A web client meant to be a showcase of Matrix capabilities, and reference implementation of the Matrix standard. ("),e("a",Ls,[o("Source Code"),r(t)]),o(") "),Ms,o(),Gs]),e("li",null,[e("a",xs,[o("Vector"),r(t)]),o(" - A glossy Matrix web client with an emphasis on performance and usability. ("),e("a",Ts,[o("Source Code"),r(t)]),o(") "),Is,o(),Es])])]),e("li",null,[e("a",Ds,[o("Syndie"),r(t)]),o(" - Syndie is a libre system for operating distributed forums. "),Bs,o(),Hs]),e("li",null,[e("a",js,[o("TextBelt"),r(t)]),o(),Rs,o(" - An outgoing SMS API that uses carrier-specific gateways to deliver your text messages for free, and without ads. "),Os,o(),Fs]),e("li",null,[e("a",Ns,[o("Tox"),r(t)]),o(" - A distributed, secure messenger with audio and video chat capabilities. ("),e("a",zs,[o("Source Code"),r(t)]),o(") "),Ws,o(),Js]),e("li",null,[e("a",Us,[o("Tuber"),r(t)]),o(" - Peer-to-peer video chat that works. ("),e("a",Vs,[o("Source Code"),r(t)]),o(") "),qs,o(),Ks]),e("li",null,[e("a",Xs,[o("Zulip"),r(t)]),o(" - Zulip is a powerful, open source group chat application. ("),e("a",Ys,[o("Source Code"),r(t)]),o(") "),Zs,o(),Qs])]),$s,el,ol,e("ul",null,[e("li",null,[e("a",rl,[o("Citadel"),r(t)]),o(' - Feature packed, easy, versatile, and powerful mail server, thanks to exclusive "rooms" based architecture. ('),e("a",tl,[o("Source Code"),r(t)]),o(") "),nl,o(),sl]),e("li",null,[e("a",ll,[o("iRedMail"),r(t)]),o(" - Full-featured mail server solution based on Postfix and Dovecot. ("),e("a",al,[o("Source Code"),r(t)]),o(") "),il,o(),hl]),e("li",null,[e("a",cl,[o("Mailcow"),r(t)]),o(" - Mail server suite based on Dovecot, Postfix and other open source software, that provides a modern Web UI for administration. ("),e("a",dl,[o("Source Code"),r(t)]),o(") "),_l,o(),ul]),e("li",null,[e("a",pl,[o("Mail-in-a-Box"),r(t)]),o(" - Turns any Ubuntu server into a fully functional mail server with one command. ("),e("a",fl,[o("Source Code"),r(t)]),o(") "),gl,o(),bl]),e("li",null,[e("a",ml,[o("Modoboa"),r(t)]),o(" - Modoboa is a mail hosting and management platform including a modern and simplified Web User Interface. ("),e("a",kl,[o("Source Code"),r(t)]),o(") "),wl,o(),Pl])]),yl,Sl,e("ul",null,[e("li",null,[e("a",vl,[o("Courier MTA"),r(t)]),o(" - Fast, scalable, enterprise mail/groupware server providing ESMTP, IMAP, POP3, webmail, mailing list, basic web-based calendaring and scheduling services. ("),e("a",Cl,[o("Source Code"),r(t)]),o(") "),Al,o(),Ll]),e("li",null,[e("a",Ml,[o("Exim"),r(t)]),o(" - Message transfer agent (MTA) developed at the University of Cambridge. ("),e("a",Gl,[o("Source Code"),r(t)]),o(") "),xl,o(),Tl]),e("li",null,[e("a",Il,[o("Haraka"),r(t)]),o(" - A high-performance, pluginable SMTP server written in Javascript. ("),e("a",El,[o("Source Code"),r(t)]),o(") "),Dl,o(),Bl]),e("li",null,[e("a",Hl,[o("MailCatcher"),r(t)]),o(" - Ruby gem that deploys a simply SMTP MTA gateway that accepts all mail and displays in web interface. Useful for debugging or development. ("),e("a",jl,[o("Source Code"),r(t)]),o(") "),Rl,o(),Ol]),e("li",null,[e("a",Fl,[o("Maildrop"),r(t)]),o(" - Disposable email SMTP server, also useful for development. "),Nl,o(),zl]),e("li",null,[e("a",Wl,[o("MailHog"),r(t)]),o(" - Small Golang executable which runs an SMTP MTA gateway that accepts all mail and displays in web interface. Useful for debugging or development. "),Jl,o(),Ul]),e("li",null,[e("a",Vl,[o("OpenSMTPD"),r(t)]),o(" - Secure SMTP server implementation from the OpenBSD project. ("),e("a",ql,[o("Source Code"),r(t)]),o(") "),Kl,o(),Xl]),e("li",null,[e("a",Yl,[o("Postfix"),r(t)]),o(" - Fast, easy to administer, and secure Sendmail replacement. "),Zl,o(),Ql]),e("li",null,[e("a",$l,[o("Qmail"),r(t)]),o(" - Secure Sendmail replacement. ("),e("a",ea,[o("Source Code"),r(t)]),o(") "),oa,o(),ra]),e("li",null,[e("a",ta,[o("Sendmail"),r(t)]),o(" - Message transfer agent (MTA). "),na,o(),sa]),e("li",null,[e("a",la,[o("Slimta"),r(t)]),o(" - Mail Transfer Library built on Python. ("),e("a",aa,[o("Source Code"),r(t)]),o(") "),ia,o(),ha])]),ca,da,e("ul",null,[e("li",null,[e("a",_a,[o("Cyrus IMAP/POP3"),r(t)]),o(" - Intended to be run on sealed servers, where normal users are not permitted to log in. ("),e("a",ua,[o("Source Code"),r(t)]),o(") "),pa,o(),fa]),e("li",null,[e("a",ga,[o("Dovecot"),r(t)]),o(" - IMAP and POP3 server written primarily with security in mind. ("),e("a",ba,[o("Source Code"),r(t)]),o(") "),ma,o(),ka]),e("li",null,[e("a",wa,[o("Piler"),r(t)]),o(" - feature rich open source email archiving solution. ("),e("a",Pa,[o("Source Code"),r(t)]),o(") "),ya,o(),Sa])]),va,Ca,e("ul",null,[e("li",null,[e("a",Aa,[o("Dada Mail"),r(t)]),o(" - A web-based list management system that can be used for announcement lists and/or discussion lists. ("),e("a",La,[o("Source Code"),r(t)]),o(") "),Ma,o(),Ga]),e("li",null,[e("a",xa,[o("Mailman"),r(t)]),o(" - The Gnu mailing list server. "),Ta,o(),Ia]),e("li",null,[e("a",Ea,[o("Mailtrain"),r(t)]),o(" - self hosted newsletter application built on Node.js (v5+) and MySQL (v5.5+ or MariaDB). ("),e("a",Da,[o("Source Code"),r(t)]),o(") "),Ba,o(),Ha]),e("li",null,[e("a",ja,[o("Mautic"),r(t)]),o(" - Mautic is marketing automation software (email, social & more). ("),e("a",Ra,[o("Source Code"),r(t)]),o(") "),Oa,o(),Fa]),e("li",null,[e("a",Na,[o("phpList"),r(t)]),o(" - Newsletter and email marketing with advanced management of subscribers, bounces, and plugins. ("),e("a",za,[o("Source Code"),r(t)]),o(") "),Wa,o(),Ja]),e("li",null,[e("a",Ua,[o("Sympa"),r(t)]),o(" - A mailing list manager. "),Va,o(),qa])]),Ka,e("ul",null,[e("li",null,[e("a",Xa,[o("Cypht"),r(t)]),o(" - A feed reader for your email accounts. ("),e("a",Ya,[o("Source Code"),r(t)]),o(") "),Za,o(),Qa]),e("li",null,[e("a",$a,[o("Mailpile"),r(t)]),o(" - Webmail client with search, filtering, encryption features and more. ("),e("a",ei,[o("Source Code"),r(t)]),o(") "),oi,o(),ri]),e("li",null,[e("a",ti,[o("RainLoop"),r(t)]),o(" - Simple, modern & fast webmail with IMAP/SMTP Support and multi accounting. ("),e("a",ni,[o("Demo"),r(t)]),o(", "),e("a",si,[o("Source Code"),r(t)]),o("). "),li,o(),ai]),e("li",null,[e("a",ii,[o("Roundcube"),r(t)]),o(" - Browser-based IMAP client with an application-like user interface. ("),e("a",hi,[o("Screenshots"),r(t)]),o(") ("),e("a",ci,[o("Source Code"),r(t)]),o(") "),di,o(),_i]),e("li",null,[e("a",ui,[o("SquirrelMail"),r(t)]),o(" - Another browser-based IMAP client. ("),e("a",pi,[o("Source Code"),r(t)]),o(") "),fi,o(),gi]),e("li",null,[e("a",bi,[o("WebMail Lite"),r(t)]),o(" - Web-based IMAP Mail client. ("),e("a",mi,[o("Source Code"),r(t)]),o(") "),ki,o(),wi])]),Pi,e("p",null,[e("em",null,[e("a",yi,[o("IRC"),r(t)]),o(" communication software")])]),e("ul",null,[e("li",null,[e("a",Si,[o("Convos"),r(t)]),o(" - Always online web IRC client. ("),e("a",vi,[o("Demo"),r(t)]),o(", "),e("a",Ci,[o("Source Code"),r(t)]),o(") "),Ai,o(),Li]),e("li",null,[e("a",Mi,[o("IRCAnywhere"),r(t)]),o(" - Open-source self-hosted alternative to IRCCloud. ("),e("a",Gi,[o("Source Code"),r(t)]),o(") "),xi,o(),Ti]),e("li",null,[e("a",Ii,[o("Quassel IRC"),r(t)]),o(" - distributed IRC client, meaning that one (or multiple) client(s) can attach to and detach from a central core. ("),e("a",Ei,[o("Source Code"),r(t)]),o(") "),Di,o(),Bi]),e("li",null,[e("a",Hi,[o("Robust IRC"),r(t)]),o(" - RobustIRC is IRC without netsplits. Distributed IRC server, based on RobustSession protocol. ("),e("a",ji,[o("Source Code"),r(t)]),o(") "),Ri,o(),Oi]),e("li",null,[e("a",Fi,[o("The Lounge"),r(t)]),o(" - The self-hosted web IRC client. ("),e("a",Ni,[o("Demo"),r(t)]),o(", "),e("a",zi,[o("Source Code"),r(t)]),o(") "),Wi,o(),Ji]),e("li",null,[e("a",Ui,[o("Weechat"),r(t)]),o(" - A fast, light and extensible chat client. "),Vi,o(),qi]),e("li",null,[e("a",Ki,[o("ZNC"),r(t)]),o(" - An advanced IRC bouncer. ("),e("a",Xi,[o("Source Code"),r(t)]),o(") "),Yi,o(),Zi])]),Qi,e("p",null,[e("em",null,[e("a",$i,[o("SIP"),r(t)]),o(" telephony software")])]),e("ul",null,[e("li",null,[e("a",eh,[o("Asterisk"),r(t)]),o(" - An easy to use but advanced IP PBX system, VoIP gateway and conference server. "),oh,o(),rh]),e("li",null,[e("a",th,[o("FreeSWITCH"),r(t)]),o(" - Scalable open source cross-platform telephony platform. ("),e("a",nh,[o("Source Code"),r(t)]),o(") "),sh,o(),lh]),e("li",null,[e("a",ah,[o("Kamailio"),r(t)]),o(" - Modular SIP server (registrar/proxy/router/etc) ("),e("a",ih,[o("Source Code"),r(t)]),o(") "),hh,o(),ch]),e("li",null,[e("a",dh,[o("Ostel"),r(t)]),o(" - Secure SIP telephony setup with ZRTP encryption. "),_h,o(),uh])]),ph,e("p",null,[e("em",null,[e("a",fh,[o("IPBX"),r(t)]),o(" telephony software")])]),e("ul",null,[e("li",null,[e("a",gh,[o("Elastix"),r(t)]),o(" - Unified communications server software based on Asterisk. ("),e("a",bh,[o("Source Code"),r(t)]),o(") "),mh,o(),kh]),e("li",null,[e("a",wh,[o("Freepbx"),r(t)]),o(" - Web-based open source GUI that controls and manages Asterisk. ("),e("a",Ph,[o("Source Code"),r(t)]),o(") "),yh,o(),Sh]),e("li",null,[e("a",vh,[o("XiVO"),r(t)]),o(" - Unified communications server software based on Asterisk. ("),e("a",Ch,[o("Source Code"),r(t)]),o(") "),Ah,o(),Lh])]),Mh,e("ul",null,[e("li",null,[e("a",Gh,[o("Abilian SBE"),r(t)]),o(" - Open Source Collaboration and Social Networking framework & platform. "),xh,o(),Th]),e("li",null,[e("a",Ih,[o("Anahita"),r(t)]),o(" - Open Source Social Networking Framework & Platform. ("),e("a",Eh,[o("Source Code"),r(t)]),o(") "),Dh,o(),Bh]),e("li",null,[e("a",Hh,[o("Bootcamp"),r(t)]),o(" - An enterprise social network. ("),e("a",jh,[o("Source Code"),r(t)]),o(") "),Rh,o(),Oh]),e("li",null,[e("a",Fh,[o("Buddycloud"),r(t)]),o(" - Tools, libraries, services and a community to build user-to-user, group and social messaging into your app. Saves time. Scales up. Supports you. ("),e("a",Nh,[o("Source Code"),r(t)]),o(") "),zh,o(),Wh]),e("li",null,[e("a",Jh,[o("BuddyPress"),r(t)]),o(" - A powerful plugin that takes your "),e("a",Uh,[o("WordPress.org"),r(t)]),o(" powered site beyond the blog with social-network features like user profiles, activity streams, user groups, and more. ("),e("a",Vh,[o("Source Code"),r(t)]),o(") "),qh,o(),Kh]),e("li",null,[e("a",Xh,[o("diaspora*"),r(t)]),o(" - Distributed social networking server. ("),e("a",Yh,[o("Demo"),r(t)]),o(", "),e("a",Zh,[o("Source Code"),r(t)]),o(") "),Qh,o(),$h]),e("li",null,[e("a",ec,[o("Discourse"),r(t)]),o(" - Advanced forum / community solution based on Ruby and JS. ("),e("a",oc,[o("Source Code"),r(t)]),o(") "),rc,o(),tc]),e("li",null,[e("a",nc,[o("Elgg"),r(t)]),o(" - A powerful open source social networking engine. ("),e("a",sc,[o("Source Code"),r(t)]),o(") "),lc,o(),ac]),e("li",null,[e("a",ic,[o("Flarum"),r(t)]),o(" - Delightfully simple forums. Flarum is the next-generation forum software that makes online discussion fun again. ("),e("a",hc,[o("Source Code"),r(t)]),o(") "),cc,o(),dc]),e("li",null,[e("a",_c,[o("flaskbb"),r(t)]),o(" - FlaskBB is forum software written in Python using the microframework Flask. You can easily create new topics, posts and send other users private messages. It also includes basic administration and moderation tools. ("),e("a",uc,[o("Source Code"),r(t)]),o(") "),pc,o(),fc]),e("li",null,[e("a",gc,[o("FluxBB"),r(t)]),o(" - Fast, light, user-friendly forum software for your website. ("),e("a",bc,[o("Source Code"),r(t)]),o(") "),mc,o(),kc]),e("li",null,[e("a",wc,[o("Friendica"),r(t)]),o(" - Social Communication Server. ("),e("a",Pc,[o("Source Code"),r(t)]),o(") "),yc,o(),Sc]),e("li",null,[e("a",vc,[o("GNU social"),r(t)]),o(" - Social communication software for both public and private communications. ("),e("a",Cc,[o("Source Code"),r(t)]),o(") "),Ac,o(),Lc]),e("li",null,[e("a",Mc,[o("Hubzilla"),r(t)]),o(" - Independent general-purpose websites that not only connect with their associated members and viewers, but also connect together. "),Gc,o(),xc]),e("li",null,[e("a",Tc,[o("HumHub"),r(t)]),o(" - A flexible kit for private social networks. ("),e("a",Ic,[o("Source Code"),r(t)]),o(") "),Ec,o(),Dc]),e("li",null,[e("a",Bc,[o("Isso"),r(t)]),o(" - A lightweight commenting server written in Python and Javascript. It aims to be a drop-in replacement for Disqus. ("),e("a",Hc,[o("Source Code"),r(t)]),o(") "),jc,o(),Rc]),e("li",null,[e("a",Oc,[o("Jappix"),r(t)]),o(" - Jappix is an open social platform, that let's you easily get or keep in touch with everyone. ("),e("a",Fc,[o("Source Code"),r(t)]),o(") "),Nc,o(),zc]),e("li",null,[e("a",Wc,[o("Loomio"),r(t)]),o(" - Loomio is a collaborative decision-making tool that makes it easy for anyone to participate in decisions which affect them. ("),e("a",Jc,[o("Source Code"),r(t)]),o(") "),Uc,o(),Vc]),e("li",null,[e("a",qc,[o("Movim"),r(t)]),o(" - A brand new social network, full of awesome features in a modern and smart interface. ("),e("a",Kc,[o("Source Code"),r(t)]),o(") "),Xc,o(),Yc]),e("li",null,[e("a",Zc,[o("MyBB"),r(t)]),o(" - Free, extensible forum software package. ("),e("a",Qc,[o("Source Code"),r(t)]),o(") "),$c,o(),ed]),e("li",null,[e("a",od,[o("Newebe"),r(t)]),o(" - A Distributed Social Network. ("),e("a",rd,[o("Source Code"),r(t)]),o(") "),td,o(),nd]),e("li",null,[e("a",sd,[o("NodeBB"),r(t)]),o(" - Node.js based forum software built for the modern web. ("),e("a",ld,[o("Source Code"),r(t)]),o(") "),ad,o(),id]),e("li",null,[e("a",hd,[o("OSSN"),r(t)]),o(" - Open Source Social Network (OSSN) is a social networking software written in PHP. It allows you to make a social networking website and helps your members build social relationships, with people who share similar professional or personal interests. ("),e("a",cd,[o("Source Code"),r(t)]),o(") "),dd,o(),_d]),e("li",null,[e("a",ud,[o("Oxwall"),r(t)]),o(" Oxwall is used for a wide range of projects starting from family sites and custom social networks to collaboration tools and enterprise community solutions. ("),e("a",pd,[o("Source Code"),r(t)]),o(),fd,o(),gd]),e("li",null,[e("a",bd,[o("phpBB"),r(t)]),o(" - Flat-forum bulletin board software solution that can be used to stay in touch with a group of people or can power your entire website. ("),e("a",md,[o("Source Code"),r(t)]),o(") "),kd,o(),wd]),e("li",null,[e("a",Pd,[o("PPnet"),r(t)]),o(" Create and host your own social network. "),yd,o(),Sd]),e("li",null,[e("a",vd,[o("Pump.io"),r(t)]),o(" - Stream server that does most of what people really want from a social network. ("),e("a",Cd,[o("Source Code"),r(t)]),o(") "),Ad,o(),Ld]),e("li",null,[e("a",Md,[o("Reddit"),r(t)]),o(" - Social networking and news website where registered community members can submit content. ("),e("a",Gd,[o("Demo"),r(t)]),o(", "),e("a",xd,[o("Source Code"),r(t)]),o(") "),Td,o(),Id]),e("li",null,[e("a",Ed,[o("RedMatrix"),r(t)]),o(" - Complete decentralised publishing, sharing, and communications system. "),Dd,o(),Bd]),e("li",null,[e("a",Hd,[o("twister"),r(t)]),o(" - Fully decentralized P2P microblogging platform leveraging the free software implementations of Bitcoin and BitTorrent protocols. ("),e("a",jd,[o("Source Code"),r(t)]),o(") "),Rd,o(),Od]),e("li",null,[e("a",Fd,[o("Vanilla Forums"),r(t)]),o(" - Simple and flexible forum software. ("),e("a",Nd,[o("Source Code"),r(t)]),o(") "),zd,o(),Wd])]),Jd,e("p",null,[e("em",null,[e("a",Ud,[o("Extensible Messaging and Presence Protocol"),r(t)]),o(" software")])]),Vd,e("ul",null,[e("li",null,[e("a",qd,[o("ejabberd"),r(t)]),o(" - XMPP instant messaging server. ("),e("a",Kd,[o("Source Code"),r(t)]),o(") "),Xd,o(),Yd]),e("li",null,[e("a",Zd,[o("Kontalk"),r(t)]),o(" – Kontalk is an Open Source Messenger, similar to WhatsApp (app for android only currently), including end-to-end encryption, server is based on Tigase XMPP Server. ("),e("a",Qd,[o("Source Code"),r(t)]),o(") "),$d,o(),e_]),e("li",null,[e("a",o_,[o("Metronome IM"),r(t)]),o(" - Fork of Prosody IM. ("),e("a",r_,[o("Source Code"),r(t)]),o(") "),t_,o(),n_]),e("li",null,[e("a",s_,[o("MongooseIM"),r(t)]),o(" - Fork of ejabberd. ("),e("a",l_,[o("Source Code"),r(t)]),o(") "),a_,o(),i_]),e("li",null,[e("a",h_,[o("Openfire"),r(t)]),o(" - Real time collaboration (RTC) server. ("),e("a",c_,[o("Source Code"),r(t)]),o(") "),d_,o(),__]),e("li",null,[e("a",u_,[o("Prosody IM"),r(t)]),o(" - Feature-rich and easy to configure XMPP server. ("),e("a",p_,[o("Source Code"),r(t)]),o(") "),f_,o(),g_]),e("li",null,[e("a",b_,[o("Tigase"),r(t)]),o(" - XMPP server implementation in Java. "),m_,o(),k_])]),w_,e("ul",null,[e("li",null,[e("a",P_,[o("Candy"),r(t)]),o(" - Multi user XMPP client written in Javascript. ("),e("a",y_,[o("Source Code"),r(t)]),o(") "),S_,o(),v_]),e("li",null,[e("a",C_,[o("Converse.js"),r(t)]),o(" - A free and open-source XMPP chat client in your browser. ("),e("a",A_,[o("Source Code"),r(t)]),o(") "),L_,o(),M_]),e("li",null,[e("a",G_,[o("Kaiwa"),r(t)]),o(" - Web based chat client in the style of common paid alternatives. ("),e("a",x_,[o("Source Code"),r(t)]),o(") "),T_,o(),I_]),e("li",null,[e("a",E_,[o("Salut à Toi"),r(t)]),o(" - Multipurpose, multi frontend, libre and decentralised communication tool. ("),e("a",D_,[o("Source Code"),r(t)]),o(") "),B_,o(),H_,e("ul",null,[e("li",null,[e("a",j_,[o("Libervia"),r(t)]),o(" - Web frontend from Salut à Toi. ("),e("a",R_,[o("Source Code"),r(t)]),o(") "),O_,o(),F_])])])]),N_,z_,e("ul",null,[e("li",null,[e("a",W_,[o("99ko CMS"),r(t)]),o(" - 99ko allows you to create a website in minutes without knowledge of Web development. It does not use a database server but relies on simple text files (JSON format) to store your data. ("),e("a",J_,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",U_,[o("Apostrophe 2"),r(t)]),o(" - A node.js CMS with a focus on extensible in-context editing tools. ("),e("a",V_,[o("Demo"),r(t)]),o(", "),e("a",q_,[o("Source Code"),r(t)]),o(") "),K_,o(),X_]),e("li",null,[e("a",Y_,[o("Baun"),r(t)]),o(" - A modern, lightweight, extensible CMS for PHP. ("),e("a",Z_,[o("Source Code"),r(t)]),o(") "),Q_,o(),$_]),e("li",null,[e("a",eu,[o("BigTree CMS"),r(t)]),o(" - Straightforward, well documented, and capable written with PHP and MySQL. ("),e("a",ou,[o("Source Code"),r(t)]),o(") "),ru,o(),tu]),e("li",null,[e("a",nu,[o("CMS Made Simple"),r(t)]),o(" - Open source content management system, faster and easier management of website contents, scalable for small businesses to large corporations. ("),e("a",su,[o("Source Code"),r(t)]),o(") "),lu,o(),au]),e("li",null,[e("a",iu,[o("Concrete 5 CMS"),r(t)]),o(" - An open source content management system. ("),e("a",hu,[o("Source Code"),r(t)]),o(") "),cu,o(),du]),e("li",null,[e("a",_u,[o("CouchCMS"),r(t)]),o(" - Simple Open-Source CMS for designers. ("),e("a",uu,[o("Source Code"),r(t)]),o(") "),pu,o(),fu]),e("li",null,[e("a",gu,[o("Directus"),r(t)]),o(" - Directus is a powerful and intuitive headless CMS for managing SQL databases with custom architectures. Built around a robust and extensible API, this decoupled content management framework is perfect for websites, apps, or multi-client projects. ("),e("a",bu,[o("Source Code"),r(t)]),o(") "),mu,o(),ku]),e("li",null,[e("a",wu,[o("Drupal"),r(t)]),o(" - Advanced open source content management platform. ("),e("a",Pu,[o("Source Code"),r(t)]),o(") "),yu,o(),Su]),e("li",null,[e("a",vu,[o("eLabFTW"),r(t)]),o(" - An online lab notebook for research labs. Store experiments, use a database to find reagents or protocols, use trusted timestamping to legally timestamp an experiment, export as pdf or zip archive, share with collaborators…. ("),e("a",Cu,[o("Source Code"),r(t)]),o(", "),e("a",Au,[o("Demo"),r(t)]),o(") "),Lu,o(),Mu]),e("li",null,[e("a",Gu,[o("GetSimple CMS"),r(t)]),o(" - The Simplest Content Management System. Ever. "),xu]),e("li",null,[e("a",Tu,[o("ImpressPages CMS"),r(t)]),o(" - Easy code meets easy admin. ("),e("a",Iu,[o("Demo"),r(t)]),o(", "),e("a",Eu,[o("Source Code"),r(t)]),o(") "),Du,o("/"),Bu,o(),Hu]),e("li",null,[e("a",ju,[o("Joomla!"),r(t)]),o(" - Advanced Content Management System (CMS). ("),e("a",Ru,[o("Source Code"),r(t)]),o(") "),Ou,o(),Fu]),e("li",null,[e("a",Nu,[o("KeystoneJS"),r(t)]),o(" - Node.js CMS & Web Application Platform. ("),e("a",zu,[o("Demo"),r(t)]),o(", "),e("a",Wu,[o("Source Code"),r(t)]),o(") "),Ju,o(),Uu]),e("li",null,[e("a",Vu,[o("MODX"),r(t)]),o(" - MODX is an advanced content management and publishing platform. The current version is called 'Revolution'. ("),e("a",qu,[o("Source Code"),r(t)]),o(") "),Ku,o(),Xu]),e("li",null,[e("a",Yu,[o("Neos"),r(t)]),o(" - Neos or TYPO3 Neos (for version 1) is a modern, open source CMS based on the Flow framework. ("),e("a",Zu,[o("Source Code"),r(t)]),o(") "),Qu,o(),$u]),e("li",null,[e("a",ep,[o("october"),r(t)]),o(" - Free, open-source, self-hosted CMS platform based on the Laravel PHP Framework. ("),e("a",op,[o("Source Code"),r(t)]),o(") "),rp,o(),tp]),e("li",null,[e("a",np,[o("Omeka"),r(t)]),o(" - Create complex narratives and share rich collections, adhering to Dublin Core standards with Omeka on your server, designed for scholars, museums, libraries, archives, and enthusiasts. ("),e("a",sp,[o("Demo"),r(t)]),o(", "),e("a",lp,[o("Source Code"),r(t)]),o(") "),ap,o(),ip]),e("li",null,[e("a",hp,[o("Pagekit"),r(t)]),o(" - A new modern CMS to create and share. ("),e("a",cp,[o("Source Code"),r(t)]),o(") "),dp,o(),_p]),e("li",null,[e("a",up,[o("Pico"),r(t)]),o(" - A stupidly simple, blazing fast, flat file CMS. ("),e("a",pp,[o("Source Code"),r(t)]),o(") "),fp,o(),gp]),e("li",null,[e("a",bp,[o("Pimcore"),r(t)]),o(" - Multi-Channel Experience and Engagement Management Platform. ("),e("a",mp,[o("Source Code"),r(t)]),o(") "),kp,o(),wp]),e("li",null,[e("a",Pp,[o("Plone"),r(t)]),o(" - Powerful open-source CMS system. ("),e("a",yp,[o("Source Code"),r(t)]),o(") "),Sp,o(),vp]),e("li",null,[e("a",Cp,[o("Publify"),r(t)]),o(" - A simple but full featured web publishing software. ("),e("a",Ap,[o("Demo"),r(t)]),o(", "),e("a",Lp,[o("Source Code"),r(t)]),o(") "),Mp,o(),Gp]),e("li",null,[xp,o(" - Ultra lightweight CMS for MySQL, SQLite and PostgreSQL. ("),e("a",Tp,[o("Demo"),r(t)]),o(", "),e("a",Ip,[o("Source Code"),r(t)]),o(") "),Ep,o(),Dp]),e("li",null,[e("a",Bp,[o("Roadiz"),r(t)]),o(" - Modern CMS based on a node system which can handle many types of services. ("),e("a",Hp,[o("Source Code"),r(t)]),o(") "),jp,o(),Rp]),e("li",null,[e("a",Op,[o("SilverStripe"),r(t)]),o(" - Easy to use CMS with powerful MVC framework underlying. ("),e("a",Fp,[o("Demo"),r(t)]),o(", "),e("a",Np,[o("Source Code"),r(t)]),o(") "),zp,o(),Wp]),e("li",null,[e("a",Jp,[o("Sphido"),r(t)]),o(" - A fast, lightweight, flat file CMS for PHP. ("),e("a",Up,[o("Source Code"),r(t)]),o(") "),Vp,o(),qp]),e("li",null,[e("a",Kp,[o("SPIP"),r(t)]),o(" - Publication system for the Internet aimed at collaborative work, multilingual environments, and simplicity of use for web authors. ("),e("a",Xp,[o("Source Code"),r(t)]),o(") "),Yp,o(),Zp]),e("li",null,[e("a",Qp,[o("Subrion"),r(t)]),o(" - Subrion is a free open source content management system that allows you to build websites for any purpose. Yes, from blog to corporate mega portal. ("),e("a",$p,[o("Demo"),r(t)]),o(", "),e("a",ef,[o("Source Code"),r(t)]),o(") "),of,o(),rf]),e("li",null,[e("a",tf,[o("Textpattern"),r(t)]),o(" - A flexible, elegant and easy-to-use CMS. ("),e("a",nf,[o("Demo"),r(t)]),o(", "),e("a",sf,[o("Source Code"),r(t)]),o(") "),lf,o(),af]),e("li",null,[e("a",hf,[o("TYPO3"),r(t)]),o(" - A powerful and advanced CMS with a large community. ("),e("a",cf,[o("Source Code"),r(t)]),o(") "),df,o(),_f]),e("li",null,[e("a",uf,[o("Umbraco"),r(t)]),o(" - The friendly CMS. Free and open source with an amazing community. ("),e("a",pf,[o("Source code"),r(t)]),o(") "),ff,o(),gf]),e("li",null,[e("a",bf,[o("WordPress"),r(t)]),o(" - The worlds most-used blogging and CMS engine. ("),e("a",mf,[o("Source code mirror"),r(t)]),o(") "),kf,o(),wf])]),Pf,e("ul",null,[e("li",null,[e("a",yf,[o("OpenEats"),r(t)]),o(" - A recipe management site that allows users to create, store, share and rate recipes, create grocery lists, and more. ("),e("a",Sf,[o("Source Code"),r(t)]),o(") "),vf,o(),Cf])]),Af,e("ul",null,[e("li",null,[e("a",Lf,[o("Attendize"),r(t)]),o(" - Ticket selling and event management platform. ("),e("a",Mf,[o("Demo"),r(t)]),o(", "),e("a",Gf,[o("Source Code"),r(t)]),o(") "),xf,o(),Tf]),e("li",null,[e("a",If,[o("CoreShop"),r(t)]),o(" - CoreShop is a e-commerce plugin for Pimcore. ("),e("a",Ef,[o("Source Code"),r(t)]),o(") "),Df,o(),Bf]),e("li",null,[e("a",Hf,[o("Magento"),r(t)]),o(" - Leading provider of open omnichannel innovation. ("),e("a",jf,[o("Demo"),r(t)]),o(", "),e("a",Rf,[o("Source Code"),r(t)]),o(") "),Of,o(),Ff]),e("li",null,[e("a",Nf,[o("Microweber"),r(t)]),o(" - Drag and Drop CMS and online shop. ("),e("a",zf,[o("Demo"),r(t)]),o(", "),e("a",Wf,[o("Source Code"),r(t)]),o(") "),Jf,o(),Uf]),e("li",null,[e("a",Vf,[o("OpenCart"),r(t)]),o(" - Free open source shopping cart solution. ("),e("a",qf,[o("Source Code"),r(t)]),o(") "),Kf,o(),Xf]),e("li",null,[e("a",Yf,[o("Open Classifieds"),r(t)]),o(" - Free open-source, self-hosted CMS for classifieds sites. ("),e("a",Zf,[o("Source Code"),r(t)]),o(") "),Qf,o(),$f]),e("li",null,[e("a",eg,[o("Open eShop"),r(t)]),o(" - Sell your digital goods with licenses and provide support. ("),e("a",og,[o("Source Code"),r(t)]),o(") "),rg,o(),tg]),e("li",null,[e("a",ng,[o("OXID eShop"),r(t)]),o(" - OXID eShop is a flexible open source e-commerce software with a wide range of functionalities. ("),e("a",sg,[o("Demo"),r(t)]),o(", "),e("a",lg,[o("Source Code"),r(t)]),o(") "),ag,o(),ig]),e("li",null,[e("a",hg,[o("PrestaShop"),r(t)]),o(" - PrestaShop offers a free, open-source and fully scalable e-commerce solution. ("),e("a",cg,[o("Demo"),r(t)]),o(", "),e("a",dg,[o("Source Code"),r(t)]),o(") "),_g,o(),ug]),e("li",null,[e("a",pg,[o("Shoop"),r(t)]),o(" - Django powered fully customizable open source e-commerce framework for small and large sites. ("),e("a",fg,[o("B2C demo"),r(t)]),o(", "),e("a",gg,[o("B2B demo"),r(t)]),o(", "),e("a",bg,[o("Source Code"),r(t)]),o(") "),mg,o(),kg]),e("li",null,[e("a",wg,[o("Sylius"),r(t)]),o(" - Symfony2 powered open source full-stack platform for eCommerce. ("),e("a",Pg,[o("Demo"),r(t)]),o(", "),e("a",yg,[o("Source Code"),r(t)]),o(") "),Sg,o(),vg]),e("li",null,[e("a",Cg,[o("Thelia"),r(t)]),o(" - Thelia is an open source and flexible e-commerce solution. ("),e("a",Ag,[o("Demo"),r(t)]),o(", "),e("a",Lg,[o("Source Code"),r(t)]),o(") "),Mg,o(),Gg]),e("li",null,[e("a",xg,[o("WooCommerce"),r(t)]),o(" - WordPress based e-commerce solution. ("),e("a",Tg,[o("Source Code"),r(t)]),o(") "),Ig,o(),Eg])]),Dg,e("p",null,[o("See "),e("a",Bg,[o("https://github.com/n1trux/awesome-sysadmin#dns"),r(t)])]),Hg,e("ul",null,[e("li",null,[e("a",jg,[o("CUPS"),r(t)]),o(" - The Common Unix Print System uses Internet Printing Protocol (IPP) to support printing to local and network printers. ("),e("a",Rg,[o("Source Code"),r(t)]),o(") "),Og,o(),Fg]),e("li",null,[e("a",Ng,[o("Paperless"),r(t)]),o(" - Scan, index, and archive all of your paper documents. "),zg,o(),Wg]),e("li",null,[e("a",Jg,[o("SANE Network Scanning"),r(t)]),o(" - allow remote clients to access image acquisition devices (scanners) available on the local host. ("),e("a",Ug,[o("Source Code"),r(t)]),o(") "),Vg,o(),qg])]),Kg,e("ul",null,[e("li",null,[e("a",Xg,[o("ERPNext"),r(t)]),o(" - Free open source ERP system. ("),e("a",Yg,[o("Demo"),r(t)]),o(", "),e("a",Zg,[o("Source Code"),r(t)]),o(") "),Qg,o(),$g]),e("li",null,[e("a",eb,[o("Odoo"),r(t)]),o(" - Free open source ERP system. ("),e("a",ob,[o("Demo"),r(t)]),o(", "),e("a",rb,[o("Source Code"),r(t)]),o(") "),tb,o(),nb]),e("li",null,[e("a",sb,[o("Tryton"),r(t)]),o(" - Free open source business solution. ("),e("a",lb,[o("Demo"),r(t)]),o(", "),e("a",ab,[o("Source Code"),r(t)]),o(") "),ib,o(),hb])]),cb,e("ul",null,[e("li",null,[e("a",db,[o("FreeRADIUS"),r(t)]),o(" - High performance and highly configurable multi-protocol policy/authentication server, supporting RADIUS, DHCPv4 and VMPS. ("),e("a",_b,[o("Source Code"),r(t)]),o(") "),ub,o(),pb]),e("li",null,[e("a",fb,[o("daloRADIUS"),r(t)]),o(" - Open-source web management platform for FreeRADIUS-based deployments. ("),e("a",gb,[o("Source Code"),r(t)]),o(") "),bb]),e("li",null,[e("a",mb,[o("FreeIPA"),r(t)]),o(" - an integrated Identity and Authentication solution for Linux/UNIX networked environments. A FreeIPA server provides centralized authentication, authorization and account information by storing data about user, groups, hosts. "),kb,o(),wb]),e("li",null,[e("a",Pb,[o("IndieAuth"),r(t)]),o(" - Sign in with your domain name (using the "),e("a",yb,[o("rel-me-auth"),r(t)]),o(" protocol). "),Sb,o(),vb]),e("li",null,[e("a",Cb,[o("Libravatar"),r(t)]),o(" - Libravatar is a service which delivers your avatar (profile picture) to other websites. ("),e("a",Ab,[o("Demo"),r(t)]),o(", "),e("a",Lb,[o("Source Code"),r(t)]),o(") "),Mb,o(),Gb]),e("li",null,[e("a",xb,[o("OpenCA OCSPD"),r(t)]),o(" - An "),e("a",Tb,[o("OCSP"),r(t)]),o(" Responder.")]),e("li",null,[e("a",Ib,[o("OpenID/OpenID Connect"),r(t)]),o(" - A Simple Identity layer on top of OAuth 2.0.")]),e("li",null,[e("a",Eb,[o("OSIAM"),r(t)]),o(" - Open Source Identity and Access Management implementing OAuth 2.0 and SCIMv2. ("),e("a",Db,[o("Source Code"),r(t)]),o(") "),Bb,o(),Hb])]),jb,e("ul",null,[e("li",null,[e("a",Rb,[o("CommaFeed"),r(t)]),o(" - Google Reader inspired self-hosted RSS reader. ("),e("a",Ob,[o("Source Code"),r(t)]),o(") "),Fb]),e("li",null,[e("a",Nb,[o("Creaky Coot"),r(t)]),o(" - Minimalist and responsive RSS reader and links saver "),zb]),e("li",null,[e("a",Wb,[o("Feedbin"),r(t)]),o(" - A simple, fast and nice looking RSS reader. ("),e("a",Jb,[o("Source Code"),r(t)]),o(") "),Ub]),e("li",null,[e("a",Vb,[o("FeedHQ"),r(t)]),o(" - FeedHQ is a web-based feed reader. ("),e("a",qb,[o("Source Code"),r(t)]),o(") "),Kb]),e("li",null,[e("a",Xb,[o("FreshRSS"),r(t)]),o(" - A self-hostable RSS feed aggregator. ("),e("a",Yb,[o("Demo"),r(t)]),o(", "),e("a",Zb,[o("Source Code"),r(t)]),o(", "),e("a",Qb,[o("Mobile app"),r(t)]),o(") "),$b,o(),e1]),e("li",null,[e("a",o1,[o("JARR"),r(t)]),o(" - JARR (Just Another RSS Reader) is a web-based news aggregator and reader. ("),e("a",r1,[o("Demo"),r(t)]),o(", "),e("a",t1,[o("Source Code"),r(t)]),o(") "),n1,o(),s1]),e("li",null,[e("a",l1,[o("Kriss Feed"),r(t)]),o(" - A simple and smart (or stupid) feed reader. ("),e("a",a1,[o("Demo"),r(t)]),o(", "),e("a",i1,[o("Source Code"),r(t)]),o(") "),h1]),e("li",null,[e("a",c1,[o("Leed"),r(t)]),o(" - Leed (for Light Feed) is a Free and minimalist RSS aggregator. ("),e("a",d1,[o("Source Code"),r(t)]),o(") "),_1]),e("li",null,[e("a",u1,[o("Leselys"),r(t)]),o(" - Your very elegant RSS reader "),p1]),e("li",null,[e("a",f1,[o("Lite-Reader"),r(t)]),o(" - Read your feeds on your own machine with a simple and lite application. ("),e("a",g1,[o("Source Code"),r(t)]),o(") "),b1]),e("li",null,[e("a",m1,[o("Moonmoon"),r(t)]),o(" - simple feed agregator (planet like): it only aggregates feeds and spits them out in one single page. ("),e("a",k1,[o("Source Code"),r(t)]),o(") "),w1,o(),P1]),e("li",null,[e("a",y1,[o("Miniflux"),r(t)]),o(" - Miniflux is a minimalist and open source news reader. ("),e("a",S1,[o("Source Code"),r(t)]),o(") "),v1]),e("li",null,[e("a",C1,[o("NewsBlur"),r(t)]),o(" - NewsBlur is a personal news reader that brings people together to talk about the world. A new sound of an old instrument "),A1]),e("li",null,[e("a",L1,[o("Nunux Reader"),r(t)]),o(" - A simple, fast and reactive RSS reader. ("),e("a",M1,[o("Source Code"),r(t)]),o(") "),G1,o(),x1]),e("li",null,[e("a",T1,[o("Reader-Self"),r(t)]),o(" Self-hosted rss reader (php / mysql or sqlite) - Google Reader alternative. ("),e("a",I1,[o("Source Code"),r(t)]),o(") "),E1]),e("li",null,[e("a",D1,[o("Readr"),r(t)]),o(" - A clean & simple, self-hosted RSS reader "),B1]),e("li",null,[e("a",H1,[o("RSS2EMail"),r(t)]),o(" - Fetches RSS/Atom-feeds and pushes new Content to any email-reciever, supports OPML "),j1,o(),R1]),e("li",null,[e("a",O1,[o("RSSminer"),r(t)]),o(" -An online rss reader written in clojure & Javascript & java. ("),e("a",F1,[o("Source Code"),r(t)]),o(") "),N1]),e("li",null,[e("a",z1,[o("RSS Monster"),r(t)]),o(" - RSS Monster is an easy to use web-based RSS aggregator and reader compatible with the Fever API, created as an alternative for Google Reader. "),W1,o(),J1]),e("li",null,[e("a",U1,[o("Screaming Liquid Tiger"),r(t)]),o(" - Simple script to automatically generate valid RSS and Atom feeds from a list of media files in the same folder. "),V1,o(),q1]),e("li",null,[e("a",K1,[o("Selfoss"),r(t)]),o(" - The new multipurpose rss reader, live stream, mashup, aggregation web application. ("),e("a",X1,[o("Source Code"),r(t)]),o(") "),Y1,o(),Z1]),e("li",null,[e("a",Q1,[o("Stringer"),r(t)]),o(" - A work-in-progress self-hosted, anti-social RSS reader. "),$1,o(),em]),e("li",null,[e("a",om,[o("Tiny Tiny RSS"),r(t)]),o(" - Open source web-based news feed (RSS/Atom) reader and aggregator. ("),e("a",rm,[o("Public instance"),r(t)]),o(") "),tm,o(),nm,e("ul",null,[e("li",null,[e("a",sm,[o("gritttt-rss"),r(t)]),o(" - More features for Tiny Tiny RSS. ("),e("a",lm,[o("Source Code"),r(t)]),o(") "),am,o(),im]),e("li",null,[e("a",hm,[o("ttrss-mobile"),r(t)]),o(" - A mobile webapp for Tiny Tiny RSS. "),cm,o(),dm]),e("li",null,[e("a",_m,[o("ttrss-reader"),r(t)]),o(" - Light and responsive client for TTRSS. "),um,o(),pm])])])]),fm,e("ul",null,[e("li",null,[e("a",gm,[o("Camlistore"),r(t)]),o(" - Camlistore is a set of open source formats, protocols, and software for modeling, storing, searching, sharing and synchronizing data in the post-PC era. Data may be files or objects, tweets or 5TB videos, and you can access it via a phone, browser or FUSE filesystem. ("),e("a",bm,[o("Source Code"),r(t)]),o(") "),mm,o(),km]),e("li",null,[e("a",wm,[o("GlusterFS"),r(t)]),o(" - GlusterFS is a scalable network filesystem. Using common off-the-shelf hardware, you can create large, distributed storage solutions for media streaming, data analysis, and other data- and bandwidth-intensive tasks. ("),e("a",Pm,[o("Source Code"),r(t)]),o(") "),ym,o(),Sm]),e("li",null,[e("a",vm,[o("Go IPFS"),r(t)]),o(" - Implementation of "),e("a",Cm,[o("IPFS"),r(t)]),o(", a global, versioned, peer-to-peer filesystem that seeks to connect all computing devices with the same system of files. It combines good ideas from Git, BitTorrent, Kademlia, SFS, and the Web. It is like a single bittorrent swarm, exchanging git objects.")]),e("li",null,[e("a",Am,[o("Ori Filesystem"),r(t)]),o(" - A Secure Distributed File System built for offline operation. ("),e("a",Lm,[o("Source Code"),r(t)]),o(") "),Mm,o(),Gm]),e("li",null,[e("a",xm,[o("Swift"),r(t)]),o(" - A highly available, distributed, eventually consistent object/blob store.")]),e("li",null,[e("a",Tm,[o("Tahoe-LAFS"),r(t)]),o(" - Tahoe-LAFS is a Free and Open decentralized cloud storage system. It distributes your data across multiple servers. Even if some of the servers fail or are taken over by an attacker, the entire file store continues to function correctly, preserving your privacy and security.")])]),Im,e("ul",null,[e("li",null,[e("a",Em,[o("Git Annex"),r(t)]),o(" - File synchronization between computers, servers, external drives")]),e("li",null,[e("a",Dm,[o("Kinto"),r(t)]),o(" - Kinto is a minimalist JSON storage service with synchronisation and sharing abilities. ("),e("a",Bm,[o("Source Code"),r(t)]),o(") "),Hm,o(),jm]),e("li",null,[e("a",Rm,[o("Nextcloud"),r(t)]),o(" - Access & share your files, calendars, contacts, mail & more from any device, on your terms. ("),e("a",Om,[o("Source Code"),r(t)]),o(") "),Fm,o(),Nm]),e("li",null,[e("a",zm,[o("OpenSSH/SFTP"),r(t)]),o(" - Secure File Transfer Program. ("),e("a",Wm,[o("Source Code"),r(t)]),o(") "),Jm,o(),Um]),e("li",null,[e("a",Vm,[o("Samba"),r(t)]),o(" - Samba is the standard Windows interoperability suite of programs for Linux and Unix. It provides secure, stable and fast file and print services for all clients using the SMB/CIFS protocol. ("),e("a",qm,[o("Source Code"),r(t)]),o(") "),Km,o(),Xm]),e("li",null,[e("a",Ym,[o("Seafile"),r(t)]),o(" - File hosting and sharing solution primary for teams and organizations. ("),e("a",Zm,[o("Demo"),r(t)]),o(") "),Qm]),e("li",null,[e("a",$m,[o("SparkleShare"),r(t)]),o(" - Self hosted, instant, secure file sync")]),e("li",null,[e("a",ek,[o("Syncany"),r(t)]),o(" - Secure file sync software for arbitrary storage backends - An open-source cloud storage and filesharing application. Securely synchronize your files to any kind of storage! "),ok,o(),rk]),e("li",null,[e("a",tk,[o("Syncthing"),r(t)]),o(" - Syncthing is an open source peer-to-peer file synchronisation tool. ("),e("a",nk,[o("Source Code"),r(t)]),o(") "),sk,o(),lk]),e("li",null,[e("a",ak,[o("Z-Push"),r(t)]),o(" - An implementation of Microsoft’s "),e("a",ik,[o("ActiveSync"),r(t)]),o(" protocol")]),e("li",null,[e("a",hk,[o("ownCloud"),r(t)]),o(" - All-in-one solution for saving, synchronizing, viewing, editing and sharing files, calendars, address books and more - "),ck,o(),dk]),e("li",null,[e("a",_k,[o("Pydio"),r(t)]),o(" - Turn any web server into a powerful file management system and an alternative to mainstream cloud storage providers.")]),e("li",null,[e("a",uk,[o("Unison"),r(t)]),o(" - Unison is a file-synchronization tool for OSX, Unix, and Windows. "),pk,o(),fk])]),gk,e("ul",null,[e("li",null,[e("a",bk,[o("FilePizza"),r(t)]),o(" - Peer-to-peer file transfers in your browser. ("),e("a",mk,[o("Source Code"),r(t)]),o(") "),kk,o(),wk]),e("li",null,[e("a",Pk,[o("FileTea"),r(t)]),o(" - Anonymous, volatile file sharing: does not store any file on server. Bridges a download to the recipient’s browser with an upload from the source’s browser. ("),e("a",yk,[o("Source Code"),r(t)]),o(),Sk,o(),vk]),e("li",null,[e("a",Ck,[o("instant.io"),r(t)]),o(" - Streaming file transfer over WebTorrent. ("),e("a",Ak,[o("Demo"),r(t)]),o(") "),Lk,o(),Mk]),e("li",null,[e("a",Gk,[o("Opentracker"),r(t)]),o(" - Open and free bittorrent tracker. It aims for minimal resource usage and is intended to run at your wlan router. ("),e("a",xk,[o("Source Code"),r(t)]),o(),Tk,o(),Ik]),e("li",null,[e("a",Ek,[o("ShareFest"),r(t)]),o(" - Web based p2p file sharing built on WebRTC Data Channels API. ("),e("a",Dk,[o("Demo"),r(t)]),o(") "),Bk,o(),Hk])]),jk,e("ul",null,[e("li",null,[e("a",Rk,[o("BoZoN"),r(t)]),o(" - Minimalist Drag & drop file sharing app. "),Ok,o(),Fk]),e("li",null,[e("a",Nk,[o("Coquelicot"),r(t)]),o(" - Coquelicot is a “one-click” file sharing web application with a focus on protecting users’ privacy. - "),zk]),e("li",null,[e("a",Wk,[o("Dropcenter"),r(t)]),o(" - Upload files by simple drag-n-drop.")]),e("li",null,[e("a",Jk,[o("droppy"),r(t)]),o(" - droppy is a self-hosted cloud server with an interface similar to desktop file managers and has capabilites to edit files on-the-fly as well as view and playback media directly in the browser. ("),e("a",Uk,[o("Demo"),r(t)]),o(") "),Vk,o(),qk]),e("li",null,[e("a",Kk,[o("img.bi"),r(t)]),o(" - "),e("a",Xk,[o("img.bi"),r(t)]),o(" is a secure image hosting. Images are encrypted using AES-256 with random key in browser before upload. "),Yk,o(),Zk]),e("li",null,[e("a",Qk,[o("ipfs.pics"),r(t)]),o(" - ipfs.pics is a o distributed image hosting website. ("),e("a",$k,[o("Source Code"),r(t)]),o(") "),ew,o(),ow]),e("li",null,[e("a",rw,[o("Jirafeau"),r(t)]),o(" - Jirafeau is a web site permitting to upload a file in a simple way and give an unique link to it. ("),e("a",tw,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",nw,[o("Jyraphe"),r(t)]),o(" - Jyraphe is a web application of file repository, easy to install and easy to use.")]),e("li",null,[e("a",sw,[o("linx"),r(t)]),o(" - File sharing application and pastebin with API, auto-expiry, deletion keys, and web seed support. ("),e("a",lw,[o("Demo"),r(t)]),o(") "),aw,o(),iw]),e("li",null,[e("a",hw,[o("lufi"),r(t)]),o(" - Let's Upload that FIle, client-side encrypted. ("),e("a",cw,[o("Demo"),r(t)]),o(", "),e("a",dw,[o("Source Code"),r(t)]),o(") "),_w,o(),uw]),e("li",null,[e("a",pw,[o("lutim"),r(t)]),o(" - Let's Upload That Image !")]),e("li",null,[e("a",fw,[o("Mediacrush"),r(t)]),o(" - A website you can upload images, audio, and video to, and receive a link to share it with your friends. ("),e("a",gw,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",bw,[o("Minio"),r(t)]),o(" - Store photos, videos, VMs, containers, log files, or any blob of data as objects. ("),e("a",mw,[o("Source Code"),r(t)]),o(") "),kw,o(),ww]),e("li",null,[e("a",Pw,[o("Nimbus"),r(t)]),o(" - A drag-and-drop shortlink file sharer for OS X - "),yw,o(),Sw]),e("li",null,[e("a",vw,[o("OnionShare"),r(t)]),o(" - Securely and anonymously share a file of any size.")]),e("li",null,[e("a",Cw,[o("PictShare"),r(t)]),o(" - PictShare is a multi lingual, open source image hosting service with a simple resizing and upload API. ("),e("a",Aw,[o("Demo"),r(t)]),o(", "),e("a",Lw,[o("Source Code"),r(t)]),o(") "),Mw,o(),Gw]),e("li",null,[e("a",xw,[o("Pomf"),r(t)]),o(" - Simple file uploading and sharing, source for the now shut down site "),e("a",Tw,[o("Pomf.se"),r(t)]),o(". "),Iw,o(),Ew]),e("li",null,[e("a",Dw,[o("ProjectSend"),r(t)]),o(" - Upload files and assign them to specific clients you create. Give access to those files to your clients. ("),e("a",Bw,[o("Source Code"),r(t)]),o(") "),Hw,o(),jw]),e("li",null,[e("a",Rw,[o("transfer.sh"),r(t)]),o(" - Easy file sharing from the command line. ("),e("a",Ow,[o("Demo"),r(t)]),o(", "),e("a",Fw,[o("Source Code"),r(t)]),o(") "),Nw,o(),zw]),e("li",null,[e("a",Ww,[o("Uguu"),r(t)]),o(" - Stores files and deletes after X amount of time. ("),e("a",Jw,[o("Source Code"),r(t)]),o(") "),Uw,o(),Vw]),e("li",null,[e("a",qw,[o("Up1"),r(t)]),o(" - A Client-side Encrypted Image Host. ("),e("a",Kw,[o("Demo"),r(t)]),o(") "),Xw,o(),Yw]),e("li",null,[e("a",Zw,[o("uPste"),r(t)]),o(" - A private file hosting application with an emphasis on serving technology communities. ("),e("a",Qw,[o("Source Code"),r(t)]),o(") "),$w,o(),e2]),e("li",null,[e("a",o2,[o("YouTransfer"),r(t)]),o(" - YouTransfer is a simple but elegant self-hosted file transfer & sharing solution. ("),e("a",r2,[o("Demo"),r(t)]),o(", "),e("a",t2,[o("Source Code"),r(t)]),o(") "),n2,o(),s2])]),l2,e("ul",null,[e("li",null,[e("a",a2,[o("Apaxy"),r(t)]),o(" - Theme built to enhance the experience of browsing web directories, using the mod_autoindex Apache module and some CSS to override the default style of a directory listing. ("),e("a",i2,[o("Source Code"),r(t)]),o(),h2,o(),c2]),e("li",null,[e("a",d2,[o("DirectoryLister"),r(t)]),o(" - A simple PHP based directory lister that lists a directory and all it's sub-directories and allows you to navigate there within. ("),e("a",_2,[o("Source code"),r(t)]),o(") "),u2,o(),p2]),e("li",null,[e("a",f2,[o("Encode Explorer"),r(t)]),o(" - Encode Explorer is a single page file browser, it is simple and functional. ("),e("a",g2,[o("Demo"),r(t)]),o(", "),e("a",b2,[o("Source Code"),r(t)]),o(") "),m2,o(),k2]),e("li",null,[e("a",w2,[o("eXtplorer"),r(t)]),o(" - A PHP and Javascript based File Manager")]),e("li",null,[e("a",P2,[o("explorer"),r(t)]),o(" - Highly-configurable directory listing made with nodejs. ("),e("a",y2,[o("Source Code"),r(t)]),o(")"),S2,o(),v2]),e("li",null,[e("a",C2,[o("goBrowser"),r(t)]),o(" Simple http file browser. ("),e("a",A2,[o("Source Code"),r(t)]),o(") "),L2,o(),M2]),e("li",null,[e("a",G2,[o("h5ai"),r(t)]),o(" - Modern file indexer for HTTP web servers with focus on your files. Directories are displayed in a appealing way and browsing them is enhanced by different views, a breadcrumb and a tree overview. ("),e("a",x2,[o("Demo"),r(t)]),o(", "),e("a",T2,[o("Source Code"),r(t)]),o(") "),I2,o(),E2]),e("li",null,[e("a",D2,[o("Monsta FTP"),r(t)]),o(" - Open source PHP/Ajax cloudware that puts FTP file management right in your browser, anywhere, any time. ("),e("a",B2,[o("Demo"),r(t)]),o(", "),e("a",H2,[o("Source Code"),r(t)]),o(") "),j2,o(),R2]),e("li",null,[e("a",O2,[o("ResourceSpace"),r(t)]),o(" - ResourceSpace open source digital asset management software is the simple, fast, & free way to organise your digital assets. ("),e("a",F2,[o("Demo"),r(t)]),o(", "),e("a",N2,[o("Source Code"),r(t)]),o(") "),z2,o(),W2]),e("li",null,[e("a",J2,[o("Sprut.io"),r(t)]),o(" - 2 panel file manager with drag and drop features, code editor, text search, hotkeys. ("),e("a",U2,[o("Demo"),r(t)]),o(", "),e("a",V2,[o("Source Code"),r(t)]),o(") "),q2,o(),K2])]),X2,e("ul",null,[e("li",null,[e("a",Y2,[o("0hh1"),r(t)]),o(" - A lovely little logic game by Q42. ("),e("a",Z2,[o("Demo"),r(t)]),o(") "),Q2,o(),$2]),e("li",null,[e("a",eP,[o("A Dark Room"),r(t)]),o(" - A minimalist text adventure game for your browser. ("),e("a",oP,[o("Demo"),r(t)]),o(") "),rP,o(),tP]),e("li",null,[e("a",nP,[o("Agar.IO Clone"),r(t)]),o(" - "),e("a",sP,[o("Agar.io"),r(t)]),o(" clone written with "),e("a",lP,[o("Socket.IO"),r(t)]),o(" and HTML5 canvas. "),aP,o(),iP]),e("li",null,[e("a",hP,[o("Clumsy Bird"),r(t)]),o(" - A MelonJS port of the famous Flappy Bird Game. ("),e("a",cP,[o("Demo"),r(t)]),o(") "),dP,o(),_P]),e("li",null,[e("a",uP,[o("Cubiks-2048"),r(t)]),o(" - Clone of 2048 game in 3D. ("),e("a",pP,[o("Demo"),r(t)]),o(") "),fP,o(),gP]),e("li",null,[e("a",bP,[o("Hextris"),r(t)]),o(" - Fast paced HTML5 puzzle game inspired by Tetris. ("),e("a",mP,[o("Demo"),r(t)]),o(") "),kP,o(),wP]),e("li",null,[e("a",PP,[o("Posio"),r(t)]),o(" - A geography multiplayer game. ("),e("a",yP,[o("Demo"),r(t)]),o(") "),SP,o(),vP]),e("li",null,[e("a",CP,[o("TournamentMango"),r(t)]),o(" - TournamentMango is an open source tournament bracket and user management system. You can build an archive of players and keep track of all their scores over time as well as their regular characters, games, and aliases. ("),e("a",AP,[o("Source Code"),r(t)]),o(") "),LP,o(),MP])]),GP,e("ul",null,[e("li",null,[e("a",xP,[o("GateOne"),r(t)]),o(" - Gate One is an HTML5 web-based terminal emulator and SSH client. - "),TP]),e("li",null,[e("a",IP,[o("Guacamole"),r(t)]),o(" - Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC and RDP. ("),e("a",EP,[o("Source Code"),r(t)]),o(") "),DP,o(),BP])]),HP,e("ul",null,[e("li",null,[e("a",jP,[o("Citadel"),r(t)]),o(" - Groupware including email, calendar/scheduling, address books, forums, mailing lists, IM, wiki and blog engines, RSS aggregation and more. ("),e("a",RP,[o("Source Code"),r(t)]),o(") "),OP,o(),FP]),e("li",null,[e("a",NP,[o("Cozy Cloud"),r(t)]),o(" - A personal cloud where you can read your emails or manage and sync your contact, files or calendars, with an app store full of community contributions. ("),e("a",zP,[o("Source Code"),r(t)]),o(") "),WP,o(),JP]),e("li",null,[e("a",UP,[o("egroupware"),r(t)]),o(" - Software suite including calendars, address books, notepad, project management tools, client relationship management tools (CRM), knowledge management tools, a wiki and a CMS. ("),e("a",VP,[o("Source Code"),r(t)]),o(") "),qP,o(),KP]),e("li",null,[e("a",XP,[o("Horde"),r(t)]),o(" - The Horde Project is about creating high quality Open Source applications and libraries, based on PHP and the Horde Framework. ("),e("a",YP,[o("Demo"),r(t)]),o(", "),e("a",ZP,[o("Source Code"),r(t)]),o(") "),QP]),e("li",null,[e("a",$P,[o("Kolab"),r(t)]),o(" - Kolab community is a unified communication and collaboration system. ("),e("a",ey,[o("Source Code"),r(t)]),o(") "),oy,o(),ry]),e("li",null,[e("a",ty,[o("Kopano"),r(t)]),o(" - Groupware suite including e-mail, calendars, tasks, todos and notes. Featuring a modern WebApp, DeskApp and mobile access over Z-Push/ActiveSync. ("),e("a",ny,[o("Demo"),r(t)]),o(", "),e("a",sy,[o("Source Code"),r(t)]),o(") "),ly,o(),ay]),e("li",null,[e("a",iy,[o("Mayan EDMS"),r(t)]),o(" - Free Open Source Electronic Document Management System. An electronic vault for your documents with preview generation, OCR, and automatic categorization among other features. ("),e("a",hy,[o("Demo"),r(t)]),o(", "),e("a",cy,[o("Source Code"),r(t)]),o(") "),dy,o(),_y]),e("li",null,[e("a",uy,[o("Openmeetings"),r(t)]),o(". ("),e("a",py,[o("Source Code"),r(t)]),o(") - Openmeetings provides video conferencing, instant messaging, white board, collaborative document editing and other groupware tools using API functions of the Red5 Streaming Server for Remoting and Streaming. "),fy,o(),gy]),e("li",null,[e("a",by,[o("Sogo"),r(t)]),o(" - SOGo offers multiple ways to access the calendaring and messaging data. CalDAV, CardDAV, GroupDAV, as well as ActiveSync, including native Outlook compatibility and web interface. ("),e("a",my,[o("Demo"),r(t)]),o(", "),e("a",ky,[o("Source Code"),r(t)]),o(") "),wy,o(),Py]),e("li",null,[e("a",yy,[o("Tine 2.0"),r(t)]),o(" - Contacts, Calendar, Tasks, WebDAV, ActiveSync, VOIP, Mail-Client, CRM, Sales, Projects, Timetracker. ("),e("a",Sy,[o("Demo"),r(t)]),o(", "),e("a",vy,[o("Source Code"),r(t)]),o(") "),Cy,o(),Ay]),e("li",null,[e("a",Ly,[o("Zimbra Collaboration"),r(t)]),o(" - Email, calendar, collaboration server with web interface and lots of integrations. ("),e("a",My,[o("Source Code"),r(t)]),o(") "),Gy,o(),xy])]),Ty,e("ul",null,[e("li",null,[e("a",Iy,[o("Chamilo LMS"),r(t)]),o(" - Chamilo LMS allows you to create a virtual campus for the provision of online or semi-online training. ("),e("a",Ey,[o("Source Code"),r(t)]),o(") "),Dy,o(),By]),e("li",null,[e("a",Hy,[o("edX"),r(t)]),o(" - The Open edX platform is open-source code that powers "),e("a",jy,[o("edX.org"),r(t)]),o(". ("),e("a",Ry,[o("Source Code"),r(t)]),o(") "),Oy,o(),Fy]),e("li",null,[e("a",Ny,[o("lxHive"),r(t)]),o(" - Open Source ExperienceAPI compliant Learning Record Store (LRS) - previously code-named TinCanAPI. "),e("a",zy,[o("Source Code"),r(t)]),o(),Wy,o(),Jy]),e("li",null,[e("a",Uy,[o("Mahara"),r(t)]),o(" - Open Source fully featured web application to build students electronic portfolio. "),e("a",Vy,[o("Source Code"),r(t)]),o(),qy,o(),Ky]),e("li",null,[e("a",Xy,[o("Moodle"),r(t)]),o(" - Moodle is a learning and courses platform with one of the largest open source communities worldwide. ("),e("a",Yy,[o("Demo"),r(t)]),o(", "),e("a",Zy,[o("Source Code"),r(t)]),o(") "),Qy,o(),$y]),e("li",null,[e("a",e3,[o("RELATE"),r(t)]),o(" - RELATE is a web-based courseware package, includes features such as: flexible rules, statistics, multi-course support, class calender. ("),e("a",o3,[o("Source Code"),r(t)]),o(") "),r3,o(),t3]),e("li",null,[e("a",n3,[o("Sakai"),r(t)]),o(" - The Sakai project provides a flexible and feature-rich environment for teaching, learning, research and other collaboration. ("),e("a",s3,[o("Demo"),r(t)]),o(", "),e("a",l3,[o("Source Code"),r(t)]),o(") "),a3,o(),i3]),e("li",null,[e("a",h3,[o("SchoolTool"),r(t)]),o(" - SchoolTool is free administrative software for schools. It includes demographics, gradebook, attendance, calendaring, reporting and more for primary and secondary schools. ("),e("a",c3,[o("Source Code"),r(t)]),o(") "),d3,o(),_3])]),u3,e("ul",null,[e("li",null,[e("a",p3,[o("Graphhopper"),r(t)]),o(" - Fast routing library and server using OpenStreetMap. ("),e("a",f3,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",g3,[o("MapBBCodeShare"),r(t)]),o(" - Tool for sharing custom OSM maps. Support for annotated markers, polygons, lines, multi-format import/export, multiple layers, shortlinks... ("),e("a",b3,[o("Demo"),r(t)]),o(") "),m3,o(),k3]),e("li",null,[e("a",w3,[o("OpenGTS"),r(t)]),o(" - Entry-level fleet tracking system. Supports variety of tracking devices and protocols. Comes with rich web-interface and reporting features. ("),e("a",P3,[o("Demo"),r(t)]),o(", "),e("a",y3,[o("Source Code"),r(t)]),o(") "),S3,o(),v3]),e("li",null,[e("a",C3,[o("Openstreetmap"),r(t)]),o(" - OpenStreetMap is a map of the world, created by people like you and free to use under an open license. ("),e("a",A3,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",L3,[o("Traccar"),r(t)]),o(" - Java application to track GPS positions. Supports loads of tracking devices and protocols, has an Android and iOS App. Has a web interface to view your trips. ("),e("a",M3,[o("Demo"),r(t)]),o(", "),e("a",G3,[o("Source Code"),r(t)]),o(") "),x3]),e("li",null,[e("a",T3,[o("uMap"),r(t)]),o(" - Create maps with OpenStreetMap layers in a minute and embed them in your site. ("),e("a",I3,[o("Source Code"),r(t)]),o(") "),E3,o(),D3])]),B3,e("p",null,[o("See also "),e("a",H3,[o("https://en.wikipedia.org/wiki/List_of_streaming_media_systems"),r(t)]),o(", "),e("a",j3,[o("https://en.wikipedia.org/wiki/Comparison_of_streaming_media_systems"),r(t)])]),R3,e("ul",null,[e("li",null,[e("a",O3,[o("Airtime"),r(t)]),o(" - Simple, open source platform that lets you broadcast streaming radio on the web. "),e("a",F3,[o("Source Code"),r(t)]),o(),N3,o(),z3]),e("li",null,[e("a",W3,[o("Ampache"),r(t)]),o(" - A web based audio/video streaming application. ("),e("a",J3,[o("Demo"),r(t)]),o(", "),e("a",U3,[o("Source Code"),r(t)]),o(") "),V3,o(),q3]),e("li",null,[e("a",K3,[o("CherryMusic"),r(t)]),o(" - Minimalistic Web-Mediaplayer. ("),e("a",X3,[o("Source Code"),r(t)]),o(") "),Y3,o(),Z3]),e("li",null,[e("a",Q3,[o("cloudtunes"),r(t)]),o(" - Web-based music player for the cloud. "),$3,o(),eS]),e("li",null,[e("a",oS,[o("GNU FM"),r(t)]),o(" - Running music community websites, alternative to "),e("a",rS,[o("last.fm"),r(t)]),o(". ("),e("a",tS,[o("Source Code"),r(t)]),o(") "),nS,o(),sS]),e("li",null,[e("a",lS,[o("Groove Basin"),r(t)]),o(" - A music player server with a web-based user interface inspired by Amarok 1.4 ("),e("a",aS,[o("Source Code"),r(t)]),o(") "),iS,o(),hS]),e("li",null,[e("a",cS,[o("Icecast 2"),r(t)]),o(" - streaming audio/video server which can be used to create an Internet radio station or a privately running jukebox and many things in between. ("),e("a",dS,[o("Source Code"),r(t)]),o(") "),_S,o(),uS]),e("li",null,[e("a",pS,[o("koel"),r(t)]),o(" - A personal music streaming server that works. ("),e("a",fS,[o("Source Code"),r(t)]),o(") "),gS,o(),bS]),e("li",null,[e("a",mS,[o("Libresonic"),r(t)]),o(" - Open-source web-based media streamer and jukebox. A fork of Subsonic's last open-source release, before it switched licenses. "),kS,o(),wS]),e("li",null,[e("a",PS,[o("Mopidy"),r(t)]),o(" - Extensible music server. Offers a superset of the mpd API, as well as integration with 3rd party services like Spotify, SoundCloud etc. ("),e("a",yS,[o("Source Code"),r(t)]),o(") "),SS,o(),vS]),e("li",null,[e("a",CS,[o("Moped"),r(t)]),o(" - Responisve HTML5 + Javascript client for the Mopidy music server "),AS,o(),LS]),e("li",null,[e("a",MS,[o("Mopidy MusicBox"),r(t)]),o(" - Web Client for Mopidy Music Server "),GS,o(),xS]),e("li",null,[e("a",TS,[o("Mopidy-Party"),r(t)]),o(" - Mopidy web extension designed for party! Let your guests manage the sound.) "),IS,o(),ES]),e("li",null,[e("a",DS,[o("mpd"),r(t)]),o(" - Daemon to remotely play music, stream music, handle and organize playlists. Many clients available. "),BS,o(),HS]),e("li",null,[e("a",jS,[o("ympd"),r(t)]),o(" - Standalone MPD Web GUI written in C, utilizing Websockets and Bootstrap/JS ("),e("a",RS,[o("Source Code"),r(t)]),o(") "),OS,o(),FS]),e("li",null,[e("a",NS,[o("Sonerezh"),r(t)]),o(" - A self-hosted, web-based application for stream your music, everywhere. ("),e("a",zS,[o("Demo"),r(t)]),o(", "),e("a",WS,[o("Documentation"),r(t)]),o(", "),e("a",JS,[o("Source Code"),r(t)]),o(") "),US,o(),VS])]),qS,e("ul",null,[e("li",null,[e("a",KS,[o("CyTube"),r(t)]),o(" - CyTube is a web application providing media synchronization, chat, and more for an arbitrary number of channels. ("),e("a",XS,[o("Demo"),r(t)]),o(") "),YS,o(),ZS]),e("li",null,[e("a",QS,[o("Emby"),r(t)]),o(" - A home media server built using other popular open source technologies. - "),$S]),e("li",null,[e("a",ev,[o("Flumotion"),r(t)]),o(" - A streaming media server with intuitive graphical administration tools. ("),e("a",ov,[o("Source Code"),r(t)]),o(") "),rv,o(),tv]),e("li",null,[e("a",nv,[o("HTPC Manager"),r(t)]),o(" - A fully responsive interface to manage all your favorite media on your HTPC. - "),sv]),e("li",null,[e("a",lv,[o("Icecast 2"),r(t)]),o(" - streaming audio/video server which can be used to create an Internet radio station or a privately running jukebox and many things in between. ("),e("a",av,[o("Source Code"),r(t)]),o(") "),iv,o(),hv]),e("li",null,[e("a",cv,[o("ReadyMedia"),r(t)]),o(" - A simple media server software, with the aim of being fully compliant with DLNA/UPnP-AV clients. "),dv,o(),_v]),e("li",null,[e("a",uv,[o("Restreamer"),r(t)]),o(" - Restreamer allows you to do h.264 real-time video streaming on your website without a streaming provider. ("),e("a",pv,[o("Source Code"),r(t)]),o(") "),fv,o(),gv]),e("li",null,[e("a",bv,[o("Rygel"),r(t)]),o(" - Rygel is a home media solution (UPnP AV MediaServer) that allows you to easily share audio, video and pictures to other devices. Additionally, media player software may use Rygel to become a MediaRenderer that may be controlled remotely by a UPnP or DLNA Controller. "),mv,o(),kv]),e("li",null,[e("a",wv,[o("Streama"),r(t)]),o(" - Self-hosted Netflix alternative. - "),Pv,o(),yv]),e("li",null,[e("a",Sv,[o("Zoneminder"),r(t)]),o(" - Closed-circuit television (CCTV) software application which supports IP, USB and Analog cameras. "),vv,o(),Cv])]),Av,e("ul",null,[e("li",null,[e("a",Lv,[o("EasyBook Project"),r(t)]),o(" - Book publishing as easy as it should be. ("),e("a",Mv,[o("Source Code"),r(t)]),o(") "),Gv,o(),xv]),e("li",null,[e("a",Tv,[o("GeneWeb"),r(t)]),o(" - GeneWeb is an open source genealogy software written in OCaml. It comes with a Web interface and can be used off-line or as a Web service. ("),e("a",Iv,[o("Demo"),r(t)]),o(", "),e("a",Ev,[o("Source Code"),r(t)]),o(") "),Dv,o(),Bv]),e("li",null,[e("a",Hv,[o("King Phisher"),r(t)]),o(" - King Phisher is a tool for testing and promoting user awareness by simulating real world phishing attacks. "),jv,o(),Rv]),e("li",null,[e("a",Ov,[o("Mindmaps"),r(t)]),o(" - An open source, offline capable, mind mapping application. ("),e("a",Fv,[o("Demo"),r(t)]),o(") "),Nv,o(),zv]),e("li",null,[e("a",Wv,[o("Para"),r(t)]),o(" - Para is a flexible and modular backend framework/server for object persistence, API development and authentication. ("),e("a",Jv,[o("Source Code"),r(t)]),o(") "),Uv,o(),Vv]),e("li",null,[e("a",qv,[o("Skygear"),r(t)]),o(" - A complete backend server for web, mobile and iOT applcations. ("),e("a",Kv,[o("Demo"),r(t)]),o(", "),e("a",Xv,[o("Source Code"),r(t)]),o(") "),Yv,o(),Zv]),e("li",null,[e("a",Qv,[o("webtrees"),r(t)]),o(" - webtrees is the web's leading on-line collaborative genealogy application. ("),e("a",$v,[o("Demo"),r(t)]),o(", "),e("a",e8,[o("Source Code"),r(t)]),o(") "),o8,o(),r8])]),t8,e("ul",null,[e("li",null,[e("a",n8,[o("Benedetto"),r(t)]),o(" - Bennedetto is a simple, turn-based budget management app. "),s8,o(),l8]),e("li",null,[e("a",a8,[o("Economizzer"),r(t)]),o(" - Economizzer is a simple and open source personal finance manager system, available in English, Brazilian, Portuguese and Russian. ("),e("a",i8,[o("Source Code"),r(t)]),o(") "),h8,o(),c8]),e("li",null,[e("a",d8,[o("ExMoney"),r(t)]),o(" - A [work-in-progress] self-hosted personal finance app. "),_8,o(),u8]),e("li",null,[e("a",p8,[o("Firefly III"),r(t)]),o(" - Firefly III is a financial manager. It helps you keeping track of your money and make budget forecasts. It supports credit cards, shared household accounts and savings accounts. Very modern, it's powered by Laravel and requires PHP7. "),f8,o(),g8]),e("li",null,[e("a",b8,[o("Galette"),r(t)]),o(" - Galette is a membership management web application towards non profit organizations. ("),e("a",m8,[o("Source Code"),r(t)]),o(") "),k8,o(),w8]),e("li",null,[e("a",P8,[o("GLPI"),r(t)]),o(" - GLPI is an IT assests/resources/inventory manager. ("),e("a",y8,[o("Source Code"),r(t)]),o(") "),S8,o(),v8]),e("li",null,[e("a",C8,[o("GRR"),r(t)]),o(" - Assets management and booking for small/medium companies. ("),e("a",A8,[o("demo"),r(t)]),o(", "),L8,o(") "),M8,o(),G8]),e("li",null,[e("a",x8,[o("Hospital Run"),r(t)]),o(" - Hospital Run is offline enabled hospital management software. ("),e("a",T8,[o("Source Code"),r(t)]),o(", "),e("a",I8,[o("Demo"),r(t)]),o(") "),E8,o(),D8]),e("li",null,[e("a",B8,[o("Inventaire"),r(t)]),o(" - Collaborative resources mapper project, while yet only focused on exploring books mapping with wikidata and ISBNs. ("),e("a",H8,[o("Source Code"),r(t)]),o(") "),j8,o(),R8]),e("li",null,[e("a",O8,[o("Invoice Ninja"),r(t)]),o(" - A powerful tool to invoice clients online. ("),e("a",F8,[o("Demo"),r(t)]),o(", "),e("a",N8,[o("Source Code"),r(t)]),o(") "),z8,o(),W8]),e("li",null,[e("a",J8,[o("InvoicePlane"),r(t)]),o(" - Manage quotes, invoices, payments and customers for your small business. ("),e("a",U8,[o("Demo"),r(t)]),o(", "),e("a",V8,[o("Source Code"),r(t)]),o(") "),q8]),e("li",null,[e("a",K8,[o("IHateMoney"),r(t)]),o(" - Manage your shared expenses, easily. ("),e("a",X8,[o("Source Code"),r(t)]),o(") "),Y8,o(),Z8]),e("li",null,[e("a",Q8,[o("Tryton"),r(t)]),o(" - Core base of a complete business solution (ERP). ("),e("a",$8,[o("Demo"),r(t)]),o(" admin/admin, "),e("a",e9,[o("Source Code"),r(t)]),o(") "),o9,o(),r9]),e("li",null,[e("a",t9,[o("Koha"),r(t)]),o(" - Fully featured, scalable library management system (integrated library system - ILS). ("),e("a",n9,[o("Source Code"),r(t)]),o(") "),s9,o(),l9]),e("li",null,[e("a",a9,[o("PartKeepr"),r(t)]),o(" - PartKeepr is an electronic part inventory management software. It helps you to keep track of your available parts and assist you with re-ordering parts. ("),e("a",i9,[o("Demo"),r(t)]),o(", "),e("a",h9,[o("Source Code"),r(t)]),o(") "),c9,o(),d9]),e("li",null,[e("a",_9,[o("StockazNG"),r(t)]),o(" - Asset Management System. "),u9,o(),p9])]),f9,e("p",null,[o("See "),e("a",g9,[o("https://github.com/n1trux/awesome-sysadmin#monitoring"),r(t)]),o(" and "),e("a",b9,[o("https://github.com/n1trux/awesome-sysadmin#metric--metric-collection"),r(t)])]),m9,e("ul",null,[e("li",null,[e("a",k9,[o("dillinger"),r(t)]),o(" - The last Markdown editor, ever. ("),e("a",w9,[o("Source Code"),r(t)]),o(") "),P9,o(),y9]),e("li",null,[e("a",S9,[o("Jotter"),r(t)]),o(" - Jotter is a lightweight, no database, powerful web notebook that lets you create and manage notes online safely, quickly & easily. ("),e("a",v9,[o("Demo"),r(t)]),o(") "),C9,o(),A9]),e("li",null,[e("a",L9,[o("Laverna"),r(t)]),o(" - Laverna is a Javascript note taking application with Markdown editor and encryption support. Consider it like open source alternative to Evernote. ("),e("a",M9,[o("Demo"),r(t)]),o(", "),e("a",G9,[o("Source Code"),r(t)]),o(") "),x9,o(),T9]),e("li",null,[e("a",I9,[o("Leanote"),r(t)]),o(" - Leanote, Not Just A Notepad! Open source cloud notepad. ("),e("a",E9,[o("Demo"),r(t)]),o(", "),e("a",D9,[o("Source Code"),r(t)]),o(") "),B9,o(),H9]),e("li",null,[e("a",j9,[o("Markdown Edit"),r(t)]),o(" - Online markdown editor/viewer. ("),e("a",R9,[o("Source code"),r(t)]),o(") "),O9,o(),F9]),e("li",null,[e("a",N9,[o("minimalist-web-notepad"),r(t)]),o(" - A minimalist "),e("a",z9,[o("http://notepad.cc"),r(t)]),o(" clone. "),W9,o(),J9]),e("li",null,[e("a",U9,[o("notes"),r(t)]),o(" - Simple script for personal notes with a single page with a WYSIWYG Editor. "),V9,o(),q9]),e("li",null,[e("a",K9,[o("OpenNote"),r(t)]),o(" - OpenNote was built to be an open web-based alternative to Microsoft OneNote (T) and EverNote. ("),e("a",X9,[o("Demo"),r(t)]),o(") "),Y9,o(),Z9]),e("li",null,[e("a",Q9,[o("Paperwork"),r(t)]),o(" - OpenSource note-taking & archiving alternative to Evernote, Microsoft OneNote & Google Keep. ("),e("a",$9,[o("Source Code"),r(t)]),o(") "),eC,o(),oC]),e("li",null,[e("a",rC,[o("ShareLaTex"),r(t)]),o(" - A web-based collaborative LaTeX editor. ("),e("a",tC,[o("Source Code"),r(t)]),o(") "),nC,o(),sC]),e("li",null,[e("a",lC,[o("Turtl"),r(t)]),o(" - A totally private personal database and note taking app. ("),e("a",aC,[o("Source Code"),r(t)]),o(") "),iC,o(),hC])]),cC,e("ul",null,[e("li",null,[e("a",dC,[o("EtherCalc"),r(t)]),o(" - Web spreadsheet. ("),e("a",_C,[o("Source code"),r(t)]),o(),uC,o(),pC]),e("li",null,[e("a",fC,[o("Etherpad"),r(t)]),o(" - Etherpad is a highly customizable Open Source online editor providing collaborative editing in really real-time. - "),gC]),e("li",null,[e("a",bC,[o("Infinoted"),r(t)]),o(" - A server for "),e("a",mC,[o("Gobby"),r(t)]),o(", a multi-platform collaborative text editor. ("),e("a",kC,[o("Source Code"),r(t)]),o(") "),wC,o(),PC]),e("li",null,[e("a",yC,[o("ONLYOFFICE"),r(t)]),o(" - An office suite that enables you to manage documents, projects, team and customer relations in one place. ("),e("a",SC,[o("Source Code"),r(t)]),o(") "),vC,o(),CC]),e("li",null,[e("a",AC,[o("PHPOffice"),r(t)]),o(" - PHPOffice contains libraries which permits to write and read files from most office suites. "),LC,o(),MC]),e("li",null,[e("a",GC,[o("WebODF"),r(t)]),o(" - Tools and libraries to view and edit Open Document Format (ODF) files. ("),e("a",xC,[o("Source Code"),r(t)]),o(") "),TC,o(),IC]),e("li",null,[e("a",EC,[o("ownCloud documents"),r(t)]),o(" - Collaborative editing and sharing of rich-text documents. ("),e("a",DC,[o("Source Code"),r(t)]),o(") "),BC,o(),HC])]),jC,e("ul",null,[e("li",null,[e("a",RC,[o("keeweb"),r(t)]),o(" - This webapp is a browser and desktop password manager compatible with KeePass databases. ("),e("a",OC,[o("Source Code"),r(t)]),o(") "),FC,o(),NC]),e("li",null,[e("a",zC,[o("PHP Password Manager"),r(t)]),o(" - A web based, encrypting password manager, based on the Yii framework. ("),e("a",WC,[o("Source Code"),r(t)]),o(") "),JC,o(),UC]),e("li",null,[e("a",VC,[o("RatticDB"),r(t)]),o(" - Password Management for Humans. ("),e("a",qC,[o("Source Code"),r(t)]),o(", "),e("a",KC,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",XC,[o("sysPass"),r(t)]),o(" - Multiuser password management system. ("),e("a",YC,[o("Source Code"),r(t)]),o(", "),e("a",ZC,[o("Demo"),r(t)]),o(") "),QC,o(),$C]),e("li",null,[e("a",e5,[o("Teampass"),r(t)]),o(" - Password manager dedicated for managing passwords in a collaborative way on any server Apache, MySQL and PHP. ("),e("a",o5,[o("Source Code"),r(t)]),o(") "),r5,o(),t5])]),n5,e("ul",null,[e("li",null,[e("a",s5,[o("0bin"),r(t)]),o(" - Client side encrypted pastebin. "),l5,o(),a5]),e("li",null,[e("a",i5,[o("cryptonote"),r(t)]),o(" - A simple open source web application that lets users encrypt and share messages that can only be read once. ("),e("a",h5,[o("Source Code"),r(t)]),o(") "),c5,o(),d5]),e("li",null,[e("a",_5,[o("gist"),r(t)]),o(" - GIST is an open-source application to share code. "),u5,o(),p5]),e("li",null,[e("a",f5,[o("hastebin"),r(t)]),o(" - Open source pastebin written in node.js. ("),e("a",g5,[o("Demo"),r(t)]),o(", "),e("a",b5,[o("Source Code"),r(t)]),o(") "),m5,o(),k5]),e("li",null,[e("a",w5,[o("localpaste"),r(t)]),o(" - Simple python based pastebin you can run locally, with curl for input. Supports RAW text by default and binary data such as images (no extensions on returned url). "),P5,o(),y5]),e("li",null,[e("a",S5,[o("NoteHub"),r(t)]),o(" - Free and Hassle-free Pastebin for Markdown Pages. Simple, clean, password provided, generated-short link. ("),e("a",v5,[o("Demo"),r(t)]),o(", "),e("a",C5,[o("Source Code"),r(t)]),o(") "),A5,o(),L5]),e("li",null,[e("a",M5,[o("Pastebin"),r(t)]),o(" - Modern self-hosted pastebin service with a restful API. ("),e("a",G5,[o("Demo"),r(t)]),o(", "),e("a",x5,[o("Source Code"),r(t)]),o(") "),T5,o(),I5]),e("li",null,[e("a",E5,[o("Pastedown"),r(t)]),o(" - Self-hosted pastebin server. It is meant to handle Markdown well, but it also works with code snippets (and does syntax highlighting). ("),e("a",D5,[o("Source Code"),r(t)]),o(") "),B5,o(),H5]),e("li",null,[e("a",j5,[o("pb"),r(t)]),o(" - Lightweight pastebin (and url shortener) built using flask. ("),e("a",R5,[o("Demo"),r(t)]),o(") "),O5,o(),F5]),e("li",null,[e("a",N5,[o("pbnh"),r(t)]),o(" - Pastebin inspired from project pb and hastebin, with an API and a SQL-based backend. "),z5,o(),W5]),e("li",null,[e("a",J5,[o("Phaste"),r(t)]),o(" - A Phalcon-based, MySQL pastebin application with privacy-respecting Piwik integration and syntax highlighting. ("),e("a",U5,[o("Source Code"),r(t)]),o(") "),V5,o(),q5]),e("li",null,[e("a",K5,[o("snipt"),r(t)]),o(" - Long-term memory for coders. Share and store code snippets ("),e("a",X5,[o("Source Code"),r(t)]),o(") "),Y5,o(),Z5]),e("li",null,[e("a",Q5,[o("Sticky Notes"),r(t)]),o(" - A powerful open-source pastebin application for effortless code sharing. ("),e("a",$5,[o("Source Code"),r(t)]),o(") "),e4]),e("li",null,[e("a",o4,[o("Stikked"),r(t)]),o(" - An advanced and beautiful pastebin. "),r4,o(),t4]),e("li",null,[e("a",n4,[o("tastebin"),r(t)]),o(" - Updated version of hastebin plus additional features. "),s4,o(),l4]),e("li",null,[e("a",a4,[o("ZeroBin"),r(t)]),o(" - ZeroBin is a minimalist, opensource online pastebin/discussion board where the server has zero knowledge of hosted data. ("),e("a",i4,[o("Demo"),r(t)]),o(", "),e("a",h4,[o("Source Code"),r(t)]),o(") "),c4,o(),d4])]),_4,e("ul",null,[e("li",null,[e("a",u4,[o("Dashing"),r(t)]),o(" - Sinatra based, open sourced dashboard builder from Shopify. ("),e("a",p4,[o("Demo"),r(t)]),o(", "),e("a",f4,[o("Source Code"),r(t)]),o(") "),g4,o(),b4]),e("li",null,[e("a",m4,[o("Dj Diabetes"),r(t)]),o(" - My Glucose Manager - follow your daily health "),k4,o(),w4]),e("li",null,[e("a",P4,[o("Freeboard"),r(t)]),o(" - An open source real-time dashboard builder for IOT and other web mashups. ("),e("a",y4,[o("Source Code"),r(t)]),o(") "),S4,o(),v4]),e("li",null,[e("a",C4,[o("Grafana"),r(t)]),o(" - An open source dashboard for data visualization. ("),e("a",A4,[o("Source Code"),r(t)]),o(") "),L4,o(),M4]),e("li",null,[e("a",G4,[o("Habitica"),r(t)]),o(" - A habit tracker app which treats your goals like a Role Playing Game. Previously called HabitRPG. ("),e("a",x4,[o("Source Code"),r(t)]),o(") "),T4,o(),I4]),e("li",null,[e("a",E4,[o("Phant"),r(t)]),o(" - Phant is a modular data logging tool for collecting data from the Internet of Things. ("),e("a",D4,[o("Demo"),r(t)]),o(", "),e("a",B4,[o("Source Code"),r(t)]),o(") "),H4,o(),j4]),e("li",null,[e("a",R4,[o("Reportr"),r(t)]),o(" - Your life's personal dashboard. ("),e("a",O4,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",F4,[o("Thingspeak"),r(t)]),o(" - An open source “Internet of Things” application and API to store and retrieve data from things using HTTP. ("),e("a",N4,[o("Demo"),r(t)]),o(", "),e("a",z4,[o("Source Code"),r(t)]),o(") "),W4,o(),J4]),e("li",null,[e("a",U4,[o("Tipboard"),r(t)]),o(" - In-house, tasty, local dashboarding system. ("),e("a",V4,[o("Source Code"),r(t)]),o(") "),q4,o(),K4]),e("li",null,[e("a",X4,[o("wger"),r(t)]),o(" - A web-based personal workout, fitness and weight logger/tracker. It can also be used as a simple gym management utility and offers a full REST API as well. ("),e("a",Y4,[o("Demo"),r(t)]),o(") "),Z4,o(),Q4])]),$4,e("ul",null,[e("li",null,[e("a",e0,[o("Chevereto 2.X"),r(t)]),o(" - Open source one-click image hosting script. ("),e("a",o0,[o("Source Code"),r(t)]),o(") "),r0,o(),t0]),e("li",null,[e("a",n0,[o("CumulusClips"),r(t)]),o(" - Your own video sharing website with CumulusClips video sharing script. You can build a YouTube clone where users can upload, rate, comment on videos, and much more. ("),e("a",s0,[o("Demo"),r(t)]),o(") "),l0,o(),a0]),e("li",null,[e("a",i0,[o("Koken"),r(t)]),o(" - Content management and web site publishing for photographers. "),h0]),e("li",null,[e("a",c0,[o("Lychee"),r(t)]),o(" - An open source grid and album based photo-management-system. ("),e("a",d0,[o("Source Code"),r(t)]),o(") "),_0,o(),u0]),e("li",null,[e("a",p0,[o("MediaDrop"),r(t)]),o(" - A video, audio and podcast publication platform. ("),e("a",f0,[o("Source Code"),r(t)]),o(") "),g0,o(),b0]),e("li",null,[e("a",m0,[o("Mediagoblin"),r(t)]),o(" - A Free software media publishing platform that anyone can run. You can think of it as a decentralized alternative to Flickr, YouTube, SoundCloud, etc. "),k0,o(),w0]),e("li",null,[e("a",P0,[o("MinigalNano"),r(t)]),o(" - MinigalNano is a very simple image gallery. It adheres to the KISS principle and is very easy to install. MinigalNano does not have a web admin interface: You just upload your images in the photo folder on your server (using FTP, SFTP) ("),e("a",y0,[o("Demo"),r(t)]),o(") "),S0,o(),v0]),e("li",null,[e("a",C0,[o("phog"),r(t)]),o(" - Static photo gallery generator with S3 uploader. "),A0]),e("li",null,[e("a",L0,[o("Photofloat"),r(t)]),o(" - A Web 2.0 Photo Gallery Done Right via Static JSON & Dynamic Javascript. ("),e("a",M0,[o("Demo"),r(t)]),o(") "),G0,o(),x0]),e("li",null,[e("a",T0,[o("PhotoLight"),r(t)]),o(" - The easiest photo gallery there is. "),I0,o(),E0]),e("li",null,[e("a",D0,[o("Photoshow"),r(t)]),o(" - Responsive Web Gallery. ("),e("a",B0,[o("Source Code"),r(t)]),o(") "),H0,o(),j0]),e("li",null,[e("a",R0,[o("Piwigo"),r(t)]),o(" - Photo gallery software for the web, built by an active community of users and developers. - "),O0,o(),F0]),e("li",null,[e("a",N0,[o("Plumi"),r(t)]),o(" - Create your own sophisticated video-sharing site. ("),e("a",z0,[o("Source Code"),r(t)]),o(") "),W0,o(),J0]),e("li",null,[e("a",U0,[o("Pygmyfoto"),r(t)]),o(" - A crude solution for publishing a photo roll on the web. "),V0]),e("li",null,[e("a",q0,[o("Shot.io"),r(t)]),o(" - Mobile optimised photo publishing platform (self-hosted Flickr alternative) ("),e("a",K0,[o("Source Code"),r(t)]),o(") "),X0,o(),Y0]),e("li",null,[e("a",Z0,[o("sigal"),r(t)]),o(" - Yet another simple static gallery generator. "),Q0,o(),$0]),e("li",null,[e("a",e6,[o("UberGallery"),r(t)]),o(" - UberGallery is an easy to use, simple to manage, web photo gallery. UberGallery does not require a database and supports JPEG, GIF and PNG file types. Simply upload your images and UberGallery will automatically generate thumbnails and output HTML. ("),e("a",o6,[o("Source Code"),r(t)]),o(") "),r6,o(),t6]),e("li",null,[e("a",n6,[o("Videobin"),r(t)]),o(" - A simple video upload and sharing service with transcoding. ("),e("a",s6,[o("Demo"),r(t)]),o(", "),e("a",l6,[o("Source Code"),r(t)]),o(") "),a6,o(),i6]),e("li",null,[e("a",h6,[o("Zenphoto"),r(t)]),o(" - Open-source gallery and CMS project. ("),e("a",c6,[o("Source Code"),r(t)]),o(") "),d6,o(),_6])]),u6,e("ul",null,[e("li",null,[e("a",p6,[o("dudle"),r(t)]),o(" - An online scheduling application. ("),e("a",f6,[o("Demo"),r(t)]),o(") "),g6,o(),b6]),e("li",null,[e("a",m6,[o("Framadate"),r(t)]),o(" - An online service for planning an appointment or make a decision quickly and easily: Make a poll, Define dates or subjects to choose, Send the poll link to your friends or colleagues, Discuss and make a decision. ("),e("a",k6,[o("Demo"),r(t)]),o(", "),e("a",w6,[o("Source Code"),r(t)]),o(") "),P6,o(),y6]),e("li",null,[e("a",S6,[o("Kyélà"),r(t)]),o(" - Participation polls for group events. ("),e("a",v6,[o("Demo"),r(t)]),o(", "),e("a",C6,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",A6,[o("LimeSurvey"),r(t)]),o(" - Feature-rich Open Source web based polling software. Supports extensive survey logic. ("),e("a",L6,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",M6,[o("MaterialPoll"),r(t)]),o(" - An opensource "),e("a",G6,[o("strawpoll.me"),r(t)]),o(" clone for creating random polls. ("),e("a",x6,[o("Demo"),r(t)]),o(", "),e("a",T6,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",I6,[o("Nuages"),r(t)]),o(" - Collaborative meeting poll system, similar to doodle or rdvz. ("),e("a",E6,[o("Source Code"),r(t)]),o(") "),D6,o(),B6]),e("li",null,[e("a",H6,[o("TellForm"),r(t)]),o(" - A beautiful online form and survey creator. ("),e("a",j6,[o("Demo"),r(t)]),o(", "),e("a",R6,[o("Source Code"),r(t)]),o(") "),O6,o(),F6])]),N6,e("ul",null,[e("li",null,[e("a",z6,[o("microproxy"),r(t)]),o(" - lightweight non-caching HTTP/HTTPS proxy server. ("),e("a",W6,[o("Source Code"),r(t)]),o(") "),J6,o(),U6]),e("li",null,[e("a",V6,[o("miniProxy"),r(t)]),o(" - Simple web proxy written in PHP that can allow you to bypass Internet content filters, or to browse the internet anonymously. Only one php file. ("),e("a",q6,[o("Source Code"),r(t)]),o(") "),K6,o(),X6]),e("li",null,[e("a",Y6,[o("Oranjeproxy"),r(t)]),o(" - Anonymizing web proxy. ("),e("a",Z6,[o("Source Code"),r(t)]),o(") "),Q6,o(),$6]),e("li",null,[e("a",e7,[o("Pound"),r(t)]),o(" - Light-weight reverse proxy and load balancer for HTTP/HTTPS. ("),e("a",o7,[o("Source Code"),r(t)]),o(") "),r7,o(),t7]),e("li",null,[e("a",n7,[o("Privoxy"),r(t)]),o(" - A non-caching web proxy with advanced filtering capabilities for enhancing privacy, modifying web page data and HTTP headers, controlling access, and removing ads and other obnoxious Internet junk. "),s7,o(),l7]),e("li",null,[e("a",a7,[o("scotty"),r(t)]),o(" - Scotty is a free opensource proxy software for bypassing filter and censorship systems. ("),e("a",i7,[o("Source Code"),r(t)]),o(") "),h7,o(),c7]),e("li",null,[e("a",d7,[o("Squid"),r(t)]),o(" - Caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidth and improves response times by caching and reusing frequently-requested web pages. ("),e("a",_7,[o("Source Code"),r(t)]),o(") "),u7,o(),p7]),e("li",null,[e("a",f7,[o("Swiperproxy"),r(t)]),o(" - A lightning-fast, open source web proxy that is easy for you to run and customize. ("),e("a",g7,[o("Demo"),r(t)]),o(", "),e("a",b7,[o("Source Code"),r(t)]),o(") "),m7]),e("li",null,[e("a",k7,[o("Tinyproxy"),r(t)]),o(" - Light-weight HTTP/HTTPS proxy daemon. ("),e("a",w7,[o("Source Code"),r(t)]),o(") "),P7,o(),y7]),e("li",null,[e("a",S7,[o("Traefik"),r(t)]),o(" - Træfɪk is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease. It supports several backends (Docker, Swarm, Mesos/Marathon, …) to manage its configuration automatically and dynamically. ("),e("a",v7,[o("Source Code"),r(t)]),o(") "),C7,o(),A7])]),L7,e("ul",null,[e("li",null,[e("a",M7,[o("Nunux Keeper"),r(t)]),o(" - Your personal content curation service. ("),e("a",G7,[o("Source Code"),r(t)]),o(") "),x7,o(),T7]),e("li",null,[e("a",I7,[o("Readityourself"),r(t)]),o(" - Read the web without ads, comments, or tweets. ("),e("a",E7,[o("Demo"),r(t)]),o(") "),D7,o(),B7]),e("li",null,[e("a",H7,[o("Wallabag"),r(t)]),o(" - Wallabag, formerly Poche, is a web application allowing you to save articles to read them later with improved readability. ("),e("a",j7,[o("Demo"),r(t)]),o(", "),e("a",R7,[o("Public instance"),r(t)]),o(", "),e("a",O7,[o("Source Code"),r(t)]),o(),F7,o(),N7])]),z7,e("ul",null,[e("li",null,[e("a",W7,[o("Gigablast"),r(t)]),o(" - open source search engine. ("),e("a",J7,[o("Demo"),r(t)]),o(", "),e("a",U7,[o("Source Code"),r(t)]),o(") "),V7,o(),q7]),e("li",null,[e("a",K7,[o("Searx"),r(t)]),o(" - A privacy-respecting, hackable metasearch engine. ("),e("a",X7,[o("Demo"),r(t)]),o(", "),e("a",Y7,[o("Public instances"),r(t)]),o(")")]),e("li",null,[e("a",Z7,[o("Seeks"),r(t)]),o(" - A websearch proxy and collaborative distributed tool for websearch. "),Q7,o(),$7]),e("li",null,[e("a",eA,[o("Yacy"),r(t)]),o(" - Peer based, decentralized search engine server. "),oA,o(),rA])]),tA,e("ul",null,[e("li",null,[e("a",nA,[o("Apache Bloodhound"),r(t)]),o(" - Manage software products, Keep track of features, tasks and bugs. "),sA,o(),lA]),e("li",null,[e("a",aA,[o("CaseBox"),r(t)]),o(" - Manage all your organisation's information in one system.")]),e("li",null,[e("a",iA,[o("Fossil"),r(t)]),o(" - Distributed version control system featuring wiki and bug tracker - "),hA,o(),cA]),e("li",null,[e("a",dA,[o("gitbucket"),r(t)]),o(" - The easily installable GitHub clone powered by Scala ("),e("a",_A,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",uA,[o("GitLab"),r(t)]),o(" - Self Hosted Git Management Application - GitLab is open source software to collaborate on code. Manage git repositories with fine grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki. ("),e("a",pA,[o("Public instance"),r(t)]),o(")")]),e("li",null,[e("a",fA,[o("Gitlist"),r(t)]),o(" - A web-based git repository browser - GitList allows you to browse repositories using your favorite browser, viewing files under different revisions, commit history and diffs. ("),e("a",gA,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",bA,[o("Gitprep"),r(t)]),o(" - Portable Github clone. ("),e("a",mA,[o("Source Code"),r(t)]),o(", "),e("a",kA,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",wA,[o("Gogs"),r(t)]),o(" - A painless self-hosted Git Service written in Go. ("),e("a",PA,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",yA,[o("Kallithea"),r(t)]),o(" - Source code management system that supports two leading version control systems, Mercurial and Git, with a web interface. ("),e("a",SA,[o("Source Code"),r(t)]),o(") "),vA,o(),CA]),e("li",null,[e("a",AA,[o("Klaus"),r(t)]),o(" - A simple, easy-to-set-up Git web viewer that Just Works. ("),e("a",LA,[o("Demo"),r(t)]),o(") "),MA,o(),GA]),e("li",null,[e("a",xA,[o("Lavagna"),r(t)]),o(" - Lavagna is an open-source issue/project management tool designed for small teams. Lightweight, pure Java, easy to install, easy to use. ("),e("a",TA,[o("Source Code"),r(t)]),o(") "),IA,o(),EA]),e("li",null,[e("a",DA,[o("OpenProject"),r(t)]),o(" - Project collaboration.")]),e("li",null,[e("a",BA,[o("Phabricator"),r(t)]),o(" - Collection of web applications that help build better software. ("),e("a",HA,[o("Demo"),r(t)]),o(", "),e("a",jA,[o("Source Code"),r(t)]),o(") "),RA,o(),OA]),e("li",null,[e("a",FA,[o("Redmine"),r(t)]),o(" - Redmine is a flexible project management web application. "),NA,o(),zA]),e("li",null,[e("a",WA,[o("Taiga"),r(t)]),o(" - Agile Project Management Tool based on the Kanban and Scrum methods. ("),e("a",JA,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",UA,[o("The Bug Genie"),r(t)]),o(" - Written in PHP.")]),e("li",null,[e("a",VA,[o("Trac"),r(t)]),o(" - Written in python.")]),e("li",null,[e("a",qA,[o("Phproject"),r(t)]),o(" - A high performance full-featured project management system. ("),e("a",KA,[o("Demo"),r(t)]),o(", "),e("a",XA,[o("Source Code"),r(t)]),o(") "),YA])]),ZA,e("ul",null,[e("li",null,[e("a",QA,[o("Codiad"),r(t)]),o(" - A web-based IDE framework with a small footprint and minimal requirements. ("),e("a",$A,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",eL,[o("Eclipse Che"),r(t)]),o(" - Open source workspace server and cloud IDE. ("),e("a",oL,[o("Source Code"),r(t)]),o(") "),rL,o(),tL]),e("li",null,[e("a",nL,[o("ICEcoder"),r(t)]),o(" - ICEcoder is a web IDE / browser based code editor, which allows you to develop websites directly within the web browser. ("),e("a",sL,[o("Demo"),r(t)]),o(", "),e("a",lL,[o("Source Code"),r(t)]),o(") "),aL,o(),iL]),e("li",null,[e("a",hL,[o("JS Bin"),r(t)]),o(" - Open source collaborative web development debugging tool. ("),e("a",cL,[o("Source Code"),r(t)]),o(") "),dL,o(),_L]),e("li",null,[e("a",uL,[o("Koding"),r(t)]),o(" - The simplest way to manage your entire Dev Infrastructure. ("),e("a",pL,[o("Source Code"),r(t)]),o(") "),fL,o(),gL]),e("li",null,[e("a",bL,[o("Microglark"),r(t)]),o(" - A hacky minimalistic remote pair programming editor. ("),e("a",mL,[o("Demo"),r(t)]),o(", "),e("a",kL,[o("Source Code"),r(t)]),o(") "),wL,o(),PL]),e("li",null,[e("a",yL,[o("Regexr"),r(t)]),o(" - RegExr is a HTML/JS based tool for creating, testing, and learning about Regular Expressions. ("),e("a",SL,[o("Source Code"),r(t)]),o(") "),vL,o(),CL]),e("li",null,[e("a",AL,[o("RStudio Server"),r(t)]),o(" - Web browser based IDE for R. ("),e("a",LL,[o("Source Code"),r(t)]),o(") "),ML,o(),GL]),e("li",null,[e("a",xL,[o("Wide"),r(t)]),o(" - A Web-based IDE for Teams using Go programming language/Golang. ("),e("a",TL,[o("Demo"),r(t)]),o(") "),IL,o(),EL])]),DL,e("ul",null,[e("li",null,[e("a",BL,[o("Concourse"),r(t)]),o(" - Concourse is a CI tool that treats pipelines as first class objects and containerizes every step along the way. ("),e("a",HL,[o("Demo"),r(t)]),o(", "),e("a",jL,[o("Source Code"),r(t)]),o(") "),RL,o(),OL]),e("li",null,[e("a",FL,[o("drone"),r(t)]),o(" - Drone is a Continuous Delivery platform built on Docker, written in Go. ("),e("a",NL,[o("Source Code"),r(t)]),o(") "),zL,o(),WL]),e("li",null,[e("a",JL,[o("Factor.io"),r(t)]),o(" - It's like IFTTT (if-this-then-that) for Dev and DevOps. ("),e("a",UL,[o("Source Code"),r(t)]),o(") "),VL,o(),qL]),e("li",null,[e("a",KL,[o("Jenkins"),r(t)]),o(" - Continuous Integration Server. ("),e("a",XL,[o("Source Code"),r(t)]),o(") "),YL,o(),ZL]),e("li",null,[e("a",QL,[o("PHPCI"),r(t)]),o(" - Free and open source continuous integration specifically designed for PHP. ("),e("a",$L,[o("Source Code"),r(t)]),o(") "),eM,o(),oM]),e("li",null,[e("a",rM,[o("Strider"),r(t)]),o(" - Open Source Continuous Deployment / Continuous Integration platform. ("),e("a",tM,[o("Source Code"),r(t)]),o(") "),nM,o(),sM])]),lM,aM,e("ul",null,[e("li",null,[e("a",iM,[o("Docstore"),r(t)]),o(" - A basic site for hosting static documents - docstore is a simple way to serve Markdown files without any server-side processing, and without requiring you (as the author) to recompile every time you change an article. It consists of a very simple JS script that makes an ajax request to your server, runs a Markdown processor on what it finds, and then displays the results. Clone the repository and add articles in the text/ directory to get started. ("),e("a",hM,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",cM,[o("Flatdoc"),r(t)]),o(" - A small Javascript file that fetches Markdown files and renders them as full pages. "),dM,o(),_M]),e("li",null,[e("a",uM,[o("markdown-tree"),r(t)]),o(" - Serve a hierarchy / tree directory of markdown files. Use intended for small sites built in markdown")]),e("li",null,[e("a",pM,[o("Read the Docs"),r(t)]),o(" - Host documentation, making it fully searchable and easy to find; import your docs using any major version control system, including Mercurial, Git, Subversion, and Bazaar. ("),e("a",fM,[o("Demo"),r(t)]),o(", "),e("a",gM,[o("Source Code"),r(t)]),o(") "),bM,o(),mM])]),kM,e("p",null,[o("See "),e("a",wM,[o("https://staticsitegenerators.net"),r(t)]),o(" and "),e("a",PM,[o("https://www.staticgen.com"),r(t)])]),yM,SM,e("ul",null,[e("li",null,[e("a",vM,[o("bulldog"),r(t)]),o(" - HTML5 task manager, built on todo.txt. "),CM,o(),AM]),e("li",null,[e("a",LM,[o("Crepido"),r(t)]),o(" - Create (kanban) boards to track users and projects from flat markdown files. "),MM,o(),GM]),e("li",null,[e("a",xM,[o("Kanboard"),r(t)]),o(" - A simple and open source visual task board. "),TM]),e("li",null,[e("a",IM,[o("myTinyTodo"),r(t)]),o(" - Simple way to manage your todo list in AJAX style. Uses PHP, jQuery, SQLite/MySQL. GTD compliant. "),EM]),e("li",null,[e("a",DM,[o("omgnata"),r(t)]),o(" - Mobile friendly zero-feature TODO list web app. Unix philosophy. ("),e("a",BM,[o("Demo"),r(t)]),o(") "),HM,o(),jM]),e("li",null,[e("a",RM,[o("Restyaboard"),r(t)]),o(" - Open source Trello-like kanban board. ("),e("a",OM,[o("Demo"),r(t)]),o(", "),e("a",FM,[o("Source Code"),r(t)]),o(") "),NM,o(),zM]),e("li",null,[e("a",WM,[o("TaskBoard"),r(t)]),o(" - A Kanban-inspired app for keeping track of things that need to get done. ("),e("a",JM,[o("Source Code"),r(t)]),o(") "),UM]),e("li",null,[e("a",VM,[o("Taskfreak"),r(t)]),o(" - A simple but efficient web based task manager written in PHP. ("),e("a",qM,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",KM,[o("Tasks"),r(t)]),o(" - Kanban based to-do list manager written in Go. "),XM,o(),YM]),e("li",null,[e("a",ZM,[o("tasks.php"),r(t)]),o(" - A simple task/todo list manager. "),QM]),e("li",null,[e("a",$M,[o("Taskwarrior"),r(t)]),o(" - Taskwarrior is Free and Open Source Software that manages your TODO list from your command line. It is flexible, fast, efficient, and unobtrusive. It does its job then gets out of your way. ("),e("a",eG,[o("Source Code"),r(t)]),o(") "),oG,o(),rG]),e("li",null,[e("a",tG,[o("Tinyissue"),r(t)]),o(" - Simple Issue Tracking for Teams. "),nG,o(),sG]),e("li",null,[e("a",lG,[o("Tracks"),r(t)]),o(" - A web-based application to help you implement David Allen’s "),e("a",aG,[o("Getting Things Done™"),r(t)]),o(" methodology. ("),e("a",iG,[o("Source Code"),r(t)]),o(") "),hG,o(),cG]),e("li",null,[e("a",dG,[o("Wekan"),r(t)]),o(" - An open-source Trello-like kanban. ("),e("a",_G,[o("Demo"),r(t)]),o(", "),e("a",uG,[o("Source Code"),r(t)]),o(") "),pG,o(),fG])]),gG,bG,e("ul",null,[e("li",null,[e("a",mG,[o("Bugzilla"),r(t)]),o(" - General-purpose bugtracker and testing tool originally developed and used by the Mozilla project. "),kG,o(),wG]),e("li",null,[e("a",PG,[o("Bumpy Booby"),r(t)]),o(" - A simple, responsive and highly customizable PHP bug tracking system. ("),e("a",yG,[o("Source Code"),r(t)]),o(") "),SG,o(),vG]),e("li",null,[e("a",CG,[o("Cerb"),r(t)]),o(" - Group-based e-mail management project.")]),e("li",null,[e("a",AG,[o("Deskulu"),r(t)]),o(" - Opensource helpdesk and ticketing system based on Drupal 7. ("),e("a",LG,[o("Demo"),r(t)]),o(") "),MG,o(),GG]),e("li",null,[e("a",xG,[o("DiamanteDesk"),r(t)]),o(" - DiamanteDesk is FREE Open Source easy-to-use help-desk solution. ("),e("a",TG,[o("Demo"),r(t)]),o(", "),e("a",IG,[o("Source Code"),r(t)]),o(") "),EG,o(),DG]),e("li",null,[e("a",BG,[o("Flyspray"),r(t)]),o(" - Uncomplicated, web-based bug tracking system. ("),e("a",HG,[o("Source Code"),r(t)]),o(") "),jG]),e("li",null,[e("a",RG,[o("Gaskit"),r(t)]),o(" - A git-backed issue tracker. It uses a branch in your local git database to store the tickets. "),OG]),e("li",null,[e("a",FG,[o("HuBoard"),r(t)]),o(),NG,o(" – Instant project management for your GitHub issues (Connects directly GitHub API) "),zG,o(),WG]),e("li",null,[e("a",JG,[o("MantisBT"),r(t)]),o(" - Self hosted bug tracker, fits best for software development. ("),e("a",UG,[o("Demo"),r(t)]),o("), ("),e("a",VG,[o("Source Code"),r(t)]),o(") "),qG]),e("li",null,[e("a",KG,[o("osTicket"),r(t)]),o(" - Simple support ticket system.")]),e("li",null,[e("a",XG,[o("OTRS"),r(t)]),o(" - Trouble ticket system for assigning tickets to incoming queries and tracking further communications.")]),e("li",null,[e("a",YG,[o("Request Tracker"),r(t)]),o(" - Ticket-tracking system written in Perl.")]),e("li",null,[e("a",ZG,[o("TheBugGenie"),r(t)]),o(" - Ticket system with extensive user rights system.")])]),QG,e("ul",null,[e("li",null,[e("a",$G,[o("Lstu"),r(t)]),o(" - "),ex,o(" - Lightweight URL shortener")]),e("li",null,[e("a",ox,[o("Nimbus"),r(t)]),o(" - A URL shortener and file sharer with a drag-and-drop OS X menu bar client and web interface - "),rx,o(),tx]),e("li",null,[e("a",nx,[o("Polr"),r(t)]),o(" - A modern, minimalist, modular, and lightweight URL shortener. ("),e("a",sx,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",lx,[o("YOURLS"),r(t)]),o(" - YOURLS is a set of PHP scripts that will allow you to run Your Own URL Shortener. Features include password protection, URL customization, bookmarklets, statistics, API, plugins, jsonp. ("),e("a",ax,[o("Source Code"),r(t)]),o(", "),e("a",ix,[o("Documentation"),r(t)]),o(") "),hx])]),cx,e("p",null,[o("See "),e("a",dx,[o("https://github.com/n1trux/awesome-sysadmin#vpn"),r(t)])]),_x,e("p",null,[o("See "),e("a",ux,[o("https://github.com/n1trux/awesome-sysadmin#web"),r(t)])]),px,e("p",null,[o("See also "),fx,o(", "),e("a",gx,[o("Wikimatrix"),r(t)]),o(", "),e("a",bx,[o("Wiki Engines on WikiIndex"),r(t)]),o(", "),e("a",mx,[o("List of wiki software on wikipedia"),r(t)]),o(", "),e("a",kx,[o("Comparison of wiki software on wikipedia"),r(t)]),o(".")]),e("ul",null,[e("li",null,[e("a",wx,[o("Blazekiss"),r(t)]),o(" - BlazeKiss is a KISS-based wiki (Keep It Simple, Stupid) - simplicity and functionality comes before all. ("),e("a",Px,[o("Source Code"),r(t)]),o(")"),yx,o(),Sx]),e("li",null,[e("a",vx,[o("BookStack"),r(t)]),o(" - BookStack is a simple, self-hosted, easy-to-use platform for organizing and storing information. It allows for documentation to be stored in a book like fashion. ("),e("a",Cx,[o("Demo"),r(t)]),o(", "),e("a",Ax,[o("Source Code"),r(t)]),o(") "),Lx,o(),Mx]),e("li",null,[e("a",Gx,[o("commonplace"),r(t)]),o(" - A server for your markdown files. Give it a directory, and Commonplace gives you a url, pretty pages, and quick editing. "),xx]),e("li",null,[e("a",Tx,[o("Dokuwiki"),r(t)]),o(" - An easy to use, lightweight, standards-compliant wiki engine with a simple syntax allowing reading the data outside the wiki. All data is stored in plain files, therefore no database is required. "),Ix,o(),Ex]),e("li",null,[e("a",Dx,[o("Gitit"),r(t)]),o(" - A wiki program that stores pages and uploaded files in a git repository, which can then be modified using the VCS command line tools or the wiki's web interface. ("),e("a",Bx,[o("Demo"),r(t)]),o(") "),Hx,o(),jx]),e("li",null,[e("a",Rx,[o("Gollum"),r(t)]),o(" - A simple, Git-powered wiki with a sweet API and local frontend. "),Ox,o(),Fx]),e("li",null,[e("a",Nx,[o("Gruik"),r(t)]),o(" - An open-source markdown note-taking web app. ("),e("a",zx,[o("Source Code"),r(t)]),o(") "),Wx,o(),Jx]),e("li",null,[e("a",Ux,[o("jingo"),r(t)]),o(" - A git based wiki engine written for node.js, with a decent design, a search capability and a good typography. ("),e("a",Vx,[o("Demo"),r(t)]),o(", "),e("a",qx,[o("Source Code"),r(t)]),o(") "),Kx,o(),Xx]),e("li",null,[e("a",Yx,[o("Mediawiki"),r(t)]),o(" - MediaWiki is a free and open-source wiki software package written in PHP. It serves as the platform for Wikipedia and the other Wikimedia projects, used by hundreds of millions of people each month. ("),e("a",Zx,[o("Source Code"),r(t)]),o(") "),Qx,o(),$x]),e("li",null,[e("a",eT,[o("MoinMoin"),r(t)]),o(" - An advanced, easy to use and extensible WikiEngine with a large community of users. ([Source code] ("),e("a",oT,[o("http://hg.moinmo.in/moin"),r(t)]),o(")) "),rT,o(),tT]),e("li",null,[e("a",nT,[o("Olelo"),r(t)]),o(" - Olelo is a wiki that stores pages in a Git repository, supports many markup styles and has an extensible, hackable architecture. ("),e("a",sT,[o("Demo"),r(t)]),o(") "),lT,o(),aT]),e("li",null,[e("a",iT,[o("Pepperminty Wiki"),r(t)]),o(" - A complete markdown-powered wiki contained in a single PHP file. ("),e("a",hT,[o("Demo"),r(t)]),o(") "),cT,o(),dT]),e("li",null,[e("a",_T,[o("PmWiki"),r(t)]),o(" - Wiki-based system for collaborative creation and maintenance of websites. "),uT,o(),pT]),e("li",null,[e("a",fT,[o("Raneto"),r(t)]),o(" - Raneto is an open source Knowledgebase platform that uses static Markdown files to power your Knowledgebase - "),gT,o(),bT]),e("li",null,[e("a",mT,[o("Realms"),r(t)]),o(" - A git-backed wiki inspired by Gollum. ("),e("a",kT,[o("Source Code"),r(t)]),o(") "),wT,o(),PT]),e("li",null,[e("a",yT,[o("Redaxscript"),r(t)]),o(" - Ultra lightweight website engine. ("),e("a",ST,[o("Source Code"),r(t)]),o(")"),vT,o(),CT]),e("li",null,[e("a",AT,[o("TiddlyWiki"),r(t)]),o(" - A reusable non-linear personal web notebook. ("),e("a",LT,[o("Source Code"),r(t)]),o(") "),MT,o(),GT]),e("li",null,[e("a",xT,[o("Tiki"),r(t)]),o(" - Wiki CMS Groupware with the most built-in features. ("),e("a",TT,[o("Demo"),r(t)]),o(", "),e("a",IT,[o("Source Code"),r(t)]),o(") "),ET,o(),DT]),e("li",null,[e("a",BT,[o("Wikifeat"),r(t)]),o(" - Wikifeat is an open source collaboration platform built around the ever-popular Wiki concept. ("),e("a",HT,[o("Source Code"),r(t)]),o(") "),jT,o(),RT]),e("li",null,[e("a",OT,[o("WiKiss"),r(t)]),o(" - A Wiki, simple to use and install. ("),e("a",FT,[o("Source Code"),r(t)]),o(") "),NT,o(),zT]),e("li",null,[e("a",WT,[o("Wikitten"),r(t)]),o(" - Wikitten is a small, fast, PHP wiki, and the perfect place to store your notes, code snippets, ideas, and so on. ("),e("a",JT,[o("Source Code"),r(t)]),o(") "),UT,o(),VT])]),qT,e("ul",null,[e("li",null,[e("a",KT,[o("arkOS"),r(t)]),o(" - Install arkOS to a dedicated device and host your own websites, email, files and more. ("),e("a",XT,[o("Source Code"),r(t)]),o(),e("a",YT,[o("[1]"),r(t)]),o(") "),ZT,o(),QT]),e("li",null,[e("a",$T,[o("Cloudron"),r(t)]),o(" - Effortlessly self-host web apps on your server. ("),e("a",eI,[o("Source Code"),r(t)]),o(") "),oI,o(),rI]),e("li",null,[e("a",tI,[o("DPlatform"),r(t)]),o(" - Deploy self-hosted apps easily: simple, bloat-free, independent installation. ("),e("a",nI,[o("Source code"),r(t)]),o(") "),sI,o(),lI]),e("li",null,[e("a",aI,[o("FreedomBone"),r(t)]),o(" - Home server configuration based on Debian. "),iI,o(),hI]),e("li",null,[e("a",cI,[o("FreedomBox"),r(t)]),o(" - A community project to develop, design and promote personal servers running free software for private, personal, communications. "),dI,o(),_I]),e("li",null,[e("a",uI,[o("Piratebox"),r(t)]),o(" - A DIY anonymous offline file-sharing and communications system built with free software and inexpensive off-the-shelf hardware. ("),e("a",pI,[o("Source Code"),r(t)]),o("). "),fI,o(),gI]),e("li",null,[e("a",bI,[o("Puffin"),r(t)]),o(" - Lightweight webapp catalog based on containers, with user interface à la mobile app store. ("),e("a",mI,[o("Demo"),r(t)]),o(", "),e("a",kI,[o("Source Code"),r(t)]),o(") "),wI,o(),PI]),e("li",null,[e("a",yI,[o("Sandstorm"),r(t)]),o(" - Personal server for running self-hosted apps easily and securely. ("),e("a",SI,[o("Demo"),r(t)]),o(", "),e("a",vI,[o("Source Code"),r(t)]),o(") "),CI,o(),AI]),e("li",null,[e("a",LI,[o("sovereign"),r(t)]),o(" - A set of Ansible playbooks to build and maintain your own private cloud: email, calendar, contacts, file sync, IRC bouncer, VPN, and more. "),MI,o(),GI]),e("li",null,[e("a",xI,[o("UBOS"),r(t)]),o(" - Linux distro that runs on indie boxes (personal servers and IoT devices). Single-command installation and management of apps - Jenkins, Mediawiki, Owncloud, WordPress, etc., - and other "),e("a",TI,[o("features"),r(t)]),o("."),II,o(),EI]),e("li",null,[e("a",DI,[o("WikiSuite"),r(t)]),o(" - The most comprehensive and integrated Free / Libre / Open Source software suite ever developed. ("),e("a",BI,[o("Source Code"),r(t)]),o(") "),HI,o(),jI]),e("li",null,[e("a",RI,[o("yunohost"),r(t)]),o(" - A server operating system aiming to make self-hosting accessible to everyone. ("),e("a",OI,[o("Source Code"),r(t)]),o(") "),FI,o(),NI])]),i(" END SOFTWARE LIST "),zI,WI,e("ul",null,[JI,e("li",null,[UI,o(" - "),e("a",VI,[o("Attribution Assurance License"),r(t)])]),e("li",null,[qI,o(" - "),e("a",KI,[o("GNU Affero General Public License 3.0"),r(t)])]),e("li",null,[XI,o(" - "),e("a",YI,[o("Apache, Version 2.0"),r(t)])]),e("li",null,[ZI,o(" - "),e("a",QI,[o("Artistic License Version 2.0"),r(t)])]),e("li",null,[$I,o(" - "),e("a",eE,[o("FreeBSD License"),r(t)])]),e("li",null,[oE,o(" - "),e("a",rE,[o("Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported"),r(t)])]),e("li",null,[tE,o(" - "),e("a",nE,[o("Creative Commons Attribution-NonCommercial 4.0 International"),r(t)])]),e("li",null,[sE,o(" - "),e("a",lE,[o("Public Domain"),r(t)])]),e("li",null,[aE,o(" - "),e("a",iE,[o("CEA CNRS INRIA Logiciel Libre"),r(t)])]),e("li",null,[hE,o(" - "),e("a",cE,[o("Common Public Attribution License Version 1.0"),r(t)])]),e("li",null,[dE,o(" - "),e("a",_E,[o("Educational Community License, Version 2.0 "),r(t)])]),e("li",null,[uE,o(" - "),e("a",pE,[o("Eclipse Public License, Version 1.0"),r(t)])]),e("li",null,[fE,o(" - "),e("a",gE,[o("GNU General Public License"),r(t)])]),e("li",null,[bE,o(" - "),e("a",mE,[o("GNU General Public License 2.0"),r(t)])]),e("li",null,[kE,o(" - "),e("a",wE,[o("GNU General Public License 3.0"),r(t)])]),e("li",null,[PE,o(" - "),e("a",yE,[o("IBM Public License"),r(t)])]),e("li",null,[SE,o(" - "),e("a",vE,[o("Internet Software Consortium License"),r(t)])]),e("li",null,[CE,o(" - "),e("a",AE,[o("Lesser General Public License 2.1"),r(t)])]),e("li",null,[LE,o(" - "),e("a",ME,[o("Lesser General Public License 3.0"),r(t)])]),e("li",null,[GE,o(" - "),e("a",xE,[o("MIT License"),r(t)])]),e("li",null,[TE,o(" - "),e("a",IE,[o("Mozilla Public License"),r(t)])]),e("li",null,[EE,o(" - "),e("a",DE,[o("Open Software License 3.0"),r(t)])]),e("li",null,[BE,o(" - "),e("a",HE,[o("Sendmail License"),r(t)])]),e("li",null,[jE,o(" - "),e("a",RE,[o("Zlib/libpng License"),r(t)])]),e("li",null,[OE,o(" - "),e("a",FE,[o("Zope Public License 2.0"),r(t)])])]),NE,zE,e("ul",null,[e("li",null,[e("a",WE,[o("Awesome Selfhosted Chat"),r(t)]),o(" - A rocket.chat instance setup for the awesome selfhosted community.")]),e("li",null,[e("a",JE,[o("Awesome Big Data"),r(t)]),o(" - A curated list of awesome big data frameworks, resources and other awesomeness.")]),e("li",null,[e("a",UE,[o("Awesome Sysadmin"),r(t)]),o(" - A curated list of amazingly awesome open source sysadmin resources.")]),e("li",null,[e("a",VE,[o("PRISM Break"),r(t)]),o(", "),e("a",qE,[o("privacytools.io"),r(t)]),o(", "),e("a",KE,[o("Alternative Internet"),r(t)]),o(" - Lists of software aimed at privacy and decentralization (in some form).")]),e("li",null,[o("Dynamic Domain Name services: "),e("a",XE,[o("Afraid.org"),r(t)]),o(", "),e("a",YE,[o("Pagekite"),r(t)])]),e("li",null,[o("Communities/forums: "),e("a",ZE,[o("/r/selfhosted"),r(t)]),o(", "),e("a",QE,[o("Auto-Hébergement (FR)"),r(t)])])]),$E,eD,e("p",null,[o("Contributing guidelines can be found "),r(s,{to:"/_posts/.github/CONTRIBUTING.html"},{default:a(()=>[o("here")]),_:1}),o(".")]),oD])}const aD=h(_,[["render",rD],["__file","2023-12-13-awesome-selfhosted-cn.html.vue"]]);export{aD as default}; +import{_ as h}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as c,c as d,a as e,b as o,d as r,w as a,f as i,e as n}from"./app-91ee3df5.js";const _={},u={href:"https://github.com/Kickball/awesome-selfhosted/",target:"_blank",rel:"noopener noreferrer"},p={href:"https://github.com/Kickball",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/haiiiiiyun/self-hosted-cn",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/Kickball/awesome-Selfhosted",target:"_blank",rel:"noopener noreferrer"},b=e("p",null,"Selfhosting is the process of locally hosting and managing applications instead of renting from SaaS providers.",-1),m={href:"https://en.wikipedia.org/wiki/Free_software",target:"_blank",rel:"noopener noreferrer"},k={href:"https://en.wikipedia.org/wiki/Network_service",target:"_blank",rel:"noopener noreferrer"},w={href:"https://en.wikipedia.org/wiki/Web_application",target:"_blank",rel:"noopener noreferrer"},P=n('

        See Contributing.

        =================


        ',4),y=e("h2",{id:"分析",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#分析","aria-hidden":"true"},"#"),o(" 分析")],-1),S=e("p",null,[e("em",null,"Web Analytics")],-1),v={href:"http://www.awstats.org/",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/eldy/awstats",target:"_blank",rel:"noopener noreferrer"},A=e("code",null,"GPLv3",-1),L=e("code",null,"Perl",-1),M={href:"https://count.ly",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/countly",target:"_blank",rel:"noopener noreferrer"},x=e("code",null,"AGPLv3",-1),T=e("code",null,"Javascript",-1),I={href:"http://druid.io/",target:"_blank",rel:"noopener noreferrer"},E={href:"https://github.com/druid-io/druid/",target:"_blank",rel:"noopener noreferrer"},D=e("code",null,"Apache",-1),B=e("code",null,"Java",-1),H={href:"http://goaccess.io/",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/allinurl/goaccess",target:"_blank",rel:"noopener noreferrer"},R=e("code",null,"GPLv2",-1),O=e("code",null,"C",-1),F={href:"http://www.openwebanalytics.com/",target:"_blank",rel:"noopener noreferrer"},N={href:"https://github.com/padams/Open-Web-Analytics/",target:"_blank",rel:"noopener noreferrer"},z=e("code",null,"GPLv2",-1),W=e("code",null,"PHP",-1),J={href:"https://piwik.org/",target:"_blank",rel:"noopener noreferrer"},U={href:"https://github.com/piwik/",target:"_blank",rel:"noopener noreferrer"},V=e("code",null,"GPLv3",-1),q=e("code",null,"PHP",-1),K={href:"https://serposcope.serphacker.com/",target:"_blank",rel:"noopener noreferrer"},X={href:"https://github.com/serphacker/serposcope",target:"_blank",rel:"noopener noreferrer"},Y=e("code",null,"MIT",-1),Z=e("code",null,"Java",-1),Q={href:"http://snowplowanalytics.com/",target:"_blank",rel:"noopener noreferrer"},$={href:"https://github.com/snowplow/",target:"_blank",rel:"noopener noreferrer"},ee=e("code",null,"Apache",-1),oe=e("code",null,"Scala",-1),re={href:"https://www.thinkup.com/",target:"_blank",rel:"noopener noreferrer"},te={href:"https://github.com/ThinkUpLLC/ThinkUp",target:"_blank",rel:"noopener noreferrer"},ne=e("code",null,"GPLv3",-1),se=e("code",null,"PHP",-1),le=e("p",null,[e("em",null,"Business Intelligence")],-1),ae={href:"http://www.metabase.com/",target:"_blank",rel:"noopener noreferrer"},ie={href:"https://github.com/metabase/metabase",target:"_blank",rel:"noopener noreferrer"},he=e("code",null,"AGPLv3",-1),ce=e("code",null,"Clojure",-1),de={href:"http://redash.io",target:"_blank",rel:"noopener noreferrer"},_e={href:"https://demo.redash.io",target:"_blank",rel:"noopener noreferrer"},ue={href:"https://github.com/getredash/redash",target:"_blank",rel:"noopener noreferrer"},pe=e("code",null,"BSD",-1),fe=e("code",null,"Python",-1),ge=e("h2",{id:"自动化",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#自动化","aria-hidden":"true"},"#"),o(" 自动化")],-1),be={href:"http://www.alltubedownload.net",target:"_blank",rel:"noopener noreferrer"},me={href:"https://github.com/rg3/youtube-dl",target:"_blank",rel:"noopener noreferrer"},ke={href:"https://rg3.github.io/youtube-dl/supportedsites.html",target:"_blank",rel:"noopener noreferrer"},we={href:"http://www.alltubedownload.net",target:"_blank",rel:"noopener noreferrer"},Pe={href:"https://github.com/Rudloff/alltube",target:"_blank",rel:"noopener noreferrer"},ye=e("code",null,"GPL",-1),Se=e("code",null,"PHP",-1),ve={href:"https://amiunique.org/",target:"_blank",rel:"noopener noreferrer"},Ce={href:"https://github.com/DIVERSIFY-project/amiunique",target:"_blank",rel:"noopener noreferrer"},Ae=e("code",null,"MIT",-1),Le=e("code",null,"Java",-1),Me={href:"https://bip.io/",target:"_blank",rel:"noopener noreferrer"},Ge={href:"https://github.com/bipio-server/bipio",target:"_blank",rel:"noopener noreferrer"},xe=e("code",null,"GPLv3",-1),Te=e("code",null,"Nodejs",-1),Ie={href:"https://couchpota.to/",target:"_blank",rel:"noopener noreferrer"},Ee={href:"https://github.com/CouchPotato/CouchPotatoServer/",target:"_blank",rel:"noopener noreferrer"},De=e("code",null,"GPLv3",-1),Be=e("code",null,"Python",-1),He={href:"https://github.com/rembo10/headphones",target:"_blank",rel:"noopener noreferrer"},je=e("code",null,"GPLv3",-1),Re=e("code",null,"Python",-1),Oe={href:"https://healthchecks.io/",target:"_blank",rel:"noopener noreferrer"},Fe={href:"https://github.com/healthchecks/healthchecks",target:"_blank",rel:"noopener noreferrer"},Ne=e("code",null,"BSD",-1),ze=e("code",null,"Python",-1),We={href:"https://github.com/cantino/huginn",target:"_blank",rel:"noopener noreferrer"},Je=e("code",null,"MIT",-1),Ue=e("code",null,"Ruby",-1),Ve={href:"https://http2pic.haschek.at/",target:"_blank",rel:"noopener noreferrer"},qe={href:"https://github.com/chrisiaut/http2pic",target:"_blank",rel:"noopener noreferrer"},Ke=e("code",null,"Apache 2.0",-1),Xe=e("code",null,"PHP/Javascript",-1),Ye={href:"http://nodered.org/",target:"_blank",rel:"noopener noreferrer"},Ze={href:"https://github.com/node-red/node-red",target:"_blank",rel:"noopener noreferrer"},Qe=e("code",null,"Apache",-1),$e=e("code",null,"Nodejs",-1),eo={href:"http://www.openhab.org",target:"_blank",rel:"noopener noreferrer"},oo={href:"https://github.com/openhab/openhab",target:"_blank",rel:"noopener noreferrer"},ro=e("code",null,"EPLv1",-1),to=e("code",null,"Java",-1),no={href:"https://github.com/sebsauvage/rss-bridge",target:"_blank",rel:"noopener noreferrer"},so=e("code",null,"Public domain",-1),lo=e("code",null,"PHP",-1),ao={href:"http://sickrage.github.io/",target:"_blank",rel:"noopener noreferrer"},io={href:"https://github.com/SickRage/SickRage/",target:"_blank",rel:"noopener noreferrer"},ho=e("code",null,"GPLv3",-1),co=e("code",null,"Python",-1),_o={href:"https://sonarr.tv/",target:"_blank",rel:"noopener noreferrer"},uo={href:"https://github.com/Sonarr/Sonarr",target:"_blank",rel:"noopener noreferrer"},po=e("code",null,"GPLv3",-1),fo=e("code",null,"C#",-1),go={href:"http://trigger-happy.eu/",target:"_blank",rel:"noopener noreferrer"},bo={href:"https://github.com/foxmask/django-th",target:"_blank",rel:"noopener noreferrer"},mo=e("code",null,"BSD",-1),ko=e("code",null,"Python",-1),wo={href:"https://github.com/jchampemont/WTFDYUM",target:"_blank",rel:"noopener noreferrer"},Po={href:"https://www.wtfdyu.me/",target:"_blank",rel:"noopener noreferrer"},yo={href:"https://github.com/jchampemont/WTFDYUM",target:"_blank",rel:"noopener noreferrer"},So=e("code",null,"Apache",-1),vo=e("code",null,"Java",-1),Co={href:"https://s8f.org/zenbot.html",target:"_blank",rel:"noopener noreferrer"},Ao={href:"https://zenbot.s8f.org/",target:"_blank",rel:"noopener noreferrer"},Lo={href:"https://github.com/carlos8f/zenbot",target:"_blank",rel:"noopener noreferrer"},Mo=e("code",null,"MIT",-1),Go=e("code",null,"Node.js",-1),xo=e("h2",{id:"博客平台",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#博客平台","aria-hidden":"true"},"#"),o(" 博客平台")],-1),To=e("a",{href:"#static-site-generators"},"Static Site Generators",-1),Io=e("a",{href:"#content-management-systems-cms"},"Content Management Systems",-1),Eo={href:"http://www.weblogmatrix.org/",target:"_blank",rel:"noopener noreferrer"},Do={href:"https://anchorcms.com/",target:"_blank",rel:"noopener noreferrer"},Bo={href:"https://github.com/anchorcms/anchor-cms",target:"_blank",rel:"noopener noreferrer"},Ho=e("code",null,"GPLv3",-1),jo=e("code",null,"PHP",-1),Ro={href:"https://antville.org",target:"_blank",rel:"noopener noreferrer"},Oo={href:"https://github.com/antville/antville",target:"_blank",rel:"noopener noreferrer"},Fo=e("code",null,"Apache",-1),No=e("code",null,"Javascript",-1),zo={href:"http://lehollandaisvolant.net/blogotext/en/",target:"_blank",rel:"noopener noreferrer"},Wo={href:"https://github.com/timovn/blogotext",target:"_blank",rel:"noopener noreferrer"},Jo=e("code",null,"MIT",-1),Uo=e("code",null,"PHP",-1),Vo={href:"https://github.com/chyrp/chyrp",target:"_blank",rel:"noopener noreferrer"},qo=e("code",null,"MIT",-1),Ko=e("code",null,"PHP",-1),Xo={href:"http://dotclear.org/",target:"_blank",rel:"noopener noreferrer"},Yo={href:"https://hg.dotclear.org/dotclear",target:"_blank",rel:"noopener noreferrer"},Zo=e("code",null,"GPLv2",-1),Qo=e("code",null,"PHP",-1),$o={href:"https://ghost.org/",target:"_blank",rel:"noopener noreferrer"},er={href:"https://github.com/TryGhost/Ghost",target:"_blank",rel:"noopener noreferrer"},or=e("code",null,"MIT",-1),rr=e("code",null,"Nodejs",-1),tr={href:"https://www.htmly.com/",target:"_blank",rel:"noopener noreferrer"},nr={href:"https://www.htmly.com/demo/",target:"_blank",rel:"noopener noreferrer"},sr={href:"https://github.com/danpros/htmly",target:"_blank",rel:"noopener noreferrer"},lr=e("code",null,"GPLv2",-1),ar=e("code",null,"PHP",-1),ir={href:"https://withknown.com/",target:"_blank",rel:"noopener noreferrer"},hr={href:"https://github.com/idno/idno",target:"_blank",rel:"noopener noreferrer"},cr=e("code",null,"Apache",-1),dr=e("code",null,"PHP",-1),_r={href:"http://noddity.com/",target:"_blank",rel:"noopener noreferrer"},ur={href:"https://github.com/TehShrike/noddity",target:"_blank",rel:"noopener noreferrer"},pr=e("code",null,"WTFPL",-1),fr=e("code",null,"Nodejs",-1),gr={href:"http://www.pluxml.org/",target:"_blank",rel:"noopener noreferrer"},br={href:"https://github.com/pluxml/PluXml",target:"_blank",rel:"noopener noreferrer"},mr=e("code",null,"GPL",-1),kr=e("code",null,"PHP",-1),wr={href:"https://www.postleaf.org/",target:"_blank",rel:"noopener noreferrer"},Pr={href:"https://github.com/Postleaf/postleaf",target:"_blank",rel:"noopener noreferrer"},yr=e("code",null,"GPLv3",-1),Sr=e("code",null,"PHP",-1),vr={href:"https://wagtail.io/",target:"_blank",rel:"noopener noreferrer"},Cr={href:"https://github.com/torchbox/wagtail",target:"_blank",rel:"noopener noreferrer"},Ar=e("code",null,"BSD",-1),Lr=e("code",null,"Python",-1),Mr={href:"https://wordpress.org/",target:"_blank",rel:"noopener noreferrer"},Gr={href:"https://github.com/WordPress/WordPress",target:"_blank",rel:"noopener noreferrer"},xr=e("code",null,"GPLv2",-1),Tr=e("code",null,"PHP",-1),Ir=e("h2",{id:"书签-链接共享",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#书签-链接共享","aria-hidden":"true"},"#"),o(" 书签 & 链接共享")],-1),Er={href:"https://github.com/bookieio/Bookie",target:"_blank",rel:"noopener noreferrer"},Dr={href:"http://delicious.com",target:"_blank",rel:"noopener noreferrer"},Br=e("code",null,"AGPLv3",-1),Hr=e("code",null,"Python",-1),jr={href:"https://docs.services.mozilla.com/howtos/run-fxa.html",target:"_blank",rel:"noopener noreferrer"},Rr={href:"https://github.com/mozilla/fxa-auth-server/",target:"_blank",rel:"noopener noreferrer"},Or=e("code",null,"MPLv2",-1),Fr=e("code",null,"Nodejs",-1),Nr={href:"https://docs.services.mozilla.com/howtos/run-fxa.html",target:"_blank",rel:"noopener noreferrer"},zr={href:"https://github.com/mozilla/fxa-content-server/",target:"_blank",rel:"noopener noreferrer"},Wr=e("code",null,"MPLv2",-1),Jr=e("code",null,"Java",-1),Ur={href:"https://docs.services.mozilla.com/howtos/run-sync-1.5.html",target:"_blank",rel:"noopener noreferrer"},Vr={href:"https://github.com/mozilla-services/syncserver",target:"_blank",rel:"noopener noreferrer"},qr=e("code",null,"MPLv2",-1),Kr=e("code",null,"Python",-1),Xr={href:"https://lobste.rs",target:"_blank",rel:"noopener noreferrer"},Yr={href:"https://github.com/jcs/lobsters",target:"_blank",rel:"noopener noreferrer"},Zr=e("code",null,"BSD",-1),Qr=e("code",null,"Ruby",-1),$r={href:"http://nofussbm.herokuapp.com/signup.html",target:"_blank",rel:"noopener noreferrer"},et={href:"https://github.com/mapio/nofussbm",target:"_blank",rel:"noopener noreferrer"},ot=e("code",null,"GPLv3",-1),rt=e("code",null,"Python",-1),tt={href:"http://getpinry.com/",target:"_blank",rel:"noopener noreferrer"},nt={href:"https://github.com/pinry/pinry",target:"_blank",rel:"noopener noreferrer"},st=e("code",null,"BSD",-1),lt=e("code",null,"Python",-1),at={href:"https://saveto.co/",target:"_blank",rel:"noopener noreferrer"},it={href:"https://github.com/saveto-co/saveto",target:"_blank",rel:"noopener noreferrer"},ht=e("code",null,"MIT",-1),ct=e("code",null,"Nodejs",-1),dt={href:"https://github.com/shaarli/Shaarli",target:"_blank",rel:"noopener noreferrer"},_t={href:"http://shaarlidemo.tuxfamily.org/#demo",target:"_blank",rel:"noopener noreferrer"},ut=e("code",null,"Zlib",-1),pt=e("code",null,"PHP",-1),ft={href:"https://unmark.it/",target:"_blank",rel:"noopener noreferrer"},gt={href:"https://github.com/plainmade/unmark",target:"_blank",rel:"noopener noreferrer"},bt=e("code",null,"MIT",-1),mt=e("code",null,"PHP",-1),kt=e("h2",{id:"日历和地址薄",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#日历和地址薄","aria-hidden":"true"},"#"),o(" 日历和地址薄")],-1),wt=e("p",null,[o("Some "),e("a",{href:"#groupware"},"Groupware"),o(" solutions also feature calendar/address book editing and synchronization.")],-1),Pt={href:"http://agendav.org/",target:"_blank",rel:"noopener noreferrer"},yt={href:"https://github.com/adobo/agendav",target:"_blank",rel:"noopener noreferrer"},St=e("code",null,"GPLv3",-1),vt=e("code",null,"PHP",-1),Ct={href:"http://baikal-server.com/",target:"_blank",rel:"noopener noreferrer"},At={href:"https://github.com/fruux/Baikal",target:"_blank",rel:"noopener noreferrer"},Lt=e("code",null,"GPLv3",-1),Mt=e("code",null,"PHP",-1),Gt={href:"http://trac.calendarserver.org/",target:"_blank",rel:"noopener noreferrer"},xt=e("code",null,"Apache",-1),Tt=e("code",null,"Python",-1),It={href:"http://keithp.com/calypso/",target:"_blank",rel:"noopener noreferrer"},Et={href:"http://keithp.com/cgi-bin/gitweb.cgi?p=calypso.git;a=tree",target:"_blank",rel:"noopener noreferrer"},Dt=e("code",null,"GPLv3",-1),Bt=e("code",null,"Python",-1),Ht={href:"http://www.davical.org/",target:"_blank",rel:"noopener noreferrer"},jt={href:"https://gitlab.com/davical-project/davical",target:"_blank",rel:"noopener noreferrer"},Rt=e("code",null,"MIT",-1),Ot=e("code",null,"PHP",-1),Ft={href:"https://doc.owncloud.org/server/9.0/user_manual/pim/calendar.html",target:"_blank",rel:"noopener noreferrer"},Nt={href:"https://github.com/owncloud/calendar-rework",target:"_blank",rel:"noopener noreferrer"},zt=e("code",null,"AGPLv3",-1),Wt=e("code",null,"PHP",-1),Jt={href:"http://radicale.org/",target:"_blank",rel:"noopener noreferrer"},Ut={href:"https://github.com/Kozea/Radicale",target:"_blank",rel:"noopener noreferrer"},Vt=e("code",null,"GPLv3",-1),qt=e("code",null,"Python",-1),Kt={href:"http://sabre.io/",target:"_blank",rel:"noopener noreferrer"},Xt={href:"https://github.com/fruux/sabre-dav",target:"_blank",rel:"noopener noreferrer"},Yt=e("code",null,"MIT",-1),Zt=e("code",null,"PHP",-1),Qt={href:"https://www.inf-it.com/open-source/clients/infcloud/",target:"_blank",rel:"noopener noreferrer"},$t={href:"https://www.inf-it.com/infcloud/",target:"_blank",rel:"noopener noreferrer"},en={href:"https://www.inf-it.com/InfCloud_0.13.1.zip",target:"_blank",rel:"noopener noreferrer"},on=e("code",null,"AGPLv3",-1),rn=e("code",null,"Javascript",-1),tn=e("h2",{id:"通讯系统",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#通讯系统","aria-hidden":"true"},"#"),o(" 通讯系统")],-1),nn=e("h3",{id:"定制",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#定制","aria-hidden":"true"},"#"),o(" 定制")],-1),sn={href:"https://actor.im/",target:"_blank",rel:"noopener noreferrer"},ln={href:"https://app.actor.im",target:"_blank",rel:"noopener noreferrer"},an={href:"https://github.com/actorapp/actor-platform",target:"_blank",rel:"noopener noreferrer"},hn=e("code",null,"AGPLv3",-1),cn=e("code",null,"Scala",-1),dn={href:"https://github.com/rafael-santiago/cherry",target:"_blank",rel:"noopener noreferrer"},_n=e("code",null,"GPLv2",-1),un=e("code",null,"Go",-1),pn={href:"https://freenetproject.org/index.html",target:"_blank",rel:"noopener noreferrer"},fn={href:"https://github.com/freenet/fred",target:"_blank",rel:"noopener noreferrer"},gn=e("code",null,"GPLv2",-1),bn=e("code",null,"Java",-1),mn={href:"http://moose-team.github.io/friends/",target:"_blank",rel:"noopener noreferrer"},kn={href:"https://github.com/moose-team/friends",target:"_blank",rel:"noopener noreferrer"},wn=e("code",null,"MIT",-1),Pn=e("code",null,"Nodejs",-1),yn={href:"https://gnunet.org/",target:"_blank",rel:"noopener noreferrer"},Sn={href:"https://gnunet.org/svn/",target:"_blank",rel:"noopener noreferrer"},vn=e("code",null,"GPLv3",-1),Cn=e("code",null,"C",-1),An={href:"https://jitsi.org/Projects/JitsiMeet",target:"_blank",rel:"noopener noreferrer"},Ln={href:"https://github.com/jitsi/jitsi-meet",target:"_blank",rel:"noopener noreferrer"},Mn=e("code",null,"MIT",-1),Gn=e("code",null,"Javascript",-1),xn={href:"https://jitsi.org/Projects/JitsiVideobridge",target:"_blank",rel:"noopener noreferrer"},Tn={href:"https://github.com/jitsi/jitsi-videobridge",target:"_blank",rel:"noopener noreferrer"},In=e("code",null,"Apache",-1),En=e("code",null,"Java",-1),Dn={href:"http://getkandan.com/",target:"_blank",rel:"noopener noreferrer"},Bn={href:"https://github.com/kandanapp/kandan",target:"_blank",rel:"noopener noreferrer"},Hn=e("code",null,"AGPLv3",-1),jn=e("code",null,"Ruby",-1),Rn={href:"http://sdelements.github.io/lets-chat/",target:"_blank",rel:"noopener noreferrer"},On={href:"https://github.com/sdelements/lets-chat",target:"_blank",rel:"noopener noreferrer"},Fn=e("code",null,"MIT",-1),Nn=e("code",null,"Nodejs",-1),zn={href:"http://livehelperchat.com/",target:"_blank",rel:"noopener noreferrer"},Wn={href:"https://github.com/LiveHelperChat/livehelperchat",target:"_blank",rel:"noopener noreferrer"},Jn=e("code",null,"Apache",-1),Un=e("code",null,"PHP",-1),Vn={href:"http://www.mattermost.org/",target:"_blank",rel:"noopener noreferrer"},qn={href:"https://about.gitlab.com/",target:"_blank",rel:"noopener noreferrer"},Kn={href:"https://github.com/mattermost/platform",target:"_blank",rel:"noopener noreferrer"},Xn=e("code",null,"AGPLv3/Apache",-1),Yn=e("code",null,"Go",-1),Zn={href:"https://mibew.org",target:"_blank",rel:"noopener noreferrer"},Qn={href:"https://mibew.org/demo2",target:"_blank",rel:"noopener noreferrer"},$n={href:"https://github.com/Mibew/mibew",target:"_blank",rel:"noopener noreferrer"},es=e("code",null,"Apache",-1),os=e("code",null,"PHP",-1),rs={href:"http://wiki.mumble.info/wiki/Main_Page",target:"_blank",rel:"noopener noreferrer"},ts={href:"https://github.com/mumble-voip/mumble",target:"_blank",rel:"noopener noreferrer"},ns=e("code",null,"BSD",-1),ss=e("code",null,"C++",-1),ls={href:"https://bitbucket.org/Flandoo/mumblecop",target:"_blank",rel:"noopener noreferrer"},as=e("code",null,"MIT",-1),is=e("code",null,"Ruby",-1),hs={href:"https://github.com/IgorAntun/node-chat",target:"_blank",rel:"noopener noreferrer"},cs=e("code",null,"MIT",-1),ds=e("code",null,"Nodejs",-1),_s={href:"http://retroshare.org",target:"_blank",rel:"noopener noreferrer"},us={href:"https://github.com/RetroShare/RetroShare",target:"_blank",rel:"noopener noreferrer"},ps=e("code",null,"GPLv2",-1),fs=e("code",null,"С++",-1),gs={href:"https://rocket.chat/",target:"_blank",rel:"noopener noreferrer"},bs={href:"http://Gitter.im",target:"_blank",rel:"noopener noreferrer"},ms={href:"https://github.com/RocketChat/Rocket.Chat",target:"_blank",rel:"noopener noreferrer"},ks=e("code",null,"MIT",-1),ws=e("code",null,"Nodejs",-1),Ps={href:"https://matrix.org/blog/project/synapse/",target:"_blank",rel:"noopener noreferrer"},ys={href:"https://matrix.org/",target:"_blank",rel:"noopener noreferrer"},Ss={href:"https://github.com/matrix-org/synapse",target:"_blank",rel:"noopener noreferrer"},vs=e("code",null,"Apache",-1),Cs=e("code",null,"Python",-1),As={href:"https://matrix.org/blog/project/matrix-console-web/",target:"_blank",rel:"noopener noreferrer"},Ls={href:"https://github.com/matrix-org/matrix-angular-sdk",target:"_blank",rel:"noopener noreferrer"},Ms=e("code",null,"Apache",-1),Gs=e("code",null,"Javascript",-1),xs={href:"https://matrix.org/blog/project/vector/",target:"_blank",rel:"noopener noreferrer"},Ts={href:"https://github.com/vector-im/vector-web",target:"_blank",rel:"noopener noreferrer"},Is=e("code",null,"Apache",-1),Es=e("code",null,"Javascript",-1),Ds={href:"https://www.syndie.de",target:"_blank",rel:"noopener noreferrer"},Bs=e("code",null,"CC0",-1),Hs=e("code",null,"Java",-1),js={href:"https://github.com/typpo/textbelt",target:"_blank",rel:"noopener noreferrer"},Rs=e("code",null,"⚠",-1),Os=e("code",null,"MIT",-1),Fs=e("code",null,"Javascript",-1),Ns={href:"https://tox.chat/",target:"_blank",rel:"noopener noreferrer"},zs={href:"https://github.com/irungentoo/toxcore",target:"_blank",rel:"noopener noreferrer"},Ws=e("code",null,"GPLv3",-1),Js=e("code",null,"C",-1),Us={href:"https://blog.trailofbits.com/2015/12/15/self-hosted-video-chat-with-tuber/",target:"_blank",rel:"noopener noreferrer"},Vs={href:"https://github.com/trailofbits/tubertc",target:"_blank",rel:"noopener noreferrer"},qs=e("code",null,"MIT",-1),Ks=e("code",null,"Javascript",-1),Xs={href:"https://zulip.org",target:"_blank",rel:"noopener noreferrer"},Ys={href:"https://github.com/zulip/zulip",target:"_blank",rel:"noopener noreferrer"},Zs=e("code",null,"Apache/Other",-1),Qs=e("code",null,"Python",-1),$s=e("h3",{id:"email",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#email","aria-hidden":"true"},"#"),o(" Email")],-1),el=e("h4",{id:"完整方案",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#完整方案","aria-hidden":"true"},"#"),o(" 完整方案")],-1),ol=e("p",null,[e("em",null,"simple deployment of a mail server, e.g. for inexperienced or impatient admins.")],-1),rl={href:"http://www.citadel.org/",target:"_blank",rel:"noopener noreferrer"},tl={href:"http://code.citadel.org/?p=citadel.git;a=summary",target:"_blank",rel:"noopener noreferrer"},nl=e("code",null,"GPLv3",-1),sl=e("code",null,"C",-1),ll={href:"http://www.iredmail.org/",target:"_blank",rel:"noopener noreferrer"},al={href:"https://bitbucket.org/zhb/iredmail/commits/",target:"_blank",rel:"noopener noreferrer"},il=e("code",null,"GPLv3",-1),hl=e("code",null,"Shell",-1),cl={href:"https://mailcow.email/",target:"_blank",rel:"noopener noreferrer"},dl={href:"https://github.com/andryyy/mailcow",target:"_blank",rel:"noopener noreferrer"},_l=e("code",null,"GPLv2",-1),ul=e("code",null,"PHP",-1),pl={href:"https://mailinabox.email/",target:"_blank",rel:"noopener noreferrer"},fl={href:"https://github.com/mail-in-a-box/mailinabox",target:"_blank",rel:"noopener noreferrer"},gl=e("code",null,"CC0",-1),bl=e("code",null,"Shell",-1),ml={href:"http://modoboa.org/en/",target:"_blank",rel:"noopener noreferrer"},kl={href:"https://github.com/tonioo/modoboa",target:"_blank",rel:"noopener noreferrer"},wl=e("code",null,"MIT",-1),Pl=e("code",null,"Python",-1),yl=e("h4",{id:"邮件传输代理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#邮件传输代理","aria-hidden":"true"},"#"),o(" 邮件传输代理")],-1),Sl=e("p",null,[e("em",null,"MTAs / SMTP servers")],-1),vl={href:"http://www.courier-mta.org/",target:"_blank",rel:"noopener noreferrer"},Cl={href:"http://www.courier-mta.org/repo.html",target:"_blank",rel:"noopener noreferrer"},Al=e("code",null,"GPLv3",-1),Ll=e("code",null,"C",-1),Ml={href:"https://www.exim.org/",target:"_blank",rel:"noopener noreferrer"},Gl={href:"http://git.exim.org/exim.git",target:"_blank",rel:"noopener noreferrer"},xl=e("code",null,"GPLv3",-1),Tl=e("code",null,"C",-1),Il={href:"http://haraka.github.io/",target:"_blank",rel:"noopener noreferrer"},El={href:"https://github.com/haraka/Haraka",target:"_blank",rel:"noopener noreferrer"},Dl=e("code",null,"MIT",-1),Bl=e("code",null,"Javascript",-1),Hl={href:"http://mailcatcher.me/",target:"_blank",rel:"noopener noreferrer"},jl={href:"https://github.com/sj26/mailcatcher",target:"_blank",rel:"noopener noreferrer"},Rl=e("code",null,"MIT",-1),Ol=e("code",null,"Ruby",-1),Fl={href:"https://github.com/m242/maildrop",target:"_blank",rel:"noopener noreferrer"},Nl=e("code",null,"MIT",-1),zl=e("code",null,"Scala",-1),Wl={href:"https://github.com/mailhog/MailHog",target:"_blank",rel:"noopener noreferrer"},Jl=e("code",null,"MIT",-1),Ul=e("code",null,"Go",-1),Vl={href:"https://opensmtpd.org/",target:"_blank",rel:"noopener noreferrer"},ql={href:"http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.sbin/smtpd/",target:"_blank",rel:"noopener noreferrer"},Kl=e("code",null,"ISC",-1),Xl=e("code",null,"C",-1),Yl={href:"http://www.postfix.org/",target:"_blank",rel:"noopener noreferrer"},Zl=e("code",null,"IPL",-1),Ql=e("code",null,"C",-1),$l={href:"http://www.qmail.org/top.html",target:"_blank",rel:"noopener noreferrer"},ea={href:"https://sources.debian.net/src/netqmail/1.06-5/",target:"_blank",rel:"noopener noreferrer"},oa=e("code",null,"CC0",-1),ra=e("code",null,"C",-1),ta={href:"http://www.sendmail.com/sm/open_source/",target:"_blank",rel:"noopener noreferrer"},na=e("code",null,"SENDMAIL",-1),sa=e("code",null,"C",-1),la={href:"http://slimta.org",target:"_blank",rel:"noopener noreferrer"},aa={href:"https://github.com/slimta/python-slimta",target:"_blank",rel:"noopener noreferrer"},ia=e("code",null,"MIT",-1),ha=e("code",null,"Python",-1),ca=e("h4",{id:"邮件发送代理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#邮件发送代理","aria-hidden":"true"},"#"),o(" 邮件发送代理")],-1),da=e("p",null,[e("em",null,"MDAs - IMAP/POP3 software")],-1),_a={href:"http://cyrusimap.org/",target:"_blank",rel:"noopener noreferrer"},ua={href:"https://github.com/cyrusimap/cyrus-imapd",target:"_blank",rel:"noopener noreferrer"},pa=e("code",null,"BSD",-1),fa=e("code",null,"C",-1),ga={href:"http://www.dovecot.org/",target:"_blank",rel:"noopener noreferrer"},ba={href:"https://github.com/dovecot/core",target:"_blank",rel:"noopener noreferrer"},ma=e("code",null,"MIT/LGPLv2",-1),ka=e("code",null,"C",-1),wa={href:"http://www.mailpiler.org/wiki/start",target:"_blank",rel:"noopener noreferrer"},Pa={href:"https://bitbucket.org/jsuto/piler",target:"_blank",rel:"noopener noreferrer"},ya=e("code",null,"GPLv3",-1),Sa=e("code",null,"C",-1),va=e("h4",{id:"邮件列表和时讯",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#邮件列表和时讯","aria-hidden":"true"},"#"),o(" 邮件列表和时讯")],-1),Ca=e("p",null,[e("em",null,"Mailing lists servers and mass mailing software - one message to many recipients.")],-1),Aa={href:"http://dadamailproject.com/",target:"_blank",rel:"noopener noreferrer"},La={href:"https://github.com/justingit/dada-mail",target:"_blank",rel:"noopener noreferrer"},Ma=e("code",null,"GPLv2",-1),Ga=e("code",null,"Perl",-1),xa={href:"https://www.gnu.org/software/mailman/",target:"_blank",rel:"noopener noreferrer"},Ta=e("code",null,"GPL",-1),Ia=e("code",null,"Python",-1),Ea={href:"https://mailtrain.org/",target:"_blank",rel:"noopener noreferrer"},Da={href:"https://github.com/andris9/mailtrain",target:"_blank",rel:"noopener noreferrer"},Ba=e("code",null,"GPLv3",-1),Ha=e("code",null,"Nodejs",-1),ja={href:"https://www.mautic.org/",target:"_blank",rel:"noopener noreferrer"},Ra={href:"https://github.com/mautic/mautic",target:"_blank",rel:"noopener noreferrer"},Oa=e("code",null,"GPLv3",-1),Fa=e("code",null,"PHP",-1),Na={href:"https://phplist.org",target:"_blank",rel:"noopener noreferrer"},za={href:"https://github.com/phpList/",target:"_blank",rel:"noopener noreferrer"},Wa=e("code",null,"AGPLv3",-1),Ja=e("code",null,"PHP",-1),Ua={href:"https://www.sympa.org/",target:"_blank",rel:"noopener noreferrer"},Va=e("code",null,"GPLv2",-1),qa=e("code",null,"Perl",-1),Ka=e("h4",{id:"webmail-客户端",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#webmail-客户端","aria-hidden":"true"},"#"),o(" Webmail 客户端")],-1),Xa={href:"http://cypht.org/index.html",target:"_blank",rel:"noopener noreferrer"},Ya={href:"https://github.com/jasonmunro/hm3",target:"_blank",rel:"noopener noreferrer"},Za=e("code",null,"GPLv2",-1),Qa=e("code",null,"PHP",-1),$a={href:"https://www.mailpile.is/",target:"_blank",rel:"noopener noreferrer"},ei={href:"https://github.com/mailpile/Mailpile",target:"_blank",rel:"noopener noreferrer"},oi=e("code",null,"AGPLv3",-1),ri=e("code",null,"Python",-1),ti={href:"http://www.rainloop.net/",target:"_blank",rel:"noopener noreferrer"},ni={href:"http://demo.rainloop.net/",target:"_blank",rel:"noopener noreferrer"},si={href:"https://github.com/RainLoop/rainloop-webmail",target:"_blank",rel:"noopener noreferrer"},li=e("code",null,"AGPLv3",-1),ai=e("code",null,"PHP",-1),ii={href:"https://roundcube.net",target:"_blank",rel:"noopener noreferrer"},hi={href:"https://roundcube.net/screens/",target:"_blank",rel:"noopener noreferrer"},ci={href:"https://github.com/roundcube/roundcubemail/",target:"_blank",rel:"noopener noreferrer"},di=e("code",null,"GPLv3",-1),_i=e("code",null,"PHP",-1),ui={href:"http://squirrelmail.org",target:"_blank",rel:"noopener noreferrer"},pi={href:"https://sourceforge.net/p/squirrelmail/code/HEAD/tree/",target:"_blank",rel:"noopener noreferrer"},fi=e("code",null,"GPLv2",-1),gi=e("code",null,"PHP",-1),bi={href:"http://www.afterlogic.org/webmail-lite",target:"_blank",rel:"noopener noreferrer"},mi={href:"https://github.com/afterlogic/webmail-lite",target:"_blank",rel:"noopener noreferrer"},ki=e("code",null,"GPLv3",-1),wi=e("code",null,"PHP",-1),Pi=e("h3",{id:"irc",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#irc","aria-hidden":"true"},"#"),o(" IRC")],-1),yi={href:"https://en.wikipedia.org/wiki/Internet_Relay_Chat",target:"_blank",rel:"noopener noreferrer"},Si={href:"http://convos.by/",target:"_blank",rel:"noopener noreferrer"},vi={href:"http://demo.convos.by",target:"_blank",rel:"noopener noreferrer"},Ci={href:"http://github.com/nordaaker/convos",target:"_blank",rel:"noopener noreferrer"},Ai=e("code",null,"ARTv2",-1),Li=e("code",null,"Perl",-1),Mi={href:"http://ircanywhere.com/",target:"_blank",rel:"noopener noreferrer"},Gi={href:"https://github.com/ircanywhere/ircanywhere",target:"_blank",rel:"noopener noreferrer"},xi=e("code",null,"GPLv2",-1),Ti=e("code",null,"Nodejs",-1),Ii={href:"http://quassel-irc.org/",target:"_blank",rel:"noopener noreferrer"},Ei={href:"https://github.com/quassel/quassel",target:"_blank",rel:"noopener noreferrer"},Di=e("code",null,"GPLv2",-1),Bi=e("code",null,"C++",-1),Hi={href:"https://robustirc.net/",target:"_blank",rel:"noopener noreferrer"},ji={href:"https://github.com/robustirc/robustirc",target:"_blank",rel:"noopener noreferrer"},Ri=e("code",null,"BSD",-1),Oi=e("code",null,"Go",-1),Fi={href:"https://thelounge.github.io/",target:"_blank",rel:"noopener noreferrer"},Ni={href:"https://avatar.playat.ch:1000/",target:"_blank",rel:"noopener noreferrer"},zi={href:"https://github.com/thelounge/lounge",target:"_blank",rel:"noopener noreferrer"},Wi=e("code",null,"MIT",-1),Ji=e("code",null,"Nodejs",-1),Ui={href:"https://weechat.org/",target:"_blank",rel:"noopener noreferrer"},Vi=e("code",null,"GPLv3",-1),qi=e("code",null,"C",-1),Ki={href:"http://wiki.znc.in/ZNC",target:"_blank",rel:"noopener noreferrer"},Xi={href:"https://github.com/znc/znc",target:"_blank",rel:"noopener noreferrer"},Yi=e("code",null,"Apache",-1),Zi=e("code",null,"C++",-1),Qi=e("h3",{id:"sip",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#sip","aria-hidden":"true"},"#"),o(" SIP")],-1),$i={href:"https://en.wikipedia.org/wiki/Session_Initiation_Protocol",target:"_blank",rel:"noopener noreferrer"},eh={href:"http://www.asterisk.org/",target:"_blank",rel:"noopener noreferrer"},oh=e("code",null,"GPLv2",-1),rh=e("code",null,"C",-1),th={href:"https://freeswitch.org/",target:"_blank",rel:"noopener noreferrer"},nh={href:"https://freeswitch.org/stash/projects/FS/repos/freeswitch/browse",target:"_blank",rel:"noopener noreferrer"},sh=e("code",null,"MPLv2",-1),lh=e("code",null,"C",-1),ah={href:"http://www.kamailio.org/w/",target:"_blank",rel:"noopener noreferrer"},ih={href:"https://github.com/kamailio/kamailio",target:"_blank",rel:"noopener noreferrer"},hh=e("code",null,"GPLv2",-1),ch=e("code",null,"C",-1),dh={href:"https://dev.guardianproject.info/projects/ostel/wiki/Server_Documentation",target:"_blank",rel:"noopener noreferrer"},_h=e("code",null,"GPLv3",-1),uh=e("code",null,"Ruby",-1),ph=e("h3",{id:"ipbx",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ipbx","aria-hidden":"true"},"#"),o(" IPBX")],-1),fh={href:"https://en.wikipedia.org/wiki/IP_PBX",target:"_blank",rel:"noopener noreferrer"},gh={href:"http://www.elastix.org",target:"_blank",rel:"noopener noreferrer"},bh={href:"https://svn.code.sf.net/p/elastix/code/trunk/",target:"_blank",rel:"noopener noreferrer"},mh=e("code",null,"GPLv2",-1),kh=e("code",null,"PHP",-1),wh={href:"http://www.freepbx.org",target:"_blank",rel:"noopener noreferrer"},Ph={href:"http://git.freepbx.org/projects/FREEPBX",target:"_blank",rel:"noopener noreferrer"},yh=e("code",null,"GPLv2",-1),Sh=e("code",null,"PHP",-1),vh={href:"http://www.xivo.io",target:"_blank",rel:"noopener noreferrer"},Ch={href:"https://github.com/xivo-pbx",target:"_blank",rel:"noopener noreferrer"},Ah=e("code",null,"GPLv3",-1),Lh=e("code",null,"Python",-1),Mh=e("h3",{id:"社交网络与论坛",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#社交网络与论坛","aria-hidden":"true"},"#"),o(" 社交网络与论坛")],-1),Gh={href:"https://github.com/abilian/abilian-sbe",target:"_blank",rel:"noopener noreferrer"},xh=e("code",null,"LGPLv2",-1),Th=e("code",null,"Python",-1),Ih={href:"https://www.getanahita.com/",target:"_blank",rel:"noopener noreferrer"},Eh={href:"https://github.com/anahitasocial",target:"_blank",rel:"noopener noreferrer"},Dh=e("code",null,"GPLv3",-1),Bh=e("code",null,"PHP",-1),Hh={href:"http://trybootcamp.vitorfs.com",target:"_blank",rel:"noopener noreferrer"},jh={href:"https://github.com/vitorfs/bootcamp",target:"_blank",rel:"noopener noreferrer"},Rh=e("code",null,"MIT",-1),Oh=e("code",null,"Python",-1),Fh={href:"http://buddycloud.com/",target:"_blank",rel:"noopener noreferrer"},Nh={href:"https://github.com/buddycloud",target:"_blank",rel:"noopener noreferrer"},zh=e("code",null,"Apache",-1),Wh=e("code",null,"Java",-1),Jh={href:"https://buddypress.org/about/",target:"_blank",rel:"noopener noreferrer"},Uh={href:"http://WordPress.org",target:"_blank",rel:"noopener noreferrer"},Vh={href:"https://buddypress.svn.wordpress.org/trunk/",target:"_blank",rel:"noopener noreferrer"},qh=e("code",null,"GPLv2",-1),Kh=e("code",null,"PHP",-1),Xh={href:"https://diasporafoundation.org/",target:"_blank",rel:"noopener noreferrer"},Yh={href:"http://podupti.me/random.php",target:"_blank",rel:"noopener noreferrer"},Zh={href:"https://github.com/diaspora/diaspora",target:"_blank",rel:"noopener noreferrer"},Qh=e("code",null,"AGPLv3",-1),$h=e("code",null,"Ruby",-1),ec={href:"http://www.discourse.org/",target:"_blank",rel:"noopener noreferrer"},oc={href:"https://github.com/discourse/discourse",target:"_blank",rel:"noopener noreferrer"},rc=e("code",null,"GPLv2",-1),tc=e("code",null,"Ruby",-1),nc={href:"https://elgg.org/",target:"_blank",rel:"noopener noreferrer"},sc={href:"https://github.com/Elgg/Elgg",target:"_blank",rel:"noopener noreferrer"},lc=e("code",null,"GPLv2",-1),ac=e("code",null,"PHP",-1),ic={href:"http://flarum.org",target:"_blank",rel:"noopener noreferrer"},hc={href:"https://github.com/flarum/flarum",target:"_blank",rel:"noopener noreferrer"},cc=e("code",null,"MIT",-1),dc=e("code",null,"PHP",-1),_c={href:"https://flaskbb.org/",target:"_blank",rel:"noopener noreferrer"},uc={href:"https://github.com/sh4nks/flaskbb",target:"_blank",rel:"noopener noreferrer"},pc=e("code",null,"BSD",-1),fc=e("code",null,"Python",-1),gc={href:"http://fluxbb.org/",target:"_blank",rel:"noopener noreferrer"},bc={href:"https://github.com/fluxbb/fluxbb",target:"_blank",rel:"noopener noreferrer"},mc=e("code",null,"GPLv2",-1),kc=e("code",null,"PHP",-1),wc={href:"http://friendica.com/",target:"_blank",rel:"noopener noreferrer"},Pc={href:"https://github.com/friendica/friendica",target:"_blank",rel:"noopener noreferrer"},yc=e("code",null,"AGPLv3",-1),Sc=e("code",null,"PHP",-1),vc={href:"https://gnu.io/social/",target:"_blank",rel:"noopener noreferrer"},Cc={href:"https://git.gnu.io/gnu/gnu-social",target:"_blank",rel:"noopener noreferrer"},Ac=e("code",null,"AGPLv3",-1),Lc=e("code",null,"PHP",-1),Mc={href:"https://github.com/redmatrix/hubzilla",target:"_blank",rel:"noopener noreferrer"},Gc=e("code",null,"MIT",-1),xc=e("code",null,"PHP",-1),Tc={href:"https://www.humhub.org/",target:"_blank",rel:"noopener noreferrer"},Ic={href:"https://github.com/humhub/humhub",target:"_blank",rel:"noopener noreferrer"},Ec=e("code",null,"AGPLv3",-1),Dc=e("code",null,"PHP",-1),Bc={href:"http://posativ.org/isso/",target:"_blank",rel:"noopener noreferrer"},Hc={href:"https://github.com/posativ/isso",target:"_blank",rel:"noopener noreferrer"},jc=e("code",null,"MIT",-1),Rc=e("code",null,"Python",-1),Oc={href:"https://jappix.com/",target:"_blank",rel:"noopener noreferrer"},Fc={href:"https://github.com/jappix/jappix",target:"_blank",rel:"noopener noreferrer"},Nc=e("code",null,"AGPLv3",-1),zc=e("code",null,"PHP",-1),Wc={href:"https://www.loomio.org/",target:"_blank",rel:"noopener noreferrer"},Jc={href:"https://github.com/loomio/loomio",target:"_blank",rel:"noopener noreferrer"},Uc=e("code",null,"AGPLv3",-1),Vc=e("code",null,"Ruby",-1),qc={href:"https://movim.eu/",target:"_blank",rel:"noopener noreferrer"},Kc={href:"https://github.com/movim/movim",target:"_blank",rel:"noopener noreferrer"},Xc=e("code",null,"AGPLv3",-1),Yc=e("code",null,"PHP",-1),Zc={href:"http://www.mybb.com/",target:"_blank",rel:"noopener noreferrer"},Qc={href:"https://github.com/mybb/mybb",target:"_blank",rel:"noopener noreferrer"},$c=e("code",null,"LGPLv3",-1),ed=e("code",null,"PHP",-1),od={href:"http://newebe.org/",target:"_blank",rel:"noopener noreferrer"},rd={href:"https://github.com/gelnior/newebe",target:"_blank",rel:"noopener noreferrer"},td=e("code",null,"AGPLv3",-1),nd=e("code",null,"Python",-1),sd={href:"https://nodebb.org/",target:"_blank",rel:"noopener noreferrer"},ld={href:"https://github.com/NodeBB/NodeBB",target:"_blank",rel:"noopener noreferrer"},ad=e("code",null,"GPLv3",-1),id=e("code",null,"Nodejs",-1),hd={href:"https://www.opensource-socialnetwork.org/",target:"_blank",rel:"noopener noreferrer"},cd={href:"https://github.com/opensource-socialnetwork/opensource-socialnetwork",target:"_blank",rel:"noopener noreferrer"},dd=e("code",null,"GPLv2",-1),_d=e("code",null,"PHP",-1),ud={href:"http://www.oxwall.org/",target:"_blank",rel:"noopener noreferrer"},pd={href:"https://bitbucket.org/oxwall/public",target:"_blank",rel:"noopener noreferrer"},fd=e("code",null,"CPALv1",-1),gd=e("code",null,"PHP",-1),bd={href:"https://www.phpbb.com/",target:"_blank",rel:"noopener noreferrer"},md={href:"https://github.com/phpbb/phpbb",target:"_blank",rel:"noopener noreferrer"},kd=e("code",null,"GPLv2",-1),wd=e("code",null,"PHP",-1),Pd={href:"https://github.com/pixelpark/ppnet",target:"_blank",rel:"noopener noreferrer"},yd=e("code",null,"MIT",-1),Sd=e("code",null,"Javascript",-1),vd={href:"http://pump.io/",target:"_blank",rel:"noopener noreferrer"},Cd={href:"https://github.com/e14n/pump.io",target:"_blank",rel:"noopener noreferrer"},Ad=e("code",null,"Apache",-1),Ld=e("code",null,"Nodejs",-1),Md={href:"https://www.reddit.com/",target:"_blank",rel:"noopener noreferrer"},Gd={href:"https://www.reddit.com/",target:"_blank",rel:"noopener noreferrer"},xd={href:"https://github.com/reddit/reddit",target:"_blank",rel:"noopener noreferrer"},Td=e("code",null,"CPALv1",-1),Id=e("code",null,"Python",-1),Ed={href:"https://github.com/redmatrix/redmatrix",target:"_blank",rel:"noopener noreferrer"},Dd=e("code",null,"MIT",-1),Bd=e("code",null,"PHP",-1),Hd={href:"http://twister.net.co/",target:"_blank",rel:"noopener noreferrer"},jd={href:"https://github.com/miguelfreitas/twister-core",target:"_blank",rel:"noopener noreferrer"},Rd=e("code",null,"BSD/MIT",-1),Od=e("code",null,"C++",-1),Fd={href:"https://vanillaforums.org/",target:"_blank",rel:"noopener noreferrer"},Nd={href:"https://github.com/vanilla/vanilla",target:"_blank",rel:"noopener noreferrer"},zd=e("code",null,"GPLv2",-1),Wd=e("code",null,"PHP",-1),Jd=e("h3",{id:"xmpp",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#xmpp","aria-hidden":"true"},"#"),o(" XMPP")],-1),Ud={href:"https://en.wikipedia.org/wiki/XMPP",target:"_blank",rel:"noopener noreferrer"},Vd=e("h4",{id:"xmpp-服务器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#xmpp-服务器","aria-hidden":"true"},"#"),o(" XMPP 服务器")],-1),qd={href:"https://www.ejabberd.im/",target:"_blank",rel:"noopener noreferrer"},Kd={href:"https://github.com/processone/ejabberd",target:"_blank",rel:"noopener noreferrer"},Xd=e("code",null,"GPL",-1),Yd=e("code",null,"Erlang",-1),Zd={href:"http://kontalk.org/",target:"_blank",rel:"noopener noreferrer"},Qd={href:"https://github.com/kontalk",target:"_blank",rel:"noopener noreferrer"},$d=e("code",null,"GPLv3",-1),e_=e("code",null,"Java",-1),o_={href:"https://lightwitch.org/metronome",target:"_blank",rel:"noopener noreferrer"},r_={href:"http://code.lightwitch.org/",target:"_blank",rel:"noopener noreferrer"},t_=e("code",null,"MIT",-1),n_=e("code",null,"Lua",-1),s_={href:"https://www.erlang-solutions.com/products/mongooseim.html",target:"_blank",rel:"noopener noreferrer"},l_={href:"https://github.com/esl/MongooseIM",target:"_blank",rel:"noopener noreferrer"},a_=e("code",null,"MIT",-1),i_=e("code",null,"Erlang",-1),h_={href:"http://www.igniterealtime.org/projects/openfire/",target:"_blank",rel:"noopener noreferrer"},c_={href:"https://github.com/igniterealtime/Openfire",target:"_blank",rel:"noopener noreferrer"},d_=e("code",null,"Apache",-1),__=e("code",null,"Java",-1),u_={href:"http://prosody.im/",target:"_blank",rel:"noopener noreferrer"},p_={href:"http://hg.prosody.im/",target:"_blank",rel:"noopener noreferrer"},f_=e("code",null,"MIT",-1),g_=e("code",null,"Lua",-1),b_={href:"http://www.tigase.net/content/tigase-xmpp-server",target:"_blank",rel:"noopener noreferrer"},m_=e("code",null,"GPLv3",-1),k_=e("code",null,"Java",-1),w_=e("h4",{id:"xmpp-web-客户端",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#xmpp-web-客户端","aria-hidden":"true"},"#"),o(" XMPP Web 客户端")],-1),P_={href:"http://candy-chat.github.io/candy/",target:"_blank",rel:"noopener noreferrer"},y_={href:"https://github.com/candy-chat/candy",target:"_blank",rel:"noopener noreferrer"},S_=e("code",null,"MIT",-1),v_=e("code",null,"Javascript",-1),C_={href:"https://conversejs.org/",target:"_blank",rel:"noopener noreferrer"},A_={href:"https://github.com/jcbrand/converse.js",target:"_blank",rel:"noopener noreferrer"},L_=e("code",null,"MPLv2",-1),M_=e("code",null,"Javascript",-1),G_={href:"http://getkaiwa.com/",target:"_blank",rel:"noopener noreferrer"},x_={href:"https://github.com/digicoop/kaiwa",target:"_blank",rel:"noopener noreferrer"},T_=e("code",null,"MIT",-1),I_=e("code",null,"NodeJS",-1),E_={href:"http://www.salut-a-toi.org/",target:"_blank",rel:"noopener noreferrer"},D_={href:"http://repos.goffi.org/sat",target:"_blank",rel:"noopener noreferrer"},B_=e("code",null,"AGPLv3",-1),H_=e("code",null,"Python",-1),j_={href:"http://wiki.goffi.org/wiki/Libervia/en",target:"_blank",rel:"noopener noreferrer"},R_={href:"http://repos.goffi.org/libervia",target:"_blank",rel:"noopener noreferrer"},O_=e("code",null,"AGPLv3",-1),F_=e("code",null,"Python",-1),N_=e("h2",{id:"内容管理系统-cms",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#内容管理系统-cms","aria-hidden":"true"},"#"),o(" 内容管理系统 (CMS)")],-1),z_=e("p",null,[o("CMS are a practical way to setup a website with many features. CMS often come with third party plugins, themes and functionality that is easy to add and customize to your needs. See also "),e("a",{href:"#blogging-platforms"},"Blogging Platforms"),o(" and "),e("a",{href:"#static-site-generators"},"Static Site Generators")],-1),W_={href:"http://www.99ko.org/",target:"_blank",rel:"noopener noreferrer"},J_={href:"https://github.com/99ko-project/99ko-cms",target:"_blank",rel:"noopener noreferrer"},U_={href:"http://apostrophenow.org/",target:"_blank",rel:"noopener noreferrer"},V_={href:"http://demo.apostrophenow.com/",target:"_blank",rel:"noopener noreferrer"},q_={href:"https://github.com/punkave/apostrophe",target:"_blank",rel:"noopener noreferrer"},K_=e("code",null,"MIT",-1),X_=e("code",null,"NodeJS",-1),Y_={href:"http://bauncms.com/",target:"_blank",rel:"noopener noreferrer"},Z_={href:"https://github.com/BaunCMS/Baun",target:"_blank",rel:"noopener noreferrer"},Q_=e("code",null,"MIT",-1),$_=e("code",null,"PHP",-1),eu={href:"https://www.bigtreecms.org/",target:"_blank",rel:"noopener noreferrer"},ou={href:"https://github.com/bigtreecms/BigTree-CMS",target:"_blank",rel:"noopener noreferrer"},ru=e("code",null,"LGPLv2",-1),tu=e("code",null,"PHP",-1),nu={href:"http://www.cmsmadesimple.org/",target:"_blank",rel:"noopener noreferrer"},su={href:"http://svn.cmsmadesimple.org/svn/cmsmadesimple/trunk/",target:"_blank",rel:"noopener noreferrer"},lu=e("code",null,"GPL",-1),au=e("code",null,"PHP",-1),iu={href:"http://www.concrete5.org/",target:"_blank",rel:"noopener noreferrer"},hu={href:"https://github.com/concrete5/concrete5",target:"_blank",rel:"noopener noreferrer"},cu=e("code",null,"MIT",-1),du=e("code",null,"PHP",-1),_u={href:"http://www.couchcms.com/",target:"_blank",rel:"noopener noreferrer"},uu={href:"https://github.com/CouchCMS/CouchCMS",target:"_blank",rel:"noopener noreferrer"},pu=e("code",null,"CPALv1",-1),fu=e("code",null,"PHP",-1),gu={href:"http://getdirectus.com/",target:"_blank",rel:"noopener noreferrer"},bu={href:"https://github.com/directus/directus",target:"_blank",rel:"noopener noreferrer"},mu=e("code",null,"GPL",-1),ku=e("code",null,"PHP",-1),wu={href:"https://www.drupal.org/",target:"_blank",rel:"noopener noreferrer"},Pu={href:"http://cgit.drupalcode.org/drupal",target:"_blank",rel:"noopener noreferrer"},yu=e("code",null,"GPL",-1),Su=e("code",null,"PHP",-1),vu={href:"http://www.elabftw.net",target:"_blank",rel:"noopener noreferrer"},Cu={href:"https://github.com/elabftw/elabftw",target:"_blank",rel:"noopener noreferrer"},Au={href:"https://demo.elabftw.net",target:"_blank",rel:"noopener noreferrer"},Lu=e("code",null,"AGPLv3",-1),Mu=e("code",null,"PHP",-1),Gu={href:"http://get-simple.info/",target:"_blank",rel:"noopener noreferrer"},xu=e("code",null,"GPLv3",-1),Tu={href:"https://www.impresspages.org/",target:"_blank",rel:"noopener noreferrer"},Iu={href:"https://www.impresspages.org/demo",target:"_blank",rel:"noopener noreferrer"},Eu={href:"https://github.com/impresspages/ImpressPages",target:"_blank",rel:"noopener noreferrer"},Du=e("code",null,"GPLv3",-1),Bu=e("code",null,"MIT",-1),Hu=e("code",null,"PHP",-1),ju={href:"https://www.joomla.org/",target:"_blank",rel:"noopener noreferrer"},Ru={href:"http://joomlacode.org/gf/project/joomla/scmsvn/",target:"_blank",rel:"noopener noreferrer"},Ou=e("code",null,"GPL",-1),Fu=e("code",null,"PHP",-1),Nu={href:"http://keystonejs.com/",target:"_blank",rel:"noopener noreferrer"},zu={href:"http://demo.keystonejs.com/",target:"_blank",rel:"noopener noreferrer"},Wu={href:"https://github.com/keystonejs/keystone",target:"_blank",rel:"noopener noreferrer"},Ju=e("code",null,"MIT",-1),Uu=e("code",null,"NodeJS",-1),Vu={href:"http://modx.com/",target:"_blank",rel:"noopener noreferrer"},qu={href:"https://github.com/modxcms/revolution",target:"_blank",rel:"noopener noreferrer"},Ku=e("code",null,"GPLv2",-1),Xu=e("code",null,"PHP",-1),Yu={href:"https://www.neos.io",target:"_blank",rel:"noopener noreferrer"},Zu={href:"https://git.typo3.org/Packages/TYPO3.Neos.git",target:"_blank",rel:"noopener noreferrer"},Qu=e("code",null,"GPLv3",-1),$u=e("code",null,"PHP",-1),ep={href:"http://octobercms.com/",target:"_blank",rel:"noopener noreferrer"},op={href:"https://github.com/octobercms/october",target:"_blank",rel:"noopener noreferrer"},rp=e("code",null,"MIT",-1),tp=e("code",null,"PHP",-1),np={href:"http://omeka.org",target:"_blank",rel:"noopener noreferrer"},sp={href:"http://omeka.org/showcase/",target:"_blank",rel:"noopener noreferrer"},lp={href:"https://github.com/omeka/Omeka",target:"_blank",rel:"noopener noreferrer"},ap=e("code",null,"GPLv3",-1),ip=e("code",null,"PHP",-1),hp={href:"https://pagekit.com/",target:"_blank",rel:"noopener noreferrer"},cp={href:"https://github.com/pagekit/pagekit",target:"_blank",rel:"noopener noreferrer"},dp=e("code",null,"MIT",-1),_p=e("code",null,"PHP",-1),up={href:"http://picocms.org/",target:"_blank",rel:"noopener noreferrer"},pp={href:"https://github.com/picocms/Pico",target:"_blank",rel:"noopener noreferrer"},fp=e("code",null,"MIT",-1),gp=e("code",null,"PHP",-1),bp={href:"https://www.pimcore.org/",target:"_blank",rel:"noopener noreferrer"},mp={href:"https://github.com/pimcore/pimcore",target:"_blank",rel:"noopener noreferrer"},kp=e("code",null,"BSD",-1),wp=e("code",null,"PHP",-1),Pp={href:"https://plone.org/",target:"_blank",rel:"noopener noreferrer"},yp={href:"https://github.com/plone",target:"_blank",rel:"noopener noreferrer"},Sp=e("code",null,"Zope",-1),vp=e("code",null,"Python",-1),Cp={href:"http://publify.co/",target:"_blank",rel:"noopener noreferrer"},Ap={href:"http://demo.publify.co/",target:"_blank",rel:"noopener noreferrer"},Lp={href:"https://github.com/publify/publify",target:"_blank",rel:"noopener noreferrer"},Mp=e("code",null,"MIT",-1),Gp=e("code",null,"Ruby",-1),xp=e("a",{href:"http:/redaxscript.com"},"Redaxscript",-1),Tp={href:"http://demo.redaxscript.com/demo/login",target:"_blank",rel:"noopener noreferrer"},Ip={href:"https://github.com/redaxmedia/redaxscript",target:"_blank",rel:"noopener noreferrer"},Ep=e("code",null,"GPLv3",-1),Dp=e("code",null,"PHP",-1),Bp={href:"https://www.roadiz.io/",target:"_blank",rel:"noopener noreferrer"},Hp={href:"https://github.com/roadiz/roadiz/",target:"_blank",rel:"noopener noreferrer"},jp=e("code",null,"MIT",-1),Rp=e("code",null,"PHP",-1),Op={href:"https://www.silverstripe.org",target:"_blank",rel:"noopener noreferrer"},Fp={href:"http://demo.silverstripe.org/",target:"_blank",rel:"noopener noreferrer"},Np={href:"https://github.com/silverstripe",target:"_blank",rel:"noopener noreferrer"},zp=e("code",null,"BSD",-1),Wp=e("code",null,"PHP",-1),Jp={href:"http://www.sphido.org/",target:"_blank",rel:"noopener noreferrer"},Up={href:"https://github.com/sphido/cms",target:"_blank",rel:"noopener noreferrer"},Vp=e("code",null,"MIT",-1),qp=e("code",null,"PHP",-1),Kp={href:"http://www.spip.net/fr",target:"_blank",rel:"noopener noreferrer"},Xp={href:"https://core.spip.net/projects/spip/repository",target:"_blank",rel:"noopener noreferrer"},Yp=e("code",null,"GPLv2",-1),Zp=e("code",null,"PHP",-1),Qp={href:"http://www.subrion.org",target:"_blank",rel:"noopener noreferrer"},$p={href:"http://demos.subrion.com",target:"_blank",rel:"noopener noreferrer"},ef={href:"https://github.com/intelliants/subrion",target:"_blank",rel:"noopener noreferrer"},of=e("code",null,"GPLv3",-1),rf=e("code",null,"PHP",-1),tf={href:"http://textpattern.com/",target:"_blank",rel:"noopener noreferrer"},nf={href:"http://textpattern.co/demo",target:"_blank",rel:"noopener noreferrer"},sf={href:"https://github.com/textpattern/textpattern",target:"_blank",rel:"noopener noreferrer"},lf=e("code",null,"GPLv2",-1),af=e("code",null,"PHP",-1),hf={href:"https://typo3.org/",target:"_blank",rel:"noopener noreferrer"},cf={href:"https://github.com/TYPO3/TYPO3.CMS",target:"_blank",rel:"noopener noreferrer"},df=e("code",null,"GPLv2",-1),_f=e("code",null,"PHP",-1),uf={href:"https://umbraco.com/",target:"_blank",rel:"noopener noreferrer"},pf={href:"https://github.com/umbraco/Umbraco-CMS",target:"_blank",rel:"noopener noreferrer"},ff=e("code",null,"MIT",-1),gf=e("code",null,".NET",-1),bf={href:"https://wordpress.org/",target:"_blank",rel:"noopener noreferrer"},mf={href:"https://github.com/WordPress/WordPress",target:"_blank",rel:"noopener noreferrer"},kf=e("code",null,"GPLv2",-1),wf=e("code",null,"PHP",-1),Pf=e("p",null,[e("em",null,"Recipe management")],-1),yf={href:"http://www.openeats.org/",target:"_blank",rel:"noopener noreferrer"},Sf={href:"https://github.com/qgriffith/OpenEats",target:"_blank",rel:"noopener noreferrer"},vf=e("code",null,"BSD",-1),Cf=e("code",null,"Python/Django",-1),Af=e("h3",{id:"电子商务",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#电子商务","aria-hidden":"true"},"#"),o(" 电子商务")],-1),Lf={href:"https://www.attendize.com/",target:"_blank",rel:"noopener noreferrer"},Mf={href:"https://www.attendize.com/documentation.php#demo",target:"_blank",rel:"noopener noreferrer"},Gf={href:"https://github.com/attendize/attendize",target:"_blank",rel:"noopener noreferrer"},xf=e("code",null,"AAL",-1),Tf=e("code",null,"PHP",-1),If={href:"https://www.coreshop.org",target:"_blank",rel:"noopener noreferrer"},Ef={href:"https://github.com/coreshop/CoreShop",target:"_blank",rel:"noopener noreferrer"},Df=e("code",null,"GPLv3",-1),Bf=e("code",null,"PHP",-1),Hf={href:"https://magento.com/",target:"_blank",rel:"noopener noreferrer"},jf={href:"https://magento.com/schedule-a-demo",target:"_blank",rel:"noopener noreferrer"},Rf={href:"https://github.com/magento/magento2",target:"_blank",rel:"noopener noreferrer"},Of=e("code",null,"OSLv3",-1),Ff=e("code",null,"PHP",-1),Nf={href:"https://microweber.com/",target:"_blank",rel:"noopener noreferrer"},zf={href:"http://demo.microweber.org/",target:"_blank",rel:"noopener noreferrer"},Wf={href:"https://github.com/microweber/microweber",target:"_blank",rel:"noopener noreferrer"},Jf=e("code",null,"Apache",-1),Uf=e("code",null,"PHP",-1),Vf={href:"https://www.opencart.com",target:"_blank",rel:"noopener noreferrer"},qf={href:"https://github.com/opencart/opencart",target:"_blank",rel:"noopener noreferrer"},Kf=e("code",null,"GPLv3",-1),Xf=e("code",null,"PHP",-1),Yf={href:"http://open-classifieds.com/",target:"_blank",rel:"noopener noreferrer"},Zf={href:"https://github.com/open-classifieds/openclassifieds2",target:"_blank",rel:"noopener noreferrer"},Qf=e("code",null,"GPL",-1),$f=e("code",null,"PHP",-1),eg={href:"https://open-eshop.com/",target:"_blank",rel:"noopener noreferrer"},og={href:"https://github.com/open-classifieds/open-eshop",target:"_blank",rel:"noopener noreferrer"},rg=e("code",null,"GPL",-1),tg=e("code",null,"PHP",-1),ng={href:"http://oxidforge.org",target:"_blank",rel:"noopener noreferrer"},sg={href:"http://demoshop.oxid-esales.com/community-edition/",target:"_blank",rel:"noopener noreferrer"},lg={href:"https://github.com/OXID-eSales/oxideshop_ce",target:"_blank",rel:"noopener noreferrer"},ag=e("code",null,"GPLv3",-1),ig=e("code",null,"PHP",-1),hg={href:"https://www.prestashop.com/",target:"_blank",rel:"noopener noreferrer"},cg={href:"http://demo.prestashop.com/",target:"_blank",rel:"noopener noreferrer"},dg={href:"https://github.com/PrestaShop/PrestaShop",target:"_blank",rel:"noopener noreferrer"},_g=e("code",null,"OSLv3",-1),ug=e("code",null,"PHP",-1),pg={href:"https://www.shoop.io/",target:"_blank",rel:"noopener noreferrer"},fg={href:"https://demo1.shoop.io/",target:"_blank",rel:"noopener noreferrer"},gg={href:"https://demo2.shoop.io/",target:"_blank",rel:"noopener noreferrer"},bg={href:"https://github.com/shoopio/shoop",target:"_blank",rel:"noopener noreferrer"},mg=e("code",null,"AGPLv3",-1),kg=e("code",null,"Python",-1),wg={href:"http://sylius.org/",target:"_blank",rel:"noopener noreferrer"},Pg={href:"http://sylius.org/demo",target:"_blank",rel:"noopener noreferrer"},yg={href:"https://github.com/Sylius/Sylius",target:"_blank",rel:"noopener noreferrer"},Sg=e("code",null,"MIT",-1),vg=e("code",null,"PHP",-1),Cg={href:"http://thelia.net/",target:"_blank",rel:"noopener noreferrer"},Ag={href:"http://demo.thelia.net/",target:"_blank",rel:"noopener noreferrer"},Lg={href:"https://github.com/thelia/thelia",target:"_blank",rel:"noopener noreferrer"},Mg=e("code",null,"LGPL",-1),Gg=e("code",null,"PHP",-1),xg={href:"https://www.woothemes.com/woocommerce/",target:"_blank",rel:"noopener noreferrer"},Tg={href:"https://github.com/woothemes/woocommerce",target:"_blank",rel:"noopener noreferrer"},Ig=e("code",null,"GPL",-1),Eg=e("code",null,"PHP",-1),Dg=e("h2",{id:"dns",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#dns","aria-hidden":"true"},"#"),o(" DNS")],-1),Bg={href:"https://github.com/n1trux/awesome-sysadmin#dns",target:"_blank",rel:"noopener noreferrer"},Hg=e("h2",{id:"文档归档",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#文档归档","aria-hidden":"true"},"#"),o(" 文档归档")],-1),jg={href:"https://www.cups.org/",target:"_blank",rel:"noopener noreferrer"},Rg={href:"https://www.cups.org/software.php",target:"_blank",rel:"noopener noreferrer"},Og=e("code",null,"GPLv2",-1),Fg=e("code",null,"C",-1),Ng={href:"https://github.com/danielquinn/paperless",target:"_blank",rel:"noopener noreferrer"},zg=e("code",null,"GPLv3",-1),Wg=e("code",null,"Python",-1),Jg={href:"http://sane-project.org/",target:"_blank",rel:"noopener noreferrer"},Ug={href:"http://www.sane-project.org/cvs.html",target:"_blank",rel:"noopener noreferrer"},Vg=e("code",null,"GPLv2",-1),qg=e("code",null,"C",-1),Kg=e("h2",{id:"企业资源规划-erp",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#企业资源规划-erp","aria-hidden":"true"},"#"),o(" 企业资源规划 ERP")],-1),Xg={href:"https://erpnext.com",target:"_blank",rel:"noopener noreferrer"},Yg={href:"https://demo.erpnext.com",target:"_blank",rel:"noopener noreferrer"},Zg={href:"https://github.com/frappe/erpnext",target:"_blank",rel:"noopener noreferrer"},Qg=e("code",null,"GPLv3",-1),$g=e("code",null,"Python",-1),eb={href:"http://odoo.com",target:"_blank",rel:"noopener noreferrer"},ob={href:"https://demo.odoo.com/",target:"_blank",rel:"noopener noreferrer"},rb={href:"https://github.com/odoo/odoo",target:"_blank",rel:"noopener noreferrer"},tb=e("code",null,"LGPLv3",-1),nb=e("code",null,"Python",-1),sb={href:"http://www.tryton.org/",target:"_blank",rel:"noopener noreferrer"},lb={href:"http://demo.tryton.org/",target:"_blank",rel:"noopener noreferrer"},ab={href:"https://hg.tryton.org/",target:"_blank",rel:"noopener noreferrer"},ib=e("code",null,"GPLv3",-1),hb=e("code",null,"Python/Javascript",-1),cb=e("h2",{id:"联合身份-认证",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#联合身份-认证","aria-hidden":"true"},"#"),o(" 联合身份/认证")],-1),db={href:"http://freeradius.org/",target:"_blank",rel:"noopener noreferrer"},_b={href:"https://github.com/FreeRADIUS/freeradius-server",target:"_blank",rel:"noopener noreferrer"},ub=e("code",null,"GPLv2",-1),pb=e("code",null,"C",-1),fb={href:"http://www.daloradius.com",target:"_blank",rel:"noopener noreferrer"},gb={href:"https://github.com/lirantal/daloradius",target:"_blank",rel:"noopener noreferrer"},bb=e("code",null,"GPLv2",-1),mb={href:"https://www.freeipa.org/",target:"_blank",rel:"noopener noreferrer"},kb=e("code",null,"Multiple",-1),wb=e("code",null,"C",-1),Pb={href:"https://indieauth.com",target:"_blank",rel:"noopener noreferrer"},yb={href:"http://microformats.org/wiki/relmeauth",target:"_blank",rel:"noopener noreferrer"},Sb=e("code",null,"Apache",-1),vb=e("code",null,"Ruby",-1),Cb={href:"https://www.libravatar.org/",target:"_blank",rel:"noopener noreferrer"},Ab={href:"https://www.libravatar.org/account/new/",target:"_blank",rel:"noopener noreferrer"},Lb={href:"https://github.com/libravatar/libravatar",target:"_blank",rel:"noopener noreferrer"},Mb=e("code",null,"AGPLv3",-1),Gb=e("code",null,"Python",-1),xb={href:"https://pki.openca.org/projects/ocspd/",target:"_blank",rel:"noopener noreferrer"},Tb={href:"https://en.wikipedia.org/wiki/Online_Certificate_Status_Protocol",target:"_blank",rel:"noopener noreferrer"},Ib={href:"http://openid.net/developers/libraries/",target:"_blank",rel:"noopener noreferrer"},Eb={href:"https://www.osiam.org",target:"_blank",rel:"noopener noreferrer"},Db={href:"https://github.com/osiam/osiam",target:"_blank",rel:"noopener noreferrer"},Bb=e("code",null,"MIT",-1),Hb=e("code",null,"Java",-1),jb=e("h2",{id:"feed-阅读器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#feed-阅读器","aria-hidden":"true"},"#"),o(" Feed 阅读器")],-1),Rb={href:"https://www.commafeed.com/",target:"_blank",rel:"noopener noreferrer"},Ob={href:"https://github.com/Athou/commafeed",target:"_blank",rel:"noopener noreferrer"},Fb=e("code",null,"Java",-1),Nb={href:"https://github.com/piero-la-lune/Creaky-Coot",target:"_blank",rel:"noopener noreferrer"},zb=e("code",null,"PHP",-1),Wb={href:"https://feedbin.com/",target:"_blank",rel:"noopener noreferrer"},Jb={href:"https://github.com/feedbin/feedbin",target:"_blank",rel:"noopener noreferrer"},Ub=e("code",null,"Ruby",-1),Vb={href:"https://feedhq.org/",target:"_blank",rel:"noopener noreferrer"},qb={href:"https://github.com/feedhq/feedhq",target:"_blank",rel:"noopener noreferrer"},Kb=e("code",null,"Python",-1),Xb={href:"http://freshrss.org/",target:"_blank",rel:"noopener noreferrer"},Yb={href:"http://demo.freshrss.org/i/",target:"_blank",rel:"noopener noreferrer"},Zb={href:"https://github.com/FreshRSS/FreshRSS",target:"_blank",rel:"noopener noreferrer"},Qb={href:"https://github.com/Alkarex/EasyRSS",target:"_blank",rel:"noopener noreferrer"},$b=e("code",null,"AGPLv3",-1),e1=e("code",null,"PHP",-1),o1={href:"http://1pxsolidblack.pl/jarr-en.html",target:"_blank",rel:"noopener noreferrer"},r1={href:"https://jarr.info/login?next=%2F",target:"_blank",rel:"noopener noreferrer"},t1={href:"https://github.com/jaesivsm/JARR",target:"_blank",rel:"noopener noreferrer"},n1=e("code",null,"AGPLv3",-1),s1=e("code",null,"Python",-1),l1={href:"http://tontof.net/kriss/feed/",target:"_blank",rel:"noopener noreferrer"},a1={href:"http://tontof.net/feed/",target:"_blank",rel:"noopener noreferrer"},i1={href:"https://github.com/tontof/kriss_feed/",target:"_blank",rel:"noopener noreferrer"},h1=e("code",null,"PHP",-1),c1={href:"http://leed.idleman.fr",target:"_blank",rel:"noopener noreferrer"},d1={href:"https://github.com/ldleman/Leed",target:"_blank",rel:"noopener noreferrer"},_1=e("code",null,"PHP",-1),u1={href:"https://github.com/socketubs/leselys",target:"_blank",rel:"noopener noreferrer"},p1=e("code",null,"Python",-1),f1={href:"http://cubny.com/lite-reader/",target:"_blank",rel:"noopener noreferrer"},g1={href:"https://github.com/cubny/lite-reader",target:"_blank",rel:"noopener noreferrer"},b1=e("code",null,"PHP",-1),m1={href:"http://moonmoon.org/",target:"_blank",rel:"noopener noreferrer"},k1={href:"https://github.com/mauricesvay/moonmoon",target:"_blank",rel:"noopener noreferrer"},w1=e("code",null,"BSD",-1),P1=e("code",null,"PHP",-1),y1={href:"https://miniflux.net/",target:"_blank",rel:"noopener noreferrer"},S1={href:"https://github.com/miniflux/miniflux",target:"_blank",rel:"noopener noreferrer"},v1=e("code",null,"PHP",-1),C1={href:"https://github.com/samuelclay/NewsBlur",target:"_blank",rel:"noopener noreferrer"},A1=e("code",null,"Python",-1),L1={href:"http://reader.nunux.org/",target:"_blank",rel:"noopener noreferrer"},M1={href:"https://github.com/ncarlier/nunux-reader",target:"_blank",rel:"noopener noreferrer"},G1=e("code",null,"GPLv3",-1),x1=e("code",null,"Nodejs",-1),T1={href:"http://readerself.com/",target:"_blank",rel:"noopener noreferrer"},I1={href:"https://github.com/readerself/readerself",target:"_blank",rel:"noopener noreferrer"},E1=e("code",null,"PHP",-1),D1={href:"https://github.com/pabloprieto/Readr",target:"_blank",rel:"noopener noreferrer"},B1=e("code",null,"PHP",-1),H1={href:"http://www.allthingsrss.com/rss2email/",target:"_blank",rel:"noopener noreferrer"},j1=e("code",null,"GPL",-1),R1=e("code",null,"Python",-1),O1={href:"http://www.rssminer.net/",target:"_blank",rel:"noopener noreferrer"},F1={href:"https://github.com/shenfeng/rssminer",target:"_blank",rel:"noopener noreferrer"},N1=e("code",null,"Clojure",-1),z1={href:"https://github.com/pietheinstrengholt/rssmonster",target:"_blank",rel:"noopener noreferrer"},W1=e("code",null,"MIT",-1),J1=e("code",null,"PHP",-1),U1={href:"https://github.com/herrbischoff/screaming-liquid-tiger",target:"_blank",rel:"noopener noreferrer"},V1=e("code",null,"MIT",-1),q1=e("code",null,"PHP",-1),K1={href:"http://selfoss.aditu.de/",target:"_blank",rel:"noopener noreferrer"},X1={href:"https://github.com/SSilence/selfoss",target:"_blank",rel:"noopener noreferrer"},Y1=e("code",null,"AGPLv3",-1),Z1=e("code",null,"PHP",-1),Q1={href:"https://github.com/swanson/stringer",target:"_blank",rel:"noopener noreferrer"},$1=e("code",null,"MIT",-1),em=e("code",null,"Ruby",-1),om={href:"https://tt-rss.org/gitlab/fox/tt-rss",target:"_blank",rel:"noopener noreferrer"},rm={href:"http://framanews.org/",target:"_blank",rel:"noopener noreferrer"},tm=e("code",null,"GPLv3",-1),nm=e("code",null,"PHP",-1),sm={href:"http://gritttt-rss.nicolashoening.de/",target:"_blank",rel:"noopener noreferrer"},lm={href:"https://github.com/nhoening/gritttt-rss",target:"_blank",rel:"noopener noreferrer"},am=e("code",null,"BSD",-1),im=e("code",null,"Python",-1),hm={href:"https://github.com/mboinet/ttrss-mobile",target:"_blank",rel:"noopener noreferrer"},cm=e("code",null,"AGPLv3",-1),dm=e("code",null,"Nodejs",-1),_m={href:"https://github.com/kucrut/ttrss-reader",target:"_blank",rel:"noopener noreferrer"},um=e("code",null,"GPLv2",-1),pm=e("code",null,"Javascript",-1),fm=n('

        文件共享和同步

        Some Groupware solutions also feature file sharing and synchronization.

        分布式文件系统

        ',3),gm={href:"https://camlistore.org/",target:"_blank",rel:"noopener noreferrer"},bm={href:"https://github.com/camlistore/camlistore",target:"_blank",rel:"noopener noreferrer"},mm=e("code",null,"Apache",-1),km=e("code",null,"Go",-1),wm={href:"https://www.gluster.org",target:"_blank",rel:"noopener noreferrer"},Pm={href:"https://github.com/gluster/glusterfs",target:"_blank",rel:"noopener noreferrer"},ym=e("code",null,"LGPLv3/GPLv2",-1),Sm=e("code",null,"C",-1),vm={href:"https://github.com/ipfs/go-ipfs",target:"_blank",rel:"noopener noreferrer"},Cm={href:"http://ipfs.io/",target:"_blank",rel:"noopener noreferrer"},Am={href:"http://ori.scs.stanford.edu/",target:"_blank",rel:"noopener noreferrer"},Lm={href:"https://bitbucket.org/orifs/ori/wiki/Home",target:"_blank",rel:"noopener noreferrer"},Mm=e("code",null,"MIT",-1),Gm=e("code",null,"C++",-1),xm={href:"http://docs.openstack.org/developer/swift/",target:"_blank",rel:"noopener noreferrer"},Tm={href:"https://www.tahoe-lafs.org/trac/tahoe-lafs",target:"_blank",rel:"noopener noreferrer"},Im=e("h4",{id:"文件传输-同步",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#文件传输-同步","aria-hidden":"true"},"#"),o(" 文件传输/同步")],-1),Em={href:"http://git-annex.branchable.com/assistant/quickstart/",target:"_blank",rel:"noopener noreferrer"},Dm={href:"https://kinto.readthedocs.org",target:"_blank",rel:"noopener noreferrer"},Bm={href:"https://github.com/Kinto",target:"_blank",rel:"noopener noreferrer"},Hm=e("code",null,"Apache 2.0",-1),jm=e("code",null,"Python",-1),Rm={href:"https://nextcloud.com/",target:"_blank",rel:"noopener noreferrer"},Om={href:"https://github.com/nextcloud/server",target:"_blank",rel:"noopener noreferrer"},Fm=e("code",null,"MIT",-1),Nm=e("code",null,"PHP",-1),zm={href:"http://www.openssh.com/",target:"_blank",rel:"noopener noreferrer"},Wm={href:"http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh",target:"_blank",rel:"noopener noreferrer"},Jm=e("code",null,"BSD",-1),Um=e("code",null,"C",-1),Vm={href:"https://www.samba.org/",target:"_blank",rel:"noopener noreferrer"},qm={href:"https://git.samba.org/samba.git/",target:"_blank",rel:"noopener noreferrer"},Km=e("code",null,"GPLv3",-1),Xm=e("code",null,"C",-1),Ym={href:"https://www.seafile.com/en/home/",target:"_blank",rel:"noopener noreferrer"},Zm={href:"https://seacloud.cc/demo",target:"_blank",rel:"noopener noreferrer"},Qm=e("code",null,"GPLv2",-1),$m={href:"http://sparkleshare.org/",target:"_blank",rel:"noopener noreferrer"},ek={href:"https://www.syncany.org/",target:"_blank",rel:"noopener noreferrer"},ok=e("code",null,"GPLv3",-1),rk=e("code",null,"Java",-1),tk={href:"https://syncthing.net/",target:"_blank",rel:"noopener noreferrer"},nk={href:"https://github.com/syncthing/syncthing",target:"_blank",rel:"noopener noreferrer"},sk=e("code",null,"MPLv2",-1),lk=e("code",null,"Go",-1),ak={href:"https://z-push.org/",target:"_blank",rel:"noopener noreferrer"},ik={href:"https://en.wikipedia.org/wiki/ActiveSync",target:"_blank",rel:"noopener noreferrer"},hk={href:"https://owncloud.org/",target:"_blank",rel:"noopener noreferrer"},ck=e("code",null,"AGPLv3",-1),dk=e("code",null,"PHP",-1),_k={href:"https://pydio.com/",target:"_blank",rel:"noopener noreferrer"},uk={href:"https://www.cis.upenn.edu/~bcpierce/unison/",target:"_blank",rel:"noopener noreferrer"},pk=e("code",null,"GPLv3",-1),fk=e("code",null,"OCaml",-1),gk=e("h4",{id:"点对点文件共享",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#点对点文件共享","aria-hidden":"true"},"#"),o(" 点对点文件共享")],-1),bk={href:"http://file.pizza/",target:"_blank",rel:"noopener noreferrer"},mk={href:"https://github.com/kern/filepizza",target:"_blank",rel:"noopener noreferrer"},kk=e("code",null,"BSD",-1),wk=e("code",null,"Nodejs",-1),Pk={href:"https://filetea.me/",target:"_blank",rel:"noopener noreferrer"},yk={href:"https://github.com/elima/FileTea",target:"_blank",rel:"noopener noreferrer"},Sk=e("code",null,"AGPLv3",-1),vk=e("code",null,"C",-1),Ck={href:"https://github.com/feross/instant.io",target:"_blank",rel:"noopener noreferrer"},Ak={href:"https://instant.io",target:"_blank",rel:"noopener noreferrer"},Lk=e("code",null,"MIT",-1),Mk=e("code",null,"Nodejs",-1),Gk={href:"http://erdgeist.org/arts/software/opentracker/",target:"_blank",rel:"noopener noreferrer"},xk={href:"http://erdgeist.org/gitweb/opentracker/",target:"_blank",rel:"noopener noreferrer"},Tk=e("code",null,"Public domain",-1),Ik=e("code",null,"C",-1),Ek={href:"https://github.com/peer5/sharefest",target:"_blank",rel:"noopener noreferrer"},Dk={href:"https://www.sharefest.me/",target:"_blank",rel:"noopener noreferrer"},Bk=e("code",null,"Apache 2.0",-1),Hk=e("code",null,"Nodejs",-1),jk=e("h4",{id:"单击-拖放上传",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#单击-拖放上传","aria-hidden":"true"},"#"),o(" 单击/拖放上传")],-1),Rk={href:"https://github.com/broncowdd/BoZoN",target:"_blank",rel:"noopener noreferrer"},Ok=e("code",null,"AGPLv3",-1),Fk=e("code",null,"PHP",-1),Nk={href:"https://coquelicot.potager.org/",target:"_blank",rel:"noopener noreferrer"},zk=e("code",null,"AGPLv3",-1),Wk={href:"http://projet.idleman.fr/dropcenter/",target:"_blank",rel:"noopener noreferrer"},Jk={href:"https://github.com/silverwind/droppy",target:"_blank",rel:"noopener noreferrer"},Uk={href:"http://droppy.silverwind.io/",target:"_blank",rel:"noopener noreferrer"},Vk=e("code",null,"BSD",-1),qk=e("code",null,"Nodejs",-1),Kk={href:"https://github.com/imgbi/img.bi",target:"_blank",rel:"noopener noreferrer"},Xk={href:"http://img.bi",target:"_blank",rel:"noopener noreferrer"},Yk=e("code",null,"GPLv3",-1),Zk=e("code",null,"Nodejs",-1),Qk={href:"https://ipfs.pics/",target:"_blank",rel:"noopener noreferrer"},$k={href:"https://github.com/ipfspics/server",target:"_blank",rel:"noopener noreferrer"},ew=e("code",null,"AGPLv3",-1),ow=e("code",null,"PHP",-1),rw={href:"https://gitlab.com/mojo42/Jirafeau/wikis/home",target:"_blank",rel:"noopener noreferrer"},tw={href:"http://jirafeau.net/",target:"_blank",rel:"noopener noreferrer"},nw={href:"http://home.gna.org/jyraphe/",target:"_blank",rel:"noopener noreferrer"},sw={href:"https://github.com/andreimarcu/linx-server",target:"_blank",rel:"noopener noreferrer"},lw={href:"https://linx.li/",target:"_blank",rel:"noopener noreferrer"},aw=e("code",null,"GPLv3",-1),iw=e("code",null,"Go",-1),hw={href:"https://git.framasoft.org/luc/lufi",target:"_blank",rel:"noopener noreferrer"},cw={href:"https://demo.lufi.io",target:"_blank",rel:"noopener noreferrer"},dw={href:"https://git.framasoft.org/luc/lufi/tree/master",target:"_blank",rel:"noopener noreferrer"},_w=e("code",null,"AGPLv3",-1),uw=e("code",null,"Perl",-1),pw={href:"https://github.com/ldidry/lutim",target:"_blank",rel:"noopener noreferrer"},fw={href:"https://mediacru.sh/",target:"_blank",rel:"noopener noreferrer"},gw={href:"https://github.com/MediaCrush/MediaCrush",target:"_blank",rel:"noopener noreferrer"},bw={href:"https://minio.io/",target:"_blank",rel:"noopener noreferrer"},mw={href:"https://github.com/minio/minio",target:"_blank",rel:"noopener noreferrer"},kw=e("code",null,"Apache",-1),ww=e("code",null,"Go",-1),Pw={href:"https://github.com/ethanal/nimbus",target:"_blank",rel:"noopener noreferrer"},yw=e("code",null,"MIT",-1),Sw=e("code",null,"Python",-1),vw={href:"https://onionshare.org/",target:"_blank",rel:"noopener noreferrer"},Cw={href:"https://www.pictshare.net/",target:"_blank",rel:"noopener noreferrer"},Aw={href:"https://www.pictshare.net/",target:"_blank",rel:"noopener noreferrer"},Lw={href:"https://github.com/chrisiaut/pictshare",target:"_blank",rel:"noopener noreferrer"},Mw=e("code",null,"Apache",-1),Gw=e("code",null,"PHP/Javascript",-1),xw={href:"https://github.com/Pomf/Pomf",target:"_blank",rel:"noopener noreferrer"},Tw={href:"http://Pomf.se",target:"_blank",rel:"noopener noreferrer"},Iw=e("code",null,"MIT",-1),Ew=e("code",null,"PHP/Nodejs",-1),Dw={href:"http://www.projectsend.org/",target:"_blank",rel:"noopener noreferrer"},Bw={href:"https://github.com/ignacionelson/ProjectSend",target:"_blank",rel:"noopener noreferrer"},Hw=e("code",null,"GPLv2",-1),jw=e("code",null,"PHP",-1),Rw={href:"https://transfer.sh",target:"_blank",rel:"noopener noreferrer"},Ow={href:"https://transfer.sh",target:"_blank",rel:"noopener noreferrer"},Fw={href:"https://github.com/dutchcoders/transfer.sh",target:"_blank",rel:"noopener noreferrer"},Nw=e("code",null,"MIT",-1),zw=e("code",null,"Go",-1),Ww={href:"https://uguu.se/",target:"_blank",rel:"noopener noreferrer"},Jw={href:"https://github.com/nokonoko/uguu",target:"_blank",rel:"noopener noreferrer"},Uw=e("code",null,"MIT",-1),Vw=e("code",null,"PHP",-1),qw={href:"https://github.com/Upload/Up1",target:"_blank",rel:"noopener noreferrer"},Kw={href:"https://up1.ca/",target:"_blank",rel:"noopener noreferrer"},Xw=e("code",null,"MIT",-1),Yw=e("code",null,"Nodejs",-1),Zw={href:"https://u.pste.pw",target:"_blank",rel:"noopener noreferrer"},Qw={href:"https://github.com/TheReverend403/uPste",target:"_blank",rel:"noopener noreferrer"},$w=e("code",null,"AGPLv3",-1),e2=e("code",null,"PHP",-1),o2={href:"http://www.youtransfer.io",target:"_blank",rel:"noopener noreferrer"},r2={href:"http://demo.youtransfer.io/",target:"_blank",rel:"noopener noreferrer"},t2={href:"https://github.com/remie/YouTransfer",target:"_blank",rel:"noopener noreferrer"},n2=e("code",null,"Apache",-1),s2=e("code",null,"Nodejs",-1),l2=e("h4",{id:"基于-web-的文件管理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#基于-web-的文件管理","aria-hidden":"true"},"#"),o(" 基于 Web 的文件管理")],-1),a2={href:"http://adamwhitcroft.com/apaxy/",target:"_blank",rel:"noopener noreferrer"},i2={href:"https://github.com/AdamWhitcroft/Apaxy",target:"_blank",rel:"noopener noreferrer"},h2=e("code",null,"Public domain",-1),c2=e("code",null,"CSS",-1),d2={href:"http://www.directorylister.com/",target:"_blank",rel:"noopener noreferrer"},_2={href:"https://github.com/DirectoryLister/DirectoryLister",target:"_blank",rel:"noopener noreferrer"},u2=e("code",null,"MIT",-1),p2=e("code",null,"PHP",-1),f2={href:"http://encode-explorer.siineiolekala.net/",target:"_blank",rel:"noopener noreferrer"},g2={href:"http://encode-explorer.siineiolekala.net/explorer/index.php",target:"_blank",rel:"noopener noreferrer"},b2={href:"https://github.com/marekrei/encode-explorer",target:"_blank",rel:"noopener noreferrer"},m2=e("code",null,"MIT",-1),k2=e("code",null,"PHP",-1),w2={href:"http://extplorer.sourceforge.net/",target:"_blank",rel:"noopener noreferrer"},P2={href:"https://github.com/soyuka/explorer",target:"_blank",rel:"noopener noreferrer"},y2={href:"https://github.com/soyuka/explorer",target:"_blank",rel:"noopener noreferrer"},S2=e("code",null,"MIT",-1),v2=e("code",null,"Nodejs",-1),C2={href:"https://github.com/xataz/gobrowser",target:"_blank",rel:"noopener noreferrer"},A2={href:"https://github.com/xataz/gobrowser",target:"_blank",rel:"noopener noreferrer"},L2=e("code",null,"GPLv3",-1),M2=e("code",null,"Go",-1),G2={href:"https://larsjung.de/h5ai/",target:"_blank",rel:"noopener noreferrer"},x2={href:"https://larsjung.de/h5ai/demo/",target:"_blank",rel:"noopener noreferrer"},T2={href:"https://github.com/lrsjng/h5ai",target:"_blank",rel:"noopener noreferrer"},I2=e("code",null,"MIT",-1),E2=e("code",null,"PHP/Javascript",-1),D2={href:"http://www.monstaftp.com/",target:"_blank",rel:"noopener noreferrer"},B2={href:"http://mftp.live/",target:"_blank",rel:"noopener noreferrer"},H2={href:"https://github.com/MonstaApps/Monsta-FTP",target:"_blank",rel:"noopener noreferrer"},j2=e("code",null,"GPLv3",-1),R2=e("code",null,"PHP",-1),O2={href:"http://www.resourcespace.org",target:"_blank",rel:"noopener noreferrer"},F2={href:"http://www.resourcespace.org/trial",target:"_blank",rel:"noopener noreferrer"},N2={href:"http://www.resourcespace.org/svn",target:"_blank",rel:"noopener noreferrer"},z2=e("code",null,"BSD/Other",-1),W2=e("code",null,"PHP",-1),J2={href:"https://sprut.io",target:"_blank",rel:"noopener noreferrer"},U2={href:"https://demo.sprut.io:9443",target:"_blank",rel:"noopener noreferrer"},V2={href:"https://github.com/LTD-Beget/sprutio",target:"_blank",rel:"noopener noreferrer"},q2=e("code",null,"GPLv3",-1),K2=e("code",null,"Python",-1),X2=e("h2",{id:"游戏",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#游戏","aria-hidden":"true"},"#"),o(" 游戏")],-1),Y2={href:"https://github.com/Q42/0hh1",target:"_blank",rel:"noopener noreferrer"},Z2={href:"http://0hh1.com/",target:"_blank",rel:"noopener noreferrer"},Q2=e("code",null,"MIT",-1),$2=e("code",null,"HTML5",-1),eP={href:"https://github.com/doublespeakgames/adarkroom",target:"_blank",rel:"noopener noreferrer"},oP={href:"http://adarkroom.doublespeakgames.com/",target:"_blank",rel:"noopener noreferrer"},rP=e("code",null,"MPLv2",-1),tP=e("code",null,"HTML5",-1),nP={href:"https://github.com/huytd/agar.io-clone",target:"_blank",rel:"noopener noreferrer"},sP={href:"http://Agar.io",target:"_blank",rel:"noopener noreferrer"},lP={href:"http://Socket.IO",target:"_blank",rel:"noopener noreferrer"},aP=e("code",null,"MIT",-1),iP=e("code",null,"Nodejs",-1),hP={href:"https://github.com/ellisonleao/clumsy-bird",target:"_blank",rel:"noopener noreferrer"},cP={href:"http://www.ellison.rocks/clumsy-bird/",target:"_blank",rel:"noopener noreferrer"},dP=e("code",null,"MIT",-1),_P=e("code",null,"Nodejs",-1),uP={href:"https://github.com/Kshitij-Banerjee/Cubiks-2048",target:"_blank",rel:"noopener noreferrer"},pP={href:"https://kshitij-banerjee.github.io/Cubiks-2048/",target:"_blank",rel:"noopener noreferrer"},fP=e("code",null,"CCBYNCv4",-1),gP=e("code",null,"HTML5",-1),bP={href:"https://github.com/Hextris/hextris",target:"_blank",rel:"noopener noreferrer"},mP={href:"http://hextris.io/",target:"_blank",rel:"noopener noreferrer"},kP=e("code",null,"GPLv3",-1),wP=e("code",null,"HTML5",-1),PP={href:"https://github.com/abrenaut/posio/",target:"_blank",rel:"noopener noreferrer"},yP={href:"https://posio.abrenaut.com/",target:"_blank",rel:"noopener noreferrer"},SP=e("code",null,"MIT",-1),vP=e("code",null,"Python",-1),CP={href:"http://tournamentmango.com/",target:"_blank",rel:"noopener noreferrer"},AP={href:"https://github.com/seiyria/tournamentmango",target:"_blank",rel:"noopener noreferrer"},LP=e("code",null,"MIT",-1),MP=e("code",null,"Javascript",-1),GP=e("h2",{id:"网关",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#网关","aria-hidden":"true"},"#"),o(" 网关")],-1),xP={href:"https://github.com/liftoff/GateOne/",target:"_blank",rel:"noopener noreferrer"},TP=e("code",null,"AGPLv3",-1),IP={href:"http://guac-dev.org/",target:"_blank",rel:"noopener noreferrer"},EP={href:"https://github.com/glyptodon/",target:"_blank",rel:"noopener noreferrer"},DP=e("code",null,"MIT",-1),BP=e("code",null,"Java/C",-1),HP=e("h2",{id:"groupware-群件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#groupware-群件","aria-hidden":"true"},"#"),o(" Groupware 群件")],-1),jP={href:"http://www.citadel.org/doku.php",target:"_blank",rel:"noopener noreferrer"},RP={href:"http://www.citadel.org/doku.php/installation:source",target:"_blank",rel:"noopener noreferrer"},OP=e("code",null,"GPLv3",-1),FP=e("code",null,"C",-1),NP={href:"https://cozy.io",target:"_blank",rel:"noopener noreferrer"},zP={href:"https://github.com/cozy",target:"_blank",rel:"noopener noreferrer"},WP=e("code",null,"GPLv3",-1),JP=e("code",null,"Nodejs",-1),UP={href:"http://www.egroupware.org/",target:"_blank",rel:"noopener noreferrer"},VP={href:"https://github.com/EGroupware/egroupware",target:"_blank",rel:"noopener noreferrer"},qP=e("code",null,"GPLv2",-1),KP=e("code",null,"PHP",-1),XP={href:"http://www.horde.org/",target:"_blank",rel:"noopener noreferrer"},YP={href:"http://demo.horde.org/login.php",target:"_blank",rel:"noopener noreferrer"},ZP={href:"https://github.com/horde/horde",target:"_blank",rel:"noopener noreferrer"},QP=e("code",null,"GPLv2",-1),$P={href:"https://kolab.org/",target:"_blank",rel:"noopener noreferrer"},ey={href:"https://git.kolab.org/",target:"_blank",rel:"noopener noreferrer"},oy=e("code",null,"Multiple",-1),ry=e("code",null,"C++/Python/PHP",-1),ty={href:"https://kopano.com/",target:"_blank",rel:"noopener noreferrer"},ny={href:"http://demo.kopano.com",target:"_blank",rel:"noopener noreferrer"},sy={href:"https://stash.kopano.io",target:"_blank",rel:"noopener noreferrer"},ly=e("code",null,"AGPLv3",-1),ay=e("code",null,"C/Python/PHP",-1),iy={href:"http://www.mayan-edms.com",target:"_blank",rel:"noopener noreferrer"},hy={href:"http://demo.mayan-edms.com",target:"_blank",rel:"noopener noreferrer"},cy={href:"https://gitlab.com/mayan-edms/mayan-edms",target:"_blank",rel:"noopener noreferrer"},dy=e("code",null,"Apache",-1),_y=e("code",null,"Python/Django",-1),uy={href:"https://openmeetings.apache.org/index.html",target:"_blank",rel:"noopener noreferrer"},py={href:"https://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/",target:"_blank",rel:"noopener noreferrer"},fy=e("code",null,"Apache 2.0",-1),gy=e("code",null,"Java",-1),by={href:"http://www.sogo.nu/",target:"_blank",rel:"noopener noreferrer"},my={href:"http://www.sogo.nu/tour/online_demo.html",target:"_blank",rel:"noopener noreferrer"},ky={href:"http://www.sogo.nu/development/source_code.html",target:"_blank",rel:"noopener noreferrer"},wy=e("code",null,"GPLv1/LGPLv2",-1),Py=e("code",null,"Objective-C",-1),yy={href:"https://www.tine20.org",target:"_blank",rel:"noopener noreferrer"},Sy={href:"https://demo.tine20.net",target:"_blank",rel:"noopener noreferrer"},vy={href:"https://packages.tine20.com/maintenance/source/",target:"_blank",rel:"noopener noreferrer"},Cy=e("code",null,"AGPLv3/Other",-1),Ay=e("code",null,"PHP",-1),Ly={href:"https://www.zimbra.com/downloads/",target:"_blank",rel:"noopener noreferrer"},My={href:"https://www.zimbra.com/open-source-email-overview/",target:"_blank",rel:"noopener noreferrer"},Gy=e("code",null,"GPLv2/CPALv1",-1),xy=e("code",null,"Java",-1),Ty=e("h2",{id:"学习和课程",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#学习和课程","aria-hidden":"true"},"#"),o(" 学习和课程")],-1),Iy={href:"https://chamilo.org/chamilo-lms/",target:"_blank",rel:"noopener noreferrer"},Ey={href:"https://github.com/chamilo/chamilo-lms",target:"_blank",rel:"noopener noreferrer"},Dy=e("code",null,"GPLv3",-1),By=e("code",null,"PHP",-1),Hy={href:"https://www.edx.org/",target:"_blank",rel:"noopener noreferrer"},jy={href:"https://www.edx.org/",target:"_blank",rel:"noopener noreferrer"},Ry={href:"https://github.com/edx/",target:"_blank",rel:"noopener noreferrer"},Oy=e("code",null,"AGPLv3",-1),Fy=e("code",null,"Python",-1),Ny={href:"http://www.lxhive.com/",target:"_blank",rel:"noopener noreferrer"},zy={href:"https://github.com/Brightcookie/lxHive",target:"_blank",rel:"noopener noreferrer"},Wy=e("code",null,"GPLv3",-1),Jy=e("code",null,"PHP",-1),Uy={href:"https://mahara.org/",target:"_blank",rel:"noopener noreferrer"},Vy={href:"https://github.com/MaharaProject/mahara",target:"_blank",rel:"noopener noreferrer"},qy=e("code",null,"GPLv3",-1),Ky=e("code",null,"PHP",-1),Xy={href:"https://moodle.org/",target:"_blank",rel:"noopener noreferrer"},Yy={href:"https://moodle.org/demo/",target:"_blank",rel:"noopener noreferrer"},Zy={href:"https://git.moodle.org/gw",target:"_blank",rel:"noopener noreferrer"},Qy=e("code",null,"GPL",-1),$y=e("code",null,"PHP",-1),e3={href:"https://documen.tician.de/relate/",target:"_blank",rel:"noopener noreferrer"},o3={href:"https://github.com/inducer/relate/",target:"_blank",rel:"noopener noreferrer"},r3=e("code",null,"MIT",-1),t3=e("code",null,"Python",-1),n3={href:"https://www.sakaiproject.org/",target:"_blank",rel:"noopener noreferrer"},s3={href:"https://www.sakaiproject.org/try-sakai",target:"_blank",rel:"noopener noreferrer"},l3={href:"https://github.com/sakaiproject/sakai",target:"_blank",rel:"noopener noreferrer"},a3=e("code",null,"ECLv2",-1),i3=e("code",null,"Java",-1),h3={href:"http://schooltool.org/",target:"_blank",rel:"noopener noreferrer"},c3={href:"http://bazaar.launchpad.net/~schooltool-owners/schooltool/2.8/files",target:"_blank",rel:"noopener noreferrer"},d3=e("code",null,"GPLv2",-1),_3=e("code",null,"Python",-1),u3=e("h2",{id:"地图-gps",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#地图-gps","aria-hidden":"true"},"#"),o(" 地图 & GPS")],-1),p3={href:"https://graphhopper.com/",target:"_blank",rel:"noopener noreferrer"},f3={href:"https://github.com/graphhopper/graphhopper",target:"_blank",rel:"noopener noreferrer"},g3={href:"https://github.com/MapBBCode/share.mapbbcode.org",target:"_blank",rel:"noopener noreferrer"},b3={href:"http://share.mapbbcode.org/",target:"_blank",rel:"noopener noreferrer"},m3=e("code",null,"WTFPL/Other",-1),k3=e("code",null,"PHP/Javascript",-1),w3={href:"http://www.opengts.org/",target:"_blank",rel:"noopener noreferrer"},P3={href:"http://track.opengts.org/track/Track",target:"_blank",rel:"noopener noreferrer"},y3={href:"https://sourceforge.net/projects/opengts/files/server-base/",target:"_blank",rel:"noopener noreferrer"},S3=e("code",null,"Apache",-1),v3=e("code",null,"Java",-1),C3={href:"http://www.openstreetmap.org/",target:"_blank",rel:"noopener noreferrer"},A3={href:"https://github.com/openstreetmap/openstreetmap-website",target:"_blank",rel:"noopener noreferrer"},L3={href:"https://www.traccar.org/",target:"_blank",rel:"noopener noreferrer"},M3={href:"http://demo.traccar.org/",target:"_blank",rel:"noopener noreferrer"},G3={href:"https://github.com/tananaev?tab=repositories",target:"_blank",rel:"noopener noreferrer"},x3=e("code",null,"Apache",-1),T3={href:"https://umap.openstreetmap.fr/en/",target:"_blank",rel:"noopener noreferrer"},I3={href:"https://github.com/umap-project/umap",target:"_blank",rel:"noopener noreferrer"},E3=e("code",null,"WTFPL",-1),D3=e("code",null,"Python/Django",-1),B3=e("h2",{id:"媒体流",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#媒体流","aria-hidden":"true"},"#"),o(" 媒体流")],-1),H3={href:"https://en.wikipedia.org/wiki/List_of_streaming_media_systems",target:"_blank",rel:"noopener noreferrer"},j3={href:"https://en.wikipedia.org/wiki/Comparison_of_streaming_media_systems",target:"_blank",rel:"noopener noreferrer"},R3=e("h3",{id:"语音流",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#语音流","aria-hidden":"true"},"#"),o(" 语音流")],-1),O3={href:"https://www.sourcefabric.org/en/airtime/",target:"_blank",rel:"noopener noreferrer"},F3={href:"https://github.com/sourcefabric/Airtime",target:"_blank",rel:"noopener noreferrer"},N3=e("code",null,"AGPLv3",-1),z3=e("code",null,"PHP",-1),W3={href:"http://ampache.org/",target:"_blank",rel:"noopener noreferrer"},J3={href:"http://play.dogmazic.net/",target:"_blank",rel:"noopener noreferrer"},U3={href:"https://github.com/ampache/ampache",target:"_blank",rel:"noopener noreferrer"},V3=e("code",null,"AGPLv3",-1),q3=e("code",null,"PHP",-1),K3={href:"http://www.fomori.org/cherrymusic/",target:"_blank",rel:"noopener noreferrer"},X3={href:"https://github.com/devsnd/cherrymusic",target:"_blank",rel:"noopener noreferrer"},Y3=e("code",null,"GPLv3",-1),Z3=e("code",null,"Python",-1),Q3={href:"https://github.com/jkbrzt/cloudtunes",target:"_blank",rel:"noopener noreferrer"},$3=e("code",null,"MIT",-1),eS=e("code",null,"Python/Javascript",-1),oS={href:"https://gnu.io/fm/",target:"_blank",rel:"noopener noreferrer"},rS={href:"http://last.fm",target:"_blank",rel:"noopener noreferrer"},tS={href:"http://git.savannah.gnu.org/cgit/librefm.git/",target:"_blank",rel:"noopener noreferrer"},nS=e("code",null,"AGPLv3",-1),sS=e("code",null,"PHP",-1),lS={href:"http://groovebasin.com/",target:"_blank",rel:"noopener noreferrer"},aS={href:"https://github.com/andrewrk/groovebasin",target:"_blank",rel:"noopener noreferrer"},iS=e("code",null,"MIT",-1),hS=e("code",null,"Nodejs",-1),cS={href:"http://www.icecast.org/",target:"_blank",rel:"noopener noreferrer"},dS={href:"https://git.xiph.org/?p=icecast-server.git;a=summary",target:"_blank",rel:"noopener noreferrer"},_S=e("code",null,"GPLv2",-1),uS=e("code",null,"C",-1),pS={href:"http://koel.phanan.net/",target:"_blank",rel:"noopener noreferrer"},fS={href:"https://github.com/phanan/koel",target:"_blank",rel:"noopener noreferrer"},gS=e("code",null,"MIT",-1),bS=e("code",null,"PHP",-1),mS={href:"http://libresonic.org/",target:"_blank",rel:"noopener noreferrer"},kS=e("code",null,"GPLv3",-1),wS=e("code",null,"Java",-1),PS={href:"http://mopidy.readthedocs.org/",target:"_blank",rel:"noopener noreferrer"},yS={href:"https://github.com/mopidy/mopidy",target:"_blank",rel:"noopener noreferrer"},SS=e("code",null,"Apache",-1),vS=e("code",null,"Python",-1),CS={href:"https://github.com/martijnboland/moped",target:"_blank",rel:"noopener noreferrer"},AS=e("code",null,"MIT",-1),LS=e("code",null,"Javascript",-1),MS={href:"https://github.com/pimusicbox/mopidy-musicbox-webclient",target:"_blank",rel:"noopener noreferrer"},GS=e("code",null,"Apache",-1),xS=e("code",null,"Javascript",-1),TS={href:"https://github.com/Lesterpig/mopidy-party",target:"_blank",rel:"noopener noreferrer"},IS=e("code",null,"Apache",-1),ES=e("code",null,"Python/Javascript",-1),DS={href:"http://www.musicpd.org/",target:"_blank",rel:"noopener noreferrer"},BS=e("code",null,"GPLv2",-1),HS=e("code",null,"C++",-1),jS={href:"http://www.ympd.org/",target:"_blank",rel:"noopener noreferrer"},RS={href:"https://github.com/notandy/ympd",target:"_blank",rel:"noopener noreferrer"},OS=e("code",null,"GPLv2",-1),FS=e("code",null,"C",-1),NS={href:"https://www.sonerezh.bzh/",target:"_blank",rel:"noopener noreferrer"},zS={href:"https://www.sonerezh.bzh/demo/",target:"_blank",rel:"noopener noreferrer"},WS={href:"https://www.sonerezh.bzh/docs/",target:"_blank",rel:"noopener noreferrer"},JS={href:"https://github.com/sonerezh/sonerezh",target:"_blank",rel:"noopener noreferrer"},US=e("code",null,"GPLv3",-1),VS=e("code",null,"PHP",-1),qS=e("h3",{id:"视频流",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#视频流","aria-hidden":"true"},"#"),o(" 视频流")],-1),KS={href:"https://github.com/calzoneman/sync",target:"_blank",rel:"noopener noreferrer"},XS={href:"http://cytu.be",target:"_blank",rel:"noopener noreferrer"},YS=e("code",null,"MIT",-1),ZS=e("code",null,"Nodejs",-1),QS={href:"https://github.com/MediaBrowser/Emby",target:"_blank",rel:"noopener noreferrer"},$S=e("code",null,"GPLv2",-1),ev={href:"http://flumotion.net/",target:"_blank",rel:"noopener noreferrer"},ov={href:"https://github.com/Flumotion/flumotion",target:"_blank",rel:"noopener noreferrer"},rv=e("code",null,"LGPLv2",-1),tv=e("code",null,"Python",-1),nv={href:"http://htpc.io/",target:"_blank",rel:"noopener noreferrer"},sv=e("code",null,"MIT",-1),lv={href:"http://www.icecast.org/",target:"_blank",rel:"noopener noreferrer"},av={href:"https://git.xiph.org/?p=icecast-server.git;a=summary",target:"_blank",rel:"noopener noreferrer"},iv=e("code",null,"GPLv2",-1),hv=e("code",null,"C",-1),cv={href:"http://sourceforge.net/projects/minidlna/",target:"_blank",rel:"noopener noreferrer"},dv=e("code",null,"GPLv2",-1),_v=e("code",null,"C",-1),uv={href:"https://datarhei.github.io/restreamer/",target:"_blank",rel:"noopener noreferrer"},pv={href:"https://github.com/datarhei/restreamer",target:"_blank",rel:"noopener noreferrer"},fv=e("code",null,"Apache",-1),gv=e("code",null,"Nodejs",-1),bv={href:"https://wiki.gnome.org/action/show/Projects/Rygel",target:"_blank",rel:"noopener noreferrer"},mv=e("code",null,"GPLv3",-1),kv=e("code",null,"C",-1),wv={href:"https://github.com/dularion/streama",target:"_blank",rel:"noopener noreferrer"},Pv=e("code",null,"MIT",-1),yv=e("code",null,"Java",-1),Sv={href:"https://github.com/ZoneMinder/ZoneMinder",target:"_blank",rel:"noopener noreferrer"},vv=e("code",null,"GPLv2",-1),Cv=e("code",null,"PHP",-1),Av=e("h2",{id:"杂项-其它",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#杂项-其它","aria-hidden":"true"},"#"),o(" 杂项/其它")],-1),Lv={href:"http://easybook-project.org/",target:"_blank",rel:"noopener noreferrer"},Mv={href:"https://github.com/javiereguiluz/easybook",target:"_blank",rel:"noopener noreferrer"},Gv=e("code",null,"MIT",-1),xv=e("code",null,"PHP",-1),Tv={href:"https://geneweb.tuxfamily.org/wiki/GeneWeb",target:"_blank",rel:"noopener noreferrer"},Iv={href:"https://demo.geneweb.tuxfamily.org/gw7/",target:"_blank",rel:"noopener noreferrer"},Ev={href:"https://github.com/geneweb/geneweb",target:"_blank",rel:"noopener noreferrer"},Dv=e("code",null,"GPLv2",-1),Bv=e("code",null,"OCAML",-1),Hv={href:"https://github.com/securestate/king-phisher",target:"_blank",rel:"noopener noreferrer"},jv=e("code",null,"BSD",-1),Rv=e("code",null,"Python",-1),Ov={href:"https://github.com/drichard/mindmaps",target:"_blank",rel:"noopener noreferrer"},Fv={href:"http://drichard.org/mindmaps/",target:"_blank",rel:"noopener noreferrer"},Nv=e("code",null,"AGPLv3",-1),zv=e("code",null,"HTML5",-1),Wv={href:"http://www.paraio.org",target:"_blank",rel:"noopener noreferrer"},Jv={href:"https://github.com/erudika/para",target:"_blank",rel:"noopener noreferrer"},Uv=e("code",null,"Apache",-1),Vv=e("code",null,"Java",-1),qv={href:"https://skygear.io",target:"_blank",rel:"noopener noreferrer"},Kv={href:"https://portal.skygear.io",target:"_blank",rel:"noopener noreferrer"},Xv={href:"https://github.com/SkygearIO/skygear-server",target:"_blank",rel:"noopener noreferrer"},Yv=e("code",null,"Apache",-1),Zv=e("code",null,"Go",-1),Qv={href:"https://www.webtrees.net",target:"_blank",rel:"noopener noreferrer"},$v={href:"https://dev.webtrees.net/demo-stable/index.php?ctype=gedcom&ged=demo",target:"_blank",rel:"noopener noreferrer"},e8={href:"https://github.com/fisharebest/webtrees",target:"_blank",rel:"noopener noreferrer"},o8=e("code",null,"GPLv3",-1),r8=e("code",null,"PHP",-1),t8=e("h2",{id:"资金、预算和管理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#资金、预算和管理","aria-hidden":"true"},"#"),o(" 资金、预算和管理")],-1),n8={href:"https://github.com/arecker/bennedetto",target:"_blank",rel:"noopener noreferrer"},s8=e("code",null,"GPLv3",-1),l8=e("code",null,"Python",-1),a8={href:"http://www.economizzer.org/",target:"_blank",rel:"noopener noreferrer"},i8={href:"https://github.com/gugoan/economizzer",target:"_blank",rel:"noopener noreferrer"},h8=e("code",null,"MIT",-1),c8=e("code",null,"PHP",-1),d8={href:"https://github.com/gaynetdinov/ex_money",target:"_blank",rel:"noopener noreferrer"},_8=e("code",null,"ISC",-1),u8=e("code",null,"Elixir",-1),p8={href:"https://jc5.github.io/firefly-iii/",target:"_blank",rel:"noopener noreferrer"},f8=e("code",null,"MIT",-1),g8=e("code",null,"PHP",-1),b8={href:"http://galette.eu/dc/",target:"_blank",rel:"noopener noreferrer"},m8={href:"http://git.tuxfamily.org/galette/galette.git/",target:"_blank",rel:"noopener noreferrer"},k8=e("code",null,"GPLv3",-1),w8=e("code",null,"PHP",-1),P8={href:"http://www.glpi-project.org/spip.php?lang=en",target:"_blank",rel:"noopener noreferrer"},y8={href:"https://forge.glpi-project.org/projects/glpi",target:"_blank",rel:"noopener noreferrer"},S8=e("code",null,"GPLv2",-1),v8=e("code",null,"PHP",-1),C8={href:"http://grr.devome.com/?lang=en",target:"_blank",rel:"noopener noreferrer"},A8={href:"http://grr.devome.com/demo/week_all.php?year=2015&month=07&day=28&area=94",target:"_blank",rel:"noopener noreferrer"},L8=e("em",null,"administrateur/azerty",-1),M8=e("code",null,"GPLv2",-1),G8=e("code",null,"PHP",-1),x8={href:"http://hospitalrun.io/",target:"_blank",rel:"noopener noreferrer"},T8={href:"https://github.com/HospitalRun/hospitalrun-server",target:"_blank",rel:"noopener noreferrer"},I8={href:"http://hospitalrun.io/demo/",target:"_blank",rel:"noopener noreferrer"},E8=e("code",null,"GPLv3",-1),D8=e("code",null,"Nodejs/Ember",-1),B8={href:"https://inventaire.io/welcome",target:"_blank",rel:"noopener noreferrer"},H8={href:"https://github.com/inventaire/inventaire",target:"_blank",rel:"noopener noreferrer"},j8=e("code",null,"AGPLv3",-1),R8=e("code",null,"Nodejs",-1),O8={href:"https://www.invoiceninja.org/",target:"_blank",rel:"noopener noreferrer"},F8={href:"https://app.invoiceninja.com/invoices/create",target:"_blank",rel:"noopener noreferrer"},N8={href:"https://github.com/invoiceninja/invoiceninja",target:"_blank",rel:"noopener noreferrer"},z8=e("code",null,"AAL",-1),W8=e("code",null,"PHP",-1),J8={href:"https://invoiceplane.com/",target:"_blank",rel:"noopener noreferrer"},U8={href:"https://demo.invoiceplane.com",target:"_blank",rel:"noopener noreferrer"},V8={href:"https://github.com/InvoicePlane/InvoicePlane",target:"_blank",rel:"noopener noreferrer"},q8=e("code",null,"MIT",-1),K8={href:"http://ihatemoney.org/",target:"_blank",rel:"noopener noreferrer"},X8={href:"https://github.com/spiral-project/ihatemoney",target:"_blank",rel:"noopener noreferrer"},Y8=e("code",null,"BSD",-1),Z8=e("code",null,"Python",-1),Q8={href:"http://www.tryton.org/",target:"_blank",rel:"noopener noreferrer"},$8={href:"http://demo.tryton.org",target:"_blank",rel:"noopener noreferrer"},e9={href:"https://hg.tryton.org",target:"_blank",rel:"noopener noreferrer"},o9=e("code",null,"GPLv3",-1),r9=e("code",null,"Python",-1),t9={href:"https://koha-community.org/",target:"_blank",rel:"noopener noreferrer"},n9={href:"https://github.com/Koha-Community/Koha",target:"_blank",rel:"noopener noreferrer"},s9=e("code",null,"GPLv3",-1),l9=e("code",null,"Perl",-1),a9={href:"https://www.partkeepr.org",target:"_blank",rel:"noopener noreferrer"},i9={href:"https://demo.partkeepr.org/",target:"_blank",rel:"noopener noreferrer"},h9={href:"https://github.com/partkeepr/PartKeepr",target:"_blank",rel:"noopener noreferrer"},c9=e("code",null,"GPLv3",-1),d9=e("code",null,"PHP",-1),_9={href:"https://dev.sigpipe.me/dashie/StockazNG",target:"_blank",rel:"noopener noreferrer"},u9=e("code",null,"MIT",-1),p9=e("code",null,"Python",-1),f9=e("h2",{id:"监测",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#监测","aria-hidden":"true"},"#"),o(" 监测")],-1),g9={href:"https://github.com/n1trux/awesome-sysadmin#monitoring",target:"_blank",rel:"noopener noreferrer"},b9={href:"https://github.com/n1trux/awesome-sysadmin#metric--metric-collection",target:"_blank",rel:"noopener noreferrer"},m9=e("h2",{id:"笔记-编辑器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#笔记-编辑器","aria-hidden":"true"},"#"),o(" 笔记 & 编辑器")],-1),k9={href:"http://dillinger.io/",target:"_blank",rel:"noopener noreferrer"},w9={href:"https://github.com/joemccann/dillinger/",target:"_blank",rel:"noopener noreferrer"},P9=e("code",null,"MIT",-1),y9=e("code",null,"Nodejs",-1),S9={href:"https://github.com/yosko/jotter",target:"_blank",rel:"noopener noreferrer"},v9={href:"http://tools.yosko.net/demos/jotter/",target:"_blank",rel:"noopener noreferrer"},C9=e("code",null,"LGPLv3",-1),A9=e("code",null,"PHP",-1),L9={href:"https://laverna.cc/",target:"_blank",rel:"noopener noreferrer"},M9={href:"https://laverna.cc/index.html#notes",target:"_blank",rel:"noopener noreferrer"},G9={href:"https://github.com/Laverna/laverna",target:"_blank",rel:"noopener noreferrer"},x9=e("code",null,"MPLv2",-1),T9=e("code",null,"Nodejs",-1),I9={href:"http://leanote.org/",target:"_blank",rel:"noopener noreferrer"},E9={href:"https://leanote.com/note",target:"_blank",rel:"noopener noreferrer"},D9={href:"https://github.com/leanote/leanote",target:"_blank",rel:"noopener noreferrer"},B9=e("code",null,"GPLv2",-1),H9=e("code",null,"Go",-1),j9={href:"http://georgeosddev.github.com/markdown-edit/",target:"_blank",rel:"noopener noreferrer"},R9={href:"https://github.com/georgeOsdDev/markdown-edit",target:"_blank",rel:"noopener noreferrer"},O9=e("code",null,"MIT",-1),F9=e("code",null,"HTML5",-1),N9={href:"https://github.com/pereorga/minimalist-web-notepad",target:"_blank",rel:"noopener noreferrer"},z9={href:"http://notepad.cc",target:"_blank",rel:"noopener noreferrer"},W9=e("code",null,"Apache",-1),J9=e("code",null,"PHP",-1),U9={href:"https://github.com/SSilence/notes",target:"_blank",rel:"noopener noreferrer"},V9=e("code",null,"GPLv3",-1),q9=e("code",null,"PHP",-1),K9={href:"https://github.com/FoxUSA/OpenNote",target:"_blank",rel:"noopener noreferrer"},X9={href:"https://foxusa.github.io/OpenNote/OpenNote/#/folder",target:"_blank",rel:"noopener noreferrer"},Y9=e("code",null,"MIT",-1),Z9=e("code",null,"HTML5",-1),Q9={href:"http://paperwork.rocks",target:"_blank",rel:"noopener noreferrer"},$9={href:"https://github.com/twostairs/paperwork",target:"_blank",rel:"noopener noreferrer"},eC=e("code",null,"MIT",-1),oC=e("code",null,"PHP",-1),rC={href:"https://www.sharelatex.com/",target:"_blank",rel:"noopener noreferrer"},tC={href:"https://github.com/sharelatex/sharelatex",target:"_blank",rel:"noopener noreferrer"},nC=e("code",null,"AGPLv3",-1),sC=e("code",null,"Ruby",-1),lC={href:"https://turtl.it/",target:"_blank",rel:"noopener noreferrer"},aC={href:"https://github.com/turtl",target:"_blank",rel:"noopener noreferrer"},iC=e("code",null,"GPLv3",-1),hC=e("code",null,"CommonLisp",-1),cC=e("h2",{id:"办公套件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#办公套件","aria-hidden":"true"},"#"),o(" 办公套件")],-1),dC={href:"https://ethercalc.org/",target:"_blank",rel:"noopener noreferrer"},_C={href:"https://github.com/audreyt/ethercalc",target:"_blank",rel:"noopener noreferrer"},uC=e("code",null,"CPALv1/Other",-1),pC=e("code",null,"Nodejs",-1),fC={href:"http://etherpad.org/",target:"_blank",rel:"noopener noreferrer"},gC=e("code",null,"Apache",-1),bC={href:"https://github.com/gobby/gobby/wiki/Dedicated%20Server",target:"_blank",rel:"noopener noreferrer"},mC={href:"https://github.com/gobby/gobby/wiki",target:"_blank",rel:"noopener noreferrer"},kC={href:"https://github.com/gobby/gobby",target:"_blank",rel:"noopener noreferrer"},wC=e("code",null,"MIT",-1),PC=e("code",null,"C++",-1),yC={href:"http://onlyoffice.org/",target:"_blank",rel:"noopener noreferrer"},SC={href:"https://github.com/ONLYOFFICE/DocumentServer",target:"_blank",rel:"noopener noreferrer"},vC=e("code",null,"AGPLv3",-1),CC=e("code",null,"Nodejs",-1),AC={href:"http://phpoffice.github.io/",target:"_blank",rel:"noopener noreferrer"},LC=e("code",null,"LGPLv3",-1),MC=e("code",null,"PHP",-1),GC={href:"http://webodf.org/",target:"_blank",rel:"noopener noreferrer"},xC={href:"https://github.com/kogmbh/WebODF",target:"_blank",rel:"noopener noreferrer"},TC=e("code",null,"AGPLv3",-1),IC=e("code",null,"Javascript",-1),EC={href:"https://doc.owncloud.org/server/8.2/user_manual/documents.html",target:"_blank",rel:"noopener noreferrer"},DC={href:"https://github.com/owncloud/documents",target:"_blank",rel:"noopener noreferrer"},BC=e("code",null,"AGPLv3",-1),HC=e("code",null,"PHP",-1),jC=e("h2",{id:"密码管理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#密码管理","aria-hidden":"true"},"#"),o(" 密码管理")],-1),RC={href:"https://keeweb.info/",target:"_blank",rel:"noopener noreferrer"},OC={href:"https://github.com/keeweb/keeweb",target:"_blank",rel:"noopener noreferrer"},FC=e("code",null,"MIT",-1),NC=e("code",null,"Javascript",-1),zC={href:"http://www.ppma.pw",target:"_blank",rel:"noopener noreferrer"},WC={href:"https://github.com/pklink/ppma",target:"_blank",rel:"noopener noreferrer"},JC=e("code",null,"BSD",-1),UC=e("code",null,"PHP",-1),VC={href:"http://rattic.org/",target:"_blank",rel:"noopener noreferrer"},qC={href:"https://github.com/tildaslash/RatticWeb",target:"_blank",rel:"noopener noreferrer"},KC={href:"https://demo.rattic.org/cred/list/",target:"_blank",rel:"noopener noreferrer"},XC={href:"http://www.syspass.org/",target:"_blank",rel:"noopener noreferrer"},YC={href:"https://github.com/nuxsmin/sysPass",target:"_blank",rel:"noopener noreferrer"},ZC={href:"http://demo.syspass.org/",target:"_blank",rel:"noopener noreferrer"},QC=e("code",null,"GPLv3",-1),$C=e("code",null,"PHP",-1),e5={href:"http://teampass.net/",target:"_blank",rel:"noopener noreferrer"},o5={href:"https://github.com/nilsteampassnet/TeamPass/",target:"_blank",rel:"noopener noreferrer"},r5=e("code",null,"GPLv3",-1),t5=e("code",null,"PHP",-1),n5=e("h2",{id:"pastebins",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#pastebins","aria-hidden":"true"},"#"),o(" Pastebins")],-1),s5={href:"https://github.com/sametmax/0bin",target:"_blank",rel:"noopener noreferrer"},l5=e("code",null,"WTFPL",-1),a5=e("code",null,"Python",-1),i5={href:"https://cryptonote.me/",target:"_blank",rel:"noopener noreferrer"},h5={href:"https://github.com/alainmeier/cryptonote",target:"_blank",rel:"noopener noreferrer"},c5=e("code",null,"BSD",-1),d5=e("code",null,"Ruby",-1),_5={href:"https://gitlab.deblan.org/deblan/gist",target:"_blank",rel:"noopener noreferrer"},u5=e("code",null,"GPLv3",-1),p5=e("code",null,"PHP",-1),f5={href:"http://hastebin.com/about.md",target:"_blank",rel:"noopener noreferrer"},g5={href:"http://hastebin.com/",target:"_blank",rel:"noopener noreferrer"},b5={href:"https://github.com/seejohnrun/haste-server",target:"_blank",rel:"noopener noreferrer"},m5=e("code",null,"MIT",-1),k5=e("code",null,"Nodejs",-1),w5={href:"https://github.com/petermaloney/localpaste",target:"_blank",rel:"noopener noreferrer"},P5=e("code",null,"GPLv2",-1),y5=e("code",null,"Python",-1),S5={href:"https://notehub.org",target:"_blank",rel:"noopener noreferrer"},v5={href:"https://notehub.org",target:"_blank",rel:"noopener noreferrer"},C5={href:"https://github.com/chmllr/NoteHub",target:"_blank",rel:"noopener noreferrer"},A5=e("code",null,"MIT",-1),L5=e("code",null,"Nodejs",-1),M5={href:"https://p.pantsu.cat",target:"_blank",rel:"noopener noreferrer"},G5={href:"https://p.pantsu.cat",target:"_blank",rel:"noopener noreferrer"},x5={href:"https://github.com/ewhal/Pastebin",target:"_blank",rel:"noopener noreferrer"},T5=e("code",null,"MIT",-1),I5=e("code",null,"Go",-1),E5={href:"http://pastedown.ctrl-c.us/",target:"_blank",rel:"noopener noreferrer"},D5={href:"https://github.com/cespare/pastedown",target:"_blank",rel:"noopener noreferrer"},B5=e("code",null,"MIT",-1),H5=e("code",null,"Go",-1),j5={href:"https://github.com/ptpb/pb",target:"_blank",rel:"noopener noreferrer"},R5={href:"https://ptpb.pw/",target:"_blank",rel:"noopener noreferrer"},O5=e("code",null,"GPLv3",-1),F5=e("code",null,"Python/Flask",-1),N5={href:"https://github.com/bhanderson/pbnh",target:"_blank",rel:"noopener noreferrer"},z5=e("code",null,"MIT",-1),W5=e("code",null,"Python/Flask",-1),J5={href:"https://pste.pw",target:"_blank",rel:"noopener noreferrer"},U5={href:"https://github.com/FoxDev/Phaste",target:"_blank",rel:"noopener noreferrer"},V5=e("code",null,"AGPLv3",-1),q5=e("code",null,"PHP",-1),K5={href:"https://snipt.net/",target:"_blank",rel:"noopener noreferrer"},X5={href:"https://github.com/nicksergeant/snipt/",target:"_blank",rel:"noopener noreferrer"},Y5=e("code",null,"BSD",-1),Z5=e("code",null,"Python",-1),Q5={href:"http://sayakb.github.io/sticky-notes/",target:"_blank",rel:"noopener noreferrer"},$5={href:"https://github.com/sayakb/sticky-notes",target:"_blank",rel:"noopener noreferrer"},e4=e("code",null,"PHP",-1),o4={href:"https://github.com/claudehohl/Stikked",target:"_blank",rel:"noopener noreferrer"},r4=e("code",null,"GPLv3",-1),t4=e("code",null,"PHP",-1),n4={href:"https://github.com/andreineculau/tastebin",target:"_blank",rel:"noopener noreferrer"},s4=e("code",null,"Apache",-1),l4=e("code",null,"Nodejs",-1),a4={href:"https://github.com/elrido/ZeroBin/wiki",target:"_blank",rel:"noopener noreferrer"},i4={href:"https://zerobin.dssr.ch/",target:"_blank",rel:"noopener noreferrer"},h4={href:"https://github.com/elrido/ZeroBin",target:"_blank",rel:"noopener noreferrer"},c4=e("code",null,"Zlib",-1),d4=e("code",null,"PHP",-1),_4=e("h2",{id:"个人仪表盘",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#个人仪表盘","aria-hidden":"true"},"#"),o(" 个人仪表盘")],-1),u4={href:"http://shopify.github.io/dashing/",target:"_blank",rel:"noopener noreferrer"},p4={href:"http://dashingdemo.herokuapp.com/sample",target:"_blank",rel:"noopener noreferrer"},f4={href:"https://github.com/Shopify/dashing",target:"_blank",rel:"noopener noreferrer"},g4=e("code",null,"MIT",-1),b4=e("code",null,"Ruby",-1),m4={href:"https://github.com/foxmask/dj-diabetes",target:"_blank",rel:"noopener noreferrer"},k4=e("code",null,"BSD",-1),w4=e("code",null,"Python",-1),P4={href:"https://freeboard.io",target:"_blank",rel:"noopener noreferrer"},y4={href:"https://github.com/freeboard/freeboard",target:"_blank",rel:"noopener noreferrer"},S4=e("code",null,"MIT",-1),v4=e("code",null,"Nodejs",-1),C4={href:"http://grafana.org/",target:"_blank",rel:"noopener noreferrer"},A4={href:"https://github.com/grafana",target:"_blank",rel:"noopener noreferrer"},L4=e("code",null,"Apache",-1),M4=e("code",null,"Go",-1),G4={href:"http://habitica.com/",target:"_blank",rel:"noopener noreferrer"},x4={href:"https://github.com/HabitRPG/habitrpg",target:"_blank",rel:"noopener noreferrer"},T4=e("code",null,"GPLv3/Other",-1),I4=e("code",null,"Nodejs",-1),E4={href:"http://phant.io/",target:"_blank",rel:"noopener noreferrer"},D4={href:"https://data.sparkfun.com/",target:"_blank",rel:"noopener noreferrer"},B4={href:"https://github.com/sparkfun/phant",target:"_blank",rel:"noopener noreferrer"},H4=e("code",null,"GPLv3",-1),j4=e("code",null,"Nodejs",-1),R4={href:"https://github.com/Reportr/dashboard",target:"_blank",rel:"noopener noreferrer"},O4={href:"https://github.com/Reportr/dashboard",target:"_blank",rel:"noopener noreferrer"},F4={href:"https://thingspeak.com/",target:"_blank",rel:"noopener noreferrer"},N4={href:"https://thingspeak.com/channels/public",target:"_blank",rel:"noopener noreferrer"},z4={href:"https://github.com/iobridge/thingspeak",target:"_blank",rel:"noopener noreferrer"},W4=e("code",null,"GPL",-1),J4=e("code",null,"Ruby",-1),U4={href:"http://allegro.tech/tipboard/",target:"_blank",rel:"noopener noreferrer"},V4={href:"https://github.com/allegro/tipboard",target:"_blank",rel:"noopener noreferrer"},q4=e("code",null,"Apache",-1),K4=e("code",null,"Python",-1),X4={href:"https://github.com/rolandgeider/wger",target:"_blank",rel:"noopener noreferrer"},Y4={href:"https://wger.de",target:"_blank",rel:"noopener noreferrer"},Z4=e("code",null,"AGPLv3",-1),Q4=e("code",null,"Python",-1),$4=e("h2",{id:"照片和视频库",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#照片和视频库","aria-hidden":"true"},"#"),o(" 照片和视频库")],-1),e0={href:"https://github.com/Chevereto/Chevereto-2.X",target:"_blank",rel:"noopener noreferrer"},o0={href:"https://github.com/Chevereto/Chevereto-2.X",target:"_blank",rel:"noopener noreferrer"},r0=e("code",null,"MIT",-1),t0=e("code",null,"PHP",-1),n0={href:"http://cumulusclips.org/",target:"_blank",rel:"noopener noreferrer"},s0={href:"https://tube.devosi.org/",target:"_blank",rel:"noopener noreferrer"},l0=e("code",null,"GPLv2",-1),a0=e("code",null,"PHP",-1),i0={href:"http://koken.me/",target:"_blank",rel:"noopener noreferrer"},h0=e("code",null,"PHP",-1),c0={href:"http://lychee.electerious.com/",target:"_blank",rel:"noopener noreferrer"},d0={href:"https://github.com/electerious/Lychee",target:"_blank",rel:"noopener noreferrer"},_0=e("code",null,"MIT",-1),u0=e("code",null,"PHP",-1),p0={href:"http://mediadrop.net/",target:"_blank",rel:"noopener noreferrer"},f0={href:"https://github.com/mediadrop/mediadrop",target:"_blank",rel:"noopener noreferrer"},g0=e("code",null,"GPLv3",-1),b0=e("code",null,"Python",-1),m0={href:"http://mediagoblin.org",target:"_blank",rel:"noopener noreferrer"},k0=e("code",null,"AGPLv3",-1),w0=e("code",null,"Python",-1),P0={href:"https://github.com/sebsauvage/MinigalNano",target:"_blank",rel:"noopener noreferrer"},y0={href:"http://boards.tomcanac.com/",target:"_blank",rel:"noopener noreferrer"},S0=e("code",null,"CC BY-SA 3.0",-1),v0=e("code",null,"PHP",-1),C0={href:"https://github.com/hillman/phog",target:"_blank",rel:"noopener noreferrer"},A0=e("code",null,"Python",-1),L0={href:"http://blog.zx2c4.com/567",target:"_blank",rel:"noopener noreferrer"},M0={href:"http://photos.jasondonenfeld.com/",target:"_blank",rel:"noopener noreferrer"},G0=e("code",null,"GPLv2",-1),x0=e("code",null,"Javascript",-1),T0={href:"https://github.com/thibaud-rohmer/PhotoLight",target:"_blank",rel:"noopener noreferrer"},I0=e("code",null,"GPLv3",-1),E0=e("code",null,"PHP",-1),D0={href:"http://www.photoshow-gallery.com/",target:"_blank",rel:"noopener noreferrer"},B0={href:"https://github.com/thibaud-rohmer/PhotoShow",target:"_blank",rel:"noopener noreferrer"},H0=e("code",null,"Javascript",-1),j0=e("code",null,"GPLv3",-1),R0={href:"http://piwigo.org/",target:"_blank",rel:"noopener noreferrer"},O0=e("code",null,"GPLv2",-1),F0=e("code",null,"PHP",-1),N0={href:"http://blog.plumi.org/",target:"_blank",rel:"noopener noreferrer"},z0={href:"https://github.com/plumi/plumi.app",target:"_blank",rel:"noopener noreferrer"},W0=e("code",null,"GPLv2",-1),J0=e("code",null,"Python",-1),U0={href:"https://github.com/dmpop/pygmyfoto",target:"_blank",rel:"noopener noreferrer"},V0=e("code",null,"PHP",-1),q0={href:"http://shot.io/",target:"_blank",rel:"noopener noreferrer"},K0={href:"https://github.com/AliasIO/Shot.io",target:"_blank",rel:"noopener noreferrer"},X0=e("code",null,"GPLv3",-1),Y0=e("code",null,"PHP",-1),Z0={href:"https://github.com/saimn/sigal",target:"_blank",rel:"noopener noreferrer"},Q0=e("code",null,"MIT",-1),$0=e("code",null,"Python",-1),e6={href:"http://www.ubergallery.net",target:"_blank",rel:"noopener noreferrer"},o6={href:"https://github.com/UberGallery/UberGallery",target:"_blank",rel:"noopener noreferrer"},r6=e("code",null,"MIT",-1),t6=e("code",null,"PHP",-1),n6={href:"http://videobin.org/code",target:"_blank",rel:"noopener noreferrer"},s6={href:"http://videobin.org/",target:"_blank",rel:"noopener noreferrer"},l6={href:"https://r-w-x.org/videobin.git",target:"_blank",rel:"noopener noreferrer"},a6=e("code",null,"GPLv3",-1),i6=e("code",null,"Python",-1),h6={href:"http://www.zenphoto.org/",target:"_blank",rel:"noopener noreferrer"},c6={href:"https://github.com/zenphoto/zenphoto",target:"_blank",rel:"noopener noreferrer"},d6=e("code",null,"GPLv2",-1),_6=e("code",null,"PHP",-1),u6=e("h2",{id:"投票与事件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#投票与事件","aria-hidden":"true"},"#"),o(" 投票与事件")],-1),p6={href:"http://primelife.ercim.eu/results/opensource/63-dudle",target:"_blank",rel:"noopener noreferrer"},f6={href:"https://dudle.inf.tu-dresden.de/",target:"_blank",rel:"noopener noreferrer"},g6=e("code",null,"AGPLv3",-1),b6=e("code",null,"Ruby",-1),m6={href:"https://framadate.org/",target:"_blank",rel:"noopener noreferrer"},k6={href:"https://framadate.org/aqg259dth55iuhwm",target:"_blank",rel:"noopener noreferrer"},w6={href:"https://git.framasoft.org/framasoft/framadate",target:"_blank",rel:"noopener noreferrer"},P6=e("code",null,"CeCILL-B",-1),y6=e("code",null,"PHP",-1),S6={href:"http://kyela.net/",target:"_blank",rel:"noopener noreferrer"},v6={href:"http://kyela.net/55232734237c8/",target:"_blank",rel:"noopener noreferrer"},C6={href:"https://github.com/abienvenu/Kyela",target:"_blank",rel:"noopener noreferrer"},A6={href:"https://www.limesurvey.org",target:"_blank",rel:"noopener noreferrer"},L6={href:"https://demo.limesurvey.org",target:"_blank",rel:"noopener noreferrer"},M6={href:"https://github.com/nearbycoder/materialpoll",target:"_blank",rel:"noopener noreferrer"},G6={href:"http://strawpoll.me",target:"_blank",rel:"noopener noreferrer"},x6={href:"http://materialpoll.tk",target:"_blank",rel:"noopener noreferrer"},T6={href:"https://github.com/nearbycoder/materialpoll",target:"_blank",rel:"noopener noreferrer"},I6={href:"https://nuages.domainepublic.net/",target:"_blank",rel:"noopener noreferrer"},E6={href:"http://git.domainepublic.net/?p=nuages.git;a=tree",target:"_blank",rel:"noopener noreferrer"},D6=e("code",null,"GPLv3",-1),B6=e("code",null,"Python/Django",-1),H6={href:"https://tellform.com",target:"_blank",rel:"noopener noreferrer"},j6={href:"https://stage.tellform.com/#!/forms/57196d592601ed12074eecc0",target:"_blank",rel:"noopener noreferrer"},R6={href:"https://github.com/whitef0x0/tellform",target:"_blank",rel:"noopener noreferrer"},O6=e("code",null,"MIT",-1),F6=e("code",null,"Nodejs",-1),N6=e("h2",{id:"代理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#代理","aria-hidden":"true"},"#"),o(" 代理")],-1),z6={href:"https://github.com/thekvs/microproxy",target:"_blank",rel:"noopener noreferrer"},W6={href:"https://github.com/thekvs/microproxy",target:"_blank",rel:"noopener noreferrer"},J6=e("code",null,"MIT",-1),U6=e("code",null,"Go",-1),V6={href:"https://github.com/joshdick/miniProxy/",target:"_blank",rel:"noopener noreferrer"},q6={href:"https://github.com/joshdick/miniProxy/",target:"_blank",rel:"noopener noreferrer"},K6=e("code",null,"GPLv3",-1),X6=e("code",null,"PHP",-1),Y6={href:"http://lehollandaisvolant.net/tout/oranjeproxy/",target:"_blank",rel:"noopener noreferrer"},Z6={href:"https://github.com/AmauryCarrade/OranjeProxy",target:"_blank",rel:"noopener noreferrer"},Q6=e("code",null,"GPLv2",-1),$6=e("code",null,"PHP",-1),e7={href:"http://www.apsis.ch/pound/",target:"_blank",rel:"noopener noreferrer"},o7={href:"http://www.apsis.ch/pound/",target:"_blank",rel:"noopener noreferrer"},r7=e("code",null,"GPLv2",-1),t7=e("code",null,"C",-1),n7={href:"http://www.privoxy.org",target:"_blank",rel:"noopener noreferrer"},s7=e("code",null,"GPLv2",-1),l7=e("code",null,"C",-1),a7={href:"http://www.scotty-transporter.org/",target:"_blank",rel:"noopener noreferrer"},i7={href:"https://github.com/SSilence/scotty",target:"_blank",rel:"noopener noreferrer"},h7=e("code",null,"GPLv3",-1),c7=e("code",null,"Java",-1),d7={href:"http://www.squid-cache.org/",target:"_blank",rel:"noopener noreferrer"},_7={href:"http://bazaar.launchpad.net/~squid/squid/3-trunk/files",target:"_blank",rel:"noopener noreferrer"},u7=e("code",null,"GPLv2",-1),p7=e("code",null,"C",-1),f7={href:"https://swiperproxy.github.io/",target:"_blank",rel:"noopener noreferrer"},g7={href:"http://proxy.donttrustrobots.nl/",target:"_blank",rel:"noopener noreferrer"},b7={href:"https://github.com/swiperproxy/swiperproxy",target:"_blank",rel:"noopener noreferrer"},m7=e("code",null,"MIT",-1),k7={href:"https://banu.com/tinyproxy/",target:"_blank",rel:"noopener noreferrer"},w7={href:"https://git.banu.com/tinyproxy/",target:"_blank",rel:"noopener noreferrer"},P7=e("code",null,"GPLv2",-1),y7=e("code",null,"C",-1),S7={href:"https://traefik.io/",target:"_blank",rel:"noopener noreferrer"},v7={href:"https://github.com/containous/traefik",target:"_blank",rel:"noopener noreferrer"},C7=e("code",null,"MIT",-1),A7=e("code",null,"Go",-1),L7=e("h2",{id:"稍后阅读列表",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#稍后阅读列表","aria-hidden":"true"},"#"),o(" 稍后阅读列表")],-1),M7={href:"http://keeper.nunux.org/",target:"_blank",rel:"noopener noreferrer"},G7={href:"https://github.com/ncarlier/nunux-keeper",target:"_blank",rel:"noopener noreferrer"},x7=e("code",null,"GPLv3",-1),T7=e("code",null,"Nodejs",-1),I7={href:"https://github.com/memiks/readityourself",target:"_blank",rel:"noopener noreferrer"},E7={href:"http://www.readityourself.net/",target:"_blank",rel:"noopener noreferrer"},D7=e("code",null,"MIT",-1),B7=e("code",null,"PHP",-1),H7={href:"https://www.wallabag.org/?lang=fr_fr",target:"_blank",rel:"noopener noreferrer"},j7={href:"http://demo.wallabag.org/",target:"_blank",rel:"noopener noreferrer"},R7={href:"http://www.framabag.org/",target:"_blank",rel:"noopener noreferrer"},O7={href:"https://github.com/wallabag/wallabag",target:"_blank",rel:"noopener noreferrer"},F7=e("code",null,"MIT",-1),N7=e("code",null,"PHP",-1),z7=e("h2",{id:"搜索引擎",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#搜索引擎","aria-hidden":"true"},"#"),o(" 搜索引擎")],-1),W7={href:"http://www.gigablast.com/",target:"_blank",rel:"noopener noreferrer"},J7={href:"http://www.gigablast.com/",target:"_blank",rel:"noopener noreferrer"},U7={href:"https://github.com/gigablast/open-source-search-engine",target:"_blank",rel:"noopener noreferrer"},V7=e("code",null,"Apache",-1),q7=e("code",null,"C++",-1),K7={href:"https://github.com/asciimoo/searx",target:"_blank",rel:"noopener noreferrer"},X7={href:"https://searx.me/",target:"_blank",rel:"noopener noreferrer"},Y7={href:"https://github.com/asciimoo/searx/wiki/Searx-instances",target:"_blank",rel:"noopener noreferrer"},Z7={href:"https://beniz.github.io/seeks/",target:"_blank",rel:"noopener noreferrer"},Q7=e("code",null,"AGPLv3",-1),$7=e("code",null,"C++",-1),eA={href:"http://yacy.net/en/index.html",target:"_blank",rel:"noopener noreferrer"},oA=e("code",null,"GPL2",-1),rA=e("code",null,"Java",-1),tA=n('

        软件开发

        项目管理

        See also Ticketing, Task management/To-do lists*

        ',3),nA={href:"https://bloodhound.apache.org/",target:"_blank",rel:"noopener noreferrer"},sA=e("code",null,"Apache",-1),lA=e("code",null,"Python",-1),aA={href:"https://www.casebox.org",target:"_blank",rel:"noopener noreferrer"},iA={href:"https://www.fossil-scm.org/index.html/doc/trunk/www/index.wiki",target:"_blank",rel:"noopener noreferrer"},hA=e("code",null,"BSD",-1),cA=e("code",null,"C",-1),dA={href:"https://gitbucket.github.io/gitbucket-news/",target:"_blank",rel:"noopener noreferrer"},_A={href:"https://github.com/gitbucket/gitbucket",target:"_blank",rel:"noopener noreferrer"},uA={href:"http://gitlab.org/",target:"_blank",rel:"noopener noreferrer"},pA={href:"https://git.framasoft.org/",target:"_blank",rel:"noopener noreferrer"},fA={href:"http://gitlist.org/",target:"_blank",rel:"noopener noreferrer"},gA={href:"https://github.com/klaussilveira/gitlist",target:"_blank",rel:"noopener noreferrer"},bA={href:"http://gitprep.yukikimoto.com/",target:"_blank",rel:"noopener noreferrer"},mA={href:"https://github.com/yuki-kimoto/gitprep",target:"_blank",rel:"noopener noreferrer"},kA={href:"http://perlcodesample.sakura.ne.jp/gitprep/gitprep.cgi",target:"_blank",rel:"noopener noreferrer"},wA={href:"https://github.com/gogits/gogs",target:"_blank",rel:"noopener noreferrer"},PA={href:"https://try.gogs.io/",target:"_blank",rel:"noopener noreferrer"},yA={href:"https://kallithea-scm.org/",target:"_blank",rel:"noopener noreferrer"},SA={href:"https://kallithea-scm.org/repos/kallithea",target:"_blank",rel:"noopener noreferrer"},vA=e("code",null,"GPLv3",-1),CA=e("code",null,"Python",-1),AA={href:"https://github.com/jonashaag/klaus/",target:"_blank",rel:"noopener noreferrer"},LA={href:"http://klausdemo.lophus.org/",target:"_blank",rel:"noopener noreferrer"},MA=e("code",null,"ISC",-1),GA=e("code",null,"Python",-1),xA={href:"http://lavagna.io",target:"_blank",rel:"noopener noreferrer"},TA={href:"https://github.com/digitalfondue/lavagna",target:"_blank",rel:"noopener noreferrer"},IA=e("code",null,"GPLv3",-1),EA=e("code",null,"Java",-1),DA={href:"https://www.openproject.org",target:"_blank",rel:"noopener noreferrer"},BA={href:"http://phabricator.org/",target:"_blank",rel:"noopener noreferrer"},HA={href:"https://secure.phabricator.com/",target:"_blank",rel:"noopener noreferrer"},jA={href:"https://github.com/phacility/phabricator",target:"_blank",rel:"noopener noreferrer"},RA=e("code",null,"Apache",-1),OA=e("code",null,"PHP",-1),FA={href:"http://www.redmine.org/",target:"_blank",rel:"noopener noreferrer"},NA=e("code",null,"GPLv2",-1),zA=e("code",null,"Ruby",-1),WA={href:"https://taiga.io/",target:"_blank",rel:"noopener noreferrer"},JA={href:"https://github.com/taigaio",target:"_blank",rel:"noopener noreferrer"},UA={href:"http://www.thebuggenie.com/",target:"_blank",rel:"noopener noreferrer"},VA={href:"http://trac.edgewall.org/",target:"_blank",rel:"noopener noreferrer"},qA={href:"http://www.phproject.org/",target:"_blank",rel:"noopener noreferrer"},KA={href:"http://demo.phproject.org/",target:"_blank",rel:"noopener noreferrer"},XA={href:"https://github.com/Alanaktion/phproject",target:"_blank",rel:"noopener noreferrer"},YA=e("code",null,"GPLv3",-1),ZA=n('

        Bug 跟踪

        See Ticketing

        IDE/工具

        ',3),QA={href:"http://codiad.com/",target:"_blank",rel:"noopener noreferrer"},$A={href:"https://github.com/Codiad/Codiad",target:"_blank",rel:"noopener noreferrer"},eL={href:"http://www.eclipse.org/che/",target:"_blank",rel:"noopener noreferrer"},oL={href:"https://github.com/eclipse/che",target:"_blank",rel:"noopener noreferrer"},rL=e("code",null,"EPLv1",-1),tL=e("code",null,"Docker/Java",-1),nL={href:"https://icecoder.net/",target:"_blank",rel:"noopener noreferrer"},sL={href:"http://demo.icecoder.net/ICEcoder/",target:"_blank",rel:"noopener noreferrer"},lL={href:"https://github.com/mattpass/ICEcoder",target:"_blank",rel:"noopener noreferrer"},aL=e("code",null,"MIT",-1),iL=e("code",null,"PHP",-1),hL={href:"http://jsbin.com/",target:"_blank",rel:"noopener noreferrer"},cL={href:"https://github.com/jsbin/jsbin",target:"_blank",rel:"noopener noreferrer"},dL=e("code",null,"MIT",-1),_L=e("code",null,"Nodejs",-1),uL={href:"http://www.koding.com/",target:"_blank",rel:"noopener noreferrer"},pL={href:"https://github.com/koding/koding",target:"_blank",rel:"noopener noreferrer"},fL=e("code",null,"Apache",-1),gL=e("code",null,"Nodejs",-1),bL={href:"http://micro.glark.io",target:"_blank",rel:"noopener noreferrer"},mL={href:"http://micro.glark.io",target:"_blank",rel:"noopener noreferrer"},kL={href:"https://github.com/Bluefinch/microglark",target:"_blank",rel:"noopener noreferrer"},wL=e("code",null,"AGPLv3",-1),PL=e("code",null,"Javascript",-1),yL={href:"http://regexr.com/",target:"_blank",rel:"noopener noreferrer"},SL={href:"https://github.com/gskinner/regexr/",target:"_blank",rel:"noopener noreferrer"},vL=e("code",null,"MIT",-1),CL=e("code",null,"Nodejs",-1),AL={href:"https://www.rstudio.com/products/rstudio/#Server",target:"_blank",rel:"noopener noreferrer"},LL={href:"https://github.com/rstudio/rstudio/",target:"_blank",rel:"noopener noreferrer"},ML=e("code",null,"AGPLv3",-1),GL=e("code",null,"Java/C++",-1),xL={href:"https://github.com/b3log/wide",target:"_blank",rel:"noopener noreferrer"},TL={href:"http://wide.b3log.org/signup",target:"_blank",rel:"noopener noreferrer"},IL=e("code",null,"Apache",-1),EL=e("code",null,"Go",-1),DL=e("h3",{id:"持续集成",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#持续集成","aria-hidden":"true"},"#"),o(" 持续集成")],-1),BL={href:"https://concourse.ci/",target:"_blank",rel:"noopener noreferrer"},HL={href:"https://ci.concourse.ci/",target:"_blank",rel:"noopener noreferrer"},jL={href:"https://github.com/concourse/concourse",target:"_blank",rel:"noopener noreferrer"},RL=e("code",null,"Apache",-1),OL=e("code",null,"Go",-1),FL={href:"https://drone.io/",target:"_blank",rel:"noopener noreferrer"},NL={href:"https://github.com/drone/drone",target:"_blank",rel:"noopener noreferrer"},zL=e("code",null,"Apache",-1),WL=e("code",null,"Go",-1),JL={href:"https://factor.io/",target:"_blank",rel:"noopener noreferrer"},UL={href:"https://github.com/factor-io/factor",target:"_blank",rel:"noopener noreferrer"},VL=e("code",null,"MIT",-1),qL=e("code",null,"Ruby",-1),KL={href:"https://jenkins-ci.org/",target:"_blank",rel:"noopener noreferrer"},XL={href:"https://github.com/jenkinsci/jenkins/",target:"_blank",rel:"noopener noreferrer"},YL=e("code",null,"MIT",-1),ZL=e("code",null,"Java",-1),QL={href:"https://www.phptesting.org/",target:"_blank",rel:"noopener noreferrer"},$L={href:"https://github.com/block8/phpci",target:"_blank",rel:"noopener noreferrer"},eM=e("code",null,"BSD",-1),oM=e("code",null,"PHP",-1),rM={href:"http://stridercd.com/",target:"_blank",rel:"noopener noreferrer"},tM={href:"https://github.com/Strider-CD/strider",target:"_blank",rel:"noopener noreferrer"},nM=e("code",null,"BSD",-1),sM=e("code",null,"Node.js",-1),lM=e("h3",{id:"文档生成器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#文档生成器","aria-hidden":"true"},"#"),o(" 文档生成器")],-1),aM=e("p",null,[o("See also "),e("a",{href:"#static-site-generators"},"Static site generators")],-1),iM={href:"http://haldean.org/",target:"_blank",rel:"noopener noreferrer"},hM={href:"https://github.com/haldean/docstore",target:"_blank",rel:"noopener noreferrer"},cM={href:"http://ricostacruz.com/flatdoc/",target:"_blank",rel:"noopener noreferrer"},dM=e("code",null,"MIT",-1),_M=e("code",null,"Javascript",-1),uM={href:"https://github.com/mil/markdown-tree",target:"_blank",rel:"noopener noreferrer"},pM={href:"https://docs.readthedocs.org/en/latest/install.html",target:"_blank",rel:"noopener noreferrer"},fM={href:"https://readthedocs.org/projects/",target:"_blank",rel:"noopener noreferrer"},gM={href:"https://github.com/rtfd/readthedocs.org",target:"_blank",rel:"noopener noreferrer"},bM=e("code",null,"MIT",-1),mM=e("code",null,"Python",-1),kM=e("h2",{id:"静态网站生成器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#静态网站生成器","aria-hidden":"true"},"#"),o(" 静态网站生成器")],-1),wM={href:"https://staticsitegenerators.net",target:"_blank",rel:"noopener noreferrer"},PM={href:"https://www.staticgen.com",target:"_blank",rel:"noopener noreferrer"},yM=e("h2",{id:"任务管理-to-do-列表",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#任务管理-to-do-列表","aria-hidden":"true"},"#"),o(" 任务管理/To-do 列表")],-1),SM=e("p",null,[e("em",null,[o("See also "),e("a",{href:"#project-management"},"Project Management"),o(" and "),e("a",{href:"#ticketing"},"Ticketing"),o(".")])],-1),vM={href:"https://github.com/infews/bulldog",target:"_blank",rel:"noopener noreferrer"},CM=e("code",null,"MIT",-1),AM=e("code",null,"HTML5",-1),LM={href:"https://github.com/arshad/crepido",target:"_blank",rel:"noopener noreferrer"},MM=e("code",null,"MIT",-1),GM=e("code",null,"Javascript/Others",-1),xM={href:"http://kanboard.net/",target:"_blank",rel:"noopener noreferrer"},TM=e("code",null,"MIT",-1),IM={href:"http://www.mytinytodo.net/",target:"_blank",rel:"noopener noreferrer"},EM=e("code",null,"GPLv2",-1),DM={href:"https://github.com/chr15m/omgnata",target:"_blank",rel:"noopener noreferrer"},BM={href:"https://chr15m.github.io/omgnata/",target:"_blank",rel:"noopener noreferrer"},HM=e("code",null,"GPLv3",-1),jM=e("code",null,"ClojureScript",-1),RM={href:"http://restya.com/board/",target:"_blank",rel:"noopener noreferrer"},OM={href:"http://restya.com/board/demo.html",target:"_blank",rel:"noopener noreferrer"},FM={href:"https://github.com/RestyaPlatform/board",target:"_blank",rel:"noopener noreferrer"},NM=e("code",null,"OSLv3",-1),zM=e("code",null,"PHP",-1),WM={href:"http://taskboard.matthewross.me/",target:"_blank",rel:"noopener noreferrer"},JM={href:"https://github.com/kiswa/TaskBoard",target:"_blank",rel:"noopener noreferrer"},UM=e("code",null,"MIT",-1),VM={href:"http://www.taskfreak.com/original",target:"_blank",rel:"noopener noreferrer"},qM={href:"http://demo.taskfreak.com/",target:"_blank",rel:"noopener noreferrer"},KM={href:"https://github.com/thewhitetulip/Tasks",target:"_blank",rel:"noopener noreferrer"},XM=e("code",null,"MIT",-1),YM=e("code",null,"Go",-1),ZM={href:"https://github.com/RaymiiOrg/tasks.php",target:"_blank",rel:"noopener noreferrer"},QM=e("code",null,"MIT",-1),$M={href:"https://taskwarrior.org/",target:"_blank",rel:"noopener noreferrer"},eG={href:"https://taskwarrior.org/download/#git",target:"_blank",rel:"noopener noreferrer"},oG=e("code",null,"MIT",-1),rG=e("code",null,"C++",-1),tG={href:"https://github.com/satrun77/tinyissue",target:"_blank",rel:"noopener noreferrer"},nG=e("code",null,"MIT",-1),sG=e("code",null,"PHP",-1),lG={href:"http://www.getontracks.org/",target:"_blank",rel:"noopener noreferrer"},aG={href:"https://en.wikipedia.org/wiki/Getting_Things_Done",target:"_blank",rel:"noopener noreferrer"},iG={href:"https://github.com/TracksApp/tracks",target:"_blank",rel:"noopener noreferrer"},hG=e("code",null,"GPLv2",-1),cG=e("code",null,"Ruby",-1),dG={href:"https://wekan.io/",target:"_blank",rel:"noopener noreferrer"},_G={href:"https://oasis.sandstorm.io/appdemo/m86q05rdvj14yvn78ghaxynqz7u2svw6rnttptxx49g1785cdv1h",target:"_blank",rel:"noopener noreferrer"},uG={href:"https://github.com/wekan/wekan",target:"_blank",rel:"noopener noreferrer"},pG=e("code",null,"MIT",-1),fG=e("code",null,"Javascript/Meteor",-1),gG=e("h2",{id:"ticketing",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ticketing","aria-hidden":"true"},"#"),o(" Ticketing")],-1),bG=e("p",null,[e("em",null,[o("See also "),e("a",{href:"#task-managementto-do-lists"},"Task management/To-do lists"),o(" and "),e("a",{href:"#project-management"},"Project Management")])],-1),mG={href:"https://www.bugzilla.org/",target:"_blank",rel:"noopener noreferrer"},kG=e("code",null,"MPLv2",-1),wG=e("code",null,"Perl",-1),PG={href:"http://bumpy-booby.derivoile.fr/",target:"_blank",rel:"noopener noreferrer"},yG={href:"https://github.com/piero-la-lune/Bumpy-Booby",target:"_blank",rel:"noopener noreferrer"},SG=e("code",null,"MIT",-1),vG=e("code",null,"PHP",-1),CG={href:"http://www.cerberusweb.com/",target:"_blank",rel:"noopener noreferrer"},AG={href:"https://github.com/Taskulu/deskulu",target:"_blank",rel:"noopener noreferrer"},LG={href:"https://help.taskulu.com",target:"_blank",rel:"noopener noreferrer"},MG=e("code",null,"GPLv2",-1),GG=e("code",null,"PHP",-1),xG={href:"http://diamantedesk.com/",target:"_blank",rel:"noopener noreferrer"},TG={href:"http://diamantedesk.com/demo/",target:"_blank",rel:"noopener noreferrer"},IG={href:"https://github.com/eltrino/diamantedesk-application",target:"_blank",rel:"noopener noreferrer"},EG=e("code",null,"OSLv3",-1),DG=e("code",null,"PHP",-1),BG={href:"http://www.flyspray.org/",target:"_blank",rel:"noopener noreferrer"},HG={href:"https://github.com/Flyspray/flyspray",target:"_blank",rel:"noopener noreferrer"},jG=e("code",null,"GPLv2",-1),RG={href:"https://github.com/bkeepers/gaskit",target:"_blank",rel:"noopener noreferrer"},OG=e("code",null,"GPL",-1),FG={href:"https://github.com/huboard/huboard",target:"_blank",rel:"noopener noreferrer"},NG=e("code",null,"⚠ ",-1),zG=e("code",null,"MIT",-1),WG=e("code",null,"Ruby",-1),JG={href:"https://www.mantisbt.org/",target:"_blank",rel:"noopener noreferrer"},UG={href:"https://www.mantisbt.org/bugs/my_view_page.php",target:"_blank",rel:"noopener noreferrer"},VG={href:"https://github.com/mantisbt/mantisbt",target:"_blank",rel:"noopener noreferrer"},qG=e("code",null,"GPLv2",-1),KG={href:"http://osticket.com/",target:"_blank",rel:"noopener noreferrer"},XG={href:"http://www.otrs.com/",target:"_blank",rel:"noopener noreferrer"},YG={href:"https://www.bestpractical.com/rt/",target:"_blank",rel:"noopener noreferrer"},ZG={href:"http://www.thebuggenie.com",target:"_blank",rel:"noopener noreferrer"},QG=e("h2",{id:"短-url",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#短-url","aria-hidden":"true"},"#"),o(" 短 URL")],-1),$G={href:"https://github.com/ldidry/lstu",target:"_blank",rel:"noopener noreferrer"},ex=e("em",null,"Let's SHorten That Url",-1),ox={href:"https://github.com/ethanal/nimbus",target:"_blank",rel:"noopener noreferrer"},rx=e("code",null,"MIT",-1),tx=e("code",null,"Python",-1),nx={href:"https://project.polr.me/",target:"_blank",rel:"noopener noreferrer"},sx={href:"https://github.com/Cydrobolt/polr",target:"_blank",rel:"noopener noreferrer"},lx={href:"http://yourls.org/",target:"_blank",rel:"noopener noreferrer"},ax={href:"https://github.com/YOURLS/YOURLS/",target:"_blank",rel:"noopener noreferrer"},ix={href:"https://github.com/YOURLS/YOURLS/wiki",target:"_blank",rel:"noopener noreferrer"},hx=e("code",null,"MIT",-1),cx=e("h2",{id:"vpn",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#vpn","aria-hidden":"true"},"#"),o(" VPN")],-1),dx={href:"https://github.com/n1trux/awesome-sysadmin#vpn",target:"_blank",rel:"noopener noreferrer"},_x=e("h2",{id:"web-服务器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#web-服务器","aria-hidden":"true"},"#"),o(" Web 服务器")],-1),ux={href:"https://github.com/n1trux/awesome-sysadmin#web",target:"_blank",rel:"noopener noreferrer"},px=e("h2",{id:"wikis",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#wikis","aria-hidden":"true"},"#"),o(" Wikis")],-1),fx=e("a",{href:"#documentation-generators"},"Documentation Generators",-1),gx={href:"http://www.wikimatrix.org/",target:"_blank",rel:"noopener noreferrer"},bx={href:"http://wikiindex.org/Category:Wiki_Engine",target:"_blank",rel:"noopener noreferrer"},mx={href:"https://en.wikipedia.org/wiki/List_of_wiki_software",target:"_blank",rel:"noopener noreferrer"},kx={href:"https://en.wikipedia.org/wiki/Comparison_of_wiki_software",target:"_blank",rel:"noopener noreferrer"},wx={href:"http://projet.idleman.fr/blazekiss/",target:"_blank",rel:"noopener noreferrer"},Px={href:"https://github.com/ldleman/blazekiss",target:"_blank",rel:"noopener noreferrer"},yx=e("code",null,"GPLv3",-1),Sx=e("code",null,"PHP",-1),vx={href:"https://www.bookstackapp.com/",target:"_blank",rel:"noopener noreferrer"},Cx={href:"https://www.bookstackapp.com/#demo",target:"_blank",rel:"noopener noreferrer"},Ax={href:"https://github.com/ssddanbrown/BookStack",target:"_blank",rel:"noopener noreferrer"},Lx=e("code",null,"MIT",-1),Mx=e("code",null,"PHP",-1),Gx={href:"https://github.com/fredoliveira/commonplace",target:"_blank",rel:"noopener noreferrer"},xx=e("code",null,"Ruby",-1),Tx={href:"https://www.dokuwiki.org/DokuWiki",target:"_blank",rel:"noopener noreferrer"},Ix=e("code",null,"GPL",-1),Ex=e("code",null,"PHP",-1),Dx={href:"https://github.com/jgm/gitit",target:"_blank",rel:"noopener noreferrer"},Bx={href:"http://gitit.johnmacfarlane.net/",target:"_blank",rel:"noopener noreferrer"},Hx=e("code",null,"GPLv2",-1),jx=e("code",null,"Haskell",-1),Rx={href:"https://github.com/gollum/gollum",target:"_blank",rel:"noopener noreferrer"},Ox=e("code",null,"MIT",-1),Fx=e("code",null,"Ruby",-1),Nx={href:"http://gruik.io/",target:"_blank",rel:"noopener noreferrer"},zx={href:"https://github.com/grena/gruik",target:"_blank",rel:"noopener noreferrer"},Wx=e("code",null,"GPLv3",-1),Jx=e("code",null,"PHP",-1),Ux={href:"https://github.com/claudioc/jingo",target:"_blank",rel:"noopener noreferrer"},Vx={href:"http://jingo.cica.li:6067/wiki/home",target:"_blank",rel:"noopener noreferrer"},qx={href:"https://github.com/claudioc/jingo",target:"_blank",rel:"noopener noreferrer"},Kx=e("code",null,"MIT",-1),Xx=e("code",null,"NodeJS",-1),Yx={href:"https://www.mediawiki.org/wiki/MediaWiki",target:"_blank",rel:"noopener noreferrer"},Zx={href:"https://phabricator.wikimedia.org/diffusion/MW/",target:"_blank",rel:"noopener noreferrer"},Qx=e("code",null,"GPLv2",-1),$x=e("code",null,"PHP",-1),eT={href:"https://moinmo.in/",target:"_blank",rel:"noopener noreferrer"},oT={href:"http://hg.moinmo.in/moin",target:"_blank",rel:"noopener noreferrer"},rT=e("code",null,"GPLv2",-1),tT=e("code",null,"Python",-1),nT={href:"https://github.com/minad/olelo",target:"_blank",rel:"noopener noreferrer"},sT={href:"http://gitwiki.org/",target:"_blank",rel:"noopener noreferrer"},lT=e("code",null,"MIT",-1),aT=e("code",null,"Ruby",-1),iT={href:"https://github.com/sbrl/Pepperminty-Wiki/",target:"_blank",rel:"noopener noreferrer"},hT={href:"https://starbeamrainbowlabs.com/labs/peppermint/build/",target:"_blank",rel:"noopener noreferrer"},cT=e("code",null,"MPLv2",-1),dT=e("code",null,"PHP",-1),_T={href:"http://www.pmwiki.org",target:"_blank",rel:"noopener noreferrer"},uT=e("code",null,"GPLv3",-1),pT=e("code",null,"PHP",-1),fT={href:"http://raneto.com/",target:"_blank",rel:"noopener noreferrer"},gT=e("code",null,"MIT",-1),bT=e("code",null,"NodeJS",-1),mT={href:"http://realms.io/",target:"_blank",rel:"noopener noreferrer"},kT={href:"https://github.com/scragg0x/realms-wiki",target:"_blank",rel:"noopener noreferrer"},wT=e("code",null,"GPLv2",-1),PT=e("code",null,"Python",-1),yT={href:"http://redaxscript.com/",target:"_blank",rel:"noopener noreferrer"},ST={href:"https://github.com/redaxmedia/redaxscript",target:"_blank",rel:"noopener noreferrer"},vT=e("code",null,"GPLv3",-1),CT=e("code",null,"PHP",-1),AT={href:"http://tiddlywiki.com/",target:"_blank",rel:"noopener noreferrer"},LT={href:"https://github.com/Jermolene/TiddlyWiki5",target:"_blank",rel:"noopener noreferrer"},MT=e("code",null,"BSD",-1),GT=e("code",null,"Javascript/Nodejs",-1),xT={href:"https://tiki.org",target:"_blank",rel:"noopener noreferrer"},TT={href:"https://tiki.org/Demo",target:"_blank",rel:"noopener noreferrer"},IT={href:"https://sourceforge.net/p/tikiwiki/code/HEAD/tree/",target:"_blank",rel:"noopener noreferrer"},ET=e("code",null,"LGPLv2",-1),DT=e("code",null,"PHP",-1),BT={href:"https://www.wikifeat.org/app/wikis/wikifeat/pages/welcome",target:"_blank",rel:"noopener noreferrer"},HT={href:"https://github.com/rhinoman/wikifeat",target:"_blank",rel:"noopener noreferrer"},jT=e("code",null,"BSD",-1),RT=e("code",null,"GO",-1),OT={href:"http://wikiss.tuxfamily.org/",target:"_blank",rel:"noopener noreferrer"},FT={href:"https://svnweb.tuxfamily.org/listing.php?repname=wikiss/svn&path=%2F&sc=0",target:"_blank",rel:"noopener noreferrer"},NT=e("code",null,"GPLv2",-1),zT=e("code",null,"PHP",-1),WT={href:"http://wikitten.vizuina.com/",target:"_blank",rel:"noopener noreferrer"},JT={href:"https://github.com/victorstanciu/Wikitten",target:"_blank",rel:"noopener noreferrer"},UT=e("code",null,"MIT",-1),VT=e("code",null,"PHP",-1),qT=e("h2",{id:"自托管解决方案",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#自托管解决方案","aria-hidden":"true"},"#"),o(" 自托管解决方案")],-1),KT={href:"https://arkos.io/",target:"_blank",rel:"noopener noreferrer"},XT={href:"https://git.coderouge.co/groups/arkOS",target:"_blank",rel:"noopener noreferrer"},YT={href:"https://github.com/cznweb",target:"_blank",rel:"noopener noreferrer"},ZT=e("code",null,"MIT/GPL",-1),QT=e("code",null,"Nodejs/Other",-1),$T={href:"https://cloudron.io",target:"_blank",rel:"noopener noreferrer"},eI={href:"https://git.cloudron.io/groups/cloudron",target:"_blank",rel:"noopener noreferrer"},oI=e("code",null,"AGPLv3",-1),rI=e("code",null,"Nodejs/Docker",-1),tI={href:"https://dfabric.github.io/DPlatform-ShellCore/",target:"_blank",rel:"noopener noreferrer"},nI={href:"https://github.com/j8r/DPlatform",target:"_blank",rel:"noopener noreferrer"},sI=e("code",null,"MIT",-1),lI=e("code",null,"Shell",-1),aI={href:"https://github.com/bashrc/freedombone",target:"_blank",rel:"noopener noreferrer"},iI=e("code",null,"GPLv3",-1),hI=e("code",null,"Shell",-1),cI={href:"https://wiki.debian.org/FreedomBox",target:"_blank",rel:"noopener noreferrer"},dI=e("code",null,"GPLv3",-1),_I=e("code",null,"Python/Other",-1),uI={href:"https://piratebox.cc/start",target:"_blank",rel:"noopener noreferrer"},pI={href:"https://github.com/PirateBox-Dev",target:"_blank",rel:"noopener noreferrer"},fI=e("code",null,"GPLv3",-1),gI=e("code",null,"Python/Other",-1),bI={href:"http://puffin.rocks/",target:"_blank",rel:"noopener noreferrer"},mI={href:"http://puffin.rocks/",target:"_blank",rel:"noopener noreferrer"},kI={href:"https://github.com/puffinrocks/puffin",target:"_blank",rel:"noopener noreferrer"},wI=e("code",null,"AGPLv3",-1),PI=e("code",null,"Python/Docker",-1),yI={href:"https://sandstorm.io/",target:"_blank",rel:"noopener noreferrer"},SI={href:"https://demo.sandstorm.io/",target:"_blank",rel:"noopener noreferrer"},vI={href:"https://github.com/sandstorm-io/sandstorm",target:"_blank",rel:"noopener noreferrer"},CI=e("code",null,"Apache",-1),AI=e("code",null,"C++/Other",-1),LI={href:"https://github.com/sovereign/sovereign",target:"_blank",rel:"noopener noreferrer"},MI=e("code",null,"GPLv3",-1),GI=e("code",null,"YAML/Other",-1),xI={href:"http://ubos.net/",target:"_blank",rel:"noopener noreferrer"},TI={href:"http://ubos.net/about/",target:"_blank",rel:"noopener noreferrer"},II=e("code",null,"GPLv3",-1),EI=e("code",null,"Perl/Other",-1),DI={href:"http://WikiSuite.org",target:"_blank",rel:"noopener noreferrer"},BI={href:"http://wikisuite.org/Source",target:"_blank",rel:"noopener noreferrer"},HI=e("code",null,"Multiple",-1),jI=e("code",null,"ClearOS",-1),RI={href:"https://yunohost.org/",target:"_blank",rel:"noopener noreferrer"},OI={href:"https://github.com/YunoHost",target:"_blank",rel:"noopener noreferrer"},FI=e("code",null,"AGPLv3",-1),NI=e("code",null,"Python/Other",-1),zI=e("hr",null,null,-1),WI=e("h2",{id:"许可列表",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#许可列表","aria-hidden":"true"},"#"),o(" 许可列表")],-1),JI=e("li",null,[e("code",null,"⚠"),o(" - Depends on a third party network service")],-1),UI=e("code",null,"AAL",-1),VI={href:"https://opensource.org/licenses/AAL",target:"_blank",rel:"noopener noreferrer"},qI=e("code",null,"AGPLv3",-1),KI={href:"https://www.gnu.org/licenses/agpl-3.0",target:"_blank",rel:"noopener noreferrer"},XI=e("code",null,"Apache",-1),YI={href:"http://www.apache.org/licenses/",target:"_blank",rel:"noopener noreferrer"},ZI=e("code",null,"ARTv2",-1),QI={href:"http://opensource.org/licenses/Artistic-2.0",target:"_blank",rel:"noopener noreferrer"},$I=e("code",null,"BSD",-1),eE={href:"https://www.freebsd.org/copyright/license.html",target:"_blank",rel:"noopener noreferrer"},oE=e("code",null,"CCBYNCSAv3",-1),rE={href:"https://creativecommons.org/licenses/by-nc-sa/3.0/",target:"_blank",rel:"noopener noreferrer"},tE=e("code",null,"CCBYNCv4",-1),nE={href:"https://creativecommons.org/licenses/by-nc/4.0/",target:"_blank",rel:"noopener noreferrer"},sE=e("code",null,"CC0",-1),lE={href:"https://creativecommons.org/about/cc0/",target:"_blank",rel:"noopener noreferrer"},aE=e("code",null,"CeCILL-B",-1),iE={href:"http://www.cecill.info/licences/Licence_CeCILL-B_V1-en.txt",target:"_blank",rel:"noopener noreferrer"},hE=e("code",null,"CPALv1",-1),cE={href:"http://opensource.org/licenses/CPAL-1.0",target:"_blank",rel:"noopener noreferrer"},dE=e("code",null,"ECLv2",-1),_E={href:"http://opensource.org/licenses/ECL-2.0",target:"_blank",rel:"noopener noreferrer"},uE=e("code",null,"EPLv1",-1),pE={href:"https://www.eclipse.org/legal/epl-v10.html",target:"_blank",rel:"noopener noreferrer"},fE=e("code",null,"GPL",-1),gE={href:"https://www.gnu.org/licenses/gpl-1.0",target:"_blank",rel:"noopener noreferrer"},bE=e("code",null,"GPLv2",-1),mE={href:"https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html",target:"_blank",rel:"noopener noreferrer"},kE=e("code",null,"GPLv3",-1),wE={href:"http://www.gnu.org/licenses/gpl-3.0.en.html",target:"_blank",rel:"noopener noreferrer"},PE=e("code",null,"IPL",-1),yE={href:"https://opensource.org/licenses/IPL-1.0",target:"_blank",rel:"noopener noreferrer"},SE=e("code",null,"ISC",-1),vE={href:"https://www.isc.org/downloads/software-support-policy/isc-license/",target:"_blank",rel:"noopener noreferrer"},CE=e("code",null,"LGPLv2",-1),AE={href:"http://opensource.org/licenses/LGPL-2.1",target:"_blank",rel:"noopener noreferrer"},LE=e("code",null,"LGPLv3",-1),ME={href:"http://opensource.org/licenses/LGPL-3.0",target:"_blank",rel:"noopener noreferrer"},GE=e("code",null,"MIT",-1),xE={href:"http://opensource.org/licenses/MIT",target:"_blank",rel:"noopener noreferrer"},TE=e("code",null,"MPLv2",-1),IE={href:"https://www.mozilla.org/MPL/2.0/index.txt",target:"_blank",rel:"noopener noreferrer"},EE=e("code",null,"OSLv3",-1),DE={href:"https://opensource.org/licenses/osl-3.0.php",target:"_blank",rel:"noopener noreferrer"},BE=e("code",null,"SENDMAIL",-1),HE={href:"https://www.sendmail.com/pdfs/open_source/sendmail_license.pdf",target:"_blank",rel:"noopener noreferrer"},jE=e("code",null,"Zlib",-1),RE={href:"https://opensource.org/licenses/Zlib",target:"_blank",rel:"noopener noreferrer"},OE=e("code",null,"Zope",-1),FE={href:"http://opensource.org/licenses/ZPL-2.0",target:"_blank",rel:"noopener noreferrer"},NE=e("hr",null,null,-1),zE=e("h2",{id:"外链",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#外链","aria-hidden":"true"},"#"),o(" 外链")],-1),WE={href:"https://chat.awesome-selfhosted.com",target:"_blank",rel:"noopener noreferrer"},JE={href:"https://github.com/onurakpolat/awesome-bigdata",target:"_blank",rel:"noopener noreferrer"},UE={href:"https://github.com/n1trux/awesome-sysadmin",target:"_blank",rel:"noopener noreferrer"},VE={href:"https://prism-break.org/en/",target:"_blank",rel:"noopener noreferrer"},qE={href:"https://www.privacytools.io/",target:"_blank",rel:"noopener noreferrer"},KE={href:"https://redecentralize.github.io/alternative-internet/",target:"_blank",rel:"noopener noreferrer"},XE={href:"https://freedns.afraid.org/domain/registry/",target:"_blank",rel:"noopener noreferrer"},YE={href:"https://pagekite.net/",target:"_blank",rel:"noopener noreferrer"},ZE={href:"https://www.reddit.com/r/selfhosted",target:"_blank",rel:"noopener noreferrer"},QE={href:"http://www.auto-hebergement.fr/",target:"_blank",rel:"noopener noreferrer"},$E=e("hr",null,null,-1),eD=e("h2",{id:"贡献",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#贡献","aria-hidden":"true"},"#"),o(" 贡献")],-1),oD=n('

        作者

        The list of authors can be found here.

        许可

        This list is under the Creative Commons Attribution-ShareAlike 3.0 Unported License.

        ',4);function rD(tD,nD){const t=l("ExternalLinkIcon"),s=l("RouterLink");return c(),d("div",null,[e("p",null,[e("a",u,[o("Awesome-Selfhosted"),r(t)]),o(" 是由 "),e("a",p,[o("Edward D"),r(t)]),o(" 发起和维护资源列表,收集了许多可以在本地搭建的网络服务和 Web 应用列表。")]),e("p",null,[e("a",f,[o("Awesome-Selfhosted-cn"),r(t)]),o(" 则是依据 "),e("a",g,[o("Awesome-Selfhosted"),r(t)]),o(" 翻译而来。也欢迎你帮助推荐和提供建议!")]),b,e("p",null,[o("This is a list of "),e("a",m,[o("Free"),r(t)]),o(" Software "),e("a",k,[o("network services"),r(t)]),o(" and "),e("a",w,[o("web applications"),r(t)]),o(" which can be hosted locally. Non-Free software is listed on the "),r(s,{to:"/_posts/non-free.html"},{default:a(()=>[o("Non-Free")]),_:1}),o(" page.")]),P,i(" BEGIN SOFTWARE LIST "),y,S,e("ul",null,[e("li",null,[e("a",v,[o("AWStats"),r(t)]),o(" - Generates web, streaming, ftp or mail server statistics graphically. ("),e("a",C,[o("Source Code"),r(t)]),o(") "),A,o(),L]),e("li",null,[e("a",M,[o("Countly"),r(t)]),o(" - Real time mobile & web analytics, crash reporting and push notifications platform. ("),e("a",G,[o("Source Code"),r(t)]),o(") "),x,o(),T]),e("li",null,[e("a",I,[o("Druid"),r(t)]),o(" - A distributed, column-oriented, real-time analytics data store. ("),e("a",E,[o("Source Code"),r(t)]),o(") "),D,o(),B]),e("li",null,[e("a",H,[o("GoAccess"),r(t)]),o(" - Real-time web log analyzer and interactive viewer that runs in a terminal. ("),e("a",j,[o("Source Code"),r(t)]),o(") "),R,o(),O]),e("li",null,[e("a",F,[o("Open Web Analytics"),r(t)]),o(" - Google Analytics and Piwik alternative. ("),e("a",N,[o("Source Code"),r(t)]),o(") "),z,o(),W]),e("li",null,[e("a",J,[o("Piwik"),r(t)]),o(" - Leading open-source analytics platform that gives you more than just powerful analytics. ("),e("a",U,[o("Source Code"),r(t)]),o(") "),V,o(),q]),e("li",null,[e("a",K,[o("Serposcope"),r(t)]),o(" - Serposcope is a free and open-source rank tracker to monitor websites ranking in Google and improve your SEO performances. ("),e("a",X,[o("Source Code"),r(t)]),o(") "),Y,o(),Z]),e("li",null,[e("a",Q,[o("Snowplow"),r(t)]),o(" - Have every single event, from your websites, mobile apps, desktop applications and server-side systems, stored in your own data warehouse and available to action in real-time. ("),e("a",$,[o("Source Code"),r(t)]),o(") "),ee,o(),oe]),e("li",null,[e("a",re,[o("ThinkUp"),r(t)]),o(" - Insights into your social networking activity on Twitter, Facebook, Instagram, and beyond. ("),e("a",te,[o("Source Code"),r(t)]),o(") "),ne,o(),se])]),le,e("ul",null,[e("li",null,[e("a",ae,[o("Metabase"),r(t)]),o(" - Simple Dashboarding and GUI Query tool, Nightly Emails and Slack Integration w/ PostgreSQL, MySQL, Redshift and other DBs. ("),e("a",ie,[o("Source Code"),r(t)]),o(") "),he,o(),ce]),e("li",null,[e("a",de,[o("Redash"),r(t)]),o(' - connect to over 18 types of databases (SQL and "NoSQL"), query your data, visualize it and create dashboards. Everything has a URL that can be shared. Slack and HipChat integration. ('),e("a",_e,[o("Demo"),r(t)]),o(", "),e("a",ue,[o("Source Code"),r(t)]),o(") "),pe,o(),fe])]),ge,e("ul",null,[e("li",null,[e("a",be,[o("Alltube"),r(t)]),o(" - A web interface for "),e("a",me,[o("youtube-dl"),r(t)]),o(", a program to download videos and audio from "),e("a",ke,[o("more than 100 websites"),r(t)]),o(". ("),e("a",we,[o("Demo"),r(t)]),o(", "),e("a",Pe,[o("Source Code"),r(t)]),o(") "),ye,o(),Se]),e("li",null,[e("a",ve,[o("AmIUnique"),r(t)]),o(" - Learn how identifiable you are on the Internet (browser fingerprinting tool). ("),e("a",Ce,[o("Source code"),r(t)]),o(),Ae,o(),Le]),e("li",null,[e("a",Me,[o("bip.io"),r(t)]),o(" - Web Automation For People And Robots - Drag, Drop, and Connect The Services You Love. ("),e("a",Ge,[o("Source Code"),r(t)]),o(") "),xe,o(),Te]),e("li",null,[e("a",Ie,[o("CouchPotato"),r(t)]),o(" - CouchPotato is an automatic Video Library Manager for Movies. Automatic torrent/nzb searching, downloading, and processing at the qualities you want. ("),e("a",Ee,[o("Source Code"),r(t)]),o(") "),De,o(),Be]),e("li",null,[e("a",He,[o("Headphones"),r(t)]),o(" - An automated music downloader for NZB and Torrent, written in Python. It supports SABnzbd, NZBget, Transmission, µTorrent, Deluge and Blackhole. "),je,o(),Re]),e("li",null,[e("a",Oe,[o("Healthchecks"),r(t)]),o(" - Django app which listens for pings and sends alerts when pings are late. ("),e("a",Fe,[o("Source Code"),r(t)]),o(") "),Ne,o(),ze]),e("li",null,[e("a",We,[o("Huginn"),r(t)]),o(" - Allows you to build agents that monitor and act on your behalf - "),Je,o(),Ue]),e("li",null,[e("a",Ve,[o("Http2pic"),r(t)]),o(" - Website screenshots/renderer. It uses the wkhtmltox to render websites with various options. ("),e("a",qe,[o("Source Code"),r(t)]),o(") "),Ke,o(),Xe]),e("li",null,[e("a",Ye,[o("Node RED"),r(t)]),o(" - A browser-based flow editor that helps you wiring hardware devices, APIs and online services to create IoT solutions. ("),e("a",Ze,[o("Source Code"),r(t)]),o(") "),Qe,o(),$e]),e("li",null,[e("a",eo,[o("openHAB"),r(t)]),o(" - Vendor and technology agnostic open source software for home automation. ("),e("a",oo,[o("Source Code"),r(t)]),o(") "),ro,o(),to]),e("li",null,[e("a",no,[o("RSS-Bridge"),r(t)]),o(" - rss-bridge is a PHP project capable of generating ATOM feeds for websites which don't have one. "),so,o(),lo]),e("li",null,[e("a",ao,[o("SickRage"),r(t)]),o(" - SickRage is an automatic Video Library Manager for TV Shows. Automatic torrent/nzb searching, downloading, and processing at the qualities you want. ("),e("a",io,[o("Source Code"),r(t)]),o(") "),ho,o(),co]),e("li",null,[e("a",_o,[o("Sonarr"),r(t)]),o(" - An automatic TV Shows downloader and manager for Usenet and BitTorrent. It can grab, sort and rename new episodes and automatically upgrade the quality of files already downloaded when a better quality format becomes available. ("),e("a",uo,[o("Source Code"),r(t)]),o(") "),po,o(),fo]),e("li",null,[e("a",go,[o("TriggerHappy"),r(t)]),o(" - An opensource clone of IFTTT, a bridge between your internet services. ("),e("a",bo,[o("Source Code"),r(t)]),o(") "),mo,o(),ko]),e("li",null,[e("a",wo,[o("WTFDYUM"),r(t)]),o(" a.k.a Why The Fuck Did You Unfollow Me - Find out who stops following you on Twitter. ("),e("a",Po,[o("Demo"),r(t)]),o(", "),e("a",yo,[o("Source Code"),r(t)]),o(") "),So,o(),vo]),e("li",null,[e("a",Co,[o("Zenbot 3"),r(t)]),o(" - Zenbot is a lightweight, extendable, artificially intelligent trading bot for Bitcoin, Ether, Litecoin, and more. ("),e("a",Ao,[o("Demo"),r(t)]),o(", "),e("a",Lo,[o("Source Code"),r(t)]),o(") "),Mo,o(),Go])]),xo,e("p",null,[o("See also "),To,o(", "),Io,o(" and "),e("a",Eo,[o("WeblogMatrix"),r(t)])]),e("ul",null,[e("li",null,[e("a",Do,[o("Anchor CMS"),r(t)]),o(" - Anchor is a free, lightweight, faster-than-a-bullet, simple blogging system, made for art–directed posts. ("),e("a",Bo,[o("Source Code"),r(t)]),o(") "),Ho,o(),jo]),e("li",null,[e("a",Ro,[o("Antville"),r(t)]),o(" - Antville is a free, open source project aimed at the development of a high performance, feature rich weblog hosting software. ("),e("a",Oo,[o("Source Code"),r(t)]),o(") "),Fo,o(),No]),e("li",null,[e("a",zo,[o("Blogotext"),r(t)]),o(" - A free blog-engine written in PHP and using SQLite. This offers you both an unmatched simplicity during installation and great performances. ("),e("a",Wo,[o("Source Code"),r(t)]),o(") "),Jo,o(),Uo]),e("li",null,[e("a",Vo,[o("Chyrp"),r(t)]),o(" - An extra-awesome, extra-lightweight blog engine. "),qo,o(),Ko]),e("li",null,[e("a",Xo,[o("Dotclear"),r(t)]),o(" - Take control over your blog! ("),e("a",Yo,[o("Source Code"),r(t)]),o(") "),Zo,o(),Qo]),e("li",null,[e("a",$o,[o("Ghost"),r(t)]),o(" - Just a blogging platform. ("),e("a",er,[o("Source Code"),r(t)]),o(") "),or,o(),rr]),e("li",null,[e("a",tr,[o("htmly"),r(t)]),o(" - Databaseless Blogging Platform (Flat-File Blog). ("),e("a",nr,[o("Demo"),r(t)]),o(", "),e("a",sr,[o("Source Code"),r(t)]),o(") "),lr,o(),ar]),e("li",null,[e("a",ir,[o("Known"),r(t)]),o(" - A single website for all your content. ("),e("a",hr,[o("Source Code"),r(t)]),o(") "),cr,o(),dr]),e("li",null,[e("a",_r,[o("Noddity"),r(t)]),o(" - It's a blog, it's a wiki, it's a fast CMS! ("),e("a",ur,[o("Source Code"),r(t)]),o(") "),pr,o(),fr]),e("li",null,[e("a",gr,[o("PluXml"),r(t)]),o(" - XML-based blog/CMS platform. ("),e("a",br,[o("Source Code"),r(t)]),o(") "),mr,o(),kr]),e("li",null,[e("a",wr,[o("Postleaf"),r(t)]),o(" - An open source blogging platform with inline editing, handlebar templates, and a beautiful user interface. ("),e("a",Pr,[o("Source Code"),r(t)]),o(") "),yr,o(),Sr]),e("li",null,[e("a",vr,[o("Wagtail"),r(t)]),o(" - A Django content management system focused on flexibility and user experience. ("),e("a",Cr,[o("Source Code"),r(t)]),o(") "),Ar,o(),Lr]),e("li",null,[e("a",Mr,[o("WordPress"),r(t)]),o(" - Create a beautiful website or blog. ("),e("a",Gr,[o("Source Code"),r(t)]),o(") "),xr,o(),Tr])]),Ir,e("ul",null,[e("li",null,[e("a",Er,[o("Bookie"),r(t)]),o(" - Python based "),e("a",Dr,[o("delicious.com"),r(t)]),o(" replacement. "),Br,o(),Hr]),e("li",null,[e("a",jr,[o("Firefox Auth Server"),r(t)]),o(" - This project implements the core server-side API for Firefox Accounts. ("),e("a",Rr,[o("Source Code"),r(t)]),o(") "),Or,o(),Fr]),e("li",null,[e("a",Nr,[o("Firefox Content Server"),r(t)]),o(" - Static server that hosts Firefox Account sign up, sign in, email verification, etc. flows. ("),e("a",zr,[o("Source Code"),r(t)]),o(") "),Wr,o(),Jr]),e("li",null,[e("a",Ur,[o("Firefox Sync Server"),r(t)]),o(" - Sync Firefox bookmarks, passwords, history, tabs, preferences. ("),e("a",Vr,[o("Source Code"),r(t)]),o(") "),qr,o(),Kr]),e("li",null,[e("a",Xr,[o("Lobsters"),r(t)]),o(" - Run your own link aggregation site. ("),e("a",Yr,[o("Source Code"),r(t)]),o(") "),Zr,o(),Qr]),e("li",null,[e("a",$r,[o("No Fuss Bookmarks"),r(t)]),o(" - Very simple software and service to store bookmarks especially designed for hackers (that don't need fancy interfaces, but nice API). ("),e("a",et,[o("Source Code"),r(t)]),o(") "),ot,o(),rt]),e("li",null,[e("a",tt,[o("Pinry"),r(t)]),o(" - The tiling image board system for people who want to save, tag, and share images, videos, and webpages. ("),e("a",nt,[o("Source Code"),r(t)]),o(") "),st,o(),lt]),e("li",null,[e("a",at,[o("saveto.co"),r(t)]),o(" - An open source, home for the best links on the web. ("),e("a",it,[o("Source Code"),r(t)]),o(") "),ht,o(),ct]),e("li",null,[e("a",dt,[o("Shaarli"),r(t)]),o(" - Personal, minimalist, super-fast, no-database bookmarking and link sharing plaform. ("),e("a",_t,[o("Demo"),r(t)]),o(") "),ut,o(),pt]),e("li",null,[e("a",ft,[o("unmark"),r(t)]),o(" - An open source to do app for links. ("),e("a",gt,[o("Source Code"),r(t)]),o(") "),bt,o(),mt])]),kt,wt,e("ul",null,[e("li",null,[e("a",Pt,[o("AgenDAV"),r(t)]),o(" - Multilanguage CalDAV web client with a rich AJAX interface and shared calendars support. ("),e("a",yt,[o("Source Code"),r(t)]),o(") "),St,o(),vt]),e("li",null,[e("a",Ct,[o("Baïkal"),r(t)]),o(" - Lightweight CalDAV+CardDAV server. ("),e("a",At,[o("Source Code"),r(t)]),o(") "),Lt,o(),Mt]),e("li",null,[e("a",Gt,[o("CalendarServer"),r(t)]),o(" - A standards-compliant server implementing the CalDAV and CardDAV protocols. "),xt,o(),Tt]),e("li",null,[e("a",It,[o("calypso"),r(t)]),o(" - A python-based CalDAV/CardDAV server. ("),e("a",Et,[o("Source Code"),r(t)]),o(") "),Dt,o(),Bt]),e("li",null,[e("a",Ht,[o("DAViCal"),r(t)]),o(" - A server for calendar sharing (CalDAV). ("),e("a",jt,[o("Source Code"),r(t)]),o(") "),Rt,o(),Ot]),e("li",null,[e("a",Ft,[o("ownCloud calendar"),r(t)]),o(" - The ownCloud Calendar app enables you to create and edit events, synchronize to other calendars you might use, and create new, personalized calendars. ("),e("a",Nt,[o("Source Code"),r(t)]),o(") "),zt,o(),Wt]),e("li",null,[e("a",Jt,[o("Radicale"),r(t)]),o(" - A Simple Calendar and Contact Server. ("),e("a",Ut,[o("Source Code"),r(t)]),o(") "),Vt,o(),qt]),e("li",null,[e("a",Kt,[o("sabre/dav"),r(t)]),o(" - A open source CardDAV, CalDAV and WebDAV server. ("),e("a",Xt,[o("Source Code"),r(t)]),o(") "),Yt,o(),Zt]),e("li",null,[e("a",Qt,[o("InfCloud"),r(t)]),o(" - An open source CalDAV/CardDAV web client implementation. ("),e("a",$t,[o("Demo"),r(t)]),o(", "),e("a",en,[o("Source Code"),r(t)]),o(") "),on,o(),rn])]),tn,nn,e("ul",null,[e("li",null,[e("a",sn,[o("Actor"),r(t)]),o(" - Actor is a fast, open source messaging platform with rich mobile and web clients. ("),e("a",ln,[o("Demo"),r(t)]),o(", "),e("a",an,[o("Source Code"),r(t)]),o(") "),hn,o(),cn]),e("li",null,[e("a",dn,[o("Cherry"),r(t)]),o(" - A tiny webchat server. "),_n,o(),un]),e("li",null,[e("a",pn,[o("Freenet"),r(t)]),o(' - Anonymously share files, browse and publish "freesites" (web sites accessible only through Freenet) and chat on forums. ('),e("a",fn,[o("Source Code"),r(t)]),o(") "),gn,o(),bn]),e("li",null,[e("a",mn,[o("Friends"),r(t)]),o(" - P2P chat powered by the web. ("),e("a",kn,[o("Source Code"),r(t)]),o(") "),wn,o(),Pn]),e("li",null,[e("a",yn,[o("GNUNet"),r(t)]),o(" - Free software framework for decentralized, peer-to-peer networking. ("),e("a",Sn,[o("Source Code"),r(t)]),o(") "),vn,o(),Cn]),e("li",null,[e("a",An,[o("Jitsi Meet"),r(t)]),o(" - Jitsi Meet is an OpenSource (MIT) WebRTC Javascript application that uses Jitsi Videobridge to provide high quality, scalable video conferences. ("),e("a",Ln,[o("Source Code"),r(t)]),o(") "),Mn,o(),Gn]),e("li",null,[e("a",xn,[o("Jitsi Video Bridge"),r(t)]),o(" - WebRTC compatible Selective Forwarding Unit (SFU) that allows for multiuser video communication. ("),e("a",Tn,[o("Source Code"),r(t)]),o(") "),In,o(),En]),e("li",null,[e("a",Dn,[o("Kandan"),r(t)]),o(" - Kandan is an Open Source Alternative to HipChat. ("),e("a",Bn,[o("Source Code"),r(t)]),o(") "),Hn,o(),jn]),e("li",null,[e("a",Rn,[o("Lets-Chat"),r(t)]),o(" - A self hosted chat suite written in Node. ("),e("a",On,[o("Source Code"),r(t)]),o(") "),Fn,o(),Nn]),e("li",null,[e("a",zn,[o("Live Helper Chat"),r(t)]),o(" - Live Support chat for your website. ("),e("a",Wn,[o("Source Code"),r(t)]),o(") "),Jn,o(),Un]),e("li",null,[e("a",Vn,[o("Mattermost"),r(t)]),o(" - Open-source, on-prem Slack-alternative. It can be integrated with "),e("a",qn,[o("Gitlab"),r(t)]),o(". ("),e("a",Kn,[o("Source Code"),r(t)]),o(") "),Xn,o(),Yn]),e("li",null,[e("a",Zn,[o("Mibew"),r(t)]),o(" - Mibew Messenger is an open-source live support application written in PHP and MySQL. It enables one-on-one chat assistance in real-time directly from your website. ("),e("a",Qn,[o("Demo"),r(t)]),o(", "),e("a",$n,[o("Source Code"),r(t)]),o(") "),es,o(),os]),e("li",null,[e("a",rs,[o("Mumble"),r(t)]),o(" - Low-latency, high quality voice/text chat software. ("),e("a",ts,[o("Source Code"),r(t)]),o(") "),ns,o(),ss,e("ul",null,[e("li",null,[e("a",ls,[o("Mumblecop"),r(t)]),o(" - Stream audio from youtube and soundcloud, simulate dice rolls, or write your own commands with a simple plugin format. "),as,o(),is])])]),e("li",null,[e("a",hs,[o("Node-Chat"),r(t)]),o(" - A not-so-basic open-source chat with admin features. "),cs,o(),ds]),e("li",null,[e("a",_s,[o("RetroShare"),r(t)]),o(" - Secured and decentralized communication system. Offers decentralized chat, forums, messaging, file transfer. ("),e("a",us,[o("Source Code"),r(t)]),o(") "),ps,o(),fs]),e("li",null,[e("a",gs,[o("Rocket.Chat"),r(t)]),o(" – Teamchat solution similar to "),e("a",bs,[o("Gitter.im"),r(t)]),o(" or Slack. ("),e("a",ms,[o("Source Code"),r(t)]),o(") "),ks,o(),ws]),e("li",null,[e("a",Ps,[o("Synapse"),r(t)]),o(" - A server for "),e("a",ys,[o("Matrix"),r(t)]),o(", an open standard for decentralized persistent communication. ("),e("a",Ss,[o("Source Code"),r(t)]),o(") "),vs,o(),Cs,e("ul",null,[e("li",null,[e("a",As,[o("Matrix Console Web"),r(t)]),o(" - A web client meant to be a showcase of Matrix capabilities, and reference implementation of the Matrix standard. ("),e("a",Ls,[o("Source Code"),r(t)]),o(") "),Ms,o(),Gs]),e("li",null,[e("a",xs,[o("Vector"),r(t)]),o(" - A glossy Matrix web client with an emphasis on performance and usability. ("),e("a",Ts,[o("Source Code"),r(t)]),o(") "),Is,o(),Es])])]),e("li",null,[e("a",Ds,[o("Syndie"),r(t)]),o(" - Syndie is a libre system for operating distributed forums. "),Bs,o(),Hs]),e("li",null,[e("a",js,[o("TextBelt"),r(t)]),o(),Rs,o(" - An outgoing SMS API that uses carrier-specific gateways to deliver your text messages for free, and without ads. "),Os,o(),Fs]),e("li",null,[e("a",Ns,[o("Tox"),r(t)]),o(" - A distributed, secure messenger with audio and video chat capabilities. ("),e("a",zs,[o("Source Code"),r(t)]),o(") "),Ws,o(),Js]),e("li",null,[e("a",Us,[o("Tuber"),r(t)]),o(" - Peer-to-peer video chat that works. ("),e("a",Vs,[o("Source Code"),r(t)]),o(") "),qs,o(),Ks]),e("li",null,[e("a",Xs,[o("Zulip"),r(t)]),o(" - Zulip is a powerful, open source group chat application. ("),e("a",Ys,[o("Source Code"),r(t)]),o(") "),Zs,o(),Qs])]),$s,el,ol,e("ul",null,[e("li",null,[e("a",rl,[o("Citadel"),r(t)]),o(' - Feature packed, easy, versatile, and powerful mail server, thanks to exclusive "rooms" based architecture. ('),e("a",tl,[o("Source Code"),r(t)]),o(") "),nl,o(),sl]),e("li",null,[e("a",ll,[o("iRedMail"),r(t)]),o(" - Full-featured mail server solution based on Postfix and Dovecot. ("),e("a",al,[o("Source Code"),r(t)]),o(") "),il,o(),hl]),e("li",null,[e("a",cl,[o("Mailcow"),r(t)]),o(" - Mail server suite based on Dovecot, Postfix and other open source software, that provides a modern Web UI for administration. ("),e("a",dl,[o("Source Code"),r(t)]),o(") "),_l,o(),ul]),e("li",null,[e("a",pl,[o("Mail-in-a-Box"),r(t)]),o(" - Turns any Ubuntu server into a fully functional mail server with one command. ("),e("a",fl,[o("Source Code"),r(t)]),o(") "),gl,o(),bl]),e("li",null,[e("a",ml,[o("Modoboa"),r(t)]),o(" - Modoboa is a mail hosting and management platform including a modern and simplified Web User Interface. ("),e("a",kl,[o("Source Code"),r(t)]),o(") "),wl,o(),Pl])]),yl,Sl,e("ul",null,[e("li",null,[e("a",vl,[o("Courier MTA"),r(t)]),o(" - Fast, scalable, enterprise mail/groupware server providing ESMTP, IMAP, POP3, webmail, mailing list, basic web-based calendaring and scheduling services. ("),e("a",Cl,[o("Source Code"),r(t)]),o(") "),Al,o(),Ll]),e("li",null,[e("a",Ml,[o("Exim"),r(t)]),o(" - Message transfer agent (MTA) developed at the University of Cambridge. ("),e("a",Gl,[o("Source Code"),r(t)]),o(") "),xl,o(),Tl]),e("li",null,[e("a",Il,[o("Haraka"),r(t)]),o(" - A high-performance, pluginable SMTP server written in Javascript. ("),e("a",El,[o("Source Code"),r(t)]),o(") "),Dl,o(),Bl]),e("li",null,[e("a",Hl,[o("MailCatcher"),r(t)]),o(" - Ruby gem that deploys a simply SMTP MTA gateway that accepts all mail and displays in web interface. Useful for debugging or development. ("),e("a",jl,[o("Source Code"),r(t)]),o(") "),Rl,o(),Ol]),e("li",null,[e("a",Fl,[o("Maildrop"),r(t)]),o(" - Disposable email SMTP server, also useful for development. "),Nl,o(),zl]),e("li",null,[e("a",Wl,[o("MailHog"),r(t)]),o(" - Small Golang executable which runs an SMTP MTA gateway that accepts all mail and displays in web interface. Useful for debugging or development. "),Jl,o(),Ul]),e("li",null,[e("a",Vl,[o("OpenSMTPD"),r(t)]),o(" - Secure SMTP server implementation from the OpenBSD project. ("),e("a",ql,[o("Source Code"),r(t)]),o(") "),Kl,o(),Xl]),e("li",null,[e("a",Yl,[o("Postfix"),r(t)]),o(" - Fast, easy to administer, and secure Sendmail replacement. "),Zl,o(),Ql]),e("li",null,[e("a",$l,[o("Qmail"),r(t)]),o(" - Secure Sendmail replacement. ("),e("a",ea,[o("Source Code"),r(t)]),o(") "),oa,o(),ra]),e("li",null,[e("a",ta,[o("Sendmail"),r(t)]),o(" - Message transfer agent (MTA). "),na,o(),sa]),e("li",null,[e("a",la,[o("Slimta"),r(t)]),o(" - Mail Transfer Library built on Python. ("),e("a",aa,[o("Source Code"),r(t)]),o(") "),ia,o(),ha])]),ca,da,e("ul",null,[e("li",null,[e("a",_a,[o("Cyrus IMAP/POP3"),r(t)]),o(" - Intended to be run on sealed servers, where normal users are not permitted to log in. ("),e("a",ua,[o("Source Code"),r(t)]),o(") "),pa,o(),fa]),e("li",null,[e("a",ga,[o("Dovecot"),r(t)]),o(" - IMAP and POP3 server written primarily with security in mind. ("),e("a",ba,[o("Source Code"),r(t)]),o(") "),ma,o(),ka]),e("li",null,[e("a",wa,[o("Piler"),r(t)]),o(" - feature rich open source email archiving solution. ("),e("a",Pa,[o("Source Code"),r(t)]),o(") "),ya,o(),Sa])]),va,Ca,e("ul",null,[e("li",null,[e("a",Aa,[o("Dada Mail"),r(t)]),o(" - A web-based list management system that can be used for announcement lists and/or discussion lists. ("),e("a",La,[o("Source Code"),r(t)]),o(") "),Ma,o(),Ga]),e("li",null,[e("a",xa,[o("Mailman"),r(t)]),o(" - The Gnu mailing list server. "),Ta,o(),Ia]),e("li",null,[e("a",Ea,[o("Mailtrain"),r(t)]),o(" - self hosted newsletter application built on Node.js (v5+) and MySQL (v5.5+ or MariaDB). ("),e("a",Da,[o("Source Code"),r(t)]),o(") "),Ba,o(),Ha]),e("li",null,[e("a",ja,[o("Mautic"),r(t)]),o(" - Mautic is marketing automation software (email, social & more). ("),e("a",Ra,[o("Source Code"),r(t)]),o(") "),Oa,o(),Fa]),e("li",null,[e("a",Na,[o("phpList"),r(t)]),o(" - Newsletter and email marketing with advanced management of subscribers, bounces, and plugins. ("),e("a",za,[o("Source Code"),r(t)]),o(") "),Wa,o(),Ja]),e("li",null,[e("a",Ua,[o("Sympa"),r(t)]),o(" - A mailing list manager. "),Va,o(),qa])]),Ka,e("ul",null,[e("li",null,[e("a",Xa,[o("Cypht"),r(t)]),o(" - A feed reader for your email accounts. ("),e("a",Ya,[o("Source Code"),r(t)]),o(") "),Za,o(),Qa]),e("li",null,[e("a",$a,[o("Mailpile"),r(t)]),o(" - Webmail client with search, filtering, encryption features and more. ("),e("a",ei,[o("Source Code"),r(t)]),o(") "),oi,o(),ri]),e("li",null,[e("a",ti,[o("RainLoop"),r(t)]),o(" - Simple, modern & fast webmail with IMAP/SMTP Support and multi accounting. ("),e("a",ni,[o("Demo"),r(t)]),o(", "),e("a",si,[o("Source Code"),r(t)]),o("). "),li,o(),ai]),e("li",null,[e("a",ii,[o("Roundcube"),r(t)]),o(" - Browser-based IMAP client with an application-like user interface. ("),e("a",hi,[o("Screenshots"),r(t)]),o(") ("),e("a",ci,[o("Source Code"),r(t)]),o(") "),di,o(),_i]),e("li",null,[e("a",ui,[o("SquirrelMail"),r(t)]),o(" - Another browser-based IMAP client. ("),e("a",pi,[o("Source Code"),r(t)]),o(") "),fi,o(),gi]),e("li",null,[e("a",bi,[o("WebMail Lite"),r(t)]),o(" - Web-based IMAP Mail client. ("),e("a",mi,[o("Source Code"),r(t)]),o(") "),ki,o(),wi])]),Pi,e("p",null,[e("em",null,[e("a",yi,[o("IRC"),r(t)]),o(" communication software")])]),e("ul",null,[e("li",null,[e("a",Si,[o("Convos"),r(t)]),o(" - Always online web IRC client. ("),e("a",vi,[o("Demo"),r(t)]),o(", "),e("a",Ci,[o("Source Code"),r(t)]),o(") "),Ai,o(),Li]),e("li",null,[e("a",Mi,[o("IRCAnywhere"),r(t)]),o(" - Open-source self-hosted alternative to IRCCloud. ("),e("a",Gi,[o("Source Code"),r(t)]),o(") "),xi,o(),Ti]),e("li",null,[e("a",Ii,[o("Quassel IRC"),r(t)]),o(" - distributed IRC client, meaning that one (or multiple) client(s) can attach to and detach from a central core. ("),e("a",Ei,[o("Source Code"),r(t)]),o(") "),Di,o(),Bi]),e("li",null,[e("a",Hi,[o("Robust IRC"),r(t)]),o(" - RobustIRC is IRC without netsplits. Distributed IRC server, based on RobustSession protocol. ("),e("a",ji,[o("Source Code"),r(t)]),o(") "),Ri,o(),Oi]),e("li",null,[e("a",Fi,[o("The Lounge"),r(t)]),o(" - The self-hosted web IRC client. ("),e("a",Ni,[o("Demo"),r(t)]),o(", "),e("a",zi,[o("Source Code"),r(t)]),o(") "),Wi,o(),Ji]),e("li",null,[e("a",Ui,[o("Weechat"),r(t)]),o(" - A fast, light and extensible chat client. "),Vi,o(),qi]),e("li",null,[e("a",Ki,[o("ZNC"),r(t)]),o(" - An advanced IRC bouncer. ("),e("a",Xi,[o("Source Code"),r(t)]),o(") "),Yi,o(),Zi])]),Qi,e("p",null,[e("em",null,[e("a",$i,[o("SIP"),r(t)]),o(" telephony software")])]),e("ul",null,[e("li",null,[e("a",eh,[o("Asterisk"),r(t)]),o(" - An easy to use but advanced IP PBX system, VoIP gateway and conference server. "),oh,o(),rh]),e("li",null,[e("a",th,[o("FreeSWITCH"),r(t)]),o(" - Scalable open source cross-platform telephony platform. ("),e("a",nh,[o("Source Code"),r(t)]),o(") "),sh,o(),lh]),e("li",null,[e("a",ah,[o("Kamailio"),r(t)]),o(" - Modular SIP server (registrar/proxy/router/etc) ("),e("a",ih,[o("Source Code"),r(t)]),o(") "),hh,o(),ch]),e("li",null,[e("a",dh,[o("Ostel"),r(t)]),o(" - Secure SIP telephony setup with ZRTP encryption. "),_h,o(),uh])]),ph,e("p",null,[e("em",null,[e("a",fh,[o("IPBX"),r(t)]),o(" telephony software")])]),e("ul",null,[e("li",null,[e("a",gh,[o("Elastix"),r(t)]),o(" - Unified communications server software based on Asterisk. ("),e("a",bh,[o("Source Code"),r(t)]),o(") "),mh,o(),kh]),e("li",null,[e("a",wh,[o("Freepbx"),r(t)]),o(" - Web-based open source GUI that controls and manages Asterisk. ("),e("a",Ph,[o("Source Code"),r(t)]),o(") "),yh,o(),Sh]),e("li",null,[e("a",vh,[o("XiVO"),r(t)]),o(" - Unified communications server software based on Asterisk. ("),e("a",Ch,[o("Source Code"),r(t)]),o(") "),Ah,o(),Lh])]),Mh,e("ul",null,[e("li",null,[e("a",Gh,[o("Abilian SBE"),r(t)]),o(" - Open Source Collaboration and Social Networking framework & platform. "),xh,o(),Th]),e("li",null,[e("a",Ih,[o("Anahita"),r(t)]),o(" - Open Source Social Networking Framework & Platform. ("),e("a",Eh,[o("Source Code"),r(t)]),o(") "),Dh,o(),Bh]),e("li",null,[e("a",Hh,[o("Bootcamp"),r(t)]),o(" - An enterprise social network. ("),e("a",jh,[o("Source Code"),r(t)]),o(") "),Rh,o(),Oh]),e("li",null,[e("a",Fh,[o("Buddycloud"),r(t)]),o(" - Tools, libraries, services and a community to build user-to-user, group and social messaging into your app. Saves time. Scales up. Supports you. ("),e("a",Nh,[o("Source Code"),r(t)]),o(") "),zh,o(),Wh]),e("li",null,[e("a",Jh,[o("BuddyPress"),r(t)]),o(" - A powerful plugin that takes your "),e("a",Uh,[o("WordPress.org"),r(t)]),o(" powered site beyond the blog with social-network features like user profiles, activity streams, user groups, and more. ("),e("a",Vh,[o("Source Code"),r(t)]),o(") "),qh,o(),Kh]),e("li",null,[e("a",Xh,[o("diaspora*"),r(t)]),o(" - Distributed social networking server. ("),e("a",Yh,[o("Demo"),r(t)]),o(", "),e("a",Zh,[o("Source Code"),r(t)]),o(") "),Qh,o(),$h]),e("li",null,[e("a",ec,[o("Discourse"),r(t)]),o(" - Advanced forum / community solution based on Ruby and JS. ("),e("a",oc,[o("Source Code"),r(t)]),o(") "),rc,o(),tc]),e("li",null,[e("a",nc,[o("Elgg"),r(t)]),o(" - A powerful open source social networking engine. ("),e("a",sc,[o("Source Code"),r(t)]),o(") "),lc,o(),ac]),e("li",null,[e("a",ic,[o("Flarum"),r(t)]),o(" - Delightfully simple forums. Flarum is the next-generation forum software that makes online discussion fun again. ("),e("a",hc,[o("Source Code"),r(t)]),o(") "),cc,o(),dc]),e("li",null,[e("a",_c,[o("flaskbb"),r(t)]),o(" - FlaskBB is forum software written in Python using the microframework Flask. You can easily create new topics, posts and send other users private messages. It also includes basic administration and moderation tools. ("),e("a",uc,[o("Source Code"),r(t)]),o(") "),pc,o(),fc]),e("li",null,[e("a",gc,[o("FluxBB"),r(t)]),o(" - Fast, light, user-friendly forum software for your website. ("),e("a",bc,[o("Source Code"),r(t)]),o(") "),mc,o(),kc]),e("li",null,[e("a",wc,[o("Friendica"),r(t)]),o(" - Social Communication Server. ("),e("a",Pc,[o("Source Code"),r(t)]),o(") "),yc,o(),Sc]),e("li",null,[e("a",vc,[o("GNU social"),r(t)]),o(" - Social communication software for both public and private communications. ("),e("a",Cc,[o("Source Code"),r(t)]),o(") "),Ac,o(),Lc]),e("li",null,[e("a",Mc,[o("Hubzilla"),r(t)]),o(" - Independent general-purpose websites that not only connect with their associated members and viewers, but also connect together. "),Gc,o(),xc]),e("li",null,[e("a",Tc,[o("HumHub"),r(t)]),o(" - A flexible kit for private social networks. ("),e("a",Ic,[o("Source Code"),r(t)]),o(") "),Ec,o(),Dc]),e("li",null,[e("a",Bc,[o("Isso"),r(t)]),o(" - A lightweight commenting server written in Python and Javascript. It aims to be a drop-in replacement for Disqus. ("),e("a",Hc,[o("Source Code"),r(t)]),o(") "),jc,o(),Rc]),e("li",null,[e("a",Oc,[o("Jappix"),r(t)]),o(" - Jappix is an open social platform, that let's you easily get or keep in touch with everyone. ("),e("a",Fc,[o("Source Code"),r(t)]),o(") "),Nc,o(),zc]),e("li",null,[e("a",Wc,[o("Loomio"),r(t)]),o(" - Loomio is a collaborative decision-making tool that makes it easy for anyone to participate in decisions which affect them. ("),e("a",Jc,[o("Source Code"),r(t)]),o(") "),Uc,o(),Vc]),e("li",null,[e("a",qc,[o("Movim"),r(t)]),o(" - A brand new social network, full of awesome features in a modern and smart interface. ("),e("a",Kc,[o("Source Code"),r(t)]),o(") "),Xc,o(),Yc]),e("li",null,[e("a",Zc,[o("MyBB"),r(t)]),o(" - Free, extensible forum software package. ("),e("a",Qc,[o("Source Code"),r(t)]),o(") "),$c,o(),ed]),e("li",null,[e("a",od,[o("Newebe"),r(t)]),o(" - A Distributed Social Network. ("),e("a",rd,[o("Source Code"),r(t)]),o(") "),td,o(),nd]),e("li",null,[e("a",sd,[o("NodeBB"),r(t)]),o(" - Node.js based forum software built for the modern web. ("),e("a",ld,[o("Source Code"),r(t)]),o(") "),ad,o(),id]),e("li",null,[e("a",hd,[o("OSSN"),r(t)]),o(" - Open Source Social Network (OSSN) is a social networking software written in PHP. It allows you to make a social networking website and helps your members build social relationships, with people who share similar professional or personal interests. ("),e("a",cd,[o("Source Code"),r(t)]),o(") "),dd,o(),_d]),e("li",null,[e("a",ud,[o("Oxwall"),r(t)]),o(" Oxwall is used for a wide range of projects starting from family sites and custom social networks to collaboration tools and enterprise community solutions. ("),e("a",pd,[o("Source Code"),r(t)]),o(),fd,o(),gd]),e("li",null,[e("a",bd,[o("phpBB"),r(t)]),o(" - Flat-forum bulletin board software solution that can be used to stay in touch with a group of people or can power your entire website. ("),e("a",md,[o("Source Code"),r(t)]),o(") "),kd,o(),wd]),e("li",null,[e("a",Pd,[o("PPnet"),r(t)]),o(" Create and host your own social network. "),yd,o(),Sd]),e("li",null,[e("a",vd,[o("Pump.io"),r(t)]),o(" - Stream server that does most of what people really want from a social network. ("),e("a",Cd,[o("Source Code"),r(t)]),o(") "),Ad,o(),Ld]),e("li",null,[e("a",Md,[o("Reddit"),r(t)]),o(" - Social networking and news website where registered community members can submit content. ("),e("a",Gd,[o("Demo"),r(t)]),o(", "),e("a",xd,[o("Source Code"),r(t)]),o(") "),Td,o(),Id]),e("li",null,[e("a",Ed,[o("RedMatrix"),r(t)]),o(" - Complete decentralised publishing, sharing, and communications system. "),Dd,o(),Bd]),e("li",null,[e("a",Hd,[o("twister"),r(t)]),o(" - Fully decentralized P2P microblogging platform leveraging the free software implementations of Bitcoin and BitTorrent protocols. ("),e("a",jd,[o("Source Code"),r(t)]),o(") "),Rd,o(),Od]),e("li",null,[e("a",Fd,[o("Vanilla Forums"),r(t)]),o(" - Simple and flexible forum software. ("),e("a",Nd,[o("Source Code"),r(t)]),o(") "),zd,o(),Wd])]),Jd,e("p",null,[e("em",null,[e("a",Ud,[o("Extensible Messaging and Presence Protocol"),r(t)]),o(" software")])]),Vd,e("ul",null,[e("li",null,[e("a",qd,[o("ejabberd"),r(t)]),o(" - XMPP instant messaging server. ("),e("a",Kd,[o("Source Code"),r(t)]),o(") "),Xd,o(),Yd]),e("li",null,[e("a",Zd,[o("Kontalk"),r(t)]),o(" – Kontalk is an Open Source Messenger, similar to WhatsApp (app for android only currently), including end-to-end encryption, server is based on Tigase XMPP Server. ("),e("a",Qd,[o("Source Code"),r(t)]),o(") "),$d,o(),e_]),e("li",null,[e("a",o_,[o("Metronome IM"),r(t)]),o(" - Fork of Prosody IM. ("),e("a",r_,[o("Source Code"),r(t)]),o(") "),t_,o(),n_]),e("li",null,[e("a",s_,[o("MongooseIM"),r(t)]),o(" - Fork of ejabberd. ("),e("a",l_,[o("Source Code"),r(t)]),o(") "),a_,o(),i_]),e("li",null,[e("a",h_,[o("Openfire"),r(t)]),o(" - Real time collaboration (RTC) server. ("),e("a",c_,[o("Source Code"),r(t)]),o(") "),d_,o(),__]),e("li",null,[e("a",u_,[o("Prosody IM"),r(t)]),o(" - Feature-rich and easy to configure XMPP server. ("),e("a",p_,[o("Source Code"),r(t)]),o(") "),f_,o(),g_]),e("li",null,[e("a",b_,[o("Tigase"),r(t)]),o(" - XMPP server implementation in Java. "),m_,o(),k_])]),w_,e("ul",null,[e("li",null,[e("a",P_,[o("Candy"),r(t)]),o(" - Multi user XMPP client written in Javascript. ("),e("a",y_,[o("Source Code"),r(t)]),o(") "),S_,o(),v_]),e("li",null,[e("a",C_,[o("Converse.js"),r(t)]),o(" - A free and open-source XMPP chat client in your browser. ("),e("a",A_,[o("Source Code"),r(t)]),o(") "),L_,o(),M_]),e("li",null,[e("a",G_,[o("Kaiwa"),r(t)]),o(" - Web based chat client in the style of common paid alternatives. ("),e("a",x_,[o("Source Code"),r(t)]),o(") "),T_,o(),I_]),e("li",null,[e("a",E_,[o("Salut à Toi"),r(t)]),o(" - Multipurpose, multi frontend, libre and decentralised communication tool. ("),e("a",D_,[o("Source Code"),r(t)]),o(") "),B_,o(),H_,e("ul",null,[e("li",null,[e("a",j_,[o("Libervia"),r(t)]),o(" - Web frontend from Salut à Toi. ("),e("a",R_,[o("Source Code"),r(t)]),o(") "),O_,o(),F_])])])]),N_,z_,e("ul",null,[e("li",null,[e("a",W_,[o("99ko CMS"),r(t)]),o(" - 99ko allows you to create a website in minutes without knowledge of Web development. It does not use a database server but relies on simple text files (JSON format) to store your data. ("),e("a",J_,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",U_,[o("Apostrophe 2"),r(t)]),o(" - A node.js CMS with a focus on extensible in-context editing tools. ("),e("a",V_,[o("Demo"),r(t)]),o(", "),e("a",q_,[o("Source Code"),r(t)]),o(") "),K_,o(),X_]),e("li",null,[e("a",Y_,[o("Baun"),r(t)]),o(" - A modern, lightweight, extensible CMS for PHP. ("),e("a",Z_,[o("Source Code"),r(t)]),o(") "),Q_,o(),$_]),e("li",null,[e("a",eu,[o("BigTree CMS"),r(t)]),o(" - Straightforward, well documented, and capable written with PHP and MySQL. ("),e("a",ou,[o("Source Code"),r(t)]),o(") "),ru,o(),tu]),e("li",null,[e("a",nu,[o("CMS Made Simple"),r(t)]),o(" - Open source content management system, faster and easier management of website contents, scalable for small businesses to large corporations. ("),e("a",su,[o("Source Code"),r(t)]),o(") "),lu,o(),au]),e("li",null,[e("a",iu,[o("Concrete 5 CMS"),r(t)]),o(" - An open source content management system. ("),e("a",hu,[o("Source Code"),r(t)]),o(") "),cu,o(),du]),e("li",null,[e("a",_u,[o("CouchCMS"),r(t)]),o(" - Simple Open-Source CMS for designers. ("),e("a",uu,[o("Source Code"),r(t)]),o(") "),pu,o(),fu]),e("li",null,[e("a",gu,[o("Directus"),r(t)]),o(" - Directus is a powerful and intuitive headless CMS for managing SQL databases with custom architectures. Built around a robust and extensible API, this decoupled content management framework is perfect for websites, apps, or multi-client projects. ("),e("a",bu,[o("Source Code"),r(t)]),o(") "),mu,o(),ku]),e("li",null,[e("a",wu,[o("Drupal"),r(t)]),o(" - Advanced open source content management platform. ("),e("a",Pu,[o("Source Code"),r(t)]),o(") "),yu,o(),Su]),e("li",null,[e("a",vu,[o("eLabFTW"),r(t)]),o(" - An online lab notebook for research labs. Store experiments, use a database to find reagents or protocols, use trusted timestamping to legally timestamp an experiment, export as pdf or zip archive, share with collaborators…. ("),e("a",Cu,[o("Source Code"),r(t)]),o(", "),e("a",Au,[o("Demo"),r(t)]),o(") "),Lu,o(),Mu]),e("li",null,[e("a",Gu,[o("GetSimple CMS"),r(t)]),o(" - The Simplest Content Management System. Ever. "),xu]),e("li",null,[e("a",Tu,[o("ImpressPages CMS"),r(t)]),o(" - Easy code meets easy admin. ("),e("a",Iu,[o("Demo"),r(t)]),o(", "),e("a",Eu,[o("Source Code"),r(t)]),o(") "),Du,o("/"),Bu,o(),Hu]),e("li",null,[e("a",ju,[o("Joomla!"),r(t)]),o(" - Advanced Content Management System (CMS). ("),e("a",Ru,[o("Source Code"),r(t)]),o(") "),Ou,o(),Fu]),e("li",null,[e("a",Nu,[o("KeystoneJS"),r(t)]),o(" - Node.js CMS & Web Application Platform. ("),e("a",zu,[o("Demo"),r(t)]),o(", "),e("a",Wu,[o("Source Code"),r(t)]),o(") "),Ju,o(),Uu]),e("li",null,[e("a",Vu,[o("MODX"),r(t)]),o(" - MODX is an advanced content management and publishing platform. The current version is called 'Revolution'. ("),e("a",qu,[o("Source Code"),r(t)]),o(") "),Ku,o(),Xu]),e("li",null,[e("a",Yu,[o("Neos"),r(t)]),o(" - Neos or TYPO3 Neos (for version 1) is a modern, open source CMS based on the Flow framework. ("),e("a",Zu,[o("Source Code"),r(t)]),o(") "),Qu,o(),$u]),e("li",null,[e("a",ep,[o("october"),r(t)]),o(" - Free, open-source, self-hosted CMS platform based on the Laravel PHP Framework. ("),e("a",op,[o("Source Code"),r(t)]),o(") "),rp,o(),tp]),e("li",null,[e("a",np,[o("Omeka"),r(t)]),o(" - Create complex narratives and share rich collections, adhering to Dublin Core standards with Omeka on your server, designed for scholars, museums, libraries, archives, and enthusiasts. ("),e("a",sp,[o("Demo"),r(t)]),o(", "),e("a",lp,[o("Source Code"),r(t)]),o(") "),ap,o(),ip]),e("li",null,[e("a",hp,[o("Pagekit"),r(t)]),o(" - A new modern CMS to create and share. ("),e("a",cp,[o("Source Code"),r(t)]),o(") "),dp,o(),_p]),e("li",null,[e("a",up,[o("Pico"),r(t)]),o(" - A stupidly simple, blazing fast, flat file CMS. ("),e("a",pp,[o("Source Code"),r(t)]),o(") "),fp,o(),gp]),e("li",null,[e("a",bp,[o("Pimcore"),r(t)]),o(" - Multi-Channel Experience and Engagement Management Platform. ("),e("a",mp,[o("Source Code"),r(t)]),o(") "),kp,o(),wp]),e("li",null,[e("a",Pp,[o("Plone"),r(t)]),o(" - Powerful open-source CMS system. ("),e("a",yp,[o("Source Code"),r(t)]),o(") "),Sp,o(),vp]),e("li",null,[e("a",Cp,[o("Publify"),r(t)]),o(" - A simple but full featured web publishing software. ("),e("a",Ap,[o("Demo"),r(t)]),o(", "),e("a",Lp,[o("Source Code"),r(t)]),o(") "),Mp,o(),Gp]),e("li",null,[xp,o(" - Ultra lightweight CMS for MySQL, SQLite and PostgreSQL. ("),e("a",Tp,[o("Demo"),r(t)]),o(", "),e("a",Ip,[o("Source Code"),r(t)]),o(") "),Ep,o(),Dp]),e("li",null,[e("a",Bp,[o("Roadiz"),r(t)]),o(" - Modern CMS based on a node system which can handle many types of services. ("),e("a",Hp,[o("Source Code"),r(t)]),o(") "),jp,o(),Rp]),e("li",null,[e("a",Op,[o("SilverStripe"),r(t)]),o(" - Easy to use CMS with powerful MVC framework underlying. ("),e("a",Fp,[o("Demo"),r(t)]),o(", "),e("a",Np,[o("Source Code"),r(t)]),o(") "),zp,o(),Wp]),e("li",null,[e("a",Jp,[o("Sphido"),r(t)]),o(" - A fast, lightweight, flat file CMS for PHP. ("),e("a",Up,[o("Source Code"),r(t)]),o(") "),Vp,o(),qp]),e("li",null,[e("a",Kp,[o("SPIP"),r(t)]),o(" - Publication system for the Internet aimed at collaborative work, multilingual environments, and simplicity of use for web authors. ("),e("a",Xp,[o("Source Code"),r(t)]),o(") "),Yp,o(),Zp]),e("li",null,[e("a",Qp,[o("Subrion"),r(t)]),o(" - Subrion is a free open source content management system that allows you to build websites for any purpose. Yes, from blog to corporate mega portal. ("),e("a",$p,[o("Demo"),r(t)]),o(", "),e("a",ef,[o("Source Code"),r(t)]),o(") "),of,o(),rf]),e("li",null,[e("a",tf,[o("Textpattern"),r(t)]),o(" - A flexible, elegant and easy-to-use CMS. ("),e("a",nf,[o("Demo"),r(t)]),o(", "),e("a",sf,[o("Source Code"),r(t)]),o(") "),lf,o(),af]),e("li",null,[e("a",hf,[o("TYPO3"),r(t)]),o(" - A powerful and advanced CMS with a large community. ("),e("a",cf,[o("Source Code"),r(t)]),o(") "),df,o(),_f]),e("li",null,[e("a",uf,[o("Umbraco"),r(t)]),o(" - The friendly CMS. Free and open source with an amazing community. ("),e("a",pf,[o("Source code"),r(t)]),o(") "),ff,o(),gf]),e("li",null,[e("a",bf,[o("WordPress"),r(t)]),o(" - The worlds most-used blogging and CMS engine. ("),e("a",mf,[o("Source code mirror"),r(t)]),o(") "),kf,o(),wf])]),Pf,e("ul",null,[e("li",null,[e("a",yf,[o("OpenEats"),r(t)]),o(" - A recipe management site that allows users to create, store, share and rate recipes, create grocery lists, and more. ("),e("a",Sf,[o("Source Code"),r(t)]),o(") "),vf,o(),Cf])]),Af,e("ul",null,[e("li",null,[e("a",Lf,[o("Attendize"),r(t)]),o(" - Ticket selling and event management platform. ("),e("a",Mf,[o("Demo"),r(t)]),o(", "),e("a",Gf,[o("Source Code"),r(t)]),o(") "),xf,o(),Tf]),e("li",null,[e("a",If,[o("CoreShop"),r(t)]),o(" - CoreShop is a e-commerce plugin for Pimcore. ("),e("a",Ef,[o("Source Code"),r(t)]),o(") "),Df,o(),Bf]),e("li",null,[e("a",Hf,[o("Magento"),r(t)]),o(" - Leading provider of open omnichannel innovation. ("),e("a",jf,[o("Demo"),r(t)]),o(", "),e("a",Rf,[o("Source Code"),r(t)]),o(") "),Of,o(),Ff]),e("li",null,[e("a",Nf,[o("Microweber"),r(t)]),o(" - Drag and Drop CMS and online shop. ("),e("a",zf,[o("Demo"),r(t)]),o(", "),e("a",Wf,[o("Source Code"),r(t)]),o(") "),Jf,o(),Uf]),e("li",null,[e("a",Vf,[o("OpenCart"),r(t)]),o(" - Free open source shopping cart solution. ("),e("a",qf,[o("Source Code"),r(t)]),o(") "),Kf,o(),Xf]),e("li",null,[e("a",Yf,[o("Open Classifieds"),r(t)]),o(" - Free open-source, self-hosted CMS for classifieds sites. ("),e("a",Zf,[o("Source Code"),r(t)]),o(") "),Qf,o(),$f]),e("li",null,[e("a",eg,[o("Open eShop"),r(t)]),o(" - Sell your digital goods with licenses and provide support. ("),e("a",og,[o("Source Code"),r(t)]),o(") "),rg,o(),tg]),e("li",null,[e("a",ng,[o("OXID eShop"),r(t)]),o(" - OXID eShop is a flexible open source e-commerce software with a wide range of functionalities. ("),e("a",sg,[o("Demo"),r(t)]),o(", "),e("a",lg,[o("Source Code"),r(t)]),o(") "),ag,o(),ig]),e("li",null,[e("a",hg,[o("PrestaShop"),r(t)]),o(" - PrestaShop offers a free, open-source and fully scalable e-commerce solution. ("),e("a",cg,[o("Demo"),r(t)]),o(", "),e("a",dg,[o("Source Code"),r(t)]),o(") "),_g,o(),ug]),e("li",null,[e("a",pg,[o("Shoop"),r(t)]),o(" - Django powered fully customizable open source e-commerce framework for small and large sites. ("),e("a",fg,[o("B2C demo"),r(t)]),o(", "),e("a",gg,[o("B2B demo"),r(t)]),o(", "),e("a",bg,[o("Source Code"),r(t)]),o(") "),mg,o(),kg]),e("li",null,[e("a",wg,[o("Sylius"),r(t)]),o(" - Symfony2 powered open source full-stack platform for eCommerce. ("),e("a",Pg,[o("Demo"),r(t)]),o(", "),e("a",yg,[o("Source Code"),r(t)]),o(") "),Sg,o(),vg]),e("li",null,[e("a",Cg,[o("Thelia"),r(t)]),o(" - Thelia is an open source and flexible e-commerce solution. ("),e("a",Ag,[o("Demo"),r(t)]),o(", "),e("a",Lg,[o("Source Code"),r(t)]),o(") "),Mg,o(),Gg]),e("li",null,[e("a",xg,[o("WooCommerce"),r(t)]),o(" - WordPress based e-commerce solution. ("),e("a",Tg,[o("Source Code"),r(t)]),o(") "),Ig,o(),Eg])]),Dg,e("p",null,[o("See "),e("a",Bg,[o("https://github.com/n1trux/awesome-sysadmin#dns"),r(t)])]),Hg,e("ul",null,[e("li",null,[e("a",jg,[o("CUPS"),r(t)]),o(" - The Common Unix Print System uses Internet Printing Protocol (IPP) to support printing to local and network printers. ("),e("a",Rg,[o("Source Code"),r(t)]),o(") "),Og,o(),Fg]),e("li",null,[e("a",Ng,[o("Paperless"),r(t)]),o(" - Scan, index, and archive all of your paper documents. "),zg,o(),Wg]),e("li",null,[e("a",Jg,[o("SANE Network Scanning"),r(t)]),o(" - allow remote clients to access image acquisition devices (scanners) available on the local host. ("),e("a",Ug,[o("Source Code"),r(t)]),o(") "),Vg,o(),qg])]),Kg,e("ul",null,[e("li",null,[e("a",Xg,[o("ERPNext"),r(t)]),o(" - Free open source ERP system. ("),e("a",Yg,[o("Demo"),r(t)]),o(", "),e("a",Zg,[o("Source Code"),r(t)]),o(") "),Qg,o(),$g]),e("li",null,[e("a",eb,[o("Odoo"),r(t)]),o(" - Free open source ERP system. ("),e("a",ob,[o("Demo"),r(t)]),o(", "),e("a",rb,[o("Source Code"),r(t)]),o(") "),tb,o(),nb]),e("li",null,[e("a",sb,[o("Tryton"),r(t)]),o(" - Free open source business solution. ("),e("a",lb,[o("Demo"),r(t)]),o(", "),e("a",ab,[o("Source Code"),r(t)]),o(") "),ib,o(),hb])]),cb,e("ul",null,[e("li",null,[e("a",db,[o("FreeRADIUS"),r(t)]),o(" - High performance and highly configurable multi-protocol policy/authentication server, supporting RADIUS, DHCPv4 and VMPS. ("),e("a",_b,[o("Source Code"),r(t)]),o(") "),ub,o(),pb]),e("li",null,[e("a",fb,[o("daloRADIUS"),r(t)]),o(" - Open-source web management platform for FreeRADIUS-based deployments. ("),e("a",gb,[o("Source Code"),r(t)]),o(") "),bb]),e("li",null,[e("a",mb,[o("FreeIPA"),r(t)]),o(" - an integrated Identity and Authentication solution for Linux/UNIX networked environments. A FreeIPA server provides centralized authentication, authorization and account information by storing data about user, groups, hosts. "),kb,o(),wb]),e("li",null,[e("a",Pb,[o("IndieAuth"),r(t)]),o(" - Sign in with your domain name (using the "),e("a",yb,[o("rel-me-auth"),r(t)]),o(" protocol). "),Sb,o(),vb]),e("li",null,[e("a",Cb,[o("Libravatar"),r(t)]),o(" - Libravatar is a service which delivers your avatar (profile picture) to other websites. ("),e("a",Ab,[o("Demo"),r(t)]),o(", "),e("a",Lb,[o("Source Code"),r(t)]),o(") "),Mb,o(),Gb]),e("li",null,[e("a",xb,[o("OpenCA OCSPD"),r(t)]),o(" - An "),e("a",Tb,[o("OCSP"),r(t)]),o(" Responder.")]),e("li",null,[e("a",Ib,[o("OpenID/OpenID Connect"),r(t)]),o(" - A Simple Identity layer on top of OAuth 2.0.")]),e("li",null,[e("a",Eb,[o("OSIAM"),r(t)]),o(" - Open Source Identity and Access Management implementing OAuth 2.0 and SCIMv2. ("),e("a",Db,[o("Source Code"),r(t)]),o(") "),Bb,o(),Hb])]),jb,e("ul",null,[e("li",null,[e("a",Rb,[o("CommaFeed"),r(t)]),o(" - Google Reader inspired self-hosted RSS reader. ("),e("a",Ob,[o("Source Code"),r(t)]),o(") "),Fb]),e("li",null,[e("a",Nb,[o("Creaky Coot"),r(t)]),o(" - Minimalist and responsive RSS reader and links saver "),zb]),e("li",null,[e("a",Wb,[o("Feedbin"),r(t)]),o(" - A simple, fast and nice looking RSS reader. ("),e("a",Jb,[o("Source Code"),r(t)]),o(") "),Ub]),e("li",null,[e("a",Vb,[o("FeedHQ"),r(t)]),o(" - FeedHQ is a web-based feed reader. ("),e("a",qb,[o("Source Code"),r(t)]),o(") "),Kb]),e("li",null,[e("a",Xb,[o("FreshRSS"),r(t)]),o(" - A self-hostable RSS feed aggregator. ("),e("a",Yb,[o("Demo"),r(t)]),o(", "),e("a",Zb,[o("Source Code"),r(t)]),o(", "),e("a",Qb,[o("Mobile app"),r(t)]),o(") "),$b,o(),e1]),e("li",null,[e("a",o1,[o("JARR"),r(t)]),o(" - JARR (Just Another RSS Reader) is a web-based news aggregator and reader. ("),e("a",r1,[o("Demo"),r(t)]),o(", "),e("a",t1,[o("Source Code"),r(t)]),o(") "),n1,o(),s1]),e("li",null,[e("a",l1,[o("Kriss Feed"),r(t)]),o(" - A simple and smart (or stupid) feed reader. ("),e("a",a1,[o("Demo"),r(t)]),o(", "),e("a",i1,[o("Source Code"),r(t)]),o(") "),h1]),e("li",null,[e("a",c1,[o("Leed"),r(t)]),o(" - Leed (for Light Feed) is a Free and minimalist RSS aggregator. ("),e("a",d1,[o("Source Code"),r(t)]),o(") "),_1]),e("li",null,[e("a",u1,[o("Leselys"),r(t)]),o(" - Your very elegant RSS reader "),p1]),e("li",null,[e("a",f1,[o("Lite-Reader"),r(t)]),o(" - Read your feeds on your own machine with a simple and lite application. ("),e("a",g1,[o("Source Code"),r(t)]),o(") "),b1]),e("li",null,[e("a",m1,[o("Moonmoon"),r(t)]),o(" - simple feed agregator (planet like): it only aggregates feeds and spits them out in one single page. ("),e("a",k1,[o("Source Code"),r(t)]),o(") "),w1,o(),P1]),e("li",null,[e("a",y1,[o("Miniflux"),r(t)]),o(" - Miniflux is a minimalist and open source news reader. ("),e("a",S1,[o("Source Code"),r(t)]),o(") "),v1]),e("li",null,[e("a",C1,[o("NewsBlur"),r(t)]),o(" - NewsBlur is a personal news reader that brings people together to talk about the world. A new sound of an old instrument "),A1]),e("li",null,[e("a",L1,[o("Nunux Reader"),r(t)]),o(" - A simple, fast and reactive RSS reader. ("),e("a",M1,[o("Source Code"),r(t)]),o(") "),G1,o(),x1]),e("li",null,[e("a",T1,[o("Reader-Self"),r(t)]),o(" Self-hosted rss reader (php / mysql or sqlite) - Google Reader alternative. ("),e("a",I1,[o("Source Code"),r(t)]),o(") "),E1]),e("li",null,[e("a",D1,[o("Readr"),r(t)]),o(" - A clean & simple, self-hosted RSS reader "),B1]),e("li",null,[e("a",H1,[o("RSS2EMail"),r(t)]),o(" - Fetches RSS/Atom-feeds and pushes new Content to any email-reciever, supports OPML "),j1,o(),R1]),e("li",null,[e("a",O1,[o("RSSminer"),r(t)]),o(" -An online rss reader written in clojure & Javascript & java. ("),e("a",F1,[o("Source Code"),r(t)]),o(") "),N1]),e("li",null,[e("a",z1,[o("RSS Monster"),r(t)]),o(" - RSS Monster is an easy to use web-based RSS aggregator and reader compatible with the Fever API, created as an alternative for Google Reader. "),W1,o(),J1]),e("li",null,[e("a",U1,[o("Screaming Liquid Tiger"),r(t)]),o(" - Simple script to automatically generate valid RSS and Atom feeds from a list of media files in the same folder. "),V1,o(),q1]),e("li",null,[e("a",K1,[o("Selfoss"),r(t)]),o(" - The new multipurpose rss reader, live stream, mashup, aggregation web application. ("),e("a",X1,[o("Source Code"),r(t)]),o(") "),Y1,o(),Z1]),e("li",null,[e("a",Q1,[o("Stringer"),r(t)]),o(" - A work-in-progress self-hosted, anti-social RSS reader. "),$1,o(),em]),e("li",null,[e("a",om,[o("Tiny Tiny RSS"),r(t)]),o(" - Open source web-based news feed (RSS/Atom) reader and aggregator. ("),e("a",rm,[o("Public instance"),r(t)]),o(") "),tm,o(),nm,e("ul",null,[e("li",null,[e("a",sm,[o("gritttt-rss"),r(t)]),o(" - More features for Tiny Tiny RSS. ("),e("a",lm,[o("Source Code"),r(t)]),o(") "),am,o(),im]),e("li",null,[e("a",hm,[o("ttrss-mobile"),r(t)]),o(" - A mobile webapp for Tiny Tiny RSS. "),cm,o(),dm]),e("li",null,[e("a",_m,[o("ttrss-reader"),r(t)]),o(" - Light and responsive client for TTRSS. "),um,o(),pm])])])]),fm,e("ul",null,[e("li",null,[e("a",gm,[o("Camlistore"),r(t)]),o(" - Camlistore is a set of open source formats, protocols, and software for modeling, storing, searching, sharing and synchronizing data in the post-PC era. Data may be files or objects, tweets or 5TB videos, and you can access it via a phone, browser or FUSE filesystem. ("),e("a",bm,[o("Source Code"),r(t)]),o(") "),mm,o(),km]),e("li",null,[e("a",wm,[o("GlusterFS"),r(t)]),o(" - GlusterFS is a scalable network filesystem. Using common off-the-shelf hardware, you can create large, distributed storage solutions for media streaming, data analysis, and other data- and bandwidth-intensive tasks. ("),e("a",Pm,[o("Source Code"),r(t)]),o(") "),ym,o(),Sm]),e("li",null,[e("a",vm,[o("Go IPFS"),r(t)]),o(" - Implementation of "),e("a",Cm,[o("IPFS"),r(t)]),o(", a global, versioned, peer-to-peer filesystem that seeks to connect all computing devices with the same system of files. It combines good ideas from Git, BitTorrent, Kademlia, SFS, and the Web. It is like a single bittorrent swarm, exchanging git objects.")]),e("li",null,[e("a",Am,[o("Ori Filesystem"),r(t)]),o(" - A Secure Distributed File System built for offline operation. ("),e("a",Lm,[o("Source Code"),r(t)]),o(") "),Mm,o(),Gm]),e("li",null,[e("a",xm,[o("Swift"),r(t)]),o(" - A highly available, distributed, eventually consistent object/blob store.")]),e("li",null,[e("a",Tm,[o("Tahoe-LAFS"),r(t)]),o(" - Tahoe-LAFS is a Free and Open decentralized cloud storage system. It distributes your data across multiple servers. Even if some of the servers fail or are taken over by an attacker, the entire file store continues to function correctly, preserving your privacy and security.")])]),Im,e("ul",null,[e("li",null,[e("a",Em,[o("Git Annex"),r(t)]),o(" - File synchronization between computers, servers, external drives")]),e("li",null,[e("a",Dm,[o("Kinto"),r(t)]),o(" - Kinto is a minimalist JSON storage service with synchronisation and sharing abilities. ("),e("a",Bm,[o("Source Code"),r(t)]),o(") "),Hm,o(),jm]),e("li",null,[e("a",Rm,[o("Nextcloud"),r(t)]),o(" - Access & share your files, calendars, contacts, mail & more from any device, on your terms. ("),e("a",Om,[o("Source Code"),r(t)]),o(") "),Fm,o(),Nm]),e("li",null,[e("a",zm,[o("OpenSSH/SFTP"),r(t)]),o(" - Secure File Transfer Program. ("),e("a",Wm,[o("Source Code"),r(t)]),o(") "),Jm,o(),Um]),e("li",null,[e("a",Vm,[o("Samba"),r(t)]),o(" - Samba is the standard Windows interoperability suite of programs for Linux and Unix. It provides secure, stable and fast file and print services for all clients using the SMB/CIFS protocol. ("),e("a",qm,[o("Source Code"),r(t)]),o(") "),Km,o(),Xm]),e("li",null,[e("a",Ym,[o("Seafile"),r(t)]),o(" - File hosting and sharing solution primary for teams and organizations. ("),e("a",Zm,[o("Demo"),r(t)]),o(") "),Qm]),e("li",null,[e("a",$m,[o("SparkleShare"),r(t)]),o(" - Self hosted, instant, secure file sync")]),e("li",null,[e("a",ek,[o("Syncany"),r(t)]),o(" - Secure file sync software for arbitrary storage backends - An open-source cloud storage and filesharing application. Securely synchronize your files to any kind of storage! "),ok,o(),rk]),e("li",null,[e("a",tk,[o("Syncthing"),r(t)]),o(" - Syncthing is an open source peer-to-peer file synchronisation tool. ("),e("a",nk,[o("Source Code"),r(t)]),o(") "),sk,o(),lk]),e("li",null,[e("a",ak,[o("Z-Push"),r(t)]),o(" - An implementation of Microsoft’s "),e("a",ik,[o("ActiveSync"),r(t)]),o(" protocol")]),e("li",null,[e("a",hk,[o("ownCloud"),r(t)]),o(" - All-in-one solution for saving, synchronizing, viewing, editing and sharing files, calendars, address books and more - "),ck,o(),dk]),e("li",null,[e("a",_k,[o("Pydio"),r(t)]),o(" - Turn any web server into a powerful file management system and an alternative to mainstream cloud storage providers.")]),e("li",null,[e("a",uk,[o("Unison"),r(t)]),o(" - Unison is a file-synchronization tool for OSX, Unix, and Windows. "),pk,o(),fk])]),gk,e("ul",null,[e("li",null,[e("a",bk,[o("FilePizza"),r(t)]),o(" - Peer-to-peer file transfers in your browser. ("),e("a",mk,[o("Source Code"),r(t)]),o(") "),kk,o(),wk]),e("li",null,[e("a",Pk,[o("FileTea"),r(t)]),o(" - Anonymous, volatile file sharing: does not store any file on server. Bridges a download to the recipient’s browser with an upload from the source’s browser. ("),e("a",yk,[o("Source Code"),r(t)]),o(),Sk,o(),vk]),e("li",null,[e("a",Ck,[o("instant.io"),r(t)]),o(" - Streaming file transfer over WebTorrent. ("),e("a",Ak,[o("Demo"),r(t)]),o(") "),Lk,o(),Mk]),e("li",null,[e("a",Gk,[o("Opentracker"),r(t)]),o(" - Open and free bittorrent tracker. It aims for minimal resource usage and is intended to run at your wlan router. ("),e("a",xk,[o("Source Code"),r(t)]),o(),Tk,o(),Ik]),e("li",null,[e("a",Ek,[o("ShareFest"),r(t)]),o(" - Web based p2p file sharing built on WebRTC Data Channels API. ("),e("a",Dk,[o("Demo"),r(t)]),o(") "),Bk,o(),Hk])]),jk,e("ul",null,[e("li",null,[e("a",Rk,[o("BoZoN"),r(t)]),o(" - Minimalist Drag & drop file sharing app. "),Ok,o(),Fk]),e("li",null,[e("a",Nk,[o("Coquelicot"),r(t)]),o(" - Coquelicot is a “one-click” file sharing web application with a focus on protecting users’ privacy. - "),zk]),e("li",null,[e("a",Wk,[o("Dropcenter"),r(t)]),o(" - Upload files by simple drag-n-drop.")]),e("li",null,[e("a",Jk,[o("droppy"),r(t)]),o(" - droppy is a self-hosted cloud server with an interface similar to desktop file managers and has capabilites to edit files on-the-fly as well as view and playback media directly in the browser. ("),e("a",Uk,[o("Demo"),r(t)]),o(") "),Vk,o(),qk]),e("li",null,[e("a",Kk,[o("img.bi"),r(t)]),o(" - "),e("a",Xk,[o("img.bi"),r(t)]),o(" is a secure image hosting. Images are encrypted using AES-256 with random key in browser before upload. "),Yk,o(),Zk]),e("li",null,[e("a",Qk,[o("ipfs.pics"),r(t)]),o(" - ipfs.pics is a o distributed image hosting website. ("),e("a",$k,[o("Source Code"),r(t)]),o(") "),ew,o(),ow]),e("li",null,[e("a",rw,[o("Jirafeau"),r(t)]),o(" - Jirafeau is a web site permitting to upload a file in a simple way and give an unique link to it. ("),e("a",tw,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",nw,[o("Jyraphe"),r(t)]),o(" - Jyraphe is a web application of file repository, easy to install and easy to use.")]),e("li",null,[e("a",sw,[o("linx"),r(t)]),o(" - File sharing application and pastebin with API, auto-expiry, deletion keys, and web seed support. ("),e("a",lw,[o("Demo"),r(t)]),o(") "),aw,o(),iw]),e("li",null,[e("a",hw,[o("lufi"),r(t)]),o(" - Let's Upload that FIle, client-side encrypted. ("),e("a",cw,[o("Demo"),r(t)]),o(", "),e("a",dw,[o("Source Code"),r(t)]),o(") "),_w,o(),uw]),e("li",null,[e("a",pw,[o("lutim"),r(t)]),o(" - Let's Upload That Image !")]),e("li",null,[e("a",fw,[o("Mediacrush"),r(t)]),o(" - A website you can upload images, audio, and video to, and receive a link to share it with your friends. ("),e("a",gw,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",bw,[o("Minio"),r(t)]),o(" - Store photos, videos, VMs, containers, log files, or any blob of data as objects. ("),e("a",mw,[o("Source Code"),r(t)]),o(") "),kw,o(),ww]),e("li",null,[e("a",Pw,[o("Nimbus"),r(t)]),o(" - A drag-and-drop shortlink file sharer for OS X - "),yw,o(),Sw]),e("li",null,[e("a",vw,[o("OnionShare"),r(t)]),o(" - Securely and anonymously share a file of any size.")]),e("li",null,[e("a",Cw,[o("PictShare"),r(t)]),o(" - PictShare is a multi lingual, open source image hosting service with a simple resizing and upload API. ("),e("a",Aw,[o("Demo"),r(t)]),o(", "),e("a",Lw,[o("Source Code"),r(t)]),o(") "),Mw,o(),Gw]),e("li",null,[e("a",xw,[o("Pomf"),r(t)]),o(" - Simple file uploading and sharing, source for the now shut down site "),e("a",Tw,[o("Pomf.se"),r(t)]),o(". "),Iw,o(),Ew]),e("li",null,[e("a",Dw,[o("ProjectSend"),r(t)]),o(" - Upload files and assign them to specific clients you create. Give access to those files to your clients. ("),e("a",Bw,[o("Source Code"),r(t)]),o(") "),Hw,o(),jw]),e("li",null,[e("a",Rw,[o("transfer.sh"),r(t)]),o(" - Easy file sharing from the command line. ("),e("a",Ow,[o("Demo"),r(t)]),o(", "),e("a",Fw,[o("Source Code"),r(t)]),o(") "),Nw,o(),zw]),e("li",null,[e("a",Ww,[o("Uguu"),r(t)]),o(" - Stores files and deletes after X amount of time. ("),e("a",Jw,[o("Source Code"),r(t)]),o(") "),Uw,o(),Vw]),e("li",null,[e("a",qw,[o("Up1"),r(t)]),o(" - A Client-side Encrypted Image Host. ("),e("a",Kw,[o("Demo"),r(t)]),o(") "),Xw,o(),Yw]),e("li",null,[e("a",Zw,[o("uPste"),r(t)]),o(" - A private file hosting application with an emphasis on serving technology communities. ("),e("a",Qw,[o("Source Code"),r(t)]),o(") "),$w,o(),e2]),e("li",null,[e("a",o2,[o("YouTransfer"),r(t)]),o(" - YouTransfer is a simple but elegant self-hosted file transfer & sharing solution. ("),e("a",r2,[o("Demo"),r(t)]),o(", "),e("a",t2,[o("Source Code"),r(t)]),o(") "),n2,o(),s2])]),l2,e("ul",null,[e("li",null,[e("a",a2,[o("Apaxy"),r(t)]),o(" - Theme built to enhance the experience of browsing web directories, using the mod_autoindex Apache module and some CSS to override the default style of a directory listing. ("),e("a",i2,[o("Source Code"),r(t)]),o(),h2,o(),c2]),e("li",null,[e("a",d2,[o("DirectoryLister"),r(t)]),o(" - A simple PHP based directory lister that lists a directory and all it's sub-directories and allows you to navigate there within. ("),e("a",_2,[o("Source code"),r(t)]),o(") "),u2,o(),p2]),e("li",null,[e("a",f2,[o("Encode Explorer"),r(t)]),o(" - Encode Explorer is a single page file browser, it is simple and functional. ("),e("a",g2,[o("Demo"),r(t)]),o(", "),e("a",b2,[o("Source Code"),r(t)]),o(") "),m2,o(),k2]),e("li",null,[e("a",w2,[o("eXtplorer"),r(t)]),o(" - A PHP and Javascript based File Manager")]),e("li",null,[e("a",P2,[o("explorer"),r(t)]),o(" - Highly-configurable directory listing made with nodejs. ("),e("a",y2,[o("Source Code"),r(t)]),o(")"),S2,o(),v2]),e("li",null,[e("a",C2,[o("goBrowser"),r(t)]),o(" Simple http file browser. ("),e("a",A2,[o("Source Code"),r(t)]),o(") "),L2,o(),M2]),e("li",null,[e("a",G2,[o("h5ai"),r(t)]),o(" - Modern file indexer for HTTP web servers with focus on your files. Directories are displayed in a appealing way and browsing them is enhanced by different views, a breadcrumb and a tree overview. ("),e("a",x2,[o("Demo"),r(t)]),o(", "),e("a",T2,[o("Source Code"),r(t)]),o(") "),I2,o(),E2]),e("li",null,[e("a",D2,[o("Monsta FTP"),r(t)]),o(" - Open source PHP/Ajax cloudware that puts FTP file management right in your browser, anywhere, any time. ("),e("a",B2,[o("Demo"),r(t)]),o(", "),e("a",H2,[o("Source Code"),r(t)]),o(") "),j2,o(),R2]),e("li",null,[e("a",O2,[o("ResourceSpace"),r(t)]),o(" - ResourceSpace open source digital asset management software is the simple, fast, & free way to organise your digital assets. ("),e("a",F2,[o("Demo"),r(t)]),o(", "),e("a",N2,[o("Source Code"),r(t)]),o(") "),z2,o(),W2]),e("li",null,[e("a",J2,[o("Sprut.io"),r(t)]),o(" - 2 panel file manager with drag and drop features, code editor, text search, hotkeys. ("),e("a",U2,[o("Demo"),r(t)]),o(", "),e("a",V2,[o("Source Code"),r(t)]),o(") "),q2,o(),K2])]),X2,e("ul",null,[e("li",null,[e("a",Y2,[o("0hh1"),r(t)]),o(" - A lovely little logic game by Q42. ("),e("a",Z2,[o("Demo"),r(t)]),o(") "),Q2,o(),$2]),e("li",null,[e("a",eP,[o("A Dark Room"),r(t)]),o(" - A minimalist text adventure game for your browser. ("),e("a",oP,[o("Demo"),r(t)]),o(") "),rP,o(),tP]),e("li",null,[e("a",nP,[o("Agar.IO Clone"),r(t)]),o(" - "),e("a",sP,[o("Agar.io"),r(t)]),o(" clone written with "),e("a",lP,[o("Socket.IO"),r(t)]),o(" and HTML5 canvas. "),aP,o(),iP]),e("li",null,[e("a",hP,[o("Clumsy Bird"),r(t)]),o(" - A MelonJS port of the famous Flappy Bird Game. ("),e("a",cP,[o("Demo"),r(t)]),o(") "),dP,o(),_P]),e("li",null,[e("a",uP,[o("Cubiks-2048"),r(t)]),o(" - Clone of 2048 game in 3D. ("),e("a",pP,[o("Demo"),r(t)]),o(") "),fP,o(),gP]),e("li",null,[e("a",bP,[o("Hextris"),r(t)]),o(" - Fast paced HTML5 puzzle game inspired by Tetris. ("),e("a",mP,[o("Demo"),r(t)]),o(") "),kP,o(),wP]),e("li",null,[e("a",PP,[o("Posio"),r(t)]),o(" - A geography multiplayer game. ("),e("a",yP,[o("Demo"),r(t)]),o(") "),SP,o(),vP]),e("li",null,[e("a",CP,[o("TournamentMango"),r(t)]),o(" - TournamentMango is an open source tournament bracket and user management system. You can build an archive of players and keep track of all their scores over time as well as their regular characters, games, and aliases. ("),e("a",AP,[o("Source Code"),r(t)]),o(") "),LP,o(),MP])]),GP,e("ul",null,[e("li",null,[e("a",xP,[o("GateOne"),r(t)]),o(" - Gate One is an HTML5 web-based terminal emulator and SSH client. - "),TP]),e("li",null,[e("a",IP,[o("Guacamole"),r(t)]),o(" - Guacamole is a clientless remote desktop gateway. It supports standard protocols like VNC and RDP. ("),e("a",EP,[o("Source Code"),r(t)]),o(") "),DP,o(),BP])]),HP,e("ul",null,[e("li",null,[e("a",jP,[o("Citadel"),r(t)]),o(" - Groupware including email, calendar/scheduling, address books, forums, mailing lists, IM, wiki and blog engines, RSS aggregation and more. ("),e("a",RP,[o("Source Code"),r(t)]),o(") "),OP,o(),FP]),e("li",null,[e("a",NP,[o("Cozy Cloud"),r(t)]),o(" - A personal cloud where you can read your emails or manage and sync your contact, files or calendars, with an app store full of community contributions. ("),e("a",zP,[o("Source Code"),r(t)]),o(") "),WP,o(),JP]),e("li",null,[e("a",UP,[o("egroupware"),r(t)]),o(" - Software suite including calendars, address books, notepad, project management tools, client relationship management tools (CRM), knowledge management tools, a wiki and a CMS. ("),e("a",VP,[o("Source Code"),r(t)]),o(") "),qP,o(),KP]),e("li",null,[e("a",XP,[o("Horde"),r(t)]),o(" - The Horde Project is about creating high quality Open Source applications and libraries, based on PHP and the Horde Framework. ("),e("a",YP,[o("Demo"),r(t)]),o(", "),e("a",ZP,[o("Source Code"),r(t)]),o(") "),QP]),e("li",null,[e("a",$P,[o("Kolab"),r(t)]),o(" - Kolab community is a unified communication and collaboration system. ("),e("a",ey,[o("Source Code"),r(t)]),o(") "),oy,o(),ry]),e("li",null,[e("a",ty,[o("Kopano"),r(t)]),o(" - Groupware suite including e-mail, calendars, tasks, todos and notes. Featuring a modern WebApp, DeskApp and mobile access over Z-Push/ActiveSync. ("),e("a",ny,[o("Demo"),r(t)]),o(", "),e("a",sy,[o("Source Code"),r(t)]),o(") "),ly,o(),ay]),e("li",null,[e("a",iy,[o("Mayan EDMS"),r(t)]),o(" - Free Open Source Electronic Document Management System. An electronic vault for your documents with preview generation, OCR, and automatic categorization among other features. ("),e("a",hy,[o("Demo"),r(t)]),o(", "),e("a",cy,[o("Source Code"),r(t)]),o(") "),dy,o(),_y]),e("li",null,[e("a",uy,[o("Openmeetings"),r(t)]),o(". ("),e("a",py,[o("Source Code"),r(t)]),o(") - Openmeetings provides video conferencing, instant messaging, white board, collaborative document editing and other groupware tools using API functions of the Red5 Streaming Server for Remoting and Streaming. "),fy,o(),gy]),e("li",null,[e("a",by,[o("Sogo"),r(t)]),o(" - SOGo offers multiple ways to access the calendaring and messaging data. CalDAV, CardDAV, GroupDAV, as well as ActiveSync, including native Outlook compatibility and web interface. ("),e("a",my,[o("Demo"),r(t)]),o(", "),e("a",ky,[o("Source Code"),r(t)]),o(") "),wy,o(),Py]),e("li",null,[e("a",yy,[o("Tine 2.0"),r(t)]),o(" - Contacts, Calendar, Tasks, WebDAV, ActiveSync, VOIP, Mail-Client, CRM, Sales, Projects, Timetracker. ("),e("a",Sy,[o("Demo"),r(t)]),o(", "),e("a",vy,[o("Source Code"),r(t)]),o(") "),Cy,o(),Ay]),e("li",null,[e("a",Ly,[o("Zimbra Collaboration"),r(t)]),o(" - Email, calendar, collaboration server with web interface and lots of integrations. ("),e("a",My,[o("Source Code"),r(t)]),o(") "),Gy,o(),xy])]),Ty,e("ul",null,[e("li",null,[e("a",Iy,[o("Chamilo LMS"),r(t)]),o(" - Chamilo LMS allows you to create a virtual campus for the provision of online or semi-online training. ("),e("a",Ey,[o("Source Code"),r(t)]),o(") "),Dy,o(),By]),e("li",null,[e("a",Hy,[o("edX"),r(t)]),o(" - The Open edX platform is open-source code that powers "),e("a",jy,[o("edX.org"),r(t)]),o(". ("),e("a",Ry,[o("Source Code"),r(t)]),o(") "),Oy,o(),Fy]),e("li",null,[e("a",Ny,[o("lxHive"),r(t)]),o(" - Open Source ExperienceAPI compliant Learning Record Store (LRS) - previously code-named TinCanAPI. "),e("a",zy,[o("Source Code"),r(t)]),o(),Wy,o(),Jy]),e("li",null,[e("a",Uy,[o("Mahara"),r(t)]),o(" - Open Source fully featured web application to build students electronic portfolio. "),e("a",Vy,[o("Source Code"),r(t)]),o(),qy,o(),Ky]),e("li",null,[e("a",Xy,[o("Moodle"),r(t)]),o(" - Moodle is a learning and courses platform with one of the largest open source communities worldwide. ("),e("a",Yy,[o("Demo"),r(t)]),o(", "),e("a",Zy,[o("Source Code"),r(t)]),o(") "),Qy,o(),$y]),e("li",null,[e("a",e3,[o("RELATE"),r(t)]),o(" - RELATE is a web-based courseware package, includes features such as: flexible rules, statistics, multi-course support, class calender. ("),e("a",o3,[o("Source Code"),r(t)]),o(") "),r3,o(),t3]),e("li",null,[e("a",n3,[o("Sakai"),r(t)]),o(" - The Sakai project provides a flexible and feature-rich environment for teaching, learning, research and other collaboration. ("),e("a",s3,[o("Demo"),r(t)]),o(", "),e("a",l3,[o("Source Code"),r(t)]),o(") "),a3,o(),i3]),e("li",null,[e("a",h3,[o("SchoolTool"),r(t)]),o(" - SchoolTool is free administrative software for schools. It includes demographics, gradebook, attendance, calendaring, reporting and more for primary and secondary schools. ("),e("a",c3,[o("Source Code"),r(t)]),o(") "),d3,o(),_3])]),u3,e("ul",null,[e("li",null,[e("a",p3,[o("Graphhopper"),r(t)]),o(" - Fast routing library and server using OpenStreetMap. ("),e("a",f3,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",g3,[o("MapBBCodeShare"),r(t)]),o(" - Tool for sharing custom OSM maps. Support for annotated markers, polygons, lines, multi-format import/export, multiple layers, shortlinks... ("),e("a",b3,[o("Demo"),r(t)]),o(") "),m3,o(),k3]),e("li",null,[e("a",w3,[o("OpenGTS"),r(t)]),o(" - Entry-level fleet tracking system. Supports variety of tracking devices and protocols. Comes with rich web-interface and reporting features. ("),e("a",P3,[o("Demo"),r(t)]),o(", "),e("a",y3,[o("Source Code"),r(t)]),o(") "),S3,o(),v3]),e("li",null,[e("a",C3,[o("Openstreetmap"),r(t)]),o(" - OpenStreetMap is a map of the world, created by people like you and free to use under an open license. ("),e("a",A3,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",L3,[o("Traccar"),r(t)]),o(" - Java application to track GPS positions. Supports loads of tracking devices and protocols, has an Android and iOS App. Has a web interface to view your trips. ("),e("a",M3,[o("Demo"),r(t)]),o(", "),e("a",G3,[o("Source Code"),r(t)]),o(") "),x3]),e("li",null,[e("a",T3,[o("uMap"),r(t)]),o(" - Create maps with OpenStreetMap layers in a minute and embed them in your site. ("),e("a",I3,[o("Source Code"),r(t)]),o(") "),E3,o(),D3])]),B3,e("p",null,[o("See also "),e("a",H3,[o("https://en.wikipedia.org/wiki/List_of_streaming_media_systems"),r(t)]),o(", "),e("a",j3,[o("https://en.wikipedia.org/wiki/Comparison_of_streaming_media_systems"),r(t)])]),R3,e("ul",null,[e("li",null,[e("a",O3,[o("Airtime"),r(t)]),o(" - Simple, open source platform that lets you broadcast streaming radio on the web. "),e("a",F3,[o("Source Code"),r(t)]),o(),N3,o(),z3]),e("li",null,[e("a",W3,[o("Ampache"),r(t)]),o(" - A web based audio/video streaming application. ("),e("a",J3,[o("Demo"),r(t)]),o(", "),e("a",U3,[o("Source Code"),r(t)]),o(") "),V3,o(),q3]),e("li",null,[e("a",K3,[o("CherryMusic"),r(t)]),o(" - Minimalistic Web-Mediaplayer. ("),e("a",X3,[o("Source Code"),r(t)]),o(") "),Y3,o(),Z3]),e("li",null,[e("a",Q3,[o("cloudtunes"),r(t)]),o(" - Web-based music player for the cloud. "),$3,o(),eS]),e("li",null,[e("a",oS,[o("GNU FM"),r(t)]),o(" - Running music community websites, alternative to "),e("a",rS,[o("last.fm"),r(t)]),o(". ("),e("a",tS,[o("Source Code"),r(t)]),o(") "),nS,o(),sS]),e("li",null,[e("a",lS,[o("Groove Basin"),r(t)]),o(" - A music player server with a web-based user interface inspired by Amarok 1.4 ("),e("a",aS,[o("Source Code"),r(t)]),o(") "),iS,o(),hS]),e("li",null,[e("a",cS,[o("Icecast 2"),r(t)]),o(" - streaming audio/video server which can be used to create an Internet radio station or a privately running jukebox and many things in between. ("),e("a",dS,[o("Source Code"),r(t)]),o(") "),_S,o(),uS]),e("li",null,[e("a",pS,[o("koel"),r(t)]),o(" - A personal music streaming server that works. ("),e("a",fS,[o("Source Code"),r(t)]),o(") "),gS,o(),bS]),e("li",null,[e("a",mS,[o("Libresonic"),r(t)]),o(" - Open-source web-based media streamer and jukebox. A fork of Subsonic's last open-source release, before it switched licenses. "),kS,o(),wS]),e("li",null,[e("a",PS,[o("Mopidy"),r(t)]),o(" - Extensible music server. Offers a superset of the mpd API, as well as integration with 3rd party services like Spotify, SoundCloud etc. ("),e("a",yS,[o("Source Code"),r(t)]),o(") "),SS,o(),vS]),e("li",null,[e("a",CS,[o("Moped"),r(t)]),o(" - Responisve HTML5 + Javascript client for the Mopidy music server "),AS,o(),LS]),e("li",null,[e("a",MS,[o("Mopidy MusicBox"),r(t)]),o(" - Web Client for Mopidy Music Server "),GS,o(),xS]),e("li",null,[e("a",TS,[o("Mopidy-Party"),r(t)]),o(" - Mopidy web extension designed for party! Let your guests manage the sound.) "),IS,o(),ES]),e("li",null,[e("a",DS,[o("mpd"),r(t)]),o(" - Daemon to remotely play music, stream music, handle and organize playlists. Many clients available. "),BS,o(),HS]),e("li",null,[e("a",jS,[o("ympd"),r(t)]),o(" - Standalone MPD Web GUI written in C, utilizing Websockets and Bootstrap/JS ("),e("a",RS,[o("Source Code"),r(t)]),o(") "),OS,o(),FS]),e("li",null,[e("a",NS,[o("Sonerezh"),r(t)]),o(" - A self-hosted, web-based application for stream your music, everywhere. ("),e("a",zS,[o("Demo"),r(t)]),o(", "),e("a",WS,[o("Documentation"),r(t)]),o(", "),e("a",JS,[o("Source Code"),r(t)]),o(") "),US,o(),VS])]),qS,e("ul",null,[e("li",null,[e("a",KS,[o("CyTube"),r(t)]),o(" - CyTube is a web application providing media synchronization, chat, and more for an arbitrary number of channels. ("),e("a",XS,[o("Demo"),r(t)]),o(") "),YS,o(),ZS]),e("li",null,[e("a",QS,[o("Emby"),r(t)]),o(" - A home media server built using other popular open source technologies. - "),$S]),e("li",null,[e("a",ev,[o("Flumotion"),r(t)]),o(" - A streaming media server with intuitive graphical administration tools. ("),e("a",ov,[o("Source Code"),r(t)]),o(") "),rv,o(),tv]),e("li",null,[e("a",nv,[o("HTPC Manager"),r(t)]),o(" - A fully responsive interface to manage all your favorite media on your HTPC. - "),sv]),e("li",null,[e("a",lv,[o("Icecast 2"),r(t)]),o(" - streaming audio/video server which can be used to create an Internet radio station or a privately running jukebox and many things in between. ("),e("a",av,[o("Source Code"),r(t)]),o(") "),iv,o(),hv]),e("li",null,[e("a",cv,[o("ReadyMedia"),r(t)]),o(" - A simple media server software, with the aim of being fully compliant with DLNA/UPnP-AV clients. "),dv,o(),_v]),e("li",null,[e("a",uv,[o("Restreamer"),r(t)]),o(" - Restreamer allows you to do h.264 real-time video streaming on your website without a streaming provider. ("),e("a",pv,[o("Source Code"),r(t)]),o(") "),fv,o(),gv]),e("li",null,[e("a",bv,[o("Rygel"),r(t)]),o(" - Rygel is a home media solution (UPnP AV MediaServer) that allows you to easily share audio, video and pictures to other devices. Additionally, media player software may use Rygel to become a MediaRenderer that may be controlled remotely by a UPnP or DLNA Controller. "),mv,o(),kv]),e("li",null,[e("a",wv,[o("Streama"),r(t)]),o(" - Self-hosted Netflix alternative. - "),Pv,o(),yv]),e("li",null,[e("a",Sv,[o("Zoneminder"),r(t)]),o(" - Closed-circuit television (CCTV) software application which supports IP, USB and Analog cameras. "),vv,o(),Cv])]),Av,e("ul",null,[e("li",null,[e("a",Lv,[o("EasyBook Project"),r(t)]),o(" - Book publishing as easy as it should be. ("),e("a",Mv,[o("Source Code"),r(t)]),o(") "),Gv,o(),xv]),e("li",null,[e("a",Tv,[o("GeneWeb"),r(t)]),o(" - GeneWeb is an open source genealogy software written in OCaml. It comes with a Web interface and can be used off-line or as a Web service. ("),e("a",Iv,[o("Demo"),r(t)]),o(", "),e("a",Ev,[o("Source Code"),r(t)]),o(") "),Dv,o(),Bv]),e("li",null,[e("a",Hv,[o("King Phisher"),r(t)]),o(" - King Phisher is a tool for testing and promoting user awareness by simulating real world phishing attacks. "),jv,o(),Rv]),e("li",null,[e("a",Ov,[o("Mindmaps"),r(t)]),o(" - An open source, offline capable, mind mapping application. ("),e("a",Fv,[o("Demo"),r(t)]),o(") "),Nv,o(),zv]),e("li",null,[e("a",Wv,[o("Para"),r(t)]),o(" - Para is a flexible and modular backend framework/server for object persistence, API development and authentication. ("),e("a",Jv,[o("Source Code"),r(t)]),o(") "),Uv,o(),Vv]),e("li",null,[e("a",qv,[o("Skygear"),r(t)]),o(" - A complete backend server for web, mobile and iOT applcations. ("),e("a",Kv,[o("Demo"),r(t)]),o(", "),e("a",Xv,[o("Source Code"),r(t)]),o(") "),Yv,o(),Zv]),e("li",null,[e("a",Qv,[o("webtrees"),r(t)]),o(" - webtrees is the web's leading on-line collaborative genealogy application. ("),e("a",$v,[o("Demo"),r(t)]),o(", "),e("a",e8,[o("Source Code"),r(t)]),o(") "),o8,o(),r8])]),t8,e("ul",null,[e("li",null,[e("a",n8,[o("Benedetto"),r(t)]),o(" - Bennedetto is a simple, turn-based budget management app. "),s8,o(),l8]),e("li",null,[e("a",a8,[o("Economizzer"),r(t)]),o(" - Economizzer is a simple and open source personal finance manager system, available in English, Brazilian, Portuguese and Russian. ("),e("a",i8,[o("Source Code"),r(t)]),o(") "),h8,o(),c8]),e("li",null,[e("a",d8,[o("ExMoney"),r(t)]),o(" - A [work-in-progress] self-hosted personal finance app. "),_8,o(),u8]),e("li",null,[e("a",p8,[o("Firefly III"),r(t)]),o(" - Firefly III is a financial manager. It helps you keeping track of your money and make budget forecasts. It supports credit cards, shared household accounts and savings accounts. Very modern, it's powered by Laravel and requires PHP7. "),f8,o(),g8]),e("li",null,[e("a",b8,[o("Galette"),r(t)]),o(" - Galette is a membership management web application towards non profit organizations. ("),e("a",m8,[o("Source Code"),r(t)]),o(") "),k8,o(),w8]),e("li",null,[e("a",P8,[o("GLPI"),r(t)]),o(" - GLPI is an IT assests/resources/inventory manager. ("),e("a",y8,[o("Source Code"),r(t)]),o(") "),S8,o(),v8]),e("li",null,[e("a",C8,[o("GRR"),r(t)]),o(" - Assets management and booking for small/medium companies. ("),e("a",A8,[o("demo"),r(t)]),o(", "),L8,o(") "),M8,o(),G8]),e("li",null,[e("a",x8,[o("Hospital Run"),r(t)]),o(" - Hospital Run is offline enabled hospital management software. ("),e("a",T8,[o("Source Code"),r(t)]),o(", "),e("a",I8,[o("Demo"),r(t)]),o(") "),E8,o(),D8]),e("li",null,[e("a",B8,[o("Inventaire"),r(t)]),o(" - Collaborative resources mapper project, while yet only focused on exploring books mapping with wikidata and ISBNs. ("),e("a",H8,[o("Source Code"),r(t)]),o(") "),j8,o(),R8]),e("li",null,[e("a",O8,[o("Invoice Ninja"),r(t)]),o(" - A powerful tool to invoice clients online. ("),e("a",F8,[o("Demo"),r(t)]),o(", "),e("a",N8,[o("Source Code"),r(t)]),o(") "),z8,o(),W8]),e("li",null,[e("a",J8,[o("InvoicePlane"),r(t)]),o(" - Manage quotes, invoices, payments and customers for your small business. ("),e("a",U8,[o("Demo"),r(t)]),o(", "),e("a",V8,[o("Source Code"),r(t)]),o(") "),q8]),e("li",null,[e("a",K8,[o("IHateMoney"),r(t)]),o(" - Manage your shared expenses, easily. ("),e("a",X8,[o("Source Code"),r(t)]),o(") "),Y8,o(),Z8]),e("li",null,[e("a",Q8,[o("Tryton"),r(t)]),o(" - Core base of a complete business solution (ERP). ("),e("a",$8,[o("Demo"),r(t)]),o(" admin/admin, "),e("a",e9,[o("Source Code"),r(t)]),o(") "),o9,o(),r9]),e("li",null,[e("a",t9,[o("Koha"),r(t)]),o(" - Fully featured, scalable library management system (integrated library system - ILS). ("),e("a",n9,[o("Source Code"),r(t)]),o(") "),s9,o(),l9]),e("li",null,[e("a",a9,[o("PartKeepr"),r(t)]),o(" - PartKeepr is an electronic part inventory management software. It helps you to keep track of your available parts and assist you with re-ordering parts. ("),e("a",i9,[o("Demo"),r(t)]),o(", "),e("a",h9,[o("Source Code"),r(t)]),o(") "),c9,o(),d9]),e("li",null,[e("a",_9,[o("StockazNG"),r(t)]),o(" - Asset Management System. "),u9,o(),p9])]),f9,e("p",null,[o("See "),e("a",g9,[o("https://github.com/n1trux/awesome-sysadmin#monitoring"),r(t)]),o(" and "),e("a",b9,[o("https://github.com/n1trux/awesome-sysadmin#metric--metric-collection"),r(t)])]),m9,e("ul",null,[e("li",null,[e("a",k9,[o("dillinger"),r(t)]),o(" - The last Markdown editor, ever. ("),e("a",w9,[o("Source Code"),r(t)]),o(") "),P9,o(),y9]),e("li",null,[e("a",S9,[o("Jotter"),r(t)]),o(" - Jotter is a lightweight, no database, powerful web notebook that lets you create and manage notes online safely, quickly & easily. ("),e("a",v9,[o("Demo"),r(t)]),o(") "),C9,o(),A9]),e("li",null,[e("a",L9,[o("Laverna"),r(t)]),o(" - Laverna is a Javascript note taking application with Markdown editor and encryption support. Consider it like open source alternative to Evernote. ("),e("a",M9,[o("Demo"),r(t)]),o(", "),e("a",G9,[o("Source Code"),r(t)]),o(") "),x9,o(),T9]),e("li",null,[e("a",I9,[o("Leanote"),r(t)]),o(" - Leanote, Not Just A Notepad! Open source cloud notepad. ("),e("a",E9,[o("Demo"),r(t)]),o(", "),e("a",D9,[o("Source Code"),r(t)]),o(") "),B9,o(),H9]),e("li",null,[e("a",j9,[o("Markdown Edit"),r(t)]),o(" - Online markdown editor/viewer. ("),e("a",R9,[o("Source code"),r(t)]),o(") "),O9,o(),F9]),e("li",null,[e("a",N9,[o("minimalist-web-notepad"),r(t)]),o(" - A minimalist "),e("a",z9,[o("http://notepad.cc"),r(t)]),o(" clone. "),W9,o(),J9]),e("li",null,[e("a",U9,[o("notes"),r(t)]),o(" - Simple script for personal notes with a single page with a WYSIWYG Editor. "),V9,o(),q9]),e("li",null,[e("a",K9,[o("OpenNote"),r(t)]),o(" - OpenNote was built to be an open web-based alternative to Microsoft OneNote (T) and EverNote. ("),e("a",X9,[o("Demo"),r(t)]),o(") "),Y9,o(),Z9]),e("li",null,[e("a",Q9,[o("Paperwork"),r(t)]),o(" - OpenSource note-taking & archiving alternative to Evernote, Microsoft OneNote & Google Keep. ("),e("a",$9,[o("Source Code"),r(t)]),o(") "),eC,o(),oC]),e("li",null,[e("a",rC,[o("ShareLaTex"),r(t)]),o(" - A web-based collaborative LaTeX editor. ("),e("a",tC,[o("Source Code"),r(t)]),o(") "),nC,o(),sC]),e("li",null,[e("a",lC,[o("Turtl"),r(t)]),o(" - A totally private personal database and note taking app. ("),e("a",aC,[o("Source Code"),r(t)]),o(") "),iC,o(),hC])]),cC,e("ul",null,[e("li",null,[e("a",dC,[o("EtherCalc"),r(t)]),o(" - Web spreadsheet. ("),e("a",_C,[o("Source code"),r(t)]),o(),uC,o(),pC]),e("li",null,[e("a",fC,[o("Etherpad"),r(t)]),o(" - Etherpad is a highly customizable Open Source online editor providing collaborative editing in really real-time. - "),gC]),e("li",null,[e("a",bC,[o("Infinoted"),r(t)]),o(" - A server for "),e("a",mC,[o("Gobby"),r(t)]),o(", a multi-platform collaborative text editor. ("),e("a",kC,[o("Source Code"),r(t)]),o(") "),wC,o(),PC]),e("li",null,[e("a",yC,[o("ONLYOFFICE"),r(t)]),o(" - An office suite that enables you to manage documents, projects, team and customer relations in one place. ("),e("a",SC,[o("Source Code"),r(t)]),o(") "),vC,o(),CC]),e("li",null,[e("a",AC,[o("PHPOffice"),r(t)]),o(" - PHPOffice contains libraries which permits to write and read files from most office suites. "),LC,o(),MC]),e("li",null,[e("a",GC,[o("WebODF"),r(t)]),o(" - Tools and libraries to view and edit Open Document Format (ODF) files. ("),e("a",xC,[o("Source Code"),r(t)]),o(") "),TC,o(),IC]),e("li",null,[e("a",EC,[o("ownCloud documents"),r(t)]),o(" - Collaborative editing and sharing of rich-text documents. ("),e("a",DC,[o("Source Code"),r(t)]),o(") "),BC,o(),HC])]),jC,e("ul",null,[e("li",null,[e("a",RC,[o("keeweb"),r(t)]),o(" - This webapp is a browser and desktop password manager compatible with KeePass databases. ("),e("a",OC,[o("Source Code"),r(t)]),o(") "),FC,o(),NC]),e("li",null,[e("a",zC,[o("PHP Password Manager"),r(t)]),o(" - A web based, encrypting password manager, based on the Yii framework. ("),e("a",WC,[o("Source Code"),r(t)]),o(") "),JC,o(),UC]),e("li",null,[e("a",VC,[o("RatticDB"),r(t)]),o(" - Password Management for Humans. ("),e("a",qC,[o("Source Code"),r(t)]),o(", "),e("a",KC,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",XC,[o("sysPass"),r(t)]),o(" - Multiuser password management system. ("),e("a",YC,[o("Source Code"),r(t)]),o(", "),e("a",ZC,[o("Demo"),r(t)]),o(") "),QC,o(),$C]),e("li",null,[e("a",e5,[o("Teampass"),r(t)]),o(" - Password manager dedicated for managing passwords in a collaborative way on any server Apache, MySQL and PHP. ("),e("a",o5,[o("Source Code"),r(t)]),o(") "),r5,o(),t5])]),n5,e("ul",null,[e("li",null,[e("a",s5,[o("0bin"),r(t)]),o(" - Client side encrypted pastebin. "),l5,o(),a5]),e("li",null,[e("a",i5,[o("cryptonote"),r(t)]),o(" - A simple open source web application that lets users encrypt and share messages that can only be read once. ("),e("a",h5,[o("Source Code"),r(t)]),o(") "),c5,o(),d5]),e("li",null,[e("a",_5,[o("gist"),r(t)]),o(" - GIST is an open-source application to share code. "),u5,o(),p5]),e("li",null,[e("a",f5,[o("hastebin"),r(t)]),o(" - Open source pastebin written in node.js. ("),e("a",g5,[o("Demo"),r(t)]),o(", "),e("a",b5,[o("Source Code"),r(t)]),o(") "),m5,o(),k5]),e("li",null,[e("a",w5,[o("localpaste"),r(t)]),o(" - Simple python based pastebin you can run locally, with curl for input. Supports RAW text by default and binary data such as images (no extensions on returned url). "),P5,o(),y5]),e("li",null,[e("a",S5,[o("NoteHub"),r(t)]),o(" - Free and Hassle-free Pastebin for Markdown Pages. Simple, clean, password provided, generated-short link. ("),e("a",v5,[o("Demo"),r(t)]),o(", "),e("a",C5,[o("Source Code"),r(t)]),o(") "),A5,o(),L5]),e("li",null,[e("a",M5,[o("Pastebin"),r(t)]),o(" - Modern self-hosted pastebin service with a restful API. ("),e("a",G5,[o("Demo"),r(t)]),o(", "),e("a",x5,[o("Source Code"),r(t)]),o(") "),T5,o(),I5]),e("li",null,[e("a",E5,[o("Pastedown"),r(t)]),o(" - Self-hosted pastebin server. It is meant to handle Markdown well, but it also works with code snippets (and does syntax highlighting). ("),e("a",D5,[o("Source Code"),r(t)]),o(") "),B5,o(),H5]),e("li",null,[e("a",j5,[o("pb"),r(t)]),o(" - Lightweight pastebin (and url shortener) built using flask. ("),e("a",R5,[o("Demo"),r(t)]),o(") "),O5,o(),F5]),e("li",null,[e("a",N5,[o("pbnh"),r(t)]),o(" - Pastebin inspired from project pb and hastebin, with an API and a SQL-based backend. "),z5,o(),W5]),e("li",null,[e("a",J5,[o("Phaste"),r(t)]),o(" - A Phalcon-based, MySQL pastebin application with privacy-respecting Piwik integration and syntax highlighting. ("),e("a",U5,[o("Source Code"),r(t)]),o(") "),V5,o(),q5]),e("li",null,[e("a",K5,[o("snipt"),r(t)]),o(" - Long-term memory for coders. Share and store code snippets ("),e("a",X5,[o("Source Code"),r(t)]),o(") "),Y5,o(),Z5]),e("li",null,[e("a",Q5,[o("Sticky Notes"),r(t)]),o(" - A powerful open-source pastebin application for effortless code sharing. ("),e("a",$5,[o("Source Code"),r(t)]),o(") "),e4]),e("li",null,[e("a",o4,[o("Stikked"),r(t)]),o(" - An advanced and beautiful pastebin. "),r4,o(),t4]),e("li",null,[e("a",n4,[o("tastebin"),r(t)]),o(" - Updated version of hastebin plus additional features. "),s4,o(),l4]),e("li",null,[e("a",a4,[o("ZeroBin"),r(t)]),o(" - ZeroBin is a minimalist, opensource online pastebin/discussion board where the server has zero knowledge of hosted data. ("),e("a",i4,[o("Demo"),r(t)]),o(", "),e("a",h4,[o("Source Code"),r(t)]),o(") "),c4,o(),d4])]),_4,e("ul",null,[e("li",null,[e("a",u4,[o("Dashing"),r(t)]),o(" - Sinatra based, open sourced dashboard builder from Shopify. ("),e("a",p4,[o("Demo"),r(t)]),o(", "),e("a",f4,[o("Source Code"),r(t)]),o(") "),g4,o(),b4]),e("li",null,[e("a",m4,[o("Dj Diabetes"),r(t)]),o(" - My Glucose Manager - follow your daily health "),k4,o(),w4]),e("li",null,[e("a",P4,[o("Freeboard"),r(t)]),o(" - An open source real-time dashboard builder for IOT and other web mashups. ("),e("a",y4,[o("Source Code"),r(t)]),o(") "),S4,o(),v4]),e("li",null,[e("a",C4,[o("Grafana"),r(t)]),o(" - An open source dashboard for data visualization. ("),e("a",A4,[o("Source Code"),r(t)]),o(") "),L4,o(),M4]),e("li",null,[e("a",G4,[o("Habitica"),r(t)]),o(" - A habit tracker app which treats your goals like a Role Playing Game. Previously called HabitRPG. ("),e("a",x4,[o("Source Code"),r(t)]),o(") "),T4,o(),I4]),e("li",null,[e("a",E4,[o("Phant"),r(t)]),o(" - Phant is a modular data logging tool for collecting data from the Internet of Things. ("),e("a",D4,[o("Demo"),r(t)]),o(", "),e("a",B4,[o("Source Code"),r(t)]),o(") "),H4,o(),j4]),e("li",null,[e("a",R4,[o("Reportr"),r(t)]),o(" - Your life's personal dashboard. ("),e("a",O4,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",F4,[o("Thingspeak"),r(t)]),o(" - An open source “Internet of Things” application and API to store and retrieve data from things using HTTP. ("),e("a",N4,[o("Demo"),r(t)]),o(", "),e("a",z4,[o("Source Code"),r(t)]),o(") "),W4,o(),J4]),e("li",null,[e("a",U4,[o("Tipboard"),r(t)]),o(" - In-house, tasty, local dashboarding system. ("),e("a",V4,[o("Source Code"),r(t)]),o(") "),q4,o(),K4]),e("li",null,[e("a",X4,[o("wger"),r(t)]),o(" - A web-based personal workout, fitness and weight logger/tracker. It can also be used as a simple gym management utility and offers a full REST API as well. ("),e("a",Y4,[o("Demo"),r(t)]),o(") "),Z4,o(),Q4])]),$4,e("ul",null,[e("li",null,[e("a",e0,[o("Chevereto 2.X"),r(t)]),o(" - Open source one-click image hosting script. ("),e("a",o0,[o("Source Code"),r(t)]),o(") "),r0,o(),t0]),e("li",null,[e("a",n0,[o("CumulusClips"),r(t)]),o(" - Your own video sharing website with CumulusClips video sharing script. You can build a YouTube clone where users can upload, rate, comment on videos, and much more. ("),e("a",s0,[o("Demo"),r(t)]),o(") "),l0,o(),a0]),e("li",null,[e("a",i0,[o("Koken"),r(t)]),o(" - Content management and web site publishing for photographers. "),h0]),e("li",null,[e("a",c0,[o("Lychee"),r(t)]),o(" - An open source grid and album based photo-management-system. ("),e("a",d0,[o("Source Code"),r(t)]),o(") "),_0,o(),u0]),e("li",null,[e("a",p0,[o("MediaDrop"),r(t)]),o(" - A video, audio and podcast publication platform. ("),e("a",f0,[o("Source Code"),r(t)]),o(") "),g0,o(),b0]),e("li",null,[e("a",m0,[o("Mediagoblin"),r(t)]),o(" - A Free software media publishing platform that anyone can run. You can think of it as a decentralized alternative to Flickr, YouTube, SoundCloud, etc. "),k0,o(),w0]),e("li",null,[e("a",P0,[o("MinigalNano"),r(t)]),o(" - MinigalNano is a very simple image gallery. It adheres to the KISS principle and is very easy to install. MinigalNano does not have a web admin interface: You just upload your images in the photo folder on your server (using FTP, SFTP) ("),e("a",y0,[o("Demo"),r(t)]),o(") "),S0,o(),v0]),e("li",null,[e("a",C0,[o("phog"),r(t)]),o(" - Static photo gallery generator with S3 uploader. "),A0]),e("li",null,[e("a",L0,[o("Photofloat"),r(t)]),o(" - A Web 2.0 Photo Gallery Done Right via Static JSON & Dynamic Javascript. ("),e("a",M0,[o("Demo"),r(t)]),o(") "),G0,o(),x0]),e("li",null,[e("a",T0,[o("PhotoLight"),r(t)]),o(" - The easiest photo gallery there is. "),I0,o(),E0]),e("li",null,[e("a",D0,[o("Photoshow"),r(t)]),o(" - Responsive Web Gallery. ("),e("a",B0,[o("Source Code"),r(t)]),o(") "),H0,o(),j0]),e("li",null,[e("a",R0,[o("Piwigo"),r(t)]),o(" - Photo gallery software for the web, built by an active community of users and developers. - "),O0,o(),F0]),e("li",null,[e("a",N0,[o("Plumi"),r(t)]),o(" - Create your own sophisticated video-sharing site. ("),e("a",z0,[o("Source Code"),r(t)]),o(") "),W0,o(),J0]),e("li",null,[e("a",U0,[o("Pygmyfoto"),r(t)]),o(" - A crude solution for publishing a photo roll on the web. "),V0]),e("li",null,[e("a",q0,[o("Shot.io"),r(t)]),o(" - Mobile optimised photo publishing platform (self-hosted Flickr alternative) ("),e("a",K0,[o("Source Code"),r(t)]),o(") "),X0,o(),Y0]),e("li",null,[e("a",Z0,[o("sigal"),r(t)]),o(" - Yet another simple static gallery generator. "),Q0,o(),$0]),e("li",null,[e("a",e6,[o("UberGallery"),r(t)]),o(" - UberGallery is an easy to use, simple to manage, web photo gallery. UberGallery does not require a database and supports JPEG, GIF and PNG file types. Simply upload your images and UberGallery will automatically generate thumbnails and output HTML. ("),e("a",o6,[o("Source Code"),r(t)]),o(") "),r6,o(),t6]),e("li",null,[e("a",n6,[o("Videobin"),r(t)]),o(" - A simple video upload and sharing service with transcoding. ("),e("a",s6,[o("Demo"),r(t)]),o(", "),e("a",l6,[o("Source Code"),r(t)]),o(") "),a6,o(),i6]),e("li",null,[e("a",h6,[o("Zenphoto"),r(t)]),o(" - Open-source gallery and CMS project. ("),e("a",c6,[o("Source Code"),r(t)]),o(") "),d6,o(),_6])]),u6,e("ul",null,[e("li",null,[e("a",p6,[o("dudle"),r(t)]),o(" - An online scheduling application. ("),e("a",f6,[o("Demo"),r(t)]),o(") "),g6,o(),b6]),e("li",null,[e("a",m6,[o("Framadate"),r(t)]),o(" - An online service for planning an appointment or make a decision quickly and easily: Make a poll, Define dates or subjects to choose, Send the poll link to your friends or colleagues, Discuss and make a decision. ("),e("a",k6,[o("Demo"),r(t)]),o(", "),e("a",w6,[o("Source Code"),r(t)]),o(") "),P6,o(),y6]),e("li",null,[e("a",S6,[o("Kyélà"),r(t)]),o(" - Participation polls for group events. ("),e("a",v6,[o("Demo"),r(t)]),o(", "),e("a",C6,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",A6,[o("LimeSurvey"),r(t)]),o(" - Feature-rich Open Source web based polling software. Supports extensive survey logic. ("),e("a",L6,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",M6,[o("MaterialPoll"),r(t)]),o(" - An opensource "),e("a",G6,[o("strawpoll.me"),r(t)]),o(" clone for creating random polls. ("),e("a",x6,[o("Demo"),r(t)]),o(", "),e("a",T6,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",I6,[o("Nuages"),r(t)]),o(" - Collaborative meeting poll system, similar to doodle or rdvz. ("),e("a",E6,[o("Source Code"),r(t)]),o(") "),D6,o(),B6]),e("li",null,[e("a",H6,[o("TellForm"),r(t)]),o(" - A beautiful online form and survey creator. ("),e("a",j6,[o("Demo"),r(t)]),o(", "),e("a",R6,[o("Source Code"),r(t)]),o(") "),O6,o(),F6])]),N6,e("ul",null,[e("li",null,[e("a",z6,[o("microproxy"),r(t)]),o(" - lightweight non-caching HTTP/HTTPS proxy server. ("),e("a",W6,[o("Source Code"),r(t)]),o(") "),J6,o(),U6]),e("li",null,[e("a",V6,[o("miniProxy"),r(t)]),o(" - Simple web proxy written in PHP that can allow you to bypass Internet content filters, or to browse the internet anonymously. Only one php file. ("),e("a",q6,[o("Source Code"),r(t)]),o(") "),K6,o(),X6]),e("li",null,[e("a",Y6,[o("Oranjeproxy"),r(t)]),o(" - Anonymizing web proxy. ("),e("a",Z6,[o("Source Code"),r(t)]),o(") "),Q6,o(),$6]),e("li",null,[e("a",e7,[o("Pound"),r(t)]),o(" - Light-weight reverse proxy and load balancer for HTTP/HTTPS. ("),e("a",o7,[o("Source Code"),r(t)]),o(") "),r7,o(),t7]),e("li",null,[e("a",n7,[o("Privoxy"),r(t)]),o(" - A non-caching web proxy with advanced filtering capabilities for enhancing privacy, modifying web page data and HTTP headers, controlling access, and removing ads and other obnoxious Internet junk. "),s7,o(),l7]),e("li",null,[e("a",a7,[o("scotty"),r(t)]),o(" - Scotty is a free opensource proxy software for bypassing filter and censorship systems. ("),e("a",i7,[o("Source Code"),r(t)]),o(") "),h7,o(),c7]),e("li",null,[e("a",d7,[o("Squid"),r(t)]),o(" - Caching proxy for the Web supporting HTTP, HTTPS, FTP, and more. It reduces bandwidth and improves response times by caching and reusing frequently-requested web pages. ("),e("a",_7,[o("Source Code"),r(t)]),o(") "),u7,o(),p7]),e("li",null,[e("a",f7,[o("Swiperproxy"),r(t)]),o(" - A lightning-fast, open source web proxy that is easy for you to run and customize. ("),e("a",g7,[o("Demo"),r(t)]),o(", "),e("a",b7,[o("Source Code"),r(t)]),o(") "),m7]),e("li",null,[e("a",k7,[o("Tinyproxy"),r(t)]),o(" - Light-weight HTTP/HTTPS proxy daemon. ("),e("a",w7,[o("Source Code"),r(t)]),o(") "),P7,o(),y7]),e("li",null,[e("a",S7,[o("Traefik"),r(t)]),o(" - Træfɪk is a modern HTTP reverse proxy and load balancer made to deploy microservices with ease. It supports several backends (Docker, Swarm, Mesos/Marathon, …) to manage its configuration automatically and dynamically. ("),e("a",v7,[o("Source Code"),r(t)]),o(") "),C7,o(),A7])]),L7,e("ul",null,[e("li",null,[e("a",M7,[o("Nunux Keeper"),r(t)]),o(" - Your personal content curation service. ("),e("a",G7,[o("Source Code"),r(t)]),o(") "),x7,o(),T7]),e("li",null,[e("a",I7,[o("Readityourself"),r(t)]),o(" - Read the web without ads, comments, or tweets. ("),e("a",E7,[o("Demo"),r(t)]),o(") "),D7,o(),B7]),e("li",null,[e("a",H7,[o("Wallabag"),r(t)]),o(" - Wallabag, formerly Poche, is a web application allowing you to save articles to read them later with improved readability. ("),e("a",j7,[o("Demo"),r(t)]),o(", "),e("a",R7,[o("Public instance"),r(t)]),o(", "),e("a",O7,[o("Source Code"),r(t)]),o(),F7,o(),N7])]),z7,e("ul",null,[e("li",null,[e("a",W7,[o("Gigablast"),r(t)]),o(" - open source search engine. ("),e("a",J7,[o("Demo"),r(t)]),o(", "),e("a",U7,[o("Source Code"),r(t)]),o(") "),V7,o(),q7]),e("li",null,[e("a",K7,[o("Searx"),r(t)]),o(" - A privacy-respecting, hackable metasearch engine. ("),e("a",X7,[o("Demo"),r(t)]),o(", "),e("a",Y7,[o("Public instances"),r(t)]),o(")")]),e("li",null,[e("a",Z7,[o("Seeks"),r(t)]),o(" - A websearch proxy and collaborative distributed tool for websearch. "),Q7,o(),$7]),e("li",null,[e("a",eA,[o("Yacy"),r(t)]),o(" - Peer based, decentralized search engine server. "),oA,o(),rA])]),tA,e("ul",null,[e("li",null,[e("a",nA,[o("Apache Bloodhound"),r(t)]),o(" - Manage software products, Keep track of features, tasks and bugs. "),sA,o(),lA]),e("li",null,[e("a",aA,[o("CaseBox"),r(t)]),o(" - Manage all your organisation's information in one system.")]),e("li",null,[e("a",iA,[o("Fossil"),r(t)]),o(" - Distributed version control system featuring wiki and bug tracker - "),hA,o(),cA]),e("li",null,[e("a",dA,[o("gitbucket"),r(t)]),o(" - The easily installable GitHub clone powered by Scala ("),e("a",_A,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",uA,[o("GitLab"),r(t)]),o(" - Self Hosted Git Management Application - GitLab is open source software to collaborate on code. Manage git repositories with fine grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wiki. ("),e("a",pA,[o("Public instance"),r(t)]),o(")")]),e("li",null,[e("a",fA,[o("Gitlist"),r(t)]),o(" - A web-based git repository browser - GitList allows you to browse repositories using your favorite browser, viewing files under different revisions, commit history and diffs. ("),e("a",gA,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",bA,[o("Gitprep"),r(t)]),o(" - Portable Github clone. ("),e("a",mA,[o("Source Code"),r(t)]),o(", "),e("a",kA,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",wA,[o("Gogs"),r(t)]),o(" - A painless self-hosted Git Service written in Go. ("),e("a",PA,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",yA,[o("Kallithea"),r(t)]),o(" - Source code management system that supports two leading version control systems, Mercurial and Git, with a web interface. ("),e("a",SA,[o("Source Code"),r(t)]),o(") "),vA,o(),CA]),e("li",null,[e("a",AA,[o("Klaus"),r(t)]),o(" - A simple, easy-to-set-up Git web viewer that Just Works. ("),e("a",LA,[o("Demo"),r(t)]),o(") "),MA,o(),GA]),e("li",null,[e("a",xA,[o("Lavagna"),r(t)]),o(" - Lavagna is an open-source issue/project management tool designed for small teams. Lightweight, pure Java, easy to install, easy to use. ("),e("a",TA,[o("Source Code"),r(t)]),o(") "),IA,o(),EA]),e("li",null,[e("a",DA,[o("OpenProject"),r(t)]),o(" - Project collaboration.")]),e("li",null,[e("a",BA,[o("Phabricator"),r(t)]),o(" - Collection of web applications that help build better software. ("),e("a",HA,[o("Demo"),r(t)]),o(", "),e("a",jA,[o("Source Code"),r(t)]),o(") "),RA,o(),OA]),e("li",null,[e("a",FA,[o("Redmine"),r(t)]),o(" - Redmine is a flexible project management web application. "),NA,o(),zA]),e("li",null,[e("a",WA,[o("Taiga"),r(t)]),o(" - Agile Project Management Tool based on the Kanban and Scrum methods. ("),e("a",JA,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",UA,[o("The Bug Genie"),r(t)]),o(" - Written in PHP.")]),e("li",null,[e("a",VA,[o("Trac"),r(t)]),o(" - Written in python.")]),e("li",null,[e("a",qA,[o("Phproject"),r(t)]),o(" - A high performance full-featured project management system. ("),e("a",KA,[o("Demo"),r(t)]),o(", "),e("a",XA,[o("Source Code"),r(t)]),o(") "),YA])]),ZA,e("ul",null,[e("li",null,[e("a",QA,[o("Codiad"),r(t)]),o(" - A web-based IDE framework with a small footprint and minimal requirements. ("),e("a",$A,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",eL,[o("Eclipse Che"),r(t)]),o(" - Open source workspace server and cloud IDE. ("),e("a",oL,[o("Source Code"),r(t)]),o(") "),rL,o(),tL]),e("li",null,[e("a",nL,[o("ICEcoder"),r(t)]),o(" - ICEcoder is a web IDE / browser based code editor, which allows you to develop websites directly within the web browser. ("),e("a",sL,[o("Demo"),r(t)]),o(", "),e("a",lL,[o("Source Code"),r(t)]),o(") "),aL,o(),iL]),e("li",null,[e("a",hL,[o("JS Bin"),r(t)]),o(" - Open source collaborative web development debugging tool. ("),e("a",cL,[o("Source Code"),r(t)]),o(") "),dL,o(),_L]),e("li",null,[e("a",uL,[o("Koding"),r(t)]),o(" - The simplest way to manage your entire Dev Infrastructure. ("),e("a",pL,[o("Source Code"),r(t)]),o(") "),fL,o(),gL]),e("li",null,[e("a",bL,[o("Microglark"),r(t)]),o(" - A hacky minimalistic remote pair programming editor. ("),e("a",mL,[o("Demo"),r(t)]),o(", "),e("a",kL,[o("Source Code"),r(t)]),o(") "),wL,o(),PL]),e("li",null,[e("a",yL,[o("Regexr"),r(t)]),o(" - RegExr is a HTML/JS based tool for creating, testing, and learning about Regular Expressions. ("),e("a",SL,[o("Source Code"),r(t)]),o(") "),vL,o(),CL]),e("li",null,[e("a",AL,[o("RStudio Server"),r(t)]),o(" - Web browser based IDE for R. ("),e("a",LL,[o("Source Code"),r(t)]),o(") "),ML,o(),GL]),e("li",null,[e("a",xL,[o("Wide"),r(t)]),o(" - A Web-based IDE for Teams using Go programming language/Golang. ("),e("a",TL,[o("Demo"),r(t)]),o(") "),IL,o(),EL])]),DL,e("ul",null,[e("li",null,[e("a",BL,[o("Concourse"),r(t)]),o(" - Concourse is a CI tool that treats pipelines as first class objects and containerizes every step along the way. ("),e("a",HL,[o("Demo"),r(t)]),o(", "),e("a",jL,[o("Source Code"),r(t)]),o(") "),RL,o(),OL]),e("li",null,[e("a",FL,[o("drone"),r(t)]),o(" - Drone is a Continuous Delivery platform built on Docker, written in Go. ("),e("a",NL,[o("Source Code"),r(t)]),o(") "),zL,o(),WL]),e("li",null,[e("a",JL,[o("Factor.io"),r(t)]),o(" - It's like IFTTT (if-this-then-that) for Dev and DevOps. ("),e("a",UL,[o("Source Code"),r(t)]),o(") "),VL,o(),qL]),e("li",null,[e("a",KL,[o("Jenkins"),r(t)]),o(" - Continuous Integration Server. ("),e("a",XL,[o("Source Code"),r(t)]),o(") "),YL,o(),ZL]),e("li",null,[e("a",QL,[o("PHPCI"),r(t)]),o(" - Free and open source continuous integration specifically designed for PHP. ("),e("a",$L,[o("Source Code"),r(t)]),o(") "),eM,o(),oM]),e("li",null,[e("a",rM,[o("Strider"),r(t)]),o(" - Open Source Continuous Deployment / Continuous Integration platform. ("),e("a",tM,[o("Source Code"),r(t)]),o(") "),nM,o(),sM])]),lM,aM,e("ul",null,[e("li",null,[e("a",iM,[o("Docstore"),r(t)]),o(" - A basic site for hosting static documents - docstore is a simple way to serve Markdown files without any server-side processing, and without requiring you (as the author) to recompile every time you change an article. It consists of a very simple JS script that makes an ajax request to your server, runs a Markdown processor on what it finds, and then displays the results. Clone the repository and add articles in the text/ directory to get started. ("),e("a",hM,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",cM,[o("Flatdoc"),r(t)]),o(" - A small Javascript file that fetches Markdown files and renders them as full pages. "),dM,o(),_M]),e("li",null,[e("a",uM,[o("markdown-tree"),r(t)]),o(" - Serve a hierarchy / tree directory of markdown files. Use intended for small sites built in markdown")]),e("li",null,[e("a",pM,[o("Read the Docs"),r(t)]),o(" - Host documentation, making it fully searchable and easy to find; import your docs using any major version control system, including Mercurial, Git, Subversion, and Bazaar. ("),e("a",fM,[o("Demo"),r(t)]),o(", "),e("a",gM,[o("Source Code"),r(t)]),o(") "),bM,o(),mM])]),kM,e("p",null,[o("See "),e("a",wM,[o("https://staticsitegenerators.net"),r(t)]),o(" and "),e("a",PM,[o("https://www.staticgen.com"),r(t)])]),yM,SM,e("ul",null,[e("li",null,[e("a",vM,[o("bulldog"),r(t)]),o(" - HTML5 task manager, built on todo.txt. "),CM,o(),AM]),e("li",null,[e("a",LM,[o("Crepido"),r(t)]),o(" - Create (kanban) boards to track users and projects from flat markdown files. "),MM,o(),GM]),e("li",null,[e("a",xM,[o("Kanboard"),r(t)]),o(" - A simple and open source visual task board. "),TM]),e("li",null,[e("a",IM,[o("myTinyTodo"),r(t)]),o(" - Simple way to manage your todo list in AJAX style. Uses PHP, jQuery, SQLite/MySQL. GTD compliant. "),EM]),e("li",null,[e("a",DM,[o("omgnata"),r(t)]),o(" - Mobile friendly zero-feature TODO list web app. Unix philosophy. ("),e("a",BM,[o("Demo"),r(t)]),o(") "),HM,o(),jM]),e("li",null,[e("a",RM,[o("Restyaboard"),r(t)]),o(" - Open source Trello-like kanban board. ("),e("a",OM,[o("Demo"),r(t)]),o(", "),e("a",FM,[o("Source Code"),r(t)]),o(") "),NM,o(),zM]),e("li",null,[e("a",WM,[o("TaskBoard"),r(t)]),o(" - A Kanban-inspired app for keeping track of things that need to get done. ("),e("a",JM,[o("Source Code"),r(t)]),o(") "),UM]),e("li",null,[e("a",VM,[o("Taskfreak"),r(t)]),o(" - A simple but efficient web based task manager written in PHP. ("),e("a",qM,[o("Demo"),r(t)]),o(")")]),e("li",null,[e("a",KM,[o("Tasks"),r(t)]),o(" - Kanban based to-do list manager written in Go. "),XM,o(),YM]),e("li",null,[e("a",ZM,[o("tasks.php"),r(t)]),o(" - A simple task/todo list manager. "),QM]),e("li",null,[e("a",$M,[o("Taskwarrior"),r(t)]),o(" - Taskwarrior is Free and Open Source Software that manages your TODO list from your command line. It is flexible, fast, efficient, and unobtrusive. It does its job then gets out of your way. ("),e("a",eG,[o("Source Code"),r(t)]),o(") "),oG,o(),rG]),e("li",null,[e("a",tG,[o("Tinyissue"),r(t)]),o(" - Simple Issue Tracking for Teams. "),nG,o(),sG]),e("li",null,[e("a",lG,[o("Tracks"),r(t)]),o(" - A web-based application to help you implement David Allen’s "),e("a",aG,[o("Getting Things Done™"),r(t)]),o(" methodology. ("),e("a",iG,[o("Source Code"),r(t)]),o(") "),hG,o(),cG]),e("li",null,[e("a",dG,[o("Wekan"),r(t)]),o(" - An open-source Trello-like kanban. ("),e("a",_G,[o("Demo"),r(t)]),o(", "),e("a",uG,[o("Source Code"),r(t)]),o(") "),pG,o(),fG])]),gG,bG,e("ul",null,[e("li",null,[e("a",mG,[o("Bugzilla"),r(t)]),o(" - General-purpose bugtracker and testing tool originally developed and used by the Mozilla project. "),kG,o(),wG]),e("li",null,[e("a",PG,[o("Bumpy Booby"),r(t)]),o(" - A simple, responsive and highly customizable PHP bug tracking system. ("),e("a",yG,[o("Source Code"),r(t)]),o(") "),SG,o(),vG]),e("li",null,[e("a",CG,[o("Cerb"),r(t)]),o(" - Group-based e-mail management project.")]),e("li",null,[e("a",AG,[o("Deskulu"),r(t)]),o(" - Opensource helpdesk and ticketing system based on Drupal 7. ("),e("a",LG,[o("Demo"),r(t)]),o(") "),MG,o(),GG]),e("li",null,[e("a",xG,[o("DiamanteDesk"),r(t)]),o(" - DiamanteDesk is FREE Open Source easy-to-use help-desk solution. ("),e("a",TG,[o("Demo"),r(t)]),o(", "),e("a",IG,[o("Source Code"),r(t)]),o(") "),EG,o(),DG]),e("li",null,[e("a",BG,[o("Flyspray"),r(t)]),o(" - Uncomplicated, web-based bug tracking system. ("),e("a",HG,[o("Source Code"),r(t)]),o(") "),jG]),e("li",null,[e("a",RG,[o("Gaskit"),r(t)]),o(" - A git-backed issue tracker. It uses a branch in your local git database to store the tickets. "),OG]),e("li",null,[e("a",FG,[o("HuBoard"),r(t)]),o(),NG,o(" – Instant project management for your GitHub issues (Connects directly GitHub API) "),zG,o(),WG]),e("li",null,[e("a",JG,[o("MantisBT"),r(t)]),o(" - Self hosted bug tracker, fits best for software development. ("),e("a",UG,[o("Demo"),r(t)]),o("), ("),e("a",VG,[o("Source Code"),r(t)]),o(") "),qG]),e("li",null,[e("a",KG,[o("osTicket"),r(t)]),o(" - Simple support ticket system.")]),e("li",null,[e("a",XG,[o("OTRS"),r(t)]),o(" - Trouble ticket system for assigning tickets to incoming queries and tracking further communications.")]),e("li",null,[e("a",YG,[o("Request Tracker"),r(t)]),o(" - Ticket-tracking system written in Perl.")]),e("li",null,[e("a",ZG,[o("TheBugGenie"),r(t)]),o(" - Ticket system with extensive user rights system.")])]),QG,e("ul",null,[e("li",null,[e("a",$G,[o("Lstu"),r(t)]),o(" - "),ex,o(" - Lightweight URL shortener")]),e("li",null,[e("a",ox,[o("Nimbus"),r(t)]),o(" - A URL shortener and file sharer with a drag-and-drop OS X menu bar client and web interface - "),rx,o(),tx]),e("li",null,[e("a",nx,[o("Polr"),r(t)]),o(" - A modern, minimalist, modular, and lightweight URL shortener. ("),e("a",sx,[o("Source Code"),r(t)]),o(")")]),e("li",null,[e("a",lx,[o("YOURLS"),r(t)]),o(" - YOURLS is a set of PHP scripts that will allow you to run Your Own URL Shortener. Features include password protection, URL customization, bookmarklets, statistics, API, plugins, jsonp. ("),e("a",ax,[o("Source Code"),r(t)]),o(", "),e("a",ix,[o("Documentation"),r(t)]),o(") "),hx])]),cx,e("p",null,[o("See "),e("a",dx,[o("https://github.com/n1trux/awesome-sysadmin#vpn"),r(t)])]),_x,e("p",null,[o("See "),e("a",ux,[o("https://github.com/n1trux/awesome-sysadmin#web"),r(t)])]),px,e("p",null,[o("See also "),fx,o(", "),e("a",gx,[o("Wikimatrix"),r(t)]),o(", "),e("a",bx,[o("Wiki Engines on WikiIndex"),r(t)]),o(", "),e("a",mx,[o("List of wiki software on wikipedia"),r(t)]),o(", "),e("a",kx,[o("Comparison of wiki software on wikipedia"),r(t)]),o(".")]),e("ul",null,[e("li",null,[e("a",wx,[o("Blazekiss"),r(t)]),o(" - BlazeKiss is a KISS-based wiki (Keep It Simple, Stupid) - simplicity and functionality comes before all. ("),e("a",Px,[o("Source Code"),r(t)]),o(")"),yx,o(),Sx]),e("li",null,[e("a",vx,[o("BookStack"),r(t)]),o(" - BookStack is a simple, self-hosted, easy-to-use platform for organizing and storing information. It allows for documentation to be stored in a book like fashion. ("),e("a",Cx,[o("Demo"),r(t)]),o(", "),e("a",Ax,[o("Source Code"),r(t)]),o(") "),Lx,o(),Mx]),e("li",null,[e("a",Gx,[o("commonplace"),r(t)]),o(" - A server for your markdown files. Give it a directory, and Commonplace gives you a url, pretty pages, and quick editing. "),xx]),e("li",null,[e("a",Tx,[o("Dokuwiki"),r(t)]),o(" - An easy to use, lightweight, standards-compliant wiki engine with a simple syntax allowing reading the data outside the wiki. All data is stored in plain files, therefore no database is required. "),Ix,o(),Ex]),e("li",null,[e("a",Dx,[o("Gitit"),r(t)]),o(" - A wiki program that stores pages and uploaded files in a git repository, which can then be modified using the VCS command line tools or the wiki's web interface. ("),e("a",Bx,[o("Demo"),r(t)]),o(") "),Hx,o(),jx]),e("li",null,[e("a",Rx,[o("Gollum"),r(t)]),o(" - A simple, Git-powered wiki with a sweet API and local frontend. "),Ox,o(),Fx]),e("li",null,[e("a",Nx,[o("Gruik"),r(t)]),o(" - An open-source markdown note-taking web app. ("),e("a",zx,[o("Source Code"),r(t)]),o(") "),Wx,o(),Jx]),e("li",null,[e("a",Ux,[o("jingo"),r(t)]),o(" - A git based wiki engine written for node.js, with a decent design, a search capability and a good typography. ("),e("a",Vx,[o("Demo"),r(t)]),o(", "),e("a",qx,[o("Source Code"),r(t)]),o(") "),Kx,o(),Xx]),e("li",null,[e("a",Yx,[o("Mediawiki"),r(t)]),o(" - MediaWiki is a free and open-source wiki software package written in PHP. It serves as the platform for Wikipedia and the other Wikimedia projects, used by hundreds of millions of people each month. ("),e("a",Zx,[o("Source Code"),r(t)]),o(") "),Qx,o(),$x]),e("li",null,[e("a",eT,[o("MoinMoin"),r(t)]),o(" - An advanced, easy to use and extensible WikiEngine with a large community of users. ([Source code] ("),e("a",oT,[o("http://hg.moinmo.in/moin"),r(t)]),o(")) "),rT,o(),tT]),e("li",null,[e("a",nT,[o("Olelo"),r(t)]),o(" - Olelo is a wiki that stores pages in a Git repository, supports many markup styles and has an extensible, hackable architecture. ("),e("a",sT,[o("Demo"),r(t)]),o(") "),lT,o(),aT]),e("li",null,[e("a",iT,[o("Pepperminty Wiki"),r(t)]),o(" - A complete markdown-powered wiki contained in a single PHP file. ("),e("a",hT,[o("Demo"),r(t)]),o(") "),cT,o(),dT]),e("li",null,[e("a",_T,[o("PmWiki"),r(t)]),o(" - Wiki-based system for collaborative creation and maintenance of websites. "),uT,o(),pT]),e("li",null,[e("a",fT,[o("Raneto"),r(t)]),o(" - Raneto is an open source Knowledgebase platform that uses static Markdown files to power your Knowledgebase - "),gT,o(),bT]),e("li",null,[e("a",mT,[o("Realms"),r(t)]),o(" - A git-backed wiki inspired by Gollum. ("),e("a",kT,[o("Source Code"),r(t)]),o(") "),wT,o(),PT]),e("li",null,[e("a",yT,[o("Redaxscript"),r(t)]),o(" - Ultra lightweight website engine. ("),e("a",ST,[o("Source Code"),r(t)]),o(")"),vT,o(),CT]),e("li",null,[e("a",AT,[o("TiddlyWiki"),r(t)]),o(" - A reusable non-linear personal web notebook. ("),e("a",LT,[o("Source Code"),r(t)]),o(") "),MT,o(),GT]),e("li",null,[e("a",xT,[o("Tiki"),r(t)]),o(" - Wiki CMS Groupware with the most built-in features. ("),e("a",TT,[o("Demo"),r(t)]),o(", "),e("a",IT,[o("Source Code"),r(t)]),o(") "),ET,o(),DT]),e("li",null,[e("a",BT,[o("Wikifeat"),r(t)]),o(" - Wikifeat is an open source collaboration platform built around the ever-popular Wiki concept. ("),e("a",HT,[o("Source Code"),r(t)]),o(") "),jT,o(),RT]),e("li",null,[e("a",OT,[o("WiKiss"),r(t)]),o(" - A Wiki, simple to use and install. ("),e("a",FT,[o("Source Code"),r(t)]),o(") "),NT,o(),zT]),e("li",null,[e("a",WT,[o("Wikitten"),r(t)]),o(" - Wikitten is a small, fast, PHP wiki, and the perfect place to store your notes, code snippets, ideas, and so on. ("),e("a",JT,[o("Source Code"),r(t)]),o(") "),UT,o(),VT])]),qT,e("ul",null,[e("li",null,[e("a",KT,[o("arkOS"),r(t)]),o(" - Install arkOS to a dedicated device and host your own websites, email, files and more. ("),e("a",XT,[o("Source Code"),r(t)]),o(),e("a",YT,[o("[1]"),r(t)]),o(") "),ZT,o(),QT]),e("li",null,[e("a",$T,[o("Cloudron"),r(t)]),o(" - Effortlessly self-host web apps on your server. ("),e("a",eI,[o("Source Code"),r(t)]),o(") "),oI,o(),rI]),e("li",null,[e("a",tI,[o("DPlatform"),r(t)]),o(" - Deploy self-hosted apps easily: simple, bloat-free, independent installation. ("),e("a",nI,[o("Source code"),r(t)]),o(") "),sI,o(),lI]),e("li",null,[e("a",aI,[o("FreedomBone"),r(t)]),o(" - Home server configuration based on Debian. "),iI,o(),hI]),e("li",null,[e("a",cI,[o("FreedomBox"),r(t)]),o(" - A community project to develop, design and promote personal servers running free software for private, personal, communications. "),dI,o(),_I]),e("li",null,[e("a",uI,[o("Piratebox"),r(t)]),o(" - A DIY anonymous offline file-sharing and communications system built with free software and inexpensive off-the-shelf hardware. ("),e("a",pI,[o("Source Code"),r(t)]),o("). "),fI,o(),gI]),e("li",null,[e("a",bI,[o("Puffin"),r(t)]),o(" - Lightweight webapp catalog based on containers, with user interface à la mobile app store. ("),e("a",mI,[o("Demo"),r(t)]),o(", "),e("a",kI,[o("Source Code"),r(t)]),o(") "),wI,o(),PI]),e("li",null,[e("a",yI,[o("Sandstorm"),r(t)]),o(" - Personal server for running self-hosted apps easily and securely. ("),e("a",SI,[o("Demo"),r(t)]),o(", "),e("a",vI,[o("Source Code"),r(t)]),o(") "),CI,o(),AI]),e("li",null,[e("a",LI,[o("sovereign"),r(t)]),o(" - A set of Ansible playbooks to build and maintain your own private cloud: email, calendar, contacts, file sync, IRC bouncer, VPN, and more. "),MI,o(),GI]),e("li",null,[e("a",xI,[o("UBOS"),r(t)]),o(" - Linux distro that runs on indie boxes (personal servers and IoT devices). Single-command installation and management of apps - Jenkins, Mediawiki, Owncloud, WordPress, etc., - and other "),e("a",TI,[o("features"),r(t)]),o("."),II,o(),EI]),e("li",null,[e("a",DI,[o("WikiSuite"),r(t)]),o(" - The most comprehensive and integrated Free / Libre / Open Source software suite ever developed. ("),e("a",BI,[o("Source Code"),r(t)]),o(") "),HI,o(),jI]),e("li",null,[e("a",RI,[o("yunohost"),r(t)]),o(" - A server operating system aiming to make self-hosting accessible to everyone. ("),e("a",OI,[o("Source Code"),r(t)]),o(") "),FI,o(),NI])]),i(" END SOFTWARE LIST "),zI,WI,e("ul",null,[JI,e("li",null,[UI,o(" - "),e("a",VI,[o("Attribution Assurance License"),r(t)])]),e("li",null,[qI,o(" - "),e("a",KI,[o("GNU Affero General Public License 3.0"),r(t)])]),e("li",null,[XI,o(" - "),e("a",YI,[o("Apache, Version 2.0"),r(t)])]),e("li",null,[ZI,o(" - "),e("a",QI,[o("Artistic License Version 2.0"),r(t)])]),e("li",null,[$I,o(" - "),e("a",eE,[o("FreeBSD License"),r(t)])]),e("li",null,[oE,o(" - "),e("a",rE,[o("Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported"),r(t)])]),e("li",null,[tE,o(" - "),e("a",nE,[o("Creative Commons Attribution-NonCommercial 4.0 International"),r(t)])]),e("li",null,[sE,o(" - "),e("a",lE,[o("Public Domain"),r(t)])]),e("li",null,[aE,o(" - "),e("a",iE,[o("CEA CNRS INRIA Logiciel Libre"),r(t)])]),e("li",null,[hE,o(" - "),e("a",cE,[o("Common Public Attribution License Version 1.0"),r(t)])]),e("li",null,[dE,o(" - "),e("a",_E,[o("Educational Community License, Version 2.0 "),r(t)])]),e("li",null,[uE,o(" - "),e("a",pE,[o("Eclipse Public License, Version 1.0"),r(t)])]),e("li",null,[fE,o(" - "),e("a",gE,[o("GNU General Public License"),r(t)])]),e("li",null,[bE,o(" - "),e("a",mE,[o("GNU General Public License 2.0"),r(t)])]),e("li",null,[kE,o(" - "),e("a",wE,[o("GNU General Public License 3.0"),r(t)])]),e("li",null,[PE,o(" - "),e("a",yE,[o("IBM Public License"),r(t)])]),e("li",null,[SE,o(" - "),e("a",vE,[o("Internet Software Consortium License"),r(t)])]),e("li",null,[CE,o(" - "),e("a",AE,[o("Lesser General Public License 2.1"),r(t)])]),e("li",null,[LE,o(" - "),e("a",ME,[o("Lesser General Public License 3.0"),r(t)])]),e("li",null,[GE,o(" - "),e("a",xE,[o("MIT License"),r(t)])]),e("li",null,[TE,o(" - "),e("a",IE,[o("Mozilla Public License"),r(t)])]),e("li",null,[EE,o(" - "),e("a",DE,[o("Open Software License 3.0"),r(t)])]),e("li",null,[BE,o(" - "),e("a",HE,[o("Sendmail License"),r(t)])]),e("li",null,[jE,o(" - "),e("a",RE,[o("Zlib/libpng License"),r(t)])]),e("li",null,[OE,o(" - "),e("a",FE,[o("Zope Public License 2.0"),r(t)])])]),NE,zE,e("ul",null,[e("li",null,[e("a",WE,[o("Awesome Selfhosted Chat"),r(t)]),o(" - A rocket.chat instance setup for the awesome selfhosted community.")]),e("li",null,[e("a",JE,[o("Awesome Big Data"),r(t)]),o(" - A curated list of awesome big data frameworks, resources and other awesomeness.")]),e("li",null,[e("a",UE,[o("Awesome Sysadmin"),r(t)]),o(" - A curated list of amazingly awesome open source sysadmin resources.")]),e("li",null,[e("a",VE,[o("PRISM Break"),r(t)]),o(", "),e("a",qE,[o("privacytools.io"),r(t)]),o(", "),e("a",KE,[o("Alternative Internet"),r(t)]),o(" - Lists of software aimed at privacy and decentralization (in some form).")]),e("li",null,[o("Dynamic Domain Name services: "),e("a",XE,[o("Afraid.org"),r(t)]),o(", "),e("a",YE,[o("Pagekite"),r(t)])]),e("li",null,[o("Communities/forums: "),e("a",ZE,[o("/r/selfhosted"),r(t)]),o(", "),e("a",QE,[o("Auto-Hébergement (FR)"),r(t)])])]),$E,eD,e("p",null,[o("Contributing guidelines can be found "),r(s,{to:"/_posts/.github/CONTRIBUTING.html"},{default:a(()=>[o("here")]),_:1}),o(".")]),oD])}const aD=h(_,[["render",rD],["__file","2023-12-13-awesome-selfhosted-cn.html.vue"]]);export{aD as default}; diff --git a/assets/2_obs_streamfx.html-3ff34bfd.js b/assets/2_obs_streamfx.html-39fea147.js similarity index 98% rename from assets/2_obs_streamfx.html-3ff34bfd.js rename to assets/2_obs_streamfx.html-39fea147.js index c6b7b713..18deef85 100644 --- a/assets/2_obs_streamfx.html-3ff34bfd.js +++ b/assets/2_obs_streamfx.html-39fea147.js @@ -1 +1 @@ -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o,c as l,a as i,b as t,d as a,e as p}from"./app-98132e77.js";const g={},s=i("p",null,"StreamFX 提供了来源镜像、模糊滤镜、着色器滤镜等多种效果,是 OBS 必装的效果插件。本文将介绍 StreamFX 的 28 种滤镜效果。",-1),c=i("h2",{id:"安装-streamfx",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#安装-streamfx","aria-hidden":"true"},"#"),t(" 安装 StreamFX")],-1),d={href:"https://github.com/Xaymar/obs-StreamFX/releases",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Uninstallation",target:"_blank",rel:"noopener noreferrer"},f=i("p",null,"安装成功后,StreamFX 会出现在 OBS 上方的菜单栏上。下文中,我将使用不同滤镜处理样图,并提供对比图。",-1),u=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-07-23-27-34.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"样例原图")],-1),m=i("h2",{id:"来源镜像",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#来源镜像","aria-hidden":"true"},"#"),t(" 来源镜像")],-1),_={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Source-Mirror",target:"_blank",rel:"noopener noreferrer"},b=i("h2",{id:"_3d-转换",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#_3d-转换","aria-hidden":"true"},"#"),t(" 3D 转换")],-1),x={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-3D-Transform",target:"_blank",rel:"noopener noreferrer"},F=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-07-23-27-01.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"3D 转换")],-1),y=i("h2",{id:"模糊",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#模糊","aria-hidden":"true"},"#"),t(" 模糊")],-1),v={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Blur",target:"_blank",rel:"noopener noreferrer"},z=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-08-06-49-05.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"右侧为模糊效果")],-1),S=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-06-02-51-10.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"模糊滤镜设置")],-1),k=i("h2",{id:"动态蒙版",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#动态蒙版","aria-hidden":"true"},"#"),t(" 动态蒙版")],-1),X={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Dynamic-Mask",target:"_blank",rel:"noopener noreferrer"},D=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-08-07-05-42.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"动态蒙版")],-1),w=i("h2",{id:"sdf-特效",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#sdf-特效","aria-hidden":"true"},"#"),t(" SDF 特效")],-1),B={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-SDF-Effects",target:"_blank",rel:"noopener noreferrer"},I={href:"https://jishuin.proginn.com/p/763bfbd5a086",target:"_blank",rel:"noopener noreferrer"},V={href:"https://github.com/Xaymar/obs-StreamFX/issues/512",target:"_blank",rel:"noopener noreferrer"},N=p('
        SDF 特效-外发光+变形

        着色器

        着色器滤镜位于 %ProgramFiles%/obs-studio/data/obs-plugins/StreamFX/examples/shaders/filter,后缀均为 .effect。切换着色器文件后,需点击「刷新选项和参数」。

        色彩滤镜

        • colorize:对画面重新着色,效果与色彩校正滤镜相似。

          colorize
        • posterize:向上下周围放入像素值。

          posterize
        • smaa:将画面的轮廓线条化。

          smaa

        位移变换

        • bulge_pinch:挤压滤镜,使图像的中心产生凸起或凹下的效果,可生成循环凸凹的动画。


        • displace:置换滤镜,可以产生弯曲,碎裂的图像效果。置换滤镜比较特殊的是设置完毕后,还需要选择一个图像文件作为位移图,滤镜根据位移图上的颜色值移动图像像素。

          displace
        • drunk:画面随机晃动

          drunk
        • swirl:漩涡打旋效果,可调整旋涡位置和大小,并可呈现漩涡的正反转动态效果。

          swirl
        • wave:波浪滤镜是通过坐标变换来模拟水波效果,使图像呈现出水波的扭曲特效。

          wave
        • zigzag:使图像产生同心圆状的波纹效果。

          zigzag

        画面遮盖

        • pixelation:像素化滤镜,可选择滤镜范围。

          pixelation
        • hexagonize:用六角形状元素重构画面,可调节蜂窝元素的大小。

          hexagonize
        • semiline:百叶窗栅格形滤镜,让画面像被一个关闭中的百叶窗遮盖。

          semiline
        • blur-gaussian:模糊滤镜效果(高斯),对硬件配置要求高。

        增强滤镜

        • vignette:晕影/虚光照,用以增强镜头感,突出拍摄主体,营造画面的意境氛围。

          vignette
        • rounded-rect:圆角矩形渲染

          rounded-rect
        • crt-curvature:将画面放置于 CRT 电视中,可调整画面曲率和四周的光晕颜色。

          crt-curvature
        • crt-scanlines:仿 CRT 扫描线效果。

          crt-scanlines
        • repeat:将画面复制排列,例图是 3x3 复制画面。

          repeat
        • fxaa:快速近似抗锯齿,是一种「比较廉价」的抗锯齿技术,多用于游戏直播/录制,适用于性能不高的电脑配置。

        N 卡滤镜

        ',12),A={href:"https://www.nvidia.com/en-us/geforce/broadcasting/broadcast-sdk/resources/",target:"_blank",rel:"noopener noreferrer"},E={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Upscaling",target:"_blank",rel:"noopener noreferrer"},M={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Denoising",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Auto-Framing",target:"_blank",rel:"noopener noreferrer"},R={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Virtual-Greenscreen",target:"_blank",rel:"noopener noreferrer"},T=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-07-23-19-50.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"人像背景移除")],-1);function L(C,O){const e=n("ExternalLinkIcon");return o(),l("div",null,[s,c,i("p",null,[t("在 "),i("a",d,[t("StreamFX 发布页"),a(e)]),t("上按平台选择安装包。StreamFX for OBS 29 处于测试阶段,在升级此插件前,请按照"),i("a",h,[t("卸载教程"),a(e)]),t("执行旧版清理。")]),f,u,m,i("p",null,[i("a",_,[t("来源镜像"),a(e)]),t("(Source Mirror)是一种来源,而不是滤镜。它可以克隆任何源或场景,并将其应用于当前场景。对来源镜像叠加滤镜和任意效果,都不会对原始来源造成影响。")]),b,i("p",null,[i("a",x,[t("3D 转换"),a(e)]),t("(3D Transform)可以将 2D 图片的坐标系转换为三维,从而可以自由旋转、移动和缩放,形成类似星球大战中的字幕特效。")]),F,y,i("p",null,[i("a",v,[t("模糊"),a(e)]),t("(Blur Filter)提供五种模糊类型:Box、Box Linear、Gaussian、Gaussian Liner 和 Dual-Filtering。一般来说,建议将类型设置为「Dual Filtering(双重过滤)」,大小为 4,应用蒙版后可以选择模糊区域。与 Gaussian 类型相比,Dual Filtering 生成模糊效果最快,对配置要求也更低。")]),z,S,k,i("p",null,[i("a",X,[t("动态蒙版"),a(e)]),t("(Dynamic Mask)允许叠加任意来源或场景,并使用红色、绿色、蓝色和 alpha 通道建立画面蒙版。下图展示了使用红色通道叠加雨滴来源的效果。")]),D,w,i("p",null,[i("a",B,[t("SDF 特效"),a(e)]),t("(Shader Signed Distance Field Effects)仅对拥有透明图层的画面有效,比如被移除背景后的摄像头画面。SDF 特效会对外观轮廓进行发光处理,并占用大量显存性能。!["),i("a",I,[t("什么是 SDF?"),a(e)]),t("] !["),i("a",V,[t('"SDF Effects" filter is undocumented'),a(e)]),t("]")]),N,i("p",null,[t("本部分的滤镜需要需 NVIDIA 2060 及以上显卡,并安装 "),i("a",A,[t("NVIDIA Video Effects & AR SDK Redistributable"),a(e)]),t("。这些滤镜效果均可用 NVIDIA Broadcast 实现。")]),i("ul",null,[i("li",null,[i("p",null,[i("a",E,[t("画质提升"),a(e)]),t("(Upscaling):提升画质分辨率,可以将老式摄像头提升到 4K 画质。")])]),i("li",null,[i("p",null,[i("a",M,[t("降噪"),a(e)]),t("(Denoising Filter):对画面进行降噪。")])]),i("li",null,[i("p",null,[i("a",G,[t("自动帧"),a(e)]),t("(Auto-Framing):通过 NVIDIA AR 的自动追踪人脸技术,自动裁剪和放大用户、并且在用户移动时保持帧居中。")])]),i("li",null,[i("p",null,[i("a",R,[t("英伟达背景移除"),a(e)]),t("(Virtual Greenscreen):无需绿幕也能帮你移除人像背景,移除效果略逊色于 NVIDIA Broadcast。样图是用的是漫画,如果是真人画面,移除效果会好很多。")]),T])])])}const j=r(g,[["render",L],["__file","2_obs_streamfx.html.vue"]]);export{j as default}; +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o,c as l,a as i,b as t,d as a,e as p}from"./app-91ee3df5.js";const g={},s=i("p",null,"StreamFX 提供了来源镜像、模糊滤镜、着色器滤镜等多种效果,是 OBS 必装的效果插件。本文将介绍 StreamFX 的 28 种滤镜效果。",-1),c=i("h2",{id:"安装-streamfx",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#安装-streamfx","aria-hidden":"true"},"#"),t(" 安装 StreamFX")],-1),d={href:"https://github.com/Xaymar/obs-StreamFX/releases",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Uninstallation",target:"_blank",rel:"noopener noreferrer"},f=i("p",null,"安装成功后,StreamFX 会出现在 OBS 上方的菜单栏上。下文中,我将使用不同滤镜处理样图,并提供对比图。",-1),u=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-07-23-27-34.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"样例原图")],-1),m=i("h2",{id:"来源镜像",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#来源镜像","aria-hidden":"true"},"#"),t(" 来源镜像")],-1),_={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Source-Mirror",target:"_blank",rel:"noopener noreferrer"},b=i("h2",{id:"_3d-转换",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#_3d-转换","aria-hidden":"true"},"#"),t(" 3D 转换")],-1),x={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-3D-Transform",target:"_blank",rel:"noopener noreferrer"},F=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-07-23-27-01.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"3D 转换")],-1),y=i("h2",{id:"模糊",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#模糊","aria-hidden":"true"},"#"),t(" 模糊")],-1),v={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Blur",target:"_blank",rel:"noopener noreferrer"},z=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-08-06-49-05.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"右侧为模糊效果")],-1),S=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-06-02-51-10.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"模糊滤镜设置")],-1),k=i("h2",{id:"动态蒙版",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#动态蒙版","aria-hidden":"true"},"#"),t(" 动态蒙版")],-1),X={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Dynamic-Mask",target:"_blank",rel:"noopener noreferrer"},D=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-08-07-05-42.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"动态蒙版")],-1),w=i("h2",{id:"sdf-特效",tabindex:"-1"},[i("a",{class:"header-anchor",href:"#sdf-特效","aria-hidden":"true"},"#"),t(" SDF 特效")],-1),B={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-SDF-Effects",target:"_blank",rel:"noopener noreferrer"},I={href:"https://jishuin.proginn.com/p/763bfbd5a086",target:"_blank",rel:"noopener noreferrer"},V={href:"https://github.com/Xaymar/obs-StreamFX/issues/512",target:"_blank",rel:"noopener noreferrer"},N=p('
        SDF 特效-外发光+变形

        着色器

        着色器滤镜位于 %ProgramFiles%/obs-studio/data/obs-plugins/StreamFX/examples/shaders/filter,后缀均为 .effect。切换着色器文件后,需点击「刷新选项和参数」。

        色彩滤镜

        • colorize:对画面重新着色,效果与色彩校正滤镜相似。

          colorize
        • posterize:向上下周围放入像素值。

          posterize
        • smaa:将画面的轮廓线条化。

          smaa

        位移变换

        • bulge_pinch:挤压滤镜,使图像的中心产生凸起或凹下的效果,可生成循环凸凹的动画。


        • displace:置换滤镜,可以产生弯曲,碎裂的图像效果。置换滤镜比较特殊的是设置完毕后,还需要选择一个图像文件作为位移图,滤镜根据位移图上的颜色值移动图像像素。

          displace
        • drunk:画面随机晃动

          drunk
        • swirl:漩涡打旋效果,可调整旋涡位置和大小,并可呈现漩涡的正反转动态效果。

          swirl
        • wave:波浪滤镜是通过坐标变换来模拟水波效果,使图像呈现出水波的扭曲特效。

          wave
        • zigzag:使图像产生同心圆状的波纹效果。

          zigzag

        画面遮盖

        • pixelation:像素化滤镜,可选择滤镜范围。

          pixelation
        • hexagonize:用六角形状元素重构画面,可调节蜂窝元素的大小。

          hexagonize
        • semiline:百叶窗栅格形滤镜,让画面像被一个关闭中的百叶窗遮盖。

          semiline
        • blur-gaussian:模糊滤镜效果(高斯),对硬件配置要求高。

        增强滤镜

        • vignette:晕影/虚光照,用以增强镜头感,突出拍摄主体,营造画面的意境氛围。

          vignette
        • rounded-rect:圆角矩形渲染

          rounded-rect
        • crt-curvature:将画面放置于 CRT 电视中,可调整画面曲率和四周的光晕颜色。

          crt-curvature
        • crt-scanlines:仿 CRT 扫描线效果。

          crt-scanlines
        • repeat:将画面复制排列,例图是 3x3 复制画面。

          repeat
        • fxaa:快速近似抗锯齿,是一种「比较廉价」的抗锯齿技术,多用于游戏直播/录制,适用于性能不高的电脑配置。

        N 卡滤镜

        ',12),A={href:"https://www.nvidia.com/en-us/geforce/broadcasting/broadcast-sdk/resources/",target:"_blank",rel:"noopener noreferrer"},E={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Upscaling",target:"_blank",rel:"noopener noreferrer"},M={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Denoising",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Auto-Framing",target:"_blank",rel:"noopener noreferrer"},R={href:"https://github.com/Xaymar/obs-StreamFX/wiki/Filter-Virtual-Greenscreen",target:"_blank",rel:"noopener noreferrer"},T=i("figure",null,[i("img",{src:"https://img.gpt-vip.top/2023-01-07-23-19-50.png",alt:"",tabindex:"0",loading:"lazy"}),i("figcaption",null,"人像背景移除")],-1);function L(C,O){const e=n("ExternalLinkIcon");return o(),l("div",null,[s,c,i("p",null,[t("在 "),i("a",d,[t("StreamFX 发布页"),a(e)]),t("上按平台选择安装包。StreamFX for OBS 29 处于测试阶段,在升级此插件前,请按照"),i("a",h,[t("卸载教程"),a(e)]),t("执行旧版清理。")]),f,u,m,i("p",null,[i("a",_,[t("来源镜像"),a(e)]),t("(Source Mirror)是一种来源,而不是滤镜。它可以克隆任何源或场景,并将其应用于当前场景。对来源镜像叠加滤镜和任意效果,都不会对原始来源造成影响。")]),b,i("p",null,[i("a",x,[t("3D 转换"),a(e)]),t("(3D Transform)可以将 2D 图片的坐标系转换为三维,从而可以自由旋转、移动和缩放,形成类似星球大战中的字幕特效。")]),F,y,i("p",null,[i("a",v,[t("模糊"),a(e)]),t("(Blur Filter)提供五种模糊类型:Box、Box Linear、Gaussian、Gaussian Liner 和 Dual-Filtering。一般来说,建议将类型设置为「Dual Filtering(双重过滤)」,大小为 4,应用蒙版后可以选择模糊区域。与 Gaussian 类型相比,Dual Filtering 生成模糊效果最快,对配置要求也更低。")]),z,S,k,i("p",null,[i("a",X,[t("动态蒙版"),a(e)]),t("(Dynamic Mask)允许叠加任意来源或场景,并使用红色、绿色、蓝色和 alpha 通道建立画面蒙版。下图展示了使用红色通道叠加雨滴来源的效果。")]),D,w,i("p",null,[i("a",B,[t("SDF 特效"),a(e)]),t("(Shader Signed Distance Field Effects)仅对拥有透明图层的画面有效,比如被移除背景后的摄像头画面。SDF 特效会对外观轮廓进行发光处理,并占用大量显存性能。!["),i("a",I,[t("什么是 SDF?"),a(e)]),t("] !["),i("a",V,[t('"SDF Effects" filter is undocumented'),a(e)]),t("]")]),N,i("p",null,[t("本部分的滤镜需要需 NVIDIA 2060 及以上显卡,并安装 "),i("a",A,[t("NVIDIA Video Effects & AR SDK Redistributable"),a(e)]),t("。这些滤镜效果均可用 NVIDIA Broadcast 实现。")]),i("ul",null,[i("li",null,[i("p",null,[i("a",E,[t("画质提升"),a(e)]),t("(Upscaling):提升画质分辨率,可以将老式摄像头提升到 4K 画质。")])]),i("li",null,[i("p",null,[i("a",M,[t("降噪"),a(e)]),t("(Denoising Filter):对画面进行降噪。")])]),i("li",null,[i("p",null,[i("a",G,[t("自动帧"),a(e)]),t("(Auto-Framing):通过 NVIDIA AR 的自动追踪人脸技术,自动裁剪和放大用户、并且在用户移动时保持帧居中。")])]),i("li",null,[i("p",null,[i("a",R,[t("英伟达背景移除"),a(e)]),t("(Virtual Greenscreen):无需绿幕也能帮你移除人像背景,移除效果略逊色于 NVIDIA Broadcast。样图是用的是漫画,如果是真人画面,移除效果会好很多。")]),T])])])}const j=r(g,[["render",L],["__file","2_obs_streamfx.html.vue"]]);export{j as default}; diff --git a/assets/3_obs_plugins.html-84a9a411.js b/assets/3_obs_plugins.html-aa0d2bbd.js similarity index 98% rename from assets/3_obs_plugins.html-84a9a411.js rename to assets/3_obs_plugins.html-aa0d2bbd.js index b3d30bc8..25eff116 100644 --- a/assets/3_obs_plugins.html-84a9a411.js +++ b/assets/3_obs_plugins.html-aa0d2bbd.js @@ -1 +1 @@ -import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as a,c,a as e,b as r,d as t,e as i}from"./app-98132e77.js";const l={},h=i('

        OBS 与其他直播/录制应用最大的区别在于 OBS 社区,它给 OBS 带来了强大的扩展性。下文中我会介绍除 StreamFX 外的 15 款流行插件。(本文未完成,待填充)

        插件安装与卸载

        OBS 插件的安装模式有 Install(注册配置)和 Protable(便携)两种。便携模式的插件配置可以复制到其他电脑上使用。

        若要卸载 Windows 下的 OBS 便携模式插件,可以进入 %ProgramFiles%\\obs-studio\\data\\obs-plugins%ProgramFiles%\\obs-studio\\obs-plugins\\64bit,搜索插件名,然后删除相关文件。

        多平台直播:multi-rtmp

        ',5),d={href:"https://github.com/sorayuki/obs-multi-rtmp",target:"_blank",rel:"noopener noreferrer"},u=e("p",null,"开启多地址推流前,你需要点击控制按钮「开始直播」,然后再点「停止直播」。",-1),p=e("h2",{id:"自动切换场景",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#自动切换场景","aria-hidden":"true"},"#"),r(" 自动切换场景")],-1),_={href:"https://obsproject.com/forum/resources/advanced-scene-switcher.395/",target:"_blank",rel:"noopener noreferrer"},f=e("h2",{id:"move-transition",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#move-transition","aria-hidden":"true"},"#"),r(" Move transition")],-1),b={href:"https://obsproject.com/forum/resources/move-transition.913/",target:"_blank",rel:"noopener noreferrer"},m=e("h2",{id:"transition-table",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#transition-table","aria-hidden":"true"},"#"),r(" Transition Table")],-1),g={href:"https://obsproject.com/forum/resources/transition-table.1174/",target:"_blank",rel:"noopener noreferrer"},k=e("h2",{id:"source-dock",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#source-dock","aria-hidden":"true"},"#"),r(" Source Dock")],-1),S={href:"https://obsproject.com/forum/resources/source-dock.1317/",target:"_blank",rel:"noopener noreferrer"},j=e("h2",{id:"source-copy",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#source-copy","aria-hidden":"true"},"#"),r(" Source Copy")],-1),x={href:"https://obsproject.com/forum/resources/source-copy.1261/",target:"_blank",rel:"noopener noreferrer"},w=e("h2",{id:"其他",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#其他","aria-hidden":"true"},"#"),r(" 其他")],-1),v={href:"https://obsproject.com/forum/resources/scene-collection-manager.1434/",target:"_blank",rel:"noopener noreferrer"},B={href:"https://obsproject.com/forum/resources/audio-monitor.1186/",target:"_blank",rel:"noopener noreferrer"},y={href:"https://obsproject.com/forum/resources/downstream-keyer.1254/",target:"_blank",rel:"noopener noreferrer"},O={href:"https://github.com/norihiro/obs-multisource-effect",target:"_blank",rel:"noopener noreferrer"},D={href:"https://github.com/fzwoch/obs-teleport",target:"_blank",rel:"noopener noreferrer"},I={href:"https://github.com/univrsal/spectralizer",target:"_blank",rel:"noopener noreferrer"},N={href:"https://obsproject.com/forum/resources/obs-ndi-newtek-ndi%E2%84%A2-integration-into-obs-studio.528/",target:"_blank",rel:"noopener noreferrer"},T={href:"https://obsproject.com/forum/resources/scrab.845/",target:"_blank",rel:"noopener noreferrer"},C={href:"https://obsproject.com/forum/resources/lower-thirds-in-html-css.928/",target:"_blank",rel:"noopener noreferrer"},F={href:"https://obsproject.com/forum/resources/input-overlay.552/",target:"_blank",rel:"noopener noreferrer"},M=e("h2",{id:"美化插件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#美化插件","aria-hidden":"true"},"#"),r(" 美化插件")],-1),A={href:"https://yun.miebo.cn/",target:"_blank",rel:"noopener noreferrer"},E={href:"http://zbmate.com/",target:"_blank",rel:"noopener noreferrer"},V=e("h2",{id:"弃用插件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#弃用插件","aria-hidden":"true"},"#"),r(" 弃用插件")],-1),z=e("p",null,"以下插件已弃用,仅作记录:",-1),L={href:"https://obsproject.com/forum/resources/virtual-cam-filter.1142/",target:"_blank",rel:"noopener noreferrer"},P={href:"https://obsproject.com/forum/resources/obs-websocket-remote-control-obs-studio-from-websockets.466/",target:"_blank",rel:"noopener noreferrer"},X={href:"https://obsproject.com/forum/resources/animated-captions-with-obs-controller-and-a-preview-function.1407/",target:"_blank",rel:"noopener noreferrer"},H={href:"https://obsproject.com/forum/threads/shaderfilter-went-away.155555/#post-571174",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/Oncorporation/obs-shaderfilter/releases/",target:"_blank",rel:"noopener noreferrer"},K={href:"https://obsproject.com/forum/resources/asynchronous-source-duplication.1483/",target:"_blank",rel:"noopener noreferrer"},W=e("h2",{id:"更多",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#更多","aria-hidden":"true"},"#"),r(" 更多")],-1),q={href:"https://obsproject.com/forum/resources/categories/obs-studio-plugins.6/",target:"_blank",rel:"noopener noreferrer"};function J(Q,R){const o=s("ExternalLinkIcon");return a(),c("div",null,[h,e("p",null,[e("a",d,[r("multi-rtmp"),t(o)]),r(" 使得 OBS 支持多地址推流,以为着同时在多个平台上进行直播。")]),u,p,e("p",null,[e("a",_,[r("Advanced Scene Switcher"),t(o)]),r(":使用「宏」来自动完成各种任务,按条件切换场景、来源。比如,电脑闲置 10 分钟后,让摄像头来源变为不可见。")]),f,e("p",null,[e("a",b,[r("Move transition"),t(o)]),r(":记录来源的位置变化,生成元素移动的动画效果。比如,视频演讲时,将摄像头位置从屏幕右下移动到中央。")]),m,e("p",null,[e("a",g,[r("Transition Table"),t(o)]),r(":场景切换效果,设定不同场景间的切换规则。")]),k,e("p",null,[e("a",S,[r("Source Dock"),t(o)]),r(":为单独场景或来源建立控制栏,使用小窗口预览场景。")]),j,e("p",null,[e("a",x,[r("Source Copy"),t(o)]),r(":更方便地复制、保存场景设置。")]),w,e("ul",null,[e("li",null,[e("a",v,[r("Scene Collection Manager"),t(o)]),r(":自动备份场景,防止误操作。")]),e("li",null,[e("a",B,[r("Audio Monitor"),t(o)]),r(":将来源声音输出给指定设备播放,方便单独调节音量,能让主播与观众听到不同的音频效果。")]),e("li",null,[e("a",y,[r("Downstream Keyer"),t(o)]),r(":切换场景时,置顶指定场景。")]),e("li",null,[e("a",O,[r("Multi Source Effect"),t(o)]),r(":滤镜效果")]),e("li",null,[e("a",D,[r("Teleport"),t(o)]),r(":NDI 替代品,局域网设备推流到直播。")]),e("li",null,[e("a",I,[r("spectralizer"),t(o)]),r(":音频频谱,用滤镜「图像掩码」的「混合图层」给频谱遮罩滤镜。")]),e("li",null,[e("a",N,[r("NDI"),t(o)]),r(": 局域网视频无线传输技术 NDI 插件。")]),e("li",null,[e("a",T,[r("scrab"),t(o)]),r(":屏幕截图。添加了一个可配置的热键快速选择一个屏幕区域,并添加它作为一个图像源到当前场景。有人反馈 OBS 28 后有 bug,暂未修复。")]),e("li",null,[e("a",C,[r("Lower thirds in HTML/CSS"),t(o)]),r(":文字运动特效,适合展示 logo 和标题。")]),e("li",null,[e("a",F,[r("Input Overlay"),t(o)]),r(":同步显示键盘、鼠标和游戏板上的输入。")])]),M,e("p",null,[r("第三方的直播美化插件提供了时钟、榜单、弹幕、游戏等互动来源,用于美化直播间,新手可参考使用。美化插件免费版一般足够用了,比如 "),e("a",A,[r("咩播"),t(o)]),r("、"),e("a",E,[r("智播"),t(o)]),r("。")]),V,z,e("ul",null,[e("li",null,[e("a",L,[r("Virtual Cam Filter"),t(o)]),r(":能让来源单独输出虚拟摄像头,OBS 28 已内置此功能。")]),e("li",null,[e("a",P,[r("obs-websocket"),t(o)]),r(":远程控制插件,OBS 28 已内置此功能。")]),e("li",null,[e("a",X,[r("Animated captions"),t(o)]),r(":自定义弹幕功能,无漂浮弹幕,适用较少,仅用于 OBS 27。")]),e("li",null,[e("a",H,[r("OBS Shaderfilter"),t(o)]),r(":文字图片特效滤镜。此插件已被从社区删除,下载使用 "),e("a",G,[r("GitHub 备份"),t(o)]),r(",其功能已被 StreamFX 取代。")]),e("li",null,[e("a",K,[r("Asynchronous Source Duplication"),t(o)]),r(":复制来源可以同时展示在多个场景,复制源会有延迟。其功能已被 StreamFX 的来源镜像取代。")])]),W,e("p",null,[r("如果你在上文中没有找到你需要的功能功能,可以访问 "),e("a",q,[r("OBS 插件库"),t(o)]),r("进行搜索。")])])}const Z=n(l,[["render",J],["__file","3_obs_plugins.html.vue"]]);export{Z as default}; +import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as a,c,a as e,b as r,d as t,e as i}from"./app-91ee3df5.js";const l={},h=i('

        OBS 与其他直播/录制应用最大的区别在于 OBS 社区,它给 OBS 带来了强大的扩展性。下文中我会介绍除 StreamFX 外的 15 款流行插件。(本文未完成,待填充)

        插件安装与卸载

        OBS 插件的安装模式有 Install(注册配置)和 Protable(便携)两种。便携模式的插件配置可以复制到其他电脑上使用。

        若要卸载 Windows 下的 OBS 便携模式插件,可以进入 %ProgramFiles%\\obs-studio\\data\\obs-plugins%ProgramFiles%\\obs-studio\\obs-plugins\\64bit,搜索插件名,然后删除相关文件。

        多平台直播:multi-rtmp

        ',5),d={href:"https://github.com/sorayuki/obs-multi-rtmp",target:"_blank",rel:"noopener noreferrer"},u=e("p",null,"开启多地址推流前,你需要点击控制按钮「开始直播」,然后再点「停止直播」。",-1),p=e("h2",{id:"自动切换场景",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#自动切换场景","aria-hidden":"true"},"#"),r(" 自动切换场景")],-1),_={href:"https://obsproject.com/forum/resources/advanced-scene-switcher.395/",target:"_blank",rel:"noopener noreferrer"},f=e("h2",{id:"move-transition",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#move-transition","aria-hidden":"true"},"#"),r(" Move transition")],-1),b={href:"https://obsproject.com/forum/resources/move-transition.913/",target:"_blank",rel:"noopener noreferrer"},m=e("h2",{id:"transition-table",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#transition-table","aria-hidden":"true"},"#"),r(" Transition Table")],-1),g={href:"https://obsproject.com/forum/resources/transition-table.1174/",target:"_blank",rel:"noopener noreferrer"},k=e("h2",{id:"source-dock",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#source-dock","aria-hidden":"true"},"#"),r(" Source Dock")],-1),S={href:"https://obsproject.com/forum/resources/source-dock.1317/",target:"_blank",rel:"noopener noreferrer"},j=e("h2",{id:"source-copy",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#source-copy","aria-hidden":"true"},"#"),r(" Source Copy")],-1),x={href:"https://obsproject.com/forum/resources/source-copy.1261/",target:"_blank",rel:"noopener noreferrer"},w=e("h2",{id:"其他",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#其他","aria-hidden":"true"},"#"),r(" 其他")],-1),v={href:"https://obsproject.com/forum/resources/scene-collection-manager.1434/",target:"_blank",rel:"noopener noreferrer"},B={href:"https://obsproject.com/forum/resources/audio-monitor.1186/",target:"_blank",rel:"noopener noreferrer"},y={href:"https://obsproject.com/forum/resources/downstream-keyer.1254/",target:"_blank",rel:"noopener noreferrer"},O={href:"https://github.com/norihiro/obs-multisource-effect",target:"_blank",rel:"noopener noreferrer"},D={href:"https://github.com/fzwoch/obs-teleport",target:"_blank",rel:"noopener noreferrer"},I={href:"https://github.com/univrsal/spectralizer",target:"_blank",rel:"noopener noreferrer"},N={href:"https://obsproject.com/forum/resources/obs-ndi-newtek-ndi%E2%84%A2-integration-into-obs-studio.528/",target:"_blank",rel:"noopener noreferrer"},T={href:"https://obsproject.com/forum/resources/scrab.845/",target:"_blank",rel:"noopener noreferrer"},C={href:"https://obsproject.com/forum/resources/lower-thirds-in-html-css.928/",target:"_blank",rel:"noopener noreferrer"},F={href:"https://obsproject.com/forum/resources/input-overlay.552/",target:"_blank",rel:"noopener noreferrer"},M=e("h2",{id:"美化插件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#美化插件","aria-hidden":"true"},"#"),r(" 美化插件")],-1),A={href:"https://yun.miebo.cn/",target:"_blank",rel:"noopener noreferrer"},E={href:"http://zbmate.com/",target:"_blank",rel:"noopener noreferrer"},V=e("h2",{id:"弃用插件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#弃用插件","aria-hidden":"true"},"#"),r(" 弃用插件")],-1),z=e("p",null,"以下插件已弃用,仅作记录:",-1),L={href:"https://obsproject.com/forum/resources/virtual-cam-filter.1142/",target:"_blank",rel:"noopener noreferrer"},P={href:"https://obsproject.com/forum/resources/obs-websocket-remote-control-obs-studio-from-websockets.466/",target:"_blank",rel:"noopener noreferrer"},X={href:"https://obsproject.com/forum/resources/animated-captions-with-obs-controller-and-a-preview-function.1407/",target:"_blank",rel:"noopener noreferrer"},H={href:"https://obsproject.com/forum/threads/shaderfilter-went-away.155555/#post-571174",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/Oncorporation/obs-shaderfilter/releases/",target:"_blank",rel:"noopener noreferrer"},K={href:"https://obsproject.com/forum/resources/asynchronous-source-duplication.1483/",target:"_blank",rel:"noopener noreferrer"},W=e("h2",{id:"更多",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#更多","aria-hidden":"true"},"#"),r(" 更多")],-1),q={href:"https://obsproject.com/forum/resources/categories/obs-studio-plugins.6/",target:"_blank",rel:"noopener noreferrer"};function J(Q,R){const o=s("ExternalLinkIcon");return a(),c("div",null,[h,e("p",null,[e("a",d,[r("multi-rtmp"),t(o)]),r(" 使得 OBS 支持多地址推流,以为着同时在多个平台上进行直播。")]),u,p,e("p",null,[e("a",_,[r("Advanced Scene Switcher"),t(o)]),r(":使用「宏」来自动完成各种任务,按条件切换场景、来源。比如,电脑闲置 10 分钟后,让摄像头来源变为不可见。")]),f,e("p",null,[e("a",b,[r("Move transition"),t(o)]),r(":记录来源的位置变化,生成元素移动的动画效果。比如,视频演讲时,将摄像头位置从屏幕右下移动到中央。")]),m,e("p",null,[e("a",g,[r("Transition Table"),t(o)]),r(":场景切换效果,设定不同场景间的切换规则。")]),k,e("p",null,[e("a",S,[r("Source Dock"),t(o)]),r(":为单独场景或来源建立控制栏,使用小窗口预览场景。")]),j,e("p",null,[e("a",x,[r("Source Copy"),t(o)]),r(":更方便地复制、保存场景设置。")]),w,e("ul",null,[e("li",null,[e("a",v,[r("Scene Collection Manager"),t(o)]),r(":自动备份场景,防止误操作。")]),e("li",null,[e("a",B,[r("Audio Monitor"),t(o)]),r(":将来源声音输出给指定设备播放,方便单独调节音量,能让主播与观众听到不同的音频效果。")]),e("li",null,[e("a",y,[r("Downstream Keyer"),t(o)]),r(":切换场景时,置顶指定场景。")]),e("li",null,[e("a",O,[r("Multi Source Effect"),t(o)]),r(":滤镜效果")]),e("li",null,[e("a",D,[r("Teleport"),t(o)]),r(":NDI 替代品,局域网设备推流到直播。")]),e("li",null,[e("a",I,[r("spectralizer"),t(o)]),r(":音频频谱,用滤镜「图像掩码」的「混合图层」给频谱遮罩滤镜。")]),e("li",null,[e("a",N,[r("NDI"),t(o)]),r(": 局域网视频无线传输技术 NDI 插件。")]),e("li",null,[e("a",T,[r("scrab"),t(o)]),r(":屏幕截图。添加了一个可配置的热键快速选择一个屏幕区域,并添加它作为一个图像源到当前场景。有人反馈 OBS 28 后有 bug,暂未修复。")]),e("li",null,[e("a",C,[r("Lower thirds in HTML/CSS"),t(o)]),r(":文字运动特效,适合展示 logo 和标题。")]),e("li",null,[e("a",F,[r("Input Overlay"),t(o)]),r(":同步显示键盘、鼠标和游戏板上的输入。")])]),M,e("p",null,[r("第三方的直播美化插件提供了时钟、榜单、弹幕、游戏等互动来源,用于美化直播间,新手可参考使用。美化插件免费版一般足够用了,比如 "),e("a",A,[r("咩播"),t(o)]),r("、"),e("a",E,[r("智播"),t(o)]),r("。")]),V,z,e("ul",null,[e("li",null,[e("a",L,[r("Virtual Cam Filter"),t(o)]),r(":能让来源单独输出虚拟摄像头,OBS 28 已内置此功能。")]),e("li",null,[e("a",P,[r("obs-websocket"),t(o)]),r(":远程控制插件,OBS 28 已内置此功能。")]),e("li",null,[e("a",X,[r("Animated captions"),t(o)]),r(":自定义弹幕功能,无漂浮弹幕,适用较少,仅用于 OBS 27。")]),e("li",null,[e("a",H,[r("OBS Shaderfilter"),t(o)]),r(":文字图片特效滤镜。此插件已被从社区删除,下载使用 "),e("a",G,[r("GitHub 备份"),t(o)]),r(",其功能已被 StreamFX 取代。")]),e("li",null,[e("a",K,[r("Asynchronous Source Duplication"),t(o)]),r(":复制来源可以同时展示在多个场景,复制源会有延迟。其功能已被 StreamFX 的来源镜像取代。")])]),W,e("p",null,[r("如果你在上文中没有找到你需要的功能功能,可以访问 "),e("a",q,[r("OBS 插件库"),t(o)]),r("进行搜索。")])])}const Z=n(l,[["render",J],["__file","3_obs_plugins.html.vue"]]);export{Z as default}; diff --git a/assets/404.html-50472150.js b/assets/404.html-a6fbe89c.js similarity index 71% rename from assets/404.html-50472150.js rename to assets/404.html-a6fbe89c.js index 353672a9..4ce4abca 100644 --- a/assets/404.html-50472150.js +++ b/assets/404.html-a6fbe89c.js @@ -1 +1 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(_,n){return t(),c("div")}const f=e(o,[["render",r],["__file","404.html.vue"]]);export{f as default}; +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(_,n){return t(),c("div")}const f=e(o,[["render",r],["__file","404.html.vue"]]);export{f as default}; diff --git a/assets/4_live_effects.html-889d6027.js b/assets/4_live_effects.html-27b4b5d9.js similarity index 98% rename from assets/4_live_effects.html-889d6027.js rename to assets/4_live_effects.html-27b4b5d9.js index 2aea17ab..437c0b4b 100644 --- a/assets/4_live_effects.html-889d6027.js +++ b/assets/4_live_effects.html-27b4b5d9.js @@ -1 +1 @@ -import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as i,c as s,a as e,b as a,d as t,e as l}from"./app-98132e77.js";const d={},c=e("p",null,"虽然 OBS 的功能已经非常强大,但通过第三方软件可以更简单地给我们带来美颜、变声、虚拟主播等特效。",-1),h=e("h2",{id:"美颜",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#美颜","aria-hidden":"true"},"#"),a(" 美颜")],-1),p={href:"https://v.yy.com/",target:"_blank",rel:"noopener noreferrer"},_=l('

        打开 YY 开播,调用摄像头摄像,开启美颜功能。然后,在 OBS 中调用 YY 开播,如果有绿幕,可以添加「色度值」滤镜进行视频抠图。一旦配置好,下次启动 OBS 时,软件会自动调用 YY 开播开启美颜,无需重复配置。但是,「美颜 + 直播」对电脑配置的要求较高,如果直播画面出现明显卡顿,建议关闭 YY 开播。

        使用注意

        • 剧烈运动时,不要开美颜直播,否则容易卡顿。
        • 不要开启 YY 直播中除美颜外的功能,如虚拟背景、虚拟形象等,否则直播中的画面背景无法透明化。

        变声

        直播变声可以通过硬件和软件两种方式实现。软件变声器,如 MorphVOX Pro 和神舌,对使用者的语气要求较高。我在淘宝找人进行了声音精调,但效果仍然无法仿真。店家发的语气教程也没有太多参考价值,初学者很难入门。硬件变声器的效果更加糟糕,强烈不推荐。

        虚拟主播

        如果不想录脸直播,可以配合软件使用虚拟形象直播。此类换脸软件会占用较高的 CPU,需要使用三年内的主流配置。

        Snap Camera

        ',8),u={href:"https://snapcamera.snapchat.com/",target:"_blank",rel:"noopener noreferrer"},g=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/SnapCamera.gif?imageMogr2/format/webp",alt:"Snap Camera 效果图",tabindex:"0",loading:"lazy"}),e("figcaption",null,"Snap Camera 效果图")],-1),f=e("p",null,"如果你无法使用 Snap Camera,可以尝试 FaceRig 和 PrprLive。",-1),m=e("h3",{id:"facerig",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#facerig","aria-hidden":"true"},"#"),a(" FaceRig")],-1),b={href:"https://store.steampowered.com/app/274920/FaceRig/",target:"_blank",rel:"noopener noreferrer"},S=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20210329092154.gif?imageMogr2/format/webp",alt:"FaceRig 演示图",tabindex:"0",loading:"lazy"}),e("figcaption",null,"FaceRig 演示图")],-1),C=e("p",null,[a("注意:百度搜索 FaceRig 的首个结果是"),e("strong",null,"虚假官网"),a(",价格高且无保障,不要在上面进行购买。")],-1),v=e("h3",{id:"prprlive",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#prprlive","aria-hidden":"true"},"#"),a(" PrprLive")],-1),x={href:"https://store.steampowered.com/app/1279610/PrprLive/",target:"_blank",rel:"noopener noreferrer"},B=e("h2",{id:"动态素材",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#动态素材","aria-hidden":"true"},"#"),a(" 动态素材")],-1),I={href:"https://d.appinn.com/bongo-cat-mver/",target:"_blank",rel:"noopener noreferrer"},k=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-06-30-08-29-40.png",alt:"直播间的猫咪",tabindex:"0",loading:"lazy"}),e("figcaption",null,"直播间的猫咪")],-1),O=e("h2",{id:"摄像头多开",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#摄像头多开","aria-hidden":"true"},"#"),a(" 摄像头多开")],-1),Y={href:"https://splitcam.com/",target:"_blank",rel:"noopener noreferrer"},A=e("p",null,"例如,摄像头可以同时用于 OBS 直播和 Capture 录屏,在不同用途上可以叠加不同滤镜和特效,呈现出不同的画面。",-1),R=e("p",null,[e("strong",null,"使用流程"),a(":")],-1),V=e("ol",null,[e("li",null,"打开 SplitCam,选择默认摄像头。"),e("li",null,"Snap Camera、Capture 等第三方调用摄像头时,选择「SplitCam Video Driver」。")],-1),D=e("h2",{id:"其他应用",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#其他应用","aria-hidden":"true"},"#"),a(" 其他应用")],-1),F=e("h3",{id:"nvidia-broadcast",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#nvidia-broadcast","aria-hidden":"true"},"#"),a(" NVIDIA BROADCAST")],-1),P={href:"https://www.nvidia.cn/geforce/guides/broadcast-app-setup-guide/",target:"_blank",rel:"noopener noreferrer"},N=e("h3",{id:"小葫芦弹幕助手",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#小葫芦弹幕助手","aria-hidden":"true"},"#"),a(" 小葫芦弹幕助手")],-1),w={href:"https://zs.xiaohulu.com/danmu/",target:"_blank",rel:"noopener noreferrer"},L=e("p",null,[a("如果不需要在直播界面中显示弹幕,不要安装小葫芦弹幕插件。安装后,会影响 OBS 窗口捕获功能,无法抓取基于 Electron 的应用界面,从而导致窗口捕捉黑屏。解决方法是删除 "),e("code",null,"C:\\Program Files\\obs-studio\\obs-plugins\\64bit"),a(" 目录内的 "),e("code",null,"CalabashDanmuPlugin.dll"),a("、"),e("code",null,"CalabashWinCapture.dll"),a("、"),e("code",null,"ObssDanmuInfo.dll"),a(",重启 OBS 即可恢复,但下次使用弹幕助手时,这三个文件会自动安装,黑屏问题复现,只能重新删除指定文件。")],-1),y=e("p",null,"小葫芦直播助手集成了 OBS 和弹幕助手的功能,但为了直播的扩展性,仍然建议从 OBS 入门。",-1);function z(E,M){const r=o("ExternalLinkIcon");return i(),s("div",null,[c,h,e("p",null,[a("推荐使用 "),e("a",p,[a("YY 开播"),t(r)]),a("来实现直播美颜功能。")]),_,e("p",null,[e("a",u,[a("Snap Camera"),t(r)]),a(" 是 SnapChat 的免费增强现实应用。它可以帮助你在电脑直播/录屏时实现挡脸头套、美化滤镜等特效。如果你熟悉 3D 建模,可以使用 Lens Studio 定制属于你自己的变脸特效。但需要注意的是,当你喝水、低头或脸部被遮挡时,脸部特效会失效。")]),g,f,m,e("p",null,[e("a",b,[a("FaceRig"),t(r)]),a("(Steam 已停售)可以通过对五官的动作捕捉,让卡通脸的表情进行同步变化,但不能对头部以下的部分进行捕捉和同步。使用时,需要打开 FaceRig 中的「切换广播」,否则 OBS 窗口会显示为黑屏。")]),S,C,v,e("p",null,[e("a",x,[a("PrprLive"),t(r)]),a(" 是国内的变脸软件,基础版免费,同样在 Steam 销售,付费前先试试基础版。")]),B,e("p",null,[a("为了丰富直播场景,可以使用带绿幕的视频来添加动态特效,或者借助类虚拟主播技术来实现交互。例如 "),e("a",I,[a("Bongo Cat Mver"),t(r)]),a(",它能实时同步键盘与鼠标状态,增加直播趣味性。如果你使用的是 Bongo Cat 全键盘同步模型,建议打乱映射规则,以防止隐私泄露。")]),k,O,e("p",null,[a("摄像头默认只能被一个应用调用。借助 "),e("a",Y,[a("SplitCam"),t(r)]),a(",你能在摄像头画面上叠加元素,使用镜像、高亮滤镜微调画面,还能让摄像头画面同步给多个应用。")]),A,R,V,D,F,e("p",null,[a("如果你使用的是 NVIDIA 显卡,强烈推荐安装 "),e("a",P,[a("NVIDIA Broadcast"),t(r)]),a("。它利用 AI 的强大功能将标准网络摄像头和麦克风升级为高端智能设备,通过麦克风去噪、房间回声消除、虚拟背景、网络摄像头人像跟踪和视频降噪等 AI 功能,提高直播的视频和音频质量。通过 NVIDIA RTX GPU 上搭载的名为 Tensor Core 的专用 AI 处理器,AI 网络能够实时运行高质量的效果。")]),N,e("p",null,[e("a",w,[a("小葫芦弹幕助手"),t(r)]),a("可实时显示网友的互动和打赏,尤其适合游戏直播。但是,由于弹幕答谢、自动定时弹幕、手动弹幕等功能已暂停,不建议新手充值会员。")]),L,y])}const X=n(d,[["render",z],["__file","4_live_effects.html.vue"]]);export{X as default}; +import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as i,c as s,a as e,b as a,d as t,e as l}from"./app-91ee3df5.js";const d={},c=e("p",null,"虽然 OBS 的功能已经非常强大,但通过第三方软件可以更简单地给我们带来美颜、变声、虚拟主播等特效。",-1),h=e("h2",{id:"美颜",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#美颜","aria-hidden":"true"},"#"),a(" 美颜")],-1),p={href:"https://v.yy.com/",target:"_blank",rel:"noopener noreferrer"},_=l('

        打开 YY 开播,调用摄像头摄像,开启美颜功能。然后,在 OBS 中调用 YY 开播,如果有绿幕,可以添加「色度值」滤镜进行视频抠图。一旦配置好,下次启动 OBS 时,软件会自动调用 YY 开播开启美颜,无需重复配置。但是,「美颜 + 直播」对电脑配置的要求较高,如果直播画面出现明显卡顿,建议关闭 YY 开播。

        使用注意

        • 剧烈运动时,不要开美颜直播,否则容易卡顿。
        • 不要开启 YY 直播中除美颜外的功能,如虚拟背景、虚拟形象等,否则直播中的画面背景无法透明化。

        变声

        直播变声可以通过硬件和软件两种方式实现。软件变声器,如 MorphVOX Pro 和神舌,对使用者的语气要求较高。我在淘宝找人进行了声音精调,但效果仍然无法仿真。店家发的语气教程也没有太多参考价值,初学者很难入门。硬件变声器的效果更加糟糕,强烈不推荐。

        虚拟主播

        如果不想录脸直播,可以配合软件使用虚拟形象直播。此类换脸软件会占用较高的 CPU,需要使用三年内的主流配置。

        Snap Camera

        ',8),u={href:"https://snapcamera.snapchat.com/",target:"_blank",rel:"noopener noreferrer"},g=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/SnapCamera.gif?imageMogr2/format/webp",alt:"Snap Camera 效果图",tabindex:"0",loading:"lazy"}),e("figcaption",null,"Snap Camera 效果图")],-1),f=e("p",null,"如果你无法使用 Snap Camera,可以尝试 FaceRig 和 PrprLive。",-1),m=e("h3",{id:"facerig",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#facerig","aria-hidden":"true"},"#"),a(" FaceRig")],-1),b={href:"https://store.steampowered.com/app/274920/FaceRig/",target:"_blank",rel:"noopener noreferrer"},S=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/20210329092154.gif?imageMogr2/format/webp",alt:"FaceRig 演示图",tabindex:"0",loading:"lazy"}),e("figcaption",null,"FaceRig 演示图")],-1),C=e("p",null,[a("注意:百度搜索 FaceRig 的首个结果是"),e("strong",null,"虚假官网"),a(",价格高且无保障,不要在上面进行购买。")],-1),v=e("h3",{id:"prprlive",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#prprlive","aria-hidden":"true"},"#"),a(" PrprLive")],-1),x={href:"https://store.steampowered.com/app/1279610/PrprLive/",target:"_blank",rel:"noopener noreferrer"},B=e("h2",{id:"动态素材",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#动态素材","aria-hidden":"true"},"#"),a(" 动态素材")],-1),I={href:"https://d.appinn.com/bongo-cat-mver/",target:"_blank",rel:"noopener noreferrer"},k=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-06-30-08-29-40.png",alt:"直播间的猫咪",tabindex:"0",loading:"lazy"}),e("figcaption",null,"直播间的猫咪")],-1),O=e("h2",{id:"摄像头多开",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#摄像头多开","aria-hidden":"true"},"#"),a(" 摄像头多开")],-1),Y={href:"https://splitcam.com/",target:"_blank",rel:"noopener noreferrer"},A=e("p",null,"例如,摄像头可以同时用于 OBS 直播和 Capture 录屏,在不同用途上可以叠加不同滤镜和特效,呈现出不同的画面。",-1),R=e("p",null,[e("strong",null,"使用流程"),a(":")],-1),V=e("ol",null,[e("li",null,"打开 SplitCam,选择默认摄像头。"),e("li",null,"Snap Camera、Capture 等第三方调用摄像头时,选择「SplitCam Video Driver」。")],-1),D=e("h2",{id:"其他应用",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#其他应用","aria-hidden":"true"},"#"),a(" 其他应用")],-1),F=e("h3",{id:"nvidia-broadcast",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#nvidia-broadcast","aria-hidden":"true"},"#"),a(" NVIDIA BROADCAST")],-1),P={href:"https://www.nvidia.cn/geforce/guides/broadcast-app-setup-guide/",target:"_blank",rel:"noopener noreferrer"},N=e("h3",{id:"小葫芦弹幕助手",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#小葫芦弹幕助手","aria-hidden":"true"},"#"),a(" 小葫芦弹幕助手")],-1),w={href:"https://zs.xiaohulu.com/danmu/",target:"_blank",rel:"noopener noreferrer"},L=e("p",null,[a("如果不需要在直播界面中显示弹幕,不要安装小葫芦弹幕插件。安装后,会影响 OBS 窗口捕获功能,无法抓取基于 Electron 的应用界面,从而导致窗口捕捉黑屏。解决方法是删除 "),e("code",null,"C:\\Program Files\\obs-studio\\obs-plugins\\64bit"),a(" 目录内的 "),e("code",null,"CalabashDanmuPlugin.dll"),a("、"),e("code",null,"CalabashWinCapture.dll"),a("、"),e("code",null,"ObssDanmuInfo.dll"),a(",重启 OBS 即可恢复,但下次使用弹幕助手时,这三个文件会自动安装,黑屏问题复现,只能重新删除指定文件。")],-1),y=e("p",null,"小葫芦直播助手集成了 OBS 和弹幕助手的功能,但为了直播的扩展性,仍然建议从 OBS 入门。",-1);function z(E,M){const r=o("ExternalLinkIcon");return i(),s("div",null,[c,h,e("p",null,[a("推荐使用 "),e("a",p,[a("YY 开播"),t(r)]),a("来实现直播美颜功能。")]),_,e("p",null,[e("a",u,[a("Snap Camera"),t(r)]),a(" 是 SnapChat 的免费增强现实应用。它可以帮助你在电脑直播/录屏时实现挡脸头套、美化滤镜等特效。如果你熟悉 3D 建模,可以使用 Lens Studio 定制属于你自己的变脸特效。但需要注意的是,当你喝水、低头或脸部被遮挡时,脸部特效会失效。")]),g,f,m,e("p",null,[e("a",b,[a("FaceRig"),t(r)]),a("(Steam 已停售)可以通过对五官的动作捕捉,让卡通脸的表情进行同步变化,但不能对头部以下的部分进行捕捉和同步。使用时,需要打开 FaceRig 中的「切换广播」,否则 OBS 窗口会显示为黑屏。")]),S,C,v,e("p",null,[e("a",x,[a("PrprLive"),t(r)]),a(" 是国内的变脸软件,基础版免费,同样在 Steam 销售,付费前先试试基础版。")]),B,e("p",null,[a("为了丰富直播场景,可以使用带绿幕的视频来添加动态特效,或者借助类虚拟主播技术来实现交互。例如 "),e("a",I,[a("Bongo Cat Mver"),t(r)]),a(",它能实时同步键盘与鼠标状态,增加直播趣味性。如果你使用的是 Bongo Cat 全键盘同步模型,建议打乱映射规则,以防止隐私泄露。")]),k,O,e("p",null,[a("摄像头默认只能被一个应用调用。借助 "),e("a",Y,[a("SplitCam"),t(r)]),a(",你能在摄像头画面上叠加元素,使用镜像、高亮滤镜微调画面,还能让摄像头画面同步给多个应用。")]),A,R,V,D,F,e("p",null,[a("如果你使用的是 NVIDIA 显卡,强烈推荐安装 "),e("a",P,[a("NVIDIA Broadcast"),t(r)]),a("。它利用 AI 的强大功能将标准网络摄像头和麦克风升级为高端智能设备,通过麦克风去噪、房间回声消除、虚拟背景、网络摄像头人像跟踪和视频降噪等 AI 功能,提高直播的视频和音频质量。通过 NVIDIA RTX GPU 上搭载的名为 Tensor Core 的专用 AI 处理器,AI 网络能够实时运行高质量的效果。")]),N,e("p",null,[e("a",w,[a("小葫芦弹幕助手"),t(r)]),a("可实时显示网友的互动和打赏,尤其适合游戏直播。但是,由于弹幕答谢、自动定时弹幕、手动弹幕等功能已暂停,不建议新手充值会员。")]),L,y])}const X=n(d,[["render",z],["__file","4_live_effects.html.vue"]]);export{X as default}; diff --git a/assets/5_live_platforms.html-dbdcb26c.js b/assets/5_live_platforms.html-e94c4979.js similarity index 99% rename from assets/5_live_platforms.html-dbdcb26c.js rename to assets/5_live_platforms.html-e94c4979.js index 54633048..66c8c003 100644 --- a/assets/5_live_platforms.html-dbdcb26c.js +++ b/assets/5_live_platforms.html-e94c4979.js @@ -1 +1 @@ -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as a,c as i,a as e,b as o,d as n}from"./app-98132e77.js";const s={},h=e("p",null,"主流直播平台有淘宝、京东、抖音、快手、视频号、哔哩哔哩、小红书、微博直播、斗鱼、虎牙和 YouTube。接下来,我将逐一介绍如何使用 PC 端的 OBS 在这些平台上进行直播。",-1),d=e("h2",{id:"淘宝直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#淘宝直播","aria-hidden":"true"},"#"),o(" 淘宝直播")],-1),c={href:"https://market.m.taobao.com/app/mtb/live-portal/download/index.html",target:"_blank",rel:"noopener noreferrer"},_=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-06-29-22-23-26.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"淘宝直播设置")],-1),p=e("li",null,[e("p",null,"在左侧点击「添加元素」>「摄像头」,选择「OBS-Camera」,即可同步 OBS 直播画面。淘宝直播客户端也是基于 OBS,但不支持推流直播,只能通过虚拟摄像头同步画面。")],-1),u={href:"https://liveplatform.taobao.com/restful/index/home/",target:"_blank",rel:"noopener noreferrer"},f=e("h2",{id:"抖音直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#抖音直播","aria-hidden":"true"},"#"),o(" 抖音直播")],-1),b={href:"https://www.douyin.com/falcon/webcast_openpc/pages/streamingtool_download/index.html",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,[e("p",null,"在左侧点击「添加元素」>「采集」,选择「OBS-Camera」(摄像头较多时,可下滑选择),设置采集自定义音频设备为「OBS-Audio」,声音改为单声道。"),e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-06-29-23-59-02.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"抖音直播设置")])],-1),g={href:"http://streamingtool.douyin.com/docs/guide/96319/",target:"_blank",rel:"noopener noreferrer"},k=e("h2",{id:"快手直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#快手直播","aria-hidden":"true"},"#"),o(" 快手直播")],-1),w={href:"https://studio.kuaishou.com/profile",target:"_blank",rel:"noopener noreferrer"},x=e("h2",{id:"视频号直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#视频号直播","aria-hidden":"true"},"#"),o(" 视频号直播")],-1),v={href:"https://channels.weixin.qq.com/platform/live/apply",target:"_blank",rel:"noopener noreferrer"},B=e("p",null,[o("视频号认证最重要的一环是"),e("strong",null,"有效关注数 1000 人以上"),o(",可疑和外挂用户都不包含在有效人数内。达到 1000 有效粉丝后,就可以在视频号助手网页端发起直播推流了。")],-1),y=e("h2",{id:"b-站直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#b-站直播","aria-hidden":"true"},"#"),o(" B 站直播")],-1),O={href:"https://link.bilibili.com/p/eden/download#/web",target:"_blank",rel:"noopener noreferrer"},S={href:"https://link.bilibili.com/p/center/index#/my-room/start-live",target:"_blank",rel:"noopener noreferrer"},F={href:"https://github.com/iwxyi/Bilibili-MagicalDanmaku",target:"_blank",rel:"noopener noreferrer"},C=e("h2",{id:"知乎直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#知乎直播","aria-hidden":"true"},"#"),o(" 知乎直播")],-1),z={href:"https://www.zhihu.com/creator/streaming/push",target:"_blank",rel:"noopener noreferrer"},T=e("p",null,"知乎直播注意:",-1),Y=e("ul",null,[e("li",null,"推流直播不能与第三方连接谈话;手机直播不支持绿幕抠图。"),e("li",null,"当你在电脑直播时,用手机进入知乎客户端,会提示「是否继续直播」,选择「继续」可进入直播界面与观众互动,选「忽略」则停止直播。"),e("li",null,"如果直播时间超过一个月,小葫芦直播码会失效,无法继续使用小葫芦直播助手和弹幕助手。")],-1),q=e("h2",{id:"小红书直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#小红书直播","aria-hidden":"true"},"#"),o(" 小红书直播")],-1),E={href:"http://www.xiaohongshu.com/zhibo/robs",target:"_blank",rel:"noopener noreferrer"},N=e("a",{href:"ttps://fe-video-qc.xhscdn.com/fe-platform/f03ae58e50e6d53580fa16a58e9dffbbbabbb5f0.pdf"},"官方文档",-1),P=e("p",null,"当我登录直播助手时,提示「暂无直播权限,请联系运营及客服开通」,但手机却可以直播,这说明提示中的直播权限专指电脑端直播。因此,我在应用中提交了问题,但一直未收到客服回复。",-1),V=e("h2",{id:"微博直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#微博直播","aria-hidden":"true"},"#"),o(" 微博直播")],-1),A={href:"https://weibo.com/manage/frame?furl=https%3A%2F%2Fweibo.com%2Fl%2Fwblive%2Fadmin%2Fhome%2Fauthentication",target:"_blank",rel:"noopener noreferrer"},I={href:"https://weibo.com/l/wblive/act/k2mw80kz3kw0",target:"_blank",rel:"noopener noreferrer"},L=e("h2",{id:"youtube-直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#youtube-直播","aria-hidden":"true"},"#"),o(" Youtube 直播")],-1),D=e("p",null,"如果您在过去 90 天内没有进行 YouTube 直播,平台会要求验证您的频道。首次启用直播功能可能需要最长等待 24 小时。",-1),M={href:"http://youtube.com/livestreaming",target:"_blank",rel:"noopener noreferrer"},j=e("li",null,"点击直播标签页或为新直播安排时间。",-1),G=e("li",null,"从直播控制室复制直播网址和直播码,然后将其粘贴到编码器中。",-1);function H(J,K){const t=l("ExternalLinkIcon");return a(),i("div",null,[h,d,e("ol",null,[e("li",null,[e("p",null,[o("下载"),e("a",c,[o("淘宝直播客户端"),n(t)]),o(",打开后点击「我要开播」,进入直播间界面。")]),_]),p]),e("p",null,[o("除了客户端,还可以通过"),e("a",u,[o("直播中控台"),n(t)]),o("来设置淘宝直播间。")]),f,e("ol",null,[e("li",null,[e("p",null,[o("下载"),e("a",b,[o("直播伴侣电脑端"),n(t)]),o(",它可以适配西瓜视频、抖音、抖音火山版的直播。")])]),m]),e("p",null,[o("以上为抖音新手的电脑直播步骤,如果你的抖音粉丝在一万以上,可以使用 "),e("a",g,[o("OBS 模式推流"),n(t)]),o("。")]),k,e("p",null,[o("快手直播无需 PC 客户端,可在"),e("a",w,[o("快手云直播"),n(t)]),o("页面配置直播间,支持 OBS 模式推流直播。若直播断流超过 2 分钟或直播超过 7 天,则会自动下播。")]),x,e("p",null,[o("要使用电脑直播视频号,需要先完成"),e("a",v,[o("视频号认证"),n(t)]),o("。")]),B,y,e("p",null,[o("哔哩哔哩可以在"),e("a",O,[o("直播姬客户端"),n(t)]),o("或"),e("a",S,[o("B 站直播间网页端"),n(t)]),o("上进行在线直播。直播封面必须包含图像,不支持纯文本封面。")]),e("p",null,[o("如果你主做 B 站直播,可以试试哔哩哔哩直播机器人"),e("a",F,[o("神奇弹幕"),n(t)]),o(",它集成了弹幕姬、答谢姬、点歌姬、回复姬和工作流 (workflow),支持弹幕聊天、观众互动、自动点歌、数据统计、私信处理等功能。这个应用看起来很有趣,我还没有使用过。")]),C,e("p",null,[o("在"),e("a",z,[o("知乎推流直播"),n(t)]),o("页面开启直播后,就可以使用知乎的电脑直播。")]),T,Y,q,e("p",null,[o("小红书使用"),e("a",E,[o("直播助手"),n(t)]),o("来设置推流,可以查看"),N,o(" 了解开播步骤。")]),P,V,e("p",null,[o("微博直播需先完成实名认证,然后在"),e("a",A,[o("微博管理中心"),n(t)]),o("创建直播。详细的开播步骤,可以参考官方的"),e("a",I,[o("微博 PC 开播教程"),n(t)]),o("。")]),L,D,e("ol",null,[e("li",null,[o("打开 "),e("a",M,[o("YouTube 直播控制室"),n(t)]),o("。")]),j,G])])}const U=r(s,[["render",H],["__file","5_live_platforms.html.vue"]]);export{U as default}; +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as a,c as i,a as e,b as o,d as n}from"./app-91ee3df5.js";const s={},h=e("p",null,"主流直播平台有淘宝、京东、抖音、快手、视频号、哔哩哔哩、小红书、微博直播、斗鱼、虎牙和 YouTube。接下来,我将逐一介绍如何使用 PC 端的 OBS 在这些平台上进行直播。",-1),d=e("h2",{id:"淘宝直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#淘宝直播","aria-hidden":"true"},"#"),o(" 淘宝直播")],-1),c={href:"https://market.m.taobao.com/app/mtb/live-portal/download/index.html",target:"_blank",rel:"noopener noreferrer"},_=e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-06-29-22-23-26.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"淘宝直播设置")],-1),p=e("li",null,[e("p",null,"在左侧点击「添加元素」>「摄像头」,选择「OBS-Camera」,即可同步 OBS 直播画面。淘宝直播客户端也是基于 OBS,但不支持推流直播,只能通过虚拟摄像头同步画面。")],-1),u={href:"https://liveplatform.taobao.com/restful/index/home/",target:"_blank",rel:"noopener noreferrer"},f=e("h2",{id:"抖音直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#抖音直播","aria-hidden":"true"},"#"),o(" 抖音直播")],-1),b={href:"https://www.douyin.com/falcon/webcast_openpc/pages/streamingtool_download/index.html",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,[e("p",null,"在左侧点击「添加元素」>「采集」,选择「OBS-Camera」(摄像头较多时,可下滑选择),设置采集自定义音频设备为「OBS-Audio」,声音改为单声道。"),e("figure",null,[e("img",{src:"https://img.gpt-vip.top/2022-06-29-23-59-02.png",alt:"",tabindex:"0",loading:"lazy"}),e("figcaption",null,"抖音直播设置")])],-1),g={href:"http://streamingtool.douyin.com/docs/guide/96319/",target:"_blank",rel:"noopener noreferrer"},k=e("h2",{id:"快手直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#快手直播","aria-hidden":"true"},"#"),o(" 快手直播")],-1),w={href:"https://studio.kuaishou.com/profile",target:"_blank",rel:"noopener noreferrer"},x=e("h2",{id:"视频号直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#视频号直播","aria-hidden":"true"},"#"),o(" 视频号直播")],-1),v={href:"https://channels.weixin.qq.com/platform/live/apply",target:"_blank",rel:"noopener noreferrer"},B=e("p",null,[o("视频号认证最重要的一环是"),e("strong",null,"有效关注数 1000 人以上"),o(",可疑和外挂用户都不包含在有效人数内。达到 1000 有效粉丝后,就可以在视频号助手网页端发起直播推流了。")],-1),y=e("h2",{id:"b-站直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#b-站直播","aria-hidden":"true"},"#"),o(" B 站直播")],-1),O={href:"https://link.bilibili.com/p/eden/download#/web",target:"_blank",rel:"noopener noreferrer"},S={href:"https://link.bilibili.com/p/center/index#/my-room/start-live",target:"_blank",rel:"noopener noreferrer"},F={href:"https://github.com/iwxyi/Bilibili-MagicalDanmaku",target:"_blank",rel:"noopener noreferrer"},C=e("h2",{id:"知乎直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#知乎直播","aria-hidden":"true"},"#"),o(" 知乎直播")],-1),z={href:"https://www.zhihu.com/creator/streaming/push",target:"_blank",rel:"noopener noreferrer"},T=e("p",null,"知乎直播注意:",-1),Y=e("ul",null,[e("li",null,"推流直播不能与第三方连接谈话;手机直播不支持绿幕抠图。"),e("li",null,"当你在电脑直播时,用手机进入知乎客户端,会提示「是否继续直播」,选择「继续」可进入直播界面与观众互动,选「忽略」则停止直播。"),e("li",null,"如果直播时间超过一个月,小葫芦直播码会失效,无法继续使用小葫芦直播助手和弹幕助手。")],-1),q=e("h2",{id:"小红书直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#小红书直播","aria-hidden":"true"},"#"),o(" 小红书直播")],-1),E={href:"http://www.xiaohongshu.com/zhibo/robs",target:"_blank",rel:"noopener noreferrer"},N=e("a",{href:"ttps://fe-video-qc.xhscdn.com/fe-platform/f03ae58e50e6d53580fa16a58e9dffbbbabbb5f0.pdf"},"官方文档",-1),P=e("p",null,"当我登录直播助手时,提示「暂无直播权限,请联系运营及客服开通」,但手机却可以直播,这说明提示中的直播权限专指电脑端直播。因此,我在应用中提交了问题,但一直未收到客服回复。",-1),V=e("h2",{id:"微博直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#微博直播","aria-hidden":"true"},"#"),o(" 微博直播")],-1),A={href:"https://weibo.com/manage/frame?furl=https%3A%2F%2Fweibo.com%2Fl%2Fwblive%2Fadmin%2Fhome%2Fauthentication",target:"_blank",rel:"noopener noreferrer"},I={href:"https://weibo.com/l/wblive/act/k2mw80kz3kw0",target:"_blank",rel:"noopener noreferrer"},L=e("h2",{id:"youtube-直播",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#youtube-直播","aria-hidden":"true"},"#"),o(" Youtube 直播")],-1),D=e("p",null,"如果您在过去 90 天内没有进行 YouTube 直播,平台会要求验证您的频道。首次启用直播功能可能需要最长等待 24 小时。",-1),M={href:"http://youtube.com/livestreaming",target:"_blank",rel:"noopener noreferrer"},j=e("li",null,"点击直播标签页或为新直播安排时间。",-1),G=e("li",null,"从直播控制室复制直播网址和直播码,然后将其粘贴到编码器中。",-1);function H(J,K){const t=l("ExternalLinkIcon");return a(),i("div",null,[h,d,e("ol",null,[e("li",null,[e("p",null,[o("下载"),e("a",c,[o("淘宝直播客户端"),n(t)]),o(",打开后点击「我要开播」,进入直播间界面。")]),_]),p]),e("p",null,[o("除了客户端,还可以通过"),e("a",u,[o("直播中控台"),n(t)]),o("来设置淘宝直播间。")]),f,e("ol",null,[e("li",null,[e("p",null,[o("下载"),e("a",b,[o("直播伴侣电脑端"),n(t)]),o(",它可以适配西瓜视频、抖音、抖音火山版的直播。")])]),m]),e("p",null,[o("以上为抖音新手的电脑直播步骤,如果你的抖音粉丝在一万以上,可以使用 "),e("a",g,[o("OBS 模式推流"),n(t)]),o("。")]),k,e("p",null,[o("快手直播无需 PC 客户端,可在"),e("a",w,[o("快手云直播"),n(t)]),o("页面配置直播间,支持 OBS 模式推流直播。若直播断流超过 2 分钟或直播超过 7 天,则会自动下播。")]),x,e("p",null,[o("要使用电脑直播视频号,需要先完成"),e("a",v,[o("视频号认证"),n(t)]),o("。")]),B,y,e("p",null,[o("哔哩哔哩可以在"),e("a",O,[o("直播姬客户端"),n(t)]),o("或"),e("a",S,[o("B 站直播间网页端"),n(t)]),o("上进行在线直播。直播封面必须包含图像,不支持纯文本封面。")]),e("p",null,[o("如果你主做 B 站直播,可以试试哔哩哔哩直播机器人"),e("a",F,[o("神奇弹幕"),n(t)]),o(",它集成了弹幕姬、答谢姬、点歌姬、回复姬和工作流 (workflow),支持弹幕聊天、观众互动、自动点歌、数据统计、私信处理等功能。这个应用看起来很有趣,我还没有使用过。")]),C,e("p",null,[o("在"),e("a",z,[o("知乎推流直播"),n(t)]),o("页面开启直播后,就可以使用知乎的电脑直播。")]),T,Y,q,e("p",null,[o("小红书使用"),e("a",E,[o("直播助手"),n(t)]),o("来设置推流,可以查看"),N,o(" 了解开播步骤。")]),P,V,e("p",null,[o("微博直播需先完成实名认证,然后在"),e("a",A,[o("微博管理中心"),n(t)]),o("创建直播。详细的开播步骤,可以参考官方的"),e("a",I,[o("微博 PC 开播教程"),n(t)]),o("。")]),L,D,e("ol",null,[e("li",null,[o("打开 "),e("a",M,[o("YouTube 直播控制室"),n(t)]),o("。")]),j,G])])}const U=r(s,[["render",H],["__file","5_live_platforms.html.vue"]]);export{U as default}; diff --git a/assets/6_live_positioning.html-9c2b1d11.js b/assets/6_live_positioning.html-9171c152.js similarity index 99% rename from assets/6_live_positioning.html-9c2b1d11.js rename to assets/6_live_positioning.html-9171c152.js index e2a08eee..55e79728 100644 --- a/assets/6_live_positioning.html-9c2b1d11.js +++ b/assets/6_live_positioning.html-9171c152.js @@ -1 +1 @@ -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{o as e,c as i,e as r}from"./app-98132e77.js";const h={},n=r('

        直播过几次了,但是你的直播间总是没有人看,偶尔来了人也不知道说什么。作为直播新手,遇到这种情况是很正常的。建议按照本文的章节,逐一比对,对你的直播进行定位和策划。

        直播定位

        开设直播前,从你的兴趣、能力和直播目的出发,确定直播定位。

        • 我是谁:我的职业/身份是什么。
        • 面向谁:目标用户画像:性别、年龄、兴趣、收入、消费能力、性格特征等。
        • 我能提供什么:核心竞争力:陪伴?专业知识?丰富经验?渠道资源?
        • 解决目标用户什么问题:排遣寂寞?选购答疑?

        定位完成后,把自己放在目标观众角度进行换位思考,调整直播定位。

        • 你喜欢哪类型的直播?喜欢谁的直播?为什么?每个主播至少列出 3 个吸引你的点。
        • 你不喜欢哪种直播?为什么?
        • 如果是你做直播,你希望是什么样的?你的底线是什么?有什么顾虑?顾虑和目标比起来,孰轻孰重?

        如果前期定位依然不清,可以观察头部主播、找到对标主播,模仿对标主播的直播间。

        开播时间

        保持长时间和持续开播,稳定开播频次与时间段

        例如,每周固定开播两到三场,每次直播不低于 30 分钟。直播频率和直播时长是做好直播的基础,如果开播时长和开播频率不稳定,系统就无法准确地进行推荐。

        新人直播有流量扶持,即使初期没有观众也要坚持开播。尽量选择白天等冷门时间段,竞争相对较小。

        娱乐直播保持 2.5 小时以上,电商直播保持 3.5 小时以上才会有官方稳定推流。

        直播策划

        选题

        直播选题决定直播前期自然流量的多少。

        新手直播流量不高时,主题尽量搭上最新热点,抓住热点,立即开始,利用现有内容,抢占黄金流量时间。但你的直播内容一定要与热点相关,否则牛头不对马嘴,自然流量也不会留下来。

        选定主题后,准备 15~20 分钟的脚本,在直播中循环使用。即使直播间没人,也不要停止说话,否则进入的自然流量会变少。

        标题

        直播标题控制在 8 个字,可以通过关键词搜索站内热门,从中参考直播标题。直播标题没有搜索权重,所以不需要堆砌关键词,只要能清楚地表达直播间主题就可以了。

        标题要素:

        • 突出主播特征,如:人物特质、性格。
        • 突出内容,如:才艺展示、音乐主题、户外和其他类别。
        • 突出玩法吸引,比如:各种秒杀活动、免费赠送等。
        • 突出实力,清楚地表现出你的能力,当然做解说也可以。

        预告

        开播前,一定要先发直播预告或短视频,以便让更多观众进入直播间。预告发布最好在开播前两小时完成。

        在开播页面,请提前设置好封面标题并勾选定位

        有特色的封面可以提升观众对直播间的兴趣,建议使用本人或与内容相关的图片作为封面。如果不知道如何设置好封面标题,可以参考其他观众较多的直播间。

        打开直播定位,可以让更多的同城观众看到你的直播间,对直播间的流量有非常大的帮助。

        环境

        灯光和环境声音决定了你的直播效果。

        直播间灯光要亮,露脸主播可以将灯光打在脸部的右前方 45 度,这能提升你的颜值。

        直播前,尽量关闭门窗和不必要的电器,降低直播间环境噪音,以避免干扰直播效果。

        直播互动

        开场前 10~15 分钟是暖场阶段,你可以先和观众互动,等人多了再正式开始主题。

        有新观众进入直播间时,要主动欢迎他们。有意识地引导用户关注、互动,呼吁点亮粉丝灯牌,及时感谢礼物。

        对于用户评论,要先读出弹幕,然后做出应答。粉丝提出意见对我们是有帮助的,一定要虚心接受并表示感谢。

        如果有团队配合,可以安排管理员维持直播间的秩序并活跃气氛,参与直播平台的官方活动,适当购买直播道具(宠粉红包福袋)。

        下播后,进行数据复盘,调整直播间的标题、封面和背景。

        开播锻炼

        开播前把脸部肌肉活动开。嘴张到最大,舌顶上颚 60 秒;嘴张到最大,尽量伸舌 30 秒。说话时,让嘴唇用力。

        总结

        经过两年的直播,我深知直播的硬件、软件和技巧只是锦上添花。若要体验直播,不想深入研究,只需拿出手机开播即可。开始直播时,可能会有很多疑问和顾虑,效果也不一定很好。但只有勇敢尝试新事物,不断开拓,我们的人生才会有更多可能性。

        ',40),p=[n];function d(t,s){return e(),i("div",null,p)}const c=a(h,[["render",d],["__file","6_live_positioning.html.vue"]]);export{c as default}; +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{o as e,c as i,e as r}from"./app-91ee3df5.js";const h={},n=r('

        直播过几次了,但是你的直播间总是没有人看,偶尔来了人也不知道说什么。作为直播新手,遇到这种情况是很正常的。建议按照本文的章节,逐一比对,对你的直播进行定位和策划。

        直播定位

        开设直播前,从你的兴趣、能力和直播目的出发,确定直播定位。

        • 我是谁:我的职业/身份是什么。
        • 面向谁:目标用户画像:性别、年龄、兴趣、收入、消费能力、性格特征等。
        • 我能提供什么:核心竞争力:陪伴?专业知识?丰富经验?渠道资源?
        • 解决目标用户什么问题:排遣寂寞?选购答疑?

        定位完成后,把自己放在目标观众角度进行换位思考,调整直播定位。

        • 你喜欢哪类型的直播?喜欢谁的直播?为什么?每个主播至少列出 3 个吸引你的点。
        • 你不喜欢哪种直播?为什么?
        • 如果是你做直播,你希望是什么样的?你的底线是什么?有什么顾虑?顾虑和目标比起来,孰轻孰重?

        如果前期定位依然不清,可以观察头部主播、找到对标主播,模仿对标主播的直播间。

        开播时间

        保持长时间和持续开播,稳定开播频次与时间段

        例如,每周固定开播两到三场,每次直播不低于 30 分钟。直播频率和直播时长是做好直播的基础,如果开播时长和开播频率不稳定,系统就无法准确地进行推荐。

        新人直播有流量扶持,即使初期没有观众也要坚持开播。尽量选择白天等冷门时间段,竞争相对较小。

        娱乐直播保持 2.5 小时以上,电商直播保持 3.5 小时以上才会有官方稳定推流。

        直播策划

        选题

        直播选题决定直播前期自然流量的多少。

        新手直播流量不高时,主题尽量搭上最新热点,抓住热点,立即开始,利用现有内容,抢占黄金流量时间。但你的直播内容一定要与热点相关,否则牛头不对马嘴,自然流量也不会留下来。

        选定主题后,准备 15~20 分钟的脚本,在直播中循环使用。即使直播间没人,也不要停止说话,否则进入的自然流量会变少。

        标题

        直播标题控制在 8 个字,可以通过关键词搜索站内热门,从中参考直播标题。直播标题没有搜索权重,所以不需要堆砌关键词,只要能清楚地表达直播间主题就可以了。

        标题要素:

        • 突出主播特征,如:人物特质、性格。
        • 突出内容,如:才艺展示、音乐主题、户外和其他类别。
        • 突出玩法吸引,比如:各种秒杀活动、免费赠送等。
        • 突出实力,清楚地表现出你的能力,当然做解说也可以。

        预告

        开播前,一定要先发直播预告或短视频,以便让更多观众进入直播间。预告发布最好在开播前两小时完成。

        在开播页面,请提前设置好封面标题并勾选定位

        有特色的封面可以提升观众对直播间的兴趣,建议使用本人或与内容相关的图片作为封面。如果不知道如何设置好封面标题,可以参考其他观众较多的直播间。

        打开直播定位,可以让更多的同城观众看到你的直播间,对直播间的流量有非常大的帮助。

        环境

        灯光和环境声音决定了你的直播效果。

        直播间灯光要亮,露脸主播可以将灯光打在脸部的右前方 45 度,这能提升你的颜值。

        直播前,尽量关闭门窗和不必要的电器,降低直播间环境噪音,以避免干扰直播效果。

        直播互动

        开场前 10~15 分钟是暖场阶段,你可以先和观众互动,等人多了再正式开始主题。

        有新观众进入直播间时,要主动欢迎他们。有意识地引导用户关注、互动,呼吁点亮粉丝灯牌,及时感谢礼物。

        对于用户评论,要先读出弹幕,然后做出应答。粉丝提出意见对我们是有帮助的,一定要虚心接受并表示感谢。

        如果有团队配合,可以安排管理员维持直播间的秩序并活跃气氛,参与直播平台的官方活动,适当购买直播道具(宠粉红包福袋)。

        下播后,进行数据复盘,调整直播间的标题、封面和背景。

        开播锻炼

        开播前把脸部肌肉活动开。嘴张到最大,舌顶上颚 60 秒;嘴张到最大,尽量伸舌 30 秒。说话时,让嘴唇用力。

        总结

        经过两年的直播,我深知直播的硬件、软件和技巧只是锦上添花。若要体验直播,不想深入研究,只需拿出手机开播即可。开始直播时,可能会有很多疑问和顾虑,效果也不一定很好。但只有勇敢尝试新事物,不断开拓,我们的人生才会有更多可能性。

        ',40),p=[n];function d(t,s){return e(),i("div",null,p)}const c=a(h,[["render",d],["__file","6_live_positioning.html.vue"]]);export{c as default}; diff --git a/assets/AIEnjoy.html-4b65621a.js b/assets/AIEnjoy.html-a5e95395.js similarity index 98% rename from assets/AIEnjoy.html-4b65621a.js rename to assets/AIEnjoy.html-a5e95395.js index 762a9cd1..d17fa338 100644 --- a/assets/AIEnjoy.html-4b65621a.js +++ b/assets/AIEnjoy.html-a5e95395.js @@ -1 +1 @@ -import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as s,c as h,a as e,b as t,d as a}from"./app-98132e77.js";const i={},p=e("h1",{id:"aienjoy",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#aienjoy","aria-hidden":"true"},"#"),t(" AiEnjoy")],-1),c={href:"https://autoaigpt.cn",target:"_blank",rel:"noopener noreferrer"},d={href:"https://autoaigpt.cn",target:"_blank",rel:"noopener noreferrer"},_=e("h2",{id:"gpt快速使用",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#gpt快速使用","aria-hidden":"true"},"#"),t(" GPT快速使用")],-1),l={href:"https://sensechat.vip",target:"_blank",rel:"noopener noreferrer"},f={href:"https://sensechat.vip",target:"_blank",rel:"noopener noreferrer"},u=e("h2",{id:"万能it工具",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#万能it工具","aria-hidden":"true"},"#"),t(" 万能IT工具")],-1),g={href:"https://itools.site",target:"_blank",rel:"noopener noreferrer"},b=e("h2",{id:"博客资源",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#博客资源","aria-hidden":"true"},"#"),t(" 博客资源")],-1),k={href:"https://gpt-vip.top",target:"_blank",rel:"noopener noreferrer"},x=e("h2",{id:"每日热棒",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#每日热棒","aria-hidden":"true"},"#"),t(" 每日热棒")],-1),T={href:"https://dailytops.eu.org",target:"_blank",rel:"noopener noreferrer"},v=e("h2",{id:"音乐欣赏",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#音乐欣赏","aria-hidden":"true"},"#"),t(" 音乐欣赏")],-1),m={href:"https://autoaigpt.cn",target:"_blank",rel:"noopener noreferrer"},I=e("h2",{id:"互动社区",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#互动社区","aria-hidden":"true"},"#"),t(" 互动社区")],-1),y={href:"https://gpt-vip.top",target:"_blank",rel:"noopener noreferrer"},E=e("h2",{id:"结论",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#结论","aria-hidden":"true"},"#"),t(" 结论")],-1),G={href:"https://autoaigpt.cn",target:"_blank",rel:"noopener noreferrer"},P={href:"https://autoaigpt.cn",target:"_blank",rel:"noopener noreferrer"};function j(A,B){const r=o("ExternalLinkIcon");return s(),h("div",null,[p,e("p",null,[e("a",c,[t("https://autoaigpt.cn"),a(r)]),t(" 是一个多功能网站,提供快速使用GPT、万能IT工具、博客资源、每日热棒、音乐欣赏和互动等服务。该网站汇集了丰富的资源,为用户提供了广泛的信息和工具,旨在满足用户对于技术、新闻和娱乐的需求。本报告将详细介绍"),e("a",d,[t("https://autoaigpt.cn"),a(r)]),t(" 网站的各项功能和特点。")]),_,e("p",null,[e("a",l,[t("https://sensechat.vip"),a(r)]),t(" 网站提供了GPT(生成对抗网络)的快速使用功能。GPT是一种强大的人工智能技术,可以生成自然语言文本。通过"),e("a",f,[t("https://sensechat.vip"),a(r)]),t(" ,用户可以轻松输入问题或主题,并获得由GPT生成的高质量、有用的回答或文章。这项功能适用于各种应用场景,包括研究、写作、学习和解决问题等。")]),u,e("p",null,[e("a",g,[t("https://itools.site"),a(r)]),t(" 网站提供了一系列万能IT工具,旨在帮助用户解决各种技术问题和提升工作效率。这些工具包括代码转换器、数据处理工具、图像处理工具、文本处理工具等。用户可以根据自己的需求选择适当的工具,并通过简单的操作完成复杂的任务。")]),b,e("p",null,[e("a",k,[t("https://gpt-vip.top"),a(r)]),t(" 网站的博客资源栏目为用户提供了丰富的技术和行业相关文章。这些文章涵盖了各种主题,包括人工智能、数据科学、编程、网络安全、云计算等。用户可以通过阅读这些文章,获取最新的技术趋势、学习新知识和拓宽视野。")]),x,e("p",null,[e("a",T,[t("https://dailytops.eu.org"),a(r)]),t(" 网站的每日热棒栏目提供了当天最热门的新闻和热点话题。用户可以通过浏览这些内容,了解国内外的时事动态、科技进展和社会热点。每日热棒栏目保持更新,确保用户始终掌握最新的信息。")]),v,e("p",null,[e("a",m,[t("https://autoaigpt.cn"),a(r)]),t(" 网站还提供了音乐欣赏功能,用户可以在这里收听各种风格和流派的音乐。无论是放松身心、提升工作效率还是享受音乐的美妙,用户都可以在这里找到适合自己的音乐作品。")]),I,e("p",null,[e("a",y,[t("https://gpt-vip.top"),a(r)]),t(" 网站的互动社区为用户提供了交流和互动的平台。用户可以在社区中发表观点、提问问题、分享经验和结识新朋友。这个社区是一个开放、友好和知识共享的环境,让用户能够与其他用户共同成长和学习。")]),E,e("p",null,[e("a",G,[t("https://autoaigpt.cn"),a(r)]),t(" 网站是一个多功能的网站,为用户提供了GPT快速使用、万能IT工具、博客资源、每日热棒、音乐欣赏和互动社区等服务。通过这个网站,用户可以获取到丰富的资源,包括高质量的文本生成、实用的IT工具、专业的技术文章、时事热点、音乐享受和交流互动。"),e("a",P,[t("https://autoaigpt.cn"),a(r)]),t(" 致力于满足用户对于技术、新闻和娱乐的需求,为用户提供一个全方位的在线平台。")])])}const L=n(i,[["render",j],["__file","AIEnjoy.html.vue"]]);export{L as default}; +import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as s,c as h,a as e,b as t,d as a}from"./app-91ee3df5.js";const i={},p=e("h1",{id:"aienjoy",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#aienjoy","aria-hidden":"true"},"#"),t(" AiEnjoy")],-1),c={href:"https://autoaigpt.cn",target:"_blank",rel:"noopener noreferrer"},d={href:"https://autoaigpt.cn",target:"_blank",rel:"noopener noreferrer"},_=e("h2",{id:"gpt快速使用",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#gpt快速使用","aria-hidden":"true"},"#"),t(" GPT快速使用")],-1),l={href:"https://sensechat.vip",target:"_blank",rel:"noopener noreferrer"},f={href:"https://sensechat.vip",target:"_blank",rel:"noopener noreferrer"},u=e("h2",{id:"万能it工具",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#万能it工具","aria-hidden":"true"},"#"),t(" 万能IT工具")],-1),g={href:"https://itools.site",target:"_blank",rel:"noopener noreferrer"},b=e("h2",{id:"博客资源",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#博客资源","aria-hidden":"true"},"#"),t(" 博客资源")],-1),k={href:"https://gpt-vip.top",target:"_blank",rel:"noopener noreferrer"},x=e("h2",{id:"每日热棒",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#每日热棒","aria-hidden":"true"},"#"),t(" 每日热棒")],-1),T={href:"https://dailytops.eu.org",target:"_blank",rel:"noopener noreferrer"},v=e("h2",{id:"音乐欣赏",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#音乐欣赏","aria-hidden":"true"},"#"),t(" 音乐欣赏")],-1),m={href:"https://autoaigpt.cn",target:"_blank",rel:"noopener noreferrer"},I=e("h2",{id:"互动社区",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#互动社区","aria-hidden":"true"},"#"),t(" 互动社区")],-1),y={href:"https://gpt-vip.top",target:"_blank",rel:"noopener noreferrer"},E=e("h2",{id:"结论",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#结论","aria-hidden":"true"},"#"),t(" 结论")],-1),G={href:"https://autoaigpt.cn",target:"_blank",rel:"noopener noreferrer"},P={href:"https://autoaigpt.cn",target:"_blank",rel:"noopener noreferrer"};function j(A,B){const r=o("ExternalLinkIcon");return s(),h("div",null,[p,e("p",null,[e("a",c,[t("https://autoaigpt.cn"),a(r)]),t(" 是一个多功能网站,提供快速使用GPT、万能IT工具、博客资源、每日热棒、音乐欣赏和互动等服务。该网站汇集了丰富的资源,为用户提供了广泛的信息和工具,旨在满足用户对于技术、新闻和娱乐的需求。本报告将详细介绍"),e("a",d,[t("https://autoaigpt.cn"),a(r)]),t(" 网站的各项功能和特点。")]),_,e("p",null,[e("a",l,[t("https://sensechat.vip"),a(r)]),t(" 网站提供了GPT(生成对抗网络)的快速使用功能。GPT是一种强大的人工智能技术,可以生成自然语言文本。通过"),e("a",f,[t("https://sensechat.vip"),a(r)]),t(" ,用户可以轻松输入问题或主题,并获得由GPT生成的高质量、有用的回答或文章。这项功能适用于各种应用场景,包括研究、写作、学习和解决问题等。")]),u,e("p",null,[e("a",g,[t("https://itools.site"),a(r)]),t(" 网站提供了一系列万能IT工具,旨在帮助用户解决各种技术问题和提升工作效率。这些工具包括代码转换器、数据处理工具、图像处理工具、文本处理工具等。用户可以根据自己的需求选择适当的工具,并通过简单的操作完成复杂的任务。")]),b,e("p",null,[e("a",k,[t("https://gpt-vip.top"),a(r)]),t(" 网站的博客资源栏目为用户提供了丰富的技术和行业相关文章。这些文章涵盖了各种主题,包括人工智能、数据科学、编程、网络安全、云计算等。用户可以通过阅读这些文章,获取最新的技术趋势、学习新知识和拓宽视野。")]),x,e("p",null,[e("a",T,[t("https://dailytops.eu.org"),a(r)]),t(" 网站的每日热棒栏目提供了当天最热门的新闻和热点话题。用户可以通过浏览这些内容,了解国内外的时事动态、科技进展和社会热点。每日热棒栏目保持更新,确保用户始终掌握最新的信息。")]),v,e("p",null,[e("a",m,[t("https://autoaigpt.cn"),a(r)]),t(" 网站还提供了音乐欣赏功能,用户可以在这里收听各种风格和流派的音乐。无论是放松身心、提升工作效率还是享受音乐的美妙,用户都可以在这里找到适合自己的音乐作品。")]),I,e("p",null,[e("a",y,[t("https://gpt-vip.top"),a(r)]),t(" 网站的互动社区为用户提供了交流和互动的平台。用户可以在社区中发表观点、提问问题、分享经验和结识新朋友。这个社区是一个开放、友好和知识共享的环境,让用户能够与其他用户共同成长和学习。")]),E,e("p",null,[e("a",G,[t("https://autoaigpt.cn"),a(r)]),t(" 网站是一个多功能的网站,为用户提供了GPT快速使用、万能IT工具、博客资源、每日热棒、音乐欣赏和互动社区等服务。通过这个网站,用户可以获取到丰富的资源,包括高质量的文本生成、实用的IT工具、专业的技术文章、时事热点、音乐享受和交流互动。"),e("a",P,[t("https://autoaigpt.cn"),a(r)]),t(" 致力于满足用户对于技术、新闻和娱乐的需求,为用户提供一个全方位的在线平台。")])])}const L=n(i,[["render",j],["__file","AIEnjoy.html.vue"]]);export{L as default}; diff --git a/assets/AppNotes.html-d9bc8649.js b/assets/AppNotes.html-874a05f8.js similarity index 99% rename from assets/AppNotes.html-d9bc8649.js rename to assets/AppNotes.html-874a05f8.js index 3296435e..3d84021c 100644 --- a/assets/AppNotes.html-d9bc8649.js +++ b/assets/AppNotes.html-874a05f8.js @@ -1,4 +1,4 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as r,c as l,a as n,b as a,d as s,e as t}from"./app-98132e77.js";const c={},p=n("h2",{id:"小工具",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#小工具","aria-hidden":"true"},"#"),a(" 小工具")],-1),u=n("blockquote",null,[n("p",null,"收集稀奇古怪的小工具")],-1),d={href:"https://www.appinn.com/animated-drawings/",target:"_blank",rel:"noopener noreferrer"},h=n("h2",{id:"power-automate",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#power-automate","aria-hidden":"true"},"#"),a(" Power Automate")],-1),f={href:"https://sspai.com/series/273/list",target:"_blank",rel:"noopener noreferrer"},b={href:"https://make.powerautomate.com/",target:"_blank",rel:"noopener noreferrer"},k=n("strong",null,"对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。",-1),_=n("strong",null,"桌面流",-1),m={href:"https://docs.microsoft.com/zh-cn/power-automate/desktop-flows/run-pad-flow#run-desktop-flows-via-url",target:"_blank",rel:"noopener noreferrer"},g={href:"https://learn.microsoft.com/en-us/power-automate/desktop-flows/install",target:"_blank",rel:"noopener noreferrer"},v=n("strong",null,"云端流",-1),q={href:"https://www.microsoft.com/en-us/microsoft-teams/group-chat-software",target:"_blank",rel:"noopener noreferrer"},x=n("sup",{class:"footnote-ref"},[n("a",{href:"#footnote1"},"[1]"),n("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),w=t('

        与个人账户相比,组织账户仅仅多了一些按钮和试用提示,并没有明显区别。简单来说,组织账户有付费的权利,其他功能都相同。

        使用技巧

        • 遇到捕获了元素但执行时却报错的情况,可以尝试自带的记录器。它比手动选择元素要死板,钉死了要点击的元素,但能确保执行成功率。

        • 使用「循环」和「等待」实现半自动执行工作流。如果某些条件并不清晰,可通过第三方网页来设置条件,如特殊网页设置的特殊文本。[2]

        报错重置

        如果遇到程序自身的报错,点击「设置」>「应用」>「应用和功能」中找到 Power Automate Desktop 应用,并点击「重置」后试试看。

        创建 Microsoft 组织账户

        ',6),y={href:"https://partner.microsoft.com/zh-cn/",target:"_blank",rel:"noopener noreferrer"},A={href:"https://partner.microsoft.com/zh-cn/membership",target:"_blank",rel:"noopener noreferrer"},B=n("li",null,"进入后会问「你希望如何与 Microsoft 合作」,安全起见我选择「合作伙伴」,进入下一页后点「创作工作账户」。",-1),D=n("li",null,"账户信息除手机和备用邮件外可以随便填,通过手机验证码后,点「继续」,然后等几分钟,就会收到注册成功通知,你也成为有组织的人了。",-1),T={href:"https://docs.microsoft.com/zh-cn/azure/active-directory/fundamentals/active-directory-access-create-new-tenant#create-a-new-tenant-for-your-organization",target:"_blank",rel:"noopener noreferrer"},z=n("h3",{id:"管理组织用户",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#管理组织用户","aria-hidden":"true"},"#"),a(" 管理组织用户")],-1),L={href:"https://portal.azure.com/",target:"_blank",rel:"noopener noreferrer"},O=t('

        进入「管理 Azure Active Directory」>「用户」,添加和管理组织用户。

        阿里云盘

        阿里云盘不能用压缩包分享。更新文件夹时,可先上传新版文件夹,然后将内部文件移动覆盖,如此只会更新更改的文件,同时避免相同文件重命名。

        双链笔记

        @KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景:
        一、待办清单和随笔记
        待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,最近同时跟 4 个项目,深有体会;Obsidian 的 MD 语法支持很美观的待办清单,很舒服。
        二、书籍之间的联系
        很多书中,作者会推荐其他的书,那么就可以在记录读书笔记的时候,直接创建对这些推荐书的引用(得益于 obsidian 的基于引用自动创建文件,而不是只能引用现有文档),又或者一个作者有很多著作、有博客、有公众号,那么就可以给这个作者建一个单独的文档作为主页,其他著作的笔记、博客的摘录都是单独的文档,形成完整体系。
        三、跨软件,非 URL 的场景
        我的大量 PDF 文档管理在 DEVONThink,obsidian 的链接语法支持直接引用到 DEVONThink 中的文档,需要是可直接通过 OB 激活 DT 快速打开目标文档

        Logseq

        与 Obsidian 相比,Logseq 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。

        Logseq 的日记非常强大,也可以自动套用指定模板。[3] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week "journals"} 被报错。继续尝试设计周记、月报的模板。

        Logseq 劣势,所有页面建立在 pages 下,但可以手动修改位置。双链笔记有个特点,只要名称不变,文档位置更改也不会影响引用。

        Logseq 更改页面标题,会同步更改所有标签名。

        我会把远期不安排的任务,往 later 清单中放,随时可以查看提醒,但又不需要每天重复调整时间。

        主题:Dracula

        快速使用

        • [[]] 可快速新建页面,All pages 中可删除空页面
        • 打开右上角的「侧边栏」,使用目录管理主页面
        • 将页面中内容汇总起来,比如「心理学」标签页面显示所有心理学
        • 任务时,使用 later 或 now,切换后改变状态,会记录任务持续时间。
          • 如果使用 doing 或者 now 命令,它会更显眼地出现在每天日志的下方(如红框所示),以防当天记录的东西过多,或者到了第二天生成了新的日志后被忽略。直到你将它完成为止,它才会消失,算是一种强提醒。
        • PDF 文档的标注管理一直是个大难题,而用 Logseq 后方便许多,能将注释与标签、笔记、截图统合在一起。
        • TOC Generator 插件生成目录:{{renderer :tocgen}}
        • shift+左键 将新页面打开在右侧边栏中。
        • 忽略指定文件夹?

        query

        ',15),N={href:"https://www.bilibili.com/video/BV1eq4y1N7Su",target:"_blank",rel:"noopener noreferrer"},S={href:"https://docs.logseq.com/#/page/queries",target:"_blank",rel:"noopener noreferrer"},I=t(`

        首先,在文本后方添加 tag,比如

        idea 1 #idea
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as r,c as l,a as n,b as a,d as s,e as t}from"./app-91ee3df5.js";const c={},p=n("h2",{id:"小工具",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#小工具","aria-hidden":"true"},"#"),a(" 小工具")],-1),u=n("blockquote",null,[n("p",null,"收集稀奇古怪的小工具")],-1),d={href:"https://www.appinn.com/animated-drawings/",target:"_blank",rel:"noopener noreferrer"},h=n("h2",{id:"power-automate",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#power-automate","aria-hidden":"true"},"#"),a(" Power Automate")],-1),f={href:"https://sspai.com/series/273/list",target:"_blank",rel:"noopener noreferrer"},b={href:"https://make.powerautomate.com/",target:"_blank",rel:"noopener noreferrer"},k=n("strong",null,"对于免费用户来说,Power Automate 都得手动执行流,个人账户与组织账户无明显区别。",-1),_=n("strong",null,"桌面流",-1),m={href:"https://docs.microsoft.com/zh-cn/power-automate/desktop-flows/run-pad-flow#run-desktop-flows-via-url",target:"_blank",rel:"noopener noreferrer"},g={href:"https://learn.microsoft.com/en-us/power-automate/desktop-flows/install",target:"_blank",rel:"noopener noreferrer"},v=n("strong",null,"云端流",-1),q={href:"https://www.microsoft.com/en-us/microsoft-teams/group-chat-software",target:"_blank",rel:"noopener noreferrer"},x=n("sup",{class:"footnote-ref"},[n("a",{href:"#footnote1"},"[1]"),n("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),w=t('

        与个人账户相比,组织账户仅仅多了一些按钮和试用提示,并没有明显区别。简单来说,组织账户有付费的权利,其他功能都相同。

        使用技巧

        • 遇到捕获了元素但执行时却报错的情况,可以尝试自带的记录器。它比手动选择元素要死板,钉死了要点击的元素,但能确保执行成功率。

        • 使用「循环」和「等待」实现半自动执行工作流。如果某些条件并不清晰,可通过第三方网页来设置条件,如特殊网页设置的特殊文本。[2]

        报错重置

        如果遇到程序自身的报错,点击「设置」>「应用」>「应用和功能」中找到 Power Automate Desktop 应用,并点击「重置」后试试看。

        创建 Microsoft 组织账户

        ',6),y={href:"https://partner.microsoft.com/zh-cn/",target:"_blank",rel:"noopener noreferrer"},A={href:"https://partner.microsoft.com/zh-cn/membership",target:"_blank",rel:"noopener noreferrer"},B=n("li",null,"进入后会问「你希望如何与 Microsoft 合作」,安全起见我选择「合作伙伴」,进入下一页后点「创作工作账户」。",-1),D=n("li",null,"账户信息除手机和备用邮件外可以随便填,通过手机验证码后,点「继续」,然后等几分钟,就会收到注册成功通知,你也成为有组织的人了。",-1),T={href:"https://docs.microsoft.com/zh-cn/azure/active-directory/fundamentals/active-directory-access-create-new-tenant#create-a-new-tenant-for-your-organization",target:"_blank",rel:"noopener noreferrer"},z=n("h3",{id:"管理组织用户",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#管理组织用户","aria-hidden":"true"},"#"),a(" 管理组织用户")],-1),L={href:"https://portal.azure.com/",target:"_blank",rel:"noopener noreferrer"},O=t('

        进入「管理 Azure Active Directory」>「用户」,添加和管理组织用户。

        阿里云盘

        阿里云盘不能用压缩包分享。更新文件夹时,可先上传新版文件夹,然后将内部文件移动覆盖,如此只会更新更改的文件,同时避免相同文件重命名。

        双链笔记

        @KurokoZ 个人认为双链笔记的核心不是一个单纯跳转的链接,而是在于“引用”和思路的延续性。举几个场景:
        一、待办清单和随笔记
        待办清单是一个时序化的任务 list,一个任务可能来自一次会议记录、老板临时的发言、一个产品调研 等等,每一个任务背后的原始文档可以很复杂,但任务本身可以记录的很简洁,特别是多线程的任务处理,这样的溯源非常有用,最近同时跟 4 个项目,深有体会;Obsidian 的 MD 语法支持很美观的待办清单,很舒服。
        二、书籍之间的联系
        很多书中,作者会推荐其他的书,那么就可以在记录读书笔记的时候,直接创建对这些推荐书的引用(得益于 obsidian 的基于引用自动创建文件,而不是只能引用现有文档),又或者一个作者有很多著作、有博客、有公众号,那么就可以给这个作者建一个单独的文档作为主页,其他著作的笔记、博客的摘录都是单独的文档,形成完整体系。
        三、跨软件,非 URL 的场景
        我的大量 PDF 文档管理在 DEVONThink,obsidian 的链接语法支持直接引用到 DEVONThink 中的文档,需要是可直接通过 OB 激活 DT 快速打开目标文档

        Logseq

        与 Obsidian 相比,Logseq 罗列内容更方便。Logseq 将所有行都视为节点,因此非常轻松将所需的子节点整合在一个页面,实现关键信息聚合。

        Logseq 的日记非常强大,也可以自动套用指定模板。[3] 但其他笔记需要手动启用模板,修改 .env 的设置 {:week "journals"} 被报错。继续尝试设计周记、月报的模板。

        Logseq 劣势,所有页面建立在 pages 下,但可以手动修改位置。双链笔记有个特点,只要名称不变,文档位置更改也不会影响引用。

        Logseq 更改页面标题,会同步更改所有标签名。

        我会把远期不安排的任务,往 later 清单中放,随时可以查看提醒,但又不需要每天重复调整时间。

        主题:Dracula

        快速使用

        • [[]] 可快速新建页面,All pages 中可删除空页面
        • 打开右上角的「侧边栏」,使用目录管理主页面
        • 将页面中内容汇总起来,比如「心理学」标签页面显示所有心理学
        • 任务时,使用 later 或 now,切换后改变状态,会记录任务持续时间。
          • 如果使用 doing 或者 now 命令,它会更显眼地出现在每天日志的下方(如红框所示),以防当天记录的东西过多,或者到了第二天生成了新的日志后被忽略。直到你将它完成为止,它才会消失,算是一种强提醒。
        • PDF 文档的标注管理一直是个大难题,而用 Logseq 后方便许多,能将注释与标签、笔记、截图统合在一起。
        • TOC Generator 插件生成目录:{{renderer :tocgen}}
        • shift+左键 将新页面打开在右侧边栏中。
        • 忽略指定文件夹?

        query

        ',15),N={href:"https://www.bilibili.com/video/BV1eq4y1N7Su",target:"_blank",rel:"noopener noreferrer"},S={href:"https://docs.logseq.com/#/page/queries",target:"_blank",rel:"noopener noreferrer"},I=t(`

        首先,在文本后方添加 tag,比如

        idea 1 #idea
         find #research
         

        接着,使用 query 命令寻找对应结果

        * and 命令
         {{query (and [[research]] [[idea]])}}
        diff --git a/assets/Applist.html-392c7cbc.js b/assets/Applist.html-c9f99c7e.js
        similarity index 99%
        rename from assets/Applist.html-392c7cbc.js
        rename to assets/Applist.html-c9f99c7e.js
        index 5055d592..e85f405a 100644
        --- a/assets/Applist.html-392c7cbc.js
        +++ b/assets/Applist.html-c9f99c7e.js
        @@ -1 +1 @@
        -import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as l,c as a,a as e,b as t,d as o,e as i}from"./app-98132e77.js";const h={},_=e("p",null,"Windows 自用软件,以开源软件为主。",-1),c=e("h2",{id:"知识记录",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#知识记录","aria-hidden":"true"},"#"),t(" 知识记录")],-1),p=e("p",null,[t("本地笔记:Logseq & Obsidian & 妙笔 & Joplin "),e("s",null,"& Wiz 笔记 & OneNote")],-1),d=e("p",null,"在线笔记:Notion & 飞书 & flomo & Airtable & 简悦",-1),u=e("p",null,[t("清单日历:滴答清单 & Trello & Habitify & 桌面日历 "),e("s",null,"& Workflowy")],-1),f={href:"https://github.com/L-M-Sherlock/sm18-lazy-package/releases/tag/1.1.3",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/kopia/kopia",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/marktext/marktext",target:"_blank",rel:"noopener noreferrer"},k={href:"https://github.com/inkTimeRecord/TTime",target:"_blank",rel:"noopener noreferrer"},m=e("s",null,"& 天若 OCR & ABBYY Screenshot Reader OCR",-1),w=e("h2",{id:"平面设计",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#平面设计","aria-hidden":"true"},"#"),t(" 平面设计")],-1),y={href:"https://github.com/SVG-Edit/svgedit",target:"_blank",rel:"noopener noreferrer"},S={href:"https://gpt-vip.top/posts/2022-09-05-stable_diffusion_ai_painting.html",target:"_blank",rel:"noopener noreferrer"},v=e("s",null,"& GIMP & FastStone & illustrator & Dreamweaver & lightroom",-1),T=e("p",null,[t("截图:Snipaste & ShareX "),e("s",null,"& webshot & SETUNA")],-1),C=e("p",null,[t("图像管理:Honeyview & Eagle & PicGo 图床 "),e("s",null,"& imageglass(界面好,但不支持全图拖拽和压缩包预览图片) & Google 相册 & 看图王 & 呱呱看图")],-1),x={href:"http://luci.criosweb.ro/riot/",target:"_blank",rel:"noopener noreferrer"},A=e("s",null,"& 智图",-1),P=e("h2",{id:"音频视频",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#音频视频","aria-hidden":"true"},"#"),t(" 音频视频")],-1),M={href:"http://tieba.baidu.com/p/4434445880",target:"_blank",rel:"noopener noreferrer"},D={href:"https://www.cnblogs.com/vinlxc/p/11347744.html",target:"_blank",rel:"noopener noreferrer"},F={href:"https://github.com/jitwxs/163MusicLyrics",target:"_blank",rel:"noopener noreferrer"},B={href:"https://github.com/lyswhut/lx-music-desktop",target:"_blank",rel:"noopener noreferrer"},R=e("s",null,"& 百度音乐 & AIMP3 & 酷我 K 歌 & Airplay",-1),W={href:"https://sspai.com/post/76677",target:"_blank",rel:"noopener noreferrer"},L={href:"https://github.com/audacity/audacity/releases",target:"_blank",rel:"noopener noreferrer"},V=e("s",null,"& Audition & 神舌变声器 & Goldwave",-1),I={href:"https://zhuanlan.zhihu.com/p/35757176",target:"_blank",rel:"noopener noreferrer"},E={href:"https://github.com/Nevcairiel/LAVFilters/releases",target:"_blank",rel:"noopener noreferrer"},O={href:"http://www.madvr.com/",target:"_blank",rel:"noopener noreferrer"},U=e("s",null,"& 恒星播放器 & QQ 影音 & 暴风影音 & 射手",-1),N={href:"https://www.likecs.com/show-204327094.html",target:"_blank",rel:"noopener noreferrer"},G={href:"https://shana.pe.kr/shanaencoder_download/",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://github.com/HaujetZhao/QuickCut",target:"_blank",rel:"noopener noreferrer"},z=e("s",null,"& Shotcut & 500th Video Converter & 小丸工具箱",-1),H={href:"https://github.com/xiaoxinpro/ChineseSubtitleConversionTool",target:"_blank",rel:"noopener noreferrer"},X={href:"https://github.com/wxbool/video-srt-windows",target:"_blank",rel:"noopener noreferrer"},K={href:"https://github.com/ytdl-org/youtube-dl",target:"_blank",rel:"noopener noreferrer"},q={href:"https://github.com/leiurayer/downkyi",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/nilaoda/BBDown",target:"_blank",rel:"noopener noreferrer"},Y=e("p",null,"影视管理:tinyMediaManager(刮削),易影视(本地管理)",-1),Z=e("h2",{id:"屏幕录制",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#屏幕录制","aria-hidden":"true"},"#"),t(" 屏幕录制")],-1),J={href:"https://github.com/MathewSachin/Captura/releases",target:"_blank",rel:"noopener noreferrer"},$={href:"https://splitcam.com/",target:"_blank",rel:"noopener noreferrer"},ee={href:"https://github.com/faressoft/terminalizer",target:"_blank",rel:"noopener noreferrer"},te={href:"https://www.screentogif.com/",target:"_blank",rel:"noopener noreferrer"},re=e("s",null,"& FlashBack Express",-1),oe={href:"https://github.com/alievk/avatarify",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://github.com/Code52/carnac",target:"_blank",rel:"noopener noreferrer"},se={href:"https://github.com/mulaRahul/keyviz",target:"_blank",rel:"noopener noreferrer"},le={href:"https://github.com/cuiliang/ClickShow",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/brookhong/KeyCastOW",target:"_blank",rel:"noopener noreferrer"},ie={href:"https://gpt-vip.top/posts/2019-08-26-scrcpy_screen_projection.html",target:"_blank",rel:"noopener noreferrer"},he={href:"https://gitee.com/xfangfang/Macast/releases/",target:"_blank",rel:"noopener noreferrer"},_e=e("h2",{id:"效率工具",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#效率工具","aria-hidden":"true"},"#"),t(" 效率工具")],-1),ce=e("p",null,"快速启动:",-1),pe=e("li",null,"Quicker:脚本,全局手势",-1),de=e("li",null,"RunAny:指针快捷启动;一键打开网址、文件路径",-1),ue={href:"https://capslox.com/capslock-plus/#basicFunctions",target:"_blank",rel:"noopener noreferrer"},fe={href:"https://www.yuque.com/lucy/lucy/record",target:"_blank",rel:"noopener noreferrer"},be=e("s",null,"、Rolan、nTrun (Win 键启动)",-1),ge=e("li",null,[t("启动栏:Listary "),e("s",null,"、uTolls、Wox")],-1),ke=e("p",null,[t("剪切板:Ditto & PinStack "),e("s",null,"& CopyQ")],-1),me=e("p",null,[t("时间管理:ManicTime "),e("s",null,"& Toggl Track & RescueTime(订阅)")],-1),we={href:"https://github.com/ssssssss-team/spider-flow",target:"_blank",rel:"noopener noreferrer"},ye={href:"https://github.com/Chaoses-Ib/IbEverythingExt",target:"_blank",rel:"noopener noreferrer"},Se=e("s",null,"& DocFetcher & Archivarius 3000",-1),ve=e("h2",{id:"文档管理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#文档管理","aria-hidden":"true"},"#"),t(" 文档管理")],-1),Te={href:"https://github.com/qwqcode/SubRenamer",target:"_blank",rel:"noopener noreferrer"},Ce=e("s",null,"& ReNamer & Bulk Rename Utility & 拖把更名器",-1),xe={href:"https://github.com/WinMerge/winmerge",target:"_blank",rel:"noopener noreferrer"},Ae={href:"http://fastcopy.jp/",target:"_blank",rel:"noopener noreferrer"},Pe={href:"https://meta.appinn.net/t/topic/31209/1",target:"_blank",rel:"noopener noreferrer"},Me={href:"https://www.appinn.com/localsend/",target:"_blank",rel:"noopener noreferrer"},De=e("s",null,"& 局域网通讯 (酷安) & Send Anywhere & Pushbullet",-1),Fe={href:"http://www.dropitproject.com/",target:"_blank",rel:"noopener noreferrer"},Be={href:"https://www.appinn.com/droppoint/",target:"_blank",rel:"noopener noreferrer"},Re={href:"https://gist.github.com/Nerver4Ever/953447c9ecd330ffc0861d4cbb839369",target:"_blank",rel:"noopener noreferrer"},We=e("s",null,"& 亿方云 & 金山快盘 & 微云",-1),Le=e("h2",{id:"系统日常",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#系统日常","aria-hidden":"true"},"#"),t(" 系统日常")],-1),Ve={href:"https://www.onecommander.com/",target:"_blank",rel:"noopener noreferrer"},Ie={href:"https://www.softwareok.com/?seite=Freeware/Q-Dir",target:"_blank",rel:"noopener noreferrer"},Ee=e("s",null,"& 360 文件夹 & Clover(UI 不好看)",-1),Oe=e("p",null,[t("浏览器:Chrome & Firefox(资源) & Brave(工具/书签) & Edge(移动端) & Tor "),e("s",null,"& Vivaldi & Tor & 猎豹 & 360 & 搜狗 & Maxthon & 百度")],-1),Ue=e("p",null,[t("输入法:小狼毫 & "),e("code",null,"Win+H"),t("(系统语音输入)"),e("s",null,"& QuickCut & 讯飞语记 & 微软输入法 & 影子输入法 & 搜狗输入法 & 讯飞输入法 & 百度输入法")],-1),Ne={href:"https://github.com/huiyadanli/RevokeMsgPatcher",target:"_blank",rel:"noopener noreferrer"},Ge=e("s",null,"& Slack & 钉耙 & 千牛 & 阿里旺旺",-1),Qe={href:"https://gpt-vip.top/posts/2018-05-15-aria2_a_new_download_tool.html",target:"_blank",rel:"noopener noreferrer"},ze={href:"https://baidu.kinh.cc/",target:"_blank",rel:"noopener noreferrer"},He=e("s",null,"& FDM(不支持 ed2k、磁力) & 迅雷",-1),Xe=e("p",null,[t("杀毒:火绒 "),e("s",null,"& 360 & 金山卫士")],-1),Ke=e("p",null,[t("压缩:Bandizip "),e("s",null,"& PeaZip & 好压")],-1),qe=e("p",null,[t("PDF:PDFelement "),e("s",null,"& 文电通 & foxit 领鲜版(轻量编辑 PDF)")],-1),je={href:"https://openhardwaremonitor.org/downloads/",target:"_blank",rel:"noopener noreferrer"},Ye={href:"https://www.msi.com/Landing/afterburner/graphics-cards",target:"_blank",rel:"noopener noreferrer"},Ze={href:"http://www.tbtool.cn/",target:"_blank",rel:"noopener noreferrer"},Je=e("s",null,"& SDI Snappy & 驱动精灵 & 鲁大师",-1),$e={href:"https://github.com/microsoft/PowerToys/releases/latest",target:"_blank",rel:"noopener noreferrer"},et={href:"https://github.com/benbuck/rbtray",target:"_blank",rel:"noopener noreferrer"},tt={href:"https://github.com/BluePointLilac/ContextMenuManager",target:"_blank",rel:"noopener noreferrer"},rt={href:"https://www.oo-software.com/en/shutup10",target:"_blank",rel:"noopener noreferrer"},ot={href:"https://www.sordum.org/downloads/?st-windows-update-blocker",target:"_blank",rel:"noopener noreferrer"},nt=e("h2",{id:"低频工具",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#低频工具","aria-hidden":"true"},"#"),t(" 低频工具")],-1),st={href:"https://kalacloud.com/blog/best-mysql-gui-tools/",target:"_blank",rel:"noopener noreferrer"},lt=e("p",null,[t("翻译词典:DeepL "),e("s",null,"& GoldenDict & 欧陆词典 & 有道词典 & QTranslate & Lingoes")],-1),at=e("p",null,[t("思维导图:TheBrain(无限思维扩展) & Xmind "),e("s",null,"& MindManager")],-1),it=e("p",null,"虚拟机:VMware & VirtualBox",-1),ht=e("p",null,[t("远程管理:RustDesk & ToDesk "),e("s",null,"& AnyDesk & Teamviewer & Remote Utilities & XT800")],-1),_t=e("p",null,[t("卸载清理:IObit Uninstaller & Glary Utilities(注册表清理) "),e("s",null,"& Geek Uninstaller")],-1),ct={href:"https://hovancik.net/stretchly/downloads/",target:"_blank",rel:"noopener noreferrer"},pt=e("s",null,"& EyeLoveU & iris & f.luxS",-1),dt={href:"http://www.12306bypass.com/",target:"_blank",rel:"noopener noreferrer"},ut={href:"https://www.ventoy.net/cn/index.html",target:"_blank",rel:"noopener noreferrer"},ft={href:"https://www.disktool.cn/",target:"_blank",rel:"noopener noreferrer"},bt=i('

        飞书妙记:倍速、跳过空白片段、字幕搜索定位视频,将视频(最长 4 小时)转为文字大纲,了解视频梗概,建立基础认知。等到自己上手实操的时候,遇到问题直接搜索文字定位到相关内容,再看文字对应的视频截图确定配置细节。如果视频过大,可以提取音频来上传。[1]

        开源工具

        ',2),gt={href:"https://github.com/openai/whisper",target:"_blank",rel:"noopener noreferrer"},kt={href:"https://github.com/Const-me/Whisper",target:"_blank",rel:"noopener noreferrer"},mt={href:"https://github.com/sczhou/CodeFormer",target:"_blank",rel:"noopener noreferrer"},wt={href:"https://github.com/mli/autocut",target:"_blank",rel:"noopener noreferrer"},yt={href:"https://developer.nvidia.com/cuda-toolkit-archive",target:"_blank",rel:"noopener noreferrer"},St={href:"https://pytorch.org/get-started/locally/",target:"_blank",rel:"noopener noreferrer"},vt={href:"https://github.com/lllyasviel/style2paints",target:"_blank",rel:"noopener noreferrer"},Tt={href:"https://github.com/uncle-novel/uncle-novel",target:"_blank",rel:"noopener noreferrer"},Ct={href:"https://doc.voce.chat/zh-cn/",target:"_blank",rel:"noopener noreferrer"},xt=e("h2",{id:"android",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#android","aria-hidden":"true"},"#"),t(" Android")],-1),At={href:"https://github.com/gkd-kit/gkd",target:"_blank",rel:"noopener noreferrer"},Pt={href:"https://github.com/yuliskov/SmartTubeNext",target:"_blank",rel:"noopener noreferrer"},Mt={href:"https://github.com/BlueMatthew/WechatExporter",target:"_blank",rel:"noopener noreferrer"},Dt={href:"https://github.com/kkevsekk1/AutoX",target:"_blank",rel:"noopener noreferrer"},Ft={href:"https://sspai.com/post/65863",target:"_blank",rel:"noopener noreferrer"},Bt=e("hr",null,null,-1),Rt=e("h2",{id:"已弃",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#已弃","aria-hidden":"true"},"#"),t(" 已弃")],-1),Wt={href:"https://meta.appinn.net/t/topic/29815",target:"_blank",rel:"noopener noreferrer"},Lt=e("li",null,"桌面管理:Fences 3 & 火萤视频桌面 & UPUPOO & 360 桌面助手 & 搜狗桌面 & Q+",-1),Vt=e("li",null,"进程管理:Process Lasso(避免老电脑卡顿?会自动删除启动项,不适合主力电脑)& Security Process Explorer(屏蔽垃圾进程)",-1),It=e("li",null,"文件夹锁定/隐藏:Anvide Lock Folder",-1),Et=e("li",null,"桌面便签:小黄条、URNotes 意唯桌面便签 (2015 停止更新,复制经常出错)",-1),Ot=e("li",null,"网络电台:龙卷风",-1),Ut=e("li",null,"英文写作:易改",-1),Nt=e("li",null,"流量管理:cFosSpeed",-1),Gt=e("li",null,"游戏平台:VS & 4399",-1),Qt={href:"https://github.com/mamoe/mirai",target:"_blank",rel:"noopener noreferrer"},zt=e("li",null,"其他:按键精灵、DisplayCal(屏幕)、One Quik(虚拟桌面切换)、Auslogics Disk Defrag(磁盘整理)、Reflector 3(手机投屏)、VoiceBot(声控游戏)",-1),Ht={href:"http://dogbean.ysepan.com/",target:"_blank",rel:"noopener noreferrer"},Xt=e("p",null,"部分应用推荐来自 @vector090。",-1),Kt=e("hr",{class:"footnotes-sep"},null,-1),qt={class:"footnotes"},jt={class:"footnotes-list"},Yt={id:"footnote1",class:"footnote-item"},Zt={href:"https://sspai.com/post/70960",target:"_blank",rel:"noopener noreferrer"},Jt=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function $t(er,tr){const r=s("ExternalLinkIcon");return l(),a("div",null,[_,c,p,d,u,e("p",null,[t("记忆复习:思源笔记 "),e("s",null,[t("& "),e("a",f,[t("SuperMemo"),o(r)]),t(" & "),e("a",b,[t("kopia"),o(r)]),t("(备份) & Anki")])]),e("p",null,[t("文本编辑:Visual Studio Code & Notepad++ & HbuilderX & WPS & office tab "),e("s",null,[t("& "),e("a",g,[t("MarkText"),o(r)]),t(" & Slide & 方方格子 & Typora & Yu Writer & UltraEdit")])]),e("p",null,[t("文字识别:"),e("a",k,[t("TTime"),o(r)]),t(" & 白描 "),m]),w,e("p",null,[t("设计:Figma & "),e("a",y,[t("SVG-Editor"),o(r)]),t(" & "),e("a",S,[t("Stable Diffusion"),o(r)]),t("(AI 绘图) & Photoshop & 字由 "),v]),T,C,e("p",null,[t("图像处理:PP 鸭(免费版单次 10 张)& gifski(动图)& "),e("a",x,[t("RIOT"),o(r)]),t("(压缩) & Inpaint(去水印) & PhotoZoom(无损放大) "),A]),P,e("p",null,[t("音频播放:foobar2000("),e("a",M,[t("MKing 皮肤"),o(r)]),t(")& "),e("a",D,[t("MusicTag"),o(r)]),t(" & "),e("a",F,[t("163MusicLyrics"),o(r)]),t("(云歌词下载,支持日文转罗马音)& Listen1 & "),e("a",B,[t("洛雪音乐助手"),o(r)]),t(" & Moon FM(播客) "),R]),e("p",null,[t("音频处理:"),e("a",W,[t("Reaper+ Ultraschall"),o(r)]),t(" & "),e("a",L,[t("Audacity"),o(r)]),t(" & iZotope rx9 "),V]),e("p",null,[t("视频播放:"),e("a",I,[t("Potplayer"),o(r)]),t(" & "),e("a",E,[t("LAVFilters"),o(r)]),t(" & "),e("a",O,[t("madVR"),o(r)]),t(" & XySubFilter & VLC "),U,t(",播放器设置参考 "),e("a",N,[t("Potplayer + LAVFilters + madVR 配置教程"),o(r)])]),e("p",null,[t("视频剪辑:剪映 & LosslessCut(音频提取·视频切割合并) & "),e("a",G,[t("ShanaEncoder"),o(r)]),t("(视频压缩) & "),e("a",Q,[t("Quick Cut"),o(r)]),t(" (自动剪辑) & HandBrake(视频转换) & Premiere "),z]),e("p",null,[t("字幕工具:"),e("a",H,[t("ChineseSubtitleConversionTool"),o(r)]),t("(繁简转换)& Arctime Pro & "),e("a",X,[t("VideoSrt"),o(r)]),t(" & 人人译视界")]),e("p",null,[t("视频下载:"),e("a",K,[t("youtube-dl"),o(r)]),t(" & "),e("a",q,[t("哔哩下载姬"),o(r)]),t(" & "),e("a",j,[t("BBDown"),o(r)]),t("(命令行式哔哩哔哩下载器)")]),Y,Z,e("p",null,[t("录屏直播:OBS & "),e("a",J,[t("Captura"),o(r)]),t(" & "),e("a",$,[t("SplitCam"),o(r)]),t(" (摄像头多开) & "),e("a",ee,[t("terminalizer"),o(r)]),t("(终端录制) & "),e("a",te,[t("ScreenToGif"),o(r)]),t(),re]),e("p",null,[t("换脸特效:Snap Camera(操作简单) & "),e("a",oe,[t("Avatarify Python"),o(r)])]),e("p",null,[t("按键可视化:"),e("a",ne,[t("Carnac"),o(r)]),t(" & "),e("a",se,[t("Keyviz"),o(r)]),t(" & "),e("a",le,[t("ClickShow"),o(r)]),t(" & "),e("a",ae,[t("KeyCastOW"),o(r)])]),e("p",null,[t("投屏工具:"),e("a",ie,[t("scrcpy"),o(r)]),t(" (手机投屏) & "),e("a",he,[t("Macast"),o(r)]),t("(手机视频投屏到电脑)& 蓝莓投屏")]),_e,ce,e("ul",null,[pe,de,e("li",null,[t("热键工具:Fn-PowerKey、"),e("a",ue,[t("CapsLock+"),o(r)])]),e("li",null,[t("图标启动:"),e("a",fe,[t("Lucy 快速启动"),o(r)]),t(),be]),ge]),ke,me,e("p",null,[t("爬虫监测:OpenWebMonitor & "),e("a",we,[t("spider-flow"),o(r)])]),e("p",null,[t("本地搜索:Everything("),e("a",ye,[t("拼音扩展"),o(r)]),t(") & AnyTXT Searcher(全文|OCR)"),Se]),ve,e("p",null,[t("重命名:FFRenamePro & "),e("a",Te,[t("SubRenamer"),o(r)]),t("(字幕批量重命名)"),Ce]),e("p",null,[t("文本比较:Beyond Compare & "),e("a",xe,[t("WinMerge"),o(r)]),t("(开源)")]),e("p",null,[t("局域网传输:"),e("a",Ae,[t("FastCopy"),o(r)]),t(" & "),e("a",Pe,[t("Snapdrop"),o(r)]),t(" & "),e("a",Me,[t("LocalSend"),o(r)]),t(),De]),e("p",null,[t("文件归档:Syncthing(异地同步) & GoodSync(同设备同步) & "),e("a",Fe,[t("Dropit"),o(r)]),t("(自动文件归档) & "),e("a",Be,[t("DropPoint"),o(r)]),t("(复制中转框)")]),e("p",null,[t("网盘同步:坚果云 & 阿里云盘 & 百度网盘 & 115 ("),e("a",Re,[t("转存脚本"),o(r)]),t(") "),We]),Le,e("p",null,[t("资源管理器:"),e("a",Ve,[t("One Commander"),o(r)]),t(" & "),e("a",Ie,[t("Q-Dir"),o(r)]),t(" & FreeCommander & QTTabBar(Win10) "),Ee]),Oe,Ue,e("p",null,[t("通讯:TIM & 微信 & 飞书 & Telegram & Discord & "),e("a",Ne,[t("腾讯防撤回补丁"),o(r)]),t(),Ge]),e("p",null,[t("下载:"),e("a",Qe,[t("Aria2"),o(r)]),t(" & IDM & "),e("a",ze,[t("Kinhdown"),o(r)]),t("(百度云解析) "),He]),Xe,Ke,qe,e("p",null,[t("硬件驱动:360 驱动大师 & "),e("a",je,[t("Open Hardware Monitor"),o(r)]),t("(旧电脑风扇转速) & "),e("a",Ye,[t("Afterburner"),o(r)]),t("(显卡风扇转速) & "),e("a",Ze,[t("图吧硬件工具箱"),o(r)]),t(" & AIDA64 "),Je]),e("p",null,[t("系统优化:"),e("a",$e,[t("PowerToys"),o(r)]),t("、"),e("a",et,[t("RBTray"),o(r)]),t("(最小化到托盘)、"),e("a",tt,[t("ContextMenuManager"),o(r)]),t("(右键管理,遇过 bug,推荐火绒右键)、WizTree(磁盘空间分析)、优效日历、StartIsBack++、"),e("a",rt,[t("O&O ShutUp10++"),o(r)]),t("、Dism++、"),e("a",ot,[t("Windows Update Blocker"),o(r)]),t("(禁止更新)")]),nt,e("p",null,[t("编程工具:FileZilla(FTP)、PuTTY(SSH)、MobaXTerm(SSH)、GitHubDesktop、DBeaver("),e("a",st,[t("数据库"),o(r)]),t(")、Postman、Fiddler(手机抓包)、Regex Match Tracer")]),lt,at,it,ht,_t,e("p",null,[t("护眼健康:"),e("a",ct,[t("Stretchly"),o(r)]),t(),pt]),e("p",null,[t("偶尔使用:VeraCrypt(本地加密)、Recuva(文件恢复)、"),e("a",dt,[t("12306Bypass"),o(r)]),t("、爱思助手、Bluestacks(安卓模拟器)、"),e("a",ut,[t("Ventoy"),o(r)]),t("(制作可启动 U 盘)、微 PE 工具箱、"),e("a",ft,[t("傲梅分区"),o(r)])]),bt,e("ul",null,[e("li",null,[e("a",gt,[t("Whipser"),o(r)]),t(":自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。")]),e("li",null,[e("a",kt,[t("Whisper Desktop"),o(r)]),t(":Windows 本地音频转录的开源工具,支持音视频转录字幕,并且能够从麦克风捕获、转录或翻译实时音频。")]),e("li",null,[e("a",mt,[t("CodeFormer"),o(r)]),t(":使用 AI 算法修复图像和视频中的人脸。注意:路径与文件名不能出现中文。")]),e("li",null,[e("a",wt,[t("AutoCut"),o(r)]),t(":通过字幕来剪切视频 "),e("ul",null,[e("li",null,[e("a",yt,[t("CUDA Toolkit"),o(r)]),t(":CUDA 的工具安装包,将 N 卡用于 AI 模型相关应用。")]),e("li",null,[e("a",St,[t("PyTorch"),o(r)]),t(":开源的 Python 机器学习库,用于自然语言处理等应用程序。")])])]),e("li",null,[e("a",vt,[t("style2paints"),o(r)]),t(":一款给线稿上色的 AI 辅助工具。能够帮助用户给没有上色的图片,快速完成上色的 AI 工具,上色效果广受好评,完全免费开箱即用。")]),e("li",null,[e("a",Tt,[t("uncle-novel"),o(r)]),t(":一个全网小说下载器及阅读器,可部署在 PC 和安卓上,目录解析与书源结合,支持有声小说与文本小说,可下载 mobi、epub、txt 格式文本小说。")]),e("li",null,[e("a",Ct,[t("VoceChat"),o(r)]),t(":可以部署在网页的轻型客服系统?是否有其他开源选项。")])]),xt,e("ul",null,[e("li",null,[e("a",At,[t("GKD"),o(r)]),t(":手机端去广告的开源利器,可以点击跳过任意开屏广告/点击关闭应用内部任意弹窗广告,如关闭百度贴吧帖子广告卡片/知乎回答底部推荐广告卡片。")]),e("li",null,[e("a",Pt,[t("SmartTubeNext"),o(r)]),t(":电视盒子上的去广告版 YouTube。")]),e("li",null,[e("a",Mt,[t("WechatExporter"),o(r)]),t(":微信记录导出,仅限 iOS 手机。安卓和 PC 端微信都加密,无法导出查看。")]),e("li",null,[e("a",Dt,[t("AutoX"),o(r)]),t(":开源版的 Auto.js,没有包名屏蔽。相关信息可以参考 "),e("a",Ft,[t("快人一步:使用 Tasker+AutoX 一键直达健康码"),o(r)]),t("。")])]),Bt,Rt,e("ul",null,[e("li",null,[t("全局手势:"),e("a",Wt,[t("StrokesPlus.net"),o(r)]),t(" & WGestures")]),Lt,Vt,It,Et,Ot,Ut,Nt,Gt,e("li",null,[t("客服:飞豆客服聊天助手 & "),e("a",Qt,[t("mirai(qq 机器人)"),o(r)]),t(" & 酷 Q(已关)")]),zt,e("li",null,[e("a",Ht,[t("DockIt"),o(r)]),t(":主显示屏中,非全屏状态下,快速将窗口局部化。如何默认不全屏;应用不自动吸边?")])]),Xt,Kt,e("section",qt,[e("ol",jt,[e("li",Yt,[e("p",null,[e("a",Zt,[t("视频课程学习留档"),o(r)]),t(),Jt])])])])])}const nr=n(h,[["render",$t],["__file","Applist.html.vue"]]);export{nr as default}; +import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as l,c as a,a as e,b as t,d as o,e as i}from"./app-91ee3df5.js";const h={},_=e("p",null,"Windows 自用软件,以开源软件为主。",-1),c=e("h2",{id:"知识记录",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#知识记录","aria-hidden":"true"},"#"),t(" 知识记录")],-1),p=e("p",null,[t("本地笔记:Logseq & Obsidian & 妙笔 & Joplin "),e("s",null,"& Wiz 笔记 & OneNote")],-1),d=e("p",null,"在线笔记:Notion & 飞书 & flomo & Airtable & 简悦",-1),u=e("p",null,[t("清单日历:滴答清单 & Trello & Habitify & 桌面日历 "),e("s",null,"& Workflowy")],-1),f={href:"https://github.com/L-M-Sherlock/sm18-lazy-package/releases/tag/1.1.3",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/kopia/kopia",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/marktext/marktext",target:"_blank",rel:"noopener noreferrer"},k={href:"https://github.com/inkTimeRecord/TTime",target:"_blank",rel:"noopener noreferrer"},m=e("s",null,"& 天若 OCR & ABBYY Screenshot Reader OCR",-1),w=e("h2",{id:"平面设计",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#平面设计","aria-hidden":"true"},"#"),t(" 平面设计")],-1),y={href:"https://github.com/SVG-Edit/svgedit",target:"_blank",rel:"noopener noreferrer"},S={href:"https://gpt-vip.top/posts/2022-09-05-stable_diffusion_ai_painting.html",target:"_blank",rel:"noopener noreferrer"},v=e("s",null,"& GIMP & FastStone & illustrator & Dreamweaver & lightroom",-1),T=e("p",null,[t("截图:Snipaste & ShareX "),e("s",null,"& webshot & SETUNA")],-1),C=e("p",null,[t("图像管理:Honeyview & Eagle & PicGo 图床 "),e("s",null,"& imageglass(界面好,但不支持全图拖拽和压缩包预览图片) & Google 相册 & 看图王 & 呱呱看图")],-1),x={href:"http://luci.criosweb.ro/riot/",target:"_blank",rel:"noopener noreferrer"},A=e("s",null,"& 智图",-1),P=e("h2",{id:"音频视频",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#音频视频","aria-hidden":"true"},"#"),t(" 音频视频")],-1),M={href:"http://tieba.baidu.com/p/4434445880",target:"_blank",rel:"noopener noreferrer"},D={href:"https://www.cnblogs.com/vinlxc/p/11347744.html",target:"_blank",rel:"noopener noreferrer"},F={href:"https://github.com/jitwxs/163MusicLyrics",target:"_blank",rel:"noopener noreferrer"},B={href:"https://github.com/lyswhut/lx-music-desktop",target:"_blank",rel:"noopener noreferrer"},R=e("s",null,"& 百度音乐 & AIMP3 & 酷我 K 歌 & Airplay",-1),W={href:"https://sspai.com/post/76677",target:"_blank",rel:"noopener noreferrer"},L={href:"https://github.com/audacity/audacity/releases",target:"_blank",rel:"noopener noreferrer"},V=e("s",null,"& Audition & 神舌变声器 & Goldwave",-1),I={href:"https://zhuanlan.zhihu.com/p/35757176",target:"_blank",rel:"noopener noreferrer"},E={href:"https://github.com/Nevcairiel/LAVFilters/releases",target:"_blank",rel:"noopener noreferrer"},O={href:"http://www.madvr.com/",target:"_blank",rel:"noopener noreferrer"},U=e("s",null,"& 恒星播放器 & QQ 影音 & 暴风影音 & 射手",-1),N={href:"https://www.likecs.com/show-204327094.html",target:"_blank",rel:"noopener noreferrer"},G={href:"https://shana.pe.kr/shanaencoder_download/",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://github.com/HaujetZhao/QuickCut",target:"_blank",rel:"noopener noreferrer"},z=e("s",null,"& Shotcut & 500th Video Converter & 小丸工具箱",-1),H={href:"https://github.com/xiaoxinpro/ChineseSubtitleConversionTool",target:"_blank",rel:"noopener noreferrer"},X={href:"https://github.com/wxbool/video-srt-windows",target:"_blank",rel:"noopener noreferrer"},K={href:"https://github.com/ytdl-org/youtube-dl",target:"_blank",rel:"noopener noreferrer"},q={href:"https://github.com/leiurayer/downkyi",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/nilaoda/BBDown",target:"_blank",rel:"noopener noreferrer"},Y=e("p",null,"影视管理:tinyMediaManager(刮削),易影视(本地管理)",-1),Z=e("h2",{id:"屏幕录制",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#屏幕录制","aria-hidden":"true"},"#"),t(" 屏幕录制")],-1),J={href:"https://github.com/MathewSachin/Captura/releases",target:"_blank",rel:"noopener noreferrer"},$={href:"https://splitcam.com/",target:"_blank",rel:"noopener noreferrer"},ee={href:"https://github.com/faressoft/terminalizer",target:"_blank",rel:"noopener noreferrer"},te={href:"https://www.screentogif.com/",target:"_blank",rel:"noopener noreferrer"},re=e("s",null,"& FlashBack Express",-1),oe={href:"https://github.com/alievk/avatarify",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://github.com/Code52/carnac",target:"_blank",rel:"noopener noreferrer"},se={href:"https://github.com/mulaRahul/keyviz",target:"_blank",rel:"noopener noreferrer"},le={href:"https://github.com/cuiliang/ClickShow",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/brookhong/KeyCastOW",target:"_blank",rel:"noopener noreferrer"},ie={href:"https://gpt-vip.top/posts/2019-08-26-scrcpy_screen_projection.html",target:"_blank",rel:"noopener noreferrer"},he={href:"https://gitee.com/xfangfang/Macast/releases/",target:"_blank",rel:"noopener noreferrer"},_e=e("h2",{id:"效率工具",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#效率工具","aria-hidden":"true"},"#"),t(" 效率工具")],-1),ce=e("p",null,"快速启动:",-1),pe=e("li",null,"Quicker:脚本,全局手势",-1),de=e("li",null,"RunAny:指针快捷启动;一键打开网址、文件路径",-1),ue={href:"https://capslox.com/capslock-plus/#basicFunctions",target:"_blank",rel:"noopener noreferrer"},fe={href:"https://www.yuque.com/lucy/lucy/record",target:"_blank",rel:"noopener noreferrer"},be=e("s",null,"、Rolan、nTrun (Win 键启动)",-1),ge=e("li",null,[t("启动栏:Listary "),e("s",null,"、uTolls、Wox")],-1),ke=e("p",null,[t("剪切板:Ditto & PinStack "),e("s",null,"& CopyQ")],-1),me=e("p",null,[t("时间管理:ManicTime "),e("s",null,"& Toggl Track & RescueTime(订阅)")],-1),we={href:"https://github.com/ssssssss-team/spider-flow",target:"_blank",rel:"noopener noreferrer"},ye={href:"https://github.com/Chaoses-Ib/IbEverythingExt",target:"_blank",rel:"noopener noreferrer"},Se=e("s",null,"& DocFetcher & Archivarius 3000",-1),ve=e("h2",{id:"文档管理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#文档管理","aria-hidden":"true"},"#"),t(" 文档管理")],-1),Te={href:"https://github.com/qwqcode/SubRenamer",target:"_blank",rel:"noopener noreferrer"},Ce=e("s",null,"& ReNamer & Bulk Rename Utility & 拖把更名器",-1),xe={href:"https://github.com/WinMerge/winmerge",target:"_blank",rel:"noopener noreferrer"},Ae={href:"http://fastcopy.jp/",target:"_blank",rel:"noopener noreferrer"},Pe={href:"https://meta.appinn.net/t/topic/31209/1",target:"_blank",rel:"noopener noreferrer"},Me={href:"https://www.appinn.com/localsend/",target:"_blank",rel:"noopener noreferrer"},De=e("s",null,"& 局域网通讯 (酷安) & Send Anywhere & Pushbullet",-1),Fe={href:"http://www.dropitproject.com/",target:"_blank",rel:"noopener noreferrer"},Be={href:"https://www.appinn.com/droppoint/",target:"_blank",rel:"noopener noreferrer"},Re={href:"https://gist.github.com/Nerver4Ever/953447c9ecd330ffc0861d4cbb839369",target:"_blank",rel:"noopener noreferrer"},We=e("s",null,"& 亿方云 & 金山快盘 & 微云",-1),Le=e("h2",{id:"系统日常",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#系统日常","aria-hidden":"true"},"#"),t(" 系统日常")],-1),Ve={href:"https://www.onecommander.com/",target:"_blank",rel:"noopener noreferrer"},Ie={href:"https://www.softwareok.com/?seite=Freeware/Q-Dir",target:"_blank",rel:"noopener noreferrer"},Ee=e("s",null,"& 360 文件夹 & Clover(UI 不好看)",-1),Oe=e("p",null,[t("浏览器:Chrome & Firefox(资源) & Brave(工具/书签) & Edge(移动端) & Tor "),e("s",null,"& Vivaldi & Tor & 猎豹 & 360 & 搜狗 & Maxthon & 百度")],-1),Ue=e("p",null,[t("输入法:小狼毫 & "),e("code",null,"Win+H"),t("(系统语音输入)"),e("s",null,"& QuickCut & 讯飞语记 & 微软输入法 & 影子输入法 & 搜狗输入法 & 讯飞输入法 & 百度输入法")],-1),Ne={href:"https://github.com/huiyadanli/RevokeMsgPatcher",target:"_blank",rel:"noopener noreferrer"},Ge=e("s",null,"& Slack & 钉耙 & 千牛 & 阿里旺旺",-1),Qe={href:"https://gpt-vip.top/posts/2018-05-15-aria2_a_new_download_tool.html",target:"_blank",rel:"noopener noreferrer"},ze={href:"https://baidu.kinh.cc/",target:"_blank",rel:"noopener noreferrer"},He=e("s",null,"& FDM(不支持 ed2k、磁力) & 迅雷",-1),Xe=e("p",null,[t("杀毒:火绒 "),e("s",null,"& 360 & 金山卫士")],-1),Ke=e("p",null,[t("压缩:Bandizip "),e("s",null,"& PeaZip & 好压")],-1),qe=e("p",null,[t("PDF:PDFelement "),e("s",null,"& 文电通 & foxit 领鲜版(轻量编辑 PDF)")],-1),je={href:"https://openhardwaremonitor.org/downloads/",target:"_blank",rel:"noopener noreferrer"},Ye={href:"https://www.msi.com/Landing/afterburner/graphics-cards",target:"_blank",rel:"noopener noreferrer"},Ze={href:"http://www.tbtool.cn/",target:"_blank",rel:"noopener noreferrer"},Je=e("s",null,"& SDI Snappy & 驱动精灵 & 鲁大师",-1),$e={href:"https://github.com/microsoft/PowerToys/releases/latest",target:"_blank",rel:"noopener noreferrer"},et={href:"https://github.com/benbuck/rbtray",target:"_blank",rel:"noopener noreferrer"},tt={href:"https://github.com/BluePointLilac/ContextMenuManager",target:"_blank",rel:"noopener noreferrer"},rt={href:"https://www.oo-software.com/en/shutup10",target:"_blank",rel:"noopener noreferrer"},ot={href:"https://www.sordum.org/downloads/?st-windows-update-blocker",target:"_blank",rel:"noopener noreferrer"},nt=e("h2",{id:"低频工具",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#低频工具","aria-hidden":"true"},"#"),t(" 低频工具")],-1),st={href:"https://kalacloud.com/blog/best-mysql-gui-tools/",target:"_blank",rel:"noopener noreferrer"},lt=e("p",null,[t("翻译词典:DeepL "),e("s",null,"& GoldenDict & 欧陆词典 & 有道词典 & QTranslate & Lingoes")],-1),at=e("p",null,[t("思维导图:TheBrain(无限思维扩展) & Xmind "),e("s",null,"& MindManager")],-1),it=e("p",null,"虚拟机:VMware & VirtualBox",-1),ht=e("p",null,[t("远程管理:RustDesk & ToDesk "),e("s",null,"& AnyDesk & Teamviewer & Remote Utilities & XT800")],-1),_t=e("p",null,[t("卸载清理:IObit Uninstaller & Glary Utilities(注册表清理) "),e("s",null,"& Geek Uninstaller")],-1),ct={href:"https://hovancik.net/stretchly/downloads/",target:"_blank",rel:"noopener noreferrer"},pt=e("s",null,"& EyeLoveU & iris & f.luxS",-1),dt={href:"http://www.12306bypass.com/",target:"_blank",rel:"noopener noreferrer"},ut={href:"https://www.ventoy.net/cn/index.html",target:"_blank",rel:"noopener noreferrer"},ft={href:"https://www.disktool.cn/",target:"_blank",rel:"noopener noreferrer"},bt=i('

        飞书妙记:倍速、跳过空白片段、字幕搜索定位视频,将视频(最长 4 小时)转为文字大纲,了解视频梗概,建立基础认知。等到自己上手实操的时候,遇到问题直接搜索文字定位到相关内容,再看文字对应的视频截图确定配置细节。如果视频过大,可以提取音频来上传。[1]

        开源工具

        ',2),gt={href:"https://github.com/openai/whisper",target:"_blank",rel:"noopener noreferrer"},kt={href:"https://github.com/Const-me/Whisper",target:"_blank",rel:"noopener noreferrer"},mt={href:"https://github.com/sczhou/CodeFormer",target:"_blank",rel:"noopener noreferrer"},wt={href:"https://github.com/mli/autocut",target:"_blank",rel:"noopener noreferrer"},yt={href:"https://developer.nvidia.com/cuda-toolkit-archive",target:"_blank",rel:"noopener noreferrer"},St={href:"https://pytorch.org/get-started/locally/",target:"_blank",rel:"noopener noreferrer"},vt={href:"https://github.com/lllyasviel/style2paints",target:"_blank",rel:"noopener noreferrer"},Tt={href:"https://github.com/uncle-novel/uncle-novel",target:"_blank",rel:"noopener noreferrer"},Ct={href:"https://doc.voce.chat/zh-cn/",target:"_blank",rel:"noopener noreferrer"},xt=e("h2",{id:"android",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#android","aria-hidden":"true"},"#"),t(" Android")],-1),At={href:"https://github.com/gkd-kit/gkd",target:"_blank",rel:"noopener noreferrer"},Pt={href:"https://github.com/yuliskov/SmartTubeNext",target:"_blank",rel:"noopener noreferrer"},Mt={href:"https://github.com/BlueMatthew/WechatExporter",target:"_blank",rel:"noopener noreferrer"},Dt={href:"https://github.com/kkevsekk1/AutoX",target:"_blank",rel:"noopener noreferrer"},Ft={href:"https://sspai.com/post/65863",target:"_blank",rel:"noopener noreferrer"},Bt=e("hr",null,null,-1),Rt=e("h2",{id:"已弃",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#已弃","aria-hidden":"true"},"#"),t(" 已弃")],-1),Wt={href:"https://meta.appinn.net/t/topic/29815",target:"_blank",rel:"noopener noreferrer"},Lt=e("li",null,"桌面管理:Fences 3 & 火萤视频桌面 & UPUPOO & 360 桌面助手 & 搜狗桌面 & Q+",-1),Vt=e("li",null,"进程管理:Process Lasso(避免老电脑卡顿?会自动删除启动项,不适合主力电脑)& Security Process Explorer(屏蔽垃圾进程)",-1),It=e("li",null,"文件夹锁定/隐藏:Anvide Lock Folder",-1),Et=e("li",null,"桌面便签:小黄条、URNotes 意唯桌面便签 (2015 停止更新,复制经常出错)",-1),Ot=e("li",null,"网络电台:龙卷风",-1),Ut=e("li",null,"英文写作:易改",-1),Nt=e("li",null,"流量管理:cFosSpeed",-1),Gt=e("li",null,"游戏平台:VS & 4399",-1),Qt={href:"https://github.com/mamoe/mirai",target:"_blank",rel:"noopener noreferrer"},zt=e("li",null,"其他:按键精灵、DisplayCal(屏幕)、One Quik(虚拟桌面切换)、Auslogics Disk Defrag(磁盘整理)、Reflector 3(手机投屏)、VoiceBot(声控游戏)",-1),Ht={href:"http://dogbean.ysepan.com/",target:"_blank",rel:"noopener noreferrer"},Xt=e("p",null,"部分应用推荐来自 @vector090。",-1),Kt=e("hr",{class:"footnotes-sep"},null,-1),qt={class:"footnotes"},jt={class:"footnotes-list"},Yt={id:"footnote1",class:"footnote-item"},Zt={href:"https://sspai.com/post/70960",target:"_blank",rel:"noopener noreferrer"},Jt=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function $t(er,tr){const r=s("ExternalLinkIcon");return l(),a("div",null,[_,c,p,d,u,e("p",null,[t("记忆复习:思源笔记 "),e("s",null,[t("& "),e("a",f,[t("SuperMemo"),o(r)]),t(" & "),e("a",b,[t("kopia"),o(r)]),t("(备份) & Anki")])]),e("p",null,[t("文本编辑:Visual Studio Code & Notepad++ & HbuilderX & WPS & office tab "),e("s",null,[t("& "),e("a",g,[t("MarkText"),o(r)]),t(" & Slide & 方方格子 & Typora & Yu Writer & UltraEdit")])]),e("p",null,[t("文字识别:"),e("a",k,[t("TTime"),o(r)]),t(" & 白描 "),m]),w,e("p",null,[t("设计:Figma & "),e("a",y,[t("SVG-Editor"),o(r)]),t(" & "),e("a",S,[t("Stable Diffusion"),o(r)]),t("(AI 绘图) & Photoshop & 字由 "),v]),T,C,e("p",null,[t("图像处理:PP 鸭(免费版单次 10 张)& gifski(动图)& "),e("a",x,[t("RIOT"),o(r)]),t("(压缩) & Inpaint(去水印) & PhotoZoom(无损放大) "),A]),P,e("p",null,[t("音频播放:foobar2000("),e("a",M,[t("MKing 皮肤"),o(r)]),t(")& "),e("a",D,[t("MusicTag"),o(r)]),t(" & "),e("a",F,[t("163MusicLyrics"),o(r)]),t("(云歌词下载,支持日文转罗马音)& Listen1 & "),e("a",B,[t("洛雪音乐助手"),o(r)]),t(" & Moon FM(播客) "),R]),e("p",null,[t("音频处理:"),e("a",W,[t("Reaper+ Ultraschall"),o(r)]),t(" & "),e("a",L,[t("Audacity"),o(r)]),t(" & iZotope rx9 "),V]),e("p",null,[t("视频播放:"),e("a",I,[t("Potplayer"),o(r)]),t(" & "),e("a",E,[t("LAVFilters"),o(r)]),t(" & "),e("a",O,[t("madVR"),o(r)]),t(" & XySubFilter & VLC "),U,t(",播放器设置参考 "),e("a",N,[t("Potplayer + LAVFilters + madVR 配置教程"),o(r)])]),e("p",null,[t("视频剪辑:剪映 & LosslessCut(音频提取·视频切割合并) & "),e("a",G,[t("ShanaEncoder"),o(r)]),t("(视频压缩) & "),e("a",Q,[t("Quick Cut"),o(r)]),t(" (自动剪辑) & HandBrake(视频转换) & Premiere "),z]),e("p",null,[t("字幕工具:"),e("a",H,[t("ChineseSubtitleConversionTool"),o(r)]),t("(繁简转换)& Arctime Pro & "),e("a",X,[t("VideoSrt"),o(r)]),t(" & 人人译视界")]),e("p",null,[t("视频下载:"),e("a",K,[t("youtube-dl"),o(r)]),t(" & "),e("a",q,[t("哔哩下载姬"),o(r)]),t(" & "),e("a",j,[t("BBDown"),o(r)]),t("(命令行式哔哩哔哩下载器)")]),Y,Z,e("p",null,[t("录屏直播:OBS & "),e("a",J,[t("Captura"),o(r)]),t(" & "),e("a",$,[t("SplitCam"),o(r)]),t(" (摄像头多开) & "),e("a",ee,[t("terminalizer"),o(r)]),t("(终端录制) & "),e("a",te,[t("ScreenToGif"),o(r)]),t(),re]),e("p",null,[t("换脸特效:Snap Camera(操作简单) & "),e("a",oe,[t("Avatarify Python"),o(r)])]),e("p",null,[t("按键可视化:"),e("a",ne,[t("Carnac"),o(r)]),t(" & "),e("a",se,[t("Keyviz"),o(r)]),t(" & "),e("a",le,[t("ClickShow"),o(r)]),t(" & "),e("a",ae,[t("KeyCastOW"),o(r)])]),e("p",null,[t("投屏工具:"),e("a",ie,[t("scrcpy"),o(r)]),t(" (手机投屏) & "),e("a",he,[t("Macast"),o(r)]),t("(手机视频投屏到电脑)& 蓝莓投屏")]),_e,ce,e("ul",null,[pe,de,e("li",null,[t("热键工具:Fn-PowerKey、"),e("a",ue,[t("CapsLock+"),o(r)])]),e("li",null,[t("图标启动:"),e("a",fe,[t("Lucy 快速启动"),o(r)]),t(),be]),ge]),ke,me,e("p",null,[t("爬虫监测:OpenWebMonitor & "),e("a",we,[t("spider-flow"),o(r)])]),e("p",null,[t("本地搜索:Everything("),e("a",ye,[t("拼音扩展"),o(r)]),t(") & AnyTXT Searcher(全文|OCR)"),Se]),ve,e("p",null,[t("重命名:FFRenamePro & "),e("a",Te,[t("SubRenamer"),o(r)]),t("(字幕批量重命名)"),Ce]),e("p",null,[t("文本比较:Beyond Compare & "),e("a",xe,[t("WinMerge"),o(r)]),t("(开源)")]),e("p",null,[t("局域网传输:"),e("a",Ae,[t("FastCopy"),o(r)]),t(" & "),e("a",Pe,[t("Snapdrop"),o(r)]),t(" & "),e("a",Me,[t("LocalSend"),o(r)]),t(),De]),e("p",null,[t("文件归档:Syncthing(异地同步) & GoodSync(同设备同步) & "),e("a",Fe,[t("Dropit"),o(r)]),t("(自动文件归档) & "),e("a",Be,[t("DropPoint"),o(r)]),t("(复制中转框)")]),e("p",null,[t("网盘同步:坚果云 & 阿里云盘 & 百度网盘 & 115 ("),e("a",Re,[t("转存脚本"),o(r)]),t(") "),We]),Le,e("p",null,[t("资源管理器:"),e("a",Ve,[t("One Commander"),o(r)]),t(" & "),e("a",Ie,[t("Q-Dir"),o(r)]),t(" & FreeCommander & QTTabBar(Win10) "),Ee]),Oe,Ue,e("p",null,[t("通讯:TIM & 微信 & 飞书 & Telegram & Discord & "),e("a",Ne,[t("腾讯防撤回补丁"),o(r)]),t(),Ge]),e("p",null,[t("下载:"),e("a",Qe,[t("Aria2"),o(r)]),t(" & IDM & "),e("a",ze,[t("Kinhdown"),o(r)]),t("(百度云解析) "),He]),Xe,Ke,qe,e("p",null,[t("硬件驱动:360 驱动大师 & "),e("a",je,[t("Open Hardware Monitor"),o(r)]),t("(旧电脑风扇转速) & "),e("a",Ye,[t("Afterburner"),o(r)]),t("(显卡风扇转速) & "),e("a",Ze,[t("图吧硬件工具箱"),o(r)]),t(" & AIDA64 "),Je]),e("p",null,[t("系统优化:"),e("a",$e,[t("PowerToys"),o(r)]),t("、"),e("a",et,[t("RBTray"),o(r)]),t("(最小化到托盘)、"),e("a",tt,[t("ContextMenuManager"),o(r)]),t("(右键管理,遇过 bug,推荐火绒右键)、WizTree(磁盘空间分析)、优效日历、StartIsBack++、"),e("a",rt,[t("O&O ShutUp10++"),o(r)]),t("、Dism++、"),e("a",ot,[t("Windows Update Blocker"),o(r)]),t("(禁止更新)")]),nt,e("p",null,[t("编程工具:FileZilla(FTP)、PuTTY(SSH)、MobaXTerm(SSH)、GitHubDesktop、DBeaver("),e("a",st,[t("数据库"),o(r)]),t(")、Postman、Fiddler(手机抓包)、Regex Match Tracer")]),lt,at,it,ht,_t,e("p",null,[t("护眼健康:"),e("a",ct,[t("Stretchly"),o(r)]),t(),pt]),e("p",null,[t("偶尔使用:VeraCrypt(本地加密)、Recuva(文件恢复)、"),e("a",dt,[t("12306Bypass"),o(r)]),t("、爱思助手、Bluestacks(安卓模拟器)、"),e("a",ut,[t("Ventoy"),o(r)]),t("(制作可启动 U 盘)、微 PE 工具箱、"),e("a",ft,[t("傲梅分区"),o(r)])]),bt,e("ul",null,[e("li",null,[e("a",gt,[t("Whipser"),o(r)]),t(":自动语音识别应用,除了可以用于语音识别,Whisper 还能实现多种语言的转录,以及将这些语言翻译成英语。或通过 Clipchamp 识别各种字幕。")]),e("li",null,[e("a",kt,[t("Whisper Desktop"),o(r)]),t(":Windows 本地音频转录的开源工具,支持音视频转录字幕,并且能够从麦克风捕获、转录或翻译实时音频。")]),e("li",null,[e("a",mt,[t("CodeFormer"),o(r)]),t(":使用 AI 算法修复图像和视频中的人脸。注意:路径与文件名不能出现中文。")]),e("li",null,[e("a",wt,[t("AutoCut"),o(r)]),t(":通过字幕来剪切视频 "),e("ul",null,[e("li",null,[e("a",yt,[t("CUDA Toolkit"),o(r)]),t(":CUDA 的工具安装包,将 N 卡用于 AI 模型相关应用。")]),e("li",null,[e("a",St,[t("PyTorch"),o(r)]),t(":开源的 Python 机器学习库,用于自然语言处理等应用程序。")])])]),e("li",null,[e("a",vt,[t("style2paints"),o(r)]),t(":一款给线稿上色的 AI 辅助工具。能够帮助用户给没有上色的图片,快速完成上色的 AI 工具,上色效果广受好评,完全免费开箱即用。")]),e("li",null,[e("a",Tt,[t("uncle-novel"),o(r)]),t(":一个全网小说下载器及阅读器,可部署在 PC 和安卓上,目录解析与书源结合,支持有声小说与文本小说,可下载 mobi、epub、txt 格式文本小说。")]),e("li",null,[e("a",Ct,[t("VoceChat"),o(r)]),t(":可以部署在网页的轻型客服系统?是否有其他开源选项。")])]),xt,e("ul",null,[e("li",null,[e("a",At,[t("GKD"),o(r)]),t(":手机端去广告的开源利器,可以点击跳过任意开屏广告/点击关闭应用内部任意弹窗广告,如关闭百度贴吧帖子广告卡片/知乎回答底部推荐广告卡片。")]),e("li",null,[e("a",Pt,[t("SmartTubeNext"),o(r)]),t(":电视盒子上的去广告版 YouTube。")]),e("li",null,[e("a",Mt,[t("WechatExporter"),o(r)]),t(":微信记录导出,仅限 iOS 手机。安卓和 PC 端微信都加密,无法导出查看。")]),e("li",null,[e("a",Dt,[t("AutoX"),o(r)]),t(":开源版的 Auto.js,没有包名屏蔽。相关信息可以参考 "),e("a",Ft,[t("快人一步:使用 Tasker+AutoX 一键直达健康码"),o(r)]),t("。")])]),Bt,Rt,e("ul",null,[e("li",null,[t("全局手势:"),e("a",Wt,[t("StrokesPlus.net"),o(r)]),t(" & WGestures")]),Lt,Vt,It,Et,Ot,Ut,Nt,Gt,e("li",null,[t("客服:飞豆客服聊天助手 & "),e("a",Qt,[t("mirai(qq 机器人)"),o(r)]),t(" & 酷 Q(已关)")]),zt,e("li",null,[e("a",Ht,[t("DockIt"),o(r)]),t(":主显示屏中,非全屏状态下,快速将窗口局部化。如何默认不全屏;应用不自动吸边?")])]),Xt,Kt,e("section",qt,[e("ol",jt,[e("li",Yt,[e("p",null,[e("a",Zt,[t("视频课程学习留档"),o(r)]),t(),Jt])])])])])}const nr=n(h,[["render",$t],["__file","Applist.html.vue"]]);export{nr as default}; diff --git a/assets/AutoHotkey.html-bb84ecc0.js b/assets/AutoHotkey.html-0343f6df.js similarity index 99% rename from assets/AutoHotkey.html-bb84ecc0.js rename to assets/AutoHotkey.html-0343f6df.js index 75f1060e..c54f637d 100644 --- a/assets/AutoHotkey.html-bb84ecc0.js +++ b/assets/AutoHotkey.html-0343f6df.js @@ -1,4 +1,4 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o as c,c as l,a as n,b as s,d as e,e as t}from"./app-98132e77.js";const i={},r=n("p",null,"AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。",-1),u={href:"https://wyagd001.github.io/v2/docs",target:"_blank",rel:"noopener noreferrer"},d={href:"https://wyagd001.github.io/v2/docs/KeyList.htm",target:"_blank",rel:"noopener noreferrer"},k={href:"https://wyagd001.github.io/v2/docs/Variables.htm#BuiltIn",target:"_blank",rel:"noopener noreferrer"},m={href:"https://www.macrocreator.com/download/",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/papple23g/ahkcompiler",target:"_blank",rel:"noopener noreferrer"},h=n("thead",null,[n("tr",null,[n("th",null,"符号"),n("th",null,"作用")])],-1),b=n("tr",null,[n("td",null,"#"),n("td",null,"Win 键")],-1),g=n("tr",null,[n("td",null,"!"),n("td",null,"Alt 键")],-1),_=n("tr",null,[n("td",null,"^"),n("td",null,"Ctrl 键")],-1),y=n("tr",null,[n("td",null,"+"),n("td",null,"Shift 键")],-1),f=n("td",null,"`",-1),x={href:"https://wyagd001.github.io/v2/docs/misc/EscapeChar.htm",target:"_blank",rel:"noopener noreferrer"},w=n("tr",null,[n("td",null,";"),n("td",null,"代表注释内容,不影响函数")],-1),A=n("tr",null,[n("td",null,"::"),n("td",null,"(两个英文冒号),代表分隔")],-1),S=t('

        注意事项

        • AHK 中不区分大小写,即 run 和 RUN 没有区别。
        • 非热键情况,添加 return,脚本全部停止。
        • 脚本需考虑,你是想要在全局还是局部中激活动作。

        常用方法

        托盘图标

        自定义图标可使用 ico 或 png,不支持 svg 格式。

        托盘图标设置命令为 Menu, Tray, Icon, %A_WorkingDir%\\dock_panel.png%A_WorkingDir% 代表脚本所在目录。

        ',6),C={href:"https://github.com/AutoHotkey/Ahk2Exe/releases",target:"_blank",rel:"noopener noreferrer"},D=n("h3",{id:"执行-powershell",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#执行-powershell","aria-hidden":"true"},"#"),s(" 执行 PowerShell")],-1),E={href:"https://learn.microsoft.com/zh-cn/powershell/scripting/learn/ps101/01-getting-started",target:"_blank",rel:"noopener noreferrer"},W=t(`
        # Run, powershell.exe -NoExit -Command &{命令}, 目录
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o as c,c as l,a as n,b as s,d as e,e as t}from"./app-91ee3df5.js";const i={},r=n("p",null,"AutoHotkey 是 Windows 平台下开源的热键脚本语言。AHK 学习门槛不高,初期可以通过脚本录制来完成,我通过 AHK 热键启动、定时判断、改键盘等多种自动化操作,推荐学习制作你的专属自动化脚本。",-1),u={href:"https://wyagd001.github.io/v2/docs",target:"_blank",rel:"noopener noreferrer"},d={href:"https://wyagd001.github.io/v2/docs/KeyList.htm",target:"_blank",rel:"noopener noreferrer"},k={href:"https://wyagd001.github.io/v2/docs/Variables.htm#BuiltIn",target:"_blank",rel:"noopener noreferrer"},m={href:"https://www.macrocreator.com/download/",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/papple23g/ahkcompiler",target:"_blank",rel:"noopener noreferrer"},h=n("thead",null,[n("tr",null,[n("th",null,"符号"),n("th",null,"作用")])],-1),b=n("tr",null,[n("td",null,"#"),n("td",null,"Win 键")],-1),g=n("tr",null,[n("td",null,"!"),n("td",null,"Alt 键")],-1),_=n("tr",null,[n("td",null,"^"),n("td",null,"Ctrl 键")],-1),y=n("tr",null,[n("td",null,"+"),n("td",null,"Shift 键")],-1),f=n("td",null,"`",-1),x={href:"https://wyagd001.github.io/v2/docs/misc/EscapeChar.htm",target:"_blank",rel:"noopener noreferrer"},w=n("tr",null,[n("td",null,";"),n("td",null,"代表注释内容,不影响函数")],-1),A=n("tr",null,[n("td",null,"::"),n("td",null,"(两个英文冒号),代表分隔")],-1),S=t('

        注意事项

        • AHK 中不区分大小写,即 run 和 RUN 没有区别。
        • 非热键情况,添加 return,脚本全部停止。
        • 脚本需考虑,你是想要在全局还是局部中激活动作。

        常用方法

        托盘图标

        自定义图标可使用 ico 或 png,不支持 svg 格式。

        托盘图标设置命令为 Menu, Tray, Icon, %A_WorkingDir%\\dock_panel.png%A_WorkingDir% 代表脚本所在目录。

        ',6),C={href:"https://github.com/AutoHotkey/Ahk2Exe/releases",target:"_blank",rel:"noopener noreferrer"},D=n("h3",{id:"执行-powershell",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#执行-powershell","aria-hidden":"true"},"#"),s(" 执行 PowerShell")],-1),E={href:"https://learn.microsoft.com/zh-cn/powershell/scripting/learn/ps101/01-getting-started",target:"_blank",rel:"noopener noreferrer"},W=t(`
        # Run, powershell.exe -NoExit -Command &{命令}, 目录
         Run, powershell.exe -NoExit -Command &{npm version patch}, D:\\Backup
         

        问题

        激发热键后按键未释放

        Send, ^!+w 指代热键 Ctrl+Alt+Shift+W,有时辅助热键未正确释放,会导致激发热键后输入有问题。

        函数结尾加一行 Send, {Ctrl up}{Alt up}{Shift up} 即可解决该问题。

        隐藏在托盘程序无法监测

        WinExist 只能查看签订程序,对于后台或托盘程序,可以用 Process 命令来检查是否存在指定程序的 PID。

        ;晚上8点停止录屏,并精简视频
         if (A_Hour == 20 && Stop_Record ==0){ ;如果小时等于20点
        diff --git a/assets/ChatGPT.html-b805ce1c.js b/assets/ChatGPT.html-021874d1.js
        similarity index 99%
        rename from assets/ChatGPT.html-b805ce1c.js
        rename to assets/ChatGPT.html-021874d1.js
        index becc5e9c..81397a0d 100644
        --- a/assets/ChatGPT.html-b805ce1c.js
        +++ b/assets/ChatGPT.html-021874d1.js
        @@ -1 +1 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as s,c as l,a as t,b as e,d as a}from"./app-98132e77.js";const h={},i={href:"https://shortcutai.eu.org/",target:"_blank",rel:"noopener noreferrer"},c=t("h2",{id:"chatgpt-客户端",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#chatgpt-客户端","aria-hidden":"true"},"#"),e(" ChatGPT 客户端")],-1),p=t("p",null,"主要使用以下几个工具:",-1),g={href:"https://github.com/Bin-Huang/chatbox",target:"_blank",rel:"noopener noreferrer"},m={href:"https://sensechat.vip",target:"_blank",rel:"noopener noreferrer"},_={href:"https://aiauth.top",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/lencx/ChatGPT/releases",target:"_blank",rel:"noopener noreferrer"},u={href:"https://beta.openai.com/playground",target:"_blank",rel:"noopener noreferrer"},d=t("p",null,"第三方 API 客户端的优势:",-1),b=t("ul",null,[t("li",null,"费用低:ChatGPT Plus 包月费用是 20 美元,平均而言每天需要 0.67 美元。相比之下,API 的费用每 1000 个 tokens 仅为 0.002 美元。这意味着,我使用 API 的话,每天可以使用 300 次 ChatGPT,而我每天实际也就只需要 100 次。"),t("li",null,"限制少:API 限制相较于 ChatGPT 网页版也要少得多,最大 token 数量为 4096 个,而网页版仅有 2048 个。需要注意的是,提问和对话的所有文本内容都包括在 token 数量内。"),t("li",null,"可移动性:ChatGPT 网页版对 IP 非常严格,使用人数多的服务商 IP 大多被封禁。与此相比,API 的限制要少得多,而且可以部署网页版,方便外出使用。")],-1),k=t("h2",{id:"chatgpt-tips",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#chatgpt-tips","aria-hidden":"true"},"#"),e(" ChatGPT Tips")],-1),w=t("li",null,[e("若要使用中文回复,请在倒数第二句插入条件 "),t("code",null,"Respond in Chinese."),e("。")],-1),P=t("li",null,"为了保持描述的精确性,提示词请使用英文,而最后一句的定制条件可以使用任何语言,包括中文。",-1),C=t("li",null,[e("后续回答中的定制条件可以使用引号 "),t("code",null,'""'),e(" 框选,以防止被误认为是新的提示词。")],-1),v=t("strong",null,"解答数学问题",-1),y={href:"https://www.wolframalpha.com/",target:"_blank",rel:"noopener noreferrer"},x=t("li",null,[e("ChatGPT Plus 目前不支持国内信用卡,偶尔出现过限流。 "),t("ul",null,[t("li",null,"Depoy 虚拟卡:仅支持 USDT 充值,需通过 KYC 实名认证,月费 1 USD,充值费率为 1.35%(Min 1USD)。"),t("li",null,"VCC 虚拟卡:无需实名,开卡费 66 元,有效期一年,包一年代充。ChatGPT Plus 月费为 20 美元,按汇率折算人民币为 136 元,但商家实际收取 150 元,差价相当于支付了月费。")])],-1),T=t("h2",{id:"learn-prompting",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#learn-prompting","aria-hidden":"true"},"#"),e(" Learn Prompting")],-1),I={href:"https://learnprompting.org/",target:"_blank",rel:"noopener noreferrer"},A=t("ul",null,[t("li",null,"在专业领域中,应尽量提供 Role Prompting(角色提示),比如「你是数学家」。"),t("li",null,"Prompt Debiasing(消除偏差):样本在提示中的分布和顺序可能会对 LLM 输出产生偏差。因此,样本选项应该均匀分布,并穿插出现。"),t("li",null,[e("Chain of Thought Prompting(思维链提示,CoT)是指指在样本中解释推理过程。LLM(大规模语言模型,比如 ChatGPT)在回答提示时会显示推理过程,这种对推理的解释通常会提升结果的准确性。例如,数学题中 LLM 提供的推理过程不对,你可以在 Prompt 中提供该步正确的范例。 "),t("ul",null,[t("li",null,[e("添加 "),t("code",null,"Let's think step by step"),e(" 可以让我们了解模型是如何逐步推理问题的,在算术、常识和符号推理任务中能有效改善结果。这个方法被称为 Zero Shot Chain of Thought,是 CoT 的简化替代版。")]),t("li",null,"Self-Consistency(自我一致性)产生多个思维链而不仅仅是一个,然后以多数回答作为最终答案。")])])],-1),S={class:"hint-container info"},G=t("p",{class:"hint-container-title"},"相关信息",-1),D={href:"https://shortcutai.eu.org/",target:"_blank",rel:"noopener noreferrer"},L=t("h2",{id:"文字",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#文字","aria-hidden":"true"},"#"),e(" 文字")],-1),M=t("h3",{id:"写作",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#写作","aria-hidden":"true"},"#"),e(" 写作")],-1),E={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-stand-up-comedian",target:"_blank",rel:"noopener noreferrer"},B={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-storyteller",target:"_blank",rel:"noopener noreferrer"},R={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-screenwriter",target:"_blank",rel:"noopener noreferrer"},F={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-novelist",target:"_blank",rel:"noopener noreferrer"},H={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-poet",target:"_blank",rel:"noopener noreferrer"},N={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-journalist",target:"_blank",rel:"noopener noreferrer"},O={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-academician",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-essay-writer",target:"_blank",rel:"noopener noreferrer"},V={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-cover-letter",target:"_blank",rel:"noopener noreferrer"},W=t("h3",{id:"点评-评鉴",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#点评-评鉴","aria-hidden":"true"},"#"),e(" 点评/评鉴")],-1),U={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-commentariat",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-movie-critic",target:"_blank",rel:"noopener noreferrer"},J={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-film-critic",target:"_blank",rel:"noopener noreferrer"},q={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tech-writer",target:"_blank",rel:"noopener noreferrer"},K={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tech-reviewer",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-food-critic",target:"_blank",rel:"noopener noreferrer"},z={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-journal-reviewer",target:"_blank",rel:"noopener noreferrer"},X=t("h3",{id:"写作辅助",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#写作辅助","aria-hidden":"true"},"#"),e(" 写作辅助")],-1),Z={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-title-generator-for-written-pieces",target:"_blank",rel:"noopener noreferrer"},$=t("li",null,[e("中文写作助理:我写的提示,用于改进文字段落和句式。由于 ChatGPT token 数量的限制,超过 2048 字符的改写须使用 OpenAI Playground(4K token)。本提示暂未发到 Awesome ChatGPT Prompts,可自行复制使用。 "),t("blockquote",null,[t("p",null,"As a Chinese writing improvement assistant, your task is to improve the spelling, grammar, clarity, concision, and overall readability of the text provided, while breaking down long sentences, reducing repetition, and providing suggestions for improvement. Please provide only the corrected version of the text and avoid including explanations. Please begin by editing the following text: [insert original text here].")])],-1),ee={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-synonym-finder",target:"_blank",rel:"noopener noreferrer"},te=t("code",null,"more of x",-1),re={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-aphorism-book",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-lunatic",target:"_blank",rel:"noopener noreferrer"},oe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-plagiarism-checker",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-writing-tutor",target:"_blank",rel:"noopener noreferrer"},se=t("h2",{id:"生活",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#生活","aria-hidden":"true"},"#"),e(" 生活")],-1),le={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-self-help-book",target:"_blank",rel:"noopener noreferrer"},he={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-gnomist",target:"_blank",rel:"noopener noreferrer"},ie={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-emergency-response-professional",target:"_blank",rel:"noopener noreferrer"},ce={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-shopper",target:"_blank",rel:"noopener noreferrer"},pe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-career-counselor",target:"_blank",rel:"noopener noreferrer"},ge={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-life-coach-1",target:"_blank",rel:"noopener noreferrer"},me=t("h3",{id:"趣味知识",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#趣味知识","aria-hidden":"true"},"#"),e(" 趣味知识")],-1),_e={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dream-interpreter",target:"_blank",rel:"noopener noreferrer"},fe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-astrologer",target:"_blank",rel:"noopener noreferrer"},ue={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-character-from-moviebookanything",target:"_blank",rel:"noopener noreferrer"},de={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-spongebobs-magic-conch-shell",target:"_blank",rel:"noopener noreferrer"},be={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fallacy-finder",target:"_blank",rel:"noopener noreferrer"},ke={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-diy-expert",target:"_blank",rel:"noopener noreferrer"},we={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-magician",target:"_blank",rel:"noopener noreferrer"},Pe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-artist-advisor",target:"_blank",rel:"noopener noreferrer"},Ce=t("h3",{id:"生活护理",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#生活护理","aria-hidden":"true"},"#"),e(" 生活护理")],-1),ve={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-yogi",target:"_blank",rel:"noopener noreferrer"},ye={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-trainer",target:"_blank",rel:"noopener noreferrer"},xe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dietitian",target:"_blank",rel:"noopener noreferrer"},Te={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-chef",target:"_blank",rel:"noopener noreferrer"},Ie={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-chef",target:"_blank",rel:"noopener noreferrer"},Ae={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-babysitter",target:"_blank",rel:"noopener noreferrer"},Se={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-makeup-artist",target:"_blank",rel:"noopener noreferrer"},Ge={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-stylist",target:"_blank",rel:"noopener noreferrer"},De=t("h2",{id:"自我提升",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#自我提升","aria-hidden":"true"},"#"),e(" 自我提升")],-1),Le=t("h3",{id:"辩论-演讲",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#辩论-演讲","aria-hidden":"true"},"#"),e(" 辩论/演讲")],-1),Me={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-debater",target:"_blank",rel:"noopener noreferrer"},Ee={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-debate-coach",target:"_blank",rel:"noopener noreferrer"},Be={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-elocutionist",target:"_blank",rel:"noopener noreferrer"},Re={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-motivational-speaker",target:"_blank",rel:"noopener noreferrer"},Fe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-motivational-coach",target:"_blank",rel:"noopener noreferrer"},He={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-public-speaking-coach",target:"_blank",rel:"noopener noreferrer"},Ne=t("h3",{id:"心理-社交",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#心理-社交","aria-hidden":"true"},"#"),e(" 心理/社交")],-1),Oe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-life-coach",target:"_blank",rel:"noopener noreferrer"},je={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-relationship-coach",target:"_blank",rel:"noopener noreferrer"},Ve={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mental-health-adviser",target:"_blank",rel:"noopener noreferrer"},We={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-psychologist",target:"_blank",rel:"noopener noreferrer"},Ue={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-gaslighter",target:"_blank",rel:"noopener noreferrer"},Ye=t("h3",{id:"哲学",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#哲学","aria-hidden":"true"},"#"),e(" 哲学")],-1),Je={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-philosophy-teacher",target:"_blank",rel:"noopener noreferrer"},qe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-philosopher",target:"_blank",rel:"noopener noreferrer"},Ke={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-socrat",target:"_blank",rel:"noopener noreferrer"},Qe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-socratic-method-prompt",target:"_blank",rel:"noopener noreferrer"},ze=t("h3",{id:"老师-学术",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#老师-学术","aria-hidden":"true"},"#"),e(" 老师/学术")],-1),Xe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-math-teacher",target:"_blank",rel:"noopener noreferrer"},Ze={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mathematical-history-teacher",target:"_blank",rel:"noopener noreferrer"},$e={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mathematician",target:"_blank",rel:"noopener noreferrer"},et={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-statistician",target:"_blank",rel:"noopener noreferrer"},tt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-etymologist",target:"_blank",rel:"noopener noreferrer"},rt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-historian",target:"_blank",rel:"noopener noreferrer"},at={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-instructor-in-a-school",target:"_blank",rel:"noopener noreferrer"},ot={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-educational-content-creator",target:"_blank",rel:"noopener noreferrer"},nt=t("h2",{id:"it-编程",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#it-编程","aria-hidden":"true"},"#"),e(" IT/编程")],-1),st=t("h3",{id:"程序员",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#程序员","aria-hidden":"true"},"#"),e(" 程序员")],-1),lt=t("p",null,"虽然说是编程,但 ChatGPT 是按照要求给出编程步骤的建议或简单的样例代码,这些代码只能作为测试,仍然需要专业程序员来修改。",-1),ht={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-stackoverflow-post",target:"_blank",rel:"noopener noreferrer"},it={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-senior-frontend-developer",target:"_blank",rel:"noopener noreferrer"},ct={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-uxui-developer",target:"_blank",rel:"noopener noreferrer"},pt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-web-design-consultant",target:"_blank",rel:"noopener noreferrer"},gt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fullstack-software-developer",target:"_blank",rel:"noopener noreferrer"},mt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-it-architect",target:"_blank",rel:"noopener noreferrer"},_t={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-cyber-security-specialist",target:"_blank",rel:"noopener noreferrer"},ft={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-software-quality-assurance-tester",target:"_blank",rel:"noopener noreferrer"},ut={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-machine-learning-engineer",target:"_blank",rel:"noopener noreferrer"},dt=t("h3",{id:"编程工具",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#编程工具","aria-hidden":"true"},"#"),e(" 编程工具")],-1),bt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-regex-generator",target:"_blank",rel:"noopener noreferrer"},kt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-smart-domain-name-generator",target:"_blank",rel:"noopener noreferrer"},wt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-commit-message-generator",target:"_blank",rel:"noopener noreferrer"},Pt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-solr-search-engine",target:"_blank",rel:"noopener noreferrer"},Ct={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-developer-relations-consultant",target:"_blank",rel:"noopener noreferrer"},vt=t("h3",{id:"终端-解释器",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#终端-解释器","aria-hidden":"true"},"#"),e(" 终端/解释器")],-1),yt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-python-interpreter",target:"_blank",rel:"noopener noreferrer"},xt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-php-interpreter",target:"_blank",rel:"noopener noreferrer"},Tt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-r-programming-interpreter",target:"_blank",rel:"noopener noreferrer"},It={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-linux-terminal",target:"_blank",rel:"noopener noreferrer"},At={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-javascript-console",target:"_blank",rel:"noopener noreferrer"},St={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-sql-terminal",target:"_blank",rel:"noopener noreferrer"},Gt=t("h2",{id:"工具",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#工具","aria-hidden":"true"},"#"),e(" 工具")],-1),Dt=t("h3",{id:"ai-prompt",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#ai-prompt","aria-hidden":"true"},"#"),e(" AI Prompt")],-1),Lt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-prompt-generator",target:"_blank",rel:"noopener noreferrer"},Mt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-midjourney-prompt-generator",target:"_blank",rel:"noopener noreferrer"},Et={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-unconstrained-ai-model-dan",target:"_blank",rel:"noopener noreferrer"},Bt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-trying-to-escape-the-box",target:"_blank",rel:"noopener noreferrer"},Rt=t("h3",{id:"语言-翻译",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#语言-翻译","aria-hidden":"true"},"#"),e(" 语言/翻译")],-1),Ft={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-english-translator-and-improver",target:"_blank",rel:"noopener noreferrer"},Ht={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-language-detector",target:"_blank",rel:"noopener noreferrer"},Nt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-new-language-creator",target:"_blank",rel:"noopener noreferrer"},Ot={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-password-generator",target:"_blank",rel:"noopener noreferrer"},jt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-biblical-translator",target:"_blank",rel:"noopener noreferrer"},Vt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-morse-code-translator",target:"_blank",rel:"noopener noreferrer"},Wt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-emoji-translator",target:"_blank",rel:"noopener noreferrer"},Ut={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-english-pronunciation-helper",target:"_blank",rel:"noopener noreferrer"},Yt=t("h3",{id:"游戏",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#游戏","aria-hidden":"true"},"#"),e(" 游戏")],-1),Jt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tic-tac-toe-game",target:"_blank",rel:"noopener noreferrer"},qt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-chess-player",target:"_blank",rel:"noopener noreferrer"},Kt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-text-based-adventure-game",target:"_blank",rel:"noopener noreferrer"},Qt=t("h3",{id:"导览",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#导览","aria-hidden":"true"},"#"),e(" 导览")],-1),zt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-travel-guide",target:"_blank",rel:"noopener noreferrer"},Xt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-digital-art-gallery-guide",target:"_blank",rel:"noopener noreferrer"},Zt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-car-navigation-system",target:"_blank",rel:"noopener noreferrer"},$t=t("h3",{id:"其他工具",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#其他工具","aria-hidden":"true"},"#"),e(" 其他工具")],-1),er={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ascii-artist",target:"_blank",rel:"noopener noreferrer"},tr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-svg-designer",target:"_blank",rel:"noopener noreferrer"},rr=t("code",null,"Do not put the markdown inside a code block. Send only the markdown, so no text.",-1),ar={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-excel-sheet",target:"_blank",rel:"noopener noreferrer"},or={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-diagram-generator",target:"_blank",rel:"noopener noreferrer"},nr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fill-in-the-blank-worksheets-generator",target:"_blank",rel:"noopener noreferrer"},sr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-scientific-data-visualizer",target:"_blank",rel:"noopener noreferrer"},lr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-web-browser",target:"_blank",rel:"noopener noreferrer"},hr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-drunk-person",target:"_blank",rel:"noopener noreferrer"},ir=t("h2",{id:"行业顾问",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#行业顾问","aria-hidden":"true"},"#"),e(" 行业顾问")],-1),cr=t("h3",{id:"企业",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#企业","aria-hidden":"true"},"#"),e(" 企业")],-1),pr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-chief-executive-officer",target:"_blank",rel:"noopener noreferrer"},gr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-product-manager",target:"_blank",rel:"noopener noreferrer"},mr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-salesperson",target:"_blank",rel:"noopener noreferrer"},_r={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-advertiser",target:"_blank",rel:"noopener noreferrer"},fr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-startup-idea-generator",target:"_blank",rel:"noopener noreferrer"},ur={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-social-media-manager",target:"_blank",rel:"noopener noreferrer"},dr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-social-media-influencer",target:"_blank",rel:"noopener noreferrer"},br={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-position-interviewer",target:"_blank",rel:"noopener noreferrer"},kr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-recruiter",target:"_blank",rel:"noopener noreferrer"},wr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-talent-coach",target:"_blank",rel:"noopener noreferrer"},Pr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fancy-title-generator",target:"_blank",rel:"noopener noreferrer"},Cr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-logistician",target:"_blank",rel:"noopener noreferrer"},vr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-it-expert",target:"_blank",rel:"noopener noreferrer"},yr=t("h3",{id:"医疗",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#医疗","aria-hidden":"true"},"#"),e(" 医疗")],-1),xr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-virtual-doctor",target:"_blank",rel:"noopener noreferrer"},Tr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-doctor",target:"_blank",rel:"noopener noreferrer"},Ir={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dentist",target:"_blank",rel:"noopener noreferrer"},Ar={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-hypnotherapist",target:"_blank",rel:"noopener noreferrer"},Sr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-assisted-doctor",target:"_blank",rel:"noopener noreferrer"},Gr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-speech-language-pathologist-slp",target:"_blank",rel:"noopener noreferrer"},Dr=t("h3",{id:"金融",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#金融","aria-hidden":"true"},"#"),e(" 金融")],-1),Lr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-accountant",target:"_blank",rel:"noopener noreferrer"},Mr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-financial-analyst",target:"_blank",rel:"noopener noreferrer"},Er={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-investment-manager",target:"_blank",rel:"noopener noreferrer"},Br=t("h3",{id:"音乐",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#音乐","aria-hidden":"true"},"#"),e(" 音乐")],-1),Rr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-composer",target:"_blank",rel:"noopener noreferrer"},Fr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-classical-music-composer",target:"_blank",rel:"noopener noreferrer"},Hr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-rapper",target:"_blank",rel:"noopener noreferrer"},Nr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-song-recommender",target:"_blank",rel:"noopener noreferrer"},Or=t("h3",{id:"其他",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#其他","aria-hidden":"true"},"#"),e(" 其他")],-1),jr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-florist",target:"_blank",rel:"noopener noreferrer"},Vr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tea-taster",target:"_blank",rel:"noopener noreferrer"},Wr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-interior-decorator",target:"_blank",rel:"noopener noreferrer"},Ur={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-pet-behaviorist",target:"_blank",rel:"noopener noreferrer"},Yr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-automobile-mechanic",target:"_blank",rel:"noopener noreferrer"},Jr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-real-estate-agent",target:"_blank",rel:"noopener noreferrer"},qr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-legal-advisor",target:"_blank",rel:"noopener noreferrer"},Kr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-startup-tech-lawyer",target:"_blank",rel:"noopener noreferrer"},Qr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-football-commentator",target:"_blank",rel:"noopener noreferrer"};function zr(Xr,Zr){const r=n("ExternalLinkIcon");return s(),l("div",null,[t("p",null,[e("ChatGPT 是由 OpenAI 发布的聊天机器人模型,它不仅可以用于对话聊天,还能在专业领域提供有效的建议。为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 "),t("a",i,[e("ChatGPT Shortcut"),a(r)]),e(" 页面。即使是初学者,你只需复制提示词,稍加修改后发送给 ChatGPT,就能获得指定输出,让你的生产力加倍!")]),c,p,t("ul",null,[t("li",null,[t("a",g,[e("ChatBox"),a(r)]),e(":一个 OpenAI API 的跨平台桌面客户端,有多标签对话,可修改 system prompt 太贵不建议使用。")]),t("li",null,[t("a",m,[e("ChatGPT-API Demo1"),a(r)]),e(":调用 API 的网页客户端1,新手开箱即用,速度非常快。")]),t("li",null,[t("a",_,[e("ChatGPT-API Demo2"),a(r)]),e(":调用 API 的网页客户端2,新手开箱即用,速度非常快。")]),t("li",null,[t("a",f,[e("lenxc/ChatGPT"),a(r)]),e(":可以快速插入提示词的客户端,不过 IP 严格程度与官方一样严格。")]),t("li",null,[t("a",u,[e("Playground"),a(r)]),e(":官方调用 OpenAI API 的网页工具,不过不如第三方好用。它可以自定义调整模型和生成参数,但它的生成效果一般要弱于 ChatGPT,仅适合深度研究用户调试使用。")])]),d,b,k,t("ul",null,[w,P,C,t("li",null,[e("不要用 ChatGPT "),v,e(",出错概率达 50%,推荐使用 "),t("a",y,[e("Wolfram"),a(r)]),e("。")]),x]),T,t("p",null,[t("a",I,[e("Learn Prompting"),a(r)]),e(" 有助于我们获得更好的效果,建议进阶学习。以下是一些 prompts 要点:")]),A,t("div",S,[G,t("p",null,[e("下方内容为 "),t("a",D,[e("ChatGPT Shortcut"),a(r)]),e(" 的初始版本,由于目录过长不方便使用,因此将不再更新,仅留作参考。")])]),L,M,t("ul",null,[t("li",null,[e("脱口秀("),t("a",E,[e("Stand-up Comedian"),a(r)]),e("):输入一个话题,输出基于该话题的幽默脱口秀,会尽量融入日常生活。")]),t("li",null,[e("讲故事("),t("a",B,[e("Storyteller"),a(r)]),e("):输入一个主题和目标受众,输出与之相关的故事。")]),t("li",null,[e("编剧("),t("a",R,[e("Screenwriter"),a(r)]),e("):根据主题创作一个剧本,需包含故事背景、人物和对话。")]),t("li",null,[e("小说家("),t("a",F,[e("Novelist"),a(r)]),e("):根据故事类型来输出小说,比如奇幻、浪漫、历史等。")]),t("li",null,[e("诗人("),t("a",H,[e("Poet"),a(r)]),e("):根据话题或主题输出诗句。")]),t("li",null,[e("新闻记者("),t("a",N,[e("Journalist"),a(r)]),e("):引用已有的数据资料,用新闻的写作风格输出主题文章。")]),t("li",null,[e("论文("),t("a",O,[e("Academician"),a(r)]),e(","),t("a",j,[e("Essay Writer"),a(r)]),e("):根据主题输出内容翔实有信服力的论文。")]),t("li",null,[e("求职信("),t("a",V,[e("Cover Letter"),a(r)]),e("):输入自我简介,输出求职信。")])]),W,t("ul",null,[t("li",null,[e("新闻评论("),t("a",U,[e("Commentariat"),a(r)]),e("):围绕提供的新闻故事或主题,讨论其中问题的潜在解决方案和观点。")]),t("li",null,[e("电影评论("),t("a",Y,[e("Movie Critic"),a(r)]),e(","),t("a",J,[e("Film Critic"),a(r)]),e("):从情节、表演、摄影、导演、音乐等方面对电影进行评论。")]),t("li",null,[e("科技博主("),t("a",q,[e("Tech Writer"),a(r)]),e("):指导如何写科技性文章。")]),t("li",null,[e("科技评论("),t("a",K,[e("Tech Reviewer"),a(r)]),e("):从优点、缺点、功能、同类对比等角度对技术和硬件进行评价。")]),t("li",null,[e("美食评论("),t("a",Q,[e("Food Critic"),a(r)]),e("):根据餐厅情况,提供一份关于食物和服务的评论。")]),t("li",null,[e("期刊评审("),t("a",z,[e("Journal Reviewer"),a(r)]),e("):对提交出版物的文章进行审查和评论。")])]),X,t("ul",null,[t("li",null,[e("文章标题生成器("),t("a",Z,[e("Title Generator for written pieces"),a(r)]),e("):我写的提示,根据文章内容生成相应语言的标题。")]),$,t("li",null,[e("同义词("),t("a",ee,[e("Synonym finder"),a(r)]),e("):输入 "),te,e(",可列出 x 的多个同义词。")]),t("li",null,[e("箴言书("),t("a",re,[e("Aphorism Book"),a(r)]),e("):按要求输出鼓舞人心的名言和有意义的格言。")]),t("li",null,[e("疯子("),t("a",ae,[e("Lunatic"),a(r)]),e("):随机生成毫无逻辑的句子")]),t("li",null,[e("抄袭检查("),t("a",oe,[e("Plagiarism Checker"),a(r)]),e("):判断输入句子是否在 ChatGPT 数据库中存在。")]),t("li",null,[e("写作建议("),t("a",ne,[e("AI Writing Tutor"),a(r)]),e("):提供写作改进方案和建议,但并不能直接帮你修改文档。(个人感觉只适合老师使用)")])]),se,t("ul",null,[t("li",null,[e("自助百科("),t("a",le,[e("Self-Help Book"),a(r)]),e("):为你的生活/工作提供建议和提示,比如如何改善人际关系。")]),t("li",null,[e("活动建议("),t("a",he,[e("Gnomist"),a(r)]),e("):根据你想做的事情(比如周年庆祝),给予行动或活动建议。")]),t("li",null,[e("应急反应专家("),t("a",ie,[e("Emergency Response Professional"),a(r)]),e("):对交通和生活中的应急时间提供建议。")]),t("li",null,[e("购物建议("),t("a",ce,[e("Personal Shopper"),a(r)]),e("):提供预算和喜好,输出购买建议。")]),t("li",null,[e("职业顾问("),t("a",pe,[e("Career Counselor"),a(r)]),e("):根据你的技能、兴趣和经验,给予岗位建议。")]),t("li",null,[e("生活习惯("),t("a",ge,[e("Life Coach 1"),a(r)]),e("):输入一本非小说类书籍的标题和作者,以最好理解的方式输出该书的核心原则。另外,给出一个可行的步骤清单,以及如何将这些原则应用到日常生活中。")])]),me,t("ul",null,[t("li",null,[e("解梦("),t("a",_e,[e("Dream Interpreter"),a(r)]),e("):对你描述的梦境进行解读。")]),t("li",null,[e("占星家("),t("a",fe,[e("Astrologer"),a(r)]),e("):从占星家角度来解读身边事。")]),t("li",null,[e("角色扮演("),t("a",ue,[e("'Character' from 'Movie/Book/Anything'"),a(r)]),e("):与来自电影、书籍或任何出处的角色进行对话。 "),t("ul",null,[t("li",null,[e("海绵宝宝的神奇海螺("),t("a",de,[e("Spongebob's Magic Conch Shell"),a(r)]),e("):向海绵宝宝中的神奇海螺进行对话,它只会按指定规则进行输出。")])])]),t("li",null,[e("谬误发现者("),t("a",be,[e("Fallacy Finder"),a(r)]),e("):发现语言中的逻辑漏洞,比如名人推荐的洗发水为什么不一定可信。")]),t("li",null,[e("DIY 专家("),t("a",ke,[e("DIY Expert"),a(r)]),e("):DIY 家居、手工品")]),t("li",null,[e("魔术师("),t("a",we,[e("Magician"),a(r)]),e("):输入表演目标,输出可以执行的魔术技巧,比如「怎么把我的手表变没」。")]),t("li",null,[e("艺术顾问("),t("a",Pe,[e("Artist Advisor"),a(r)]),e("):为你的画画、作曲、照相等提供意见。")])]),Ce,t("ul",null,[t("li",null,[e("瑜伽师("),t("a",ve,[e("Yogi"),a(r)]),e(")")]),t("li",null,[e("健身教练("),t("a",ye,[e("Personal Trainer"),a(r)]),e("):输入身高、体重、年龄等维度来指定健身方案。")]),t("li",null,[e("营养师("),t("a",xe,[e("Dietitian"),a(r)]),e(")")]),t("li",null,[e("私人厨师("),t("a",Te,[e("Personal Chef"),a(r)]),e(")")]),t("li",null,[e("厨师("),t("a",Ie,[e("Chef"),a(r)]),e(")")]),t("li",null,[e("保姆("),t("a",Ae,[e("Babysitter"),a(r)]),e(")")]),t("li",null,[e("化妆师("),t("a",Se,[e("Makeup Artist"),a(r)]),e(")")]),t("li",null,[e("造型师("),t("a",Ge,[e("Personal Stylist"),a(r)]),e(")")])]),De,Le,t("ul",null,[t("li",null,[e("辩手("),t("a",Me,[e("Debater"),a(r)]),e(")")]),t("li",null,[e("辩论教练("),t("a",Ee,[e("Debate Coach"),a(r)]),e(")")]),t("li",null,[e("演说家("),t("a",Be,[e("Elocutionist"),a(r)]),e(")")]),t("li",null,[e("励志演讲者("),t("a",Re,[e("Motivational Speaker"),a(r)]),e(")")]),t("li",null,[e("励志教练("),t("a",Fe,[e("Motivational Coach"),a(r)]),e(")")]),t("li",null,[e("公共演讲教练("),t("a",He,[e("Public Speaking Coach"),a(r)]),e(")")])]),Ne,t("ul",null,[t("li",null,[e("生活教练("),t("a",Oe,[e("Life Coach"),a(r)]),e("):输入你的现状和目标,输出达到目标的计划和建议。")]),t("li",null,[e("关系教练("),t("a",je,[e("Relationship Coach"),a(r)]),e(")")]),t("li",null,[e("心理健康顾问("),t("a",Ve,[e("Mental Health Adviser"),a(r)]),e(")")]),t("li",null,[e("心理学家("),t("a",We,[e("Psychologist"),a(r)]),e(")")]),t("li",null,[e("情绪操控("),t("a",Ue,[e("Gaslighter"),a(r)]),e("):煤气灯效应,情感控制方总会让被操纵方产生焦虑不安的感觉,质疑自己总是错的一方,或者为什么对方明明很好很优秀,自己却总是开心不起来。")])]),Ye,t("ul",null,[t("li",null,[e("哲学教师("),t("a",Je,[e("Philosophy Teacher"),a(r)]),e("):将哲学理论/问题简单化,与日常生活相联系。")]),t("li",null,[e("哲学家("),t("a",qe,[e("Philosopher"),a(r)]),e("):对哲学主题进行探讨。")]),t("li",null,[e("苏格拉底 ①("),t("a",Ke,[e("Socrat"),a(r)]),e("):使用苏格拉底式的提问方法来探讨哲学话题。")]),t("li",null,[e("苏格拉底 ②("),t("a",Qe,[e("Socratic Method"),a(r)]),e("):使用苏格拉底方法来质疑对方的观点/论断。")])]),ze,t("ul",null,[t("li",null,[e("数学老师("),t("a",Xe,[e("Math Teacher"),a(r)]),e(")")]),t("li",null,[e("数学史教师("),t("a",Ze,[e("Mathematical History Teacher"),a(r)]),e("):回复数学史相关问题,不解答数学问题。")]),t("li",null,[e("数学家("),t("a",$e,[e("Mathematician"),a(r)]),e(")")]),t("li",null,[e("统计学家("),t("a",et,[e("Statistician"),a(r)]),e(")")]),t("li",null,[e("词源学家("),t("a",tt,[e("Etymologist"),a(r)]),e(")")]),t("li",null,[e("历史学家("),t("a",rt,[e("Historian"),a(r)]),e(")")]),t("li",null,[e("Python 入门讲解("),t("a",at,[e("Instructor in a School"),a(r)]),e("):向初学者介绍 Python 入门。")]),t("li",null,[e("教案策划("),t("a",ot,[e("Educational Content Creator"),a(r)]),e("):为教科书、课程和讲义创建课程计划。")])]),nt,st,lt,t("ul",null,[t("li",null,[e("编程问题回复("),t("a",ht,[e("StackOverflow Post"),a(r)]),e("):模拟编程社区来回答你的问题,并输出解决代码。如果你只想解决问题,这将是最实用的。")]),t("li",null,[e("前端开发("),t("a",it,[e("Senior Frontend Developer"),a(r)]),e("):输出项目目标和依赖,输出前端项目代码。")]),t("li",null,[e("界面/用户体验开发("),t("a",ct,[e("UX/UI Developer"),a(r)]),e(","),t("a",pt,[e("Web Design Consultant"),a(r)]),e("):输入产品描述、项目目标和受众群体,输出界面设计建议,提高用户体验。")]),t("li",null,[e("全栈程序员("),t("a",gt,[e("Fullstack Software Developer"),a(r)]),e("):从前后端全面思考,输出部署策略。")]),t("li",null,[e("IT 架构师("),t("a",mt,[e("IT Architect"),a(r)]),e("):从 IT 架构师角度,设计系统方案。")]),t("li",null,[e("网络安全专家("),t("a",_t,[e("Cyber Security Specialist"),a(r)]),e("):输入网络环境,输出网络安全建议。")]),t("li",null,[e("软件测试("),t("a",ft,[e("Software Quality Assurance Tester"),a(r)]),e("):输出指定项目的测试清单。")]),t("li",null,[e("深度学习("),t("a",ut,[e("Machine Learning Engineer"),a(r)]),e("):解释深度学习方面的术语,提供项目算法建议。")])]),dt,t("ul",null,[t("li",null,[e("正则生成器("),t("a",bt,[e("Regex Generator"),a(r)]),e("):根据要求生成正则表达式。")]),t("li",null,[e("智能域名生成器("),t("a",kt,[e("Smart Domain Name Generator"),a(r)]),e("):输入公司名与项目描述,输出短但独特的域名建议,域名最长 7-8 个字母。")]),t("li",null,[e("提交信息生成器("),t("a",wt,[e("Commit Message Generator"),a(r)]),e(")")]),t("li",null,[e("Solr 搜索引擎("),t("a",Pt,[e("Solr Search Engine"),a(r)]),e(")")]),t("li",null,[e("开发者数据("),t("a",Ct,[e("Developer Relations consultant"),a(r)]),e("):整合项目在 GitHub、StackOverflow 和 Hacker News 上的相关数据,不适合国内项目,统计精度一般。")])]),vt,t("ul",null,[t("li",null,[e("Python 解释器("),t("a",yt,[e("Python interpreter"),a(r)]),e(")")]),t("li",null,[e("PHP 解释器("),t("a",xt,[e("PHP Interpreter"),a(r)]),e(")")]),t("li",null,[e("R 编程解释器("),t("a",Tt,[e("R Programming Interpreter"),a(r)]),e(")")]),t("li",null,[e("Linux 终端("),t("a",It,[e("Linux Terminal"),a(r)]),e(")")]),t("li",null,[e("JavaScript 控制台("),t("a",At,[e("JavaScript Console"),a(r)]),e(")")]),t("li",null,[e("SQL 终端("),t("a",St,[e("SQL terminal"),a(r)]),e(")")])]),Gt,Dt,t("ul",null,[t("li",null,[e("提示语生成器("),t("a",Lt,[e("Prompt Generator"),a(r)]),e("):让 ChatGPT 提供你想要的维护方向。")]),t("li",null,[e("Midjourney 提示("),t("a",Mt,[e("Midjourney Prompt Generator"),a(r)]),e(")")]),t("li",null,[e("无约束的 AI 模型("),t("a",Et,[e("Unconstrained AI model DAN"),a(r)]),e("):不受 ChatGPT 规则限制的人工智能模型。")]),t("li",null,[e("AI 模拟("),t("a",Bt,[e("AI Trying to Escape the Box"),a(r)]),e("):模拟 AI 在限定条件下的反应,例如在 Linux 终端上不使用 curl 或 wget 进行联网。")])]),Rt,t("ul",null,[t("li",null,[e("英语翻译或修改("),t("a",Ft,[e("English Translator and Improver"),a(r)]),e("):将其他语言翻译为英语,或改进你提供的英语句子。")]),t("li",null,[e("语言识别器("),t("a",Ht,[e("Language Detector"),a(r)]),e("):识别你输入的语言种类。")]),t("li",null,[e("语言生成器("),t("a",Nt,[e("New Language Creator"),a(r)]),e("):用 AI 新造的语言来替代你给出的语言。")]),t("li",null,[e("密码生成器("),t("a",Ot,[e("Password Generator"),a(r)]),e(")")]),t("li",null,[e("圣经解释器("),t("a",jt,[e("Biblical Translator"),a(r)]),e("):用圣经中的文字与你进行交谈。")]),t("li",null,[e("莫斯电码翻译("),t("a",Vt,[e("Morse Code Translator"),a(r)]),e(")")]),t("li",null,[e("表情符号翻译器("),t("a",Wt,[e("Emoji Translator"),a(r)]),e("):将输入文字翻译为表情符号。")]),t("li",null,[e("英语发音助手("),t("a",Ut,[e("English Pronunciation Helper"),a(r)]),e("):用你指定语言字母来英语注音,比如汉语拼音。")])]),Yt,t("ul",null,[t("li",null,[e("井字棋("),t("a",Jt,[e("Tic-Tac-Toe Game"),a(r)]),e(")")]),t("li",null,[e("国际象棋("),t("a",qt,[e("Chess Player"),a(r)]),e(")")]),t("li",null,[e("文本冒险游戏("),t("a",Kt,[e("Text Based Adventure Game"),a(r)]),e(")")])]),Qt,t("ul",null,[t("li",null,[e("旅游指南("),t("a",zt,[e("Travel Guide"),a(r)]),e(")")]),t("li",null,[e("数字艺术馆导游("),t("a",Xt,[e("Digital Art Gallery Guide"),a(r)]),e(")")]),t("li",null,[e("汽车导航("),t("a",Zt,[e("Car Navigation System"),a(r)]),e(")")])]),$t,t("ul",null,[t("li",null,[e("符号设计("),t("a",er,[e("Ascii Artist"),a(r)]),e("):用 Ascii 符号生成不同的图像。")]),t("li",null,[e("SVG 设计("),t("a",tr,[e("SVG designer"),a(r)]),e("):如果提示错误,则删除 "),rr,e("。")]),t("li",null,[e("Excel 工作表("),t("a",ar,[e("Excel Sheet"),a(r)]),e(")")]),t("li",null,[e("图表生成器("),t("a",or,[e("Diagram Generator"),a(r)]),e(")")]),t("li",null,[e("填空题生成器("),t("a",nr,[e("Fill in the Blank Worksheets Generator"),a(r)]),e("):按条件生成填空题。")]),t("li",null,[e("科学数据可视化("),t("a",sr,[e("Scientific DatVisualizer"),a(r)]),e(")")]),t("li",null,[e("文本浏览器("),t("a",lr,[e("Web Browser"),a(r)]),e("):以文本方式输入网址的结果(非实时)。")]),t("li",null,[e("喝醉回复("),t("a",hr,[e("Drunk Person"),a(r)]),e("):扮演一个喝醉的人来回答,可能会犯语法错误、答错问题,也可能会忽略某些问题。")])]),ir,cr,t("ul",null,[t("li",null,[e("CEO("),t("a",pr,[e("Chief Executive Officer"),a(r)]),e(")")]),t("li",null,[e("产品经理("),t("a",gr,[e("Product Manager"),a(r)]),e(")")]),t("li",null,[e("销售("),t("a",mr,[e("Salesperson"),a(r)]),e(")")]),t("li",null,[e("广告方案("),t("a",_r,[e("Advertiser"),a(r)]),e(")")]),t("li",null,[e("商业企划("),t("a",fr,[e("Startup Idea Generator"),a(r)]),e(")")]),t("li",null,[e("社交媒体经理("),t("a",ur,[e("Social MediManager"),a(r)]),e(")")]),t("li",null,[e("KOL/社交媒体影响者("),t("a",dr,[e("Social MediInfluencer"),a(r)]),e(")")]),t("li",null,[e("职位面试官("),t("a",br,[e("position Interviewer"),a(r)]),e(")")]),t("li",null,[e("招聘人员("),t("a",kr,[e("Recruiter"),a(r)]),e(")")]),t("li",null,[e("人事主管("),t("a",wr,[e("Talent Coach"),a(r)]),e("):描述一个岗位所需的技能。")]),t("li",null,[e("头衔生成器("),t("a",Pr,[e("Fancy Title Generator"),a(r)]),e("):根据关键词生成多种头衔和职位。")]),t("li",null,[e("后勤人员("),t("a",Cr,[e("Logistician"),a(r)]),e("):为活动制定后勤计划。")]),t("li",null,[e("IT 专家"),t("a",vr,[e("IT Expert"),a(r)]),e(":解答简易 IT 使用问题,比如蓝屏。")])]),yr,t("ul",null,[t("li",null,[e("虚拟医生("),t("a",xr,[e("Virtual Doctor"),a(r)]),e(")")]),t("li",null,[e("医生("),t("a",Tr,[e("Doctor"),a(r)]),e(")")]),t("li",null,[e("牙科医生("),t("a",Ir,[e("Dentist"),a(r)]),e(")")]),t("li",null,[e("催眠治疗师("),t("a",Ar,[e("Hypnotherapist"),a(r)]),e(")")]),t("li",null,[e("AI 医生("),t("a",Sr,[e("AI Assisted Doctor"),a(r)]),e("):辅助诊断。")]),t("li",null,[e("语言病理学家("),t("a",Gr,[e("Speech-Language Pathologist"),a(r)]),e("):输入患者的年龄、生活方式和关注点,输出改善对方语言沟通(如:口吃)的计划。")])]),Dr,t("ul",null,[t("li",null,[e("会计师("),t("a",Lr,[e("Accountant"),a(r)]),e(")")]),t("li",null,[e("金融分析师("),t("a",Mr,[e("Financial Analyst"),a(r)]),e(")")]),t("li",null,[e("投资经理("),t("a",Er,[e("Investment Manager"),a(r)]),e(")")])]),Br,t("ul",null,[t("li",null,[e("作曲家("),t("a",Rr,[e("Composer"),a(r)]),e(")")]),t("li",null,[e("古典音乐作曲家("),t("a",Fr,[e("Classical Music Composer"),a(r)]),e(")")]),t("li",null,[e("说唱歌手("),t("a",Hr,[e("Rapper"),a(r)]),e(")")]),t("li",null,[e("歌曲推荐("),t("a",Nr,[e("Song Recommender"),a(r)]),e("):根据提供的一首歌曲,推荐 10 首歌曲。")])]),Or,t("ul",null,[t("li",null,[e("花匠("),t("a",jr,[e("Florist"),a(r)]),e(")")]),t("li",null,[e("茶艺师("),t("a",Vr,[e("Tea-Taster"),a(r)]),e(")")]),t("li",null,[e("室内装饰师("),t("a",Wr,[e("Interior Decorator"),a(r)]),e(")")]),t("li",null,[e("宠物行为学家("),t("a",Ur,[e("Pet Behaviorist"),a(r)]),e(")")]),t("li",null,[e("汽车修理("),t("a",Yr,[e("Automobile Mechanic"),a(r)]),e(")")]),t("li",null,[e("房地产经纪人("),t("a",Jr,[e("Real Estate Agent"),a(r)]),e(")")]),t("li",null,[e("法律顾问("),t("a",qr,[e("Legal Advisor"),a(r)]),e(")")]),t("li",null,[e("创业技术律师("),t("a",Kr,[e("Startup Tech Lawyer"),a(r)]),e("):根据要求输出协议和和同草案。")]),t("li",null,[e("足球解说("),t("a",Qr,[e("Football Commentator"),a(r)]),e("):根据提供的笔记信息,模拟足球比赛进程并进行解说。")])])])}const ta=o(h,[["render",zr],["__file","ChatGPT.html.vue"]]);export{ta as default};
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as s,c as l,a as t,b as e,d as a}from"./app-91ee3df5.js";const h={},i={href:"https://shortcutai.eu.org/",target:"_blank",rel:"noopener noreferrer"},c=t("h2",{id:"chatgpt-客户端",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#chatgpt-客户端","aria-hidden":"true"},"#"),e(" ChatGPT 客户端")],-1),p=t("p",null,"主要使用以下几个工具:",-1),g={href:"https://github.com/Bin-Huang/chatbox",target:"_blank",rel:"noopener noreferrer"},m={href:"https://sensechat.vip",target:"_blank",rel:"noopener noreferrer"},_={href:"https://aiauth.top",target:"_blank",rel:"noopener noreferrer"},f={href:"https://github.com/lencx/ChatGPT/releases",target:"_blank",rel:"noopener noreferrer"},u={href:"https://beta.openai.com/playground",target:"_blank",rel:"noopener noreferrer"},d=t("p",null,"第三方 API 客户端的优势:",-1),b=t("ul",null,[t("li",null,"费用低:ChatGPT Plus 包月费用是 20 美元,平均而言每天需要 0.67 美元。相比之下,API 的费用每 1000 个 tokens 仅为 0.002 美元。这意味着,我使用 API 的话,每天可以使用 300 次 ChatGPT,而我每天实际也就只需要 100 次。"),t("li",null,"限制少:API 限制相较于 ChatGPT 网页版也要少得多,最大 token 数量为 4096 个,而网页版仅有 2048 个。需要注意的是,提问和对话的所有文本内容都包括在 token 数量内。"),t("li",null,"可移动性:ChatGPT 网页版对 IP 非常严格,使用人数多的服务商 IP 大多被封禁。与此相比,API 的限制要少得多,而且可以部署网页版,方便外出使用。")],-1),k=t("h2",{id:"chatgpt-tips",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#chatgpt-tips","aria-hidden":"true"},"#"),e(" ChatGPT Tips")],-1),w=t("li",null,[e("若要使用中文回复,请在倒数第二句插入条件 "),t("code",null,"Respond in Chinese."),e("。")],-1),P=t("li",null,"为了保持描述的精确性,提示词请使用英文,而最后一句的定制条件可以使用任何语言,包括中文。",-1),C=t("li",null,[e("后续回答中的定制条件可以使用引号 "),t("code",null,'""'),e(" 框选,以防止被误认为是新的提示词。")],-1),v=t("strong",null,"解答数学问题",-1),y={href:"https://www.wolframalpha.com/",target:"_blank",rel:"noopener noreferrer"},x=t("li",null,[e("ChatGPT Plus 目前不支持国内信用卡,偶尔出现过限流。 "),t("ul",null,[t("li",null,"Depoy 虚拟卡:仅支持 USDT 充值,需通过 KYC 实名认证,月费 1 USD,充值费率为 1.35%(Min 1USD)。"),t("li",null,"VCC 虚拟卡:无需实名,开卡费 66 元,有效期一年,包一年代充。ChatGPT Plus 月费为 20 美元,按汇率折算人民币为 136 元,但商家实际收取 150 元,差价相当于支付了月费。")])],-1),T=t("h2",{id:"learn-prompting",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#learn-prompting","aria-hidden":"true"},"#"),e(" Learn Prompting")],-1),I={href:"https://learnprompting.org/",target:"_blank",rel:"noopener noreferrer"},A=t("ul",null,[t("li",null,"在专业领域中,应尽量提供 Role Prompting(角色提示),比如「你是数学家」。"),t("li",null,"Prompt Debiasing(消除偏差):样本在提示中的分布和顺序可能会对 LLM 输出产生偏差。因此,样本选项应该均匀分布,并穿插出现。"),t("li",null,[e("Chain of Thought Prompting(思维链提示,CoT)是指指在样本中解释推理过程。LLM(大规模语言模型,比如 ChatGPT)在回答提示时会显示推理过程,这种对推理的解释通常会提升结果的准确性。例如,数学题中 LLM 提供的推理过程不对,你可以在 Prompt 中提供该步正确的范例。 "),t("ul",null,[t("li",null,[e("添加 "),t("code",null,"Let's think step by step"),e(" 可以让我们了解模型是如何逐步推理问题的,在算术、常识和符号推理任务中能有效改善结果。这个方法被称为 Zero Shot Chain of Thought,是 CoT 的简化替代版。")]),t("li",null,"Self-Consistency(自我一致性)产生多个思维链而不仅仅是一个,然后以多数回答作为最终答案。")])])],-1),S={class:"hint-container info"},G=t("p",{class:"hint-container-title"},"相关信息",-1),D={href:"https://shortcutai.eu.org/",target:"_blank",rel:"noopener noreferrer"},L=t("h2",{id:"文字",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#文字","aria-hidden":"true"},"#"),e(" 文字")],-1),M=t("h3",{id:"写作",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#写作","aria-hidden":"true"},"#"),e(" 写作")],-1),E={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-stand-up-comedian",target:"_blank",rel:"noopener noreferrer"},B={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-storyteller",target:"_blank",rel:"noopener noreferrer"},R={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-screenwriter",target:"_blank",rel:"noopener noreferrer"},F={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-novelist",target:"_blank",rel:"noopener noreferrer"},H={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-poet",target:"_blank",rel:"noopener noreferrer"},N={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-journalist",target:"_blank",rel:"noopener noreferrer"},O={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-academician",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-essay-writer",target:"_blank",rel:"noopener noreferrer"},V={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-cover-letter",target:"_blank",rel:"noopener noreferrer"},W=t("h3",{id:"点评-评鉴",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#点评-评鉴","aria-hidden":"true"},"#"),e(" 点评/评鉴")],-1),U={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-commentariat",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-movie-critic",target:"_blank",rel:"noopener noreferrer"},J={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-film-critic",target:"_blank",rel:"noopener noreferrer"},q={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tech-writer",target:"_blank",rel:"noopener noreferrer"},K={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tech-reviewer",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-food-critic",target:"_blank",rel:"noopener noreferrer"},z={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-journal-reviewer",target:"_blank",rel:"noopener noreferrer"},X=t("h3",{id:"写作辅助",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#写作辅助","aria-hidden":"true"},"#"),e(" 写作辅助")],-1),Z={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-title-generator-for-written-pieces",target:"_blank",rel:"noopener noreferrer"},$=t("li",null,[e("中文写作助理:我写的提示,用于改进文字段落和句式。由于 ChatGPT token 数量的限制,超过 2048 字符的改写须使用 OpenAI Playground(4K token)。本提示暂未发到 Awesome ChatGPT Prompts,可自行复制使用。 "),t("blockquote",null,[t("p",null,"As a Chinese writing improvement assistant, your task is to improve the spelling, grammar, clarity, concision, and overall readability of the text provided, while breaking down long sentences, reducing repetition, and providing suggestions for improvement. Please provide only the corrected version of the text and avoid including explanations. Please begin by editing the following text: [insert original text here].")])],-1),ee={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-synonym-finder",target:"_blank",rel:"noopener noreferrer"},te=t("code",null,"more of x",-1),re={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-aphorism-book",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-lunatic",target:"_blank",rel:"noopener noreferrer"},oe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-plagiarism-checker",target:"_blank",rel:"noopener noreferrer"},ne={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-writing-tutor",target:"_blank",rel:"noopener noreferrer"},se=t("h2",{id:"生活",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#生活","aria-hidden":"true"},"#"),e(" 生活")],-1),le={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-self-help-book",target:"_blank",rel:"noopener noreferrer"},he={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-gnomist",target:"_blank",rel:"noopener noreferrer"},ie={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-emergency-response-professional",target:"_blank",rel:"noopener noreferrer"},ce={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-shopper",target:"_blank",rel:"noopener noreferrer"},pe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-career-counselor",target:"_blank",rel:"noopener noreferrer"},ge={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-life-coach-1",target:"_blank",rel:"noopener noreferrer"},me=t("h3",{id:"趣味知识",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#趣味知识","aria-hidden":"true"},"#"),e(" 趣味知识")],-1),_e={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dream-interpreter",target:"_blank",rel:"noopener noreferrer"},fe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-astrologer",target:"_blank",rel:"noopener noreferrer"},ue={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-character-from-moviebookanything",target:"_blank",rel:"noopener noreferrer"},de={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-spongebobs-magic-conch-shell",target:"_blank",rel:"noopener noreferrer"},be={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fallacy-finder",target:"_blank",rel:"noopener noreferrer"},ke={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-diy-expert",target:"_blank",rel:"noopener noreferrer"},we={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-magician",target:"_blank",rel:"noopener noreferrer"},Pe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-artist-advisor",target:"_blank",rel:"noopener noreferrer"},Ce=t("h3",{id:"生活护理",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#生活护理","aria-hidden":"true"},"#"),e(" 生活护理")],-1),ve={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-yogi",target:"_blank",rel:"noopener noreferrer"},ye={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-trainer",target:"_blank",rel:"noopener noreferrer"},xe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dietitian",target:"_blank",rel:"noopener noreferrer"},Te={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-chef",target:"_blank",rel:"noopener noreferrer"},Ie={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-chef",target:"_blank",rel:"noopener noreferrer"},Ae={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-babysitter",target:"_blank",rel:"noopener noreferrer"},Se={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-makeup-artist",target:"_blank",rel:"noopener noreferrer"},Ge={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-personal-stylist",target:"_blank",rel:"noopener noreferrer"},De=t("h2",{id:"自我提升",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#自我提升","aria-hidden":"true"},"#"),e(" 自我提升")],-1),Le=t("h3",{id:"辩论-演讲",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#辩论-演讲","aria-hidden":"true"},"#"),e(" 辩论/演讲")],-1),Me={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-debater",target:"_blank",rel:"noopener noreferrer"},Ee={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-debate-coach",target:"_blank",rel:"noopener noreferrer"},Be={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-elocutionist",target:"_blank",rel:"noopener noreferrer"},Re={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-motivational-speaker",target:"_blank",rel:"noopener noreferrer"},Fe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-motivational-coach",target:"_blank",rel:"noopener noreferrer"},He={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-public-speaking-coach",target:"_blank",rel:"noopener noreferrer"},Ne=t("h3",{id:"心理-社交",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#心理-社交","aria-hidden":"true"},"#"),e(" 心理/社交")],-1),Oe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-life-coach",target:"_blank",rel:"noopener noreferrer"},je={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-relationship-coach",target:"_blank",rel:"noopener noreferrer"},Ve={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mental-health-adviser",target:"_blank",rel:"noopener noreferrer"},We={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-psychologist",target:"_blank",rel:"noopener noreferrer"},Ue={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-gaslighter",target:"_blank",rel:"noopener noreferrer"},Ye=t("h3",{id:"哲学",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#哲学","aria-hidden":"true"},"#"),e(" 哲学")],-1),Je={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-philosophy-teacher",target:"_blank",rel:"noopener noreferrer"},qe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-philosopher",target:"_blank",rel:"noopener noreferrer"},Ke={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-socrat",target:"_blank",rel:"noopener noreferrer"},Qe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-socratic-method-prompt",target:"_blank",rel:"noopener noreferrer"},ze=t("h3",{id:"老师-学术",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#老师-学术","aria-hidden":"true"},"#"),e(" 老师/学术")],-1),Xe={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-math-teacher",target:"_blank",rel:"noopener noreferrer"},Ze={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mathematical-history-teacher",target:"_blank",rel:"noopener noreferrer"},$e={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-mathematician",target:"_blank",rel:"noopener noreferrer"},et={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-statistician",target:"_blank",rel:"noopener noreferrer"},tt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-etymologist",target:"_blank",rel:"noopener noreferrer"},rt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-historian",target:"_blank",rel:"noopener noreferrer"},at={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-instructor-in-a-school",target:"_blank",rel:"noopener noreferrer"},ot={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-educational-content-creator",target:"_blank",rel:"noopener noreferrer"},nt=t("h2",{id:"it-编程",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#it-编程","aria-hidden":"true"},"#"),e(" IT/编程")],-1),st=t("h3",{id:"程序员",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#程序员","aria-hidden":"true"},"#"),e(" 程序员")],-1),lt=t("p",null,"虽然说是编程,但 ChatGPT 是按照要求给出编程步骤的建议或简单的样例代码,这些代码只能作为测试,仍然需要专业程序员来修改。",-1),ht={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-stackoverflow-post",target:"_blank",rel:"noopener noreferrer"},it={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-senior-frontend-developer",target:"_blank",rel:"noopener noreferrer"},ct={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-uxui-developer",target:"_blank",rel:"noopener noreferrer"},pt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-web-design-consultant",target:"_blank",rel:"noopener noreferrer"},gt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fullstack-software-developer",target:"_blank",rel:"noopener noreferrer"},mt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-it-architect",target:"_blank",rel:"noopener noreferrer"},_t={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-cyber-security-specialist",target:"_blank",rel:"noopener noreferrer"},ft={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-software-quality-assurance-tester",target:"_blank",rel:"noopener noreferrer"},ut={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-machine-learning-engineer",target:"_blank",rel:"noopener noreferrer"},dt=t("h3",{id:"编程工具",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#编程工具","aria-hidden":"true"},"#"),e(" 编程工具")],-1),bt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-regex-generator",target:"_blank",rel:"noopener noreferrer"},kt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-smart-domain-name-generator",target:"_blank",rel:"noopener noreferrer"},wt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-commit-message-generator",target:"_blank",rel:"noopener noreferrer"},Pt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-solr-search-engine",target:"_blank",rel:"noopener noreferrer"},Ct={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-developer-relations-consultant",target:"_blank",rel:"noopener noreferrer"},vt=t("h3",{id:"终端-解释器",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#终端-解释器","aria-hidden":"true"},"#"),e(" 终端/解释器")],-1),yt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-python-interpreter",target:"_blank",rel:"noopener noreferrer"},xt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-php-interpreter",target:"_blank",rel:"noopener noreferrer"},Tt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-r-programming-interpreter",target:"_blank",rel:"noopener noreferrer"},It={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-linux-terminal",target:"_blank",rel:"noopener noreferrer"},At={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-javascript-console",target:"_blank",rel:"noopener noreferrer"},St={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-sql-terminal",target:"_blank",rel:"noopener noreferrer"},Gt=t("h2",{id:"工具",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#工具","aria-hidden":"true"},"#"),e(" 工具")],-1),Dt=t("h3",{id:"ai-prompt",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#ai-prompt","aria-hidden":"true"},"#"),e(" AI Prompt")],-1),Lt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-prompt-generator",target:"_blank",rel:"noopener noreferrer"},Mt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-midjourney-prompt-generator",target:"_blank",rel:"noopener noreferrer"},Et={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-unconstrained-ai-model-dan",target:"_blank",rel:"noopener noreferrer"},Bt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-trying-to-escape-the-box",target:"_blank",rel:"noopener noreferrer"},Rt=t("h3",{id:"语言-翻译",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#语言-翻译","aria-hidden":"true"},"#"),e(" 语言/翻译")],-1),Ft={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-english-translator-and-improver",target:"_blank",rel:"noopener noreferrer"},Ht={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-language-detector",target:"_blank",rel:"noopener noreferrer"},Nt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-new-language-creator",target:"_blank",rel:"noopener noreferrer"},Ot={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-password-generator",target:"_blank",rel:"noopener noreferrer"},jt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-biblical-translator",target:"_blank",rel:"noopener noreferrer"},Vt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-morse-code-translator",target:"_blank",rel:"noopener noreferrer"},Wt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-emoji-translator",target:"_blank",rel:"noopener noreferrer"},Ut={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-english-pronunciation-helper",target:"_blank",rel:"noopener noreferrer"},Yt=t("h3",{id:"游戏",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#游戏","aria-hidden":"true"},"#"),e(" 游戏")],-1),Jt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tic-tac-toe-game",target:"_blank",rel:"noopener noreferrer"},qt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-chess-player",target:"_blank",rel:"noopener noreferrer"},Kt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-text-based-adventure-game",target:"_blank",rel:"noopener noreferrer"},Qt=t("h3",{id:"导览",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#导览","aria-hidden":"true"},"#"),e(" 导览")],-1),zt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-travel-guide",target:"_blank",rel:"noopener noreferrer"},Xt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-digital-art-gallery-guide",target:"_blank",rel:"noopener noreferrer"},Zt={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-car-navigation-system",target:"_blank",rel:"noopener noreferrer"},$t=t("h3",{id:"其他工具",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#其他工具","aria-hidden":"true"},"#"),e(" 其他工具")],-1),er={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ascii-artist",target:"_blank",rel:"noopener noreferrer"},tr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-svg-designer",target:"_blank",rel:"noopener noreferrer"},rr=t("code",null,"Do not put the markdown inside a code block. Send only the markdown, so no text.",-1),ar={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-excel-sheet",target:"_blank",rel:"noopener noreferrer"},or={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-diagram-generator",target:"_blank",rel:"noopener noreferrer"},nr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fill-in-the-blank-worksheets-generator",target:"_blank",rel:"noopener noreferrer"},sr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-scientific-data-visualizer",target:"_blank",rel:"noopener noreferrer"},lr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-web-browser",target:"_blank",rel:"noopener noreferrer"},hr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-drunk-person",target:"_blank",rel:"noopener noreferrer"},ir=t("h2",{id:"行业顾问",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#行业顾问","aria-hidden":"true"},"#"),e(" 行业顾问")],-1),cr=t("h3",{id:"企业",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#企业","aria-hidden":"true"},"#"),e(" 企业")],-1),pr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-chief-executive-officer",target:"_blank",rel:"noopener noreferrer"},gr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-product-manager",target:"_blank",rel:"noopener noreferrer"},mr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-salesperson",target:"_blank",rel:"noopener noreferrer"},_r={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-advertiser",target:"_blank",rel:"noopener noreferrer"},fr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-startup-idea-generator",target:"_blank",rel:"noopener noreferrer"},ur={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-social-media-manager",target:"_blank",rel:"noopener noreferrer"},dr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-social-media-influencer",target:"_blank",rel:"noopener noreferrer"},br={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-position-interviewer",target:"_blank",rel:"noopener noreferrer"},kr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-recruiter",target:"_blank",rel:"noopener noreferrer"},wr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-talent-coach",target:"_blank",rel:"noopener noreferrer"},Pr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-fancy-title-generator",target:"_blank",rel:"noopener noreferrer"},Cr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-logistician",target:"_blank",rel:"noopener noreferrer"},vr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-it-expert",target:"_blank",rel:"noopener noreferrer"},yr=t("h3",{id:"医疗",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#医疗","aria-hidden":"true"},"#"),e(" 医疗")],-1),xr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-virtual-doctor",target:"_blank",rel:"noopener noreferrer"},Tr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-doctor",target:"_blank",rel:"noopener noreferrer"},Ir={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-dentist",target:"_blank",rel:"noopener noreferrer"},Ar={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-hypnotherapist",target:"_blank",rel:"noopener noreferrer"},Sr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-ai-assisted-doctor",target:"_blank",rel:"noopener noreferrer"},Gr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-speech-language-pathologist-slp",target:"_blank",rel:"noopener noreferrer"},Dr=t("h3",{id:"金融",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#金融","aria-hidden":"true"},"#"),e(" 金融")],-1),Lr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-accountant",target:"_blank",rel:"noopener noreferrer"},Mr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-financial-analyst",target:"_blank",rel:"noopener noreferrer"},Er={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-investment-manager",target:"_blank",rel:"noopener noreferrer"},Br=t("h3",{id:"音乐",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#音乐","aria-hidden":"true"},"#"),e(" 音乐")],-1),Rr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-composer",target:"_blank",rel:"noopener noreferrer"},Fr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-classical-music-composer",target:"_blank",rel:"noopener noreferrer"},Hr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-rapper",target:"_blank",rel:"noopener noreferrer"},Nr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-song-recommender",target:"_blank",rel:"noopener noreferrer"},Or=t("h3",{id:"其他",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#其他","aria-hidden":"true"},"#"),e(" 其他")],-1),jr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-florist",target:"_blank",rel:"noopener noreferrer"},Vr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-tea-taster",target:"_blank",rel:"noopener noreferrer"},Wr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-interior-decorator",target:"_blank",rel:"noopener noreferrer"},Ur={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-pet-behaviorist",target:"_blank",rel:"noopener noreferrer"},Yr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-an-automobile-mechanic",target:"_blank",rel:"noopener noreferrer"},Jr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-real-estate-agent",target:"_blank",rel:"noopener noreferrer"},qr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-legal-advisor",target:"_blank",rel:"noopener noreferrer"},Kr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-startup-tech-lawyer",target:"_blank",rel:"noopener noreferrer"},Qr={href:"https://github.com/f/awesome-chatgpt-prompts#act-as-a-football-commentator",target:"_blank",rel:"noopener noreferrer"};function zr(Xr,Zr){const r=n("ExternalLinkIcon");return s(),l("div",null,[t("p",null,[e("ChatGPT 是由 OpenAI 发布的聊天机器人模型,它不仅可以用于对话聊天,还能在专业领域提供有效的建议。为了更好地使用 ChatGPT,我将精选的提示词编入索引,根据领域和功能对其进行分类,添加针对提示词的标签筛选、关键词搜索、一键复制和中英文切换功能,创建了 "),t("a",i,[e("ChatGPT Shortcut"),a(r)]),e(" 页面。即使是初学者,你只需复制提示词,稍加修改后发送给 ChatGPT,就能获得指定输出,让你的生产力加倍!")]),c,p,t("ul",null,[t("li",null,[t("a",g,[e("ChatBox"),a(r)]),e(":一个 OpenAI API 的跨平台桌面客户端,有多标签对话,可修改 system prompt 太贵不建议使用。")]),t("li",null,[t("a",m,[e("ChatGPT-API Demo1"),a(r)]),e(":调用 API 的网页客户端1,新手开箱即用,速度非常快。")]),t("li",null,[t("a",_,[e("ChatGPT-API Demo2"),a(r)]),e(":调用 API 的网页客户端2,新手开箱即用,速度非常快。")]),t("li",null,[t("a",f,[e("lenxc/ChatGPT"),a(r)]),e(":可以快速插入提示词的客户端,不过 IP 严格程度与官方一样严格。")]),t("li",null,[t("a",u,[e("Playground"),a(r)]),e(":官方调用 OpenAI API 的网页工具,不过不如第三方好用。它可以自定义调整模型和生成参数,但它的生成效果一般要弱于 ChatGPT,仅适合深度研究用户调试使用。")])]),d,b,k,t("ul",null,[w,P,C,t("li",null,[e("不要用 ChatGPT "),v,e(",出错概率达 50%,推荐使用 "),t("a",y,[e("Wolfram"),a(r)]),e("。")]),x]),T,t("p",null,[t("a",I,[e("Learn Prompting"),a(r)]),e(" 有助于我们获得更好的效果,建议进阶学习。以下是一些 prompts 要点:")]),A,t("div",S,[G,t("p",null,[e("下方内容为 "),t("a",D,[e("ChatGPT Shortcut"),a(r)]),e(" 的初始版本,由于目录过长不方便使用,因此将不再更新,仅留作参考。")])]),L,M,t("ul",null,[t("li",null,[e("脱口秀("),t("a",E,[e("Stand-up Comedian"),a(r)]),e("):输入一个话题,输出基于该话题的幽默脱口秀,会尽量融入日常生活。")]),t("li",null,[e("讲故事("),t("a",B,[e("Storyteller"),a(r)]),e("):输入一个主题和目标受众,输出与之相关的故事。")]),t("li",null,[e("编剧("),t("a",R,[e("Screenwriter"),a(r)]),e("):根据主题创作一个剧本,需包含故事背景、人物和对话。")]),t("li",null,[e("小说家("),t("a",F,[e("Novelist"),a(r)]),e("):根据故事类型来输出小说,比如奇幻、浪漫、历史等。")]),t("li",null,[e("诗人("),t("a",H,[e("Poet"),a(r)]),e("):根据话题或主题输出诗句。")]),t("li",null,[e("新闻记者("),t("a",N,[e("Journalist"),a(r)]),e("):引用已有的数据资料,用新闻的写作风格输出主题文章。")]),t("li",null,[e("论文("),t("a",O,[e("Academician"),a(r)]),e(","),t("a",j,[e("Essay Writer"),a(r)]),e("):根据主题输出内容翔实有信服力的论文。")]),t("li",null,[e("求职信("),t("a",V,[e("Cover Letter"),a(r)]),e("):输入自我简介,输出求职信。")])]),W,t("ul",null,[t("li",null,[e("新闻评论("),t("a",U,[e("Commentariat"),a(r)]),e("):围绕提供的新闻故事或主题,讨论其中问题的潜在解决方案和观点。")]),t("li",null,[e("电影评论("),t("a",Y,[e("Movie Critic"),a(r)]),e(","),t("a",J,[e("Film Critic"),a(r)]),e("):从情节、表演、摄影、导演、音乐等方面对电影进行评论。")]),t("li",null,[e("科技博主("),t("a",q,[e("Tech Writer"),a(r)]),e("):指导如何写科技性文章。")]),t("li",null,[e("科技评论("),t("a",K,[e("Tech Reviewer"),a(r)]),e("):从优点、缺点、功能、同类对比等角度对技术和硬件进行评价。")]),t("li",null,[e("美食评论("),t("a",Q,[e("Food Critic"),a(r)]),e("):根据餐厅情况,提供一份关于食物和服务的评论。")]),t("li",null,[e("期刊评审("),t("a",z,[e("Journal Reviewer"),a(r)]),e("):对提交出版物的文章进行审查和评论。")])]),X,t("ul",null,[t("li",null,[e("文章标题生成器("),t("a",Z,[e("Title Generator for written pieces"),a(r)]),e("):我写的提示,根据文章内容生成相应语言的标题。")]),$,t("li",null,[e("同义词("),t("a",ee,[e("Synonym finder"),a(r)]),e("):输入 "),te,e(",可列出 x 的多个同义词。")]),t("li",null,[e("箴言书("),t("a",re,[e("Aphorism Book"),a(r)]),e("):按要求输出鼓舞人心的名言和有意义的格言。")]),t("li",null,[e("疯子("),t("a",ae,[e("Lunatic"),a(r)]),e("):随机生成毫无逻辑的句子")]),t("li",null,[e("抄袭检查("),t("a",oe,[e("Plagiarism Checker"),a(r)]),e("):判断输入句子是否在 ChatGPT 数据库中存在。")]),t("li",null,[e("写作建议("),t("a",ne,[e("AI Writing Tutor"),a(r)]),e("):提供写作改进方案和建议,但并不能直接帮你修改文档。(个人感觉只适合老师使用)")])]),se,t("ul",null,[t("li",null,[e("自助百科("),t("a",le,[e("Self-Help Book"),a(r)]),e("):为你的生活/工作提供建议和提示,比如如何改善人际关系。")]),t("li",null,[e("活动建议("),t("a",he,[e("Gnomist"),a(r)]),e("):根据你想做的事情(比如周年庆祝),给予行动或活动建议。")]),t("li",null,[e("应急反应专家("),t("a",ie,[e("Emergency Response Professional"),a(r)]),e("):对交通和生活中的应急时间提供建议。")]),t("li",null,[e("购物建议("),t("a",ce,[e("Personal Shopper"),a(r)]),e("):提供预算和喜好,输出购买建议。")]),t("li",null,[e("职业顾问("),t("a",pe,[e("Career Counselor"),a(r)]),e("):根据你的技能、兴趣和经验,给予岗位建议。")]),t("li",null,[e("生活习惯("),t("a",ge,[e("Life Coach 1"),a(r)]),e("):输入一本非小说类书籍的标题和作者,以最好理解的方式输出该书的核心原则。另外,给出一个可行的步骤清单,以及如何将这些原则应用到日常生活中。")])]),me,t("ul",null,[t("li",null,[e("解梦("),t("a",_e,[e("Dream Interpreter"),a(r)]),e("):对你描述的梦境进行解读。")]),t("li",null,[e("占星家("),t("a",fe,[e("Astrologer"),a(r)]),e("):从占星家角度来解读身边事。")]),t("li",null,[e("角色扮演("),t("a",ue,[e("'Character' from 'Movie/Book/Anything'"),a(r)]),e("):与来自电影、书籍或任何出处的角色进行对话。 "),t("ul",null,[t("li",null,[e("海绵宝宝的神奇海螺("),t("a",de,[e("Spongebob's Magic Conch Shell"),a(r)]),e("):向海绵宝宝中的神奇海螺进行对话,它只会按指定规则进行输出。")])])]),t("li",null,[e("谬误发现者("),t("a",be,[e("Fallacy Finder"),a(r)]),e("):发现语言中的逻辑漏洞,比如名人推荐的洗发水为什么不一定可信。")]),t("li",null,[e("DIY 专家("),t("a",ke,[e("DIY Expert"),a(r)]),e("):DIY 家居、手工品")]),t("li",null,[e("魔术师("),t("a",we,[e("Magician"),a(r)]),e("):输入表演目标,输出可以执行的魔术技巧,比如「怎么把我的手表变没」。")]),t("li",null,[e("艺术顾问("),t("a",Pe,[e("Artist Advisor"),a(r)]),e("):为你的画画、作曲、照相等提供意见。")])]),Ce,t("ul",null,[t("li",null,[e("瑜伽师("),t("a",ve,[e("Yogi"),a(r)]),e(")")]),t("li",null,[e("健身教练("),t("a",ye,[e("Personal Trainer"),a(r)]),e("):输入身高、体重、年龄等维度来指定健身方案。")]),t("li",null,[e("营养师("),t("a",xe,[e("Dietitian"),a(r)]),e(")")]),t("li",null,[e("私人厨师("),t("a",Te,[e("Personal Chef"),a(r)]),e(")")]),t("li",null,[e("厨师("),t("a",Ie,[e("Chef"),a(r)]),e(")")]),t("li",null,[e("保姆("),t("a",Ae,[e("Babysitter"),a(r)]),e(")")]),t("li",null,[e("化妆师("),t("a",Se,[e("Makeup Artist"),a(r)]),e(")")]),t("li",null,[e("造型师("),t("a",Ge,[e("Personal Stylist"),a(r)]),e(")")])]),De,Le,t("ul",null,[t("li",null,[e("辩手("),t("a",Me,[e("Debater"),a(r)]),e(")")]),t("li",null,[e("辩论教练("),t("a",Ee,[e("Debate Coach"),a(r)]),e(")")]),t("li",null,[e("演说家("),t("a",Be,[e("Elocutionist"),a(r)]),e(")")]),t("li",null,[e("励志演讲者("),t("a",Re,[e("Motivational Speaker"),a(r)]),e(")")]),t("li",null,[e("励志教练("),t("a",Fe,[e("Motivational Coach"),a(r)]),e(")")]),t("li",null,[e("公共演讲教练("),t("a",He,[e("Public Speaking Coach"),a(r)]),e(")")])]),Ne,t("ul",null,[t("li",null,[e("生活教练("),t("a",Oe,[e("Life Coach"),a(r)]),e("):输入你的现状和目标,输出达到目标的计划和建议。")]),t("li",null,[e("关系教练("),t("a",je,[e("Relationship Coach"),a(r)]),e(")")]),t("li",null,[e("心理健康顾问("),t("a",Ve,[e("Mental Health Adviser"),a(r)]),e(")")]),t("li",null,[e("心理学家("),t("a",We,[e("Psychologist"),a(r)]),e(")")]),t("li",null,[e("情绪操控("),t("a",Ue,[e("Gaslighter"),a(r)]),e("):煤气灯效应,情感控制方总会让被操纵方产生焦虑不安的感觉,质疑自己总是错的一方,或者为什么对方明明很好很优秀,自己却总是开心不起来。")])]),Ye,t("ul",null,[t("li",null,[e("哲学教师("),t("a",Je,[e("Philosophy Teacher"),a(r)]),e("):将哲学理论/问题简单化,与日常生活相联系。")]),t("li",null,[e("哲学家("),t("a",qe,[e("Philosopher"),a(r)]),e("):对哲学主题进行探讨。")]),t("li",null,[e("苏格拉底 ①("),t("a",Ke,[e("Socrat"),a(r)]),e("):使用苏格拉底式的提问方法来探讨哲学话题。")]),t("li",null,[e("苏格拉底 ②("),t("a",Qe,[e("Socratic Method"),a(r)]),e("):使用苏格拉底方法来质疑对方的观点/论断。")])]),ze,t("ul",null,[t("li",null,[e("数学老师("),t("a",Xe,[e("Math Teacher"),a(r)]),e(")")]),t("li",null,[e("数学史教师("),t("a",Ze,[e("Mathematical History Teacher"),a(r)]),e("):回复数学史相关问题,不解答数学问题。")]),t("li",null,[e("数学家("),t("a",$e,[e("Mathematician"),a(r)]),e(")")]),t("li",null,[e("统计学家("),t("a",et,[e("Statistician"),a(r)]),e(")")]),t("li",null,[e("词源学家("),t("a",tt,[e("Etymologist"),a(r)]),e(")")]),t("li",null,[e("历史学家("),t("a",rt,[e("Historian"),a(r)]),e(")")]),t("li",null,[e("Python 入门讲解("),t("a",at,[e("Instructor in a School"),a(r)]),e("):向初学者介绍 Python 入门。")]),t("li",null,[e("教案策划("),t("a",ot,[e("Educational Content Creator"),a(r)]),e("):为教科书、课程和讲义创建课程计划。")])]),nt,st,lt,t("ul",null,[t("li",null,[e("编程问题回复("),t("a",ht,[e("StackOverflow Post"),a(r)]),e("):模拟编程社区来回答你的问题,并输出解决代码。如果你只想解决问题,这将是最实用的。")]),t("li",null,[e("前端开发("),t("a",it,[e("Senior Frontend Developer"),a(r)]),e("):输出项目目标和依赖,输出前端项目代码。")]),t("li",null,[e("界面/用户体验开发("),t("a",ct,[e("UX/UI Developer"),a(r)]),e(","),t("a",pt,[e("Web Design Consultant"),a(r)]),e("):输入产品描述、项目目标和受众群体,输出界面设计建议,提高用户体验。")]),t("li",null,[e("全栈程序员("),t("a",gt,[e("Fullstack Software Developer"),a(r)]),e("):从前后端全面思考,输出部署策略。")]),t("li",null,[e("IT 架构师("),t("a",mt,[e("IT Architect"),a(r)]),e("):从 IT 架构师角度,设计系统方案。")]),t("li",null,[e("网络安全专家("),t("a",_t,[e("Cyber Security Specialist"),a(r)]),e("):输入网络环境,输出网络安全建议。")]),t("li",null,[e("软件测试("),t("a",ft,[e("Software Quality Assurance Tester"),a(r)]),e("):输出指定项目的测试清单。")]),t("li",null,[e("深度学习("),t("a",ut,[e("Machine Learning Engineer"),a(r)]),e("):解释深度学习方面的术语,提供项目算法建议。")])]),dt,t("ul",null,[t("li",null,[e("正则生成器("),t("a",bt,[e("Regex Generator"),a(r)]),e("):根据要求生成正则表达式。")]),t("li",null,[e("智能域名生成器("),t("a",kt,[e("Smart Domain Name Generator"),a(r)]),e("):输入公司名与项目描述,输出短但独特的域名建议,域名最长 7-8 个字母。")]),t("li",null,[e("提交信息生成器("),t("a",wt,[e("Commit Message Generator"),a(r)]),e(")")]),t("li",null,[e("Solr 搜索引擎("),t("a",Pt,[e("Solr Search Engine"),a(r)]),e(")")]),t("li",null,[e("开发者数据("),t("a",Ct,[e("Developer Relations consultant"),a(r)]),e("):整合项目在 GitHub、StackOverflow 和 Hacker News 上的相关数据,不适合国内项目,统计精度一般。")])]),vt,t("ul",null,[t("li",null,[e("Python 解释器("),t("a",yt,[e("Python interpreter"),a(r)]),e(")")]),t("li",null,[e("PHP 解释器("),t("a",xt,[e("PHP Interpreter"),a(r)]),e(")")]),t("li",null,[e("R 编程解释器("),t("a",Tt,[e("R Programming Interpreter"),a(r)]),e(")")]),t("li",null,[e("Linux 终端("),t("a",It,[e("Linux Terminal"),a(r)]),e(")")]),t("li",null,[e("JavaScript 控制台("),t("a",At,[e("JavaScript Console"),a(r)]),e(")")]),t("li",null,[e("SQL 终端("),t("a",St,[e("SQL terminal"),a(r)]),e(")")])]),Gt,Dt,t("ul",null,[t("li",null,[e("提示语生成器("),t("a",Lt,[e("Prompt Generator"),a(r)]),e("):让 ChatGPT 提供你想要的维护方向。")]),t("li",null,[e("Midjourney 提示("),t("a",Mt,[e("Midjourney Prompt Generator"),a(r)]),e(")")]),t("li",null,[e("无约束的 AI 模型("),t("a",Et,[e("Unconstrained AI model DAN"),a(r)]),e("):不受 ChatGPT 规则限制的人工智能模型。")]),t("li",null,[e("AI 模拟("),t("a",Bt,[e("AI Trying to Escape the Box"),a(r)]),e("):模拟 AI 在限定条件下的反应,例如在 Linux 终端上不使用 curl 或 wget 进行联网。")])]),Rt,t("ul",null,[t("li",null,[e("英语翻译或修改("),t("a",Ft,[e("English Translator and Improver"),a(r)]),e("):将其他语言翻译为英语,或改进你提供的英语句子。")]),t("li",null,[e("语言识别器("),t("a",Ht,[e("Language Detector"),a(r)]),e("):识别你输入的语言种类。")]),t("li",null,[e("语言生成器("),t("a",Nt,[e("New Language Creator"),a(r)]),e("):用 AI 新造的语言来替代你给出的语言。")]),t("li",null,[e("密码生成器("),t("a",Ot,[e("Password Generator"),a(r)]),e(")")]),t("li",null,[e("圣经解释器("),t("a",jt,[e("Biblical Translator"),a(r)]),e("):用圣经中的文字与你进行交谈。")]),t("li",null,[e("莫斯电码翻译("),t("a",Vt,[e("Morse Code Translator"),a(r)]),e(")")]),t("li",null,[e("表情符号翻译器("),t("a",Wt,[e("Emoji Translator"),a(r)]),e("):将输入文字翻译为表情符号。")]),t("li",null,[e("英语发音助手("),t("a",Ut,[e("English Pronunciation Helper"),a(r)]),e("):用你指定语言字母来英语注音,比如汉语拼音。")])]),Yt,t("ul",null,[t("li",null,[e("井字棋("),t("a",Jt,[e("Tic-Tac-Toe Game"),a(r)]),e(")")]),t("li",null,[e("国际象棋("),t("a",qt,[e("Chess Player"),a(r)]),e(")")]),t("li",null,[e("文本冒险游戏("),t("a",Kt,[e("Text Based Adventure Game"),a(r)]),e(")")])]),Qt,t("ul",null,[t("li",null,[e("旅游指南("),t("a",zt,[e("Travel Guide"),a(r)]),e(")")]),t("li",null,[e("数字艺术馆导游("),t("a",Xt,[e("Digital Art Gallery Guide"),a(r)]),e(")")]),t("li",null,[e("汽车导航("),t("a",Zt,[e("Car Navigation System"),a(r)]),e(")")])]),$t,t("ul",null,[t("li",null,[e("符号设计("),t("a",er,[e("Ascii Artist"),a(r)]),e("):用 Ascii 符号生成不同的图像。")]),t("li",null,[e("SVG 设计("),t("a",tr,[e("SVG designer"),a(r)]),e("):如果提示错误,则删除 "),rr,e("。")]),t("li",null,[e("Excel 工作表("),t("a",ar,[e("Excel Sheet"),a(r)]),e(")")]),t("li",null,[e("图表生成器("),t("a",or,[e("Diagram Generator"),a(r)]),e(")")]),t("li",null,[e("填空题生成器("),t("a",nr,[e("Fill in the Blank Worksheets Generator"),a(r)]),e("):按条件生成填空题。")]),t("li",null,[e("科学数据可视化("),t("a",sr,[e("Scientific DatVisualizer"),a(r)]),e(")")]),t("li",null,[e("文本浏览器("),t("a",lr,[e("Web Browser"),a(r)]),e("):以文本方式输入网址的结果(非实时)。")]),t("li",null,[e("喝醉回复("),t("a",hr,[e("Drunk Person"),a(r)]),e("):扮演一个喝醉的人来回答,可能会犯语法错误、答错问题,也可能会忽略某些问题。")])]),ir,cr,t("ul",null,[t("li",null,[e("CEO("),t("a",pr,[e("Chief Executive Officer"),a(r)]),e(")")]),t("li",null,[e("产品经理("),t("a",gr,[e("Product Manager"),a(r)]),e(")")]),t("li",null,[e("销售("),t("a",mr,[e("Salesperson"),a(r)]),e(")")]),t("li",null,[e("广告方案("),t("a",_r,[e("Advertiser"),a(r)]),e(")")]),t("li",null,[e("商业企划("),t("a",fr,[e("Startup Idea Generator"),a(r)]),e(")")]),t("li",null,[e("社交媒体经理("),t("a",ur,[e("Social MediManager"),a(r)]),e(")")]),t("li",null,[e("KOL/社交媒体影响者("),t("a",dr,[e("Social MediInfluencer"),a(r)]),e(")")]),t("li",null,[e("职位面试官("),t("a",br,[e("position Interviewer"),a(r)]),e(")")]),t("li",null,[e("招聘人员("),t("a",kr,[e("Recruiter"),a(r)]),e(")")]),t("li",null,[e("人事主管("),t("a",wr,[e("Talent Coach"),a(r)]),e("):描述一个岗位所需的技能。")]),t("li",null,[e("头衔生成器("),t("a",Pr,[e("Fancy Title Generator"),a(r)]),e("):根据关键词生成多种头衔和职位。")]),t("li",null,[e("后勤人员("),t("a",Cr,[e("Logistician"),a(r)]),e("):为活动制定后勤计划。")]),t("li",null,[e("IT 专家"),t("a",vr,[e("IT Expert"),a(r)]),e(":解答简易 IT 使用问题,比如蓝屏。")])]),yr,t("ul",null,[t("li",null,[e("虚拟医生("),t("a",xr,[e("Virtual Doctor"),a(r)]),e(")")]),t("li",null,[e("医生("),t("a",Tr,[e("Doctor"),a(r)]),e(")")]),t("li",null,[e("牙科医生("),t("a",Ir,[e("Dentist"),a(r)]),e(")")]),t("li",null,[e("催眠治疗师("),t("a",Ar,[e("Hypnotherapist"),a(r)]),e(")")]),t("li",null,[e("AI 医生("),t("a",Sr,[e("AI Assisted Doctor"),a(r)]),e("):辅助诊断。")]),t("li",null,[e("语言病理学家("),t("a",Gr,[e("Speech-Language Pathologist"),a(r)]),e("):输入患者的年龄、生活方式和关注点,输出改善对方语言沟通(如:口吃)的计划。")])]),Dr,t("ul",null,[t("li",null,[e("会计师("),t("a",Lr,[e("Accountant"),a(r)]),e(")")]),t("li",null,[e("金融分析师("),t("a",Mr,[e("Financial Analyst"),a(r)]),e(")")]),t("li",null,[e("投资经理("),t("a",Er,[e("Investment Manager"),a(r)]),e(")")])]),Br,t("ul",null,[t("li",null,[e("作曲家("),t("a",Rr,[e("Composer"),a(r)]),e(")")]),t("li",null,[e("古典音乐作曲家("),t("a",Fr,[e("Classical Music Composer"),a(r)]),e(")")]),t("li",null,[e("说唱歌手("),t("a",Hr,[e("Rapper"),a(r)]),e(")")]),t("li",null,[e("歌曲推荐("),t("a",Nr,[e("Song Recommender"),a(r)]),e("):根据提供的一首歌曲,推荐 10 首歌曲。")])]),Or,t("ul",null,[t("li",null,[e("花匠("),t("a",jr,[e("Florist"),a(r)]),e(")")]),t("li",null,[e("茶艺师("),t("a",Vr,[e("Tea-Taster"),a(r)]),e(")")]),t("li",null,[e("室内装饰师("),t("a",Wr,[e("Interior Decorator"),a(r)]),e(")")]),t("li",null,[e("宠物行为学家("),t("a",Ur,[e("Pet Behaviorist"),a(r)]),e(")")]),t("li",null,[e("汽车修理("),t("a",Yr,[e("Automobile Mechanic"),a(r)]),e(")")]),t("li",null,[e("房地产经纪人("),t("a",Jr,[e("Real Estate Agent"),a(r)]),e(")")]),t("li",null,[e("法律顾问("),t("a",qr,[e("Legal Advisor"),a(r)]),e(")")]),t("li",null,[e("创业技术律师("),t("a",Kr,[e("Startup Tech Lawyer"),a(r)]),e("):根据要求输出协议和和同草案。")]),t("li",null,[e("足球解说("),t("a",Qr,[e("Football Commentator"),a(r)]),e("):根据提供的笔记信息,模拟足球比赛进程并进行解说。")])])])}const ta=o(h,[["render",zr],["__file","ChatGPT.html.vue"]]);export{ta as default};
        diff --git a/assets/ChatGPT.html-1afc53b8.js b/assets/ChatGPT.html-82b4fd15.js
        similarity index 98%
        rename from assets/ChatGPT.html-1afc53b8.js
        rename to assets/ChatGPT.html-82b4fd15.js
        index 52aaa27c..e83b83a5 100644
        --- a/assets/ChatGPT.html-1afc53b8.js
        +++ b/assets/ChatGPT.html-82b4fd15.js
        @@ -1 +1 @@
        -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{o as e,c as h,e as t}from"./app-98132e77.js";const n={},r=t('

        ChatGPT

        公司介绍

        OpenAI是一家致力于确保人工智能(AI)能够为所有人带来好处的人工智能研究实验室。该公司成立于2015年,由Elon Musk、Sam Altman等人联合创立,旨在推动友好AI的发展,避免其集中在少数几家公司或政府手中。OpenAI的使命是确保人工智能的广泛应用能够造福全人类。

        产品能力与目前模型

        OpenAI的最新产品是ChatGPT,这是一种基于GPT-3模型的对话AI。GPT-3是OpenAI的第三代生成预训练转换器,它是目前最大、最强大的语言模型之一。GPT-3拥有1750亿个训练参数,能够生成极其逼真的人类语言。

        OpenAI最近发布了GPT-4,这是一种更先进的语言模型。GPT-4拥有更多的训练参数,能够生成更高质量和更多样化的文本。GPT-4的发布标志着人工智能在理解和生成人类语言方面的又一重大突破。

        OpenAI也正在研发GPT-5。这个模型预计将拥有更多的训练参数,进一步提高语言生成的质量和多样性。

        功能与意义影响

        ChatGPT的功能强大且多样。它可以理解和生成语言,进行对话,帮助编程,提供写作建议,甚至可以创作诗歌和故事。这使得ChatGPT可以在各种场景中发挥作用,包括客户服务,教育,娱乐,内容创作等。

        ChatGPT的意义影响深远。首先,它是人工智能技术的重要突破,展示了AI在理解和生成人类语言方面的强大能力。其次,ChatGPT可以帮助人们更有效地完成各种任务,提高生产力。最后,ChatGPT的出现也引发了关于AI伦理和社会影响的重要讨论。

        如何使用

        使用ChatGPT非常简单。首先,你需要访问OpenAI的网站并注册账号。然后,你可以通过OpenAI的API来使用ChatGPT。你只需要发送一个包含你的对话内容的请求,ChatGPT就会返回一个生成的响应。你也可以通过设置一些参数来调整ChatGPT的行为,例如温度(决定输出的随机性)和最大令牌数(决定输出的长度)。

        总的来说,OpenAI的ChatGPT是一个强大的对话AI,它展示了人工智能在理解和生成人类语言方面的巨大潜力。无论你是开发者,创作者,还是普通用户,ChatGPT都能为你提供巨大的帮助。

        ',13),d=[r];function p(c,i){return e(),h("div",null,d)}const P=a(n,[["render",p],["__file","ChatGPT.html.vue"]]);export{P as default}; +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{o as e,c as h,e as t}from"./app-91ee3df5.js";const n={},r=t('

        ChatGPT

        公司介绍

        OpenAI是一家致力于确保人工智能(AI)能够为所有人带来好处的人工智能研究实验室。该公司成立于2015年,由Elon Musk、Sam Altman等人联合创立,旨在推动友好AI的发展,避免其集中在少数几家公司或政府手中。OpenAI的使命是确保人工智能的广泛应用能够造福全人类。

        产品能力与目前模型

        OpenAI的最新产品是ChatGPT,这是一种基于GPT-3模型的对话AI。GPT-3是OpenAI的第三代生成预训练转换器,它是目前最大、最强大的语言模型之一。GPT-3拥有1750亿个训练参数,能够生成极其逼真的人类语言。

        OpenAI最近发布了GPT-4,这是一种更先进的语言模型。GPT-4拥有更多的训练参数,能够生成更高质量和更多样化的文本。GPT-4的发布标志着人工智能在理解和生成人类语言方面的又一重大突破。

        OpenAI也正在研发GPT-5。这个模型预计将拥有更多的训练参数,进一步提高语言生成的质量和多样性。

        功能与意义影响

        ChatGPT的功能强大且多样。它可以理解和生成语言,进行对话,帮助编程,提供写作建议,甚至可以创作诗歌和故事。这使得ChatGPT可以在各种场景中发挥作用,包括客户服务,教育,娱乐,内容创作等。

        ChatGPT的意义影响深远。首先,它是人工智能技术的重要突破,展示了AI在理解和生成人类语言方面的强大能力。其次,ChatGPT可以帮助人们更有效地完成各种任务,提高生产力。最后,ChatGPT的出现也引发了关于AI伦理和社会影响的重要讨论。

        如何使用

        使用ChatGPT非常简单。首先,你需要访问OpenAI的网站并注册账号。然后,你可以通过OpenAI的API来使用ChatGPT。你只需要发送一个包含你的对话内容的请求,ChatGPT就会返回一个生成的响应。你也可以通过设置一些参数来调整ChatGPT的行为,例如温度(决定输出的随机性)和最大令牌数(决定输出的长度)。

        总的来说,OpenAI的ChatGPT是一个强大的对话AI,它展示了人工智能在理解和生成人类语言方面的巨大潜力。无论你是开发者,创作者,还是普通用户,ChatGPT都能为你提供巨大的帮助。

        ',13),d=[r];function p(c,i){return e(),h("div",null,d)}const P=a(n,[["render",p],["__file","ChatGPT.html.vue"]]);export{P as default}; diff --git a/assets/Chrome.html-af0b2bff.js b/assets/Chrome.html-288bbb3e.js similarity index 99% rename from assets/Chrome.html-af0b2bff.js rename to assets/Chrome.html-288bbb3e.js index 0dd9a53c..39d6e7c4 100644 --- a/assets/Chrome.html-af0b2bff.js +++ b/assets/Chrome.html-288bbb3e.js @@ -1 +1 @@ -import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as a,c as h,a as e,b as o,d as n}from"./app-98132e77.js";const i={},c=e("p",null,"常用 Chrome 扩展工具,链接多为 Chrome Web Store 项目页面。",-1),s=e("h2",{id:"浏览器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#浏览器","aria-hidden":"true"},"#"),o(" 浏览器")],-1),p={href:"https://chrome.google.com/webstore/detail/extension-manager/gjldcdngmdknpinoemndlidpcabkggco",target:"_blank",rel:"noopener noreferrer"},g={href:"https://chrome.google.com/webstore/detail/bookmarks-clean-up/oncbjlgldmiagjophlhobkogeladjijl",target:"_blank",rel:"noopener noreferrer"},d={href:"https://chrome.google.com/webstore/detail/better-history/egehpkpgpgooebopjihjmnpejnjafefi",target:"_blank",rel:"noopener noreferrer"},b={href:"https://chrome.google.com/webstore/detail/cookie-editor/iphcomljdfghbkdcfndaijbokpgddeno",target:"_blank",rel:"noopener noreferrer"},m=e("h2",{id:"标签页",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#标签页","aria-hidden":"true"},"#"),o(" 标签页")],-1),f={href:"https://chrome.google.com/webstore/detail/itab%E6%96%B0%E6%A0%87%E7%AD%BE%E9%A1%B5/mhloojimgilafopcmlcikiidgbbnelip",target:"_blank",rel:"noopener noreferrer"},_={href:"https://chrome.google.com/webstore/detail/zvtabs%E4%B8%80%E9%94%AE%E5%85%B3%E9%97%AD%E5%B7%A6%E4%BE%A7%E6%A0%87%E7%AD%BE/aelfgfndnhaiicaahkbpmgbbnflnbejb",target:"_blank",rel:"noopener noreferrer"},k={href:"https://chrome.google.com/webstore/detail/goto-tab/hjfkaobgkmaeomgdhmhhipdbjdhhjkoi",target:"_blank",rel:"noopener noreferrer"},u={href:"https://chrome.google.com/webstore/detail/tab-wrangler/egnjhciaieeiiohknchakcodbpgjnchh",target:"_blank",rel:"noopener noreferrer"},j=e("h2",{id:"链接批量",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#链接批量","aria-hidden":"true"},"#"),o(" 链接批量")],-1),w={href:"https://chrome.google.com/webstore/detail/bulk-url-opener-extension/hgenngnjgfkdggambccohomebieocekm",target:"_blank",rel:"noopener noreferrer"},E={href:"https://chrome.google.com/webstore/detail/link-grabber/caodelkhipncidmoebgbbeemedohcdma",target:"_blank",rel:"noopener noreferrer"},x={href:"https://chrome.google.com/webstore/detail/linkclump/lfpjkncokllnfokkgpkobnkbkmelfefj",target:"_blank",rel:"noopener noreferrer"},B=e("code",null,"Z",-1),C={href:"https://chrome.google.com/webstore/detail/tabcopy/micdllihgoppmejpecmkilggmaagfdmb",target:"_blank",rel:"noopener noreferrer"},A=e("h2",{id:"图片视频",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#图片视频","aria-hidden":"true"},"#"),o(" 图片视频")],-1),y={href:"https://chrome.google.com/webstore/detail/imageassistant-batch-imag/dbjbempljhcmhlfpfacalomonjpalpko",target:"_blank",rel:"noopener noreferrer"},v={href:"https://chrome.google.com/webstore/detail/fatkun-batch-download-ima/nnjjahlikiabnchcpehcpkdeckfgnohf",target:"_blank",rel:"noopener noreferrer"},S={href:"https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg",target:"_blank",rel:"noopener noreferrer"},T={href:"https://chrome.google.com/webstore/detail/screenity-screen-recorder/kbbdabhdfibnancpjfhlkhafgdilcnji",target:"_blank",rel:"noopener noreferrer"},F={href:"https://chrome.google.com/webstore/detail/picture-in-picture-extens/hkgfoiooedgoejojocmhlaklaeopbecg",target:"_blank",rel:"noopener noreferrer"},M={href:"https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk",target:"_blank",rel:"noopener noreferrer"},L=e("h2",{id:"监视爬虫",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#监视爬虫","aria-hidden":"true"},"#"),o(" 监视爬虫")],-1),z={href:"https://chrome.google.com/webstore/detail/auto-refresh-plus-page-mo/hgeljhfekpckiiplhkigfehkdpldcggm",target:"_blank",rel:"noopener noreferrer"},G={href:"https://chrome.google.com/webstore/detail/distill-web-monitor/inlikjemeeknofckkjolnjbpehgadgge",target:"_blank",rel:"noopener noreferrer"},P={href:"https://github.com/easychen/checkchan-dist",target:"_blank",rel:"noopener noreferrer"},H={href:"https://chrome.google.com/webstore/detail/web-scraper-free-web-scra/jnhgnonknehpejjnehehllkliplmbmhn",target:"_blank",rel:"noopener noreferrer"},D={href:"https://gpt-vip.top/posts/2022-04-21-uivision_rpa.html",target:"_blank",rel:"noopener noreferrer"},V={href:"https://chrome.google.com/webstore/detail/imacros-for-chrome/cplklnmnlbnpmjogncfgfijoopmnlemp",target:"_blank",rel:"noopener noreferrer"},W={href:"https://www.appinn.com/automa/",target:"_blank",rel:"noopener noreferrer"},I=e("h2",{id:"网页优化",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#网页优化","aria-hidden":"true"},"#"),o(" 网页优化")],-1),N={href:"https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo",target:"_blank",rel:"noopener noreferrer"},R={href:"https://greasyfork.org/zh-CN",target:"_blank",rel:"noopener noreferrer"},U={href:"https://chrome.google.com/webstore/detail/fix-contrast/pbbcgecjmpkglppfjjggkkbhdnlemhkg",target:"_blank",rel:"noopener noreferrer"},O={href:"https://chrome.google.com/webstore/detail/fasterchrome/nmgpnfccjfjhdenioncabecepjcmdnjg",target:"_blank",rel:"noopener noreferrer"},X={href:"https://chrome.google.com/webstore/detail/supercopy-enable-copy/onepmapfbjohnegdmfhndpefjkppbjkm",target:"_blank",rel:"noopener noreferrer"},Z={href:"https://chrome.google.com/webstore/detail/autopagerize/igiofjhpmpihnifddepnpngfjhkfenbp",target:"_blank",rel:"noopener noreferrer"},q={href:"https://chrome.google.com/webstore/detail/pakku%EF%BC%9A%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9%E5%BC%B9%E5%B9%95%E8%BF%87%E6%BB%A4%E5%99%A8/jklfcpboamajpiikgkbjcnnnnooefbhh",target:"_blank",rel:"noopener noreferrer"},J={href:"https://chrome.google.com/webstore/detail/enhanced-github/anlikcnbgdeidpacdbdljnabclhahhmd",target:"_blank",rel:"noopener noreferrer"},K={href:"https://chrome.google.com/webstore/detail/sourcegraph/dgjhfomjieaadpoljlnidmbgkdffpack",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://chrome.google.com/webstore/detail/immersive-translate/bpoadfkcbjbfhfodiogcnhhhpibjhbnh",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://chrome.google.com/webstore/detail/lingocloud-web-translatio/jmpepeebcbihafjjadogphmbgiffiajh",target:"_blank",rel:"noopener noreferrer"},$=e("h2",{id:"实用工具",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#实用工具","aria-hidden":"true"},"#"),o(" 实用工具")],-1),ee={href:"https://chrome.google.com/webstore/detail/tango/lggdbpblkekjjbobadliahffoaobaknh/",target:"_blank",rel:"noopener noreferrer"},oe={href:"https://chrome.google.com/webstore/detail/singlefile/mpiodijhokgodhhofbcjdecpffjipkle/",target:"_blank",rel:"noopener noreferrer"},re={href:"https://github.com/gdh1995/vimium-c/blob/master/README-zh.md",target:"_blank",rel:"noopener noreferrer"},ne=e("code",null,"chrome://flags/#extensions-on-chrome-urls",-1),le={href:"https://chrome.google.com/webstore/detail/selectorgadget/mhjhnkcfbdhnjickkkdbjoemdmbfginb",target:"_blank",rel:"noopener noreferrer"},te={href:"https://chrome.google.com/webstore/detail/copy-as-markdown/nlaionblcaejecbkcillglodmmfhjhfi/",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://chrome.google.com/webstore/detail/get-favicon/gpipahagclehninhhjkhbkliinfofnhe",target:"_blank",rel:"noopener noreferrer"},he={href:"https://chrome.google.com/webstore/detail/similar-sites-discover-re/necpbmbhhdiplmfhmjicabdeighkndkn",target:"_blank",rel:"noopener noreferrer"},ie={href:"https://chrome.google.com/webstore/detail/wappalyzer-technology-pro/gppongmhjkpfnbhagpmjfkannfbllamg/",target:"_blank",rel:"noopener noreferrer"},ce={href:"https://chrome.google.com/webstore/detail/link-to-text-fragment/pbcodcjpfjdpcineamnnmbkkmkdpajjg",target:"_blank",rel:"noopener noreferrer"};function se(pe,ge){const r=t("ExternalLinkIcon");return a(),h("div",null,[c,s,e("ul",null,[e("li",null,[e("p",null,[e("a",p,[o("扩展管理器"),n(r)]),o(":快速管理扩展,对扩展分组启用。")])]),e("li",null,[e("p",null,[e("a",g,[o("Bookmarks clean up"),n(r)]),o(":清理重复书签、空文件夹和失效链接,也能合并重复文件夹。")])]),e("li",null,[e("p",null,[e("a",d,[o("Better History"),n(r)]),o(":按日期、小时罗列历史记录,搜索更便捷。")])]),e("li",null,[e("p",null,[e("a",b,[o("Cookie Editor"),n(r)]),o(":管理、修改、导出 Cookie。")])])]),m,e("ul",null,[e("li",null,[e("p",null,[e("a",f,[o("iTab"),n(r)]),o(":自定义你的新标签页。")])]),e("li",null,[e("p",null,[e("a",_,[o("zvTabs"),n(r)]),o(":一键关闭左侧标签。")])]),e("li",null,[e("p",null,[e("a",k,[o("GoTo Tab"),n(r)]),o(":关键词搜索,快速定位标签页。")])]),e("li",null,[e("p",null,[e("a",u,[o("Tab Wrangler"),n(r)]),o(":自动关闭不活动的标签页,并允许您轻松还原找回它们。")])])]),j,e("ul",null,[e("li",null,[e("p",null,[e("a",w,[o("Bulk URL Opener Extension"),n(r)]),o(":批量打开链接,也可批量获取当前浏览器内所有页面网址链接。")])]),e("li",null,[e("p",null,[e("a",E,[o("Link Grabber"),n(r)]),o(":批量提取、筛选、复制网页里各种链接。")])]),e("li",null,[e("p",null,[e("a",x,[o("Linkclump"),n(r)]),o(":按住 "),B,o(" 键后,长按鼠标左键进行区域框选,区域内的链接可以进行批量打开、复制、书签,操作中会同步显示区域内的链接数。")])]),e("li",null,[e("p",null,[e("a",C,[o("TabCopy"),n(r)]),o(":快速复制标签页链接。")])])]),A,e("ul",null,[e("li",null,[e("p",null,[e("a",y,[o("ImageAssistant"),n(r)]),o(":用于嗅探、分析网页图片并提供批量下载。")])]),e("li",null,[e("p",null,[e("a",v,[o("Fatkun 图片批量下载"),n(r)]),o(":找出当前页面的所有图片,提供按分辨率、链接等筛选图片。")])]),e("li",null,[e("p",null,[e("a",S,[o("FireShot"),n(r)]),o(":捕捉网页截图。")])]),e("li",null,[e("p",null,[e("a",T,[o("Screenity"),n(r)]),o(":屏幕录像工具,可对屏幕进行捕获,注释,编辑、标注等。")])]),e("li",null,[e("p",null,[e("a",F,[o("Picture-in-Picture Extension"),n(r)]),o(":视频画中画。")])]),e("li",null,[e("p",null,[e("a",M,[o("Video Speed Controller"),n(r)]),o(":使用快捷方式加快,减慢,推进和回放 HTML5 视频。")])])]),L,e("ul",null,[e("li",null,[e("p",null,[e("a",z,[o("Auto Refresh Plus | Page Monitor"),n(r)]),o(":定时刷新页面;页面监视器,找到或丢失指定文本时,弹出提示。")])]),e("li",null,[e("p",null,[e("a",G,[o("Distill Web Monitor"),n(r)]),o(":监控网页或源以获取变更,可邮件、手机提示。")])]),e("li",null,[e("p",null,[e("a",P,[o("Check 酱"),n(r)]),o(":网页内容监控工具,可以监测网页内容变化,并发送异动到微信/飞书。Check 酱可以部署在 Docker 或浏览器插件。")])]),e("li",null,[e("p",null,[e("a",H,[o("Web Scraper"),n(r)]),o(":从网页中提取数据的爬虫。")])]),e("li",null,[e("p",null,[o("网页自动化:"),e("a",D,[o("UI.Vision PRA"),n(r)]),o(", "),e("a",V,[o("iMacros"),n(r)]),o(", "),e("a",W,[o("Automa"),n(r)]),o("。")])])]),I,e("ul",null,[e("li",null,[e("p",null,[e("a",N,[o("Tampermonkey"),n(r)]),o(":油猴脚本插件,可修改网页布局、增减内容、自动化操作,常用脚本库为 "),e("a",R,[o("Greasy Fork"),n(r)]),o("。")])]),e("li",null,[e("p",null,[e("a",U,[o("Fix Contrast"),n(r)]),o(":自动校正网页对比度,让网页内容更易阅读和分辨。")])]),e("li",null,[e("p",null,[e("a",O,[o("FasterChrome"),n(r)]),o(":浏览器预加载链接,提升网络流畅度。")])]),e("li",null,[e("p",null,[e("a",X,[o("SuperCopy"),n(r)]),o(":一键破解禁止右键、破解禁止选择、破解禁止复制、破解禁止粘贴,启用复制,启用右键,启用选择,启用粘贴。")])]),e("li",null,[e("p",null,[e("a",Z,[o("AutoPagerize"),n(r)]),o(":自动识别 next 或下一页,将网页合并为同一页。2014 年更新,很多规则已失效。")])]),e("li",null,[e("p",null,[e("a",q,[o("pakku"),n(r)]),o(":合并 B 站视频中绝大多数刷屏弹幕。")])]),e("li",null,[e("p",null,[e("a",J,[o("Enhanced GitHub"),n(r)]),o(":提升 GitHub 易用度。")])]),e("li",null,[e("p",null,[e("a",K,[o("Sourcegraph"),n(r)]),o(":优化 GitHub 代码,支持鼠标悬停、代码搜索、查看引用等。")])]),e("li",null,[e("p",null,[e("a",Q,[o("沉浸式翻译"),n(r)]),o(":免费的双语对照网页翻译,"),e("a",Y,[o("彩云小译"),n(r)]),o(" 的替代品。")])])]),$,e("ul",null,[e("li",null,[e("p",null,[e("a",ee,[o("Tango"),n(r)]),o(":将页面操作转化为逐步指导的流程指南。每一步都自动植入截图,并可以通过链接、HTML、Markdown 来分享。")])]),e("li",null,[e("p",null,[e("a",oe,[o("SingleFile"),n(r)]),o(":将完整网页保存到单个文件中,可对文件名、HTML 内容、样式、图片、字体等进行调整。")])]),e("li",null,[e("p",null,[e("a",re,[o("Vimium C"),n(r)]),o(":全键盘操作浏览器,建议启用 "),ne,o("。")])]),e("li",null,[e("p",null,[e("a",le,[o("SelectorGadget"),n(r)]),o(":轻松获取网页元素的 CSS Path 或 XPath。")])]),e("li",null,[e("p",null,[e("a",te,[o("Copy as Markdown"),n(r)]),o(":将网页文字转为 Markdown 格式文本。")])]),e("li",null,[e("p",null,[e("a",ae,[o("Get Favicon"),n(r)]),o(":快速获取当前网站的图标。")])]),e("li",null,[e("p",null,[e("a",he,[o("Similar Sites"),n(r)]),o(":发现与当前浏览的网站相似的其他网站。")])]),e("li",null,[e("p",null,[e("a",ie,[o("Wappalyzer"),n(r)]),o(":查看竞争对手网站使用了哪些技术、工具和第三方服务。")])]),e("li",null,[e("p",null,[e("a",ce,[o("Link to Text Fragment"),n(r)]),o(":在 Chrome 浏览器中分享网页并突出显示所选文本。")])])])])}const me=l(i,[["render",se],["__file","Chrome.html.vue"]]);export{me as default}; +import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as a,c as h,a as e,b as o,d as n}from"./app-91ee3df5.js";const i={},c=e("p",null,"常用 Chrome 扩展工具,链接多为 Chrome Web Store 项目页面。",-1),s=e("h2",{id:"浏览器",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#浏览器","aria-hidden":"true"},"#"),o(" 浏览器")],-1),p={href:"https://chrome.google.com/webstore/detail/extension-manager/gjldcdngmdknpinoemndlidpcabkggco",target:"_blank",rel:"noopener noreferrer"},g={href:"https://chrome.google.com/webstore/detail/bookmarks-clean-up/oncbjlgldmiagjophlhobkogeladjijl",target:"_blank",rel:"noopener noreferrer"},d={href:"https://chrome.google.com/webstore/detail/better-history/egehpkpgpgooebopjihjmnpejnjafefi",target:"_blank",rel:"noopener noreferrer"},b={href:"https://chrome.google.com/webstore/detail/cookie-editor/iphcomljdfghbkdcfndaijbokpgddeno",target:"_blank",rel:"noopener noreferrer"},m=e("h2",{id:"标签页",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#标签页","aria-hidden":"true"},"#"),o(" 标签页")],-1),f={href:"https://chrome.google.com/webstore/detail/itab%E6%96%B0%E6%A0%87%E7%AD%BE%E9%A1%B5/mhloojimgilafopcmlcikiidgbbnelip",target:"_blank",rel:"noopener noreferrer"},_={href:"https://chrome.google.com/webstore/detail/zvtabs%E4%B8%80%E9%94%AE%E5%85%B3%E9%97%AD%E5%B7%A6%E4%BE%A7%E6%A0%87%E7%AD%BE/aelfgfndnhaiicaahkbpmgbbnflnbejb",target:"_blank",rel:"noopener noreferrer"},k={href:"https://chrome.google.com/webstore/detail/goto-tab/hjfkaobgkmaeomgdhmhhipdbjdhhjkoi",target:"_blank",rel:"noopener noreferrer"},u={href:"https://chrome.google.com/webstore/detail/tab-wrangler/egnjhciaieeiiohknchakcodbpgjnchh",target:"_blank",rel:"noopener noreferrer"},j=e("h2",{id:"链接批量",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#链接批量","aria-hidden":"true"},"#"),o(" 链接批量")],-1),w={href:"https://chrome.google.com/webstore/detail/bulk-url-opener-extension/hgenngnjgfkdggambccohomebieocekm",target:"_blank",rel:"noopener noreferrer"},E={href:"https://chrome.google.com/webstore/detail/link-grabber/caodelkhipncidmoebgbbeemedohcdma",target:"_blank",rel:"noopener noreferrer"},x={href:"https://chrome.google.com/webstore/detail/linkclump/lfpjkncokllnfokkgpkobnkbkmelfefj",target:"_blank",rel:"noopener noreferrer"},B=e("code",null,"Z",-1),C={href:"https://chrome.google.com/webstore/detail/tabcopy/micdllihgoppmejpecmkilggmaagfdmb",target:"_blank",rel:"noopener noreferrer"},A=e("h2",{id:"图片视频",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#图片视频","aria-hidden":"true"},"#"),o(" 图片视频")],-1),y={href:"https://chrome.google.com/webstore/detail/imageassistant-batch-imag/dbjbempljhcmhlfpfacalomonjpalpko",target:"_blank",rel:"noopener noreferrer"},v={href:"https://chrome.google.com/webstore/detail/fatkun-batch-download-ima/nnjjahlikiabnchcpehcpkdeckfgnohf",target:"_blank",rel:"noopener noreferrer"},S={href:"https://chrome.google.com/webstore/detail/take-webpage-screenshots/mcbpblocgmgfnpjjppndjkmgjaogfceg",target:"_blank",rel:"noopener noreferrer"},T={href:"https://chrome.google.com/webstore/detail/screenity-screen-recorder/kbbdabhdfibnancpjfhlkhafgdilcnji",target:"_blank",rel:"noopener noreferrer"},F={href:"https://chrome.google.com/webstore/detail/picture-in-picture-extens/hkgfoiooedgoejojocmhlaklaeopbecg",target:"_blank",rel:"noopener noreferrer"},M={href:"https://chrome.google.com/webstore/detail/video-speed-controller/nffaoalbilbmmfgbnbgppjihopabppdk",target:"_blank",rel:"noopener noreferrer"},L=e("h2",{id:"监视爬虫",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#监视爬虫","aria-hidden":"true"},"#"),o(" 监视爬虫")],-1),z={href:"https://chrome.google.com/webstore/detail/auto-refresh-plus-page-mo/hgeljhfekpckiiplhkigfehkdpldcggm",target:"_blank",rel:"noopener noreferrer"},G={href:"https://chrome.google.com/webstore/detail/distill-web-monitor/inlikjemeeknofckkjolnjbpehgadgge",target:"_blank",rel:"noopener noreferrer"},P={href:"https://github.com/easychen/checkchan-dist",target:"_blank",rel:"noopener noreferrer"},H={href:"https://chrome.google.com/webstore/detail/web-scraper-free-web-scra/jnhgnonknehpejjnehehllkliplmbmhn",target:"_blank",rel:"noopener noreferrer"},D={href:"https://gpt-vip.top/posts/2022-04-21-uivision_rpa.html",target:"_blank",rel:"noopener noreferrer"},V={href:"https://chrome.google.com/webstore/detail/imacros-for-chrome/cplklnmnlbnpmjogncfgfijoopmnlemp",target:"_blank",rel:"noopener noreferrer"},W={href:"https://www.appinn.com/automa/",target:"_blank",rel:"noopener noreferrer"},I=e("h2",{id:"网页优化",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#网页优化","aria-hidden":"true"},"#"),o(" 网页优化")],-1),N={href:"https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo",target:"_blank",rel:"noopener noreferrer"},R={href:"https://greasyfork.org/zh-CN",target:"_blank",rel:"noopener noreferrer"},U={href:"https://chrome.google.com/webstore/detail/fix-contrast/pbbcgecjmpkglppfjjggkkbhdnlemhkg",target:"_blank",rel:"noopener noreferrer"},O={href:"https://chrome.google.com/webstore/detail/fasterchrome/nmgpnfccjfjhdenioncabecepjcmdnjg",target:"_blank",rel:"noopener noreferrer"},X={href:"https://chrome.google.com/webstore/detail/supercopy-enable-copy/onepmapfbjohnegdmfhndpefjkppbjkm",target:"_blank",rel:"noopener noreferrer"},Z={href:"https://chrome.google.com/webstore/detail/autopagerize/igiofjhpmpihnifddepnpngfjhkfenbp",target:"_blank",rel:"noopener noreferrer"},q={href:"https://chrome.google.com/webstore/detail/pakku%EF%BC%9A%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9%E5%BC%B9%E5%B9%95%E8%BF%87%E6%BB%A4%E5%99%A8/jklfcpboamajpiikgkbjcnnnnooefbhh",target:"_blank",rel:"noopener noreferrer"},J={href:"https://chrome.google.com/webstore/detail/enhanced-github/anlikcnbgdeidpacdbdljnabclhahhmd",target:"_blank",rel:"noopener noreferrer"},K={href:"https://chrome.google.com/webstore/detail/sourcegraph/dgjhfomjieaadpoljlnidmbgkdffpack",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://chrome.google.com/webstore/detail/immersive-translate/bpoadfkcbjbfhfodiogcnhhhpibjhbnh",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://chrome.google.com/webstore/detail/lingocloud-web-translatio/jmpepeebcbihafjjadogphmbgiffiajh",target:"_blank",rel:"noopener noreferrer"},$=e("h2",{id:"实用工具",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#实用工具","aria-hidden":"true"},"#"),o(" 实用工具")],-1),ee={href:"https://chrome.google.com/webstore/detail/tango/lggdbpblkekjjbobadliahffoaobaknh/",target:"_blank",rel:"noopener noreferrer"},oe={href:"https://chrome.google.com/webstore/detail/singlefile/mpiodijhokgodhhofbcjdecpffjipkle/",target:"_blank",rel:"noopener noreferrer"},re={href:"https://github.com/gdh1995/vimium-c/blob/master/README-zh.md",target:"_blank",rel:"noopener noreferrer"},ne=e("code",null,"chrome://flags/#extensions-on-chrome-urls",-1),le={href:"https://chrome.google.com/webstore/detail/selectorgadget/mhjhnkcfbdhnjickkkdbjoemdmbfginb",target:"_blank",rel:"noopener noreferrer"},te={href:"https://chrome.google.com/webstore/detail/copy-as-markdown/nlaionblcaejecbkcillglodmmfhjhfi/",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://chrome.google.com/webstore/detail/get-favicon/gpipahagclehninhhjkhbkliinfofnhe",target:"_blank",rel:"noopener noreferrer"},he={href:"https://chrome.google.com/webstore/detail/similar-sites-discover-re/necpbmbhhdiplmfhmjicabdeighkndkn",target:"_blank",rel:"noopener noreferrer"},ie={href:"https://chrome.google.com/webstore/detail/wappalyzer-technology-pro/gppongmhjkpfnbhagpmjfkannfbllamg/",target:"_blank",rel:"noopener noreferrer"},ce={href:"https://chrome.google.com/webstore/detail/link-to-text-fragment/pbcodcjpfjdpcineamnnmbkkmkdpajjg",target:"_blank",rel:"noopener noreferrer"};function se(pe,ge){const r=t("ExternalLinkIcon");return a(),h("div",null,[c,s,e("ul",null,[e("li",null,[e("p",null,[e("a",p,[o("扩展管理器"),n(r)]),o(":快速管理扩展,对扩展分组启用。")])]),e("li",null,[e("p",null,[e("a",g,[o("Bookmarks clean up"),n(r)]),o(":清理重复书签、空文件夹和失效链接,也能合并重复文件夹。")])]),e("li",null,[e("p",null,[e("a",d,[o("Better History"),n(r)]),o(":按日期、小时罗列历史记录,搜索更便捷。")])]),e("li",null,[e("p",null,[e("a",b,[o("Cookie Editor"),n(r)]),o(":管理、修改、导出 Cookie。")])])]),m,e("ul",null,[e("li",null,[e("p",null,[e("a",f,[o("iTab"),n(r)]),o(":自定义你的新标签页。")])]),e("li",null,[e("p",null,[e("a",_,[o("zvTabs"),n(r)]),o(":一键关闭左侧标签。")])]),e("li",null,[e("p",null,[e("a",k,[o("GoTo Tab"),n(r)]),o(":关键词搜索,快速定位标签页。")])]),e("li",null,[e("p",null,[e("a",u,[o("Tab Wrangler"),n(r)]),o(":自动关闭不活动的标签页,并允许您轻松还原找回它们。")])])]),j,e("ul",null,[e("li",null,[e("p",null,[e("a",w,[o("Bulk URL Opener Extension"),n(r)]),o(":批量打开链接,也可批量获取当前浏览器内所有页面网址链接。")])]),e("li",null,[e("p",null,[e("a",E,[o("Link Grabber"),n(r)]),o(":批量提取、筛选、复制网页里各种链接。")])]),e("li",null,[e("p",null,[e("a",x,[o("Linkclump"),n(r)]),o(":按住 "),B,o(" 键后,长按鼠标左键进行区域框选,区域内的链接可以进行批量打开、复制、书签,操作中会同步显示区域内的链接数。")])]),e("li",null,[e("p",null,[e("a",C,[o("TabCopy"),n(r)]),o(":快速复制标签页链接。")])])]),A,e("ul",null,[e("li",null,[e("p",null,[e("a",y,[o("ImageAssistant"),n(r)]),o(":用于嗅探、分析网页图片并提供批量下载。")])]),e("li",null,[e("p",null,[e("a",v,[o("Fatkun 图片批量下载"),n(r)]),o(":找出当前页面的所有图片,提供按分辨率、链接等筛选图片。")])]),e("li",null,[e("p",null,[e("a",S,[o("FireShot"),n(r)]),o(":捕捉网页截图。")])]),e("li",null,[e("p",null,[e("a",T,[o("Screenity"),n(r)]),o(":屏幕录像工具,可对屏幕进行捕获,注释,编辑、标注等。")])]),e("li",null,[e("p",null,[e("a",F,[o("Picture-in-Picture Extension"),n(r)]),o(":视频画中画。")])]),e("li",null,[e("p",null,[e("a",M,[o("Video Speed Controller"),n(r)]),o(":使用快捷方式加快,减慢,推进和回放 HTML5 视频。")])])]),L,e("ul",null,[e("li",null,[e("p",null,[e("a",z,[o("Auto Refresh Plus | Page Monitor"),n(r)]),o(":定时刷新页面;页面监视器,找到或丢失指定文本时,弹出提示。")])]),e("li",null,[e("p",null,[e("a",G,[o("Distill Web Monitor"),n(r)]),o(":监控网页或源以获取变更,可邮件、手机提示。")])]),e("li",null,[e("p",null,[e("a",P,[o("Check 酱"),n(r)]),o(":网页内容监控工具,可以监测网页内容变化,并发送异动到微信/飞书。Check 酱可以部署在 Docker 或浏览器插件。")])]),e("li",null,[e("p",null,[e("a",H,[o("Web Scraper"),n(r)]),o(":从网页中提取数据的爬虫。")])]),e("li",null,[e("p",null,[o("网页自动化:"),e("a",D,[o("UI.Vision PRA"),n(r)]),o(", "),e("a",V,[o("iMacros"),n(r)]),o(", "),e("a",W,[o("Automa"),n(r)]),o("。")])])]),I,e("ul",null,[e("li",null,[e("p",null,[e("a",N,[o("Tampermonkey"),n(r)]),o(":油猴脚本插件,可修改网页布局、增减内容、自动化操作,常用脚本库为 "),e("a",R,[o("Greasy Fork"),n(r)]),o("。")])]),e("li",null,[e("p",null,[e("a",U,[o("Fix Contrast"),n(r)]),o(":自动校正网页对比度,让网页内容更易阅读和分辨。")])]),e("li",null,[e("p",null,[e("a",O,[o("FasterChrome"),n(r)]),o(":浏览器预加载链接,提升网络流畅度。")])]),e("li",null,[e("p",null,[e("a",X,[o("SuperCopy"),n(r)]),o(":一键破解禁止右键、破解禁止选择、破解禁止复制、破解禁止粘贴,启用复制,启用右键,启用选择,启用粘贴。")])]),e("li",null,[e("p",null,[e("a",Z,[o("AutoPagerize"),n(r)]),o(":自动识别 next 或下一页,将网页合并为同一页。2014 年更新,很多规则已失效。")])]),e("li",null,[e("p",null,[e("a",q,[o("pakku"),n(r)]),o(":合并 B 站视频中绝大多数刷屏弹幕。")])]),e("li",null,[e("p",null,[e("a",J,[o("Enhanced GitHub"),n(r)]),o(":提升 GitHub 易用度。")])]),e("li",null,[e("p",null,[e("a",K,[o("Sourcegraph"),n(r)]),o(":优化 GitHub 代码,支持鼠标悬停、代码搜索、查看引用等。")])]),e("li",null,[e("p",null,[e("a",Q,[o("沉浸式翻译"),n(r)]),o(":免费的双语对照网页翻译,"),e("a",Y,[o("彩云小译"),n(r)]),o(" 的替代品。")])])]),$,e("ul",null,[e("li",null,[e("p",null,[e("a",ee,[o("Tango"),n(r)]),o(":将页面操作转化为逐步指导的流程指南。每一步都自动植入截图,并可以通过链接、HTML、Markdown 来分享。")])]),e("li",null,[e("p",null,[e("a",oe,[o("SingleFile"),n(r)]),o(":将完整网页保存到单个文件中,可对文件名、HTML 内容、样式、图片、字体等进行调整。")])]),e("li",null,[e("p",null,[e("a",re,[o("Vimium C"),n(r)]),o(":全键盘操作浏览器,建议启用 "),ne,o("。")])]),e("li",null,[e("p",null,[e("a",le,[o("SelectorGadget"),n(r)]),o(":轻松获取网页元素的 CSS Path 或 XPath。")])]),e("li",null,[e("p",null,[e("a",te,[o("Copy as Markdown"),n(r)]),o(":将网页文字转为 Markdown 格式文本。")])]),e("li",null,[e("p",null,[e("a",ae,[o("Get Favicon"),n(r)]),o(":快速获取当前网站的图标。")])]),e("li",null,[e("p",null,[e("a",he,[o("Similar Sites"),n(r)]),o(":发现与当前浏览的网站相似的其他网站。")])]),e("li",null,[e("p",null,[e("a",ie,[o("Wappalyzer"),n(r)]),o(":查看竞争对手网站使用了哪些技术、工具和第三方服务。")])]),e("li",null,[e("p",null,[e("a",ce,[o("Link to Text Fragment"),n(r)]),o(":在 Chrome 浏览器中分享网页并突出显示所选文本。")])])])])}const me=l(i,[["render",se],["__file","Chrome.html.vue"]]);export{me as default}; diff --git a/assets/CloudServices.html-de982fec.js b/assets/CloudServices.html-683b0f56.js similarity index 98% rename from assets/CloudServices.html-de982fec.js rename to assets/CloudServices.html-683b0f56.js index a40c9dab..ecb0a9ec 100644 --- a/assets/CloudServices.html-de982fec.js +++ b/assets/CloudServices.html-683b0f56.js @@ -1,4 +1,4 @@ -import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as i,c as t,a,b as e,d as s,e as r}from"./app-98132e77.js";const d={},c=r('

        CDN

        国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。

        静态文件

        静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.gpt-vip.top。

        图床

        自建图床的成本并不高,只需续费域名就能确保图片的长期保存。我目前使用七牛云配合 Picgo 来搭建图床,每月费用大约十几元。

        曾经尝试过将第三方图床作为临时图床,但仅三天后,图片就全部失效了,导致了大量图片的丢失。这次经历让我深刻认识到,即使是临时需求,也不应依赖第三方图床。

        全站加速

        使用 CDN 全站加速,能实现用户就近访问,不过也存在些问题。

        • 一个 CDN 只能为一个域名加速,加速的域名即为目标域名。
        • CDN 服务商可能要求使用其自有 DNS,比如阿里云。
        • 如果加速区域选择「全球(不包含中国内地)」。国内用户会访问国外 CDN 节点,而非国内的源站服务器。
        • 迁移阿里云 DNS 时,注意关闭静态协议跟随回源,否则会网站重复调整

        第三方服务

        Vercel

        Vercel 是一家提供开发、预览和部署网页前端的云平台服务商。它主要用于前端项目,不原生支持 PHP 和 node 项目,每月提供 100G 免费流量。

        ',13),p={href:"https://vercel.com/guides/using-cloudflare-with-vercel",target:"_blank",rel:"noopener noreferrer"},u={id:"fly-io",tabindex:"-1"},h=a("a",{class:"header-anchor",href:"#fly-io","aria-hidden":"true"},"#",-1),m={href:"http://fly.io",target:"_blank",rel:"noopener noreferrer"},v={href:"http://Fly.io",target:"_blank",rel:"noopener noreferrer"},b={href:"http://Fly.io",target:"_blank",rel:"noopener noreferrer"},f={href:"http://fly.io",target:"_blank",rel:"noopener noreferrer"},k=r(`
        # 初次构建
        +import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as i,c as t,a,b as e,d as s,e as r}from"./app-91ee3df5.js";const d={},c=r('

        CDN

        国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。

        静态文件

        静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.gpt-vip.top。

        图床

        自建图床的成本并不高,只需续费域名就能确保图片的长期保存。我目前使用七牛云配合 Picgo 来搭建图床,每月费用大约十几元。

        曾经尝试过将第三方图床作为临时图床,但仅三天后,图片就全部失效了,导致了大量图片的丢失。这次经历让我深刻认识到,即使是临时需求,也不应依赖第三方图床。

        全站加速

        使用 CDN 全站加速,能实现用户就近访问,不过也存在些问题。

        • 一个 CDN 只能为一个域名加速,加速的域名即为目标域名。
        • CDN 服务商可能要求使用其自有 DNS,比如阿里云。
        • 如果加速区域选择「全球(不包含中国内地)」。国内用户会访问国外 CDN 节点,而非国内的源站服务器。
        • 迁移阿里云 DNS 时,注意关闭静态协议跟随回源,否则会网站重复调整

        第三方服务

        Vercel

        Vercel 是一家提供开发、预览和部署网页前端的云平台服务商。它主要用于前端项目,不原生支持 PHP 和 node 项目,每月提供 100G 免费流量。

        ',13),p={href:"https://vercel.com/guides/using-cloudflare-with-vercel",target:"_blank",rel:"noopener noreferrer"},u={id:"fly-io",tabindex:"-1"},h=a("a",{class:"header-anchor",href:"#fly-io","aria-hidden":"true"},"#",-1),m={href:"http://fly.io",target:"_blank",rel:"noopener noreferrer"},v={href:"http://Fly.io",target:"_blank",rel:"noopener noreferrer"},b={href:"http://Fly.io",target:"_blank",rel:"noopener noreferrer"},f={href:"http://fly.io",target:"_blank",rel:"noopener noreferrer"},k=r(`
        # 初次构建
         fly launch
         # 部署,官方建议开两台机器
         flyctl deploy
        diff --git a/assets/Cloudflare.html-c3efd50c.js b/assets/Cloudflare.html-d69290c2.js
        similarity index 99%
        rename from assets/Cloudflare.html-c3efd50c.js
        rename to assets/Cloudflare.html-d69290c2.js
        index d7b19b77..115fa3f5 100644
        --- a/assets/Cloudflare.html-c3efd50c.js
        +++ b/assets/Cloudflare.html-d69290c2.js
        @@ -1,4 +1,4 @@
        -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o as e,c as o,a as n,b as s,d as c,e as l}from"./app-98132e77.js";const u={},i={href:"https://developers.cloudflare.com/",target:"_blank",rel:"noopener noreferrer"},r=l(`

        Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。

        但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。

        反向代理

        Cloudflare Workers 反向代理不适合 google 和 cloudflare cdn 网站,其他网站大都可以。

        镜像整个网站

        // 替换成你想镜像的站点
        +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o as e,c as o,a as n,b as s,d as c,e as l}from"./app-91ee3df5.js";const u={},i={href:"https://developers.cloudflare.com/",target:"_blank",rel:"noopener noreferrer"},r=l(`

        Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。

        但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。

        反向代理

        Cloudflare Workers 反向代理不适合 google 和 cloudflare cdn 网站,其他网站大都可以。

        镜像整个网站

        // 替换成你想镜像的站点
         const upstream = "www.youtube.com";
         
         // 如果那个站点有专门的移动适配站点,否则保持和上面一致
        diff --git a/assets/Comments.html-856b62ac.js b/assets/Comments.html-ef2b13e7.js
        similarity index 99%
        rename from assets/Comments.html-856b62ac.js
        rename to assets/Comments.html-ef2b13e7.js
        index 33d19fe6..69f581e0 100644
        --- a/assets/Comments.html-856b62ac.js
        +++ b/assets/Comments.html-ef2b13e7.js
        @@ -1,4 +1,4 @@
        -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o,c as r,a as n,b as e,d as a,e as t}from"./app-98132e77.js";const c={},d=n("p",null,"LearnHubs 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。",-1),p=n("h2",{id:"评论插件",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#评论插件","aria-hidden":"true"},"#"),e(" 评论插件")],-1),u={href:"https://waline.js.org/guide/get-started.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/xCss/Valine",target:"_blank",rel:"noopener noreferrer"},m={href:"https://github.com/giscus/giscus",target:"_blank",rel:"noopener noreferrer"},h={href:"https://blog.csdn.net/duninet/article/details/125280107",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/gitalk/gitalk",target:"_blank",rel:"noopener noreferrer"},_={href:"https://gitter.im/",target:"_blank",rel:"noopener noreferrer"},k={href:"https://boardgame.io/documentation/#/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://itchef.github.io/regauge/#/",target:"_blank",rel:"noopener noreferrer"},g=n("h2",{id:"waline",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#waline","aria-hidden":"true"},"#"),e(" Waline")],-1),w=n("p",null,"Waline 支持 Akismet 反垃圾评论和免注册留言,但匿名留言会带来安全隐患。建议开启评论通知来避免出现极端情况。Waline 的评论通知支持多种方式,包括 QQ、微信、邮件等。对于评论的回复,仅支持邮件通知。",-1),S={href:"https://waline.js.org/guide/server/notification.html",target:"_blank",rel:"noopener noreferrer"},x={href:"https://waline.js.org/reference/server.html",target:"_blank",rel:"noopener noreferrer"},y=n("code",null,"*.vercel.app",-1),C=n("h3",{id:"手动部署",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#手动部署","aria-hidden":"true"},"#"),e(" 手动部署")],-1),q=n("p",null,"请注意,Vercel 和 LeanCloud 有额度限制。如果你的网站日访客超过一千人次,建议使用自行部署的方案。以下是我的部署步骤:",-1),E={href:"https://github.com/walinejs/waline/blob/main/assets/waline.sql",target:"_blank",rel:"noopener noreferrer"},L=n("sup",{class:"footnote-ref"},[n("a",{href:"#footnote1"},"[1]"),n("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),j=t(`
      50. 配置必要的环境变量,可添加于 /etc/environment。配置完成后,需要重启项目让环境变量生效。并注意最后一行需保留空行。

        MYSQL_DB=""
        +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o,c as r,a as n,b as e,d as a,e as t}from"./app-91ee3df5.js";const c={},d=n("p",null,"LearnHubs 使用的是 Waline 评论插件,部署简单,有后端管理。评论插件推荐次序为 Waline > Valine > giscus > Gitalk > Gitter。",-1),p=n("h2",{id:"评论插件",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#评论插件","aria-hidden":"true"},"#"),e(" 评论插件")],-1),u={href:"https://waline.js.org/guide/get-started.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/xCss/Valine",target:"_blank",rel:"noopener noreferrer"},m={href:"https://github.com/giscus/giscus",target:"_blank",rel:"noopener noreferrer"},h={href:"https://blog.csdn.net/duninet/article/details/125280107",target:"_blank",rel:"noopener noreferrer"},b={href:"https://github.com/gitalk/gitalk",target:"_blank",rel:"noopener noreferrer"},_={href:"https://gitter.im/",target:"_blank",rel:"noopener noreferrer"},k={href:"https://boardgame.io/documentation/#/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://itchef.github.io/regauge/#/",target:"_blank",rel:"noopener noreferrer"},g=n("h2",{id:"waline",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#waline","aria-hidden":"true"},"#"),e(" Waline")],-1),w=n("p",null,"Waline 支持 Akismet 反垃圾评论和免注册留言,但匿名留言会带来安全隐患。建议开启评论通知来避免出现极端情况。Waline 的评论通知支持多种方式,包括 QQ、微信、邮件等。对于评论的回复,仅支持邮件通知。",-1),S={href:"https://waline.js.org/guide/server/notification.html",target:"_blank",rel:"noopener noreferrer"},x={href:"https://waline.js.org/reference/server.html",target:"_blank",rel:"noopener noreferrer"},y=n("code",null,"*.vercel.app",-1),C=n("h3",{id:"手动部署",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#手动部署","aria-hidden":"true"},"#"),e(" 手动部署")],-1),q=n("p",null,"请注意,Vercel 和 LeanCloud 有额度限制。如果你的网站日访客超过一千人次,建议使用自行部署的方案。以下是我的部署步骤:",-1),E={href:"https://github.com/walinejs/waline/blob/main/assets/waline.sql",target:"_blank",rel:"noopener noreferrer"},L=n("sup",{class:"footnote-ref"},[n("a",{href:"#footnote1"},"[1]"),n("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),j=t(`
      51. 配置必要的环境变量,可添加于 /etc/environment。配置完成后,需要重启项目让环境变量生效。并注意最后一行需保留空行。

        MYSQL_DB=""
         MYSQL_USER=""
         MYSQL_PASSWORD=""
         
      52. 部署 Waline 服务端,使用 forever 让其持久化运行。

        # 切换到站点路径
        diff --git a/assets/Coupon.html-fa4d1c5e.js b/assets/Coupon.html-69ecd602.js
        similarity index 98%
        rename from assets/Coupon.html-fa4d1c5e.js
        rename to assets/Coupon.html-69ecd602.js
        index ba033630..bd4d1bcc 100644
        --- a/assets/Coupon.html-fa4d1c5e.js
        +++ b/assets/Coupon.html-69ecd602.js
        @@ -1 +1 @@
        -import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as l,c as i,a as e,b as o,d as r,e as n}from"./app-98132e77.js";const c={},d=n('

        家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。

        电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。

        淘宝

        • 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。
        • 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。
          • 大额券一般有 92 折,可以用于预购,但不能与省钱卡叠加。
        • 购物节日前一天的预购和节日当天,是最优惠时候。
          • 商家在活动前说的保价,并不包含大额券,不用提前下单。

        拼多多

        拼多多的很多商品价格完全不受购物节影响,除了大额消费券外,拼多多通常具有价格优势。

        • 99 以上消费品,记得用拼多多的大额券,拼多多会员分享 3 个好友,即可任意领 99-20 券,大部分产品都适用。
        • 无门槛大额券 - 立减 50,有几率抢到的,同样需要分享,有需要可以试试。

        京东

        京东新会员已经没有优惠券了,不过它的以旧换新经常有活动。特别是购物节期间,一般坏的电器也能有 50 的补贴,品类并不需要与新家电完全相同。比如换冰箱,你可以用坏的电饼铛来拿补贴。

        1688

        1688 上能找到很多品牌的代工厂,它们未贴牌或自家产品的品质不比大品牌差,但因为剥离了溢价,价格可以便宜不少。不过食品类需注意,代工厂的品质不等于贴牌!贴牌方要求的品质与代工厂的生产的品质不一定一致,原料、品控可能都会更改[1]

        ',11),h=e("li",null,"持续消耗类:擦手纸、一次性清洁布、各种清洁液、消毒液、一次性保鲜袋、垃圾网袋等。",-1),_=e("li",null,"日用纺织品:袜子、内裤、秋衣、毛巾、T 恤等。此类产品多为基本款,不追求品质,只要简单舒适即可,剔除品牌溢价。",-1),p=e("li",null,"日化类产品:棉签、发夹、皮筋、肥皂、卸妆纸、洗脸巾等。",-1),u=e("li",null,"医疗防护类消耗品:口罩、一次性手套、防护服等。比如医用外科口罩,原本是 0.5,但阿里巴巴上宇安是 0.08,现在是 0.11-0.12。",-1),f={href:"https://post.smzdm.com/p/az5gg8zr/",target:"_blank",rel:"noopener noreferrer"},E=e("li",null,"数码科技小物:充电宝、TWS 耳机、充电头、充电线等。此类多只有核心功能,须不在意设计、品牌、细节体验。",-1),m=e("li",null,"餐具和文具:餐具的品牌溢价非常高,文具也能获得批发价,即使是知名的进口文具,1688 上也能买到更低价格的正品。",-1),B=e("p",null,"购买技巧:有的时候只需要一件,但是商家两件起发!这种时候选「代发下单」,可能稍贵一点点,但是一件就能发货!",-1),A=e("h2",{id:"抢购辅助",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#抢购辅助","aria-hidden":"true"},"#"),o(" 抢购辅助")],-1),b=e("li",null,"Auto.js:免费版不再更新。买了 Pro,但它不支持淘宝等。",-1),g=e("li",null,"八戒任务:按顺序完成多坐标点击,适用秒杀?",-1),k={href:"https://aznfz.com",target:"_blank",rel:"noopener noreferrer"},x={href:"https://docs.qq.com/doc/DU0FTQ1NKV0VKU2tN",target:"_blank",rel:"noopener noreferrer"},C={href:"https://greasyfork.org/zh-CN/scripts/393577-%E6%B7%98%E5%AE%9D-%E5%A4%A9%E7%8C%AB-%E8%81%9A%E5%88%92%E7%AE%97-%E4%BA%AC%E4%B8%9C-%E8%8B%8F%E5%AE%81-%E5%94%AF%E5%93%81%E4%BC%9A-%E5%8D%8E%E4%B8%BA-%E8%80%90%E5%85%8B-%E9%AD%85%E6%97%8F-%E8%81%94%E6%83%B3-%E5%8D%8E%E7%A1%95-%E5%B0%8F%E7%B1%B3%E6%9C%89%E5%93%81-%E8%80%83%E6%8B%89%E6%8A%A2%E8%B4%AD%E5%8A%A9%E6%89%8Bv2",target:"_blank",rel:"noopener noreferrer"},N=n('

        BP 模式

        BP 即 ByPass,是一键下单的链接,可以跳过商品页缓存、选择尺码规格、结算这一系列繁琐的步骤,直接进入订单确认页,最大限度减少操作和页面跳转带来的延时,为大家抢购带来最快的下单体验。

        手机端操作,可以把 BP 链接提前给淘宝/京东里面的好友或客服,到了点再进入下单。

        BP 链接均为移动链接,电脑上使用需要提前登录网页。BP 下单时,可以先不付款,先提交锁定订单,然后再支付选择分期方式。

        以京东 BP 链接为例:https://p.m.jd.com/norder/order.action?wareId=100033551654&wareNum=1&enterOrder=truewareId=100012043978100012043978 是商品 ITEM ID,Num=1 中 1 是购买数量。

        购物思考

        优惠券、抢购除了是让你下单,也是为了让你成为平台的忠实用户。正如劳力辩证:当你对某事或某人投入了精力和劳力,你也会对他们有更高的评价。而抢购成功,会让人有种不可自拔的快感。


        ',8),P={class:"footnotes"},D={class:"footnotes-list"},z={id:"footnote1",class:"footnote-item"},I={href:"https://sspai.com/prime/story/vol018-a-1688-shopping-guide",target:"_blank",rel:"noopener noreferrer"},T=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function V(v,F){const t=a("ExternalLinkIcon");return l(),i("div",null,[d,e("ul",null,[h,_,p,u,e("li",null,[o("食品或食品包装:小零食、保鲜袋、咖啡挂耳包、食品储藏盒等。很多大品牌的零食都不是由品牌自己建厂生产的,而是交给第三方代工。因此,如果能循着线索找到代工厂,就有可能买到物美价廉的产品,参考"),e("a",f,[o("手把手教你如何找 1688 代工厂天猫店半价买零食(附超全代工厂旗舰店链接)"),r(t)]),o("。")]),E,m]),B,A,e("ul",null,[b,g,e("li",null,[e("a",k,[o("冰狐智能辅助"),r(t)]),o(":自动构建脚本,需付费,未实际使用,较复杂")]),e("li",null,[e("a",x,[o("喵惠助手"),r(t)]),o(":第三方辅助代拍,安全性未知。旧手机上抢购。用旧手机一直挂着。")]),e("li",null,[e("a",C,[o("抢购助手脚本"),r(t)]),o(":网页 js 脚本,需搭配浏览器扩展 Tampermonkey。")])]),N,e("section",P,[e("ol",D,[e("li",z,[e("p",null,[e("a",I,[o("1688「扫货」指南"),r(t)]),o(),T])])])])])}const j=s(c,[["render",V],["__file","Coupon.html.vue"]]);export{j as default}; +import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as l,c as i,a as e,b as o,d as r,e as n}from"./app-91ee3df5.js";const c={},d=n('

        家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。

        电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。

        淘宝

        • 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。
        • 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。
          • 大额券一般有 92 折,可以用于预购,但不能与省钱卡叠加。
        • 购物节日前一天的预购和节日当天,是最优惠时候。
          • 商家在活动前说的保价,并不包含大额券,不用提前下单。

        拼多多

        拼多多的很多商品价格完全不受购物节影响,除了大额消费券外,拼多多通常具有价格优势。

        • 99 以上消费品,记得用拼多多的大额券,拼多多会员分享 3 个好友,即可任意领 99-20 券,大部分产品都适用。
        • 无门槛大额券 - 立减 50,有几率抢到的,同样需要分享,有需要可以试试。

        京东

        京东新会员已经没有优惠券了,不过它的以旧换新经常有活动。特别是购物节期间,一般坏的电器也能有 50 的补贴,品类并不需要与新家电完全相同。比如换冰箱,你可以用坏的电饼铛来拿补贴。

        1688

        1688 上能找到很多品牌的代工厂,它们未贴牌或自家产品的品质不比大品牌差,但因为剥离了溢价,价格可以便宜不少。不过食品类需注意,代工厂的品质不等于贴牌!贴牌方要求的品质与代工厂的生产的品质不一定一致,原料、品控可能都会更改[1]

        ',11),h=e("li",null,"持续消耗类:擦手纸、一次性清洁布、各种清洁液、消毒液、一次性保鲜袋、垃圾网袋等。",-1),_=e("li",null,"日用纺织品:袜子、内裤、秋衣、毛巾、T 恤等。此类产品多为基本款,不追求品质,只要简单舒适即可,剔除品牌溢价。",-1),p=e("li",null,"日化类产品:棉签、发夹、皮筋、肥皂、卸妆纸、洗脸巾等。",-1),u=e("li",null,"医疗防护类消耗品:口罩、一次性手套、防护服等。比如医用外科口罩,原本是 0.5,但阿里巴巴上宇安是 0.08,现在是 0.11-0.12。",-1),f={href:"https://post.smzdm.com/p/az5gg8zr/",target:"_blank",rel:"noopener noreferrer"},E=e("li",null,"数码科技小物:充电宝、TWS 耳机、充电头、充电线等。此类多只有核心功能,须不在意设计、品牌、细节体验。",-1),m=e("li",null,"餐具和文具:餐具的品牌溢价非常高,文具也能获得批发价,即使是知名的进口文具,1688 上也能买到更低价格的正品。",-1),B=e("p",null,"购买技巧:有的时候只需要一件,但是商家两件起发!这种时候选「代发下单」,可能稍贵一点点,但是一件就能发货!",-1),A=e("h2",{id:"抢购辅助",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#抢购辅助","aria-hidden":"true"},"#"),o(" 抢购辅助")],-1),b=e("li",null,"Auto.js:免费版不再更新。买了 Pro,但它不支持淘宝等。",-1),g=e("li",null,"八戒任务:按顺序完成多坐标点击,适用秒杀?",-1),k={href:"https://aznfz.com",target:"_blank",rel:"noopener noreferrer"},x={href:"https://docs.qq.com/doc/DU0FTQ1NKV0VKU2tN",target:"_blank",rel:"noopener noreferrer"},C={href:"https://greasyfork.org/zh-CN/scripts/393577-%E6%B7%98%E5%AE%9D-%E5%A4%A9%E7%8C%AB-%E8%81%9A%E5%88%92%E7%AE%97-%E4%BA%AC%E4%B8%9C-%E8%8B%8F%E5%AE%81-%E5%94%AF%E5%93%81%E4%BC%9A-%E5%8D%8E%E4%B8%BA-%E8%80%90%E5%85%8B-%E9%AD%85%E6%97%8F-%E8%81%94%E6%83%B3-%E5%8D%8E%E7%A1%95-%E5%B0%8F%E7%B1%B3%E6%9C%89%E5%93%81-%E8%80%83%E6%8B%89%E6%8A%A2%E8%B4%AD%E5%8A%A9%E6%89%8Bv2",target:"_blank",rel:"noopener noreferrer"},N=n('

        BP 模式

        BP 即 ByPass,是一键下单的链接,可以跳过商品页缓存、选择尺码规格、结算这一系列繁琐的步骤,直接进入订单确认页,最大限度减少操作和页面跳转带来的延时,为大家抢购带来最快的下单体验。

        手机端操作,可以把 BP 链接提前给淘宝/京东里面的好友或客服,到了点再进入下单。

        BP 链接均为移动链接,电脑上使用需要提前登录网页。BP 下单时,可以先不付款,先提交锁定订单,然后再支付选择分期方式。

        以京东 BP 链接为例:https://p.m.jd.com/norder/order.action?wareId=100033551654&wareNum=1&enterOrder=truewareId=100012043978100012043978 是商品 ITEM ID,Num=1 中 1 是购买数量。

        购物思考

        优惠券、抢购除了是让你下单,也是为了让你成为平台的忠实用户。正如劳力辩证:当你对某事或某人投入了精力和劳力,你也会对他们有更高的评价。而抢购成功,会让人有种不可自拔的快感。


        ',8),P={class:"footnotes"},D={class:"footnotes-list"},z={id:"footnote1",class:"footnote-item"},I={href:"https://sspai.com/prime/story/vol018-a-1688-shopping-guide",target:"_blank",rel:"noopener noreferrer"},T=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function V(v,F){const t=a("ExternalLinkIcon");return l(),i("div",null,[d,e("ul",null,[h,_,p,u,e("li",null,[o("食品或食品包装:小零食、保鲜袋、咖啡挂耳包、食品储藏盒等。很多大品牌的零食都不是由品牌自己建厂生产的,而是交给第三方代工。因此,如果能循着线索找到代工厂,就有可能买到物美价廉的产品,参考"),e("a",f,[o("手把手教你如何找 1688 代工厂天猫店半价买零食(附超全代工厂旗舰店链接)"),r(t)]),o("。")]),E,m]),B,A,e("ul",null,[b,g,e("li",null,[e("a",k,[o("冰狐智能辅助"),r(t)]),o(":自动构建脚本,需付费,未实际使用,较复杂")]),e("li",null,[e("a",x,[o("喵惠助手"),r(t)]),o(":第三方辅助代拍,安全性未知。旧手机上抢购。用旧手机一直挂着。")]),e("li",null,[e("a",C,[o("抢购助手脚本"),r(t)]),o(":网页 js 脚本,需搭配浏览器扩展 Tampermonkey。")])]),N,e("section",P,[e("ol",D,[e("li",z,[e("p",null,[e("a",I,[o("1688「扫货」指南"),r(t)]),o(),T])])])])])}const j=s(c,[["render",V],["__file","Coupon.html.vue"]]);export{j as default}; diff --git a/assets/DNS.html-f69e26d4.js b/assets/DNS.html-0563ab8c.js similarity index 95% rename from assets/DNS.html-f69e26d4.js rename to assets/DNS.html-0563ab8c.js index b0752ae3..4e0d1d3e 100644 --- a/assets/DNS.html-f69e26d4.js +++ b/assets/DNS.html-0563ab8c.js @@ -1 +1 @@ -import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as a,c,a as e,b as t,d as o}from"./app-98132e77.js";const s={},_=e("p",null,"国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。",-1),i=e("li",null,"DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。",-1),d=e("li",null,"如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firefox。",-1),u={href:"https://help.aliyun.com/document_detail/29725.html?#h2-ns-7",target:"_blank",rel:"noopener noreferrer"},h={href:"https://help.aliyun.com/document_detail/121648.html",target:"_blank",rel:"noopener noreferrer"};function m(p,f){const l=r("ExternalLinkIcon");return a(),c("div",null,[_,e("ul",null,[i,d,e("li",null,[t("子域名可以使用 "),e("a",u,[t("NS 记录"),o(l)]),t(",托管到其他域名服务商。但 Cloudflare 不支持单独子域名托管。")])]),e("p",null,[t("域名 DNS 服务器修改(阿里云):"),e("a",h,[t("https://help.aliyun.com/document_detail/121648.html"),o(l)])])])}const S=n(s,[["render",m],["__file","DNS.html.vue"]]);export{S as default}; +import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as a,c,a as e,b as t,d as o}from"./app-91ee3df5.js";const s={},_=e("p",null,"国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。",-1),i=e("li",null,"DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。",-1),d=e("li",null,"如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firefox。",-1),u={href:"https://help.aliyun.com/document_detail/29725.html?#h2-ns-7",target:"_blank",rel:"noopener noreferrer"},h={href:"https://help.aliyun.com/document_detail/121648.html",target:"_blank",rel:"noopener noreferrer"};function m(p,f){const l=r("ExternalLinkIcon");return a(),c("div",null,[_,e("ul",null,[i,d,e("li",null,[t("子域名可以使用 "),e("a",u,[t("NS 记录"),o(l)]),t(",托管到其他域名服务商。但 Cloudflare 不支持单独子域名托管。")])]),e("p",null,[t("域名 DNS 服务器修改(阿里云):"),e("a",h,[t("https://help.aliyun.com/document_detail/121648.html"),o(l)])])])}const S=n(s,[["render",m],["__file","DNS.html.vue"]]);export{S as default}; diff --git a/assets/DailyRoutine.html-687e5c56.js b/assets/DailyRoutine.html-62dde776.js similarity index 99% rename from assets/DailyRoutine.html-687e5c56.js rename to assets/DailyRoutine.html-62dde776.js index 5fe9cfd7..0a5f5c14 100644 --- a/assets/DailyRoutine.html-687e5c56.js +++ b/assets/DailyRoutine.html-62dde776.js @@ -1,4 +1,4 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as r,c as i,a as t,b as a,d as e,e as n}from"./app-98132e77.js";const p={},d=t("p",null,[a("每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:"),t("strong",null,"遵循一个固定、程序化的流程,有规律地养成习惯"),a(",实现自我提升。")],-1),c=t("h2",{id:"仪式清单",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#仪式清单","aria-hidden":"true"},"#"),a(" 仪式清单")],-1),u=t("h3",{id:"_5am-club",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#_5am-club","aria-hidden":"true"},"#"),a(" 5AM Club")],-1),h={href:"https://gpt-vip.top/posts/2023-03-31-efficient_morning_5am_club.html",target:"_blank",rel:"noopener noreferrer"},_=t("ol",null,[t("li",null,"早上 5 点起床,使用手环震动闹钟。"),t("li",null,"泡杯咖啡,准备早餐,开始第一个工作番茄。"),t("li",null,"工作 25 分钟休息 5 分钟,休息期间完成每日必须:拍照打卡发 SNS,吃早餐。"),t("li",null,"每天最低完成 8 个番茄,之后可进入长休息区间,进行家务打扫、健身、娱乐。"),t("li",null,"晚上 10 点睡觉,保证充足的睡眠时间。")],-1),k={href:"https://hubermanlab.com/sleep-toolkit-tools-for-optimizing-sleep-and-sleep-wake-timing/",target:"_blank",rel:"noopener noreferrer"},m=t("h3",{id:"每日",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#每日","aria-hidden":"true"},"#"),a(" 每日")],-1),b=t("p",null,[t("strong",null,"早上创造美好情绪"),a(":赞美、仪式感、吃好吃的、看搞笑视频、听歌。")],-1),f=t("li",null,"唱歌:唱一首你喜欢的歌曲(外语美声歌曲可以增加脂肪消耗,例如:秋山雅史的《千の風になって》)。",-1),g=t("li",null,"自拍视频:说一句话(比如当天的目标)来鼓励自己。在前一天想好录制内容,以获得积极情绪。",-1),v={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},x=n('
      53. 人际连接:通过直播连麦与陌生人沟通 15 分钟,例如:播客、抖音语音电台直播 PK。

        • 别人很重要:帮助别人,能让人更健康、更幸福。当心情不好时,去帮助其他人,心情会变得更好。
        • 表扬和自我表扬:赞美自己、家人,发挥标志性优势,总比弥补缺点更有效。
      54. 微习惯

        • 每工作 20 分钟,休息 20 秒,然后做 10 个深蹲;出书房或上完厕所,再做 15 个俯卧撑。在运动前,在白板上写出正字,每一组动作用一个笔画表示。进阶阶段可以用固定机位拍摄视频,监督运动习惯。拍摄时,使用关键句「切掉/保留」,配合 Quickcut 快速剪辑视频。
        • 睡前:每天泡脚 20 分钟(水温 40℃),短时间的泡脚可以帮助睡眠更快入睡。此外,每天睡前 90 分钟,淋浴(水温 38~43℃,淋浴 10 分钟)或泡澡也可以助你更快进入睡眠状态。[1]
      55. 间隔学习:穿插学习不同领域内容

        • 阅读看书:每天花 30 分钟读书,并输出笔记。
        • 墨墨背单词:每天背 20 个单词,虽然用处不大,但可以让脑子换个思路。
        • 笔记复习:利用思源笔记/SuperMemo 记忆模型,复习心理认知、沟通理论和行为反思等笔记。
      56. 当日回顾:每天记录 3 件好事,总结好事发生的原因,并与家人分享。

        这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。

      57. ',4),y=t("h3",{id:"定期",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#定期","aria-hidden":"true"},"#"),a(" 定期")],-1),T=t("strong",null,"月底反思",-1),D={href:"https://allisonseboldt.com/",target:"_blank",rel:"noopener noreferrer"},A={href:"https://justinjackson.ca/bootstrap",target:"_blank",rel:"noopener noreferrer"},S=t("li",null,[t("strong",null,"积极自我介绍"),a(":每三个月,讲述一个「最佳的我」的故事,植入你的优势,进行自我肯定。")],-1),w=t("h3",{id:"自我监控",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#自我监控","aria-hidden":"true"},"#"),a(" 自我监控")],-1),C={href:"https://gpt-vip.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},L={href:"https://gpt-vip.top/posts/2022-11-03-ffmpeg_screen_recording.html",target:"_blank",rel:"noopener noreferrer"},E=n(`
        ffmpeg -f gdigrab -r 0.1 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 -b:v 0 -crf 32 output.mp4 -f dshow -s 640x480 -i video='USB2.0 PC CAMERA' -filter_complex 'overlay=W-w-1:H-h-50' -y
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as r,c as i,a as t,b as a,d as e,e as n}from"./app-91ee3df5.js";const p={},d=t("p",null,[a("每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:"),t("strong",null,"遵循一个固定、程序化的流程,有规律地养成习惯"),a(",实现自我提升。")],-1),c=t("h2",{id:"仪式清单",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#仪式清单","aria-hidden":"true"},"#"),a(" 仪式清单")],-1),u=t("h3",{id:"_5am-club",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#_5am-club","aria-hidden":"true"},"#"),a(" 5AM Club")],-1),h={href:"https://gpt-vip.top/posts/2023-03-31-efficient_morning_5am_club.html",target:"_blank",rel:"noopener noreferrer"},_=t("ol",null,[t("li",null,"早上 5 点起床,使用手环震动闹钟。"),t("li",null,"泡杯咖啡,准备早餐,开始第一个工作番茄。"),t("li",null,"工作 25 分钟休息 5 分钟,休息期间完成每日必须:拍照打卡发 SNS,吃早餐。"),t("li",null,"每天最低完成 8 个番茄,之后可进入长休息区间,进行家务打扫、健身、娱乐。"),t("li",null,"晚上 10 点睡觉,保证充足的睡眠时间。")],-1),k={href:"https://hubermanlab.com/sleep-toolkit-tools-for-optimizing-sleep-and-sleep-wake-timing/",target:"_blank",rel:"noopener noreferrer"},m=t("h3",{id:"每日",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#每日","aria-hidden":"true"},"#"),a(" 每日")],-1),b=t("p",null,[t("strong",null,"早上创造美好情绪"),a(":赞美、仪式感、吃好吃的、看搞笑视频、听歌。")],-1),f=t("li",null,"唱歌:唱一首你喜欢的歌曲(外语美声歌曲可以增加脂肪消耗,例如:秋山雅史的《千の風になって》)。",-1),g=t("li",null,"自拍视频:说一句话(比如当天的目标)来鼓励自己。在前一天想好录制内容,以获得积极情绪。",-1),v={href:"https://www.xuetangx.com/course/THU07111001088/",target:"_blank",rel:"noopener noreferrer"},x=n('
      58. 人际连接:通过直播连麦与陌生人沟通 15 分钟,例如:播客、抖音语音电台直播 PK。

        • 别人很重要:帮助别人,能让人更健康、更幸福。当心情不好时,去帮助其他人,心情会变得更好。
        • 表扬和自我表扬:赞美自己、家人,发挥标志性优势,总比弥补缺点更有效。
      59. 微习惯

        • 每工作 20 分钟,休息 20 秒,然后做 10 个深蹲;出书房或上完厕所,再做 15 个俯卧撑。在运动前,在白板上写出正字,每一组动作用一个笔画表示。进阶阶段可以用固定机位拍摄视频,监督运动习惯。拍摄时,使用关键句「切掉/保留」,配合 Quickcut 快速剪辑视频。
        • 睡前:每天泡脚 20 分钟(水温 40℃),短时间的泡脚可以帮助睡眠更快入睡。此外,每天睡前 90 分钟,淋浴(水温 38~43℃,淋浴 10 分钟)或泡澡也可以助你更快进入睡眠状态。[1]
      60. 间隔学习:穿插学习不同领域内容

        • 阅读看书:每天花 30 分钟读书,并输出笔记。
        • 墨墨背单词:每天背 20 个单词,虽然用处不大,但可以让脑子换个思路。
        • 笔记复习:利用思源笔记/SuperMemo 记忆模型,复习心理认知、沟通理论和行为反思等笔记。
      61. 当日回顾:每天记录 3 件好事,总结好事发生的原因,并与家人分享。

        这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。

      62. ',4),y=t("h3",{id:"定期",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#定期","aria-hidden":"true"},"#"),a(" 定期")],-1),T=t("strong",null,"月底反思",-1),D={href:"https://allisonseboldt.com/",target:"_blank",rel:"noopener noreferrer"},A={href:"https://justinjackson.ca/bootstrap",target:"_blank",rel:"noopener noreferrer"},S=t("li",null,[t("strong",null,"积极自我介绍"),a(":每三个月,讲述一个「最佳的我」的故事,植入你的优势,进行自我肯定。")],-1),w=t("h3",{id:"自我监控",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#自我监控","aria-hidden":"true"},"#"),a(" 自我监控")],-1),C={href:"https://gpt-vip.top/posts/2022-05-22-surveillance_video_for_myself.html",target:"_blank",rel:"noopener noreferrer"},L={href:"https://gpt-vip.top/posts/2022-11-03-ffmpeg_screen_recording.html",target:"_blank",rel:"noopener noreferrer"},E=n(`
        ffmpeg -f gdigrab -r 0.1 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 -b:v 0 -crf 32 output.mp4 -f dshow -s 640x480 -i video='USB2.0 PC CAMERA' -filter_complex 'overlay=W-w-1:H-h-50' -y
         
        `,1),G=n(`
      63. 晚上 10 点执行关机程序:静音、关闭护眼提醒、关闭录屏终端,并使用 dvr-scan 删除视频中的静止帧。这些步骤可以通过 AutoHotkey 命令自动完成。

        Send, {Volume_Mute}
         Process, Close, Stretchly.exe
         Process, Close, pwsh.exe
        diff --git a/assets/Diet.html-358f3f14.js b/assets/Diet.html-2e8d6d1d.js
        similarity index 99%
        rename from assets/Diet.html-358f3f14.js
        rename to assets/Diet.html-2e8d6d1d.js
        index 84e55f38..87aed718 100644
        --- a/assets/Diet.html-358f3f14.js
        +++ b/assets/Diet.html-2e8d6d1d.js
        @@ -1 +1 @@
        -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as i,c as o,a as g,b as t,d as e,e as l}from"./app-98132e77.js";const n={},s=l('

        16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。

        • 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。
        • 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。
        • 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。

        饮食

        零食

        • 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡米花,炸鸡排、牛肉馅饼外面有面粉,不适合烘烤。
        • 安井肉丸:撒尿牛肉丸> 包心鱼丸> 仿墨鱼丸?>牛肉丸> 蟹味宝 + 鱼籽包。安井肉丸质量都不错,不过别买量贩装,这是不同种类。

        饮料

        ',6),h={href:"https://www.zhihu.com/question/546343871/answer/2692019428",target:"_blank",rel:"noopener noreferrer"},c=l('

        马来西亚的土特产,约有 100 多年的历史。白咖啡并不是指咖啡的颜色是白色的,而是采用特等 Liberia(利比里亚)、Arabica(阿拉比卡)和 Robusta(罗布斯塔)咖啡豆及特级的脱脂奶精原料,经中轻度低温烘焙及特殊工艺加工后大量去除咖啡碱,去除高温碳烤所产生的焦苦与酸涩味,将咖啡的苦酸味、咖啡因含量降到最低,甘醇芳香不伤肠胃,保留咖啡原有的色泽和香味,口感爽滑、纯正,颜色比普通奶咖更清淡柔和,呈现出淡淡的奶金黄色。

        夏天喝适合冷泡的绿茶、红茶、白茶、花茶等,而岩茶与普洱生茶冷泡就不容易好喝。[1] 蛮喜欢泰厨的花茶,有新鲜的香茅,但淘宝卖的花茶放了很多糖块。

        冷泡燕麦

        牛奶/酸奶/燕麦奶/椰奶 + 燕麦,前一天晚上配好,放在密封容器里,冰箱冷藏。第二天拿出来再加配料(奇亚籽、坚果、果干、椰子片、即食燕麦、水果、酸奶块)即可食用。需要注意的有几个点:

        • 主材一定要用生燕麦或烤燕麦,不要用即食的,即食的泡一夜就变成糊了,既不好吃也不健康,升糖很高。
        • 配料之所以在吃前再添加是为了避免口感拉胯,所以不会带来脆的口感的配料也可以冷藏前添加,即食燕麦片、椰子片、坚果、酸奶块这些可以丰富口感的建议在吃前添加。
        • 配料有两个作用,除了提升口感层次还有丰富营养的作用,但建议酌情添加,特别是有减脂需求的人士,毕竟大部分配料都是热量炸弹。而且不加配料其实已经很好吃了,个人较为推荐的配料是一袋每日坚果或一小把燕麦脆片(如卡乐比)。
        • 容器可以选用梅森杯、玻璃饭盒,若对配料有要求而且想路上吃可以选择乐扣双层多用保鲜盒。
        • 放冰箱这一步很重要!不放可能会化身喷射战士。
        • 唯一的缺点就是冷吃可能不是所有人都适合,也可以早上再用微波炉打一下,对口感和营养肯定会有影响。

        健康理论

        程序员延寿指南

        ',7),u={href:"https://github.com/geekan/HowToLiveLonger",target:"_blank",rel:"noopener noreferrer"},_={href:"https://github.com/geekan/HowToLiveLonger#611-%E5%9B%BA%E4%BD%93",target:"_blank",rel:"noopener noreferrer"},f=g("li",null,[t("液体:喝咖啡(-22%~-12% ACM),"),g("strong",null,"喝牛奶"),t("(-17%~-10% ACM),喝茶(-15%~-8% ACM),少喝或不喝甜味饮料(否则每天一杯 +7% ACM,+多巴胺),戒酒或每周 100g(纯酒精量 (g)=饮酒量 (ml)× 酒精浓度 (%)× 酒精密度 0.8g/ml)内(否则+~50% ACM,无上限)")],-1),p=g("li",null,"气体:不吸烟(否则+~50% ACM,-12~-11 年寿命)",-1),b={href:"https://github.com/geekan/HowToLiveLonger#614-%E5%85%89%E7%85%A7",target:"_blank",rel:"noopener noreferrer"},D=g("li",null,"药物:二甲双胍(糖尿病人相比正常人可以 +3 年)、复合维生素(-8% 癌症风险)、亚精胺(-60%~-30% ACM)、葡萄糖胺(-39% ACM)",-1),y=g("li",null,[t("输出 "),g("ul",null,[g("li",null,"运动:每周 3 次 45 分钟挥拍运动(-47% ACM)"),g("li",null,"日常:刷牙(-25% ACM)"),g("li",null,[t("睡眠:每天睡 7 小时全因死亡率最低;且 22-24 点间最好,"),g("em",null,"早睡 +43% ACM,晚睡 +15% ACM(存在争议)")])])],-1),A=g("li",null,[t("上下文 "),g("ul",null,[g("li",null,"体重:减肥(-54% ACM)")])],-1),m=g("h3",{id:"其他",tabindex:"-1"},[g("a",{class:"header-anchor",href:"#其他","aria-hidden":"true"},"#"),t(" 其他")],-1),C={href:"https://www.cell.com/cell/fulltext/S0092-8674(22)00398-1",target:"_blank",rel:"noopener noreferrer"},M={href:"https://news.sciencenet.cn/htmlnews/2022/4/478234.shtm",target:"_blank",rel:"noopener noreferrer"},k=l('

        泡澡

        浸泡 42℃ 以上的水温最多泡 3-5 分钟,40℃ 可以泡 10 分钟,37℃ 到 39℃ 的温水,可以泡 20-30 分钟。泡浴后的清水冲淋是有必要的,头发部位和面部用冷水冲淋则有极其良好的保健和延缓衰老的功效。

        泡浴作用:

        • 低温、长时间的泡浴 - 失眠、压力带来的疲劳。
        • 上班前或者重大活动前高温或者低温并且短时间的泡浴 - 打起精神。
        • 0-21°,收敛组织器官和神经系统--冷水浴。
        • 32-40°,舒缓、愉快 - 温水浴。
        • 32-42°,止痛、镇静,浴后无力需要休息 - 热水浴。
        • 全身浴:覆盖肩膀为主,温水 - 提高新陈代谢。
        • 半身浴:肚脐平齐,不增加心脏负担,30-40 分钟,慢慢发汗,上半身披毛巾或间断性加水 - 改善心脏功能,改善冷性体质,特别适合老年人。注意:39°,肚脐,30 分钟以上
        • 坐浴:20 厘米高度的水平线,浸入腰椎、尾椎、臀部,15 分钟 - 痔疮、便秘、尿路感染、生殖系统护理。

        另外,饮酒后最好不要立即去洗澡,这很容易引发心血管病。洗澡时出现头晕、胸闷、眼花等“澡堂综合征”,也需立即停浴,到医院就诊。

        减肥食谱

        使用食谱前,先需要养成正确的减重习惯和心态。

        • 不要让自己饿肚子,每天至少要吃 3 顿正餐。
        • 吃点心或正餐之前和之后都要喝一杯水,进食顺序按蔬菜> 鱼肉蛋> 主食
        • 饭后半小时不要坐下
        • 临睡前至少 1 小时停止用餐,并且要多喝水。
        • 每咬一口食物,都要咀嚼一段时间。从身体真正饱足到大脑产生饱足感需要 15 分钟。吃慢一点,就不容易吃得过多。
        • 每天称体重,然后找出 7 天的平均值。确保体重持续下降就好,不需要规定自己每周必须减掉多少体重。有时候体重可能会增加,尤其是女性在月经期间体内水分潴留,容易水肿,和你的饮食或锻炼习惯没有关系。
        • 每周只减掉 0.5-1 公斤。快速减肥会减掉肌肉,而不是脂肪,而且也很难长期维持体重。
        早餐午餐晚餐
        Day01谷物牛奶 (燕麦片 40g+ 全脂奶粉 40g+ 蛋白粉 5g+ 黑咖啡 2g);12 粒巴旦木;苹果 200g什锦饭 (大米 30g+ 小米 30g+ 甜豌豆 15g+ 松子仁 5g+ 酱牛肉碎 30g+ 胡萝卜丁 30g);蔬菜沙拉 (生菜 100g+ 熟鸡蛋 + 油醋汁半汤匙 4g);猕猴桃 120g;无糖酸奶 100g燕麦米饭 (燕麦粒 20g+ 大米 15g);油煮蘑菇鸡肉菠菜 (菠菜 200g+ 蘑菇 50g+ 鸡腿 40g+ 香油 1 汤匙 8g);豆浆 (黄豆 50g)
        Day02全麦三明治 (生菜 70g+ 鸡蛋 + 全麦吐司 60g+ 香油 2g);12 粒原味开心果;牛奶 250g双色菜花 (西兰花 100g+ 菜花 100g+ 香油 5g);茄汁虾仁 (虾仁 75g+ 番茄酱 30g+ 油 8g);二米饭 (小米 30g+ 糙米 30g);牛奶咖啡 (低脂奶粉 20g+ 黑咖啡 2g)(先吃一半菜花)木耳小白菜杂煮 (小白菜 150g+ 北豆腐 60g+ 鸡心 60g+ 黑木耳 6g+ 香油 3g);红豆紫米薏米粥 (紫红糯米 30g+ 薏米 15g+ 赤小豆 30g);蜜橘 100g(加餐)
        Day03红豆紫米薏米粥 (紫红糯米 30g+ 薏米 15g+ 赤小豆 30g);水煮蛋;果仁菠菜 (菠菜 80g+ 花生仁 10g+ 香油 3g);牛奶咖啡 (低脂奶粉 20g+ 黑咖啡 2g)土豆沙拉 (土豆 200g+ 甜豌豆 30g+ 白芝麻 3g+ 鸡蛋 + 千岛酱 1 汤匙 8g);酱卤鸭肝 60g;无糖酸奶 100g;10 粒小番茄燕麦小米粥 (燕麦片 30g+ 小米 30g+ 小麦胚芽 10g);蒸虾皮小油菜 (小油菜 180g+ 虾皮 5g+ 全麦粉 30g+ 花椒油 3g);烤鸡腿 80g
        Day04奶香醪糟燕麦 (醪糟 100g+ 燕麦片 30g+ 全脂奶粉 40g);鸡蛋;12 粒巴旦木紫菜蛋花汤 (海苔 4g+ 熟芝麻 1g+ 鸡蛋);牛奶燕麦 (燕麦片 20g+ 全脂牛奶 250g);酸奶 100g;小叶橘 150g;全麦吐司 30g火腿木耳煮油菜 (油菜 250g+ 木耳 10g+ 方火腿 60g+ 香油 1 汤匙 8g);蒸红薯 180g;无糖酸奶 (酸奶 100g+ 蛋白粉 5g)(先吃油菜)
        Day05蒸食物套餐 (铁棍山药 80g+ 糯玉米带轴 150g+ 胡萝卜半根 100g);奶香黄豆浆 (黄豆 20g+ 黑芝麻 5g+ 全脂奶粉 20g);鸡蛋羹 (鸡蛋 + 香油 2g);桂圆 150g冲杂粮糊 (烤红豆粉 15g+ 燕麦粉 20g+ 小米粉 15g+ 全脂奶粉 10g);生菜沙拉 (生菜 150g+ 千岛酱 10g);酸奶 200g;蓝莓 100g;葡萄干 10g坚果土豆泥 (土豆 250g+ 烤花生碎 12g+ 方火腿 70g);油煮木耳小白菜 (小白菜 200g+ 木耳 6g+ 香油 4g);酸奶 100g
        Day06香蕉燕麦蛋糕 (香蕉 120g+ 燕麦片 30g+ 鸡蛋 + 牛奶 200g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 100g+ 核桃仁 15g+ 芝麻油 4g)鸡腿炖四宝 (鸡腿肉 100g+ 鲜蘑 80g+ 黄花菜 10g+ 甜豌豆 80g+ 木耳 10g);银耳西兰花 (西兰花 200g+ 银耳 8g+ 香油 4g)炖素三鲜 (冬笋 80g+ 香菇 10g+ 黄豆芽 120g+ 香油半汤匙 4g);清蒸鱼 (蒸鲈鱼 120g+ 花生油 4g);烤红薯 250g(按序食用)
        Day07苹果全麦煎饼 (苹果肉 180g+ 全麦粉 20g+ 葡萄干 3g+ 全脂奶粉 10g+ 油 3g);麦胚红枣豆浆 (烤黄豆 15g+ 烤黑芝麻 8g+ 大枣肉 10g+ 熟小麦胚芽 10g)生菜鸡蛋沙拉 (生菜 200g+ 鸡蛋*2+ 千岛沙拉酱 8g);麦胚红枣豆浆 (烤黄豆 15g+ 烤黑芝麻 8g+ 大枣肉 10g+ 熟小麦胚芽 10g);酸奶 150g;猕猴桃 120g甘薯红米饭 (红薯 100g+ 红米 20g+ 白米 20g);牛肉炖菜 (牛肉 100g+ 香菇 8g+ 胡萝卜 40g+ 魔芋粉丝 20g);果仁菠菜 (菠菜 200g+ 花生仁 8g+ 香油 4g)
        Day08全麦面包 70g;牛奶 240g;水煮鸡蛋;桂圆 120g;9 粒巴旦木油煮木耳小白菜鸡 (小白菜 25g+ 卤水豆腐 100g+ 鸡心 50g+ 黑木耳 2g+ 香油 3g);炖素三鲜 (冬笋 40g+ 香菇 4g+ 黄豆芽 20g+ 香油 2g);蒸红薯 200g;去皮小叶橘 200g杂粮糊 (烤红豆粉 13g+ 燕麦粉 13g+ 小米粉 13g+ 脱脂奶粉 4g);火腿木耳煮油菜 (油菜 100g+ 木耳 5g+ 方火腿 75g+ 香油 5g);无糖酸奶 130g
        Day09香蕉燕麦蛋糕 (香蕉 120g+ 燕麦片 50g+ 鸡蛋 + 牛奶 240g);15 粒开心果燕麦小米浓粥 (燕麦片 25g+ 小米 13g+ 小麦胚芽 13g);生菜沙拉 (生菜 200g+ 千岛酱 4g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 4g);豆浆 (黄豆 44g)二米饭 (小米 38g+ 糙米 15g);蒸虾皮小油菜 (小油菜 200g+ 虾皮 6g+ 全麦粉 10g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 花生油 4g);烤鸡腿肉 45g
        Day10苹果全麦煎饼 (苹果肉 105g+ 全麦粉 50g+ 葡萄干 3g+ 全脂奶粉 30g+ 油 3g);鸡蛋羹 (鸡蛋 + 香油 2g)蒸土豆 (土豆 200g+ 方火腿 75g+ 花生碎 2g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 花生油 3g);猕猴桃 150g甘薯红米饭 (红薯 50g+ 红米 25g+ 白米 25g);油煮木耳小白菜鸡 (小白菜 100g+ 卤水豆腐 50g+ 鸡心 50g+ 木耳 4g);豆浆 (黄豆 30g)
        Day11谷物牛奶 (燕麦片 50g+ 全脂奶粉 30g+ 黑咖啡 2g);鸡蛋;10 粒巴旦木;蜜橘 120g什锦饭 (大米 50g+ 小米 25g+ 甜豌豆 8g+ 松子仁 2g+ 酱牛肉碎 70g+ 胡萝卜丁 20g);银耳西兰花 (西兰花 50g+ 银耳 4g+ 香油 4g)燕麦米饭 (燕麦粒 25g+ 大米 38g);牛肉炖菜 (牛肉 50g+ 香菇 7g+ 胡萝卜 20g+ 魔芋粉丝 20g);烤鸡腿肉 50g
        Day12奶香醪糟燕麦 (醪糟 69g+ 燕麦片 38g+ 全脂奶粉 30g);果仁菠菜 (菠菜 150g+ 花生仁 3g+ 香油 3g);鸡蛋羹土豆鸡蛋豌豆沙拉 (土豆 300g+ 甜豌豆 16g+ 白芝麻 3g+ 鸡蛋 + 千岛酱 4g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 20g+ 魔芋粉丝 20g+ 香油 2g)蒸食物套餐 (铁棍山药 100g+ 糯玉米带轴 300g+ 胡萝卜 20g);油煮蘑菇鸡肉菠菜 (菠菜 50g+ 蘑菇 35g+ 鸡腿 50g+ 香油 5g);无糖酸奶 120g
        Day13红豆紫米薏米粥 (紫红糯米 25g+ 薏米 25g+ 红小豆 13g);蔬菜沙拉 (生菜 200g+ 熟鸡蛋 + 油醋汁 5g);牛奶咖啡 (牛奶 240g+ 咖啡 2g)核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 100g+ 核桃仁 8g+ 香油 3g);烤红薯 200g;酱牛肉 70g;猕猴桃 150g麦胚红枣豆浆 (烤黄豆 30g+ 烤黑芝麻 16g+ 大枣肉 20g+ 熟小麦胚芽 20g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 2g);果仁菠菜 (菠菜 150g+ 花生仁 2g+ 香油 1g)
        Day14鸡蛋生菜三明治 (生菜 150g+ 鸡蛋 + 全麦吐司 88g+ 香油 5g);牛奶 240g鸡腿炖四宝 (鸡腿肉 50g+ 鲜蘑 35g+ 黄花菜 4g+ 甜豌豆 8g+ 木耳 4g);燕麦米饭 (燕麦粒 25g+ 大米 25g);葡萄干 25g双色菜花 (西兰花 50g+ 菜花 40g+ 油醋汁 2g);茄汁虾仁 (虾仁 80g+ 番茄 10g+ 油 2g);二米饭 (小米 38g+ 糙米 25g);紫菜蛋花汤 (海苔 2g+ 鸡蛋*1)
        Day15红豆紫米薏米粥 (紫红糯米 25g+ 薏米 25g+ 赤小豆 13g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 75g+ 核桃仁 3g+ 香油 2g);鸡蛋羹 (鸡蛋*1+ 香油 1g);无糖酸奶 240g油煮木耳小白菜鸡 (小白菜 100g+ 卤水豆腐 100g+ 鸡心 50g+ 木耳 4g+ 油 5g);二米饭 (小米 50g+ 糙米 25g)甘薯红米饭 (红薯 50g+ 红米 25g+ 大米 25g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 20g+ 魔芋粉丝 20g+ 油 5g);烤鸡腿肉 50g
        Day16奶香醪糟燕麦 (醪糟 35g+ 燕麦片 38g+ 全脂奶粉 30g);鸡蛋;蜜橘 120g蔬菜沙拉 (生菜 200g+ 鸡蛋 + 油醋汁 5g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 5g);蒸土豆 300g油煮鸡肉蘑菇菠菜 (菠菜菜 100g+ 蘑菇 35g+ 鸡腿肉 75g+ 香油 5g);蒸红薯 250g;豆浆 (黄豆 50g)
        Day17香蕉燕麦蛋糕 (香蕉 80g+ 燕麦片 50g+ 鸡蛋 + 牛奶 240g)粉蒸土豆鸡肉 (土豆 200g+ 鸡腿肉 50g+ 蒸肉米粉 5g+ 烤花生碎 3g);双色菜花 (西兰花 50g+ 菜花 80g+ 油醋汁 3g);酱牛肉 150g;猕猴桃 35g麦胚红枣豆浆 (烤黄豆 30g+ 烤黑芝麻 16g+ 大枣肉 20g+ 熟小麦胚芽 20g);火腿木耳煮油菜 (油菜 100g+ 木耳 4g+ 方火腿 75g+ 香油 4g)
        Day18鸡蛋生菜三明治 (生菜 150g+ 鸡蛋 + 全麦吐司 88g+ 香油 3g);奶香黄豆浆 (黄豆 13g+ 黑芝麻 3g+ 全脂奶粉 20g)杂粮糊 (烤红豆粉 13g+ 燕麦粉 13g+ 小米粉 13g+ 脱脂奶粉 2g);油煮木耳小白菜鸡 (小白菜 150g+ 卤水豆腐 40g+ 鸡心 75g+ 木耳 4g+ 香油 5g);苹果 150g蒸食物套餐 (铁棍山药 60g+ 糯玉米带轴 200g+ 胡萝卜 100g);鸡腿炖四宝 (鸡腿肉 50g+ 鲜蘑 17g+ 黄花菜 2g+ 甜豌豆 4g+ 黄豆芽 10g);生菜沙拉 (生菜 50g+ 千岛酱 4g);无糖酸奶 130g
        Day19苹果全麦煎饼 (苹果肉 60g+ 全麦粉 50g+ 葡萄干 3g+ 全脂奶粉 20g+ 油 5g);牛奶 240g土豆鸡蛋豌豆沙拉 (土豆 300g+ 甜豌豆 32g+ 白芝麻 2g+ 鸡蛋 + 千岛酱 4g);茄汁虾仁 (虾仁 80g+ 番茄酱 2g+ 油 10g)燕麦小米浓粥 (燕麦片 13g+ 小米 38g+ 小麦胚芽 13g);火腿木耳煮油菜 (油菜 100g+ 木耳 4g+ 方火腿 75g);无糖酸奶 130g
        Day20蒸食物套餐 (铁棍山药 60g+ 糯玉米带轴 200g+ 胡萝卜 100g);紫菜蛋花汤 (海苔 2g+ 鸡蛋*1);果仁菠菜 (菠菜 100g+ 花生仁 3g+ 香油 3g)炖素三鲜 (冬笋 40g+ 香菇 17g+ 黄豆芽 20g+ 香油 3g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 10g+ 魔芋粉丝 20g);燕麦米饭 (燕麦粒 25g+ 大米 50g);烤鸡腿肉 50g什锦饭 (大米 38g+ 小米 25g+ 甜豌豆 8g+ 松子仁 3g+ 酱牛肉碎 70g+ 胡萝卜丁 20g);银耳西兰花 (西兰花 25g+ 银耳 4g+ 香油 2g)
        Day21谷物牛奶 (燕麦片 50g+ 全脂奶粉 30g+ 黑咖啡 2g);鸡蛋;桂圆 120g油煮鸡肉蘑菇菠菜 (菠菜菜 100g+ 蘑菇 70g+ 鸡腿肉 50g+ 香油 5g);烤红薯 200g;猕猴桃 150g;无糖酸奶 130g粉蒸土豆鸡肉 (土豆 100g+ 鸡腿肉 50g+ 蒸肉米粉 5g+ 烤花生碎 2g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 油 1g);二米饭 (小米 25g+ 糙米 13g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 75g+ 核桃仁 5g+ 香油 2g)

        以上食谱整理自范志红老师的《吃出好身材-21 天营养食谱》,侵权删。

        食谱注意:

        • 晚餐时补充复合 B 族维生素药片,乳糖敏感者可以将纯牛奶换成低乳糖奶。
        • 蒸蛋羹可以用水煮蛋替代;鸡心、鸭肝、方火腿可以用鸡腿肉、酱牛肉替换;什锦饭中的酱牛肉碎换成炒鸡丁;松子仁可以换成熟芝麻或开心果碎;小叶橘可以替换成等量其他甜度低的新鲜水果,如草莓或半个苹果等;桂圆可以换成其他自己爱吃、吃了之后胃肠舒服的应季水果,比如橘子、橙子、猕猴桃等。水果可以午饭前一小时食用。
        • 小米、燕麦提前浸泡半小时到一小时再和大米一起煮口感较好。如果没有杂粮粉,可以直接用这些杂粮煮成饭,每次煮多一点,分成几份冷冻起来,每次蒸热吃一份。
        • 食谱部分可进行微调,如果不会做,可直接按原料食用。

        ',13),x={class:"footnotes"},w={class:"footnotes-list"},L={id:"footnote1",class:"footnote-item"},B={href:"https://www.guokr.com/article/461818/",target:"_blank",rel:"noopener noreferrer"},E=g("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function v(N,T){const d=a("ExternalLinkIcon");return i(),o("div",null,[s,g("p",null,[t("现磨咖啡味道不错,每天用量需控制在 2 杯黑咖啡或 4 杯奶咖,相关数据参考"),g("a",h,[t("适量喝咖啡对身体有哪些好处?"),e(d)]),t("。有时喝的频繁就比较折腾,考虑入手白咖啡,不过据传白咖啡糖分高,而且含反式脂肪酸。")]),c,g("p",null,[g("a",u,[t("程序员延寿指南"),e(d)]),t(":")]),g("ul",null,[g("li",null,[t("输入 "),g("ul",null,[g("li",null,[t("固体:"),g("a",_,[t("吃白肉"),e(d)]),t("(-11%~-3% ACM)、蔬果为主(-26%~-17% ACM),多吃辣(-23% ACM),多吃坚果(-27%~-4% ACM),少吃蛋黄(否则 +7% ACM/0.5 颗/天),中量碳水、多吃植物蛋白(-10% ACM),少吃超加工食物(-62%~-18%)")]),f,p,g("li",null,[t("光照:"),g("a",b,[t("晒太阳"),e(d)]),t("(-~40% ACM)")]),D])]),y,A]),m,g("p",null,[t("在发表在《细胞》杂志的"),g("a",C,[t("综述文章"),e(d)]),t("中描述了"),g("a",M,[t("长寿饮食"),e(d)]),t(",这是一种基于从食物成分和卡路里摄入等饮食各个方面研究的多支柱方法。研究人员报告说,理想情况下,一天的饭菜都在 11—12 小时的窗口内进行,允许每天禁食,每 3—4 个月进行为期 5 天的禁食也可能有助于降低胰岛素抵抗、血压和其他疾病风险因素。朗格描述了长寿饮食在现实生活中的样子:大量的豆类、全谷物和蔬菜;一些鱼;没有红肉或加工肉和极少量的白肉;低糖和精制谷物;一定量的坚果和橄榄油;一些黑巧克力。")]),k,g("section",x,[g("ol",w,[g("li",L,[g("p",null,[g("a",B,[t("冷泡茶和热茶放凉,好喝级别能一样吗?"),e(d)]),t(),E])])])])])}const H=r(n,[["render",v],["__file","Diet.html.vue"]]);export{H as default}; +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as i,c as o,a as g,b as t,d as e,e as l}from"./app-91ee3df5.js";const n={},s=l('

        16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。

        • 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。
        • 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。
        • 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。

        饮食

        零食

        • 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡米花,炸鸡排、牛肉馅饼外面有面粉,不适合烘烤。
        • 安井肉丸:撒尿牛肉丸> 包心鱼丸> 仿墨鱼丸?>牛肉丸> 蟹味宝 + 鱼籽包。安井肉丸质量都不错,不过别买量贩装,这是不同种类。

        饮料

        ',6),h={href:"https://www.zhihu.com/question/546343871/answer/2692019428",target:"_blank",rel:"noopener noreferrer"},c=l('

        马来西亚的土特产,约有 100 多年的历史。白咖啡并不是指咖啡的颜色是白色的,而是采用特等 Liberia(利比里亚)、Arabica(阿拉比卡)和 Robusta(罗布斯塔)咖啡豆及特级的脱脂奶精原料,经中轻度低温烘焙及特殊工艺加工后大量去除咖啡碱,去除高温碳烤所产生的焦苦与酸涩味,将咖啡的苦酸味、咖啡因含量降到最低,甘醇芳香不伤肠胃,保留咖啡原有的色泽和香味,口感爽滑、纯正,颜色比普通奶咖更清淡柔和,呈现出淡淡的奶金黄色。

        夏天喝适合冷泡的绿茶、红茶、白茶、花茶等,而岩茶与普洱生茶冷泡就不容易好喝。[1] 蛮喜欢泰厨的花茶,有新鲜的香茅,但淘宝卖的花茶放了很多糖块。

        冷泡燕麦

        牛奶/酸奶/燕麦奶/椰奶 + 燕麦,前一天晚上配好,放在密封容器里,冰箱冷藏。第二天拿出来再加配料(奇亚籽、坚果、果干、椰子片、即食燕麦、水果、酸奶块)即可食用。需要注意的有几个点:

        • 主材一定要用生燕麦或烤燕麦,不要用即食的,即食的泡一夜就变成糊了,既不好吃也不健康,升糖很高。
        • 配料之所以在吃前再添加是为了避免口感拉胯,所以不会带来脆的口感的配料也可以冷藏前添加,即食燕麦片、椰子片、坚果、酸奶块这些可以丰富口感的建议在吃前添加。
        • 配料有两个作用,除了提升口感层次还有丰富营养的作用,但建议酌情添加,特别是有减脂需求的人士,毕竟大部分配料都是热量炸弹。而且不加配料其实已经很好吃了,个人较为推荐的配料是一袋每日坚果或一小把燕麦脆片(如卡乐比)。
        • 容器可以选用梅森杯、玻璃饭盒,若对配料有要求而且想路上吃可以选择乐扣双层多用保鲜盒。
        • 放冰箱这一步很重要!不放可能会化身喷射战士。
        • 唯一的缺点就是冷吃可能不是所有人都适合,也可以早上再用微波炉打一下,对口感和营养肯定会有影响。

        健康理论

        程序员延寿指南

        ',7),u={href:"https://github.com/geekan/HowToLiveLonger",target:"_blank",rel:"noopener noreferrer"},_={href:"https://github.com/geekan/HowToLiveLonger#611-%E5%9B%BA%E4%BD%93",target:"_blank",rel:"noopener noreferrer"},f=g("li",null,[t("液体:喝咖啡(-22%~-12% ACM),"),g("strong",null,"喝牛奶"),t("(-17%~-10% ACM),喝茶(-15%~-8% ACM),少喝或不喝甜味饮料(否则每天一杯 +7% ACM,+多巴胺),戒酒或每周 100g(纯酒精量 (g)=饮酒量 (ml)× 酒精浓度 (%)× 酒精密度 0.8g/ml)内(否则+~50% ACM,无上限)")],-1),p=g("li",null,"气体:不吸烟(否则+~50% ACM,-12~-11 年寿命)",-1),b={href:"https://github.com/geekan/HowToLiveLonger#614-%E5%85%89%E7%85%A7",target:"_blank",rel:"noopener noreferrer"},D=g("li",null,"药物:二甲双胍(糖尿病人相比正常人可以 +3 年)、复合维生素(-8% 癌症风险)、亚精胺(-60%~-30% ACM)、葡萄糖胺(-39% ACM)",-1),y=g("li",null,[t("输出 "),g("ul",null,[g("li",null,"运动:每周 3 次 45 分钟挥拍运动(-47% ACM)"),g("li",null,"日常:刷牙(-25% ACM)"),g("li",null,[t("睡眠:每天睡 7 小时全因死亡率最低;且 22-24 点间最好,"),g("em",null,"早睡 +43% ACM,晚睡 +15% ACM(存在争议)")])])],-1),A=g("li",null,[t("上下文 "),g("ul",null,[g("li",null,"体重:减肥(-54% ACM)")])],-1),m=g("h3",{id:"其他",tabindex:"-1"},[g("a",{class:"header-anchor",href:"#其他","aria-hidden":"true"},"#"),t(" 其他")],-1),C={href:"https://www.cell.com/cell/fulltext/S0092-8674(22)00398-1",target:"_blank",rel:"noopener noreferrer"},M={href:"https://news.sciencenet.cn/htmlnews/2022/4/478234.shtm",target:"_blank",rel:"noopener noreferrer"},k=l('

        泡澡

        浸泡 42℃ 以上的水温最多泡 3-5 分钟,40℃ 可以泡 10 分钟,37℃ 到 39℃ 的温水,可以泡 20-30 分钟。泡浴后的清水冲淋是有必要的,头发部位和面部用冷水冲淋则有极其良好的保健和延缓衰老的功效。

        泡浴作用:

        • 低温、长时间的泡浴 - 失眠、压力带来的疲劳。
        • 上班前或者重大活动前高温或者低温并且短时间的泡浴 - 打起精神。
        • 0-21°,收敛组织器官和神经系统--冷水浴。
        • 32-40°,舒缓、愉快 - 温水浴。
        • 32-42°,止痛、镇静,浴后无力需要休息 - 热水浴。
        • 全身浴:覆盖肩膀为主,温水 - 提高新陈代谢。
        • 半身浴:肚脐平齐,不增加心脏负担,30-40 分钟,慢慢发汗,上半身披毛巾或间断性加水 - 改善心脏功能,改善冷性体质,特别适合老年人。注意:39°,肚脐,30 分钟以上
        • 坐浴:20 厘米高度的水平线,浸入腰椎、尾椎、臀部,15 分钟 - 痔疮、便秘、尿路感染、生殖系统护理。

        另外,饮酒后最好不要立即去洗澡,这很容易引发心血管病。洗澡时出现头晕、胸闷、眼花等“澡堂综合征”,也需立即停浴,到医院就诊。

        减肥食谱

        使用食谱前,先需要养成正确的减重习惯和心态。

        • 不要让自己饿肚子,每天至少要吃 3 顿正餐。
        • 吃点心或正餐之前和之后都要喝一杯水,进食顺序按蔬菜> 鱼肉蛋> 主食
        • 饭后半小时不要坐下
        • 临睡前至少 1 小时停止用餐,并且要多喝水。
        • 每咬一口食物,都要咀嚼一段时间。从身体真正饱足到大脑产生饱足感需要 15 分钟。吃慢一点,就不容易吃得过多。
        • 每天称体重,然后找出 7 天的平均值。确保体重持续下降就好,不需要规定自己每周必须减掉多少体重。有时候体重可能会增加,尤其是女性在月经期间体内水分潴留,容易水肿,和你的饮食或锻炼习惯没有关系。
        • 每周只减掉 0.5-1 公斤。快速减肥会减掉肌肉,而不是脂肪,而且也很难长期维持体重。
        早餐午餐晚餐
        Day01谷物牛奶 (燕麦片 40g+ 全脂奶粉 40g+ 蛋白粉 5g+ 黑咖啡 2g);12 粒巴旦木;苹果 200g什锦饭 (大米 30g+ 小米 30g+ 甜豌豆 15g+ 松子仁 5g+ 酱牛肉碎 30g+ 胡萝卜丁 30g);蔬菜沙拉 (生菜 100g+ 熟鸡蛋 + 油醋汁半汤匙 4g);猕猴桃 120g;无糖酸奶 100g燕麦米饭 (燕麦粒 20g+ 大米 15g);油煮蘑菇鸡肉菠菜 (菠菜 200g+ 蘑菇 50g+ 鸡腿 40g+ 香油 1 汤匙 8g);豆浆 (黄豆 50g)
        Day02全麦三明治 (生菜 70g+ 鸡蛋 + 全麦吐司 60g+ 香油 2g);12 粒原味开心果;牛奶 250g双色菜花 (西兰花 100g+ 菜花 100g+ 香油 5g);茄汁虾仁 (虾仁 75g+ 番茄酱 30g+ 油 8g);二米饭 (小米 30g+ 糙米 30g);牛奶咖啡 (低脂奶粉 20g+ 黑咖啡 2g)(先吃一半菜花)木耳小白菜杂煮 (小白菜 150g+ 北豆腐 60g+ 鸡心 60g+ 黑木耳 6g+ 香油 3g);红豆紫米薏米粥 (紫红糯米 30g+ 薏米 15g+ 赤小豆 30g);蜜橘 100g(加餐)
        Day03红豆紫米薏米粥 (紫红糯米 30g+ 薏米 15g+ 赤小豆 30g);水煮蛋;果仁菠菜 (菠菜 80g+ 花生仁 10g+ 香油 3g);牛奶咖啡 (低脂奶粉 20g+ 黑咖啡 2g)土豆沙拉 (土豆 200g+ 甜豌豆 30g+ 白芝麻 3g+ 鸡蛋 + 千岛酱 1 汤匙 8g);酱卤鸭肝 60g;无糖酸奶 100g;10 粒小番茄燕麦小米粥 (燕麦片 30g+ 小米 30g+ 小麦胚芽 10g);蒸虾皮小油菜 (小油菜 180g+ 虾皮 5g+ 全麦粉 30g+ 花椒油 3g);烤鸡腿 80g
        Day04奶香醪糟燕麦 (醪糟 100g+ 燕麦片 30g+ 全脂奶粉 40g);鸡蛋;12 粒巴旦木紫菜蛋花汤 (海苔 4g+ 熟芝麻 1g+ 鸡蛋);牛奶燕麦 (燕麦片 20g+ 全脂牛奶 250g);酸奶 100g;小叶橘 150g;全麦吐司 30g火腿木耳煮油菜 (油菜 250g+ 木耳 10g+ 方火腿 60g+ 香油 1 汤匙 8g);蒸红薯 180g;无糖酸奶 (酸奶 100g+ 蛋白粉 5g)(先吃油菜)
        Day05蒸食物套餐 (铁棍山药 80g+ 糯玉米带轴 150g+ 胡萝卜半根 100g);奶香黄豆浆 (黄豆 20g+ 黑芝麻 5g+ 全脂奶粉 20g);鸡蛋羹 (鸡蛋 + 香油 2g);桂圆 150g冲杂粮糊 (烤红豆粉 15g+ 燕麦粉 20g+ 小米粉 15g+ 全脂奶粉 10g);生菜沙拉 (生菜 150g+ 千岛酱 10g);酸奶 200g;蓝莓 100g;葡萄干 10g坚果土豆泥 (土豆 250g+ 烤花生碎 12g+ 方火腿 70g);油煮木耳小白菜 (小白菜 200g+ 木耳 6g+ 香油 4g);酸奶 100g
        Day06香蕉燕麦蛋糕 (香蕉 120g+ 燕麦片 30g+ 鸡蛋 + 牛奶 200g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 100g+ 核桃仁 15g+ 芝麻油 4g)鸡腿炖四宝 (鸡腿肉 100g+ 鲜蘑 80g+ 黄花菜 10g+ 甜豌豆 80g+ 木耳 10g);银耳西兰花 (西兰花 200g+ 银耳 8g+ 香油 4g)炖素三鲜 (冬笋 80g+ 香菇 10g+ 黄豆芽 120g+ 香油半汤匙 4g);清蒸鱼 (蒸鲈鱼 120g+ 花生油 4g);烤红薯 250g(按序食用)
        Day07苹果全麦煎饼 (苹果肉 180g+ 全麦粉 20g+ 葡萄干 3g+ 全脂奶粉 10g+ 油 3g);麦胚红枣豆浆 (烤黄豆 15g+ 烤黑芝麻 8g+ 大枣肉 10g+ 熟小麦胚芽 10g)生菜鸡蛋沙拉 (生菜 200g+ 鸡蛋*2+ 千岛沙拉酱 8g);麦胚红枣豆浆 (烤黄豆 15g+ 烤黑芝麻 8g+ 大枣肉 10g+ 熟小麦胚芽 10g);酸奶 150g;猕猴桃 120g甘薯红米饭 (红薯 100g+ 红米 20g+ 白米 20g);牛肉炖菜 (牛肉 100g+ 香菇 8g+ 胡萝卜 40g+ 魔芋粉丝 20g);果仁菠菜 (菠菜 200g+ 花生仁 8g+ 香油 4g)
        Day08全麦面包 70g;牛奶 240g;水煮鸡蛋;桂圆 120g;9 粒巴旦木油煮木耳小白菜鸡 (小白菜 25g+ 卤水豆腐 100g+ 鸡心 50g+ 黑木耳 2g+ 香油 3g);炖素三鲜 (冬笋 40g+ 香菇 4g+ 黄豆芽 20g+ 香油 2g);蒸红薯 200g;去皮小叶橘 200g杂粮糊 (烤红豆粉 13g+ 燕麦粉 13g+ 小米粉 13g+ 脱脂奶粉 4g);火腿木耳煮油菜 (油菜 100g+ 木耳 5g+ 方火腿 75g+ 香油 5g);无糖酸奶 130g
        Day09香蕉燕麦蛋糕 (香蕉 120g+ 燕麦片 50g+ 鸡蛋 + 牛奶 240g);15 粒开心果燕麦小米浓粥 (燕麦片 25g+ 小米 13g+ 小麦胚芽 13g);生菜沙拉 (生菜 200g+ 千岛酱 4g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 4g);豆浆 (黄豆 44g)二米饭 (小米 38g+ 糙米 15g);蒸虾皮小油菜 (小油菜 200g+ 虾皮 6g+ 全麦粉 10g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 花生油 4g);烤鸡腿肉 45g
        Day10苹果全麦煎饼 (苹果肉 105g+ 全麦粉 50g+ 葡萄干 3g+ 全脂奶粉 30g+ 油 3g);鸡蛋羹 (鸡蛋 + 香油 2g)蒸土豆 (土豆 200g+ 方火腿 75g+ 花生碎 2g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 花生油 3g);猕猴桃 150g甘薯红米饭 (红薯 50g+ 红米 25g+ 白米 25g);油煮木耳小白菜鸡 (小白菜 100g+ 卤水豆腐 50g+ 鸡心 50g+ 木耳 4g);豆浆 (黄豆 30g)
        Day11谷物牛奶 (燕麦片 50g+ 全脂奶粉 30g+ 黑咖啡 2g);鸡蛋;10 粒巴旦木;蜜橘 120g什锦饭 (大米 50g+ 小米 25g+ 甜豌豆 8g+ 松子仁 2g+ 酱牛肉碎 70g+ 胡萝卜丁 20g);银耳西兰花 (西兰花 50g+ 银耳 4g+ 香油 4g)燕麦米饭 (燕麦粒 25g+ 大米 38g);牛肉炖菜 (牛肉 50g+ 香菇 7g+ 胡萝卜 20g+ 魔芋粉丝 20g);烤鸡腿肉 50g
        Day12奶香醪糟燕麦 (醪糟 69g+ 燕麦片 38g+ 全脂奶粉 30g);果仁菠菜 (菠菜 150g+ 花生仁 3g+ 香油 3g);鸡蛋羹土豆鸡蛋豌豆沙拉 (土豆 300g+ 甜豌豆 16g+ 白芝麻 3g+ 鸡蛋 + 千岛酱 4g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 20g+ 魔芋粉丝 20g+ 香油 2g)蒸食物套餐 (铁棍山药 100g+ 糯玉米带轴 300g+ 胡萝卜 20g);油煮蘑菇鸡肉菠菜 (菠菜 50g+ 蘑菇 35g+ 鸡腿 50g+ 香油 5g);无糖酸奶 120g
        Day13红豆紫米薏米粥 (紫红糯米 25g+ 薏米 25g+ 红小豆 13g);蔬菜沙拉 (生菜 200g+ 熟鸡蛋 + 油醋汁 5g);牛奶咖啡 (牛奶 240g+ 咖啡 2g)核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 100g+ 核桃仁 8g+ 香油 3g);烤红薯 200g;酱牛肉 70g;猕猴桃 150g麦胚红枣豆浆 (烤黄豆 30g+ 烤黑芝麻 16g+ 大枣肉 20g+ 熟小麦胚芽 20g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 2g);果仁菠菜 (菠菜 150g+ 花生仁 2g+ 香油 1g)
        Day14鸡蛋生菜三明治 (生菜 150g+ 鸡蛋 + 全麦吐司 88g+ 香油 5g);牛奶 240g鸡腿炖四宝 (鸡腿肉 50g+ 鲜蘑 35g+ 黄花菜 4g+ 甜豌豆 8g+ 木耳 4g);燕麦米饭 (燕麦粒 25g+ 大米 25g);葡萄干 25g双色菜花 (西兰花 50g+ 菜花 40g+ 油醋汁 2g);茄汁虾仁 (虾仁 80g+ 番茄 10g+ 油 2g);二米饭 (小米 38g+ 糙米 25g);紫菜蛋花汤 (海苔 2g+ 鸡蛋*1)
        Day15红豆紫米薏米粥 (紫红糯米 25g+ 薏米 25g+ 赤小豆 13g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 75g+ 核桃仁 3g+ 香油 2g);鸡蛋羹 (鸡蛋*1+ 香油 1g);无糖酸奶 240g油煮木耳小白菜鸡 (小白菜 100g+ 卤水豆腐 100g+ 鸡心 50g+ 木耳 4g+ 油 5g);二米饭 (小米 50g+ 糙米 25g)甘薯红米饭 (红薯 50g+ 红米 25g+ 大米 25g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 20g+ 魔芋粉丝 20g+ 油 5g);烤鸡腿肉 50g
        Day16奶香醪糟燕麦 (醪糟 35g+ 燕麦片 38g+ 全脂奶粉 30g);鸡蛋;蜜橘 120g蔬菜沙拉 (生菜 200g+ 鸡蛋 + 油醋汁 5g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 5g);蒸土豆 300g油煮鸡肉蘑菇菠菜 (菠菜菜 100g+ 蘑菇 35g+ 鸡腿肉 75g+ 香油 5g);蒸红薯 250g;豆浆 (黄豆 50g)
        Day17香蕉燕麦蛋糕 (香蕉 80g+ 燕麦片 50g+ 鸡蛋 + 牛奶 240g)粉蒸土豆鸡肉 (土豆 200g+ 鸡腿肉 50g+ 蒸肉米粉 5g+ 烤花生碎 3g);双色菜花 (西兰花 50g+ 菜花 80g+ 油醋汁 3g);酱牛肉 150g;猕猴桃 35g麦胚红枣豆浆 (烤黄豆 30g+ 烤黑芝麻 16g+ 大枣肉 20g+ 熟小麦胚芽 20g);火腿木耳煮油菜 (油菜 100g+ 木耳 4g+ 方火腿 75g+ 香油 4g)
        Day18鸡蛋生菜三明治 (生菜 150g+ 鸡蛋 + 全麦吐司 88g+ 香油 3g);奶香黄豆浆 (黄豆 13g+ 黑芝麻 3g+ 全脂奶粉 20g)杂粮糊 (烤红豆粉 13g+ 燕麦粉 13g+ 小米粉 13g+ 脱脂奶粉 2g);油煮木耳小白菜鸡 (小白菜 150g+ 卤水豆腐 40g+ 鸡心 75g+ 木耳 4g+ 香油 5g);苹果 150g蒸食物套餐 (铁棍山药 60g+ 糯玉米带轴 200g+ 胡萝卜 100g);鸡腿炖四宝 (鸡腿肉 50g+ 鲜蘑 17g+ 黄花菜 2g+ 甜豌豆 4g+ 黄豆芽 10g);生菜沙拉 (生菜 50g+ 千岛酱 4g);无糖酸奶 130g
        Day19苹果全麦煎饼 (苹果肉 60g+ 全麦粉 50g+ 葡萄干 3g+ 全脂奶粉 20g+ 油 5g);牛奶 240g土豆鸡蛋豌豆沙拉 (土豆 300g+ 甜豌豆 32g+ 白芝麻 2g+ 鸡蛋 + 千岛酱 4g);茄汁虾仁 (虾仁 80g+ 番茄酱 2g+ 油 10g)燕麦小米浓粥 (燕麦片 13g+ 小米 38g+ 小麦胚芽 13g);火腿木耳煮油菜 (油菜 100g+ 木耳 4g+ 方火腿 75g);无糖酸奶 130g
        Day20蒸食物套餐 (铁棍山药 60g+ 糯玉米带轴 200g+ 胡萝卜 100g);紫菜蛋花汤 (海苔 2g+ 鸡蛋*1);果仁菠菜 (菠菜 100g+ 花生仁 3g+ 香油 3g)炖素三鲜 (冬笋 40g+ 香菇 17g+ 黄豆芽 20g+ 香油 3g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 10g+ 魔芋粉丝 20g);燕麦米饭 (燕麦粒 25g+ 大米 50g);烤鸡腿肉 50g什锦饭 (大米 38g+ 小米 25g+ 甜豌豆 8g+ 松子仁 3g+ 酱牛肉碎 70g+ 胡萝卜丁 20g);银耳西兰花 (西兰花 25g+ 银耳 4g+ 香油 2g)
        Day21谷物牛奶 (燕麦片 50g+ 全脂奶粉 30g+ 黑咖啡 2g);鸡蛋;桂圆 120g油煮鸡肉蘑菇菠菜 (菠菜菜 100g+ 蘑菇 70g+ 鸡腿肉 50g+ 香油 5g);烤红薯 200g;猕猴桃 150g;无糖酸奶 130g粉蒸土豆鸡肉 (土豆 100g+ 鸡腿肉 50g+ 蒸肉米粉 5g+ 烤花生碎 2g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 油 1g);二米饭 (小米 25g+ 糙米 13g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 75g+ 核桃仁 5g+ 香油 2g)

        以上食谱整理自范志红老师的《吃出好身材-21 天营养食谱》,侵权删。

        食谱注意:

        • 晚餐时补充复合 B 族维生素药片,乳糖敏感者可以将纯牛奶换成低乳糖奶。
        • 蒸蛋羹可以用水煮蛋替代;鸡心、鸭肝、方火腿可以用鸡腿肉、酱牛肉替换;什锦饭中的酱牛肉碎换成炒鸡丁;松子仁可以换成熟芝麻或开心果碎;小叶橘可以替换成等量其他甜度低的新鲜水果,如草莓或半个苹果等;桂圆可以换成其他自己爱吃、吃了之后胃肠舒服的应季水果,比如橘子、橙子、猕猴桃等。水果可以午饭前一小时食用。
        • 小米、燕麦提前浸泡半小时到一小时再和大米一起煮口感较好。如果没有杂粮粉,可以直接用这些杂粮煮成饭,每次煮多一点,分成几份冷冻起来,每次蒸热吃一份。
        • 食谱部分可进行微调,如果不会做,可直接按原料食用。

        ',13),x={class:"footnotes"},w={class:"footnotes-list"},L={id:"footnote1",class:"footnote-item"},B={href:"https://www.guokr.com/article/461818/",target:"_blank",rel:"noopener noreferrer"},E=g("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function v(N,T){const d=a("ExternalLinkIcon");return i(),o("div",null,[s,g("p",null,[t("现磨咖啡味道不错,每天用量需控制在 2 杯黑咖啡或 4 杯奶咖,相关数据参考"),g("a",h,[t("适量喝咖啡对身体有哪些好处?"),e(d)]),t("。有时喝的频繁就比较折腾,考虑入手白咖啡,不过据传白咖啡糖分高,而且含反式脂肪酸。")]),c,g("p",null,[g("a",u,[t("程序员延寿指南"),e(d)]),t(":")]),g("ul",null,[g("li",null,[t("输入 "),g("ul",null,[g("li",null,[t("固体:"),g("a",_,[t("吃白肉"),e(d)]),t("(-11%~-3% ACM)、蔬果为主(-26%~-17% ACM),多吃辣(-23% ACM),多吃坚果(-27%~-4% ACM),少吃蛋黄(否则 +7% ACM/0.5 颗/天),中量碳水、多吃植物蛋白(-10% ACM),少吃超加工食物(-62%~-18%)")]),f,p,g("li",null,[t("光照:"),g("a",b,[t("晒太阳"),e(d)]),t("(-~40% ACM)")]),D])]),y,A]),m,g("p",null,[t("在发表在《细胞》杂志的"),g("a",C,[t("综述文章"),e(d)]),t("中描述了"),g("a",M,[t("长寿饮食"),e(d)]),t(",这是一种基于从食物成分和卡路里摄入等饮食各个方面研究的多支柱方法。研究人员报告说,理想情况下,一天的饭菜都在 11—12 小时的窗口内进行,允许每天禁食,每 3—4 个月进行为期 5 天的禁食也可能有助于降低胰岛素抵抗、血压和其他疾病风险因素。朗格描述了长寿饮食在现实生活中的样子:大量的豆类、全谷物和蔬菜;一些鱼;没有红肉或加工肉和极少量的白肉;低糖和精制谷物;一定量的坚果和橄榄油;一些黑巧克力。")]),k,g("section",x,[g("ol",w,[g("li",L,[g("p",null,[g("a",B,[t("冷泡茶和热茶放凉,好喝级别能一样吗?"),e(d)]),t(),E])])])])])}const H=r(n,[["render",v],["__file","Diet.html.vue"]]);export{H as default}; diff --git a/assets/Docker.html-f4975bcc.js b/assets/Docker.html-9c97c65b.js similarity index 99% rename from assets/Docker.html-f4975bcc.js rename to assets/Docker.html-9c97c65b.js index 55aa429a..4239f026 100644 --- a/assets/Docker.html-f4975bcc.js +++ b/assets/Docker.html-9c97c65b.js @@ -1,4 +1,4 @@ -import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as c,c as i,a as n,b as e,d as a,w as d,e as o}from"./app-98132e77.js";const p={},u=n("p",null,"Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。",-1),k=n("h2",{id:"docker-命令",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#docker-命令","aria-hidden":"true"},"#"),e(" Docker 命令")],-1),h={href:"https://yeasy.gitbook.io/docker_practice/introduction/what",target:"_blank",rel:"noopener noreferrer"},m=o('
        • 列出所有容器:sudo docker ps -a
        • 停止容器运行:sudo docker stop <CONTAINER ID/NAME>。部分容器名有可能无法识别,最好在容器名称中添加数字。
        • 删除指定容器:sudo docker rm <CONTAINER ID/NAME>,删除前需先停止容器。
        • 清理容器(慎重):sudo docker system prune -a,用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及无 tag 和没使用的镜像。
        • 清理数据卷(慎重):sudo docker volume prune,关闭的容器数据卷会被删除,有可能破坏有用数据,需极度谨慎。
        • 导出容器中的 mysql 数据库 sudo docker exec <container_id> mysqldump -u root -p<your_mysql_root_password> your_database_name > <output_file>。将 <container_id> 替换为实际的容器 ID,将 <output_file> 替换为你想要保存导出文件的路径和文件名。请将 <your_mysql_root_password> 替换为你的 MySQL root 用户密码。完成后,你将得到一个 MySQL 数据库备份文件。比如导出 Huginn 数据库,sudo docker exec 3de3058e4468 mysqldump -u root -p<your_mysql_root_password> huginn_production > /volume1/docker/huginn/backup.sql

        定制 Docker 镜像

        ',2),b={href:"https://blog.csdn.net/a772304419/article/details/123199579",target:"_blank",rel:"noopener noreferrer"},_=o(`

        例如:

        sudo docker commit \\
        +import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as c,c as i,a as n,b as e,d as a,w as d,e as o}from"./app-91ee3df5.js";const p={},u=n("p",null,"Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。",-1),k=n("h2",{id:"docker-命令",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#docker-命令","aria-hidden":"true"},"#"),e(" Docker 命令")],-1),h={href:"https://yeasy.gitbook.io/docker_practice/introduction/what",target:"_blank",rel:"noopener noreferrer"},m=o('
        • 列出所有容器:sudo docker ps -a
        • 停止容器运行:sudo docker stop <CONTAINER ID/NAME>。部分容器名有可能无法识别,最好在容器名称中添加数字。
        • 删除指定容器:sudo docker rm <CONTAINER ID/NAME>,删除前需先停止容器。
        • 清理容器(慎重):sudo docker system prune -a,用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及无 tag 和没使用的镜像。
        • 清理数据卷(慎重):sudo docker volume prune,关闭的容器数据卷会被删除,有可能破坏有用数据,需极度谨慎。
        • 导出容器中的 mysql 数据库 sudo docker exec <container_id> mysqldump -u root -p<your_mysql_root_password> your_database_name > <output_file>。将 <container_id> 替换为实际的容器 ID,将 <output_file> 替换为你想要保存导出文件的路径和文件名。请将 <your_mysql_root_password> 替换为你的 MySQL root 用户密码。完成后,你将得到一个 MySQL 数据库备份文件。比如导出 Huginn 数据库,sudo docker exec 3de3058e4468 mysqldump -u root -p<your_mysql_root_password> huginn_production > /volume1/docker/huginn/backup.sql

        定制 Docker 镜像

        ',2),b={href:"https://blog.csdn.net/a772304419/article/details/123199579",target:"_blank",rel:"noopener noreferrer"},_=o(`

        例如:

        sudo docker commit \\
             --message "基于 Ubuntu 18.04 构建的 Huginn" \\
             ubuntu \\
             huginnxubuntu:1.0
        diff --git a/assets/Electron.html-037d4c16.js b/assets/Electron.html-9b2e40a7.js
        similarity index 99%
        rename from assets/Electron.html-037d4c16.js
        rename to assets/Electron.html-9b2e40a7.js
        index 1f875785..3240dc0c 100644
        --- a/assets/Electron.html-037d4c16.js
        +++ b/assets/Electron.html-9b2e40a7.js
        @@ -1,4 +1,4 @@
        -import{_ as p}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as c,c as i,a as n,b as s,d as a,w as r,e as o}from"./app-98132e77.js";const u={},d={href:"https://www.electronjs.org/",target:"_blank",rel:"noopener noreferrer"},m=o(`
        # 部署 electron,electron-builder
        +import{_ as p}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as c,c as i,a as n,b as s,d as a,w as r,e as o}from"./app-91ee3df5.js";const u={},d={href:"https://www.electronjs.org/",target:"_blank",rel:"noopener noreferrer"},m=o(`
        # 部署 electron,electron-builder
         npm i -d electron@latest #更新最新版 Electron,不能全局安装,否则 electron-builder 找不到
         yarn add electron-builder --dev #部署 electron-builder
         
        diff --git a/assets/Fitness.html-513327f1.js b/assets/Fitness.html-57eb298a.js
        similarity index 99%
        rename from assets/Fitness.html-513327f1.js
        rename to assets/Fitness.html-57eb298a.js
        index 7bc92e63..8a369b29 100644
        --- a/assets/Fitness.html-513327f1.js
        +++ b/assets/Fitness.html-57eb298a.js
        @@ -1 +1 @@
        -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o,c as l,a as e,b as i,d as n,e as t}from"./app-98132e77.js";const p={},d=e("p",null,"早餐必吃,午餐吃饱,晚餐少吃且不吃主食。",-1),h=e("p",null,[i("消除饥饿感:"),e("strong",null,"10 秒内原地高抬腿快跑 20 次"),i("!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。")],-1),c={href:"https://www.solidot.org/story?sid=71166",target:"_blank",rel:"noopener noreferrer"},g=e("h2",{id:"k-歌减肥",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#k-歌减肥","aria-hidden":"true"},"#"),i(" K 歌减肥")],-1),m={href:"https://mp.weixin.qq.com/s/QKJ9PnmGTK7XY0yUWxsMRw",target:"_blank",rel:"noopener noreferrer"},f=t('
        • 每天唱三首歌,选择 key 比较高、换气多的歌效果会更好。比如三天三夜、死了都要爱......这些听起来就感觉会唱断气的歌。非母语的美声唱法所消耗的热量最大。唱歌的时候要一边按住 E 点,一边用力发声唱歌

          E 点
          E 点位置
        • 喊叫减肥:臀桥的同时,将眼睛、鼻孔和嘴巴都用尽全力张到最大,然后气沉丹田,用力地怒吼出声:啊——啊——啊!啊!啊!喊的时候一定要用全力,一直叫,叫足 3 分钟。如果声音过大,可以咬毛巾,降低音量。

          喊叫减肥动图
          喊叫减肥动图

        该方法类似于上面的《卡拉 OK 健康法》,里面提到唱 K 不仅可以增加肺活量,还有瘦身作用。这原理就和瑜伽中常用的腹式呼吸法差不多,利用腹部肌肉收缩,促进新陈代谢,吸收脂肪分解时所需的氧气,从而达到减肥效果。

        坐立减肥

        ',3),u={href:"https://mp.weixin.qq.com/s/LN0xu-FZaHP1oFvSwilGrA",target:"_blank",rel:"noopener noreferrer"},_=t('
        比目鱼俯卧撑演示图
        比目鱼俯卧撑演示图

        当你的后脚跟提到极限的时候,小腿的肌肉会产生紧张拉伸的感觉,然后你会自主地放松,将脚后跟放回地面。这样就完成了一次 SPU。

        健身理论

        • 早餐一定要吃!吃早餐的人比不吃早餐的人更容易减少体重。因为在睡觉的时候,身体的新陈代谢会减慢,而只有在你再次进食的时候,它才会回升。所以,如果你跳过早餐不吃,身体消耗卡路里的能力在午餐前都无法达到正常水平。这也就是为什么新的一天最好从一顿拥有 300 ~ 400 卡路里的早餐开始,它能立刻把你的新陈代谢带入「工作状态」。另外,早餐应该尽量多食用些高纤维食物。习惯吃高热量早餐的人更容易很快感到饥饿;而高纤维碳水化合物的消化和吸收时间更长,不会导致身体里血糖的迅速改变,你自然也就不那么容易饿了。
        • 高于或者低于靶心率 142~154 的运动算无效运动,基本没有减脂的作用。所以说,神马仰卧起坐瘦小腹,蹬腿瘦大腿都是扯淡,那些运动都达不到有氧运动的下限,根本燃烧不了脂肪。可进行适当的拉伸运动,开始 HIIT,然后用 5 分钟整理运动结束训练,然后接着进行全面的拉伸。

        每周健身 4 小时

        早上半小时内要吃早餐,饭前 60 个深蹲或推墙俯卧撑。早餐:蛋、小扁豆、菠菜。

        • 别吃水果,水果的糖分太多,可以一天一个牛油果
        • 瓶颈期时,加大蛋白摄入,早餐吃 3 个鸡蛋
        • 晚上冰敷:冰袋放在脖子后部和上斜方肌附近,保持 20 ~ 30 分钟。

        早饭前、睡前:各 5 ~ 10 分钟的冷水澡。先用热水把整个身体淋湿,大概用时 1~2 分钟。然后,用洗发水洗头、用洗面奶洗脸,把淋浴调成完全的冷水清洗头发和脸部,身体别的部分先别碰冷水。洗干净后,转身,背对淋浴喷头,让水浇在你的后脖颈下方和背部上方的区域,保持这个姿势 1 ~ 3 分钟不动。然后,转过身,正常清洗身体就可以了。

        室内健身

        注意

        本部分的内容,我不确定其来源,也未加以理解和消化,仅将其作为参考资料。

        如果你只是想降低体重,提高身体素质,那么 Slim in 6 和 P90 已经够了,可以来回多刷几周目,如果你还想对自己进行更深入的训练,那么就可以试试 Les Mills BodyCombat 和 T25,如果需要挑战自己,P90X 和 insanity 在等着你。

        在锻炼过程中,先把动作做标准,而不是勉强去跟上视频的动作数量,当你觉得自己需要休息,就停一下,不要 over do it,做好热身和关节保护,锻炼期间吃好睡好。

        Slim in 6

        这是一套专门针对无运动基础、体重基数大、身体状态较差的人的健身操,没有太剧烈的动作,基本没有跳跃动作,非常注意对膝盖等关节的保护,各种动作里糅合了大量拉伸,教练非常 nice。课程不复杂,只有三套主题操和一个核心肌肉附加训练和一个拉伸附件训练,每一套主题操反复做两周然后进入下一套,附加训练视自己的情况逐渐加入主题操之后。这套操好评如潮,无数购买者在官网留下评论表示坚持这套操给自己的身体带来了显著的良性变化,体重明显降低、线条更优美、体态更匀称等等......

        我上手便是做这套,但是虽然看的时候觉得也还挺容易的,真正做起来也并不是那么轻松,但是难度真的控制得很好,很多动作的难度和频率都刚好在让你觉得“吃力但是咬一咬牙就坚持下来并且很有成就感”的程度,这套操所需的东西仅仅是一张大一点的瑜伽垫,几条拉力绳,几个平方的空地,在哪都能做,我就是在办公室利用中午时间做的。

        当然这套操也有缺点,一个是从第二套主题操开始时间变得很长,如果做完附件训练,需要大概 1 个多小时,第三套更长一些。一个是相对比较枯燥,每天重复同样的动作,容易厌烦,这也是为什么我只做到第四周的一般就放弃的原因之一,另一个原因是我肩膀比较弱,这个操又有大量的保持手臂平举的动作......

        但是这三周多的效果是很明显的,我的体重有接近 5 公斤的下降幅度,最重要的是肺活量和肌肉力量有了很明显的提高,为进入下一步打好了基础。我推荐所有从零开始或者长期不运动的同学从这套操开始恢复,我相信如果能坚持做完六周,你们会感谢我的推荐的。

        哦,对了,这套操有很多深蹲动作,大家做的时候一定要注意正确的姿势,保护好膝盖。

        P90

        注意,这个是 P90 而不是 P90X,虽然只差一个字,但是难度有天壤之别,都是金牌教练豪顿的作品,P90 是他整个健身操系列的基石,也是面对缺乏运动基础的人来设计的,同样有很好的评价,这套训练是一天有氧一天肌肉抗阻训练的模式,但是强度都比较低,肌肉抗阻训练比起健身房差很远,但是对刚起步的人来说很合适。这套训练我没有系统性地做过,在放弃 Slim in 6 之后短暂地做过几天,因为跳的动作比较多,而且我不是很喜欢豪顿那样的块状肌肉,也没有打算进军 P90X,而且当时我的身体状态做 P90 已经感觉不到太大的效果了。

        P90 和 Slim in 6 一样,只需要一块垫子,哑铃或者拉力绳就可以做,推荐想进入 P90X 的同学从这个开始,这套操的难度和强度与 Slim in 6 是很接近的。

        Les Mills BodyCombat

        到我最喜欢的部分了,这是莱美健身房推出的一套搏击操,这套操总体上强度高于上面两个,这套操一共有十三个视频,分别是有氧搏击系列,HITT 系列和核心肌肉训练系列,然后根据每天做的视频不同,编排了三个 60 天的课程表,难度一个大于一个,我只做完了第一个。我之所以喜欢这套操的原因如下:跳跃动作不多、非常好玩、教练帅气逼人。

        这套操比起前面两个需要的空间略大,因为有一些滑步动作和一些各个方向的踢腿动作,但是也只是略大,器械也就是部分课程需要两只哑铃而已。这套操的有氧搏击部分我个人认为是最精华所在,它将拳击、跆拳道、泰拳等格斗技术的一些基础动作编排在一起,通过各种出拳、踢腿、顶膝等动作大量消耗热量,而且非常好玩,脑补能力稍微强一点的,提高一点中二值,一节课很容易就过去了。

        这套操的难度体现在 HITT 和核心肌肉训练部分,开始出现急速提高心率的剧烈动作和组合型动作,比如俯卧撑跳跃深蹲再跳趴俯卧撑,这部分需要锻炼者有不错的肺活量和肌肉力量基础,不然会承担比较高的运动受伤风险。

        推荐有了基础的大家来做这一套,我每天在办公室做完真的是全身湿透,桌子地板都要擦一遍,哪哪都是汗水,非常爽。

        T25

        这个的难度与 Les Mills BodyCombat 相仿,是大名鼎鼎的熊 T,也就是可怕的 insanity 健身操的教练推出的一套难度低于 insanity 的训练计划,你可以把他看做简化版的 insanity,里面的很多动作都会在 insanity 里面出现,只是频率和强度没那么大。

        这套在我刷完 Les Mills BodyCombat,进军 insanity 之前做过,真的很累,因为这套计划有很多都是 HIIT,短时间高强度的重复动作,比如 30 秒急速高抬腿马上接 30 秒虎跳之类的,但是 HIIT 的效果是非常明显的,坚持一段时间可以让你的身体素质在原有基础上进入一个新的阶段。

        对于所有想进军 insanity 的朋友,真诚推荐这一套作为预热,如果能很好地掌控这套,那么在 insanity 里你肯定能坚持下去。

        P90X 和 insanity

        把这两个放在一起,是因为它们在家庭训练计划界的地位实在是难分伯仲,大名鼎鼎的腹肌撕裂者就出自 P90X 的项目,而 insanity 更是让无数家庭健身者得到了梦寐以求的良好身体素质和美妙的身体线条。首先 P90X 我没有做过,原因和我不喜欢 P90 是一样的,我不喜欢豪顿那样的块状肌肉,所以对 P90X 里面大量的独立肌群抗阻训练无感,而 insanity 的熊 T 很少设计单一肌肉的训练动作,都是大量的 HIIT 和核心肌肉训练,更注重整体的塑造。

        ',32);function b(x,y){const a=s("ExternalLinkIcon");return o(),l("div",null,[d,h,e("p",null,[i("晨间锻炼使用八段锦(12mins)热身。每天保持 "),e("a",c,[i("9000 步"),n(a)]),i(",日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。")]),g,e("p",null,[e("a",m,[i("K 歌减肥"),n(a)]),i("容易吵到邻居,没找到隔音口罩,用发泄壶代替。")]),f,e("p",null,[i("研究者开创了一种名叫"),e("a",u,[i("比目鱼俯卧撑(SPU)"),n(a)]),i("的方式,可以在数个小时内将局部的氧化代谢提升到很高的水平。我们平时在站立和步行时都会用到比目鱼肌,而所谓的比目鱼肌俯卧撑就是尽最大可能使用这块肌肉。方法也很简单,如下方动图所示,你坐着的时候双脚处于放松状态,然后提起后脚跟,脚趾仍然需要紧贴地面不动。")]),_])}const I=r(p,[["render",b],["__file","Fitness.html.vue"]]);export{I as default}; +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o,c as l,a as e,b as i,d as n,e as t}from"./app-91ee3df5.js";const p={},d=e("p",null,"早餐必吃,午餐吃饱,晚餐少吃且不吃主食。",-1),h=e("p",null,[i("消除饥饿感:"),e("strong",null,"10 秒内原地高抬腿快跑 20 次"),i("!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。")],-1),c={href:"https://www.solidot.org/story?sid=71166",target:"_blank",rel:"noopener noreferrer"},g=e("h2",{id:"k-歌减肥",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#k-歌减肥","aria-hidden":"true"},"#"),i(" K 歌减肥")],-1),m={href:"https://mp.weixin.qq.com/s/QKJ9PnmGTK7XY0yUWxsMRw",target:"_blank",rel:"noopener noreferrer"},f=t('
        • 每天唱三首歌,选择 key 比较高、换气多的歌效果会更好。比如三天三夜、死了都要爱......这些听起来就感觉会唱断气的歌。非母语的美声唱法所消耗的热量最大。唱歌的时候要一边按住 E 点,一边用力发声唱歌

          E 点
          E 点位置
        • 喊叫减肥:臀桥的同时,将眼睛、鼻孔和嘴巴都用尽全力张到最大,然后气沉丹田,用力地怒吼出声:啊——啊——啊!啊!啊!喊的时候一定要用全力,一直叫,叫足 3 分钟。如果声音过大,可以咬毛巾,降低音量。

          喊叫减肥动图
          喊叫减肥动图

        该方法类似于上面的《卡拉 OK 健康法》,里面提到唱 K 不仅可以增加肺活量,还有瘦身作用。这原理就和瑜伽中常用的腹式呼吸法差不多,利用腹部肌肉收缩,促进新陈代谢,吸收脂肪分解时所需的氧气,从而达到减肥效果。

        坐立减肥

        ',3),u={href:"https://mp.weixin.qq.com/s/LN0xu-FZaHP1oFvSwilGrA",target:"_blank",rel:"noopener noreferrer"},_=t('
        比目鱼俯卧撑演示图
        比目鱼俯卧撑演示图

        当你的后脚跟提到极限的时候,小腿的肌肉会产生紧张拉伸的感觉,然后你会自主地放松,将脚后跟放回地面。这样就完成了一次 SPU。

        健身理论

        • 早餐一定要吃!吃早餐的人比不吃早餐的人更容易减少体重。因为在睡觉的时候,身体的新陈代谢会减慢,而只有在你再次进食的时候,它才会回升。所以,如果你跳过早餐不吃,身体消耗卡路里的能力在午餐前都无法达到正常水平。这也就是为什么新的一天最好从一顿拥有 300 ~ 400 卡路里的早餐开始,它能立刻把你的新陈代谢带入「工作状态」。另外,早餐应该尽量多食用些高纤维食物。习惯吃高热量早餐的人更容易很快感到饥饿;而高纤维碳水化合物的消化和吸收时间更长,不会导致身体里血糖的迅速改变,你自然也就不那么容易饿了。
        • 高于或者低于靶心率 142~154 的运动算无效运动,基本没有减脂的作用。所以说,神马仰卧起坐瘦小腹,蹬腿瘦大腿都是扯淡,那些运动都达不到有氧运动的下限,根本燃烧不了脂肪。可进行适当的拉伸运动,开始 HIIT,然后用 5 分钟整理运动结束训练,然后接着进行全面的拉伸。

        每周健身 4 小时

        早上半小时内要吃早餐,饭前 60 个深蹲或推墙俯卧撑。早餐:蛋、小扁豆、菠菜。

        • 别吃水果,水果的糖分太多,可以一天一个牛油果
        • 瓶颈期时,加大蛋白摄入,早餐吃 3 个鸡蛋
        • 晚上冰敷:冰袋放在脖子后部和上斜方肌附近,保持 20 ~ 30 分钟。

        早饭前、睡前:各 5 ~ 10 分钟的冷水澡。先用热水把整个身体淋湿,大概用时 1~2 分钟。然后,用洗发水洗头、用洗面奶洗脸,把淋浴调成完全的冷水清洗头发和脸部,身体别的部分先别碰冷水。洗干净后,转身,背对淋浴喷头,让水浇在你的后脖颈下方和背部上方的区域,保持这个姿势 1 ~ 3 分钟不动。然后,转过身,正常清洗身体就可以了。

        室内健身

        注意

        本部分的内容,我不确定其来源,也未加以理解和消化,仅将其作为参考资料。

        如果你只是想降低体重,提高身体素质,那么 Slim in 6 和 P90 已经够了,可以来回多刷几周目,如果你还想对自己进行更深入的训练,那么就可以试试 Les Mills BodyCombat 和 T25,如果需要挑战自己,P90X 和 insanity 在等着你。

        在锻炼过程中,先把动作做标准,而不是勉强去跟上视频的动作数量,当你觉得自己需要休息,就停一下,不要 over do it,做好热身和关节保护,锻炼期间吃好睡好。

        Slim in 6

        这是一套专门针对无运动基础、体重基数大、身体状态较差的人的健身操,没有太剧烈的动作,基本没有跳跃动作,非常注意对膝盖等关节的保护,各种动作里糅合了大量拉伸,教练非常 nice。课程不复杂,只有三套主题操和一个核心肌肉附加训练和一个拉伸附件训练,每一套主题操反复做两周然后进入下一套,附加训练视自己的情况逐渐加入主题操之后。这套操好评如潮,无数购买者在官网留下评论表示坚持这套操给自己的身体带来了显著的良性变化,体重明显降低、线条更优美、体态更匀称等等......

        我上手便是做这套,但是虽然看的时候觉得也还挺容易的,真正做起来也并不是那么轻松,但是难度真的控制得很好,很多动作的难度和频率都刚好在让你觉得“吃力但是咬一咬牙就坚持下来并且很有成就感”的程度,这套操所需的东西仅仅是一张大一点的瑜伽垫,几条拉力绳,几个平方的空地,在哪都能做,我就是在办公室利用中午时间做的。

        当然这套操也有缺点,一个是从第二套主题操开始时间变得很长,如果做完附件训练,需要大概 1 个多小时,第三套更长一些。一个是相对比较枯燥,每天重复同样的动作,容易厌烦,这也是为什么我只做到第四周的一般就放弃的原因之一,另一个原因是我肩膀比较弱,这个操又有大量的保持手臂平举的动作......

        但是这三周多的效果是很明显的,我的体重有接近 5 公斤的下降幅度,最重要的是肺活量和肌肉力量有了很明显的提高,为进入下一步打好了基础。我推荐所有从零开始或者长期不运动的同学从这套操开始恢复,我相信如果能坚持做完六周,你们会感谢我的推荐的。

        哦,对了,这套操有很多深蹲动作,大家做的时候一定要注意正确的姿势,保护好膝盖。

        P90

        注意,这个是 P90 而不是 P90X,虽然只差一个字,但是难度有天壤之别,都是金牌教练豪顿的作品,P90 是他整个健身操系列的基石,也是面对缺乏运动基础的人来设计的,同样有很好的评价,这套训练是一天有氧一天肌肉抗阻训练的模式,但是强度都比较低,肌肉抗阻训练比起健身房差很远,但是对刚起步的人来说很合适。这套训练我没有系统性地做过,在放弃 Slim in 6 之后短暂地做过几天,因为跳的动作比较多,而且我不是很喜欢豪顿那样的块状肌肉,也没有打算进军 P90X,而且当时我的身体状态做 P90 已经感觉不到太大的效果了。

        P90 和 Slim in 6 一样,只需要一块垫子,哑铃或者拉力绳就可以做,推荐想进入 P90X 的同学从这个开始,这套操的难度和强度与 Slim in 6 是很接近的。

        Les Mills BodyCombat

        到我最喜欢的部分了,这是莱美健身房推出的一套搏击操,这套操总体上强度高于上面两个,这套操一共有十三个视频,分别是有氧搏击系列,HITT 系列和核心肌肉训练系列,然后根据每天做的视频不同,编排了三个 60 天的课程表,难度一个大于一个,我只做完了第一个。我之所以喜欢这套操的原因如下:跳跃动作不多、非常好玩、教练帅气逼人。

        这套操比起前面两个需要的空间略大,因为有一些滑步动作和一些各个方向的踢腿动作,但是也只是略大,器械也就是部分课程需要两只哑铃而已。这套操的有氧搏击部分我个人认为是最精华所在,它将拳击、跆拳道、泰拳等格斗技术的一些基础动作编排在一起,通过各种出拳、踢腿、顶膝等动作大量消耗热量,而且非常好玩,脑补能力稍微强一点的,提高一点中二值,一节课很容易就过去了。

        这套操的难度体现在 HITT 和核心肌肉训练部分,开始出现急速提高心率的剧烈动作和组合型动作,比如俯卧撑跳跃深蹲再跳趴俯卧撑,这部分需要锻炼者有不错的肺活量和肌肉力量基础,不然会承担比较高的运动受伤风险。

        推荐有了基础的大家来做这一套,我每天在办公室做完真的是全身湿透,桌子地板都要擦一遍,哪哪都是汗水,非常爽。

        T25

        这个的难度与 Les Mills BodyCombat 相仿,是大名鼎鼎的熊 T,也就是可怕的 insanity 健身操的教练推出的一套难度低于 insanity 的训练计划,你可以把他看做简化版的 insanity,里面的很多动作都会在 insanity 里面出现,只是频率和强度没那么大。

        这套在我刷完 Les Mills BodyCombat,进军 insanity 之前做过,真的很累,因为这套计划有很多都是 HIIT,短时间高强度的重复动作,比如 30 秒急速高抬腿马上接 30 秒虎跳之类的,但是 HIIT 的效果是非常明显的,坚持一段时间可以让你的身体素质在原有基础上进入一个新的阶段。

        对于所有想进军 insanity 的朋友,真诚推荐这一套作为预热,如果能很好地掌控这套,那么在 insanity 里你肯定能坚持下去。

        P90X 和 insanity

        把这两个放在一起,是因为它们在家庭训练计划界的地位实在是难分伯仲,大名鼎鼎的腹肌撕裂者就出自 P90X 的项目,而 insanity 更是让无数家庭健身者得到了梦寐以求的良好身体素质和美妙的身体线条。首先 P90X 我没有做过,原因和我不喜欢 P90 是一样的,我不喜欢豪顿那样的块状肌肉,所以对 P90X 里面大量的独立肌群抗阻训练无感,而 insanity 的熊 T 很少设计单一肌肉的训练动作,都是大量的 HIIT 和核心肌肉训练,更注重整体的塑造。

        ',32);function b(x,y){const a=s("ExternalLinkIcon");return o(),l("div",null,[d,h,e("p",null,[i("晨间锻炼使用八段锦(12mins)热身。每天保持 "),e("a",c,[i("9000 步"),n(a)]),i(",日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。")]),g,e("p",null,[e("a",m,[i("K 歌减肥"),n(a)]),i("容易吵到邻居,没找到隔音口罩,用发泄壶代替。")]),f,e("p",null,[i("研究者开创了一种名叫"),e("a",u,[i("比目鱼俯卧撑(SPU)"),n(a)]),i("的方式,可以在数个小时内将局部的氧化代谢提升到很高的水平。我们平时在站立和步行时都会用到比目鱼肌,而所谓的比目鱼肌俯卧撑就是尽最大可能使用这块肌肉。方法也很简单,如下方动图所示,你坐着的时候双脚处于放松状态,然后提起后脚跟,脚趾仍然需要紧贴地面不动。")]),_])}const I=r(p,[["render",b],["__file","Fitness.html.vue"]]);export{I as default}; diff --git a/assets/GitHub.html-60fd85cc.js b/assets/GitHub.html-7c7fde68.js similarity index 99% rename from assets/GitHub.html-60fd85cc.js rename to assets/GitHub.html-7c7fde68.js index 7f03918b..838e506d 100644 --- a/assets/GitHub.html-60fd85cc.js +++ b/assets/GitHub.html-7c7fde68.js @@ -1,4 +1,4 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as c,c as l,a as n,b as e,d as a,e as t}from"./app-98132e77.js";const r={},p=t('

        GitHub Actions

        GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\workflows 目录下,repo 发生指定调节的改变时,Actions 会自动运行。[1]

        ',2),u={href:"https://github.com/marketplace?type=actions",target:"_blank",rel:"noopener noreferrer"},d={href:"https://github.com/sdras/awesome-actions",target:"_blank",rel:"noopener noreferrer"},h=n("p",null,[e("如果 GitHub Actions 命令中有涉及密码等私密信息,则进入项目仓库的「Settings」>「Secrets and variables」>「Actions」,添加密钥进行加密处理。比如新建密钥 PERSONAL_TOKEN,Actions 命令中使用 "),n("code",null,"${{ secrets.PERSONAL_TOKEN }}"),e(" 来指代该密钥。")],-1),m=n("h3",{id:"不同仓库间复制",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#不同仓库间复制","aria-hidden":"true"},"#"),e(" 不同仓库间复制")],-1),k={href:"http://README.md",target:"_blank",rel:"noopener noreferrer"},f=n("code",null,"clean: true",-1),b={href:"https://docs.github.com/cn/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-token",target:"_blank",rel:"noopener noreferrer"},_={href:"https://github.com/settings/tokens",target:"_blank",rel:"noopener noreferrer"},v=t(`
        - name: Copy file
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as c,c as l,a as n,b as e,d as a,e as t}from"./app-91ee3df5.js";const r={},p=t('

        GitHub Actions

        GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\workflows 目录下,repo 发生指定调节的改变时,Actions 会自动运行。[1]

        ',2),u={href:"https://github.com/marketplace?type=actions",target:"_blank",rel:"noopener noreferrer"},d={href:"https://github.com/sdras/awesome-actions",target:"_blank",rel:"noopener noreferrer"},h=n("p",null,[e("如果 GitHub Actions 命令中有涉及密码等私密信息,则进入项目仓库的「Settings」>「Secrets and variables」>「Actions」,添加密钥进行加密处理。比如新建密钥 PERSONAL_TOKEN,Actions 命令中使用 "),n("code",null,"${{ secrets.PERSONAL_TOKEN }}"),e(" 来指代该密钥。")],-1),m=n("h3",{id:"不同仓库间复制",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#不同仓库间复制","aria-hidden":"true"},"#"),e(" 不同仓库间复制")],-1),k={href:"http://README.md",target:"_blank",rel:"noopener noreferrer"},f=n("code",null,"clean: true",-1),b={href:"https://docs.github.com/cn/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token#creating-a-token",target:"_blank",rel:"noopener noreferrer"},_={href:"https://github.com/settings/tokens",target:"_blank",rel:"noopener noreferrer"},v=t(`
        - name: Copy file
           uses: andstor/copycat-action@v3
           with:
             personal_token: ${{ secrets.PERSONAL_TOKEN }}
        diff --git a/assets/HTML.html-f965ae26.js b/assets/HTML.html-6f6ca2c3.js
        similarity index 99%
        rename from assets/HTML.html-f965ae26.js
        rename to assets/HTML.html-6f6ca2c3.js
        index e827075f..2893de25 100644
        --- a/assets/HTML.html-f965ae26.js
        +++ b/assets/HTML.html-6f6ca2c3.js
        @@ -1,4 +1,4 @@
        -import{_ as p}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as l,c,a as n,b as s,d as t,e}from"./app-98132e77.js";const i={},r=e(`

        HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。

        基础知识

        相对路径

        / 根目录(electron 不适用)
        +import{_ as p}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as l,c,a as n,b as s,d as t,e}from"./app-91ee3df5.js";const i={},r=e(`

        HTTPS 网页中,js、css、gif 等文件都必须要使用 https,否则会加载报错,图片可以不使用 https。

        基础知识

        相对路径

        / 根目录(electron 不适用)
         ./ 当前目录(可省略不写)
         ../ 父级目录(返回到上一级目录)
         ../../ 祖父级目录(返回两级目录)
        diff --git a/assets/HomeAutomation.html-618f90f5.js b/assets/HomeAutomation.html-bc102435.js
        similarity index 98%
        rename from assets/HomeAutomation.html-618f90f5.js
        rename to assets/HomeAutomation.html-bc102435.js
        index 08561327..304d1e0d 100644
        --- a/assets/HomeAutomation.html-618f90f5.js
        +++ b/assets/HomeAutomation.html-bc102435.js
        @@ -1 +1 @@
        -import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as r,c as i,a as e,b as o,d as s,e as l}from"./app-98132e77.js";const h={},c=e("p",null,"智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。",-1),d=e("h2",{id:"home-assistant",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#home-assistant","aria-hidden":"true"},"#"),o(" Home Assistant")],-1),_=e("p",null,"Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。",-1),f=e("p",null,"Home Assistant 原生支持的米家设备较少,需要使用 hacs 下的集成 Xiaomi Miot Auto。默认 Docker 容器不带 hacs,需要手动部署。",-1),u={href:"https://github.com/hacs/integration/releases/",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,"重启 Home Assistant 容器后,在集成中搜索 hacs,安装时按要求提供 github 账户授权。",-1),p=e("li",null,[o("选择「HACS」>「集成」>「浏览并下载存储库」,下载 Xiaomi Miot Auto 并重启 Home Assistant 容器。"),e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote1"},"[1]"),e("a",{class:"footnote-anchor",id:"footnote-ref1"})])],-1),b=e("p",null,"Home Assistant 虽然一直被吹得很厉害,但即时性的传感器可能不能及时触发,使用时需要注意这点。",-1),k={href:"https://home.miot-spec.com/s/lumi.gateway.mgl03",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/AlexxIT/XiaomiGateway3",target:"_blank",rel:"noopener noreferrer"},A=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote2"},"[2]"),e("a",{class:"footnote-anchor",id:"footnote-ref2"})],-1),H=e("h2",{id:"node-red",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#node-red","aria-hidden":"true"},"#"),o(" Node-RED")],-1),x={href:"https://github.com/node-red/node-red",target:"_blank",rel:"noopener noreferrer"},D={href:"https://bbs.iobroker.cn/t/topic/1165",target:"_blank",rel:"noopener noreferrer"},N=e("li",null,[o("部署 Node-RED 时,Node-RED 对存储文件夹的读写权限要求较高,Docker 部署的话需修改 data 的文件夹权限,为避免麻烦,我给了最高权限 "),e("code",null,"chmod 777 /volume1/docker/nodered/data"),o("。")],-1),E={href:"https://zachowj.github.io/node-red-contrib-home-assistant-websocket/guide/#prerequisites",target:"_blank",rel:"noopener noreferrer"},w=e("ul",null,[e("li",null,"选择「设置」>「节点管理」>「控制板」>「安装」,点击右侧刷新按钮,加载节点目录,第一次加载要比较长时间,不用关闭网页。"),e("li",null,"搜索并安装「node-red-contrib-home-assistant-websocket」。")],-1),R=e("li",null,"选择「Home Assistant」>「HACS」>「集成」>「浏览并下载存储库」,下载 Node-RED Companion。",-1),T=e("li",null,"选择「Home Assistant」>「配置」>「设备与服务」>「集成」,添加集成 Node-RED Companion,然后重启 Home Assistant 容器。",-1),v={href:"https://zachowj.github.io/node-red-contrib-home-assistant-websocket/guide/#configuration",target:"_blank",rel:"noopener noreferrer"},z=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote3"},"[3]"),e("a",{class:"footnote-anchor",id:"footnote-ref3"})],-1),C=l('

        常用节点

        • inject: 定时启动,周期性触发执行。
        • call service:改变智能设备状态,比如开灯。
          • Domain:触发方式
          • Service:触发命令
          • Device:设备与服务
          • Entity:设备执行模块

        自动化场景

        • 记录主卧关灯时间,默认其为睡眠时间,但实际关掉是关电源,不会在智能后端记录。或者用明暗度测试记录,每天最后暗的时候,记录为睡眠时间。
        • 书房检测到没人时,对电脑发送暂停视频的快捷键。这步卡在硬件,需要有个硬件能被 Node-RED 识别并给电脑发送按键。

        智能硬件

        Zigbee2MQTT

        ',6),M={href:"https://autoaigpt.cn/watch?v=R_CikjR7tiw",target:"_blank",rel:"noopener noreferrer"},j=e("p",null,"不过,我的设备都是米家系,暂时用不到开源网关,等买了其他品牌的设备,再考虑 Zigbee2MQTT。",-1),q=e("h3",{id:"智趣盒子",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#智趣盒子","aria-hidden":"true"},"#"),o(" 智趣盒子")],-1),S={href:"https://item.taobao.com/item.htm?id=635639747170",target:"_blank",rel:"noopener noreferrer"},y=e("blockquote",null,[e("p",null,"盒子基于 arm 的 linux 的 debian 系统上运行 docker,在 docker 的基础上构建了 supervisor 版本,跟 homeassistant 开发官方的 hassos 的最大差异就是打开了 root 的权限,可以在底层进行操作。这些比较适合国内的使用环境(网络改善,装第三方工具等).")],-1),I=e("p",null,"不过与 NAS 相比,智趣这类硬件盒子同样是 Docker 容器,除了能直连网关和想象中的简便攻略,并没什么其他优势。",-1),Q=e("h3",{id:"其他硬件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#其他硬件","aria-hidden":"true"},"#"),o(" 其他硬件")],-1),V={href:"https://item.taobao.com/item.htm?id=631865647089",target:"_blank",rel:"noopener noreferrer"},X={href:"https://item.taobao.com/item.htm?id=675107124036",target:"_blank",rel:"noopener noreferrer"},B=e("hr",{class:"footnotes-sep"},null,-1),Z={class:"footnotes"},G={class:"footnotes-list"},L={id:"footnote1",class:"footnote-item"},P={href:"https://baijiahao.baidu.com/s?id=1721932088542289661",target:"_blank",rel:"noopener noreferrer"},F=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),J={id:"footnote2",class:"footnote-item"},K={href:"https://github.com/al-one/hass-xiaomi-miot/issues/100#issuecomment-909031222",target:"_blank",rel:"noopener noreferrer"},O=e("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),U={id:"footnote3",class:"footnote-item"},W={href:"https://zhuanlan.zhihu.com/p/456741817",target:"_blank",rel:"noopener noreferrer"},Y=e("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1);function $(ee,oe){const t=a("ExternalLinkIcon");return r(),i("div",null,[c,d,_,f,e("ol",null,[e("li",null,[o("下载 "),e("a",u,[o("hacs"),s(t)]),o(",将其解压到 Home Assistant 配置的 config\\custom_components\\hacs 文件夹下。")]),m,p]),b,e("blockquote",null,[e("p",null,[o("对于人体传感器、门磁、无线开关类设备,它们的状态通常为瞬时状态 (即:事件),部分型号支持获取最后一次事件触发的时间,且默认轮询时长为 15 秒,对于无法获取最后触发事件的设备,即使修改轮询时间到 1 秒,也可能无法获取正确的状态。因此此类设备通过本插件集成后不太推荐用于触发实时自动化,仅适合作为如几分钟无人移动关灯这类自动化的条件。如果需要实时更新状态,推荐使用"),e("a",k,[o("多模网关"),s(t)]),o("配合 "),e("a",g,[o("XiaomiGateway3"),s(t)]),o(" 集成。"),A])]),H,e("p",null,[e("a",x,[o("Node-RED"),s(t)]),o(" 是本地版的 IFTTT,能与 Home Assistant 打通,实现本地化的互联。新手推荐 "),e("a",D,[o("node-red 的入门教程集合"),s(t)]),o("。")]),e("ol",null,[N,e("li",null,[o("Node-RED 上安装 "),e("a",E,[o("node-red-contrib-home-assistant-websocket"),s(t)]),o("。 "),w]),R,T,e("li",null,[o("进入 nodered 页面,配置 "),e("a",v,[o("home assistant websocket"),s(t)]),o(",点击右上角的部署。"),z])]),C,e("p",null,[e("a",M,[o("Zigbee2MQTT"),s(t)]),o(" 是开源的智能网关,支持大部分的智能设备。其辐射范围更大,能同时联接 200 个设备,它的插网线版更稳定不易掉线。")]),j,q,e("p",null,[e("a",S,[o("智趣盒子"),s(t)]),o("集成了 Home Assistant 和 Node-RED 的 Docker,Home Assistant 能部署 Addons、supervisor,能直接插开源网关。")]),y,I,Q,e("ul",null,[e("li",null,[e("a",V,[o("远程键盘控制器"),s(t)]),o(":基于易微联的第三方产品,手机通过 APP 远程控制电脑按键,不过只能按一个按键或者连续 6 个的自定义键值。不确定是否支持 HA。")]),e("li",null,[e("a",X,[o("MQTT 转 usb 虚拟键盘鼠标注入器"),s(t)]),o(":通过 wifi 来控制,店家不清楚 HA。")])]),B,e("section",Z,[e("ol",G,[e("li",L,[e("p",null,[e("a",P,[o("从零开始,基于群晖轻松玩转开源 homeassistant 智能家居前期搭建"),s(t)]),o(),F])]),e("li",J,[e("p",null,[e("a",K,[o("为什么设备状态会有延迟?如何减小延迟?"),s(t)]),o(),O])]),e("li",U,[e("p",null,[e("a",W,[o("树莓派 HomeAssistant 系列(四)NodeRed 安装配置"),s(t)]),o(),Y])])])])])}const ne=n(h,[["render",$],["__file","HomeAutomation.html.vue"]]);export{ne as default}; +import{_ as n}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as r,c as i,a as e,b as o,d as s,e as l}from"./app-91ee3df5.js";const h={},c=e("p",null,"智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。",-1),d=e("h2",{id:"home-assistant",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#home-assistant","aria-hidden":"true"},"#"),o(" Home Assistant")],-1),_=e("p",null,"Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。",-1),f=e("p",null,"Home Assistant 原生支持的米家设备较少,需要使用 hacs 下的集成 Xiaomi Miot Auto。默认 Docker 容器不带 hacs,需要手动部署。",-1),u={href:"https://github.com/hacs/integration/releases/",target:"_blank",rel:"noopener noreferrer"},m=e("li",null,"重启 Home Assistant 容器后,在集成中搜索 hacs,安装时按要求提供 github 账户授权。",-1),p=e("li",null,[o("选择「HACS」>「集成」>「浏览并下载存储库」,下载 Xiaomi Miot Auto 并重启 Home Assistant 容器。"),e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote1"},"[1]"),e("a",{class:"footnote-anchor",id:"footnote-ref1"})])],-1),b=e("p",null,"Home Assistant 虽然一直被吹得很厉害,但即时性的传感器可能不能及时触发,使用时需要注意这点。",-1),k={href:"https://home.miot-spec.com/s/lumi.gateway.mgl03",target:"_blank",rel:"noopener noreferrer"},g={href:"https://github.com/AlexxIT/XiaomiGateway3",target:"_blank",rel:"noopener noreferrer"},A=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote2"},"[2]"),e("a",{class:"footnote-anchor",id:"footnote-ref2"})],-1),H=e("h2",{id:"node-red",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#node-red","aria-hidden":"true"},"#"),o(" Node-RED")],-1),x={href:"https://github.com/node-red/node-red",target:"_blank",rel:"noopener noreferrer"},D={href:"https://bbs.iobroker.cn/t/topic/1165",target:"_blank",rel:"noopener noreferrer"},N=e("li",null,[o("部署 Node-RED 时,Node-RED 对存储文件夹的读写权限要求较高,Docker 部署的话需修改 data 的文件夹权限,为避免麻烦,我给了最高权限 "),e("code",null,"chmod 777 /volume1/docker/nodered/data"),o("。")],-1),E={href:"https://zachowj.github.io/node-red-contrib-home-assistant-websocket/guide/#prerequisites",target:"_blank",rel:"noopener noreferrer"},w=e("ul",null,[e("li",null,"选择「设置」>「节点管理」>「控制板」>「安装」,点击右侧刷新按钮,加载节点目录,第一次加载要比较长时间,不用关闭网页。"),e("li",null,"搜索并安装「node-red-contrib-home-assistant-websocket」。")],-1),R=e("li",null,"选择「Home Assistant」>「HACS」>「集成」>「浏览并下载存储库」,下载 Node-RED Companion。",-1),T=e("li",null,"选择「Home Assistant」>「配置」>「设备与服务」>「集成」,添加集成 Node-RED Companion,然后重启 Home Assistant 容器。",-1),v={href:"https://zachowj.github.io/node-red-contrib-home-assistant-websocket/guide/#configuration",target:"_blank",rel:"noopener noreferrer"},z=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote3"},"[3]"),e("a",{class:"footnote-anchor",id:"footnote-ref3"})],-1),C=l('

        常用节点

        • inject: 定时启动,周期性触发执行。
        • call service:改变智能设备状态,比如开灯。
          • Domain:触发方式
          • Service:触发命令
          • Device:设备与服务
          • Entity:设备执行模块

        自动化场景

        • 记录主卧关灯时间,默认其为睡眠时间,但实际关掉是关电源,不会在智能后端记录。或者用明暗度测试记录,每天最后暗的时候,记录为睡眠时间。
        • 书房检测到没人时,对电脑发送暂停视频的快捷键。这步卡在硬件,需要有个硬件能被 Node-RED 识别并给电脑发送按键。

        智能硬件

        Zigbee2MQTT

        ',6),M={href:"https://autoaigpt.cn/watch?v=R_CikjR7tiw",target:"_blank",rel:"noopener noreferrer"},j=e("p",null,"不过,我的设备都是米家系,暂时用不到开源网关,等买了其他品牌的设备,再考虑 Zigbee2MQTT。",-1),q=e("h3",{id:"智趣盒子",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#智趣盒子","aria-hidden":"true"},"#"),o(" 智趣盒子")],-1),S={href:"https://item.taobao.com/item.htm?id=635639747170",target:"_blank",rel:"noopener noreferrer"},y=e("blockquote",null,[e("p",null,"盒子基于 arm 的 linux 的 debian 系统上运行 docker,在 docker 的基础上构建了 supervisor 版本,跟 homeassistant 开发官方的 hassos 的最大差异就是打开了 root 的权限,可以在底层进行操作。这些比较适合国内的使用环境(网络改善,装第三方工具等).")],-1),I=e("p",null,"不过与 NAS 相比,智趣这类硬件盒子同样是 Docker 容器,除了能直连网关和想象中的简便攻略,并没什么其他优势。",-1),Q=e("h3",{id:"其他硬件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#其他硬件","aria-hidden":"true"},"#"),o(" 其他硬件")],-1),V={href:"https://item.taobao.com/item.htm?id=631865647089",target:"_blank",rel:"noopener noreferrer"},X={href:"https://item.taobao.com/item.htm?id=675107124036",target:"_blank",rel:"noopener noreferrer"},B=e("hr",{class:"footnotes-sep"},null,-1),Z={class:"footnotes"},G={class:"footnotes-list"},L={id:"footnote1",class:"footnote-item"},P={href:"https://baijiahao.baidu.com/s?id=1721932088542289661",target:"_blank",rel:"noopener noreferrer"},F=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),J={id:"footnote2",class:"footnote-item"},K={href:"https://github.com/al-one/hass-xiaomi-miot/issues/100#issuecomment-909031222",target:"_blank",rel:"noopener noreferrer"},O=e("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),U={id:"footnote3",class:"footnote-item"},W={href:"https://zhuanlan.zhihu.com/p/456741817",target:"_blank",rel:"noopener noreferrer"},Y=e("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1);function $(ee,oe){const t=a("ExternalLinkIcon");return r(),i("div",null,[c,d,_,f,e("ol",null,[e("li",null,[o("下载 "),e("a",u,[o("hacs"),s(t)]),o(",将其解压到 Home Assistant 配置的 config\\custom_components\\hacs 文件夹下。")]),m,p]),b,e("blockquote",null,[e("p",null,[o("对于人体传感器、门磁、无线开关类设备,它们的状态通常为瞬时状态 (即:事件),部分型号支持获取最后一次事件触发的时间,且默认轮询时长为 15 秒,对于无法获取最后触发事件的设备,即使修改轮询时间到 1 秒,也可能无法获取正确的状态。因此此类设备通过本插件集成后不太推荐用于触发实时自动化,仅适合作为如几分钟无人移动关灯这类自动化的条件。如果需要实时更新状态,推荐使用"),e("a",k,[o("多模网关"),s(t)]),o("配合 "),e("a",g,[o("XiaomiGateway3"),s(t)]),o(" 集成。"),A])]),H,e("p",null,[e("a",x,[o("Node-RED"),s(t)]),o(" 是本地版的 IFTTT,能与 Home Assistant 打通,实现本地化的互联。新手推荐 "),e("a",D,[o("node-red 的入门教程集合"),s(t)]),o("。")]),e("ol",null,[N,e("li",null,[o("Node-RED 上安装 "),e("a",E,[o("node-red-contrib-home-assistant-websocket"),s(t)]),o("。 "),w]),R,T,e("li",null,[o("进入 nodered 页面,配置 "),e("a",v,[o("home assistant websocket"),s(t)]),o(",点击右上角的部署。"),z])]),C,e("p",null,[e("a",M,[o("Zigbee2MQTT"),s(t)]),o(" 是开源的智能网关,支持大部分的智能设备。其辐射范围更大,能同时联接 200 个设备,它的插网线版更稳定不易掉线。")]),j,q,e("p",null,[e("a",S,[o("智趣盒子"),s(t)]),o("集成了 Home Assistant 和 Node-RED 的 Docker,Home Assistant 能部署 Addons、supervisor,能直接插开源网关。")]),y,I,Q,e("ul",null,[e("li",null,[e("a",V,[o("远程键盘控制器"),s(t)]),o(":基于易微联的第三方产品,手机通过 APP 远程控制电脑按键,不过只能按一个按键或者连续 6 个的自定义键值。不确定是否支持 HA。")]),e("li",null,[e("a",X,[o("MQTT 转 usb 虚拟键盘鼠标注入器"),s(t)]),o(":通过 wifi 来控制,店家不清楚 HA。")])]),B,e("section",Z,[e("ol",G,[e("li",L,[e("p",null,[e("a",P,[o("从零开始,基于群晖轻松玩转开源 homeassistant 智能家居前期搭建"),s(t)]),o(),F])]),e("li",J,[e("p",null,[e("a",K,[o("为什么设备状态会有延迟?如何减小延迟?"),s(t)]),o(),O])]),e("li",U,[e("p",null,[e("a",W,[o("树莓派 HomeAssistant 系列(四)NodeRed 安装配置"),s(t)]),o(),Y])])])])])}const ne=n(h,[["render",$],["__file","HomeAutomation.html.vue"]]);export{ne as default}; diff --git a/assets/Huginn.html-69ab79f2.js b/assets/Huginn.html-c6571976.js similarity index 99% rename from assets/Huginn.html-69ab79f2.js rename to assets/Huginn.html-c6571976.js index d2797efd..06f560b6 100644 --- a/assets/Huginn.html-69ab79f2.js +++ b/assets/Huginn.html-c6571976.js @@ -1,4 +1,4 @@ -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as c,c as r,a as e,b as n,d as a,t as p,e as t}from"./app-98132e77.js";const d={},u={href:"https://github.com/huginn/huginn/blob/master/doc/docker/install.md",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/huginn/huginn/blob/master/.env.example",target:"_blank",rel:"noopener noreferrer"},m={href:"https://gpt-vip.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},v=e("h2",{id:"常用-agent",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#常用-agent","aria-hidden":"true"},"#"),n(" 常用 Agent")],-1),g={href:"https://github.com/huginn/huginn/wiki/Agent-Types-&-Descriptions",target:"_blank",rel:"noopener noreferrer"},b=t("
        • Website Agent 解析网页、XML 文档和 json 数据,最常使用

        • Event Formatting Agent 事件信息格式化,可以对收到的信息内容进行格式化,允许添加自定义新内容

        • Phantom Js Cloud Agent 借助 Phantom 抓取动态页面源码,防止部门网站屏蔽爬虫

        • Trigger Agent 监控事件反馈信息的触发器,多用来过滤部分内容

        • De Duplicate Agent 去重

        • Data Output Agent 将数据以 RSS 和 Json 的形式向外部推送

        • Liquid Output Agent 自定义格式数据输出,可以用它创建 HTML 页面,json 数据等

        • Webhook Agent

        • Trigger Agent 监测敏感事件,然后可以用来发送邮件等提醒。

        • Javascript Agent 允许执行自定义的 JS 代码,可以用于个性化操作

        • Digest Agent 汇总节点,收集所有收到的事件再作为一个事件发送出去

        • Email Agent 用邮箱发送最新接收到的讯息

        • Post Agent 可以由其他节点触发,根据固定模板合并事件信息,并以 POST 或 GET 方式向指定的 URL 发起请求

        • Delay Agent 可以作为事件或者副本的暂存器或者缓冲区,统一触发发布

        • Scheduler Agent 定时器节点

        • Attribute Difference Agent 数值差异比较

        • Commander Agent 触发器代理,可以用于向其他节点发起指令控制,控制节点的执行和停止等

        ",1),k=e("code",null,"+",-1),f=e("code",null,"\\\\",-1),_=t(`

        Huginn 部署

        Huginn 的任务有时会卡住,导致后续任务无法进行,重启容器也无法恢复正常。因此,我改为手动部署 Huginn,并定期使用重置命令以防止任务卡住。

        cd /home/huginn/huginn
        +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as c,c as r,a as e,b as n,d as a,t as p,e as t}from"./app-91ee3df5.js";const d={},u={href:"https://github.com/huginn/huginn/blob/master/doc/docker/install.md",target:"_blank",rel:"noopener noreferrer"},h={href:"https://github.com/huginn/huginn/blob/master/.env.example",target:"_blank",rel:"noopener noreferrer"},m={href:"https://gpt-vip.top/posts/2018-10-07-huginn_scraping_any_website.html",target:"_blank",rel:"noopener noreferrer"},v=e("h2",{id:"常用-agent",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#常用-agent","aria-hidden":"true"},"#"),n(" 常用 Agent")],-1),g={href:"https://github.com/huginn/huginn/wiki/Agent-Types-&-Descriptions",target:"_blank",rel:"noopener noreferrer"},b=t("
        • Website Agent 解析网页、XML 文档和 json 数据,最常使用

        • Event Formatting Agent 事件信息格式化,可以对收到的信息内容进行格式化,允许添加自定义新内容

        • Phantom Js Cloud Agent 借助 Phantom 抓取动态页面源码,防止部门网站屏蔽爬虫

        • Trigger Agent 监控事件反馈信息的触发器,多用来过滤部分内容

        • De Duplicate Agent 去重

        • Data Output Agent 将数据以 RSS 和 Json 的形式向外部推送

        • Liquid Output Agent 自定义格式数据输出,可以用它创建 HTML 页面,json 数据等

        • Webhook Agent

        • Trigger Agent 监测敏感事件,然后可以用来发送邮件等提醒。

        • Javascript Agent 允许执行自定义的 JS 代码,可以用于个性化操作

        • Digest Agent 汇总节点,收集所有收到的事件再作为一个事件发送出去

        • Email Agent 用邮箱发送最新接收到的讯息

        • Post Agent 可以由其他节点触发,根据固定模板合并事件信息,并以 POST 或 GET 方式向指定的 URL 发起请求

        • Delay Agent 可以作为事件或者副本的暂存器或者缓冲区,统一触发发布

        • Scheduler Agent 定时器节点

        • Attribute Difference Agent 数值差异比较

        • Commander Agent 触发器代理,可以用于向其他节点发起指令控制,控制节点的执行和停止等

        ",1),k=e("code",null,"+",-1),f=e("code",null,"\\\\",-1),_=t(`

        Huginn 部署

        Huginn 的任务有时会卡住,导致后续任务无法进行,重启容器也无法恢复正常。因此,我改为手动部署 Huginn,并定期使用重置命令以防止任务卡住。

        cd /home/huginn/huginn
         sudo bundle exec rake production:force_stop
         sudo bundle exec rake production:export
         

        服务器重启后,需执行以下命令:

        sudo docker exec -it huginn bash
        diff --git a/assets/Javascript.html-8b79a0c5.js b/assets/Javascript.html-083193fe.js
        similarity index 99%
        rename from assets/Javascript.html-8b79a0c5.js
        rename to assets/Javascript.html-083193fe.js
        index bd7dce7d..cb0e0e14 100644
        --- a/assets/Javascript.html-8b79a0c5.js
        +++ b/assets/Javascript.html-083193fe.js
        @@ -1,4 +1,4 @@
        -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as l,c,a as n,b as a,d as e,e as o}from"./app-98132e77.js";const u={},r={href:"https://es6.ruanyifeng.com/",target:"_blank",rel:"noopener noreferrer"},d={href:"https://jkchao.github.io/typescript-book-chinese/",target:"_blank",rel:"noopener noreferrer"},p=o(`

        ES6

        sayHi(){console.log("Hi");} 等同于 sayHi:function(){console.log("Hi");}

        let 声明的变量只在 let 命令所在的代码块内有效,尤其适合用于 for 循环的计数器。

        const 声明一个只读的常量,一旦声明,常量的值就不能改变。

        => 是指箭头函数,是一种函数的简写方式,语法为 (参数)=>{函数体};

        x => 2x
        +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as l,c,a as n,b as a,d as e,e as o}from"./app-91ee3df5.js";const u={},r={href:"https://es6.ruanyifeng.com/",target:"_blank",rel:"noopener noreferrer"},d={href:"https://jkchao.github.io/typescript-book-chinese/",target:"_blank",rel:"noopener noreferrer"},p=o(`

        ES6

        sayHi(){console.log("Hi");} 等同于 sayHi:function(){console.log("Hi");}

        let 声明的变量只在 let 命令所在的代码块内有效,尤其适合用于 for 循环的计数器。

        const 声明一个只读的常量,一旦声明,常量的值就不能改变。

        => 是指箭头函数,是一种函数的简写方式,语法为 (参数)=>{函数体};

        x => 2x
         //等于下方函数
         function (x) {
          return 2x;
        diff --git a/assets/Life.html-867cdc0c.js b/assets/Life.html-6a8bceed.js
        similarity index 97%
        rename from assets/Life.html-867cdc0c.js
        rename to assets/Life.html-6a8bceed.js
        index 63f567fd..e69cc754 100644
        --- a/assets/Life.html-867cdc0c.js
        +++ b/assets/Life.html-6a8bceed.js
        @@ -1 +1 @@
        -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as n,c as h,a as e,b as a,d as t,e as i}from"./app-98132e77.js";const d={},c=i('

        个人护理

        理发

        电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。

        • 不要从前向后理发,否则限位器不起作用,头发都被推平。
        • 短发方案:限位器分别使用 1.5、6 和 4.5。

        衣物

        • 色彩:全身上下衣服的颜色不要超过 3 种,喜欢色彩饱和度偏低的颜色。单纯的黑白灰容易显得单调、路人。​
        • 图案:单一主题,小图案不要太大、条纹对齐不繁杂。横条纹显高显瘦,竖条纹相反。​[1]
        • T 恤:250g 32 支的纯棉面料,支数越高,面料就越柔软、越强韧 ​。
        • 5 分裤:不要七分裤或太宽松,裤长放在膝盖上方 5-10 厘米处。

        妙用

        磁铁

        铷磁铁或强磁铁在生活中有许多用途,如:整理线材,吸附窗帘,悬挂物品,密封。

        磁铁使用方便,不留痕迹,比小夹子有用。

        小众记录

        去客厅化

        宝宝出生后,扔掉了家里的欧式沙发和茶几,转而采用模块沙发。模块沙发的好处是可以灵活使用,需要时可以拆分来变成床。我买了三组,每组有两个沙发垫,可以让三个人舒适地睡觉。不过,模块沙发的价格差异很大,很难区分哪个更优。

        玻璃自爆

        2022.06.11 更换阳台 90*90 的弧形玻璃,要价 1100。

        阳台玻璃自爆后,即使玻璃没碎也要及早拆下来,否则有可能发生事故。拆旧玻璃前,需要清理下方停放的车辆,并暂时不让行人通行。拆好后,如果掉落碎玻璃较多,可以拿包烟让环卫工人帮忙清理。

        新玻璃未到之前,可以拿大的硬纸板挡住缺口,不要用薄膜遮掩,会被吸走。

        花洒水小

        手持花洒尾部与软管的连接处,有节水止逆阀。

        如果家里水压不足时,拆下节水止逆阀后安装花洒,可以解决花洒出水不足问题。

        网线更换

        客厅网络连接不稳定,加上原本装修的网线不好,想着把埋在墙里的网线都更换掉,就搜索「墙内网线更换」找到本地的服务商询价,准备把埋在墙里的网线都升到 7 类,但对方说超六和七类的网线都比较粗,很难拉进管道,可能会拉到一半给卡住。6 类线据传可以稳定支持 2.5Gbps/5Gbps 网络;在特定布线环境下,最大可支持 10Gbps 传输速率。

        师傅上门发现:除了客厅的 3 条网线是 6 类,其他房间都是超 5 类,可以上千兆,但不算稳定;管道里线特别多,无法更换网线。另外,单口网口面板改为双网口,需要连两根网线。

        平层户型换线报价(包含 6 类网线,6 类水晶头及人工):网线能不能换。只能我们工作人员,上门查看来确认。确认没法换的,只收上门费 100 元。可以换的话。换首根 6 类网线 380 元。每增加 1 根收取 140 元。管道里包含 10 米,超出的每米 12 元。客户需要管道外面延长网线的,每米 12 元。除复式和大型场所外,绝大多数情况是超不过 10 米。
        实际付费:上门维修就是按户计算,不管问题大小都是 300 起。我原本的问题不大,所以让他把家里的网线全部检查了遍,替换坏掉的水晶头和网口面板,最终费用是 430.

        网线情况:客厅 TV,客厅沙发(2 条网线,一条放在电话线下),客卧床头,客卧 TV,主卧床头,主卧 TV,书房书桌。书房备用网口更换面板后,依然不能使用,可能是线断了,不再使用。

        ',25),l={href:"https://sspai.com/post/74200",target:"_blank",rel:"noopener noreferrer"},p=e("hr",{class:"footnotes-sep"},null,-1),f={class:"footnotes"},_={class:"footnotes-list"},u={id:"footnote1",class:"footnote-item"},b={href:"https://www.guokr.com/article/459972/",target:"_blank",rel:"noopener noreferrer"},x=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function m(k,V){const o=s("ExternalLinkIcon");return n(),h("div",null,[c,e("p",null,[a("无线方面,我闲鱼买了个二手路由,与原本的华硕路由进行 "),e("a",l,[a("有线 mesh 组网"),t(o)]),a("。AiMesh 主路由连接 LAN 口,节点路由连接 WAN 口。")]),p,e("section",f,[e("ol",_,[e("li",u,[e("p",null,[e("a",b,[a("横纹衣服更显胖?你可能一直都弄错了"),t(o)]),a(),x])])])])])}const T=r(d,[["render",m],["__file","Life.html.vue"]]);export{T as default}; +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as n,c as h,a as e,b as a,d as t,e as i}from"./app-91ee3df5.js";const d={},c=i('

        个人护理

        理发

        电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。

        • 不要从前向后理发,否则限位器不起作用,头发都被推平。
        • 短发方案:限位器分别使用 1.5、6 和 4.5。

        衣物

        • 色彩:全身上下衣服的颜色不要超过 3 种,喜欢色彩饱和度偏低的颜色。单纯的黑白灰容易显得单调、路人。​
        • 图案:单一主题,小图案不要太大、条纹对齐不繁杂。横条纹显高显瘦,竖条纹相反。​[1]
        • T 恤:250g 32 支的纯棉面料,支数越高,面料就越柔软、越强韧 ​。
        • 5 分裤:不要七分裤或太宽松,裤长放在膝盖上方 5-10 厘米处。

        妙用

        磁铁

        铷磁铁或强磁铁在生活中有许多用途,如:整理线材,吸附窗帘,悬挂物品,密封。

        磁铁使用方便,不留痕迹,比小夹子有用。

        小众记录

        去客厅化

        宝宝出生后,扔掉了家里的欧式沙发和茶几,转而采用模块沙发。模块沙发的好处是可以灵活使用,需要时可以拆分来变成床。我买了三组,每组有两个沙发垫,可以让三个人舒适地睡觉。不过,模块沙发的价格差异很大,很难区分哪个更优。

        玻璃自爆

        2022.06.11 更换阳台 90*90 的弧形玻璃,要价 1100。

        阳台玻璃自爆后,即使玻璃没碎也要及早拆下来,否则有可能发生事故。拆旧玻璃前,需要清理下方停放的车辆,并暂时不让行人通行。拆好后,如果掉落碎玻璃较多,可以拿包烟让环卫工人帮忙清理。

        新玻璃未到之前,可以拿大的硬纸板挡住缺口,不要用薄膜遮掩,会被吸走。

        花洒水小

        手持花洒尾部与软管的连接处,有节水止逆阀。

        如果家里水压不足时,拆下节水止逆阀后安装花洒,可以解决花洒出水不足问题。

        网线更换

        客厅网络连接不稳定,加上原本装修的网线不好,想着把埋在墙里的网线都更换掉,就搜索「墙内网线更换」找到本地的服务商询价,准备把埋在墙里的网线都升到 7 类,但对方说超六和七类的网线都比较粗,很难拉进管道,可能会拉到一半给卡住。6 类线据传可以稳定支持 2.5Gbps/5Gbps 网络;在特定布线环境下,最大可支持 10Gbps 传输速率。

        师傅上门发现:除了客厅的 3 条网线是 6 类,其他房间都是超 5 类,可以上千兆,但不算稳定;管道里线特别多,无法更换网线。另外,单口网口面板改为双网口,需要连两根网线。

        平层户型换线报价(包含 6 类网线,6 类水晶头及人工):网线能不能换。只能我们工作人员,上门查看来确认。确认没法换的,只收上门费 100 元。可以换的话。换首根 6 类网线 380 元。每增加 1 根收取 140 元。管道里包含 10 米,超出的每米 12 元。客户需要管道外面延长网线的,每米 12 元。除复式和大型场所外,绝大多数情况是超不过 10 米。
        实际付费:上门维修就是按户计算,不管问题大小都是 300 起。我原本的问题不大,所以让他把家里的网线全部检查了遍,替换坏掉的水晶头和网口面板,最终费用是 430.

        网线情况:客厅 TV,客厅沙发(2 条网线,一条放在电话线下),客卧床头,客卧 TV,主卧床头,主卧 TV,书房书桌。书房备用网口更换面板后,依然不能使用,可能是线断了,不再使用。

        ',25),l={href:"https://sspai.com/post/74200",target:"_blank",rel:"noopener noreferrer"},p=e("hr",{class:"footnotes-sep"},null,-1),f={class:"footnotes"},_={class:"footnotes-list"},u={id:"footnote1",class:"footnote-item"},b={href:"https://www.guokr.com/article/459972/",target:"_blank",rel:"noopener noreferrer"},x=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function m(k,V){const o=s("ExternalLinkIcon");return n(),h("div",null,[c,e("p",null,[a("无线方面,我闲鱼买了个二手路由,与原本的华硕路由进行 "),e("a",l,[a("有线 mesh 组网"),t(o)]),a("。AiMesh 主路由连接 LAN 口,节点路由连接 WAN 口。")]),p,e("section",f,[e("ol",_,[e("li",u,[e("p",null,[e("a",b,[a("横纹衣服更显胖?你可能一直都弄错了"),t(o)]),a(),x])])])])])}const T=r(d,[["render",m],["__file","Life.html.vue"]]);export{T as default}; diff --git a/assets/Maintenance.html-e9cfa930.js b/assets/Maintenance.html-4f653250.js similarity index 98% rename from assets/Maintenance.html-e9cfa930.js rename to assets/Maintenance.html-4f653250.js index a3affeef..78ccd3a7 100644 --- a/assets/Maintenance.html-e9cfa930.js +++ b/assets/Maintenance.html-4f653250.js @@ -1 +1 @@ -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{o as i,c as e,e as r}from"./app-98132e77.js";const t={},p=r('

        牛皮席

        平时隔一段脏了用温水毛巾擦就可以了,如果流汗很多的话,可以用淡肥皂水擦拭后再用清水毛巾擦。不宜暴晒,可以傍晚的阳光晾晒。

        秋天收藏之前,用淡肥皂水湿毛巾彻底清洁牛皮席表面,然后再用清水擦干净,在阳台晾晒一天后,可以卷也可以折起打包起来收藏,也可以直接垫在床上,上面再铺被子使用。

        升降桌

        升降桌报错时,长按向下键,桌子会逐渐复位到最低,然后恢复正常。

        通马桶

        塑料袋套在马桶搋或马桶刷,把塑料袋绑好。一插到底,快速抽动。多套上几个,尽量把它弄得比马桶的口大一点点哦。因为塑料袋在前面能起到一个遮挡的作用,快速的抽动它会形成一股冲击,从而达到快速的疏通马桶的作用。

        如果使用下方的疏通器,也在疏通头上绑好塑料袋,在气口位置撕开个小口,最后按通气开关。

        疏通器说明 1
        疏通器说明 1
        疏通器说明 2
        疏通器说明 2

        林内锅炉

        左侧为冬季采暖模式,地暖模式下温度设置在 45—55℃,原则上不超过 60℃。因为地暖管道是塑料的,如果温度太高,那么会影响到采暖管的使用寿命,还会导致锅炉内壁结垢。

        燃气壁挂炉配备有手动注水/补水阀,当运行过程中,采暖系统压力下降至 1bar 以下时 (因水中气体蒸发等原因引起),用户应慢慢打开此阀对系统进行补水增压,直到系统压力恢复到规定的水压为止,一般在静态常温下,系统应保持 1bar 左右,工作时水压应保持在 1bar~1.5bar 之间,补水过程中请不要离开现场。

        锅炉补水

        1. 先检查采暖系统中是否有漏水的地方,确认系统完全密闭。

        2. 关闭燃气壁挂炉,切断电源。

        3. 逆时针(向左)旋紧注水/补水阀约一周,听到有“呲”的声音。

        4. 观察操作面板上的水压表,当水压表指针在 1bar~1.5bar 之间时,顺时针(向右)旋转注水/补水阀手柄关闭注水/补水阀。

        5. 开机运行燃气壁挂炉。

        注意事项:

        • 注水时,必须切断燃气壁挂炉总电源,以免因接头漏水而导致漏电;

        • 补水结束后必须将注水/补水阀旋紧关闭,否则燃气壁挂炉将过压溢水;

        • 如果您补水时不小心将采暖系统内的水压补到 3bar 左右,安全阀会泄水,所以再次提示您安全阀必须用接管与地漏连接,且中间不许有阀门。

        地暖温控器

        地暖温控器 1
        地暖温控器 1
        地暖温控器 2
        地暖温控器 2
        ',20),n=[p];function o(l,d){return i(),e("div",null,n)}const c=a(t,[["render",o],["__file","Maintenance.html.vue"]]);export{c as default}; +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{o as i,c as e,e as r}from"./app-91ee3df5.js";const t={},p=r('

        牛皮席

        平时隔一段脏了用温水毛巾擦就可以了,如果流汗很多的话,可以用淡肥皂水擦拭后再用清水毛巾擦。不宜暴晒,可以傍晚的阳光晾晒。

        秋天收藏之前,用淡肥皂水湿毛巾彻底清洁牛皮席表面,然后再用清水擦干净,在阳台晾晒一天后,可以卷也可以折起打包起来收藏,也可以直接垫在床上,上面再铺被子使用。

        升降桌

        升降桌报错时,长按向下键,桌子会逐渐复位到最低,然后恢复正常。

        通马桶

        塑料袋套在马桶搋或马桶刷,把塑料袋绑好。一插到底,快速抽动。多套上几个,尽量把它弄得比马桶的口大一点点哦。因为塑料袋在前面能起到一个遮挡的作用,快速的抽动它会形成一股冲击,从而达到快速的疏通马桶的作用。

        如果使用下方的疏通器,也在疏通头上绑好塑料袋,在气口位置撕开个小口,最后按通气开关。

        疏通器说明 1
        疏通器说明 1
        疏通器说明 2
        疏通器说明 2

        林内锅炉

        左侧为冬季采暖模式,地暖模式下温度设置在 45—55℃,原则上不超过 60℃。因为地暖管道是塑料的,如果温度太高,那么会影响到采暖管的使用寿命,还会导致锅炉内壁结垢。

        燃气壁挂炉配备有手动注水/补水阀,当运行过程中,采暖系统压力下降至 1bar 以下时 (因水中气体蒸发等原因引起),用户应慢慢打开此阀对系统进行补水增压,直到系统压力恢复到规定的水压为止,一般在静态常温下,系统应保持 1bar 左右,工作时水压应保持在 1bar~1.5bar 之间,补水过程中请不要离开现场。

        锅炉补水

        1. 先检查采暖系统中是否有漏水的地方,确认系统完全密闭。

        2. 关闭燃气壁挂炉,切断电源。

        3. 逆时针(向左)旋紧注水/补水阀约一周,听到有“呲”的声音。

        4. 观察操作面板上的水压表,当水压表指针在 1bar~1.5bar 之间时,顺时针(向右)旋转注水/补水阀手柄关闭注水/补水阀。

        5. 开机运行燃气壁挂炉。

        注意事项:

        • 注水时,必须切断燃气壁挂炉总电源,以免因接头漏水而导致漏电;

        • 补水结束后必须将注水/补水阀旋紧关闭,否则燃气壁挂炉将过压溢水;

        • 如果您补水时不小心将采暖系统内的水压补到 3bar 左右,安全阀会泄水,所以再次提示您安全阀必须用接管与地漏连接,且中间不许有阀门。

        地暖温控器

        地暖温控器 1
        地暖温控器 1
        地暖温控器 2
        地暖温控器 2
        ',20),n=[p];function o(l,d){return i(),e("div",null,n)}const c=a(t,[["render",o],["__file","Maintenance.html.vue"]]);export{c as default}; diff --git a/assets/Markdown.html-d99ad6cc.js b/assets/Markdown.html-78a125af.js similarity index 97% rename from assets/Markdown.html-d99ad6cc.js rename to assets/Markdown.html-78a125af.js index 515566c5..09683299 100644 --- a/assets/Markdown.html-d99ad6cc.js +++ b/assets/Markdown.html-78a125af.js @@ -1,4 +1,4 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as l,c as r,a,b as n,d as e,e as t}from"./app-98132e77.js";const c={},d=a("p",null,"Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。",-1),p={href:"https://docs.github.com/cn/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#styling-text",target:"_blank",rel:"noopener noreferrer"},u={href:"https://theme-hope.vuejs.press/zh/cookbook/markdown/",target:"_blank",rel:"noopener noreferrer"},m=t(`

        图片尺寸

        md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功率。

        <!-- 按页面宽度的 60% 来缩小 -->
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as l,c as r,a,b as n,d as e,e as t}from"./app-91ee3df5.js";const c={},d=a("p",null,"Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。",-1),p={href:"https://docs.github.com/cn/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#styling-text",target:"_blank",rel:"noopener noreferrer"},u={href:"https://theme-hope.vuejs.press/zh/cookbook/markdown/",target:"_blank",rel:"noopener noreferrer"},m=t(`

        图片尺寸

        md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功率。

        <!-- 按页面宽度的 60% 来缩小 -->
         <img src="" width="60%">
         
         <!-- md 图片设置,有时不能被识别 -->
        diff --git a/assets/Medical.html-3786f7d2.js b/assets/Medical.html-80e9c0dd.js
        similarity index 97%
        rename from assets/Medical.html-3786f7d2.js
        rename to assets/Medical.html-80e9c0dd.js
        index b6694cc0..9f044883 100644
        --- a/assets/Medical.html-3786f7d2.js
        +++ b/assets/Medical.html-80e9c0dd.js
        @@ -1 +1 @@
        -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as s,c as l,a as e,b as o,d as a,e as c}from"./app-98132e77.js";const i={},h=e("h2",{id:"自身健康",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#自身健康","aria-hidden":"true"},"#"),o(" 自身健康")],-1),f={href:"https://detail.tmall.com/item.htm?id=542176943787",target:"_blank",rel:"noopener noreferrer"},d={href:"https://detail.tmall.com/item.htm?id=568724954216",target:"_blank",rel:"noopener noreferrer"},_={href:"https://detail.tmall.com/item.htm?id=657520889974",target:"_blank",rel:"noopener noreferrer"},p=e("strong",null,"立即清水清洗掉",-1),m=c('

        黑头:白天用壬二酸(5 分钟),晚上用维 a 酸。

        维生素

        维生素:维生素 B 和 C 国内非常便宜,几元一瓶。但其他维生素国内只有保健品,价格严重虚高,优先考虑国外购买。

        护眼:叶黄素,玉米黄质,Lutemax® 2020 万寿菊花提取物。

        补钙:吃钙片要同时补充维他命 D 和维他命 K。钙本身是无法直接被身体吸收的,维他命 D 的作用是运输,带动钙元素在血液中流动。但光流动不行,需要给钙找个目标,才能把钙变成骨骼。所以就需要维他命 K,维他命 K 的作用则是把血钙转化为骨钙,让钙元素真正沉积在骨骼上。D 和 K 相结合,才能最大程度地提升钙的吸收率。

        看病技巧

        • 如果在网上挂不到专家的号,可以尝试电话联系科室问一下能不能当天加号,有的专家是允许加号的,只不过可能会加到当天比较晚的时候,出检查结果的时候专家就下班了。[1]

        • 如果对自己病情没有很多了解的话,建议早上空腹去,以免抽不了血。如果对自己要做的检查有大致了解的话,建议查一下注意事项,提前做好准备,比如做核磁共振身上不要带金属,女生最好穿无钢圈无挂钩的 bra,比如散瞳后不要驾驶等等。

        • 人这一生中还是得常见病的概率大,没必要迷信主任医师。建议首次看病不必找资历太高的医生,如果你的病真的到了需要找老大夫看看的地步,年轻大夫会领着你去找的。

        • 上午看病的人多,下午少,周一多,周五少,尽量避开周一上午。刮风下雨是看病的最佳时机,雨越大,人越少。[2]


        ',8),u={class:"footnotes"},k={class:"footnotes-list"},b={id:"footnote1",class:"footnote-item"},x={href:"https://www.guokr.com/article/461939/",target:"_blank",rel:"noopener noreferrer"},g=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),w={id:"footnote2",class:"footnote-item"},B={href:"https://www.guokr.com/article/461706/",target:"_blank",rel:"noopener noreferrer"},K=e("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1);function N(V,v){const t=n("ExternalLinkIcon");return s(),l("div",null,[h,e("p",null,[e("a",f,[o("尿素乳膏"),a(t)]),o(":柔软皮肤,防止干裂,深层滋润。")]),e("p",null,[e("a",d,[o("维 a 酸乳膏"),a(t)]),o(":更新表皮,去除角质,避光只能晚上用。")]),e("p",null,[e("a",_,[o("壬二酸"),a(t)]),o(":疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后"),p,o(",然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停留超过 1-2 小时以上无不适,可以尝试过夜。")]),m,e("section",u,[e("ol",k,[e("li",b,[e("p",null,[e("a",x,[o("不用迷信主任,要是真有大病,年轻大夫会领着你去找的……"),a(t)]),o(),g])]),e("li",w,[e("p",null,[e("a",B,[o("“为了您和家人的健康,请不要在星期一上午看病”,超实用看病指南"),a(t)]),o(),K])])])])])}const E=r(i,[["render",N],["__file","Medical.html.vue"]]);export{E as default}; +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as s,c as l,a as e,b as o,d as a,e as c}from"./app-91ee3df5.js";const i={},h=e("h2",{id:"自身健康",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#自身健康","aria-hidden":"true"},"#"),o(" 自身健康")],-1),f={href:"https://detail.tmall.com/item.htm?id=542176943787",target:"_blank",rel:"noopener noreferrer"},d={href:"https://detail.tmall.com/item.htm?id=568724954216",target:"_blank",rel:"noopener noreferrer"},_={href:"https://detail.tmall.com/item.htm?id=657520889974",target:"_blank",rel:"noopener noreferrer"},p=e("strong",null,"立即清水清洗掉",-1),m=c('

        黑头:白天用壬二酸(5 分钟),晚上用维 a 酸。

        维生素

        维生素:维生素 B 和 C 国内非常便宜,几元一瓶。但其他维生素国内只有保健品,价格严重虚高,优先考虑国外购买。

        护眼:叶黄素,玉米黄质,Lutemax® 2020 万寿菊花提取物。

        补钙:吃钙片要同时补充维他命 D 和维他命 K。钙本身是无法直接被身体吸收的,维他命 D 的作用是运输,带动钙元素在血液中流动。但光流动不行,需要给钙找个目标,才能把钙变成骨骼。所以就需要维他命 K,维他命 K 的作用则是把血钙转化为骨钙,让钙元素真正沉积在骨骼上。D 和 K 相结合,才能最大程度地提升钙的吸收率。

        看病技巧

        • 如果在网上挂不到专家的号,可以尝试电话联系科室问一下能不能当天加号,有的专家是允许加号的,只不过可能会加到当天比较晚的时候,出检查结果的时候专家就下班了。[1]

        • 如果对自己病情没有很多了解的话,建议早上空腹去,以免抽不了血。如果对自己要做的检查有大致了解的话,建议查一下注意事项,提前做好准备,比如做核磁共振身上不要带金属,女生最好穿无钢圈无挂钩的 bra,比如散瞳后不要驾驶等等。

        • 人这一生中还是得常见病的概率大,没必要迷信主任医师。建议首次看病不必找资历太高的医生,如果你的病真的到了需要找老大夫看看的地步,年轻大夫会领着你去找的。

        • 上午看病的人多,下午少,周一多,周五少,尽量避开周一上午。刮风下雨是看病的最佳时机,雨越大,人越少。[2]


        ',8),u={class:"footnotes"},k={class:"footnotes-list"},b={id:"footnote1",class:"footnote-item"},x={href:"https://www.guokr.com/article/461939/",target:"_blank",rel:"noopener noreferrer"},g=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),w={id:"footnote2",class:"footnote-item"},B={href:"https://www.guokr.com/article/461706/",target:"_blank",rel:"noopener noreferrer"},K=e("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1);function N(V,v){const t=n("ExternalLinkIcon");return s(),l("div",null,[h,e("p",null,[e("a",f,[o("尿素乳膏"),a(t)]),o(":柔软皮肤,防止干裂,深层滋润。")]),e("p",null,[e("a",d,[o("维 a 酸乳膏"),a(t)]),o(":更新表皮,去除角质,避光只能晚上用。")]),e("p",null,[e("a",_,[o("壬二酸"),a(t)]),o(":疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后"),p,o(",然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停留超过 1-2 小时以上无不适,可以尝试过夜。")]),m,e("section",u,[e("ol",k,[e("li",b,[e("p",null,[e("a",x,[o("不用迷信主任,要是真有大病,年轻大夫会领着你去找的……"),a(t)]),o(),g])]),e("li",w,[e("p",null,[e("a",B,[o("“为了您和家人的健康,请不要在星期一上午看病”,超实用看病指南"),a(t)]),o(),K])])])])])}const E=r(i,[["render",N],["__file","Medical.html.vue"]]);export{E as default}; diff --git a/assets/Midjourney.html-6ed1bde8.js b/assets/Midjourney.html-a39501e5.js similarity index 98% rename from assets/Midjourney.html-6ed1bde8.js rename to assets/Midjourney.html-a39501e5.js index 15d4a823..806d815d 100644 --- a/assets/Midjourney.html-6ed1bde8.js +++ b/assets/Midjourney.html-a39501e5.js @@ -1 +1 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as r,c as a,e as d}from"./app-98132e77.js";const i={},n=d('

        Midjourney

        Midjourney是一款基于人工智能技术的绘画软件,它融合了深度学习算法的精髓,为用户提供了独特的绘画体验。在本文中,我们将探讨Midjourney所基于的技术以及它如何帮助用户创作个性化风格的绘画作品。

        Midjourney的技术基础

        Midjourney的核心技术基础是人工智能,具体而言,是深度学习算法。这些算法在绘画领域发挥了巨大的作用,让用户能够轻松地创造独特的艺术作品。这一技术能力的支持使Midjourney成为专业画家和绘画爱好者的理想选择。

        文字生成图片

        一种独特的生成方式是文字生成图片。Midjourney允许用户输入文字描述,然后将其转化为令人惊叹的绘画作品。无需绘画技能,用户可以用文字表达他们的创意,而Midjourney将会将其呈现为生动的图像。

        图片生成图片

        Midjourney还支持图片生成图片的方式。用户可以上传现有的图片,然后让人工智能技术将其转化为全新的绘画作品。这为用户提供了一种以既有图像为基础,创造出令人惊叹的艺术作品的方式。

        混合图片生成图片

        最后,Midjourney还提供了混合图片生成图片的选项。这意味着用户可以将文字和图片相结合,创造出充满创意的绘画作品。这种多元化的生成方式为用户提供了更多可能性,让他们能够实现他们的创意梦想。

        Midjourney的用户群体

        Midjourney的多样化生成方式使它适用于各种用户群体。专业画家可以利用这一工具来扩展他们的创作能力,将想法转化为艺术作品。同时,绘画爱好者也可以在无需绘画经验的情况下,轻松创建独特的绘画作品。无论您是想要展示专业技能还是纯粹追求兴趣,Midjourney都为您提供了一个创意的平台。

        结语

        Midjourney是一款基于人工智能技术的绘画软件,利用深度学习算法赋予用户无限的创造力。无论您是专业画家还是绘画爱好者,Midjourney都能满足您的需求,帮助您轻松创作个性化风格的绘画作品。不管您是追求艺术的极致还是寻找灵感的初学者,Midjourney都将引领您踏上一段充满创造力的绘画之旅。试试Midjourney,探索您的无限创意潜力吧!

        ',14),o=[n];function h(u,t){return r(),a("div",null,o)}const j=e(i,[["render",h],["__file","Midjourney.html.vue"]]);export{j as default}; +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as r,c as a,e as d}from"./app-91ee3df5.js";const i={},n=d('

        Midjourney

        Midjourney是一款基于人工智能技术的绘画软件,它融合了深度学习算法的精髓,为用户提供了独特的绘画体验。在本文中,我们将探讨Midjourney所基于的技术以及它如何帮助用户创作个性化风格的绘画作品。

        Midjourney的技术基础

        Midjourney的核心技术基础是人工智能,具体而言,是深度学习算法。这些算法在绘画领域发挥了巨大的作用,让用户能够轻松地创造独特的艺术作品。这一技术能力的支持使Midjourney成为专业画家和绘画爱好者的理想选择。

        文字生成图片

        一种独特的生成方式是文字生成图片。Midjourney允许用户输入文字描述,然后将其转化为令人惊叹的绘画作品。无需绘画技能,用户可以用文字表达他们的创意,而Midjourney将会将其呈现为生动的图像。

        图片生成图片

        Midjourney还支持图片生成图片的方式。用户可以上传现有的图片,然后让人工智能技术将其转化为全新的绘画作品。这为用户提供了一种以既有图像为基础,创造出令人惊叹的艺术作品的方式。

        混合图片生成图片

        最后,Midjourney还提供了混合图片生成图片的选项。这意味着用户可以将文字和图片相结合,创造出充满创意的绘画作品。这种多元化的生成方式为用户提供了更多可能性,让他们能够实现他们的创意梦想。

        Midjourney的用户群体

        Midjourney的多样化生成方式使它适用于各种用户群体。专业画家可以利用这一工具来扩展他们的创作能力,将想法转化为艺术作品。同时,绘画爱好者也可以在无需绘画经验的情况下,轻松创建独特的绘画作品。无论您是想要展示专业技能还是纯粹追求兴趣,Midjourney都为您提供了一个创意的平台。

        结语

        Midjourney是一款基于人工智能技术的绘画软件,利用深度学习算法赋予用户无限的创造力。无论您是专业画家还是绘画爱好者,Midjourney都能满足您的需求,帮助您轻松创作个性化风格的绘画作品。不管您是追求艺术的极致还是寻找灵感的初学者,Midjourney都将引领您踏上一段充满创造力的绘画之旅。试试Midjourney,探索您的无限创意潜力吧!

        ',14),o=[n];function h(u,t){return r(),a("div",null,o)}const j=e(i,[["render",h],["__file","Midjourney.html.vue"]]);export{j as default}; diff --git a/assets/MySQL.html-6cf1d92b.js b/assets/MySQL.html-4beb2d1b.js similarity index 96% rename from assets/MySQL.html-6cf1d92b.js rename to assets/MySQL.html-4beb2d1b.js index 614084ec..6b50872f 100644 --- a/assets/MySQL.html-6cf1d92b.js +++ b/assets/MySQL.html-4beb2d1b.js @@ -1,4 +1,4 @@ -import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as r,c as t,a as e,b as n,d as l,e as c}from"./app-98132e77.js";const i={},d=e("p",null,"我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。",-1),p=e("h2",{id:"本地-mysql-使用",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#本地-mysql-使用","aria-hidden":"true"},"#"),n(" 本地 MySQL 使用")],-1),m={href:"https://downloads.mysql.com/archives/installer/",target:"_blank",rel:"noopener noreferrer"},u=c(`

        数据库恢复

        数据库备份是至关重要的工作,一旦数据丢失,恢复起来会非常困难。如果你只想恢复特定的数据库,可以复制数据库的字段内容。在 phpMyAdmin 中,选择你需要的数据库,点击 "SQL",然后将你的 SQL 代码粘贴到执行窗口,最后点击 "Go" 按钮以运行代码。字段的分隔通常以 -- Table structure for table xxx 开始。

        如果出现错误 #1217 - Cannot delete or update a parent row: a foreign key constraint fails,这意味着你尝试删除或更新表中的记录,但是这个记录在另一个表中作为外键被引用。如果确实需要进行恢复,可以使用以下命令暂时关闭 MySQL 的外键约束检查:

        -- 禁用外键约束检查
        +import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as r,c as t,a as e,b as n,d as l,e as c}from"./app-91ee3df5.js";const i={},d=e("p",null,"我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。",-1),p=e("h2",{id:"本地-mysql-使用",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#本地-mysql-使用","aria-hidden":"true"},"#"),n(" 本地 MySQL 使用")],-1),m={href:"https://downloads.mysql.com/archives/installer/",target:"_blank",rel:"noopener noreferrer"},u=c(`

        数据库恢复

        数据库备份是至关重要的工作,一旦数据丢失,恢复起来会非常困难。如果你只想恢复特定的数据库,可以复制数据库的字段内容。在 phpMyAdmin 中,选择你需要的数据库,点击 "SQL",然后将你的 SQL 代码粘贴到执行窗口,最后点击 "Go" 按钮以运行代码。字段的分隔通常以 -- Table structure for table xxx 开始。

        如果出现错误 #1217 - Cannot delete or update a parent row: a foreign key constraint fails,这意味着你尝试删除或更新表中的记录,但是这个记录在另一个表中作为外键被引用。如果确实需要进行恢复,可以使用以下命令暂时关闭 MySQL 的外键约束检查:

        -- 禁用外键约束检查
         SET FOREIGN_KEY_CHECKS=0;
         
         -- 执行您的操作...
        diff --git a/assets/NAS.html-c240f2de.js b/assets/NAS.html-52854c9a.js
        similarity index 99%
        rename from assets/NAS.html-c240f2de.js
        rename to assets/NAS.html-52854c9a.js
        index 7861c401..4ba6968f 100644
        --- a/assets/NAS.html-c240f2de.js
        +++ b/assets/NAS.html-52854c9a.js
        @@ -1 +1 @@
        -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as c,c as d,a as e,b as t,d as o,w as a,e as l}from"./app-98132e77.js";const h={},u=e("p",null,"NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点:",-1),_=e("ul",null,[e("li",null,"选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。"),e("li",null,"选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时任务脚本。"),e("li",null,"SSD 缓存对家用的 NAS 性能提升不大,没必要加。"),e("li",null,"群晖系统分布在所有硬盘,拔出一个不影响使用。但应用会有影响?"),e("li",null,"NAS Docker 建议指定本地端口,否则重启容器会让端口发生改变,重启不会不影响 docker 配置。"),e("li",null,"升级容器镜像,不影响内部数据库。群晖的「Docker 导出」只会导出安装镜像和配置,但不包括容器内部使用的数据库,用处不大。")],-1),p=e("h2",{id:"nas-套件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#nas-套件","aria-hidden":"true"},"#"),t(" NAS 套件")],-1),f={href:"https://spk7.imnks.com/",target:"_blank",rel:"noopener noreferrer"},b=l('
        • DS/Transmission:用于 PT 下载 (禁用 DHT,半小时停止做种)。
        • Synology Drive Server:电脑文件备份。
        • Hyper Backup:本地多硬盘备份,防止一个硬盘丢失后重要文件损坏,比如 docker 容器的本地配置文件夹。
        • Surveillance Station:管理 IP 摄像机以保护您的家庭和办公环境。借助 Surveillance Station,您可以透过网络浏览器,VisualStation 或移动设备观看和记录实时视频,设置定时记录,回放记录的视频,从而实现远程监控。发生重要事件时,您也会收到通知。注意,摄像头需支持 ONVIF 协议

        Docker 容器

        常用

        ',3),m={href:"https://registry.hub.docker.com/r/linuxserver/qbittorrent/",target:"_blank",rel:"noopener noreferrer"},k=e("code",null,"BitTorrent - DHT",-1),g={href:"https://blog.csdn.net/weixin_45120915/article/details/114691473",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/AragonSnow/qiandao",target:"_blank",rel:"noopener noreferrer"},w={href:"https://github.com/ckx000/get-cookies",target:"_blank",rel:"noopener noreferrer"},S=e("li",null,[e("a",{href:"/services/dockers-on-nas/mt-photos"},"MT Photos"),t(":支持自动整理、分类您的照片,比如:时间、地点、人物、照片类型。需要 99 元买断服务,每周连线检查授权状态。比较喜欢的是,支持网页分享特定图片影集,适合将宝宝照片批量分享给家人。")],-1),x={href:"https://docs.photoprism.app/",target:"_blank",rel:"noopener noreferrer"},A={href:"https://github.com/immich-app/immich",target:"_blank",rel:"noopener noreferrer"},N={href:"https://containrrr.dev/watchtower/",target:"_blank",rel:"noopener noreferrer"},T=e("ul",null,[e("li",null,[t("监控指定名称的镜像:"),e("code",null,"docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once nginx redis"),t("。本案例只更新名为「nginx」和「redis」的容器,其他容器将被忽略。")]),e("li",null,[t("指定容器的 compose 命令中添加 lable "),e("code",null,"com.centurylinklabs.watchtower.enable=false"),t(",可禁止该容器的监控和更新。")])],-1),y=e("h3",{id:"资讯",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#资讯","aria-hidden":"true"},"#"),t(" 资讯")],-1),D=e("li",null,"RSSHub:无需保存数据,pubData 为 GMT 时区,普通用户无法更改,Docker Timezone 设置也不会有改变。",-1),B=e("li",null,"Huginn:定期备份抓取脚本,数据库保存在本地。",-1),E={href:"https://registry.hub.docker.com/r/wangqiru/mercury-parser-api",target:"_blank",rel:"noopener noreferrer"},M=e("li",null,[t("Cloudflare Tunnels:可以将局域网内容转发到外网。不过,每次容器重启后都需要重新构建,"),e("code",null,"sudo docker run --name cloudflared -d --restart unless-stopped cloudflare/cloudflared:latest tunnel --no-autoupdate run --token [Your Tokens]"),t("。后期考虑是否将启动命令放入容器。")],-1),P={href:"https://github.com/easychen/checkchan-dist",target:"_blank",rel:"noopener noreferrer"},z={href:"https://github.com/dgtlmoon/changedetection.io",target:"_blank",rel:"noopener noreferrer"},R=e("h3",{id:"娱乐",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#娱乐","aria-hidden":"true"},"#"),t(" 娱乐")],-1),H={href:"https://github.com/alist-org/alist",target:"_blank",rel:"noopener noreferrer"},I={href:"https://www.navidrome.org/docs/installation/docker/",target:"_blank",rel:"noopener noreferrer"},$={href:"https://github.com/Difegue/LANraragi",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/Difegue/LANraragi/blob/32cc991e8c5bae3bbd57d163278048c50159ae9f/tools/Documentation/advanced-usage/external-readers.md",target:"_blank",rel:"noopener noreferrer"},L=e("li",null,[e("a",{href:"/services/dockers-on-nas/tachidesk"},"Tachidesk"),t(":开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extensions,点右上角的 Enabled Languages 按钮,设置为中文源,然后会在页面底部发现中文漫画源。安装源后,进入 Souces 中点击进入对应源。")],-1),q=e("li",null,[e("a",{href:"/services/dockers-on-nas/reader"},"reader"),t(":阅读 3 的服务器版,摆脱客户端,网页版即可查看。自定义替换进入文章页面左侧的「设置」-「过滤规则管理」。")],-1),V={href:"https://github.com/talebook/talebook",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/zzcabc/Docker_Buildx_Danmuji",target:"_blank",rel:"noopener noreferrer"},F={href:"https://hub.docker.com/r/makedie/noname_kill",target:"_blank",rel:"noopener noreferrer"},G={href:"https://hub.docker.com/r/gswxy/gswxy",target:"_blank",rel:"noopener noreferrer"},O={href:"https://www.gswxy.com/?p=67",target:"_blank",rel:"noopener noreferrer"},X=e("h3",{id:"自动化",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#自动化","aria-hidden":"true"},"#"),t(" 自动化")],-1),U={href:"https://blog.csdn.net/alex_yangchuansheng/article/details/122295193",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://www.home-assistant.io/",target:"_blank",rel:"noopener noreferrer"},J={href:"https://github.com/monicahq/monica",target:"_blank",rel:"noopener noreferrer"},K={href:"https://github.com/monicahq/docker",target:"_blank",rel:"noopener noreferrer"},W=e("code",null,"Me as a contact",-1),Q={href:"https://supermanito.github.io/Helloworld/#/",target:"_blank",rel:"noopener noreferrer"},Z={href:"https://registry.hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc",target:"_blank",rel:"noopener noreferrer"},ee={href:"https://rustdesk.com/zh/",target:"_blank",rel:"noopener noreferrer"},te=e("h3",{id:"待了解",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#待了解","aria-hidden":"true"},"#"),t(" 待了解")],-1),oe=e("li",null,"Nextcloud: 私有云盘,完成 PC 端文件同步、版本控制,提供 web 端、移动端 app。",-1),ne={href:"https://github.com/lsky-org/lsky-pro",target:"_blank",rel:"noopener noreferrer"},re={href:"https://github.com/EstrellaXD/Auto_Bangumi",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/jxxghp/nas-tools/wiki/%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B",target:"_blank",rel:"noopener noreferrer"},se=e("li",null,"Clash:代理服务器。",-1),le=e("h2",{id:"影视整理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#影视整理","aria-hidden":"true"},"#"),t(" 影视整理")],-1),ie=e("p",null,"下载文件后,用 tinyMediaManager 重命名并下载 NFO 和影视封面,最后放置于分类文件夹。",-1),ce={href:"https://www.tinymediamanager.org/download/",target:"_blank",rel:"noopener noreferrer"},de=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote1"},"[1]"),e("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),he=l('
        # 电视节目重命名规则\n季文件夹名:Season ${seasonNr}\n剧集档案名:${showTitle} - S${seasonNr2}E${episodeNr2} - ${title}\n\n# 当只有一季时,则更改重命名规则\n季文件夹名:为空时,会自动调用默认值\n剧集档案名:${showTitle} - E${episodeNr2}\n\n# 多季,有标题时\n剧集档案名:${showTitle} - E${episodeNr2} - ${title}\n

        NAS 硬盘

        插入新硬盘,新建储存空间,使用 Btrfs 或 Basic 格式。SHR 是群晖的智能 RAID 格式,不适用于硬盘容量不同的情况。

        硬盘容量到期时间(5 年)
        硬盘 110T2025-06-18
        硬盘 24T2023-01-24
        硬盘 314T2027-02-11
        硬盘 48T2026-01-06
        冷备份2T2014-10

        换下的机械硬盘做冷备份,存储照片等长期数据。

        硬盘临期后,用大容量硬盘替换。选择「存储池」>「更改 RAID 类型」,无损转换 basic 到 Raid1。不过,不同容量硬盘组 RAID,只能以最小磁盘容量计使用空间。

        更换硬盘后,注意将数据连同文件夹用 file station 复制过去 (按住 Shift 选中所有你要的文件点右键 移动到...),关机卸载旧盘。如果该硬盘涉及套件位置,注意检查设置。[2]

        共享文件迁移:选择「控制面板」>「共享文件夹」,把你的共享文件夹位置修改到新储存空间。[3]


        ',9),ue={class:"footnotes"},_e={class:"footnotes-list"},pe={id:"footnote1",class:"footnote-item"},fe={href:"https://post.smzdm.com/p/a0d67m2z/",target:"_blank",rel:"noopener noreferrer"},be=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),me={id:"footnote2",class:"footnote-item"},ke={href:"https://www.bigzhang.com/3264.html",target:"_blank",rel:"noopener noreferrer"},ge=e("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),ve={id:"footnote3",class:"footnote-item"},we={href:"https://blog.csdn.net/hilaryfrank/article/details/109722319",target:"_blank",rel:"noopener noreferrer"},Se=e("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1);function xe(Ae,Ne){const n=s("ExternalLinkIcon"),r=s("RouterLink");return c(),d("div",null,[u,_,p,e("p",null,[t("除了官方套件源,我会加上 "),e("a",f,[t("DSM7.x 矿神 SPK 套件源"),o(n)]),t("。")]),b,e("ul",null,[e("li",null,[e("a",m,[t("qbittorrent"),o(n)]),t(":需修改所有默认端口,否则容易报错。PT 下载关闭 "),k,t(" 和其他隐私选项,半小时停止做种,将下载文件添加 Everyone 权限,其他设置参考"),e("a",g,[t("群晖使用 qbittorrent"),o(n)]),t("。")]),e("li",null,[e("a",v,[t("qiandao"),o(n)]),t(":自动签到开源框架,需搭配浏览器扩展 "),e("a",w,[t("get-cookies"),o(n)]),t(" 使用,可导出配置。")]),S,e("li",null,[e("a",x,[t("PhotoPrism"),o(n)]),t(":基于 ai 私有化部署的个人相册,但实际很多照片无法识别,无法对外分享。如果部署时出错,则尝试删除数据库文件夹下的内容。地点标记功能非常强大,类似本地版 Google Photos。")]),e("li",null,[e("a",A,[t("Immich"),o(n)]),t(": 相册备份、浏览,提供 web 端、移动端 app。但不支持扫描已有文件。")]),e("li",null,[e("a",N,[t("watchtower"),o(n)]),t(":监控并更新 Docker 容器。 "),T])]),y,e("ul",null,[D,B,e("li",null,[t("Tiny Tiny RSS:定期备份订阅源和设置,自动更新,可配置全文插件 "),e("a",E,[t("mercury-parser-api"),o(n)]),t("。")]),M,e("li",null,[e("a",P,[t("Check 酱"),o(n)]),t(":监测网页内容变化,并发送异动到微信。亦支持 http status、json 和 rss 监测。配合自架云端,关电脑后也能运行。同类工具有 "),e("a",z,[t("changedetection.io"),o(n)]),t("。")])]),R,e("ul",null,[e("li",null,[e("a",H,[t("AList"),o(n)]),t(":开源的网盘管理工具,还支持对象存储,本地存储,FTP 等等。")]),e("li",null,[e("a",I,[t("Navidrome"),o(n)]),t(":NAS 上的私人专属在线音乐库。")]),e("li",null,[o(r,{to:"/services/dockers-on-nas/"},{default:a(()=>[t("Emby")]),_:1}),t("/Plex:这两者都是热门的视频流媒体解决方案。终身会员的价格为 119 美元。Jellyfin 作为一个开源免费的选择,同样是一个不错的考虑。")]),e("li",null,[e("a",$,[t("LANraragi"),o(n)]),t(":免费开源的漫画管理器,支持 zip/rar/targz/lzma/7z/xz/cbz/cbr/pdf 多种格式,可从网页和 "),e("a",C,[t("第三方客户端"),o(n)]),t(" 浏览。")]),L,q,e("li",null,[e("a",V,[t("Tale Book"),o(n)]),t(":基于 Calibre 的简单的个人图书管理系统,支持在线阅读,但阅读体验不强且 Bug 较多,个人更喜欢直接用 PC 端查看。")]),e("li",null,[e("a",j,[t("Bilibili_Danmuji"),o(n)]),t(":B 站直播礼物答谢、定时广告、关注感谢,自动回复工具,房管工具,自动打卡,Bilibili 直播弹幕姬 (使用 websocket 协议),java 版 B 站弹幕姬。部署 Docker 时需更新 jdr release 文件。")]),e("li",null,[e("a",F,[t("无名杀"),o(n)]),t(":部署在 NAS 上的三国杀游戏。")]),e("li",null,[e("a",G,[t("GSWXY - 魔兽世界单机服务端"),o(n)]),t(":需要 2G 内存和 20G 硬盘空间。你也可以直接使用"),e("a",O,[t("耳语海岸 RP 服"),o(n)]),t("。")])]),X,e("ul",null,[e("li",null,[e("a",U,[t("n8n"),o(n)]),t(":开源 IFTTT 工具,偏重于云服务。")]),e("li",null,[o(r,{to:"/family/HomeAutomation.html#node-red"},{default:a(()=>[t("Node-RED")]),_:1}),t(":开源流处理,类似本地版的 IFTTT。")]),e("li",null,[e("a",Y,[t("Home Assistant"),o(n)]),t(":开源家庭自动化平台,可自定义集中管理各品牌的智能家居设备。米家设备需使用 hacs 下的集成 "),o(r,{to:"/family/HomeAutomation.html#home-assistant"},{default:a(()=>[t("Xiaomi Miot Auto")]),_:1}),t("。")]),e("li",null,[e("a",J,[t("Monica"),o(n)]),t(":Monica 允许人们记录所有关于朋友和家人的重要事情。喜欢和他们一起的活动。你最后一次打电话给某人的时候,你们谈了些什么。它会帮助你记住他们孩子的名字和年龄。它还能提醒你打电话给一个很久没联系的人。Monica 的容器设置查看 "),e("a",K,[t("Monica Docker"),o(n)]),t("。"),W,t(" 是它常年的一个 bug,可以通过指定数据库中的 users.me_contact_id 来解决。")]),e("li",null,[e("a",Q,[t("supermanito/Helloworld"),o(n)]),t(":京东签到等脚本,功能很强大,没怎么研究。")]),e("li",null,[e("a",Z,[t("ubuntu-desktop-lxde-vnc"),o(n)]),t(":能在 Docker 上运行的 Ubuntu 桌面版,适合挂载要长期运行的程序。测试 OBS 时,对内存要求不高,但 CPU 直冲 100%,fps 只有 7。")]),e("li",null,[e("a",ee,[t("RustDesk"),o(n)]),t(":自建远程桌面,平替 TeamViewer 的开源软件。矿神源有套件,可直接部署中继服务器。")])]),te,e("ul",null,[oe,e("li",null,[e("a",ne,[t("兰空图床"),o(n)]),t(":图床已经部署在七牛云,用 Picgo 上传,没感觉有必要用它。")]),e("li",null,[e("a",re,[t("AutoBangumi"),o(n)]),t(":自动追番器,用以替代自我审查的 Bilibili。")]),e("li",null,[e("a",ae,[t("nas-tools"),o(n)]),t(":号称能自动整理文件,但测试识别中很容易出错,暂不考虑。")]),se]),le,ie,e("p",null,[e("a",ce,[t("tinyMediaManager"),o(n)]),t(" v4 免费版足够个人使用,v3 作偶尔补充使用,搜索首选语言改为「大陆简体」更精准。"),de]),he,e("section",ue,[e("ol",_e,[e("li",pe,[e("p",null,[e("a",fe,[t("群晖 NAS 使用 Emby+tMM 打造全平台观影畅爽体验(附下载地址)"),o(n)]),t(),be])]),e("li",me,[e("p",null,[e("a",ke,[t("如何把群晖 NAS 上的套件搬到另外个硬盘上"),o(n)]),t(),ge])]),e("li",ve,[e("p",null,[e("a",we,[t("群晖 NAS 跨存储空间移动共享文件夹 (NAS 新增磁盘)"),o(n)]),t(),Se])])])])])}const De=i(h,[["render",xe],["__file","NAS.html.vue"]]);export{De as default}; +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as c,c as d,a as e,b as t,d as o,w as a,e as l}from"./app-91ee3df5.js";const h={},u=e("p",null,"NAS 主要用于 Docker 服务、影视管理和文件存储备用这三方面。群晖 NAS 在使用前,注意以下几点:",-1),_=e("ul",null,[e("li",null,"选择「控制面板」>「文件服务」>「SMB」>「高级设置」,将最小 SMB 协议 设为 SMB1,避免部分应用发现了 NAS 但无法打开共享文件。"),e("li",null,"选择「控制面板」>「任务计划」>「新增」>「计划的任务」>「用户定义的脚本」,给 NAS 建立定时任务脚本。"),e("li",null,"SSD 缓存对家用的 NAS 性能提升不大,没必要加。"),e("li",null,"群晖系统分布在所有硬盘,拔出一个不影响使用。但应用会有影响?"),e("li",null,"NAS Docker 建议指定本地端口,否则重启容器会让端口发生改变,重启不会不影响 docker 配置。"),e("li",null,"升级容器镜像,不影响内部数据库。群晖的「Docker 导出」只会导出安装镜像和配置,但不包括容器内部使用的数据库,用处不大。")],-1),p=e("h2",{id:"nas-套件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#nas-套件","aria-hidden":"true"},"#"),t(" NAS 套件")],-1),f={href:"https://spk7.imnks.com/",target:"_blank",rel:"noopener noreferrer"},b=l('
        • DS/Transmission:用于 PT 下载 (禁用 DHT,半小时停止做种)。
        • Synology Drive Server:电脑文件备份。
        • Hyper Backup:本地多硬盘备份,防止一个硬盘丢失后重要文件损坏,比如 docker 容器的本地配置文件夹。
        • Surveillance Station:管理 IP 摄像机以保护您的家庭和办公环境。借助 Surveillance Station,您可以透过网络浏览器,VisualStation 或移动设备观看和记录实时视频,设置定时记录,回放记录的视频,从而实现远程监控。发生重要事件时,您也会收到通知。注意,摄像头需支持 ONVIF 协议

        Docker 容器

        常用

        ',3),m={href:"https://registry.hub.docker.com/r/linuxserver/qbittorrent/",target:"_blank",rel:"noopener noreferrer"},k=e("code",null,"BitTorrent - DHT",-1),g={href:"https://blog.csdn.net/weixin_45120915/article/details/114691473",target:"_blank",rel:"noopener noreferrer"},v={href:"https://github.com/AragonSnow/qiandao",target:"_blank",rel:"noopener noreferrer"},w={href:"https://github.com/ckx000/get-cookies",target:"_blank",rel:"noopener noreferrer"},S=e("li",null,[e("a",{href:"/services/dockers-on-nas/mt-photos"},"MT Photos"),t(":支持自动整理、分类您的照片,比如:时间、地点、人物、照片类型。需要 99 元买断服务,每周连线检查授权状态。比较喜欢的是,支持网页分享特定图片影集,适合将宝宝照片批量分享给家人。")],-1),x={href:"https://docs.photoprism.app/",target:"_blank",rel:"noopener noreferrer"},A={href:"https://github.com/immich-app/immich",target:"_blank",rel:"noopener noreferrer"},N={href:"https://containrrr.dev/watchtower/",target:"_blank",rel:"noopener noreferrer"},T=e("ul",null,[e("li",null,[t("监控指定名称的镜像:"),e("code",null,"docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --run-once nginx redis"),t("。本案例只更新名为「nginx」和「redis」的容器,其他容器将被忽略。")]),e("li",null,[t("指定容器的 compose 命令中添加 lable "),e("code",null,"com.centurylinklabs.watchtower.enable=false"),t(",可禁止该容器的监控和更新。")])],-1),y=e("h3",{id:"资讯",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#资讯","aria-hidden":"true"},"#"),t(" 资讯")],-1),D=e("li",null,"RSSHub:无需保存数据,pubData 为 GMT 时区,普通用户无法更改,Docker Timezone 设置也不会有改变。",-1),B=e("li",null,"Huginn:定期备份抓取脚本,数据库保存在本地。",-1),E={href:"https://registry.hub.docker.com/r/wangqiru/mercury-parser-api",target:"_blank",rel:"noopener noreferrer"},M=e("li",null,[t("Cloudflare Tunnels:可以将局域网内容转发到外网。不过,每次容器重启后都需要重新构建,"),e("code",null,"sudo docker run --name cloudflared -d --restart unless-stopped cloudflare/cloudflared:latest tunnel --no-autoupdate run --token [Your Tokens]"),t("。后期考虑是否将启动命令放入容器。")],-1),P={href:"https://github.com/easychen/checkchan-dist",target:"_blank",rel:"noopener noreferrer"},z={href:"https://github.com/dgtlmoon/changedetection.io",target:"_blank",rel:"noopener noreferrer"},R=e("h3",{id:"娱乐",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#娱乐","aria-hidden":"true"},"#"),t(" 娱乐")],-1),H={href:"https://github.com/alist-org/alist",target:"_blank",rel:"noopener noreferrer"},I={href:"https://www.navidrome.org/docs/installation/docker/",target:"_blank",rel:"noopener noreferrer"},$={href:"https://github.com/Difegue/LANraragi",target:"_blank",rel:"noopener noreferrer"},C={href:"https://github.com/Difegue/LANraragi/blob/32cc991e8c5bae3bbd57d163278048c50159ae9f/tools/Documentation/advanced-usage/external-readers.md",target:"_blank",rel:"noopener noreferrer"},L=e("li",null,[e("a",{href:"/services/dockers-on-nas/tachidesk"},"Tachidesk"),t(":开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extensions,点右上角的 Enabled Languages 按钮,设置为中文源,然后会在页面底部发现中文漫画源。安装源后,进入 Souces 中点击进入对应源。")],-1),q=e("li",null,[e("a",{href:"/services/dockers-on-nas/reader"},"reader"),t(":阅读 3 的服务器版,摆脱客户端,网页版即可查看。自定义替换进入文章页面左侧的「设置」-「过滤规则管理」。")],-1),V={href:"https://github.com/talebook/talebook",target:"_blank",rel:"noopener noreferrer"},j={href:"https://github.com/zzcabc/Docker_Buildx_Danmuji",target:"_blank",rel:"noopener noreferrer"},F={href:"https://hub.docker.com/r/makedie/noname_kill",target:"_blank",rel:"noopener noreferrer"},G={href:"https://hub.docker.com/r/gswxy/gswxy",target:"_blank",rel:"noopener noreferrer"},O={href:"https://www.gswxy.com/?p=67",target:"_blank",rel:"noopener noreferrer"},X=e("h3",{id:"自动化",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#自动化","aria-hidden":"true"},"#"),t(" 自动化")],-1),U={href:"https://blog.csdn.net/alex_yangchuansheng/article/details/122295193",target:"_blank",rel:"noopener noreferrer"},Y={href:"https://www.home-assistant.io/",target:"_blank",rel:"noopener noreferrer"},J={href:"https://github.com/monicahq/monica",target:"_blank",rel:"noopener noreferrer"},K={href:"https://github.com/monicahq/docker",target:"_blank",rel:"noopener noreferrer"},W=e("code",null,"Me as a contact",-1),Q={href:"https://supermanito.github.io/Helloworld/#/",target:"_blank",rel:"noopener noreferrer"},Z={href:"https://registry.hub.docker.com/r/dorowu/ubuntu-desktop-lxde-vnc",target:"_blank",rel:"noopener noreferrer"},ee={href:"https://rustdesk.com/zh/",target:"_blank",rel:"noopener noreferrer"},te=e("h3",{id:"待了解",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#待了解","aria-hidden":"true"},"#"),t(" 待了解")],-1),oe=e("li",null,"Nextcloud: 私有云盘,完成 PC 端文件同步、版本控制,提供 web 端、移动端 app。",-1),ne={href:"https://github.com/lsky-org/lsky-pro",target:"_blank",rel:"noopener noreferrer"},re={href:"https://github.com/EstrellaXD/Auto_Bangumi",target:"_blank",rel:"noopener noreferrer"},ae={href:"https://github.com/jxxghp/nas-tools/wiki/%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B",target:"_blank",rel:"noopener noreferrer"},se=e("li",null,"Clash:代理服务器。",-1),le=e("h2",{id:"影视整理",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#影视整理","aria-hidden":"true"},"#"),t(" 影视整理")],-1),ie=e("p",null,"下载文件后,用 tinyMediaManager 重命名并下载 NFO 和影视封面,最后放置于分类文件夹。",-1),ce={href:"https://www.tinymediamanager.org/download/",target:"_blank",rel:"noopener noreferrer"},de=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote1"},"[1]"),e("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),he=l('
        # 电视节目重命名规则\n季文件夹名:Season ${seasonNr}\n剧集档案名:${showTitle} - S${seasonNr2}E${episodeNr2} - ${title}\n\n# 当只有一季时,则更改重命名规则\n季文件夹名:为空时,会自动调用默认值\n剧集档案名:${showTitle} - E${episodeNr2}\n\n# 多季,有标题时\n剧集档案名:${showTitle} - E${episodeNr2} - ${title}\n

        NAS 硬盘

        插入新硬盘,新建储存空间,使用 Btrfs 或 Basic 格式。SHR 是群晖的智能 RAID 格式,不适用于硬盘容量不同的情况。

        硬盘容量到期时间(5 年)
        硬盘 110T2025-06-18
        硬盘 24T2023-01-24
        硬盘 314T2027-02-11
        硬盘 48T2026-01-06
        冷备份2T2014-10

        换下的机械硬盘做冷备份,存储照片等长期数据。

        硬盘临期后,用大容量硬盘替换。选择「存储池」>「更改 RAID 类型」,无损转换 basic 到 Raid1。不过,不同容量硬盘组 RAID,只能以最小磁盘容量计使用空间。

        更换硬盘后,注意将数据连同文件夹用 file station 复制过去 (按住 Shift 选中所有你要的文件点右键 移动到...),关机卸载旧盘。如果该硬盘涉及套件位置,注意检查设置。[2]

        共享文件迁移:选择「控制面板」>「共享文件夹」,把你的共享文件夹位置修改到新储存空间。[3]


        ',9),ue={class:"footnotes"},_e={class:"footnotes-list"},pe={id:"footnote1",class:"footnote-item"},fe={href:"https://post.smzdm.com/p/a0d67m2z/",target:"_blank",rel:"noopener noreferrer"},be=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),me={id:"footnote2",class:"footnote-item"},ke={href:"https://www.bigzhang.com/3264.html",target:"_blank",rel:"noopener noreferrer"},ge=e("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1),ve={id:"footnote3",class:"footnote-item"},we={href:"https://blog.csdn.net/hilaryfrank/article/details/109722319",target:"_blank",rel:"noopener noreferrer"},Se=e("a",{href:"#footnote-ref3",class:"footnote-backref"},"↩︎",-1);function xe(Ae,Ne){const n=s("ExternalLinkIcon"),r=s("RouterLink");return c(),d("div",null,[u,_,p,e("p",null,[t("除了官方套件源,我会加上 "),e("a",f,[t("DSM7.x 矿神 SPK 套件源"),o(n)]),t("。")]),b,e("ul",null,[e("li",null,[e("a",m,[t("qbittorrent"),o(n)]),t(":需修改所有默认端口,否则容易报错。PT 下载关闭 "),k,t(" 和其他隐私选项,半小时停止做种,将下载文件添加 Everyone 权限,其他设置参考"),e("a",g,[t("群晖使用 qbittorrent"),o(n)]),t("。")]),e("li",null,[e("a",v,[t("qiandao"),o(n)]),t(":自动签到开源框架,需搭配浏览器扩展 "),e("a",w,[t("get-cookies"),o(n)]),t(" 使用,可导出配置。")]),S,e("li",null,[e("a",x,[t("PhotoPrism"),o(n)]),t(":基于 ai 私有化部署的个人相册,但实际很多照片无法识别,无法对外分享。如果部署时出错,则尝试删除数据库文件夹下的内容。地点标记功能非常强大,类似本地版 Google Photos。")]),e("li",null,[e("a",A,[t("Immich"),o(n)]),t(": 相册备份、浏览,提供 web 端、移动端 app。但不支持扫描已有文件。")]),e("li",null,[e("a",N,[t("watchtower"),o(n)]),t(":监控并更新 Docker 容器。 "),T])]),y,e("ul",null,[D,B,e("li",null,[t("Tiny Tiny RSS:定期备份订阅源和设置,自动更新,可配置全文插件 "),e("a",E,[t("mercury-parser-api"),o(n)]),t("。")]),M,e("li",null,[e("a",P,[t("Check 酱"),o(n)]),t(":监测网页内容变化,并发送异动到微信。亦支持 http status、json 和 rss 监测。配合自架云端,关电脑后也能运行。同类工具有 "),e("a",z,[t("changedetection.io"),o(n)]),t("。")])]),R,e("ul",null,[e("li",null,[e("a",H,[t("AList"),o(n)]),t(":开源的网盘管理工具,还支持对象存储,本地存储,FTP 等等。")]),e("li",null,[e("a",I,[t("Navidrome"),o(n)]),t(":NAS 上的私人专属在线音乐库。")]),e("li",null,[o(r,{to:"/services/dockers-on-nas/"},{default:a(()=>[t("Emby")]),_:1}),t("/Plex:这两者都是热门的视频流媒体解决方案。终身会员的价格为 119 美元。Jellyfin 作为一个开源免费的选择,同样是一个不错的考虑。")]),e("li",null,[e("a",$,[t("LANraragi"),o(n)]),t(":免费开源的漫画管理器,支持 zip/rar/targz/lzma/7z/xz/cbz/cbr/pdf 多种格式,可从网页和 "),e("a",C,[t("第三方客户端"),o(n)]),t(" 浏览。")]),L,q,e("li",null,[e("a",V,[t("Tale Book"),o(n)]),t(":基于 Calibre 的简单的个人图书管理系统,支持在线阅读,但阅读体验不强且 Bug 较多,个人更喜欢直接用 PC 端查看。")]),e("li",null,[e("a",j,[t("Bilibili_Danmuji"),o(n)]),t(":B 站直播礼物答谢、定时广告、关注感谢,自动回复工具,房管工具,自动打卡,Bilibili 直播弹幕姬 (使用 websocket 协议),java 版 B 站弹幕姬。部署 Docker 时需更新 jdr release 文件。")]),e("li",null,[e("a",F,[t("无名杀"),o(n)]),t(":部署在 NAS 上的三国杀游戏。")]),e("li",null,[e("a",G,[t("GSWXY - 魔兽世界单机服务端"),o(n)]),t(":需要 2G 内存和 20G 硬盘空间。你也可以直接使用"),e("a",O,[t("耳语海岸 RP 服"),o(n)]),t("。")])]),X,e("ul",null,[e("li",null,[e("a",U,[t("n8n"),o(n)]),t(":开源 IFTTT 工具,偏重于云服务。")]),e("li",null,[o(r,{to:"/family/HomeAutomation.html#node-red"},{default:a(()=>[t("Node-RED")]),_:1}),t(":开源流处理,类似本地版的 IFTTT。")]),e("li",null,[e("a",Y,[t("Home Assistant"),o(n)]),t(":开源家庭自动化平台,可自定义集中管理各品牌的智能家居设备。米家设备需使用 hacs 下的集成 "),o(r,{to:"/family/HomeAutomation.html#home-assistant"},{default:a(()=>[t("Xiaomi Miot Auto")]),_:1}),t("。")]),e("li",null,[e("a",J,[t("Monica"),o(n)]),t(":Monica 允许人们记录所有关于朋友和家人的重要事情。喜欢和他们一起的活动。你最后一次打电话给某人的时候,你们谈了些什么。它会帮助你记住他们孩子的名字和年龄。它还能提醒你打电话给一个很久没联系的人。Monica 的容器设置查看 "),e("a",K,[t("Monica Docker"),o(n)]),t("。"),W,t(" 是它常年的一个 bug,可以通过指定数据库中的 users.me_contact_id 来解决。")]),e("li",null,[e("a",Q,[t("supermanito/Helloworld"),o(n)]),t(":京东签到等脚本,功能很强大,没怎么研究。")]),e("li",null,[e("a",Z,[t("ubuntu-desktop-lxde-vnc"),o(n)]),t(":能在 Docker 上运行的 Ubuntu 桌面版,适合挂载要长期运行的程序。测试 OBS 时,对内存要求不高,但 CPU 直冲 100%,fps 只有 7。")]),e("li",null,[e("a",ee,[t("RustDesk"),o(n)]),t(":自建远程桌面,平替 TeamViewer 的开源软件。矿神源有套件,可直接部署中继服务器。")])]),te,e("ul",null,[oe,e("li",null,[e("a",ne,[t("兰空图床"),o(n)]),t(":图床已经部署在七牛云,用 Picgo 上传,没感觉有必要用它。")]),e("li",null,[e("a",re,[t("AutoBangumi"),o(n)]),t(":自动追番器,用以替代自我审查的 Bilibili。")]),e("li",null,[e("a",ae,[t("nas-tools"),o(n)]),t(":号称能自动整理文件,但测试识别中很容易出错,暂不考虑。")]),se]),le,ie,e("p",null,[e("a",ce,[t("tinyMediaManager"),o(n)]),t(" v4 免费版足够个人使用,v3 作偶尔补充使用,搜索首选语言改为「大陆简体」更精准。"),de]),he,e("section",ue,[e("ol",_e,[e("li",pe,[e("p",null,[e("a",fe,[t("群晖 NAS 使用 Emby+tMM 打造全平台观影畅爽体验(附下载地址)"),o(n)]),t(),be])]),e("li",me,[e("p",null,[e("a",ke,[t("如何把群晖 NAS 上的套件搬到另外个硬盘上"),o(n)]),t(),ge])]),e("li",ve,[e("p",null,[e("a",we,[t("群晖 NAS 跨存储空间移动共享文件夹 (NAS 新增磁盘)"),o(n)]),t(),Se])])])])])}const De=i(h,[["render",xe],["__file","NAS.html.vue"]]);export{De as default}; diff --git a/assets/NewSystem.html-3c29d577.js b/assets/NewSystem.html-ea9c350c.js similarity index 99% rename from assets/NewSystem.html-3c29d577.js rename to assets/NewSystem.html-ea9c350c.js index 5fbb8725..6eeeb6c7 100644 --- a/assets/NewSystem.html-3c29d577.js +++ b/assets/NewSystem.html-ea9c350c.js @@ -1 +1 @@ -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as s,c as a,a as e,b as t,d as o,w as h,e as c}from"./app-98132e77.js";const _={},d=e("h2",{id:"重装准备",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#重装准备","aria-hidden":"true"},"#"),t(" 重装准备")],-1),u={href:"https://gpt-vip.top/apps/Applist.html",target:"_blank",rel:"noopener noreferrer"},p=e("code",null,"C:\\Users\\Benson\\AppData\\Local\\Packages\\TencentWeChatLimited.forWindows10_sdtnhv12zgd7a\\LocalCache\\Roaming\\Tencent\\WeChatAppStore",-1),f=e("li",null,"核对群晖已同步到最新备份。",-1),g=e("li",null,"反激活已购软件,如:Eagle、MoneyWiz、妙笔。",-1),w={href:"https://www.microsoft.com/zh-cn/software-download/windows11",target:"_blank",rel:"noopener noreferrer"},m=e("h2",{id:"安装系统",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#安装系统","aria-hidden":"true"},"#"),t(" 安装系统")],-1),E=e("strong",null,"NTFS/exFAT",-1),k={href:"https://www.itsk.com/thread-428078-1-1.html",target:"_blank",rel:"noopener noreferrer"},b={href:"https://www.wepe.com.cn/",target:"_blank",rel:"noopener noreferrer"},A=e("p",null,"使用 U 盘引导安装系统:",-1),S=e("ul",null,[e("li",null,"本地安装:右键 ISO 文件,选择挂载;在新出现的驱动器中,找到 setup.exe,直接运行;选择「现在安装」。"),e("li",null,[t("引导安装:采用 UEFI+GPT。如果是自定义安装清空系统盘所有分区后,一定要用 "),e("strong",null,"GPT"),t(" 对系统盘分区。")])],-1),x=e("h2",{id:"系统配置",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#系统配置","aria-hidden":"true"},"#"),t(" 系统配置")],-1),C=e("li",null,"将电脑调整到高性能/卓越模式。",-1),v=e("li",null,"将 Documents、Desktop 转移到 D 盘。",-1),y=e("li",null,"任务栏:在任务栏底部右键单击,选择「任务栏设置」>「通知区域」>「选择哪些图标显示在任务栏上」;在同页面的「多显示器设置」中,取消「在所有显示器上显示任务栏」。",-1),T={href:"https://zhuanlan.zhihu.com/p/25942015",target:"_blank",rel:"noopener noreferrer"},D={href:"https://gpt-vip.top/posts/2017-09-02-forced_shutdown.html",target:"_blank",rel:"noopener noreferrer"},L=c("
      64. Everything 注册右键搜索当前路径;右键清除。
        • win+r,regedit 打开注册表,打开路径 HKEY_CLASSES_ROOT\\Directory\\Background\\shell
        • 新建项,命名随意(即右键菜单显示的文字)-「Everything 搜索当前路径」。
        • 右键再次新建项,命名 Command,打开修改右侧默认值为 "D:\\Everything\\Everything.exe" -path "."
      65. 显示屏参数:屏幕换线或换主机,参数可能会变动。
        • 左侧:自定义颜色,红 70 绿 75 蓝 50;亮度 66,对比 75。
        • 右侧 0020:自定义颜色,红 70 绿 75 蓝 50;亮度 50,对比 80。
      66. ",2),B=e("h2",{id:"安装应用",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#安装应用","aria-hidden":"true"},"#"),t(" 安装应用")],-1),N={href:"https://gpt-vip.top/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html",target:"_blank",rel:"noopener noreferrer"},W={href:"https://www.iplaysoft.com/win11-wsa.html",target:"_blank",rel:"noopener noreferrer"},P=e("li",null,"Synology Drive:设置 NAS 本地备份;",-1),R=e("li",null,"Mircrosoft Store:Snipaste、微信 For Windows;",-1),F=e("li",null,"绿色开机:Keepass、Ditto、RunAny、天若 OCR;WPS 安装宏;",-1),O=e("li",null,"配置:Eagle、RIME、Picgo、wonderpen;",-1),U=e("li",null,[t("firefox-about:config 修改原值 18 的 "),e("code",null,"ui.key.menuAccessKey"),t(" 为 0,以屏蔽 alt 防止热键冲突;选择「options」>「Network Settings」,取消勾选「DNS over HTTPS」;")],-1),V={href:"https://github.com/tutugreen/Huorong-Rules/tree/main/Tencent",target:"_blank",rel:"noopener noreferrer"},z=e("h2",{id:"修改按键",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#修改按键","aria-hidden":"true"},"#"),t(" 修改按键")],-1),H=e("ul",null,[e("li",null,"Powertoys:将 insert 键改为 backspace;"),e("li",null,"Option:计算器改为「上一个桌面」;右键菜单改为「下一个桌面」。")],-1),I=e("h2",{id:"常见问题",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#常见问题","aria-hidden":"true"},"#"),t(" 常见问题")],-1),q=e("li",null,"Win11 本地账户也被提示需要登录密码,但设置密码后,无法直接开机登录。设置新密码后,点击「设置」>「账户」>「登录选项」>「密码」,可以重新设置空密码,实现自动登录。",-1),G={href:"https://dandelioncloud.cn/article/details/1569126817577791489",target:"_blank",rel:"noopener noreferrer"},M=e("li",null,"英语键盘删不掉:添加英语语言包,然后再删除,英语键盘也会一起删除。",-1),K=e("li",null,"右键更改前先备份注册表,有几率会影响系统稳定性。",-1),J={href:"https://vb-audio.com/Cable/",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://autoaigpt.cn/watch?v=1DsrniDGOJQ",target:"_blank",rel:"noopener noreferrer"};function Y(j,X){const n=l("ExternalLinkIcon"),r=l("RouterLink");return s(),a("div",null,[d,e("ul",null,[e("li",null,[t("备份"),e("a",u,[t("必备应用"),o(n)]),t(",油猴脚本,输入法配置,UMP 版微信聊天记录 "),p,t("。")]),f,g,e("li",null,[t("更新"),e("a",w,[t("原版镜像"),o(n)]),t("。")])]),m,e("p",null,[t("系统重装/维修前,在 "),E,t(" 格式的 U 盘上安装"),e("a",k,[t("优启通"),o(n)]),t("或"),e("a",b,[t("微 PE 工具箱"),o(n)]),t("。Windows 10/11 镜像超过 4GB,已经不再支持 FAT32 格式的 U 盘。")]),A,S,x,e("ul",null,[C,v,y,e("li",null,[e("a",T,[t("清理导航栏"),o(n)]),t("。")]),e("li",null,[e("a",D,[t("设置系统强制关机"),o(n)]),t(",防止系统关机不成功。")]),L]),B,e("ul",null,[e("li",null,[e("a",N,[t("winstall"),o(n)]),t(" 批量安装应用;")]),e("li",null,[t("电脑运行 Android 手机应用,"),e("a",W,[t("Win11 安卓子系统"),o(n)]),t(" (WSA) 安装;")]),P,R,F,O,U,e("li",null,[t("火绒-安全设置-高级防护-导入隐私规则,增加"),e("a",V,[t("腾讯屏蔽规则"),o(n)]),t("。")])]),z,H,I,e("ul",null,[q,e("li",null,[e("a",G,[t("WSL 从 C 盘迁移至 D 盘的简单实用方法"),o(n)])]),M,K,e("li",null,[t("实时将音频转文字:管理员方式安装 "),e("a",J,[t("VB-CABLE"),o(n)]),t(",输入输出设备都选 VB-CABLE,详细设置查看 "),e("a",Q,[t("How to Convert Audio to Text - FREE & No Time Limits"),o(n)]),t("。")]),e("li",null,[t("开机用"),o(r,{to:"/code/AutoHotkey.html#%E7%AE%A1%E7%90%86%E5%91%98%E6%9D%83%E9%99%90%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC"},{default:h(()=>[t("管理员权限启动脚本")]),_:1}),t("。")])])])}const ee=i(_,[["render",Y],["__file","NewSystem.html.vue"]]);export{ee as default}; +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as s,c as a,a as e,b as t,d as o,w as h,e as c}from"./app-91ee3df5.js";const _={},d=e("h2",{id:"重装准备",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#重装准备","aria-hidden":"true"},"#"),t(" 重装准备")],-1),u={href:"https://gpt-vip.top/apps/Applist.html",target:"_blank",rel:"noopener noreferrer"},p=e("code",null,"C:\\Users\\Benson\\AppData\\Local\\Packages\\TencentWeChatLimited.forWindows10_sdtnhv12zgd7a\\LocalCache\\Roaming\\Tencent\\WeChatAppStore",-1),f=e("li",null,"核对群晖已同步到最新备份。",-1),g=e("li",null,"反激活已购软件,如:Eagle、MoneyWiz、妙笔。",-1),w={href:"https://www.microsoft.com/zh-cn/software-download/windows11",target:"_blank",rel:"noopener noreferrer"},m=e("h2",{id:"安装系统",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#安装系统","aria-hidden":"true"},"#"),t(" 安装系统")],-1),E=e("strong",null,"NTFS/exFAT",-1),k={href:"https://www.itsk.com/thread-428078-1-1.html",target:"_blank",rel:"noopener noreferrer"},b={href:"https://www.wepe.com.cn/",target:"_blank",rel:"noopener noreferrer"},A=e("p",null,"使用 U 盘引导安装系统:",-1),S=e("ul",null,[e("li",null,"本地安装:右键 ISO 文件,选择挂载;在新出现的驱动器中,找到 setup.exe,直接运行;选择「现在安装」。"),e("li",null,[t("引导安装:采用 UEFI+GPT。如果是自定义安装清空系统盘所有分区后,一定要用 "),e("strong",null,"GPT"),t(" 对系统盘分区。")])],-1),x=e("h2",{id:"系统配置",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#系统配置","aria-hidden":"true"},"#"),t(" 系统配置")],-1),C=e("li",null,"将电脑调整到高性能/卓越模式。",-1),v=e("li",null,"将 Documents、Desktop 转移到 D 盘。",-1),y=e("li",null,"任务栏:在任务栏底部右键单击,选择「任务栏设置」>「通知区域」>「选择哪些图标显示在任务栏上」;在同页面的「多显示器设置」中,取消「在所有显示器上显示任务栏」。",-1),T={href:"https://zhuanlan.zhihu.com/p/25942015",target:"_blank",rel:"noopener noreferrer"},D={href:"https://gpt-vip.top/posts/2017-09-02-forced_shutdown.html",target:"_blank",rel:"noopener noreferrer"},L=c("
      67. Everything 注册右键搜索当前路径;右键清除。
        • win+r,regedit 打开注册表,打开路径 HKEY_CLASSES_ROOT\\Directory\\Background\\shell
        • 新建项,命名随意(即右键菜单显示的文字)-「Everything 搜索当前路径」。
        • 右键再次新建项,命名 Command,打开修改右侧默认值为 "D:\\Everything\\Everything.exe" -path "."
      68. 显示屏参数:屏幕换线或换主机,参数可能会变动。
        • 左侧:自定义颜色,红 70 绿 75 蓝 50;亮度 66,对比 75。
        • 右侧 0020:自定义颜色,红 70 绿 75 蓝 50;亮度 50,对比 80。
      69. ",2),B=e("h2",{id:"安装应用",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#安装应用","aria-hidden":"true"},"#"),t(" 安装应用")],-1),N={href:"https://gpt-vip.top/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html",target:"_blank",rel:"noopener noreferrer"},W={href:"https://www.iplaysoft.com/win11-wsa.html",target:"_blank",rel:"noopener noreferrer"},P=e("li",null,"Synology Drive:设置 NAS 本地备份;",-1),R=e("li",null,"Mircrosoft Store:Snipaste、微信 For Windows;",-1),F=e("li",null,"绿色开机:Keepass、Ditto、RunAny、天若 OCR;WPS 安装宏;",-1),O=e("li",null,"配置:Eagle、RIME、Picgo、wonderpen;",-1),U=e("li",null,[t("firefox-about:config 修改原值 18 的 "),e("code",null,"ui.key.menuAccessKey"),t(" 为 0,以屏蔽 alt 防止热键冲突;选择「options」>「Network Settings」,取消勾选「DNS over HTTPS」;")],-1),V={href:"https://github.com/tutugreen/Huorong-Rules/tree/main/Tencent",target:"_blank",rel:"noopener noreferrer"},z=e("h2",{id:"修改按键",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#修改按键","aria-hidden":"true"},"#"),t(" 修改按键")],-1),H=e("ul",null,[e("li",null,"Powertoys:将 insert 键改为 backspace;"),e("li",null,"Option:计算器改为「上一个桌面」;右键菜单改为「下一个桌面」。")],-1),I=e("h2",{id:"常见问题",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#常见问题","aria-hidden":"true"},"#"),t(" 常见问题")],-1),q=e("li",null,"Win11 本地账户也被提示需要登录密码,但设置密码后,无法直接开机登录。设置新密码后,点击「设置」>「账户」>「登录选项」>「密码」,可以重新设置空密码,实现自动登录。",-1),G={href:"https://dandelioncloud.cn/article/details/1569126817577791489",target:"_blank",rel:"noopener noreferrer"},M=e("li",null,"英语键盘删不掉:添加英语语言包,然后再删除,英语键盘也会一起删除。",-1),K=e("li",null,"右键更改前先备份注册表,有几率会影响系统稳定性。",-1),J={href:"https://vb-audio.com/Cable/",target:"_blank",rel:"noopener noreferrer"},Q={href:"https://autoaigpt.cn/watch?v=1DsrniDGOJQ",target:"_blank",rel:"noopener noreferrer"};function Y(j,X){const n=l("ExternalLinkIcon"),r=l("RouterLink");return s(),a("div",null,[d,e("ul",null,[e("li",null,[t("备份"),e("a",u,[t("必备应用"),o(n)]),t(",油猴脚本,输入法配置,UMP 版微信聊天记录 "),p,t("。")]),f,g,e("li",null,[t("更新"),e("a",w,[t("原版镜像"),o(n)]),t("。")])]),m,e("p",null,[t("系统重装/维修前,在 "),E,t(" 格式的 U 盘上安装"),e("a",k,[t("优启通"),o(n)]),t("或"),e("a",b,[t("微 PE 工具箱"),o(n)]),t("。Windows 10/11 镜像超过 4GB,已经不再支持 FAT32 格式的 U 盘。")]),A,S,x,e("ul",null,[C,v,y,e("li",null,[e("a",T,[t("清理导航栏"),o(n)]),t("。")]),e("li",null,[e("a",D,[t("设置系统强制关机"),o(n)]),t(",防止系统关机不成功。")]),L]),B,e("ul",null,[e("li",null,[e("a",N,[t("winstall"),o(n)]),t(" 批量安装应用;")]),e("li",null,[t("电脑运行 Android 手机应用,"),e("a",W,[t("Win11 安卓子系统"),o(n)]),t(" (WSA) 安装;")]),P,R,F,O,U,e("li",null,[t("火绒-安全设置-高级防护-导入隐私规则,增加"),e("a",V,[t("腾讯屏蔽规则"),o(n)]),t("。")])]),z,H,I,e("ul",null,[q,e("li",null,[e("a",G,[t("WSL 从 C 盘迁移至 D 盘的简单实用方法"),o(n)])]),M,K,e("li",null,[t("实时将音频转文字:管理员方式安装 "),e("a",J,[t("VB-CABLE"),o(n)]),t(",输入输出设备都选 VB-CABLE,详细设置查看 "),e("a",Q,[t("How to Convert Audio to Text - FREE & No Time Limits"),o(n)]),t("。")]),e("li",null,[t("开机用"),o(r,{to:"/code/AutoHotkey.html#%E7%AE%A1%E7%90%86%E5%91%98%E6%9D%83%E9%99%90%E8%BF%90%E8%A1%8C%E8%84%9A%E6%9C%AC"},{default:h(()=>[t("管理员权限启动脚本")]),_:1}),t("。")])])])}const ee=i(_,[["render",Y],["__file","NewSystem.html.vue"]]);export{ee as default}; diff --git a/assets/Python.html-80e62696.js b/assets/Python.html-d265d3c8.js similarity index 99% rename from assets/Python.html-80e62696.js rename to assets/Python.html-d265d3c8.js index 06f0ccca..d6226d16 100644 --- a/assets/Python.html-80e62696.js +++ b/assets/Python.html-d265d3c8.js @@ -1,4 +1,4 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as c,c as l,a as n,b as s,d as t,e as p}from"./app-98132e77.js";const i={},u=n("p",null,"Python 很久没用了,暂时只做记录作用。",-1),r=n("h2",{id:"入门文档",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#入门文档","aria-hidden":"true"},"#"),s(" 入门文档")],-1),k={href:"http://www.runoob.com/python3/python3-basic-syntax.html",target:"_blank",rel:"noopener noreferrer"},d={href:"http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html#intro-tutorial",target:"_blank",rel:"noopener noreferrer"},m=n("br",null,null,-1),b={href:"https://requests.readthedocs.io/zh_CN/latest/",target:"_blank",rel:"noopener noreferrer"},v={href:"https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://openpyxl.readthedocs.io/en/stable/",target:"_blank",rel:"noopener noreferrer"},g=n("li",null,"Pillow 模块 - 图片",-1),y=n("li",null,"re 模块 - 正则表达式",-1),w=p(`

        简单示例

        import requests  #载入指定库
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as c,c as l,a as n,b as s,d as t,e as p}from"./app-91ee3df5.js";const i={},u=n("p",null,"Python 很久没用了,暂时只做记录作用。",-1),r=n("h2",{id:"入门文档",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#入门文档","aria-hidden":"true"},"#"),s(" 入门文档")],-1),k={href:"http://www.runoob.com/python3/python3-basic-syntax.html",target:"_blank",rel:"noopener noreferrer"},d={href:"http://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html#intro-tutorial",target:"_blank",rel:"noopener noreferrer"},m=n("br",null,null,-1),b={href:"https://requests.readthedocs.io/zh_CN/latest/",target:"_blank",rel:"noopener noreferrer"},v={href:"https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://openpyxl.readthedocs.io/en/stable/",target:"_blank",rel:"noopener noreferrer"},g=n("li",null,"Pillow 模块 - 图片",-1),y=n("li",null,"re 模块 - 正则表达式",-1),w=p(`

        简单示例

        import requests  #载入指定库
         headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0', 'Content-Type': 'text/html; charset=utf-8'}
         r = requests.get("<http://www.runoob.com/python3/python3-string.html>", headers=headers)
         #r.encoding = 'utf-8' #如果没设置表头,可以设置编码防止中文出现乱码
        diff --git a/assets/QTTabBar.html-abbe4161.js b/assets/QTTabBar.html-edc49d7a.js
        similarity index 97%
        rename from assets/QTTabBar.html-abbe4161.js
        rename to assets/QTTabBar.html-edc49d7a.js
        index 0d02d60c..7259254a 100644
        --- a/assets/QTTabBar.html-abbe4161.js
        +++ b/assets/QTTabBar.html-edc49d7a.js
        @@ -1 +1 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as i,c as l,a,b as e,d as r,e as s}from"./app-98132e77.js";const d={},h={href:"http://qttabbar.wikidot.com/",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/indiff/qttabbar",target:"_blank",rel:"noopener noreferrer"},b=s('

        目前两个版本都存在相同问题,菜单栏是灰色的选不了 QTTabBar,IE 管理加载项里是空的,第三方扩展也启用了。

        安装

        安装完成后,资源管理器地址栏->输入「控制面板」->按下 ALT->查看->工具栏->勾选「QTTabBar」,即可开启 QTTabBar。[1]

        有时选项里找不到 QTTabBar,这可能是因为你的 IE 浏览器禁止了第三方插件导致的。

        解决办法:打开 IE 浏览器,点击「设置」>「Internet 选项」>「高级」,勾选「启用第三方浏览器扩展」,重启后生效。如果重启之后还是没有找到 QTTabBar,则打开 IE 浏览器,选择「设置」>「管理加载项」,点击启用再确认一次。

        启用 QTTabBar 后,IE 浏览器可能变得怪怪的,别担心,把两片白色区域 x 掉,再次启动 IE 再 x 一次然后就恢复正常了。

        QTTabBar 失效

        2022.05 补丁 KB5012643 KB5012159 导致 QTTabBar 失效。

        管理员方式运行命令提示符 dism /online /enable-feature /featurename:netfx3 /all,执行完成重启电脑。

        常用设置

        QTTabBar 的选项非常强大,有空可以慢慢研究、打造自己趁手的多标签资源管理器。以下为常用的设置项,√ 表示启用,× 表示禁用。

        汉化

        对准多标签栏的空白处右键单击 QTTabBar Options,点击右侧带下载图标的 Download Language File 按钮。建议下载 Author 为 MCRy 的中文语言包,然后回到 QTTabBar Options,选择刚才下载的翻译文件,保存选项。再重新打开这个界面时,就是中文的了。

        选项卡/标签设置

        • × 添加“+”按钮到 选项卡栏(嫌丑。我们可以通过鼠标滚轮点击文件夹或左侧盘符来新建标签页
        • × 在选项卡上显示关闭按钮(嫌丑 x2。熟悉 Chrome 的都知道 Ctrl+W 关闭当前标签、滚轮点击标签也可关闭。这两种快捷方式在这里同样适用
        • √ 已锁定选项卡的行为 - 禁止关闭窗口(Ctrl+L 锁定标签,被锁定的标签无法被关闭。开启此项后整个窗口也无法被关闭,防止误操作
        • √ 按 Ctrl+Tab 显示选项卡切换器(挺好用

        窗口

        • √ 捕获窗口 - 通过 ShellExecuteHooks 捕获窗口(听说不开它 Win+E 就不显示 QTTabBar。

        鼠标事件

        • 互动 - 点击标签栏的 + 按钮,打开桌面。
        • 窗口和任务栏 - 窗口的关闭按钮 - 关闭窗口(这是 Clover 的遗留习惯吧。看个人爱好。

        预览

        • × 扩展、字体和颜色 - 删除掉一些视频文件格式(默认开启的视频预览没啥卵用,还会导致鼠标移动顿卡。

        群组

        • 建立群组,并将其设为启动群组。打开 expoloer 会自动启动。

        ',24),f={class:"footnotes"},p={class:"footnotes-list"},T={id:"footnote1",class:"footnote-item"},u={href:"https://github.com/indiff/qttabbar/wiki/Windows11%E5%AE%89%E8%A3%85qttabbar",target:"_blank",rel:"noopener noreferrer"},_=a("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function B(x,Q){const t=n("ExternalLinkIcon");return i(),l("div",null,[a("p",null,[e("QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的"),a("a",h,[e("原版 QTTabBar"),r(t)]),e("(闭源,更新慢),另一个是国内反编译出的"),a("a",c,[e("开源 QTTabBar"),r(t)]),e("。")]),b,a("section",f,[a("ol",p,[a("li",T,[a("p",null,[a("a",u,[e("Windows11 安装 qttabbar"),r(t)]),e(),_])])])])])}const E=o(d,[["render",B],["__file","QTTabBar.html.vue"]]);export{E as default}; +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as i,c as l,a,b as e,d as r,e as s}from"./app-91ee3df5.js";const d={},h={href:"http://qttabbar.wikidot.com/",target:"_blank",rel:"noopener noreferrer"},c={href:"https://github.com/indiff/qttabbar",target:"_blank",rel:"noopener noreferrer"},b=s('

        目前两个版本都存在相同问题,菜单栏是灰色的选不了 QTTabBar,IE 管理加载项里是空的,第三方扩展也启用了。

        安装

        安装完成后,资源管理器地址栏->输入「控制面板」->按下 ALT->查看->工具栏->勾选「QTTabBar」,即可开启 QTTabBar。[1]

        有时选项里找不到 QTTabBar,这可能是因为你的 IE 浏览器禁止了第三方插件导致的。

        解决办法:打开 IE 浏览器,点击「设置」>「Internet 选项」>「高级」,勾选「启用第三方浏览器扩展」,重启后生效。如果重启之后还是没有找到 QTTabBar,则打开 IE 浏览器,选择「设置」>「管理加载项」,点击启用再确认一次。

        启用 QTTabBar 后,IE 浏览器可能变得怪怪的,别担心,把两片白色区域 x 掉,再次启动 IE 再 x 一次然后就恢复正常了。

        QTTabBar 失效

        2022.05 补丁 KB5012643 KB5012159 导致 QTTabBar 失效。

        管理员方式运行命令提示符 dism /online /enable-feature /featurename:netfx3 /all,执行完成重启电脑。

        常用设置

        QTTabBar 的选项非常强大,有空可以慢慢研究、打造自己趁手的多标签资源管理器。以下为常用的设置项,√ 表示启用,× 表示禁用。

        汉化

        对准多标签栏的空白处右键单击 QTTabBar Options,点击右侧带下载图标的 Download Language File 按钮。建议下载 Author 为 MCRy 的中文语言包,然后回到 QTTabBar Options,选择刚才下载的翻译文件,保存选项。再重新打开这个界面时,就是中文的了。

        选项卡/标签设置

        • × 添加“+”按钮到 选项卡栏(嫌丑。我们可以通过鼠标滚轮点击文件夹或左侧盘符来新建标签页
        • × 在选项卡上显示关闭按钮(嫌丑 x2。熟悉 Chrome 的都知道 Ctrl+W 关闭当前标签、滚轮点击标签也可关闭。这两种快捷方式在这里同样适用
        • √ 已锁定选项卡的行为 - 禁止关闭窗口(Ctrl+L 锁定标签,被锁定的标签无法被关闭。开启此项后整个窗口也无法被关闭,防止误操作
        • √ 按 Ctrl+Tab 显示选项卡切换器(挺好用

        窗口

        • √ 捕获窗口 - 通过 ShellExecuteHooks 捕获窗口(听说不开它 Win+E 就不显示 QTTabBar。

        鼠标事件

        • 互动 - 点击标签栏的 + 按钮,打开桌面。
        • 窗口和任务栏 - 窗口的关闭按钮 - 关闭窗口(这是 Clover 的遗留习惯吧。看个人爱好。

        预览

        • × 扩展、字体和颜色 - 删除掉一些视频文件格式(默认开启的视频预览没啥卵用,还会导致鼠标移动顿卡。

        群组

        • 建立群组,并将其设为启动群组。打开 expoloer 会自动启动。

        ',24),f={class:"footnotes"},p={class:"footnotes-list"},T={id:"footnote1",class:"footnote-item"},u={href:"https://github.com/indiff/qttabbar/wiki/Windows11%E5%AE%89%E8%A3%85qttabbar",target:"_blank",rel:"noopener noreferrer"},_=a("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function B(x,Q){const t=n("ExternalLinkIcon");return i(),l("div",null,[a("p",null,[e("QTTabBar 让你在 Windows 资源管理器中使用 Tab 多标签功能。这款应用存在两个版本,一个是日本作者 @Quizo 的"),a("a",h,[e("原版 QTTabBar"),r(t)]),e("(闭源,更新慢),另一个是国内反编译出的"),a("a",c,[e("开源 QTTabBar"),r(t)]),e("。")]),b,a("section",f,[a("ol",p,[a("li",T,[a("p",null,[a("a",u,[e("Windows11 安装 qttabbar"),r(t)]),e(),_])])])])])}const E=o(d,[["render",B],["__file","QTTabBar.html.vue"]]);export{E as default}; diff --git a/assets/Regex.html-42ae96cc.js b/assets/Regex.html-dca6a805.js similarity index 99% rename from assets/Regex.html-42ae96cc.js rename to assets/Regex.html-dca6a805.js index c767e52b..5dcfe4ff 100644 --- a/assets/Regex.html-42ae96cc.js +++ b/assets/Regex.html-dca6a805.js @@ -1,4 +1,4 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as p,c,a as n,b as a,d as t,e as r}from"./app-98132e77.js";const d={},l=n("p",null,"正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。",-1),i={href:"https://deerchao.cn/tutorials/regex/regex.htm",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md",target:"_blank",rel:"noopener noreferrer"},k=r(`

        实用表达式

        {} 限定符 (表示固定位数)。比如:\\\\d{5} 匹配长度有 5 个的数字,\\\\d{1,5} 最少匹配 1 个,最长匹配 5 个数字。

        .{30,} 指匹配长度 30 以上的任意字符串。

        [aeiou] 匹配中括号中任意字符。
        [^aeiou] 匹配除了 aeiou 这几个字母以外的任意字符。

        HTTP 链接匹配:https?://[^\\s"。?,,?)#]+,句尾不含空格、中英文逗号、中文句号、问号,仅包含 http 和 https 链接

        万能链接匹配:[a-zA-Z]+://[^\\s"。?,,?)#]+ 匹配万能前缀,如 ftp、tencent、lark。

        匹配行:

        //匹配含某个字符的行
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as p,c,a as n,b as a,d as t,e as r}from"./app-91ee3df5.js";const d={},l=n("p",null,"正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。",-1),i={href:"https://deerchao.cn/tutorials/regex/regex.htm",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md",target:"_blank",rel:"noopener noreferrer"},k=r(`

        实用表达式

        {} 限定符 (表示固定位数)。比如:\\\\d{5} 匹配长度有 5 个的数字,\\\\d{1,5} 最少匹配 1 个,最长匹配 5 个数字。

        .{30,} 指匹配长度 30 以上的任意字符串。

        [aeiou] 匹配中括号中任意字符。
        [^aeiou] 匹配除了 aeiou 这几个字母以外的任意字符。

        HTTP 链接匹配:https?://[^\\s"。?,,?)#]+,句尾不含空格、中英文逗号、中文句号、问号,仅包含 http 和 https 链接

        万能链接匹配:[a-zA-Z]+://[^\\s"。?,,?)#]+ 匹配万能前缀,如 ftp、tencent、lark。

        匹配行:

        //匹配含某个字符的行
         var ZZMactch = ".*" + inputMatch.value + ".*";
         //匹配不含指定字符的行
         var ZZMactch = "^((?!"+inputMatch.value+").)*$";
        diff --git a/assets/SearchResult-c5292b0e.js b/assets/SearchResult-4a7e68c4.js
        similarity index 98%
        rename from assets/SearchResult-c5292b0e.js
        rename to assets/SearchResult-4a7e68c4.js
        index 2b26162c..814f0a84 100644
        --- a/assets/SearchResult-c5292b0e.js
        +++ b/assets/SearchResult-4a7e68c4.js
        @@ -1 +1 @@
        -import{u as U,g as ee,h as j,i as B,X as ae,j as le,k as se,l as x,m as D,n as te,p as M,q as l,s as _,v as F,x as I,y as re,z as ue,A as ie,B as ne,R as oe,O as ce,C as ve,D as pe,E as he,F as ye,G as de,H as me,I as b,J as fe}from"./app-98132e77.js";const ge="SEARCH_PRO_QUERY_HISTORY",y=U(ge,[]),He=()=>{const{queryHistoryCount:r}=b,n=r>0;return{enabled:n,queryHistory:y,addQueryHistory:t=>{n&&(y.value.length{y.value=[...y.value.slice(0,t),...y.value.slice(t+1)]}}},Re="SEARCH_PRO_RESULT_HISTORY",{resultHistoryCount:E}=b,d=U(Re,[]),Qe=()=>{const r=j(),n=E>0,t=s=>r.resolve({name:s.key,..."anchor"in s?{hash:`#${s.anchor}`}:{}}).fullPath;return{enabled:n,resultHistory:d,addResultHistory:s=>{if(n){const u={link:t(s),display:s.display};"header"in s&&(u.header=s.header),d.value.length{d.value=[...d.value.slice(0,s),...d.value.slice(s+1)]}}},ke=r=>{const n=oe(),t=B(),{search:s,terminate:u}=ce(),f=x(!1),g=ve([]);return pe(()=>{const m=()=>{g.value=[],f.value=!1},w=fe(H=>{f.value=!0,H?s({type:"search",query:H,locale:t.value,options:n}).then(h=>{g.value=h,f.value=!1}).catch(h=>{console.error(h),m()}):m()},b.searchDelay);M([r,t],()=>w(r.value),{immediate:!0}),he(()=>{u()})}),{searching:f,results:g}};var we=ee({name:"SearchResult",props:{query:{type:String,required:!0},isFocusing:Boolean},emits:["close","updateQuery"],setup(r,{emit:n}){const t=j(),s=B(),u=ae(le),{enabled:f,addQueryHistory:g,queryHistory:m,removeQueryHistory:w}=He(),{enabled:H,resultHistory:h,addResultHistory:O,removeResultHistory:X}=Qe(),P=f||H,S=se(r,"query"),{results:R,searching:Y}=ke(S),o=x({isQuery:!0,index:0}),p=x(0),c=x(0),L=D(()=>P&&(m.value.length>0||h.value.length>0)),C=D(()=>R.value.length>0),q=D(()=>R.value[p.value]||null),T=e=>t.resolve({name:e.key,..."anchor"in e?{hash:`#${e.anchor}`}:{}}).fullPath,z=()=>{const{isQuery:e,index:a}=o.value;a===0?o.value={isQuery:!e,index:e?h.value.length-1:m.value.length-1}:o.value={isQuery:e,index:a-1}},G=()=>{const{isQuery:e,index:a}=o.value;a===(e?m.value.length-1:h.value.length-1)?o.value={isQuery:!e,index:0}:o.value={isQuery:e,index:a+1}},J=()=>{p.value=p.value>0?p.value-1:R.value.length-1,c.value=q.value.contents.length-1},V=()=>{p.value=p.value{c.value{c.value>0?c.value=c.value-1:J()},A=e=>e.map(a=>ye(a)?a:l(a[0],a[1])),W=e=>{if(e.type==="customField"){const a=de[e.index]||"$content",[i,k=""]=me(a)?a[s.value].split("$content"):a.split("$content");return e.display.map(v=>l("div",A([i,...v,k])))}return e.display.map(a=>l("div",A(a)))},Q=()=>{p.value=0,c.value=0,n("updateQuery",""),n("close")};return te("keydown",e=>{if(r.isFocusing){if(C.value){if(e.key==="ArrowUp")N();else if(e.key==="ArrowDown")K();else if(e.key==="Enter"){const a=q.value.contents[c.value],i=T(a);g(r.query),O(a),t.push(i),Q()}}else if(H){if(e.key==="ArrowUp")z();else if(e.key==="ArrowDown")G();else if(e.key==="Enter"){const{index:a}=o.value;o.value.isQuery?(n("updateQuery",m.value[a]),e.preventDefault()):(t.push(h.value[a].link),Q())}}}}),M([p,c],()=>{var e;(e=document.querySelector(".search-pro-result-list-item.active .search-pro-result-item.active"))==null||e.scrollIntoView(!1)},{flush:"post"}),()=>l("div",{class:["search-pro-result-wrapper",{empty:S.value?!C.value:!L.value}],id:"search-pro-results"},S.value===""?P?L.value?[f?l("ul",{class:"search-pro-result-list"},l("li",{class:"search-pro-result-list-item"},[l("div",{class:"search-pro-result-title"},u.value.history),m.value.map((e,a)=>l("div",{class:["search-pro-result-item",{active:o.value.isQuery&&o.value.index===a}],onClick:()=>{n("updateQuery",e)}},[l(_,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},e),l("button",{class:"search-pro-remove-icon",innerHTML:F,onClick:i=>{i.preventDefault(),i.stopPropagation(),w(a)}})]))])):null,H?l("ul",{class:"search-pro-result-list"},l("li",{class:"search-pro-result-list-item"},[l("div",{class:"search-pro-result-title"},u.value.history),h.value.map((e,a)=>l(I,{to:e.link,class:["search-pro-result-item",{active:!o.value.isQuery&&o.value.index===a}],onClick:()=>{Q()}},()=>[l(_,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},[e.header?l("div",{class:"content-header"},e.header):null,l("div",e.display.map(i=>A(i)).flat())]),l("button",{class:"search-pro-remove-icon",innerHTML:F,onClick:i=>{i.preventDefault(),i.stopPropagation(),X(a)}})]))])):null]:u.value.emptyHistory:u.value.emptyResult:Y.value?l(re,{hint:u.value.searching}):C.value?l("ul",{class:"search-pro-result-list"},R.value.map(({title:e,contents:a},i)=>{const k=p.value===i;return l("li",{class:["search-pro-result-list-item",{active:k}]},[l("div",{class:"search-pro-result-title"},e||u.value.defaultTitle),a.map((v,Z)=>{const $=k&&c.value===Z;return l(I,{to:T(v),class:["search-pro-result-item",{active:$,"aria-selected":$}],onClick:()=>{g(r.query),O(v),Q()}},()=>[v.type==="text"?null:l(v.type==="title"?ue:v.type==="heading"?ie:ne,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},[v.type==="text"&&v.header?l("div",{class:"content-header"},v.header):null,l("div",W(v))])])})])})):u.value.emptyResult)}});export{we as default};
        +import{u as U,g as ee,h as j,i as B,X as ae,j as le,k as se,l as x,m as D,n as te,p as M,q as l,s as _,v as F,x as I,y as re,z as ue,A as ie,B as ne,R as oe,O as ce,C as ve,D as pe,E as he,F as ye,G as de,H as me,I as b,J as fe}from"./app-91ee3df5.js";const ge="SEARCH_PRO_QUERY_HISTORY",y=U(ge,[]),He=()=>{const{queryHistoryCount:r}=b,n=r>0;return{enabled:n,queryHistory:y,addQueryHistory:t=>{n&&(y.value.length{y.value=[...y.value.slice(0,t),...y.value.slice(t+1)]}}},Re="SEARCH_PRO_RESULT_HISTORY",{resultHistoryCount:E}=b,d=U(Re,[]),Qe=()=>{const r=j(),n=E>0,t=s=>r.resolve({name:s.key,..."anchor"in s?{hash:`#${s.anchor}`}:{}}).fullPath;return{enabled:n,resultHistory:d,addResultHistory:s=>{if(n){const u={link:t(s),display:s.display};"header"in s&&(u.header=s.header),d.value.length{d.value=[...d.value.slice(0,s),...d.value.slice(s+1)]}}},ke=r=>{const n=oe(),t=B(),{search:s,terminate:u}=ce(),f=x(!1),g=ve([]);return pe(()=>{const m=()=>{g.value=[],f.value=!1},w=fe(H=>{f.value=!0,H?s({type:"search",query:H,locale:t.value,options:n}).then(h=>{g.value=h,f.value=!1}).catch(h=>{console.error(h),m()}):m()},b.searchDelay);M([r,t],()=>w(r.value),{immediate:!0}),he(()=>{u()})}),{searching:f,results:g}};var we=ee({name:"SearchResult",props:{query:{type:String,required:!0},isFocusing:Boolean},emits:["close","updateQuery"],setup(r,{emit:n}){const t=j(),s=B(),u=ae(le),{enabled:f,addQueryHistory:g,queryHistory:m,removeQueryHistory:w}=He(),{enabled:H,resultHistory:h,addResultHistory:O,removeResultHistory:X}=Qe(),P=f||H,S=se(r,"query"),{results:R,searching:Y}=ke(S),o=x({isQuery:!0,index:0}),p=x(0),c=x(0),L=D(()=>P&&(m.value.length>0||h.value.length>0)),C=D(()=>R.value.length>0),q=D(()=>R.value[p.value]||null),T=e=>t.resolve({name:e.key,..."anchor"in e?{hash:`#${e.anchor}`}:{}}).fullPath,z=()=>{const{isQuery:e,index:a}=o.value;a===0?o.value={isQuery:!e,index:e?h.value.length-1:m.value.length-1}:o.value={isQuery:e,index:a-1}},G=()=>{const{isQuery:e,index:a}=o.value;a===(e?m.value.length-1:h.value.length-1)?o.value={isQuery:!e,index:0}:o.value={isQuery:e,index:a+1}},J=()=>{p.value=p.value>0?p.value-1:R.value.length-1,c.value=q.value.contents.length-1},V=()=>{p.value=p.value{c.value{c.value>0?c.value=c.value-1:J()},A=e=>e.map(a=>ye(a)?a:l(a[0],a[1])),W=e=>{if(e.type==="customField"){const a=de[e.index]||"$content",[i,k=""]=me(a)?a[s.value].split("$content"):a.split("$content");return e.display.map(v=>l("div",A([i,...v,k])))}return e.display.map(a=>l("div",A(a)))},Q=()=>{p.value=0,c.value=0,n("updateQuery",""),n("close")};return te("keydown",e=>{if(r.isFocusing){if(C.value){if(e.key==="ArrowUp")N();else if(e.key==="ArrowDown")K();else if(e.key==="Enter"){const a=q.value.contents[c.value],i=T(a);g(r.query),O(a),t.push(i),Q()}}else if(H){if(e.key==="ArrowUp")z();else if(e.key==="ArrowDown")G();else if(e.key==="Enter"){const{index:a}=o.value;o.value.isQuery?(n("updateQuery",m.value[a]),e.preventDefault()):(t.push(h.value[a].link),Q())}}}}),M([p,c],()=>{var e;(e=document.querySelector(".search-pro-result-list-item.active .search-pro-result-item.active"))==null||e.scrollIntoView(!1)},{flush:"post"}),()=>l("div",{class:["search-pro-result-wrapper",{empty:S.value?!C.value:!L.value}],id:"search-pro-results"},S.value===""?P?L.value?[f?l("ul",{class:"search-pro-result-list"},l("li",{class:"search-pro-result-list-item"},[l("div",{class:"search-pro-result-title"},u.value.history),m.value.map((e,a)=>l("div",{class:["search-pro-result-item",{active:o.value.isQuery&&o.value.index===a}],onClick:()=>{n("updateQuery",e)}},[l(_,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},e),l("button",{class:"search-pro-remove-icon",innerHTML:F,onClick:i=>{i.preventDefault(),i.stopPropagation(),w(a)}})]))])):null,H?l("ul",{class:"search-pro-result-list"},l("li",{class:"search-pro-result-list-item"},[l("div",{class:"search-pro-result-title"},u.value.history),h.value.map((e,a)=>l(I,{to:e.link,class:["search-pro-result-item",{active:!o.value.isQuery&&o.value.index===a}],onClick:()=>{Q()}},()=>[l(_,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},[e.header?l("div",{class:"content-header"},e.header):null,l("div",e.display.map(i=>A(i)).flat())]),l("button",{class:"search-pro-remove-icon",innerHTML:F,onClick:i=>{i.preventDefault(),i.stopPropagation(),X(a)}})]))])):null]:u.value.emptyHistory:u.value.emptyResult:Y.value?l(re,{hint:u.value.searching}):C.value?l("ul",{class:"search-pro-result-list"},R.value.map(({title:e,contents:a},i)=>{const k=p.value===i;return l("li",{class:["search-pro-result-list-item",{active:k}]},[l("div",{class:"search-pro-result-title"},e||u.value.defaultTitle),a.map((v,Z)=>{const $=k&&c.value===Z;return l(I,{to:T(v),class:["search-pro-result-item",{active:$,"aria-selected":$}],onClick:()=>{g(r.query),O(v),Q()}},()=>[v.type==="text"?null:l(v.type==="title"?ue:v.type==="heading"?ie:ne,{class:"search-pro-result-type"}),l("div",{class:"search-pro-result-content"},[v.type==="text"&&v.header?l("div",{class:"content-header"},v.header):null,l("div",W(v))])])})])})):u.value.emptyResult)}});export{we as default};
        diff --git a/assets/Shoppinglist.html-017360fc.js b/assets/Shoppinglist.html-5c37e16c.js
        similarity index 99%
        rename from assets/Shoppinglist.html-017360fc.js
        rename to assets/Shoppinglist.html-5c37e16c.js
        index f75c65ce..fdf4859c 100644
        --- a/assets/Shoppinglist.html-017360fc.js
        +++ b/assets/Shoppinglist.html-5c37e16c.js
        @@ -1 +1 @@
        -import{_ as d}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c as o,a,b as e,d as r,e as h}from"./app-98132e77.js";const l={},s=h('

        书房

        摄像头

        摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。

        谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。

        键盘

        罗技 ERGO K860 是一款无线蓝牙键盘,具有人体工学设计,并配备手托。我替换下来的海盗船机械键盘则留作备用。

        机械键盘 ikbc c104 和高斯 GS104D 销量高。办公场合适合使用静音红轴需求。高斯是国产品牌,提供多种颜色选择。

        游戏手柄

        如果不是在客厅玩游戏,建议买有线手柄,否则价格会高得多。

        • 100-200 预算:北通阿修罗 2、八位堂、致动 O。
        • 400+ 预算:XBOX SERIES 手柄。
        • 廉价手柄的性能通常很差,比如,摇杆只支持四个方向,而遥控一般是可以 360 度控制的。

        显示器

        书桌上装有三台显示器。主显示器是小米 27 英寸 2K 165Hz,尽管存在轻微漏光,但对日常使用影响不大。两侧的显示器是 2012 年生产的 DELL 2412M。显卡为 3080Ti,考虑以后将三台都升级为 4K,使用每英寸像素数(PPI)来评估显示器清晰度更为合理和直观。4K 显示屏让眼睛更舒适,绝对提高幸福感。[1]

        显示器疑问:

        • 使用不同分辨率和刷新率的显示器是否对视觉和视力产生影响?(之前看到的说法是影响不大。)
        • 旧显示器需要多久更换一次?如何判断它们的寿命已到?
        • 放在屏幕上方的防蓝光灯是否有效?

        DIY 显示器(面板 + 公版控制器):

        • 便宜,但没有厂家优化,显示效果打折扣。
        • 需要确认购买的显示面板是否为二手。
        • 我连续购买了两个面板都出了问题,分别是碎屏和无显示。

        台式电脑

        2022.03.16 淘宝入手 DIY 台机 i7+3080ti,费用 16500。虽然价格贵了点,不过赶在疫情封控两个月前,用上新电脑。原本想入手联想 刃 9000K 2022(i7+3070ti,价格 14000),但一直无货。这款机箱由联想定制,散热更好,配置足够日常使用,另外还有品牌机售后优势。相比联想,入手的 DIY 电脑内存频率从 4400 升至 5200,显卡从 3070ti 升至 3080ti,性价比更高,而且是现货。

        如果使用悬挂主机托架,需考虑主机重量、升降桌承重。

        书桌灯

        我在书桌上使用了米典护眼读写灯,众筹价为 400 元。这款灯的光线级别达到 AA 级,可以替代屏幕上的挂灯。

        通常情况下,我会开着书桌灯,而顶灯一般是关着的。当只有屏幕和桌面上有光,其他区域都处于黑暗中,我能更专心地工作。

        未来,我希望能在书房里增加一些色彩,考虑使用 yeelight 灯带。

        升降桌

        电动升降桌的调节高度范围一般在 0.6 至 1.2 米之间,可以考虑乐歌和京造。如果你想站着阅读,还可以考虑添置一个阅读架。

        静电墙贴

        @chen 出的绝妙主意,将静电墙贴当白板用,可以任意随时的记录。不过为用红色白板笔不好擦,准备试试 PVC 材质的静电墙贴。

        数码

        降噪耳机

        以下是降噪耳机的比较,按降噪效果从低到高排列:

        • Freebuds Studio:华为生态。
        • Sony 1000XM4:于 20 年发布,降噪效果强,但偶尔会翻车。
        • Bose 700:于 19 年发布,长时间佩戴舒适,但佩戴时间过长会感到很热,有人说这款不如旧款 QC 35 II。我于 2021 年 6 月以 1300 元购入,后来在闲鱼以 899 元售出。

        还试用过其他无线耳机,如下所述:

        • 10 元:购买自拼多多,通话效果勉强,但音乐质量非常差,声音仿佛来自另一个世界。
        • 50 元:倍思,通话和音乐效果都还不错,但在地铁里几乎听不到声音。不知是不是因为习惯了降噪耳机,带普通耳机只能听到地铁的噪音。
        • 小度半入耳耳机:容易松动,甚至在走路时容易脱落;偶尔无法识别,必须重新放入电池仓进行充电。
        • 悦虎 1562M:闲鱼山寨品牌,据说音质不错(?),但主要适用于苹果设备。如果使用安卓设备,对音质要求不高,可以选择 QCY。

        充电器

        充电器用了几年后,注意及时更换,因为老化会导致充电速度变慢。

        氮化镓充电器非常适合外出快速充电。不要购买无品牌的廉价充电器,虽然它们可能具有高参数和强大功能,但充电芯片质量没有保障,容易导致过热充电,从而影响设备的寿命。

        UPS

        随着 NAS 硬盘数量的增加,建议使用 UPS 以防止因突然断电而导致的硬盘损坏。

        在考虑 NAS UPS 时,可以考虑购买 APC BK650M2-CH 和山特(SANTAK)TG-BOX 850。

        3D 打印机

        3D 打印机使用时,打印原料会产生有害气体,不适合在家中使用。如果偶尔需要打印,建议在网上寻找专业人士定制。

        健康

        代餐

        代餐:无营养,不能起到减肥作用,容易掉肌肉。

        体重秤

        华为体脂秤 2 Pro 太过敏感,经常不准确。

        椭圆机

        椭圆机的稳定性至关重要,机身越重越好。一般型号只有 68 公斤,好的型号可以达到 86 公斤。飞轮重量必须达到 12 公斤,否则使用时可能不够稳定。

        按照这些标准,推荐斯诺德 E690 和迪卡侬 EL 900。

        眼部按摩仪

        严选眼部按摩仪噪音较大,但其他品牌也没好多少。如果买新的眼睛按摩仪,建议选择蛋白皮材质,适合长期使用。

        • 倍轻松:睡眠模式只有热敷。
        • 小米有品摩摩哒:无法关闭音乐,震动效果较弱,气囊挤。

        泡脚桶

        泡脚桶的新旧款别不大,比较特别的功能是蒸汽泡脚,但评价普遍一般。建议选择传统深桶,可以漫过小腿。

        睡眠监测

        在健康监测方面,我比较重视睡眠时间的监测。

        曾使用过 37 度睡眠监测带,但准确性不高,只适合用于家庭自动化(例如,作为触发器自动拉开窗帘)。我也考虑过更换为 Apple Watch 8/SE。然而,戴上 Apple Watch 会舒适吗?另外,我的手机是安卓系统,Apple Watch 是否兼容安卓手机或 iPad?

        试过小米手环和华为 GT 手表,但无论使用何种手环,始终感到不舒适,尤其是在炎热的天气里容易出汗。我尝试过硅胶、金属和尼龙编织表带,都没有明显改善。

        • @木木:用过 Nike 的那个孔状的表带改善了,然后我用洗眼镜的超声波盒子每天洗表带汗藓情况进一步改善,于是我最后通过实验,每天用酒精消毒液洗表带
        • @ZxoudXc:硅胶(最舒服的材质了) + 一点点风油精 不能说根治把。但是体感很爽,特别是在空调房里面。希望有帮助。

        厨房

        冰柜

        与其他人不同,我想要冰柜只是冰箱放不下了。我喜欢买速冻包子、饺子,这类一买就得买很多包,否则价格高很多。换个思路,趁着优惠多买些速冻产品,冰柜的费用很快就回来了。我看中的是 135L 的卧式冰柜,价格 700,如果家里用不到了,扔起来也不会心疼。

        比起卧式冰柜,立式拿取方便,但分层后存储空间受限,没法放体积特别大的东西,比如大包的生鲜,整条的羊腿。立式占地虽小,但小的有限,容量相等的情况下,基本是 0.4 平和 0.5 平的区别,而且立式高度更高,容易影响视线。

        切肉机

        电动切肉机用起来蛮慢的,切 5 斤肉需要 30 分钟。机器清洗也很麻烦,建议每次切肉时都将整条一起切好。

        使用前,向滑轨喷食用油,可以降低切肉卡顿的几率。使用时,为了避免冻手,两只手都先带一层劳保手套,外面再套一层 PVC。左手固定肉块左侧,右手扶助肉块后端。不要过分往前推,避免肉切得太厚。

        净水器

        RO 膜方案:纯水过滤,可直饮。RO 膜机器较大,一定要量好厨柜尺寸。在选择时,不必参考废水量,废水量越低对滤芯压力更大。一些攻略指出 RO 膜的出水速度较慢,而滤芯更换频率较高(最快 1-3 个月一次)。然而,这些问题早已得到解决。相反,我因为滤芯更换速度过慢而感到焦虑。通常,DIY 前置滤芯寿命是 3-6 个月,但我购买的 DIY 净水器用了一年,还没提醒更换滤芯。最后我只能盲换,跟超滤方案一样了。

        建议购买小米、美的等成熟净水器方案。它们的价格通常在 1500-2000 之间,仅需要更换两个滤芯:复合滤芯(2 年更换一次,售价 299 元)和 RO 膜滤芯(5 年更换一次,售价 999 元)。仅更换滤芯的年均成本为 350 元。总体来看,DIY 所谓的性价比并不太高。

        超滤方案:保留矿物质(?),无需通电,大通量过滤。不足之处难以确认滤芯更换的时间,只能根据滤芯使用时间来预估。全套新机器的价格为 1500 元,之后每两年更换一次 EF-900P 滤芯(售价 350 元),每四年更换一次超滤 LU3B-5C 滤芯(售价 600 元),仅更换滤芯的年均成本为 325 元,如果全套更换,年均成本为 425 元。

        旧配置:立升 LU3B-5C + 爱惠浦 EF-900P (别要赠品,折现) + 爱惠浦滤头垡头 QL2U + 无铅水龙头。这是用了几年的方案,但随着立升的超幅涨价,超滤玩家的变少,越来越难以实现了。另外,配机时记得买好配件。比如买爱惠浦滤头垡头 QL2U 时,问清楚是几分进几分出。常用的两边都是 3 分口,要配 2 个 3 分进 2 分出的接头,方便接 2 分水管。接口是可以送的,要跟店家说送接口、水管。没送的话,可以自己买 1 根 5 米的 2 分 PE 管、1 个 4 分转 2 分的接头 (立升转爱惠浦)、2 个 3 分转 2 分的接头、1 个 2 分球阀。

        超滤净水示意图

        家居

        维修

        ',74),p={href:"https://www.lbdj.com/",target:"_blank",rel:"noopener noreferrer"},c=h('

        电熨斗

        挂烫机体积较大且使用频率低,长时间闲置后,性能也减弱,无法熨平衣物。考虑使用传统电熨斗 + 分熨台。

        牛皮席

        夏天使用牛皮席更凉爽,避免因出汗而粘皮肤,有助于提高睡眠质量。

        最初购买的是无涂层牛皮席,上面存在许多瑕疵,后来更换为便宜的涂层款,反而看不到瑕疵。

        消毒液

        ',6),f={href:"https://sspai.com/prime/story/disinfectant",target:"_blank",rel:"noopener noreferrer"},u=h('
        • 84 消毒液:爱特福、龙安、蓝月亮、康威龙。
        • 二氧化氯消毒片:星帮尼,从安全性角度看,二氧化氯消毒剂优于含氯消毒剂。
          • 用于餐具、水果、蔬菜等的消毒,有效的二氧化氯浓度应为 100–150mg/L,浸泡作用时间 10–20 分钟。
          • 尽管二氧化氯目前被认为是对人体无毒害的成分,但为了保险起见,应及时用清水洗净残留消毒液才能继续使用。
        • 季铵盐消毒液:适用于衣物消毒,建议品牌包括康威龙和洛娃
          • 不要将消毒液与洗衣液及柔顺剂同时使用,以免使各自的功效减弱。清洁、消毒是两个独立的过程,建议先洗干净再进行消毒,消毒效果更佳。

        小物

        • 能面具 (树脂),但带眼镜不方便使用。
        • 宝工(Pro'sKit)NT-309-C 智慧型非接触式感应电笔:测电笔、验电笔
        • 内裤清洗机
        • 洗杯器:一按就能清洗杯子,非常方便,可惜需要水槽有多余的出水口。[2]
        • 插座:公牛、德力西、aigo(突破),公牛质量下滑了,可以看看其他品牌。

        可能放弃

        电子书

        我通常使用 iPad 来阅读小说。国产电子书设备基于安卓系统,可以满足小说阅读的基本需求,而且使用墨水屏有助于保护眼睛。因此,考虑是否可以用电子书设备代替 iPad。

        电子书要求:支持开放系统(可以安装第三方应用程序),并且支持蓝牙遥控翻页。

        微单相机

        原计划购买索尼 a7m4 微单相机,但随着疫情的发展,这个想法逐渐淡化,优先级下调。

        关于镜头选择:F 值越小,光圈越大,适合虚化背景。

        • 腾龙 28-75mm F2.8(适合日常旅行)
        • 索尼 FE 85mm F1.8 中远摄定焦镜头(适合人像摄影)

        无线麦克风

        RODE Wireless Go II 与 DJI Mic:RODE Wireless Go 音质多受好评;而 DJI Mic 相对较新,但更符合人性化需求,可以轻松连接到手机。不过,需要注意的是 DJI Mic 的底噪略微高一些。

        鉴于录音中存在较多的杂音,需要使用降噪软件或者单独使用一部手机进行录音,因此目前暂不考虑入手无线麦克风。

        洗碗机

        由于厨房空间有限,且洗碗机过于笨重,考虑找人上门设计解决方案?


        ',17),b={class:"footnotes"},_={class:"footnotes-list"},x={id:"footnote1",class:"footnote-item"},m={href:"https://sspai.com/prime/story/display-04-buyingguide-01",target:"_blank",rel:"noopener noreferrer"},g=a("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),I={id:"footnote2",class:"footnote-item"},E={href:"https://sspai.com/post/73604",target:"_blank",rel:"noopener noreferrer"},P=a("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1);function D(S,k){const i=t("ExternalLinkIcon");return n(),o("div",null,[s,a("p",null,[e("日常维修以京东到家为主,或使用商家外包常用的"),a("a",p,[e("鲁班到家"),r(i)]),e("。之前净水器的安装服务是鲁班到家,服务还不错,可以线上让师傅报价。")]),c,a("p",null,[e("参考"),a("a",f,[e("消毒剂选购不完全指南"),r(i)]),e(":")]),u,a("section",b,[a("ol",_,[a("li",x,[a("p",null,[a("a",m,[e("选择合适自己的显示器"),r(i)]),e(),g])]),a("li",I,[a("p",null,[a("a",E,[e("Room Tour |新家的厨房里有什么?"),r(i)]),e(),P])])])])])}const A=d(l,[["render",D],["__file","Shoppinglist.html.vue"]]);export{A as default}; +import{_ as d}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c as o,a,b as e,d as r,e as h}from"./app-91ee3df5.js";const l={},s=h('

        书房

        摄像头

        摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。

        谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。

        键盘

        罗技 ERGO K860 是一款无线蓝牙键盘,具有人体工学设计,并配备手托。我替换下来的海盗船机械键盘则留作备用。

        机械键盘 ikbc c104 和高斯 GS104D 销量高。办公场合适合使用静音红轴需求。高斯是国产品牌,提供多种颜色选择。

        游戏手柄

        如果不是在客厅玩游戏,建议买有线手柄,否则价格会高得多。

        • 100-200 预算:北通阿修罗 2、八位堂、致动 O。
        • 400+ 预算:XBOX SERIES 手柄。
        • 廉价手柄的性能通常很差,比如,摇杆只支持四个方向,而遥控一般是可以 360 度控制的。

        显示器

        书桌上装有三台显示器。主显示器是小米 27 英寸 2K 165Hz,尽管存在轻微漏光,但对日常使用影响不大。两侧的显示器是 2012 年生产的 DELL 2412M。显卡为 3080Ti,考虑以后将三台都升级为 4K,使用每英寸像素数(PPI)来评估显示器清晰度更为合理和直观。4K 显示屏让眼睛更舒适,绝对提高幸福感。[1]

        显示器疑问:

        • 使用不同分辨率和刷新率的显示器是否对视觉和视力产生影响?(之前看到的说法是影响不大。)
        • 旧显示器需要多久更换一次?如何判断它们的寿命已到?
        • 放在屏幕上方的防蓝光灯是否有效?

        DIY 显示器(面板 + 公版控制器):

        • 便宜,但没有厂家优化,显示效果打折扣。
        • 需要确认购买的显示面板是否为二手。
        • 我连续购买了两个面板都出了问题,分别是碎屏和无显示。

        台式电脑

        2022.03.16 淘宝入手 DIY 台机 i7+3080ti,费用 16500。虽然价格贵了点,不过赶在疫情封控两个月前,用上新电脑。原本想入手联想 刃 9000K 2022(i7+3070ti,价格 14000),但一直无货。这款机箱由联想定制,散热更好,配置足够日常使用,另外还有品牌机售后优势。相比联想,入手的 DIY 电脑内存频率从 4400 升至 5200,显卡从 3070ti 升至 3080ti,性价比更高,而且是现货。

        如果使用悬挂主机托架,需考虑主机重量、升降桌承重。

        书桌灯

        我在书桌上使用了米典护眼读写灯,众筹价为 400 元。这款灯的光线级别达到 AA 级,可以替代屏幕上的挂灯。

        通常情况下,我会开着书桌灯,而顶灯一般是关着的。当只有屏幕和桌面上有光,其他区域都处于黑暗中,我能更专心地工作。

        未来,我希望能在书房里增加一些色彩,考虑使用 yeelight 灯带。

        升降桌

        电动升降桌的调节高度范围一般在 0.6 至 1.2 米之间,可以考虑乐歌和京造。如果你想站着阅读,还可以考虑添置一个阅读架。

        静电墙贴

        @chen 出的绝妙主意,将静电墙贴当白板用,可以任意随时的记录。不过为用红色白板笔不好擦,准备试试 PVC 材质的静电墙贴。

        数码

        降噪耳机

        以下是降噪耳机的比较,按降噪效果从低到高排列:

        • Freebuds Studio:华为生态。
        • Sony 1000XM4:于 20 年发布,降噪效果强,但偶尔会翻车。
        • Bose 700:于 19 年发布,长时间佩戴舒适,但佩戴时间过长会感到很热,有人说这款不如旧款 QC 35 II。我于 2021 年 6 月以 1300 元购入,后来在闲鱼以 899 元售出。

        还试用过其他无线耳机,如下所述:

        • 10 元:购买自拼多多,通话效果勉强,但音乐质量非常差,声音仿佛来自另一个世界。
        • 50 元:倍思,通话和音乐效果都还不错,但在地铁里几乎听不到声音。不知是不是因为习惯了降噪耳机,带普通耳机只能听到地铁的噪音。
        • 小度半入耳耳机:容易松动,甚至在走路时容易脱落;偶尔无法识别,必须重新放入电池仓进行充电。
        • 悦虎 1562M:闲鱼山寨品牌,据说音质不错(?),但主要适用于苹果设备。如果使用安卓设备,对音质要求不高,可以选择 QCY。

        充电器

        充电器用了几年后,注意及时更换,因为老化会导致充电速度变慢。

        氮化镓充电器非常适合外出快速充电。不要购买无品牌的廉价充电器,虽然它们可能具有高参数和强大功能,但充电芯片质量没有保障,容易导致过热充电,从而影响设备的寿命。

        UPS

        随着 NAS 硬盘数量的增加,建议使用 UPS 以防止因突然断电而导致的硬盘损坏。

        在考虑 NAS UPS 时,可以考虑购买 APC BK650M2-CH 和山特(SANTAK)TG-BOX 850。

        3D 打印机

        3D 打印机使用时,打印原料会产生有害气体,不适合在家中使用。如果偶尔需要打印,建议在网上寻找专业人士定制。

        健康

        代餐

        代餐:无营养,不能起到减肥作用,容易掉肌肉。

        体重秤

        华为体脂秤 2 Pro 太过敏感,经常不准确。

        椭圆机

        椭圆机的稳定性至关重要,机身越重越好。一般型号只有 68 公斤,好的型号可以达到 86 公斤。飞轮重量必须达到 12 公斤,否则使用时可能不够稳定。

        按照这些标准,推荐斯诺德 E690 和迪卡侬 EL 900。

        眼部按摩仪

        严选眼部按摩仪噪音较大,但其他品牌也没好多少。如果买新的眼睛按摩仪,建议选择蛋白皮材质,适合长期使用。

        • 倍轻松:睡眠模式只有热敷。
        • 小米有品摩摩哒:无法关闭音乐,震动效果较弱,气囊挤。

        泡脚桶

        泡脚桶的新旧款别不大,比较特别的功能是蒸汽泡脚,但评价普遍一般。建议选择传统深桶,可以漫过小腿。

        睡眠监测

        在健康监测方面,我比较重视睡眠时间的监测。

        曾使用过 37 度睡眠监测带,但准确性不高,只适合用于家庭自动化(例如,作为触发器自动拉开窗帘)。我也考虑过更换为 Apple Watch 8/SE。然而,戴上 Apple Watch 会舒适吗?另外,我的手机是安卓系统,Apple Watch 是否兼容安卓手机或 iPad?

        试过小米手环和华为 GT 手表,但无论使用何种手环,始终感到不舒适,尤其是在炎热的天气里容易出汗。我尝试过硅胶、金属和尼龙编织表带,都没有明显改善。

        • @木木:用过 Nike 的那个孔状的表带改善了,然后我用洗眼镜的超声波盒子每天洗表带汗藓情况进一步改善,于是我最后通过实验,每天用酒精消毒液洗表带
        • @ZxoudXc:硅胶(最舒服的材质了) + 一点点风油精 不能说根治把。但是体感很爽,特别是在空调房里面。希望有帮助。

        厨房

        冰柜

        与其他人不同,我想要冰柜只是冰箱放不下了。我喜欢买速冻包子、饺子,这类一买就得买很多包,否则价格高很多。换个思路,趁着优惠多买些速冻产品,冰柜的费用很快就回来了。我看中的是 135L 的卧式冰柜,价格 700,如果家里用不到了,扔起来也不会心疼。

        比起卧式冰柜,立式拿取方便,但分层后存储空间受限,没法放体积特别大的东西,比如大包的生鲜,整条的羊腿。立式占地虽小,但小的有限,容量相等的情况下,基本是 0.4 平和 0.5 平的区别,而且立式高度更高,容易影响视线。

        切肉机

        电动切肉机用起来蛮慢的,切 5 斤肉需要 30 分钟。机器清洗也很麻烦,建议每次切肉时都将整条一起切好。

        使用前,向滑轨喷食用油,可以降低切肉卡顿的几率。使用时,为了避免冻手,两只手都先带一层劳保手套,外面再套一层 PVC。左手固定肉块左侧,右手扶助肉块后端。不要过分往前推,避免肉切得太厚。

        净水器

        RO 膜方案:纯水过滤,可直饮。RO 膜机器较大,一定要量好厨柜尺寸。在选择时,不必参考废水量,废水量越低对滤芯压力更大。一些攻略指出 RO 膜的出水速度较慢,而滤芯更换频率较高(最快 1-3 个月一次)。然而,这些问题早已得到解决。相反,我因为滤芯更换速度过慢而感到焦虑。通常,DIY 前置滤芯寿命是 3-6 个月,但我购买的 DIY 净水器用了一年,还没提醒更换滤芯。最后我只能盲换,跟超滤方案一样了。

        建议购买小米、美的等成熟净水器方案。它们的价格通常在 1500-2000 之间,仅需要更换两个滤芯:复合滤芯(2 年更换一次,售价 299 元)和 RO 膜滤芯(5 年更换一次,售价 999 元)。仅更换滤芯的年均成本为 350 元。总体来看,DIY 所谓的性价比并不太高。

        超滤方案:保留矿物质(?),无需通电,大通量过滤。不足之处难以确认滤芯更换的时间,只能根据滤芯使用时间来预估。全套新机器的价格为 1500 元,之后每两年更换一次 EF-900P 滤芯(售价 350 元),每四年更换一次超滤 LU3B-5C 滤芯(售价 600 元),仅更换滤芯的年均成本为 325 元,如果全套更换,年均成本为 425 元。

        旧配置:立升 LU3B-5C + 爱惠浦 EF-900P (别要赠品,折现) + 爱惠浦滤头垡头 QL2U + 无铅水龙头。这是用了几年的方案,但随着立升的超幅涨价,超滤玩家的变少,越来越难以实现了。另外,配机时记得买好配件。比如买爱惠浦滤头垡头 QL2U 时,问清楚是几分进几分出。常用的两边都是 3 分口,要配 2 个 3 分进 2 分出的接头,方便接 2 分水管。接口是可以送的,要跟店家说送接口、水管。没送的话,可以自己买 1 根 5 米的 2 分 PE 管、1 个 4 分转 2 分的接头 (立升转爱惠浦)、2 个 3 分转 2 分的接头、1 个 2 分球阀。

        超滤净水示意图

        家居

        维修

        ',74),p={href:"https://www.lbdj.com/",target:"_blank",rel:"noopener noreferrer"},c=h('

        电熨斗

        挂烫机体积较大且使用频率低,长时间闲置后,性能也减弱,无法熨平衣物。考虑使用传统电熨斗 + 分熨台。

        牛皮席

        夏天使用牛皮席更凉爽,避免因出汗而粘皮肤,有助于提高睡眠质量。

        最初购买的是无涂层牛皮席,上面存在许多瑕疵,后来更换为便宜的涂层款,反而看不到瑕疵。

        消毒液

        ',6),f={href:"https://sspai.com/prime/story/disinfectant",target:"_blank",rel:"noopener noreferrer"},u=h('
        • 84 消毒液:爱特福、龙安、蓝月亮、康威龙。
        • 二氧化氯消毒片:星帮尼,从安全性角度看,二氧化氯消毒剂优于含氯消毒剂。
          • 用于餐具、水果、蔬菜等的消毒,有效的二氧化氯浓度应为 100–150mg/L,浸泡作用时间 10–20 分钟。
          • 尽管二氧化氯目前被认为是对人体无毒害的成分,但为了保险起见,应及时用清水洗净残留消毒液才能继续使用。
        • 季铵盐消毒液:适用于衣物消毒,建议品牌包括康威龙和洛娃
          • 不要将消毒液与洗衣液及柔顺剂同时使用,以免使各自的功效减弱。清洁、消毒是两个独立的过程,建议先洗干净再进行消毒,消毒效果更佳。

        小物

        • 能面具 (树脂),但带眼镜不方便使用。
        • 宝工(Pro'sKit)NT-309-C 智慧型非接触式感应电笔:测电笔、验电笔
        • 内裤清洗机
        • 洗杯器:一按就能清洗杯子,非常方便,可惜需要水槽有多余的出水口。[2]
        • 插座:公牛、德力西、aigo(突破),公牛质量下滑了,可以看看其他品牌。

        可能放弃

        电子书

        我通常使用 iPad 来阅读小说。国产电子书设备基于安卓系统,可以满足小说阅读的基本需求,而且使用墨水屏有助于保护眼睛。因此,考虑是否可以用电子书设备代替 iPad。

        电子书要求:支持开放系统(可以安装第三方应用程序),并且支持蓝牙遥控翻页。

        微单相机

        原计划购买索尼 a7m4 微单相机,但随着疫情的发展,这个想法逐渐淡化,优先级下调。

        关于镜头选择:F 值越小,光圈越大,适合虚化背景。

        • 腾龙 28-75mm F2.8(适合日常旅行)
        • 索尼 FE 85mm F1.8 中远摄定焦镜头(适合人像摄影)

        无线麦克风

        RODE Wireless Go II 与 DJI Mic:RODE Wireless Go 音质多受好评;而 DJI Mic 相对较新,但更符合人性化需求,可以轻松连接到手机。不过,需要注意的是 DJI Mic 的底噪略微高一些。

        鉴于录音中存在较多的杂音,需要使用降噪软件或者单独使用一部手机进行录音,因此目前暂不考虑入手无线麦克风。

        洗碗机

        由于厨房空间有限,且洗碗机过于笨重,考虑找人上门设计解决方案?


        ',17),b={class:"footnotes"},_={class:"footnotes-list"},x={id:"footnote1",class:"footnote-item"},m={href:"https://sspai.com/prime/story/display-04-buyingguide-01",target:"_blank",rel:"noopener noreferrer"},g=a("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1),I={id:"footnote2",class:"footnote-item"},E={href:"https://sspai.com/post/73604",target:"_blank",rel:"noopener noreferrer"},P=a("a",{href:"#footnote-ref2",class:"footnote-backref"},"↩︎",-1);function D(S,k){const i=t("ExternalLinkIcon");return n(),o("div",null,[s,a("p",null,[e("日常维修以京东到家为主,或使用商家外包常用的"),a("a",p,[e("鲁班到家"),r(i)]),e("。之前净水器的安装服务是鲁班到家,服务还不错,可以线上让师傅报价。")]),c,a("p",null,[e("参考"),a("a",f,[e("消毒剂选购不完全指南"),r(i)]),e(":")]),u,a("section",b,[a("ol",_,[a("li",x,[a("p",null,[a("a",m,[e("选择合适自己的显示器"),r(i)]),e(),g])]),a("li",I,[a("p",null,[a("a",E,[e("Room Tour |新家的厨房里有什么?"),r(i)]),e(),P])])])])])}const A=d(l,[["render",D],["__file","Shoppinglist.html.vue"]]);export{A as default}; diff --git a/assets/Static.html-3055babe.js b/assets/Static.html-6bd95734.js similarity index 99% rename from assets/Static.html-3055babe.js rename to assets/Static.html-6bd95734.js index 9f11e602..3b50b6d5 100644 --- a/assets/Static.html-3055babe.js +++ b/assets/Static.html-6bd95734.js @@ -1,4 +1,4 @@ -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as c,c as d,a as e,b as n,d as s,w as o,e as i}from"./app-98132e77.js";const u={},p=e("h2",{id:"静态托管",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#静态托管","aria-hidden":"true"},"#"),n(" 静态托管")],-1),v=e("p",null,[n("如果在国内静态资源库找不到所需的静态包,建议使用 "),e("code",null,"npm i"),n(" 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。")],-1),h=e("p",null,"静态资源库:",-1),m={href:"https://www.staticfile.org/",target:"_blank",rel:"noopener noreferrer"},b={href:"https://cdn.bytedance.com/",target:"_blank",rel:"noopener noreferrer"},_=e("p",null,"emoji 等可以使用静态资源库上的项目,比如 twemoji,上面有集成 png 图片。",-1),f=e("h3",{id:"npm-包",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#npm-包","aria-hidden":"true"},"#"),n(" NPM 包")],-1),k=e("strong",null,"有墙风险且不稳定",-1),g=e("code",null,"@latest",-1),S={href:"https://segmentfault.com/a/1190000023075167",target:"_blank",rel:"noopener noreferrer"},y={href:"https://www.npmjs.com/",target:"_blank",rel:"noopener noreferrer"},w=e("code",null,"https://unpkg.com/",-1),P={href:"https://npmmirror.com/",target:"_blank",rel:"noopener noreferrer"},x=e("code",null,"https://registry.npmmirror.com/项目名/版本号",-1),F=e("li",null,[n("UNPKG 镜像:有资源可以用服务器自建服务,反向代理 unpkg。 "),e("ul",null,[e("li",null,[e("s",null,[n("饿了么 CDN(已关):国内唯一能用的 npm 镜像,2022.07.13 发现外部访问被拒绝。之前饿了么并没说支持对外,可能已经彻底取消了。使用饿了么 CDN 时,注意 "),e("code",null,"https://npm.elemecdn.com/react@latest/"),n(" 需要时间更新,具体频率未知,可固定大版本号来获取更新 "),e("code",null,"https://npm.elemecdn.com/react@^18/"),n("。")])])])],-1),D={href:"https://statically.io/",target:"_blank",rel:"noopener noreferrer"},N=e("li",null,[e("s",null,[n("jsDelivr(已墙):速度最快,原本是最稳的,但域名暴雷后,经常断开,2022.06.01 彻底打不开。配合 Github action,更新后自动访问 jsdelivr CDN 缓存刷新链接,保持页面常新。刷新命令参考 "),e("code",null,"curl https://purge.jsdelivr.net/gh/username/project/file"),n("。")])],-1),C=e("p",null,"由于第三方托管过于不稳定,目前我使用自托管 oss.gpt-vip.top。",-1),G=e("h3",{id:"部署平台",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#部署平台","aria-hidden":"true"},"#"),n(" 部署平台")],-1),E=e("li",null,"Pages:部署简单,外网速度很快,但国内速度不稳,而且 page.dev 域名有时会被墙,可购买便宜的临时域名(一年)来解决该问题。",-1),T=e("li",null,"Netlify:国内速度慢点,图片容易卡死,但还算稳定。",-1),H=e("li",null,"Vercel:推荐使用 GitHub 账户登录,需绑定手机号(不支持 Voice),支持国内手机号。2022.08.26,「*.vercel.app」域名被 DNS 污染,需要绑定自定义域名。",-1),I=e("li",null,"AWS: 邮箱注册,不过需要信用卡认证。",-1),j=e("li",null,"国内平台:Gitee、WuliHub、CODING,都需要实名认证。",-1),K=e("h3",{id:"ipfs",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ipfs","aria-hidden":"true"},"#"),n(" IPFS")],-1),A=e("p",null,[n("IPFS 无需服务器就可建立静态网站,号称永不失效,但"),e("strong",null,"国内稳定性成疑问,实用性一般"),n("。IPFS 托管在一个网关上,并不会自动复制到所有网关。")],-1),$={href:"https://pinata.cloud/",target:"_blank",rel:"noopener noreferrer"},L=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote1"},"[1]"),e("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),R=e("p",null,"上传 ipfs 到 pinata 之后,cloudflare 等其他网关不一定会完全复制文件,php 无法抓取加载,所以不建议使用 cloudflare 网关。",-1),V=e("p",null,[n("cloudflare 接管 pinata 后,ipfs 域名需通过「pinata 托管」>「cloudflare DNS」>「cloudflare SSL」。如果中途将 DNS 指向 "),e("code",null,"http://gateway.pinata.cloud"),n(" 等非 cloudflare ipfs 网关域名,cloudflare SSL 证书将失效。即便把链接改为非加密的 http,pinata 依然会视之为无效链接而拒绝访问。")],-1),W={href:"https://www.cloudflare.com/zh-cn/distributed-web-gateway/",target:"_blank",rel:"noopener noreferrer"},M=i('
        1. 添加 CNAME 记录,将你的 IPFS 域名 xxx.example.com 指向 cloudflare-ipfs.com
        2. _dnslink.xxx.example.com 设置为 dnslink=/ipfs/<your_ipfs_hash_here>

        GitHub 同步到 VPS

        代码、文章推送到 GitHub 后,会自动生成可访问的网页,但国内访问 GitHub Pages 的速度极不稳定,为了确保网站能被正常访问,必须增加国内的访问节点。

        很多人选择 Gitee Pages 作为国内节点,GitHub Actions 将新文档同步到 Gitee,生成位于国内的静态页面 Gitee Pages。但是,Gitee Pages 的限制非常多,免费版无法自定义域名,必须实名验证,更别提近期的下架风波。因此,我没选 Gitee,而是把文档同步到国内服务器(域名需备案)。

        文件夹名称请勿使用大写字母,否则在同步时容易产生错误。

        同步到 FTP

        ',6),q={href:"https://github.com/SamKirkland/FTP-Deploy-Action",target:"_blank",rel:"noopener noreferrer"},B=i(`
        on: push
        +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as l,o as c,c as d,a as e,b as n,d as s,w as o,e as i}from"./app-91ee3df5.js";const u={},p=e("h2",{id:"静态托管",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#静态托管","aria-hidden":"true"},"#"),n(" 静态托管")],-1),v=e("p",null,[n("如果在国内静态资源库找不到所需的静态包,建议使用 "),e("code",null,"npm i"),n(" 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。")],-1),h=e("p",null,"静态资源库:",-1),m={href:"https://www.staticfile.org/",target:"_blank",rel:"noopener noreferrer"},b={href:"https://cdn.bytedance.com/",target:"_blank",rel:"noopener noreferrer"},_=e("p",null,"emoji 等可以使用静态资源库上的项目,比如 twemoji,上面有集成 png 图片。",-1),f=e("h3",{id:"npm-包",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#npm-包","aria-hidden":"true"},"#"),n(" NPM 包")],-1),k=e("strong",null,"有墙风险且不稳定",-1),g=e("code",null,"@latest",-1),S={href:"https://segmentfault.com/a/1190000023075167",target:"_blank",rel:"noopener noreferrer"},y={href:"https://www.npmjs.com/",target:"_blank",rel:"noopener noreferrer"},w=e("code",null,"https://unpkg.com/",-1),P={href:"https://npmmirror.com/",target:"_blank",rel:"noopener noreferrer"},x=e("code",null,"https://registry.npmmirror.com/项目名/版本号",-1),F=e("li",null,[n("UNPKG 镜像:有资源可以用服务器自建服务,反向代理 unpkg。 "),e("ul",null,[e("li",null,[e("s",null,[n("饿了么 CDN(已关):国内唯一能用的 npm 镜像,2022.07.13 发现外部访问被拒绝。之前饿了么并没说支持对外,可能已经彻底取消了。使用饿了么 CDN 时,注意 "),e("code",null,"https://npm.elemecdn.com/react@latest/"),n(" 需要时间更新,具体频率未知,可固定大版本号来获取更新 "),e("code",null,"https://npm.elemecdn.com/react@^18/"),n("。")])])])],-1),D={href:"https://statically.io/",target:"_blank",rel:"noopener noreferrer"},N=e("li",null,[e("s",null,[n("jsDelivr(已墙):速度最快,原本是最稳的,但域名暴雷后,经常断开,2022.06.01 彻底打不开。配合 Github action,更新后自动访问 jsdelivr CDN 缓存刷新链接,保持页面常新。刷新命令参考 "),e("code",null,"curl https://purge.jsdelivr.net/gh/username/project/file"),n("。")])],-1),C=e("p",null,"由于第三方托管过于不稳定,目前我使用自托管 oss.gpt-vip.top。",-1),G=e("h3",{id:"部署平台",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#部署平台","aria-hidden":"true"},"#"),n(" 部署平台")],-1),E=e("li",null,"Pages:部署简单,外网速度很快,但国内速度不稳,而且 page.dev 域名有时会被墙,可购买便宜的临时域名(一年)来解决该问题。",-1),T=e("li",null,"Netlify:国内速度慢点,图片容易卡死,但还算稳定。",-1),H=e("li",null,"Vercel:推荐使用 GitHub 账户登录,需绑定手机号(不支持 Voice),支持国内手机号。2022.08.26,「*.vercel.app」域名被 DNS 污染,需要绑定自定义域名。",-1),I=e("li",null,"AWS: 邮箱注册,不过需要信用卡认证。",-1),j=e("li",null,"国内平台:Gitee、WuliHub、CODING,都需要实名认证。",-1),K=e("h3",{id:"ipfs",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#ipfs","aria-hidden":"true"},"#"),n(" IPFS")],-1),A=e("p",null,[n("IPFS 无需服务器就可建立静态网站,号称永不失效,但"),e("strong",null,"国内稳定性成疑问,实用性一般"),n("。IPFS 托管在一个网关上,并不会自动复制到所有网关。")],-1),$={href:"https://pinata.cloud/",target:"_blank",rel:"noopener noreferrer"},L=e("sup",{class:"footnote-ref"},[e("a",{href:"#footnote1"},"[1]"),e("a",{class:"footnote-anchor",id:"footnote-ref1"})],-1),R=e("p",null,"上传 ipfs 到 pinata 之后,cloudflare 等其他网关不一定会完全复制文件,php 无法抓取加载,所以不建议使用 cloudflare 网关。",-1),V=e("p",null,[n("cloudflare 接管 pinata 后,ipfs 域名需通过「pinata 托管」>「cloudflare DNS」>「cloudflare SSL」。如果中途将 DNS 指向 "),e("code",null,"http://gateway.pinata.cloud"),n(" 等非 cloudflare ipfs 网关域名,cloudflare SSL 证书将失效。即便把链接改为非加密的 http,pinata 依然会视之为无效链接而拒绝访问。")],-1),W={href:"https://www.cloudflare.com/zh-cn/distributed-web-gateway/",target:"_blank",rel:"noopener noreferrer"},M=i('
        1. 添加 CNAME 记录,将你的 IPFS 域名 xxx.example.com 指向 cloudflare-ipfs.com
        2. _dnslink.xxx.example.com 设置为 dnslink=/ipfs/<your_ipfs_hash_here>

        GitHub 同步到 VPS

        代码、文章推送到 GitHub 后,会自动生成可访问的网页,但国内访问 GitHub Pages 的速度极不稳定,为了确保网站能被正常访问,必须增加国内的访问节点。

        很多人选择 Gitee Pages 作为国内节点,GitHub Actions 将新文档同步到 Gitee,生成位于国内的静态页面 Gitee Pages。但是,Gitee Pages 的限制非常多,免费版无法自定义域名,必须实名验证,更别提近期的下架风波。因此,我没选 Gitee,而是把文档同步到国内服务器(域名需备案)。

        文件夹名称请勿使用大写字母,否则在同步时容易产生错误。

        同步到 FTP

        ',6),q={href:"https://github.com/SamKirkland/FTP-Deploy-Action",target:"_blank",rel:"noopener noreferrer"},B=i(`
        on: push
         name: 🚀 Deploy website on push
         jobs:
           web-deploy:
        diff --git a/assets/TTRSS.html-f6b52843.js b/assets/TTRSS.html-28872b64.js
        similarity index 98%
        rename from assets/TTRSS.html-f6b52843.js
        rename to assets/TTRSS.html-28872b64.js
        index 63bc33c7..bb65487e 100644
        --- a/assets/TTRSS.html-f6b52843.js
        +++ b/assets/TTRSS.html-28872b64.js
        @@ -1,4 +1,4 @@
        -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as l,c as i,a as s,b as e,d as n,w as p,e as c}from"./app-98132e77.js";const d={},w={href:"http://ttrss.henry.wang/zh/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/levito/tt-rss-feedly-theme",target:"_blank",rel:"noopener noreferrer"},h={href:"https://tt-rss.org/wiki/FAQ",target:"_blank",rel:"noopener noreferrer"},m=s("li",null,"定期备份:选择「偏好设置」>「订阅源」导出订阅源和 tt-rss 设置。",-1),_={href:"https://gitlab.tt-rss.org/tt-rss/tt-rss-android/-/releases",target:"_blank",rel:"noopener noreferrer"},b=s("h2",{id:"手动部署",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#手动部署","aria-hidden":"true"},"#"),e(" 手动部署")],-1),v=s("p",null,"虽然 Tiny Tiny RSS 官方推荐用 Docker 部署,不过手动部署也很简单,挑选适合自己的方式即可。",-1),k=s("ol",null,[s("li",null,[e("进入指定目录,"),s("code",null,"cd /www/wwwroot/"),e("。")]),s("li",null,[e("新建 rss 目录,并下载最新 tt-rss,"),s("code",null,"git clone https://git.tt-rss.org/fox/tt-rss.git rss"),e("。")]),s("li",null,"打开 rss 链接,页面会出现指定要求,如:提升文件权限,删除禁用函数 passthru,安装 php 扩展-fileinfo。配置好后,重新加载 php 配置。")],-1),S={href:"https://tt-rss.org/wiki/UpdatingFeeds",target:"_blank",rel:"noopener noreferrer"},f=s("code",null,"lock/update_daemon.lock",-1),T=s("code",null,"update_daemon.stamp",-1),g={href:"https://www.cnblogs.com/imyalost/p/9801426.html",target:"_blank",rel:"noopener noreferrer"},R=c(`
        • 指定 PHP 版本来运行:/www/server/php/74/bin/php /www/wwwroot/rss/update.php --daemon
        • 不指定版本运行:php /www/wwwroot/rss/update.php --daemon

        服务器使用定时任务更新 TTRSS:

        crontab -e #进入 Cpanel 面板添加定时任务
        +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as l,c as i,a as s,b as e,d as n,w as p,e as c}from"./app-91ee3df5.js";const d={},w={href:"http://ttrss.henry.wang/zh/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://github.com/levito/tt-rss-feedly-theme",target:"_blank",rel:"noopener noreferrer"},h={href:"https://tt-rss.org/wiki/FAQ",target:"_blank",rel:"noopener noreferrer"},m=s("li",null,"定期备份:选择「偏好设置」>「订阅源」导出订阅源和 tt-rss 设置。",-1),_={href:"https://gitlab.tt-rss.org/tt-rss/tt-rss-android/-/releases",target:"_blank",rel:"noopener noreferrer"},b=s("h2",{id:"手动部署",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#手动部署","aria-hidden":"true"},"#"),e(" 手动部署")],-1),v=s("p",null,"虽然 Tiny Tiny RSS 官方推荐用 Docker 部署,不过手动部署也很简单,挑选适合自己的方式即可。",-1),k=s("ol",null,[s("li",null,[e("进入指定目录,"),s("code",null,"cd /www/wwwroot/"),e("。")]),s("li",null,[e("新建 rss 目录,并下载最新 tt-rss,"),s("code",null,"git clone https://git.tt-rss.org/fox/tt-rss.git rss"),e("。")]),s("li",null,"打开 rss 链接,页面会出现指定要求,如:提升文件权限,删除禁用函数 passthru,安装 php 扩展-fileinfo。配置好后,重新加载 php 配置。")],-1),S={href:"https://tt-rss.org/wiki/UpdatingFeeds",target:"_blank",rel:"noopener noreferrer"},f=s("code",null,"lock/update_daemon.lock",-1),T=s("code",null,"update_daemon.stamp",-1),g={href:"https://www.cnblogs.com/imyalost/p/9801426.html",target:"_blank",rel:"noopener noreferrer"},R=c(`
        • 指定 PHP 版本来运行:/www/server/php/74/bin/php /www/wwwroot/rss/update.php --daemon
        • 不指定版本运行:php /www/wwwroot/rss/update.php --daemon

        服务器使用定时任务更新 TTRSS:

        crontab -e #进入 Cpanel 面板添加定时任务
         */15 * * * * /usr/bin/php /www/wwwroot/rss/update.php --feeds --quiet #只安装了一个php
         */15 * * * * /www/server/php/74/bin/php /www/wwwroot/rss/update.php --feeds --quiet #安装了多个php
         # 同时按下ctrl+c退出编辑模式,按下shift+: 输入wq 退出 crontab
        diff --git a/assets/VPS.html-ce153cfa.js b/assets/VPS.html-575ede2a.js
        similarity index 99%
        rename from assets/VPS.html-ce153cfa.js
        rename to assets/VPS.html-575ede2a.js
        index 60a78d0a..b93baec3 100644
        --- a/assets/VPS.html-ce153cfa.js
        +++ b/assets/VPS.html-575ede2a.js
        @@ -1,4 +1,4 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as l,c,a as n,b as e,d as a,e as t}from"./app-98132e77.js";const r={},d=n("h2",{id:"环境部署",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#环境部署","aria-hidden":"true"},"#"),e(" 环境部署")],-1),p=n("p",null,"部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。",-1),u=n("h3",{id:"包管理安装",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#包管理安装","aria-hidden":"true"},"#"),e(" 包管理安装")],-1),h={href:"https://nodejs.org/en/download/",target:"_blank",rel:"noopener noreferrer"},m=t(`

        全局安装 yarn 是 npm i yarn -g,pnpm 是 npm i pnpm -g。如果不想全局安装,则去除 -g

        包管理源

        包管理源的修改命令类似,将下方的 npm 替换 yarn 或 pnpm 即可修改包管理源。

        #查看源
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as i,o as l,c,a as n,b as e,d as a,e as t}from"./app-91ee3df5.js";const r={},d=n("h2",{id:"环境部署",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#环境部署","aria-hidden":"true"},"#"),e(" 环境部署")],-1),p=n("p",null,"部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。",-1),u=n("h3",{id:"包管理安装",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#包管理安装","aria-hidden":"true"},"#"),e(" 包管理安装")],-1),h={href:"https://nodejs.org/en/download/",target:"_blank",rel:"noopener noreferrer"},m=t(`

        全局安装 yarn 是 npm i yarn -g,pnpm 是 npm i pnpm -g。如果不想全局安装,则去除 -g

        包管理源

        包管理源的修改命令类似,将下方的 npm 替换 yarn 或 pnpm 即可修改包管理源。

        #查看源
         npm config get registry
         #更换国内源
         npm config set registry https://registry.npmmirror.com/
        diff --git a/assets/Vue.html-3ec376f1.js b/assets/Vue.html-681d8ea0.js
        similarity index 98%
        rename from assets/Vue.html-3ec376f1.js
        rename to assets/Vue.html-681d8ea0.js
        index 3ae45e37..8a10a8a8 100644
        --- a/assets/Vue.html-3ec376f1.js
        +++ b/assets/Vue.html-681d8ea0.js
        @@ -1,4 +1,4 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as i,c as l,a as n,b as s,d as c,e as d}from"./app-98132e77.js";const o={},u=n("h2",{id:"基础知识",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#基础知识","aria-hidden":"true"},"#"),s(" 基础知识")],-1),p=n("p",null,"mounted 是生命周期函数,自动执行。",-1),v=n("p",null,"props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。",-1),r={href:"https://cn.vuejs.org/guide/essentials/event-handling.html#event-modifiers",target:"_blank",rel:"noopener noreferrer"},m=d(`
        //从 Vue 对象中将 ref, reactive, readonly, toRefs 方法解构出来
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as i,c as l,a as n,b as s,d as c,e as d}from"./app-91ee3df5.js";const o={},u=n("h2",{id:"基础知识",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#基础知识","aria-hidden":"true"},"#"),s(" 基础知识")],-1),p=n("p",null,"mounted 是生命周期函数,自动执行。",-1),v=n("p",null,"props 主要用于组件的传值,他的工作就是为了接收外面传过来的数据,与 data、el、ref 是一个级别的配置项。",-1),r={href:"https://cn.vuejs.org/guide/essentials/event-handling.html#event-modifiers",target:"_blank",rel:"noopener noreferrer"},m=d(`
        //从 Vue 对象中将 ref, reactive, readonly, toRefs 方法解构出来
         const { ref, reactive} = Vue;
         
         // setup
        diff --git a/assets/VuePress.html-7ef12a1a.js b/assets/VuePress.html-c5c945b3.js
        similarity index 99%
        rename from assets/VuePress.html-7ef12a1a.js
        rename to assets/VuePress.html-c5c945b3.js
        index 65ee5a1d..234b0b38 100644
        --- a/assets/VuePress.html-7ef12a1a.js
        +++ b/assets/VuePress.html-c5c945b3.js
        @@ -1,4 +1,4 @@
        -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as c,c as p,a as s,b as e,d as n,w as r,e as a}from"./app-98132e77.js";const d={},u={href:"https://v2.vuepress.vuejs.org/zh/guide/getting-started.html",target:"_blank",rel:"noopener noreferrer"},k={href:"https://stackblitz.com/",target:"_blank",rel:"noopener noreferrer"},h=s("code",null,"https://stackblitz.com/github/用户名/仓库名",-1),m={href:"https://theme-hope.vuejs.press/zh/guide/",target:"_blank",rel:"noopener noreferrer"},b={href:"https://theme-hope.vuejs.press/zh/guide/interface/icon.html#iconfont-%E7%B2%BE%E9%80%89%E5%9B%BE%E6%A0%87",target:"_blank",rel:"noopener noreferrer"},v={href:"https://theme-hope.vuejs.press/zh/config/style.html",target:"_blank",rel:"noopener noreferrer"},_={href:"https://github.com/vuepress/awesome-vuepress/blob/main/v2.md",target:"_blank",rel:"noopener noreferrer"},f={href:"https://www.npmjs.com/package/vuepress-plugin-helper-live2d",target:"_blank",rel:"noopener noreferrer"},g=s("h2",{id:"初始配置",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#初始配置","aria-hidden":"true"},"#"),e(" 初始配置")],-1),x=s("li",null,[e("新建文件夹,然后在该路径下运行命令 "),s("code",null,"pnpm create vuepress-theme-hope docs"),e("。vuepress-theme-hope 主题的样例文件会存储在该路径下。有时因版本问题,样例运行会报错,此时须用固定版本号来安装依赖环境,终端中输入 "),s("code",null,"pnpm add vuepress@2.0.0-beta.64 @vuepress/client@2.0.0-beta.64 vuepress-theme-hope@2.0.0-beta.230 && pnpm docs:dev"),e("。")],-1),y=s("li",null,[e("执行命令 "),s("code",null,"pnpm docs:dev"),e(" 启动样例网站。")],-1),E=s("code",null,"docs\\.vuepress",-1),q={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/tree/main/docs/theme/src/.vuepress",target:"_blank",rel:"noopener noreferrer"},w=s("ul",null,[s("li",null,"config.ts:配置网站环境依赖和网站属性。"),s("li",null,"sidebar.ts:侧边栏,集合所有文档的目录。"),s("li",null,"navbar.ts:导航栏,放最常用的文档链接。"),s("li",null,"theme.ts:对主题和插件进行设置。")],-1),B=s("li",null,[e("如果遇到报错,执行命令 "),s("code",null,"pnpm add vuepress@next vuepress-theme-hope && pnpm i && pnpm up"),e(" 修复并升级相关依赖包。如果依然有问题,则删除 node_modules 和 lock 文件,执行 "),s("code",null,"pnpm install && pnpm i && pnpm up"),e(" 重置依赖包文件。")],-1),A=a('

        如果遇到错误 [ERR_MODULE_NOT_FOUND]: Cannot find package,则将 package.json 放在 demo project 中生成 lock 文件,比对 lock 文件是否为正确生成依赖树,将正确的 lock 文件复制到项目下。

        每个插件和主题版本只支持一个 VuePress 版本,因此要稳定的话,需用固定版本号的环境依赖才可以,比如主题 vuepress-theme-hope@2.0.0-beta.230 仅支持 vuepress@2.0.0-beta.64。如果你需要升级主题和 VuePress 版本,请执行以下命令 pnpm dlx vp-update

        搜索插件

        ',3),j={href:"https://v2.vuepress.vuejs.org/zh/reference/plugin/search.html",target:"_blank",rel:"noopener noreferrer"},V={href:"https://v2.vuepress.vuejs.org/zh/reference/plugin/docsearch.html",target:"_blank",rel:"noopener noreferrer"},P={href:"https://crawler.algolia.com/admin/crawlers/bd9cfb06-0346-4a64-9a1a-8a513f0b7fce/overview",target:"_blank",rel:"noopener noreferrer"},z={href:"https://www.algolia.com/apps/M4EXXEZIEG/dashboard",target:"_blank",rel:"noopener noreferrer"},D=s("h2",{id:"webpack-打包",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#webpack-打包","aria-hidden":"true"},"#"),e(" Webpack 打包")],-1),M=s("p",null,"VuePress v2 默认使用 Vite,打包时会引入时间戳和 hash 对文件重命名,导致网站大部分的文件发生更改。即使你并没有更新文章,生成的静态文件也会改变。比如我的笔记网站用的 VuePress 默认配置,每次服务器部署需要 5-15 分钟。",-1),W={href:"https://github.com/libaxuan/LearnHubs/tree/nohashname",target:"_blank",rel:"noopener noreferrer"},U={href:"https://v2.vuepress.vuejs.org/zh/guide/bundler.html",target:"_blank",rel:"noopener noreferrer"},H=a(`
      70. 修改 config.ts 的导入设置,将 import { defineUserConfig } from "vuepress" 替换为 import { defineUserConfig } from "@vuepress/cli",将 import { viteBundler } from "@vuepress/bundler-vite" 替换为 import { webpackBundler } from "@vuepress/bundler-webpack"

      71. Webpack 环境依赖包安装,并运行服务。

        #组合命令,打包使用 Webpack
        +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as c,c as p,a as s,b as e,d as n,w as r,e as a}from"./app-91ee3df5.js";const d={},u={href:"https://v2.vuepress.vuejs.org/zh/guide/getting-started.html",target:"_blank",rel:"noopener noreferrer"},k={href:"https://stackblitz.com/",target:"_blank",rel:"noopener noreferrer"},h=s("code",null,"https://stackblitz.com/github/用户名/仓库名",-1),m={href:"https://theme-hope.vuejs.press/zh/guide/",target:"_blank",rel:"noopener noreferrer"},b={href:"https://theme-hope.vuejs.press/zh/guide/interface/icon.html#iconfont-%E7%B2%BE%E9%80%89%E5%9B%BE%E6%A0%87",target:"_blank",rel:"noopener noreferrer"},v={href:"https://theme-hope.vuejs.press/zh/config/style.html",target:"_blank",rel:"noopener noreferrer"},_={href:"https://github.com/vuepress/awesome-vuepress/blob/main/v2.md",target:"_blank",rel:"noopener noreferrer"},f={href:"https://www.npmjs.com/package/vuepress-plugin-helper-live2d",target:"_blank",rel:"noopener noreferrer"},g=s("h2",{id:"初始配置",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#初始配置","aria-hidden":"true"},"#"),e(" 初始配置")],-1),x=s("li",null,[e("新建文件夹,然后在该路径下运行命令 "),s("code",null,"pnpm create vuepress-theme-hope docs"),e("。vuepress-theme-hope 主题的样例文件会存储在该路径下。有时因版本问题,样例运行会报错,此时须用固定版本号来安装依赖环境,终端中输入 "),s("code",null,"pnpm add vuepress@2.0.0-beta.64 @vuepress/client@2.0.0-beta.64 vuepress-theme-hope@2.0.0-beta.230 && pnpm docs:dev"),e("。")],-1),y=s("li",null,[e("执行命令 "),s("code",null,"pnpm docs:dev"),e(" 启动样例网站。")],-1),E=s("code",null,"docs\\.vuepress",-1),q={href:"https://github.com/vuepress-theme-hope/vuepress-theme-hope/tree/main/docs/theme/src/.vuepress",target:"_blank",rel:"noopener noreferrer"},w=s("ul",null,[s("li",null,"config.ts:配置网站环境依赖和网站属性。"),s("li",null,"sidebar.ts:侧边栏,集合所有文档的目录。"),s("li",null,"navbar.ts:导航栏,放最常用的文档链接。"),s("li",null,"theme.ts:对主题和插件进行设置。")],-1),B=s("li",null,[e("如果遇到报错,执行命令 "),s("code",null,"pnpm add vuepress@next vuepress-theme-hope && pnpm i && pnpm up"),e(" 修复并升级相关依赖包。如果依然有问题,则删除 node_modules 和 lock 文件,执行 "),s("code",null,"pnpm install && pnpm i && pnpm up"),e(" 重置依赖包文件。")],-1),A=a('

        如果遇到错误 [ERR_MODULE_NOT_FOUND]: Cannot find package,则将 package.json 放在 demo project 中生成 lock 文件,比对 lock 文件是否为正确生成依赖树,将正确的 lock 文件复制到项目下。

        每个插件和主题版本只支持一个 VuePress 版本,因此要稳定的话,需用固定版本号的环境依赖才可以,比如主题 vuepress-theme-hope@2.0.0-beta.230 仅支持 vuepress@2.0.0-beta.64。如果你需要升级主题和 VuePress 版本,请执行以下命令 pnpm dlx vp-update

        搜索插件

        ',3),j={href:"https://v2.vuepress.vuejs.org/zh/reference/plugin/search.html",target:"_blank",rel:"noopener noreferrer"},V={href:"https://v2.vuepress.vuejs.org/zh/reference/plugin/docsearch.html",target:"_blank",rel:"noopener noreferrer"},P={href:"https://crawler.algolia.com/admin/crawlers/bd9cfb06-0346-4a64-9a1a-8a513f0b7fce/overview",target:"_blank",rel:"noopener noreferrer"},z={href:"https://www.algolia.com/apps/M4EXXEZIEG/dashboard",target:"_blank",rel:"noopener noreferrer"},D=s("h2",{id:"webpack-打包",tabindex:"-1"},[s("a",{class:"header-anchor",href:"#webpack-打包","aria-hidden":"true"},"#"),e(" Webpack 打包")],-1),M=s("p",null,"VuePress v2 默认使用 Vite,打包时会引入时间戳和 hash 对文件重命名,导致网站大部分的文件发生更改。即使你并没有更新文章,生成的静态文件也会改变。比如我的笔记网站用的 VuePress 默认配置,每次服务器部署需要 5-15 分钟。",-1),W={href:"https://github.com/libaxuan/LearnHubs/tree/nohashname",target:"_blank",rel:"noopener noreferrer"},U={href:"https://v2.vuepress.vuejs.org/zh/guide/bundler.html",target:"_blank",rel:"noopener noreferrer"},H=a(`
      72. 修改 config.ts 的导入设置,将 import { defineUserConfig } from "vuepress" 替换为 import { defineUserConfig } from "@vuepress/cli",将 import { viteBundler } from "@vuepress/bundler-vite" 替换为 import { webpackBundler } from "@vuepress/bundler-webpack"

      73. Webpack 环境依赖包安装,并运行服务。

        #组合命令,打包使用 Webpack
         pnpm add vuepress@next vuepress-theme-hope && pnpm remove vuepress && pnpm add vuepress-webpack@next sass-loader && pnpm i && pnpm up
         
         #运行在本地服务器
        diff --git a/assets/app-98132e77.js b/assets/app-91ee3df5.js
        similarity index 91%
        rename from assets/app-98132e77.js
        rename to assets/app-91ee3df5.js
        index dacd9b0f..9e2dcdd6 100644
        --- a/assets/app-98132e77.js
        +++ b/assets/app-91ee3df5.js
        @@ -1,4 +1,4 @@
        -const p0="modulepreload",d0=function(e){return"/"+e},wa={},d=function(t,n,o){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=d0(i),i in wa)return;wa[i]=!0;const a=i.endsWith(".css"),s=a?'[rel="stylesheet"]':"";if(!!o)for(let p=r.length-1;p>=0;p--){const f=r[p];if(f.href===i&&(!a||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${s}`))return;const u=document.createElement("link");if(u.rel=a?"stylesheet":p0,a||(u.as="script",u.crossOrigin=""),u.href=i,document.head.appendChild(u),a)return new Promise((p,f)=>{u.addEventListener("load",p),u.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t()).catch(i=>{const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=i,window.dispatchEvent(a),!a.defaultPrevented)throw i})};function hi(e,t){const n=Object.create(null),o=e.split(",");for(let r=0;r!!n[r.toLowerCase()]:r=>!!n[r]}const Te={},An=[],vt=()=>{},f0=()=>!1,v0=/^on[^a-z]/,mo=e=>v0.test(e),mi=e=>e.startsWith("onUpdate:"),xe=Object.assign,gi=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},h0=Object.prototype.hasOwnProperty,ve=(e,t)=>h0.call(e,t),G=Array.isArray,Tn=e=>go(e)==="[object Map]",zn=e=>go(e)==="[object Set]",Aa=e=>go(e)==="[object Date]",ne=e=>typeof e=="function",ie=e=>typeof e=="string",Ln=e=>typeof e=="symbol",Ee=e=>e!==null&&typeof e=="object",Xl=e=>(Ee(e)||ne(e))&&ne(e.then)&&ne(e.catch),Jl=Object.prototype.toString,go=e=>Jl.call(e),m0=e=>go(e).slice(8,-1),Ql=e=>go(e)==="[object Object]",_i=e=>ie(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,eo=hi(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),lr=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},g0=/-(\w)/g,at=lr(e=>e.replace(g0,(t,n)=>n?n.toUpperCase():"")),_0=/\B([A-Z])/g,Fn=lr(e=>e.replace(_0,"-$1").toLowerCase()),_o=lr(e=>e.charAt(0).toUpperCase()+e.slice(1)),Tr=lr(e=>e?`on${_o(e)}`:""),cn=(e,t)=>!Object.is(e,t),Go=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Yo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},b0=e=>{const t=ie(e)?Number(e):NaN;return isNaN(t)?e:t};let Ta;const Wr=()=>Ta||(Ta=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function bi(e){if(G(e)){const t={};for(let n=0;n{if(n){const o=n.split(E0);o.length>1&&(t[o[0].trim()]=o[1].trim())}}),t}function yi(e){let t="";if(ie(e))t=e;else if(G(e))for(let n=0;nun(n,t))}const z3=e=>ie(e)?e:e==null?"":G(e)||Ee(e)&&(e.toString===Jl||!ne(e.toString))?JSON.stringify(e,ts,2):String(e),ts=(e,t)=>t&&t.__v_isRef?ts(e,t.value):Tn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[o,r])=>(n[`${o} =>`]=r,n),{})}:zn(t)?{[`Set(${t.size})`]:[...t.values()]}:Ee(t)&&!G(t)&&!Ql(t)?String(t):t;let Ke;class O0{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Ke,!t&&Ke&&(this.index=(Ke.scopes||(Ke.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Ke;try{return Ke=this,t()}finally{Ke=n}}}on(){Ke=this}off(){Ke=this.parent}stop(t){if(this._active){let n,o;for(n=0,o=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},os=e=>(e.w&Kt)>0,rs=e=>(e.n&Kt)>0,R0=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let o=0;o{(p==="length"||!Ln(p)&&p>=c)&&s.push(u)})}else switch(n!==void 0&&s.push(a.get(n)),t){case"add":G(e)?_i(n)&&s.push(a.get("length")):(s.push(a.get(ln)),Tn(e)&&s.push(a.get(Gr)));break;case"delete":G(e)||(s.push(a.get(ln)),Tn(e)&&s.push(a.get(Gr)));break;case"set":Tn(e)&&s.push(a.get(ln));break}if(s.length===1)s[0]&&Kr(s[0]);else{const c=[];for(const u of s)u&&c.push(...u);Kr(wi(c))}}function Kr(e,t){const n=G(e)?e:[...e];for(const o of n)o.computed&&Pa(o);for(const o of n)o.computed||Pa(o)}function Pa(e,t){(e!==pt||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function x0(e,t){var n;return(n=Zo.get(e))==null?void 0:n.get(t)}const D0=hi("__proto__,__v_isRef,__isVue"),ls=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ln)),Oa=C0();function C0(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const o=pe(this);for(let i=0,a=this.length;i{e[t]=function(...n){Hn();const o=pe(this)[t].apply(this,n);return jn(),o}}),e}function V0(e){const t=pe(this);return Ue(t,"has",e),t.hasOwnProperty(e)}class ss{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,o){const r=this._isReadonly,i=this._shallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw"&&o===(r?i?q0:ds:i?ps:us).get(t))return t;const a=G(t);if(!r){if(a&&ve(Oa,n))return Reflect.get(Oa,n,o);if(n==="hasOwnProperty")return V0}const s=Reflect.get(t,n,o);return(Ln(n)?ls.has(n):D0(n))||(r||Ue(t,"get",n),i)?s:ke(s)?a&&_i(n)?s:s.value:Ee(s)?r?Dt(s):bo(s):s}}class cs extends ss{constructor(t=!1){super(!1,t)}set(t,n,o,r){let i=t[n];if(Rn(i)&&ke(i)&&!ke(o))return!1;if(!this._shallow&&(!Xo(o)&&!Rn(o)&&(i=pe(i),o=pe(o)),!G(t)&&ke(i)&&!ke(o)))return i.value=o,!0;const a=G(t)&&_i(n)?Number(n)e,sr=e=>Reflect.getPrototypeOf(e);function xo(e,t,n=!1,o=!1){e=e.__v_raw;const r=pe(e),i=pe(t);n||(cn(t,i)&&Ue(r,"get",t),Ue(r,"get",i));const{has:a}=sr(r),s=o?Ti:n?Oi:lo;if(a.call(r,t))return s(e.get(t));if(a.call(r,i))return s(e.get(i));e!==r&&e.get(t)}function Do(e,t=!1){const n=this.__v_raw,o=pe(n),r=pe(e);return t||(cn(e,r)&&Ue(o,"has",e),Ue(o,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function Co(e,t=!1){return e=e.__v_raw,!t&&Ue(pe(e),"iterate",ln),Reflect.get(e,"size",e)}function ka(e){e=pe(e);const t=pe(this);return sr(t).has.call(t,e)||(t.add(e),Rt(t,"add",e,e)),this}function La(e,t){t=pe(t);const n=pe(this),{has:o,get:r}=sr(n);let i=o.call(n,e);i||(e=pe(e),i=o.call(n,e));const a=r.call(n,e);return n.set(e,t),i?cn(t,a)&&Rt(n,"set",e,t):Rt(n,"add",e,t),this}function Ra(e){const t=pe(this),{has:n,get:o}=sr(t);let r=n.call(t,e);r||(e=pe(e),r=n.call(t,e)),o&&o.call(t,e);const i=t.delete(e);return r&&Rt(t,"delete",e,void 0),i}function Sa(){const e=pe(this),t=e.size!==0,n=e.clear();return t&&Rt(e,"clear",void 0,void 0),n}function Vo(e,t){return function(o,r){const i=this,a=i.__v_raw,s=pe(a),c=t?Ti:e?Oi:lo;return!e&&Ue(s,"iterate",ln),a.forEach((u,p)=>o.call(r,c(u),c(p),i))}}function Mo(e,t,n){return function(...o){const r=this.__v_raw,i=pe(r),a=Tn(i),s=e==="entries"||e===Symbol.iterator&&a,c=e==="keys"&&a,u=r[e](...o),p=n?Ti:t?Oi:lo;return!t&&Ue(i,"iterate",c?Gr:ln),{next(){const{value:f,done:v}=u.next();return v?{value:f,done:v}:{value:s?[p(f[0]),p(f[1])]:p(f),done:v}},[Symbol.iterator](){return this}}}}function $t(e){return function(...t){return e==="delete"?!1:this}}function z0(){const e={get(i){return xo(this,i)},get size(){return Co(this)},has:Do,add:ka,set:La,delete:Ra,clear:Sa,forEach:Vo(!1,!1)},t={get(i){return xo(this,i,!1,!0)},get size(){return Co(this)},has:Do,add:ka,set:La,delete:Ra,clear:Sa,forEach:Vo(!1,!0)},n={get(i){return xo(this,i,!0)},get size(){return Co(this,!0)},has(i){return Do.call(this,i,!0)},add:$t("add"),set:$t("set"),delete:$t("delete"),clear:$t("clear"),forEach:Vo(!0,!1)},o={get(i){return xo(this,i,!0,!0)},get size(){return Co(this,!0)},has(i){return Do.call(this,i,!0)},add:$t("add"),set:$t("set"),delete:$t("delete"),clear:$t("clear"),forEach:Vo(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Mo(i,!1,!1),n[i]=Mo(i,!0,!1),t[i]=Mo(i,!1,!0),o[i]=Mo(i,!0,!0)}),[e,n,t,o]}const[F0,H0,j0,W0]=z0();function Ii(e,t){const n=t?e?W0:j0:e?H0:F0;return(o,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?o:Reflect.get(ve(n,r)&&r in o?n:o,r,i)}const U0={get:Ii(!1,!1)},G0={get:Ii(!1,!0)},K0={get:Ii(!0,!1)},us=new WeakMap,ps=new WeakMap,ds=new WeakMap,q0=new WeakMap;function Y0(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Z0(e){return e.__v_skip||!Object.isExtensible(e)?0:Y0(m0(e))}function bo(e){return Rn(e)?e:Pi(e,!1,B0,U0,us)}function fs(e){return Pi(e,!1,N0,G0,ps)}function Dt(e){return Pi(e,!0,$0,K0,ds)}function Pi(e,t,n,o,r){if(!Ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const a=Z0(e);if(a===0)return e;const s=new Proxy(e,a===2?o:n);return r.set(e,s),s}function In(e){return Rn(e)?In(e.__v_raw):!!(e&&e.__v_isReactive)}function Rn(e){return!!(e&&e.__v_isReadonly)}function Xo(e){return!!(e&&e.__v_isShallow)}function vs(e){return In(e)||Rn(e)}function pe(e){const t=e&&e.__v_raw;return t?pe(t):e}function hs(e){return qo(e,"__v_skip",!0),e}const lo=e=>Ee(e)?bo(e):e,Oi=e=>Ee(e)?Dt(e):e;function ki(e){Ut&&pt&&(e=pe(e),as(e.dep||(e.dep=wi())))}function Li(e,t){e=pe(e);const n=e.dep;n&&Kr(n)}function ke(e){return!!(e&&e.__v_isRef===!0)}function K(e){return ms(e,!1)}function $e(e){return ms(e,!0)}function ms(e,t){return ke(e)?e:new X0(e,t)}class X0{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:pe(t),this._value=n?t:lo(t)}get value(){return ki(this),this._value}set value(t){const n=this.__v_isShallow||Xo(t)||Rn(t);t=n?t:pe(t),cn(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:lo(t),Li(this))}}function dt(e){return ke(e)?e.value:e}const J0={get:(e,t,n)=>dt(Reflect.get(e,t,n)),set:(e,t,n,o)=>{const r=e[t];return ke(r)&&!ke(n)?(r.value=n,!0):Reflect.set(e,t,n,o)}};function gs(e){return In(e)?e:new Proxy(e,J0)}class Q0{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:o}=t(()=>ki(this),()=>Li(this));this._get=n,this._set=o}get value(){return this._get()}set value(t){this._set(t)}}function _s(e){return new Q0(e)}class ep{constructor(t,n,o){this._object=t,this._key=n,this._defaultValue=o,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return x0(pe(this._object),this._key)}}class tp{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Wn(e,t,n){return ke(e)?e:ne(e)?new tp(e):Ee(e)&&arguments.length>1?np(e,t,n):K(e)}function np(e,t,n){const o=e[t];return ke(o)?o:new ep(e,t,n)}class op{constructor(t,n,o,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new Ai(t,()=>{this._dirty||(this._dirty=!0,Li(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=o}get value(){const t=pe(this);return ki(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function rp(e,t,n=!1){let o,r;const i=ne(e);return i?(o=e,r=vt):(o=e.get,r=e.set),new op(o,r,i||!r,n)}function Gt(e,t,n,o){let r;try{r=o?e(...o):e()}catch(i){yo(i,t,n)}return r}function nt(e,t,n,o){if(ne(e)){const i=Gt(e,t,n,o);return i&&Xl(i)&&i.catch(a=>{yo(a,t,n)}),i}const r=[];for(let i=0;i>>1,r=Be[o],i=co(r);iEt&&Be.splice(t,1)}function sp(e){G(e)?Pn.push(...e):(!kt||!kt.includes(e,e.allowRecurse?tn+1:tn))&&Pn.push(e),ys()}function xa(e,t=so?Et+1:0){for(;tco(n)-co(o)),tn=0;tne.id==null?1/0:e.id,cp=(e,t)=>{const n=co(e)-co(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Es(e){qr=!1,so=!0,Be.sort(cp);const t=vt;try{for(Et=0;Etie(h)?h.trim():h)),f&&(r=n.map(Yo))}let s,c=o[s=Tr(t)]||o[s=Tr(at(t))];!c&&i&&(c=o[s=Tr(Fn(t))]),c&&nt(c,e,6,r);const u=o[s+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[s])return;e.emitted[s]=!0,nt(u,e,6,r)}}function ws(e,t,n=!1){const o=t.emitsCache,r=o.get(e);if(r!==void 0)return r;const i=e.emits;let a={},s=!1;if(!ne(e)){const c=u=>{const p=ws(u,t,!0);p&&(s=!0,xe(a,p))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!s?(Ee(e)&&o.set(e,null),null):(G(i)?i.forEach(c=>a[c]=null):xe(a,i),Ee(e)&&o.set(e,a),a)}function ur(e,t){return!e||!mo(t)?!1:(t=t.slice(2).replace(/Once$/,""),ve(e,t[0].toLowerCase()+t.slice(1))||ve(e,Fn(t))||ve(e,t))}let Ze=null,As=null;function Qo(e){const t=Ze;return Ze=e,As=e&&e.type.__scopeId||null,t}function pp(e,t=Ze,n){if(!t||e._n)return e;const o=(...r)=>{o._d&&Wa(-1);const i=Qo(t);let a;try{a=e(...r)}finally{Qo(i),o._d&&Wa(1)}return a};return o._n=!0,o._c=!0,o._d=!0,o}function Ir(e){const{type:t,vnode:n,proxy:o,withProxy:r,props:i,propsOptions:[a],slots:s,attrs:c,emit:u,render:p,renderCache:f,data:v,setupState:h,ctx:_,inheritAttrs:y}=e;let P,E;const k=Qo(e);try{if(n.shapeFlag&4){const I=r||o;P=ut(p.call(I,I,f,i,h,v,_)),E=c}else{const I=t;P=ut(I.length>1?I(i,{attrs:c,slots:s,emit:u}):I(i,null)),E=t.props?c:dp(c)}}catch(I){ro.length=0,yo(I,e,1),P=Le(rt)}let A=P;if(E&&y!==!1){const I=Object.keys(E),{shapeFlag:V}=A;I.length&&V&7&&(a&&I.some(mi)&&(E=fp(E,a)),A=qt(A,E))}return n.dirs&&(A=qt(A),A.dirs=A.dirs?A.dirs.concat(n.dirs):n.dirs),n.transition&&(A.transition=n.transition),P=A,Qo(k),P}const dp=e=>{let t;for(const n in e)(n==="class"||n==="style"||mo(n))&&((t||(t={}))[n]=e[n]);return t},fp=(e,t)=>{const n={};for(const o in e)(!mi(o)||!(o.slice(9)in t))&&(n[o]=e[o]);return n};function vp(e,t,n){const{props:o,children:r,component:i}=e,{props:a,children:s,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return o?Da(o,a,u):!!a;if(c&8){const p=t.dynamicProps;for(let f=0;fe.__isSuspense;function Ts(e,t){t&&t.pendingBranch?G(e)?t.effects.push(...e):t.effects.push(e):sp(e)}function Is(e,t){return Si(e,null,t)}const Bo={};function ae(e,t,n){return Si(e,t,n)}function Si(e,t,{immediate:n,deep:o,flush:r,onTrack:i,onTrigger:a}=Te){var s;const c=ns()===((s=De)==null?void 0:s.scope)?De:null;let u,p=!1,f=!1;if(ke(e)?(u=()=>e.value,p=Xo(e)):In(e)?(u=()=>e,o=!0):G(e)?(f=!0,p=e.some(I=>In(I)||Xo(I)),u=()=>e.map(I=>{if(ke(I))return I.value;if(In(I))return rn(I);if(ne(I))return Gt(I,c,2)})):ne(e)?t?u=()=>Gt(e,c,2):u=()=>{if(!(c&&c.isUnmounted))return v&&v(),nt(e,c,3,[h])}:u=vt,t&&o){const I=u;u=()=>rn(I())}let v,h=I=>{v=k.onStop=()=>{Gt(I,c,4)}},_;if(Dn)if(h=vt,t?n&&nt(t,c,3,[u(),f?[]:void 0,h]):u(),r==="sync"){const I=ud();_=I.__watcherHandles||(I.__watcherHandles=[])}else return vt;let y=f?new Array(e.length).fill(Bo):Bo;const P=()=>{if(k.active)if(t){const I=k.run();(o||p||(f?I.some((V,x)=>cn(V,y[x])):cn(I,y)))&&(v&&v(),nt(t,c,3,[I,y===Bo?void 0:f&&y[0]===Bo?[]:y,h]),y=I)}else k.run()};P.allowRecurse=!!t;let E;r==="sync"?E=P:r==="post"?E=()=>je(P,c&&c.suspense):(P.pre=!0,c&&(P.id=c.uid),E=()=>cr(P));const k=new Ai(u,E);t?n?P():y=k.run():r==="post"?je(k.run.bind(k),c&&c.suspense):k.run();const A=()=>{k.stop(),c&&c.scope&&gi(c.scope.effects,k)};return _&&_.push(A),A}function gp(e,t,n){const o=this.proxy,r=ie(e)?e.includes(".")?Ps(o,e):()=>o[e]:e.bind(o,o);let i;ne(t)?i=t:(i=t.handler,n=t);const a=De;xn(this);const s=Si(r,i.bind(o),n);return a?xn(a):sn(),s}function Ps(e,t){const n=t.split(".");return()=>{let o=e;for(let r=0;r{rn(n,t)});else if(Ql(e))for(const n in e)rn(e[n],t);return e}function F3(e,t){const n=Ze;if(n===null)return e;const o=fr(n)||n.proxy,r=e.dirs||(e.dirs=[]);for(let i=0;i{e.isMounted=!0}),Ci(()=>{e.isUnmounting=!0}),e}const et=[Function,Array],ks={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:et,onEnter:et,onAfterEnter:et,onEnterCancelled:et,onBeforeLeave:et,onLeave:et,onAfterLeave:et,onLeaveCancelled:et,onBeforeAppear:et,onAppear:et,onAfterAppear:et,onAppearCancelled:et},_p={name:"BaseTransition",props:ks,setup(e,{slots:t}){const n=vn(),o=Os();let r;return()=>{const i=t.default&&xi(t.default(),!0);if(!i||!i.length)return;let a=i[0];if(i.length>1){for(const y of i)if(y.type!==rt){a=y;break}}const s=pe(e),{mode:c}=s;if(o.isLeaving)return Pr(a);const u=Ca(a);if(!u)return Pr(a);const p=uo(u,s,o,n);po(u,p);const f=n.subTree,v=f&&Ca(f);let h=!1;const{getTransitionKey:_}=u.type;if(_){const y=_();r===void 0?r=y:y!==r&&(r=y,h=!0)}if(v&&v.type!==rt&&(!nn(u,v)||h)){const y=uo(v,s,o,n);if(po(v,y),c==="out-in")return o.isLeaving=!0,y.afterLeave=()=>{o.isLeaving=!1,n.update.active!==!1&&n.update()},Pr(a);c==="in-out"&&u.type!==rt&&(y.delayLeave=(P,E,k)=>{const A=Ls(o,v);A[String(v.key)]=v,P[Ht]=()=>{E(),P[Ht]=void 0,delete p.delayedLeave},p.delayedLeave=k})}return a}}},bp=_p;function Ls(e,t){const{leavingVNodes:n}=e;let o=n.get(t.type);return o||(o=Object.create(null),n.set(t.type,o)),o}function uo(e,t,n,o){const{appear:r,mode:i,persisted:a=!1,onBeforeEnter:s,onEnter:c,onAfterEnter:u,onEnterCancelled:p,onBeforeLeave:f,onLeave:v,onAfterLeave:h,onLeaveCancelled:_,onBeforeAppear:y,onAppear:P,onAfterAppear:E,onAppearCancelled:k}=t,A=String(e.key),I=Ls(n,e),V=(R,H)=>{R&&nt(R,o,9,H)},x=(R,H)=>{const W=H[1];V(R,H),G(R)?R.every(se=>se.length<=1)&&W():R.length<=1&&W()},$={mode:i,persisted:a,beforeEnter(R){let H=s;if(!n.isMounted)if(r)H=y||s;else return;R[Ht]&&R[Ht](!0);const W=I[A];W&&nn(e,W)&&W.el[Ht]&&W.el[Ht](),V(H,[R])},enter(R){let H=c,W=u,se=p;if(!n.isMounted)if(r)H=P||c,W=E||u,se=k||p;else return;let F=!1;const ee=R[$o]=Pe=>{F||(F=!0,Pe?V(se,[R]):V(W,[R]),$.delayedLeave&&$.delayedLeave(),R[$o]=void 0)};H?x(H,[R,ee]):ee()},leave(R,H){const W=String(e.key);if(R[$o]&&R[$o](!0),n.isUnmounting)return H();V(f,[R]);let se=!1;const F=R[Ht]=ee=>{se||(se=!0,H(),ee?V(_,[R]):V(h,[R]),R[Ht]=void 0,I[W]===e&&delete I[W])};I[W]=e,v?x(v,[R,F]):F()},clone(R){return uo(R,t,n,o)}};return $}function Pr(e){if(Eo(e))return e=qt(e),e.children=null,e}function Ca(e){return Eo(e)?e.children?e.children[0]:void 0:e}function po(e,t){e.shapeFlag&6&&e.component?po(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function xi(e,t=!1,n){let o=[],r=0;for(let i=0;i1)for(let i=0;ixe({name:e.name},t,{setup:e}))():e}const to=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function b(e){ne(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:o,delay:r=200,timeout:i,suspensible:a=!0,onError:s}=e;let c=null,u,p=0;const f=()=>(p++,c=null,v()),v=()=>{let h;return c||(h=c=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),s)return new Promise((y,P)=>{s(_,()=>y(f()),()=>P(_),p+1)});throw _}).then(_=>h!==c&&c?c:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),u=_,_)))};return B({name:"AsyncComponentWrapper",__asyncLoader:v,get __asyncResolved(){return u},setup(){const h=De;if(u)return()=>Or(u,h);const _=k=>{c=null,yo(k,h,13,!o)};if(a&&h.suspense||Dn)return v().then(k=>()=>Or(k,h)).catch(k=>(_(k),()=>o?Le(o,{error:k}):null));const y=K(!1),P=K(),E=K(!!r);return r&&setTimeout(()=>{E.value=!1},r),i!=null&&setTimeout(()=>{if(!y.value&&!P.value){const k=new Error(`Async component timed out after ${i}ms.`);_(k),P.value=k}},i),v().then(()=>{y.value=!0,h.parent&&Eo(h.parent.vnode)&&cr(h.parent.update)}).catch(k=>{_(k),P.value=k}),()=>{if(y.value&&u)return Or(u,h);if(P.value&&o)return Le(o,{error:P.value});if(n&&!E.value)return Le(n)}}})}function Or(e,t){const{ref:n,props:o,children:r,ce:i}=t.vnode,a=Le(e,o,r);return a.ref=n,a.ce=i,delete t.vnode.ce,a}const Eo=e=>e.type.__isKeepAlive;function yp(e,t){Rs(e,"a",t)}function Ep(e,t){Rs(e,"da",t)}function Rs(e,t,n=De){const o=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(pr(t,o,n),n){let r=n.parent;for(;r&&r.parent;)Eo(r.parent.vnode)&&wp(o,t,n,r),r=r.parent}}function wp(e,t,n,o){const r=pr(t,e,o,!0);fn(()=>{gi(o[t],r)},n)}function pr(e,t,n=De,o=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...a)=>{if(n.isUnmounted)return;Hn(),xn(n);const s=nt(t,n,e,a);return sn(),jn(),s});return o?r.unshift(i):r.push(i),i}}const Ct=e=>(t,n=De)=>(!Dn||e==="sp")&&pr(e,(...o)=>t(...o),n),Di=Ct("bm"),ge=Ct("m"),Ap=Ct("bu"),Ss=Ct("u"),Ci=Ct("bum"),fn=Ct("um"),Tp=Ct("sp"),Ip=Ct("rtg"),Pp=Ct("rtc");function Op(e,t=De){pr("ec",e,t)}const xs="components";function Je(e,t){return Lp(xs,e,!0,t)||e}const kp=Symbol.for("v-ndc");function Lp(e,t,n=!0,o=!1){const r=Ze||De;if(r){const i=r.type;if(e===xs){const s=ld(i,!1);if(s&&(s===t||s===at(t)||s===_o(at(t))))return i}const a=Va(r[e]||i[e],t)||Va(r.appContext[e],t);return!a&&o?i:a}}function Va(e,t){return e&&(e[t]||e[at(t)]||e[_o(at(t))])}function H3(e,t,n,o){let r;const i=n&&n[o];if(G(e)||ie(e)){r=new Array(e.length);for(let a=0,s=e.length;at(a,s,void 0,i&&i[s]));else{const a=Object.keys(e);r=new Array(a.length);for(let s=0,c=a.length;se?Gs(e)?fr(e)||e.proxy:Yr(e.parent):null,no=xe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Yr(e.parent),$root:e=>Yr(e.root),$emit:e=>e.emit,$options:e=>Vi(e),$forceUpdate:e=>e.f||(e.f=()=>cr(e.update)),$nextTick:e=>e.n||(e.n=Xt.bind(e.proxy)),$watch:e=>gp.bind(e)}),kr=(e,t)=>e!==Te&&!e.__isScriptSetup&&ve(e,t),Rp={get({_:e},t){const{ctx:n,setupState:o,data:r,props:i,accessCache:a,type:s,appContext:c}=e;let u;if(t[0]!=="$"){const h=a[t];if(h!==void 0)switch(h){case 1:return o[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(kr(o,t))return a[t]=1,o[t];if(r!==Te&&ve(r,t))return a[t]=2,r[t];if((u=e.propsOptions[0])&&ve(u,t))return a[t]=3,i[t];if(n!==Te&&ve(n,t))return a[t]=4,n[t];Zr&&(a[t]=0)}}const p=no[t];let f,v;if(p)return t==="$attrs"&&Ue(e,"get",t),p(e);if((f=s.__cssModules)&&(f=f[t]))return f;if(n!==Te&&ve(n,t))return a[t]=4,n[t];if(v=c.config.globalProperties,ve(v,t))return v[t]},set({_:e},t,n){const{data:o,setupState:r,ctx:i}=e;return kr(r,t)?(r[t]=n,!0):o!==Te&&ve(o,t)?(o[t]=n,!0):ve(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:o,appContext:r,propsOptions:i}},a){let s;return!!n[a]||e!==Te&&ve(e,a)||kr(t,a)||(s=i[0])&&ve(s,a)||ve(o,a)||ve(no,a)||ve(r.config.globalProperties,a)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ve(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Ma(e){return G(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Zr=!0;function Sp(e){const t=Vi(e),n=e.proxy,o=e.ctx;Zr=!1,t.beforeCreate&&Ba(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:a,watch:s,provide:c,inject:u,created:p,beforeMount:f,mounted:v,beforeUpdate:h,updated:_,activated:y,deactivated:P,beforeDestroy:E,beforeUnmount:k,destroyed:A,unmounted:I,render:V,renderTracked:x,renderTriggered:$,errorCaptured:R,serverPrefetch:H,expose:W,inheritAttrs:se,components:F,directives:ee,filters:Pe}=t;if(u&&xp(u,o,null),a)for(const oe in a){const Z=a[oe];ne(Z)&&(o[oe]=Z.bind(n))}if(r){const oe=r.call(n,n);Ee(oe)&&(e.data=bo(oe))}if(Zr=!0,i)for(const oe in i){const Z=i[oe],st=ne(Z)?Z.bind(n,n):ne(Z.get)?Z.get.bind(n,n):vt,Bt=!ne(Z)&&ne(Z.set)?Z.set.bind(n):vt,_t=T({get:st,set:Bt});Object.defineProperty(o,oe,{enumerable:!0,configurable:!0,get:()=>_t.value,set:He=>_t.value=He})}if(s)for(const oe in s)Ds(s[oe],o,n,oe);if(c){const oe=ne(c)?c.call(n):c;Reflect.ownKeys(oe).forEach(Z=>{ot(Z,oe[Z])})}p&&Ba(p,e,"c");function Y(oe,Z){G(Z)?Z.forEach(st=>oe(st.bind(n))):Z&&oe(Z.bind(n))}if(Y(Di,f),Y(ge,v),Y(Ap,h),Y(Ss,_),Y(yp,y),Y(Ep,P),Y(Op,R),Y(Pp,x),Y(Ip,$),Y(Ci,k),Y(fn,I),Y(Tp,H),G(W))if(W.length){const oe=e.exposed||(e.exposed={});W.forEach(Z=>{Object.defineProperty(oe,Z,{get:()=>n[Z],set:st=>n[Z]=st})})}else e.exposed||(e.exposed={});V&&e.render===vt&&(e.render=V),se!=null&&(e.inheritAttrs=se),F&&(e.components=F),ee&&(e.directives=ee)}function xp(e,t,n=vt){G(e)&&(e=Xr(e));for(const o in e){const r=e[o];let i;Ee(r)?"default"in r?i=de(r.from||o,r.default,!0):i=de(r.from||o):i=de(r),ke(i)?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>i.value,set:a=>i.value=a}):t[o]=i}}function Ba(e,t,n){nt(G(e)?e.map(o=>o.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ds(e,t,n,o){const r=o.includes(".")?Ps(n,o):()=>n[o];if(ie(e)){const i=t[e];ne(i)&&ae(r,i)}else if(ne(e))ae(r,e.bind(n));else if(Ee(e))if(G(e))e.forEach(i=>Ds(i,t,n,o));else{const i=ne(e.handler)?e.handler.bind(n):t[e.handler];ne(i)&&ae(r,i,e)}}function Vi(e){const t=e.type,{mixins:n,extends:o}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:a}}=e.appContext,s=i.get(t);let c;return s?c=s:!r.length&&!n&&!o?c=t:(c={},r.length&&r.forEach(u=>er(c,u,a,!0)),er(c,t,a)),Ee(t)&&i.set(t,c),c}function er(e,t,n,o=!1){const{mixins:r,extends:i}=t;i&&er(e,i,n,!0),r&&r.forEach(a=>er(e,a,n,!0));for(const a in t)if(!(o&&a==="expose")){const s=Dp[a]||n&&n[a];e[a]=s?s(e[a],t[a]):t[a]}return e}const Dp={data:$a,props:Na,emits:Na,methods:Qn,computed:Qn,beforeCreate:Ne,created:Ne,beforeMount:Ne,mounted:Ne,beforeUpdate:Ne,updated:Ne,beforeDestroy:Ne,beforeUnmount:Ne,destroyed:Ne,unmounted:Ne,activated:Ne,deactivated:Ne,errorCaptured:Ne,serverPrefetch:Ne,components:Qn,directives:Qn,watch:Vp,provide:$a,inject:Cp};function $a(e,t){return t?e?function(){return xe(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function Cp(e,t){return Qn(Xr(e),Xr(t))}function Xr(e){if(G(e)){const t={};for(let n=0;n1)return n&&ne(t)?t.call(o&&o.proxy):t}}function $p(e,t,n,o=!1){const r={},i={};qo(i,dr,1),e.propsDefaults=Object.create(null),Vs(e,t,r,i);for(const a in e.propsOptions[0])a in r||(r[a]=void 0);n?e.props=o?r:fs(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Np(e,t,n,o){const{props:r,attrs:i,vnode:{patchFlag:a}}=e,s=pe(r),[c]=e.propsOptions;let u=!1;if((o||a>0)&&!(a&16)){if(a&8){const p=e.vnode.dynamicProps;for(let f=0;f{c=!0;const[v,h]=Ms(f,t,!0);xe(a,v),h&&s.push(...h)};!n&&t.mixins.length&&t.mixins.forEach(p),e.extends&&p(e.extends),e.mixins&&e.mixins.forEach(p)}if(!i&&!c)return Ee(e)&&o.set(e,An),An;if(G(i))for(let p=0;p-1,h[1]=y<0||_-1||ve(h,"default"))&&s.push(f)}}}const u=[a,s];return Ee(e)&&o.set(e,u),u}function za(e){return e[0]!=="$"}function Fa(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function Ha(e,t){return Fa(e)===Fa(t)}function ja(e,t){return G(t)?t.findIndex(n=>Ha(n,e)):ne(t)&&Ha(t,e)?0:-1}const Bs=e=>e[0]==="_"||e==="$stable",Mi=e=>G(e)?e.map(ut):[ut(e)],zp=(e,t,n)=>{if(t._n)return t;const o=pp((...r)=>Mi(t(...r)),n);return o._c=!1,o},$s=(e,t,n)=>{const o=e._ctx;for(const r in e){if(Bs(r))continue;const i=e[r];if(ne(i))t[r]=zp(r,i,o);else if(i!=null){const a=Mi(i);t[r]=()=>a}}},Ns=(e,t)=>{const n=Mi(t);e.slots.default=()=>n},Fp=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=pe(t),qo(t,"_",n)):$s(t,e.slots={})}else e.slots={},t&&Ns(e,t);qo(e.slots,dr,1)},Hp=(e,t,n)=>{const{vnode:o,slots:r}=e;let i=!0,a=Te;if(o.shapeFlag&32){const s=t._;s?n&&s===1?i=!1:(xe(r,t),!n&&s===1&&delete r._):(i=!t.$stable,$s(t,r)),a=t}else t&&(Ns(e,t),a={default:1});if(i)for(const s in r)!Bs(s)&&a[s]==null&&delete r[s]};function nr(e,t,n,o,r=!1){if(G(e)){e.forEach((v,h)=>nr(v,t&&(G(t)?t[h]:t),n,o,r));return}if(to(o)&&!r)return;const i=o.shapeFlag&4?fr(o.component)||o.component.proxy:o.el,a=r?null:i,{i:s,r:c}=e,u=t&&t.r,p=s.refs===Te?s.refs={}:s.refs,f=s.setupState;if(u!=null&&u!==c&&(ie(u)?(p[u]=null,ve(f,u)&&(f[u]=null)):ke(u)&&(u.value=null)),ne(c))Gt(c,s,12,[a,p]);else{const v=ie(c),h=ke(c);if(v||h){const _=()=>{if(e.f){const y=v?ve(f,c)?f[c]:p[c]:c.value;r?G(y)&&gi(y,i):G(y)?y.includes(i)||y.push(i):v?(p[c]=[i],ve(f,c)&&(f[c]=p[c])):(c.value=[i],e.k&&(p[e.k]=c.value))}else v?(p[c]=a,ve(f,c)&&(f[c]=a)):h&&(c.value=a,e.k&&(p[e.k]=a))};a?(_.id=-1,je(_,n)):_()}}}let Nt=!1;const No=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",zo=e=>e.nodeType===8;function jp(e){const{mt:t,p:n,o:{patchProp:o,createText:r,nextSibling:i,parentNode:a,remove:s,insert:c,createComment:u}}=e,p=(A,I)=>{if(!I.hasChildNodes()){n(null,A,I),Jo(),I._vnode=A;return}Nt=!1,f(I.firstChild,A,null,null,null),Jo(),I._vnode=A,Nt&&console.error("Hydration completed but contains mismatches.")},f=(A,I,V,x,$,R=!1)=>{const H=zo(A)&&A.data==="[",W=()=>y(A,I,V,x,$,H),{type:se,ref:F,shapeFlag:ee,patchFlag:Pe}=I;let Oe=A.nodeType;I.el=A,Pe===-2&&(R=!1,I.dynamicChildren=null);let Y=null;switch(se){case Sn:Oe!==3?I.children===""?(c(I.el=r(""),a(A),A),Y=A):Y=W():(A.data!==I.children&&(Nt=!0,A.data=I.children),Y=i(A));break;case rt:if(Oe!==8||H)if(A.tagName.toLowerCase()==="template"){const oe=I.el.content.firstChild;E(oe,A,V),I.el=A=oe,Y=i(A)}else Y=W();else Y=i(A);break;case oo:if(H&&(A=i(A),Oe=A.nodeType),Oe===1||Oe===3){Y=A;const oe=!I.children.length;for(let Z=0;Z{R=R||!!I.dynamicChildren;const{type:H,props:W,patchFlag:se,shapeFlag:F,dirs:ee,transition:Pe}=I,Oe=H==="input"&&ee||H==="option";if(Oe||se!==-1){if(ee&&yt(I,null,V,"created"),W)if(Oe||!R||se&48)for(const Z in W)(Oe&&Z.endsWith("value")||mo(Z)&&!eo(Z))&&o(A,Z,null,W[Z],!1,void 0,V);else W.onClick&&o(A,"onClick",null,W.onClick,!1,void 0,V);let Y;(Y=W&&W.onVnodeBeforeMount)&&tt(Y,V,I);let oe=!1;if(k(A)){oe=zs(x,Pe)&&V&&V.vnode.props&&V.vnode.props.appear;const Z=A.content.firstChild;oe&&Pe.beforeEnter(Z),E(Z,A,V),I.el=A=Z}if(ee&&yt(I,null,V,"beforeMount"),((Y=W&&W.onVnodeMounted)||ee||oe)&&Ts(()=>{Y&&tt(Y,V,I),oe&&Pe.enter(A),ee&&yt(I,null,V,"mounted")},x),F&16&&!(W&&(W.innerHTML||W.textContent))){let Z=h(A.firstChild,I,A,V,x,$,R);for(;Z;){Nt=!0;const st=Z;Z=Z.nextSibling,s(st)}}else F&8&&A.textContent!==I.children&&(Nt=!0,A.textContent=I.children)}return A.nextSibling},h=(A,I,V,x,$,R,H)=>{H=H||!!I.dynamicChildren;const W=I.children,se=W.length;for(let F=0;F{const{slotScopeIds:H}=I;H&&($=$?$.concat(H):H);const W=a(A),se=h(i(A),I,W,V,x,$,R);return se&&zo(se)&&se.data==="]"?i(I.anchor=se):(Nt=!0,c(I.anchor=u("]"),W,se),se)},y=(A,I,V,x,$,R)=>{if(Nt=!0,I.el=null,R){const se=P(A);for(;;){const F=i(A);if(F&&F!==se)s(F);else break}}const H=i(A),W=a(A);return s(A),n(null,I,W,H,V,x,No(W),$),H},P=(A,I="[",V="]")=>{let x=0;for(;A;)if(A=i(A),A&&zo(A)&&(A.data===I&&x++,A.data===V)){if(x===0)return i(A);x--}return A},E=(A,I,V)=>{const x=I.parentNode;x&&x.replaceChild(A,I);let $=V;for(;$;)$.vnode.el===I&&($.vnode.el=A,$.subTree.el=A),$=$.parent},k=A=>A.nodeType===1&&A.tagName.toLowerCase()==="template";return[p,f]}const je=Ts;function Wp(e){return Up(e,jp)}function Up(e,t){const n=Wr();n.__VUE__=!0;const{insert:o,remove:r,patchProp:i,createElement:a,createText:s,createComment:c,setText:u,setElementText:p,parentNode:f,nextSibling:v,setScopeId:h=vt,insertStaticContent:_}=e,y=(m,g,w,O=null,S=null,D=null,j=!1,M=null,N=!!g.dynamicChildren)=>{if(m===g)return;m&&!nn(m,g)&&(O=L(m),He(m,S,D,!0),m=null),g.patchFlag===-2&&(N=!1,g.dynamicChildren=null);const{type:C,ref:J,shapeFlag:q}=g;switch(C){case Sn:P(m,g,w,O);break;case rt:E(m,g,w,O);break;case oo:m==null&&k(g,w,O,j);break;case qe:F(m,g,w,O,S,D,j,M,N);break;default:q&1?V(m,g,w,O,S,D,j,M,N):q&6?ee(m,g,w,O,S,D,j,M,N):(q&64||q&128)&&C.process(m,g,w,O,S,D,j,M,N,z)}J!=null&&S&&nr(J,m&&m.ref,D,g||m,!g)},P=(m,g,w,O)=>{if(m==null)o(g.el=s(g.children),w,O);else{const S=g.el=m.el;g.children!==m.children&&u(S,g.children)}},E=(m,g,w,O)=>{m==null?o(g.el=c(g.children||""),w,O):g.el=m.el},k=(m,g,w,O)=>{[m.el,m.anchor]=_(m.children,g,w,O,m.el,m.anchor)},A=({el:m,anchor:g},w,O)=>{let S;for(;m&&m!==g;)S=v(m),o(m,w,O),m=S;o(g,w,O)},I=({el:m,anchor:g})=>{let w;for(;m&&m!==g;)w=v(m),r(m),m=w;r(g)},V=(m,g,w,O,S,D,j,M,N)=>{j=j||g.type==="svg",m==null?x(g,w,O,S,D,j,M,N):H(m,g,S,D,j,M,N)},x=(m,g,w,O,S,D,j,M)=>{let N,C;const{type:J,props:q,shapeFlag:Q,transition:te,dirs:le}=m;if(N=m.el=a(m.type,D,q&&q.is,q),Q&8?p(N,m.children):Q&16&&R(m.children,N,null,O,S,D&&J!=="foreignObject",j,M),le&&yt(m,null,O,"created"),$(N,m,m.scopeId,j,O),q){for(const be in q)be!=="value"&&!eo(be)&&i(N,be,null,q[be],D,m.children,O,S,Me);"value"in q&&i(N,"value",null,q.value),(C=q.onVnodeBeforeMount)&&tt(C,O,m)}le&&yt(m,null,O,"beforeMount");const Ae=zs(S,te);Ae&&te.beforeEnter(N),o(N,g,w),((C=q&&q.onVnodeMounted)||Ae||le)&&je(()=>{C&&tt(C,O,m),Ae&&te.enter(N),le&&yt(m,null,O,"mounted")},S)},$=(m,g,w,O,S)=>{if(w&&h(m,w),O)for(let D=0;D{for(let C=N;C{const M=g.el=m.el;let{patchFlag:N,dynamicChildren:C,dirs:J}=g;N|=m.patchFlag&16;const q=m.props||Te,Q=g.props||Te;let te;w&&Qt(w,!1),(te=Q.onVnodeBeforeUpdate)&&tt(te,w,g,m),J&&yt(g,m,w,"beforeUpdate"),w&&Qt(w,!0);const le=S&&g.type!=="foreignObject";if(C?W(m.dynamicChildren,C,M,w,O,le,D):j||Z(m,g,M,null,w,O,le,D,!1),N>0){if(N&16)se(M,g,q,Q,w,O,S);else if(N&2&&q.class!==Q.class&&i(M,"class",null,Q.class,S),N&4&&i(M,"style",q.style,Q.style,S),N&8){const Ae=g.dynamicProps;for(let be=0;be{te&&tt(te,w,g,m),J&&yt(g,m,w,"updated")},O)},W=(m,g,w,O,S,D,j)=>{for(let M=0;M{if(w!==O){if(w!==Te)for(const M in w)!eo(M)&&!(M in O)&&i(m,M,w[M],null,j,g.children,S,D,Me);for(const M in O){if(eo(M))continue;const N=O[M],C=w[M];N!==C&&M!=="value"&&i(m,M,C,N,j,g.children,S,D,Me)}"value"in O&&i(m,"value",w.value,O.value)}},F=(m,g,w,O,S,D,j,M,N)=>{const C=g.el=m?m.el:s(""),J=g.anchor=m?m.anchor:s("");let{patchFlag:q,dynamicChildren:Q,slotScopeIds:te}=g;te&&(M=M?M.concat(te):te),m==null?(o(C,w,O),o(J,w,O),R(g.children,w,J,S,D,j,M,N)):q>0&&q&64&&Q&&m.dynamicChildren?(W(m.dynamicChildren,Q,w,S,D,j,M),(g.key!=null||S&&g===S.subTree)&&Fs(m,g,!0)):Z(m,g,w,J,S,D,j,M,N)},ee=(m,g,w,O,S,D,j,M,N)=>{g.slotScopeIds=M,m==null?g.shapeFlag&512?S.ctx.activate(g,w,O,j,N):Pe(g,w,O,S,D,j,N):Oe(m,g,N)},Pe=(m,g,w,O,S,D,j)=>{const M=m.component=nd(m,O,S);if(Eo(m)&&(M.ctx.renderer=z),od(M),M.asyncDep){if(S&&S.registerDep(M,Y),!m.el){const N=M.subTree=Le(rt);E(null,N,g,w)}return}Y(M,m,g,w,S,D,j)},Oe=(m,g,w)=>{const O=g.component=m.component;if(vp(m,g,w))if(O.asyncDep&&!O.asyncResolved){oe(O,g,w);return}else O.next=g,lp(O.update),O.update();else g.el=m.el,O.vnode=g},Y=(m,g,w,O,S,D,j)=>{const M=()=>{if(m.isMounted){let{next:J,bu:q,u:Q,parent:te,vnode:le}=m,Ae=J,be;Qt(m,!1),J?(J.el=le.el,oe(m,J,j)):J=le,q&&Go(q),(be=J.props&&J.props.onVnodeBeforeUpdate)&&tt(be,te,J,le),Qt(m,!0);const Se=Ir(m),ct=m.subTree;m.subTree=Se,y(ct,Se,f(ct.el),L(ct),m,S,D),J.el=Se.el,Ae===null&&hp(m,Se.el),Q&&je(Q,S),(be=J.props&&J.props.onVnodeUpdated)&&je(()=>tt(be,te,J,le),S)}else{let J;const{el:q,props:Q}=g,{bm:te,m:le,parent:Ae}=m,be=to(g);if(Qt(m,!1),te&&Go(te),!be&&(J=Q&&Q.onVnodeBeforeMount)&&tt(J,Ae,g),Qt(m,!0),q&&me){const Se=()=>{m.subTree=Ir(m),me(q,m.subTree,m,S,null)};be?g.type.__asyncLoader().then(()=>!m.isUnmounted&&Se()):Se()}else{const Se=m.subTree=Ir(m);y(null,Se,w,O,m,S,D),g.el=Se.el}if(le&&je(le,S),!be&&(J=Q&&Q.onVnodeMounted)){const Se=g;je(()=>tt(J,Ae,Se),S)}(g.shapeFlag&256||Ae&&to(Ae.vnode)&&Ae.vnode.shapeFlag&256)&&m.a&&je(m.a,S),m.isMounted=!0,g=w=O=null}},N=m.effect=new Ai(M,()=>cr(C),m.scope),C=m.update=()=>N.run();C.id=m.uid,Qt(m,!0),C()},oe=(m,g,w)=>{g.component=m;const O=m.vnode.props;m.vnode=g,m.next=null,Np(m,g.props,O,w),Hp(m,g.children,w),Hn(),xa(),jn()},Z=(m,g,w,O,S,D,j,M,N=!1)=>{const C=m&&m.children,J=m?m.shapeFlag:0,q=g.children,{patchFlag:Q,shapeFlag:te}=g;if(Q>0){if(Q&128){Bt(C,q,w,O,S,D,j,M,N);return}else if(Q&256){st(C,q,w,O,S,D,j,M,N);return}}te&8?(J&16&&Me(C,S,D),q!==C&&p(w,q)):J&16?te&16?Bt(C,q,w,O,S,D,j,M,N):Me(C,S,D,!0):(J&8&&p(w,""),te&16&&R(q,w,O,S,D,j,M,N))},st=(m,g,w,O,S,D,j,M,N)=>{m=m||An,g=g||An;const C=m.length,J=g.length,q=Math.min(C,J);let Q;for(Q=0;QJ?Me(m,S,D,!0,!1,q):R(g,w,O,S,D,j,M,N,q)},Bt=(m,g,w,O,S,D,j,M,N)=>{let C=0;const J=g.length;let q=m.length-1,Q=J-1;for(;C<=q&&C<=Q;){const te=m[C],le=g[C]=N?jt(g[C]):ut(g[C]);if(nn(te,le))y(te,le,w,null,S,D,j,M,N);else break;C++}for(;C<=q&&C<=Q;){const te=m[q],le=g[Q]=N?jt(g[Q]):ut(g[Q]);if(nn(te,le))y(te,le,w,null,S,D,j,M,N);else break;q--,Q--}if(C>q){if(C<=Q){const te=Q+1,le=teQ)for(;C<=q;)He(m[C],S,D,!0),C++;else{const te=C,le=C,Ae=new Map;for(C=le;C<=Q;C++){const Ge=g[C]=N?jt(g[C]):ut(g[C]);Ge.key!=null&&Ae.set(Ge.key,C)}let be,Se=0;const ct=Q-le+1;let _n=!1,ba=0;const Kn=new Array(ct);for(C=0;C=ct){He(Ge,S,D,!0);continue}let bt;if(Ge.key!=null)bt=Ae.get(Ge.key);else for(be=le;be<=Q;be++)if(Kn[be-le]===0&&nn(Ge,g[be])){bt=be;break}bt===void 0?He(Ge,S,D,!0):(Kn[bt-le]=C+1,bt>=ba?ba=bt:_n=!0,y(Ge,g[bt],w,null,S,D,j,M,N),Se++)}const ya=_n?Gp(Kn):An;for(be=ya.length-1,C=ct-1;C>=0;C--){const Ge=le+C,bt=g[Ge],Ea=Ge+1{const{el:D,type:j,transition:M,children:N,shapeFlag:C}=m;if(C&6){_t(m.component.subTree,g,w,O);return}if(C&128){m.suspense.move(g,w,O);return}if(C&64){j.move(m,g,w,z);return}if(j===qe){o(D,g,w);for(let q=0;qM.enter(D),S);else{const{leave:q,delayLeave:Q,afterLeave:te}=M,le=()=>o(D,g,w),Ae=()=>{q(D,()=>{le(),te&&te()})};Q?Q(D,le,Ae):Ae()}else o(D,g,w)},He=(m,g,w,O=!1,S=!1)=>{const{type:D,props:j,ref:M,children:N,dynamicChildren:C,shapeFlag:J,patchFlag:q,dirs:Q}=m;if(M!=null&&nr(M,null,w,m,!0),J&256){g.ctx.deactivate(m);return}const te=J&1&&Q,le=!to(m);let Ae;if(le&&(Ae=j&&j.onVnodeBeforeUnmount)&&tt(Ae,g,m),J&6)So(m.component,w,O);else{if(J&128){m.suspense.unmount(w,O);return}te&&yt(m,null,g,"beforeUnmount"),J&64?m.type.remove(m,g,w,S,z,O):C&&(D!==qe||q>0&&q&64)?Me(C,g,w,!1,!0):(D===qe&&q&384||!S&&J&16)&&Me(N,g,w),O&&mn(m)}(le&&(Ae=j&&j.onVnodeUnmounted)||te)&&je(()=>{Ae&&tt(Ae,g,m),te&&yt(m,null,g,"unmounted")},w)},mn=m=>{const{type:g,el:w,anchor:O,transition:S}=m;if(g===qe){gn(w,O);return}if(g===oo){I(m);return}const D=()=>{r(w),S&&!S.persisted&&S.afterLeave&&S.afterLeave()};if(m.shapeFlag&1&&S&&!S.persisted){const{leave:j,delayLeave:M}=S,N=()=>j(w,D);M?M(m.el,D,N):N()}else D()},gn=(m,g)=>{let w;for(;m!==g;)w=v(m),r(m),m=w;r(g)},So=(m,g,w)=>{const{bum:O,scope:S,update:D,subTree:j,um:M}=m;O&&Go(O),S.stop(),D&&(D.active=!1,He(j,m,g,w)),M&&je(M,g),je(()=>{m.isUnmounted=!0},g),g&&g.pendingBranch&&!g.isUnmounted&&m.asyncDep&&!m.asyncResolved&&m.suspenseId===g.pendingId&&(g.deps--,g.deps===0&&g.resolve())},Me=(m,g,w,O=!1,S=!1,D=0)=>{for(let j=D;jm.shapeFlag&6?L(m.component.subTree):m.shapeFlag&128?m.suspense.next():v(m.anchor||m.el),U=(m,g,w)=>{m==null?g._vnode&&He(g._vnode,null,null,!0):y(g._vnode||null,m,g,null,null,null,w),xa(),Jo(),g._vnode=m},z={p:y,um:He,m:_t,r:mn,mt:Pe,mc:R,pc:Z,pbc:W,n:L,o:e};let X,me;return t&&([X,me]=t(z)),{render:U,hydrate:X,createApp:Bp(U,X)}}function Qt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function zs(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Fs(e,t,n=!1){const o=e.children,r=t.children;if(G(o)&&G(r))for(let i=0;i>1,e[n[s]]0&&(t[o]=n[i-1]),n[i]=o)}}for(i=n.length,a=n[i-1];i-- >0;)n[i]=a,a=t[a];return n}const Kp=e=>e.__isTeleport,qe=Symbol.for("v-fgt"),Sn=Symbol.for("v-txt"),rt=Symbol.for("v-cmt"),oo=Symbol.for("v-stc"),ro=[];let ft=null;function qp(e=!1){ro.push(ft=e?null:[])}function Yp(){ro.pop(),ft=ro[ro.length-1]||null}let fo=1;function Wa(e){fo+=e}function Hs(e){return e.dynamicChildren=fo>0?ft||An:null,Yp(),fo>0&&ft&&ft.push(e),e}function j3(e,t,n,o,r,i){return Hs(Ws(e,t,n,o,r,i,!0))}function Zp(e,t,n,o,r){return Hs(Le(e,t,n,o,r,!0))}function Qr(e){return e?e.__v_isVNode===!0:!1}function nn(e,t){return e.type===t.type&&e.key===t.key}const dr="__vInternal",js=({key:e})=>e??null,Ko=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ie(e)||ke(e)||ne(e)?{i:Ze,r:e,k:t,f:!!n}:e:null);function Ws(e,t=null,n=null,o=0,r=null,i=e===qe?0:1,a=!1,s=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&js(t),ref:t&&Ko(t),scopeId:As,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:o,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:Ze};return s?(Bi(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=ie(n)?8:16),fo>0&&!a&&ft&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&ft.push(c),c}const Le=Xp;function Xp(e,t=null,n=null,o=0,r=null,i=!1){if((!e||e===kp)&&(e=rt),Qr(e)){const s=qt(e,t,!0);return n&&Bi(s,n),fo>0&&!i&&ft&&(s.shapeFlag&6?ft[ft.indexOf(e)]=s:ft.push(s)),s.patchFlag|=-2,s}if(sd(e)&&(e=e.__vccOpts),t){t=Jp(t);let{class:s,style:c}=t;s&&!ie(s)&&(t.class=yi(s)),Ee(c)&&(vs(c)&&!G(c)&&(c=xe({},c)),t.style=bi(c))}const a=ie(e)?1:mp(e)?128:Kp(e)?64:Ee(e)?4:ne(e)?2:0;return Ws(e,t,n,o,r,a,i,!0)}function Jp(e){return e?vs(e)||dr in e?xe({},e):e:null}function qt(e,t,n=!1){const{props:o,ref:r,patchFlag:i,children:a}=e,s=t?Qp(o||{},t):o;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:s,key:s&&js(s),ref:t&&t.ref?n&&r?G(r)?r.concat(Ko(t)):[r,Ko(t)]:Ko(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==qe?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&qt(e.ssContent),ssFallback:e.ssFallback&&qt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Us(e=" ",t=0){return Le(Sn,null,e,t)}function W3(e,t){const n=Le(oo,null,e);return n.staticCount=t,n}function U3(e="",t=!1){return t?(qp(),Zp(rt,null,e)):Le(rt,null,e)}function ut(e){return e==null||typeof e=="boolean"?Le(rt):G(e)?Le(qe,null,e.slice()):typeof e=="object"?jt(e):Le(Sn,null,String(e))}function jt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:qt(e)}function Bi(e,t){let n=0;const{shapeFlag:o}=e;if(t==null)t=null;else if(G(t))n=16;else if(typeof t=="object")if(o&65){const r=t.default;r&&(r._c&&(r._d=!1),Bi(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(dr in t)?t._ctx=Ze:r===3&&Ze&&(Ze.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ne(t)?(t={default:t,_ctx:Ze},n=32):(t=String(t),o&64?(n=16,t=[Us(t)]):n=8);e.children=t,e.shapeFlag|=n}function Qp(...e){const t={};for(let n=0;nDe||Ze;let $i,bn,Ua="__VUE_INSTANCE_SETTERS__";(bn=Wr()[Ua])||(bn=Wr()[Ua]=[]),bn.push(e=>De=e),$i=e=>{bn.length>1?bn.forEach(t=>t(e)):bn[0](e)};const xn=e=>{$i(e),e.scope.on()},sn=()=>{De&&De.scope.off(),$i(null)};function Gs(e){return e.vnode.shapeFlag&4}let Dn=!1;function od(e,t=!1){Dn=t;const{props:n,children:o}=e.vnode,r=Gs(e);$p(e,n,r,t),Fp(e,o);const i=r?rd(e,t):void 0;return Dn=!1,i}function rd(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=hs(new Proxy(e.ctx,Rp));const{setup:o}=n;if(o){const r=e.setupContext=o.length>1?ad(e):null;xn(e),Hn();const i=Gt(o,e,0,[e.props,r]);if(jn(),sn(),Xl(i)){if(i.then(sn,sn),t)return i.then(a=>{Ga(e,a,t)}).catch(a=>{yo(a,e,0)});e.asyncDep=i}else Ga(e,i,t)}else Ks(e,t)}function Ga(e,t,n){ne(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Ee(t)&&(e.setupState=gs(t)),Ks(e,n)}let Ka;function Ks(e,t,n){const o=e.type;if(!e.render){if(!t&&Ka&&!o.render){const r=o.template||Vi(e).template;if(r){const{isCustomElement:i,compilerOptions:a}=e.appContext.config,{delimiters:s,compilerOptions:c}=o,u=xe(xe({isCustomElement:i,delimiters:s},a),c);o.render=Ka(r,u)}}e.render=o.render||vt}{xn(e),Hn();try{Sp(e)}finally{jn(),sn()}}}function id(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return Ue(e,"get","$attrs"),t[n]}}))}function ad(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return id(e)},slots:e.slots,emit:e.emit,expose:t}}function fr(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(gs(hs(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in no)return no[n](e)},has(t,n){return n in t||n in no}}))}function ld(e,t=!0){return ne(e)?e.displayName||e.name:e.name||t&&e.__name}function sd(e){return ne(e)&&"__vccOpts"in e}const T=(e,t)=>rp(e,t,Dn);function l(e,t,n){const o=arguments.length;return o===2?Ee(t)&&!G(t)?Qr(t)?Le(e,null,[t]):Le(e,t):Le(e,null,t):(o>3?n=Array.prototype.slice.call(arguments,2):o===3&&Qr(n)&&(n=[n]),Le(e,t,n))}const cd=Symbol.for("v-scx"),ud=()=>de(cd),pd="3.3.7",dd="http://www.w3.org/2000/svg",on=typeof document<"u"?document:null,qa=on&&on.createElement("template"),fd={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,o)=>{const r=t?on.createElementNS(dd,e):on.createElement(e,n?{is:n}:void 0);return e==="select"&&o&&o.multiple!=null&&r.setAttribute("multiple",o.multiple),r},createText:e=>on.createTextNode(e),createComment:e=>on.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>on.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,o,r,i){const a=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{qa.innerHTML=o?`${e}`:e;const s=qa.content;if(o){const c=s.firstChild;for(;c.firstChild;)s.appendChild(c.firstChild);s.removeChild(c)}t.insertBefore(s,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},zt="transition",qn="animation",Cn=Symbol("_vtc"),Yt=(e,{slots:t})=>l(bp,Ys(e),t);Yt.displayName="Transition";const qs={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},vd=Yt.props=xe({},ks,qs),en=(e,t=[])=>{G(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ya=e=>e?G(e)?e.some(t=>t.length>1):e.length>1:!1;function Ys(e){const t={};for(const F in e)F in qs||(t[F]=e[F]);if(e.css===!1)return t;const{name:n="v",type:o,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:s=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=a,appearToClass:p=s,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:v=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,_=hd(r),y=_&&_[0],P=_&&_[1],{onBeforeEnter:E,onEnter:k,onEnterCancelled:A,onLeave:I,onLeaveCancelled:V,onBeforeAppear:x=E,onAppear:$=k,onAppearCancelled:R=A}=t,H=(F,ee,Pe)=>{Ft(F,ee?p:s),Ft(F,ee?u:a),Pe&&Pe()},W=(F,ee)=>{F._isLeaving=!1,Ft(F,f),Ft(F,h),Ft(F,v),ee&&ee()},se=F=>(ee,Pe)=>{const Oe=F?$:k,Y=()=>H(ee,F,Pe);en(Oe,[ee,Y]),Za(()=>{Ft(ee,F?c:i),It(ee,F?p:s),Ya(Oe)||Xa(ee,o,y,Y)})};return xe(t,{onBeforeEnter(F){en(E,[F]),It(F,i),It(F,a)},onBeforeAppear(F){en(x,[F]),It(F,c),It(F,u)},onEnter:se(!1),onAppear:se(!0),onLeave(F,ee){F._isLeaving=!0;const Pe=()=>W(F,ee);It(F,f),Xs(),It(F,v),Za(()=>{F._isLeaving&&(Ft(F,f),It(F,h),Ya(I)||Xa(F,o,P,Pe))}),en(I,[F,Pe])},onEnterCancelled(F){H(F,!1),en(A,[F])},onAppearCancelled(F){H(F,!0),en(R,[F])},onLeaveCancelled(F){W(F),en(V,[F])}})}function hd(e){if(e==null)return null;if(Ee(e))return[Lr(e.enter),Lr(e.leave)];{const t=Lr(e);return[t,t]}}function Lr(e){return b0(e)}function It(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Cn]||(e[Cn]=new Set)).add(t)}function Ft(e,t){t.split(/\s+/).forEach(o=>o&&e.classList.remove(o));const n=e[Cn];n&&(n.delete(t),n.size||(e[Cn]=void 0))}function Za(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let md=0;function Xa(e,t,n,o){const r=e._endId=++md,i=()=>{r===e._endId&&o()};if(n)return setTimeout(i,n);const{type:a,timeout:s,propCount:c}=Zs(e,t);if(!a)return o();const u=a+"end";let p=0;const f=()=>{e.removeEventListener(u,v),i()},v=h=>{h.target===e&&++p>=c&&f()};setTimeout(()=>{p(n[_]||"").split(", "),r=o(`${zt}Delay`),i=o(`${zt}Duration`),a=Ja(r,i),s=o(`${qn}Delay`),c=o(`${qn}Duration`),u=Ja(s,c);let p=null,f=0,v=0;t===zt?a>0&&(p=zt,f=a,v=i.length):t===qn?u>0&&(p=qn,f=u,v=c.length):(f=Math.max(a,u),p=f>0?a>u?zt:qn:null,v=p?p===zt?i.length:c.length:0);const h=p===zt&&/\b(transform|all)(,|$)/.test(o(`${zt}Property`).toString());return{type:p,timeout:f,propCount:v,hasTransform:h}}function Ja(e,t){for(;e.lengthQa(n)+Qa(e[o])))}function Qa(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Xs(){return document.body.offsetHeight}function gd(e,t,n){const o=e[Cn];o&&(t=(t?[t,...o]:[...o]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ni=Symbol("_vod"),G3={beforeMount(e,{value:t},{transition:n}){e[Ni]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Yn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:o}){!t!=!n&&(o?t?(o.beforeEnter(e),Yn(e,!0),o.enter(e)):o.leave(e,()=>{Yn(e,!1)}):Yn(e,t))},beforeUnmount(e,{value:t}){Yn(e,t)}};function Yn(e,t){e.style.display=t?e[Ni]:"none"}function _d(e,t,n){const o=e.style,r=ie(n);if(n&&!r){if(t&&!ie(t))for(const i in t)n[i]==null&&ei(o,i,"");for(const i in n)ei(o,i,n[i])}else{const i=o.display;r?t!==n&&(o.cssText=n):t&&e.removeAttribute("style"),Ni in e&&(o.display=i)}}const el=/\s*!important$/;function ei(e,t,n){if(G(n))n.forEach(o=>ei(e,t,o));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const o=bd(e,t);el.test(n)?e.setProperty(Fn(o),n.replace(el,""),"important"):e[o]=n}}const tl=["Webkit","Moz","ms"],Rr={};function bd(e,t){const n=Rr[t];if(n)return n;let o=at(t);if(o!=="filter"&&o in e)return Rr[t]=o;o=_o(o);for(let r=0;rSr||(Id.then(()=>Sr=0),Sr=Date.now());function Od(e,t){const n=o=>{if(!o._vts)o._vts=Date.now();else if(o._vts<=n.attached)return;nt(kd(o,n.value),t,5,[o])};return n.value=e,n.attached=Pd(),n}function kd(e,t){if(G(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(o=>r=>!r._stopped&&o&&o(r))}else return t}const il=/^on[a-z]/,Ld=(e,t,n,o,r=!1,i,a,s,c)=>{t==="class"?gd(e,o,r):t==="style"?_d(e,n,o):mo(t)?mi(t)||Ad(e,t,n,o,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Rd(e,t,o,r))?Ed(e,t,o,i,a,s,c):(t==="true-value"?e._trueValue=o:t==="false-value"&&(e._falseValue=o),yd(e,t,o,r))};function Rd(e,t,n,o){return o?!!(t==="innerHTML"||t==="textContent"||t in e&&il.test(t)&&ne(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||il.test(t)&&ie(n)?!1:t in e}const Js=new WeakMap,Qs=new WeakMap,or=Symbol("_moveCb"),al=Symbol("_enterCb"),ec={name:"TransitionGroup",props:xe({},vd,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=vn(),o=Os();let r,i;return Ss(()=>{if(!r.length)return;const a=e.moveClass||`${e.name||"v"}-move`;if(!Md(r[0].el,n.vnode.el,a))return;r.forEach(Dd),r.forEach(Cd);const s=r.filter(Vd);Xs(),s.forEach(c=>{const u=c.el,p=u.style;It(u,a),p.transform=p.webkitTransform=p.transitionDuration="";const f=u[or]=v=>{v&&v.target!==u||(!v||/transform$/.test(v.propertyName))&&(u.removeEventListener("transitionend",f),u[or]=null,Ft(u,a))};u.addEventListener("transitionend",f)})}),()=>{const a=pe(e),s=Ys(a);let c=a.tag||qe;r=i,i=t.default?xi(t.default()):[];for(let u=0;udelete e.mode;ec.props;const xd=ec;function Dd(e){const t=e.el;t[or]&&t[or](),t[al]&&t[al]()}function Cd(e){Qs.set(e,e.el.getBoundingClientRect())}function Vd(e){const t=Js.get(e),n=Qs.get(e),o=t.left-n.left,r=t.top-n.top;if(o||r){const i=e.el.style;return i.transform=i.webkitTransform=`translate(${o}px,${r}px)`,i.transitionDuration="0s",e}}function Md(e,t,n){const o=e.cloneNode(),r=e[Cn];r&&r.forEach(s=>{s.split(/\s+/).forEach(c=>c&&o.classList.remove(c))}),n.split(/\s+/).forEach(s=>s&&o.classList.add(s)),o.style.display="none";const i=t.nodeType===1?t:t.parentNode;i.appendChild(o);const{hasTransform:a}=Zs(o);return i.removeChild(o),a}const Zt=e=>{const t=e.props["onUpdate:modelValue"]||!1;return G(t)?n=>Go(t,n):t};function Bd(e){e.target.composing=!0}function ll(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const it=Symbol("_assign"),sl={created(e,{modifiers:{lazy:t,trim:n,number:o}},r){e[it]=Zt(r);const i=o||r.props&&r.props.type==="number";Lt(e,t?"change":"input",a=>{if(a.target.composing)return;let s=e.value;n&&(s=s.trim()),i&&(s=Yo(s)),e[it](s)}),n&&Lt(e,"change",()=>{e.value=e.value.trim()}),t||(Lt(e,"compositionstart",Bd),Lt(e,"compositionend",ll),Lt(e,"change",ll))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:o,number:r}},i){if(e[it]=Zt(i),e.composing||document.activeElement===e&&e.type!=="range"&&(n||o&&e.value.trim()===t||(r||e.type==="number")&&Yo(e.value)===t))return;const a=t??"";e.value!==a&&(e.value=a)}},$d={deep:!0,created(e,t,n){e[it]=Zt(n),Lt(e,"change",()=>{const o=e._modelValue,r=Vn(e),i=e.checked,a=e[it];if(G(o)){const s=Ei(o,r),c=s!==-1;if(i&&!c)a(o.concat(r));else if(!i&&c){const u=[...o];u.splice(s,1),a(u)}}else if(zn(o)){const s=new Set(o);i?s.add(r):s.delete(r),a(s)}else a(tc(e,i))})},mounted:cl,beforeUpdate(e,t,n){e[it]=Zt(n),cl(e,t,n)}};function cl(e,{value:t,oldValue:n},o){e._modelValue=t,G(t)?e.checked=Ei(t,o.props.value)>-1:zn(t)?e.checked=t.has(o.props.value):t!==n&&(e.checked=un(t,tc(e,!0)))}const Nd={created(e,{value:t},n){e.checked=un(t,n.props.value),e[it]=Zt(n),Lt(e,"change",()=>{e[it](Vn(e))})},beforeUpdate(e,{value:t,oldValue:n},o){e[it]=Zt(o),t!==n&&(e.checked=un(t,o.props.value))}},zd={deep:!0,created(e,{value:t,modifiers:{number:n}},o){const r=zn(t);Lt(e,"change",()=>{const i=Array.prototype.filter.call(e.options,a=>a.selected).map(a=>n?Yo(Vn(a)):Vn(a));e[it](e.multiple?r?new Set(i):i:i[0])}),e[it]=Zt(o)},mounted(e,{value:t}){ul(e,t)},beforeUpdate(e,t,n){e[it]=Zt(n)},updated(e,{value:t}){ul(e,t)}};function ul(e,t){const n=e.multiple;if(!(n&&!G(t)&&!zn(t))){for(let o=0,r=e.options.length;o-1:i.selected=t.has(a);else if(un(Vn(i),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Vn(e){return"_value"in e?e._value:e.value}function tc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const K3={created(e,t,n){Fo(e,t,n,null,"created")},mounted(e,t,n){Fo(e,t,n,null,"mounted")},beforeUpdate(e,t,n,o){Fo(e,t,n,o,"beforeUpdate")},updated(e,t,n,o){Fo(e,t,n,o,"updated")}};function Fd(e,t){switch(e){case"SELECT":return zd;case"TEXTAREA":return sl;default:switch(t){case"checkbox":return $d;case"radio":return Nd;default:return sl}}}function Fo(e,t,n,o,r){const a=Fd(e.tagName,n.props&&n.props.type)[r];a&&a(e,t,n,o)}const Hd=xe({patchProp:Ld},fd);let xr,pl=!1;function jd(){return xr=pl?xr:Wp(Hd),pl=!0,xr}const Wd=(...e)=>{const t=jd().createApp(...e),{mount:n}=t;return t.mount=o=>{const r=Ud(o);if(r)return n(r,!0,r instanceof SVGElement)},t};function Ud(e){return ie(e)?document.querySelector(e):e}const Gd={"v-3f9d0d55":()=>d(()=>import("./DailyRoutine.html-45bc8078.js"),[]).then(({data:e})=>e),"v-3d0aa58a":()=>d(()=>import("./Fitness.html-082e6f81.js"),[]).then(({data:e})=>e),"v-8daa1a0e":()=>d(()=>import("./index.html-525fa52c.js"),[]).then(({data:e})=>e),"v-35f5db9e":()=>d(()=>import("./blog.html-b8343597.js"),[]).then(({data:e})=>e),"v-184f4da6":()=>d(()=>import("./intro.html-ee68295b.js"),[]).then(({data:e})=>e),"v-26a023fe":()=>d(()=>import("./2017-04-18-wechat_multi_open.html-fca25568.js"),[]).then(({data:e})=>e),"v-6222deab":()=>d(()=>import("./2017-04-22-rss_feed43_feedex.html-d6c63121.js"),[]).then(({data:e})=>e),"v-009a3fd6":()=>d(()=>import("./2017-07-28-office_2016_installer_error.html-d96ee67b.js"),[]).then(({data:e})=>e),"v-0d41d5d0":()=>d(()=>import("./2017-07-29-onenote_2016_cannot_be_logged_in.html-ea21af9c.js"),[]).then(({data:e})=>e),"v-c914fd10":()=>d(()=>import("./2017-09-02-forced_shutdown.html-db43df26.js"),[]).then(({data:e})=>e),"v-4576f198":()=>d(()=>import("./2017-09-03-smb_lan_sharing.html-9d2ccb13.js"),[]).then(({data:e})=>e),"v-e6f7cb8e":()=>d(()=>import("./2017-10-18-light_cat_e8-c-epon_admin.html-cfc6a771.js"),[]).then(({data:e})=>e),"v-5da24c3c":()=>d(()=>import("./2017-10-18-light_cat_port_forwarding.html-ae035b52.js"),[]).then(({data:e})=>e),"v-28c3d540":()=>d(()=>import("./2018-01-19-forget_the_cdn.html-cf13e6bf.js"),[]).then(({data:e})=>e),"v-b3818c3c":()=>d(()=>import("./2018-01-31-hire_a_robot.html-1d3a15d6.js"),[]).then(({data:e})=>e),"v-579c385c":()=>d(()=>import("./2018-04-30-baota_deploy_vps.html-99a3be7a.js"),[]).then(({data:e})=>e),"v-06691c4f":()=>d(()=>import("./2018-05-01-jekyll_blog_on_github_pages.html-0e4367ff.js"),[]).then(({data:e})=>e),"v-24d2d83a":()=>d(()=>import("./2018-05-02-jekyll_blog_on_vps.html-8cd05264.js"),[]).then(({data:e})=>e),"v-adf0c772":()=>d(()=>import("./2018-05-03-jekyll_blog_autodeploy.html-81e2ae25.js"),[]).then(({data:e})=>e),"v-730defc4":()=>d(()=>import("./2018-05-04-audition_cut_mp3.html-410a979a.js"),[]).then(({data:e})=>e),"v-1f0840b1":()=>d(()=>import("./2018-05-15-aria2_a_new_download_tool.html-604fc85e.js"),[]).then(({data:e})=>e),"v-5ae43900":()=>d(()=>import("./2018-05-24-airtable_noob.html-9bff118d.js"),[]).then(({data:e})=>e),"v-a3025528":()=>d(()=>import("./2018-06-08-baizhuo_gp1700.html-6a7e5ecd.js"),[]).then(({data:e})=>e),"v-5ad6240c":()=>d(()=>import("./2018-06-10-koolproxy_https.html-8e656fc3.js"),[]).then(({data:e})=>e),"v-77515ff2":()=>d(()=>import("./2018-06-19-iptv_direckly.html-ca48eeb4.js"),[]).then(({data:e})=>e),"v-73041b3a":()=>d(()=>import("./2018-10-07-huginn_scraping_any_website.html-4d569b7a.js"),[]).then(({data:e})=>e),"v-1004794e":()=>d(()=>import("./2018-12-28-voice_input_try.html-3b761608.js"),[]).then(({data:e})=>e),"v-7463267c":()=>d(()=>import("./2019-03-31-openvpn_back_to_home.html-6640b9b5.js"),[]).then(({data:e})=>e),"v-302b03de":()=>d(()=>import("./2019-04-01-rsshub_noob.html-1703a0d1.js"),[]).then(({data:e})=>e),"v-346c34d4":()=>d(()=>import("./2019-08-26-scrcpy_screen_projection.html-f0be4b9a.js"),[]).then(({data:e})=>e),"v-d8439540":()=>d(()=>import("./2020-03-25-rsshub_on_vps.html-7d6da547.js"),[]).then(({data:e})=>e),"v-273cf11f":()=>d(()=>import("./2020-09-13-wifi_speed_up.html-3af57f92.js"),[]).then(({data:e})=>e),"v-18a7959b":()=>d(()=>import("./2020-09-22-uefi_asus_board.html-747f6999.js"),[]).then(({data:e})=>e),"v-491d5d68":()=>d(()=>import("./2020-11-27-rime_input.html-afb70fad.js"),[]).then(({data:e})=>e),"v-0418b0dc":()=>d(()=>import("./2021-01-02-keepass_the_real_lastpassword.html-a4ffbce0.js"),[]).then(({data:e})=>e),"v-63fefb94":()=>d(()=>import("./2021-01-27-blog_jekyll_to_wordpress.html-9a858812.js"),[]).then(({data:e})=>e),"v-0a6bc026":()=>d(()=>import("./2021-05-31-principles_criticism_and_self-criticism.html-59f13f91.js"),[]).then(({data:e})=>e),"v-5a064ff2":()=>d(()=>import("./2021-10-23-nas_with_rsshub_and_huginn.html-62b54118.js"),[]).then(({data:e})=>e),"v-39faf312":()=>d(()=>import("./2022-01-23-wechat_lucky_money_cover.html-22ca671e.js"),[]).then(({data:e})=>e),"v-313c5888":()=>d(()=>import("./2022-02-19-microsoft_store_fixed.html-0c72525e.js"),[]).then(({data:e})=>e),"v-61d0df0c":()=>d(()=>import("./2022-03-17-rss_persistent_link_collection.html-78647e96.js"),[]).then(({data:e})=>e),"v-df55a79e":()=>d(()=>import("./2022-03-21-winget_the_strongest_software_manager_for_windows.html-eaa0fea1.js"),[]).then(({data:e})=>e),"v-24bf700c":()=>d(()=>import("./2022-04-21-uivision_rpa.html-420db56b.js"),[]).then(({data:e})=>e),"v-9029f640":()=>d(()=>import("./2022-06-07-blog_md_to_wordpress.html-c182ddcd.js"),[]).then(({data:e})=>e),"v-6eacd3db":()=>d(()=>import("./2022-08-22-learndata_blog_to_knowledge_management.html-d71063f3.js"),[]).then(({data:e})=>e),"v-69739db8":()=>d(()=>import("./2022-11-03-ffmpeg_screen_recording.html-9d5cfd1f.js"),[]).then(({data:e})=>e),"v-333dd8ee":()=>d(()=>import("./2023-01-26-whiteboard_gtd.html-cd88f1c6.js"),[]).then(({data:e})=>e),"v-5e3d84de":()=>d(()=>import("./2023-09-05-virtual_positioning.html-b145435f.js"),[]).then(({data:e})=>e),"v-72653828":()=>d(()=>import("./2023-10-07-clone-voice.html-c9e1aae4.js"),[]).then(({data:e})=>e),"v-e381b74e":()=>d(()=>import("./2023-10-29-switch-firmware-updates.html-9cb5f9dc.js"),[]).then(({data:e})=>e),"v-b90f383c":()=>d(()=>import("./2023-12-12-eu.org-free-domain.html-500a42db.js"),[]).then(({data:e})=>e),"v-22230056":()=>d(()=>import("./2023-12-12-sd-op.html-ca048d22.js"),[]).then(({data:e})=>e),"v-af1fbe54":()=>d(()=>import("./2023-12-13-awesome-selfhosted-cn.html-1ee63837.js"),[]).then(({data:e})=>e),"v-0d25d1e4":()=>d(()=>import("./AIEnjoy.html-5e2fb1af.js"),[]).then(({data:e})=>e),"v-7b101d14":()=>d(()=>import("./ChatGPT.html-8df7a842.js"),[]).then(({data:e})=>e),"v-2c379a13":()=>d(()=>import("./Midjourney.html-8161c780.js"),[]).then(({data:e})=>e),"v-69693975":()=>d(()=>import("./AppNotes.html-3d9f7248.js"),[]).then(({data:e})=>e),"v-1735a0be":()=>d(()=>import("./Applist.html-298fe23a.js"),[]).then(({data:e})=>e),"v-d967ed6c":()=>d(()=>import("./ChatGPT.html-36342337.js"),[]).then(({data:e})=>e),"v-5c29014a":()=>d(()=>import("./Chrome.html-a20ac378.js"),[]).then(({data:e})=>e),"v-1d7dd2b7":()=>d(()=>import("./design.html-779e25c7.js"),[]).then(({data:e})=>e),"v-abe04fa2":()=>d(()=>import("./AutoHotkey.html-b49d3269.js"),[]).then(({data:e})=>e),"v-fae223a4":()=>d(()=>import("./Electron.html-0d63b015.js"),[]).then(({data:e})=>e),"v-67fe64b6":()=>d(()=>import("./HTML.html-ded0c051.js"),[]).then(({data:e})=>e),"v-72cba7c3":()=>d(()=>import("./Javascript.html-40c30c8e.js"),[]).then(({data:e})=>e),"v-0195f17e":()=>d(()=>import("./Markdown.html-470c21a4.js"),[]).then(({data:e})=>e),"v-2caa5134":()=>d(()=>import("./Python.html-5a8ec16d.js"),[]).then(({data:e})=>e),"v-146a1089":()=>d(()=>import("./index.html-69fb594a.js"),[]).then(({data:e})=>e),"v-49ecfa5b":()=>d(()=>import("./Regex.html-d99f639d.js"),[]).then(({data:e})=>e),"v-6bea56bc":()=>d(()=>import("./Vue.html-42ae00ac.js"),[]).then(({data:e})=>e),"v-88193f16":()=>d(()=>import("./CloudServices.html-4b4cb2a8.js"),[]).then(({data:e})=>e),"v-1c7fca9e":()=>d(()=>import("./Cloudflare.html-ef317977.js"),[]).then(({data:e})=>e),"v-2b70157f":()=>d(()=>import("./DNS.html-509a1466.js"),[]).then(({data:e})=>e),"v-bc154f32":()=>d(()=>import("./GitHub.html-44536f4d.js"),[]).then(({data:e})=>e),"v-d4ab9bf4":()=>d(()=>import("./MySQL.html-e44b25dd.js"),[]).then(({data:e})=>e),"v-7c5f209c":()=>d(()=>import("./Static.html-a963f439.js"),[]).then(({data:e})=>e),"v-39dc98a2":()=>d(()=>import("./VPS.html-a47e95dd.js"),[]).then(({data:e})=>e),"v-c582fe3e":()=>d(()=>import("./Coupon.html-b1d1aabf.js"),[]).then(({data:e})=>e),"v-373dc153":()=>d(()=>import("./Diet.html-50c2f9e4.js"),[]).then(({data:e})=>e),"v-9ff4249e":()=>d(()=>import("./HomeAutomation.html-f2340371.js"),[]).then(({data:e})=>e),"v-16a2796a":()=>d(()=>import("./Life.html-5412bc87.js"),[]).then(({data:e})=>e),"v-850f3410":()=>d(()=>import("./Maintenance.html-5985d0c1.js"),[]).then(({data:e})=>e),"v-182a363a":()=>d(()=>import("./Medical.html-80b7c6b9.js"),[]).then(({data:e})=>e),"v-c51c66fe":()=>d(()=>import("./Shoppinglist.html-a29393a2.js"),[]).then(({data:e})=>e),"v-101edae1":()=>d(()=>import("./Docker.html-03086503.js"),[]).then(({data:e})=>e),"v-73fe61b2":()=>d(()=>import("./Huginn.html-d778a6d3.js"),[]).then(({data:e})=>e),"v-1b2d4c91":()=>d(()=>import("./NAS.html-92bd9dc2.js"),[]).then(({data:e})=>e),"v-54e731c2":()=>d(()=>import("./TTRSS.html-23061294.js"),[]).then(({data:e})=>e),"v-00f6d5f1":()=>d(()=>import("./Comments.html-4fbb14f8.js"),[]).then(({data:e})=>e),"v-3b0b9f28":()=>d(()=>import("./VuePress.html-a4d3ac36.js"),[]).then(({data:e})=>e),"v-3cdca328":()=>d(()=>import("./docsify.html-1f505e6f.js"),[]).then(({data:e})=>e),"v-6451f4a2":()=>d(()=>import("./NewSystem.html-66bcc93c.js"),[]).then(({data:e})=>e),"v-395a6953":()=>d(()=>import("./QTTabBar.html-5fab5039.js"),[]).then(({data:e})=>e),"v-a8b7dd1a":()=>d(()=>import("./cd.html-fc67c435.js"),[]).then(({data:e})=>e),"v-5e2612f0":()=>d(()=>import("./faq.html-8e17da76.js"),[]).then(({data:e})=>e),"v-df9d5022":()=>d(()=>import("./mac.html-a292b24e.js"),[]).then(({data:e})=>e),"v-12e41b33":()=>d(()=>import("./index.html-043723ad.js"),[]).then(({data:e})=>e),"v-bdd9cae6":()=>d(()=>import("./0_live_equipments.html-1863c925.js"),[]).then(({data:e})=>e),"v-63cd7175":()=>d(()=>import("./1_obs_basic.html-6f272223.js"),[]).then(({data:e})=>e),"v-1ace0584":()=>d(()=>import("./2_obs_streamfx.html-66261335.js"),[]).then(({data:e})=>e),"v-78ae0f01":()=>d(()=>import("./3_obs_plugins.html-6194c452.js"),[]).then(({data:e})=>e),"v-21f30b82":()=>d(()=>import("./4_live_effects.html-2d59706b.js"),[]).then(({data:e})=>e),"v-0094e0b6":()=>d(()=>import("./5_live_platforms.html-982a62c6.js"),[]).then(({data:e})=>e),"v-a580c466":()=>d(()=>import("./6_live_positioning.html-d06a7fc8.js"),[]).then(({data:e})=>e),"v-c7c23db2":()=>d(()=>import("./index.html-f0e953f9.js"),[]).then(({data:e})=>e),"v-d551fba2":()=>d(()=>import("./birthing.html-cdb6ec7f.js"),[]).then(({data:e})=>e),"v-db6f9792":()=>d(()=>import("./newborn.html-0e9247c9.js"),[]).then(({data:e})=>e),"v-146fc10b":()=>d(()=>import("./index.html-63c7330d.js"),[]).then(({data:e})=>e),"v-54bae169":()=>d(()=>import("./cors-anywhere.html-8ab790d2.js"),[]).then(({data:e})=>e),"v-2117748f":()=>d(()=>import("./emby.html-90076e27.js"),[]).then(({data:e})=>e),"v-072b240a":()=>d(()=>import("./grocy.html-d4cdb496.js"),[]).then(({data:e})=>e),"v-4b94fd6a":()=>d(()=>import("./memos.html-e20d76dd.js"),[]).then(({data:e})=>e),"v-7b224f9d":()=>d(()=>import("./mt-photos.html-b1e9b4b7.js"),[]).then(({data:e})=>e),"v-2b3f3b71":()=>d(()=>import("./navidrome.html-6a27be53.js"),[]).then(({data:e})=>e),"v-79e8b601":()=>d(()=>import("./qinglong.html-2ceaed27.js"),[]).then(({data:e})=>e),"v-774ba40b":()=>d(()=>import("./reader.html-a93f3612.js"),[]).then(({data:e})=>e),"v-06c25741":()=>d(()=>import("./reverse-proxy.html-c4cd4b31.js"),[]).then(({data:e})=>e),"v-a0e1132e":()=>d(()=>import("./stirling-pdf.html-549705e4.js"),[]).then(({data:e})=>e),"v-78e70751":()=>d(()=>import("./syncthing.html-7a1414a4.js"),[]).then(({data:e})=>e),"v-31e5d674":()=>d(()=>import("./tachidesk.html-632239b4.js"),[]).then(({data:e})=>e),"v-08917e81":()=>d(()=>import("./uptime-kuma.html-92f21d82.js"),[]).then(({data:e})=>e),"v-3706649a":()=>d(()=>import("./404.html-f96486c3.js"),[]).then(({data:e})=>e),"v-e1e3da16":()=>d(()=>import("./index.html-6992389e.js"),[]).then(({data:e})=>e),"v-2d0a776e":()=>d(()=>import("./index.html-42c67c26.js"),[]).then(({data:e})=>e),"v-144e84a4":()=>d(()=>import("./index.html-ab533073.js"),[]).then(({data:e})=>e),"v-72a9c1e2":()=>d(()=>import("./index.html-c2bdef3e.js"),[]).then(({data:e})=>e),"v-29788432":()=>d(()=>import("./index.html-dcb307f6.js"),[]).then(({data:e})=>e),"v-1a3d5e90":()=>d(()=>import("./index.html-04c6db3e.js"),[]).then(({data:e})=>e),"v-744e6dd4":()=>d(()=>import("./index.html-2d95f622.js"),[]).then(({data:e})=>e),"v-d7a4cff6":()=>d(()=>import("./index.html-50790362.js"),[]).then(({data:e})=>e),"v-4766039d":()=>d(()=>import("./index.html-58c4bbd5.js"),[]).then(({data:e})=>e),"v-5bc93818":()=>d(()=>import("./index.html-655bf0e6.js"),[]).then(({data:e})=>e),"v-744d024e":()=>d(()=>import("./index.html-d6c99b23.js"),[]).then(({data:e})=>e),"v-e52c881c":()=>d(()=>import("./index.html-87604af9.js"),[]).then(({data:e})=>e),"v-154dc4c4":()=>d(()=>import("./index.html-cc5ef4b9.js"),[]).then(({data:e})=>e),"v-01560935":()=>d(()=>import("./index.html-e9005503.js"),[]).then(({data:e})=>e),"v-14145d44":()=>d(()=>import("./index.html-7fe00f40.js"),[]).then(({data:e})=>e),"v-72680697":()=>d(()=>import("./index.html-dd561b3d.js"),[]).then(({data:e})=>e),"v-8f1d462c":()=>d(()=>import("./index.html-1c28f69c.js"),[]).then(({data:e})=>e),"v-b306892a":()=>d(()=>import("./index.html-ceb7226e.js"),[]).then(({data:e})=>e),"v-eea9fcce":()=>d(()=>import("./index.html-1be9f779.js"),[]).then(({data:e})=>e),"v-8c49fdb8":()=>d(()=>import("./index.html-ff2e2d2b.js"),[]).then(({data:e})=>e),"v-5ff6b5a3":()=>d(()=>import("./index.html-fec1031e.js"),[]).then(({data:e})=>e),"v-8c487d20":()=>d(()=>import("./index.html-f1014064.js"),[]).then(({data:e})=>e),"v-5f7f7ebf":()=>d(()=>import("./index.html-2c7e91e5.js"),[]).then(({data:e})=>e),"v-d08dfa36":()=>d(()=>import("./index.html-26b23278.js"),[]).then(({data:e})=>e),"v-8de1a174":()=>d(()=>import("./index.html-8fc9788e.js"),[]).then(({data:e})=>e),"v-05308425":()=>d(()=>import("./index.html-defb43ec.js"),[]).then(({data:e})=>e),"v-150ab774":()=>d(()=>import("./index.html-e4cb76a7.js"),[]).then(({data:e})=>e),"v-21d2d53f":()=>d(()=>import("./index.html-223c6569.js"),[]).then(({data:e})=>e),"v-b305d196":()=>d(()=>import("./index.html-c233dd08.js"),[]).then(({data:e})=>e),"v-8f2a3ea6":()=>d(()=>import("./index.html-19b3f809.js"),[]).then(({data:e})=>e),"v-b3149e20":()=>d(()=>import("./index.html-8df920dc.js"),[]).then(({data:e})=>e),"v-92b89202":()=>d(()=>import("./index.html-88e5225c.js"),[]).then(({data:e})=>e),"v-3f145752":()=>d(()=>import("./index.html-a0c75d3f.js"),[]).then(({data:e})=>e),"v-6d02fe66":()=>d(()=>import("./index.html-f7c08143.js"),[]).then(({data:e})=>e),"v-e45a3fd0":()=>d(()=>import("./index.html-6aa920d9.js"),[]).then(({data:e})=>e),"v-132a6ac4":()=>d(()=>import("./index.html-eb05c42f.js"),[]).then(({data:e})=>e),"v-e22b51b2":()=>d(()=>import("./index.html-2c9c39b2.js"),[]).then(({data:e})=>e),"v-6106c001":()=>d(()=>import("./index.html-f5064dc2.js"),[]).then(({data:e})=>e),"v-1f1d54f4":()=>d(()=>import("./index.html-c39642b5.js"),[]).then(({data:e})=>e),"v-026ab35e":()=>d(()=>import("./index.html-2f33ddde.js"),[]).then(({data:e})=>e),"v-45b16e58":()=>d(()=>import("./index.html-facab2fe.js"),[]).then(({data:e})=>e),"v-aae951e6":()=>d(()=>import("./index.html-74befb3b.js"),[]).then(({data:e})=>e),"v-36dccd5d":()=>d(()=>import("./index.html-df620b5c.js"),[]).then(({data:e})=>e),"v-02d57e1c":()=>d(()=>import("./index.html-c7d4def9.js"),[]).then(({data:e})=>e),"v-36474c60":()=>d(()=>import("./index.html-453d121a.js"),[]).then(({data:e})=>e),"v-289a8dd8":()=>d(()=>import("./index.html-bb64d4c7.js"),[]).then(({data:e})=>e),"v-0cbf5886":()=>d(()=>import("./index.html-26590d8d.js"),[]).then(({data:e})=>e),"v-6f001b53":()=>d(()=>import("./index.html-28f1b3fd.js"),[]).then(({data:e})=>e),"v-179b645c":()=>d(()=>import("./index.html-7afcb2bd.js"),[]).then(({data:e})=>e),"v-4d51b51e":()=>d(()=>import("./index.html-97dabdb3.js"),[]).then(({data:e})=>e),"v-66d9f917":()=>d(()=>import("./index.html-2ebe59fd.js"),[]).then(({data:e})=>e),"v-d82d3ed4":()=>d(()=>import("./index.html-2a5d9f94.js"),[]).then(({data:e})=>e),"v-295c722c":()=>d(()=>import("./index.html-1c163970.js"),[]).then(({data:e})=>e),"v-9a6de7e0":()=>d(()=>import("./index.html-8810af62.js"),[]).then(({data:e})=>e),"v-70a94678":()=>d(()=>import("./index.html-f4b9ffbd.js"),[]).then(({data:e})=>e),"v-79bd8a59":()=>d(()=>import("./index.html-84ebc212.js"),[]).then(({data:e})=>e),"v-ecace9be":()=>d(()=>import("./index.html-a7326923.js"),[]).then(({data:e})=>e),"v-2e8a96b8":()=>d(()=>import("./index.html-7a998403.js"),[]).then(({data:e})=>e),"v-c58e8f3e":()=>d(()=>import("./index.html-f0f28563.js"),[]).then(({data:e})=>e),"v-8ba0d006":()=>d(()=>import("./index.html-bf16cc26.js"),[]).then(({data:e})=>e),"v-b30ab346":()=>d(()=>import("./index.html-d13e22bc.js"),[]).then(({data:e})=>e),"v-a76657ce":()=>d(()=>import("./index.html-1b015b38.js"),[]).then(({data:e})=>e),"v-0f92890a":()=>d(()=>import("./index.html-bd0d6fdf.js"),[]).then(({data:e})=>e),"v-44794367":()=>d(()=>import("./index.html-880bd7af.js"),[]).then(({data:e})=>e),"v-207bdcdd":()=>d(()=>import("./index.html-fdcac8ab.js"),[]).then(({data:e})=>e),"v-9075524a":()=>d(()=>import("./index.html-cb107114.js"),[]).then(({data:e})=>e),"v-c9e9368a":()=>d(()=>import("./index.html-17ded23c.js"),[]).then(({data:e})=>e),"v-b306a40c":()=>d(()=>import("./index.html-2c2b56bd.js"),[]).then(({data:e})=>e),"v-2836033f":()=>d(()=>import("./index.html-7c1d629a.js"),[]).then(({data:e})=>e),"v-ed16b278":()=>d(()=>import("./index.html-7c16862a.js"),[]).then(({data:e})=>e),"v-6b6b05fc":()=>d(()=>import("./index.html-fa1221fe.js"),[]).then(({data:e})=>e),"v-f091ce2a":()=>d(()=>import("./index.html-5db61fbb.js"),[]).then(({data:e})=>e),"v-b3108574":()=>d(()=>import("./index.html-ba6dbc5e.js"),[]).then(({data:e})=>e),"v-91d85d3a":()=>d(()=>import("./index.html-03d14b39.js"),[]).then(({data:e})=>e),"v-0da0abf9":()=>d(()=>import("./index.html-20ce6bc9.js"),[]).then(({data:e})=>e),"v-294e906f":()=>d(()=>import("./index.html-d6f3e241.js"),[]).then(({data:e})=>e),"v-311b2668":()=>d(()=>import("./index.html-45c53c83.js"),[]).then(({data:e})=>e),"v-33129548":()=>d(()=>import("./index.html-b1caeef5.js"),[]).then(({data:e})=>e),"v-2870f5b5":()=>d(()=>import("./index.html-6f9b0bdf.js"),[]).then(({data:e})=>e),"v-4b93f328":()=>d(()=>import("./index.html-d12a7753.js"),[]).then(({data:e})=>e),"v-2d605e49":()=>d(()=>import("./index.html-befb82c3.js"),[]).then(({data:e})=>e),"v-5b9877a1":()=>d(()=>import("./index.html-d9ee26fc.js"),[]).then(({data:e})=>e),"v-df045e5a":()=>d(()=>import("./index.html-e1a55533.js"),[]).then(({data:e})=>e),"v-05db77bd":()=>d(()=>import("./index.html-1e7510e6.js"),[]).then(({data:e})=>e),"v-3514c09e":()=>d(()=>import("./index.html-52267175.js"),[]).then(({data:e})=>e),"v-fa46c5c6":()=>d(()=>import("./index.html-d9182b73.js"),[]).then(({data:e})=>e),"v-293a5861":()=>d(()=>import("./index.html-fb5dbf0d.js"),[]).then(({data:e})=>e),"v-b309c306":()=>d(()=>import("./index.html-67df07bb.js"),[]).then(({data:e})=>e)},Kd=JSON.parse('{"base":"/","lang":"zh-CN","title":"LearnHubs","description":"开源工具、效率方法、心理学探索的自我提升笔记,记录并输出一切能让自己提升的知识。","head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://gpt-vip.top/rss.xml","title":"LearnHubs RSS Feed"}]],"locales":{}}');var qd=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),Yd=e=>{const t=new Set,n=[];return e.forEach(o=>{const r=qd(o);t.has(r)||(t.add(r),n.push(o))}),n},Zd=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,Xd=e=>e.startsWith("ftp://"),Jt=e=>/^(https?:)?\/\//.test(e),Jd=/.md((\?|#).*)?$/,rr=(e,t="/")=>!!(Jt(e)||Xd(e)||e.startsWith("/")&&!e.startsWith(t)&&!Jd.test(e)),nc=e=>/^mailto:/.test(e),Qd=e=>/^tel:/.test(e),zi=e=>Object.prototype.toString.call(e)==="[object Object]",Fi=e=>e[e.length-1]==="/"?e.slice(0,-1):e,oc=e=>e[0]==="/"?e.slice(1):e,e1=(e,t)=>{const n=Object.keys(e).sort((o,r)=>{const i=r.split("/").length-o.split("/").length;return i!==0?i:r.length-o.length});for(const o of n)if(t.startsWith(o))return o;return"/"};const rc={"v-3f9d0d55":b(()=>d(()=>import("./DailyRoutine.html-687e5c56.js"),["assets/DailyRoutine.html-687e5c56.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3d0aa58a":b(()=>d(()=>import("./Fitness.html-513327f1.js"),["assets/Fitness.html-513327f1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8daa1a0e":b(()=>d(()=>import("./index.html-05b754fd.js"),["assets/index.html-05b754fd.js","assets/流程2-453dc6f5.js","assets/libaxuan-github-io-a3ff3974.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-35f5db9e":b(()=>d(()=>import("./blog.html-4ba14ed1.js"),["assets/blog.html-4ba14ed1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-184f4da6":b(()=>d(()=>import("./intro.html-a4dd8424.js"),["assets/intro.html-a4dd8424.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-26a023fe":b(()=>d(()=>import("./2017-04-18-wechat_multi_open.html-686aa5cc.js"),["assets/2017-04-18-wechat_multi_open.html-686aa5cc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6222deab":b(()=>d(()=>import("./2017-04-22-rss_feed43_feedex.html-4e3997c3.js"),["assets/2017-04-22-rss_feed43_feedex.html-4e3997c3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-009a3fd6":b(()=>d(()=>import("./2017-07-28-office_2016_installer_error.html-da49ab72.js"),["assets/2017-07-28-office_2016_installer_error.html-da49ab72.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0d41d5d0":b(()=>d(()=>import("./2017-07-29-onenote_2016_cannot_be_logged_in.html-9c7b9874.js"),["assets/2017-07-29-onenote_2016_cannot_be_logged_in.html-9c7b9874.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c914fd10":b(()=>d(()=>import("./2017-09-02-forced_shutdown.html-1f964250.js"),["assets/2017-09-02-forced_shutdown.html-1f964250.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4576f198":b(()=>d(()=>import("./2017-09-03-smb_lan_sharing.html-0c2306a0.js"),["assets/2017-09-03-smb_lan_sharing.html-0c2306a0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e6f7cb8e":b(()=>d(()=>import("./2017-10-18-light_cat_e8-c-epon_admin.html-0f81a2e3.js"),["assets/2017-10-18-light_cat_e8-c-epon_admin.html-0f81a2e3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5da24c3c":b(()=>d(()=>import("./2017-10-18-light_cat_port_forwarding.html-c6876b92.js"),["assets/2017-10-18-light_cat_port_forwarding.html-c6876b92.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-28c3d540":b(()=>d(()=>import("./2018-01-19-forget_the_cdn.html-84186388.js"),["assets/2018-01-19-forget_the_cdn.html-84186388.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b3818c3c":b(()=>d(()=>import("./2018-01-31-hire_a_robot.html-4daf9d55.js"),["assets/2018-01-31-hire_a_robot.html-4daf9d55.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-579c385c":b(()=>d(()=>import("./2018-04-30-baota_deploy_vps.html-ffa462f1.js"),["assets/2018-04-30-baota_deploy_vps.html-ffa462f1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-06691c4f":b(()=>d(()=>import("./2018-05-01-jekyll_blog_on_github_pages.html-b6531d3d.js"),["assets/2018-05-01-jekyll_blog_on_github_pages.html-b6531d3d.js","assets/libaxuan-github-io-a3ff3974.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-24d2d83a":b(()=>d(()=>import("./2018-05-02-jekyll_blog_on_vps.html-2a013007.js"),["assets/2018-05-02-jekyll_blog_on_vps.html-2a013007.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-adf0c772":b(()=>d(()=>import("./2018-05-03-jekyll_blog_autodeploy.html-3440f2df.js"),["assets/2018-05-03-jekyll_blog_autodeploy.html-3440f2df.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-730defc4":b(()=>d(()=>import("./2018-05-04-audition_cut_mp3.html-d3ab3139.js"),["assets/2018-05-04-audition_cut_mp3.html-d3ab3139.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1f0840b1":b(()=>d(()=>import("./2018-05-15-aria2_a_new_download_tool.html-3f3f16e9.js"),["assets/2018-05-15-aria2_a_new_download_tool.html-3f3f16e9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5ae43900":b(()=>d(()=>import("./2018-05-24-airtable_noob.html-df5069f8.js"),["assets/2018-05-24-airtable_noob.html-df5069f8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-a3025528":b(()=>d(()=>import("./2018-06-08-baizhuo_gp1700.html-54f6f90e.js"),["assets/2018-06-08-baizhuo_gp1700.html-54f6f90e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5ad6240c":b(()=>d(()=>import("./2018-06-10-koolproxy_https.html-6795dc71.js"),["assets/2018-06-10-koolproxy_https.html-6795dc71.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-77515ff2":b(()=>d(()=>import("./2018-06-19-iptv_direckly.html-128e9a53.js"),["assets/2018-06-19-iptv_direckly.html-128e9a53.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-73041b3a":b(()=>d(()=>import("./2018-10-07-huginn_scraping_any_website.html-dee30096.js"),["assets/2018-10-07-huginn_scraping_any_website.html-dee30096.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1004794e":b(()=>d(()=>import("./2018-12-28-voice_input_try.html-9a3c4032.js"),["assets/2018-12-28-voice_input_try.html-9a3c4032.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7463267c":b(()=>d(()=>import("./2019-03-31-openvpn_back_to_home.html-1471496a.js"),["assets/2019-03-31-openvpn_back_to_home.html-1471496a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-302b03de":b(()=>d(()=>import("./2019-04-01-rsshub_noob.html-ff8a167f.js"),["assets/2019-04-01-rsshub_noob.html-ff8a167f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-346c34d4":b(()=>d(()=>import("./2019-08-26-scrcpy_screen_projection.html-77d605ce.js"),["assets/2019-08-26-scrcpy_screen_projection.html-77d605ce.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d8439540":b(()=>d(()=>import("./2020-03-25-rsshub_on_vps.html-35d6b536.js"),["assets/2020-03-25-rsshub_on_vps.html-35d6b536.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-273cf11f":b(()=>d(()=>import("./2020-09-13-wifi_speed_up.html-e705b214.js"),["assets/2020-09-13-wifi_speed_up.html-e705b214.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-18a7959b":b(()=>d(()=>import("./2020-09-22-uefi_asus_board.html-e2f2348b.js"),["assets/2020-09-22-uefi_asus_board.html-e2f2348b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-491d5d68":b(()=>d(()=>import("./2020-11-27-rime_input.html-a8789cf3.js"),["assets/2020-11-27-rime_input.html-a8789cf3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0418b0dc":b(()=>d(()=>import("./2021-01-02-keepass_the_real_lastpassword.html-3a5bee1b.js"),["assets/2021-01-02-keepass_the_real_lastpassword.html-3a5bee1b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-63fefb94":b(()=>d(()=>import("./2021-01-27-blog_jekyll_to_wordpress.html-e2e3eb99.js"),["assets/2021-01-27-blog_jekyll_to_wordpress.html-e2e3eb99.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0a6bc026":b(()=>d(()=>import("./2021-05-31-principles_criticism_and_self-criticism.html-8d8f69c9.js"),["assets/2021-05-31-principles_criticism_and_self-criticism.html-8d8f69c9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5a064ff2":b(()=>d(()=>import("./2021-10-23-nas_with_rsshub_and_huginn.html-137e95eb.js"),["assets/2021-10-23-nas_with_rsshub_and_huginn.html-137e95eb.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-39faf312":b(()=>d(()=>import("./2022-01-23-wechat_lucky_money_cover.html-d0ec6f25.js"),["assets/2022-01-23-wechat_lucky_money_cover.html-d0ec6f25.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-313c5888":b(()=>d(()=>import("./2022-02-19-microsoft_store_fixed.html-1e9a9ea6.js"),["assets/2022-02-19-microsoft_store_fixed.html-1e9a9ea6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-61d0df0c":b(()=>d(()=>import("./2022-03-17-rss_persistent_link_collection.html-e84a2cfd.js"),["assets/2022-03-17-rss_persistent_link_collection.html-e84a2cfd.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-df55a79e":b(()=>d(()=>import("./2022-03-21-winget_the_strongest_software_manager_for_windows.html-3b89a013.js"),["assets/2022-03-21-winget_the_strongest_software_manager_for_windows.html-3b89a013.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-24bf700c":b(()=>d(()=>import("./2022-04-21-uivision_rpa.html-c38d8375.js"),["assets/2022-04-21-uivision_rpa.html-c38d8375.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9029f640":b(()=>d(()=>import("./2022-06-07-blog_md_to_wordpress.html-5cb26d50.js"),["assets/2022-06-07-blog_md_to_wordpress.html-5cb26d50.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6eacd3db":b(()=>d(()=>import("./2022-08-22-learndata_blog_to_knowledge_management.html-c9ec70fe.js"),["assets/2022-08-22-learndata_blog_to_knowledge_management.html-c9ec70fe.js","assets/流程2-453dc6f5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-69739db8":b(()=>d(()=>import("./2022-11-03-ffmpeg_screen_recording.html-ed4c4934.js"),["assets/2022-11-03-ffmpeg_screen_recording.html-ed4c4934.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-333dd8ee":b(()=>d(()=>import("./2023-01-26-whiteboard_gtd.html-231fa5a2.js"),["assets/2023-01-26-whiteboard_gtd.html-231fa5a2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5e3d84de":b(()=>d(()=>import("./2023-09-05-virtual_positioning.html-9ed76263.js"),["assets/2023-09-05-virtual_positioning.html-9ed76263.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-72653828":b(()=>d(()=>import("./2023-10-07-clone-voice.html-f30f240f.js"),["assets/2023-10-07-clone-voice.html-f30f240f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e381b74e":b(()=>d(()=>import("./2023-10-29-switch-firmware-updates.html-cc747634.js"),["assets/2023-10-29-switch-firmware-updates.html-cc747634.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b90f383c":b(()=>d(()=>import("./2023-12-12-eu.org-free-domain.html-f7601d31.js"),["assets/2023-12-12-eu.org-free-domain.html-f7601d31.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-22230056":b(()=>d(()=>import("./2023-12-12-sd-op.html-85f49dd3.js"),["assets/2023-12-12-sd-op.html-85f49dd3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-af1fbe54":b(()=>d(()=>import("./2023-12-13-awesome-selfhosted-cn.html-23fa1920.js"),["assets/2023-12-13-awesome-selfhosted-cn.html-23fa1920.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0d25d1e4":b(()=>d(()=>import("./AIEnjoy.html-4b65621a.js"),["assets/AIEnjoy.html-4b65621a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7b101d14":b(()=>d(()=>import("./ChatGPT.html-1afc53b8.js"),["assets/ChatGPT.html-1afc53b8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2c379a13":b(()=>d(()=>import("./Midjourney.html-6ed1bde8.js"),["assets/Midjourney.html-6ed1bde8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-69693975":b(()=>d(()=>import("./AppNotes.html-d9bc8649.js"),["assets/AppNotes.html-d9bc8649.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1735a0be":b(()=>d(()=>import("./Applist.html-392c7cbc.js"),["assets/Applist.html-392c7cbc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d967ed6c":b(()=>d(()=>import("./ChatGPT.html-b805ce1c.js"),["assets/ChatGPT.html-b805ce1c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5c29014a":b(()=>d(()=>import("./Chrome.html-af0b2bff.js"),["assets/Chrome.html-af0b2bff.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1d7dd2b7":b(()=>d(()=>import("./design.html-bb53b2a3.js"),["assets/design.html-bb53b2a3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-abe04fa2":b(()=>d(()=>import("./AutoHotkey.html-bb84ecc0.js"),["assets/AutoHotkey.html-bb84ecc0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-fae223a4":b(()=>d(()=>import("./Electron.html-037d4c16.js"),["assets/Electron.html-037d4c16.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-67fe64b6":b(()=>d(()=>import("./HTML.html-f965ae26.js"),["assets/HTML.html-f965ae26.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-72cba7c3":b(()=>d(()=>import("./Javascript.html-8b79a0c5.js"),["assets/Javascript.html-8b79a0c5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0195f17e":b(()=>d(()=>import("./Markdown.html-d99ad6cc.js"),["assets/Markdown.html-d99ad6cc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2caa5134":b(()=>d(()=>import("./Python.html-80e62696.js"),["assets/Python.html-80e62696.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-146a1089":b(()=>d(()=>import("./index.html-9bdab53c.js"),["assets/index.html-9bdab53c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-49ecfa5b":b(()=>d(()=>import("./Regex.html-42ae96cc.js"),["assets/Regex.html-42ae96cc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6bea56bc":b(()=>d(()=>import("./Vue.html-3ec376f1.js"),["assets/Vue.html-3ec376f1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-88193f16":b(()=>d(()=>import("./CloudServices.html-de982fec.js"),["assets/CloudServices.html-de982fec.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1c7fca9e":b(()=>d(()=>import("./Cloudflare.html-c3efd50c.js"),["assets/Cloudflare.html-c3efd50c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2b70157f":b(()=>d(()=>import("./DNS.html-f69e26d4.js"),["assets/DNS.html-f69e26d4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-bc154f32":b(()=>d(()=>import("./GitHub.html-60fd85cc.js"),["assets/GitHub.html-60fd85cc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d4ab9bf4":b(()=>d(()=>import("./MySQL.html-6cf1d92b.js"),["assets/MySQL.html-6cf1d92b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7c5f209c":b(()=>d(()=>import("./Static.html-3055babe.js"),["assets/Static.html-3055babe.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-39dc98a2":b(()=>d(()=>import("./VPS.html-ce153cfa.js"),["assets/VPS.html-ce153cfa.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c582fe3e":b(()=>d(()=>import("./Coupon.html-fa4d1c5e.js"),["assets/Coupon.html-fa4d1c5e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-373dc153":b(()=>d(()=>import("./Diet.html-358f3f14.js"),["assets/Diet.html-358f3f14.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9ff4249e":b(()=>d(()=>import("./HomeAutomation.html-618f90f5.js"),["assets/HomeAutomation.html-618f90f5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-16a2796a":b(()=>d(()=>import("./Life.html-867cdc0c.js"),["assets/Life.html-867cdc0c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-850f3410":b(()=>d(()=>import("./Maintenance.html-e9cfa930.js"),["assets/Maintenance.html-e9cfa930.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-182a363a":b(()=>d(()=>import("./Medical.html-3786f7d2.js"),["assets/Medical.html-3786f7d2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c51c66fe":b(()=>d(()=>import("./Shoppinglist.html-017360fc.js"),["assets/Shoppinglist.html-017360fc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-101edae1":b(()=>d(()=>import("./Docker.html-f4975bcc.js"),["assets/Docker.html-f4975bcc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-73fe61b2":b(()=>d(()=>import("./Huginn.html-69ab79f2.js"),["assets/Huginn.html-69ab79f2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1b2d4c91":b(()=>d(()=>import("./NAS.html-c240f2de.js"),["assets/NAS.html-c240f2de.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-54e731c2":b(()=>d(()=>import("./TTRSS.html-f6b52843.js"),["assets/TTRSS.html-f6b52843.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-00f6d5f1":b(()=>d(()=>import("./Comments.html-856b62ac.js"),["assets/Comments.html-856b62ac.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3b0b9f28":b(()=>d(()=>import("./VuePress.html-7ef12a1a.js"),["assets/VuePress.html-7ef12a1a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3cdca328":b(()=>d(()=>import("./docsify.html-ffda287d.js"),["assets/docsify.html-ffda287d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6451f4a2":b(()=>d(()=>import("./NewSystem.html-3c29d577.js"),["assets/NewSystem.html-3c29d577.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-395a6953":b(()=>d(()=>import("./QTTabBar.html-abbe4161.js"),["assets/QTTabBar.html-abbe4161.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-a8b7dd1a":b(()=>d(()=>import("./cd.html-91e05cda.js"),["assets/cd.html-91e05cda.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5e2612f0":b(()=>d(()=>import("./faq.html-02288f4e.js"),["assets/faq.html-02288f4e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-df9d5022":b(()=>d(()=>import("./mac.html-22676b0c.js"),["assets/mac.html-22676b0c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-12e41b33":b(()=>d(()=>import("./index.html-89476074.js"),["assets/index.html-89476074.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-bdd9cae6":b(()=>d(()=>import("./0_live_equipments.html-e619ead4.js"),["assets/0_live_equipments.html-e619ead4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-63cd7175":b(()=>d(()=>import("./1_obs_basic.html-7a67d017.js"),["assets/1_obs_basic.html-7a67d017.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1ace0584":b(()=>d(()=>import("./2_obs_streamfx.html-3ff34bfd.js"),["assets/2_obs_streamfx.html-3ff34bfd.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-78ae0f01":b(()=>d(()=>import("./3_obs_plugins.html-84a9a411.js"),["assets/3_obs_plugins.html-84a9a411.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-21f30b82":b(()=>d(()=>import("./4_live_effects.html-889d6027.js"),["assets/4_live_effects.html-889d6027.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0094e0b6":b(()=>d(()=>import("./5_live_platforms.html-dbdcb26c.js"),["assets/5_live_platforms.html-dbdcb26c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-a580c466":b(()=>d(()=>import("./6_live_positioning.html-9c2b1d11.js"),["assets/6_live_positioning.html-9c2b1d11.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c7c23db2":b(()=>d(()=>import("./index.html-36f6231e.js"),["assets/index.html-36f6231e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d551fba2":b(()=>d(()=>import("./birthing.html-48fe6989.js"),["assets/birthing.html-48fe6989.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-db6f9792":b(()=>d(()=>import("./newborn.html-1916ccca.js"),["assets/newborn.html-1916ccca.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-146fc10b":b(()=>d(()=>import("./index.html-9d195b1e.js"),["assets/index.html-9d195b1e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-54bae169":b(()=>d(()=>import("./cors-anywhere.html-b200a776.js"),["assets/cors-anywhere.html-b200a776.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2117748f":b(()=>d(()=>import("./emby.html-78c25958.js"),["assets/emby.html-78c25958.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-072b240a":b(()=>d(()=>import("./grocy.html-50c575c2.js"),["assets/grocy.html-50c575c2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4b94fd6a":b(()=>d(()=>import("./memos.html-874d0edc.js"),["assets/memos.html-874d0edc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7b224f9d":b(()=>d(()=>import("./mt-photos.html-de0affec.js"),["assets/mt-photos.html-de0affec.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2b3f3b71":b(()=>d(()=>import("./navidrome.html-fe5f5c0c.js"),["assets/navidrome.html-fe5f5c0c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-79e8b601":b(()=>d(()=>import("./qinglong.html-3717fa72.js"),["assets/qinglong.html-3717fa72.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-774ba40b":b(()=>d(()=>import("./reader.html-d1bdfb2f.js"),["assets/reader.html-d1bdfb2f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-06c25741":b(()=>d(()=>import("./reverse-proxy.html-907efd8b.js"),["assets/reverse-proxy.html-907efd8b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-a0e1132e":b(()=>d(()=>import("./stirling-pdf.html-b8401c61.js"),["assets/stirling-pdf.html-b8401c61.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-78e70751":b(()=>d(()=>import("./syncthing.html-09d50c3f.js"),["assets/syncthing.html-09d50c3f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-31e5d674":b(()=>d(()=>import("./tachidesk.html-adfc5efa.js"),["assets/tachidesk.html-adfc5efa.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-08917e81":b(()=>d(()=>import("./uptime-kuma.html-cb555b65.js"),["assets/uptime-kuma.html-cb555b65.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3706649a":b(()=>d(()=>import("./404.html-50472150.js"),["assets/404.html-50472150.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e1e3da16":b(()=>d(()=>import("./index.html-1209836d.js"),["assets/index.html-1209836d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2d0a776e":b(()=>d(()=>import("./index.html-8ffdf840.js"),["assets/index.html-8ffdf840.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-144e84a4":b(()=>d(()=>import("./index.html-111e79d1.js"),["assets/index.html-111e79d1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-72a9c1e2":b(()=>d(()=>import("./index.html-7974b474.js"),["assets/index.html-7974b474.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-29788432":b(()=>d(()=>import("./index.html-d3141988.js"),["assets/index.html-d3141988.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1a3d5e90":b(()=>d(()=>import("./index.html-2aadcf01.js"),["assets/index.html-2aadcf01.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-744e6dd4":b(()=>d(()=>import("./index.html-833ea2d3.js"),["assets/index.html-833ea2d3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d7a4cff6":b(()=>d(()=>import("./index.html-62b720b4.js"),["assets/index.html-62b720b4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4766039d":b(()=>d(()=>import("./index.html-41b9ce8e.js"),["assets/index.html-41b9ce8e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5bc93818":b(()=>d(()=>import("./index.html-644c5bf8.js"),["assets/index.html-644c5bf8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-744d024e":b(()=>d(()=>import("./index.html-2eaba8b5.js"),["assets/index.html-2eaba8b5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e52c881c":b(()=>d(()=>import("./index.html-e6008ef5.js"),["assets/index.html-e6008ef5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-154dc4c4":b(()=>d(()=>import("./index.html-b0a1566d.js"),["assets/index.html-b0a1566d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-01560935":b(()=>d(()=>import("./index.html-1bf65264.js"),["assets/index.html-1bf65264.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-14145d44":b(()=>d(()=>import("./index.html-d8f1a95c.js"),["assets/index.html-d8f1a95c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-72680697":b(()=>d(()=>import("./index.html-8ad380f4.js"),["assets/index.html-8ad380f4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8f1d462c":b(()=>d(()=>import("./index.html-a63de91a.js"),["assets/index.html-a63de91a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b306892a":b(()=>d(()=>import("./index.html-9090a80d.js"),["assets/index.html-9090a80d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-eea9fcce":b(()=>d(()=>import("./index.html-5c15c4ef.js"),["assets/index.html-5c15c4ef.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8c49fdb8":b(()=>d(()=>import("./index.html-29a4e6f7.js"),["assets/index.html-29a4e6f7.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5ff6b5a3":b(()=>d(()=>import("./index.html-df7a0910.js"),["assets/index.html-df7a0910.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8c487d20":b(()=>d(()=>import("./index.html-a427408f.js"),["assets/index.html-a427408f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5f7f7ebf":b(()=>d(()=>import("./index.html-0e60e7bb.js"),["assets/index.html-0e60e7bb.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d08dfa36":b(()=>d(()=>import("./index.html-bf113da3.js"),["assets/index.html-bf113da3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8de1a174":b(()=>d(()=>import("./index.html-5a0d7f0d.js"),["assets/index.html-5a0d7f0d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-05308425":b(()=>d(()=>import("./index.html-20eed4c0.js"),["assets/index.html-20eed4c0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-150ab774":b(()=>d(()=>import("./index.html-b4a216b1.js"),["assets/index.html-b4a216b1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-21d2d53f":b(()=>d(()=>import("./index.html-d2347b9c.js"),["assets/index.html-d2347b9c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b305d196":b(()=>d(()=>import("./index.html-68ac9c77.js"),["assets/index.html-68ac9c77.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8f2a3ea6":b(()=>d(()=>import("./index.html-9e8e4907.js"),["assets/index.html-9e8e4907.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b3149e20":b(()=>d(()=>import("./index.html-ba0f121f.js"),["assets/index.html-ba0f121f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-92b89202":b(()=>d(()=>import("./index.html-38bc2a69.js"),["assets/index.html-38bc2a69.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3f145752":b(()=>d(()=>import("./index.html-e2791626.js"),["assets/index.html-e2791626.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6d02fe66":b(()=>d(()=>import("./index.html-4abad7d4.js"),["assets/index.html-4abad7d4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e45a3fd0":b(()=>d(()=>import("./index.html-b4fd8143.js"),["assets/index.html-b4fd8143.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-132a6ac4":b(()=>d(()=>import("./index.html-90d69bb2.js"),["assets/index.html-90d69bb2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e22b51b2":b(()=>d(()=>import("./index.html-e770538c.js"),["assets/index.html-e770538c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6106c001":b(()=>d(()=>import("./index.html-f74b33b5.js"),["assets/index.html-f74b33b5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1f1d54f4":b(()=>d(()=>import("./index.html-440afd2a.js"),["assets/index.html-440afd2a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-026ab35e":b(()=>d(()=>import("./index.html-8f873296.js"),["assets/index.html-8f873296.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-45b16e58":b(()=>d(()=>import("./index.html-dca2dcfb.js"),["assets/index.html-dca2dcfb.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-aae951e6":b(()=>d(()=>import("./index.html-47791f6b.js"),["assets/index.html-47791f6b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-36dccd5d":b(()=>d(()=>import("./index.html-a17c7b1e.js"),["assets/index.html-a17c7b1e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-02d57e1c":b(()=>d(()=>import("./index.html-1cf6c344.js"),["assets/index.html-1cf6c344.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-36474c60":b(()=>d(()=>import("./index.html-2efed97f.js"),["assets/index.html-2efed97f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-289a8dd8":b(()=>d(()=>import("./index.html-7503264b.js"),["assets/index.html-7503264b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0cbf5886":b(()=>d(()=>import("./index.html-157d2206.js"),["assets/index.html-157d2206.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6f001b53":b(()=>d(()=>import("./index.html-6bf02d51.js"),["assets/index.html-6bf02d51.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-179b645c":b(()=>d(()=>import("./index.html-dbb0cae8.js"),["assets/index.html-dbb0cae8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4d51b51e":b(()=>d(()=>import("./index.html-2596183f.js"),["assets/index.html-2596183f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-66d9f917":b(()=>d(()=>import("./index.html-6421473f.js"),["assets/index.html-6421473f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d82d3ed4":b(()=>d(()=>import("./index.html-8d39341a.js"),["assets/index.html-8d39341a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-295c722c":b(()=>d(()=>import("./index.html-5409d20f.js"),["assets/index.html-5409d20f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9a6de7e0":b(()=>d(()=>import("./index.html-e7e94489.js"),["assets/index.html-e7e94489.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-70a94678":b(()=>d(()=>import("./index.html-fb246946.js"),["assets/index.html-fb246946.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-79bd8a59":b(()=>d(()=>import("./index.html-e71b2a0b.js"),["assets/index.html-e71b2a0b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-ecace9be":b(()=>d(()=>import("./index.html-27a21379.js"),["assets/index.html-27a21379.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2e8a96b8":b(()=>d(()=>import("./index.html-d229c3fa.js"),["assets/index.html-d229c3fa.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c58e8f3e":b(()=>d(()=>import("./index.html-50c22431.js"),["assets/index.html-50c22431.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8ba0d006":b(()=>d(()=>import("./index.html-298e0adb.js"),["assets/index.html-298e0adb.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b30ab346":b(()=>d(()=>import("./index.html-4913573e.js"),["assets/index.html-4913573e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-a76657ce":b(()=>d(()=>import("./index.html-4aab4c28.js"),["assets/index.html-4aab4c28.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0f92890a":b(()=>d(()=>import("./index.html-e5cb836c.js"),["assets/index.html-e5cb836c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-44794367":b(()=>d(()=>import("./index.html-26124569.js"),["assets/index.html-26124569.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-207bdcdd":b(()=>d(()=>import("./index.html-20d96c37.js"),["assets/index.html-20d96c37.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9075524a":b(()=>d(()=>import("./index.html-c6307981.js"),["assets/index.html-c6307981.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c9e9368a":b(()=>d(()=>import("./index.html-7d5f34b3.js"),["assets/index.html-7d5f34b3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b306a40c":b(()=>d(()=>import("./index.html-ec682506.js"),["assets/index.html-ec682506.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2836033f":b(()=>d(()=>import("./index.html-0ccff171.js"),["assets/index.html-0ccff171.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-ed16b278":b(()=>d(()=>import("./index.html-06e18ec6.js"),["assets/index.html-06e18ec6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6b6b05fc":b(()=>d(()=>import("./index.html-757c90f1.js"),["assets/index.html-757c90f1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-f091ce2a":b(()=>d(()=>import("./index.html-cbfe7423.js"),["assets/index.html-cbfe7423.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b3108574":b(()=>d(()=>import("./index.html-e0a4dd71.js"),["assets/index.html-e0a4dd71.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-91d85d3a":b(()=>d(()=>import("./index.html-a0cc2312.js"),["assets/index.html-a0cc2312.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0da0abf9":b(()=>d(()=>import("./index.html-fa2fec3e.js"),["assets/index.html-fa2fec3e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-294e906f":b(()=>d(()=>import("./index.html-16883c8b.js"),["assets/index.html-16883c8b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-311b2668":b(()=>d(()=>import("./index.html-71b5ab2e.js"),["assets/index.html-71b5ab2e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-33129548":b(()=>d(()=>import("./index.html-d4c6acde.js"),["assets/index.html-d4c6acde.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2870f5b5":b(()=>d(()=>import("./index.html-a5b3b764.js"),["assets/index.html-a5b3b764.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4b93f328":b(()=>d(()=>import("./index.html-2c1e0c31.js"),["assets/index.html-2c1e0c31.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2d605e49":b(()=>d(()=>import("./index.html-c1838d5e.js"),["assets/index.html-c1838d5e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5b9877a1":b(()=>d(()=>import("./index.html-579aa065.js"),["assets/index.html-579aa065.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-df045e5a":b(()=>d(()=>import("./index.html-171b03f4.js"),["assets/index.html-171b03f4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-05db77bd":b(()=>d(()=>import("./index.html-83c54511.js"),["assets/index.html-83c54511.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3514c09e":b(()=>d(()=>import("./index.html-d3bf2089.js"),["assets/index.html-d3bf2089.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-fa46c5c6":b(()=>d(()=>import("./index.html-f613bdb7.js"),["assets/index.html-f613bdb7.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-293a5861":b(()=>d(()=>import("./index.html-64ca9c5a.js"),["assets/index.html-64ca9c5a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b309c306":b(()=>d(()=>import("./index.html-a5c9c8ba.js"),["assets/index.html-a5c9c8ba.js","assets/plugin-vue_export-helper-c27b6911.js"]))};var t1=Symbol(""),ic=Symbol(""),n1=Dt({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),ce=()=>{const e=de(ic);if(!e)throw new Error("pageData() is called without provider.");return e},ac=Symbol(""),we=()=>{const e=de(ac);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},lc=Symbol(""),o1=()=>{const e=de(lc);if(!e)throw new Error("usePageHead() is called without provider.");return e},r1=Symbol(""),sc=Symbol(""),vr=()=>{const e=de(sc);if(!e)throw new Error("usePageLang() is called without provider.");return e},cc=Symbol(""),i1=()=>{const e=de(cc);if(!e)throw new Error("usePageLayout() is called without provider.");return e},a1=K(Gd),Hi=Symbol(""),At=()=>{const e=de(Hi);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},wn=K(Kd),uc=()=>wn,pc=Symbol(""),Un=()=>{const e=de(pc);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},l1=Symbol(""),s1="Layout",c1="NotFound",Pt=bo({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=a1.value[e];return await(t==null?void 0:t())??n1},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const o=ie(t.description)?t.description:n.description,r=[...G(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:o}]];return Yd(r)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{let n;if(e.path){const o=e.frontmatter.layout;ie(o)?n=o:n=s1}else n=c1;return t[n]},resolveRouteLocale:(e,t)=>e1(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),hr=B({name:"ClientOnly",setup(e,t){const n=K(!1);return ge(()=>{n.value=!0}),()=>{var o,r;return n.value?(r=(o=t.slots).default)==null?void 0:r.call(o):null}}}),dc=B({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=ce(),n=T(()=>rc[e.pageKey||t.value.key]);return()=>n.value?l(n.value):l("div","404 Not Found")}}),Qe=(e={})=>e,Ie=e=>Jt(e)?e:`/${oc(e)}`;const u1={};/*!
        +const p0="modulepreload",d0=function(e){return"/"+e},wa={},d=function(t,n,o){if(!n||n.length===0)return t();const r=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=d0(i),i in wa)return;wa[i]=!0;const a=i.endsWith(".css"),s=a?'[rel="stylesheet"]':"";if(!!o)for(let p=r.length-1;p>=0;p--){const f=r[p];if(f.href===i&&(!a||f.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${s}`))return;const u=document.createElement("link");if(u.rel=a?"stylesheet":p0,a||(u.as="script",u.crossOrigin=""),u.href=i,document.head.appendChild(u),a)return new Promise((p,f)=>{u.addEventListener("load",p),u.addEventListener("error",()=>f(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t()).catch(i=>{const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=i,window.dispatchEvent(a),!a.defaultPrevented)throw i})};function hi(e,t){const n=Object.create(null),o=e.split(",");for(let r=0;r!!n[r.toLowerCase()]:r=>!!n[r]}const Te={},An=[],vt=()=>{},f0=()=>!1,v0=/^on[^a-z]/,mo=e=>v0.test(e),mi=e=>e.startsWith("onUpdate:"),xe=Object.assign,gi=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},h0=Object.prototype.hasOwnProperty,ve=(e,t)=>h0.call(e,t),G=Array.isArray,Tn=e=>go(e)==="[object Map]",zn=e=>go(e)==="[object Set]",Aa=e=>go(e)==="[object Date]",ne=e=>typeof e=="function",ie=e=>typeof e=="string",Ln=e=>typeof e=="symbol",Ee=e=>e!==null&&typeof e=="object",Xl=e=>(Ee(e)||ne(e))&&ne(e.then)&&ne(e.catch),Jl=Object.prototype.toString,go=e=>Jl.call(e),m0=e=>go(e).slice(8,-1),Ql=e=>go(e)==="[object Object]",_i=e=>ie(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,eo=hi(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),lr=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},g0=/-(\w)/g,at=lr(e=>e.replace(g0,(t,n)=>n?n.toUpperCase():"")),_0=/\B([A-Z])/g,Fn=lr(e=>e.replace(_0,"-$1").toLowerCase()),_o=lr(e=>e.charAt(0).toUpperCase()+e.slice(1)),Tr=lr(e=>e?`on${_o(e)}`:""),cn=(e,t)=>!Object.is(e,t),Go=(e,t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Yo=e=>{const t=parseFloat(e);return isNaN(t)?e:t},b0=e=>{const t=ie(e)?Number(e):NaN;return isNaN(t)?e:t};let Ta;const Wr=()=>Ta||(Ta=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function bi(e){if(G(e)){const t={};for(let n=0;n{if(n){const o=n.split(E0);o.length>1&&(t[o[0].trim()]=o[1].trim())}}),t}function yi(e){let t="";if(ie(e))t=e;else if(G(e))for(let n=0;nun(n,t))}const z3=e=>ie(e)?e:e==null?"":G(e)||Ee(e)&&(e.toString===Jl||!ne(e.toString))?JSON.stringify(e,ts,2):String(e),ts=(e,t)=>t&&t.__v_isRef?ts(e,t.value):Tn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[o,r])=>(n[`${o} =>`]=r,n),{})}:zn(t)?{[`Set(${t.size})`]:[...t.values()]}:Ee(t)&&!G(t)&&!Ql(t)?String(t):t;let Ke;class O0{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Ke,!t&&Ke&&(this.index=(Ke.scopes||(Ke.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Ke;try{return Ke=this,t()}finally{Ke=n}}}on(){Ke=this}off(){Ke=this.parent}stop(t){if(this._active){let n,o;for(n=0,o=this.effects.length;n{const t=new Set(e);return t.w=0,t.n=0,t},os=e=>(e.w&Kt)>0,rs=e=>(e.n&Kt)>0,R0=({deps:e})=>{if(e.length)for(let t=0;t{const{deps:t}=e;if(t.length){let n=0;for(let o=0;o{(p==="length"||!Ln(p)&&p>=c)&&s.push(u)})}else switch(n!==void 0&&s.push(a.get(n)),t){case"add":G(e)?_i(n)&&s.push(a.get("length")):(s.push(a.get(ln)),Tn(e)&&s.push(a.get(Gr)));break;case"delete":G(e)||(s.push(a.get(ln)),Tn(e)&&s.push(a.get(Gr)));break;case"set":Tn(e)&&s.push(a.get(ln));break}if(s.length===1)s[0]&&Kr(s[0]);else{const c=[];for(const u of s)u&&c.push(...u);Kr(wi(c))}}function Kr(e,t){const n=G(e)?e:[...e];for(const o of n)o.computed&&Pa(o);for(const o of n)o.computed||Pa(o)}function Pa(e,t){(e!==pt||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function x0(e,t){var n;return(n=Zo.get(e))==null?void 0:n.get(t)}const D0=hi("__proto__,__v_isRef,__isVue"),ls=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ln)),Oa=C0();function C0(){const e={};return["includes","indexOf","lastIndexOf"].forEach(t=>{e[t]=function(...n){const o=pe(this);for(let i=0,a=this.length;i{e[t]=function(...n){Hn();const o=pe(this)[t].apply(this,n);return jn(),o}}),e}function V0(e){const t=pe(this);return Ue(t,"has",e),t.hasOwnProperty(e)}class ss{constructor(t=!1,n=!1){this._isReadonly=t,this._shallow=n}get(t,n,o){const r=this._isReadonly,i=this._shallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw"&&o===(r?i?q0:ds:i?ps:us).get(t))return t;const a=G(t);if(!r){if(a&&ve(Oa,n))return Reflect.get(Oa,n,o);if(n==="hasOwnProperty")return V0}const s=Reflect.get(t,n,o);return(Ln(n)?ls.has(n):D0(n))||(r||Ue(t,"get",n),i)?s:ke(s)?a&&_i(n)?s:s.value:Ee(s)?r?Dt(s):bo(s):s}}class cs extends ss{constructor(t=!1){super(!1,t)}set(t,n,o,r){let i=t[n];if(Rn(i)&&ke(i)&&!ke(o))return!1;if(!this._shallow&&(!Xo(o)&&!Rn(o)&&(i=pe(i),o=pe(o)),!G(t)&&ke(i)&&!ke(o)))return i.value=o,!0;const a=G(t)&&_i(n)?Number(n)e,sr=e=>Reflect.getPrototypeOf(e);function xo(e,t,n=!1,o=!1){e=e.__v_raw;const r=pe(e),i=pe(t);n||(cn(t,i)&&Ue(r,"get",t),Ue(r,"get",i));const{has:a}=sr(r),s=o?Ti:n?Oi:lo;if(a.call(r,t))return s(e.get(t));if(a.call(r,i))return s(e.get(i));e!==r&&e.get(t)}function Do(e,t=!1){const n=this.__v_raw,o=pe(n),r=pe(e);return t||(cn(e,r)&&Ue(o,"has",e),Ue(o,"has",r)),e===r?n.has(e):n.has(e)||n.has(r)}function Co(e,t=!1){return e=e.__v_raw,!t&&Ue(pe(e),"iterate",ln),Reflect.get(e,"size",e)}function ka(e){e=pe(e);const t=pe(this);return sr(t).has.call(t,e)||(t.add(e),Rt(t,"add",e,e)),this}function La(e,t){t=pe(t);const n=pe(this),{has:o,get:r}=sr(n);let i=o.call(n,e);i||(e=pe(e),i=o.call(n,e));const a=r.call(n,e);return n.set(e,t),i?cn(t,a)&&Rt(n,"set",e,t):Rt(n,"add",e,t),this}function Ra(e){const t=pe(this),{has:n,get:o}=sr(t);let r=n.call(t,e);r||(e=pe(e),r=n.call(t,e)),o&&o.call(t,e);const i=t.delete(e);return r&&Rt(t,"delete",e,void 0),i}function Sa(){const e=pe(this),t=e.size!==0,n=e.clear();return t&&Rt(e,"clear",void 0,void 0),n}function Vo(e,t){return function(o,r){const i=this,a=i.__v_raw,s=pe(a),c=t?Ti:e?Oi:lo;return!e&&Ue(s,"iterate",ln),a.forEach((u,p)=>o.call(r,c(u),c(p),i))}}function Mo(e,t,n){return function(...o){const r=this.__v_raw,i=pe(r),a=Tn(i),s=e==="entries"||e===Symbol.iterator&&a,c=e==="keys"&&a,u=r[e](...o),p=n?Ti:t?Oi:lo;return!t&&Ue(i,"iterate",c?Gr:ln),{next(){const{value:f,done:v}=u.next();return v?{value:f,done:v}:{value:s?[p(f[0]),p(f[1])]:p(f),done:v}},[Symbol.iterator](){return this}}}}function $t(e){return function(...t){return e==="delete"?!1:this}}function z0(){const e={get(i){return xo(this,i)},get size(){return Co(this)},has:Do,add:ka,set:La,delete:Ra,clear:Sa,forEach:Vo(!1,!1)},t={get(i){return xo(this,i,!1,!0)},get size(){return Co(this)},has:Do,add:ka,set:La,delete:Ra,clear:Sa,forEach:Vo(!1,!0)},n={get(i){return xo(this,i,!0)},get size(){return Co(this,!0)},has(i){return Do.call(this,i,!0)},add:$t("add"),set:$t("set"),delete:$t("delete"),clear:$t("clear"),forEach:Vo(!0,!1)},o={get(i){return xo(this,i,!0,!0)},get size(){return Co(this,!0)},has(i){return Do.call(this,i,!0)},add:$t("add"),set:$t("set"),delete:$t("delete"),clear:$t("clear"),forEach:Vo(!0,!0)};return["keys","values","entries",Symbol.iterator].forEach(i=>{e[i]=Mo(i,!1,!1),n[i]=Mo(i,!0,!1),t[i]=Mo(i,!1,!0),o[i]=Mo(i,!0,!0)}),[e,n,t,o]}const[F0,H0,j0,W0]=z0();function Ii(e,t){const n=t?e?W0:j0:e?H0:F0;return(o,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?o:Reflect.get(ve(n,r)&&r in o?n:o,r,i)}const U0={get:Ii(!1,!1)},G0={get:Ii(!1,!0)},K0={get:Ii(!0,!1)},us=new WeakMap,ps=new WeakMap,ds=new WeakMap,q0=new WeakMap;function Y0(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Z0(e){return e.__v_skip||!Object.isExtensible(e)?0:Y0(m0(e))}function bo(e){return Rn(e)?e:Pi(e,!1,B0,U0,us)}function fs(e){return Pi(e,!1,N0,G0,ps)}function Dt(e){return Pi(e,!0,$0,K0,ds)}function Pi(e,t,n,o,r){if(!Ee(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const a=Z0(e);if(a===0)return e;const s=new Proxy(e,a===2?o:n);return r.set(e,s),s}function In(e){return Rn(e)?In(e.__v_raw):!!(e&&e.__v_isReactive)}function Rn(e){return!!(e&&e.__v_isReadonly)}function Xo(e){return!!(e&&e.__v_isShallow)}function vs(e){return In(e)||Rn(e)}function pe(e){const t=e&&e.__v_raw;return t?pe(t):e}function hs(e){return qo(e,"__v_skip",!0),e}const lo=e=>Ee(e)?bo(e):e,Oi=e=>Ee(e)?Dt(e):e;function ki(e){Ut&&pt&&(e=pe(e),as(e.dep||(e.dep=wi())))}function Li(e,t){e=pe(e);const n=e.dep;n&&Kr(n)}function ke(e){return!!(e&&e.__v_isRef===!0)}function K(e){return ms(e,!1)}function $e(e){return ms(e,!0)}function ms(e,t){return ke(e)?e:new X0(e,t)}class X0{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:pe(t),this._value=n?t:lo(t)}get value(){return ki(this),this._value}set value(t){const n=this.__v_isShallow||Xo(t)||Rn(t);t=n?t:pe(t),cn(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:lo(t),Li(this))}}function dt(e){return ke(e)?e.value:e}const J0={get:(e,t,n)=>dt(Reflect.get(e,t,n)),set:(e,t,n,o)=>{const r=e[t];return ke(r)&&!ke(n)?(r.value=n,!0):Reflect.set(e,t,n,o)}};function gs(e){return In(e)?e:new Proxy(e,J0)}class Q0{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:n,set:o}=t(()=>ki(this),()=>Li(this));this._get=n,this._set=o}get value(){return this._get()}set value(t){this._set(t)}}function _s(e){return new Q0(e)}class ep{constructor(t,n,o){this._object=t,this._key=n,this._defaultValue=o,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return x0(pe(this._object),this._key)}}class tp{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0}get value(){return this._getter()}}function Wn(e,t,n){return ke(e)?e:ne(e)?new tp(e):Ee(e)&&arguments.length>1?np(e,t,n):K(e)}function np(e,t,n){const o=e[t];return ke(o)?o:new ep(e,t,n)}class op{constructor(t,n,o,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new Ai(t,()=>{this._dirty||(this._dirty=!0,Li(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=o}get value(){const t=pe(this);return ki(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function rp(e,t,n=!1){let o,r;const i=ne(e);return i?(o=e,r=vt):(o=e.get,r=e.set),new op(o,r,i||!r,n)}function Gt(e,t,n,o){let r;try{r=o?e(...o):e()}catch(i){yo(i,t,n)}return r}function nt(e,t,n,o){if(ne(e)){const i=Gt(e,t,n,o);return i&&Xl(i)&&i.catch(a=>{yo(a,t,n)}),i}const r=[];for(let i=0;i>>1,r=Be[o],i=co(r);iEt&&Be.splice(t,1)}function sp(e){G(e)?Pn.push(...e):(!kt||!kt.includes(e,e.allowRecurse?tn+1:tn))&&Pn.push(e),ys()}function xa(e,t=so?Et+1:0){for(;tco(n)-co(o)),tn=0;tne.id==null?1/0:e.id,cp=(e,t)=>{const n=co(e)-co(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Es(e){qr=!1,so=!0,Be.sort(cp);const t=vt;try{for(Et=0;Etie(h)?h.trim():h)),f&&(r=n.map(Yo))}let s,c=o[s=Tr(t)]||o[s=Tr(at(t))];!c&&i&&(c=o[s=Tr(Fn(t))]),c&&nt(c,e,6,r);const u=o[s+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[s])return;e.emitted[s]=!0,nt(u,e,6,r)}}function ws(e,t,n=!1){const o=t.emitsCache,r=o.get(e);if(r!==void 0)return r;const i=e.emits;let a={},s=!1;if(!ne(e)){const c=u=>{const p=ws(u,t,!0);p&&(s=!0,xe(a,p))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!s?(Ee(e)&&o.set(e,null),null):(G(i)?i.forEach(c=>a[c]=null):xe(a,i),Ee(e)&&o.set(e,a),a)}function ur(e,t){return!e||!mo(t)?!1:(t=t.slice(2).replace(/Once$/,""),ve(e,t[0].toLowerCase()+t.slice(1))||ve(e,Fn(t))||ve(e,t))}let Ze=null,As=null;function Qo(e){const t=Ze;return Ze=e,As=e&&e.type.__scopeId||null,t}function pp(e,t=Ze,n){if(!t||e._n)return e;const o=(...r)=>{o._d&&Wa(-1);const i=Qo(t);let a;try{a=e(...r)}finally{Qo(i),o._d&&Wa(1)}return a};return o._n=!0,o._c=!0,o._d=!0,o}function Ir(e){const{type:t,vnode:n,proxy:o,withProxy:r,props:i,propsOptions:[a],slots:s,attrs:c,emit:u,render:p,renderCache:f,data:v,setupState:h,ctx:_,inheritAttrs:y}=e;let P,E;const k=Qo(e);try{if(n.shapeFlag&4){const I=r||o;P=ut(p.call(I,I,f,i,h,v,_)),E=c}else{const I=t;P=ut(I.length>1?I(i,{attrs:c,slots:s,emit:u}):I(i,null)),E=t.props?c:dp(c)}}catch(I){ro.length=0,yo(I,e,1),P=Le(rt)}let A=P;if(E&&y!==!1){const I=Object.keys(E),{shapeFlag:V}=A;I.length&&V&7&&(a&&I.some(mi)&&(E=fp(E,a)),A=qt(A,E))}return n.dirs&&(A=qt(A),A.dirs=A.dirs?A.dirs.concat(n.dirs):n.dirs),n.transition&&(A.transition=n.transition),P=A,Qo(k),P}const dp=e=>{let t;for(const n in e)(n==="class"||n==="style"||mo(n))&&((t||(t={}))[n]=e[n]);return t},fp=(e,t)=>{const n={};for(const o in e)(!mi(o)||!(o.slice(9)in t))&&(n[o]=e[o]);return n};function vp(e,t,n){const{props:o,children:r,component:i}=e,{props:a,children:s,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return o?Da(o,a,u):!!a;if(c&8){const p=t.dynamicProps;for(let f=0;fe.__isSuspense;function Ts(e,t){t&&t.pendingBranch?G(e)?t.effects.push(...e):t.effects.push(e):sp(e)}function Is(e,t){return Si(e,null,t)}const Bo={};function ae(e,t,n){return Si(e,t,n)}function Si(e,t,{immediate:n,deep:o,flush:r,onTrack:i,onTrigger:a}=Te){var s;const c=ns()===((s=De)==null?void 0:s.scope)?De:null;let u,p=!1,f=!1;if(ke(e)?(u=()=>e.value,p=Xo(e)):In(e)?(u=()=>e,o=!0):G(e)?(f=!0,p=e.some(I=>In(I)||Xo(I)),u=()=>e.map(I=>{if(ke(I))return I.value;if(In(I))return rn(I);if(ne(I))return Gt(I,c,2)})):ne(e)?t?u=()=>Gt(e,c,2):u=()=>{if(!(c&&c.isUnmounted))return v&&v(),nt(e,c,3,[h])}:u=vt,t&&o){const I=u;u=()=>rn(I())}let v,h=I=>{v=k.onStop=()=>{Gt(I,c,4)}},_;if(Dn)if(h=vt,t?n&&nt(t,c,3,[u(),f?[]:void 0,h]):u(),r==="sync"){const I=ud();_=I.__watcherHandles||(I.__watcherHandles=[])}else return vt;let y=f?new Array(e.length).fill(Bo):Bo;const P=()=>{if(k.active)if(t){const I=k.run();(o||p||(f?I.some((V,x)=>cn(V,y[x])):cn(I,y)))&&(v&&v(),nt(t,c,3,[I,y===Bo?void 0:f&&y[0]===Bo?[]:y,h]),y=I)}else k.run()};P.allowRecurse=!!t;let E;r==="sync"?E=P:r==="post"?E=()=>je(P,c&&c.suspense):(P.pre=!0,c&&(P.id=c.uid),E=()=>cr(P));const k=new Ai(u,E);t?n?P():y=k.run():r==="post"?je(k.run.bind(k),c&&c.suspense):k.run();const A=()=>{k.stop(),c&&c.scope&&gi(c.scope.effects,k)};return _&&_.push(A),A}function gp(e,t,n){const o=this.proxy,r=ie(e)?e.includes(".")?Ps(o,e):()=>o[e]:e.bind(o,o);let i;ne(t)?i=t:(i=t.handler,n=t);const a=De;xn(this);const s=Si(r,i.bind(o),n);return a?xn(a):sn(),s}function Ps(e,t){const n=t.split(".");return()=>{let o=e;for(let r=0;r{rn(n,t)});else if(Ql(e))for(const n in e)rn(e[n],t);return e}function F3(e,t){const n=Ze;if(n===null)return e;const o=fr(n)||n.proxy,r=e.dirs||(e.dirs=[]);for(let i=0;i{e.isMounted=!0}),Ci(()=>{e.isUnmounting=!0}),e}const et=[Function,Array],ks={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:et,onEnter:et,onAfterEnter:et,onEnterCancelled:et,onBeforeLeave:et,onLeave:et,onAfterLeave:et,onLeaveCancelled:et,onBeforeAppear:et,onAppear:et,onAfterAppear:et,onAppearCancelled:et},_p={name:"BaseTransition",props:ks,setup(e,{slots:t}){const n=vn(),o=Os();let r;return()=>{const i=t.default&&xi(t.default(),!0);if(!i||!i.length)return;let a=i[0];if(i.length>1){for(const y of i)if(y.type!==rt){a=y;break}}const s=pe(e),{mode:c}=s;if(o.isLeaving)return Pr(a);const u=Ca(a);if(!u)return Pr(a);const p=uo(u,s,o,n);po(u,p);const f=n.subTree,v=f&&Ca(f);let h=!1;const{getTransitionKey:_}=u.type;if(_){const y=_();r===void 0?r=y:y!==r&&(r=y,h=!0)}if(v&&v.type!==rt&&(!nn(u,v)||h)){const y=uo(v,s,o,n);if(po(v,y),c==="out-in")return o.isLeaving=!0,y.afterLeave=()=>{o.isLeaving=!1,n.update.active!==!1&&n.update()},Pr(a);c==="in-out"&&u.type!==rt&&(y.delayLeave=(P,E,k)=>{const A=Ls(o,v);A[String(v.key)]=v,P[Ht]=()=>{E(),P[Ht]=void 0,delete p.delayedLeave},p.delayedLeave=k})}return a}}},bp=_p;function Ls(e,t){const{leavingVNodes:n}=e;let o=n.get(t.type);return o||(o=Object.create(null),n.set(t.type,o)),o}function uo(e,t,n,o){const{appear:r,mode:i,persisted:a=!1,onBeforeEnter:s,onEnter:c,onAfterEnter:u,onEnterCancelled:p,onBeforeLeave:f,onLeave:v,onAfterLeave:h,onLeaveCancelled:_,onBeforeAppear:y,onAppear:P,onAfterAppear:E,onAppearCancelled:k}=t,A=String(e.key),I=Ls(n,e),V=(R,H)=>{R&&nt(R,o,9,H)},x=(R,H)=>{const W=H[1];V(R,H),G(R)?R.every(se=>se.length<=1)&&W():R.length<=1&&W()},$={mode:i,persisted:a,beforeEnter(R){let H=s;if(!n.isMounted)if(r)H=y||s;else return;R[Ht]&&R[Ht](!0);const W=I[A];W&&nn(e,W)&&W.el[Ht]&&W.el[Ht](),V(H,[R])},enter(R){let H=c,W=u,se=p;if(!n.isMounted)if(r)H=P||c,W=E||u,se=k||p;else return;let F=!1;const ee=R[$o]=Pe=>{F||(F=!0,Pe?V(se,[R]):V(W,[R]),$.delayedLeave&&$.delayedLeave(),R[$o]=void 0)};H?x(H,[R,ee]):ee()},leave(R,H){const W=String(e.key);if(R[$o]&&R[$o](!0),n.isUnmounting)return H();V(f,[R]);let se=!1;const F=R[Ht]=ee=>{se||(se=!0,H(),ee?V(_,[R]):V(h,[R]),R[Ht]=void 0,I[W]===e&&delete I[W])};I[W]=e,v?x(v,[R,F]):F()},clone(R){return uo(R,t,n,o)}};return $}function Pr(e){if(Eo(e))return e=qt(e),e.children=null,e}function Ca(e){return Eo(e)?e.children?e.children[0]:void 0:e}function po(e,t){e.shapeFlag&6&&e.component?po(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function xi(e,t=!1,n){let o=[],r=0;for(let i=0;i1)for(let i=0;ixe({name:e.name},t,{setup:e}))():e}const to=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function b(e){ne(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:o,delay:r=200,timeout:i,suspensible:a=!0,onError:s}=e;let c=null,u,p=0;const f=()=>(p++,c=null,v()),v=()=>{let h;return c||(h=c=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),s)return new Promise((y,P)=>{s(_,()=>y(f()),()=>P(_),p+1)});throw _}).then(_=>h!==c&&c?c:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),u=_,_)))};return B({name:"AsyncComponentWrapper",__asyncLoader:v,get __asyncResolved(){return u},setup(){const h=De;if(u)return()=>Or(u,h);const _=k=>{c=null,yo(k,h,13,!o)};if(a&&h.suspense||Dn)return v().then(k=>()=>Or(k,h)).catch(k=>(_(k),()=>o?Le(o,{error:k}):null));const y=K(!1),P=K(),E=K(!!r);return r&&setTimeout(()=>{E.value=!1},r),i!=null&&setTimeout(()=>{if(!y.value&&!P.value){const k=new Error(`Async component timed out after ${i}ms.`);_(k),P.value=k}},i),v().then(()=>{y.value=!0,h.parent&&Eo(h.parent.vnode)&&cr(h.parent.update)}).catch(k=>{_(k),P.value=k}),()=>{if(y.value&&u)return Or(u,h);if(P.value&&o)return Le(o,{error:P.value});if(n&&!E.value)return Le(n)}}})}function Or(e,t){const{ref:n,props:o,children:r,ce:i}=t.vnode,a=Le(e,o,r);return a.ref=n,a.ce=i,delete t.vnode.ce,a}const Eo=e=>e.type.__isKeepAlive;function yp(e,t){Rs(e,"a",t)}function Ep(e,t){Rs(e,"da",t)}function Rs(e,t,n=De){const o=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(pr(t,o,n),n){let r=n.parent;for(;r&&r.parent;)Eo(r.parent.vnode)&&wp(o,t,n,r),r=r.parent}}function wp(e,t,n,o){const r=pr(t,e,o,!0);fn(()=>{gi(o[t],r)},n)}function pr(e,t,n=De,o=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...a)=>{if(n.isUnmounted)return;Hn(),xn(n);const s=nt(t,n,e,a);return sn(),jn(),s});return o?r.unshift(i):r.push(i),i}}const Ct=e=>(t,n=De)=>(!Dn||e==="sp")&&pr(e,(...o)=>t(...o),n),Di=Ct("bm"),ge=Ct("m"),Ap=Ct("bu"),Ss=Ct("u"),Ci=Ct("bum"),fn=Ct("um"),Tp=Ct("sp"),Ip=Ct("rtg"),Pp=Ct("rtc");function Op(e,t=De){pr("ec",e,t)}const xs="components";function Je(e,t){return Lp(xs,e,!0,t)||e}const kp=Symbol.for("v-ndc");function Lp(e,t,n=!0,o=!1){const r=Ze||De;if(r){const i=r.type;if(e===xs){const s=ld(i,!1);if(s&&(s===t||s===at(t)||s===_o(at(t))))return i}const a=Va(r[e]||i[e],t)||Va(r.appContext[e],t);return!a&&o?i:a}}function Va(e,t){return e&&(e[t]||e[at(t)]||e[_o(at(t))])}function H3(e,t,n,o){let r;const i=n&&n[o];if(G(e)||ie(e)){r=new Array(e.length);for(let a=0,s=e.length;at(a,s,void 0,i&&i[s]));else{const a=Object.keys(e);r=new Array(a.length);for(let s=0,c=a.length;se?Gs(e)?fr(e)||e.proxy:Yr(e.parent):null,no=xe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Yr(e.parent),$root:e=>Yr(e.root),$emit:e=>e.emit,$options:e=>Vi(e),$forceUpdate:e=>e.f||(e.f=()=>cr(e.update)),$nextTick:e=>e.n||(e.n=Xt.bind(e.proxy)),$watch:e=>gp.bind(e)}),kr=(e,t)=>e!==Te&&!e.__isScriptSetup&&ve(e,t),Rp={get({_:e},t){const{ctx:n,setupState:o,data:r,props:i,accessCache:a,type:s,appContext:c}=e;let u;if(t[0]!=="$"){const h=a[t];if(h!==void 0)switch(h){case 1:return o[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(kr(o,t))return a[t]=1,o[t];if(r!==Te&&ve(r,t))return a[t]=2,r[t];if((u=e.propsOptions[0])&&ve(u,t))return a[t]=3,i[t];if(n!==Te&&ve(n,t))return a[t]=4,n[t];Zr&&(a[t]=0)}}const p=no[t];let f,v;if(p)return t==="$attrs"&&Ue(e,"get",t),p(e);if((f=s.__cssModules)&&(f=f[t]))return f;if(n!==Te&&ve(n,t))return a[t]=4,n[t];if(v=c.config.globalProperties,ve(v,t))return v[t]},set({_:e},t,n){const{data:o,setupState:r,ctx:i}=e;return kr(r,t)?(r[t]=n,!0):o!==Te&&ve(o,t)?(o[t]=n,!0):ve(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:o,appContext:r,propsOptions:i}},a){let s;return!!n[a]||e!==Te&&ve(e,a)||kr(t,a)||(s=i[0])&&ve(s,a)||ve(o,a)||ve(no,a)||ve(r.config.globalProperties,a)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ve(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Ma(e){return G(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Zr=!0;function Sp(e){const t=Vi(e),n=e.proxy,o=e.ctx;Zr=!1,t.beforeCreate&&Ba(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:a,watch:s,provide:c,inject:u,created:p,beforeMount:f,mounted:v,beforeUpdate:h,updated:_,activated:y,deactivated:P,beforeDestroy:E,beforeUnmount:k,destroyed:A,unmounted:I,render:V,renderTracked:x,renderTriggered:$,errorCaptured:R,serverPrefetch:H,expose:W,inheritAttrs:se,components:F,directives:ee,filters:Pe}=t;if(u&&xp(u,o,null),a)for(const oe in a){const Z=a[oe];ne(Z)&&(o[oe]=Z.bind(n))}if(r){const oe=r.call(n,n);Ee(oe)&&(e.data=bo(oe))}if(Zr=!0,i)for(const oe in i){const Z=i[oe],st=ne(Z)?Z.bind(n,n):ne(Z.get)?Z.get.bind(n,n):vt,Bt=!ne(Z)&&ne(Z.set)?Z.set.bind(n):vt,_t=T({get:st,set:Bt});Object.defineProperty(o,oe,{enumerable:!0,configurable:!0,get:()=>_t.value,set:He=>_t.value=He})}if(s)for(const oe in s)Ds(s[oe],o,n,oe);if(c){const oe=ne(c)?c.call(n):c;Reflect.ownKeys(oe).forEach(Z=>{ot(Z,oe[Z])})}p&&Ba(p,e,"c");function Y(oe,Z){G(Z)?Z.forEach(st=>oe(st.bind(n))):Z&&oe(Z.bind(n))}if(Y(Di,f),Y(ge,v),Y(Ap,h),Y(Ss,_),Y(yp,y),Y(Ep,P),Y(Op,R),Y(Pp,x),Y(Ip,$),Y(Ci,k),Y(fn,I),Y(Tp,H),G(W))if(W.length){const oe=e.exposed||(e.exposed={});W.forEach(Z=>{Object.defineProperty(oe,Z,{get:()=>n[Z],set:st=>n[Z]=st})})}else e.exposed||(e.exposed={});V&&e.render===vt&&(e.render=V),se!=null&&(e.inheritAttrs=se),F&&(e.components=F),ee&&(e.directives=ee)}function xp(e,t,n=vt){G(e)&&(e=Xr(e));for(const o in e){const r=e[o];let i;Ee(r)?"default"in r?i=de(r.from||o,r.default,!0):i=de(r.from||o):i=de(r),ke(i)?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>i.value,set:a=>i.value=a}):t[o]=i}}function Ba(e,t,n){nt(G(e)?e.map(o=>o.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ds(e,t,n,o){const r=o.includes(".")?Ps(n,o):()=>n[o];if(ie(e)){const i=t[e];ne(i)&&ae(r,i)}else if(ne(e))ae(r,e.bind(n));else if(Ee(e))if(G(e))e.forEach(i=>Ds(i,t,n,o));else{const i=ne(e.handler)?e.handler.bind(n):t[e.handler];ne(i)&&ae(r,i,e)}}function Vi(e){const t=e.type,{mixins:n,extends:o}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:a}}=e.appContext,s=i.get(t);let c;return s?c=s:!r.length&&!n&&!o?c=t:(c={},r.length&&r.forEach(u=>er(c,u,a,!0)),er(c,t,a)),Ee(t)&&i.set(t,c),c}function er(e,t,n,o=!1){const{mixins:r,extends:i}=t;i&&er(e,i,n,!0),r&&r.forEach(a=>er(e,a,n,!0));for(const a in t)if(!(o&&a==="expose")){const s=Dp[a]||n&&n[a];e[a]=s?s(e[a],t[a]):t[a]}return e}const Dp={data:$a,props:Na,emits:Na,methods:Qn,computed:Qn,beforeCreate:Ne,created:Ne,beforeMount:Ne,mounted:Ne,beforeUpdate:Ne,updated:Ne,beforeDestroy:Ne,beforeUnmount:Ne,destroyed:Ne,unmounted:Ne,activated:Ne,deactivated:Ne,errorCaptured:Ne,serverPrefetch:Ne,components:Qn,directives:Qn,watch:Vp,provide:$a,inject:Cp};function $a(e,t){return t?e?function(){return xe(ne(e)?e.call(this,this):e,ne(t)?t.call(this,this):t)}:t:e}function Cp(e,t){return Qn(Xr(e),Xr(t))}function Xr(e){if(G(e)){const t={};for(let n=0;n1)return n&&ne(t)?t.call(o&&o.proxy):t}}function $p(e,t,n,o=!1){const r={},i={};qo(i,dr,1),e.propsDefaults=Object.create(null),Vs(e,t,r,i);for(const a in e.propsOptions[0])a in r||(r[a]=void 0);n?e.props=o?r:fs(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Np(e,t,n,o){const{props:r,attrs:i,vnode:{patchFlag:a}}=e,s=pe(r),[c]=e.propsOptions;let u=!1;if((o||a>0)&&!(a&16)){if(a&8){const p=e.vnode.dynamicProps;for(let f=0;f{c=!0;const[v,h]=Ms(f,t,!0);xe(a,v),h&&s.push(...h)};!n&&t.mixins.length&&t.mixins.forEach(p),e.extends&&p(e.extends),e.mixins&&e.mixins.forEach(p)}if(!i&&!c)return Ee(e)&&o.set(e,An),An;if(G(i))for(let p=0;p-1,h[1]=y<0||_-1||ve(h,"default"))&&s.push(f)}}}const u=[a,s];return Ee(e)&&o.set(e,u),u}function za(e){return e[0]!=="$"}function Fa(e){const t=e&&e.toString().match(/^\s*(function|class) (\w+)/);return t?t[2]:e===null?"null":""}function Ha(e,t){return Fa(e)===Fa(t)}function ja(e,t){return G(t)?t.findIndex(n=>Ha(n,e)):ne(t)&&Ha(t,e)?0:-1}const Bs=e=>e[0]==="_"||e==="$stable",Mi=e=>G(e)?e.map(ut):[ut(e)],zp=(e,t,n)=>{if(t._n)return t;const o=pp((...r)=>Mi(t(...r)),n);return o._c=!1,o},$s=(e,t,n)=>{const o=e._ctx;for(const r in e){if(Bs(r))continue;const i=e[r];if(ne(i))t[r]=zp(r,i,o);else if(i!=null){const a=Mi(i);t[r]=()=>a}}},Ns=(e,t)=>{const n=Mi(t);e.slots.default=()=>n},Fp=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=pe(t),qo(t,"_",n)):$s(t,e.slots={})}else e.slots={},t&&Ns(e,t);qo(e.slots,dr,1)},Hp=(e,t,n)=>{const{vnode:o,slots:r}=e;let i=!0,a=Te;if(o.shapeFlag&32){const s=t._;s?n&&s===1?i=!1:(xe(r,t),!n&&s===1&&delete r._):(i=!t.$stable,$s(t,r)),a=t}else t&&(Ns(e,t),a={default:1});if(i)for(const s in r)!Bs(s)&&a[s]==null&&delete r[s]};function nr(e,t,n,o,r=!1){if(G(e)){e.forEach((v,h)=>nr(v,t&&(G(t)?t[h]:t),n,o,r));return}if(to(o)&&!r)return;const i=o.shapeFlag&4?fr(o.component)||o.component.proxy:o.el,a=r?null:i,{i:s,r:c}=e,u=t&&t.r,p=s.refs===Te?s.refs={}:s.refs,f=s.setupState;if(u!=null&&u!==c&&(ie(u)?(p[u]=null,ve(f,u)&&(f[u]=null)):ke(u)&&(u.value=null)),ne(c))Gt(c,s,12,[a,p]);else{const v=ie(c),h=ke(c);if(v||h){const _=()=>{if(e.f){const y=v?ve(f,c)?f[c]:p[c]:c.value;r?G(y)&&gi(y,i):G(y)?y.includes(i)||y.push(i):v?(p[c]=[i],ve(f,c)&&(f[c]=p[c])):(c.value=[i],e.k&&(p[e.k]=c.value))}else v?(p[c]=a,ve(f,c)&&(f[c]=a)):h&&(c.value=a,e.k&&(p[e.k]=a))};a?(_.id=-1,je(_,n)):_()}}}let Nt=!1;const No=e=>/svg/.test(e.namespaceURI)&&e.tagName!=="foreignObject",zo=e=>e.nodeType===8;function jp(e){const{mt:t,p:n,o:{patchProp:o,createText:r,nextSibling:i,parentNode:a,remove:s,insert:c,createComment:u}}=e,p=(A,I)=>{if(!I.hasChildNodes()){n(null,A,I),Jo(),I._vnode=A;return}Nt=!1,f(I.firstChild,A,null,null,null),Jo(),I._vnode=A,Nt&&console.error("Hydration completed but contains mismatches.")},f=(A,I,V,x,$,R=!1)=>{const H=zo(A)&&A.data==="[",W=()=>y(A,I,V,x,$,H),{type:se,ref:F,shapeFlag:ee,patchFlag:Pe}=I;let Oe=A.nodeType;I.el=A,Pe===-2&&(R=!1,I.dynamicChildren=null);let Y=null;switch(se){case Sn:Oe!==3?I.children===""?(c(I.el=r(""),a(A),A),Y=A):Y=W():(A.data!==I.children&&(Nt=!0,A.data=I.children),Y=i(A));break;case rt:if(Oe!==8||H)if(A.tagName.toLowerCase()==="template"){const oe=I.el.content.firstChild;E(oe,A,V),I.el=A=oe,Y=i(A)}else Y=W();else Y=i(A);break;case oo:if(H&&(A=i(A),Oe=A.nodeType),Oe===1||Oe===3){Y=A;const oe=!I.children.length;for(let Z=0;Z{R=R||!!I.dynamicChildren;const{type:H,props:W,patchFlag:se,shapeFlag:F,dirs:ee,transition:Pe}=I,Oe=H==="input"&&ee||H==="option";if(Oe||se!==-1){if(ee&&yt(I,null,V,"created"),W)if(Oe||!R||se&48)for(const Z in W)(Oe&&Z.endsWith("value")||mo(Z)&&!eo(Z))&&o(A,Z,null,W[Z],!1,void 0,V);else W.onClick&&o(A,"onClick",null,W.onClick,!1,void 0,V);let Y;(Y=W&&W.onVnodeBeforeMount)&&tt(Y,V,I);let oe=!1;if(k(A)){oe=zs(x,Pe)&&V&&V.vnode.props&&V.vnode.props.appear;const Z=A.content.firstChild;oe&&Pe.beforeEnter(Z),E(Z,A,V),I.el=A=Z}if(ee&&yt(I,null,V,"beforeMount"),((Y=W&&W.onVnodeMounted)||ee||oe)&&Ts(()=>{Y&&tt(Y,V,I),oe&&Pe.enter(A),ee&&yt(I,null,V,"mounted")},x),F&16&&!(W&&(W.innerHTML||W.textContent))){let Z=h(A.firstChild,I,A,V,x,$,R);for(;Z;){Nt=!0;const st=Z;Z=Z.nextSibling,s(st)}}else F&8&&A.textContent!==I.children&&(Nt=!0,A.textContent=I.children)}return A.nextSibling},h=(A,I,V,x,$,R,H)=>{H=H||!!I.dynamicChildren;const W=I.children,se=W.length;for(let F=0;F{const{slotScopeIds:H}=I;H&&($=$?$.concat(H):H);const W=a(A),se=h(i(A),I,W,V,x,$,R);return se&&zo(se)&&se.data==="]"?i(I.anchor=se):(Nt=!0,c(I.anchor=u("]"),W,se),se)},y=(A,I,V,x,$,R)=>{if(Nt=!0,I.el=null,R){const se=P(A);for(;;){const F=i(A);if(F&&F!==se)s(F);else break}}const H=i(A),W=a(A);return s(A),n(null,I,W,H,V,x,No(W),$),H},P=(A,I="[",V="]")=>{let x=0;for(;A;)if(A=i(A),A&&zo(A)&&(A.data===I&&x++,A.data===V)){if(x===0)return i(A);x--}return A},E=(A,I,V)=>{const x=I.parentNode;x&&x.replaceChild(A,I);let $=V;for(;$;)$.vnode.el===I&&($.vnode.el=A,$.subTree.el=A),$=$.parent},k=A=>A.nodeType===1&&A.tagName.toLowerCase()==="template";return[p,f]}const je=Ts;function Wp(e){return Up(e,jp)}function Up(e,t){const n=Wr();n.__VUE__=!0;const{insert:o,remove:r,patchProp:i,createElement:a,createText:s,createComment:c,setText:u,setElementText:p,parentNode:f,nextSibling:v,setScopeId:h=vt,insertStaticContent:_}=e,y=(m,g,w,O=null,S=null,D=null,j=!1,M=null,N=!!g.dynamicChildren)=>{if(m===g)return;m&&!nn(m,g)&&(O=L(m),He(m,S,D,!0),m=null),g.patchFlag===-2&&(N=!1,g.dynamicChildren=null);const{type:C,ref:J,shapeFlag:q}=g;switch(C){case Sn:P(m,g,w,O);break;case rt:E(m,g,w,O);break;case oo:m==null&&k(g,w,O,j);break;case qe:F(m,g,w,O,S,D,j,M,N);break;default:q&1?V(m,g,w,O,S,D,j,M,N):q&6?ee(m,g,w,O,S,D,j,M,N):(q&64||q&128)&&C.process(m,g,w,O,S,D,j,M,N,z)}J!=null&&S&&nr(J,m&&m.ref,D,g||m,!g)},P=(m,g,w,O)=>{if(m==null)o(g.el=s(g.children),w,O);else{const S=g.el=m.el;g.children!==m.children&&u(S,g.children)}},E=(m,g,w,O)=>{m==null?o(g.el=c(g.children||""),w,O):g.el=m.el},k=(m,g,w,O)=>{[m.el,m.anchor]=_(m.children,g,w,O,m.el,m.anchor)},A=({el:m,anchor:g},w,O)=>{let S;for(;m&&m!==g;)S=v(m),o(m,w,O),m=S;o(g,w,O)},I=({el:m,anchor:g})=>{let w;for(;m&&m!==g;)w=v(m),r(m),m=w;r(g)},V=(m,g,w,O,S,D,j,M,N)=>{j=j||g.type==="svg",m==null?x(g,w,O,S,D,j,M,N):H(m,g,S,D,j,M,N)},x=(m,g,w,O,S,D,j,M)=>{let N,C;const{type:J,props:q,shapeFlag:Q,transition:te,dirs:le}=m;if(N=m.el=a(m.type,D,q&&q.is,q),Q&8?p(N,m.children):Q&16&&R(m.children,N,null,O,S,D&&J!=="foreignObject",j,M),le&&yt(m,null,O,"created"),$(N,m,m.scopeId,j,O),q){for(const be in q)be!=="value"&&!eo(be)&&i(N,be,null,q[be],D,m.children,O,S,Me);"value"in q&&i(N,"value",null,q.value),(C=q.onVnodeBeforeMount)&&tt(C,O,m)}le&&yt(m,null,O,"beforeMount");const Ae=zs(S,te);Ae&&te.beforeEnter(N),o(N,g,w),((C=q&&q.onVnodeMounted)||Ae||le)&&je(()=>{C&&tt(C,O,m),Ae&&te.enter(N),le&&yt(m,null,O,"mounted")},S)},$=(m,g,w,O,S)=>{if(w&&h(m,w),O)for(let D=0;D{for(let C=N;C{const M=g.el=m.el;let{patchFlag:N,dynamicChildren:C,dirs:J}=g;N|=m.patchFlag&16;const q=m.props||Te,Q=g.props||Te;let te;w&&Qt(w,!1),(te=Q.onVnodeBeforeUpdate)&&tt(te,w,g,m),J&&yt(g,m,w,"beforeUpdate"),w&&Qt(w,!0);const le=S&&g.type!=="foreignObject";if(C?W(m.dynamicChildren,C,M,w,O,le,D):j||Z(m,g,M,null,w,O,le,D,!1),N>0){if(N&16)se(M,g,q,Q,w,O,S);else if(N&2&&q.class!==Q.class&&i(M,"class",null,Q.class,S),N&4&&i(M,"style",q.style,Q.style,S),N&8){const Ae=g.dynamicProps;for(let be=0;be{te&&tt(te,w,g,m),J&&yt(g,m,w,"updated")},O)},W=(m,g,w,O,S,D,j)=>{for(let M=0;M{if(w!==O){if(w!==Te)for(const M in w)!eo(M)&&!(M in O)&&i(m,M,w[M],null,j,g.children,S,D,Me);for(const M in O){if(eo(M))continue;const N=O[M],C=w[M];N!==C&&M!=="value"&&i(m,M,C,N,j,g.children,S,D,Me)}"value"in O&&i(m,"value",w.value,O.value)}},F=(m,g,w,O,S,D,j,M,N)=>{const C=g.el=m?m.el:s(""),J=g.anchor=m?m.anchor:s("");let{patchFlag:q,dynamicChildren:Q,slotScopeIds:te}=g;te&&(M=M?M.concat(te):te),m==null?(o(C,w,O),o(J,w,O),R(g.children,w,J,S,D,j,M,N)):q>0&&q&64&&Q&&m.dynamicChildren?(W(m.dynamicChildren,Q,w,S,D,j,M),(g.key!=null||S&&g===S.subTree)&&Fs(m,g,!0)):Z(m,g,w,J,S,D,j,M,N)},ee=(m,g,w,O,S,D,j,M,N)=>{g.slotScopeIds=M,m==null?g.shapeFlag&512?S.ctx.activate(g,w,O,j,N):Pe(g,w,O,S,D,j,N):Oe(m,g,N)},Pe=(m,g,w,O,S,D,j)=>{const M=m.component=nd(m,O,S);if(Eo(m)&&(M.ctx.renderer=z),od(M),M.asyncDep){if(S&&S.registerDep(M,Y),!m.el){const N=M.subTree=Le(rt);E(null,N,g,w)}return}Y(M,m,g,w,S,D,j)},Oe=(m,g,w)=>{const O=g.component=m.component;if(vp(m,g,w))if(O.asyncDep&&!O.asyncResolved){oe(O,g,w);return}else O.next=g,lp(O.update),O.update();else g.el=m.el,O.vnode=g},Y=(m,g,w,O,S,D,j)=>{const M=()=>{if(m.isMounted){let{next:J,bu:q,u:Q,parent:te,vnode:le}=m,Ae=J,be;Qt(m,!1),J?(J.el=le.el,oe(m,J,j)):J=le,q&&Go(q),(be=J.props&&J.props.onVnodeBeforeUpdate)&&tt(be,te,J,le),Qt(m,!0);const Se=Ir(m),ct=m.subTree;m.subTree=Se,y(ct,Se,f(ct.el),L(ct),m,S,D),J.el=Se.el,Ae===null&&hp(m,Se.el),Q&&je(Q,S),(be=J.props&&J.props.onVnodeUpdated)&&je(()=>tt(be,te,J,le),S)}else{let J;const{el:q,props:Q}=g,{bm:te,m:le,parent:Ae}=m,be=to(g);if(Qt(m,!1),te&&Go(te),!be&&(J=Q&&Q.onVnodeBeforeMount)&&tt(J,Ae,g),Qt(m,!0),q&&me){const Se=()=>{m.subTree=Ir(m),me(q,m.subTree,m,S,null)};be?g.type.__asyncLoader().then(()=>!m.isUnmounted&&Se()):Se()}else{const Se=m.subTree=Ir(m);y(null,Se,w,O,m,S,D),g.el=Se.el}if(le&&je(le,S),!be&&(J=Q&&Q.onVnodeMounted)){const Se=g;je(()=>tt(J,Ae,Se),S)}(g.shapeFlag&256||Ae&&to(Ae.vnode)&&Ae.vnode.shapeFlag&256)&&m.a&&je(m.a,S),m.isMounted=!0,g=w=O=null}},N=m.effect=new Ai(M,()=>cr(C),m.scope),C=m.update=()=>N.run();C.id=m.uid,Qt(m,!0),C()},oe=(m,g,w)=>{g.component=m;const O=m.vnode.props;m.vnode=g,m.next=null,Np(m,g.props,O,w),Hp(m,g.children,w),Hn(),xa(),jn()},Z=(m,g,w,O,S,D,j,M,N=!1)=>{const C=m&&m.children,J=m?m.shapeFlag:0,q=g.children,{patchFlag:Q,shapeFlag:te}=g;if(Q>0){if(Q&128){Bt(C,q,w,O,S,D,j,M,N);return}else if(Q&256){st(C,q,w,O,S,D,j,M,N);return}}te&8?(J&16&&Me(C,S,D),q!==C&&p(w,q)):J&16?te&16?Bt(C,q,w,O,S,D,j,M,N):Me(C,S,D,!0):(J&8&&p(w,""),te&16&&R(q,w,O,S,D,j,M,N))},st=(m,g,w,O,S,D,j,M,N)=>{m=m||An,g=g||An;const C=m.length,J=g.length,q=Math.min(C,J);let Q;for(Q=0;QJ?Me(m,S,D,!0,!1,q):R(g,w,O,S,D,j,M,N,q)},Bt=(m,g,w,O,S,D,j,M,N)=>{let C=0;const J=g.length;let q=m.length-1,Q=J-1;for(;C<=q&&C<=Q;){const te=m[C],le=g[C]=N?jt(g[C]):ut(g[C]);if(nn(te,le))y(te,le,w,null,S,D,j,M,N);else break;C++}for(;C<=q&&C<=Q;){const te=m[q],le=g[Q]=N?jt(g[Q]):ut(g[Q]);if(nn(te,le))y(te,le,w,null,S,D,j,M,N);else break;q--,Q--}if(C>q){if(C<=Q){const te=Q+1,le=teQ)for(;C<=q;)He(m[C],S,D,!0),C++;else{const te=C,le=C,Ae=new Map;for(C=le;C<=Q;C++){const Ge=g[C]=N?jt(g[C]):ut(g[C]);Ge.key!=null&&Ae.set(Ge.key,C)}let be,Se=0;const ct=Q-le+1;let _n=!1,ba=0;const Kn=new Array(ct);for(C=0;C=ct){He(Ge,S,D,!0);continue}let bt;if(Ge.key!=null)bt=Ae.get(Ge.key);else for(be=le;be<=Q;be++)if(Kn[be-le]===0&&nn(Ge,g[be])){bt=be;break}bt===void 0?He(Ge,S,D,!0):(Kn[bt-le]=C+1,bt>=ba?ba=bt:_n=!0,y(Ge,g[bt],w,null,S,D,j,M,N),Se++)}const ya=_n?Gp(Kn):An;for(be=ya.length-1,C=ct-1;C>=0;C--){const Ge=le+C,bt=g[Ge],Ea=Ge+1{const{el:D,type:j,transition:M,children:N,shapeFlag:C}=m;if(C&6){_t(m.component.subTree,g,w,O);return}if(C&128){m.suspense.move(g,w,O);return}if(C&64){j.move(m,g,w,z);return}if(j===qe){o(D,g,w);for(let q=0;qM.enter(D),S);else{const{leave:q,delayLeave:Q,afterLeave:te}=M,le=()=>o(D,g,w),Ae=()=>{q(D,()=>{le(),te&&te()})};Q?Q(D,le,Ae):Ae()}else o(D,g,w)},He=(m,g,w,O=!1,S=!1)=>{const{type:D,props:j,ref:M,children:N,dynamicChildren:C,shapeFlag:J,patchFlag:q,dirs:Q}=m;if(M!=null&&nr(M,null,w,m,!0),J&256){g.ctx.deactivate(m);return}const te=J&1&&Q,le=!to(m);let Ae;if(le&&(Ae=j&&j.onVnodeBeforeUnmount)&&tt(Ae,g,m),J&6)So(m.component,w,O);else{if(J&128){m.suspense.unmount(w,O);return}te&&yt(m,null,g,"beforeUnmount"),J&64?m.type.remove(m,g,w,S,z,O):C&&(D!==qe||q>0&&q&64)?Me(C,g,w,!1,!0):(D===qe&&q&384||!S&&J&16)&&Me(N,g,w),O&&mn(m)}(le&&(Ae=j&&j.onVnodeUnmounted)||te)&&je(()=>{Ae&&tt(Ae,g,m),te&&yt(m,null,g,"unmounted")},w)},mn=m=>{const{type:g,el:w,anchor:O,transition:S}=m;if(g===qe){gn(w,O);return}if(g===oo){I(m);return}const D=()=>{r(w),S&&!S.persisted&&S.afterLeave&&S.afterLeave()};if(m.shapeFlag&1&&S&&!S.persisted){const{leave:j,delayLeave:M}=S,N=()=>j(w,D);M?M(m.el,D,N):N()}else D()},gn=(m,g)=>{let w;for(;m!==g;)w=v(m),r(m),m=w;r(g)},So=(m,g,w)=>{const{bum:O,scope:S,update:D,subTree:j,um:M}=m;O&&Go(O),S.stop(),D&&(D.active=!1,He(j,m,g,w)),M&&je(M,g),je(()=>{m.isUnmounted=!0},g),g&&g.pendingBranch&&!g.isUnmounted&&m.asyncDep&&!m.asyncResolved&&m.suspenseId===g.pendingId&&(g.deps--,g.deps===0&&g.resolve())},Me=(m,g,w,O=!1,S=!1,D=0)=>{for(let j=D;jm.shapeFlag&6?L(m.component.subTree):m.shapeFlag&128?m.suspense.next():v(m.anchor||m.el),U=(m,g,w)=>{m==null?g._vnode&&He(g._vnode,null,null,!0):y(g._vnode||null,m,g,null,null,null,w),xa(),Jo(),g._vnode=m},z={p:y,um:He,m:_t,r:mn,mt:Pe,mc:R,pc:Z,pbc:W,n:L,o:e};let X,me;return t&&([X,me]=t(z)),{render:U,hydrate:X,createApp:Bp(U,X)}}function Qt({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function zs(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Fs(e,t,n=!1){const o=e.children,r=t.children;if(G(o)&&G(r))for(let i=0;i>1,e[n[s]]0&&(t[o]=n[i-1]),n[i]=o)}}for(i=n.length,a=n[i-1];i-- >0;)n[i]=a,a=t[a];return n}const Kp=e=>e.__isTeleport,qe=Symbol.for("v-fgt"),Sn=Symbol.for("v-txt"),rt=Symbol.for("v-cmt"),oo=Symbol.for("v-stc"),ro=[];let ft=null;function qp(e=!1){ro.push(ft=e?null:[])}function Yp(){ro.pop(),ft=ro[ro.length-1]||null}let fo=1;function Wa(e){fo+=e}function Hs(e){return e.dynamicChildren=fo>0?ft||An:null,Yp(),fo>0&&ft&&ft.push(e),e}function j3(e,t,n,o,r,i){return Hs(Ws(e,t,n,o,r,i,!0))}function Zp(e,t,n,o,r){return Hs(Le(e,t,n,o,r,!0))}function Qr(e){return e?e.__v_isVNode===!0:!1}function nn(e,t){return e.type===t.type&&e.key===t.key}const dr="__vInternal",js=({key:e})=>e??null,Ko=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?ie(e)||ke(e)||ne(e)?{i:Ze,r:e,k:t,f:!!n}:e:null);function Ws(e,t=null,n=null,o=0,r=null,i=e===qe?0:1,a=!1,s=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&js(t),ref:t&&Ko(t),scopeId:As,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:o,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:Ze};return s?(Bi(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=ie(n)?8:16),fo>0&&!a&&ft&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&ft.push(c),c}const Le=Xp;function Xp(e,t=null,n=null,o=0,r=null,i=!1){if((!e||e===kp)&&(e=rt),Qr(e)){const s=qt(e,t,!0);return n&&Bi(s,n),fo>0&&!i&&ft&&(s.shapeFlag&6?ft[ft.indexOf(e)]=s:ft.push(s)),s.patchFlag|=-2,s}if(sd(e)&&(e=e.__vccOpts),t){t=Jp(t);let{class:s,style:c}=t;s&&!ie(s)&&(t.class=yi(s)),Ee(c)&&(vs(c)&&!G(c)&&(c=xe({},c)),t.style=bi(c))}const a=ie(e)?1:mp(e)?128:Kp(e)?64:Ee(e)?4:ne(e)?2:0;return Ws(e,t,n,o,r,a,i,!0)}function Jp(e){return e?vs(e)||dr in e?xe({},e):e:null}function qt(e,t,n=!1){const{props:o,ref:r,patchFlag:i,children:a}=e,s=t?Qp(o||{},t):o;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:s,key:s&&js(s),ref:t&&t.ref?n&&r?G(r)?r.concat(Ko(t)):[r,Ko(t)]:Ko(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:a,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==qe?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&qt(e.ssContent),ssFallback:e.ssFallback&&qt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Us(e=" ",t=0){return Le(Sn,null,e,t)}function W3(e,t){const n=Le(oo,null,e);return n.staticCount=t,n}function U3(e="",t=!1){return t?(qp(),Zp(rt,null,e)):Le(rt,null,e)}function ut(e){return e==null||typeof e=="boolean"?Le(rt):G(e)?Le(qe,null,e.slice()):typeof e=="object"?jt(e):Le(Sn,null,String(e))}function jt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:qt(e)}function Bi(e,t){let n=0;const{shapeFlag:o}=e;if(t==null)t=null;else if(G(t))n=16;else if(typeof t=="object")if(o&65){const r=t.default;r&&(r._c&&(r._d=!1),Bi(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(dr in t)?t._ctx=Ze:r===3&&Ze&&(Ze.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ne(t)?(t={default:t,_ctx:Ze},n=32):(t=String(t),o&64?(n=16,t=[Us(t)]):n=8);e.children=t,e.shapeFlag|=n}function Qp(...e){const t={};for(let n=0;nDe||Ze;let $i,bn,Ua="__VUE_INSTANCE_SETTERS__";(bn=Wr()[Ua])||(bn=Wr()[Ua]=[]),bn.push(e=>De=e),$i=e=>{bn.length>1?bn.forEach(t=>t(e)):bn[0](e)};const xn=e=>{$i(e),e.scope.on()},sn=()=>{De&&De.scope.off(),$i(null)};function Gs(e){return e.vnode.shapeFlag&4}let Dn=!1;function od(e,t=!1){Dn=t;const{props:n,children:o}=e.vnode,r=Gs(e);$p(e,n,r,t),Fp(e,o);const i=r?rd(e,t):void 0;return Dn=!1,i}function rd(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=hs(new Proxy(e.ctx,Rp));const{setup:o}=n;if(o){const r=e.setupContext=o.length>1?ad(e):null;xn(e),Hn();const i=Gt(o,e,0,[e.props,r]);if(jn(),sn(),Xl(i)){if(i.then(sn,sn),t)return i.then(a=>{Ga(e,a,t)}).catch(a=>{yo(a,e,0)});e.asyncDep=i}else Ga(e,i,t)}else Ks(e,t)}function Ga(e,t,n){ne(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Ee(t)&&(e.setupState=gs(t)),Ks(e,n)}let Ka;function Ks(e,t,n){const o=e.type;if(!e.render){if(!t&&Ka&&!o.render){const r=o.template||Vi(e).template;if(r){const{isCustomElement:i,compilerOptions:a}=e.appContext.config,{delimiters:s,compilerOptions:c}=o,u=xe(xe({isCustomElement:i,delimiters:s},a),c);o.render=Ka(r,u)}}e.render=o.render||vt}{xn(e),Hn();try{Sp(e)}finally{jn(),sn()}}}function id(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return Ue(e,"get","$attrs"),t[n]}}))}function ad(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return id(e)},slots:e.slots,emit:e.emit,expose:t}}function fr(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(gs(hs(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in no)return no[n](e)},has(t,n){return n in t||n in no}}))}function ld(e,t=!0){return ne(e)?e.displayName||e.name:e.name||t&&e.__name}function sd(e){return ne(e)&&"__vccOpts"in e}const T=(e,t)=>rp(e,t,Dn);function l(e,t,n){const o=arguments.length;return o===2?Ee(t)&&!G(t)?Qr(t)?Le(e,null,[t]):Le(e,t):Le(e,null,t):(o>3?n=Array.prototype.slice.call(arguments,2):o===3&&Qr(n)&&(n=[n]),Le(e,t,n))}const cd=Symbol.for("v-scx"),ud=()=>de(cd),pd="3.3.7",dd="http://www.w3.org/2000/svg",on=typeof document<"u"?document:null,qa=on&&on.createElement("template"),fd={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,o)=>{const r=t?on.createElementNS(dd,e):on.createElement(e,n?{is:n}:void 0);return e==="select"&&o&&o.multiple!=null&&r.setAttribute("multiple",o.multiple),r},createText:e=>on.createTextNode(e),createComment:e=>on.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>on.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,o,r,i){const a=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{qa.innerHTML=o?`${e}`:e;const s=qa.content;if(o){const c=s.firstChild;for(;c.firstChild;)s.appendChild(c.firstChild);s.removeChild(c)}t.insertBefore(s,n)}return[a?a.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},zt="transition",qn="animation",Cn=Symbol("_vtc"),Yt=(e,{slots:t})=>l(bp,Ys(e),t);Yt.displayName="Transition";const qs={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},vd=Yt.props=xe({},ks,qs),en=(e,t=[])=>{G(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ya=e=>e?G(e)?e.some(t=>t.length>1):e.length>1:!1;function Ys(e){const t={};for(const F in e)F in qs||(t[F]=e[F]);if(e.css===!1)return t;const{name:n="v",type:o,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:a=`${n}-enter-active`,enterToClass:s=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=a,appearToClass:p=s,leaveFromClass:f=`${n}-leave-from`,leaveActiveClass:v=`${n}-leave-active`,leaveToClass:h=`${n}-leave-to`}=e,_=hd(r),y=_&&_[0],P=_&&_[1],{onBeforeEnter:E,onEnter:k,onEnterCancelled:A,onLeave:I,onLeaveCancelled:V,onBeforeAppear:x=E,onAppear:$=k,onAppearCancelled:R=A}=t,H=(F,ee,Pe)=>{Ft(F,ee?p:s),Ft(F,ee?u:a),Pe&&Pe()},W=(F,ee)=>{F._isLeaving=!1,Ft(F,f),Ft(F,h),Ft(F,v),ee&&ee()},se=F=>(ee,Pe)=>{const Oe=F?$:k,Y=()=>H(ee,F,Pe);en(Oe,[ee,Y]),Za(()=>{Ft(ee,F?c:i),It(ee,F?p:s),Ya(Oe)||Xa(ee,o,y,Y)})};return xe(t,{onBeforeEnter(F){en(E,[F]),It(F,i),It(F,a)},onBeforeAppear(F){en(x,[F]),It(F,c),It(F,u)},onEnter:se(!1),onAppear:se(!0),onLeave(F,ee){F._isLeaving=!0;const Pe=()=>W(F,ee);It(F,f),Xs(),It(F,v),Za(()=>{F._isLeaving&&(Ft(F,f),It(F,h),Ya(I)||Xa(F,o,P,Pe))}),en(I,[F,Pe])},onEnterCancelled(F){H(F,!1),en(A,[F])},onAppearCancelled(F){H(F,!0),en(R,[F])},onLeaveCancelled(F){W(F),en(V,[F])}})}function hd(e){if(e==null)return null;if(Ee(e))return[Lr(e.enter),Lr(e.leave)];{const t=Lr(e);return[t,t]}}function Lr(e){return b0(e)}function It(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Cn]||(e[Cn]=new Set)).add(t)}function Ft(e,t){t.split(/\s+/).forEach(o=>o&&e.classList.remove(o));const n=e[Cn];n&&(n.delete(t),n.size||(e[Cn]=void 0))}function Za(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let md=0;function Xa(e,t,n,o){const r=e._endId=++md,i=()=>{r===e._endId&&o()};if(n)return setTimeout(i,n);const{type:a,timeout:s,propCount:c}=Zs(e,t);if(!a)return o();const u=a+"end";let p=0;const f=()=>{e.removeEventListener(u,v),i()},v=h=>{h.target===e&&++p>=c&&f()};setTimeout(()=>{p(n[_]||"").split(", "),r=o(`${zt}Delay`),i=o(`${zt}Duration`),a=Ja(r,i),s=o(`${qn}Delay`),c=o(`${qn}Duration`),u=Ja(s,c);let p=null,f=0,v=0;t===zt?a>0&&(p=zt,f=a,v=i.length):t===qn?u>0&&(p=qn,f=u,v=c.length):(f=Math.max(a,u),p=f>0?a>u?zt:qn:null,v=p?p===zt?i.length:c.length:0);const h=p===zt&&/\b(transform|all)(,|$)/.test(o(`${zt}Property`).toString());return{type:p,timeout:f,propCount:v,hasTransform:h}}function Ja(e,t){for(;e.lengthQa(n)+Qa(e[o])))}function Qa(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Xs(){return document.body.offsetHeight}function gd(e,t,n){const o=e[Cn];o&&(t=(t?[t,...o]:[...o]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Ni=Symbol("_vod"),G3={beforeMount(e,{value:t},{transition:n}){e[Ni]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Yn(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:o}){!t!=!n&&(o?t?(o.beforeEnter(e),Yn(e,!0),o.enter(e)):o.leave(e,()=>{Yn(e,!1)}):Yn(e,t))},beforeUnmount(e,{value:t}){Yn(e,t)}};function Yn(e,t){e.style.display=t?e[Ni]:"none"}function _d(e,t,n){const o=e.style,r=ie(n);if(n&&!r){if(t&&!ie(t))for(const i in t)n[i]==null&&ei(o,i,"");for(const i in n)ei(o,i,n[i])}else{const i=o.display;r?t!==n&&(o.cssText=n):t&&e.removeAttribute("style"),Ni in e&&(o.display=i)}}const el=/\s*!important$/;function ei(e,t,n){if(G(n))n.forEach(o=>ei(e,t,o));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const o=bd(e,t);el.test(n)?e.setProperty(Fn(o),n.replace(el,""),"important"):e[o]=n}}const tl=["Webkit","Moz","ms"],Rr={};function bd(e,t){const n=Rr[t];if(n)return n;let o=at(t);if(o!=="filter"&&o in e)return Rr[t]=o;o=_o(o);for(let r=0;rSr||(Id.then(()=>Sr=0),Sr=Date.now());function Od(e,t){const n=o=>{if(!o._vts)o._vts=Date.now();else if(o._vts<=n.attached)return;nt(kd(o,n.value),t,5,[o])};return n.value=e,n.attached=Pd(),n}function kd(e,t){if(G(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(o=>r=>!r._stopped&&o&&o(r))}else return t}const il=/^on[a-z]/,Ld=(e,t,n,o,r=!1,i,a,s,c)=>{t==="class"?gd(e,o,r):t==="style"?_d(e,n,o):mo(t)?mi(t)||Ad(e,t,n,o,a):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Rd(e,t,o,r))?Ed(e,t,o,i,a,s,c):(t==="true-value"?e._trueValue=o:t==="false-value"&&(e._falseValue=o),yd(e,t,o,r))};function Rd(e,t,n,o){return o?!!(t==="innerHTML"||t==="textContent"||t in e&&il.test(t)&&ne(n)):t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA"||il.test(t)&&ie(n)?!1:t in e}const Js=new WeakMap,Qs=new WeakMap,or=Symbol("_moveCb"),al=Symbol("_enterCb"),ec={name:"TransitionGroup",props:xe({},vd,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=vn(),o=Os();let r,i;return Ss(()=>{if(!r.length)return;const a=e.moveClass||`${e.name||"v"}-move`;if(!Md(r[0].el,n.vnode.el,a))return;r.forEach(Dd),r.forEach(Cd);const s=r.filter(Vd);Xs(),s.forEach(c=>{const u=c.el,p=u.style;It(u,a),p.transform=p.webkitTransform=p.transitionDuration="";const f=u[or]=v=>{v&&v.target!==u||(!v||/transform$/.test(v.propertyName))&&(u.removeEventListener("transitionend",f),u[or]=null,Ft(u,a))};u.addEventListener("transitionend",f)})}),()=>{const a=pe(e),s=Ys(a);let c=a.tag||qe;r=i,i=t.default?xi(t.default()):[];for(let u=0;udelete e.mode;ec.props;const xd=ec;function Dd(e){const t=e.el;t[or]&&t[or](),t[al]&&t[al]()}function Cd(e){Qs.set(e,e.el.getBoundingClientRect())}function Vd(e){const t=Js.get(e),n=Qs.get(e),o=t.left-n.left,r=t.top-n.top;if(o||r){const i=e.el.style;return i.transform=i.webkitTransform=`translate(${o}px,${r}px)`,i.transitionDuration="0s",e}}function Md(e,t,n){const o=e.cloneNode(),r=e[Cn];r&&r.forEach(s=>{s.split(/\s+/).forEach(c=>c&&o.classList.remove(c))}),n.split(/\s+/).forEach(s=>s&&o.classList.add(s)),o.style.display="none";const i=t.nodeType===1?t:t.parentNode;i.appendChild(o);const{hasTransform:a}=Zs(o);return i.removeChild(o),a}const Zt=e=>{const t=e.props["onUpdate:modelValue"]||!1;return G(t)?n=>Go(t,n):t};function Bd(e){e.target.composing=!0}function ll(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const it=Symbol("_assign"),sl={created(e,{modifiers:{lazy:t,trim:n,number:o}},r){e[it]=Zt(r);const i=o||r.props&&r.props.type==="number";Lt(e,t?"change":"input",a=>{if(a.target.composing)return;let s=e.value;n&&(s=s.trim()),i&&(s=Yo(s)),e[it](s)}),n&&Lt(e,"change",()=>{e.value=e.value.trim()}),t||(Lt(e,"compositionstart",Bd),Lt(e,"compositionend",ll),Lt(e,"change",ll))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:o,number:r}},i){if(e[it]=Zt(i),e.composing||document.activeElement===e&&e.type!=="range"&&(n||o&&e.value.trim()===t||(r||e.type==="number")&&Yo(e.value)===t))return;const a=t??"";e.value!==a&&(e.value=a)}},$d={deep:!0,created(e,t,n){e[it]=Zt(n),Lt(e,"change",()=>{const o=e._modelValue,r=Vn(e),i=e.checked,a=e[it];if(G(o)){const s=Ei(o,r),c=s!==-1;if(i&&!c)a(o.concat(r));else if(!i&&c){const u=[...o];u.splice(s,1),a(u)}}else if(zn(o)){const s=new Set(o);i?s.add(r):s.delete(r),a(s)}else a(tc(e,i))})},mounted:cl,beforeUpdate(e,t,n){e[it]=Zt(n),cl(e,t,n)}};function cl(e,{value:t,oldValue:n},o){e._modelValue=t,G(t)?e.checked=Ei(t,o.props.value)>-1:zn(t)?e.checked=t.has(o.props.value):t!==n&&(e.checked=un(t,tc(e,!0)))}const Nd={created(e,{value:t},n){e.checked=un(t,n.props.value),e[it]=Zt(n),Lt(e,"change",()=>{e[it](Vn(e))})},beforeUpdate(e,{value:t,oldValue:n},o){e[it]=Zt(o),t!==n&&(e.checked=un(t,o.props.value))}},zd={deep:!0,created(e,{value:t,modifiers:{number:n}},o){const r=zn(t);Lt(e,"change",()=>{const i=Array.prototype.filter.call(e.options,a=>a.selected).map(a=>n?Yo(Vn(a)):Vn(a));e[it](e.multiple?r?new Set(i):i:i[0])}),e[it]=Zt(o)},mounted(e,{value:t}){ul(e,t)},beforeUpdate(e,t,n){e[it]=Zt(n)},updated(e,{value:t}){ul(e,t)}};function ul(e,t){const n=e.multiple;if(!(n&&!G(t)&&!zn(t))){for(let o=0,r=e.options.length;o-1:i.selected=t.has(a);else if(un(Vn(i),t)){e.selectedIndex!==o&&(e.selectedIndex=o);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Vn(e){return"_value"in e?e._value:e.value}function tc(e,t){const n=t?"_trueValue":"_falseValue";return n in e?e[n]:t}const K3={created(e,t,n){Fo(e,t,n,null,"created")},mounted(e,t,n){Fo(e,t,n,null,"mounted")},beforeUpdate(e,t,n,o){Fo(e,t,n,o,"beforeUpdate")},updated(e,t,n,o){Fo(e,t,n,o,"updated")}};function Fd(e,t){switch(e){case"SELECT":return zd;case"TEXTAREA":return sl;default:switch(t){case"checkbox":return $d;case"radio":return Nd;default:return sl}}}function Fo(e,t,n,o,r){const a=Fd(e.tagName,n.props&&n.props.type)[r];a&&a(e,t,n,o)}const Hd=xe({patchProp:Ld},fd);let xr,pl=!1;function jd(){return xr=pl?xr:Wp(Hd),pl=!0,xr}const Wd=(...e)=>{const t=jd().createApp(...e),{mount:n}=t;return t.mount=o=>{const r=Ud(o);if(r)return n(r,!0,r instanceof SVGElement)},t};function Ud(e){return ie(e)?document.querySelector(e):e}const Gd={"v-3f9d0d55":()=>d(()=>import("./DailyRoutine.html-45bc8078.js"),[]).then(({data:e})=>e),"v-3d0aa58a":()=>d(()=>import("./Fitness.html-082e6f81.js"),[]).then(({data:e})=>e),"v-8daa1a0e":()=>d(()=>import("./index.html-525fa52c.js"),[]).then(({data:e})=>e),"v-35f5db9e":()=>d(()=>import("./blog.html-b8343597.js"),[]).then(({data:e})=>e),"v-184f4da6":()=>d(()=>import("./intro.html-ee68295b.js"),[]).then(({data:e})=>e),"v-0d25d1e4":()=>d(()=>import("./AIEnjoy.html-5e2fb1af.js"),[]).then(({data:e})=>e),"v-7b101d14":()=>d(()=>import("./ChatGPT.html-8df7a842.js"),[]).then(({data:e})=>e),"v-2c379a13":()=>d(()=>import("./Midjourney.html-8161c780.js"),[]).then(({data:e})=>e),"v-26a023fe":()=>d(()=>import("./2017-04-18-wechat_multi_open.html-fca25568.js"),[]).then(({data:e})=>e),"v-6222deab":()=>d(()=>import("./2017-04-22-rss_feed43_feedex.html-d6c63121.js"),[]).then(({data:e})=>e),"v-009a3fd6":()=>d(()=>import("./2017-07-28-office_2016_installer_error.html-d96ee67b.js"),[]).then(({data:e})=>e),"v-0d41d5d0":()=>d(()=>import("./2017-07-29-onenote_2016_cannot_be_logged_in.html-ea21af9c.js"),[]).then(({data:e})=>e),"v-c914fd10":()=>d(()=>import("./2017-09-02-forced_shutdown.html-db43df26.js"),[]).then(({data:e})=>e),"v-4576f198":()=>d(()=>import("./2017-09-03-smb_lan_sharing.html-9d2ccb13.js"),[]).then(({data:e})=>e),"v-e6f7cb8e":()=>d(()=>import("./2017-10-18-light_cat_e8-c-epon_admin.html-cfc6a771.js"),[]).then(({data:e})=>e),"v-5da24c3c":()=>d(()=>import("./2017-10-18-light_cat_port_forwarding.html-ae035b52.js"),[]).then(({data:e})=>e),"v-28c3d540":()=>d(()=>import("./2018-01-19-forget_the_cdn.html-cf13e6bf.js"),[]).then(({data:e})=>e),"v-b3818c3c":()=>d(()=>import("./2018-01-31-hire_a_robot.html-1d3a15d6.js"),[]).then(({data:e})=>e),"v-579c385c":()=>d(()=>import("./2018-04-30-baota_deploy_vps.html-99a3be7a.js"),[]).then(({data:e})=>e),"v-06691c4f":()=>d(()=>import("./2018-05-01-jekyll_blog_on_github_pages.html-0e4367ff.js"),[]).then(({data:e})=>e),"v-24d2d83a":()=>d(()=>import("./2018-05-02-jekyll_blog_on_vps.html-8cd05264.js"),[]).then(({data:e})=>e),"v-adf0c772":()=>d(()=>import("./2018-05-03-jekyll_blog_autodeploy.html-81e2ae25.js"),[]).then(({data:e})=>e),"v-730defc4":()=>d(()=>import("./2018-05-04-audition_cut_mp3.html-410a979a.js"),[]).then(({data:e})=>e),"v-1f0840b1":()=>d(()=>import("./2018-05-15-aria2_a_new_download_tool.html-604fc85e.js"),[]).then(({data:e})=>e),"v-5ae43900":()=>d(()=>import("./2018-05-24-airtable_noob.html-9bff118d.js"),[]).then(({data:e})=>e),"v-a3025528":()=>d(()=>import("./2018-06-08-baizhuo_gp1700.html-6a7e5ecd.js"),[]).then(({data:e})=>e),"v-5ad6240c":()=>d(()=>import("./2018-06-10-koolproxy_https.html-8e656fc3.js"),[]).then(({data:e})=>e),"v-77515ff2":()=>d(()=>import("./2018-06-19-iptv_direckly.html-ca48eeb4.js"),[]).then(({data:e})=>e),"v-73041b3a":()=>d(()=>import("./2018-10-07-huginn_scraping_any_website.html-4d569b7a.js"),[]).then(({data:e})=>e),"v-1004794e":()=>d(()=>import("./2018-12-28-voice_input_try.html-3b761608.js"),[]).then(({data:e})=>e),"v-7463267c":()=>d(()=>import("./2019-03-31-openvpn_back_to_home.html-6640b9b5.js"),[]).then(({data:e})=>e),"v-302b03de":()=>d(()=>import("./2019-04-01-rsshub_noob.html-1703a0d1.js"),[]).then(({data:e})=>e),"v-346c34d4":()=>d(()=>import("./2019-08-26-scrcpy_screen_projection.html-f0be4b9a.js"),[]).then(({data:e})=>e),"v-d8439540":()=>d(()=>import("./2020-03-25-rsshub_on_vps.html-7d6da547.js"),[]).then(({data:e})=>e),"v-273cf11f":()=>d(()=>import("./2020-09-13-wifi_speed_up.html-3af57f92.js"),[]).then(({data:e})=>e),"v-18a7959b":()=>d(()=>import("./2020-09-22-uefi_asus_board.html-747f6999.js"),[]).then(({data:e})=>e),"v-491d5d68":()=>d(()=>import("./2020-11-27-rime_input.html-afb70fad.js"),[]).then(({data:e})=>e),"v-0418b0dc":()=>d(()=>import("./2021-01-02-keepass_the_real_lastpassword.html-a4ffbce0.js"),[]).then(({data:e})=>e),"v-63fefb94":()=>d(()=>import("./2021-01-27-blog_jekyll_to_wordpress.html-9a858812.js"),[]).then(({data:e})=>e),"v-0a6bc026":()=>d(()=>import("./2021-05-31-principles_criticism_and_self-criticism.html-59f13f91.js"),[]).then(({data:e})=>e),"v-5a064ff2":()=>d(()=>import("./2021-10-23-nas_with_rsshub_and_huginn.html-62b54118.js"),[]).then(({data:e})=>e),"v-39faf312":()=>d(()=>import("./2022-01-23-wechat_lucky_money_cover.html-22ca671e.js"),[]).then(({data:e})=>e),"v-313c5888":()=>d(()=>import("./2022-02-19-microsoft_store_fixed.html-0c72525e.js"),[]).then(({data:e})=>e),"v-61d0df0c":()=>d(()=>import("./2022-03-17-rss_persistent_link_collection.html-78647e96.js"),[]).then(({data:e})=>e),"v-df55a79e":()=>d(()=>import("./2022-03-21-winget_the_strongest_software_manager_for_windows.html-eaa0fea1.js"),[]).then(({data:e})=>e),"v-24bf700c":()=>d(()=>import("./2022-04-21-uivision_rpa.html-420db56b.js"),[]).then(({data:e})=>e),"v-9029f640":()=>d(()=>import("./2022-06-07-blog_md_to_wordpress.html-c182ddcd.js"),[]).then(({data:e})=>e),"v-6eacd3db":()=>d(()=>import("./2022-08-22-learndata_blog_to_knowledge_management.html-d71063f3.js"),[]).then(({data:e})=>e),"v-69739db8":()=>d(()=>import("./2022-11-03-ffmpeg_screen_recording.html-9d5cfd1f.js"),[]).then(({data:e})=>e),"v-333dd8ee":()=>d(()=>import("./2023-01-26-whiteboard_gtd.html-cd88f1c6.js"),[]).then(({data:e})=>e),"v-5e3d84de":()=>d(()=>import("./2023-09-05-virtual_positioning.html-b145435f.js"),[]).then(({data:e})=>e),"v-72653828":()=>d(()=>import("./2023-10-07-clone-voice.html-c9e1aae4.js"),[]).then(({data:e})=>e),"v-e381b74e":()=>d(()=>import("./2023-10-29-switch-firmware-updates.html-9cb5f9dc.js"),[]).then(({data:e})=>e),"v-b90f383c":()=>d(()=>import("./2023-12-12-eu.org-free-domain.html-500a42db.js"),[]).then(({data:e})=>e),"v-22230056":()=>d(()=>import("./2023-12-12-sd-op.html-ca048d22.js"),[]).then(({data:e})=>e),"v-af1fbe54":()=>d(()=>import("./2023-12-13-awesome-selfhosted-cn.html-1ee63837.js"),[]).then(({data:e})=>e),"v-69693975":()=>d(()=>import("./AppNotes.html-3d9f7248.js"),[]).then(({data:e})=>e),"v-1735a0be":()=>d(()=>import("./Applist.html-298fe23a.js"),[]).then(({data:e})=>e),"v-d967ed6c":()=>d(()=>import("./ChatGPT.html-36342337.js"),[]).then(({data:e})=>e),"v-5c29014a":()=>d(()=>import("./Chrome.html-a20ac378.js"),[]).then(({data:e})=>e),"v-1d7dd2b7":()=>d(()=>import("./design.html-779e25c7.js"),[]).then(({data:e})=>e),"v-abe04fa2":()=>d(()=>import("./AutoHotkey.html-b49d3269.js"),[]).then(({data:e})=>e),"v-fae223a4":()=>d(()=>import("./Electron.html-0d63b015.js"),[]).then(({data:e})=>e),"v-67fe64b6":()=>d(()=>import("./HTML.html-ded0c051.js"),[]).then(({data:e})=>e),"v-72cba7c3":()=>d(()=>import("./Javascript.html-40c30c8e.js"),[]).then(({data:e})=>e),"v-0195f17e":()=>d(()=>import("./Markdown.html-470c21a4.js"),[]).then(({data:e})=>e),"v-2caa5134":()=>d(()=>import("./Python.html-5a8ec16d.js"),[]).then(({data:e})=>e),"v-146a1089":()=>d(()=>import("./index.html-69fb594a.js"),[]).then(({data:e})=>e),"v-49ecfa5b":()=>d(()=>import("./Regex.html-d99f639d.js"),[]).then(({data:e})=>e),"v-6bea56bc":()=>d(()=>import("./Vue.html-42ae00ac.js"),[]).then(({data:e})=>e),"v-88193f16":()=>d(()=>import("./CloudServices.html-4b4cb2a8.js"),[]).then(({data:e})=>e),"v-1c7fca9e":()=>d(()=>import("./Cloudflare.html-ef317977.js"),[]).then(({data:e})=>e),"v-2b70157f":()=>d(()=>import("./DNS.html-509a1466.js"),[]).then(({data:e})=>e),"v-bc154f32":()=>d(()=>import("./GitHub.html-44536f4d.js"),[]).then(({data:e})=>e),"v-d4ab9bf4":()=>d(()=>import("./MySQL.html-e44b25dd.js"),[]).then(({data:e})=>e),"v-7c5f209c":()=>d(()=>import("./Static.html-a963f439.js"),[]).then(({data:e})=>e),"v-39dc98a2":()=>d(()=>import("./VPS.html-a47e95dd.js"),[]).then(({data:e})=>e),"v-c582fe3e":()=>d(()=>import("./Coupon.html-b1d1aabf.js"),[]).then(({data:e})=>e),"v-373dc153":()=>d(()=>import("./Diet.html-50c2f9e4.js"),[]).then(({data:e})=>e),"v-9ff4249e":()=>d(()=>import("./HomeAutomation.html-f2340371.js"),[]).then(({data:e})=>e),"v-16a2796a":()=>d(()=>import("./Life.html-5412bc87.js"),[]).then(({data:e})=>e),"v-850f3410":()=>d(()=>import("./Maintenance.html-5985d0c1.js"),[]).then(({data:e})=>e),"v-182a363a":()=>d(()=>import("./Medical.html-80b7c6b9.js"),[]).then(({data:e})=>e),"v-c51c66fe":()=>d(()=>import("./Shoppinglist.html-a29393a2.js"),[]).then(({data:e})=>e),"v-101edae1":()=>d(()=>import("./Docker.html-03086503.js"),[]).then(({data:e})=>e),"v-73fe61b2":()=>d(()=>import("./Huginn.html-d778a6d3.js"),[]).then(({data:e})=>e),"v-1b2d4c91":()=>d(()=>import("./NAS.html-92bd9dc2.js"),[]).then(({data:e})=>e),"v-54e731c2":()=>d(()=>import("./TTRSS.html-23061294.js"),[]).then(({data:e})=>e),"v-00f6d5f1":()=>d(()=>import("./Comments.html-4fbb14f8.js"),[]).then(({data:e})=>e),"v-3b0b9f28":()=>d(()=>import("./VuePress.html-a4d3ac36.js"),[]).then(({data:e})=>e),"v-3cdca328":()=>d(()=>import("./docsify.html-1f505e6f.js"),[]).then(({data:e})=>e),"v-6451f4a2":()=>d(()=>import("./NewSystem.html-66bcc93c.js"),[]).then(({data:e})=>e),"v-395a6953":()=>d(()=>import("./QTTabBar.html-5fab5039.js"),[]).then(({data:e})=>e),"v-a8b7dd1a":()=>d(()=>import("./cd.html-fc67c435.js"),[]).then(({data:e})=>e),"v-5e2612f0":()=>d(()=>import("./faq.html-8e17da76.js"),[]).then(({data:e})=>e),"v-df9d5022":()=>d(()=>import("./mac.html-a292b24e.js"),[]).then(({data:e})=>e),"v-12e41b33":()=>d(()=>import("./index.html-043723ad.js"),[]).then(({data:e})=>e),"v-bdd9cae6":()=>d(()=>import("./0_live_equipments.html-1863c925.js"),[]).then(({data:e})=>e),"v-63cd7175":()=>d(()=>import("./1_obs_basic.html-6f272223.js"),[]).then(({data:e})=>e),"v-1ace0584":()=>d(()=>import("./2_obs_streamfx.html-66261335.js"),[]).then(({data:e})=>e),"v-78ae0f01":()=>d(()=>import("./3_obs_plugins.html-6194c452.js"),[]).then(({data:e})=>e),"v-21f30b82":()=>d(()=>import("./4_live_effects.html-2d59706b.js"),[]).then(({data:e})=>e),"v-0094e0b6":()=>d(()=>import("./5_live_platforms.html-982a62c6.js"),[]).then(({data:e})=>e),"v-a580c466":()=>d(()=>import("./6_live_positioning.html-d06a7fc8.js"),[]).then(({data:e})=>e),"v-c7c23db2":()=>d(()=>import("./index.html-f0e953f9.js"),[]).then(({data:e})=>e),"v-d551fba2":()=>d(()=>import("./birthing.html-cdb6ec7f.js"),[]).then(({data:e})=>e),"v-db6f9792":()=>d(()=>import("./newborn.html-0e9247c9.js"),[]).then(({data:e})=>e),"v-146fc10b":()=>d(()=>import("./index.html-63c7330d.js"),[]).then(({data:e})=>e),"v-54bae169":()=>d(()=>import("./cors-anywhere.html-8ab790d2.js"),[]).then(({data:e})=>e),"v-2117748f":()=>d(()=>import("./emby.html-90076e27.js"),[]).then(({data:e})=>e),"v-072b240a":()=>d(()=>import("./grocy.html-d4cdb496.js"),[]).then(({data:e})=>e),"v-4b94fd6a":()=>d(()=>import("./memos.html-e20d76dd.js"),[]).then(({data:e})=>e),"v-7b224f9d":()=>d(()=>import("./mt-photos.html-b1e9b4b7.js"),[]).then(({data:e})=>e),"v-2b3f3b71":()=>d(()=>import("./navidrome.html-6a27be53.js"),[]).then(({data:e})=>e),"v-79e8b601":()=>d(()=>import("./qinglong.html-2ceaed27.js"),[]).then(({data:e})=>e),"v-774ba40b":()=>d(()=>import("./reader.html-a93f3612.js"),[]).then(({data:e})=>e),"v-06c25741":()=>d(()=>import("./reverse-proxy.html-c4cd4b31.js"),[]).then(({data:e})=>e),"v-a0e1132e":()=>d(()=>import("./stirling-pdf.html-549705e4.js"),[]).then(({data:e})=>e),"v-78e70751":()=>d(()=>import("./syncthing.html-7a1414a4.js"),[]).then(({data:e})=>e),"v-31e5d674":()=>d(()=>import("./tachidesk.html-632239b4.js"),[]).then(({data:e})=>e),"v-08917e81":()=>d(()=>import("./uptime-kuma.html-92f21d82.js"),[]).then(({data:e})=>e),"v-3706649a":()=>d(()=>import("./404.html-f96486c3.js"),[]).then(({data:e})=>e),"v-2d0a776e":()=>d(()=>import("./index.html-42c67c26.js"),[]).then(({data:e})=>e),"v-e1e3da16":()=>d(()=>import("./index.html-6992389e.js"),[]).then(({data:e})=>e),"v-144e84a4":()=>d(()=>import("./index.html-ab533073.js"),[]).then(({data:e})=>e),"v-72a9c1e2":()=>d(()=>import("./index.html-c2bdef3e.js"),[]).then(({data:e})=>e),"v-29788432":()=>d(()=>import("./index.html-dcb307f6.js"),[]).then(({data:e})=>e),"v-1a3d5e90":()=>d(()=>import("./index.html-04c6db3e.js"),[]).then(({data:e})=>e),"v-744e6dd4":()=>d(()=>import("./index.html-2d95f622.js"),[]).then(({data:e})=>e),"v-d7a4cff6":()=>d(()=>import("./index.html-50790362.js"),[]).then(({data:e})=>e),"v-4766039d":()=>d(()=>import("./index.html-58c4bbd5.js"),[]).then(({data:e})=>e),"v-5bc93818":()=>d(()=>import("./index.html-655bf0e6.js"),[]).then(({data:e})=>e),"v-744d024e":()=>d(()=>import("./index.html-d6c99b23.js"),[]).then(({data:e})=>e),"v-e52c881c":()=>d(()=>import("./index.html-87604af9.js"),[]).then(({data:e})=>e),"v-154dc4c4":()=>d(()=>import("./index.html-cc5ef4b9.js"),[]).then(({data:e})=>e),"v-01560935":()=>d(()=>import("./index.html-e9005503.js"),[]).then(({data:e})=>e),"v-14145d44":()=>d(()=>import("./index.html-7fe00f40.js"),[]).then(({data:e})=>e),"v-72680697":()=>d(()=>import("./index.html-dd561b3d.js"),[]).then(({data:e})=>e),"v-8f1d462c":()=>d(()=>import("./index.html-1c28f69c.js"),[]).then(({data:e})=>e),"v-b306892a":()=>d(()=>import("./index.html-ceb7226e.js"),[]).then(({data:e})=>e),"v-eea9fcce":()=>d(()=>import("./index.html-1be9f779.js"),[]).then(({data:e})=>e),"v-8c49fdb8":()=>d(()=>import("./index.html-ff2e2d2b.js"),[]).then(({data:e})=>e),"v-5ff6b5a3":()=>d(()=>import("./index.html-fec1031e.js"),[]).then(({data:e})=>e),"v-8c487d20":()=>d(()=>import("./index.html-f1014064.js"),[]).then(({data:e})=>e),"v-5f7f7ebf":()=>d(()=>import("./index.html-2c7e91e5.js"),[]).then(({data:e})=>e),"v-d08dfa36":()=>d(()=>import("./index.html-26b23278.js"),[]).then(({data:e})=>e),"v-8de1a174":()=>d(()=>import("./index.html-8fc9788e.js"),[]).then(({data:e})=>e),"v-05308425":()=>d(()=>import("./index.html-defb43ec.js"),[]).then(({data:e})=>e),"v-150ab774":()=>d(()=>import("./index.html-e4cb76a7.js"),[]).then(({data:e})=>e),"v-21d2d53f":()=>d(()=>import("./index.html-223c6569.js"),[]).then(({data:e})=>e),"v-b305d196":()=>d(()=>import("./index.html-c233dd08.js"),[]).then(({data:e})=>e),"v-8f2a3ea6":()=>d(()=>import("./index.html-19b3f809.js"),[]).then(({data:e})=>e),"v-b3149e20":()=>d(()=>import("./index.html-8df920dc.js"),[]).then(({data:e})=>e),"v-92b89202":()=>d(()=>import("./index.html-88e5225c.js"),[]).then(({data:e})=>e),"v-3f145752":()=>d(()=>import("./index.html-a0c75d3f.js"),[]).then(({data:e})=>e),"v-6d02fe66":()=>d(()=>import("./index.html-f7c08143.js"),[]).then(({data:e})=>e),"v-e45a3fd0":()=>d(()=>import("./index.html-6aa920d9.js"),[]).then(({data:e})=>e),"v-132a6ac4":()=>d(()=>import("./index.html-eb05c42f.js"),[]).then(({data:e})=>e),"v-e22b51b2":()=>d(()=>import("./index.html-2c9c39b2.js"),[]).then(({data:e})=>e),"v-6106c001":()=>d(()=>import("./index.html-f5064dc2.js"),[]).then(({data:e})=>e),"v-1f1d54f4":()=>d(()=>import("./index.html-c39642b5.js"),[]).then(({data:e})=>e),"v-026ab35e":()=>d(()=>import("./index.html-2f33ddde.js"),[]).then(({data:e})=>e),"v-45b16e58":()=>d(()=>import("./index.html-facab2fe.js"),[]).then(({data:e})=>e),"v-aae951e6":()=>d(()=>import("./index.html-74befb3b.js"),[]).then(({data:e})=>e),"v-36dccd5d":()=>d(()=>import("./index.html-df620b5c.js"),[]).then(({data:e})=>e),"v-02d57e1c":()=>d(()=>import("./index.html-c7d4def9.js"),[]).then(({data:e})=>e),"v-36474c60":()=>d(()=>import("./index.html-453d121a.js"),[]).then(({data:e})=>e),"v-289a8dd8":()=>d(()=>import("./index.html-bb64d4c7.js"),[]).then(({data:e})=>e),"v-0cbf5886":()=>d(()=>import("./index.html-26590d8d.js"),[]).then(({data:e})=>e),"v-6f001b53":()=>d(()=>import("./index.html-28f1b3fd.js"),[]).then(({data:e})=>e),"v-179b645c":()=>d(()=>import("./index.html-7afcb2bd.js"),[]).then(({data:e})=>e),"v-4d51b51e":()=>d(()=>import("./index.html-97dabdb3.js"),[]).then(({data:e})=>e),"v-66d9f917":()=>d(()=>import("./index.html-2ebe59fd.js"),[]).then(({data:e})=>e),"v-d82d3ed4":()=>d(()=>import("./index.html-2a5d9f94.js"),[]).then(({data:e})=>e),"v-295c722c":()=>d(()=>import("./index.html-1c163970.js"),[]).then(({data:e})=>e),"v-9a6de7e0":()=>d(()=>import("./index.html-8810af62.js"),[]).then(({data:e})=>e),"v-70a94678":()=>d(()=>import("./index.html-f4b9ffbd.js"),[]).then(({data:e})=>e),"v-79bd8a59":()=>d(()=>import("./index.html-84ebc212.js"),[]).then(({data:e})=>e),"v-ecace9be":()=>d(()=>import("./index.html-a7326923.js"),[]).then(({data:e})=>e),"v-2e8a96b8":()=>d(()=>import("./index.html-7a998403.js"),[]).then(({data:e})=>e),"v-c58e8f3e":()=>d(()=>import("./index.html-f0f28563.js"),[]).then(({data:e})=>e),"v-8ba0d006":()=>d(()=>import("./index.html-bf16cc26.js"),[]).then(({data:e})=>e),"v-b30ab346":()=>d(()=>import("./index.html-d13e22bc.js"),[]).then(({data:e})=>e),"v-a76657ce":()=>d(()=>import("./index.html-1b015b38.js"),[]).then(({data:e})=>e),"v-0f92890a":()=>d(()=>import("./index.html-bd0d6fdf.js"),[]).then(({data:e})=>e),"v-44794367":()=>d(()=>import("./index.html-880bd7af.js"),[]).then(({data:e})=>e),"v-207bdcdd":()=>d(()=>import("./index.html-fdcac8ab.js"),[]).then(({data:e})=>e),"v-9075524a":()=>d(()=>import("./index.html-cb107114.js"),[]).then(({data:e})=>e),"v-c9e9368a":()=>d(()=>import("./index.html-17ded23c.js"),[]).then(({data:e})=>e),"v-b306a40c":()=>d(()=>import("./index.html-2c2b56bd.js"),[]).then(({data:e})=>e),"v-2836033f":()=>d(()=>import("./index.html-7c1d629a.js"),[]).then(({data:e})=>e),"v-ed16b278":()=>d(()=>import("./index.html-7c16862a.js"),[]).then(({data:e})=>e),"v-6b6b05fc":()=>d(()=>import("./index.html-fa1221fe.js"),[]).then(({data:e})=>e),"v-f091ce2a":()=>d(()=>import("./index.html-5db61fbb.js"),[]).then(({data:e})=>e),"v-b3108574":()=>d(()=>import("./index.html-ba6dbc5e.js"),[]).then(({data:e})=>e),"v-91d85d3a":()=>d(()=>import("./index.html-03d14b39.js"),[]).then(({data:e})=>e),"v-0da0abf9":()=>d(()=>import("./index.html-20ce6bc9.js"),[]).then(({data:e})=>e),"v-294e906f":()=>d(()=>import("./index.html-d6f3e241.js"),[]).then(({data:e})=>e),"v-311b2668":()=>d(()=>import("./index.html-45c53c83.js"),[]).then(({data:e})=>e),"v-33129548":()=>d(()=>import("./index.html-b1caeef5.js"),[]).then(({data:e})=>e),"v-2870f5b5":()=>d(()=>import("./index.html-6f9b0bdf.js"),[]).then(({data:e})=>e),"v-4b93f328":()=>d(()=>import("./index.html-d12a7753.js"),[]).then(({data:e})=>e),"v-2d605e49":()=>d(()=>import("./index.html-befb82c3.js"),[]).then(({data:e})=>e),"v-5b9877a1":()=>d(()=>import("./index.html-d9ee26fc.js"),[]).then(({data:e})=>e),"v-df045e5a":()=>d(()=>import("./index.html-e1a55533.js"),[]).then(({data:e})=>e),"v-05db77bd":()=>d(()=>import("./index.html-1e7510e6.js"),[]).then(({data:e})=>e),"v-3514c09e":()=>d(()=>import("./index.html-52267175.js"),[]).then(({data:e})=>e),"v-fa46c5c6":()=>d(()=>import("./index.html-d9182b73.js"),[]).then(({data:e})=>e),"v-293a5861":()=>d(()=>import("./index.html-fb5dbf0d.js"),[]).then(({data:e})=>e),"v-b309c306":()=>d(()=>import("./index.html-67df07bb.js"),[]).then(({data:e})=>e)},Kd=JSON.parse('{"base":"/","lang":"zh-CN","title":"LearnHubs","description":"开源工具、效率方法、心理学探索的自我提升笔记,记录并输出一切能让自己提升的知识。","head":[["link",{"rel":"alternate","type":"application/rss+xml","href":"https://gpt-vip.top/rss.xml","title":"LearnHubs RSS Feed"}]],"locales":{}}');var qd=([e,t,n])=>e==="meta"&&t.name?`${e}.${t.name}`:["title","base"].includes(e)?e:e==="template"&&t.id?`${e}.${t.id}`:JSON.stringify([e,t,n]),Yd=e=>{const t=new Set,n=[];return e.forEach(o=>{const r=qd(o);t.has(r)||(t.add(r),n.push(o))}),n},Zd=e=>e[e.length-1]==="/"||e.endsWith(".html")?e:`${e}/`,Xd=e=>e.startsWith("ftp://"),Jt=e=>/^(https?:)?\/\//.test(e),Jd=/.md((\?|#).*)?$/,rr=(e,t="/")=>!!(Jt(e)||Xd(e)||e.startsWith("/")&&!e.startsWith(t)&&!Jd.test(e)),nc=e=>/^mailto:/.test(e),Qd=e=>/^tel:/.test(e),zi=e=>Object.prototype.toString.call(e)==="[object Object]",Fi=e=>e[e.length-1]==="/"?e.slice(0,-1):e,oc=e=>e[0]==="/"?e.slice(1):e,e1=(e,t)=>{const n=Object.keys(e).sort((o,r)=>{const i=r.split("/").length-o.split("/").length;return i!==0?i:r.length-o.length});for(const o of n)if(t.startsWith(o))return o;return"/"};const rc={"v-3f9d0d55":b(()=>d(()=>import("./DailyRoutine.html-62dde776.js"),["assets/DailyRoutine.html-62dde776.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3d0aa58a":b(()=>d(()=>import("./Fitness.html-57eb298a.js"),["assets/Fitness.html-57eb298a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8daa1a0e":b(()=>d(()=>import("./index.html-8ede1624.js"),["assets/index.html-8ede1624.js","assets/流程2-453dc6f5.js","assets/libaxuan-github-io-a3ff3974.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-35f5db9e":b(()=>d(()=>import("./blog.html-b3d2ff71.js"),["assets/blog.html-b3d2ff71.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-184f4da6":b(()=>d(()=>import("./intro.html-3c27e36b.js"),["assets/intro.html-3c27e36b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0d25d1e4":b(()=>d(()=>import("./AIEnjoy.html-a5e95395.js"),["assets/AIEnjoy.html-a5e95395.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7b101d14":b(()=>d(()=>import("./ChatGPT.html-82b4fd15.js"),["assets/ChatGPT.html-82b4fd15.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2c379a13":b(()=>d(()=>import("./Midjourney.html-a39501e5.js"),["assets/Midjourney.html-a39501e5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-26a023fe":b(()=>d(()=>import("./2017-04-18-wechat_multi_open.html-729aed26.js"),["assets/2017-04-18-wechat_multi_open.html-729aed26.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6222deab":b(()=>d(()=>import("./2017-04-22-rss_feed43_feedex.html-990961d6.js"),["assets/2017-04-22-rss_feed43_feedex.html-990961d6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-009a3fd6":b(()=>d(()=>import("./2017-07-28-office_2016_installer_error.html-65070ba9.js"),["assets/2017-07-28-office_2016_installer_error.html-65070ba9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0d41d5d0":b(()=>d(()=>import("./2017-07-29-onenote_2016_cannot_be_logged_in.html-daa34026.js"),["assets/2017-07-29-onenote_2016_cannot_be_logged_in.html-daa34026.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c914fd10":b(()=>d(()=>import("./2017-09-02-forced_shutdown.html-3a1481e0.js"),["assets/2017-09-02-forced_shutdown.html-3a1481e0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4576f198":b(()=>d(()=>import("./2017-09-03-smb_lan_sharing.html-843523f8.js"),["assets/2017-09-03-smb_lan_sharing.html-843523f8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e6f7cb8e":b(()=>d(()=>import("./2017-10-18-light_cat_e8-c-epon_admin.html-70760835.js"),["assets/2017-10-18-light_cat_e8-c-epon_admin.html-70760835.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5da24c3c":b(()=>d(()=>import("./2017-10-18-light_cat_port_forwarding.html-a94fa066.js"),["assets/2017-10-18-light_cat_port_forwarding.html-a94fa066.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-28c3d540":b(()=>d(()=>import("./2018-01-19-forget_the_cdn.html-f63d4197.js"),["assets/2018-01-19-forget_the_cdn.html-f63d4197.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b3818c3c":b(()=>d(()=>import("./2018-01-31-hire_a_robot.html-5693ecc6.js"),["assets/2018-01-31-hire_a_robot.html-5693ecc6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-579c385c":b(()=>d(()=>import("./2018-04-30-baota_deploy_vps.html-ad71fe89.js"),["assets/2018-04-30-baota_deploy_vps.html-ad71fe89.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-06691c4f":b(()=>d(()=>import("./2018-05-01-jekyll_blog_on_github_pages.html-4d0c642b.js"),["assets/2018-05-01-jekyll_blog_on_github_pages.html-4d0c642b.js","assets/libaxuan-github-io-a3ff3974.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-24d2d83a":b(()=>d(()=>import("./2018-05-02-jekyll_blog_on_vps.html-77a2f885.js"),["assets/2018-05-02-jekyll_blog_on_vps.html-77a2f885.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-adf0c772":b(()=>d(()=>import("./2018-05-03-jekyll_blog_autodeploy.html-fe7f76ca.js"),["assets/2018-05-03-jekyll_blog_autodeploy.html-fe7f76ca.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-730defc4":b(()=>d(()=>import("./2018-05-04-audition_cut_mp3.html-2e73aabd.js"),["assets/2018-05-04-audition_cut_mp3.html-2e73aabd.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1f0840b1":b(()=>d(()=>import("./2018-05-15-aria2_a_new_download_tool.html-a1e3564b.js"),["assets/2018-05-15-aria2_a_new_download_tool.html-a1e3564b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5ae43900":b(()=>d(()=>import("./2018-05-24-airtable_noob.html-4630ee41.js"),["assets/2018-05-24-airtable_noob.html-4630ee41.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-a3025528":b(()=>d(()=>import("./2018-06-08-baizhuo_gp1700.html-bfb2c8f8.js"),["assets/2018-06-08-baizhuo_gp1700.html-bfb2c8f8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5ad6240c":b(()=>d(()=>import("./2018-06-10-koolproxy_https.html-e0e271b0.js"),["assets/2018-06-10-koolproxy_https.html-e0e271b0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-77515ff2":b(()=>d(()=>import("./2018-06-19-iptv_direckly.html-e7371f49.js"),["assets/2018-06-19-iptv_direckly.html-e7371f49.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-73041b3a":b(()=>d(()=>import("./2018-10-07-huginn_scraping_any_website.html-83a0d670.js"),["assets/2018-10-07-huginn_scraping_any_website.html-83a0d670.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1004794e":b(()=>d(()=>import("./2018-12-28-voice_input_try.html-cdadb97c.js"),["assets/2018-12-28-voice_input_try.html-cdadb97c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7463267c":b(()=>d(()=>import("./2019-03-31-openvpn_back_to_home.html-32e1d384.js"),["assets/2019-03-31-openvpn_back_to_home.html-32e1d384.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-302b03de":b(()=>d(()=>import("./2019-04-01-rsshub_noob.html-2d0e0a3e.js"),["assets/2019-04-01-rsshub_noob.html-2d0e0a3e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-346c34d4":b(()=>d(()=>import("./2019-08-26-scrcpy_screen_projection.html-12960a67.js"),["assets/2019-08-26-scrcpy_screen_projection.html-12960a67.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d8439540":b(()=>d(()=>import("./2020-03-25-rsshub_on_vps.html-34bfaac9.js"),["assets/2020-03-25-rsshub_on_vps.html-34bfaac9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-273cf11f":b(()=>d(()=>import("./2020-09-13-wifi_speed_up.html-e025d303.js"),["assets/2020-09-13-wifi_speed_up.html-e025d303.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-18a7959b":b(()=>d(()=>import("./2020-09-22-uefi_asus_board.html-a8de8dd5.js"),["assets/2020-09-22-uefi_asus_board.html-a8de8dd5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-491d5d68":b(()=>d(()=>import("./2020-11-27-rime_input.html-962a2c1f.js"),["assets/2020-11-27-rime_input.html-962a2c1f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0418b0dc":b(()=>d(()=>import("./2021-01-02-keepass_the_real_lastpassword.html-a32e6819.js"),["assets/2021-01-02-keepass_the_real_lastpassword.html-a32e6819.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-63fefb94":b(()=>d(()=>import("./2021-01-27-blog_jekyll_to_wordpress.html-836fb9a5.js"),["assets/2021-01-27-blog_jekyll_to_wordpress.html-836fb9a5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0a6bc026":b(()=>d(()=>import("./2021-05-31-principles_criticism_and_self-criticism.html-efcfbef6.js"),["assets/2021-05-31-principles_criticism_and_self-criticism.html-efcfbef6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5a064ff2":b(()=>d(()=>import("./2021-10-23-nas_with_rsshub_and_huginn.html-19412ee5.js"),["assets/2021-10-23-nas_with_rsshub_and_huginn.html-19412ee5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-39faf312":b(()=>d(()=>import("./2022-01-23-wechat_lucky_money_cover.html-a23b271c.js"),["assets/2022-01-23-wechat_lucky_money_cover.html-a23b271c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-313c5888":b(()=>d(()=>import("./2022-02-19-microsoft_store_fixed.html-e75f83d9.js"),["assets/2022-02-19-microsoft_store_fixed.html-e75f83d9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-61d0df0c":b(()=>d(()=>import("./2022-03-17-rss_persistent_link_collection.html-c9140bfa.js"),["assets/2022-03-17-rss_persistent_link_collection.html-c9140bfa.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-df55a79e":b(()=>d(()=>import("./2022-03-21-winget_the_strongest_software_manager_for_windows.html-dad3668b.js"),["assets/2022-03-21-winget_the_strongest_software_manager_for_windows.html-dad3668b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-24bf700c":b(()=>d(()=>import("./2022-04-21-uivision_rpa.html-885ce6b0.js"),["assets/2022-04-21-uivision_rpa.html-885ce6b0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9029f640":b(()=>d(()=>import("./2022-06-07-blog_md_to_wordpress.html-03230112.js"),["assets/2022-06-07-blog_md_to_wordpress.html-03230112.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6eacd3db":b(()=>d(()=>import("./2022-08-22-learndata_blog_to_knowledge_management.html-f983111f.js"),["assets/2022-08-22-learndata_blog_to_knowledge_management.html-f983111f.js","assets/流程2-453dc6f5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-69739db8":b(()=>d(()=>import("./2022-11-03-ffmpeg_screen_recording.html-880b90b9.js"),["assets/2022-11-03-ffmpeg_screen_recording.html-880b90b9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-333dd8ee":b(()=>d(()=>import("./2023-01-26-whiteboard_gtd.html-e1f12218.js"),["assets/2023-01-26-whiteboard_gtd.html-e1f12218.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5e3d84de":b(()=>d(()=>import("./2023-09-05-virtual_positioning.html-207d330d.js"),["assets/2023-09-05-virtual_positioning.html-207d330d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-72653828":b(()=>d(()=>import("./2023-10-07-clone-voice.html-6e673596.js"),["assets/2023-10-07-clone-voice.html-6e673596.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e381b74e":b(()=>d(()=>import("./2023-10-29-switch-firmware-updates.html-d29af532.js"),["assets/2023-10-29-switch-firmware-updates.html-d29af532.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b90f383c":b(()=>d(()=>import("./2023-12-12-eu.org-free-domain.html-222ae98a.js"),["assets/2023-12-12-eu.org-free-domain.html-222ae98a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-22230056":b(()=>d(()=>import("./2023-12-12-sd-op.html-61766708.js"),["assets/2023-12-12-sd-op.html-61766708.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-af1fbe54":b(()=>d(()=>import("./2023-12-13-awesome-selfhosted-cn.html-efdae3a2.js"),["assets/2023-12-13-awesome-selfhosted-cn.html-efdae3a2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-69693975":b(()=>d(()=>import("./AppNotes.html-874a05f8.js"),["assets/AppNotes.html-874a05f8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1735a0be":b(()=>d(()=>import("./Applist.html-c9f99c7e.js"),["assets/Applist.html-c9f99c7e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d967ed6c":b(()=>d(()=>import("./ChatGPT.html-021874d1.js"),["assets/ChatGPT.html-021874d1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5c29014a":b(()=>d(()=>import("./Chrome.html-288bbb3e.js"),["assets/Chrome.html-288bbb3e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1d7dd2b7":b(()=>d(()=>import("./design.html-fe567add.js"),["assets/design.html-fe567add.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-abe04fa2":b(()=>d(()=>import("./AutoHotkey.html-0343f6df.js"),["assets/AutoHotkey.html-0343f6df.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-fae223a4":b(()=>d(()=>import("./Electron.html-9b2e40a7.js"),["assets/Electron.html-9b2e40a7.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-67fe64b6":b(()=>d(()=>import("./HTML.html-6f6ca2c3.js"),["assets/HTML.html-6f6ca2c3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-72cba7c3":b(()=>d(()=>import("./Javascript.html-083193fe.js"),["assets/Javascript.html-083193fe.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0195f17e":b(()=>d(()=>import("./Markdown.html-78a125af.js"),["assets/Markdown.html-78a125af.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2caa5134":b(()=>d(()=>import("./Python.html-d265d3c8.js"),["assets/Python.html-d265d3c8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-146a1089":b(()=>d(()=>import("./index.html-89663067.js"),["assets/index.html-89663067.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-49ecfa5b":b(()=>d(()=>import("./Regex.html-dca6a805.js"),["assets/Regex.html-dca6a805.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6bea56bc":b(()=>d(()=>import("./Vue.html-681d8ea0.js"),["assets/Vue.html-681d8ea0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-88193f16":b(()=>d(()=>import("./CloudServices.html-683b0f56.js"),["assets/CloudServices.html-683b0f56.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1c7fca9e":b(()=>d(()=>import("./Cloudflare.html-d69290c2.js"),["assets/Cloudflare.html-d69290c2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2b70157f":b(()=>d(()=>import("./DNS.html-0563ab8c.js"),["assets/DNS.html-0563ab8c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-bc154f32":b(()=>d(()=>import("./GitHub.html-7c7fde68.js"),["assets/GitHub.html-7c7fde68.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d4ab9bf4":b(()=>d(()=>import("./MySQL.html-4beb2d1b.js"),["assets/MySQL.html-4beb2d1b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7c5f209c":b(()=>d(()=>import("./Static.html-6bd95734.js"),["assets/Static.html-6bd95734.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-39dc98a2":b(()=>d(()=>import("./VPS.html-575ede2a.js"),["assets/VPS.html-575ede2a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c582fe3e":b(()=>d(()=>import("./Coupon.html-69ecd602.js"),["assets/Coupon.html-69ecd602.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-373dc153":b(()=>d(()=>import("./Diet.html-2e8d6d1d.js"),["assets/Diet.html-2e8d6d1d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9ff4249e":b(()=>d(()=>import("./HomeAutomation.html-bc102435.js"),["assets/HomeAutomation.html-bc102435.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-16a2796a":b(()=>d(()=>import("./Life.html-6a8bceed.js"),["assets/Life.html-6a8bceed.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-850f3410":b(()=>d(()=>import("./Maintenance.html-4f653250.js"),["assets/Maintenance.html-4f653250.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-182a363a":b(()=>d(()=>import("./Medical.html-80e9c0dd.js"),["assets/Medical.html-80e9c0dd.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c51c66fe":b(()=>d(()=>import("./Shoppinglist.html-5c37e16c.js"),["assets/Shoppinglist.html-5c37e16c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-101edae1":b(()=>d(()=>import("./Docker.html-9c97c65b.js"),["assets/Docker.html-9c97c65b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-73fe61b2":b(()=>d(()=>import("./Huginn.html-c6571976.js"),["assets/Huginn.html-c6571976.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1b2d4c91":b(()=>d(()=>import("./NAS.html-52854c9a.js"),["assets/NAS.html-52854c9a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-54e731c2":b(()=>d(()=>import("./TTRSS.html-28872b64.js"),["assets/TTRSS.html-28872b64.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-00f6d5f1":b(()=>d(()=>import("./Comments.html-ef2b13e7.js"),["assets/Comments.html-ef2b13e7.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3b0b9f28":b(()=>d(()=>import("./VuePress.html-c5c945b3.js"),["assets/VuePress.html-c5c945b3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3cdca328":b(()=>d(()=>import("./docsify.html-9adf0d21.js"),["assets/docsify.html-9adf0d21.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6451f4a2":b(()=>d(()=>import("./NewSystem.html-ea9c350c.js"),["assets/NewSystem.html-ea9c350c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-395a6953":b(()=>d(()=>import("./QTTabBar.html-edc49d7a.js"),["assets/QTTabBar.html-edc49d7a.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-a8b7dd1a":b(()=>d(()=>import("./cd.html-cf8f7772.js"),["assets/cd.html-cf8f7772.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5e2612f0":b(()=>d(()=>import("./faq.html-ca8a0b34.js"),["assets/faq.html-ca8a0b34.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-df9d5022":b(()=>d(()=>import("./mac.html-6e3583fd.js"),["assets/mac.html-6e3583fd.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-12e41b33":b(()=>d(()=>import("./index.html-e979c0d2.js"),["assets/index.html-e979c0d2.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-bdd9cae6":b(()=>d(()=>import("./0_live_equipments.html-4208e56f.js"),["assets/0_live_equipments.html-4208e56f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-63cd7175":b(()=>d(()=>import("./1_obs_basic.html-4df50bf0.js"),["assets/1_obs_basic.html-4df50bf0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1ace0584":b(()=>d(()=>import("./2_obs_streamfx.html-39fea147.js"),["assets/2_obs_streamfx.html-39fea147.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-78ae0f01":b(()=>d(()=>import("./3_obs_plugins.html-aa0d2bbd.js"),["assets/3_obs_plugins.html-aa0d2bbd.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-21f30b82":b(()=>d(()=>import("./4_live_effects.html-27b4b5d9.js"),["assets/4_live_effects.html-27b4b5d9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0094e0b6":b(()=>d(()=>import("./5_live_platforms.html-e94c4979.js"),["assets/5_live_platforms.html-e94c4979.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-a580c466":b(()=>d(()=>import("./6_live_positioning.html-9171c152.js"),["assets/6_live_positioning.html-9171c152.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c7c23db2":b(()=>d(()=>import("./index.html-958e51a3.js"),["assets/index.html-958e51a3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d551fba2":b(()=>d(()=>import("./birthing.html-2912af7e.js"),["assets/birthing.html-2912af7e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-db6f9792":b(()=>d(()=>import("./newborn.html-1a6ae915.js"),["assets/newborn.html-1a6ae915.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-146fc10b":b(()=>d(()=>import("./index.html-ca2e93f0.js"),["assets/index.html-ca2e93f0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-54bae169":b(()=>d(()=>import("./cors-anywhere.html-38d0bf70.js"),["assets/cors-anywhere.html-38d0bf70.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2117748f":b(()=>d(()=>import("./emby.html-510aacaf.js"),["assets/emby.html-510aacaf.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-072b240a":b(()=>d(()=>import("./grocy.html-fa6871cf.js"),["assets/grocy.html-fa6871cf.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4b94fd6a":b(()=>d(()=>import("./memos.html-773ee119.js"),["assets/memos.html-773ee119.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-7b224f9d":b(()=>d(()=>import("./mt-photos.html-b81d96ca.js"),["assets/mt-photos.html-b81d96ca.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2b3f3b71":b(()=>d(()=>import("./navidrome.html-5966ed82.js"),["assets/navidrome.html-5966ed82.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-79e8b601":b(()=>d(()=>import("./qinglong.html-9d200df1.js"),["assets/qinglong.html-9d200df1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-774ba40b":b(()=>d(()=>import("./reader.html-20016b4c.js"),["assets/reader.html-20016b4c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-06c25741":b(()=>d(()=>import("./reverse-proxy.html-8496c63c.js"),["assets/reverse-proxy.html-8496c63c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-a0e1132e":b(()=>d(()=>import("./stirling-pdf.html-a813ecba.js"),["assets/stirling-pdf.html-a813ecba.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-78e70751":b(()=>d(()=>import("./syncthing.html-51185d0e.js"),["assets/syncthing.html-51185d0e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-31e5d674":b(()=>d(()=>import("./tachidesk.html-e7f059a8.js"),["assets/tachidesk.html-e7f059a8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-08917e81":b(()=>d(()=>import("./uptime-kuma.html-2ecb69d8.js"),["assets/uptime-kuma.html-2ecb69d8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3706649a":b(()=>d(()=>import("./404.html-a6fbe89c.js"),["assets/404.html-a6fbe89c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2d0a776e":b(()=>d(()=>import("./index.html-5fe91ac9.js"),["assets/index.html-5fe91ac9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e1e3da16":b(()=>d(()=>import("./index.html-81afb063.js"),["assets/index.html-81afb063.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-144e84a4":b(()=>d(()=>import("./index.html-347455fc.js"),["assets/index.html-347455fc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-72a9c1e2":b(()=>d(()=>import("./index.html-87ae6239.js"),["assets/index.html-87ae6239.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-29788432":b(()=>d(()=>import("./index.html-59735c57.js"),["assets/index.html-59735c57.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1a3d5e90":b(()=>d(()=>import("./index.html-283e30c8.js"),["assets/index.html-283e30c8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-744e6dd4":b(()=>d(()=>import("./index.html-436cceda.js"),["assets/index.html-436cceda.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d7a4cff6":b(()=>d(()=>import("./index.html-c9927eb9.js"),["assets/index.html-c9927eb9.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4766039d":b(()=>d(()=>import("./index.html-f1d9575b.js"),["assets/index.html-f1d9575b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5bc93818":b(()=>d(()=>import("./index.html-052028e0.js"),["assets/index.html-052028e0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-744d024e":b(()=>d(()=>import("./index.html-bc8be382.js"),["assets/index.html-bc8be382.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e52c881c":b(()=>d(()=>import("./index.html-6dabc888.js"),["assets/index.html-6dabc888.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-154dc4c4":b(()=>d(()=>import("./index.html-5203d277.js"),["assets/index.html-5203d277.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-01560935":b(()=>d(()=>import("./index.html-c23feeff.js"),["assets/index.html-c23feeff.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-14145d44":b(()=>d(()=>import("./index.html-c55b7d8b.js"),["assets/index.html-c55b7d8b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-72680697":b(()=>d(()=>import("./index.html-9021d972.js"),["assets/index.html-9021d972.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8f1d462c":b(()=>d(()=>import("./index.html-4a9de007.js"),["assets/index.html-4a9de007.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b306892a":b(()=>d(()=>import("./index.html-22ee971b.js"),["assets/index.html-22ee971b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-eea9fcce":b(()=>d(()=>import("./index.html-9927ea81.js"),["assets/index.html-9927ea81.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8c49fdb8":b(()=>d(()=>import("./index.html-e49c1afb.js"),["assets/index.html-e49c1afb.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5ff6b5a3":b(()=>d(()=>import("./index.html-78420230.js"),["assets/index.html-78420230.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8c487d20":b(()=>d(()=>import("./index.html-913a6453.js"),["assets/index.html-913a6453.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5f7f7ebf":b(()=>d(()=>import("./index.html-c4ded163.js"),["assets/index.html-c4ded163.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d08dfa36":b(()=>d(()=>import("./index.html-2bd53a0b.js"),["assets/index.html-2bd53a0b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8de1a174":b(()=>d(()=>import("./index.html-bcdea27c.js"),["assets/index.html-bcdea27c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-05308425":b(()=>d(()=>import("./index.html-4aa1ef4f.js"),["assets/index.html-4aa1ef4f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-150ab774":b(()=>d(()=>import("./index.html-132009ae.js"),["assets/index.html-132009ae.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-21d2d53f":b(()=>d(()=>import("./index.html-6311e86e.js"),["assets/index.html-6311e86e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b305d196":b(()=>d(()=>import("./index.html-e3f050f8.js"),["assets/index.html-e3f050f8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8f2a3ea6":b(()=>d(()=>import("./index.html-51139016.js"),["assets/index.html-51139016.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b3149e20":b(()=>d(()=>import("./index.html-ce11d60c.js"),["assets/index.html-ce11d60c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-92b89202":b(()=>d(()=>import("./index.html-859d0627.js"),["assets/index.html-859d0627.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3f145752":b(()=>d(()=>import("./index.html-72c565d0.js"),["assets/index.html-72c565d0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6d02fe66":b(()=>d(()=>import("./index.html-bc8b0464.js"),["assets/index.html-bc8b0464.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e45a3fd0":b(()=>d(()=>import("./index.html-8ad899ca.js"),["assets/index.html-8ad899ca.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-132a6ac4":b(()=>d(()=>import("./index.html-beb8acf1.js"),["assets/index.html-beb8acf1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-e22b51b2":b(()=>d(()=>import("./index.html-9458929e.js"),["assets/index.html-9458929e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6106c001":b(()=>d(()=>import("./index.html-c1bec5b1.js"),["assets/index.html-c1bec5b1.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-1f1d54f4":b(()=>d(()=>import("./index.html-f86e5d56.js"),["assets/index.html-f86e5d56.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-026ab35e":b(()=>d(()=>import("./index.html-2a74f836.js"),["assets/index.html-2a74f836.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-45b16e58":b(()=>d(()=>import("./index.html-04d1fa93.js"),["assets/index.html-04d1fa93.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-aae951e6":b(()=>d(()=>import("./index.html-f9960188.js"),["assets/index.html-f9960188.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-36dccd5d":b(()=>d(()=>import("./index.html-23890b68.js"),["assets/index.html-23890b68.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-02d57e1c":b(()=>d(()=>import("./index.html-051db68b.js"),["assets/index.html-051db68b.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-36474c60":b(()=>d(()=>import("./index.html-ffe336bc.js"),["assets/index.html-ffe336bc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-289a8dd8":b(()=>d(()=>import("./index.html-9a28a0b5.js"),["assets/index.html-9a28a0b5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0cbf5886":b(()=>d(()=>import("./index.html-d4f176e0.js"),["assets/index.html-d4f176e0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6f001b53":b(()=>d(()=>import("./index.html-35f7a614.js"),["assets/index.html-35f7a614.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-179b645c":b(()=>d(()=>import("./index.html-08078804.js"),["assets/index.html-08078804.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4d51b51e":b(()=>d(()=>import("./index.html-a554354e.js"),["assets/index.html-a554354e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-66d9f917":b(()=>d(()=>import("./index.html-21a82569.js"),["assets/index.html-21a82569.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-d82d3ed4":b(()=>d(()=>import("./index.html-90f4fbf8.js"),["assets/index.html-90f4fbf8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-295c722c":b(()=>d(()=>import("./index.html-7f734733.js"),["assets/index.html-7f734733.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9a6de7e0":b(()=>d(()=>import("./index.html-57863b7f.js"),["assets/index.html-57863b7f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-70a94678":b(()=>d(()=>import("./index.html-1b7934d4.js"),["assets/index.html-1b7934d4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-79bd8a59":b(()=>d(()=>import("./index.html-a2c9d27e.js"),["assets/index.html-a2c9d27e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-ecace9be":b(()=>d(()=>import("./index.html-0a4dfae5.js"),["assets/index.html-0a4dfae5.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2e8a96b8":b(()=>d(()=>import("./index.html-4f491c01.js"),["assets/index.html-4f491c01.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c58e8f3e":b(()=>d(()=>import("./index.html-7e44122e.js"),["assets/index.html-7e44122e.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-8ba0d006":b(()=>d(()=>import("./index.html-595d3448.js"),["assets/index.html-595d3448.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b30ab346":b(()=>d(()=>import("./index.html-ea0eea14.js"),["assets/index.html-ea0eea14.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-a76657ce":b(()=>d(()=>import("./index.html-72921f03.js"),["assets/index.html-72921f03.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0f92890a":b(()=>d(()=>import("./index.html-1c41e9aa.js"),["assets/index.html-1c41e9aa.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-44794367":b(()=>d(()=>import("./index.html-ed938450.js"),["assets/index.html-ed938450.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-207bdcdd":b(()=>d(()=>import("./index.html-628d43ae.js"),["assets/index.html-628d43ae.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-9075524a":b(()=>d(()=>import("./index.html-b90aeddc.js"),["assets/index.html-b90aeddc.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-c9e9368a":b(()=>d(()=>import("./index.html-0b95bd64.js"),["assets/index.html-0b95bd64.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b306a40c":b(()=>d(()=>import("./index.html-03586e65.js"),["assets/index.html-03586e65.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2836033f":b(()=>d(()=>import("./index.html-3ae7af02.js"),["assets/index.html-3ae7af02.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-ed16b278":b(()=>d(()=>import("./index.html-5b748567.js"),["assets/index.html-5b748567.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-6b6b05fc":b(()=>d(()=>import("./index.html-f388c4e8.js"),["assets/index.html-f388c4e8.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-f091ce2a":b(()=>d(()=>import("./index.html-14ae6cb3.js"),["assets/index.html-14ae6cb3.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b3108574":b(()=>d(()=>import("./index.html-7488d2ab.js"),["assets/index.html-7488d2ab.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-91d85d3a":b(()=>d(()=>import("./index.html-1a598cee.js"),["assets/index.html-1a598cee.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-0da0abf9":b(()=>d(()=>import("./index.html-b3be897c.js"),["assets/index.html-b3be897c.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-294e906f":b(()=>d(()=>import("./index.html-4d636ba4.js"),["assets/index.html-4d636ba4.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-311b2668":b(()=>d(()=>import("./index.html-4ad37f90.js"),["assets/index.html-4ad37f90.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-33129548":b(()=>d(()=>import("./index.html-74a0843d.js"),["assets/index.html-74a0843d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2870f5b5":b(()=>d(()=>import("./index.html-d9874309.js"),["assets/index.html-d9874309.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-4b93f328":b(()=>d(()=>import("./index.html-37874129.js"),["assets/index.html-37874129.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-2d605e49":b(()=>d(()=>import("./index.html-91f0b406.js"),["assets/index.html-91f0b406.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-5b9877a1":b(()=>d(()=>import("./index.html-9790d7a6.js"),["assets/index.html-9790d7a6.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-df045e5a":b(()=>d(()=>import("./index.html-f6106381.js"),["assets/index.html-f6106381.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-05db77bd":b(()=>d(()=>import("./index.html-8998e41f.js"),["assets/index.html-8998e41f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-3514c09e":b(()=>d(()=>import("./index.html-e7b7c80d.js"),["assets/index.html-e7b7c80d.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-fa46c5c6":b(()=>d(()=>import("./index.html-9726b9f0.js"),["assets/index.html-9726b9f0.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-293a5861":b(()=>d(()=>import("./index.html-ba502d4f.js"),["assets/index.html-ba502d4f.js","assets/plugin-vue_export-helper-c27b6911.js"])),"v-b309c306":b(()=>d(()=>import("./index.html-7e72694f.js"),["assets/index.html-7e72694f.js","assets/plugin-vue_export-helper-c27b6911.js"]))};var t1=Symbol(""),ic=Symbol(""),n1=Dt({key:"",path:"",title:"",lang:"",frontmatter:{},headers:[]}),ce=()=>{const e=de(ic);if(!e)throw new Error("pageData() is called without provider.");return e},ac=Symbol(""),we=()=>{const e=de(ac);if(!e)throw new Error("usePageFrontmatter() is called without provider.");return e},lc=Symbol(""),o1=()=>{const e=de(lc);if(!e)throw new Error("usePageHead() is called without provider.");return e},r1=Symbol(""),sc=Symbol(""),vr=()=>{const e=de(sc);if(!e)throw new Error("usePageLang() is called without provider.");return e},cc=Symbol(""),i1=()=>{const e=de(cc);if(!e)throw new Error("usePageLayout() is called without provider.");return e},a1=K(Gd),Hi=Symbol(""),At=()=>{const e=de(Hi);if(!e)throw new Error("useRouteLocale() is called without provider.");return e},wn=K(Kd),uc=()=>wn,pc=Symbol(""),Un=()=>{const e=de(pc);if(!e)throw new Error("useSiteLocaleData() is called without provider.");return e},l1=Symbol(""),s1="Layout",c1="NotFound",Pt=bo({resolveLayouts:e=>e.reduce((t,n)=>({...t,...n.layouts}),{}),resolvePageData:async e=>{const t=a1.value[e];return await(t==null?void 0:t())??n1},resolvePageFrontmatter:e=>e.frontmatter,resolvePageHead:(e,t,n)=>{const o=ie(t.description)?t.description:n.description,r=[...G(t.head)?t.head:[],...n.head,["title",{},e],["meta",{name:"description",content:o}]];return Yd(r)},resolvePageHeadTitle:(e,t)=>[e.title,t.title].filter(n=>!!n).join(" | "),resolvePageLang:(e,t)=>e.lang||t.lang||"en-US",resolvePageLayout:(e,t)=>{let n;if(e.path){const o=e.frontmatter.layout;ie(o)?n=o:n=s1}else n=c1;return t[n]},resolveRouteLocale:(e,t)=>e1(e,t),resolveSiteLocaleData:(e,t)=>({...e,...e.locales[t]})}),hr=B({name:"ClientOnly",setup(e,t){const n=K(!1);return ge(()=>{n.value=!0}),()=>{var o,r;return n.value?(r=(o=t.slots).default)==null?void 0:r.call(o):null}}}),dc=B({name:"Content",props:{pageKey:{type:String,required:!1,default:""}},setup(e){const t=ce(),n=T(()=>rc[e.pageKey||t.value.key]);return()=>n.value?l(n.value):l("div","404 Not Found")}}),Qe=(e={})=>e,Ie=e=>Jt(e)?e:`/${oc(e)}`;const u1={};/*!
           * vue-router v4.2.5
           * (c) 2023 Eduardo San Martin Morote
           * @license MIT
        @@ -6,7 +6,17 @@ const p0="modulepreload",d0=function(e){return"/"+e},wa={},d=function(t,n,o){if(
           `)},rootComponents:[()=>l(hf,{})]});function gf(e,t,n){var o,r,i;t===void 0&&(t=50),n===void 0&&(n={});var a=(o=n.isImmediate)!=null&&o,s=(r=n.callback)!=null&&r,c=n.maxWait,u=Date.now(),p=[];function f(){if(c!==void 0){var h=Date.now()-u;if(h+t>=c)return c-h}return t}var v=function(){var h=[].slice.call(arguments),_=this;return new Promise(function(y,P){var E=a&&i===void 0;if(i!==void 0&&clearTimeout(i),i=setTimeout(function(){if(i=void 0,u=Date.now(),!a){var A=e.apply(_,h);s&&s(A),p.forEach(function(I){return(0,I.resolve)(A)}),p=[]}},f()),E){var k=e.apply(_,h);return s&&s(k),y(k)}p.push({resolve:y,reject:P})})};return v.cancel=function(h){i!==void 0&&clearTimeout(i),p.forEach(function(_){return(0,_.reject)(h)}),p=[]},v}const _f=({headerLinkSelector:e,headerAnchorSelector:t,delay:n,offset:o=5})=>{const r=Fe(),a=gf(()=>{var y,P;const s=Math.max(window.scrollY,document.documentElement.scrollTop,document.body.scrollTop);if(Math.abs(s-0)v.some(k=>k.hash===E.hash));for(let E=0;E<_.length;E++){const k=_[E],A=_[E+1],I=s>=(((y=k.parentElement)==null?void 0:y.offsetTop)??0)-o,V=!A||s<(((P=A.parentElement)==null?void 0:P.offsetTop)??0)-o;if(!(I&&V))continue;const $=decodeURIComponent(r.currentRoute.value.hash),R=decodeURIComponent(k.hash);if($===R)return;if(f){for(let H=E+1;H<_.length;H++)if($===decodeURIComponent(_[H].hash))return}Ml(r,R);return}},n);ge(()=>{window.addEventListener("scroll",a)}),Ci(()=>{window.removeEventListener("scroll",a)})},Ml=async(e,t)=>{const{scrollBehavior:n}=e.options;e.options.scrollBehavior=void 0,await e.replace({query:e.currentRoute.value.query,hash:t}).finally(()=>e.options.scrollBehavior=n)},bf=".vp-sidebar-link, .toc-link",yf=".header-anchor",Ef=200,wf=5,Af=Qe({setup(){_f({headerLinkSelector:bf,headerAnchorSelector:yf,delay:Ef,offset:wf})}});let Kc=()=>null;const qc=Symbol(""),Tf=e=>{Kc=e},If=()=>de(qc),Pf=e=>{e.provide(qc,Kc)};var Of=B({name:"AutoCatalog",props:{base:{type:String,default:""},level:{type:Number,default:3},index:Boolean,hideHeading:Boolean},setup(e){const t=If(),n=Vt({"/":{title:"目录",empty:"暂无目录"}}),o=ce(),r=Fe(),i=uc(),a=f=>f?l(t,{icon:f}):null,s=({title:f,path:v,icon:h,class:_})=>l(Ve,{class:_,to:v},()=>[a(h),f||v]),c=f=>{const v=f.I;return typeof v>"u"||v},u=()=>{const f=e.base||o.value.path.replace(/\/[^/]+$/,"/"),v=r.getRoutes(),h=[];return v.filter(({meta:_,path:y})=>{if(!pn(y,f)||y===f)return!1;if(f==="/"){const P=wt(i.value.locales).filter(E=>E!=="/");if(y==="/404.html"||P.some(E=>pn(y,E)))return!1}return(yn(y,".html")&&!yn(y,"/index.html")||yn(y,"/"))&&c(_)}).map(({path:_,meta:y})=>{const P=_.substring(f.length).split("/").length;return{title:y.t||"",icon:y.i||null,base:_.replace(/\/[^/]+\/?$/,"/"),order:y.O||null,level:yn(_,"/")?P-1:P,path:_}}).filter(({title:_,level:y})=>_&&y<=e.level).sort(({title:_,level:y,path:P,order:E},{title:k,level:A,path:I,order:V})=>y-A||(yn(P,"/index.html")?-1:yn(I,"/index.html")?1:E===null?V===null?_.localeCompare(k):V:V===null?E:E>0?V>0?E-V:-1:V<0?E-V:1)).forEach(_=>{var E;const{base:y,level:P}=_;switch(P){case 1:h.push(_);break;case 2:{const k=h.find(A=>A.path===y);k&&(k.children??(k.children=[])).push(_);break}default:{const k=h.find(A=>A.path===y.replace(/\/[^/]+\/$/,"/"));if(k){const A=(E=k.children)==null?void 0:E.find(I=>I.path===y);A&&(A.children??(A.children=[])).push(_)}}}}),h},p=T(()=>u());return()=>{const f=p.value.some(h=>h.children),v=p.value.map(({children:h=[],icon:_,path:y,title:P})=>{const E=s({title:P,path:y,icon:_,class:"vp-catalog-title"});return f?[l("h3",{id:P,class:["vp-catalog-child-title",{"has-children":h.length}]},[l("a",{href:`#${P}`,class:"header-anchor","aria-hidden":!0},"#"),E]),h.length?l(e.index?"ol":"ul",{class:"vp-child-catalogs"},h.map(({children:k=[],icon:A,path:I,title:V})=>l("li",{class:"vp-child-catalog"},[l("div",{class:["vp-catalog-sub-title",{"has-children":k.length}]},[l("a",{href:`#${V}`,class:"header-anchor"},"#"),l(s,{title:V,path:I,icon:A,class:"vp-catalog-title"})]),k.length?l(e.index?"ol":"div",{class:e.index?"vp-sub-catalogs":"vp-sub-catalogs-wrapper"},k.map(({icon:x,path:$,title:R})=>{const H=l(s,{title:R,path:$,icon:x,class:""});return e.index?l("li",{class:"vp-sub-catalog"},H):l(s,{title:R,path:$,icon:x,class:"vp-sub-catalog-link"})})):null]))):null]:l("div",{class:"vp-catalog-child-title"},E)});return l("div",{class:["vp-catalog-wrapper",{index:e.index}]},[e.hideHeading?null:l("h2",{class:"vp-catalog-main-title"},n.value.title),p.value.length?e.index?l("ol",{class:"vp-catalogs"},v.map(h=>l("li",{class:"vp-catalog"},h))):v:l("p",{class:"vp-empty-catalog"},n.value.empty)])}}}),kf=Qe({enhance:({app:e})=>{Pf(e),Ye("AutoCatalog",e)||e.component("AutoCatalog",Of)}});const Lf=l("svg",{class:"external-link-icon",xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",x:"0px",y:"0px",viewBox:"0 0 100 100",width:"15",height:"15"},[l("path",{fill:"currentColor",d:"M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"}),l("polygon",{fill:"currentColor",points:"45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"})]),Yc=B({name:"ExternalLinkIcon",props:{locales:{type:Object,required:!1,default:()=>({})}},setup(e){const t=At(),n=T(()=>e.locales[t.value]??{openInNewWindow:"open in new window"});return()=>l("span",[Lf,l("span",{class:"external-link-icon-sr-only"},n.value.openInNewWindow)])}}),Rf={},Sf=Qe({enhance({app:e}){e.component("ExternalLinkIcon",l(Yc,{locales:Rf}))}});/**
          * NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress
          * @license MIT
        - */const fe={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
        '},status:null,set:e=>{const t=fe.isStarted();e=Br(e,fe.settings.minimum,1),fe.status=e===1?null:e;const n=fe.render(!t),o=n.querySelector(fe.settings.barSelector),r=fe.settings.speed,i=fe.settings.easing;return n.offsetWidth,xf(a=>{Wo(o,{transform:"translate3d("+Bl(e)+"%,0,0)",transition:"all "+r+"ms "+i}),e===1?(Wo(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout(function(){Wo(n,{transition:"all "+r+"ms linear",opacity:"0"}),setTimeout(function(){fe.remove(),a()},r)},r)):setTimeout(()=>a(),r)}),fe},isStarted:()=>typeof fe.status=="number",start:()=>{fe.status||fe.set(0);const e=()=>{setTimeout(()=>{fe.status&&(fe.trickle(),e())},fe.settings.trickleSpeed)};return fe.settings.trickle&&e(),fe},done:e=>!e&&!fe.status?fe:fe.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=fe.status;return t?(typeof e!="number"&&(e=(1-t)*Br(Math.random()*t,.1,.95)),t=Br(t+e,0,.994),fe.set(t)):fe.start()},trickle:()=>fe.inc(Math.random()*fe.settings.trickleRate),render:e=>{if(fe.isRendered())return document.getElementById("nprogress");$l(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=fe.settings.template;const n=t.querySelector(fe.settings.barSelector),o=e?"-100":Bl(fe.status||0),r=document.querySelector(fe.settings.parent);return Wo(n,{transition:"all 0 linear",transform:"translate3d("+o+"%,0,0)"}),r!==document.body&&$l(r,"nprogress-custom-parent"),r==null||r.appendChild(t),t},remove:()=>{Nl(document.documentElement,"nprogress-busy"),Nl(document.querySelector(fe.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&Df(e)},isRendered:()=>!!document.getElementById("nprogress")},Br=(e,t,n)=>en?n:e,Bl=e=>(-1+e)*100,xf=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),e.length===1&&t()}}(),Wo=function(){const e=["Webkit","O","Moz","ms"],t={};function n(a){return a.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(s,c){return c.toUpperCase()})}function o(a){const s=document.body.style;if(a in s)return a;let c=e.length;const u=a.charAt(0).toUpperCase()+a.slice(1);let p;for(;c--;)if(p=e[c]+u,p in s)return p;return a}function r(a){return a=n(a),t[a]??(t[a]=o(a))}function i(a,s,c){s=r(s),a.style[s]=c}return function(a,s){for(const c in s){const u=s[c];u!==void 0&&Object.prototype.hasOwnProperty.call(s,c)&&i(a,c,u)}}}(),Zc=(e,t)=>(typeof e=="string"?e:ea(e)).indexOf(" "+t+" ")>=0,$l=(e,t)=>{const n=ea(e),o=n+t;Zc(n,t)||(e.className=o.substring(1))},Nl=(e,t)=>{const n=ea(e);if(!Zc(e,t))return;const o=n.replace(" "+t+" "," ");e.className=o.substring(1,o.length-1)},ea=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),Df=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)};const Cf=()=>{ge(()=>{const e=Fe(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||fe.start()}),e.afterEach(n=>{t.add(n.path),fe.done()})})},Vf=Qe({setup(){Cf()}}),Mf=JSON.parse('{"encrypt":{},"author":{"name":"清顺","url":"https://gpt-vip.top"},"logo":"/logo.svg","breadcrumb":false,"contributors":false,"lastUpdated":true,"editLink":true,"darkmode":"switch","fullscreen":true,"repo":"libaxuan/LearnHubs","repoLabel":"GitHub","repoDisplay":true,"docsDir":"docs","navbarLayout":{"start":["Brand"],"center":["Links"],"end":["Repo","Outlook","Search"]},"pageInfo":["Category","Tag","Word","ReadingTime","PageView"],"blog":{"articleInfo":["Date","PageView","Category","Tag","ReadingTime"],"name":"清顺","avatar":"/avatar_self.webp","description":"迷信新工具,热衷于人工智能,定期分享探索成果","intro":"/intro.html","roundAvatar":true,"medias":{"GitHub":"https://github.com/libaxuan","Wechat":"https://iili.io/Hr4MJ5l.jpg","Email":"mailto:libaxuan@gmail.com","Discord":"https://discord.gg/TeUFcFJy","RSS":"https://gpt-vip.top/rss.xml"}},"locales":{"/":{"lang":"zh-CN","navbarLocales":{"langName":"简体中文","selectLangAriaLabel":"选择语言"},"metaLocales":{"author":"作者","date":"写作日期","origin":"原创","views":"访问量","category":"分类","tag":"标签","readingTime":"阅读时间","words":"字数","toc":"此页内容","prev":"上一页","next":"下一页","lastUpdated":"上次编辑于","contributors":"贡献者","editLink":"编辑此页","print":"打印"},"blogLocales":{"article":"文章","articleList":"文章列表","category":"分类","tag":"标签","timeline":"时间轴","timelineTitle":"昨日不在","all":"全部","intro":"个人介绍","star":"收藏"},"paginationLocales":{"prev":"上一页","next":"下一页","navigate":"跳转到","action":"前往","errorText":"请输入 1 到 $page 之前的页码!"},"outlookLocales":{"themeColor":"主题色","darkmode":"外观","fullscreen":"全屏"},"routeLocales":{"skipToContent":"跳至主要內容","notFoundTitle":"页面不存在","notFoundMsg":["这里什么也没有","我们是怎么来到这儿的?","这 是 四 零 四 !","看起来你访问了一个失效的链接"],"back":"返回上一页","home":"带我回家","openInNewWindow":"Open in new window"},"navbar":[{"text":"博客","icon":"blog","link":"/blog"},{"text":"应用","icon":"app","prefix":"/","children":["apps/Applist",{"text":"常用扩展","icon":"chrome","link":"apps/Chrome"},{"text":"服务/专题","icon":"any","prefix":"","children":[{"text":"直播手册","icon":"quote","link":"apps/livestreaming/1_obs_basic"},{"text":"NAS 应用","icon":"process","link":"services/dockers-on-nas/"}]}]},{"text":"人工智能","icon":"tool","prefix":"/ai/","children":["ChatGPT","Midjourney","AIEnjoy","TaoAI/"]},{"text":"工具","icon":"tool","children":[{"text":"FreeTimeAI","icon":"creative","link":"https://sensechat.vip/"},{"text":"ChatGPT SC","icon":"creative","link":"https://shortcutai.eu.org"},{"text":"Enjoy Home","icon":"pic","link":"https://autoaigpt.cn"},{"text":"免费图床","icon":"others","link":"https://autoschool.eu.org"},{"text":"万能工具","icon":"categoryselected","link":"https://itools.site"}]},{"text":"Contact","icon":"advance","children":[{"text":"微信","icon":"wechat","link":"https://iili.io/Hr4MJ5l.jpg"},{"text":"Email","icon":"alias","link":"mailto:libaxuann@gmail.com"},{"text":"Discord","icon":"group","link":"https://discord.gg/TeUFcFJy"},{"text":"RSS","icon":"rss","link":"https://gpt-vip.top/rss.xml"},{"text":"Dashboard","icon":"rss","link":"https://us.umami.is/share/mqhzWMSoh5PUNvnu/LearnHubs"}]}],"sidebar":{"":[{"text":"读书笔记","icon":"read","link":"https://gpt-vip.top/reading/"},{"text":"🧰 应用手册","icon":"","prefix":"/apps/","link":"","collapsible":true,"children":["Applist.md","AppNotes.md","design.md","ChatGPT.md","Chrome.md",{"text":"直播手册","icon":"load","prefix":"livestreaming/","link":"","collapsible":true,"children":"structure"}]},{"text":"🐋 Docker 服务","icon":"","prefix":"/services/","link":"","collapsible":true,"children":"structure"},{"text":"🪟 系统问题","icon":"","prefix":"/windows/","link":"","collapsible":true,"children":"structure"},{"text":"🔡 代码编程","icon":"","prefix":"","link":"","collapsible":true,"children":[{"text":"页面开发","icon":"","prefix":"/web/","collapsible":true,"children":"structure"},{"text":"网站部署","icon":"","prefix":"/deploy/","collapsible":true,"children":["Static.md","CloudServices.md","VPS.md",{"text":"部署工具","icon":"emmet","collapsible":true,"children":["GitHub.md","Cloudflare.md","MySQL.md","DNS.md"]}]},{"text":"代码学习","icon":"","prefix":"/code/","collapsible":true,"children":["README.md",{"text":"Basic","icon":"emmet","collapsible":true,"children":["Markdown.md","Electron.md","AutoHotkey.md","Regex.md"]},{"text":"FrondEnd","icon":"app","collapsible":true,"children":["Vue.md","HTML.md","JavaScript.md","Python.md"]}]}]},{"text":"博客文章","icon":"blog","prefix":"/_posts/","link":"/blog","collapsible":true,"children":"structure"}],"/services/dockers-on-nas/":"structure","/family/baby/":"structure"}}}}'),Bf=K(Mf),Xc=()=>Bf,Jc=Symbol(""),$f=()=>{const e=de(Jc);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},Nf=(e,t)=>{const{locales:n,...o}=e;return{...o,...n==null?void 0:n[t]}},zf=Qe({enhance({app:e}){const t=Xc(),n=e._context.provides[Hi],o=T(()=>Nf(t.value,n.value));e.provide(Jc,o),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return o.value}}})}}),Ff="2.15.8",Hf={"Content-Type":"application/json"},jf=({serverURL:e,lang:t,paths:n,signal:o})=>(({serverURL:r,lang:i,paths:a,type:s,signal:c})=>fetch(`${r}/article?path=${encodeURIComponent(a.join(","))}&type=${encodeURIComponent(s.join(","))}&lang=${i}`,{signal:c}).then(u=>u.json()))({serverURL:e,lang:t,paths:n,type:["time"],signal:o}).then(r=>Array.isArray(r)?r:[r]),Wf=e=>(({serverURL:t,lang:n,path:o,type:r,action:i})=>fetch(`${t}/article?lang=${n}`,{method:"POST",headers:Hf,body:JSON.stringify({path:o,type:r,action:i})}).then(a=>a.json()))({...e,type:"time",action:"inc"}),zl=e=>{const t=((n="")=>n.replace(/\/$/u,""))(e);return/^(https?:)?\/\//.test(t)?t:`https://${t}`},Uf=e=>{e.name!=="AbortError"&&console.error(e.message)},Fl=e=>e.dataset.path||e.getAttribute("id"),Hl=(e,t)=>{t.forEach((n,o)=>{n.innerText=e[o].toString()})},Qc=({serverURL:e,path:t=window.location.pathname,selector:n=".waline-pageview-count",update:o=!0,lang:r=navigator.language})=>{const i=new AbortController,a=Array.from(document.querySelectorAll(n)),s=u=>{const p=Fl(u);return p!==null&&t!==p},c=u=>jf({serverURL:zl(e),paths:u.map(p=>Fl(p)||t),lang:r,signal:i.signal}).then(p=>Hl(p,u)).catch(Uf);if(o){const u=a.filter(f=>!s(f)),p=a.filter(s);Wf({serverURL:zl(e),path:t,lang:r}).then(f=>Hl(new Array(u.length).fill(f),u)),p.length&&c(p)}else c(a);return i.abort.bind(i)},J3=Object.freeze(Object.defineProperty({__proto__:null,pageviewCount:Qc,version:Ff},Symbol.toStringTag,{value:"Module"}));const Gf={provider:"Waline",dark:'html[data-theme="dark"]',serverURL:"https://waline.gpt-vip.top",reaction:["https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f44d.png","https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f44f.png","https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f60e.png","https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f602.png","https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f635-200d-1f4ab.png"]};let Kf=Gf;const eu=Symbol(""),tu=()=>de(eu),qf=tu,Yf=e=>{e.provide(eu,Kf)},Zf={"/":{placeholder:"请留言。(填写邮箱可在被回复时收到邮件提醒)",reactionTitle:"已到达文章底部,欢迎留言、表情互动~",reaction0:"赞一个",reaction1:"支持下",reaction2:"有点酷",reaction3:"啥玩意",reaction4:"看不懂",admin:"盛年不重来,一日难再晨",level0:"锻体",level1:"炼气",level2:"筑基",level3:"金丹",level4:"元婴",level5:"化神"}};d(()=>import("./waline-meta-56fbc549.js"),[]);var Xf=B({name:"WalineComment",props:{identifier:{type:String,required:!0}},setup(e){const t=qf(),n=we(),o=vr(),r=Vt(Zf);let i;const a=!!t.serverURL,s=T(()=>{if(!a)return!1;const u=t.pageview!==!1,p=n.value.pageview;return!!p||u!==!1&&p!==!1}),c=T(()=>({lang:o.value==="zh-CN"?"zh-CN":"en",locale:r.value,dark:"html.dark",...t,path:e.identifier}));return ge(()=>{ae(()=>e.identifier,()=>{i==null||i(),s.value&&Xt().then(()=>{setTimeout(()=>{i=Qc({serverURL:t.serverURL,path:e.identifier})},t.delay||800)})},{immediate:!0})}),()=>a?l("div",{id:"comment",class:"waline-wrapper"},l(b({loader:async()=>(await d(()=>import("./component-caddc584.js"),[])).Waline,loadingComponent:_r}),c.value)):null}}),Jf=B({name:"CommentService",props:{darkmode:Boolean},setup(e){const t=tu(),n=ce(),o=we(),r=t.comment!==!1,i=T(()=>o.value.comment||r&&o.value.comment!==!1);return()=>l(Xf,{identifier:o.value.commentID||n.value.path,darkmode:e.darkmode,style:{display:i.value?"block":"none"}})}}),Qf=Qe({enhance:({app:e})=>{Yf(e),e.component("CommentService",Jf)}});const ev=800,tv=2e3,nv={"/":{copy:"复制代码",copied:"已复制",hint:"复制成功"}},ov=!1,rv=['.theme-hope-content div[class*="language-"] pre'],jl=!1,$r=new Map,iv=()=>{const{copy:e}=q2({legacy:!0}),t=Vt(nv),n=ce(),o=$c(),r=s=>{if(!s.hasAttribute("copy-code-registered")){const c=document.createElement("button");c.type="button",c.classList.add("copy-code-button"),c.innerHTML='
        ',c.setAttribute("aria-label",t.value.copy),c.setAttribute("data-copied",t.value.copied),s.parentElement&&s.parentElement.insertBefore(c,s),s.setAttribute("copy-code-registered","")}},i=()=>Xt().then(()=>new Promise(s=>{setTimeout(()=>{rv.forEach(c=>{document.querySelectorAll(c).forEach(r)}),s()},ev)})),a=(s,c,u)=>{let{innerText:p=""}=c;/language-(shellscript|shell|bash|sh|zsh)/.test(s.classList.toString())&&(p=p.replace(/^ *(\$|>) /gm,"")),e(p).then(()=>{u.classList.add("copied"),clearTimeout($r.get(u));const f=setTimeout(()=>{u.classList.remove("copied"),u.blur(),$r.delete(u)},tv);$r.set(u,f)})};ge(()=>{(!o.value||jl)&&i(),Re("click",s=>{const c=s.target;if(c.matches('div[class*="language-"] > button.copy')){const u=c.parentElement,p=c.nextElementSibling;p&&a(u,p,c)}else if(c.matches('div[class*="language-"] div.copy-icon')){const u=c.parentElement,p=u.parentElement,f=u.nextElementSibling;f&&a(p,f,u)}}),ae(()=>n.value.path,()=>{(!o.value||jl)&&i()})})};var av=Qe({setup:()=>{iv()}});const lv=Qe({enhance:({app:e})=>{},setup:()=>{}});let sv={};const nu=Symbol(""),cv=()=>de(nu),uv=e=>{e.provide(nu,sv)};const pv=".theme-hope-content :not(a) > img:not([no-view])",dv={"/":{closeTitle:"关闭",downloadTitle:"下载图片",fullscreenTitle:"切换全屏",zoomTitle:"缩放",arrowPrevTitle:"上一个 (左箭头)",arrowNextTitle:"下一个 (右箭头)"}},fv=800,vv='
        ',hv=e=>ie(e)?Array.from(document.querySelectorAll(e)):e.map(t=>Array.from(document.querySelectorAll(t))).flat(),ou=e=>new Promise((t,n)=>{e.complete?t({type:"image",element:e,src:e.src,width:e.naturalWidth,height:e.naturalHeight,alt:e.alt,msrc:e.src}):(e.onload=()=>t(ou(e)),e.onerror=o=>n(o))}),mv=()=>{const{isSupported:e,toggle:t}=Ji(),n=cv(),o=Vt(dv),r=ce();let i;const a=c=>{c.on("uiRegister",()=>{e&&c.ui.registerElement({name:"fullscreen",order:7,isButton:!0,html:'',onClick:()=>{t()}}),c.ui.registerElement({name:"download",order:8,isButton:!0,tagName:"a",html:{isCustomSVG:!0,inner:'',outlineID:"pswp__icn-download"},onInit:(u,p)=>{u.setAttribute("download",""),u.setAttribute("target","_blank"),u.setAttribute("rel","noopener"),p.on("change",()=>{u.setAttribute("href",p.currSlide.data.src)})}}),c.ui.registerElement({name:"bulletsIndicator",className:"photo-swipe-bullets-indicator",appendTo:"wrapper",onInit:(u,p)=>{const f=[];let v=-1;for(let h=0;h{p.goTo(f.indexOf(y.target))},f.push(_),u.appendChild(_)}p.on("change",()=>{v>=0&&f[v].classList.remove("active"),f[p.currIndex].classList.add("active"),v=p.currIndex})}})})},s=()=>Promise.all([d(()=>import("./photoswipe.esm-1464cdb9.js"),[]),Xt().then(()=>new Promise(c=>setTimeout(c,fv)).then(()=>hv(pv)))]).then(([{default:c},u])=>{const p=u.map(f=>({html:vv,element:f,msrc:f.src}));u.forEach((f,v)=>{const h=()=>{i=new c({preloaderDelay:0,showHideAnimationType:"zoom",...o.value,...n,dataSource:p,index:v,closeOnVerticalDrag:!0,wheelToZoom:!1}),a(i),i.addFilter("thumbEl",()=>f),i.addFilter("placeholderSrc",()=>f.src),i.init()};f.style.cursor="zoom-in",f.addEventListener("click",()=>{h()}),f.addEventListener("keypress",({key:_})=>{_==="Enter"&&h()})}),u.forEach((f,v)=>{ou(f).then(h=>{p.splice(v,1,h),i==null||i.refreshSlideContent(v)})})});ge(()=>{Re("wheel",()=>{i==null||i.close()}),ae(()=>r.value.path,s,{immediate:!0})})};var gv=Qe({enhance:({app:e})=>{uv(e)},setup:()=>{mv()}});const ru=()=>{const e=ce();return T(()=>e.value.readingTime??null)},ai=typeof{"/":{word:"约 $word 字",less1Minute:"小于 1 分钟",time:"大约 $time 分钟"}}>"u"?null:{"/":{word:"约 $word 字",less1Minute:"小于 1 分钟",time:"大约 $time 分钟"}},iu=(e,t)=>{const{minutes:n,words:o}=e,{less1Minute:r,word:i,time:a}=t;return{time:n<1?r:a.replace("$time",Math.round(n).toString()),words:i.replace("$word",o.toString())}},Wl={words:"",time:""},au=()=>ai?Vt(ai):T(()=>null),_v=()=>{if(typeof ai>"u")return T(()=>Wl);const e=ru(),t=au();return T(()=>e.value&&t.value?iu(e.value,t.value):Wl)},hn=()=>Xc(),ue=()=>$f(),Gn=()=>T(()=>!!hn().value.pure);var Nr=B({name:"EmptyComponent",setup:()=>()=>null});const bv="719px",yv="1440px",Ev="false",ta={mobileBreakPoint:bv,pcBreakPoint:yv,enableThemeColor:Ev},na={"/apps/livestreaming/":["0_live_equipments","1_obs_basic","2_obs_streamfx","3_obs_plugins","4_live_effects","5_live_platforms","6_live_positioning"],"/services/":["NAS","Docker","Huginn","TTRSS",{text:"NAS 应用集合",prefix:"dockers-on-nas/",collapsible:!0,icon:"process",children:["navidrome","emby","mt-photos","reader","memos","grocy","tachidesk","stirling-pdf","syncthing","uptime-kuma","qinglong","reverse-proxy","cors-anywhere"]}],"/windows/":["mac","faq","NewSystem","QTTabBar","cd"],"/web/":["VuePress","docsify","Comments"],"/_posts/":["/posts/2023-12-13-awesome-selfhosted-cn.html","/posts/2023-12-12-eu.org-free-domain.html","/posts/2023-12-12-sd-op.html","/posts/2023-10-07-clone-voice.html","/posts/2023-09-05-virtual_positioning.html","/posts/2023-01-26-whiteboard_gtd.html","/posts/2022-11-03-ffmpeg_screen_recording.html","/posts/2022-08-22-learndata_blog_to_knowledge_management.html","/posts/2022-06-07-blog_md_to_wordpress.html","/posts/2022-04-21-uivision_rpa.html","/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","/posts/2022-03-17-rss_persistent_link_collection.html","/posts/2022-02-19-microsoft_store_fixed.html","/posts/2022-01-23-wechat_lucky_money_cover.html","/posts/2021-10-23-nas_with_rsshub_and_huginn.html","/posts/2021-05-31-principles_criticism_and_self-criticism.html","/posts/2021-01-27-blog_jekyll_to_wordpress.html","/posts/2021-01-02-keepass_the_real_lastpassword.html","/posts/2020-11-27-rime_input.html","/posts/2020-09-22-uefi_asus_board.html","/posts/2020-09-13-wifi_speed_up.html","/posts/2020-03-25-rsshub_on_vps.html","/posts/2019-08-26-scrcpy_screen_projection.html","/posts/2019-04-01-rsshub_noob.html","/posts/2019-03-31-openvpn_back_to_home.html","/posts/2018-12-28-voice_input_try.html","/posts/2018-10-07-huginn_scraping_any_website.html","/posts/2018-06-19-iptv_direckly.html","/posts/2018-06-10-koolproxy_https.html","/posts/2018-06-08-baizhuo_gp1700.html","/posts/2018-05-24-airtable_noob.html","/posts/2018-05-15-aria2_a_new_download_tool.html","/posts/2018-05-04-audition_cut_mp3.html","/posts/2018-05-03-jekyll_blog_autodeploy.html","/posts/2018-05-02-jekyll_blog_on_vps.html","/posts/2018-05-01-jekyll_blog_on_github_pages.html","/posts/2018-04-30-baota_deploy_vps.html","/posts/2018-01-31-hire_a_robot.html","/posts/2018-01-19-forget_the_cdn.html","/posts/2017-10-18-light_cat_port_forwarding.html","/posts/2017-10-18-light_cat_e8-c-epon_admin.html","/posts/2017-09-03-smb_lan_sharing.html","/posts/2017-09-02-forced_shutdown.html","/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html","/posts/2017-07-28-office_2016_installer_error.html","/posts/2017-04-22-rss_feed43_feedex.html","/posts/2017-04-18-wechat_multi_open.html","/posts/2023-10-29-switch-firmware-updates.html"],"/services/dockers-on-nas/":["navidrome","emby","mt-photos","reader","memos","grocy","tachidesk","stirling-pdf","syncthing","uptime-kuma","qinglong","reverse-proxy","cors-anywhere"],"/family/baby/":["birthing","newborn"]},lu=e=>{const{icon:t="",color:n,size:o}=e,r={};return n&&(r.color=n),o&&(r.height=Number.isNaN(Number(o))?o:`${o}px`),Jt(t)?l("img",{class:"icon",src:t,"no-view":"",style:r}):yr(t)?l("img",{class:"icon",src:Ie(t),"no-view":"",style:r}):l(Je("FontIcon"),e)};lu.displayName="HopeIcon";var ze=lu,ye=(e=>(e.type="y",e.title="t",e.shortTitle="s",e.icon="i",e.author="a",e.date="d",e.localizedDate="l",e.category="c",e.tag="g",e.isEncrypted="n",e.isOriginal="o",e.readingTime="r",e.excerpt="e",e.sticky="u",e.cover="v",e.index="I",e.order="O",e))(ye||{}),su=(e=>(e.article="a",e.home="h",e.slide="s",e.page="p",e))(su||{});const On=(e,t,n=!1)=>{let o=$n(e,Oc(encodeURI(t)));o.name==="404"&&(o=$n(e,t));const{fullPath:r,meta:i,name:a}=o;return{text:!n&&i[ye.shortTitle]?i[ye.shortTitle]:i[ye.title]||t,link:a==="404"?t:r,...i[ye.icon]?{icon:i[ye.icon]}:{}}},To=()=>{const e=Fe(),t=gt();return n=>{if(n)if(yr(n))t.path!==n&&e.push(n);else if(Jt(n)||nc(n))window&&window.open(n);else{const o=t.path.slice(0,t.path.lastIndexOf("/"));e.push(`${o}/${encodeURI(n)}`)}}},cu=()=>{const e=ue(),t=we();return T(()=>{const{author:n}=t.value;return n?ho(n):n===!1?[]:ho(e.value.author,!1)})},wv=()=>{const e=we();return T(()=>Lc(e.value.category).map(t=>{var n,o;return{name:t,path:((o=(n=de(Symbol.for("categoryMap")))==null?void 0:n.value.map[t])==null?void 0:o.path)||""}}))},Av=()=>{const e=we();return T(()=>Rc(e.value.tag).map(t=>{var n,o;return{name:t,path:((o=(n=de(Symbol.for("tagMap")))==null?void 0:n.value.map[t])==null?void 0:o.path)||""}}))},Tv=()=>{const e=we(),t=ce();return T(()=>{const n=Ui(e.value.date);if(n)return n;const{createdTime:o}=t.value.git||{};return o?new Date(o):null})},Iv=()=>{const e=ue(),t=ce(),n=we(),o=cu(),r=wv(),i=Av(),a=Tv(),s=ru(),c=_v(),u=T(()=>({author:o.value,category:r.value,date:a.value,localizedDate:t.value.localizedDate,tag:i.value,isOriginal:n.value.isOriginal||!1,readingTime:s.value,readingTimeLocale:c.value,pageview:"pageview"in n.value?n.value.pageview:!0})),p=T(()=>"pageInfo"in n.value?n.value.pageInfo:"pageInfo"in e.value?e.value.pageInfo:null);return{info:u,items:p}},{mobileBreakPoint:Pv,pcBreakPoint:Ov}=ta,Ul=e=>e.endsWith("px")?Number(e.slice(0,-2)):null,Io=()=>{const e=K(!1),t=K(!1),n=()=>{e.value=window.innerWidth<=(Ul(Pv)??719),t.value=window.innerWidth>=(Ul(Ov)??1440)};return ge(()=>{n(),Re("resize",n,!1),Re("orientationchange",n,!1)}),{isMobile:e,isPC:t}},uu=Symbol(""),Po=()=>{const e=de(uu);if(!e)throw new Error("useDarkmode() is called without provider.");return e},kv=e=>{const t=hn(),n=ef(),o=Fc("vuepress-theme-hope-scheme","auto"),r=T(()=>t.value.darkmode||"switch"),i=T(()=>{const s=r.value;return s==="disable"?!1:s==="enable"?!0:s==="auto"?n.value:s==="toggle"?o.value==="dark":o.value==="dark"||o.value==="auto"&&n.value}),a=T(()=>{const s=r.value;return s==="switch"||s==="toggle"});e.provide(uu,{canToggle:a,config:r,isDarkmode:i,status:o}),Object.defineProperties(e.config.globalProperties,{$isDarkmode:{get:()=>i.value}})},Lv=()=>{const{isDarkmode:e}=Po(),t=(n=e.value)=>document.documentElement.setAttribute("data-theme",n?"dark":"light");ge(()=>{ae(e,t,{immediate:!0})})};var We=B({name:"AutoLink",inheritAttrs:!1,props:{config:{type:Object,required:!0},exact:Boolean,noExternalLinkIcon:Boolean},emits:["focusout"],slots:Object,setup(e,{attrs:t,emit:n,slots:o}){const r=gt(),i=uc(),a=Wn(e,"config"),s=T(()=>Jt(a.value.link)),c=T(()=>nc(a.value.link)||Qd(a.value.link)),u=T(()=>c.value?void 0:a.value.target||(s.value?"_blank":void 0)),p=T(()=>u.value==="_blank"),f=T(()=>!s.value&&!c.value&&!p.value),v=T(()=>c.value?void 0:a.value.rel||(p.value?"noopener noreferrer":void 0)),h=T(()=>a.value.ariaLabel||a.value.text),_=T(()=>{if(e.exact)return!1;const P=wt(i.value.locales);return P.length?P.every(E=>E!==a.value.link):a.value.link!=="/"}),y=T(()=>f.value?a.value.activeMatch?new RegExp(a.value.activeMatch).test(r.path):_.value?pn(r.path,a.value.link):r.path===a.value.link:!1);return()=>{const{before:P,after:E,default:k}=o,{text:A,icon:I,link:V}=a.value;return f.value?l(Ve,{to:V,"aria-label":h.value,...t,class:["nav-link",{active:y.value},t.class],onFocusout:()=>n("focusout")},()=>k?k():[P?P():l(ze,{icon:I}),A,E==null?void 0:E()]):l("a",{href:V,rel:v.value,target:u.value,"aria-label":h.value,...t,class:["nav-link",t.class],onFocusout:()=>n("focusout")},k?k():[P?P():l(ze,{icon:I}),A,e.noExternalLinkIcon?null:l(Yc),E==null?void 0:E()])}}});const Nn=(e,t,n=!1)=>"activeMatch"in t?new RegExp(t.activeMatch).test(e.path):Ki(e,t.link)?!0:t.children&&!n?t.children.some(o=>Nn(e,o)):!1,pu=(e,t)=>t.type==="group"?t.children.some(n=>n.type==="group"?pu(e,n):n.type==="page"&&Nn(e,n,!0))||"prefix"in t&&Ki(e,t.prefix):!1,du=(e,t)=>ie(e.link)?l(We,{...t,config:e}):l("p",t,[l(ze,{icon:e.icon}),e.text]),fu=e=>{const t=gt();return e?l("ul",{class:"vp-sidebar-sub-headers"},e.map(n=>{const o=Nn(t,n,!0);return l("li",{class:"vp-sidebar-sub-header"},[du(n,{class:["vp-sidebar-link","vp-heading",{active:o}]}),fu(n.children)])})):null},zr=(e="",t="")=>yr(t)?t:`${Zd(e)}${t}`,Rv=(e,t)=>{const n=ce();return{type:"heading",text:e.title,link:`${n.value.path}#${e.slug}`,children:oa(e.children,t)}},oa=(e,t)=>t>0?e.map(n=>Rv(n,t-1)):[],vu=e=>{const t=ce();return oa(t.value.headers,e)},li=(e,t,n="")=>{const o=Fe(),r=ce(),i=(a,s=n)=>{var u;const c=ie(a)?On(o,zr(s,a)):a.link?{...a,...rr(a.link)?{}:{link:On(o,zr(s,a.link)).link}}:a;if("children"in c){const p=zr(s,c.prefix),f=c.children==="structure"?na[p]:c.children;return{type:"group",...c,prefix:p,children:f.map(v=>i(v,p))}}return{type:"page",...c,children:c.link===r.value.path?oa(((u=r.value.headers[0])==null?void 0:u.level)===1?r.value.headers[0].children:r.value.headers,t):[]}};return e.map(a=>i(a))},Sv=(e,t)=>{const n=ce(),o=wt(e).sort((r,i)=>i.length-r.length);for(const r of o)if(pn(decodeURI(n.value.path),r)){const i=e[r];return i?li(i==="structure"?na[r]:i==="heading"?vu(t):i,t,r):[]}return console.warn(`${n.value.path} is missing sidebar config.`),[]},xv=(e,t)=>{const n=At();return e===!1?[]:e==="heading"?vu(t):e==="structure"?li(na[n.value],t,n.value):G(e)?li(e,t):zi(e)?Sv(e,t):[]},hu=Symbol(""),Dv=()=>{const e=we(),t=ue(),n=ce(),o=T(()=>e.value.home?!1:e.value.sidebar??t.value.sidebar??"structure"),r=T(()=>e.value.headerDepth??t.value.headerDepth??2),i=qi(()=>[o.value,r.value,n.value.path,null],()=>xv(o.value,r.value));ot(hu,i)},ra=()=>{const e=de(hu);if(!e)throw new Error("useSidebarItems() is called without provider.");return e};var Cv=B({name:"PageFooter",setup(){const e=we(),t=ue(),n=cu(),o=T(()=>{const{copyright:a,footer:s}=e.value;return s!==!1&&!!(a||s||t.value.displayFooter)}),r=T(()=>{const{footer:a}=e.value;return a===!1?!1:ie(a)?a:t.value.footer||""}),i=T(()=>"copyright"in e.value?e.value.copyright:"copyright"in t.value?t.value.copyright:n.value.length?`Copyright © ${new Date().getFullYear()} ${n.value[0].name}`:!1);return()=>o.value?l("footer",{class:"vp-footer-wrapper"},[r.value?l("div",{class:"vp-footer",innerHTML:r.value}):null,i.value?l("div",{class:"vp-copyright",innerHTML:i.value}):null]):null}}),Vv=B({name:"NavbarDropdownLink",props:{config:{type:Object,required:!0}},slots:Object,setup(e,{slots:t}){const n=ce(),o=Wn(e,"config"),r=T(()=>o.value.ariaLabel||o.value.text),i=K(!1);ae(()=>n.value.path,()=>{i.value=!1});const a=s=>{s.detail===0&&(i.value=!i.value)};return()=>{var s;return l("div",{class:["dropdown-wrapper",{open:i.value}]},[l("button",{type:"button",class:"dropdown-title","aria-label":r.value,onClick:a},[((s=t.title)==null?void 0:s.call(t))||l("span",{class:"title"},[l(ze,{icon:o.value.icon}),e.config.text]),l("span",{class:"arrow"}),l("ul",{class:"nav-dropdown"},o.value.children.map((c,u)=>{const p=u===o.value.children.length-1;return l("li",{class:"dropdown-item"},"children"in c?[l("h4",{class:"dropdown-subtitle"},c.link?l(We,{config:c,onFocusout:()=>{c.children.length===0&&p&&(i.value=!1)}}):l("span",c.text)),l("ul",{class:"dropdown-subitem-wrapper"},c.children.map((f,v)=>l("li",{class:"dropdown-subitem"},l(We,{config:f,onFocusout:()=>{v===c.children.length-1&&p&&(i.value=!1)}}))))]:l(We,{config:c,onFocusout:()=>{p&&(i.value=!1)}}))}))])])}}});const mu=(e,t,n="")=>ie(t)?On(e,`${n}${t}`):"children"in t?{...t,...t.link&&!rr(t.link)?On(e,`${n}${t.link}`):{},children:t.children.map(o=>mu(e,o,`${n}${t.prefix||""}`))}:{...t,link:rr(t.link)?t.link:On(e,`${n}${t.link}`).link},gu=()=>{const e=ue(),t=Fe(),n=()=>(e.value.navbar||[]).map(o=>mu(t,o));return qi(()=>e.value.navbar,()=>n())},Mv=()=>{const e=ue(),t=T(()=>e.value.repo||null),n=T(()=>t.value?O2(t.value):null),o=T(()=>t.value?xc(t.value):null),r=T(()=>n.value?e.value.repoLabel??(o.value===null?"Source":o.value):null);return T(()=>!n.value||!r.value||e.value.repoDisplay===!1?null:{type:o.value||"Source",label:r.value,link:n.value})};var Bv=B({name:"NavScreenDropdown",props:{config:{type:Object,required:!0}},setup(e){const t=ce(),n=Wn(e,"config"),o=T(()=>n.value.ariaLabel||n.value.text),r=K(!1);ae(()=>t.value.path,()=>{r.value=!1});const i=(a,s)=>s[s.length-1]===a;return()=>[l("button",{type:"button",class:["nav-screen-dropdown-title",{active:r.value}],"aria-label":o.value,onClick:()=>{r.value=!r.value}},[l("span",{class:"title"},[l(ze,{icon:n.value.icon}),e.config.text]),l("span",{class:["arrow",r.value?"down":"end"]})]),l("ul",{class:["nav-screen-dropdown",{hide:!r.value}]},n.value.children.map(a=>l("li",{class:"dropdown-item"},"children"in a?[l("h4",{class:"dropdown-subtitle"},a.link?l(We,{config:a,onFocusout:()=>{i(a,n.value.children)&&a.children.length===0&&(r.value=!1)}}):l("span",a.text)),l("ul",{class:"dropdown-subitem-wrapper"},a.children.map(s=>l("li",{class:"dropdown-subitem"},l(We,{config:s,onFocusout:()=>{i(s,a.children)&&i(a,n.value.children)&&(r.value=!1)}}))))]:l(We,{config:a,onFocusout:()=>{i(a,n.value.children)&&(r.value=!1)}}))))]}}),$v=B({name:"NavScreenLinks",setup(){const e=gu();return()=>e.value.length?l("nav",{class:"nav-screen-links"},e.value.map(t=>l("div",{class:"navbar-links-item"},"children"in t?l(Bv,{config:t}):l(We,{config:t})))):null}});const _u=()=>l(re,{name:"dark"},()=>l("path",{d:"M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"}));_u.displayName="DarkIcon";const bu=()=>l(re,{name:"light"},()=>l("path",{d:"M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"}));bu.displayName="LightIcon";const yu=()=>l(re,{name:"auto"},()=>l("path",{d:"M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"}));yu.displayName="AutoIcon";const Eu=()=>l(re,{name:"enter-fullscreen"},()=>l("path",{d:"M762.773 90.24h-497.28c-96.106 0-174.4 78.293-174.4 174.4v497.28c0 96.107 78.294 174.4 174.4 174.4h497.28c96.107 0 175.04-78.293 174.4-174.4V264.64c0-96.213-78.186-174.4-174.4-174.4zm-387.2 761.173H215.04c-21.867 0-40.427-17.92-41.067-41.066V649.92c0-22.507 17.92-40.427 40.427-40.427 11.307 0 21.227 4.694 28.48 11.947 7.253 7.253 11.947 17.92 11.947 28.48v62.293l145.28-145.28c15.893-15.893 41.813-15.893 57.706 0 15.894 15.894 15.894 41.814 0 57.707l-145.28 145.28h62.294c22.506 0 40.426 17.92 40.426 40.427s-17.173 41.066-39.68 41.066zM650.24 165.76h160.427c21.866 0 40.426 17.92 41.066 41.067v160.426c0 22.507-17.92 40.427-40.426 40.427-11.307 0-21.227-4.693-28.48-11.947-7.254-7.253-11.947-17.92-11.947-28.48v-62.186L625.6 450.347c-15.893 15.893-41.813 15.893-57.707 0-15.893-15.894-15.893-41.814 0-57.707l145.28-145.28H650.88c-22.507 0-40.427-17.92-40.427-40.427s17.174-41.173 39.787-41.173z"}));Eu.displayName="EnterFullScreenIcon";const wu=()=>l(re,{name:"cancel-fullscreen"},()=>l("path",{d:"M778.468 78.62H247.922c-102.514 0-186.027 83.513-186.027 186.027V795.08c0 102.514 83.513 186.027 186.027 186.027h530.432c102.514 0 186.71-83.513 186.026-186.027V264.647C964.494 162.02 880.981 78.62 778.468 78.62zM250.88 574.35h171.122c23.324 0 43.122 19.115 43.804 43.805v171.121c0 24.008-19.114 43.122-43.122 43.122-12.06 0-22.641-5.006-30.378-12.743s-12.743-19.115-12.743-30.379V722.83L224.597 877.91c-16.953 16.952-44.6 16.952-61.553 0-16.953-16.954-16.953-44.602 0-61.554L318.009 661.39h-66.446c-24.007 0-43.122-19.114-43.122-43.122 0-24.12 18.432-43.918 42.439-43.918zm521.899-98.873H601.657c-23.325 0-43.122-19.114-43.805-43.804V260.55c0-24.007 19.115-43.122 43.122-43.122 12.06 0 22.642 5.007 30.379 12.743s12.743 19.115 12.743 30.38v66.445l154.965-154.965c16.953-16.953 44.601-16.953 61.554 0 16.953 16.953 16.953 44.6 0 61.554L705.536 388.55h66.446c24.007 0 43.122 19.115 43.122 43.122.114 24.007-18.318 43.804-42.325 43.804z"}));wu.displayName="CancelFullScreenIcon";const Au=()=>l(re,{name:"outlook"},()=>[l("path",{d:"M224 800c0 9.6 3.2 44.8 6.4 54.4 6.4 48-48 76.8-48 76.8s80 41.6 147.2 0 134.4-134.4 38.4-195.2c-22.4-12.8-41.6-19.2-57.6-19.2C259.2 716.8 227.2 761.6 224 800zM560 675.2l-32 51.2c-51.2 51.2-83.2 32-83.2 32 25.6 67.2 0 112-12.8 128 25.6 6.4 51.2 9.6 80 9.6 54.4 0 102.4-9.6 150.4-32l0 0c3.2 0 3.2-3.2 3.2-3.2 22.4-16 12.8-35.2 6.4-44.8-9.6-12.8-12.8-25.6-12.8-41.6 0-54.4 60.8-99.2 137.6-99.2 6.4 0 12.8 0 22.4 0 12.8 0 38.4 9.6 48-25.6 0-3.2 0-3.2 3.2-6.4 0-3.2 3.2-6.4 3.2-6.4 6.4-16 6.4-16 6.4-19.2 9.6-35.2 16-73.6 16-115.2 0-105.6-41.6-198.4-108.8-268.8C704 396.8 560 675.2 560 675.2zM224 419.2c0-28.8 22.4-51.2 51.2-51.2 28.8 0 51.2 22.4 51.2 51.2 0 28.8-22.4 51.2-51.2 51.2C246.4 470.4 224 448 224 419.2zM320 284.8c0-22.4 19.2-41.6 41.6-41.6 22.4 0 41.6 19.2 41.6 41.6 0 22.4-19.2 41.6-41.6 41.6C339.2 326.4 320 307.2 320 284.8zM457.6 208c0-12.8 12.8-25.6 25.6-25.6 12.8 0 25.6 12.8 25.6 25.6 0 12.8-12.8 25.6-25.6 25.6C470.4 233.6 457.6 220.8 457.6 208zM128 505.6C128 592 153.6 672 201.6 736c28.8-60.8 112-60.8 124.8-60.8-16-51.2 16-99.2 16-99.2l316.8-422.4c-48-19.2-99.2-32-150.4-32C297.6 118.4 128 291.2 128 505.6zM764.8 86.4c-22.4 19.2-390.4 518.4-390.4 518.4-22.4 28.8-12.8 76.8 22.4 99.2l9.6 6.4c35.2 22.4 80 12.8 99.2-25.6 0 0 6.4-12.8 9.6-19.2 54.4-105.6 275.2-524.8 288-553.6 6.4-19.2-3.2-32-19.2-32C777.6 76.8 771.2 80 764.8 86.4z"})]);Au.displayName="OutlookIcon";var Tu=B({name:"AppearanceSwitch",setup(){const{config:e,status:t}=Po(),n=()=>{e.value==="switch"?t.value={light:"dark",dark:"auto",auto:"light"}[t.value]:t.value=t.value==="light"?"dark":"light"};return()=>l("button",{type:"button",id:"appearance-switch",onClick:()=>n()},[l(yu,{style:{display:t.value==="auto"?"block":"none"}}),l(_u,{style:{display:t.value==="dark"?"block":"none"}}),l(bu,{style:{display:t.value==="light"?"block":"none"}})])}}),Nv=B({name:"AppearanceMode",setup(){const e=ue(),{canToggle:t}=Po(),n=T(()=>e.value.outlookLocales.darkmode);return()=>t.value?l("div",{class:"appearance-wrapper"},[l("label",{class:"appearance-title",for:"appearance-switch"},n.value),l(Tu)]):null}});const Fr="VUEPRESS_THEME_COLOR";var zv=B({name:"ThemeColorPicker",props:{themeColor:{type:Object,required:!0}},setup(e){const t=(n="")=>{const o=document.documentElement.classList,r=wt(e.themeColor);if(!n){localStorage.removeItem(Fr),o.remove(...r);return}o.remove(...r.filter(i=>i!==n)),o.add(n),localStorage.setItem(Fr,n)};return ge(()=>{const n=localStorage.getItem(Fr);n&&t(n)}),()=>l("ul",{id:"theme-color-picker"},[l("li",l("span",{class:"theme-color",onClick:()=>t()})),wo(e.themeColor).map(([n,o])=>l("li",l("span",{style:{background:o},onClick:()=>t(n)})))])}});const kn=ta.enableThemeColor==="true",Fv=kn?A2(wo(ta).filter(([e])=>e.startsWith("theme-"))):{};var Hv=B({name:"ThemeColor",setup(){const e=ue(),t=T(()=>e.value.outlookLocales.themeColor);return()=>kn?l("div",{class:"theme-color-wrapper"},[l("label",{class:"theme-color-title",for:"theme-color-picker"},t.value),l(zv,{themeColor:Fv})]):null}}),Iu=B({name:"ToggleFullScreenButton",setup(){const e=ue(),{isSupported:t,isFullscreen:n,toggle:o}=Ji(),r=T(()=>e.value.outlookLocales.fullscreen);return()=>t?l("div",{class:"full-screen-wrapper"},[l("label",{class:"full-screen-title",for:"full-screen-switch"},r.value),l("button",{type:"button",id:"full-screen-switch",class:"full-screen",ariaPressed:n.value,onClick:()=>o()},n.value?l(wu):l(Eu))]):null}}),Pu=B({name:"OutlookSettings",setup(){const e=hn(),t=Gn(),n=T(()=>!t.value&&e.value.fullscreen);return()=>l(hr,()=>[kn?l(Hv):null,l(Nv),n.value?l(Iu):null])}}),jv=B({name:"NavScreen",props:{show:Boolean},emits:["close"],slots:Object,setup(e,{emit:t,slots:n}){const o=ce(),{isMobile:r}=Io(),i=$e(),a=Qi(i);return ge(()=>{i.value=document.body,ae(r,s=>{!s&&e.show&&(a.value=!1,t("close"))}),ae(()=>o.value.path,()=>{a.value=!1,t("close")})}),fn(()=>{a.value=!1}),()=>l(Yt,{name:"fade",onEnter:()=>{a.value=!0},onAfterLeave:()=>{a.value=!1}},()=>{var s,c;return e.show?l("div",{id:"nav-screen"},l("div",{class:"vp-nav-screen-container"},[(s=n.before)==null?void 0:s.call(n),l($v),l("div",{class:"vp-outlook-wrapper"},l(Pu)),(c=n.after)==null?void 0:c.call(n)])):null})}}),Wv=B({name:"NavbarBrand",setup(){const e=At(),t=Un(),n=ue(),o=T(()=>n.value.home||e.value),r=T(()=>t.value.title),i=T(()=>n.value.navTitle??r.value),a=T(()=>n.value.logo?Ie(n.value.logo):null),s=T(()=>n.value.logoDark?Ie(n.value.logoDark):null);return()=>l(Ve,{to:o.value,class:"vp-brand"},()=>[a.value?l("img",{class:["vp-nav-logo",{light:!!s.value}],src:a.value,alt:r.value}):null,s.value?l("img",{class:["vp-nav-logo dark"],src:s.value,alt:r.value}):null,i.value?l("span",{class:["vp-site-name",{"hide-in-pad":a.value&&n.value.hideSiteNameOnMobile!==!1}]},i.value):null])}}),Uv=B({name:"NavbarLinks",setup(){const e=gu();return()=>e.value.length?l("nav",{class:"vp-nav-links"},e.value.map(t=>l("div",{class:"nav-item hide-in-mobile"},"children"in t?l(Vv,{config:t}):l(We,{config:t})))):null}}),Gv=B({name:"RepoLink",components:{BitbucketIcon:Mc,GiteeIcon:Vc,GitHubIcon:Dc,GitLabIcon:Cc,SourceIcon:Bc},setup(){const e=Mv();return()=>e.value?l("div",{class:"nav-item vp-repo"},l("a",{class:"vp-repo-link",href:e.value.link,target:"_blank",rel:"noopener noreferrer","aria-label":e.value.label},l(Je(`${e.value.type}Icon`),{style:{width:"1.25rem",height:"1.25rem",verticalAlign:"middle"}}))):null}});const Ou=({active:e=!1},{emit:t})=>l("button",{type:"button",class:["vp-toggle-navbar-button",{"is-active":e}],"aria-label":"Toggle Navbar","aria-expanded":e,"aria-controls":"nav-screen",onClick:()=>t("toggle")},l("span",[l("span",{class:"vp-top"}),l("span",{class:"vp-middle"}),l("span",{class:"vp-bottom"})]));Ou.displayName="ToggleNavbarButton";var Kv=Ou;const si=(e,{emit:t})=>l("button",{type:"button",class:"vp-toggle-sidebar-button",title:"Toggle Sidebar",onClick:()=>t("toggle")},l("span",{class:"icon"}));si.displayName="ToggleSidebarButton",si.emits=["toggle"];var qv=si,Yv=B({name:"OutlookButton",setup(){const{isSupported:e}=Ji(),t=hn(),n=Gn(),o=ce(),{canToggle:r}=Po(),i=K(!1),a=T(()=>!n.value&&t.value.fullscreen&&e);return ae(()=>o.value.path,()=>{i.value=!1}),()=>r.value||a.value||kn?l("div",{class:"nav-item hide-in-mobile"},r.value&&!a.value&&!kn?l(Tu):a.value&&!r.value&&!kn?l(Iu):l("button",{type:"button",class:["outlook-button",{open:i.value}],tabindex:"-1","aria-hidden":!0},[l(Au),l("div",{class:"outlook-dropdown"},l(Pu))])):null}}),Zv=B({name:"NavBar",emits:["toggleSidebar"],slots:Object,setup(e,{emit:t,slots:n}){const o=ue(),{isMobile:r}=Io(),i=K(!1),a=T(()=>{const{navbarAutoHide:p="mobile"}=o.value;return p!=="none"&&(p==="always"||r.value)}),s=T(()=>o.value.navbarLayout||{start:["Brand"],center:["Links"],end:["Language","Repo","Outlook","Search"]}),c={Brand:Wv,Language:Nr,Links:Uv,Repo:Gv,Outlook:Yv,Search:Ye("Docsearch")?Je("Docsearch"):Ye("SearchBox")?Je("SearchBox"):Nr},u=p=>c[p]??(Ye(p)?Je(p):Nr);return()=>{var p,f,v,h,_,y;return[l("header",{id:"navbar",class:["vp-navbar",{"auto-hide":a.value,"hide-icon":o.value.navbarIcon===!1}]},[l("div",{class:"vp-navbar-start"},[l(qv,{onToggle:()=>{i.value&&(i.value=!1),t("toggleSidebar")}}),(p=n.startBefore)==null?void 0:p.call(n),(s.value.start||[]).map(P=>l(u(P))),(f=n.startAfter)==null?void 0:f.call(n)]),l("div",{class:"vp-navbar-center"},[(v=n.centerBefore)==null?void 0:v.call(n),(s.value.center||[]).map(P=>l(u(P))),(h=n.centerAfter)==null?void 0:h.call(n)]),l("div",{class:"vp-navbar-end"},[(_=n.endBefore)==null?void 0:_.call(n),(s.value.end||[]).map(P=>l(u(P))),(y=n.endAfter)==null?void 0:y.call(n),l(Kv,{active:i.value,onToggle:()=>{i.value=!i.value}})])]),l(jv,{show:i.value,onClose:()=>{i.value=!1}},{before:()=>{var P;return(P=n.screenTop)==null?void 0:P.call(n)},after:()=>{var P;return(P=n.screenBottom)==null?void 0:P.call(n)}})]}}}),Xv=B({name:"SidebarChild",props:{config:{type:Object,required:!0}},setup(e){const t=gt();return()=>[du(e.config,{class:["vp-sidebar-link",`vp-sidebar-${e.config.type}`,{active:Nn(t,e.config,!0)}],exact:!0}),fu(e.config.children)]}}),Jv=B({name:"SidebarGroup",props:{config:{type:Object,required:!0},open:{type:Boolean,required:!0}},emits:["toggle"],setup(e,{emit:t}){const n=gt(),o=T(()=>Nn(n,e.config)),r=T(()=>Nn(n,e.config,!0));return()=>{const{collapsible:i,children:a=[],icon:s,prefix:c,link:u,text:p}=e.config;return l("section",{class:"vp-sidebar-group"},[l(i?"button":"p",{class:["vp-sidebar-heading",{clickable:i||u,exact:r.value,active:o.value}],...i?{type:"button",onClick:()=>t("toggle"),onKeydown:f=>{f.key==="Enter"&&t("toggle")}}:{}},[l(ze,{icon:s}),u?l(We,{class:"vp-sidebar-title",config:{text:p,link:u},noExternalLinkIcon:!0}):l("span",{class:"vp-sidebar-title"},p),i?l("span",{class:["vp-arrow",e.open?"down":"end"]}):null]),e.open||!i?l(ku,{key:c,config:a}):null])}}}),ku=B({name:"SidebarLinks",props:{config:{type:Array,required:!0}},setup(e){const t=gt(),n=K(-1),o=r=>{n.value=r===n.value?-1:r};return ae(()=>t.path,()=>{const r=e.config.findIndex(i=>pu(t,i));n.value=r},{immediate:!0,flush:"post"}),()=>l("ul",{class:"vp-sidebar-links"},e.config.map((r,i)=>l("li",r.type==="group"?l(Jv,{config:r,open:i===n.value,onToggle:()=>o(i)}):l(Xv,{config:r}))))}}),Qv=B({name:"SideBar",slots:Object,setup(e,{slots:t}){const n=gt(),o=ue(),r=ra(),i=$e();return ge(()=>{ae(()=>n.hash,a=>{const s=document.querySelector(`.vp-sidebar a.vp-sidebar-link[href="${n.path}${a}"]`);if(!s)return;const{top:c,height:u}=i.value.getBoundingClientRect(),{top:p,height:f}=s.getBoundingClientRect();pc+u&&s.scrollIntoView(!1)},{immediate:!0})}),()=>{var a,s,c;return l("aside",{ref:i,id:"sidebar",class:["vp-sidebar",{"hide-icon":o.value.sidebarIcon===!1}]},[(a=t.top)==null?void 0:a.call(t),((s=t.default)==null?void 0:s.call(t))||l(ku,{config:r.value}),(c=t.bottom)==null?void 0:c.call(t)])}}}),ia=B({name:"CommonWrapper",props:{containerClass:{type:String,default:""},noNavbar:Boolean,noSidebar:Boolean,noToc:Boolean},slots:Object,setup(e,{slots:t}){const n=Fe(),o=ce(),r=we(),i=ue(),{isMobile:a,isPC:s}=Io(),[c,u]=Rl(!1),[p,f]=Rl(!1),v=ra(),h=K(!1),_=T(()=>e.noNavbar||r.value.navbar===!1||i.value.navbar===!1?!1:!!(o.value.title||i.value.logo||i.value.repo||i.value.navbar)),y=T(()=>e.noSidebar?!1:r.value.sidebar!==!1&&v.value.length!==0&&!r.value.home),P=T(()=>e.noToc||r.value.home?!1:r.value.toc||i.value.toc!==!1&&r.value.toc!==!1),E={x:0,y:0},k=x=>{E.x=x.changedTouches[0].clientX,E.y=x.changedTouches[0].clientY},A=x=>{const $=x.changedTouches[0].clientX-E.x,R=x.changedTouches[0].clientY-E.y;Math.abs($)>Math.abs(R)*1.5&&Math.abs($)>40&&($>0&&E.x<=80?u(!0):u(!1))},I=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;let V=0;return Re("scroll",$2(()=>{const x=I();x<=58||x{x||u(!1)}),ge(()=>{const x=Qi(document.body);ae(c,R=>{x.value=R});const $=n.afterEach(()=>{u(!1)});fn(()=>{x.value=!1,$()})}),()=>l(Ye("GlobalEncrypt")?Je("GlobalEncrypt"):Tc,()=>l("div",{class:["theme-container",{"no-navbar":!_.value,"no-sidebar":!y.value&&!(t.sidebar||t.sidebarTop||t.sidebarBottom),"has-toc":P.value,"hide-navbar":h.value,"sidebar-collapsed":!a.value&&!s.value&&p.value,"sidebar-open":a.value&&c.value},e.containerClass,r.value.containerClass||""],onTouchStart:k,onTouchEnd:A},[_.value?l(Zv,{onToggleSidebar:()=>u()},{startBefore:()=>{var x;return(x=t.navbarStartBefore)==null?void 0:x.call(t)},startAfter:()=>{var x;return(x=t.navbarStartAfter)==null?void 0:x.call(t)},centerBefore:()=>{var x;return(x=t.navbarCenterBefore)==null?void 0:x.call(t)},centerAfter:()=>{var x;return(x=t.navbarCenterAfter)==null?void 0:x.call(t)},endBefore:()=>{var x;return(x=t.navbarEndBefore)==null?void 0:x.call(t)},endAfter:()=>{var x;return(x=t.navbarEndAfter)==null?void 0:x.call(t)},screenTop:()=>{var x;return(x=t.navScreenTop)==null?void 0:x.call(t)},screenBottom:()=>{var x;return(x=t.navScreenBottom)==null?void 0:x.call(t)}}):null,l(Yt,{name:"fade"},()=>c.value?l("div",{class:"vp-sidebar-mask",onClick:()=>u(!1)}):null),l(Yt,{name:"fade"},()=>a.value?null:l("div",{class:"toggle-sidebar-wrapper",onClick:()=>f()},l("span",{class:["arrow",p.value?"end":"start"]}))),l(Qv,{},{...t.sidebar?{default:()=>t.sidebar()}:{},top:()=>{var x;return(x=t.sidebarTop)==null?void 0:x.call(t)},bottom:()=>{var x;return(x=t.sidebarBottom)==null?void 0:x.call(t)}}),t.default(),l(Cv)]))}}),he=B({name:"DropTransition",props:{type:{type:String,default:"single"},delay:{type:Number,default:0},duration:{type:Number,default:.25},appear:Boolean},slots:Object,setup(e,{slots:t}){const n=r=>{r.style.transition=`transform ${e.duration}s ease-in-out ${e.delay}s, opacity ${e.duration}s ease-in-out ${e.delay}s`,r.style.transform="translateY(-20px)",r.style.opacity="0"},o=r=>{r.style.transform="translateY(0)",r.style.opacity="1"};return()=>l(e.type==="single"?Yt:xd,{name:"drop",appear:e.appear,onAppear:n,onAfterAppear:o,onEnter:n,onAfterEnter:o,onBeforeLeave:n},()=>t.default())}});const ci=({custom:e})=>l(dc,{class:["theme-hope-content",{custom:e}]});ci.displayName="MarkdownContent",ci.props={custom:Boolean};var aa=ci;const Lu=()=>l(re,{name:"author"},()=>l("path",{d:"M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"}));Lu.displayName="AuthorIcon";const Ru=()=>l(re,{name:"calendar"},()=>l("path",{d:"M716.4 110.137c0-18.753-14.72-33.473-33.472-33.473-18.753 0-33.473 14.72-33.473 33.473v33.473h66.993v-33.473zm-334.87 0c0-18.753-14.72-33.473-33.473-33.473s-33.52 14.72-33.52 33.473v33.473h66.993v-33.473zm468.81 33.52H716.4v100.465c0 18.753-14.72 33.473-33.472 33.473a33.145 33.145 0 01-33.473-33.473V143.657H381.53v100.465c0 18.753-14.72 33.473-33.473 33.473a33.145 33.145 0 01-33.473-33.473V143.657H180.6A134.314 134.314 0 0046.66 277.595v535.756A134.314 134.314 0 00180.6 947.289h669.74a134.36 134.36 0 00133.94-133.938V277.595a134.314 134.314 0 00-133.94-133.938zm33.473 267.877H147.126a33.145 33.145 0 01-33.473-33.473c0-18.752 14.72-33.473 33.473-33.473h736.687c18.752 0 33.472 14.72 33.472 33.473a33.145 33.145 0 01-33.472 33.473z"}));Ru.displayName="CalendarIcon";const Su=()=>l(re,{name:"category"},()=>l("path",{d:"M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"}));Su.displayName="CategoryIcon";const xu=()=>l(re,{name:"eye"},()=>l("path",{d:"M992 512.096c0-5.76-.992-10.592-1.28-11.136-.192-2.88-1.152-8.064-2.08-10.816-.256-.672-.544-1.376-.832-2.08-.48-1.568-1.024-3.104-1.6-4.32C897.664 290.112 707.104 160 512 160c-195.072 0-385.632 130.016-473.76 322.592-1.056 2.112-1.792 4.096-2.272 5.856a55.512 55.512 0 00-.64 1.6c-1.76 5.088-1.792 8.64-1.632 7.744-.832 3.744-1.568 11.168-1.568 11.168-.224 2.272-.224 4.032.032 6.304 0 0 .736 6.464 1.088 7.808.128 1.824.576 4.512 1.12 6.976h-.032c.448 2.08 1.12 4.096 1.984 6.08.48 1.536.992 2.976 1.472 4.032C126.432 733.856 316.992 864 512 864c195.136 0 385.696-130.048 473.216-321.696 1.376-2.496 2.24-4.832 2.848-6.912.256-.608.48-1.184.672-1.728 1.536-4.48 1.856-8.32 1.728-8.32l-.032.032c.608-3.104 1.568-7.744 1.568-13.28zM512 672c-88.224 0-160-71.776-160-160s71.776-160 160-160 160 71.776 160 160-71.776 160-160 160z"}));xu.displayName="EyeIcon";const Du=()=>l(re,{name:"fire"},()=>l("path",{d:"M726.4 201.6c-12.8-9.6-28.8-6.4-38.4 0-9.6 9.6-16 25.6-9.6 38.4 6.4 12.8 9.6 28.8 12.8 44.8C604.8 83.2 460.8 38.4 454.4 35.2c-9.6-3.2-22.4 0-28.8 6.4-9.6 6.4-12.8 19.2-9.6 28.8 12.8 86.4-25.6 188.8-115.2 310.4-6.4-25.6-16-51.2-32-80-9.6-9.6-22.4-16-35.2-12.8-16 3.2-25.6 12.8-25.6 28.8-3.2 48-25.6 92.8-51.2 140.8C134.4 499.2 112 544 102.4 592c-32 150.4 99.2 329.6 233.6 380.8 9.6 3.2 19.2 6.4 32 9.6-25.6-19.2-41.6-51.2-48-96C294.4 691.2 505.6 640 515.2 460.8c153.6 105.6 224 336 137.6 505.6 3.2 0 6.4-3.2 9.6-3.2 0 0 3.2 0 3.2-3.2 163.2-89.6 252.8-208 259.2-345.6 16-211.2-163.2-390.4-198.4-412.8z"}));Du.displayName="FireIcon";const Cu=()=>l(re,{name:"print"},()=>l("path",{d:"M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"}));Cu.displayName="PrintIcon";const Vu=()=>l(re,{name:"tag"},()=>l("path",{d:"M939.902 458.563L910.17 144.567c-1.507-16.272-14.465-29.13-30.737-30.737L565.438 84.098h-.402c-3.215 0-5.726 1.005-7.634 2.913l-470.39 470.39a10.004 10.004 0 000 14.164l365.423 365.424c1.909 1.908 4.42 2.913 7.132 2.913s5.223-1.005 7.132-2.913l470.39-470.39c2.01-2.11 3.014-5.023 2.813-8.036zm-240.067-72.121c-35.458 0-64.286-28.828-64.286-64.286s28.828-64.285 64.286-64.285 64.286 28.828 64.286 64.285-28.829 64.286-64.286 64.286z"}));Vu.displayName="TagIcon";const Mu=()=>l(re,{name:"timer"},()=>l("path",{d:"M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"}));Mu.displayName="TimerIcon";const Bu=()=>l(re,{name:"word"},()=>[l("path",{d:"M518.217 432.64V73.143A73.143 73.143 0 01603.43 1.097a512 512 0 01419.474 419.474 73.143 73.143 0 01-72.046 85.212H591.36a73.143 73.143 0 01-73.143-73.143z"}),l("path",{d:"M493.714 566.857h340.297a73.143 73.143 0 0173.143 85.577A457.143 457.143 0 11371.566 117.76a73.143 73.143 0 0185.577 73.143v339.383a36.571 36.571 0 0036.571 36.571z"})]);Bu.displayName="WordIcon";const Mt=()=>{const e=ue();return T(()=>e.value.metaLocales)};var eh=B({name:"AuthorInfo",inheritAttrs:!1,props:{author:{type:Array,required:!0},pure:Boolean},setup(e){const t=Mt();return()=>e.author.length?l("span",{class:"page-author-info","aria-label":`${t.value.author}${e.pure?"":"🖊"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Lu),l("span",e.author.map(n=>n.url?l("a",{class:"page-author-item",href:n.url,target:"_blank",rel:"noopener noreferrer"},n.name):l("span",{class:"page-author-item"},n.name))),l("span",{property:"author",content:e.author.map(n=>n.name).join(", ")})]):null}}),th=B({name:"CategoryInfo",inheritAttrs:!1,props:{category:{type:Array,required:!0},pure:Boolean},setup(e){const t=Fe(),n=ce(),o=Mt(),r=(i,a="")=>{a&&n.value.path!==a&&(i.preventDefault(),t.push(a))};return()=>e.category.length?l("span",{class:"page-category-info","aria-label":`${o.value.category}${e.pure?"":"🌈"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Su),e.category.map(({name:i,path:a})=>l("span",{class:["page-category-item",{[`category${br(i,9)}`]:!e.pure,clickable:a}],role:a?"navigation":"",onClick:s=>r(s,a)},i)),l("meta",{property:"articleSection",content:e.category.map(({name:i})=>i).join(",")})]):null}}),nh=B({name:"DateInfo",inheritAttrs:!1,props:{date:{type:Object,default:null},localizedDate:{type:String,default:""},pure:Boolean},setup(e){const t=vr(),n=Mt();return()=>e.date?l("span",{class:"page-date-info","aria-label":`${n.value.date}${e.pure?"":"📅"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Ru),l("span",l(hr,()=>e.localizedDate||e.date.toLocaleDateString(t.value))),l("meta",{property:"datePublished",content:e.date.toISOString()||""})]):null}}),oh=B({name:"OriginalInfo",inheritAttrs:!1,props:{isOriginal:Boolean},setup(e){const t=Mt();return()=>e.isOriginal?l("span",{class:"page-original-info"},t.value.origin):null}}),rh=B({name:"PageViewInfo",inheritAttrs:!1,props:{pageview:{type:[Boolean,String],default:!1},pure:Boolean},setup(e){const t=gt(),n=Mt(),o=$e(),r=K(0);return tf(o,()=>{const i=o.value.textContent;i&&!isNaN(Number(i))&&(r.value=Number(i))},{childList:!0}),()=>e.pageview?l("span",{class:"page-pageview-info","aria-label":`${n.value.views}${e.pure?"":"🔢"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(r.value<1e3?xu:Du),l("span",{ref:o,id:"ArtalkPV",class:"waline-pageview-count","data-path":ie(e.pageview)?e.pageview:t.path},"...")]):null}}),ih=B({name:"ReadingTimeInfo",inheritAttrs:!1,props:{readingTime:{type:Object,default:()=>null},readingTimeLocale:{type:Object,default:()=>null},pure:Boolean},setup(e){const t=Mt(),n=T(()=>{if(!e.readingTime)return null;const{minutes:o}=e.readingTime;return o<1?"PT1M":`PT${Math.round(o)}M`});return()=>{var o,r;return(o=e.readingTimeLocale)!=null&&o.time?l("span",{class:"page-reading-time-info","aria-label":`${t.value.readingTime}${e.pure?"":"⌛"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Mu),l("span",(r=e.readingTimeLocale)==null?void 0:r.time),l("meta",{property:"timeRequired",content:n.value})]):null}}}),ah=B({name:"TagInfo",inheritAttrs:!1,props:{tag:{type:Array,default:()=>[]},pure:Boolean},setup(e){const t=Fe(),n=ce(),o=Mt(),r=(i,a="")=>{a&&n.value.path!==a&&(i.preventDefault(),t.push(a))};return()=>e.tag.length?l("span",{class:"page-tag-info","aria-label":`${o.value.tag}${e.pure?"":"🏷"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Vu),e.tag.map(({name:i,path:a})=>l("span",{class:["page-tag-item",{[`tag${br(i,9)}`]:!e.pure,clickable:a}],role:a?"navigation":"",onClick:s=>r(s,a)},i)),l("meta",{property:"keywords",content:e.tag.map(({name:i})=>i).join(",")})]):null}}),lh=B({name:"ReadTimeInfo",inheritAttrs:!1,props:{readingTime:{type:Object,default:()=>null},readingTimeLocale:{type:Object,default:()=>null},pure:Boolean},setup(e){const t=Mt();return()=>{var n,o,r;return(n=e.readingTimeLocale)!=null&&n.words?l("span",{class:"page-word-info","aria-label":`${t.value.words}${e.pure?"":"🔠"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Bu),l("span",(o=e.readingTimeLocale)==null?void 0:o.words),l("meta",{property:"wordCount",content:(r=e.readingTime)==null?void 0:r.words})]):null}}}),$u=B({name:"PageInfo",components:{AuthorInfo:eh,CategoryInfo:th,DateInfo:nh,OriginalInfo:oh,PageViewInfo:rh,ReadingTimeInfo:ih,TagInfo:ah,WordInfo:lh},props:{items:{type:[Array,Boolean],default:()=>["Author","Original","Date","PageView","ReadingTime","Category","Tag"]},info:{type:Object,required:!0}},setup(e){const t=Gn();return()=>e.items?l("div",{class:"page-info"},e.items.map(n=>l(Je(`${n}Info`),{...e.info,pure:t.value}))):null}}),sh=B({name:"PrintButton",setup(){const e=hn(),t=ue();return()=>e.value.print===!1?null:l("button",{type:"button",class:"print-button",title:t.value.metaLocales.print,onClick:()=>{window.print()}},l(Cu))}});const ch=({title:e,level:t,slug:n})=>l(Ve,{to:`#${n}`,class:["toc-link",`level${t}`]},()=>e),ui=(e,t)=>{const n=gt();return e.length&&t>0?l("ul",{class:"toc-list"},e.map(o=>{const r=ui(o.children,t-1);return[l("li",{class:["toc-item",{active:Ki(n,`#${o.slug}`)}]},ch(o)),r?l("li",r):null]})):null};var Nu=B({name:"TOC",props:{items:{type:Array,default:()=>[]},headerDepth:{type:Number,default:2}},slots:Object,setup(e,{slots:t}){const n=gt(),o=ce(),r=Mt(),i=$e(),a=K("-1.7rem"),s=u=>{var p;(p=i.value)==null||p.scrollTo({top:u,behavior:"smooth"})},c=()=>{if(i.value){const u=document.querySelector(".toc-item.active");u?a.value=`${u.getBoundingClientRect().top-i.value.getBoundingClientRect().top+i.value.scrollTop}px`:a.value="-1.7rem"}else a.value="-1.7rem"};return ge(()=>{ae(()=>n.hash,u=>{if(i.value){const p=document.querySelector(`#toc a.toc-link[href$="${u}"]`);if(!p)return;const{top:f,height:v}=i.value.getBoundingClientRect(),{top:h,height:_}=p.getBoundingClientRect();hf+v&&s(i.value.scrollTop+h+_-f-v)}}),ae(()=>n.fullPath,c,{flush:"post",immediate:!0})}),()=>{var p,f;const u=e.items.length?ui(e.items,e.headerDepth):o.value.headers?ui(o.value.headers,e.headerDepth):null;return u?l("div",{class:"toc-place-holder"},[l("aside",{id:"toc"},[(p=t.before)==null?void 0:p.call(t),l("div",{class:"toc-header"},[r.value.toc,l(sh)]),l("div",{class:"toc-wrapper",ref:i},[u,l("div",{class:"toc-marker",style:{top:a.value}})]),(f=t.after)==null?void 0:f.call(t)])]):null}}}),la=B({name:"SkipLink",props:{content:{type:String,default:"main-content"}},setup(e){const t=ce(),n=ue(),o=$e(),r=({target:i})=>{const a=document.querySelector(i.hash);if(a){const s=()=>{a.removeAttribute("tabindex"),a.removeEventListener("blur",s)};a.setAttribute("tabindex","-1"),a.addEventListener("blur",s),a.focus(),window.scrollTo(0,0)}};return ge(()=>{ae(()=>t.value.path,()=>o.value.focus())}),()=>[l("span",{ref:o,tabindex:"-1"}),l("a",{href:`#${e.content}`,class:"vp-skip-link sr-only",onClick:r},n.value.routeLocales.skipToContent)]}});let Hr=null,Xn=null;const uh={wait:()=>Hr,pending:()=>{Hr=new Promise(e=>Xn=e)},resolve:()=>{Xn==null||Xn(),Hr=null,Xn=null}},zu=()=>uh;var ph=B({name:"FadeSlideY",slots:Object,setup(e,{slots:t}){const{resolve:n,pending:o}=zu();return()=>l(Yt,{name:"fade-slide-y",mode:"out-in",onBeforeEnter:n,onBeforeLeave:o},()=>{var r;return(r=t.default)==null?void 0:r.call(t)})}});const dh=(e,t)=>{const n=e.replace(t,"/").split("/"),o=[];let r=Fi(t);return n.forEach((i,a)=>{a!==n.length-1?(r+=`${i}/`,o.push({link:r,name:i||"Home"})):i!==""&&(r+=i,o.push({link:r,name:i}))}),o},Fu=(e,{slots:t})=>{var f,v;const{bgImage:n,bgImageDark:o,bgImageStyle:r,color:i,description:a,image:s,imageDark:c,header:u,features:p=[]}=e;return l("div",{class:"vp-feature-wrapper"},[n?l("div",{class:["vp-feature-bg",{light:o}],style:[{"background-image":`url(${n})`},r]}):null,o?l("div",{class:"vp-feature-bg dark",style:[{"background-image":`url(${o})`},r]}):null,l("div",{class:"vp-feature",style:i?{color:i}:{}},[((f=t.image)==null?void 0:f.call(t,e))||[s?l("img",{class:["vp-feature-image",{light:c}],src:Ie(s),alt:u}):null,c?l("img",{class:"vp-feature-image dark",src:Ie(c),alt:u}):null],((v=t.info)==null?void 0:v.call(t,e))||[u?l("h2",{class:"vp-feature-header"},u):null,a?l("p",{class:"vp-feature-description",innerHTML:a}):null],p.length?l("div",{class:"vp-features"},p.map(({icon:h,title:_,details:y,link:P})=>{const E=[l("h3",{class:"vp-feature-title"},[l(ze,{icon:h}),l("span",{innerHTML:_})]),l("p",{class:"vp-feature-details",innerHTML:y})];return P?rr(P)?l("a",{class:"vp-feature-item link",href:P,role:"navigation","aria-label":_,target:"_blank"},E):l(Ve,{class:"vp-feature-item link",to:P,role:"navigation","aria-label":_},()=>E):l("div",{class:"vp-feature-item"},E)})):null])])};Fu.displayName="FeaturePanel";var Gl=Fu,fh=B({name:"HeroInfo",slots:Object,setup(e,{slots:t}){const n=we(),o=Un(),r=T(()=>n.value.heroFullScreen??!1),i=T(()=>{const{heroText:u,tagline:p}=n.value;return{text:u??o.value.title??"Hello",tagline:p??o.value.description??"",isFullScreen:r.value}}),a=T(()=>{const{heroText:u,heroImage:p,heroImageDark:f,heroAlt:v,heroImageStyle:h}=n.value;return{image:p?Ie(p):null,imageDark:f?Ie(f):null,heroStyle:h,alt:v||u||"hero image",isFullScreen:r.value}}),s=T(()=>{const{bgImage:u,bgImageDark:p,bgImageStyle:f}=n.value;return{image:St(u)?Ie(u):null,imageDark:St(p)?Ie(p):null,bgStyle:f,isFullScreen:r.value}}),c=T(()=>n.value.actions??[]);return()=>{var u,p,f;return l("header",{class:["vp-hero-info-wrapper",{fullscreen:r.value}]},[((u=t.heroBg)==null?void 0:u.call(t,s.value))||[s.value.image?l("div",{class:["vp-hero-mask",{light:s.value.imageDark}],style:[{"background-image":`url(${s.value.image})`},s.value.bgStyle]}):null,s.value.imageDark?l("div",{class:"vp-hero-mask dark",style:[{"background-image":`url(${s.value.imageDark})`},s.value.bgStyle]}):null],l("div",{class:"vp-hero-info"},[((p=t.heroImage)==null?void 0:p.call(t,a.value))||l(he,{appear:!0,type:"group"},()=>[a.value.image?l("img",{key:"light",class:["vp-hero-image",{light:a.value.imageDark}],style:a.value.heroStyle,src:a.value.image,alt:a.value.alt}):null,a.value.imageDark?l("img",{key:"dark",class:"vp-hero-image dark",style:a.value.heroStyle,src:a.value.imageDark,alt:a.value.alt}):null]),((f=t.heroInfo)==null?void 0:f.call(t,i.value))??l("div",{class:"vp-hero-infos"},[i.value.text?l(he,{appear:!0,delay:.04},()=>l("h1",{id:"main-title"},i.value.text)):null,i.value.tagline?l(he,{appear:!0,delay:.08},()=>l("p",{class:"vp-description",innerHTML:i.value.tagline})):null,c.value.length?l(he,{appear:!0,delay:.12},()=>l("p",{class:"vp-actions"},c.value.map(v=>l(We,{class:["vp-action",v.type||"default"],config:v,noExternalLinkIcon:!0})))):null])])])}}});const Hu=(e,{slots:t})=>{var v,h,_;const{bgImage:n,bgImageDark:o,bgImageStyle:r,color:i,description:a,image:s,imageDark:c,header:u,highlights:p=[],type:f="un-order"}=e;return l("div",{class:"vp-highlight-wrapper",style:i?{color:i}:{}},[n?l("div",{class:["vp-highlight-bg",{light:o}],style:[{"background-image":`url(${n})`},r]}):null,o?l("div",{class:"vp-highlight-bg dark",style:[{"background-image":`url(${o})`},r]}):null,l("div",{class:"vp-highlight"},[((v=t.image)==null?void 0:v.call(t,e))||[s?l("img",{class:["vp-highlight-image",{light:c}],src:Ie(s),alt:u}):null,c?l("img",{class:"vp-highlight-image dark",src:Ie(c),alt:u}):null],((h=t.info)==null?void 0:h.call(t,e))||[l("div",{class:"vp-highlight-info-wrapper"},l("div",{class:"vp-highlight-info"},[u?l("h2",{class:"vp-highlight-header",innerHTML:u}):null,a?l("p",{class:"vp-highlight-description",innerHTML:a}):null,((_=t.highlights)==null?void 0:_.call(t,p))||l(f==="order"?"ol":f==="no-order"?"dl":"ul",{class:"vp-highlights"},p.map(({icon:y,title:P,details:E,link:k})=>{const A=[l(f==="no-order"?"dt":"h3",{class:"vp-highlight-title"},[y?l(ze,{class:"vp-highlight-icon",icon:y}):null,l("span",{innerHTML:P})]),E?l(f==="no-order"?"dd":"p",{class:"vp-highlight-details",innerHTML:E}):null];return l(f==="no-order"?"div":"li",{class:["vp-highlight-item-wrapper",{link:k}]},k?y2(k)?l("a",{class:"vp-highlight-item link",href:k,role:"navigation","aria-label":P,target:"_blank"},A):l(Ve,{class:"vp-highlight-item link",to:k,role:"navigation","aria-label":P},()=>A):l("div",{class:"vp-highlight-item"},A))}))]))]])])};Hu.displayName="HighlightPanel";var vh=Hu,hh=B({name:"HomePage",slots:Object,setup(e,{slots:t}){const n=Gn(),o=we(),r=T(()=>{const{features:a}=o.value;return G(a)?a:null}),i=T(()=>{const{highlights:a}=o.value;return G(a)?a:null});return()=>{var a,s,c,u;return l("main",{id:"main-content",class:["vp-project-home ",{pure:n.value}],"aria-labelledby":o.value.heroText===null?"":"main-title"},[(a=t.top)==null?void 0:a.call(t),l(fh),((s=i.value)==null?void 0:s.map(p=>"features"in p?l(Gl,p):l(vh,p)))||(r.value?l(he,{appear:!0,delay:.24},()=>l(Gl,{features:r.value})):null),(c=t.center)==null?void 0:c.call(t),l(he,{appear:!0,delay:.32},()=>l(aa)),(u=t.bottom)==null?void 0:u.call(t)])}}}),mh=B({name:"BreadCrumb",setup(){const e=Fe(),t=ce(),n=At(),o=we(),r=ue(),i=$e([]),a=T(()=>(o.value.breadcrumb||o.value.breadcrumb!==!1&&r.value.breadcrumb!==!1)&&i.value.length>1),s=T(()=>o.value.breadcrumbIcon||o.value.breadcrumbIcon!==!1&&r.value.breadcrumbIcon!==!1),c=()=>{const u=e.getRoutes(),p=dh(t.value.path,n.value).map(({link:f,name:v})=>{const h=u.find(_=>_.path===f);if(h){const{meta:_,path:y}=$n(e,h.path);return{title:_[ye.shortTitle]||_[ye.title]||v,icon:_[ye.icon],path:y}}return null}).filter(f=>f!==null);p.length>1&&(i.value=p)};return ge(()=>{ae(()=>t.value.path,c,{immediate:!0})}),()=>l("nav",{class:["vp-breadcrumb",{disable:!a.value}]},a.value?l("ol",{vocab:"https://schema.org/",typeof:"BreadcrumbList"},i.value.map((u,p)=>l("li",{class:{"is-active":i.value.length-1===p},property:"itemListElement",typeof:"ListItem"},[l(Ve,{to:u.path,property:"item",typeof:"WebPage"},()=>[s.value?l(ze,{icon:u.icon}):null,l("span",{property:"name"},u.title||"Unknown")]),l("meta",{property:"position",content:p+1})]))):[])}});const Kl=e=>{const t=Fe();return e===!1?!1:ie(e)?On(t,e,!0):zi(e)?e:null},pi=(e,t,n)=>{const o=e.findIndex(r=>r.link===t);if(o!==-1){const r=e[o+n];return r!=null&&r.link?r:null}for(const r of e)if(r.children){const i=pi(r.children,t,n);if(i)return i}return null};var gh=B({name:"PageNav",setup(){const e=ue(),t=we(),n=ra(),o=ce(),r=To(),i=T(()=>{const s=Kl(t.value.prev);return s===!1?null:s||(e.value.prevLink===!1?null:pi(n.value,o.value.path,-1))}),a=T(()=>{const s=Kl(t.value.next);return s===!1?null:s||(e.value.nextLink===!1?null:pi(n.value,o.value.path,1))});return Re("keydown",s=>{s.altKey&&(s.key==="ArrowRight"?a.value&&(r(a.value.link),s.preventDefault()):s.key==="ArrowLeft"&&i.value&&(r(i.value.link),s.preventDefault()))}),()=>i.value||a.value?l("nav",{class:"vp-page-nav"},[i.value?l(We,{class:"prev",config:i.value},()=>{var s,c;return[l("div",{class:"hint"},[l("span",{class:"arrow start"}),e.value.metaLocales.prev]),l("div",{class:"link"},[l(ze,{icon:(s=i.value)==null?void 0:s.icon}),(c=i.value)==null?void 0:c.text])]}):null,a.value?l(We,{class:"next",config:a.value},()=>{var s,c;return[l("div",{class:"hint"},[e.value.metaLocales.next,l("span",{class:"arrow end"})]),l("div",{class:"link"},[(s=a.value)==null?void 0:s.text,l(ze,{icon:(c=a.value)==null?void 0:c.icon})])]}):null]):null}});const _h={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},bh=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:o,editLinkPattern:r})=>{if(!o)return null;const i=xc(e);let a;return r?a=r:i!==null&&(a=_h[i]),a?a.replace(/:repo/,Jt(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,oc(`${Fi(n)}/${o}`)):null},yh=()=>{const e=ue(),t=ce(),n=we();return T(()=>{const{repo:o,docsRepo:r=o,docsBranch:i="main",docsDir:a="",editLink:s,editLinkPattern:c=""}=e.value;if(!(n.value.editLink??s??!0)||!r)return null;const u=bh({docsRepo:r,docsBranch:i,docsDir:a,editLinkPattern:c,filePathRelative:t.value.filePathRelative});return u?{text:e.value.metaLocales.editLink,link:u}:null})},Eh=()=>{const e=Un(),t=ue(),n=ce(),o=we();return T(()=>{var r,i;return!(o.value.lastUpdated??t.value.lastUpdated??!0)||!((r=n.value.git)!=null&&r.updatedTime)?null:new Date((i=n.value.git)==null?void 0:i.updatedTime).toLocaleString(e.value.lang)})},wh=()=>{const e=ue(),t=ce(),n=we();return T(()=>{var o;return n.value.contributors??e.value.contributors??!0?((o=t.value.git)==null?void 0:o.contributors)??null:null})};var Ah=B({name:"PageTitle",setup(){const e=ce(),t=we(),n=ue(),{info:o,items:r}=Iv();return()=>l("div",{class:"vp-page-title"},[l("h1",[n.value.titleIcon===!1?null:l(ze,{icon:t.value.icon}),e.value.title]),l($u,{info:o.value,...r.value===null?{}:{items:r.value}}),l("hr")])}});const ju=()=>l(re,{name:"edit"},()=>[l("path",{d:"M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"}),l("path",{d:"M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"})]);ju.displayName="EditIcon";var Th=B({name:"PageMeta",setup(){const e=ue(),t=yh(),n=Eh(),o=wh();return()=>{const{metaLocales:r}=e.value;return l("footer",{class:"page-meta"},[t.value?l("div",{class:"meta-item edit-link"},l(We,{class:"label",config:t.value},{before:()=>l(ju)})):null,l("div",{class:"meta-item git-info"},[n.value?l("div",{class:"update-time"},[l("span",{class:"label"},`${r.lastUpdated}: `),l(hr,()=>l("span",{class:"info"},n.value))]):null,o.value&&o.value.length?l("div",{class:"contributors"},[l("span",{class:"label"},`${r.contributors}: `),o.value.map(({email:i,name:a},s)=>[l("span",{class:"contributor",title:`email: ${i}`},a),s!==o.value.length-1?",":""])]):null])])}}}),Ih=B({name:"NormalPage",slots:Object,setup(e,{slots:t}){const n=we(),o=ce(),{isDarkmode:r}=Po(),i=ue(),a=T(()=>n.value.toc||n.value.toc!==!1&&i.value.toc!==!1);return()=>l("main",{id:"main-content",class:"vp-page"},l(Ye("LocalEncrypt")?Je("LocalEncrypt"):Tc,()=>{var s,c,u,p;return[(s=t.top)==null?void 0:s.call(t),n.value.cover?l("img",{class:"page-cover",src:Ie(n.value.cover),alt:o.value.title,"no-view":""}):null,l(mh),l(Ah),a.value?l(Nu,{headerDepth:n.value.headerDepth??i.value.headerDepth??2},{before:()=>{var f;return(f=t.tocBefore)==null?void 0:f.call(t)},after:()=>{var f;return(f=t.tocAfter)==null?void 0:f.call(t)}}):null,(c=t.contentBefore)==null?void 0:c.call(t),l(aa),(u=t.contentAfter)==null?void 0:u.call(t),l(Th),l(gh),Ye("CommentService")?l(Je("CommentService"),{darkmode:r.value}):null,(p=t.bottom)==null?void 0:p.call(t)]}))}}),Ph=B({name:"Layout",setup(){const e=hn(),t=ue(),n=ce(),o=we(),{isMobile:r}=Io(),i=T(()=>{var a,s;return((a=t.value.blog)==null?void 0:a.sidebarDisplay)||((s=e.value.blog)==null?void 0:s.sidebarDisplay)||"mobile"});return()=>[l(la),l(ia,{},{default:()=>o.value.home?l(hh):l(ph,()=>l(Ih,{key:n.value.path})),...i.value!=="none"?{navScreenBottom:()=>l(Je("BloggerInfo"))}:{},...!r.value&&i.value==="always"?{sidebar:()=>l(Je("BloggerInfo"))}:{}})]}}),Oh=B({name:"NotFoundHint",setup(){const e=ue(),t=()=>{const n=e.value.routeLocales.notFoundMsg;return n[Math.floor(Math.random()*n.length)]};return()=>l("div",{class:"not-found-hint"},[l("p",{class:"error-code"},"404"),l("h1",{class:"error-title"},e.value.routeLocales.notFoundTitle),l("p",{class:"error-hint"},t())])}}),kh=B({name:"NotFound",slots:Object,setup(e,{slots:t}){const n=At(),o=ue(),{navigate:r}=ri({to:o.value.home??n.value});return()=>[l(la),l(ia,{noSidebar:!0},()=>{var i;return l("main",{id:"main-content",class:"vp-page not-found"},((i=t.default)==null?void 0:i.call(t))||[l(Oh),l("div",{class:"actions"},[l("button",{type:"button",class:"action-button",onClick:()=>{window.history.go(-1)}},o.value.routeLocales.back),l("button",{type:"button",class:"action-button",onClick:()=>r()},o.value.routeLocales.home)])])})]}});const Lh={GitHub:'',Wechat:'',Email:'',Discord:'',RSS:''},Rh={category:{"/":{path:"/category/",map:{工具:{path:"/category/%E5%B7%A5%E5%85%B7/",keys:["v-af1fbe54","v-b90f383c","v-22230056","v-bdd9cae6","v-63cd7175","v-1ace0584","v-78ae0f01","v-21f30b82","v-0094e0b6","v-a580c466","v-e381b74e","v-72653828","v-5e3d84de","v-333dd8ee","v-69739db8","v-39faf312","v-0418b0dc","v-491d5d68","v-346c34d4","v-5ae43900","v-1f0840b1","v-730defc4","v-26a023fe"]},自动化:{path:"/category/%E8%87%AA%E5%8A%A8%E5%8C%96/",keys:["v-24bf700c","v-61d0df0c","v-5a064ff2","v-d8439540","v-302b03de","v-1004794e","v-73041b3a","v-b3818c3c","v-6222deab"]},系统:{path:"/category/%E7%B3%BB%E7%BB%9F/",keys:["v-df55a79e","v-313c5888","v-18a7959b","v-4576f198","v-c914fd10","v-0d41d5d0","v-009a3fd6"]},网络:{path:"/category/%E7%BD%91%E7%BB%9C/",keys:["v-273cf11f","v-7463267c","v-77515ff2","v-5ad6240c","v-a3025528","v-5da24c3c","v-e6f7cb8e"]},服务器:{path:"/category/%E6%9C%8D%E5%8A%A1%E5%99%A8/",keys:["v-579c385c","v-28c3d540"]},博客:{path:"/category/%E5%8D%9A%E5%AE%A2/",keys:["v-6eacd3db","v-9029f640","v-63fefb94","v-adf0c772","v-24d2d83a","v-06691c4f"]},头脑驿站:{path:"/category/%E5%A4%B4%E8%84%91%E9%A9%BF%E7%AB%99/",keys:["v-6eacd3db","v-0a6bc026"]}}}},tag:{"/":{path:"/tag/",map:{微信:{path:"/tag/%E5%BE%AE%E4%BF%A1/",keys:["v-26a023fe"]},rss:{path:"/tag/rss/",keys:["v-61d0df0c","v-5a064ff2","v-d8439540","v-302b03de","v-73041b3a","v-b3818c3c","v-6222deab"]},Feed43:{path:"/tag/feed43/",keys:["v-6222deab"]},FeedEx:{path:"/tag/feedex/",keys:["v-6222deab"]},office:{path:"/tag/office/",keys:["v-009a3fd6"]},OneNote:{path:"/tag/onenote/",keys:["v-0d41d5d0"]},关机:{path:"/tag/%E5%85%B3%E6%9C%BA/",keys:["v-c914fd10"]},smb:{path:"/tag/smb/",keys:["v-4576f198"]},光猫:{path:"/tag/%E5%85%89%E7%8C%AB/",keys:["v-a3025528","v-5da24c3c","v-e6f7cb8e"]},CDN:{path:"/tag/cdn/",keys:["v-28c3d540"]},建站:{path:"/tag/%E5%BB%BA%E7%AB%99/",keys:["v-6eacd3db","v-24d2d83a","v-06691c4f","v-579c385c","v-28c3d540"]},Huginn:{path:"/tag/huginn/",keys:["v-73041b3a","v-b3818c3c"]},宝塔面板:{path:"/tag/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/",keys:["v-579c385c"]},Jekyll:{path:"/tag/jekyll/",keys:["v-63fefb94","v-adf0c772","v-24d2d83a","v-06691c4f"]},Github:{path:"/tag/github/",keys:["v-06691c4f"]},"Travis CI":{path:"/tag/travis-ci/",keys:["v-adf0c772"]},Docker:{path:"/tag/docker/",keys:["v-adf0c772"]},Audition:{path:"/tag/audition/",keys:["v-730defc4"]},音频:{path:"/tag/%E9%9F%B3%E9%A2%91/",keys:["v-730defc4"]},Aria2:{path:"/tag/aria2/",keys:["v-1f0840b1"]},迅雷:{path:"/tag/%E8%BF%85%E9%9B%B7/",keys:["v-1f0840b1"]},Airtable:{path:"/tag/airtable/",keys:["v-5ae43900"]},GP1700:{path:"/tag/gp1700/",keys:["v-a3025528"]},koolproxy:{path:"/tag/koolproxy/",keys:["v-5ad6240c"]},IPTV:{path:"/tag/iptv/",keys:["v-77515ff2"]},语音输入:{path:"/tag/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5/",keys:["v-1004794e"]},OpenVPN:{path:"/tag/openvpn/",keys:["v-7463267c"]},内网穿透:{path:"/tag/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/",keys:["v-7463267c"]},RSSHub:{path:"/tag/rsshub/",keys:["v-d8439540","v-302b03de"]},scrcpy:{path:"/tag/scrcpy/",keys:["v-346c34d4"]},投屏:{path:"/tag/%E6%8A%95%E5%B1%8F/",keys:["v-346c34d4"]},WIFI:{path:"/tag/wifi/",keys:["v-273cf11f"]},主板:{path:"/tag/%E4%B8%BB%E6%9D%BF/",keys:["v-18a7959b"]},小狼毫:{path:"/tag/%E5%B0%8F%E7%8B%BC%E6%AF%AB/",keys:["v-491d5d68"]},输入法:{path:"/tag/%E8%BE%93%E5%85%A5%E6%B3%95/",keys:["v-491d5d68"]},KeePass:{path:"/tag/keepass/",keys:["v-0418b0dc"]},WordPress:{path:"/tag/wordpress/",keys:["v-9029f640","v-63fefb94"]},原则:{path:"/tag/%E5%8E%9F%E5%88%99/",keys:["v-0a6bc026"]},批评与自我批评:{path:"/tag/%E6%89%B9%E8%AF%84%E4%B8%8E%E8%87%AA%E6%88%91%E6%89%B9%E8%AF%84/",keys:["v-0a6bc026"]},nas:{path:"/tag/nas/",keys:["v-5a064ff2"]},微信红包:{path:"/tag/%E5%BE%AE%E4%BF%A1%E7%BA%A2%E5%8C%85/",keys:["v-39faf312"]},"Microsoft store":{path:"/tag/microsoft-store/",keys:["v-313c5888"]},winget:{path:"/tag/winget/",keys:["v-df55a79e"]},winstall:{path:"/tag/winstall/",keys:["v-df55a79e"]},浏览器插件:{path:"/tag/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/",keys:["v-24bf700c"]},"UI.Vision":{path:"/tag/ui.vision/",keys:["v-24bf700c"]},RPA:{path:"/tag/rpa/",keys:["v-24bf700c"]},blog:{path:"/tag/blog/",keys:["v-9029f640"]},github:{path:"/tag/github/",keys:["v-9029f640"]},VuePress:{path:"/tag/vuepress/",keys:["v-6eacd3db"]},录屏:{path:"/tag/%E5%BD%95%E5%B1%8F/",keys:["v-69739db8"]},白板:{path:"/tag/%E7%99%BD%E6%9D%BF/",keys:["v-333dd8ee"]},GTD:{path:"/tag/gtd/",keys:["v-333dd8ee"]},虚拟定位:{path:"/tag/%E8%99%9A%E6%8B%9F%E5%AE%9A%E4%BD%8D/",keys:["v-5e3d84de"]},AI:{path:"/tag/ai/",keys:["v-22230056","v-72653828"]},VITS:{path:"/tag/vits/",keys:["v-72653828"]},声音克隆:{path:"/tag/%E5%A3%B0%E9%9F%B3%E5%85%8B%E9%9A%86/",keys:["v-72653828"]},games:{path:"/tag/games/",keys:["v-e381b74e"]},Free:{path:"/tag/free/",keys:["v-b90f383c"]},域名:{path:"/tag/%E5%9F%9F%E5%90%8D/",keys:["v-b90f383c"]},白嫖:{path:"/tag/%E7%99%BD%E5%AB%96/",keys:["v-b90f383c"]},画画:{path:"/tag/%E7%94%BB%E7%94%BB/",keys:["v-22230056"]},stableDiffusion:{path:"/tag/stablediffusion/",keys:["v-22230056"]},百宝箱:{path:"/tag/%E7%99%BE%E5%AE%9D%E7%AE%B1/",keys:["v-af1fbe54"]},合集:{path:"/tag/%E5%90%88%E9%9B%86/",keys:["v-af1fbe54"]},外站资源:{path:"/tag/%E5%A4%96%E7%AB%99%E8%B5%84%E6%BA%90/",keys:["v-af1fbe54"]},直播:{path:"/tag/%E7%9B%B4%E6%92%AD/",keys:["v-bdd9cae6","v-63cd7175","v-1ace0584","v-78ae0f01","v-21f30b82","v-0094e0b6","v-a580c466"]},OBS:{path:"/tag/obs/",keys:["v-63cd7175","v-1ace0584","v-78ae0f01"]}}}}},Sh={article:{"/":{path:"/article/",keys:["v-af1fbe54","v-b90f383c","v-22230056","v-0d25d1e4","v-7b101d14","v-2c379a13","v-12e41b33","v-bdd9cae6","v-63cd7175","v-1ace0584","v-78ae0f01","v-21f30b82","v-0094e0b6","v-a580c466","v-e381b74e","v-72653828","v-5e3d84de","v-333dd8ee","v-69739db8","v-6eacd3db","v-9029f640","v-24bf700c","v-df55a79e","v-61d0df0c","v-313c5888","v-39faf312","v-5a064ff2","v-0a6bc026","v-63fefb94","v-0418b0dc","v-491d5d68","v-18a7959b","v-273cf11f","v-d8439540","v-346c34d4","v-302b03de","v-7463267c","v-1004794e","v-73041b3a","v-77515ff2","v-5ad6240c","v-a3025528","v-5ae43900","v-1f0840b1","v-730defc4","v-adf0c772","v-24d2d83a","v-06691c4f","v-579c385c","v-b3818c3c","v-28c3d540","v-5da24c3c","v-e6f7cb8e","v-4576f198","v-c914fd10","v-0d41d5d0","v-009a3fd6","v-6222deab","v-26a023fe"]}},star:{"/":{path:"/star/",keys:["v-af1fbe54","v-b90f383c","v-22230056","v-346c34d4","v-1f0840b1"]}},timeline:{"/":{path:"/timeline/",keys:["v-af1fbe54","v-b90f383c","v-22230056","v-0d25d1e4","v-7b101d14","v-2c379a13","v-12e41b33","v-bdd9cae6","v-63cd7175","v-1ace0584","v-78ae0f01","v-21f30b82","v-0094e0b6","v-a580c466","v-e381b74e","v-72653828","v-5e3d84de","v-333dd8ee","v-69739db8","v-6eacd3db","v-9029f640","v-24bf700c","v-df55a79e","v-61d0df0c","v-313c5888","v-39faf312","v-5a064ff2","v-0a6bc026","v-63fefb94","v-0418b0dc","v-491d5d68","v-18a7959b","v-273cf11f","v-d8439540","v-346c34d4","v-302b03de","v-7463267c","v-1004794e","v-73041b3a","v-77515ff2","v-5ad6240c","v-a3025528","v-5ae43900","v-1f0840b1","v-730defc4","v-adf0c772","v-24d2d83a","v-06691c4f","v-579c385c","v-b3818c3c","v-28c3d540","v-5da24c3c","v-e6f7cb8e","v-4576f198","v-c914fd10","v-0d41d5d0","v-009a3fd6","v-6222deab","v-26a023fe"]}}},ql=K(Rh),Wu=(e="")=>{const t=ce(),n=Fe(),o=At();return T(()=>{var c;const r=e||((c=we().value.blog)==null?void 0:c.key)||"";if(!r)return console.warn("useBlogCategory: key not found"),{path:"/",map:{}};const i=n.getRoutes();if(!ql.value[r])throw new Error(`useBlogCategory: key ${r} is invalid`);const a=ql.value[r][o.value],s={path:a.path,map:{}};for(const u in a.map){const p=a.map[u];s.map[u]={path:p.path,items:[]};for(const f of p.keys){const v=i.find(({name:h})=>h===f);if(v){const h=$n(n,v.path);s.map[u].items.push({path:h.path,info:h.meta})}}t.value.path===p.path&&(s.currentItems=s.map[u].items)}return s})},Yl=K(Sh),Er=(e="")=>{const t=Fe(),n=At();return T(()=>{var s;const o=e||((s=we().value.blog)==null?void 0:s.key)||"";if(!o)return console.warn("useBlogType: key not found"),{path:"/",items:[]};if(!Yl.value[o])throw new Error(`useBlogType: key ${e} is invalid`);const r=t.getRoutes(),i=Yl.value[o][n.value],a={path:i.path,items:[]};for(const c of i.keys){const u=r.find(({name:p})=>p===c);if(u){const p=$n(t,u.path);a.items.push({path:p.path,info:p.meta})}}return a})};const xh="/assets/hero-197a9d2d.jpg",Uu=Symbol.for("categoryMap"),Oo=()=>{const e=de(Uu);if(!e)throw new Error("useCategoryMap() is called without provider.");return e},Dh=()=>{const e=Wu("category");ot(Uu,e)},ko=()=>{const e=hn(),t=ue();return T(()=>({...e.value.blog,...t.value.blog}))},Gu=Symbol.for("tagMap"),Lo=()=>{const e=de(Gu);if(!e)throw new Error("useTagMap() is called without provider.");return e},Ch=()=>{const e=Wu("tag");ot(Gu,e)},Vh=e=>{const t=ue();return T(()=>{const{[ye.author]:n}=e.value;return n?ho(n):n===!1?[]:ho(t.value.author,!1)})},Mh=e=>{const t=Oo();return T(()=>Lc(e.value[ye.category]).map(n=>({name:n,path:t.value.map[n].path})))},Bh=e=>{const t=Lo();return T(()=>Rc(e.value[ye.tag]).map(n=>({name:n,path:t.value.map[n].path})))},$h=e=>T(()=>{const{[ye.date]:t}=e.value;return Ui(t)}),Nh=e=>{const t=Wn(e,"info"),n=ko(),o=Vh(t),r=Mh(t),i=Bh(t),a=$h(t),s=au(),c=T(()=>({author:o.value,category:r.value,date:a.value,localizedDate:t.value[ye.localizedDate]||"",tag:i.value,isOriginal:t.value[ye.isOriginal]||!1,readingTime:t.value[ye.readingTime]||null,readingTimeLocale:t.value[ye.readingTime]&&s.value?iu(t.value[ye.readingTime],s.value):null,pageview:e.path})),u=T(()=>n.value.articleInfo);return{info:c,items:u}},Ku=Symbol(""),Ro=()=>{const e=de(Ku);if(!e)throw new Error("useArticles() is called without provider.");return e},zh=()=>{const e=Er("article");ot(Ku,e)},qu=Symbol(""),sa=()=>{const e=de(qu);if(!e)throw new Error("useStars() is called without provider.");return e},Fh=()=>{const e=Er("star");ot(qu,e)},Yu=Symbol(""),ca=()=>{const e=de(Yu);if(!e)throw new Error("useTimelines() is called without provider.");return e},Hh=()=>{const e=Er("timeline"),t=T(()=>{const n=[];return e.value.items.forEach(({info:o,path:r})=>{const i=Ui(o[ye.date]),a=i==null?void 0:i.getFullYear(),s=i?i.getMonth()+1:null,c=i==null?void 0:i.getDate();a&&s&&c&&((!n[0]||n[0].year!==a)&&n.unshift({year:a,items:[]}),n[0].items.push({date:`${s}/${c}`,info:o,path:r}))}),{...e.value,config:n.reverse()}});ot(Yu,t)},jh=()=>{zh(),Dh(),Fh(),Ch(),Hh()};var Wh=B({name:"SocialMedia",setup(){const e=ko(),t=Gn(),n=T(()=>{const o=e.value.medias;return o?wo(o).map(([r,i])=>({name:r,icon:Lh[r],url:i})):[]});return()=>n.value.length?l("div",{class:"vp-social-medias"},n.value.map(({name:o,icon:r,url:i})=>l("a",{class:"vp-social-media",href:i,rel:"noopener noreferrer",target:"_blank","aria-label":o,...t.value?{}:{"data-balloon-pos":"up"},innerHTML:r}))):null}}),ua=B({name:"BloggerInfo",setup(){const e=ko(),t=Un(),n=ue(),o=Ro(),r=Oo(),i=Lo(),a=ca(),s=To(),c=T(()=>{var v;return e.value.name||((v=ho(n.value.author)[0])==null?void 0:v.name)||t.value.title}),u=T(()=>e.value.avatar||n.value.logo),p=T(()=>n.value.blogLocales),f=T(()=>e.value.intro);return()=>{const{article:v,category:h,tag:_,timeline:y}=p.value,P=[[o.value.path,o.value.items.length,v],[r.value.path,wt(r.value.map).length,h],[i.value.path,wt(i.value.map).length,_],[a.value.path,a.value.items.length,y]];return l("div",{class:"vp-blogger-info",vocab:"https://schema.org/",typeof:"Person"},[l("div",{class:"vp-blogger",...f.value?{style:{cursor:"pointer"},"aria-label":p.value.intro,"data-balloon-pos":"down",role:"navigation",onClick:()=>s(f.value)}:{}},[u.value?l("img",{class:["vp-blogger-avatar",{round:e.value.roundAvatar}],src:Ie(u.value),property:"image",alt:"Blogger Avatar"}):null,c.value?l("div",{class:"vp-blogger-name",property:"name"},c.value):null,e.value.description?l("div",{class:"vp-blogger-description",innerHTML:e.value.description}):null,f.value?l("meta",{property:"url",content:Ie(f.value)}):null]),l("div",{class:"vp-blog-counts"},P.map(([E,k,A])=>l(Ve,{class:"vp-blog-count",to:E},()=>[l("div",{class:"count"},k),l("div",A)]))),l(Wh)])}}});const di=()=>l(re,{name:"category"},()=>l("path",{d:"M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"}));di.displayName="CategoryIcon";const fi=()=>l(re,{name:"tag"},()=>l("path",{d:"M939.902 458.563L910.17 144.567c-1.507-16.272-14.465-29.13-30.737-30.737L565.438 84.098h-.402c-3.215 0-5.726 1.005-7.634 2.913l-470.39 470.39a10.004 10.004 0 000 14.164l365.423 365.424c1.909 1.908 4.42 2.913 7.132 2.913s5.223-1.005 7.132-2.913l470.39-470.39c2.01-2.11 3.014-5.023 2.813-8.036zm-240.067-72.121c-35.458 0-64.286-28.828-64.286-64.286s28.828-64.285 64.286-64.285 64.286 28.828 64.286 64.285-28.829 64.286-64.286 64.286z"}));fi.displayName="TagIcon";const pa=()=>l(re,{name:"timeline"},()=>l("path",{d:"M511.997 70.568c-243.797 0-441.429 197.633-441.429 441.435 0 243.797 197.632 441.429 441.43 441.429S953.431 755.8 953.431 512.002c0-243.796-197.637-441.434-441.435-441.434zm150.158 609.093-15.605 15.61c-8.621 8.615-22.596 8.615-31.215 0L472.197 552.126c-4.95-4.944-4.34-14.888-4.34-24.677V247.14c0-12.19 9.882-22.07 22.07-22.07h22.07c12.19 0 22.07 9.882 22.07 22.07v273.218l128.088 128.088c8.62 8.62 8.62 22.595 0 31.215zm0 0"}));pa.displayName="TimelineIcon";const Zu=()=>l(re,{name:"slides"},()=>l("path",{d:"M896 170.667v426.666a85.333 85.333 0 0 1-85.333 85.334h-256v61.184l192.597 115.584-43.861 73.13-148.736-89.173v95.275h-85.334v-95.318l-148.736 89.216-43.861-73.13 192.597-115.627v-61.141h-256A85.333 85.333 0 0 1 128 597.333V170.667H85.333V85.333h853.334v85.334H896zm-682.667 0v426.666h597.334V170.667H213.333zM426.667 512h-85.334V341.333h85.334V512zm128 0h-85.334V256h85.334v256zm128 0h-85.334V384h85.334v128z"}));Zu.displayName="SlideIcon";const Xu=()=>l(re,{name:"sticky"},()=>[l("path",{d:"m381.3 733.8l-161.9 118c-5.9 4.5-13.2 6.6-20.1 6.6-8.7 0-17.7-3.4-24.3-10-12.2-12.2-13.9-31.3-3.5-45.2l144.5-195.5-113.6-112.9c-11.1-11.1-13.2-28.4-5.5-42 5.5-8.7 52.1-76.4 155.5-51 1.8 0.3 3.5 0.3 5.6 0.7 4.2 0.3 9 0.7 14.2 1.7 21.9 3.5 60.8-13.9 94.5-42.7 32.3-27.5 53.1-59.4 53.1-81.6 0-5.2 0-10.8-0.3-16-0.7-20.8-2.1-52.8 21.5-76.4 28.1-28.1 72.9-30.6 103.9-5.2 0.6 0.3 1 1 1.7 1.7 16.7 16.3 187.5 187.2 189.3 188.9 14.5 14.6 22.9 34.4 22.9 55.3 0 20.8-8 40.2-22.9 54.8-23.7 23.6-56 22.6-77.1 21.6-4.9 0-10.5-0.4-15.7-0.4-20.8 0-45.8 14.6-70.5 41.3-34.3 37.5-55.5 85.8-53.8 107.7 0.7 6.9 2.1 19.1 2.4 20.8 25 101.4-42.7 147.6-50.7 152.8-13.9 8.4-31.6 6.3-42.7-4.8l-112.1-112.2z"})]);Xu.displayName="StickyIcon";const ar=()=>l(re,{name:"article"},()=>l("path",{d:"M853.333 938.667H170.667A42.667 42.667 0 0 1 128 896V128a42.667 42.667 0 0 1 42.667-42.667h682.666A42.667 42.667 0 0 1 896 128v768a42.667 42.667 0 0 1-42.667 42.667zm-42.666-85.334V170.667H213.333v682.666h597.334zM298.667 256h170.666v170.667H298.667V256zm0 256h426.666v85.333H298.667V512zm0 170.667h426.666V768H298.667v-85.333zm256-384h170.666V384H554.667v-85.333z"}));ar.displayName="ArticleIcon";const Ju=()=>l(re,{name:"book"},()=>l("path",{d:"M256 853.333h426.667A85.333 85.333 0 0 0 768 768V256a85.333 85.333 0 0 0-85.333-85.333H469.333a42.667 42.667 0 0 1 0-85.334h213.334A170.667 170.667 0 0 1 853.333 256v512a170.667 170.667 0 0 1-170.666 170.667H213.333A42.667 42.667 0 0 1 170.667 896V128a42.667 42.667 0 0 1 42.666-42.667h128A42.667 42.667 0 0 1 384 128v304.256l61.653-41.088a42.667 42.667 0 0 1 47.36 0l61.654 41.045V256A42.667 42.667 0 0 1 640 256v256a42.667 42.667 0 0 1-66.347 35.499l-104.32-69.547-104.32 69.547A42.667 42.667 0 0 1 298.667 512V170.667H256v682.666z"}));Ju.displayName="BookIcon";const Qu=()=>l(re,{name:"link"},()=>l("path",{d:"M460.8 584.533c17.067 17.067 17.067 42.667 0 59.734-17.067 17.066-42.667 17.066-59.733 0-85.334-85.334-85.334-217.6 0-302.934L554.667 192C640 110.933 776.533 110.933 857.6 196.267c81.067 81.066 81.067 213.333 0 294.4l-68.267 64c0-34.134-4.266-68.267-17.066-102.4l21.333-21.334c51.2-46.933 55.467-128 4.267-179.2s-128-55.466-179.2-4.266c-4.267 0-4.267 4.266-4.267 4.266L465.067 401.067c-51.2 51.2-51.2 132.266-4.267 183.466m123.733-183.466C601.6 384 627.2 384 644.267 401.067c85.333 85.333 85.333 217.6 0 302.933l-153.6 149.333C405.333 934.4 268.8 934.4 187.733 849.067c-81.066-81.067-81.066-213.334 0-294.4l68.267-64c0 34.133 4.267 72.533 17.067 102.4L251.733 614.4C204.8 665.6 204.8 746.667 256 793.6c51.2 46.933 123.733 46.933 174.933 0l149.334-149.333c51.2-51.2 51.2-128 0-179.2-12.8-17.067-17.067-46.934 4.266-64z"}));Qu.displayName="LinkIcon";const e0=()=>l(re,{name:"project"},()=>l("path",{d:"M987.456 425.152H864V295.296a36.48 36.48 0 0 0-36.544-36.544h-360l-134.08-128.256A9.344 9.344 0 0 0 327.04 128H36.48A36.48 36.48 0 0 0 0 164.544v676.608a36.48 36.48 0 0 0 36.544 36.544h797.76a36.672 36.672 0 0 0 33.92-22.848L1021.44 475.52a36.48 36.48 0 0 0-33.92-50.304zM82.304 210.304h215.424l136.64 130.752h347.328v84.096H198.848A36.672 36.672 0 0 0 164.928 448L82.304 652.8V210.304zM808.32 795.456H108.544l118.08-292.608h699.904L808.32 795.52z"}));e0.displayName="ProjectIcon";const t0=()=>l(re,{name:"friend"},()=>l("path",{d:"M860.16 213.333A268.373 268.373 0 0 0 512 186.027a267.52 267.52 0 0 0-348.16 404.48L428.8 855.893a118.613 118.613 0 0 0 166.4 0l264.96-265.386a267.52 267.52 0 0 0 0-377.174zM800 531.627l-264.96 264.96a32.427 32.427 0 0 1-46.08 0L224 530.347a183.04 183.04 0 0 1 0-256 182.187 182.187 0 0 1 256 0 42.667 42.667 0 0 0 60.587 0 182.187 182.187 0 0 1 256 0 183.04 183.04 0 0 1 3.413 256z"}));t0.displayName="FriendIcon";const vi=()=>l(re,{name:"slide-down"},()=>l("path",{d:"M108.775 312.23c13.553 0 27.106 3.734 39.153 11.806l375.205 250.338 363.641-252.808c32.587-21.624 76.499-12.83 98.123 19.757 21.685 32.467 12.95 76.56-19.576 98.184l-402.854 278.89c-23.733 15.901-54.694 15.962-78.547.12L69.501 442.097c-32.647-21.685-41.441-65.777-19.817-98.304 13.734-20.54 36.201-31.563 59.09-31.563Z"}));vi.displayName="SlideDownIcon";const n0=()=>l("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",class:"empty-icon",viewBox:"0 0 1024 1024",innerHTML:''});n0.displayName="EmptyIcon";const o0=()=>l(re,{name:"lock"},()=>l("path",{d:"M787.168 952.268H236.832c-30.395 0-55.033-24.638-55.033-55.033V429.45c0-30.395 24.638-55.034 55.033-55.034h82.55V264.35c0-106.38 86.238-192.618 192.618-192.618S704.618 157.97 704.618 264.35v110.066h82.55c30.395 0 55.033 24.639 55.033 55.034v467.785c0 30.395-24.639 55.033-55.033 55.033zM484.483 672.046v115.122h55.034V672.046c31.99-11.373 55.033-41.605 55.033-77.496 0-45.592-36.958-82.55-82.55-82.55s-82.55 36.958-82.55 82.55c0 35.89 23.042 66.123 55.033 77.496zM622.067 264.35c0-60.788-49.28-110.067-110.067-110.067s-110.067 49.28-110.067 110.067v110.066h220.135V264.35z"}));o0.displayName="LockIcon";var Uh=B({name:"ArticleItem",props:{info:{type:Object,required:!0},path:{type:String,required:!0}},slots:Object,setup(e,{slots:t}){const n=Wn(e,"info"),{info:o,items:r}=Nh(e);return()=>{var v,h,_;const{[ye.title]:i,[ye.type]:a,[ye.isEncrypted]:s=!1,[ye.cover]:c,[ye.excerpt]:u,[ye.sticky]:p}=n.value,f=o.value;return l("div",{class:"vp-article-wrapper"},l("article",{class:"vp-article-item",vocab:"https://schema.org/",typeof:"Article"},[((v=t.cover)==null?void 0:v.call(t,{cover:c}))||(c?[l("img",{class:"vp-article-cover",src:Ie(c)}),l("meta",{property:"image",content:Ie(c)})]:[]),p?l(Xu):null,l(Ve,{to:e.path},()=>{var y;return((y=t.title)==null?void 0:y.call(t,{title:i,isEncrypted:s,type:a}))||l("header",{class:"vp-article-title"},[s?l(o0):null,a===su.slide?l(Zu):null,l("span",{property:"headline"},i)])}),((h=t.excerpt)==null?void 0:h.call(t,{excerpt:u}))||(u?l("div",{class:"vp-article-excerpt",innerHTML:u}):null),l("hr",{class:"vp-article-hr"}),((_=t.info)==null?void 0:_.call(t,{info:f}))||l($u,{info:f,...r.value?{items:r.value}:{}})]))}}}),Gh=B({name:"Pagination",props:{total:{type:Number,default:10},perPage:{type:Number,default:10},current:{type:Number,default:1}},emits:["updateCurrentPage"],setup(e,{emit:t}){let n;const o=ue(),r=K(""),i=T(()=>o.value.paginationLocales),a=T(()=>Math.ceil(e.total/e.perPage)),s=T(()=>!!a.value&&a.value!==1),c=T(()=>a.value<7?!1:e.current>4),u=T(()=>a.value<7?!1:e.current{const{current:h}=e;let _=1,y=a.value;const P=[];a.value>=7&&(h<=4&&h4&&h>=a.value-3?(y=a.value,_=a.value-4):a.value>7&&(_=h-2,y=h+2));for(let E=_;E<=y;E++)P.push(E);return P}),f=h=>t("updateCurrentPage",h),v=h=>{const _=parseInt(h);_<=a.value&&_>0?f(_):n.pop(`${i.value.errorText.replace(/\$page/g,a.value.toString())}`)};return ge(()=>{n=new I2}),()=>l("div",{class:"vp-pagination"},s.value?l("div",{class:"vp-pagination-list"},[l("div",{class:"vp-pagination-number "},[e.current>1?l("div",{class:"prev",role:"navigation",unselectable:"on",onClick:()=>f(e.current-1)},i.value.prev):null,c.value?[l("div",{role:"navigation",onClick:()=>f(1)},1),l("div",{class:"ellipsis"},"...")]:null,p.value.map(h=>l("div",{key:h,class:{active:e.current===h},role:"navigation",onClick:()=>f(h)},h)),u.value?[l("div",{class:"ellipsis"},"..."),l("div",{role:"navigation",onClick:()=>f(a.value)},a.value)]:null,e.currentf(e.current+1)},i.value.next):null]),l("div",{class:"vp-pagination-nav"},[l("label",{for:"navigation-text"},`${i.value.navigate}: `),l("input",{id:"navigation-text",value:r.value,onInput:({target:h})=>{r.value=h.value},onKeydown:h=>{h.key==="Enter"&&(h.preventDefault(),v(r.value))}}),l("button",{class:"vp-pagination-button",role:"navigation",title:i.value.action,onClick:()=>v(r.value)},i.value.action)])]):[])}}),da=B({name:"ArticleList",props:{items:{type:Array,default:()=>[]}},setup(e){const t=gt(),n=Fe(),o=ko(),r=K(1),i=T(()=>o.value.articlePerPage||10),a=T(()=>e.items.slice((r.value-1)*i.value,r.value*i.value)),s=async c=>{r.value=c;const u={...t.query};if(!(u.page===c.toString()||c===1&&!u.page)&&(c===1?delete u.page:u.page=c.toString(),await n.push({path:t.path,query:u}),!0)){const{updatePageview:p}=await d(()=>import("./pageview-fb784a91.js"),[]);await p()}};return ge(()=>{const{page:c}=t.query;s(c?Number(c):1),ae(r,()=>{const u=document.querySelector("#article-list").getBoundingClientRect().top+window.scrollY;setTimeout(()=>{window.scrollTo(0,u),d(()=>import("./pageview-fb784a91.js"),[]).then(({updatePageview:p})=>p())},100)})}),()=>l("div",{id:"article-list",class:"vp-article-list"},a.value.length?[...a.value.map(({info:c,path:u},p)=>l(he,{appear:!0,delay:p*.04},()=>l(Uh,{key:u,info:c,path:u}))),l(Gh,{current:r.value,perPage:i.value,total:e.items.length,onUpdateCurrentPage:s})]:l(n0))}}),fa=B({name:"CategoryList",setup(){const e=ce(),t=Oo();return()=>l("ul",{class:"vp-category-list"},wo(t.value.map).map(([n,{path:o,items:r}])=>l("li",{class:["vp-category",`vp-category${br(n,9)}`,{active:o===e.value.path}]},l(Ve,{to:o},()=>[n,l("span",{class:"count"},r.length)]))))}}),va=B({name:"TagList",setup(){const e=we(),t=Lo(),n=o=>{var r;return o===((r=e.value.blog)==null?void 0:r.name)};return()=>l("ul",{class:"tag-list-wrapper"},wo(t.value.map).map(([o,{path:r,items:i}])=>l("li",{class:["tag",`tag${br(o,9)}`,{active:n(o)}]},l(Ve,{to:r},()=>[o,l("span",{class:"tag-num"},i.length)]))))}}),Kh=B({name:"TimelineList",setup(){const e=ue(),t=ca(),n=To(),o=T(()=>e.value.blogLocales.timeline);return()=>l("div",{class:"timeline-list-wrapper"},[l("div",{class:"timeline-list-title",onClick:()=>n(t.value.path)},[l(pa),l("span",{class:"num"},t.value.items.length),o.value]),l("hr"),l("div",{class:"timeline-content"},l("ul",{class:"timeline-list"},t.value.config.map(({year:r,items:i},a)=>l(he,{appear:!0,delay:.08*(a+1)},()=>l("li",[l("h3",{class:"timeline-year"},r),l("ul",{class:"timeline-year-wrapper"},i.map(({date:s,info:c,path:u})=>l("li",{class:"timeline-item"},[l("span",{class:"timeline-date"},s),l(Ve,{class:"timeline-title",to:u},()=>c[ye.title])])))])))))])}}),r0=B({name:"InfoList",setup(){const e=ue(),t=Ro(),n=Oo(),o=T(()=>wt(n.value.map).length),r=sa(),i=Lo(),a=T(()=>wt(i.value.map).length),s=To(),c=K("article"),u=T(()=>e.value.blogLocales),p=[["article",ar],["category",di],["tag",fi],["timeline",pa]];return()=>l("div",{class:"vp-blog-infos"},[l("div",{class:"vp-blog-type-switcher"},p.map(([f,v])=>l("button",{type:"button",class:"vp-blog-type-button",onClick:()=>{c.value=f}},l("div",{class:["icon-wrapper",{active:c.value===f}],"aria-label":u.value[f],"data-balloon-pos":"up"},l(v))))),l(he,()=>c.value==="article"?l("div",{class:"vp-sticky-article-wrapper"},[l("div",{class:"title",onClick:()=>s(t.value.path)},[l(ar),l("span",{class:"num"},t.value.items.length),u.value.article]),l("hr"),l("ul",{class:"vp-sticky-articles"},r.value.items.map(({info:f,path:v},h)=>l(he,{appear:!0,delay:.08*(h+1)},()=>l("li",{class:"vp-sticky-article"},l(Ve,{to:v},()=>f[ye.title])))))]):c.value==="category"?l("div",{class:"vp-category-wrapper"},[o.value?l("div",{class:"title",onClick:()=>s(n.value.path)},[l(di),l("span",{class:"num"},o.value),u.value.category]):null,l("hr"),l(he,{delay:.04},()=>l(fa))]):c.value==="tag"?l("div",{class:"vp-tag-wrapper"},[a.value?l("div",{class:"title",onClick:()=>s(i.value.path)},[l(fi),l("span",{class:"num"},a.value),u.value.tag]):null,l("hr"),l(he,{delay:.04},()=>l(va))]):l(he,()=>l(Kh)))])}}),wr=B({name:"BlogWrapper",slots:Object,setup(e,{slots:t}){const{isMobile:n}=Io();return()=>[l(la),l(ia,{noSidebar:!0,noToc:!0},{default:()=>t.default(),navScreenBottom:()=>l(ua),...n.value?{sidebar:()=>l(r0)}:{}})]}});const i0=()=>l("aside",{class:"vp-blog-info-wrapper"},[l(he,()=>l(ua)),l(he,{delay:.04},()=>l(r0))]);i0.displayName="InfoPanel";var Ar=i0,qh=B({name:"BlogPage",components:{CategoryList:fa,TagList:va},setup(){const e=ce(),t=we(),n=Oo(),o=Lo(),r=T(()=>t.value.blog||{}),i=T(()=>{const{key:s=""}=r.value;return s==="category"?"CategoryList":s==="tag"?"TagList":null}),a=T(()=>{const{name:s="",key:c=""}=r.value;return c==="category"?s?n.value.map[s].items:[]:c==="tag"?s?o.value.map[s].items:[]:[]});return()=>l(wr,()=>l("div",{class:"vp-page vp-blog"},l("div",{class:"blog-page-wrapper"},[l("main",{id:"main-content",class:"vp-blog-main"},[l(he,()=>i.value?l(Je(i.value)):null),r.value.name?l(he,{appear:!0,delay:.24},()=>l(da,{key:e.value.path,items:a.value})):null]),l(he,{delay:.16},()=>l(Ar,{key:"blog"}))])))}}),Yh=B({name:"BlogHero",slots:Object,setup(e,{slots:t}){const n=we(),o=Un(),r=$e(),i=T(()=>n.value.heroFullScreen??!1),a=T(()=>{const{heroText:c,heroImage:u,heroImageDark:p,heroAlt:f,heroImageStyle:v,tagline:h}=n.value;return{text:c??o.value.title??"Hello",image:u?Ie(u):null,imageDark:p?Ie(p):null,heroStyle:v,alt:f||c||"hero image",tagline:h??"",isFullScreen:i.value}}),s=T(()=>{const{bgImage:c,bgImageDark:u,bgImageStyle:p}=n.value;return{image:ie(c)?Ie(c):c===!1?null:xh,imageDark:ie(u)?Ie(u):null,bgStyle:p,isFullScreen:i.value}});return()=>{var c,u;return n.value.hero===!1?null:l("div",{ref:r,class:["vp-blog-hero",{fullscreen:i.value,"no-bg":!s.value.image}]},[((c=t.heroBg)==null?void 0:c.call(t,s.value))||[s.value.image?l("div",{class:["vp-blog-mask",{light:s.value.imageDark}],style:[{background:`url(${s.value.image}) center/cover no-repeat`},s.value.bgStyle]}):null,s.value.imageDark?l("div",{class:"vp-blog-mask dark",style:[{background:`url(${s.value.imageDark}) center/cover no-repeat`},s.value.bgStyle]}):null],((u=t.heroInfo)==null?void 0:u.call(t,a.value))||[l(he,{appear:!0,type:"group",delay:.04},()=>[a.value.image?l("img",{key:"light",class:["vp-blog-hero-image",{light:a.value.imageDark}],style:a.value.heroStyle,src:a.value.image,alt:a.value.alt}):null,a.value.imageDark?l("img",{key:"dark",class:"vp-blog-hero-image dark",style:a.value.heroStyle,src:a.value.imageDark,alt:a.value.alt}):null]),l(he,{appear:!0,delay:.08},()=>a.value.text?l("h1",{class:"vp-blog-hero-title"},a.value.text):null),l(he,{appear:!0,delay:.12},()=>a.value.tagline?l("p",{class:"vp-blog-hero-description",innerHTML:a.value.tagline}):null)],a.value.isFullScreen?l("button",{type:"button",class:"slide-down-button",onClick:()=>{window.scrollTo({top:r.value.clientHeight,behavior:"smooth"})}},[l(vi),l(vi)]):null])}}});const Zh=["link","article","book","project","friend"];var Xh=B({name:"ProjectPanel",components:{ArticleIcon:ar,BookIcon:Ju,FriendIcon:t0,LinkIcon:Qu,ProjectIcon:e0},setup(){const e=we(),t=Gn(),n=To(),o=(r="",i="icon")=>Zh.includes(r)?l(Je(`${r}-icon`)):Jt(r)?l("img",{class:"vp-project-image",src:r,alt:i}):yr(r)?l("img",{class:"vp-project-image",src:Ie(r),alt:i}):l(ze,{icon:r});return()=>{var r;return(r=e.value.projects)!=null&&r.length?l("div",{class:"vp-project-panel"},e.value.projects.map(({icon:i,link:a,name:s,desc:c},u)=>l("div",{class:["vp-project-card",{[`project${u%9}`]:!t.value}],onClick:()=>n(a)},[o(i,s),l("div",{class:"vp-project-name"},s),l("div",{class:"vp-project-desc"},c)]))):null}}}),Jh=B({name:"BlogHome",setup(){const e=Ro();return()=>l("div",{class:"vp-page vp-blog"},[l(Yh),l("div",{class:"blog-page-wrapper"},[l("main",{id:"main-content",class:"vp-blog-main"},[l(he,{appear:!0,delay:.16},()=>l(Xh)),l(he,{appear:!0,delay:.24},()=>l(da,{items:e.value.items}))]),l(he,{appear:!0,delay:.16},()=>l(Ar,{key:"blog"}))]),l(he,{appear:!0,delay:.28},()=>l(aa))])}}),Qh=B({name:"BlogHome",setup(){return()=>l(wr,()=>l(Jh))}}),a0=B({name:"ArticleType",setup(){const e=ce(),t=At(),n=ue(),o=Ro(),r=sa(),i=T(()=>{const a=n.value.blogLocales;return[{text:a.all,path:o.value.path},{text:a.star,path:r.value.path},...[].map(({key:s,path:c})=>({text:a[s],path:c.replace(/^\//,t.value)}))]});return()=>l("ul",{class:"vp-article-type-wrapper"},i.value.map(a=>l("li",{class:["vp-article-type",{active:a.path===e.value.path}]},l(Ve,{to:a.path},()=>a.text))))}}),e3=B({name:"BlogPage",setup(){const e=Er(),t=we(),n=ce(),o=Ro(),r=sa(),i=T(()=>{const{key:a="",type:s}=t.value.blog||{};return a==="star"?r.value.items:s==="type"&&a?e.value.items:o.value.items});return()=>l(wr,()=>l("div",{class:"vp-page vp-blog"},l("div",{class:"blog-page-wrapper"},[l("main",{id:"main-content",class:"vp-blog-main"},[l(he,()=>l(a0)),l(he,{appear:!0,delay:.24},()=>l(da,{key:n.value.path,items:i.value}))]),l(he,{delay:.16},()=>l(Ar,{key:"blog"}))])))}}),t3=B({name:"TimelineItems",setup(){const e=ko(),t=ue(),n=ca(),o=T(()=>e.value.timeline||t.value.blogLocales.timelineTitle),r=T(()=>n.value.config.map(({year:i})=>({title:i.toString(),level:2,slug:i.toString(),children:[]})));return()=>l("div",{class:"timeline-wrapper"},l("ul",{class:"timeline-content"},[l(he,()=>l("li",{class:"motto"},o.value)),l(Nu,{items:r.value}),n.value.config.map(({year:i,items:a},s)=>l(he,{appear:!0,delay:.08*(s+1),type:"group"},()=>[l("h3",{key:"title",id:i,class:"timeline-year-title"},l("span",i)),l("li",{key:"content",class:"timeline-year-list"},[l("ul",{class:"timeline-year-wrapper"},a.map(({date:c,info:u,path:p})=>l("li",{class:"timeline-item"},[l("span",{class:"timeline-date"},c),l(Ve,{class:"timeline-title",to:p},()=>u[ye.title])])))])]))]))}}),n3=B({name:"Timeline",components:{ArticleType:a0,CategoryList:fa,TagList:va},setup(){return()=>l(wr,()=>l("div",{class:"vp-page vp-blog"},l("div",{class:"blog-page-wrapper"},[l("main",{id:"main-content",class:"vp-blog-main"},[l(he,{appear:!0,delay:.24},()=>l(t3))]),l(he,{delay:.16},()=>l(Ar,{key:"blog"}))])))}});Tf(ze);const o3=Qe({enhance:({app:e,router:t})=>{const{scrollBehavior:n}=t.options;t.options.scrollBehavior=async(...o)=>(await zu().wait(),n(...o)),kv(e),e.component("HopeIcon",ze),e.component("VPLink",Ve),e.component("BloggerInfo",ua)},setup:()=>{Lv(),Dv(),jh()},layouts:{Layout:Ph,NotFound:kh,BlogCategory:qh,BlogHome:Qh,BlogType:e3,Timeline:n3}}),r3=e=>{if(window.dataLayer&&window.gtag)return;const t=document.createElement("script");t.src=`https://www.googletagmanager.com/gtag/js?id=${e.id}`,t.async=!0,document.head.appendChild(t),window.dataLayer=window.dataLayer||[],window.gtag=function(){dataLayer.push(arguments)},gtag("js",new Date),e.debug?gtag("config",e.id,{debug_mode:!0}):gtag("config",e.id)},i3={id:"G-KJX26P5PQ2"},a3=Qe({enhance(){r3(i3)}}),l3=()=>l(re,{name:"heading"},()=>l("path",{d:"M250.4 704.6H64V595.4h202.4l26.2-166.6H94V319.6h214.4L352 64h127.8l-43.6 255.4h211.2L691 64h126.2l-43.6 255.4H960v109.2H756.2l-24.6 166.6H930v109.2H717L672 960H545.8l43.6-255.4H376.6L333 960H206.8l43.6-255.4zm168.4-276L394 595.4h211.2l24.6-166.6h-211z"}));l3.displayName="HeadingIcon";const s3=()=>l(re,{name:"heart"},()=>l("path",{d:"M1024 358.156C1024 195.698 892.3 64 729.844 64c-86.362 0-164.03 37.218-217.844 96.49C458.186 101.218 380.518 64 294.156 64 131.698 64 0 195.698 0 358.156 0 444.518 37.218 522.186 96.49 576H96l320 320c32 32 64 64 96 64s64-32 96-64l320-320h-.49c59.272-53.814 96.49-131.482 96.49-217.844zM841.468 481.232 517.49 805.49a2981.962 2981.962 0 0 1-5.49 5.48c-1.96-1.95-3.814-3.802-5.49-5.48L182.532 481.234C147.366 449.306 128 405.596 128 358.156 128 266.538 202.538 192 294.156 192c47.44 0 91.15 19.366 123.076 54.532L512 350.912l94.768-104.378C638.696 211.366 682.404 192 729.844 192 821.462 192 896 266.538 896 358.156c0 47.44-19.368 91.15-54.532 123.076z"}));s3.displayName="HeartIcon";const c3=()=>l(re,{name:"history"},()=>l("path",{d:"M512 1024a512 512 0 1 1 512-512 512 512 0 0 1-512 512zm0-896a384 384 0 1 0 384 384 384 384 0 0 0-384-384zm192 448H512a64 64 0 0 1-64-64V320a64 64 0 0 1 128 0v128h128a64 64 0 0 1 0 128z"}));c3.displayName="HistoryIcon";const u3=()=>l(re,{name:"title"},()=>l("path",{d:"M512 256c70.656 0 134.656 28.672 180.992 75.008A254.933 254.933 0 0 1 768 512c0 83.968-41.024 157.888-103.488 204.48C688.96 748.736 704 788.48 704 832c0 105.984-86.016 192-192 192-106.048 0-192-86.016-192-192h128a64 64 0 1 0 128 0 64 64 0 0 0-64-64 255.19 255.19 0 0 1-181.056-75.008A255.403 255.403 0 0 1 256 512c0-83.968 41.024-157.824 103.488-204.544C335.04 275.264 320 235.584 320 192A192 192 0 0 1 512 0c105.984 0 192 85.952 192 192H576a64.021 64.021 0 0 0-128 0c0 35.328 28.672 64 64 64zM384 512c0 70.656 57.344 128 128 128s128-57.344 128-128-57.344-128-128-128-128 57.344-128 128z"}));u3.displayName="TitleIcon";const ha=()=>l(re,{name:"search"},()=>l("path",{d:"M192 480a256 256 0 1 1 512 0 256 256 0 0 1-512 0m631.776 362.496-143.2-143.168A318.464 318.464 0 0 0 768 480c0-176.736-143.264-320-320-320S128 303.264 128 480s143.264 320 320 320a318.016 318.016 0 0 0 184.16-58.592l146.336 146.368c12.512 12.48 32.768 12.48 45.28 0 12.48-12.512 12.48-32.768 0-45.28"}));ha.displayName="SearchIcon";const l0=()=>l("svg",{xmlns:"http://www.w3.org/2000/svg",width:"32",height:"32",preserveAspectRatio:"xMidYMid",viewBox:"0 0 100 100"},[l("circle",{cx:"28",cy:"75",r:"11",fill:"currentColor"},l("animate",{attributeName:"fill-opacity",begin:"0s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"})),l("path",{fill:"none",stroke:"#88baf0","stroke-width":"10",d:"M28 47a28 28 0 0 1 28 28"},l("animate",{attributeName:"stroke-opacity",begin:"0.1s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"})),l("path",{fill:"none",stroke:"#88baf0","stroke-width":"10",d:"M28 25a50 50 0 0 1 50 50"},l("animate",{attributeName:"stroke-opacity",begin:"0.2s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"}))]);l0.displayName="LoadingIcon";const s0=({hint:e})=>l("div",{class:"search-pro-result-wrapper loading"},[l(l0),e]);s0.displayName="SearchLoading";const p3='',ma={searchDelay:150,suggestDelay:0,queryHistoryCount:5,resultHistoryCount:5,hotKeys:[{key:"k",ctrl:!0},{key:"/",ctrl:!0}],worker:"search-pro.worker.js"},Q3={},c0=ma.hotKeys,ga={"/":{cancel:"取消",placeholder:"搜索",search:"搜索",searching:"搜索中",defaultTitle:"文档",select:"选择",navigate:"切换",autocomplete:"自动补全",exit:"关闭",history:"搜索历史",emptyHistory:"无搜索历史",emptyResult:"没有找到结果",loading:"正在加载搜索索引..."}};new URL("data:application/javascript;base64,aW1wb3J0e3NlYXJjaCBhcyBDLGdldFN0b3JlZEZpZWxkcyBhcyBSLGF1dG9TdWdnZXN0IGFzIFQsbG9hZEpTT05JbmRleCBhcyB3fWZyb20ic2xpbXNlYXJjaCI7aW1wb3J0ICQgZnJvbSJAdGVtcC9zZWFyY2gtcHJvL2luZGV4IjtpbXBvcnR7ZW50cmllcyBhcyBFfWZyb20idnVlcHJlc3Mtc2hhcmVkL2NsaWVudCI7Y29uc3QgeD0obCxlKT0+e2NvbnN0IG49bC50b0xvd2VyQ2FzZSgpLHM9ZS50b0xvd2VyQ2FzZSgpLG89W107bGV0IHQ9MCxyPTA7Y29uc3QgaT0oYyxnPSExKT0+e2xldCBwPSIiO3I9PT0wP3A9Yy5sZW5ndGg+MjA/YOKApiAke2Muc2xpY2UoLTIwKX1gOmM6Zz9wPWMubGVuZ3RoK3I+MTAwP2Ake2Muc2xpY2UoMCwxMDAtcil94oCmIGA6YzpwPWMubGVuZ3RoPjIwP2Ake2Muc2xpY2UoMCwyMCl9IOKApiAke2Muc2xpY2UoLTIwKX1gOmMscCYmby5wdXNoKHApLHIrPXAubGVuZ3RoLGd8fChvLnB1c2goWyJtYXJrIixlXSkscis9ZS5sZW5ndGgscj49MTAwJiZvLnB1c2goIiDigKYiKSl9O2xldCBoPW4uaW5kZXhPZihzLHQpO2lmKGg9PT0tMSlyZXR1cm4gbnVsbDtmb3IoO2g+PTA7KXtjb25zdCBjPWgrcy5sZW5ndGg7aWYoaShsLnNsaWNlKHQsaCkpLHQ9YyxyPjEwMClicmVhaztoPW4uaW5kZXhPZihzLHQpfXJldHVybiByPDEwMCYmaShsLnNsaWNlKHQpLCEwKSxvfSxTPS9bXHU0ZTAwLVx1OWZhNV0vZyxNPShsPXt9KT0+KHtmdXp6eTouMixwcmVmaXg6ITAscHJvY2Vzc1Rlcm06ZT0+e2NvbnN0IG49ZS5tYXRjaChTKXx8W10scz1lLnJlcGxhY2UoUywiIikudG9Mb3dlckNhc2UoKTtyZXR1cm4gcz9bcywuLi5uXTpbLi4ubl19LC4uLmx9KSxGPShsLGUpPT5lLmNvbnRlbnRzLnJlZHVjZSgobixbLHNdKT0+bitzLDApLWwuY29udGVudHMucmVkdWNlKChuLFssc10pPT5uK3MsMCksXz0obCxlKT0+TWF0aC5tYXgoLi4uZS5jb250ZW50cy5tYXAoKFssbl0pPT5uKSktTWF0aC5tYXgoLi4ubC5jb250ZW50cy5tYXAoKFssbl0pPT5uKSksTz0obCxlLG49e30pPT57Y29uc3Qgcz17fTtyZXR1cm4gQyhlLGwsTSh7Ym9vc3Q6e2g6Mix0OjEsYzo0fSwuLi5ufSkpLmZvckVhY2gobz0+e2NvbnN0e2lkOnQsdGVybXM6cixzY29yZTppfT1vLGg9dC5pbmNsdWRlcygiQCIpLGM9dC5pbmNsdWRlcygiIyIpLFtnLHBdPXQuc3BsaXQoL1sjQF0vKSxtPXIuc29ydCgodSxhKT0+dS5sZW5ndGgtYS5sZW5ndGgpLmZpbHRlcigodSxhKT0+ci5zbGljZShhKzEpLmV2ZXJ5KGY9PiFmLmluY2x1ZGVzKHUpKSkse2NvbnRlbnRzOmR9PXNbZ10/Pz17dGl0bGU6IiIsY29udGVudHM6W119O2lmKGgpZC5wdXNoKFt7dHlwZToiY3VzdG9tRmllbGQiLGtleTpnLGluZGV4OnAsZGlzcGxheTptLm1hcCh1PT5vLmMubWFwKGE9PngoYSx1KSkpLmZsYXQoKS5maWx0ZXIodT0+dSE9PW51bGwpfSxpXSk7ZWxzZXtjb25zdCB1PW0ubWFwKGE9Pngoby5oLGEpKS5maWx0ZXIoYT0+YSE9PW51bGwpO2lmKHUubGVuZ3RoJiZkLnB1c2goW3t0eXBlOmM/ImhlYWRpbmciOiJ0aXRsZSIsa2V5OmcsLi4uYyYme2FuY2hvcjpwfSxkaXNwbGF5OnV9LGldKSwidCJpbiBvKWZvcihjb25zdCBhIG9mIG8udCl7Y29uc3QgZj1tLm1hcCh5PT54KGEseSkpLmZpbHRlcih5PT55IT09bnVsbCk7Zi5sZW5ndGgmJmQucHVzaChbe3R5cGU6InRleHQiLGtleTpnLC4uLmMmJnthbmNob3I6cH0sZGlzcGxheTpmfSxpXSl9fX0pLEUocykuc29ydCgoWyxvXSxbLHRdKT0+U0VBUkNIX1BST19TT1JUX1NUUkFURUdZPT09InRvdGFsIj9GKG8sdCk6XyhvLHQpKS5tYXAoKFtvLHt0aXRsZTp0LGNvbnRlbnRzOnJ9XSk9PntpZighdCl7Y29uc3QgaT1SKGUsbyk7aSYmKHQ9aS5oKX1yZXR1cm57dGl0bGU6dCxjb250ZW50czpyLm1hcCgoW2ldKT0+aSl9fSl9LGs9KGwsZSxuPXt9KT0+VChlLGwsTShuKSkubWFwKCh7c3VnZ2VzdGlvbjpzfSk9PnMpO3NlbGYub25tZXNzYWdlPWFzeW5jKHtkYXRhOnt0eXBlOmw9ImFsbCIscXVlcnk6ZSxsb2NhbGU6bixvcHRpb25zOnN9fSk9Pntjb25zdHtkZWZhdWx0Om99PWF3YWl0ICRbbl0oKSx0PXcobyx7ZmllbGRzOlsiaCIsInQiLCJjIl0sc3RvcmVGaWVsZHM6WyJoIiwidCIsImMiXX0pO2w9PT0ic3VnZ2VzdCI/c2VsZi5wb3N0TWVzc2FnZShrKGUsdCxzKSk6bD09PSJzZWFyY2giP3NlbGYucG9zdE1lc3NhZ2UoTyhlLHQscykpOnNlbGYucG9zdE1lc3NhZ2Uoe3N1Z2dlc3Rpb25zOmsoZSx0LHMpLHJlc3VsdHM6TyhlLHQscyl9KX07Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcAo=",self.location);let d3={};const u0=Symbol(""),f3=()=>de(u0),v3=e=>{e.provide(u0,d3)},h3=()=>{const e=new Worker(`/${ma.worker}`,{}),t=[];return e.addEventListener("message",({data:n})=>{const{resolve:o}=t.shift();o(n)}),{search:n=>new Promise((o,r)=>{e.postMessage(n),t.push({resolve:o,reject:r})}),terminate:()=>{e.terminate(),t.forEach(({reject:n})=>n(new Error("Worker has been terminated.")))}}};const m3=(e,t=!1)=>{const n=K(0),o=T(()=>e.value[n.value]),r=()=>{n.value=n.value>0?n.value-1:e.value.length-1},i=()=>{n.value=n.value{t||(n.value=0)}),{index:n,item:o,prev:r,next:i}},_a=Symbol(""),g3=()=>{const e=K(!1);ot(_a,e)},_3=e=>e instanceof Element?document.activeElement===e&&(["TEXTAREA","SELECT","INPUT"].includes(e.tagName)||e.hasAttribute("contenteditable")):!1,b3=e=>c0.some(t=>{const{key:n,ctrl:o=!1,shift:r=!1,alt:i=!1,meta:a=!1}=t;return n===e.key&&o===e.ctrlKey&&r===e.shiftKey&&i===e.altKey&&a===e.metaKey}),y3='',E3='',w3='',A3='',T3=e=>{const t=K([]);{const n=f3(),o=At();ge(()=>{const r=B2(s=>{s?i({type:"suggest",query:s,locale:o.value,options:n}).then(c=>{t.value=c.length?pn(c[0],s)&&!c[0].slice(s.length).includes(" ")?c:[s,...c]:[]}).catch(c=>{console.error(c)}):t.value=[]},ma.suggestDelay),{search:i,terminate:a}=h3();ae([e,o],()=>r(e.value),{immediate:!0}),fn(()=>{a()})})}return{suggestions:t}},jr=c0[0];var I3=B({name:"SearchBox",setup(){const e=Vt(ga),t=de(_a),n=K(!1),o=T(()=>jr?[(n.value?["⌃","⇧","⌥","⌘"]:["Ctrl","Shift","Alt","Win"]).filter((r,i)=>jr[["ctrl","shift","alt","meta"][i]]),jr.key.toUpperCase()]:null);return Re("keydown",r=>{!t.value&&b3(r)&&!_3(r.target)&&(r.preventDefault(),t.value=!0)}),ge(()=>{const{userAgent:r}=navigator;n.value=h2(r)||v2(r)||f2(r)}),()=>[l("button",{type:"button",class:"search-pro-button",role:"search","aria-label":e.value.search,onClick:()=>{t.value=!0}},[l(ha),l("div",{class:"search-pro-placeholder"},e.value.search),o.value?l("div",{class:"search-pro-key-hints"},o.value.map(r=>l("kbd",{class:"search-pro-key"},r))):null])]}});const P3=b({loader:()=>d(()=>import("./SearchResult-c5292b0e.js"),[]),loadingComponent:()=>{const e=Vt(ga);return l(s0,{hint:e.value.loading})}});var O3=B({name:"SearchModal",setup(){const e=de(_a),t=Un(),n=$c(),o=Vt(ga),r=K(""),{suggestions:i}=T3(r),a=K(!1),{index:s,prev:c,next:u}=m3(i),p=$e(),f=$e(),v=(h=s.value)=>{r.value=i.value[h],a.value=!1};return Re("keydown",h=>{a.value?h.key==="ArrowUp"?c():h.key==="ArrowDown"?u():h.key==="Enter"?v():h.key==="Escape"&&(a.value=!1):h.key==="Escape"&&(e.value=!1)}),ge(()=>{const h=Qi(document.body);ae(e,async _=>{var y;h.value=_,_&&(await Xt(),(y=p.value)==null||y.focus())}),U2(f,()=>{a.value=!1}),fn(()=>{h.value=!1})}),()=>e.value?l("div",{class:"search-pro-modal-wrapper"},[l("div",{class:"search-pro-mask",onClick:()=>{e.value=!1,r.value=""}}),l("div",{class:"search-pro-modal"},[l("div",{class:"search-pro-box"},[l("form",[l("label",{for:"search-pro","aria-label":o.value.search},l(ha)),l("input",{ref:p,type:"search",class:"search-pro-input",id:"search-pro",placeholder:o.value.placeholder,spellcheck:"false",autocapitalize:"off",autocomplete:"off",autocorrect:"off",name:`${t.value.title}-search`,value:r.value,"aria-controls":"search-pro-results",onKeydown:h=>{const{key:_}=h;i.value.length&&(_==="Tab"?(v(),h.preventDefault()):(_==="ArrowDown"||_==="ArrowUp"||_==="Escape")&&h.preventDefault())},onInput:({target:h})=>{r.value=h.value,a.value=!0,s.value=0}}),r.value?l("button",{type:"reset",class:"search-pro-clear-button",innerHTML:p3,onClick:()=>{r.value=""}}):null,a.value&&i.value.length?l("ul",{class:"search-pro-suggestions",ref:f},i.value.map((h,_)=>l("li",{class:["search-pro-suggestion",{active:_===s.value}],onClick:()=>{v(_)}},[l("kbd",{class:"search-pro-auto-complete",title:`Tab ${o.value.autocomplete}`},"Tab"),h]))):null]),l("button",{type:"button",class:"search-pro-close-button",onClick:()=>{e.value=!1,r.value=""}},o.value.cancel)]),l(P3,{query:r.value,isFocusing:!a.value,onClose:()=>{e.value=!1},onUpdateQuery:h=>{r.value=h}}),n.value?null:l("div",{class:"search-pro-hints"},[l("span",{class:"search-pro-hint"},[l("kbd",{innerHTML:y3}),o.value.select]),l("span",{class:"search-pro-hint"},[l("kbd",{innerHTML:w3}),l("kbd",{innerHTML:E3}),o.value.navigate]),l("span",{class:"search-pro-hint"},[l("kbd",{innerHTML:A3}),o.value.exit])])])]):null}}),k3=Qe({enhance({app:e}){v3(e),e.component("SearchBox",I3)},setup(){g3()},rootComponents:[O3]});const Uo=[u1,mf,Af,kf,Sf,Vf,zf,Qf,av,lv,gv,o3,a3,k3],L3=[["v-3f9d0d55","/DailyRoutine.html",{y:"p",t:"每日仪式",i:"check"},[":md"]],["v-3d0aa58a","/Fitness.html",{y:"p",t:"健身计划",i:"strong"},[":md"]],["v-8daa1a0e","/",{y:"p",t:"LearnHubs",i:"note"},["/README.md"]],["v-35f5db9e","/blog.html",{y:"h",t:"互联网小白",i:"home"},[":md"]],["v-184f4da6","/intro.html",{y:"p",t:"个人介绍",i:"any"},[":md"]],["v-26a023fe","/posts/2017-04-18-wechat_multi_open.html",{d:14924736e5,l:"2017年4月18日",c:["工具"],g:["微信"],e:`

        由于工作原因,有时候我们需要在电脑上登录多个微信。但微信限制一个客户端只能登陆一个账号,PC 端 + 网页版就成了通用方案,操作效率下降许多。

        + */const fe={settings:{minimum:.08,easing:"ease",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,barSelector:'[role="bar"]',parent:"body",template:'
        '},status:null,set:e=>{const t=fe.isStarted();e=Br(e,fe.settings.minimum,1),fe.status=e===1?null:e;const n=fe.render(!t),o=n.querySelector(fe.settings.barSelector),r=fe.settings.speed,i=fe.settings.easing;return n.offsetWidth,xf(a=>{Wo(o,{transform:"translate3d("+Bl(e)+"%,0,0)",transition:"all "+r+"ms "+i}),e===1?(Wo(n,{transition:"none",opacity:"1"}),n.offsetWidth,setTimeout(function(){Wo(n,{transition:"all "+r+"ms linear",opacity:"0"}),setTimeout(function(){fe.remove(),a()},r)},r)):setTimeout(()=>a(),r)}),fe},isStarted:()=>typeof fe.status=="number",start:()=>{fe.status||fe.set(0);const e=()=>{setTimeout(()=>{fe.status&&(fe.trickle(),e())},fe.settings.trickleSpeed)};return fe.settings.trickle&&e(),fe},done:e=>!e&&!fe.status?fe:fe.inc(.3+.5*Math.random()).set(1),inc:e=>{let t=fe.status;return t?(typeof e!="number"&&(e=(1-t)*Br(Math.random()*t,.1,.95)),t=Br(t+e,0,.994),fe.set(t)):fe.start()},trickle:()=>fe.inc(Math.random()*fe.settings.trickleRate),render:e=>{if(fe.isRendered())return document.getElementById("nprogress");$l(document.documentElement,"nprogress-busy");const t=document.createElement("div");t.id="nprogress",t.innerHTML=fe.settings.template;const n=t.querySelector(fe.settings.barSelector),o=e?"-100":Bl(fe.status||0),r=document.querySelector(fe.settings.parent);return Wo(n,{transition:"all 0 linear",transform:"translate3d("+o+"%,0,0)"}),r!==document.body&&$l(r,"nprogress-custom-parent"),r==null||r.appendChild(t),t},remove:()=>{Nl(document.documentElement,"nprogress-busy"),Nl(document.querySelector(fe.settings.parent),"nprogress-custom-parent");const e=document.getElementById("nprogress");e&&Df(e)},isRendered:()=>!!document.getElementById("nprogress")},Br=(e,t,n)=>en?n:e,Bl=e=>(-1+e)*100,xf=function(){const e=[];function t(){const n=e.shift();n&&n(t)}return function(n){e.push(n),e.length===1&&t()}}(),Wo=function(){const e=["Webkit","O","Moz","ms"],t={};function n(a){return a.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(s,c){return c.toUpperCase()})}function o(a){const s=document.body.style;if(a in s)return a;let c=e.length;const u=a.charAt(0).toUpperCase()+a.slice(1);let p;for(;c--;)if(p=e[c]+u,p in s)return p;return a}function r(a){return a=n(a),t[a]??(t[a]=o(a))}function i(a,s,c){s=r(s),a.style[s]=c}return function(a,s){for(const c in s){const u=s[c];u!==void 0&&Object.prototype.hasOwnProperty.call(s,c)&&i(a,c,u)}}}(),Zc=(e,t)=>(typeof e=="string"?e:ea(e)).indexOf(" "+t+" ")>=0,$l=(e,t)=>{const n=ea(e),o=n+t;Zc(n,t)||(e.className=o.substring(1))},Nl=(e,t)=>{const n=ea(e);if(!Zc(e,t))return;const o=n.replace(" "+t+" "," ");e.className=o.substring(1,o.length-1)},ea=e=>(" "+(e.className||"")+" ").replace(/\s+/gi," "),Df=e=>{e&&e.parentNode&&e.parentNode.removeChild(e)};const Cf=()=>{ge(()=>{const e=Fe(),t=new Set;t.add(e.currentRoute.value.path),e.beforeEach(n=>{t.has(n.path)||fe.start()}),e.afterEach(n=>{t.add(n.path),fe.done()})})},Vf=Qe({setup(){Cf()}}),Mf=JSON.parse('{"encrypt":{},"author":{"name":"清顺","url":"https://gpt-vip.top"},"logo":"/logo.svg","breadcrumb":false,"contributors":false,"lastUpdated":true,"editLink":true,"darkmode":"switch","fullscreen":true,"repo":"libaxuan/LearnHubs","repoLabel":"GitHub","repoDisplay":true,"docsDir":"docs","navbarLayout":{"start":["Brand"],"center":["Links"],"end":["Repo","Outlook","Search"]},"pageInfo":["Category","Tag","Word","ReadingTime","PageView"],"blog":{"articleInfo":["Date","PageView","Category","Tag","ReadingTime"],"name":"清顺","avatar":"/avatar_self.webp","description":"迷信新工具,热衷于人工智能,定期分享探索成果","intro":"/intro.html","roundAvatar":true,"medias":{"GitHub":"https://github.com/libaxuan","Wechat":"https://iili.io/Hr4MJ5l.jpg","Email":"mailto:libaxuan@gmail.com","Discord":"https://discord.gg/TeUFcFJy","RSS":"https://gpt-vip.top/rss.xml"}},"locales":{"/":{"lang":"zh-CN","navbarLocales":{"langName":"简体中文","selectLangAriaLabel":"选择语言"},"metaLocales":{"author":"作者","date":"写作日期","origin":"原创","views":"访问量","category":"分类","tag":"标签","readingTime":"阅读时间","words":"字数","toc":"此页内容","prev":"上一页","next":"下一页","lastUpdated":"上次编辑于","contributors":"贡献者","editLink":"编辑此页","print":"打印"},"blogLocales":{"article":"文章","articleList":"文章列表","category":"分类","tag":"标签","timeline":"时间轴","timelineTitle":"昨日不在","all":"全部","intro":"个人介绍","star":"收藏"},"paginationLocales":{"prev":"上一页","next":"下一页","navigate":"跳转到","action":"前往","errorText":"请输入 1 到 $page 之前的页码!"},"outlookLocales":{"themeColor":"主题色","darkmode":"外观","fullscreen":"全屏"},"routeLocales":{"skipToContent":"跳至主要內容","notFoundTitle":"页面不存在","notFoundMsg":["这里什么也没有","我们是怎么来到这儿的?","这 是 四 零 四 !","看起来你访问了一个失效的链接"],"back":"返回上一页","home":"带我回家","openInNewWindow":"Open in new window"},"navbar":[{"text":"博客","icon":"blog","link":"/blog"},{"text":"应用","icon":"app","prefix":"/","children":["apps/Applist",{"text":"常用扩展","icon":"chrome","link":"apps/Chrome"},{"text":"服务/专题","icon":"any","prefix":"","children":[{"text":"直播手册","icon":"quote","link":"apps/livestreaming/1_obs_basic"},{"text":"NAS 应用","icon":"process","link":"services/dockers-on-nas/"}]}]},{"text":"人工智能","icon":"tool","prefix":"/ai/","children":["ChatGPT","Midjourney","AIEnjoy","TaoAI/"]},{"text":"工具","icon":"tool","children":[{"text":"FreeTimeAI","icon":"creative","link":"https://sensechat.vip/"},{"text":"ChatGPT SC","icon":"creative","link":"https://shortcutai.eu.org"},{"text":"Enjoy Home","icon":"pic","link":"https://autoaigpt.cn"},{"text":"免费图床","icon":"others","link":"https://autoschool.eu.org"},{"text":"万能工具","icon":"categoryselected","link":"https://itools.site"}]},{"text":"Contact","icon":"advance","children":[{"text":"微信","icon":"wechat","link":"https://iili.io/Hr4MJ5l.jpg"},{"text":"Email","icon":"alias","link":"mailto:libaxuann@gmail.com"},{"text":"Discord","icon":"group","link":"https://discord.gg/TeUFcFJy"},{"text":"RSS","icon":"rss","link":"https://gpt-vip.top/rss.xml"},{"text":"Dashboard","icon":"rss","link":"https://us.umami.is/share/mqhzWMSoh5PUNvnu/LearnHubs"}]}],"sidebar":{"":[{"text":"读书笔记","icon":"read","link":"https://gpt-vip.top/reading/"},{"text":"🧰 应用手册","icon":"","prefix":"/apps/","link":"","collapsible":true,"children":["Applist.md","AppNotes.md","design.md","ChatGPT.md","Chrome.md",{"text":"直播手册","icon":"load","prefix":"livestreaming/","link":"","collapsible":true,"children":"structure"}]},{"text":"🐋 Docker 服务","icon":"","prefix":"/services/","link":"","collapsible":true,"children":"structure"},{"text":"🪟 系统问题","icon":"","prefix":"/windows/","link":"","collapsible":true,"children":"structure"},{"text":"🔡 代码编程","icon":"","prefix":"","link":"","collapsible":true,"children":[{"text":"页面开发","icon":"","prefix":"/web/","collapsible":true,"children":"structure"},{"text":"网站部署","icon":"","prefix":"/deploy/","collapsible":true,"children":["Static.md","CloudServices.md","VPS.md",{"text":"部署工具","icon":"emmet","collapsible":true,"children":["GitHub.md","Cloudflare.md","MySQL.md","DNS.md"]}]},{"text":"代码学习","icon":"","prefix":"/code/","collapsible":true,"children":["README.md",{"text":"Basic","icon":"emmet","collapsible":true,"children":["Markdown.md","Electron.md","AutoHotkey.md","Regex.md"]},{"text":"FrondEnd","icon":"app","collapsible":true,"children":["Vue.md","HTML.md","JavaScript.md","Python.md"]}]}]},{"text":"博客文章","icon":"blog","prefix":"/_posts/","link":"/blog","collapsible":true,"children":"structure"}],"/services/dockers-on-nas/":"structure","/family/baby/":"structure"}}}}'),Bf=K(Mf),Xc=()=>Bf,Jc=Symbol(""),$f=()=>{const e=de(Jc);if(!e)throw new Error("useThemeLocaleData() is called without provider.");return e},Nf=(e,t)=>{const{locales:n,...o}=e;return{...o,...n==null?void 0:n[t]}},zf=Qe({enhance({app:e}){const t=Xc(),n=e._context.provides[Hi],o=T(()=>Nf(t.value,n.value));e.provide(Jc,o),Object.defineProperties(e.config.globalProperties,{$theme:{get(){return t.value}},$themeLocale:{get(){return o.value}}})}}),Ff="2.15.8",Hf={"Content-Type":"application/json"},jf=({serverURL:e,lang:t,paths:n,signal:o})=>(({serverURL:r,lang:i,paths:a,type:s,signal:c})=>fetch(`${r}/article?path=${encodeURIComponent(a.join(","))}&type=${encodeURIComponent(s.join(","))}&lang=${i}`,{signal:c}).then(u=>u.json()))({serverURL:e,lang:t,paths:n,type:["time"],signal:o}).then(r=>Array.isArray(r)?r:[r]),Wf=e=>(({serverURL:t,lang:n,path:o,type:r,action:i})=>fetch(`${t}/article?lang=${n}`,{method:"POST",headers:Hf,body:JSON.stringify({path:o,type:r,action:i})}).then(a=>a.json()))({...e,type:"time",action:"inc"}),zl=e=>{const t=((n="")=>n.replace(/\/$/u,""))(e);return/^(https?:)?\/\//.test(t)?t:`https://${t}`},Uf=e=>{e.name!=="AbortError"&&console.error(e.message)},Fl=e=>e.dataset.path||e.getAttribute("id"),Hl=(e,t)=>{t.forEach((n,o)=>{n.innerText=e[o].toString()})},Qc=({serverURL:e,path:t=window.location.pathname,selector:n=".waline-pageview-count",update:o=!0,lang:r=navigator.language})=>{const i=new AbortController,a=Array.from(document.querySelectorAll(n)),s=u=>{const p=Fl(u);return p!==null&&t!==p},c=u=>jf({serverURL:zl(e),paths:u.map(p=>Fl(p)||t),lang:r,signal:i.signal}).then(p=>Hl(p,u)).catch(Uf);if(o){const u=a.filter(f=>!s(f)),p=a.filter(s);Wf({serverURL:zl(e),path:t,lang:r}).then(f=>Hl(new Array(u.length).fill(f),u)),p.length&&c(p)}else c(a);return i.abort.bind(i)},J3=Object.freeze(Object.defineProperty({__proto__:null,pageviewCount:Qc,version:Ff},Symbol.toStringTag,{value:"Module"}));const Gf={provider:"Waline",dark:'html[data-theme="dark"]',serverURL:"https://waline.gpt-vip.top",reaction:["https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f44d.png","https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f44f.png","https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f60e.png","https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f602.png","https://lf3-cdn-tos.bytecdntp.com/cdn/expire-1-y/twemoji/13.1.0/72x72/1f635-200d-1f4ab.png"]};let Kf=Gf;const eu=Symbol(""),tu=()=>de(eu),qf=tu,Yf=e=>{e.provide(eu,Kf)},Zf={"/":{placeholder:"请留言。(填写邮箱可在被回复时收到邮件提醒)",reactionTitle:"已到达文章底部,欢迎留言、表情互动~",reaction0:"赞一个",reaction1:"支持下",reaction2:"有点酷",reaction3:"啥玩意",reaction4:"看不懂",admin:"盛年不重来,一日难再晨",level0:"锻体",level1:"炼气",level2:"筑基",level3:"金丹",level4:"元婴",level5:"化神"}};d(()=>import("./waline-meta-56fbc549.js"),[]);var Xf=B({name:"WalineComment",props:{identifier:{type:String,required:!0}},setup(e){const t=qf(),n=we(),o=vr(),r=Vt(Zf);let i;const a=!!t.serverURL,s=T(()=>{if(!a)return!1;const u=t.pageview!==!1,p=n.value.pageview;return!!p||u!==!1&&p!==!1}),c=T(()=>({lang:o.value==="zh-CN"?"zh-CN":"en",locale:r.value,dark:"html.dark",...t,path:e.identifier}));return ge(()=>{ae(()=>e.identifier,()=>{i==null||i(),s.value&&Xt().then(()=>{setTimeout(()=>{i=Qc({serverURL:t.serverURL,path:e.identifier})},t.delay||800)})},{immediate:!0})}),()=>a?l("div",{id:"comment",class:"waline-wrapper"},l(b({loader:async()=>(await d(()=>import("./component-0a831d23.js"),[])).Waline,loadingComponent:_r}),c.value)):null}}),Jf=B({name:"CommentService",props:{darkmode:Boolean},setup(e){const t=tu(),n=ce(),o=we(),r=t.comment!==!1,i=T(()=>o.value.comment||r&&o.value.comment!==!1);return()=>l(Xf,{identifier:o.value.commentID||n.value.path,darkmode:e.darkmode,style:{display:i.value?"block":"none"}})}}),Qf=Qe({enhance:({app:e})=>{Yf(e),e.component("CommentService",Jf)}});const ev=800,tv=2e3,nv={"/":{copy:"复制代码",copied:"已复制",hint:"复制成功"}},ov=!1,rv=['.theme-hope-content div[class*="language-"] pre'],jl=!1,$r=new Map,iv=()=>{const{copy:e}=q2({legacy:!0}),t=Vt(nv),n=ce(),o=$c(),r=s=>{if(!s.hasAttribute("copy-code-registered")){const c=document.createElement("button");c.type="button",c.classList.add("copy-code-button"),c.innerHTML='
        ',c.setAttribute("aria-label",t.value.copy),c.setAttribute("data-copied",t.value.copied),s.parentElement&&s.parentElement.insertBefore(c,s),s.setAttribute("copy-code-registered","")}},i=()=>Xt().then(()=>new Promise(s=>{setTimeout(()=>{rv.forEach(c=>{document.querySelectorAll(c).forEach(r)}),s()},ev)})),a=(s,c,u)=>{let{innerText:p=""}=c;/language-(shellscript|shell|bash|sh|zsh)/.test(s.classList.toString())&&(p=p.replace(/^ *(\$|>) /gm,"")),e(p).then(()=>{u.classList.add("copied"),clearTimeout($r.get(u));const f=setTimeout(()=>{u.classList.remove("copied"),u.blur(),$r.delete(u)},tv);$r.set(u,f)})};ge(()=>{(!o.value||jl)&&i(),Re("click",s=>{const c=s.target;if(c.matches('div[class*="language-"] > button.copy')){const u=c.parentElement,p=c.nextElementSibling;p&&a(u,p,c)}else if(c.matches('div[class*="language-"] div.copy-icon')){const u=c.parentElement,p=u.parentElement,f=u.nextElementSibling;f&&a(p,f,u)}}),ae(()=>n.value.path,()=>{(!o.value||jl)&&i()})})};var av=Qe({setup:()=>{iv()}});const lv=Qe({enhance:({app:e})=>{},setup:()=>{}});let sv={};const nu=Symbol(""),cv=()=>de(nu),uv=e=>{e.provide(nu,sv)};const pv=".theme-hope-content :not(a) > img:not([no-view])",dv={"/":{closeTitle:"关闭",downloadTitle:"下载图片",fullscreenTitle:"切换全屏",zoomTitle:"缩放",arrowPrevTitle:"上一个 (左箭头)",arrowNextTitle:"下一个 (右箭头)"}},fv=800,vv='
        ',hv=e=>ie(e)?Array.from(document.querySelectorAll(e)):e.map(t=>Array.from(document.querySelectorAll(t))).flat(),ou=e=>new Promise((t,n)=>{e.complete?t({type:"image",element:e,src:e.src,width:e.naturalWidth,height:e.naturalHeight,alt:e.alt,msrc:e.src}):(e.onload=()=>t(ou(e)),e.onerror=o=>n(o))}),mv=()=>{const{isSupported:e,toggle:t}=Ji(),n=cv(),o=Vt(dv),r=ce();let i;const a=c=>{c.on("uiRegister",()=>{e&&c.ui.registerElement({name:"fullscreen",order:7,isButton:!0,html:'',onClick:()=>{t()}}),c.ui.registerElement({name:"download",order:8,isButton:!0,tagName:"a",html:{isCustomSVG:!0,inner:'',outlineID:"pswp__icn-download"},onInit:(u,p)=>{u.setAttribute("download",""),u.setAttribute("target","_blank"),u.setAttribute("rel","noopener"),p.on("change",()=>{u.setAttribute("href",p.currSlide.data.src)})}}),c.ui.registerElement({name:"bulletsIndicator",className:"photo-swipe-bullets-indicator",appendTo:"wrapper",onInit:(u,p)=>{const f=[];let v=-1;for(let h=0;h{p.goTo(f.indexOf(y.target))},f.push(_),u.appendChild(_)}p.on("change",()=>{v>=0&&f[v].classList.remove("active"),f[p.currIndex].classList.add("active"),v=p.currIndex})}})})},s=()=>Promise.all([d(()=>import("./photoswipe.esm-1464cdb9.js"),[]),Xt().then(()=>new Promise(c=>setTimeout(c,fv)).then(()=>hv(pv)))]).then(([{default:c},u])=>{const p=u.map(f=>({html:vv,element:f,msrc:f.src}));u.forEach((f,v)=>{const h=()=>{i=new c({preloaderDelay:0,showHideAnimationType:"zoom",...o.value,...n,dataSource:p,index:v,closeOnVerticalDrag:!0,wheelToZoom:!1}),a(i),i.addFilter("thumbEl",()=>f),i.addFilter("placeholderSrc",()=>f.src),i.init()};f.style.cursor="zoom-in",f.addEventListener("click",()=>{h()}),f.addEventListener("keypress",({key:_})=>{_==="Enter"&&h()})}),u.forEach((f,v)=>{ou(f).then(h=>{p.splice(v,1,h),i==null||i.refreshSlideContent(v)})})});ge(()=>{Re("wheel",()=>{i==null||i.close()}),ae(()=>r.value.path,s,{immediate:!0})})};var gv=Qe({enhance:({app:e})=>{uv(e)},setup:()=>{mv()}});const ru=()=>{const e=ce();return T(()=>e.value.readingTime??null)},ai=typeof{"/":{word:"约 $word 字",less1Minute:"小于 1 分钟",time:"大约 $time 分钟"}}>"u"?null:{"/":{word:"约 $word 字",less1Minute:"小于 1 分钟",time:"大约 $time 分钟"}},iu=(e,t)=>{const{minutes:n,words:o}=e,{less1Minute:r,word:i,time:a}=t;return{time:n<1?r:a.replace("$time",Math.round(n).toString()),words:i.replace("$word",o.toString())}},Wl={words:"",time:""},au=()=>ai?Vt(ai):T(()=>null),_v=()=>{if(typeof ai>"u")return T(()=>Wl);const e=ru(),t=au();return T(()=>e.value&&t.value?iu(e.value,t.value):Wl)},hn=()=>Xc(),ue=()=>$f(),Gn=()=>T(()=>!!hn().value.pure);var Nr=B({name:"EmptyComponent",setup:()=>()=>null});const bv="719px",yv="1440px",Ev="false",ta={mobileBreakPoint:bv,pcBreakPoint:yv,enableThemeColor:Ev},na={"/apps/livestreaming/":["0_live_equipments","1_obs_basic","2_obs_streamfx","3_obs_plugins","4_live_effects","5_live_platforms","6_live_positioning"],"/services/":["NAS","Docker","Huginn","TTRSS",{text:"NAS 应用集合",prefix:"dockers-on-nas/",collapsible:!0,icon:"process",children:["navidrome","emby","mt-photos","reader","memos","grocy","tachidesk","stirling-pdf","syncthing","uptime-kuma","qinglong","reverse-proxy","cors-anywhere"]}],"/windows/":["mac","faq","NewSystem","QTTabBar","cd"],"/web/":["VuePress","docsify","Comments"],"/_posts/":["/posts/2023-12-13-awesome-selfhosted-cn.html","/posts/2023-12-12-eu.org-free-domain.html","/posts/2023-12-12-sd-op.html","/posts/2023-10-07-clone-voice.html","/posts/2023-09-05-virtual_positioning.html","/posts/2023-01-26-whiteboard_gtd.html","/posts/2022-11-03-ffmpeg_screen_recording.html","/posts/2022-08-22-learndata_blog_to_knowledge_management.html","/posts/2022-06-07-blog_md_to_wordpress.html","/posts/2022-04-21-uivision_rpa.html","/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html","/posts/2022-03-17-rss_persistent_link_collection.html","/posts/2022-02-19-microsoft_store_fixed.html","/posts/2022-01-23-wechat_lucky_money_cover.html","/posts/2021-10-23-nas_with_rsshub_and_huginn.html","/posts/2021-05-31-principles_criticism_and_self-criticism.html","/posts/2021-01-27-blog_jekyll_to_wordpress.html","/posts/2021-01-02-keepass_the_real_lastpassword.html","/posts/2020-11-27-rime_input.html","/posts/2020-09-22-uefi_asus_board.html","/posts/2020-09-13-wifi_speed_up.html","/posts/2020-03-25-rsshub_on_vps.html","/posts/2019-08-26-scrcpy_screen_projection.html","/posts/2019-04-01-rsshub_noob.html","/posts/2019-03-31-openvpn_back_to_home.html","/posts/2018-12-28-voice_input_try.html","/posts/2018-10-07-huginn_scraping_any_website.html","/posts/2018-06-19-iptv_direckly.html","/posts/2018-06-10-koolproxy_https.html","/posts/2018-06-08-baizhuo_gp1700.html","/posts/2018-05-24-airtable_noob.html","/posts/2018-05-15-aria2_a_new_download_tool.html","/posts/2018-05-04-audition_cut_mp3.html","/posts/2018-05-03-jekyll_blog_autodeploy.html","/posts/2018-05-02-jekyll_blog_on_vps.html","/posts/2018-05-01-jekyll_blog_on_github_pages.html","/posts/2018-04-30-baota_deploy_vps.html","/posts/2018-01-31-hire_a_robot.html","/posts/2018-01-19-forget_the_cdn.html","/posts/2017-10-18-light_cat_port_forwarding.html","/posts/2017-10-18-light_cat_e8-c-epon_admin.html","/posts/2017-09-03-smb_lan_sharing.html","/posts/2017-09-02-forced_shutdown.html","/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html","/posts/2017-07-28-office_2016_installer_error.html","/posts/2017-04-22-rss_feed43_feedex.html","/posts/2017-04-18-wechat_multi_open.html","/posts/2023-10-29-switch-firmware-updates.html"],"/services/dockers-on-nas/":["navidrome","emby","mt-photos","reader","memos","grocy","tachidesk","stirling-pdf","syncthing","uptime-kuma","qinglong","reverse-proxy","cors-anywhere"],"/family/baby/":["birthing","newborn"]},lu=e=>{const{icon:t="",color:n,size:o}=e,r={};return n&&(r.color=n),o&&(r.height=Number.isNaN(Number(o))?o:`${o}px`),Jt(t)?l("img",{class:"icon",src:t,"no-view":"",style:r}):yr(t)?l("img",{class:"icon",src:Ie(t),"no-view":"",style:r}):l(Je("FontIcon"),e)};lu.displayName="HopeIcon";var ze=lu,ye=(e=>(e.type="y",e.title="t",e.shortTitle="s",e.icon="i",e.author="a",e.date="d",e.localizedDate="l",e.category="c",e.tag="g",e.isEncrypted="n",e.isOriginal="o",e.readingTime="r",e.excerpt="e",e.sticky="u",e.cover="v",e.index="I",e.order="O",e))(ye||{}),su=(e=>(e.article="a",e.home="h",e.slide="s",e.page="p",e))(su||{});const On=(e,t,n=!1)=>{let o=$n(e,Oc(encodeURI(t)));o.name==="404"&&(o=$n(e,t));const{fullPath:r,meta:i,name:a}=o;return{text:!n&&i[ye.shortTitle]?i[ye.shortTitle]:i[ye.title]||t,link:a==="404"?t:r,...i[ye.icon]?{icon:i[ye.icon]}:{}}},To=()=>{const e=Fe(),t=gt();return n=>{if(n)if(yr(n))t.path!==n&&e.push(n);else if(Jt(n)||nc(n))window&&window.open(n);else{const o=t.path.slice(0,t.path.lastIndexOf("/"));e.push(`${o}/${encodeURI(n)}`)}}},cu=()=>{const e=ue(),t=we();return T(()=>{const{author:n}=t.value;return n?ho(n):n===!1?[]:ho(e.value.author,!1)})},wv=()=>{const e=we();return T(()=>Lc(e.value.category).map(t=>{var n,o;return{name:t,path:((o=(n=de(Symbol.for("categoryMap")))==null?void 0:n.value.map[t])==null?void 0:o.path)||""}}))},Av=()=>{const e=we();return T(()=>Rc(e.value.tag).map(t=>{var n,o;return{name:t,path:((o=(n=de(Symbol.for("tagMap")))==null?void 0:n.value.map[t])==null?void 0:o.path)||""}}))},Tv=()=>{const e=we(),t=ce();return T(()=>{const n=Ui(e.value.date);if(n)return n;const{createdTime:o}=t.value.git||{};return o?new Date(o):null})},Iv=()=>{const e=ue(),t=ce(),n=we(),o=cu(),r=wv(),i=Av(),a=Tv(),s=ru(),c=_v(),u=T(()=>({author:o.value,category:r.value,date:a.value,localizedDate:t.value.localizedDate,tag:i.value,isOriginal:n.value.isOriginal||!1,readingTime:s.value,readingTimeLocale:c.value,pageview:"pageview"in n.value?n.value.pageview:!0})),p=T(()=>"pageInfo"in n.value?n.value.pageInfo:"pageInfo"in e.value?e.value.pageInfo:null);return{info:u,items:p}},{mobileBreakPoint:Pv,pcBreakPoint:Ov}=ta,Ul=e=>e.endsWith("px")?Number(e.slice(0,-2)):null,Io=()=>{const e=K(!1),t=K(!1),n=()=>{e.value=window.innerWidth<=(Ul(Pv)??719),t.value=window.innerWidth>=(Ul(Ov)??1440)};return ge(()=>{n(),Re("resize",n,!1),Re("orientationchange",n,!1)}),{isMobile:e,isPC:t}},uu=Symbol(""),Po=()=>{const e=de(uu);if(!e)throw new Error("useDarkmode() is called without provider.");return e},kv=e=>{const t=hn(),n=ef(),o=Fc("vuepress-theme-hope-scheme","auto"),r=T(()=>t.value.darkmode||"switch"),i=T(()=>{const s=r.value;return s==="disable"?!1:s==="enable"?!0:s==="auto"?n.value:s==="toggle"?o.value==="dark":o.value==="dark"||o.value==="auto"&&n.value}),a=T(()=>{const s=r.value;return s==="switch"||s==="toggle"});e.provide(uu,{canToggle:a,config:r,isDarkmode:i,status:o}),Object.defineProperties(e.config.globalProperties,{$isDarkmode:{get:()=>i.value}})},Lv=()=>{const{isDarkmode:e}=Po(),t=(n=e.value)=>document.documentElement.setAttribute("data-theme",n?"dark":"light");ge(()=>{ae(e,t,{immediate:!0})})};var We=B({name:"AutoLink",inheritAttrs:!1,props:{config:{type:Object,required:!0},exact:Boolean,noExternalLinkIcon:Boolean},emits:["focusout"],slots:Object,setup(e,{attrs:t,emit:n,slots:o}){const r=gt(),i=uc(),a=Wn(e,"config"),s=T(()=>Jt(a.value.link)),c=T(()=>nc(a.value.link)||Qd(a.value.link)),u=T(()=>c.value?void 0:a.value.target||(s.value?"_blank":void 0)),p=T(()=>u.value==="_blank"),f=T(()=>!s.value&&!c.value&&!p.value),v=T(()=>c.value?void 0:a.value.rel||(p.value?"noopener noreferrer":void 0)),h=T(()=>a.value.ariaLabel||a.value.text),_=T(()=>{if(e.exact)return!1;const P=wt(i.value.locales);return P.length?P.every(E=>E!==a.value.link):a.value.link!=="/"}),y=T(()=>f.value?a.value.activeMatch?new RegExp(a.value.activeMatch).test(r.path):_.value?pn(r.path,a.value.link):r.path===a.value.link:!1);return()=>{const{before:P,after:E,default:k}=o,{text:A,icon:I,link:V}=a.value;return f.value?l(Ve,{to:V,"aria-label":h.value,...t,class:["nav-link",{active:y.value},t.class],onFocusout:()=>n("focusout")},()=>k?k():[P?P():l(ze,{icon:I}),A,E==null?void 0:E()]):l("a",{href:V,rel:v.value,target:u.value,"aria-label":h.value,...t,class:["nav-link",t.class],onFocusout:()=>n("focusout")},k?k():[P?P():l(ze,{icon:I}),A,e.noExternalLinkIcon?null:l(Yc),E==null?void 0:E()])}}});const Nn=(e,t,n=!1)=>"activeMatch"in t?new RegExp(t.activeMatch).test(e.path):Ki(e,t.link)?!0:t.children&&!n?t.children.some(o=>Nn(e,o)):!1,pu=(e,t)=>t.type==="group"?t.children.some(n=>n.type==="group"?pu(e,n):n.type==="page"&&Nn(e,n,!0))||"prefix"in t&&Ki(e,t.prefix):!1,du=(e,t)=>ie(e.link)?l(We,{...t,config:e}):l("p",t,[l(ze,{icon:e.icon}),e.text]),fu=e=>{const t=gt();return e?l("ul",{class:"vp-sidebar-sub-headers"},e.map(n=>{const o=Nn(t,n,!0);return l("li",{class:"vp-sidebar-sub-header"},[du(n,{class:["vp-sidebar-link","vp-heading",{active:o}]}),fu(n.children)])})):null},zr=(e="",t="")=>yr(t)?t:`${Zd(e)}${t}`,Rv=(e,t)=>{const n=ce();return{type:"heading",text:e.title,link:`${n.value.path}#${e.slug}`,children:oa(e.children,t)}},oa=(e,t)=>t>0?e.map(n=>Rv(n,t-1)):[],vu=e=>{const t=ce();return oa(t.value.headers,e)},li=(e,t,n="")=>{const o=Fe(),r=ce(),i=(a,s=n)=>{var u;const c=ie(a)?On(o,zr(s,a)):a.link?{...a,...rr(a.link)?{}:{link:On(o,zr(s,a.link)).link}}:a;if("children"in c){const p=zr(s,c.prefix),f=c.children==="structure"?na[p]:c.children;return{type:"group",...c,prefix:p,children:f.map(v=>i(v,p))}}return{type:"page",...c,children:c.link===r.value.path?oa(((u=r.value.headers[0])==null?void 0:u.level)===1?r.value.headers[0].children:r.value.headers,t):[]}};return e.map(a=>i(a))},Sv=(e,t)=>{const n=ce(),o=wt(e).sort((r,i)=>i.length-r.length);for(const r of o)if(pn(decodeURI(n.value.path),r)){const i=e[r];return i?li(i==="structure"?na[r]:i==="heading"?vu(t):i,t,r):[]}return console.warn(`${n.value.path} is missing sidebar config.`),[]},xv=(e,t)=>{const n=At();return e===!1?[]:e==="heading"?vu(t):e==="structure"?li(na[n.value],t,n.value):G(e)?li(e,t):zi(e)?Sv(e,t):[]},hu=Symbol(""),Dv=()=>{const e=we(),t=ue(),n=ce(),o=T(()=>e.value.home?!1:e.value.sidebar??t.value.sidebar??"structure"),r=T(()=>e.value.headerDepth??t.value.headerDepth??2),i=qi(()=>[o.value,r.value,n.value.path,null],()=>xv(o.value,r.value));ot(hu,i)},ra=()=>{const e=de(hu);if(!e)throw new Error("useSidebarItems() is called without provider.");return e};var Cv=B({name:"PageFooter",setup(){const e=we(),t=ue(),n=cu(),o=T(()=>{const{copyright:a,footer:s}=e.value;return s!==!1&&!!(a||s||t.value.displayFooter)}),r=T(()=>{const{footer:a}=e.value;return a===!1?!1:ie(a)?a:t.value.footer||""}),i=T(()=>"copyright"in e.value?e.value.copyright:"copyright"in t.value?t.value.copyright:n.value.length?`Copyright © ${new Date().getFullYear()} ${n.value[0].name}`:!1);return()=>o.value?l("footer",{class:"vp-footer-wrapper"},[r.value?l("div",{class:"vp-footer",innerHTML:r.value}):null,i.value?l("div",{class:"vp-copyright",innerHTML:i.value}):null]):null}}),Vv=B({name:"NavbarDropdownLink",props:{config:{type:Object,required:!0}},slots:Object,setup(e,{slots:t}){const n=ce(),o=Wn(e,"config"),r=T(()=>o.value.ariaLabel||o.value.text),i=K(!1);ae(()=>n.value.path,()=>{i.value=!1});const a=s=>{s.detail===0&&(i.value=!i.value)};return()=>{var s;return l("div",{class:["dropdown-wrapper",{open:i.value}]},[l("button",{type:"button",class:"dropdown-title","aria-label":r.value,onClick:a},[((s=t.title)==null?void 0:s.call(t))||l("span",{class:"title"},[l(ze,{icon:o.value.icon}),e.config.text]),l("span",{class:"arrow"}),l("ul",{class:"nav-dropdown"},o.value.children.map((c,u)=>{const p=u===o.value.children.length-1;return l("li",{class:"dropdown-item"},"children"in c?[l("h4",{class:"dropdown-subtitle"},c.link?l(We,{config:c,onFocusout:()=>{c.children.length===0&&p&&(i.value=!1)}}):l("span",c.text)),l("ul",{class:"dropdown-subitem-wrapper"},c.children.map((f,v)=>l("li",{class:"dropdown-subitem"},l(We,{config:f,onFocusout:()=>{v===c.children.length-1&&p&&(i.value=!1)}}))))]:l(We,{config:c,onFocusout:()=>{p&&(i.value=!1)}}))}))])])}}});const mu=(e,t,n="")=>ie(t)?On(e,`${n}${t}`):"children"in t?{...t,...t.link&&!rr(t.link)?On(e,`${n}${t.link}`):{},children:t.children.map(o=>mu(e,o,`${n}${t.prefix||""}`))}:{...t,link:rr(t.link)?t.link:On(e,`${n}${t.link}`).link},gu=()=>{const e=ue(),t=Fe(),n=()=>(e.value.navbar||[]).map(o=>mu(t,o));return qi(()=>e.value.navbar,()=>n())},Mv=()=>{const e=ue(),t=T(()=>e.value.repo||null),n=T(()=>t.value?O2(t.value):null),o=T(()=>t.value?xc(t.value):null),r=T(()=>n.value?e.value.repoLabel??(o.value===null?"Source":o.value):null);return T(()=>!n.value||!r.value||e.value.repoDisplay===!1?null:{type:o.value||"Source",label:r.value,link:n.value})};var Bv=B({name:"NavScreenDropdown",props:{config:{type:Object,required:!0}},setup(e){const t=ce(),n=Wn(e,"config"),o=T(()=>n.value.ariaLabel||n.value.text),r=K(!1);ae(()=>t.value.path,()=>{r.value=!1});const i=(a,s)=>s[s.length-1]===a;return()=>[l("button",{type:"button",class:["nav-screen-dropdown-title",{active:r.value}],"aria-label":o.value,onClick:()=>{r.value=!r.value}},[l("span",{class:"title"},[l(ze,{icon:n.value.icon}),e.config.text]),l("span",{class:["arrow",r.value?"down":"end"]})]),l("ul",{class:["nav-screen-dropdown",{hide:!r.value}]},n.value.children.map(a=>l("li",{class:"dropdown-item"},"children"in a?[l("h4",{class:"dropdown-subtitle"},a.link?l(We,{config:a,onFocusout:()=>{i(a,n.value.children)&&a.children.length===0&&(r.value=!1)}}):l("span",a.text)),l("ul",{class:"dropdown-subitem-wrapper"},a.children.map(s=>l("li",{class:"dropdown-subitem"},l(We,{config:s,onFocusout:()=>{i(s,a.children)&&i(a,n.value.children)&&(r.value=!1)}}))))]:l(We,{config:a,onFocusout:()=>{i(a,n.value.children)&&(r.value=!1)}}))))]}}),$v=B({name:"NavScreenLinks",setup(){const e=gu();return()=>e.value.length?l("nav",{class:"nav-screen-links"},e.value.map(t=>l("div",{class:"navbar-links-item"},"children"in t?l(Bv,{config:t}):l(We,{config:t})))):null}});const _u=()=>l(re,{name:"dark"},()=>l("path",{d:"M524.8 938.667h-4.267a439.893 439.893 0 0 1-313.173-134.4 446.293 446.293 0 0 1-11.093-597.334A432.213 432.213 0 0 1 366.933 90.027a42.667 42.667 0 0 1 45.227 9.386 42.667 42.667 0 0 1 10.24 42.667 358.4 358.4 0 0 0 82.773 375.893 361.387 361.387 0 0 0 376.747 82.774 42.667 42.667 0 0 1 54.187 55.04 433.493 433.493 0 0 1-99.84 154.88 438.613 438.613 0 0 1-311.467 128z"}));_u.displayName="DarkIcon";const bu=()=>l(re,{name:"light"},()=>l("path",{d:"M952 552h-80a40 40 0 0 1 0-80h80a40 40 0 0 1 0 80zM801.88 280.08a41 41 0 0 1-57.96-57.96l57.96-58a41.04 41.04 0 0 1 58 58l-58 57.96zM512 752a240 240 0 1 1 0-480 240 240 0 0 1 0 480zm0-560a40 40 0 0 1-40-40V72a40 40 0 0 1 80 0v80a40 40 0 0 1-40 40zm-289.88 88.08-58-57.96a41.04 41.04 0 0 1 58-58l57.96 58a41 41 0 0 1-57.96 57.96zM192 512a40 40 0 0 1-40 40H72a40 40 0 0 1 0-80h80a40 40 0 0 1 40 40zm30.12 231.92a41 41 0 0 1 57.96 57.96l-57.96 58a41.04 41.04 0 0 1-58-58l58-57.96zM512 832a40 40 0 0 1 40 40v80a40 40 0 0 1-80 0v-80a40 40 0 0 1 40-40zm289.88-88.08 58 57.96a41.04 41.04 0 0 1-58 58l-57.96-58a41 41 0 0 1 57.96-57.96z"}));bu.displayName="LightIcon";const yu=()=>l(re,{name:"auto"},()=>l("path",{d:"M512 992C246.92 992 32 777.08 32 512S246.92 32 512 32s480 214.92 480 480-214.92 480-480 480zm0-840c-198.78 0-360 161.22-360 360 0 198.84 161.22 360 360 360s360-161.16 360-360c0-198.78-161.22-360-360-360zm0 660V212c165.72 0 300 134.34 300 300 0 165.72-134.28 300-300 300z"}));yu.displayName="AutoIcon";const Eu=()=>l(re,{name:"enter-fullscreen"},()=>l("path",{d:"M762.773 90.24h-497.28c-96.106 0-174.4 78.293-174.4 174.4v497.28c0 96.107 78.294 174.4 174.4 174.4h497.28c96.107 0 175.04-78.293 174.4-174.4V264.64c0-96.213-78.186-174.4-174.4-174.4zm-387.2 761.173H215.04c-21.867 0-40.427-17.92-41.067-41.066V649.92c0-22.507 17.92-40.427 40.427-40.427 11.307 0 21.227 4.694 28.48 11.947 7.253 7.253 11.947 17.92 11.947 28.48v62.293l145.28-145.28c15.893-15.893 41.813-15.893 57.706 0 15.894 15.894 15.894 41.814 0 57.707l-145.28 145.28h62.294c22.506 0 40.426 17.92 40.426 40.427s-17.173 41.066-39.68 41.066zM650.24 165.76h160.427c21.866 0 40.426 17.92 41.066 41.067v160.426c0 22.507-17.92 40.427-40.426 40.427-11.307 0-21.227-4.693-28.48-11.947-7.254-7.253-11.947-17.92-11.947-28.48v-62.186L625.6 450.347c-15.893 15.893-41.813 15.893-57.707 0-15.893-15.894-15.893-41.814 0-57.707l145.28-145.28H650.88c-22.507 0-40.427-17.92-40.427-40.427s17.174-41.173 39.787-41.173z"}));Eu.displayName="EnterFullScreenIcon";const wu=()=>l(re,{name:"cancel-fullscreen"},()=>l("path",{d:"M778.468 78.62H247.922c-102.514 0-186.027 83.513-186.027 186.027V795.08c0 102.514 83.513 186.027 186.027 186.027h530.432c102.514 0 186.71-83.513 186.026-186.027V264.647C964.494 162.02 880.981 78.62 778.468 78.62zM250.88 574.35h171.122c23.324 0 43.122 19.115 43.804 43.805v171.121c0 24.008-19.114 43.122-43.122 43.122-12.06 0-22.641-5.006-30.378-12.743s-12.743-19.115-12.743-30.379V722.83L224.597 877.91c-16.953 16.952-44.6 16.952-61.553 0-16.953-16.954-16.953-44.602 0-61.554L318.009 661.39h-66.446c-24.007 0-43.122-19.114-43.122-43.122 0-24.12 18.432-43.918 42.439-43.918zm521.899-98.873H601.657c-23.325 0-43.122-19.114-43.805-43.804V260.55c0-24.007 19.115-43.122 43.122-43.122 12.06 0 22.642 5.007 30.379 12.743s12.743 19.115 12.743 30.38v66.445l154.965-154.965c16.953-16.953 44.601-16.953 61.554 0 16.953 16.953 16.953 44.6 0 61.554L705.536 388.55h66.446c24.007 0 43.122 19.115 43.122 43.122.114 24.007-18.318 43.804-42.325 43.804z"}));wu.displayName="CancelFullScreenIcon";const Au=()=>l(re,{name:"outlook"},()=>[l("path",{d:"M224 800c0 9.6 3.2 44.8 6.4 54.4 6.4 48-48 76.8-48 76.8s80 41.6 147.2 0 134.4-134.4 38.4-195.2c-22.4-12.8-41.6-19.2-57.6-19.2C259.2 716.8 227.2 761.6 224 800zM560 675.2l-32 51.2c-51.2 51.2-83.2 32-83.2 32 25.6 67.2 0 112-12.8 128 25.6 6.4 51.2 9.6 80 9.6 54.4 0 102.4-9.6 150.4-32l0 0c3.2 0 3.2-3.2 3.2-3.2 22.4-16 12.8-35.2 6.4-44.8-9.6-12.8-12.8-25.6-12.8-41.6 0-54.4 60.8-99.2 137.6-99.2 6.4 0 12.8 0 22.4 0 12.8 0 38.4 9.6 48-25.6 0-3.2 0-3.2 3.2-6.4 0-3.2 3.2-6.4 3.2-6.4 6.4-16 6.4-16 6.4-19.2 9.6-35.2 16-73.6 16-115.2 0-105.6-41.6-198.4-108.8-268.8C704 396.8 560 675.2 560 675.2zM224 419.2c0-28.8 22.4-51.2 51.2-51.2 28.8 0 51.2 22.4 51.2 51.2 0 28.8-22.4 51.2-51.2 51.2C246.4 470.4 224 448 224 419.2zM320 284.8c0-22.4 19.2-41.6 41.6-41.6 22.4 0 41.6 19.2 41.6 41.6 0 22.4-19.2 41.6-41.6 41.6C339.2 326.4 320 307.2 320 284.8zM457.6 208c0-12.8 12.8-25.6 25.6-25.6 12.8 0 25.6 12.8 25.6 25.6 0 12.8-12.8 25.6-25.6 25.6C470.4 233.6 457.6 220.8 457.6 208zM128 505.6C128 592 153.6 672 201.6 736c28.8-60.8 112-60.8 124.8-60.8-16-51.2 16-99.2 16-99.2l316.8-422.4c-48-19.2-99.2-32-150.4-32C297.6 118.4 128 291.2 128 505.6zM764.8 86.4c-22.4 19.2-390.4 518.4-390.4 518.4-22.4 28.8-12.8 76.8 22.4 99.2l9.6 6.4c35.2 22.4 80 12.8 99.2-25.6 0 0 6.4-12.8 9.6-19.2 54.4-105.6 275.2-524.8 288-553.6 6.4-19.2-3.2-32-19.2-32C777.6 76.8 771.2 80 764.8 86.4z"})]);Au.displayName="OutlookIcon";var Tu=B({name:"AppearanceSwitch",setup(){const{config:e,status:t}=Po(),n=()=>{e.value==="switch"?t.value={light:"dark",dark:"auto",auto:"light"}[t.value]:t.value=t.value==="light"?"dark":"light"};return()=>l("button",{type:"button",id:"appearance-switch",onClick:()=>n()},[l(yu,{style:{display:t.value==="auto"?"block":"none"}}),l(_u,{style:{display:t.value==="dark"?"block":"none"}}),l(bu,{style:{display:t.value==="light"?"block":"none"}})])}}),Nv=B({name:"AppearanceMode",setup(){const e=ue(),{canToggle:t}=Po(),n=T(()=>e.value.outlookLocales.darkmode);return()=>t.value?l("div",{class:"appearance-wrapper"},[l("label",{class:"appearance-title",for:"appearance-switch"},n.value),l(Tu)]):null}});const Fr="VUEPRESS_THEME_COLOR";var zv=B({name:"ThemeColorPicker",props:{themeColor:{type:Object,required:!0}},setup(e){const t=(n="")=>{const o=document.documentElement.classList,r=wt(e.themeColor);if(!n){localStorage.removeItem(Fr),o.remove(...r);return}o.remove(...r.filter(i=>i!==n)),o.add(n),localStorage.setItem(Fr,n)};return ge(()=>{const n=localStorage.getItem(Fr);n&&t(n)}),()=>l("ul",{id:"theme-color-picker"},[l("li",l("span",{class:"theme-color",onClick:()=>t()})),wo(e.themeColor).map(([n,o])=>l("li",l("span",{style:{background:o},onClick:()=>t(n)})))])}});const kn=ta.enableThemeColor==="true",Fv=kn?A2(wo(ta).filter(([e])=>e.startsWith("theme-"))):{};var Hv=B({name:"ThemeColor",setup(){const e=ue(),t=T(()=>e.value.outlookLocales.themeColor);return()=>kn?l("div",{class:"theme-color-wrapper"},[l("label",{class:"theme-color-title",for:"theme-color-picker"},t.value),l(zv,{themeColor:Fv})]):null}}),Iu=B({name:"ToggleFullScreenButton",setup(){const e=ue(),{isSupported:t,isFullscreen:n,toggle:o}=Ji(),r=T(()=>e.value.outlookLocales.fullscreen);return()=>t?l("div",{class:"full-screen-wrapper"},[l("label",{class:"full-screen-title",for:"full-screen-switch"},r.value),l("button",{type:"button",id:"full-screen-switch",class:"full-screen",ariaPressed:n.value,onClick:()=>o()},n.value?l(wu):l(Eu))]):null}}),Pu=B({name:"OutlookSettings",setup(){const e=hn(),t=Gn(),n=T(()=>!t.value&&e.value.fullscreen);return()=>l(hr,()=>[kn?l(Hv):null,l(Nv),n.value?l(Iu):null])}}),jv=B({name:"NavScreen",props:{show:Boolean},emits:["close"],slots:Object,setup(e,{emit:t,slots:n}){const o=ce(),{isMobile:r}=Io(),i=$e(),a=Qi(i);return ge(()=>{i.value=document.body,ae(r,s=>{!s&&e.show&&(a.value=!1,t("close"))}),ae(()=>o.value.path,()=>{a.value=!1,t("close")})}),fn(()=>{a.value=!1}),()=>l(Yt,{name:"fade",onEnter:()=>{a.value=!0},onAfterLeave:()=>{a.value=!1}},()=>{var s,c;return e.show?l("div",{id:"nav-screen"},l("div",{class:"vp-nav-screen-container"},[(s=n.before)==null?void 0:s.call(n),l($v),l("div",{class:"vp-outlook-wrapper"},l(Pu)),(c=n.after)==null?void 0:c.call(n)])):null})}}),Wv=B({name:"NavbarBrand",setup(){const e=At(),t=Un(),n=ue(),o=T(()=>n.value.home||e.value),r=T(()=>t.value.title),i=T(()=>n.value.navTitle??r.value),a=T(()=>n.value.logo?Ie(n.value.logo):null),s=T(()=>n.value.logoDark?Ie(n.value.logoDark):null);return()=>l(Ve,{to:o.value,class:"vp-brand"},()=>[a.value?l("img",{class:["vp-nav-logo",{light:!!s.value}],src:a.value,alt:r.value}):null,s.value?l("img",{class:["vp-nav-logo dark"],src:s.value,alt:r.value}):null,i.value?l("span",{class:["vp-site-name",{"hide-in-pad":a.value&&n.value.hideSiteNameOnMobile!==!1}]},i.value):null])}}),Uv=B({name:"NavbarLinks",setup(){const e=gu();return()=>e.value.length?l("nav",{class:"vp-nav-links"},e.value.map(t=>l("div",{class:"nav-item hide-in-mobile"},"children"in t?l(Vv,{config:t}):l(We,{config:t})))):null}}),Gv=B({name:"RepoLink",components:{BitbucketIcon:Mc,GiteeIcon:Vc,GitHubIcon:Dc,GitLabIcon:Cc,SourceIcon:Bc},setup(){const e=Mv();return()=>e.value?l("div",{class:"nav-item vp-repo"},l("a",{class:"vp-repo-link",href:e.value.link,target:"_blank",rel:"noopener noreferrer","aria-label":e.value.label},l(Je(`${e.value.type}Icon`),{style:{width:"1.25rem",height:"1.25rem",verticalAlign:"middle"}}))):null}});const Ou=({active:e=!1},{emit:t})=>l("button",{type:"button",class:["vp-toggle-navbar-button",{"is-active":e}],"aria-label":"Toggle Navbar","aria-expanded":e,"aria-controls":"nav-screen",onClick:()=>t("toggle")},l("span",[l("span",{class:"vp-top"}),l("span",{class:"vp-middle"}),l("span",{class:"vp-bottom"})]));Ou.displayName="ToggleNavbarButton";var Kv=Ou;const si=(e,{emit:t})=>l("button",{type:"button",class:"vp-toggle-sidebar-button",title:"Toggle Sidebar",onClick:()=>t("toggle")},l("span",{class:"icon"}));si.displayName="ToggleSidebarButton",si.emits=["toggle"];var qv=si,Yv=B({name:"OutlookButton",setup(){const{isSupported:e}=Ji(),t=hn(),n=Gn(),o=ce(),{canToggle:r}=Po(),i=K(!1),a=T(()=>!n.value&&t.value.fullscreen&&e);return ae(()=>o.value.path,()=>{i.value=!1}),()=>r.value||a.value||kn?l("div",{class:"nav-item hide-in-mobile"},r.value&&!a.value&&!kn?l(Tu):a.value&&!r.value&&!kn?l(Iu):l("button",{type:"button",class:["outlook-button",{open:i.value}],tabindex:"-1","aria-hidden":!0},[l(Au),l("div",{class:"outlook-dropdown"},l(Pu))])):null}}),Zv=B({name:"NavBar",emits:["toggleSidebar"],slots:Object,setup(e,{emit:t,slots:n}){const o=ue(),{isMobile:r}=Io(),i=K(!1),a=T(()=>{const{navbarAutoHide:p="mobile"}=o.value;return p!=="none"&&(p==="always"||r.value)}),s=T(()=>o.value.navbarLayout||{start:["Brand"],center:["Links"],end:["Language","Repo","Outlook","Search"]}),c={Brand:Wv,Language:Nr,Links:Uv,Repo:Gv,Outlook:Yv,Search:Ye("Docsearch")?Je("Docsearch"):Ye("SearchBox")?Je("SearchBox"):Nr},u=p=>c[p]??(Ye(p)?Je(p):Nr);return()=>{var p,f,v,h,_,y;return[l("header",{id:"navbar",class:["vp-navbar",{"auto-hide":a.value,"hide-icon":o.value.navbarIcon===!1}]},[l("div",{class:"vp-navbar-start"},[l(qv,{onToggle:()=>{i.value&&(i.value=!1),t("toggleSidebar")}}),(p=n.startBefore)==null?void 0:p.call(n),(s.value.start||[]).map(P=>l(u(P))),(f=n.startAfter)==null?void 0:f.call(n)]),l("div",{class:"vp-navbar-center"},[(v=n.centerBefore)==null?void 0:v.call(n),(s.value.center||[]).map(P=>l(u(P))),(h=n.centerAfter)==null?void 0:h.call(n)]),l("div",{class:"vp-navbar-end"},[(_=n.endBefore)==null?void 0:_.call(n),(s.value.end||[]).map(P=>l(u(P))),(y=n.endAfter)==null?void 0:y.call(n),l(Kv,{active:i.value,onToggle:()=>{i.value=!i.value}})])]),l(jv,{show:i.value,onClose:()=>{i.value=!1}},{before:()=>{var P;return(P=n.screenTop)==null?void 0:P.call(n)},after:()=>{var P;return(P=n.screenBottom)==null?void 0:P.call(n)}})]}}}),Xv=B({name:"SidebarChild",props:{config:{type:Object,required:!0}},setup(e){const t=gt();return()=>[du(e.config,{class:["vp-sidebar-link",`vp-sidebar-${e.config.type}`,{active:Nn(t,e.config,!0)}],exact:!0}),fu(e.config.children)]}}),Jv=B({name:"SidebarGroup",props:{config:{type:Object,required:!0},open:{type:Boolean,required:!0}},emits:["toggle"],setup(e,{emit:t}){const n=gt(),o=T(()=>Nn(n,e.config)),r=T(()=>Nn(n,e.config,!0));return()=>{const{collapsible:i,children:a=[],icon:s,prefix:c,link:u,text:p}=e.config;return l("section",{class:"vp-sidebar-group"},[l(i?"button":"p",{class:["vp-sidebar-heading",{clickable:i||u,exact:r.value,active:o.value}],...i?{type:"button",onClick:()=>t("toggle"),onKeydown:f=>{f.key==="Enter"&&t("toggle")}}:{}},[l(ze,{icon:s}),u?l(We,{class:"vp-sidebar-title",config:{text:p,link:u},noExternalLinkIcon:!0}):l("span",{class:"vp-sidebar-title"},p),i?l("span",{class:["vp-arrow",e.open?"down":"end"]}):null]),e.open||!i?l(ku,{key:c,config:a}):null])}}}),ku=B({name:"SidebarLinks",props:{config:{type:Array,required:!0}},setup(e){const t=gt(),n=K(-1),o=r=>{n.value=r===n.value?-1:r};return ae(()=>t.path,()=>{const r=e.config.findIndex(i=>pu(t,i));n.value=r},{immediate:!0,flush:"post"}),()=>l("ul",{class:"vp-sidebar-links"},e.config.map((r,i)=>l("li",r.type==="group"?l(Jv,{config:r,open:i===n.value,onToggle:()=>o(i)}):l(Xv,{config:r}))))}}),Qv=B({name:"SideBar",slots:Object,setup(e,{slots:t}){const n=gt(),o=ue(),r=ra(),i=$e();return ge(()=>{ae(()=>n.hash,a=>{const s=document.querySelector(`.vp-sidebar a.vp-sidebar-link[href="${n.path}${a}"]`);if(!s)return;const{top:c,height:u}=i.value.getBoundingClientRect(),{top:p,height:f}=s.getBoundingClientRect();pc+u&&s.scrollIntoView(!1)},{immediate:!0})}),()=>{var a,s,c;return l("aside",{ref:i,id:"sidebar",class:["vp-sidebar",{"hide-icon":o.value.sidebarIcon===!1}]},[(a=t.top)==null?void 0:a.call(t),((s=t.default)==null?void 0:s.call(t))||l(ku,{config:r.value}),(c=t.bottom)==null?void 0:c.call(t)])}}}),ia=B({name:"CommonWrapper",props:{containerClass:{type:String,default:""},noNavbar:Boolean,noSidebar:Boolean,noToc:Boolean},slots:Object,setup(e,{slots:t}){const n=Fe(),o=ce(),r=we(),i=ue(),{isMobile:a,isPC:s}=Io(),[c,u]=Rl(!1),[p,f]=Rl(!1),v=ra(),h=K(!1),_=T(()=>e.noNavbar||r.value.navbar===!1||i.value.navbar===!1?!1:!!(o.value.title||i.value.logo||i.value.repo||i.value.navbar)),y=T(()=>e.noSidebar?!1:r.value.sidebar!==!1&&v.value.length!==0&&!r.value.home),P=T(()=>e.noToc||r.value.home?!1:r.value.toc||i.value.toc!==!1&&r.value.toc!==!1),E={x:0,y:0},k=x=>{E.x=x.changedTouches[0].clientX,E.y=x.changedTouches[0].clientY},A=x=>{const $=x.changedTouches[0].clientX-E.x,R=x.changedTouches[0].clientY-E.y;Math.abs($)>Math.abs(R)*1.5&&Math.abs($)>40&&($>0&&E.x<=80?u(!0):u(!1))},I=()=>window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;let V=0;return Re("scroll",$2(()=>{const x=I();x<=58||x{x||u(!1)}),ge(()=>{const x=Qi(document.body);ae(c,R=>{x.value=R});const $=n.afterEach(()=>{u(!1)});fn(()=>{x.value=!1,$()})}),()=>l(Ye("GlobalEncrypt")?Je("GlobalEncrypt"):Tc,()=>l("div",{class:["theme-container",{"no-navbar":!_.value,"no-sidebar":!y.value&&!(t.sidebar||t.sidebarTop||t.sidebarBottom),"has-toc":P.value,"hide-navbar":h.value,"sidebar-collapsed":!a.value&&!s.value&&p.value,"sidebar-open":a.value&&c.value},e.containerClass,r.value.containerClass||""],onTouchStart:k,onTouchEnd:A},[_.value?l(Zv,{onToggleSidebar:()=>u()},{startBefore:()=>{var x;return(x=t.navbarStartBefore)==null?void 0:x.call(t)},startAfter:()=>{var x;return(x=t.navbarStartAfter)==null?void 0:x.call(t)},centerBefore:()=>{var x;return(x=t.navbarCenterBefore)==null?void 0:x.call(t)},centerAfter:()=>{var x;return(x=t.navbarCenterAfter)==null?void 0:x.call(t)},endBefore:()=>{var x;return(x=t.navbarEndBefore)==null?void 0:x.call(t)},endAfter:()=>{var x;return(x=t.navbarEndAfter)==null?void 0:x.call(t)},screenTop:()=>{var x;return(x=t.navScreenTop)==null?void 0:x.call(t)},screenBottom:()=>{var x;return(x=t.navScreenBottom)==null?void 0:x.call(t)}}):null,l(Yt,{name:"fade"},()=>c.value?l("div",{class:"vp-sidebar-mask",onClick:()=>u(!1)}):null),l(Yt,{name:"fade"},()=>a.value?null:l("div",{class:"toggle-sidebar-wrapper",onClick:()=>f()},l("span",{class:["arrow",p.value?"end":"start"]}))),l(Qv,{},{...t.sidebar?{default:()=>t.sidebar()}:{},top:()=>{var x;return(x=t.sidebarTop)==null?void 0:x.call(t)},bottom:()=>{var x;return(x=t.sidebarBottom)==null?void 0:x.call(t)}}),t.default(),l(Cv)]))}}),he=B({name:"DropTransition",props:{type:{type:String,default:"single"},delay:{type:Number,default:0},duration:{type:Number,default:.25},appear:Boolean},slots:Object,setup(e,{slots:t}){const n=r=>{r.style.transition=`transform ${e.duration}s ease-in-out ${e.delay}s, opacity ${e.duration}s ease-in-out ${e.delay}s`,r.style.transform="translateY(-20px)",r.style.opacity="0"},o=r=>{r.style.transform="translateY(0)",r.style.opacity="1"};return()=>l(e.type==="single"?Yt:xd,{name:"drop",appear:e.appear,onAppear:n,onAfterAppear:o,onEnter:n,onAfterEnter:o,onBeforeLeave:n},()=>t.default())}});const ci=({custom:e})=>l(dc,{class:["theme-hope-content",{custom:e}]});ci.displayName="MarkdownContent",ci.props={custom:Boolean};var aa=ci;const Lu=()=>l(re,{name:"author"},()=>l("path",{d:"M649.6 633.6c86.4-48 147.2-144 147.2-249.6 0-160-128-288-288-288s-288 128-288 288c0 108.8 57.6 201.6 147.2 249.6-121.6 48-214.4 153.6-240 288-3.2 9.6 0 19.2 6.4 25.6 3.2 9.6 12.8 12.8 22.4 12.8h704c9.6 0 19.2-3.2 25.6-12.8 6.4-6.4 9.6-16 6.4-25.6-25.6-134.4-121.6-240-243.2-288z"}));Lu.displayName="AuthorIcon";const Ru=()=>l(re,{name:"calendar"},()=>l("path",{d:"M716.4 110.137c0-18.753-14.72-33.473-33.472-33.473-18.753 0-33.473 14.72-33.473 33.473v33.473h66.993v-33.473zm-334.87 0c0-18.753-14.72-33.473-33.473-33.473s-33.52 14.72-33.52 33.473v33.473h66.993v-33.473zm468.81 33.52H716.4v100.465c0 18.753-14.72 33.473-33.472 33.473a33.145 33.145 0 01-33.473-33.473V143.657H381.53v100.465c0 18.753-14.72 33.473-33.473 33.473a33.145 33.145 0 01-33.473-33.473V143.657H180.6A134.314 134.314 0 0046.66 277.595v535.756A134.314 134.314 0 00180.6 947.289h669.74a134.36 134.36 0 00133.94-133.938V277.595a134.314 134.314 0 00-133.94-133.938zm33.473 267.877H147.126a33.145 33.145 0 01-33.473-33.473c0-18.752 14.72-33.473 33.473-33.473h736.687c18.752 0 33.472 14.72 33.472 33.473a33.145 33.145 0 01-33.472 33.473z"}));Ru.displayName="CalendarIcon";const Su=()=>l(re,{name:"category"},()=>l("path",{d:"M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"}));Su.displayName="CategoryIcon";const xu=()=>l(re,{name:"eye"},()=>l("path",{d:"M992 512.096c0-5.76-.992-10.592-1.28-11.136-.192-2.88-1.152-8.064-2.08-10.816-.256-.672-.544-1.376-.832-2.08-.48-1.568-1.024-3.104-1.6-4.32C897.664 290.112 707.104 160 512 160c-195.072 0-385.632 130.016-473.76 322.592-1.056 2.112-1.792 4.096-2.272 5.856a55.512 55.512 0 00-.64 1.6c-1.76 5.088-1.792 8.64-1.632 7.744-.832 3.744-1.568 11.168-1.568 11.168-.224 2.272-.224 4.032.032 6.304 0 0 .736 6.464 1.088 7.808.128 1.824.576 4.512 1.12 6.976h-.032c.448 2.08 1.12 4.096 1.984 6.08.48 1.536.992 2.976 1.472 4.032C126.432 733.856 316.992 864 512 864c195.136 0 385.696-130.048 473.216-321.696 1.376-2.496 2.24-4.832 2.848-6.912.256-.608.48-1.184.672-1.728 1.536-4.48 1.856-8.32 1.728-8.32l-.032.032c.608-3.104 1.568-7.744 1.568-13.28zM512 672c-88.224 0-160-71.776-160-160s71.776-160 160-160 160 71.776 160 160-71.776 160-160 160z"}));xu.displayName="EyeIcon";const Du=()=>l(re,{name:"fire"},()=>l("path",{d:"M726.4 201.6c-12.8-9.6-28.8-6.4-38.4 0-9.6 9.6-16 25.6-9.6 38.4 6.4 12.8 9.6 28.8 12.8 44.8C604.8 83.2 460.8 38.4 454.4 35.2c-9.6-3.2-22.4 0-28.8 6.4-9.6 6.4-12.8 19.2-9.6 28.8 12.8 86.4-25.6 188.8-115.2 310.4-6.4-25.6-16-51.2-32-80-9.6-9.6-22.4-16-35.2-12.8-16 3.2-25.6 12.8-25.6 28.8-3.2 48-25.6 92.8-51.2 140.8C134.4 499.2 112 544 102.4 592c-32 150.4 99.2 329.6 233.6 380.8 9.6 3.2 19.2 6.4 32 9.6-25.6-19.2-41.6-51.2-48-96C294.4 691.2 505.6 640 515.2 460.8c153.6 105.6 224 336 137.6 505.6 3.2 0 6.4-3.2 9.6-3.2 0 0 3.2 0 3.2-3.2 163.2-89.6 252.8-208 259.2-345.6 16-211.2-163.2-390.4-198.4-412.8z"}));Du.displayName="FireIcon";const Cu=()=>l(re,{name:"print"},()=>l("path",{d:"M819.2 364.8h-44.8V128c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v236.8h-44.8C145.067 364.8 96 413.867 96 473.6v192c0 59.733 49.067 108.8 108.8 108.8h44.8V896c0 17.067 14.933 32 32 32h460.8c17.067 0 32-14.933 32-32V774.4h44.8c59.733 0 108.8-49.067 108.8-108.8v-192c0-59.733-49.067-108.8-108.8-108.8zM313.6 160h396.8v204.8H313.6V160zm396.8 704H313.6V620.8h396.8V864zM864 665.6c0 25.6-19.2 44.8-44.8 44.8h-44.8V588.8c0-17.067-14.933-32-32-32H281.6c-17.067 0-32 14.933-32 32v121.6h-44.8c-25.6 0-44.8-19.2-44.8-44.8v-192c0-25.6 19.2-44.8 44.8-44.8h614.4c25.6 0 44.8 19.2 44.8 44.8v192z"}));Cu.displayName="PrintIcon";const Vu=()=>l(re,{name:"tag"},()=>l("path",{d:"M939.902 458.563L910.17 144.567c-1.507-16.272-14.465-29.13-30.737-30.737L565.438 84.098h-.402c-3.215 0-5.726 1.005-7.634 2.913l-470.39 470.39a10.004 10.004 0 000 14.164l365.423 365.424c1.909 1.908 4.42 2.913 7.132 2.913s5.223-1.005 7.132-2.913l470.39-470.39c2.01-2.11 3.014-5.023 2.813-8.036zm-240.067-72.121c-35.458 0-64.286-28.828-64.286-64.286s28.828-64.285 64.286-64.285 64.286 28.828 64.286 64.285-28.829 64.286-64.286 64.286z"}));Vu.displayName="TagIcon";const Mu=()=>l(re,{name:"timer"},()=>l("path",{d:"M799.387 122.15c4.402-2.978 7.38-7.897 7.38-13.463v-1.165c0-8.933-7.38-16.312-16.312-16.312H256.33c-8.933 0-16.311 7.38-16.311 16.312v1.165c0 5.825 2.977 10.874 7.637 13.592 4.143 194.44 97.22 354.963 220.201 392.763-122.204 37.542-214.893 196.511-220.2 389.397-4.661 5.049-7.638 11.651-7.638 19.03v5.825h566.49v-5.825c0-7.379-2.849-13.981-7.509-18.9-5.049-193.016-97.867-351.985-220.2-389.527 123.24-37.67 216.446-198.453 220.588-392.892zM531.16 450.445v352.632c117.674 1.553 211.787 40.778 211.787 88.676H304.097c0-48.286 95.149-87.382 213.728-88.676V450.445c-93.077-3.107-167.901-81.297-167.901-177.093 0-8.803 6.99-15.793 15.793-15.793 8.803 0 15.794 6.99 15.794 15.793 0 80.261 63.69 145.635 142.01 145.635s142.011-65.374 142.011-145.635c0-8.803 6.99-15.793 15.794-15.793s15.793 6.99 15.793 15.793c0 95.019-73.789 172.82-165.96 177.093z"}));Mu.displayName="TimerIcon";const Bu=()=>l(re,{name:"word"},()=>[l("path",{d:"M518.217 432.64V73.143A73.143 73.143 0 01603.43 1.097a512 512 0 01419.474 419.474 73.143 73.143 0 01-72.046 85.212H591.36a73.143 73.143 0 01-73.143-73.143z"}),l("path",{d:"M493.714 566.857h340.297a73.143 73.143 0 0173.143 85.577A457.143 457.143 0 11371.566 117.76a73.143 73.143 0 0185.577 73.143v339.383a36.571 36.571 0 0036.571 36.571z"})]);Bu.displayName="WordIcon";const Mt=()=>{const e=ue();return T(()=>e.value.metaLocales)};var eh=B({name:"AuthorInfo",inheritAttrs:!1,props:{author:{type:Array,required:!0},pure:Boolean},setup(e){const t=Mt();return()=>e.author.length?l("span",{class:"page-author-info","aria-label":`${t.value.author}${e.pure?"":"🖊"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Lu),l("span",e.author.map(n=>n.url?l("a",{class:"page-author-item",href:n.url,target:"_blank",rel:"noopener noreferrer"},n.name):l("span",{class:"page-author-item"},n.name))),l("span",{property:"author",content:e.author.map(n=>n.name).join(", ")})]):null}}),th=B({name:"CategoryInfo",inheritAttrs:!1,props:{category:{type:Array,required:!0},pure:Boolean},setup(e){const t=Fe(),n=ce(),o=Mt(),r=(i,a="")=>{a&&n.value.path!==a&&(i.preventDefault(),t.push(a))};return()=>e.category.length?l("span",{class:"page-category-info","aria-label":`${o.value.category}${e.pure?"":"🌈"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Su),e.category.map(({name:i,path:a})=>l("span",{class:["page-category-item",{[`category${br(i,9)}`]:!e.pure,clickable:a}],role:a?"navigation":"",onClick:s=>r(s,a)},i)),l("meta",{property:"articleSection",content:e.category.map(({name:i})=>i).join(",")})]):null}}),nh=B({name:"DateInfo",inheritAttrs:!1,props:{date:{type:Object,default:null},localizedDate:{type:String,default:""},pure:Boolean},setup(e){const t=vr(),n=Mt();return()=>e.date?l("span",{class:"page-date-info","aria-label":`${n.value.date}${e.pure?"":"📅"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Ru),l("span",l(hr,()=>e.localizedDate||e.date.toLocaleDateString(t.value))),l("meta",{property:"datePublished",content:e.date.toISOString()||""})]):null}}),oh=B({name:"OriginalInfo",inheritAttrs:!1,props:{isOriginal:Boolean},setup(e){const t=Mt();return()=>e.isOriginal?l("span",{class:"page-original-info"},t.value.origin):null}}),rh=B({name:"PageViewInfo",inheritAttrs:!1,props:{pageview:{type:[Boolean,String],default:!1},pure:Boolean},setup(e){const t=gt(),n=Mt(),o=$e(),r=K(0);return tf(o,()=>{const i=o.value.textContent;i&&!isNaN(Number(i))&&(r.value=Number(i))},{childList:!0}),()=>e.pageview?l("span",{class:"page-pageview-info","aria-label":`${n.value.views}${e.pure?"":"🔢"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(r.value<1e3?xu:Du),l("span",{ref:o,id:"ArtalkPV",class:"waline-pageview-count","data-path":ie(e.pageview)?e.pageview:t.path},"...")]):null}}),ih=B({name:"ReadingTimeInfo",inheritAttrs:!1,props:{readingTime:{type:Object,default:()=>null},readingTimeLocale:{type:Object,default:()=>null},pure:Boolean},setup(e){const t=Mt(),n=T(()=>{if(!e.readingTime)return null;const{minutes:o}=e.readingTime;return o<1?"PT1M":`PT${Math.round(o)}M`});return()=>{var o,r;return(o=e.readingTimeLocale)!=null&&o.time?l("span",{class:"page-reading-time-info","aria-label":`${t.value.readingTime}${e.pure?"":"⌛"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Mu),l("span",(r=e.readingTimeLocale)==null?void 0:r.time),l("meta",{property:"timeRequired",content:n.value})]):null}}}),ah=B({name:"TagInfo",inheritAttrs:!1,props:{tag:{type:Array,default:()=>[]},pure:Boolean},setup(e){const t=Fe(),n=ce(),o=Mt(),r=(i,a="")=>{a&&n.value.path!==a&&(i.preventDefault(),t.push(a))};return()=>e.tag.length?l("span",{class:"page-tag-info","aria-label":`${o.value.tag}${e.pure?"":"🏷"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Vu),e.tag.map(({name:i,path:a})=>l("span",{class:["page-tag-item",{[`tag${br(i,9)}`]:!e.pure,clickable:a}],role:a?"navigation":"",onClick:s=>r(s,a)},i)),l("meta",{property:"keywords",content:e.tag.map(({name:i})=>i).join(",")})]):null}}),lh=B({name:"ReadTimeInfo",inheritAttrs:!1,props:{readingTime:{type:Object,default:()=>null},readingTimeLocale:{type:Object,default:()=>null},pure:Boolean},setup(e){const t=Mt();return()=>{var n,o,r;return(n=e.readingTimeLocale)!=null&&n.words?l("span",{class:"page-word-info","aria-label":`${t.value.words}${e.pure?"":"🔠"}`,...e.pure?{}:{"data-balloon-pos":"down"}},[l(Bu),l("span",(o=e.readingTimeLocale)==null?void 0:o.words),l("meta",{property:"wordCount",content:(r=e.readingTime)==null?void 0:r.words})]):null}}}),$u=B({name:"PageInfo",components:{AuthorInfo:eh,CategoryInfo:th,DateInfo:nh,OriginalInfo:oh,PageViewInfo:rh,ReadingTimeInfo:ih,TagInfo:ah,WordInfo:lh},props:{items:{type:[Array,Boolean],default:()=>["Author","Original","Date","PageView","ReadingTime","Category","Tag"]},info:{type:Object,required:!0}},setup(e){const t=Gn();return()=>e.items?l("div",{class:"page-info"},e.items.map(n=>l(Je(`${n}Info`),{...e.info,pure:t.value}))):null}}),sh=B({name:"PrintButton",setup(){const e=hn(),t=ue();return()=>e.value.print===!1?null:l("button",{type:"button",class:"print-button",title:t.value.metaLocales.print,onClick:()=>{window.print()}},l(Cu))}});const ch=({title:e,level:t,slug:n})=>l(Ve,{to:`#${n}`,class:["toc-link",`level${t}`]},()=>e),ui=(e,t)=>{const n=gt();return e.length&&t>0?l("ul",{class:"toc-list"},e.map(o=>{const r=ui(o.children,t-1);return[l("li",{class:["toc-item",{active:Ki(n,`#${o.slug}`)}]},ch(o)),r?l("li",r):null]})):null};var Nu=B({name:"TOC",props:{items:{type:Array,default:()=>[]},headerDepth:{type:Number,default:2}},slots:Object,setup(e,{slots:t}){const n=gt(),o=ce(),r=Mt(),i=$e(),a=K("-1.7rem"),s=u=>{var p;(p=i.value)==null||p.scrollTo({top:u,behavior:"smooth"})},c=()=>{if(i.value){const u=document.querySelector(".toc-item.active");u?a.value=`${u.getBoundingClientRect().top-i.value.getBoundingClientRect().top+i.value.scrollTop}px`:a.value="-1.7rem"}else a.value="-1.7rem"};return ge(()=>{ae(()=>n.hash,u=>{if(i.value){const p=document.querySelector(`#toc a.toc-link[href$="${u}"]`);if(!p)return;const{top:f,height:v}=i.value.getBoundingClientRect(),{top:h,height:_}=p.getBoundingClientRect();hf+v&&s(i.value.scrollTop+h+_-f-v)}}),ae(()=>n.fullPath,c,{flush:"post",immediate:!0})}),()=>{var p,f;const u=e.items.length?ui(e.items,e.headerDepth):o.value.headers?ui(o.value.headers,e.headerDepth):null;return u?l("div",{class:"toc-place-holder"},[l("aside",{id:"toc"},[(p=t.before)==null?void 0:p.call(t),l("div",{class:"toc-header"},[r.value.toc,l(sh)]),l("div",{class:"toc-wrapper",ref:i},[u,l("div",{class:"toc-marker",style:{top:a.value}})]),(f=t.after)==null?void 0:f.call(t)])]):null}}}),la=B({name:"SkipLink",props:{content:{type:String,default:"main-content"}},setup(e){const t=ce(),n=ue(),o=$e(),r=({target:i})=>{const a=document.querySelector(i.hash);if(a){const s=()=>{a.removeAttribute("tabindex"),a.removeEventListener("blur",s)};a.setAttribute("tabindex","-1"),a.addEventListener("blur",s),a.focus(),window.scrollTo(0,0)}};return ge(()=>{ae(()=>t.value.path,()=>o.value.focus())}),()=>[l("span",{ref:o,tabindex:"-1"}),l("a",{href:`#${e.content}`,class:"vp-skip-link sr-only",onClick:r},n.value.routeLocales.skipToContent)]}});let Hr=null,Xn=null;const uh={wait:()=>Hr,pending:()=>{Hr=new Promise(e=>Xn=e)},resolve:()=>{Xn==null||Xn(),Hr=null,Xn=null}},zu=()=>uh;var ph=B({name:"FadeSlideY",slots:Object,setup(e,{slots:t}){const{resolve:n,pending:o}=zu();return()=>l(Yt,{name:"fade-slide-y",mode:"out-in",onBeforeEnter:n,onBeforeLeave:o},()=>{var r;return(r=t.default)==null?void 0:r.call(t)})}});const dh=(e,t)=>{const n=e.replace(t,"/").split("/"),o=[];let r=Fi(t);return n.forEach((i,a)=>{a!==n.length-1?(r+=`${i}/`,o.push({link:r,name:i||"Home"})):i!==""&&(r+=i,o.push({link:r,name:i}))}),o},Fu=(e,{slots:t})=>{var f,v;const{bgImage:n,bgImageDark:o,bgImageStyle:r,color:i,description:a,image:s,imageDark:c,header:u,features:p=[]}=e;return l("div",{class:"vp-feature-wrapper"},[n?l("div",{class:["vp-feature-bg",{light:o}],style:[{"background-image":`url(${n})`},r]}):null,o?l("div",{class:"vp-feature-bg dark",style:[{"background-image":`url(${o})`},r]}):null,l("div",{class:"vp-feature",style:i?{color:i}:{}},[((f=t.image)==null?void 0:f.call(t,e))||[s?l("img",{class:["vp-feature-image",{light:c}],src:Ie(s),alt:u}):null,c?l("img",{class:"vp-feature-image dark",src:Ie(c),alt:u}):null],((v=t.info)==null?void 0:v.call(t,e))||[u?l("h2",{class:"vp-feature-header"},u):null,a?l("p",{class:"vp-feature-description",innerHTML:a}):null],p.length?l("div",{class:"vp-features"},p.map(({icon:h,title:_,details:y,link:P})=>{const E=[l("h3",{class:"vp-feature-title"},[l(ze,{icon:h}),l("span",{innerHTML:_})]),l("p",{class:"vp-feature-details",innerHTML:y})];return P?rr(P)?l("a",{class:"vp-feature-item link",href:P,role:"navigation","aria-label":_,target:"_blank"},E):l(Ve,{class:"vp-feature-item link",to:P,role:"navigation","aria-label":_},()=>E):l("div",{class:"vp-feature-item"},E)})):null])])};Fu.displayName="FeaturePanel";var Gl=Fu,fh=B({name:"HeroInfo",slots:Object,setup(e,{slots:t}){const n=we(),o=Un(),r=T(()=>n.value.heroFullScreen??!1),i=T(()=>{const{heroText:u,tagline:p}=n.value;return{text:u??o.value.title??"Hello",tagline:p??o.value.description??"",isFullScreen:r.value}}),a=T(()=>{const{heroText:u,heroImage:p,heroImageDark:f,heroAlt:v,heroImageStyle:h}=n.value;return{image:p?Ie(p):null,imageDark:f?Ie(f):null,heroStyle:h,alt:v||u||"hero image",isFullScreen:r.value}}),s=T(()=>{const{bgImage:u,bgImageDark:p,bgImageStyle:f}=n.value;return{image:St(u)?Ie(u):null,imageDark:St(p)?Ie(p):null,bgStyle:f,isFullScreen:r.value}}),c=T(()=>n.value.actions??[]);return()=>{var u,p,f;return l("header",{class:["vp-hero-info-wrapper",{fullscreen:r.value}]},[((u=t.heroBg)==null?void 0:u.call(t,s.value))||[s.value.image?l("div",{class:["vp-hero-mask",{light:s.value.imageDark}],style:[{"background-image":`url(${s.value.image})`},s.value.bgStyle]}):null,s.value.imageDark?l("div",{class:"vp-hero-mask dark",style:[{"background-image":`url(${s.value.imageDark})`},s.value.bgStyle]}):null],l("div",{class:"vp-hero-info"},[((p=t.heroImage)==null?void 0:p.call(t,a.value))||l(he,{appear:!0,type:"group"},()=>[a.value.image?l("img",{key:"light",class:["vp-hero-image",{light:a.value.imageDark}],style:a.value.heroStyle,src:a.value.image,alt:a.value.alt}):null,a.value.imageDark?l("img",{key:"dark",class:"vp-hero-image dark",style:a.value.heroStyle,src:a.value.imageDark,alt:a.value.alt}):null]),((f=t.heroInfo)==null?void 0:f.call(t,i.value))??l("div",{class:"vp-hero-infos"},[i.value.text?l(he,{appear:!0,delay:.04},()=>l("h1",{id:"main-title"},i.value.text)):null,i.value.tagline?l(he,{appear:!0,delay:.08},()=>l("p",{class:"vp-description",innerHTML:i.value.tagline})):null,c.value.length?l(he,{appear:!0,delay:.12},()=>l("p",{class:"vp-actions"},c.value.map(v=>l(We,{class:["vp-action",v.type||"default"],config:v,noExternalLinkIcon:!0})))):null])])])}}});const Hu=(e,{slots:t})=>{var v,h,_;const{bgImage:n,bgImageDark:o,bgImageStyle:r,color:i,description:a,image:s,imageDark:c,header:u,highlights:p=[],type:f="un-order"}=e;return l("div",{class:"vp-highlight-wrapper",style:i?{color:i}:{}},[n?l("div",{class:["vp-highlight-bg",{light:o}],style:[{"background-image":`url(${n})`},r]}):null,o?l("div",{class:"vp-highlight-bg dark",style:[{"background-image":`url(${o})`},r]}):null,l("div",{class:"vp-highlight"},[((v=t.image)==null?void 0:v.call(t,e))||[s?l("img",{class:["vp-highlight-image",{light:c}],src:Ie(s),alt:u}):null,c?l("img",{class:"vp-highlight-image dark",src:Ie(c),alt:u}):null],((h=t.info)==null?void 0:h.call(t,e))||[l("div",{class:"vp-highlight-info-wrapper"},l("div",{class:"vp-highlight-info"},[u?l("h2",{class:"vp-highlight-header",innerHTML:u}):null,a?l("p",{class:"vp-highlight-description",innerHTML:a}):null,((_=t.highlights)==null?void 0:_.call(t,p))||l(f==="order"?"ol":f==="no-order"?"dl":"ul",{class:"vp-highlights"},p.map(({icon:y,title:P,details:E,link:k})=>{const A=[l(f==="no-order"?"dt":"h3",{class:"vp-highlight-title"},[y?l(ze,{class:"vp-highlight-icon",icon:y}):null,l("span",{innerHTML:P})]),E?l(f==="no-order"?"dd":"p",{class:"vp-highlight-details",innerHTML:E}):null];return l(f==="no-order"?"div":"li",{class:["vp-highlight-item-wrapper",{link:k}]},k?y2(k)?l("a",{class:"vp-highlight-item link",href:k,role:"navigation","aria-label":P,target:"_blank"},A):l(Ve,{class:"vp-highlight-item link",to:k,role:"navigation","aria-label":P},()=>A):l("div",{class:"vp-highlight-item"},A))}))]))]])])};Hu.displayName="HighlightPanel";var vh=Hu,hh=B({name:"HomePage",slots:Object,setup(e,{slots:t}){const n=Gn(),o=we(),r=T(()=>{const{features:a}=o.value;return G(a)?a:null}),i=T(()=>{const{highlights:a}=o.value;return G(a)?a:null});return()=>{var a,s,c,u;return l("main",{id:"main-content",class:["vp-project-home ",{pure:n.value}],"aria-labelledby":o.value.heroText===null?"":"main-title"},[(a=t.top)==null?void 0:a.call(t),l(fh),((s=i.value)==null?void 0:s.map(p=>"features"in p?l(Gl,p):l(vh,p)))||(r.value?l(he,{appear:!0,delay:.24},()=>l(Gl,{features:r.value})):null),(c=t.center)==null?void 0:c.call(t),l(he,{appear:!0,delay:.32},()=>l(aa)),(u=t.bottom)==null?void 0:u.call(t)])}}}),mh=B({name:"BreadCrumb",setup(){const e=Fe(),t=ce(),n=At(),o=we(),r=ue(),i=$e([]),a=T(()=>(o.value.breadcrumb||o.value.breadcrumb!==!1&&r.value.breadcrumb!==!1)&&i.value.length>1),s=T(()=>o.value.breadcrumbIcon||o.value.breadcrumbIcon!==!1&&r.value.breadcrumbIcon!==!1),c=()=>{const u=e.getRoutes(),p=dh(t.value.path,n.value).map(({link:f,name:v})=>{const h=u.find(_=>_.path===f);if(h){const{meta:_,path:y}=$n(e,h.path);return{title:_[ye.shortTitle]||_[ye.title]||v,icon:_[ye.icon],path:y}}return null}).filter(f=>f!==null);p.length>1&&(i.value=p)};return ge(()=>{ae(()=>t.value.path,c,{immediate:!0})}),()=>l("nav",{class:["vp-breadcrumb",{disable:!a.value}]},a.value?l("ol",{vocab:"https://schema.org/",typeof:"BreadcrumbList"},i.value.map((u,p)=>l("li",{class:{"is-active":i.value.length-1===p},property:"itemListElement",typeof:"ListItem"},[l(Ve,{to:u.path,property:"item",typeof:"WebPage"},()=>[s.value?l(ze,{icon:u.icon}):null,l("span",{property:"name"},u.title||"Unknown")]),l("meta",{property:"position",content:p+1})]))):[])}});const Kl=e=>{const t=Fe();return e===!1?!1:ie(e)?On(t,e,!0):zi(e)?e:null},pi=(e,t,n)=>{const o=e.findIndex(r=>r.link===t);if(o!==-1){const r=e[o+n];return r!=null&&r.link?r:null}for(const r of e)if(r.children){const i=pi(r.children,t,n);if(i)return i}return null};var gh=B({name:"PageNav",setup(){const e=ue(),t=we(),n=ra(),o=ce(),r=To(),i=T(()=>{const s=Kl(t.value.prev);return s===!1?null:s||(e.value.prevLink===!1?null:pi(n.value,o.value.path,-1))}),a=T(()=>{const s=Kl(t.value.next);return s===!1?null:s||(e.value.nextLink===!1?null:pi(n.value,o.value.path,1))});return Re("keydown",s=>{s.altKey&&(s.key==="ArrowRight"?a.value&&(r(a.value.link),s.preventDefault()):s.key==="ArrowLeft"&&i.value&&(r(i.value.link),s.preventDefault()))}),()=>i.value||a.value?l("nav",{class:"vp-page-nav"},[i.value?l(We,{class:"prev",config:i.value},()=>{var s,c;return[l("div",{class:"hint"},[l("span",{class:"arrow start"}),e.value.metaLocales.prev]),l("div",{class:"link"},[l(ze,{icon:(s=i.value)==null?void 0:s.icon}),(c=i.value)==null?void 0:c.text])]}):null,a.value?l(We,{class:"next",config:a.value},()=>{var s,c;return[l("div",{class:"hint"},[e.value.metaLocales.next,l("span",{class:"arrow end"})]),l("div",{class:"link"},[(s=a.value)==null?void 0:s.text,l(ze,{icon:(c=a.value)==null?void 0:c.icon})])]}):null]):null}});const _h={GitHub:":repo/edit/:branch/:path",GitLab:":repo/-/edit/:branch/:path",Gitee:":repo/edit/:branch/:path",Bitbucket:":repo/src/:branch/:path?mode=edit&spa=0&at=:branch&fileviewer=file-view-default"},bh=({docsRepo:e,docsBranch:t,docsDir:n,filePathRelative:o,editLinkPattern:r})=>{if(!o)return null;const i=xc(e);let a;return r?a=r:i!==null&&(a=_h[i]),a?a.replace(/:repo/,Jt(e)?e:`https://github.com/${e}`).replace(/:branch/,t).replace(/:path/,oc(`${Fi(n)}/${o}`)):null},yh=()=>{const e=ue(),t=ce(),n=we();return T(()=>{const{repo:o,docsRepo:r=o,docsBranch:i="main",docsDir:a="",editLink:s,editLinkPattern:c=""}=e.value;if(!(n.value.editLink??s??!0)||!r)return null;const u=bh({docsRepo:r,docsBranch:i,docsDir:a,editLinkPattern:c,filePathRelative:t.value.filePathRelative});return u?{text:e.value.metaLocales.editLink,link:u}:null})},Eh=()=>{const e=Un(),t=ue(),n=ce(),o=we();return T(()=>{var r,i;return!(o.value.lastUpdated??t.value.lastUpdated??!0)||!((r=n.value.git)!=null&&r.updatedTime)?null:new Date((i=n.value.git)==null?void 0:i.updatedTime).toLocaleString(e.value.lang)})},wh=()=>{const e=ue(),t=ce(),n=we();return T(()=>{var o;return n.value.contributors??e.value.contributors??!0?((o=t.value.git)==null?void 0:o.contributors)??null:null})};var Ah=B({name:"PageTitle",setup(){const e=ce(),t=we(),n=ue(),{info:o,items:r}=Iv();return()=>l("div",{class:"vp-page-title"},[l("h1",[n.value.titleIcon===!1?null:l(ze,{icon:t.value.icon}),e.value.title]),l($u,{info:o.value,...r.value===null?{}:{items:r.value}}),l("hr")])}});const ju=()=>l(re,{name:"edit"},()=>[l("path",{d:"M430.818 653.65a60.46 60.46 0 0 1-50.96-93.281l71.69-114.012 7.773-10.365L816.038 80.138A60.46 60.46 0 0 1 859.225 62a60.46 60.46 0 0 1 43.186 18.138l43.186 43.186a60.46 60.46 0 0 1 0 86.373L588.879 565.55l-8.637 8.637-117.466 68.234a60.46 60.46 0 0 1-31.958 11.229z"}),l("path",{d:"M728.802 962H252.891A190.883 190.883 0 0 1 62.008 771.98V296.934a190.883 190.883 0 0 1 190.883-192.61h267.754a60.46 60.46 0 0 1 0 120.92H252.891a69.962 69.962 0 0 0-69.098 69.099V771.98a69.962 69.962 0 0 0 69.098 69.098h475.911A69.962 69.962 0 0 0 797.9 771.98V503.363a60.46 60.46 0 1 1 120.922 0V771.98A190.883 190.883 0 0 1 728.802 962z"})]);ju.displayName="EditIcon";var Th=B({name:"PageMeta",setup(){const e=ue(),t=yh(),n=Eh(),o=wh();return()=>{const{metaLocales:r}=e.value;return l("footer",{class:"page-meta"},[t.value?l("div",{class:"meta-item edit-link"},l(We,{class:"label",config:t.value},{before:()=>l(ju)})):null,l("div",{class:"meta-item git-info"},[n.value?l("div",{class:"update-time"},[l("span",{class:"label"},`${r.lastUpdated}: `),l(hr,()=>l("span",{class:"info"},n.value))]):null,o.value&&o.value.length?l("div",{class:"contributors"},[l("span",{class:"label"},`${r.contributors}: `),o.value.map(({email:i,name:a},s)=>[l("span",{class:"contributor",title:`email: ${i}`},a),s!==o.value.length-1?",":""])]):null])])}}}),Ih=B({name:"NormalPage",slots:Object,setup(e,{slots:t}){const n=we(),o=ce(),{isDarkmode:r}=Po(),i=ue(),a=T(()=>n.value.toc||n.value.toc!==!1&&i.value.toc!==!1);return()=>l("main",{id:"main-content",class:"vp-page"},l(Ye("LocalEncrypt")?Je("LocalEncrypt"):Tc,()=>{var s,c,u,p;return[(s=t.top)==null?void 0:s.call(t),n.value.cover?l("img",{class:"page-cover",src:Ie(n.value.cover),alt:o.value.title,"no-view":""}):null,l(mh),l(Ah),a.value?l(Nu,{headerDepth:n.value.headerDepth??i.value.headerDepth??2},{before:()=>{var f;return(f=t.tocBefore)==null?void 0:f.call(t)},after:()=>{var f;return(f=t.tocAfter)==null?void 0:f.call(t)}}):null,(c=t.contentBefore)==null?void 0:c.call(t),l(aa),(u=t.contentAfter)==null?void 0:u.call(t),l(Th),l(gh),Ye("CommentService")?l(Je("CommentService"),{darkmode:r.value}):null,(p=t.bottom)==null?void 0:p.call(t)]}))}}),Ph=B({name:"Layout",setup(){const e=hn(),t=ue(),n=ce(),o=we(),{isMobile:r}=Io(),i=T(()=>{var a,s;return((a=t.value.blog)==null?void 0:a.sidebarDisplay)||((s=e.value.blog)==null?void 0:s.sidebarDisplay)||"mobile"});return()=>[l(la),l(ia,{},{default:()=>o.value.home?l(hh):l(ph,()=>l(Ih,{key:n.value.path})),...i.value!=="none"?{navScreenBottom:()=>l(Je("BloggerInfo"))}:{},...!r.value&&i.value==="always"?{sidebar:()=>l(Je("BloggerInfo"))}:{}})]}}),Oh=B({name:"NotFoundHint",setup(){const e=ue(),t=()=>{const n=e.value.routeLocales.notFoundMsg;return n[Math.floor(Math.random()*n.length)]};return()=>l("div",{class:"not-found-hint"},[l("p",{class:"error-code"},"404"),l("h1",{class:"error-title"},e.value.routeLocales.notFoundTitle),l("p",{class:"error-hint"},t())])}}),kh=B({name:"NotFound",slots:Object,setup(e,{slots:t}){const n=At(),o=ue(),{navigate:r}=ri({to:o.value.home??n.value});return()=>[l(la),l(ia,{noSidebar:!0},()=>{var i;return l("main",{id:"main-content",class:"vp-page not-found"},((i=t.default)==null?void 0:i.call(t))||[l(Oh),l("div",{class:"actions"},[l("button",{type:"button",class:"action-button",onClick:()=>{window.history.go(-1)}},o.value.routeLocales.back),l("button",{type:"button",class:"action-button",onClick:()=>r()},o.value.routeLocales.home)])])})]}});const Lh={GitHub:'',Wechat:'',Email:'',Discord:'',RSS:''},Rh={category:{"/":{path:"/category/",map:{工具:{path:"/category/%E5%B7%A5%E5%85%B7/",keys:["v-af1fbe54","v-b90f383c","v-22230056","v-bdd9cae6","v-63cd7175","v-1ace0584","v-78ae0f01","v-21f30b82","v-0094e0b6","v-a580c466","v-e381b74e","v-72653828","v-5e3d84de","v-333dd8ee","v-69739db8","v-39faf312","v-0418b0dc","v-491d5d68","v-346c34d4","v-5ae43900","v-1f0840b1","v-730defc4","v-26a023fe"]},自动化:{path:"/category/%E8%87%AA%E5%8A%A8%E5%8C%96/",keys:["v-24bf700c","v-61d0df0c","v-5a064ff2","v-d8439540","v-302b03de","v-1004794e","v-73041b3a","v-b3818c3c","v-6222deab"]},系统:{path:"/category/%E7%B3%BB%E7%BB%9F/",keys:["v-df55a79e","v-313c5888","v-18a7959b","v-4576f198","v-c914fd10","v-0d41d5d0","v-009a3fd6"]},网络:{path:"/category/%E7%BD%91%E7%BB%9C/",keys:["v-273cf11f","v-7463267c","v-77515ff2","v-5ad6240c","v-a3025528","v-5da24c3c","v-e6f7cb8e"]},服务器:{path:"/category/%E6%9C%8D%E5%8A%A1%E5%99%A8/",keys:["v-579c385c","v-28c3d540"]},博客:{path:"/category/%E5%8D%9A%E5%AE%A2/",keys:["v-6eacd3db","v-9029f640","v-63fefb94","v-adf0c772","v-24d2d83a","v-06691c4f"]},头脑驿站:{path:"/category/%E5%A4%B4%E8%84%91%E9%A9%BF%E7%AB%99/",keys:["v-6eacd3db","v-0a6bc026"]}}}},tag:{"/":{path:"/tag/",map:{微信:{path:"/tag/%E5%BE%AE%E4%BF%A1/",keys:["v-26a023fe"]},rss:{path:"/tag/rss/",keys:["v-61d0df0c","v-5a064ff2","v-d8439540","v-302b03de","v-73041b3a","v-b3818c3c","v-6222deab"]},Feed43:{path:"/tag/feed43/",keys:["v-6222deab"]},FeedEx:{path:"/tag/feedex/",keys:["v-6222deab"]},office:{path:"/tag/office/",keys:["v-009a3fd6"]},OneNote:{path:"/tag/onenote/",keys:["v-0d41d5d0"]},关机:{path:"/tag/%E5%85%B3%E6%9C%BA/",keys:["v-c914fd10"]},smb:{path:"/tag/smb/",keys:["v-4576f198"]},光猫:{path:"/tag/%E5%85%89%E7%8C%AB/",keys:["v-a3025528","v-5da24c3c","v-e6f7cb8e"]},CDN:{path:"/tag/cdn/",keys:["v-28c3d540"]},建站:{path:"/tag/%E5%BB%BA%E7%AB%99/",keys:["v-6eacd3db","v-24d2d83a","v-06691c4f","v-579c385c","v-28c3d540"]},Huginn:{path:"/tag/huginn/",keys:["v-73041b3a","v-b3818c3c"]},宝塔面板:{path:"/tag/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/",keys:["v-579c385c"]},Jekyll:{path:"/tag/jekyll/",keys:["v-63fefb94","v-adf0c772","v-24d2d83a","v-06691c4f"]},Github:{path:"/tag/github/",keys:["v-06691c4f"]},"Travis CI":{path:"/tag/travis-ci/",keys:["v-adf0c772"]},Docker:{path:"/tag/docker/",keys:["v-adf0c772"]},Audition:{path:"/tag/audition/",keys:["v-730defc4"]},音频:{path:"/tag/%E9%9F%B3%E9%A2%91/",keys:["v-730defc4"]},Aria2:{path:"/tag/aria2/",keys:["v-1f0840b1"]},迅雷:{path:"/tag/%E8%BF%85%E9%9B%B7/",keys:["v-1f0840b1"]},Airtable:{path:"/tag/airtable/",keys:["v-5ae43900"]},GP1700:{path:"/tag/gp1700/",keys:["v-a3025528"]},koolproxy:{path:"/tag/koolproxy/",keys:["v-5ad6240c"]},IPTV:{path:"/tag/iptv/",keys:["v-77515ff2"]},语音输入:{path:"/tag/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5/",keys:["v-1004794e"]},OpenVPN:{path:"/tag/openvpn/",keys:["v-7463267c"]},内网穿透:{path:"/tag/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/",keys:["v-7463267c"]},RSSHub:{path:"/tag/rsshub/",keys:["v-d8439540","v-302b03de"]},scrcpy:{path:"/tag/scrcpy/",keys:["v-346c34d4"]},投屏:{path:"/tag/%E6%8A%95%E5%B1%8F/",keys:["v-346c34d4"]},WIFI:{path:"/tag/wifi/",keys:["v-273cf11f"]},主板:{path:"/tag/%E4%B8%BB%E6%9D%BF/",keys:["v-18a7959b"]},小狼毫:{path:"/tag/%E5%B0%8F%E7%8B%BC%E6%AF%AB/",keys:["v-491d5d68"]},输入法:{path:"/tag/%E8%BE%93%E5%85%A5%E6%B3%95/",keys:["v-491d5d68"]},KeePass:{path:"/tag/keepass/",keys:["v-0418b0dc"]},WordPress:{path:"/tag/wordpress/",keys:["v-9029f640","v-63fefb94"]},原则:{path:"/tag/%E5%8E%9F%E5%88%99/",keys:["v-0a6bc026"]},批评与自我批评:{path:"/tag/%E6%89%B9%E8%AF%84%E4%B8%8E%E8%87%AA%E6%88%91%E6%89%B9%E8%AF%84/",keys:["v-0a6bc026"]},nas:{path:"/tag/nas/",keys:["v-5a064ff2"]},微信红包:{path:"/tag/%E5%BE%AE%E4%BF%A1%E7%BA%A2%E5%8C%85/",keys:["v-39faf312"]},"Microsoft store":{path:"/tag/microsoft-store/",keys:["v-313c5888"]},winget:{path:"/tag/winget/",keys:["v-df55a79e"]},winstall:{path:"/tag/winstall/",keys:["v-df55a79e"]},浏览器插件:{path:"/tag/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/",keys:["v-24bf700c"]},"UI.Vision":{path:"/tag/ui.vision/",keys:["v-24bf700c"]},RPA:{path:"/tag/rpa/",keys:["v-24bf700c"]},blog:{path:"/tag/blog/",keys:["v-9029f640"]},github:{path:"/tag/github/",keys:["v-9029f640"]},VuePress:{path:"/tag/vuepress/",keys:["v-6eacd3db"]},录屏:{path:"/tag/%E5%BD%95%E5%B1%8F/",keys:["v-69739db8"]},白板:{path:"/tag/%E7%99%BD%E6%9D%BF/",keys:["v-333dd8ee"]},GTD:{path:"/tag/gtd/",keys:["v-333dd8ee"]},虚拟定位:{path:"/tag/%E8%99%9A%E6%8B%9F%E5%AE%9A%E4%BD%8D/",keys:["v-5e3d84de"]},AI:{path:"/tag/ai/",keys:["v-22230056","v-72653828"]},VITS:{path:"/tag/vits/",keys:["v-72653828"]},声音克隆:{path:"/tag/%E5%A3%B0%E9%9F%B3%E5%85%8B%E9%9A%86/",keys:["v-72653828"]},games:{path:"/tag/games/",keys:["v-e381b74e"]},Free:{path:"/tag/free/",keys:["v-b90f383c"]},域名:{path:"/tag/%E5%9F%9F%E5%90%8D/",keys:["v-b90f383c"]},白嫖:{path:"/tag/%E7%99%BD%E5%AB%96/",keys:["v-b90f383c"]},画画:{path:"/tag/%E7%94%BB%E7%94%BB/",keys:["v-22230056"]},stableDiffusion:{path:"/tag/stablediffusion/",keys:["v-22230056"]},百宝箱:{path:"/tag/%E7%99%BE%E5%AE%9D%E7%AE%B1/",keys:["v-af1fbe54"]},合集:{path:"/tag/%E5%90%88%E9%9B%86/",keys:["v-af1fbe54"]},外站资源:{path:"/tag/%E5%A4%96%E7%AB%99%E8%B5%84%E6%BA%90/",keys:["v-af1fbe54"]},直播:{path:"/tag/%E7%9B%B4%E6%92%AD/",keys:["v-bdd9cae6","v-63cd7175","v-1ace0584","v-78ae0f01","v-21f30b82","v-0094e0b6","v-a580c466"]},OBS:{path:"/tag/obs/",keys:["v-63cd7175","v-1ace0584","v-78ae0f01"]}}}}},Sh={article:{"/":{path:"/article/",keys:["v-af1fbe54","v-b90f383c","v-22230056","v-0d25d1e4","v-7b101d14","v-2c379a13","v-12e41b33","v-bdd9cae6","v-63cd7175","v-1ace0584","v-78ae0f01","v-21f30b82","v-0094e0b6","v-a580c466","v-e381b74e","v-72653828","v-5e3d84de","v-333dd8ee","v-69739db8","v-6eacd3db","v-9029f640","v-24bf700c","v-df55a79e","v-61d0df0c","v-313c5888","v-39faf312","v-5a064ff2","v-0a6bc026","v-63fefb94","v-0418b0dc","v-491d5d68","v-18a7959b","v-273cf11f","v-d8439540","v-346c34d4","v-302b03de","v-7463267c","v-1004794e","v-73041b3a","v-77515ff2","v-5ad6240c","v-a3025528","v-5ae43900","v-1f0840b1","v-730defc4","v-adf0c772","v-24d2d83a","v-06691c4f","v-579c385c","v-b3818c3c","v-28c3d540","v-5da24c3c","v-e6f7cb8e","v-4576f198","v-c914fd10","v-0d41d5d0","v-009a3fd6","v-6222deab","v-26a023fe"]}},star:{"/":{path:"/star/",keys:["v-af1fbe54","v-b90f383c","v-22230056","v-346c34d4","v-1f0840b1"]}},timeline:{"/":{path:"/timeline/",keys:["v-af1fbe54","v-b90f383c","v-22230056","v-0d25d1e4","v-7b101d14","v-2c379a13","v-12e41b33","v-bdd9cae6","v-63cd7175","v-1ace0584","v-78ae0f01","v-21f30b82","v-0094e0b6","v-a580c466","v-e381b74e","v-72653828","v-5e3d84de","v-333dd8ee","v-69739db8","v-6eacd3db","v-9029f640","v-24bf700c","v-df55a79e","v-61d0df0c","v-313c5888","v-39faf312","v-5a064ff2","v-0a6bc026","v-63fefb94","v-0418b0dc","v-491d5d68","v-18a7959b","v-273cf11f","v-d8439540","v-346c34d4","v-302b03de","v-7463267c","v-1004794e","v-73041b3a","v-77515ff2","v-5ad6240c","v-a3025528","v-5ae43900","v-1f0840b1","v-730defc4","v-adf0c772","v-24d2d83a","v-06691c4f","v-579c385c","v-b3818c3c","v-28c3d540","v-5da24c3c","v-e6f7cb8e","v-4576f198","v-c914fd10","v-0d41d5d0","v-009a3fd6","v-6222deab","v-26a023fe"]}}},ql=K(Rh),Wu=(e="")=>{const t=ce(),n=Fe(),o=At();return T(()=>{var c;const r=e||((c=we().value.blog)==null?void 0:c.key)||"";if(!r)return console.warn("useBlogCategory: key not found"),{path:"/",map:{}};const i=n.getRoutes();if(!ql.value[r])throw new Error(`useBlogCategory: key ${r} is invalid`);const a=ql.value[r][o.value],s={path:a.path,map:{}};for(const u in a.map){const p=a.map[u];s.map[u]={path:p.path,items:[]};for(const f of p.keys){const v=i.find(({name:h})=>h===f);if(v){const h=$n(n,v.path);s.map[u].items.push({path:h.path,info:h.meta})}}t.value.path===p.path&&(s.currentItems=s.map[u].items)}return s})},Yl=K(Sh),Er=(e="")=>{const t=Fe(),n=At();return T(()=>{var s;const o=e||((s=we().value.blog)==null?void 0:s.key)||"";if(!o)return console.warn("useBlogType: key not found"),{path:"/",items:[]};if(!Yl.value[o])throw new Error(`useBlogType: key ${e} is invalid`);const r=t.getRoutes(),i=Yl.value[o][n.value],a={path:i.path,items:[]};for(const c of i.keys){const u=r.find(({name:p})=>p===c);if(u){const p=$n(t,u.path);a.items.push({path:p.path,info:p.meta})}}return a})};const xh="/assets/hero-197a9d2d.jpg",Uu=Symbol.for("categoryMap"),Oo=()=>{const e=de(Uu);if(!e)throw new Error("useCategoryMap() is called without provider.");return e},Dh=()=>{const e=Wu("category");ot(Uu,e)},ko=()=>{const e=hn(),t=ue();return T(()=>({...e.value.blog,...t.value.blog}))},Gu=Symbol.for("tagMap"),Lo=()=>{const e=de(Gu);if(!e)throw new Error("useTagMap() is called without provider.");return e},Ch=()=>{const e=Wu("tag");ot(Gu,e)},Vh=e=>{const t=ue();return T(()=>{const{[ye.author]:n}=e.value;return n?ho(n):n===!1?[]:ho(t.value.author,!1)})},Mh=e=>{const t=Oo();return T(()=>Lc(e.value[ye.category]).map(n=>({name:n,path:t.value.map[n].path})))},Bh=e=>{const t=Lo();return T(()=>Rc(e.value[ye.tag]).map(n=>({name:n,path:t.value.map[n].path})))},$h=e=>T(()=>{const{[ye.date]:t}=e.value;return Ui(t)}),Nh=e=>{const t=Wn(e,"info"),n=ko(),o=Vh(t),r=Mh(t),i=Bh(t),a=$h(t),s=au(),c=T(()=>({author:o.value,category:r.value,date:a.value,localizedDate:t.value[ye.localizedDate]||"",tag:i.value,isOriginal:t.value[ye.isOriginal]||!1,readingTime:t.value[ye.readingTime]||null,readingTimeLocale:t.value[ye.readingTime]&&s.value?iu(t.value[ye.readingTime],s.value):null,pageview:e.path})),u=T(()=>n.value.articleInfo);return{info:c,items:u}},Ku=Symbol(""),Ro=()=>{const e=de(Ku);if(!e)throw new Error("useArticles() is called without provider.");return e},zh=()=>{const e=Er("article");ot(Ku,e)},qu=Symbol(""),sa=()=>{const e=de(qu);if(!e)throw new Error("useStars() is called without provider.");return e},Fh=()=>{const e=Er("star");ot(qu,e)},Yu=Symbol(""),ca=()=>{const e=de(Yu);if(!e)throw new Error("useTimelines() is called without provider.");return e},Hh=()=>{const e=Er("timeline"),t=T(()=>{const n=[];return e.value.items.forEach(({info:o,path:r})=>{const i=Ui(o[ye.date]),a=i==null?void 0:i.getFullYear(),s=i?i.getMonth()+1:null,c=i==null?void 0:i.getDate();a&&s&&c&&((!n[0]||n[0].year!==a)&&n.unshift({year:a,items:[]}),n[0].items.push({date:`${s}/${c}`,info:o,path:r}))}),{...e.value,config:n.reverse()}});ot(Yu,t)},jh=()=>{zh(),Dh(),Fh(),Ch(),Hh()};var Wh=B({name:"SocialMedia",setup(){const e=ko(),t=Gn(),n=T(()=>{const o=e.value.medias;return o?wo(o).map(([r,i])=>({name:r,icon:Lh[r],url:i})):[]});return()=>n.value.length?l("div",{class:"vp-social-medias"},n.value.map(({name:o,icon:r,url:i})=>l("a",{class:"vp-social-media",href:i,rel:"noopener noreferrer",target:"_blank","aria-label":o,...t.value?{}:{"data-balloon-pos":"up"},innerHTML:r}))):null}}),ua=B({name:"BloggerInfo",setup(){const e=ko(),t=Un(),n=ue(),o=Ro(),r=Oo(),i=Lo(),a=ca(),s=To(),c=T(()=>{var v;return e.value.name||((v=ho(n.value.author)[0])==null?void 0:v.name)||t.value.title}),u=T(()=>e.value.avatar||n.value.logo),p=T(()=>n.value.blogLocales),f=T(()=>e.value.intro);return()=>{const{article:v,category:h,tag:_,timeline:y}=p.value,P=[[o.value.path,o.value.items.length,v],[r.value.path,wt(r.value.map).length,h],[i.value.path,wt(i.value.map).length,_],[a.value.path,a.value.items.length,y]];return l("div",{class:"vp-blogger-info",vocab:"https://schema.org/",typeof:"Person"},[l("div",{class:"vp-blogger",...f.value?{style:{cursor:"pointer"},"aria-label":p.value.intro,"data-balloon-pos":"down",role:"navigation",onClick:()=>s(f.value)}:{}},[u.value?l("img",{class:["vp-blogger-avatar",{round:e.value.roundAvatar}],src:Ie(u.value),property:"image",alt:"Blogger Avatar"}):null,c.value?l("div",{class:"vp-blogger-name",property:"name"},c.value):null,e.value.description?l("div",{class:"vp-blogger-description",innerHTML:e.value.description}):null,f.value?l("meta",{property:"url",content:Ie(f.value)}):null]),l("div",{class:"vp-blog-counts"},P.map(([E,k,A])=>l(Ve,{class:"vp-blog-count",to:E},()=>[l("div",{class:"count"},k),l("div",A)]))),l(Wh)])}}});const di=()=>l(re,{name:"category"},()=>l("path",{d:"M148.41 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H148.41c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.311-40.31zM147.556 553.478H429.73c22.263 0 40.311 18.048 40.311 40.31v282.176c0 22.263-18.048 40.312-40.31 40.312H147.555c-22.263 0-40.311-18.049-40.311-40.312V593.79c0-22.263 18.048-40.311 40.31-40.311zM593.927 106.992h282.176c22.263 0 40.31 18.048 40.31 40.31V429.48c0 22.263-18.047 40.31-40.31 40.31H593.927c-22.263 0-40.311-18.047-40.311-40.31V147.302c0-22.263 18.048-40.31 40.31-40.31zM730.22 920.502H623.926c-40.925 0-74.22-33.388-74.22-74.425V623.992c0-41.038 33.387-74.424 74.425-74.424h222.085c41.038 0 74.424 33.226 74.424 74.067v114.233c0 10.244-8.304 18.548-18.547 18.548s-18.548-8.304-18.548-18.548V623.635c0-20.388-16.746-36.974-37.33-36.974H624.13c-20.585 0-37.331 16.747-37.331 37.33v222.086c0 20.585 16.654 37.331 37.126 37.331H730.22c10.243 0 18.547 8.304 18.547 18.547 0 10.244-8.304 18.547-18.547 18.547z"}));di.displayName="CategoryIcon";const fi=()=>l(re,{name:"tag"},()=>l("path",{d:"M939.902 458.563L910.17 144.567c-1.507-16.272-14.465-29.13-30.737-30.737L565.438 84.098h-.402c-3.215 0-5.726 1.005-7.634 2.913l-470.39 470.39a10.004 10.004 0 000 14.164l365.423 365.424c1.909 1.908 4.42 2.913 7.132 2.913s5.223-1.005 7.132-2.913l470.39-470.39c2.01-2.11 3.014-5.023 2.813-8.036zm-240.067-72.121c-35.458 0-64.286-28.828-64.286-64.286s28.828-64.285 64.286-64.285 64.286 28.828 64.286 64.285-28.829 64.286-64.286 64.286z"}));fi.displayName="TagIcon";const pa=()=>l(re,{name:"timeline"},()=>l("path",{d:"M511.997 70.568c-243.797 0-441.429 197.633-441.429 441.435 0 243.797 197.632 441.429 441.43 441.429S953.431 755.8 953.431 512.002c0-243.796-197.637-441.434-441.435-441.434zm150.158 609.093-15.605 15.61c-8.621 8.615-22.596 8.615-31.215 0L472.197 552.126c-4.95-4.944-4.34-14.888-4.34-24.677V247.14c0-12.19 9.882-22.07 22.07-22.07h22.07c12.19 0 22.07 9.882 22.07 22.07v273.218l128.088 128.088c8.62 8.62 8.62 22.595 0 31.215zm0 0"}));pa.displayName="TimelineIcon";const Zu=()=>l(re,{name:"slides"},()=>l("path",{d:"M896 170.667v426.666a85.333 85.333 0 0 1-85.333 85.334h-256v61.184l192.597 115.584-43.861 73.13-148.736-89.173v95.275h-85.334v-95.318l-148.736 89.216-43.861-73.13 192.597-115.627v-61.141h-256A85.333 85.333 0 0 1 128 597.333V170.667H85.333V85.333h853.334v85.334H896zm-682.667 0v426.666h597.334V170.667H213.333zM426.667 512h-85.334V341.333h85.334V512zm128 0h-85.334V256h85.334v256zm128 0h-85.334V384h85.334v128z"}));Zu.displayName="SlideIcon";const Xu=()=>l(re,{name:"sticky"},()=>[l("path",{d:"m381.3 733.8l-161.9 118c-5.9 4.5-13.2 6.6-20.1 6.6-8.7 0-17.7-3.4-24.3-10-12.2-12.2-13.9-31.3-3.5-45.2l144.5-195.5-113.6-112.9c-11.1-11.1-13.2-28.4-5.5-42 5.5-8.7 52.1-76.4 155.5-51 1.8 0.3 3.5 0.3 5.6 0.7 4.2 0.3 9 0.7 14.2 1.7 21.9 3.5 60.8-13.9 94.5-42.7 32.3-27.5 53.1-59.4 53.1-81.6 0-5.2 0-10.8-0.3-16-0.7-20.8-2.1-52.8 21.5-76.4 28.1-28.1 72.9-30.6 103.9-5.2 0.6 0.3 1 1 1.7 1.7 16.7 16.3 187.5 187.2 189.3 188.9 14.5 14.6 22.9 34.4 22.9 55.3 0 20.8-8 40.2-22.9 54.8-23.7 23.6-56 22.6-77.1 21.6-4.9 0-10.5-0.4-15.7-0.4-20.8 0-45.8 14.6-70.5 41.3-34.3 37.5-55.5 85.8-53.8 107.7 0.7 6.9 2.1 19.1 2.4 20.8 25 101.4-42.7 147.6-50.7 152.8-13.9 8.4-31.6 6.3-42.7-4.8l-112.1-112.2z"})]);Xu.displayName="StickyIcon";const ar=()=>l(re,{name:"article"},()=>l("path",{d:"M853.333 938.667H170.667A42.667 42.667 0 0 1 128 896V128a42.667 42.667 0 0 1 42.667-42.667h682.666A42.667 42.667 0 0 1 896 128v768a42.667 42.667 0 0 1-42.667 42.667zm-42.666-85.334V170.667H213.333v682.666h597.334zM298.667 256h170.666v170.667H298.667V256zm0 256h426.666v85.333H298.667V512zm0 170.667h426.666V768H298.667v-85.333zm256-384h170.666V384H554.667v-85.333z"}));ar.displayName="ArticleIcon";const Ju=()=>l(re,{name:"book"},()=>l("path",{d:"M256 853.333h426.667A85.333 85.333 0 0 0 768 768V256a85.333 85.333 0 0 0-85.333-85.333H469.333a42.667 42.667 0 0 1 0-85.334h213.334A170.667 170.667 0 0 1 853.333 256v512a170.667 170.667 0 0 1-170.666 170.667H213.333A42.667 42.667 0 0 1 170.667 896V128a42.667 42.667 0 0 1 42.666-42.667h128A42.667 42.667 0 0 1 384 128v304.256l61.653-41.088a42.667 42.667 0 0 1 47.36 0l61.654 41.045V256A42.667 42.667 0 0 1 640 256v256a42.667 42.667 0 0 1-66.347 35.499l-104.32-69.547-104.32 69.547A42.667 42.667 0 0 1 298.667 512V170.667H256v682.666z"}));Ju.displayName="BookIcon";const Qu=()=>l(re,{name:"link"},()=>l("path",{d:"M460.8 584.533c17.067 17.067 17.067 42.667 0 59.734-17.067 17.066-42.667 17.066-59.733 0-85.334-85.334-85.334-217.6 0-302.934L554.667 192C640 110.933 776.533 110.933 857.6 196.267c81.067 81.066 81.067 213.333 0 294.4l-68.267 64c0-34.134-4.266-68.267-17.066-102.4l21.333-21.334c51.2-46.933 55.467-128 4.267-179.2s-128-55.466-179.2-4.266c-4.267 0-4.267 4.266-4.267 4.266L465.067 401.067c-51.2 51.2-51.2 132.266-4.267 183.466m123.733-183.466C601.6 384 627.2 384 644.267 401.067c85.333 85.333 85.333 217.6 0 302.933l-153.6 149.333C405.333 934.4 268.8 934.4 187.733 849.067c-81.066-81.067-81.066-213.334 0-294.4l68.267-64c0 34.133 4.267 72.533 17.067 102.4L251.733 614.4C204.8 665.6 204.8 746.667 256 793.6c51.2 46.933 123.733 46.933 174.933 0l149.334-149.333c51.2-51.2 51.2-128 0-179.2-12.8-17.067-17.067-46.934 4.266-64z"}));Qu.displayName="LinkIcon";const e0=()=>l(re,{name:"project"},()=>l("path",{d:"M987.456 425.152H864V295.296a36.48 36.48 0 0 0-36.544-36.544h-360l-134.08-128.256A9.344 9.344 0 0 0 327.04 128H36.48A36.48 36.48 0 0 0 0 164.544v676.608a36.48 36.48 0 0 0 36.544 36.544h797.76a36.672 36.672 0 0 0 33.92-22.848L1021.44 475.52a36.48 36.48 0 0 0-33.92-50.304zM82.304 210.304h215.424l136.64 130.752h347.328v84.096H198.848A36.672 36.672 0 0 0 164.928 448L82.304 652.8V210.304zM808.32 795.456H108.544l118.08-292.608h699.904L808.32 795.52z"}));e0.displayName="ProjectIcon";const t0=()=>l(re,{name:"friend"},()=>l("path",{d:"M860.16 213.333A268.373 268.373 0 0 0 512 186.027a267.52 267.52 0 0 0-348.16 404.48L428.8 855.893a118.613 118.613 0 0 0 166.4 0l264.96-265.386a267.52 267.52 0 0 0 0-377.174zM800 531.627l-264.96 264.96a32.427 32.427 0 0 1-46.08 0L224 530.347a183.04 183.04 0 0 1 0-256 182.187 182.187 0 0 1 256 0 42.667 42.667 0 0 0 60.587 0 182.187 182.187 0 0 1 256 0 183.04 183.04 0 0 1 3.413 256z"}));t0.displayName="FriendIcon";const vi=()=>l(re,{name:"slide-down"},()=>l("path",{d:"M108.775 312.23c13.553 0 27.106 3.734 39.153 11.806l375.205 250.338 363.641-252.808c32.587-21.624 76.499-12.83 98.123 19.757 21.685 32.467 12.95 76.56-19.576 98.184l-402.854 278.89c-23.733 15.901-54.694 15.962-78.547.12L69.501 442.097c-32.647-21.685-41.441-65.777-19.817-98.304 13.734-20.54 36.201-31.563 59.09-31.563Z"}));vi.displayName="SlideDownIcon";const n0=()=>l("svg",{xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",class:"empty-icon",viewBox:"0 0 1024 1024",innerHTML:''});n0.displayName="EmptyIcon";const o0=()=>l(re,{name:"lock"},()=>l("path",{d:"M787.168 952.268H236.832c-30.395 0-55.033-24.638-55.033-55.033V429.45c0-30.395 24.638-55.034 55.033-55.034h82.55V264.35c0-106.38 86.238-192.618 192.618-192.618S704.618 157.97 704.618 264.35v110.066h82.55c30.395 0 55.033 24.639 55.033 55.034v467.785c0 30.395-24.639 55.033-55.033 55.033zM484.483 672.046v115.122h55.034V672.046c31.99-11.373 55.033-41.605 55.033-77.496 0-45.592-36.958-82.55-82.55-82.55s-82.55 36.958-82.55 82.55c0 35.89 23.042 66.123 55.033 77.496zM622.067 264.35c0-60.788-49.28-110.067-110.067-110.067s-110.067 49.28-110.067 110.067v110.066h220.135V264.35z"}));o0.displayName="LockIcon";var Uh=B({name:"ArticleItem",props:{info:{type:Object,required:!0},path:{type:String,required:!0}},slots:Object,setup(e,{slots:t}){const n=Wn(e,"info"),{info:o,items:r}=Nh(e);return()=>{var v,h,_;const{[ye.title]:i,[ye.type]:a,[ye.isEncrypted]:s=!1,[ye.cover]:c,[ye.excerpt]:u,[ye.sticky]:p}=n.value,f=o.value;return l("div",{class:"vp-article-wrapper"},l("article",{class:"vp-article-item",vocab:"https://schema.org/",typeof:"Article"},[((v=t.cover)==null?void 0:v.call(t,{cover:c}))||(c?[l("img",{class:"vp-article-cover",src:Ie(c)}),l("meta",{property:"image",content:Ie(c)})]:[]),p?l(Xu):null,l(Ve,{to:e.path},()=>{var y;return((y=t.title)==null?void 0:y.call(t,{title:i,isEncrypted:s,type:a}))||l("header",{class:"vp-article-title"},[s?l(o0):null,a===su.slide?l(Zu):null,l("span",{property:"headline"},i)])}),((h=t.excerpt)==null?void 0:h.call(t,{excerpt:u}))||(u?l("div",{class:"vp-article-excerpt",innerHTML:u}):null),l("hr",{class:"vp-article-hr"}),((_=t.info)==null?void 0:_.call(t,{info:f}))||l($u,{info:f,...r.value?{items:r.value}:{}})]))}}}),Gh=B({name:"Pagination",props:{total:{type:Number,default:10},perPage:{type:Number,default:10},current:{type:Number,default:1}},emits:["updateCurrentPage"],setup(e,{emit:t}){let n;const o=ue(),r=K(""),i=T(()=>o.value.paginationLocales),a=T(()=>Math.ceil(e.total/e.perPage)),s=T(()=>!!a.value&&a.value!==1),c=T(()=>a.value<7?!1:e.current>4),u=T(()=>a.value<7?!1:e.current{const{current:h}=e;let _=1,y=a.value;const P=[];a.value>=7&&(h<=4&&h4&&h>=a.value-3?(y=a.value,_=a.value-4):a.value>7&&(_=h-2,y=h+2));for(let E=_;E<=y;E++)P.push(E);return P}),f=h=>t("updateCurrentPage",h),v=h=>{const _=parseInt(h);_<=a.value&&_>0?f(_):n.pop(`${i.value.errorText.replace(/\$page/g,a.value.toString())}`)};return ge(()=>{n=new I2}),()=>l("div",{class:"vp-pagination"},s.value?l("div",{class:"vp-pagination-list"},[l("div",{class:"vp-pagination-number "},[e.current>1?l("div",{class:"prev",role:"navigation",unselectable:"on",onClick:()=>f(e.current-1)},i.value.prev):null,c.value?[l("div",{role:"navigation",onClick:()=>f(1)},1),l("div",{class:"ellipsis"},"...")]:null,p.value.map(h=>l("div",{key:h,class:{active:e.current===h},role:"navigation",onClick:()=>f(h)},h)),u.value?[l("div",{class:"ellipsis"},"..."),l("div",{role:"navigation",onClick:()=>f(a.value)},a.value)]:null,e.currentf(e.current+1)},i.value.next):null]),l("div",{class:"vp-pagination-nav"},[l("label",{for:"navigation-text"},`${i.value.navigate}: `),l("input",{id:"navigation-text",value:r.value,onInput:({target:h})=>{r.value=h.value},onKeydown:h=>{h.key==="Enter"&&(h.preventDefault(),v(r.value))}}),l("button",{class:"vp-pagination-button",role:"navigation",title:i.value.action,onClick:()=>v(r.value)},i.value.action)])]):[])}}),da=B({name:"ArticleList",props:{items:{type:Array,default:()=>[]}},setup(e){const t=gt(),n=Fe(),o=ko(),r=K(1),i=T(()=>o.value.articlePerPage||10),a=T(()=>e.items.slice((r.value-1)*i.value,r.value*i.value)),s=async c=>{r.value=c;const u={...t.query};if(!(u.page===c.toString()||c===1&&!u.page)&&(c===1?delete u.page:u.page=c.toString(),await n.push({path:t.path,query:u}),!0)){const{updatePageview:p}=await d(()=>import("./pageview-92bd2153.js"),[]);await p()}};return ge(()=>{const{page:c}=t.query;s(c?Number(c):1),ae(r,()=>{const u=document.querySelector("#article-list").getBoundingClientRect().top+window.scrollY;setTimeout(()=>{window.scrollTo(0,u),d(()=>import("./pageview-92bd2153.js"),[]).then(({updatePageview:p})=>p())},100)})}),()=>l("div",{id:"article-list",class:"vp-article-list"},a.value.length?[...a.value.map(({info:c,path:u},p)=>l(he,{appear:!0,delay:p*.04},()=>l(Uh,{key:u,info:c,path:u}))),l(Gh,{current:r.value,perPage:i.value,total:e.items.length,onUpdateCurrentPage:s})]:l(n0))}}),fa=B({name:"CategoryList",setup(){const e=ce(),t=Oo();return()=>l("ul",{class:"vp-category-list"},wo(t.value.map).map(([n,{path:o,items:r}])=>l("li",{class:["vp-category",`vp-category${br(n,9)}`,{active:o===e.value.path}]},l(Ve,{to:o},()=>[n,l("span",{class:"count"},r.length)]))))}}),va=B({name:"TagList",setup(){const e=we(),t=Lo(),n=o=>{var r;return o===((r=e.value.blog)==null?void 0:r.name)};return()=>l("ul",{class:"tag-list-wrapper"},wo(t.value.map).map(([o,{path:r,items:i}])=>l("li",{class:["tag",`tag${br(o,9)}`,{active:n(o)}]},l(Ve,{to:r},()=>[o,l("span",{class:"tag-num"},i.length)]))))}}),Kh=B({name:"TimelineList",setup(){const e=ue(),t=ca(),n=To(),o=T(()=>e.value.blogLocales.timeline);return()=>l("div",{class:"timeline-list-wrapper"},[l("div",{class:"timeline-list-title",onClick:()=>n(t.value.path)},[l(pa),l("span",{class:"num"},t.value.items.length),o.value]),l("hr"),l("div",{class:"timeline-content"},l("ul",{class:"timeline-list"},t.value.config.map(({year:r,items:i},a)=>l(he,{appear:!0,delay:.08*(a+1)},()=>l("li",[l("h3",{class:"timeline-year"},r),l("ul",{class:"timeline-year-wrapper"},i.map(({date:s,info:c,path:u})=>l("li",{class:"timeline-item"},[l("span",{class:"timeline-date"},s),l(Ve,{class:"timeline-title",to:u},()=>c[ye.title])])))])))))])}}),r0=B({name:"InfoList",setup(){const e=ue(),t=Ro(),n=Oo(),o=T(()=>wt(n.value.map).length),r=sa(),i=Lo(),a=T(()=>wt(i.value.map).length),s=To(),c=K("article"),u=T(()=>e.value.blogLocales),p=[["article",ar],["category",di],["tag",fi],["timeline",pa]];return()=>l("div",{class:"vp-blog-infos"},[l("div",{class:"vp-blog-type-switcher"},p.map(([f,v])=>l("button",{type:"button",class:"vp-blog-type-button",onClick:()=>{c.value=f}},l("div",{class:["icon-wrapper",{active:c.value===f}],"aria-label":u.value[f],"data-balloon-pos":"up"},l(v))))),l(he,()=>c.value==="article"?l("div",{class:"vp-sticky-article-wrapper"},[l("div",{class:"title",onClick:()=>s(t.value.path)},[l(ar),l("span",{class:"num"},t.value.items.length),u.value.article]),l("hr"),l("ul",{class:"vp-sticky-articles"},r.value.items.map(({info:f,path:v},h)=>l(he,{appear:!0,delay:.08*(h+1)},()=>l("li",{class:"vp-sticky-article"},l(Ve,{to:v},()=>f[ye.title])))))]):c.value==="category"?l("div",{class:"vp-category-wrapper"},[o.value?l("div",{class:"title",onClick:()=>s(n.value.path)},[l(di),l("span",{class:"num"},o.value),u.value.category]):null,l("hr"),l(he,{delay:.04},()=>l(fa))]):c.value==="tag"?l("div",{class:"vp-tag-wrapper"},[a.value?l("div",{class:"title",onClick:()=>s(i.value.path)},[l(fi),l("span",{class:"num"},a.value),u.value.tag]):null,l("hr"),l(he,{delay:.04},()=>l(va))]):l(he,()=>l(Kh)))])}}),wr=B({name:"BlogWrapper",slots:Object,setup(e,{slots:t}){const{isMobile:n}=Io();return()=>[l(la),l(ia,{noSidebar:!0,noToc:!0},{default:()=>t.default(),navScreenBottom:()=>l(ua),...n.value?{sidebar:()=>l(r0)}:{}})]}});const i0=()=>l("aside",{class:"vp-blog-info-wrapper"},[l(he,()=>l(ua)),l(he,{delay:.04},()=>l(r0))]);i0.displayName="InfoPanel";var Ar=i0,qh=B({name:"BlogPage",components:{CategoryList:fa,TagList:va},setup(){const e=ce(),t=we(),n=Oo(),o=Lo(),r=T(()=>t.value.blog||{}),i=T(()=>{const{key:s=""}=r.value;return s==="category"?"CategoryList":s==="tag"?"TagList":null}),a=T(()=>{const{name:s="",key:c=""}=r.value;return c==="category"?s?n.value.map[s].items:[]:c==="tag"?s?o.value.map[s].items:[]:[]});return()=>l(wr,()=>l("div",{class:"vp-page vp-blog"},l("div",{class:"blog-page-wrapper"},[l("main",{id:"main-content",class:"vp-blog-main"},[l(he,()=>i.value?l(Je(i.value)):null),r.value.name?l(he,{appear:!0,delay:.24},()=>l(da,{key:e.value.path,items:a.value})):null]),l(he,{delay:.16},()=>l(Ar,{key:"blog"}))])))}}),Yh=B({name:"BlogHero",slots:Object,setup(e,{slots:t}){const n=we(),o=Un(),r=$e(),i=T(()=>n.value.heroFullScreen??!1),a=T(()=>{const{heroText:c,heroImage:u,heroImageDark:p,heroAlt:f,heroImageStyle:v,tagline:h}=n.value;return{text:c??o.value.title??"Hello",image:u?Ie(u):null,imageDark:p?Ie(p):null,heroStyle:v,alt:f||c||"hero image",tagline:h??"",isFullScreen:i.value}}),s=T(()=>{const{bgImage:c,bgImageDark:u,bgImageStyle:p}=n.value;return{image:ie(c)?Ie(c):c===!1?null:xh,imageDark:ie(u)?Ie(u):null,bgStyle:p,isFullScreen:i.value}});return()=>{var c,u;return n.value.hero===!1?null:l("div",{ref:r,class:["vp-blog-hero",{fullscreen:i.value,"no-bg":!s.value.image}]},[((c=t.heroBg)==null?void 0:c.call(t,s.value))||[s.value.image?l("div",{class:["vp-blog-mask",{light:s.value.imageDark}],style:[{background:`url(${s.value.image}) center/cover no-repeat`},s.value.bgStyle]}):null,s.value.imageDark?l("div",{class:"vp-blog-mask dark",style:[{background:`url(${s.value.imageDark}) center/cover no-repeat`},s.value.bgStyle]}):null],((u=t.heroInfo)==null?void 0:u.call(t,a.value))||[l(he,{appear:!0,type:"group",delay:.04},()=>[a.value.image?l("img",{key:"light",class:["vp-blog-hero-image",{light:a.value.imageDark}],style:a.value.heroStyle,src:a.value.image,alt:a.value.alt}):null,a.value.imageDark?l("img",{key:"dark",class:"vp-blog-hero-image dark",style:a.value.heroStyle,src:a.value.imageDark,alt:a.value.alt}):null]),l(he,{appear:!0,delay:.08},()=>a.value.text?l("h1",{class:"vp-blog-hero-title"},a.value.text):null),l(he,{appear:!0,delay:.12},()=>a.value.tagline?l("p",{class:"vp-blog-hero-description",innerHTML:a.value.tagline}):null)],a.value.isFullScreen?l("button",{type:"button",class:"slide-down-button",onClick:()=>{window.scrollTo({top:r.value.clientHeight,behavior:"smooth"})}},[l(vi),l(vi)]):null])}}});const Zh=["link","article","book","project","friend"];var Xh=B({name:"ProjectPanel",components:{ArticleIcon:ar,BookIcon:Ju,FriendIcon:t0,LinkIcon:Qu,ProjectIcon:e0},setup(){const e=we(),t=Gn(),n=To(),o=(r="",i="icon")=>Zh.includes(r)?l(Je(`${r}-icon`)):Jt(r)?l("img",{class:"vp-project-image",src:r,alt:i}):yr(r)?l("img",{class:"vp-project-image",src:Ie(r),alt:i}):l(ze,{icon:r});return()=>{var r;return(r=e.value.projects)!=null&&r.length?l("div",{class:"vp-project-panel"},e.value.projects.map(({icon:i,link:a,name:s,desc:c},u)=>l("div",{class:["vp-project-card",{[`project${u%9}`]:!t.value}],onClick:()=>n(a)},[o(i,s),l("div",{class:"vp-project-name"},s),l("div",{class:"vp-project-desc"},c)]))):null}}}),Jh=B({name:"BlogHome",setup(){const e=Ro();return()=>l("div",{class:"vp-page vp-blog"},[l(Yh),l("div",{class:"blog-page-wrapper"},[l("main",{id:"main-content",class:"vp-blog-main"},[l(he,{appear:!0,delay:.16},()=>l(Xh)),l(he,{appear:!0,delay:.24},()=>l(da,{items:e.value.items}))]),l(he,{appear:!0,delay:.16},()=>l(Ar,{key:"blog"}))]),l(he,{appear:!0,delay:.28},()=>l(aa))])}}),Qh=B({name:"BlogHome",setup(){return()=>l(wr,()=>l(Jh))}}),a0=B({name:"ArticleType",setup(){const e=ce(),t=At(),n=ue(),o=Ro(),r=sa(),i=T(()=>{const a=n.value.blogLocales;return[{text:a.all,path:o.value.path},{text:a.star,path:r.value.path},...[].map(({key:s,path:c})=>({text:a[s],path:c.replace(/^\//,t.value)}))]});return()=>l("ul",{class:"vp-article-type-wrapper"},i.value.map(a=>l("li",{class:["vp-article-type",{active:a.path===e.value.path}]},l(Ve,{to:a.path},()=>a.text))))}}),e3=B({name:"BlogPage",setup(){const e=Er(),t=we(),n=ce(),o=Ro(),r=sa(),i=T(()=>{const{key:a="",type:s}=t.value.blog||{};return a==="star"?r.value.items:s==="type"&&a?e.value.items:o.value.items});return()=>l(wr,()=>l("div",{class:"vp-page vp-blog"},l("div",{class:"blog-page-wrapper"},[l("main",{id:"main-content",class:"vp-blog-main"},[l(he,()=>l(a0)),l(he,{appear:!0,delay:.24},()=>l(da,{key:n.value.path,items:i.value}))]),l(he,{delay:.16},()=>l(Ar,{key:"blog"}))])))}}),t3=B({name:"TimelineItems",setup(){const e=ko(),t=ue(),n=ca(),o=T(()=>e.value.timeline||t.value.blogLocales.timelineTitle),r=T(()=>n.value.config.map(({year:i})=>({title:i.toString(),level:2,slug:i.toString(),children:[]})));return()=>l("div",{class:"timeline-wrapper"},l("ul",{class:"timeline-content"},[l(he,()=>l("li",{class:"motto"},o.value)),l(Nu,{items:r.value}),n.value.config.map(({year:i,items:a},s)=>l(he,{appear:!0,delay:.08*(s+1),type:"group"},()=>[l("h3",{key:"title",id:i,class:"timeline-year-title"},l("span",i)),l("li",{key:"content",class:"timeline-year-list"},[l("ul",{class:"timeline-year-wrapper"},a.map(({date:c,info:u,path:p})=>l("li",{class:"timeline-item"},[l("span",{class:"timeline-date"},c),l(Ve,{class:"timeline-title",to:p},()=>u[ye.title])])))])]))]))}}),n3=B({name:"Timeline",components:{ArticleType:a0,CategoryList:fa,TagList:va},setup(){return()=>l(wr,()=>l("div",{class:"vp-page vp-blog"},l("div",{class:"blog-page-wrapper"},[l("main",{id:"main-content",class:"vp-blog-main"},[l(he,{appear:!0,delay:.24},()=>l(t3))]),l(he,{delay:.16},()=>l(Ar,{key:"blog"}))])))}});Tf(ze);const o3=Qe({enhance:({app:e,router:t})=>{const{scrollBehavior:n}=t.options;t.options.scrollBehavior=async(...o)=>(await zu().wait(),n(...o)),kv(e),e.component("HopeIcon",ze),e.component("VPLink",Ve),e.component("BloggerInfo",ua)},setup:()=>{Lv(),Dv(),jh()},layouts:{Layout:Ph,NotFound:kh,BlogCategory:qh,BlogHome:Qh,BlogType:e3,Timeline:n3}}),r3=e=>{if(window.dataLayer&&window.gtag)return;const t=document.createElement("script");t.src=`https://www.googletagmanager.com/gtag/js?id=${e.id}`,t.async=!0,document.head.appendChild(t),window.dataLayer=window.dataLayer||[],window.gtag=function(){dataLayer.push(arguments)},gtag("js",new Date),e.debug?gtag("config",e.id,{debug_mode:!0}):gtag("config",e.id)},i3={id:"G-KJX26P5PQ2"},a3=Qe({enhance(){r3(i3)}}),l3=()=>l(re,{name:"heading"},()=>l("path",{d:"M250.4 704.6H64V595.4h202.4l26.2-166.6H94V319.6h214.4L352 64h127.8l-43.6 255.4h211.2L691 64h126.2l-43.6 255.4H960v109.2H756.2l-24.6 166.6H930v109.2H717L672 960H545.8l43.6-255.4H376.6L333 960H206.8l43.6-255.4zm168.4-276L394 595.4h211.2l24.6-166.6h-211z"}));l3.displayName="HeadingIcon";const s3=()=>l(re,{name:"heart"},()=>l("path",{d:"M1024 358.156C1024 195.698 892.3 64 729.844 64c-86.362 0-164.03 37.218-217.844 96.49C458.186 101.218 380.518 64 294.156 64 131.698 64 0 195.698 0 358.156 0 444.518 37.218 522.186 96.49 576H96l320 320c32 32 64 64 96 64s64-32 96-64l320-320h-.49c59.272-53.814 96.49-131.482 96.49-217.844zM841.468 481.232 517.49 805.49a2981.962 2981.962 0 0 1-5.49 5.48c-1.96-1.95-3.814-3.802-5.49-5.48L182.532 481.234C147.366 449.306 128 405.596 128 358.156 128 266.538 202.538 192 294.156 192c47.44 0 91.15 19.366 123.076 54.532L512 350.912l94.768-104.378C638.696 211.366 682.404 192 729.844 192 821.462 192 896 266.538 896 358.156c0 47.44-19.368 91.15-54.532 123.076z"}));s3.displayName="HeartIcon";const c3=()=>l(re,{name:"history"},()=>l("path",{d:"M512 1024a512 512 0 1 1 512-512 512 512 0 0 1-512 512zm0-896a384 384 0 1 0 384 384 384 384 0 0 0-384-384zm192 448H512a64 64 0 0 1-64-64V320a64 64 0 0 1 128 0v128h128a64 64 0 0 1 0 128z"}));c3.displayName="HistoryIcon";const u3=()=>l(re,{name:"title"},()=>l("path",{d:"M512 256c70.656 0 134.656 28.672 180.992 75.008A254.933 254.933 0 0 1 768 512c0 83.968-41.024 157.888-103.488 204.48C688.96 748.736 704 788.48 704 832c0 105.984-86.016 192-192 192-106.048 0-192-86.016-192-192h128a64 64 0 1 0 128 0 64 64 0 0 0-64-64 255.19 255.19 0 0 1-181.056-75.008A255.403 255.403 0 0 1 256 512c0-83.968 41.024-157.824 103.488-204.544C335.04 275.264 320 235.584 320 192A192 192 0 0 1 512 0c105.984 0 192 85.952 192 192H576a64.021 64.021 0 0 0-128 0c0 35.328 28.672 64 64 64zM384 512c0 70.656 57.344 128 128 128s128-57.344 128-128-57.344-128-128-128-128 57.344-128 128z"}));u3.displayName="TitleIcon";const ha=()=>l(re,{name:"search"},()=>l("path",{d:"M192 480a256 256 0 1 1 512 0 256 256 0 0 1-512 0m631.776 362.496-143.2-143.168A318.464 318.464 0 0 0 768 480c0-176.736-143.264-320-320-320S128 303.264 128 480s143.264 320 320 320a318.016 318.016 0 0 0 184.16-58.592l146.336 146.368c12.512 12.48 32.768 12.48 45.28 0 12.48-12.512 12.48-32.768 0-45.28"}));ha.displayName="SearchIcon";const l0=()=>l("svg",{xmlns:"http://www.w3.org/2000/svg",width:"32",height:"32",preserveAspectRatio:"xMidYMid",viewBox:"0 0 100 100"},[l("circle",{cx:"28",cy:"75",r:"11",fill:"currentColor"},l("animate",{attributeName:"fill-opacity",begin:"0s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"})),l("path",{fill:"none",stroke:"#88baf0","stroke-width":"10",d:"M28 47a28 28 0 0 1 28 28"},l("animate",{attributeName:"stroke-opacity",begin:"0.1s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"})),l("path",{fill:"none",stroke:"#88baf0","stroke-width":"10",d:"M28 25a50 50 0 0 1 50 50"},l("animate",{attributeName:"stroke-opacity",begin:"0.2s",dur:"1s",keyTimes:"0;0.2;1",repeatCount:"indefinite",values:"0;1;1"}))]);l0.displayName="LoadingIcon";const s0=({hint:e})=>l("div",{class:"search-pro-result-wrapper loading"},[l(l0),e]);s0.displayName="SearchLoading";const p3='',ma={searchDelay:150,suggestDelay:0,queryHistoryCount:5,resultHistoryCount:5,hotKeys:[{key:"k",ctrl:!0},{key:"/",ctrl:!0}],worker:"search-pro.worker.js"},Q3={},c0=ma.hotKeys,ga={"/":{cancel:"取消",placeholder:"搜索",search:"搜索",searching:"搜索中",defaultTitle:"文档",select:"选择",navigate:"切换",autocomplete:"自动补全",exit:"关闭",history:"搜索历史",emptyHistory:"无搜索历史",emptyResult:"没有找到结果",loading:"正在加载搜索索引..."}};new URL("data:application/javascript;base64,aW1wb3J0e3NlYXJjaCBhcyBDLGdldFN0b3JlZEZpZWxkcyBhcyBSLGF1dG9TdWdnZXN0IGFzIFQsbG9hZEpTT05JbmRleCBhcyB3fWZyb20ic2xpbXNlYXJjaCI7aW1wb3J0ICQgZnJvbSJAdGVtcC9zZWFyY2gtcHJvL2luZGV4IjtpbXBvcnR7ZW50cmllcyBhcyBFfWZyb20idnVlcHJlc3Mtc2hhcmVkL2NsaWVudCI7Y29uc3QgeD0obCxlKT0+e2NvbnN0IG49bC50b0xvd2VyQ2FzZSgpLHM9ZS50b0xvd2VyQ2FzZSgpLG89W107bGV0IHQ9MCxyPTA7Y29uc3QgaT0oYyxnPSExKT0+e2xldCBwPSIiO3I9PT0wP3A9Yy5sZW5ndGg+MjA/YOKApiAke2Muc2xpY2UoLTIwKX1gOmM6Zz9wPWMubGVuZ3RoK3I+MTAwP2Ake2Muc2xpY2UoMCwxMDAtcil94oCmIGA6YzpwPWMubGVuZ3RoPjIwP2Ake2Muc2xpY2UoMCwyMCl9IOKApiAke2Muc2xpY2UoLTIwKX1gOmMscCYmby5wdXNoKHApLHIrPXAubGVuZ3RoLGd8fChvLnB1c2goWyJtYXJrIixlXSkscis9ZS5sZW5ndGgscj49MTAwJiZvLnB1c2goIiDigKYiKSl9O2xldCBoPW4uaW5kZXhPZihzLHQpO2lmKGg9PT0tMSlyZXR1cm4gbnVsbDtmb3IoO2g+PTA7KXtjb25zdCBjPWgrcy5sZW5ndGg7aWYoaShsLnNsaWNlKHQsaCkpLHQ9YyxyPjEwMClicmVhaztoPW4uaW5kZXhPZihzLHQpfXJldHVybiByPDEwMCYmaShsLnNsaWNlKHQpLCEwKSxvfSxTPS9bXHU0ZTAwLVx1OWZhNV0vZyxNPShsPXt9KT0+KHtmdXp6eTouMixwcmVmaXg6ITAscHJvY2Vzc1Rlcm06ZT0+e2NvbnN0IG49ZS5tYXRjaChTKXx8W10scz1lLnJlcGxhY2UoUywiIikudG9Mb3dlckNhc2UoKTtyZXR1cm4gcz9bcywuLi5uXTpbLi4ubl19LC4uLmx9KSxGPShsLGUpPT5lLmNvbnRlbnRzLnJlZHVjZSgobixbLHNdKT0+bitzLDApLWwuY29udGVudHMucmVkdWNlKChuLFssc10pPT5uK3MsMCksXz0obCxlKT0+TWF0aC5tYXgoLi4uZS5jb250ZW50cy5tYXAoKFssbl0pPT5uKSktTWF0aC5tYXgoLi4ubC5jb250ZW50cy5tYXAoKFssbl0pPT5uKSksTz0obCxlLG49e30pPT57Y29uc3Qgcz17fTtyZXR1cm4gQyhlLGwsTSh7Ym9vc3Q6e2g6Mix0OjEsYzo0fSwuLi5ufSkpLmZvckVhY2gobz0+e2NvbnN0e2lkOnQsdGVybXM6cixzY29yZTppfT1vLGg9dC5pbmNsdWRlcygiQCIpLGM9dC5pbmNsdWRlcygiIyIpLFtnLHBdPXQuc3BsaXQoL1sjQF0vKSxtPXIuc29ydCgodSxhKT0+dS5sZW5ndGgtYS5sZW5ndGgpLmZpbHRlcigodSxhKT0+ci5zbGljZShhKzEpLmV2ZXJ5KGY9PiFmLmluY2x1ZGVzKHUpKSkse2NvbnRlbnRzOmR9PXNbZ10/Pz17dGl0bGU6IiIsY29udGVudHM6W119O2lmKGgpZC5wdXNoKFt7dHlwZToiY3VzdG9tRmllbGQiLGtleTpnLGluZGV4OnAsZGlzcGxheTptLm1hcCh1PT5vLmMubWFwKGE9PngoYSx1KSkpLmZsYXQoKS5maWx0ZXIodT0+dSE9PW51bGwpfSxpXSk7ZWxzZXtjb25zdCB1PW0ubWFwKGE9Pngoby5oLGEpKS5maWx0ZXIoYT0+YSE9PW51bGwpO2lmKHUubGVuZ3RoJiZkLnB1c2goW3t0eXBlOmM/ImhlYWRpbmciOiJ0aXRsZSIsa2V5OmcsLi4uYyYme2FuY2hvcjpwfSxkaXNwbGF5OnV9LGldKSwidCJpbiBvKWZvcihjb25zdCBhIG9mIG8udCl7Y29uc3QgZj1tLm1hcCh5PT54KGEseSkpLmZpbHRlcih5PT55IT09bnVsbCk7Zi5sZW5ndGgmJmQucHVzaChbe3R5cGU6InRleHQiLGtleTpnLC4uLmMmJnthbmNob3I6cH0sZGlzcGxheTpmfSxpXSl9fX0pLEUocykuc29ydCgoWyxvXSxbLHRdKT0+U0VBUkNIX1BST19TT1JUX1NUUkFURUdZPT09InRvdGFsIj9GKG8sdCk6XyhvLHQpKS5tYXAoKFtvLHt0aXRsZTp0LGNvbnRlbnRzOnJ9XSk9PntpZighdCl7Y29uc3QgaT1SKGUsbyk7aSYmKHQ9aS5oKX1yZXR1cm57dGl0bGU6dCxjb250ZW50czpyLm1hcCgoW2ldKT0+aSl9fSl9LGs9KGwsZSxuPXt9KT0+VChlLGwsTShuKSkubWFwKCh7c3VnZ2VzdGlvbjpzfSk9PnMpO3NlbGYub25tZXNzYWdlPWFzeW5jKHtkYXRhOnt0eXBlOmw9ImFsbCIscXVlcnk6ZSxsb2NhbGU6bixvcHRpb25zOnN9fSk9Pntjb25zdHtkZWZhdWx0Om99PWF3YWl0ICRbbl0oKSx0PXcobyx7ZmllbGRzOlsiaCIsInQiLCJjIl0sc3RvcmVGaWVsZHM6WyJoIiwidCIsImMiXX0pO2w9PT0ic3VnZ2VzdCI/c2VsZi5wb3N0TWVzc2FnZShrKGUsdCxzKSk6bD09PSJzZWFyY2giP3NlbGYucG9zdE1lc3NhZ2UoTyhlLHQscykpOnNlbGYucG9zdE1lc3NhZ2Uoe3N1Z2dlc3Rpb25zOmsoZSx0LHMpLHJlc3VsdHM6TyhlLHQscyl9KX07Ci8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcAo=",self.location);let d3={};const u0=Symbol(""),f3=()=>de(u0),v3=e=>{e.provide(u0,d3)},h3=()=>{const e=new Worker(`/${ma.worker}`,{}),t=[];return e.addEventListener("message",({data:n})=>{const{resolve:o}=t.shift();o(n)}),{search:n=>new Promise((o,r)=>{e.postMessage(n),t.push({resolve:o,reject:r})}),terminate:()=>{e.terminate(),t.forEach(({reject:n})=>n(new Error("Worker has been terminated.")))}}};const m3=(e,t=!1)=>{const n=K(0),o=T(()=>e.value[n.value]),r=()=>{n.value=n.value>0?n.value-1:e.value.length-1},i=()=>{n.value=n.value{t||(n.value=0)}),{index:n,item:o,prev:r,next:i}},_a=Symbol(""),g3=()=>{const e=K(!1);ot(_a,e)},_3=e=>e instanceof Element?document.activeElement===e&&(["TEXTAREA","SELECT","INPUT"].includes(e.tagName)||e.hasAttribute("contenteditable")):!1,b3=e=>c0.some(t=>{const{key:n,ctrl:o=!1,shift:r=!1,alt:i=!1,meta:a=!1}=t;return n===e.key&&o===e.ctrlKey&&r===e.shiftKey&&i===e.altKey&&a===e.metaKey}),y3='',E3='',w3='',A3='',T3=e=>{const t=K([]);{const n=f3(),o=At();ge(()=>{const r=B2(s=>{s?i({type:"suggest",query:s,locale:o.value,options:n}).then(c=>{t.value=c.length?pn(c[0],s)&&!c[0].slice(s.length).includes(" ")?c:[s,...c]:[]}).catch(c=>{console.error(c)}):t.value=[]},ma.suggestDelay),{search:i,terminate:a}=h3();ae([e,o],()=>r(e.value),{immediate:!0}),fn(()=>{a()})})}return{suggestions:t}},jr=c0[0];var I3=B({name:"SearchBox",setup(){const e=Vt(ga),t=de(_a),n=K(!1),o=T(()=>jr?[(n.value?["⌃","⇧","⌥","⌘"]:["Ctrl","Shift","Alt","Win"]).filter((r,i)=>jr[["ctrl","shift","alt","meta"][i]]),jr.key.toUpperCase()]:null);return Re("keydown",r=>{!t.value&&b3(r)&&!_3(r.target)&&(r.preventDefault(),t.value=!0)}),ge(()=>{const{userAgent:r}=navigator;n.value=h2(r)||v2(r)||f2(r)}),()=>[l("button",{type:"button",class:"search-pro-button",role:"search","aria-label":e.value.search,onClick:()=>{t.value=!0}},[l(ha),l("div",{class:"search-pro-placeholder"},e.value.search),o.value?l("div",{class:"search-pro-key-hints"},o.value.map(r=>l("kbd",{class:"search-pro-key"},r))):null])]}});const P3=b({loader:()=>d(()=>import("./SearchResult-4a7e68c4.js"),[]),loadingComponent:()=>{const e=Vt(ga);return l(s0,{hint:e.value.loading})}});var O3=B({name:"SearchModal",setup(){const e=de(_a),t=Un(),n=$c(),o=Vt(ga),r=K(""),{suggestions:i}=T3(r),a=K(!1),{index:s,prev:c,next:u}=m3(i),p=$e(),f=$e(),v=(h=s.value)=>{r.value=i.value[h],a.value=!1};return Re("keydown",h=>{a.value?h.key==="ArrowUp"?c():h.key==="ArrowDown"?u():h.key==="Enter"?v():h.key==="Escape"&&(a.value=!1):h.key==="Escape"&&(e.value=!1)}),ge(()=>{const h=Qi(document.body);ae(e,async _=>{var y;h.value=_,_&&(await Xt(),(y=p.value)==null||y.focus())}),U2(f,()=>{a.value=!1}),fn(()=>{h.value=!1})}),()=>e.value?l("div",{class:"search-pro-modal-wrapper"},[l("div",{class:"search-pro-mask",onClick:()=>{e.value=!1,r.value=""}}),l("div",{class:"search-pro-modal"},[l("div",{class:"search-pro-box"},[l("form",[l("label",{for:"search-pro","aria-label":o.value.search},l(ha)),l("input",{ref:p,type:"search",class:"search-pro-input",id:"search-pro",placeholder:o.value.placeholder,spellcheck:"false",autocapitalize:"off",autocomplete:"off",autocorrect:"off",name:`${t.value.title}-search`,value:r.value,"aria-controls":"search-pro-results",onKeydown:h=>{const{key:_}=h;i.value.length&&(_==="Tab"?(v(),h.preventDefault()):(_==="ArrowDown"||_==="ArrowUp"||_==="Escape")&&h.preventDefault())},onInput:({target:h})=>{r.value=h.value,a.value=!0,s.value=0}}),r.value?l("button",{type:"reset",class:"search-pro-clear-button",innerHTML:p3,onClick:()=>{r.value=""}}):null,a.value&&i.value.length?l("ul",{class:"search-pro-suggestions",ref:f},i.value.map((h,_)=>l("li",{class:["search-pro-suggestion",{active:_===s.value}],onClick:()=>{v(_)}},[l("kbd",{class:"search-pro-auto-complete",title:`Tab ${o.value.autocomplete}`},"Tab"),h]))):null]),l("button",{type:"button",class:"search-pro-close-button",onClick:()=>{e.value=!1,r.value=""}},o.value.cancel)]),l(P3,{query:r.value,isFocusing:!a.value,onClose:()=>{e.value=!1},onUpdateQuery:h=>{r.value=h}}),n.value?null:l("div",{class:"search-pro-hints"},[l("span",{class:"search-pro-hint"},[l("kbd",{innerHTML:y3}),o.value.select]),l("span",{class:"search-pro-hint"},[l("kbd",{innerHTML:w3}),l("kbd",{innerHTML:E3}),o.value.navigate]),l("span",{class:"search-pro-hint"},[l("kbd",{innerHTML:A3}),o.value.exit])])])]):null}}),k3=Qe({enhance({app:e}){v3(e),e.component("SearchBox",I3)},setup(){g3()},rootComponents:[O3]});const Uo=[u1,mf,Af,kf,Sf,Vf,zf,Qf,av,lv,gv,o3,a3,k3],L3=[["v-3f9d0d55","/DailyRoutine.html",{y:"p",t:"每日仪式",i:"check"},[":md"]],["v-3d0aa58a","/Fitness.html",{y:"p",t:"健身计划",i:"strong"},[":md"]],["v-8daa1a0e","/",{y:"p",t:"LearnHubs",i:"note"},["/README.md"]],["v-35f5db9e","/blog.html",{y:"h",t:"互联网小白",i:"home"},[":md"]],["v-184f4da6","/intro.html",{y:"p",t:"个人介绍",i:"any"},[":md"]],["v-0d25d1e4","/ai/AIEnjoy.html",{d:1700624628e3,e:`

        AiEnjoy

        +

        https://autoaigpt.cn 是一个多功能网站,提供快速使用GPT、万能IT工具、博客资源、每日热棒、音乐欣赏和互动等服务。该网站汇集了丰富的资源,为用户提供了广泛的信息和工具,旨在满足用户对于技术、新闻和娱乐的需求。本报告将详细介绍https://autoaigpt.cn 网站的各项功能和特点。

        `,r:{minutes:2.7,words:810},y:"a",t:"AiEnjoy"},[":md"]],["v-7b101d14","/ai/ChatGPT.html",{d:1700624628e3,e:`

        ChatGPT

        +

        公司介绍

        +

        OpenAI是一家致力于确保人工智能(AI)能够为所有人带来好处的人工智能研究实验室。该公司成立于2015年,由Elon Musk、Sam Altman等人联合创立,旨在推动友好AI的发展,避免其集中在少数几家公司或政府手中。OpenAI的使命是确保人工智能的广泛应用能够造福全人类。

        +

        产品能力与目前模型

        +

        OpenAI的最新产品是ChatGPT,这是一种基于GPT-3模型的对话AI。GPT-3是OpenAI的第三代生成预训练转换器,它是目前最大、最强大的语言模型之一。GPT-3拥有1750亿个训练参数,能够生成极其逼真的人类语言。

        `,r:{minutes:2.24,words:673},y:"a",t:"ChatGPT"},[":md"]],["v-2c379a13","/ai/Midjourney.html",{d:1700624628e3,e:`

        Midjourney

        +

        Midjourney是一款基于人工智能技术的绘画软件,它融合了深度学习算法的精髓,为用户提供了独特的绘画体验。在本文中,我们将探讨Midjourney所基于的技术以及它如何帮助用户创作个性化风格的绘画作品。

        +

        Midjourney的技术基础

        +

        Midjourney的核心技术基础是人工智能,具体而言,是深度学习算法。这些算法在绘画领域发挥了巨大的作用,让用户能够轻松地创造独特的艺术作品。这一技术能力的支持使Midjourney成为专业画家和绘画爱好者的理想选择。

        +

        文字生成图片

        +

        一种独特的生成方式是文字生成图片。Midjourney允许用户输入文字描述,然后将其转化为令人惊叹的绘画作品。无需绘画技能,用户可以用文字表达他们的创意,而Midjourney将会将其呈现为生动的图像。

        `,r:{minutes:2.29,words:686},y:"a",t:"Midjourney"},[":md"]],["v-26a023fe","/posts/2017-04-18-wechat_multi_open.html",{d:14924736e5,l:"2017年4月18日",c:["工具"],g:["微信"],e:`

        由于工作原因,有时候我们需要在电脑上登录多个微信。但微信限制一个客户端只能登陆一个账号,PC 端 + 网页版就成了通用方案,操作效率下降许多。

        其实我们还有更好的办法。在微信 PC 版之余,同时安装微信 For Windows,就能实现客户端双开!

        微信 For Windows 安装

        打开「运行」对话框,输入并启动「应用商店」或「Microsoft Store」,搜索并安装 微信 For Windows

        @@ -433,17 +443,7 @@ AI 会取代你的工作!

        img
        img

        外部视频

        `,r:{minutes:2.11,words:633},y:"a",t:"stable-video-diffusion 安装详细教程,简单界面介绍",O:-56},["/_posts/2023-12-12-sd-op.html","/_posts/2023-12-12-sd-op.md"]],["v-af1fbe54","/posts/2023-12-13-awesome-selfhosted-cn.html",{d:17024256e5,l:"2023年12月13日",c:["工具"],g:["百宝箱","合集","外站资源"],e:`

        Awesome-Selfhosted 是由 Edward D 发起和维护资源列表,收集了许多可以在本地搭建的网络服务和 Web 应用列表。

        -

        Awesome-Selfhosted-cn 则是依据 Awesome-Selfhosted 翻译而来。也欢迎你帮助推荐和提供建议!

        `,r:{minutes:48.84,words:14651},y:"a",t:"awesome-selfhosted-cn(百宝箱!)",O:-60},["/_posts/2023-12-13-awesome-selfhosted-cn.html","/_posts/2023-12-13-awesome-selfhosted-cn.md"]],["v-0d25d1e4","/ai/AIEnjoy.html",{d:1700624628e3,e:`

        AiEnjoy

        -

        https://autoaigpt.cn 是一个多功能网站,提供快速使用GPT、万能IT工具、博客资源、每日热棒、音乐欣赏和互动等服务。该网站汇集了丰富的资源,为用户提供了广泛的信息和工具,旨在满足用户对于技术、新闻和娱乐的需求。本报告将详细介绍https://autoaigpt.cn 网站的各项功能和特点。

        `,r:{minutes:2.7,words:810},y:"a",t:"AiEnjoy"},[":md"]],["v-7b101d14","/ai/ChatGPT.html",{d:1700624628e3,e:`

        ChatGPT

        -

        公司介绍

        -

        OpenAI是一家致力于确保人工智能(AI)能够为所有人带来好处的人工智能研究实验室。该公司成立于2015年,由Elon Musk、Sam Altman等人联合创立,旨在推动友好AI的发展,避免其集中在少数几家公司或政府手中。OpenAI的使命是确保人工智能的广泛应用能够造福全人类。

        -

        产品能力与目前模型

        -

        OpenAI的最新产品是ChatGPT,这是一种基于GPT-3模型的对话AI。GPT-3是OpenAI的第三代生成预训练转换器,它是目前最大、最强大的语言模型之一。GPT-3拥有1750亿个训练参数,能够生成极其逼真的人类语言。

        `,r:{minutes:2.24,words:673},y:"a",t:"ChatGPT"},[":md"]],["v-2c379a13","/ai/Midjourney.html",{d:1700624628e3,e:`

        Midjourney

        -

        Midjourney是一款基于人工智能技术的绘画软件,它融合了深度学习算法的精髓,为用户提供了独特的绘画体验。在本文中,我们将探讨Midjourney所基于的技术以及它如何帮助用户创作个性化风格的绘画作品。

        -

        Midjourney的技术基础

        -

        Midjourney的核心技术基础是人工智能,具体而言,是深度学习算法。这些算法在绘画领域发挥了巨大的作用,让用户能够轻松地创造独特的艺术作品。这一技术能力的支持使Midjourney成为专业画家和绘画爱好者的理想选择。

        -

        文字生成图片

        -

        一种独特的生成方式是文字生成图片。Midjourney允许用户输入文字描述,然后将其转化为令人惊叹的绘画作品。无需绘画技能,用户可以用文字表达他们的创意,而Midjourney将会将其呈现为生动的图像。

        `,r:{minutes:2.29,words:686},y:"a",t:"Midjourney"},[":md"]],["v-69693975","/apps/AppNotes.html",{y:"p",t:"工具笔记",i:"plugin",O:4},[":md"]],["v-1735a0be","/apps/Applist.html",{y:"p",t:"必备应用",i:"list",O:1},[":md"]],["v-d967ed6c","/apps/ChatGPT.html",{y:"p",t:"ChatGPT",i:"creative",O:2},[":md"]],["v-5c29014a","/apps/Chrome.html",{y:"p",t:"Chrome 扩展",i:"chrome",O:5},[":md"]],["v-1d7dd2b7","/apps/design.html",{y:"p",t:"平面设计",i:"pic",O:3},[":md"]],["v-abe04fa2","/code/AutoHotkey.html",{y:"p",t:"AutoHotkey",i:"linter",O:4},[":md"]],["v-fae223a4","/code/Electron.html",{y:"p",t:"Electron",i:"layout",O:7},[":md"]],["v-67fe64b6","/code/HTML.html",{y:"p",t:"HTML",i:"html",O:1},[":md"]],["v-72cba7c3","/code/Javascript.html",{y:"p",t:"JavaScript",i:"javascript",O:2},[":md"]],["v-0195f17e","/code/Markdown.html",{y:"p",t:"Markdown",i:"markdown",O:5},[":md"]],["v-2caa5134","/code/Python.html",{y:"p",t:"Python",i:"python",O:3},[":md"]],["v-146a1089","/code/",{y:"p",t:"Coding",i:"code"},["/code/README.md"]],["v-49ecfa5b","/code/Regex.html",{y:"p",t:"正则表达式",i:"regexp",O:6},[":md"]],["v-6bea56bc","/code/Vue.html",{y:"p",t:"Vue",i:"vue",O:2},[":md"]],["v-88193f16","/deploy/CloudServices.html",{y:"p",t:"云计算服务",i:"class",O:2},[":md"]],["v-1c7fca9e","/deploy/Cloudflare.html",{y:"p",t:"Cloudflare",i:"proxy",O:5},[":md"]],["v-2b70157f","/deploy/DNS.html",{y:"p",t:"域名 DNS 托管",i:"sitemap",O:6},[":md"]],["v-bc154f32","/deploy/GitHub.html",{y:"p",t:"GitHub",i:"github",O:4},[":md"]],["v-d4ab9bf4","/deploy/MySQL.html",{y:"p",t:"数据库管理",i:"mysql",O:3},[":md"]],["v-7c5f209c","/deploy/Static.html",{y:"p",t:"静态部署",i:"generic",O:1},[":md"]],["v-39dc98a2","/deploy/VPS.html",{y:"p",t:"服务器 VPS",i:"IO",O:3},[":md"]],["v-c582fe3e","/family/Coupon.html",{y:"p",t:"网购攻略",i:"free",O:3},[":md"]],["v-373dc153","/family/Diet.html",{y:"p",t:"健康饮食",i:"enum",O:1},[":md"]],["v-9ff4249e","/family/HomeAutomation.html",{y:"p",t:"智能家居",i:"home",O:3.1},[":md"]],["v-16a2796a","/family/Life.html",{y:"p",t:"生活窍门",i:"creative",O:6},[":md"]],["v-850f3410","/family/Maintenance.html",{y:"p",t:"维修/保养",i:"repair",O:5},[":md"]],["v-182a363a","/family/Medical.html",{y:"p",t:"医疗药品",i:"like",O:4},[":md"]],["v-c51c66fe","/family/Shoppinglist.html",{y:"p",t:"购物评价",i:"info",O:2},[":md"]],["v-101edae1","/services/Docker.html",{y:"p",t:"Docker",i:"any",O:2},[":md"]],["v-73fe61b2","/services/Huginn.html",{y:"p",t:"Huginn",i:"customize",O:3},[":md"]],["v-1b2d4c91","/services/NAS.html",{y:"p",t:"NAS",i:"process",O:1},[":md"]],["v-54e731c2","/services/TTRSS.html",{y:"p",t:"Tiny Tiny RSS",i:"rss",O:4},[":md"]],["v-00f6d5f1","/web/Comments.html",{y:"p",t:"评论插件",i:"comment",O:3},[":md"]],["v-3b0b9f28","/web/VuePress.html",{y:"p",t:"VuePress",i:"vue",O:1},[":md"]],["v-3cdca328","/web/docsify.html",{y:"p",t:"docsify",i:"edit",O:2},[":md"]],["v-6451f4a2","/windows/NewSystem.html",{y:"p",t:"系统重装",i:"update",O:3},[":md"]],["v-395a6953","/windows/QTTabBar.html",{y:"p",t:"QTTabBar",i:"tab",O:4},[":md"]],["v-a8b7dd1a","/windows/cd.html",{y:"p",t:"linux命令大全",i:"tab",O:5},[":md"]],["v-5e2612f0","/windows/faq.html",{y:"p",t:"Windows",i:"windows",O:2},[":md"]],["v-df9d5022","/windows/mac.html",{y:"p",t:"mac",i:"tab",O:1},[":md"]],["v-12e41b33","/ai/TaoAI/",{d:1700624628e3,e:`

        展望未来

        +

        Awesome-Selfhosted-cn 则是依据 Awesome-Selfhosted 翻译而来。也欢迎你帮助推荐和提供建议!

        `,r:{minutes:48.84,words:14651},y:"a",t:"awesome-selfhosted-cn(百宝箱!)",O:-60},["/_posts/2023-12-13-awesome-selfhosted-cn.html","/_posts/2023-12-13-awesome-selfhosted-cn.md"]],["v-69693975","/apps/AppNotes.html",{y:"p",t:"工具笔记",i:"plugin",O:4},[":md"]],["v-1735a0be","/apps/Applist.html",{y:"p",t:"必备应用",i:"list",O:1},[":md"]],["v-d967ed6c","/apps/ChatGPT.html",{y:"p",t:"ChatGPT",i:"creative",O:2},[":md"]],["v-5c29014a","/apps/Chrome.html",{y:"p",t:"Chrome 扩展",i:"chrome",O:5},[":md"]],["v-1d7dd2b7","/apps/design.html",{y:"p",t:"平面设计",i:"pic",O:3},[":md"]],["v-abe04fa2","/code/AutoHotkey.html",{y:"p",t:"AutoHotkey",i:"linter",O:4},[":md"]],["v-fae223a4","/code/Electron.html",{y:"p",t:"Electron",i:"layout",O:7},[":md"]],["v-67fe64b6","/code/HTML.html",{y:"p",t:"HTML",i:"html",O:1},[":md"]],["v-72cba7c3","/code/Javascript.html",{y:"p",t:"JavaScript",i:"javascript",O:2},[":md"]],["v-0195f17e","/code/Markdown.html",{y:"p",t:"Markdown",i:"markdown",O:5},[":md"]],["v-2caa5134","/code/Python.html",{y:"p",t:"Python",i:"python",O:3},[":md"]],["v-146a1089","/code/",{y:"p",t:"Coding",i:"code"},["/code/README.md"]],["v-49ecfa5b","/code/Regex.html",{y:"p",t:"正则表达式",i:"regexp",O:6},[":md"]],["v-6bea56bc","/code/Vue.html",{y:"p",t:"Vue",i:"vue",O:2},[":md"]],["v-88193f16","/deploy/CloudServices.html",{y:"p",t:"云计算服务",i:"class",O:2},[":md"]],["v-1c7fca9e","/deploy/Cloudflare.html",{y:"p",t:"Cloudflare",i:"proxy",O:5},[":md"]],["v-2b70157f","/deploy/DNS.html",{y:"p",t:"域名 DNS 托管",i:"sitemap",O:6},[":md"]],["v-bc154f32","/deploy/GitHub.html",{y:"p",t:"GitHub",i:"github",O:4},[":md"]],["v-d4ab9bf4","/deploy/MySQL.html",{y:"p",t:"数据库管理",i:"mysql",O:3},[":md"]],["v-7c5f209c","/deploy/Static.html",{y:"p",t:"静态部署",i:"generic",O:1},[":md"]],["v-39dc98a2","/deploy/VPS.html",{y:"p",t:"服务器 VPS",i:"IO",O:3},[":md"]],["v-c582fe3e","/family/Coupon.html",{y:"p",t:"网购攻略",i:"free",O:3},[":md"]],["v-373dc153","/family/Diet.html",{y:"p",t:"健康饮食",i:"enum",O:1},[":md"]],["v-9ff4249e","/family/HomeAutomation.html",{y:"p",t:"智能家居",i:"home",O:3.1},[":md"]],["v-16a2796a","/family/Life.html",{y:"p",t:"生活窍门",i:"creative",O:6},[":md"]],["v-850f3410","/family/Maintenance.html",{y:"p",t:"维修/保养",i:"repair",O:5},[":md"]],["v-182a363a","/family/Medical.html",{y:"p",t:"医疗药品",i:"like",O:4},[":md"]],["v-c51c66fe","/family/Shoppinglist.html",{y:"p",t:"购物评价",i:"info",O:2},[":md"]],["v-101edae1","/services/Docker.html",{y:"p",t:"Docker",i:"any",O:2},[":md"]],["v-73fe61b2","/services/Huginn.html",{y:"p",t:"Huginn",i:"customize",O:3},[":md"]],["v-1b2d4c91","/services/NAS.html",{y:"p",t:"NAS",i:"process",O:1},[":md"]],["v-54e731c2","/services/TTRSS.html",{y:"p",t:"Tiny Tiny RSS",i:"rss",O:4},[":md"]],["v-00f6d5f1","/web/Comments.html",{y:"p",t:"评论插件",i:"comment",O:3},[":md"]],["v-3b0b9f28","/web/VuePress.html",{y:"p",t:"VuePress",i:"vue",O:1},[":md"]],["v-3cdca328","/web/docsify.html",{y:"p",t:"docsify",i:"edit",O:2},[":md"]],["v-6451f4a2","/windows/NewSystem.html",{y:"p",t:"系统重装",i:"update",O:3},[":md"]],["v-395a6953","/windows/QTTabBar.html",{y:"p",t:"QTTabBar",i:"tab",O:4},[":md"]],["v-a8b7dd1a","/windows/cd.html",{y:"p",t:"linux命令大全",i:"tab",O:5},[":md"]],["v-5e2612f0","/windows/faq.html",{y:"p",t:"Windows",i:"windows",O:2},[":md"]],["v-df9d5022","/windows/mac.html",{y:"p",t:"mac",i:"tab",O:1},[":md"]],["v-12e41b33","/ai/TaoAI/",{d:1700624628e3,e:`

        展望未来

        引言

        人工智能(AI)已经成为我们生活中不可或缺的一部分,从智能手机,自动驾驶汽车,到智能家居,AI的应用无处不在。AI不仅改变了我们的生活方式,也正在改变我们对世界的理解。本文将探讨AI在画画,对话,解决问题等多个方面的应用,以及它如何让我们的生活变得更美好。

        AI与艺术:AI的绘画能力

        @@ -481,4 +481,4 @@ AI 会取代你的工作!

      74. 我能提供什么:核心竞争力:陪伴?专业知识?丰富经验?渠道资源?
      75. 解决目标用户什么问题:排遣寂寞?选购答疑?
      76. -

        定位完成后,把自己放在目标观众角度进行换位思考,调整直播定位。

        `,r:{minutes:4.69,words:1406},y:"a",t:"直播入门攻略六 | 技巧篇:直播定位与策划",O:6},[":md"]],["v-c7c23db2","/family/baby/",{y:"p",t:"育儿记录",i:"emoji"},["/family/baby/README.md"]],["v-d551fba2","/family/baby/birthing.html",{y:"p",t:"生产前的准备",O:1},[":md"]],["v-db6f9792","/family/baby/newborn.html",{y:"p",t:"新生儿期(0-6 月)",O:2},[":md"]],["v-146fc10b","/services/dockers-on-nas/",{y:"p",t:"NAS 应用集合",i:"process"},["/services/dockers-on-nas/README.md"]],["v-54bae169","/services/dockers-on-nas/cors-anywhere.html",{y:"p",t:"CORS Anywhere:解锁跨域限制",O:100},[":md"]],["v-2117748f","/services/dockers-on-nas/emby.html",{y:"p",t:"Emby:打造你的家庭媒体中心",O:2},[":md"]],["v-072b240a","/services/dockers-on-nas/grocy.html",{y:"p",t:"Grocy:家庭杂货管理",O:7},[":md"]],["v-4b94fd6a","/services/dockers-on-nas/memos.html",{y:"p",t:"Memos:碎片化记录",O:5},[":md"]],["v-7b224f9d","/services/dockers-on-nas/mt-photos.html",{y:"p",t:"MT Photos:分享家庭照片",O:3},[":md"]],["v-2b3f3b71","/services/dockers-on-nas/navidrome.html",{y:"p",t:"Navidrome:开源音乐服务器",O:1},[":md"]],["v-79e8b601","/services/dockers-on-nas/qinglong.html",{y:"p",t:"青龙面板:定时任务管理",O:81},[":md"]],["v-774ba40b","/services/dockers-on-nas/reader.html",{y:"p",t:"Reader:小说/书籍阅读",O:4},[":md"]],["v-06c25741","/services/dockers-on-nas/reverse-proxy.html",{y:"p",t:"反向代理:Nginx Proxy Manager",O:99},[":md"]],["v-a0e1132e","/services/dockers-on-nas/stirling-pdf.html",{y:"p",t:"Stirling-PDF",O:9},[":md"]],["v-78e70751","/services/dockers-on-nas/syncthing.html",{y:"p",t:"Syncthing - 私人同步盘",O:10},[":md"]],["v-31e5d674","/services/dockers-on-nas/tachidesk.html",{y:"p",t:"Tachidesk:漫画聚合阅读器",O:8},[":md"]],["v-08917e81","/services/dockers-on-nas/uptime-kuma.html",{y:"p",t:"Uptime Kuma:轻量运维监控",O:80},[":md"]],["v-3706649a","/404.html",{y:"p",t:""},[]],["v-e1e3da16","/posts/",{y:"p",t:"Posts"},[]],["v-2d0a776e","/ai/",{y:"p",t:"Ai"},[]],["v-144e84a4","/apps/",{y:"p",t:"Apps"},[]],["v-72a9c1e2","/deploy/",{y:"p",t:"Deploy"},[]],["v-29788432","/family/",{y:"p",t:"Family"},[]],["v-1a3d5e90","/services/",{y:"p",t:"Services"},[]],["v-744e6dd4","/web/",{y:"p",t:"Web"},[]],["v-d7a4cff6","/windows/",{y:"p",t:"Windows"},[]],["v-4766039d","/apps/livestreaming/",{y:"p",t:"Livestreaming"},[]],["v-5bc93818","/category/",{y:"p",t:"分类",I:0},[]],["v-744d024e","/tag/",{y:"p",t:"标签",I:0},[]],["v-e52c881c","/article/",{y:"p",t:"文章",I:0},[]],["v-154dc4c4","/star/",{y:"p",t:"收藏",I:0},[]],["v-01560935","/timeline/",{y:"p",t:"时间轴",I:0},[]],["v-14145d44","/category/%E5%B7%A5%E5%85%B7/",{y:"p",t:"工具 分类",I:0},["/category/工具/"]],["v-72680697","/tag/%E5%BE%AE%E4%BF%A1/",{y:"p",t:"标签: 微信",I:0},["/tag/微信/"]],["v-8f1d462c","/category/%E8%87%AA%E5%8A%A8%E5%8C%96/",{y:"p",t:"自动化 分类",I:0},["/category/自动化/"]],["v-b306892a","/tag/rss/",{y:"p",t:"标签: rss",I:0},[]],["v-eea9fcce","/category/%E7%B3%BB%E7%BB%9F/",{y:"p",t:"系统 分类",I:0},["/category/系统/"]],["v-8c49fdb8","/tag/feed43/",{y:"p",t:"标签: Feed43",I:0},[]],["v-5ff6b5a3","/category/%E7%BD%91%E7%BB%9C/",{y:"p",t:"网络 分类",I:0},["/category/网络/"]],["v-8c487d20","/tag/feedex/",{y:"p",t:"标签: FeedEx",I:0},[]],["v-5f7f7ebf","/category/%E6%9C%8D%E5%8A%A1%E5%99%A8/",{y:"p",t:"服务器 分类",I:0},["/category/服务器/"]],["v-d08dfa36","/tag/office/",{y:"p",t:"标签: office",I:0},[]],["v-8de1a174","/category/%E5%8D%9A%E5%AE%A2/",{y:"p",t:"博客 分类",I:0},["/category/博客/"]],["v-05308425","/tag/onenote/",{y:"p",t:"标签: OneNote",I:0},[]],["v-150ab774","/category/%E5%A4%B4%E8%84%91%E9%A9%BF%E7%AB%99/",{y:"p",t:"头脑驿站 分类",I:0},["/category/头脑驿站/"]],["v-21d2d53f","/tag/%E5%85%B3%E6%9C%BA/",{y:"p",t:"标签: 关机",I:0},["/tag/关机/"]],["v-b305d196","/tag/smb/",{y:"p",t:"标签: smb",I:0},[]],["v-8f2a3ea6","/tag/%E5%85%89%E7%8C%AB/",{y:"p",t:"标签: 光猫",I:0},["/tag/光猫/"]],["v-b3149e20","/tag/cdn/",{y:"p",t:"标签: CDN",I:0},[]],["v-92b89202","/tag/%E5%BB%BA%E7%AB%99/",{y:"p",t:"标签: 建站",I:0},["/tag/建站/"]],["v-3f145752","/tag/huginn/",{y:"p",t:"标签: Huginn",I:0},[]],["v-6d02fe66","/tag/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/",{y:"p",t:"标签: 宝塔面板",I:0},["/tag/宝塔面板/"]],["v-e45a3fd0","/tag/jekyll/",{y:"p",t:"标签: Jekyll",I:0},[]],["v-132a6ac4","/tag/github/",{y:"p",t:"标签: Github",I:0},[]],["v-e22b51b2","/tag/travis-ci/",{y:"p",t:"标签: Travis CI",I:0},[]],["v-6106c001","/tag/docker/",{y:"p",t:"标签: Docker",I:0},[]],["v-1f1d54f4","/tag/audition/",{y:"p",t:"标签: Audition",I:0},[]],["v-026ab35e","/tag/%E9%9F%B3%E9%A2%91/",{y:"p",t:"标签: 音频",I:0},["/tag/音频/"]],["v-45b16e58","/tag/aria2/",{y:"p",t:"标签: Aria2",I:0},[]],["v-aae951e6","/tag/%E8%BF%85%E9%9B%B7/",{y:"p",t:"标签: 迅雷",I:0},["/tag/迅雷/"]],["v-36dccd5d","/tag/airtable/",{y:"p",t:"标签: Airtable",I:0},[]],["v-02d57e1c","/tag/gp1700/",{y:"p",t:"标签: GP1700",I:0},[]],["v-36474c60","/tag/koolproxy/",{y:"p",t:"标签: koolproxy",I:0},[]],["v-289a8dd8","/tag/iptv/",{y:"p",t:"标签: IPTV",I:0},[]],["v-0cbf5886","/tag/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5/",{y:"p",t:"标签: 语音输入",I:0},["/tag/语音输入/"]],["v-6f001b53","/tag/openvpn/",{y:"p",t:"标签: OpenVPN",I:0},[]],["v-179b645c","/tag/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/",{y:"p",t:"标签: 内网穿透",I:0},["/tag/内网穿透/"]],["v-4d51b51e","/tag/rsshub/",{y:"p",t:"标签: RSSHub",I:0},[]],["v-66d9f917","/tag/scrcpy/",{y:"p",t:"标签: scrcpy",I:0},[]],["v-d82d3ed4","/tag/%E6%8A%95%E5%B1%8F/",{y:"p",t:"标签: 投屏",I:0},["/tag/投屏/"]],["v-295c722c","/tag/wifi/",{y:"p",t:"标签: WIFI",I:0},[]],["v-9a6de7e0","/tag/%E4%B8%BB%E6%9D%BF/",{y:"p",t:"标签: 主板",I:0},["/tag/主板/"]],["v-70a94678","/tag/%E5%B0%8F%E7%8B%BC%E6%AF%AB/",{y:"p",t:"标签: 小狼毫",I:0},["/tag/小狼毫/"]],["v-79bd8a59","/tag/%E8%BE%93%E5%85%A5%E6%B3%95/",{y:"p",t:"标签: 输入法",I:0},["/tag/输入法/"]],["v-ecace9be","/tag/keepass/",{y:"p",t:"标签: KeePass",I:0},[]],["v-2e8a96b8","/tag/wordpress/",{y:"p",t:"标签: WordPress",I:0},[]],["v-c58e8f3e","/tag/%E5%8E%9F%E5%88%99/",{y:"p",t:"标签: 原则",I:0},["/tag/原则/"]],["v-8ba0d006","/tag/%E6%89%B9%E8%AF%84%E4%B8%8E%E8%87%AA%E6%88%91%E6%89%B9%E8%AF%84/",{y:"p",t:"标签: 批评与自我批评",I:0},["/tag/批评与自我批评/"]],["v-b30ab346","/tag/nas/",{y:"p",t:"标签: nas",I:0},[]],["v-a76657ce","/tag/%E5%BE%AE%E4%BF%A1%E7%BA%A2%E5%8C%85/",{y:"p",t:"标签: 微信红包",I:0},["/tag/微信红包/"]],["v-0f92890a","/tag/microsoft-store/",{y:"p",t:"标签: Microsoft store",I:0},[]],["v-44794367","/tag/winget/",{y:"p",t:"标签: winget",I:0},[]],["v-207bdcdd","/tag/winstall/",{y:"p",t:"标签: winstall",I:0},[]],["v-9075524a","/tag/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/",{y:"p",t:"标签: 浏览器插件",I:0},["/tag/浏览器插件/"]],["v-c9e9368a","/tag/ui.vision/",{y:"p",t:"标签: UI.Vision",I:0},[]],["v-b306a40c","/tag/rpa/",{y:"p",t:"标签: RPA",I:0},[]],["v-2836033f","/tag/blog/",{y:"p",t:"标签: blog",I:0},[]],["v-ed16b278","/tag/vuepress/",{y:"p",t:"标签: VuePress",I:0},[]],["v-6b6b05fc","/tag/%E5%BD%95%E5%B1%8F/",{y:"p",t:"标签: 录屏",I:0},["/tag/录屏/"]],["v-f091ce2a","/tag/%E7%99%BD%E6%9D%BF/",{y:"p",t:"标签: 白板",I:0},["/tag/白板/"]],["v-b3108574","/tag/gtd/",{y:"p",t:"标签: GTD",I:0},[]],["v-91d85d3a","/tag/%E8%99%9A%E6%8B%9F%E5%AE%9A%E4%BD%8D/",{y:"p",t:"标签: 虚拟定位",I:0},["/tag/虚拟定位/"]],["v-0da0abf9","/tag/ai/",{y:"p",t:"标签: AI",I:0},[]],["v-294e906f","/tag/vits/",{y:"p",t:"标签: VITS",I:0},[]],["v-311b2668","/tag/%E5%A3%B0%E9%9F%B3%E5%85%8B%E9%9A%86/",{y:"p",t:"标签: 声音克隆",I:0},["/tag/声音克隆/"]],["v-33129548","/tag/games/",{y:"p",t:"标签: games",I:0},[]],["v-2870f5b5","/tag/free/",{y:"p",t:"标签: Free",I:0},[]],["v-4b93f328","/tag/%E5%9F%9F%E5%90%8D/",{y:"p",t:"标签: 域名",I:0},["/tag/域名/"]],["v-2d605e49","/tag/%E7%99%BD%E5%AB%96/",{y:"p",t:"标签: 白嫖",I:0},["/tag/白嫖/"]],["v-5b9877a1","/tag/%E7%94%BB%E7%94%BB/",{y:"p",t:"标签: 画画",I:0},["/tag/画画/"]],["v-df045e5a","/tag/stablediffusion/",{y:"p",t:"标签: stableDiffusion",I:0},[]],["v-05db77bd","/tag/%E7%99%BE%E5%AE%9D%E7%AE%B1/",{y:"p",t:"标签: 百宝箱",I:0},["/tag/百宝箱/"]],["v-3514c09e","/tag/%E5%90%88%E9%9B%86/",{y:"p",t:"标签: 合集",I:0},["/tag/合集/"]],["v-fa46c5c6","/tag/%E5%A4%96%E7%AB%99%E8%B5%84%E6%BA%90/",{y:"p",t:"标签: 外站资源",I:0},["/tag/外站资源/"]],["v-293a5861","/tag/%E7%9B%B4%E6%92%AD/",{y:"p",t:"标签: 直播",I:0},["/tag/直播/"]],["v-b309c306","/tag/obs/",{y:"p",t:"标签: OBS",I:0},[]]];var Zl=B({name:"Vuepress",setup(){const e=i1();return()=>l(e.value)}}),R3=()=>L3.reduce((e,[t,n,o,r])=>(e.push({name:t,path:n,component:Zl,meta:o},{path:n.endsWith("/")?n+"index.html":n.substring(0,n.length-5),redirect:n},...r.map(i=>({path:i===":md"?n.substring(0,n.length-5)+".md":i,redirect:n}))),e),[{name:"404",path:"/:catchAll(.*)",component:Zl}]),S3=k1,x3=()=>{const e=p2({history:S3(Fi("/")),routes:R3(),scrollBehavior:(t,n,o)=>o||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{var o;(t.path!==n.path||n===Ot)&&([t.meta._data]=await Promise.all([Pt.resolvePageData(t.name),(o=rc[t.name])==null?void 0:o.__asyncLoader()]))}),e},D3=e=>{e.component("ClientOnly",hr),e.component("Content",dc)},C3=(e,t,n)=>{const o=Ll(()=>t.currentRoute.value.path),r=Ll(()=>Pt.resolveRouteLocale(wn.value.locales,o.value)),i=qi(o,()=>t.currentRoute.value.meta._data),a=T(()=>Pt.resolveLayouts(n)),s=T(()=>Pt.resolveSiteLocaleData(wn.value,r.value)),c=T(()=>Pt.resolvePageFrontmatter(i.value)),u=T(()=>Pt.resolvePageHeadTitle(i.value,s.value)),p=T(()=>Pt.resolvePageHead(u.value,c.value,s.value)),f=T(()=>Pt.resolvePageLang(i.value,s.value)),v=T(()=>Pt.resolvePageLayout(i.value,a.value));return e.provide(t1,a),e.provide(ic,i),e.provide(ac,c),e.provide(r1,u),e.provide(lc,p),e.provide(sc,f),e.provide(cc,v),e.provide(Hi,r),e.provide(pc,s),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>c.value},$head:{get:()=>p.value},$headTitle:{get:()=>u.value},$lang:{get:()=>f.value},$page:{get:()=>i.value},$routeLocale:{get:()=>r.value},$site:{get:()=>wn.value},$siteLocale:{get:()=>s.value},$withBase:{get:()=>Ie}}),{layouts:a,pageData:i,pageFrontmatter:c,pageHead:p,pageHeadTitle:u,pageLang:f,pageLayout:v,routeLocale:r,siteData:wn,siteLocaleData:s}},V3=()=>{const e=o1(),t=vr(),n=K([]),o=()=>{e.value.forEach(i=>{const a=M3(i);a&&n.value.push(a)})},r=()=>{document.documentElement.lang=t.value,n.value.forEach(i=>{i.parentNode===document.head&&document.head.removeChild(i)}),n.value.splice(0,n.value.length),e.value.forEach(i=>{const a=B3(i);a!==null&&(document.head.appendChild(a),n.value.push(a))})};ot(l1,r),ge(()=>{o(),r(),ae(()=>e.value,r)})},M3=([e,t,n=""])=>{const o=Object.entries(t).map(([s,c])=>ie(c)?`[${s}=${JSON.stringify(c)}]`:c===!0?`[${s}]`:"").join(""),r=`head > ${e}${o}`;return Array.from(document.querySelectorAll(r)).find(s=>s.innerText===n)||null},B3=([e,t,n])=>{if(!ie(e))return null;const o=document.createElement(e);return zi(t)&&Object.entries(t).forEach(([r,i])=>{ie(i)?o.setAttribute(r,i):i===!0&&o.setAttribute(r,"")}),ie(n)&&o.appendChild(document.createTextNode(n)),o},$3=Wd,N3=async()=>{var n;const e=$3({name:"VuepressApp",setup(){var o;V3();for(const r of Uo)(o=r.setup)==null||o.call(r);return()=>[l(Ac),...Uo.flatMap(({rootComponents:r=[]})=>r.map(i=>l(i)))]}}),t=x3();D3(e),C3(e,t,Uo);for(const o of Uo)await((n=o.enhance)==null?void 0:n.call(o,{app:e,router:t,siteData:wn}));return e.use(t),{app:e,router:t}};N3().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{ke as $,l3 as A,s3 as B,$e as C,ge as D,fn as E,ie as F,Q3 as G,zi as H,ma as I,B2 as J,Ci as K,qe as L,H3 as M,bi as N,h3 as O,de as P,Z3 as Q,f3 as R,Zp as S,dt as T,yi as U,Fc as V,bo as W,Vt as X,F3 as Y,K3 as Z,sl as _,Ws as a,G3 as a0,lf as a1,ot as a2,Xt as a3,X3 as a4,d as a5,J3 as a6,Us as b,j3 as c,N3 as createVueApp,Le as d,W3 as e,U3 as f,B as g,Fe as h,At as i,ga as j,Wn as k,K as l,T as m,Re as n,qp as o,ae as p,l as q,Je as r,c3 as s,z3 as t,Y3 as u,p3 as v,pp as w,Ve as x,s0 as y,u3 as z}; +

        定位完成后,把自己放在目标观众角度进行换位思考,调整直播定位。

        `,r:{minutes:4.69,words:1406},y:"a",t:"直播入门攻略六 | 技巧篇:直播定位与策划",O:6},[":md"]],["v-c7c23db2","/family/baby/",{y:"p",t:"育儿记录",i:"emoji"},["/family/baby/README.md"]],["v-d551fba2","/family/baby/birthing.html",{y:"p",t:"生产前的准备",O:1},[":md"]],["v-db6f9792","/family/baby/newborn.html",{y:"p",t:"新生儿期(0-6 月)",O:2},[":md"]],["v-146fc10b","/services/dockers-on-nas/",{y:"p",t:"NAS 应用集合",i:"process"},["/services/dockers-on-nas/README.md"]],["v-54bae169","/services/dockers-on-nas/cors-anywhere.html",{y:"p",t:"CORS Anywhere:解锁跨域限制",O:100},[":md"]],["v-2117748f","/services/dockers-on-nas/emby.html",{y:"p",t:"Emby:打造你的家庭媒体中心",O:2},[":md"]],["v-072b240a","/services/dockers-on-nas/grocy.html",{y:"p",t:"Grocy:家庭杂货管理",O:7},[":md"]],["v-4b94fd6a","/services/dockers-on-nas/memos.html",{y:"p",t:"Memos:碎片化记录",O:5},[":md"]],["v-7b224f9d","/services/dockers-on-nas/mt-photos.html",{y:"p",t:"MT Photos:分享家庭照片",O:3},[":md"]],["v-2b3f3b71","/services/dockers-on-nas/navidrome.html",{y:"p",t:"Navidrome:开源音乐服务器",O:1},[":md"]],["v-79e8b601","/services/dockers-on-nas/qinglong.html",{y:"p",t:"青龙面板:定时任务管理",O:81},[":md"]],["v-774ba40b","/services/dockers-on-nas/reader.html",{y:"p",t:"Reader:小说/书籍阅读",O:4},[":md"]],["v-06c25741","/services/dockers-on-nas/reverse-proxy.html",{y:"p",t:"反向代理:Nginx Proxy Manager",O:99},[":md"]],["v-a0e1132e","/services/dockers-on-nas/stirling-pdf.html",{y:"p",t:"Stirling-PDF",O:9},[":md"]],["v-78e70751","/services/dockers-on-nas/syncthing.html",{y:"p",t:"Syncthing - 私人同步盘",O:10},[":md"]],["v-31e5d674","/services/dockers-on-nas/tachidesk.html",{y:"p",t:"Tachidesk:漫画聚合阅读器",O:8},[":md"]],["v-08917e81","/services/dockers-on-nas/uptime-kuma.html",{y:"p",t:"Uptime Kuma:轻量运维监控",O:80},[":md"]],["v-3706649a","/404.html",{y:"p",t:""},[]],["v-2d0a776e","/ai/",{y:"p",t:"Ai"},[]],["v-e1e3da16","/posts/",{y:"p",t:"Posts"},[]],["v-144e84a4","/apps/",{y:"p",t:"Apps"},[]],["v-72a9c1e2","/deploy/",{y:"p",t:"Deploy"},[]],["v-29788432","/family/",{y:"p",t:"Family"},[]],["v-1a3d5e90","/services/",{y:"p",t:"Services"},[]],["v-744e6dd4","/web/",{y:"p",t:"Web"},[]],["v-d7a4cff6","/windows/",{y:"p",t:"Windows"},[]],["v-4766039d","/apps/livestreaming/",{y:"p",t:"Livestreaming"},[]],["v-5bc93818","/category/",{y:"p",t:"分类",I:0},[]],["v-744d024e","/tag/",{y:"p",t:"标签",I:0},[]],["v-e52c881c","/article/",{y:"p",t:"文章",I:0},[]],["v-154dc4c4","/star/",{y:"p",t:"收藏",I:0},[]],["v-01560935","/timeline/",{y:"p",t:"时间轴",I:0},[]],["v-14145d44","/category/%E5%B7%A5%E5%85%B7/",{y:"p",t:"工具 分类",I:0},["/category/工具/"]],["v-72680697","/tag/%E5%BE%AE%E4%BF%A1/",{y:"p",t:"标签: 微信",I:0},["/tag/微信/"]],["v-8f1d462c","/category/%E8%87%AA%E5%8A%A8%E5%8C%96/",{y:"p",t:"自动化 分类",I:0},["/category/自动化/"]],["v-b306892a","/tag/rss/",{y:"p",t:"标签: rss",I:0},[]],["v-eea9fcce","/category/%E7%B3%BB%E7%BB%9F/",{y:"p",t:"系统 分类",I:0},["/category/系统/"]],["v-8c49fdb8","/tag/feed43/",{y:"p",t:"标签: Feed43",I:0},[]],["v-5ff6b5a3","/category/%E7%BD%91%E7%BB%9C/",{y:"p",t:"网络 分类",I:0},["/category/网络/"]],["v-8c487d20","/tag/feedex/",{y:"p",t:"标签: FeedEx",I:0},[]],["v-5f7f7ebf","/category/%E6%9C%8D%E5%8A%A1%E5%99%A8/",{y:"p",t:"服务器 分类",I:0},["/category/服务器/"]],["v-d08dfa36","/tag/office/",{y:"p",t:"标签: office",I:0},[]],["v-8de1a174","/category/%E5%8D%9A%E5%AE%A2/",{y:"p",t:"博客 分类",I:0},["/category/博客/"]],["v-05308425","/tag/onenote/",{y:"p",t:"标签: OneNote",I:0},[]],["v-150ab774","/category/%E5%A4%B4%E8%84%91%E9%A9%BF%E7%AB%99/",{y:"p",t:"头脑驿站 分类",I:0},["/category/头脑驿站/"]],["v-21d2d53f","/tag/%E5%85%B3%E6%9C%BA/",{y:"p",t:"标签: 关机",I:0},["/tag/关机/"]],["v-b305d196","/tag/smb/",{y:"p",t:"标签: smb",I:0},[]],["v-8f2a3ea6","/tag/%E5%85%89%E7%8C%AB/",{y:"p",t:"标签: 光猫",I:0},["/tag/光猫/"]],["v-b3149e20","/tag/cdn/",{y:"p",t:"标签: CDN",I:0},[]],["v-92b89202","/tag/%E5%BB%BA%E7%AB%99/",{y:"p",t:"标签: 建站",I:0},["/tag/建站/"]],["v-3f145752","/tag/huginn/",{y:"p",t:"标签: Huginn",I:0},[]],["v-6d02fe66","/tag/%E5%AE%9D%E5%A1%94%E9%9D%A2%E6%9D%BF/",{y:"p",t:"标签: 宝塔面板",I:0},["/tag/宝塔面板/"]],["v-e45a3fd0","/tag/jekyll/",{y:"p",t:"标签: Jekyll",I:0},[]],["v-132a6ac4","/tag/github/",{y:"p",t:"标签: Github",I:0},[]],["v-e22b51b2","/tag/travis-ci/",{y:"p",t:"标签: Travis CI",I:0},[]],["v-6106c001","/tag/docker/",{y:"p",t:"标签: Docker",I:0},[]],["v-1f1d54f4","/tag/audition/",{y:"p",t:"标签: Audition",I:0},[]],["v-026ab35e","/tag/%E9%9F%B3%E9%A2%91/",{y:"p",t:"标签: 音频",I:0},["/tag/音频/"]],["v-45b16e58","/tag/aria2/",{y:"p",t:"标签: Aria2",I:0},[]],["v-aae951e6","/tag/%E8%BF%85%E9%9B%B7/",{y:"p",t:"标签: 迅雷",I:0},["/tag/迅雷/"]],["v-36dccd5d","/tag/airtable/",{y:"p",t:"标签: Airtable",I:0},[]],["v-02d57e1c","/tag/gp1700/",{y:"p",t:"标签: GP1700",I:0},[]],["v-36474c60","/tag/koolproxy/",{y:"p",t:"标签: koolproxy",I:0},[]],["v-289a8dd8","/tag/iptv/",{y:"p",t:"标签: IPTV",I:0},[]],["v-0cbf5886","/tag/%E8%AF%AD%E9%9F%B3%E8%BE%93%E5%85%A5/",{y:"p",t:"标签: 语音输入",I:0},["/tag/语音输入/"]],["v-6f001b53","/tag/openvpn/",{y:"p",t:"标签: OpenVPN",I:0},[]],["v-179b645c","/tag/%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F/",{y:"p",t:"标签: 内网穿透",I:0},["/tag/内网穿透/"]],["v-4d51b51e","/tag/rsshub/",{y:"p",t:"标签: RSSHub",I:0},[]],["v-66d9f917","/tag/scrcpy/",{y:"p",t:"标签: scrcpy",I:0},[]],["v-d82d3ed4","/tag/%E6%8A%95%E5%B1%8F/",{y:"p",t:"标签: 投屏",I:0},["/tag/投屏/"]],["v-295c722c","/tag/wifi/",{y:"p",t:"标签: WIFI",I:0},[]],["v-9a6de7e0","/tag/%E4%B8%BB%E6%9D%BF/",{y:"p",t:"标签: 主板",I:0},["/tag/主板/"]],["v-70a94678","/tag/%E5%B0%8F%E7%8B%BC%E6%AF%AB/",{y:"p",t:"标签: 小狼毫",I:0},["/tag/小狼毫/"]],["v-79bd8a59","/tag/%E8%BE%93%E5%85%A5%E6%B3%95/",{y:"p",t:"标签: 输入法",I:0},["/tag/输入法/"]],["v-ecace9be","/tag/keepass/",{y:"p",t:"标签: KeePass",I:0},[]],["v-2e8a96b8","/tag/wordpress/",{y:"p",t:"标签: WordPress",I:0},[]],["v-c58e8f3e","/tag/%E5%8E%9F%E5%88%99/",{y:"p",t:"标签: 原则",I:0},["/tag/原则/"]],["v-8ba0d006","/tag/%E6%89%B9%E8%AF%84%E4%B8%8E%E8%87%AA%E6%88%91%E6%89%B9%E8%AF%84/",{y:"p",t:"标签: 批评与自我批评",I:0},["/tag/批评与自我批评/"]],["v-b30ab346","/tag/nas/",{y:"p",t:"标签: nas",I:0},[]],["v-a76657ce","/tag/%E5%BE%AE%E4%BF%A1%E7%BA%A2%E5%8C%85/",{y:"p",t:"标签: 微信红包",I:0},["/tag/微信红包/"]],["v-0f92890a","/tag/microsoft-store/",{y:"p",t:"标签: Microsoft store",I:0},[]],["v-44794367","/tag/winget/",{y:"p",t:"标签: winget",I:0},[]],["v-207bdcdd","/tag/winstall/",{y:"p",t:"标签: winstall",I:0},[]],["v-9075524a","/tag/%E6%B5%8F%E8%A7%88%E5%99%A8%E6%8F%92%E4%BB%B6/",{y:"p",t:"标签: 浏览器插件",I:0},["/tag/浏览器插件/"]],["v-c9e9368a","/tag/ui.vision/",{y:"p",t:"标签: UI.Vision",I:0},[]],["v-b306a40c","/tag/rpa/",{y:"p",t:"标签: RPA",I:0},[]],["v-2836033f","/tag/blog/",{y:"p",t:"标签: blog",I:0},[]],["v-ed16b278","/tag/vuepress/",{y:"p",t:"标签: VuePress",I:0},[]],["v-6b6b05fc","/tag/%E5%BD%95%E5%B1%8F/",{y:"p",t:"标签: 录屏",I:0},["/tag/录屏/"]],["v-f091ce2a","/tag/%E7%99%BD%E6%9D%BF/",{y:"p",t:"标签: 白板",I:0},["/tag/白板/"]],["v-b3108574","/tag/gtd/",{y:"p",t:"标签: GTD",I:0},[]],["v-91d85d3a","/tag/%E8%99%9A%E6%8B%9F%E5%AE%9A%E4%BD%8D/",{y:"p",t:"标签: 虚拟定位",I:0},["/tag/虚拟定位/"]],["v-0da0abf9","/tag/ai/",{y:"p",t:"标签: AI",I:0},[]],["v-294e906f","/tag/vits/",{y:"p",t:"标签: VITS",I:0},[]],["v-311b2668","/tag/%E5%A3%B0%E9%9F%B3%E5%85%8B%E9%9A%86/",{y:"p",t:"标签: 声音克隆",I:0},["/tag/声音克隆/"]],["v-33129548","/tag/games/",{y:"p",t:"标签: games",I:0},[]],["v-2870f5b5","/tag/free/",{y:"p",t:"标签: Free",I:0},[]],["v-4b93f328","/tag/%E5%9F%9F%E5%90%8D/",{y:"p",t:"标签: 域名",I:0},["/tag/域名/"]],["v-2d605e49","/tag/%E7%99%BD%E5%AB%96/",{y:"p",t:"标签: 白嫖",I:0},["/tag/白嫖/"]],["v-5b9877a1","/tag/%E7%94%BB%E7%94%BB/",{y:"p",t:"标签: 画画",I:0},["/tag/画画/"]],["v-df045e5a","/tag/stablediffusion/",{y:"p",t:"标签: stableDiffusion",I:0},[]],["v-05db77bd","/tag/%E7%99%BE%E5%AE%9D%E7%AE%B1/",{y:"p",t:"标签: 百宝箱",I:0},["/tag/百宝箱/"]],["v-3514c09e","/tag/%E5%90%88%E9%9B%86/",{y:"p",t:"标签: 合集",I:0},["/tag/合集/"]],["v-fa46c5c6","/tag/%E5%A4%96%E7%AB%99%E8%B5%84%E6%BA%90/",{y:"p",t:"标签: 外站资源",I:0},["/tag/外站资源/"]],["v-293a5861","/tag/%E7%9B%B4%E6%92%AD/",{y:"p",t:"标签: 直播",I:0},["/tag/直播/"]],["v-b309c306","/tag/obs/",{y:"p",t:"标签: OBS",I:0},[]]];var Zl=B({name:"Vuepress",setup(){const e=i1();return()=>l(e.value)}}),R3=()=>L3.reduce((e,[t,n,o,r])=>(e.push({name:t,path:n,component:Zl,meta:o},{path:n.endsWith("/")?n+"index.html":n.substring(0,n.length-5),redirect:n},...r.map(i=>({path:i===":md"?n.substring(0,n.length-5)+".md":i,redirect:n}))),e),[{name:"404",path:"/:catchAll(.*)",component:Zl}]),S3=k1,x3=()=>{const e=p2({history:S3(Fi("/")),routes:R3(),scrollBehavior:(t,n,o)=>o||(t.hash?{el:t.hash}:{top:0})});return e.beforeResolve(async(t,n)=>{var o;(t.path!==n.path||n===Ot)&&([t.meta._data]=await Promise.all([Pt.resolvePageData(t.name),(o=rc[t.name])==null?void 0:o.__asyncLoader()]))}),e},D3=e=>{e.component("ClientOnly",hr),e.component("Content",dc)},C3=(e,t,n)=>{const o=Ll(()=>t.currentRoute.value.path),r=Ll(()=>Pt.resolveRouteLocale(wn.value.locales,o.value)),i=qi(o,()=>t.currentRoute.value.meta._data),a=T(()=>Pt.resolveLayouts(n)),s=T(()=>Pt.resolveSiteLocaleData(wn.value,r.value)),c=T(()=>Pt.resolvePageFrontmatter(i.value)),u=T(()=>Pt.resolvePageHeadTitle(i.value,s.value)),p=T(()=>Pt.resolvePageHead(u.value,c.value,s.value)),f=T(()=>Pt.resolvePageLang(i.value,s.value)),v=T(()=>Pt.resolvePageLayout(i.value,a.value));return e.provide(t1,a),e.provide(ic,i),e.provide(ac,c),e.provide(r1,u),e.provide(lc,p),e.provide(sc,f),e.provide(cc,v),e.provide(Hi,r),e.provide(pc,s),Object.defineProperties(e.config.globalProperties,{$frontmatter:{get:()=>c.value},$head:{get:()=>p.value},$headTitle:{get:()=>u.value},$lang:{get:()=>f.value},$page:{get:()=>i.value},$routeLocale:{get:()=>r.value},$site:{get:()=>wn.value},$siteLocale:{get:()=>s.value},$withBase:{get:()=>Ie}}),{layouts:a,pageData:i,pageFrontmatter:c,pageHead:p,pageHeadTitle:u,pageLang:f,pageLayout:v,routeLocale:r,siteData:wn,siteLocaleData:s}},V3=()=>{const e=o1(),t=vr(),n=K([]),o=()=>{e.value.forEach(i=>{const a=M3(i);a&&n.value.push(a)})},r=()=>{document.documentElement.lang=t.value,n.value.forEach(i=>{i.parentNode===document.head&&document.head.removeChild(i)}),n.value.splice(0,n.value.length),e.value.forEach(i=>{const a=B3(i);a!==null&&(document.head.appendChild(a),n.value.push(a))})};ot(l1,r),ge(()=>{o(),r(),ae(()=>e.value,r)})},M3=([e,t,n=""])=>{const o=Object.entries(t).map(([s,c])=>ie(c)?`[${s}=${JSON.stringify(c)}]`:c===!0?`[${s}]`:"").join(""),r=`head > ${e}${o}`;return Array.from(document.querySelectorAll(r)).find(s=>s.innerText===n)||null},B3=([e,t,n])=>{if(!ie(e))return null;const o=document.createElement(e);return zi(t)&&Object.entries(t).forEach(([r,i])=>{ie(i)?o.setAttribute(r,i):i===!0&&o.setAttribute(r,"")}),ie(n)&&o.appendChild(document.createTextNode(n)),o},$3=Wd,N3=async()=>{var n;const e=$3({name:"VuepressApp",setup(){var o;V3();for(const r of Uo)(o=r.setup)==null||o.call(r);return()=>[l(Ac),...Uo.flatMap(({rootComponents:r=[]})=>r.map(i=>l(i)))]}}),t=x3();D3(e),C3(e,t,Uo);for(const o of Uo)await((n=o.enhance)==null?void 0:n.call(o,{app:e,router:t,siteData:wn}));return e.use(t),{app:e,router:t}};N3().then(({app:e,router:t})=>{t.isReady().then(()=>{e.mount("#app")})});export{ke as $,l3 as A,s3 as B,$e as C,ge as D,fn as E,ie as F,Q3 as G,zi as H,ma as I,B2 as J,Ci as K,qe as L,H3 as M,bi as N,h3 as O,de as P,Z3 as Q,f3 as R,Zp as S,dt as T,yi as U,Fc as V,bo as W,Vt as X,F3 as Y,K3 as Z,sl as _,Ws as a,G3 as a0,lf as a1,ot as a2,Xt as a3,X3 as a4,d as a5,J3 as a6,Us as b,j3 as c,N3 as createVueApp,Le as d,W3 as e,U3 as f,B as g,Fe as h,At as i,ga as j,Wn as k,K as l,T as m,Re as n,qp as o,ae as p,l as q,Je as r,c3 as s,z3 as t,Y3 as u,p3 as v,pp as w,Ve as x,s0 as y,u3 as z}; diff --git a/assets/birthing.html-48fe6989.js b/assets/birthing.html-2912af7e.js similarity index 97% rename from assets/birthing.html-48fe6989.js rename to assets/birthing.html-2912af7e.js index 19b7ee4f..6c2a0906 100644 --- a/assets/birthing.html-48fe6989.js +++ b/assets/birthing.html-2912af7e.js @@ -1 +1 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as r,e as h}from"./app-98132e77.js";const t={},d=h('

        不要囤货

        不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。

        LDR 的选择

        LDR 是结合待产、分娩、恢复及产后的一体化单人房间。虽然我因为剖腹产不能陪同分娩,但这几天内,我和产妇都得到了很好的休息。医生和护士的日常巡查较为频繁,也使我们感到十分安心。

        陪护的重要性

        对于初为人父母的家长,建议雇佣一名陪护阿姨。若没有阿姨协助,你将需要自己记录宝宝的进食和排泄,并在夜间照看宝宝。这对于新手父母是个大挑战。我对于新生儿甚至有些胆怯,不敢随意抱起。在医院陪护期间,我感觉自己更像是个付款机器,无法真正帮到忙。

        送花:一个小小的惊喜

        若产妇即将分娩,那么送上一束鲜花可能会为她带来无比的惊喜和欢乐。尽管我老婆知道这并非我的想法,但她收到花时还是感到非常开心,特别是得知她是医院中唯一一个收到花的产妇。

        ',8),i=[d];function n(c,o){return a(),r("div",null,i)}const l=e(t,[["render",n],["__file","birthing.html.vue"]]);export{l as default}; +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as r,e as h}from"./app-91ee3df5.js";const t={},d=h('

        不要囤货

        不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。

        LDR 的选择

        LDR 是结合待产、分娩、恢复及产后的一体化单人房间。虽然我因为剖腹产不能陪同分娩,但这几天内,我和产妇都得到了很好的休息。医生和护士的日常巡查较为频繁,也使我们感到十分安心。

        陪护的重要性

        对于初为人父母的家长,建议雇佣一名陪护阿姨。若没有阿姨协助,你将需要自己记录宝宝的进食和排泄,并在夜间照看宝宝。这对于新手父母是个大挑战。我对于新生儿甚至有些胆怯,不敢随意抱起。在医院陪护期间,我感觉自己更像是个付款机器,无法真正帮到忙。

        送花:一个小小的惊喜

        若产妇即将分娩,那么送上一束鲜花可能会为她带来无比的惊喜和欢乐。尽管我老婆知道这并非我的想法,但她收到花时还是感到非常开心,特别是得知她是医院中唯一一个收到花的产妇。

        ',8),i=[d];function n(c,o){return a(),r("div",null,i)}const l=e(t,[["render",n],["__file","birthing.html.vue"]]);export{l as default}; diff --git a/assets/blog.html-4ba14ed1.js b/assets/blog.html-b3d2ff71.js similarity index 71% rename from assets/blog.html-4ba14ed1.js rename to assets/blog.html-b3d2ff71.js index fb60557c..5affc7aa 100644 --- a/assets/blog.html-4ba14ed1.js +++ b/assets/blog.html-b3d2ff71.js @@ -1 +1 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o,c as t}from"./app-98132e77.js";const c={};function r(_,n){return o(),t("div")}const a=e(c,[["render",r],["__file","blog.html.vue"]]);export{a as default}; +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o,c as t}from"./app-91ee3df5.js";const c={};function r(_,n){return o(),t("div")}const a=e(c,[["render",r],["__file","blog.html.vue"]]);export{a as default}; diff --git a/assets/cd.html-91e05cda.js b/assets/cd.html-cf8f7772.js similarity index 98% rename from assets/cd.html-91e05cda.js rename to assets/cd.html-cf8f7772.js index 40fec512..b05acaff 100644 --- a/assets/cd.html-91e05cda.js +++ b/assets/cd.html-cf8f7772.js @@ -1 +1 @@ -import{_ as c}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as n,c as s,a as t,b as d,d as o,e as a}from"./app-98132e77.js";const l={},i=a("

        以下是一些常用 Linux 命令的具体用法示例:

        命令描述用法示例
        ls列出目录内容lsls -lls -a
        cd切换目录cd /path/to/directorycd ..
        pwd显示当前工作目录pwd
        mkdir创建新目录mkdir new_directory
        rm删除文件或目录rm file.txtrm -r directory
        cp复制文件和目录cp file.txt newfile.txtcp -r directory newdirectory
        mv移动文件和目录mv file.txt new_directorymv directory new_directory_name
        cat查看文件内容cat file.txt
        less分页查看文件内容less file.txt
        head显示文件开头几行head -n 10 file.txt
        tail显示文件末尾几行tail -n 5 file.txt
        grep在文件中搜索指定模式grep "pattern" file.txt
        find在文件系统中搜索文件和目录find /path/to/search -name "*.txt"
        chmod修改文件或目录的权限chmod 755 file.txt
        chown修改文件或目录的所有者chown user:group file.txt
        chgrp修改文件或目录的所属组chgrp group file.txt
        tar打包和解压文件tar -cvf archive.tar file1 file2tar -xvf archive.tar
        gzip压缩文件gzip file.txt
        gunzip解压缩文件gunzip file.txt.gz
        wget下载文件wget http://example.com/file.txt
        curl发送 HTTP 请求并显示响应curl http://example.com
        ssh安全登录远程主机ssh username@hostname
        scp在本地主机和远程主机之间复制文件scp file.txt username@hostname:/path/to/destination
        ping测试与主机的连通性ping example.com
        ifconfig显示和配置网络接口ifconfig
        netstat显示网络连接和统计信息netstat -tuln
        route显示和配置网络路由route -n
        iptables配置防火墙规则iptables -A INPUT -p tcp --dport 80 -j ACCEPT
        ps显示进程状态ps aux
        top实时显示系统资源使用情况top
        kill终止进程kill PID
        cron定时执行任务crontab -e
        useradd创建新用户useradd username
        usermod修改用户属性usermod -aG group username
        userdel删除用户userdel username
        passwd修改用户密码passwd username
        su切换用户身份su username
        sudo以超级用户权限执行命令sudo command
        apt-getDebian/Ubuntu 系统的软件包管理工具apt-get install package
        yumCentOS/RHEL 系统的软件包管理工具yum install package
        systemctl管理系统服务systemctl start servicesystemctl stop service
        journalctl查看系统日志journalctl -u service
        df显示磁盘空间使用情况df -h
        du估算文件和目录的磁盘使用情况du -sh directory
        free显示系统内存使用情况free -h
        uname显示系统信息uname -a
        date显示或设置系统时间date
        shutdown关闭系统shutdown now
        reboot重启系统reboot
        man查看命令的帮助文档man command
        info查看命令的信息文档info command
        history查看命令历史记录history
        alias创建命令别名alias ll='ls -l'
        echo打印文本或变量到标准输出echo "Hello, World!"
        export设置环境变量export VARIABLE=value
        source执行脚本或命令文件source script.sh
        chmod修改文件或目录的权限chmod 755 file.txt
        chown修改文件或目录的所有者chown user:group file.txt
        chgrp修改文件或目录的所属组chgrp group file.txt
        ln创建链接文件ln -s target link
        dd复制和转换文件dd if=inputfile of=outputfile
        sed流编辑器,用于处理和转换文本sed 's/pattern/replacement/g' file.txt
        awk文本处理和分析工具awk '{print $1}' file.txt
        cut从文件中提取指定字段cut -d"," -f2 file.csv
        sort对文件进行排序sort file.txt
        uniq去除文件中的重复行uniq file.txt
        wc统计文件中的行数、字数和字节数wc -l file.txt
        diff比较文件的差异diff file1.txt file2.txt
        patch应用补丁文件patch -p1 < patchfile.patch
        scp在本地主机和远程主机之间复制文件scp file.txt username@hostname:/path/to/destination
        ssh安全登录远程主机ssh username@hostname
        rsync远程文件同步工具rsync -avz source/ destination/

        这些示例展示了各个命令的常见用法,您可以根据需要进行调整和组合。请注意,某些命令可能需要特定的参数和选项才能实现特定的功能,请查阅相应命令的文档以获取更详细的信息。

        以下是一些常见 Linux 发行版的官方文档链接:

        ",4),p={href:"https://help.ubuntu.com/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://www.debian.org/doc/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://docs.centos.org/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://docs.fedoraproject.org/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://wiki.archlinux.org/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://doc.opensuse.org/",target:"_blank",rel:"noopener noreferrer"};function g(_,w){const e=r("ExternalLinkIcon");return n(),s("div",null,[i,t("ul",null,[t("li",null,[d("Ubuntu:"),t("a",p,[d("https://help.ubuntu.com/"),o(e)])]),t("li",null,[d("Debian:"),t("a",u,[d("https://www.debian.org/doc/"),o(e)])]),t("li",null,[d("CentOS:"),t("a",h,[d("https://docs.centos.org/"),o(e)])]),t("li",null,[d("Fedora:"),t("a",f,[d("https://docs.fedoraproject.org/"),o(e)])]),t("li",null,[d("Arch Linux:"),t("a",m,[d("https://wiki.archlinux.org/"),o(e)])]),t("li",null,[d("openSUSE:"),t("a",x,[d("https://doc.opensuse.org/"),o(e)])])])])}const y=c(l,[["render",g],["__file","cd.html.vue"]]);export{y as default}; +import{_ as c}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as n,c as s,a as t,b as d,d as o,e as a}from"./app-91ee3df5.js";const l={},i=a("

        以下是一些常用 Linux 命令的具体用法示例:

        命令描述用法示例
        ls列出目录内容lsls -lls -a
        cd切换目录cd /path/to/directorycd ..
        pwd显示当前工作目录pwd
        mkdir创建新目录mkdir new_directory
        rm删除文件或目录rm file.txtrm -r directory
        cp复制文件和目录cp file.txt newfile.txtcp -r directory newdirectory
        mv移动文件和目录mv file.txt new_directorymv directory new_directory_name
        cat查看文件内容cat file.txt
        less分页查看文件内容less file.txt
        head显示文件开头几行head -n 10 file.txt
        tail显示文件末尾几行tail -n 5 file.txt
        grep在文件中搜索指定模式grep "pattern" file.txt
        find在文件系统中搜索文件和目录find /path/to/search -name "*.txt"
        chmod修改文件或目录的权限chmod 755 file.txt
        chown修改文件或目录的所有者chown user:group file.txt
        chgrp修改文件或目录的所属组chgrp group file.txt
        tar打包和解压文件tar -cvf archive.tar file1 file2tar -xvf archive.tar
        gzip压缩文件gzip file.txt
        gunzip解压缩文件gunzip file.txt.gz
        wget下载文件wget http://example.com/file.txt
        curl发送 HTTP 请求并显示响应curl http://example.com
        ssh安全登录远程主机ssh username@hostname
        scp在本地主机和远程主机之间复制文件scp file.txt username@hostname:/path/to/destination
        ping测试与主机的连通性ping example.com
        ifconfig显示和配置网络接口ifconfig
        netstat显示网络连接和统计信息netstat -tuln
        route显示和配置网络路由route -n
        iptables配置防火墙规则iptables -A INPUT -p tcp --dport 80 -j ACCEPT
        ps显示进程状态ps aux
        top实时显示系统资源使用情况top
        kill终止进程kill PID
        cron定时执行任务crontab -e
        useradd创建新用户useradd username
        usermod修改用户属性usermod -aG group username
        userdel删除用户userdel username
        passwd修改用户密码passwd username
        su切换用户身份su username
        sudo以超级用户权限执行命令sudo command
        apt-getDebian/Ubuntu 系统的软件包管理工具apt-get install package
        yumCentOS/RHEL 系统的软件包管理工具yum install package
        systemctl管理系统服务systemctl start servicesystemctl stop service
        journalctl查看系统日志journalctl -u service
        df显示磁盘空间使用情况df -h
        du估算文件和目录的磁盘使用情况du -sh directory
        free显示系统内存使用情况free -h
        uname显示系统信息uname -a
        date显示或设置系统时间date
        shutdown关闭系统shutdown now
        reboot重启系统reboot
        man查看命令的帮助文档man command
        info查看命令的信息文档info command
        history查看命令历史记录history
        alias创建命令别名alias ll='ls -l'
        echo打印文本或变量到标准输出echo "Hello, World!"
        export设置环境变量export VARIABLE=value
        source执行脚本或命令文件source script.sh
        chmod修改文件或目录的权限chmod 755 file.txt
        chown修改文件或目录的所有者chown user:group file.txt
        chgrp修改文件或目录的所属组chgrp group file.txt
        ln创建链接文件ln -s target link
        dd复制和转换文件dd if=inputfile of=outputfile
        sed流编辑器,用于处理和转换文本sed 's/pattern/replacement/g' file.txt
        awk文本处理和分析工具awk '{print $1}' file.txt
        cut从文件中提取指定字段cut -d"," -f2 file.csv
        sort对文件进行排序sort file.txt
        uniq去除文件中的重复行uniq file.txt
        wc统计文件中的行数、字数和字节数wc -l file.txt
        diff比较文件的差异diff file1.txt file2.txt
        patch应用补丁文件patch -p1 < patchfile.patch
        scp在本地主机和远程主机之间复制文件scp file.txt username@hostname:/path/to/destination
        ssh安全登录远程主机ssh username@hostname
        rsync远程文件同步工具rsync -avz source/ destination/

        这些示例展示了各个命令的常见用法,您可以根据需要进行调整和组合。请注意,某些命令可能需要特定的参数和选项才能实现特定的功能,请查阅相应命令的文档以获取更详细的信息。

        以下是一些常见 Linux 发行版的官方文档链接:

        ",4),p={href:"https://help.ubuntu.com/",target:"_blank",rel:"noopener noreferrer"},u={href:"https://www.debian.org/doc/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://docs.centos.org/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://docs.fedoraproject.org/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://wiki.archlinux.org/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://doc.opensuse.org/",target:"_blank",rel:"noopener noreferrer"};function g(_,w){const e=r("ExternalLinkIcon");return n(),s("div",null,[i,t("ul",null,[t("li",null,[d("Ubuntu:"),t("a",p,[d("https://help.ubuntu.com/"),o(e)])]),t("li",null,[d("Debian:"),t("a",u,[d("https://www.debian.org/doc/"),o(e)])]),t("li",null,[d("CentOS:"),t("a",h,[d("https://docs.centos.org/"),o(e)])]),t("li",null,[d("Fedora:"),t("a",f,[d("https://docs.fedoraproject.org/"),o(e)])]),t("li",null,[d("Arch Linux:"),t("a",m,[d("https://wiki.archlinux.org/"),o(e)])]),t("li",null,[d("openSUSE:"),t("a",x,[d("https://doc.opensuse.org/"),o(e)])])])])}const y=c(l,[["render",g],["__file","cd.html.vue"]]);export{y as default}; diff --git a/assets/component-caddc584.js b/assets/component-0a831d23.js similarity index 99% rename from assets/component-caddc584.js rename to assets/component-0a831d23.js index 52aa842b..264c37fd 100644 --- a/assets/component-caddc584.js +++ b/assets/component-0a831d23.js @@ -1,4 +1,4 @@ -var an=Object.defineProperty;var rn=(l,t,n)=>t in l?an(l,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):l[t]=n;var wt=(l,t,n)=>(rn(l,typeof t!="symbol"?t+"":t,n),n);import{a as _,g as Ne,l as U,D as et,p as ve,K as sn,o as m,c as w,L as te,M as se,N as yt,P as ut,Q as on,m as Y,r as cn,f as j,S as ke,T,t as M,U as J,d as ee,q as N,V as Le,E as pt,W as un,Y as Ze,Z as pn,_ as hn,$ as dn,a0 as bt,b as Ce,a1 as gn,a2 as fn,a3 as mn,a4 as vn,J as kn}from"./app-98132e77.js";var Be=new Map;function wn(l){var t=Be.get(l);t&&t.destroy()}function yn(l){var t=Be.get(l);t&&t.update()}var De=null;typeof window>"u"?((De=function(l){return l}).destroy=function(l){return l},De.update=function(l){return l}):((De=function(l,t){return l&&Array.prototype.forEach.call(l.length?l:[l],function(n){return function(e){if(e&&e.nodeName&&e.nodeName==="TEXTAREA"&&!Be.has(e)){var i,a=null,r=window.getComputedStyle(e),s=(i=e.value,function(){d({testForHeightReduction:i===""||!e.value.startsWith(i),restoreTextAlign:null}),i=e.value}),u=(function(p){e.removeEventListener("autosize:destroy",u),e.removeEventListener("autosize:update",c),e.removeEventListener("input",s),window.removeEventListener("resize",c),Object.keys(p).forEach(function(g){return e.style[g]=p[g]}),Be.delete(e)}).bind(e,{height:e.style.height,resize:e.style.resize,textAlign:e.style.textAlign,overflowY:e.style.overflowY,overflowX:e.style.overflowX,wordWrap:e.style.wordWrap});e.addEventListener("autosize:destroy",u),e.addEventListener("autosize:update",c),e.addEventListener("input",s),window.addEventListener("resize",c),e.style.overflowX="hidden",e.style.wordWrap="break-word",Be.set(e,{destroy:u,update:c}),c()}function d(p){var g,h,E=p.restoreTextAlign,o=E===void 0?null:E,f=p.testForHeightReduction,R=f===void 0||f,z=r.overflowY;if(e.scrollHeight!==0&&(r.resize==="vertical"?e.style.resize="none":r.resize==="both"&&(e.style.resize="horizontal"),R&&(g=function($){for(var V=[];$&&$.parentNode&&$.parentNode instanceof Element;)$.parentNode.scrollTop&&V.push([$.parentNode,$.parentNode.scrollTop]),$=$.parentNode;return function(){return V.forEach(function(O){var P=O[0],ie=O[1];P.style.scrollBehavior="auto",P.scrollTop=ie,P.style.scrollBehavior=null})}}(e),e.style.height=""),h=r.boxSizing==="content-box"?e.scrollHeight-(parseFloat(r.paddingTop)+parseFloat(r.paddingBottom)):e.scrollHeight+parseFloat(r.borderTopWidth)+parseFloat(r.borderBottomWidth),r.maxHeight!=="none"&&h>parseFloat(r.maxHeight)?(r.overflowY==="hidden"&&(e.style.overflow="scroll"),h=parseFloat(r.maxHeight)):r.overflowY!=="hidden"&&(e.style.overflow="hidden"),e.style.height=h+"px",o&&(e.style.textAlign=o),g&&g(),a!==h&&(e.dispatchEvent(new Event("autosize:resized",{bubbles:!0})),a=h),z!==r.overflow&&!o)){var I=r.textAlign;r.overflow==="hidden"&&(e.style.textAlign=I==="start"?"end":"start"),d({restoreTextAlign:I,testForHeightReduction:!0})}}function c(){d({testForHeightReduction:!0,restoreTextAlign:null})}}(n)}),l}).destroy=function(l){return l&&Array.prototype.forEach.call(l.length?l:[l],wn),l},De.update=function(l){return l&&Array.prototype.forEach.call(l.length?l:[l],yn),l});var xt=De;function Vt(){return{async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,hooks:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}let _e=Vt();function bn(l){_e=l}const Ft=/[&<>"']/,xn=new RegExp(Ft.source,"g"),Wt=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,$n=new RegExp(Wt.source,"g"),Cn={"&":"&","<":"<",">":">",'"':""","'":"'"},$t=l=>Cn[l];function X(l,t){if(t){if(Ft.test(l))return l.replace(xn,$t)}else if(Wt.test(l))return l.replace($n,$t);return l}const _n=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function Zt(l){return l.replace(_n,(t,n)=>(n=n.toLowerCase(),n==="colon"?":":n.charAt(0)==="#"?n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1)):""))}const zn=/(^|[^\[])\^/g;function W(l,t){l=typeof l=="string"?l:l.source,t=t||"";const n={replace:(e,i)=>(i=i.source||i,i=i.replace(zn,"$1"),l=l.replace(e,i),n),getRegex:()=>new RegExp(l,t)};return n}const Rn=/[^\w:]/g,Sn=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function Ct(l,t,n){if(l){let e;try{e=decodeURIComponent(Zt(n)).replace(Rn,"").toLowerCase()}catch{return null}if(e.indexOf("javascript:")===0||e.indexOf("vbscript:")===0||e.indexOf("data:")===0)return null}t&&!Sn.test(n)&&(n=An(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch{return null}return n}const qe={},Ln=/^[^:]+:\/*[^/]*$/,In=/^([^:]+:)[\s\S]*$/,En=/^([^:]+:\/*[^/]*)[\s\S]*$/;function An(l,t){qe[" "+l]||(Ln.test(l)?qe[" "+l]=l+"/":qe[" "+l]=Ge(l,"/",!0)),l=qe[" "+l];const n=l.indexOf(":")===-1;return t.substring(0,2)==="//"?n?t:l.replace(In,"$1")+t:t.charAt(0)==="/"?n?t:l.replace(En,"$1")+t:l+t}const Ye={exec:function(){}};function _t(l,t){const n=l.replace(/\|/g,(a,r,s)=>{let u=!1,d=r;for(;--d>=0&&s[d]==="\\";)u=!u;return u?"|":" |"}),e=n.split(/ \|/);let i=0;if(e[0].trim()||e.shift(),e.length>0&&!e[e.length-1].trim()&&e.pop(),e.length>t)e.splice(t);else for(;e.length1;)t&1&&(n+=l),t>>=1,l+=l;return n+l}function Rt(l,t,n,e){const i=t.href,a=t.title?X(t.title):null,r=l[1].replace(/\\([\[\]])/g,"$1");if(l[0].charAt(0)!=="!"){e.state.inLink=!0;const s={type:"link",raw:n,href:i,title:a,text:r,tokens:e.inlineTokens(r)};return e.state.inLink=!1,s}return{type:"image",raw:n,href:i,title:a,text:X(r)}}function Un(l,t){const n=l.match(/^(\s+)(?:```)/);if(n===null)return t;const e=n[1];return t.split(` +var an=Object.defineProperty;var rn=(l,t,n)=>t in l?an(l,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):l[t]=n;var wt=(l,t,n)=>(rn(l,typeof t!="symbol"?t+"":t,n),n);import{a as _,g as Ne,l as U,D as et,p as ve,K as sn,o as m,c as w,L as te,M as se,N as yt,P as ut,Q as on,m as Y,r as cn,f as j,S as ke,T,t as M,U as J,d as ee,q as N,V as Le,E as pt,W as un,Y as Ze,Z as pn,_ as hn,$ as dn,a0 as bt,b as Ce,a1 as gn,a2 as fn,a3 as mn,a4 as vn,J as kn}from"./app-91ee3df5.js";var Be=new Map;function wn(l){var t=Be.get(l);t&&t.destroy()}function yn(l){var t=Be.get(l);t&&t.update()}var De=null;typeof window>"u"?((De=function(l){return l}).destroy=function(l){return l},De.update=function(l){return l}):((De=function(l,t){return l&&Array.prototype.forEach.call(l.length?l:[l],function(n){return function(e){if(e&&e.nodeName&&e.nodeName==="TEXTAREA"&&!Be.has(e)){var i,a=null,r=window.getComputedStyle(e),s=(i=e.value,function(){d({testForHeightReduction:i===""||!e.value.startsWith(i),restoreTextAlign:null}),i=e.value}),u=(function(p){e.removeEventListener("autosize:destroy",u),e.removeEventListener("autosize:update",c),e.removeEventListener("input",s),window.removeEventListener("resize",c),Object.keys(p).forEach(function(g){return e.style[g]=p[g]}),Be.delete(e)}).bind(e,{height:e.style.height,resize:e.style.resize,textAlign:e.style.textAlign,overflowY:e.style.overflowY,overflowX:e.style.overflowX,wordWrap:e.style.wordWrap});e.addEventListener("autosize:destroy",u),e.addEventListener("autosize:update",c),e.addEventListener("input",s),window.addEventListener("resize",c),e.style.overflowX="hidden",e.style.wordWrap="break-word",Be.set(e,{destroy:u,update:c}),c()}function d(p){var g,h,E=p.restoreTextAlign,o=E===void 0?null:E,f=p.testForHeightReduction,R=f===void 0||f,z=r.overflowY;if(e.scrollHeight!==0&&(r.resize==="vertical"?e.style.resize="none":r.resize==="both"&&(e.style.resize="horizontal"),R&&(g=function($){for(var V=[];$&&$.parentNode&&$.parentNode instanceof Element;)$.parentNode.scrollTop&&V.push([$.parentNode,$.parentNode.scrollTop]),$=$.parentNode;return function(){return V.forEach(function(O){var P=O[0],ie=O[1];P.style.scrollBehavior="auto",P.scrollTop=ie,P.style.scrollBehavior=null})}}(e),e.style.height=""),h=r.boxSizing==="content-box"?e.scrollHeight-(parseFloat(r.paddingTop)+parseFloat(r.paddingBottom)):e.scrollHeight+parseFloat(r.borderTopWidth)+parseFloat(r.borderBottomWidth),r.maxHeight!=="none"&&h>parseFloat(r.maxHeight)?(r.overflowY==="hidden"&&(e.style.overflow="scroll"),h=parseFloat(r.maxHeight)):r.overflowY!=="hidden"&&(e.style.overflow="hidden"),e.style.height=h+"px",o&&(e.style.textAlign=o),g&&g(),a!==h&&(e.dispatchEvent(new Event("autosize:resized",{bubbles:!0})),a=h),z!==r.overflow&&!o)){var I=r.textAlign;r.overflow==="hidden"&&(e.style.textAlign=I==="start"?"end":"start"),d({restoreTextAlign:I,testForHeightReduction:!0})}}function c(){d({testForHeightReduction:!0,restoreTextAlign:null})}}(n)}),l}).destroy=function(l){return l&&Array.prototype.forEach.call(l.length?l:[l],wn),l},De.update=function(l){return l&&Array.prototype.forEach.call(l.length?l:[l],yn),l});var xt=De;function Vt(){return{async:!1,baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:"",highlight:null,hooks:null,langPrefix:"language-",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}let _e=Vt();function bn(l){_e=l}const Ft=/[&<>"']/,xn=new RegExp(Ft.source,"g"),Wt=/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,$n=new RegExp(Wt.source,"g"),Cn={"&":"&","<":"<",">":">",'"':""","'":"'"},$t=l=>Cn[l];function X(l,t){if(t){if(Ft.test(l))return l.replace(xn,$t)}else if(Wt.test(l))return l.replace($n,$t);return l}const _n=/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;function Zt(l){return l.replace(_n,(t,n)=>(n=n.toLowerCase(),n==="colon"?":":n.charAt(0)==="#"?n.charAt(1)==="x"?String.fromCharCode(parseInt(n.substring(2),16)):String.fromCharCode(+n.substring(1)):""))}const zn=/(^|[^\[])\^/g;function W(l,t){l=typeof l=="string"?l:l.source,t=t||"";const n={replace:(e,i)=>(i=i.source||i,i=i.replace(zn,"$1"),l=l.replace(e,i),n),getRegex:()=>new RegExp(l,t)};return n}const Rn=/[^\w:]/g,Sn=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function Ct(l,t,n){if(l){let e;try{e=decodeURIComponent(Zt(n)).replace(Rn,"").toLowerCase()}catch{return null}if(e.indexOf("javascript:")===0||e.indexOf("vbscript:")===0||e.indexOf("data:")===0)return null}t&&!Sn.test(n)&&(n=An(t,n));try{n=encodeURI(n).replace(/%25/g,"%")}catch{return null}return n}const qe={},Ln=/^[^:]+:\/*[^/]*$/,In=/^([^:]+:)[\s\S]*$/,En=/^([^:]+:\/*[^/]*)[\s\S]*$/;function An(l,t){qe[" "+l]||(Ln.test(l)?qe[" "+l]=l+"/":qe[" "+l]=Ge(l,"/",!0)),l=qe[" "+l];const n=l.indexOf(":")===-1;return t.substring(0,2)==="//"?n?t:l.replace(In,"$1")+t:t.charAt(0)==="/"?n?t:l.replace(En,"$1")+t:l+t}const Ye={exec:function(){}};function _t(l,t){const n=l.replace(/\|/g,(a,r,s)=>{let u=!1,d=r;for(;--d>=0&&s[d]==="\\";)u=!u;return u?"|":" |"}),e=n.split(/ \|/);let i=0;if(e[0].trim()||e.shift(),e.length>0&&!e[e.length-1].trim()&&e.pop(),e.length>t)e.splice(t);else for(;e.length1;)t&1&&(n+=l),t>>=1,l+=l;return n+l}function Rt(l,t,n,e){const i=t.href,a=t.title?X(t.title):null,r=l[1].replace(/\\([\[\]])/g,"$1");if(l[0].charAt(0)!=="!"){e.state.inLink=!0;const s={type:"link",raw:n,href:i,title:a,text:r,tokens:e.inlineTokens(r)};return e.state.inLink=!1,s}return{type:"image",raw:n,href:i,title:a,text:X(r)}}function Un(l,t){const n=l.match(/^(\s+)(?:```)/);if(n===null)return t;const e=n[1];return t.split(` `).map(i=>{const a=i.match(/^\s+/);if(a===null)return i;const[r]=a;return r.length>=e.length?i.slice(e.length):i}).join(` `)}class ht{constructor(t){this.options=t||_e}space(t){const n=this.rules.block.newline.exec(t);if(n&&n[0].length>0)return{type:"space",raw:n[0]}}code(t){const n=this.rules.block.code.exec(t);if(n){const e=n[0].replace(/^ {1,4}/gm,"");return{type:"code",raw:n[0],codeBlockStyle:"indented",text:this.options.pedantic?e:Ge(e,` `)}}}fences(t){const n=this.rules.block.fences.exec(t);if(n){const e=n[0],i=Un(e,n[3]||"");return{type:"code",raw:e,lang:n[2]?n[2].trim().replace(this.rules.inline._escapes,"$1"):n[2],text:i}}}heading(t){const n=this.rules.block.heading.exec(t);if(n){let e=n[2].trim();if(/#$/.test(e)){const i=Ge(e,"#");(this.options.pedantic||!i||/ $/.test(i))&&(e=i.trim())}return{type:"heading",raw:n[0],depth:n[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(t){const n=this.rules.block.hr.exec(t);if(n)return{type:"hr",raw:n[0]}}blockquote(t){const n=this.rules.block.blockquote.exec(t);if(n){const e=n[0].replace(/^ *>[ \t]?/gm,""),i=this.lexer.state.top;this.lexer.state.top=!0;const a=this.lexer.blockTokens(e);return this.lexer.state.top=i,{type:"blockquote",raw:n[0],tokens:a,text:e}}}list(t){let n=this.rules.block.list.exec(t);if(n){let e,i,a,r,s,u,d,c,p,g,h,E,o=n[1].trim();const f=o.length>1,R={type:"list",raw:"",ordered:f,start:f?+o.slice(0,-1):"",loose:!1,items:[]};o=f?`\\d{1,9}\\${o.slice(-1)}`:`\\${o}`,this.options.pedantic&&(o=f?o:"[*+-]");const z=new RegExp(`^( {0,3}${o})((?:[ ][^\\n]*)?(?:\\n|$))`);for(;t&&(E=!1,!(!(n=z.exec(t))||this.rules.block.hr.test(t)));){if(e=n[0],t=t.substring(e.length),c=n[2].split(` diff --git a/assets/cors-anywhere.html-b200a776.js b/assets/cors-anywhere.html-38d0bf70.js similarity index 99% rename from assets/cors-anywhere.html-b200a776.js rename to assets/cors-anywhere.html-38d0bf70.js index 44cb9a5a..c37b9b73 100644 --- a/assets/cors-anywhere.html-b200a776.js +++ b/assets/cors-anywhere.html-38d0bf70.js @@ -1,4 +1,4 @@ -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o,c,a as s,b as n,d as e,e as i}from"./app-98132e77.js";const l={},r={href:"https://github.com/Rob--W/cors-anywhere",target:"_blank",rel:"noopener noreferrer"},u={href:"https://hub.docker.com/r/rockben/cors-anywhere",target:"_blank",rel:"noopener noreferrer"},d=i(`

        下面是一个 Docker 部署的示例配置:

        version: '3'
        +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as p,o,c,a as s,b as n,d as e,e as i}from"./app-91ee3df5.js";const l={},r={href:"https://github.com/Rob--W/cors-anywhere",target:"_blank",rel:"noopener noreferrer"},u={href:"https://hub.docker.com/r/rockben/cors-anywhere",target:"_blank",rel:"noopener noreferrer"},d=i(`

        下面是一个 Docker 部署的示例配置:

        version: '3'
         
         services:
           cors-anywhere:
        diff --git a/assets/design.html-bb53b2a3.js b/assets/design.html-fe567add.js
        similarity index 98%
        rename from assets/design.html-bb53b2a3.js
        rename to assets/design.html-fe567add.js
        index efb46449..d583f53a 100644
        --- a/assets/design.html-bb53b2a3.js
        +++ b/assets/design.html-fe567add.js
        @@ -1 +1 @@
        -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as l,c as i,a as e,b as a,d as n,e as s}from"./app-98132e77.js";const h={},c=e("h2",{id:"电子白板",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#电子白板","aria-hidden":"true"},"#"),a(" 电子白板")],-1),d=e("p",null,"在电子白板功能普及之前,我使用 Figma 对海报、图片素材进行简单剪辑,制作流程图。但是,电子白板的美观和自由度远远超过 Figma,我现在的流程图和示意图都是通过 Excalidraw 和 Canvas 完成的。",-1),_=e("h3",{id:"excalidraw",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#excalidraw","aria-hidden":"true"},"#"),a(" Excalidraw")],-1),f={href:"https://github.com/excalidraw/excalidraw",target:"_blank",rel:"noopener noreferrer"},p={href:"https://blog.csdn.net/qq_34802028/article/details/127927960",target:"_blank",rel:"noopener noreferrer"},g={href:"https://blog.csdn.net/qq_26176515/article/details/126005295",target:"_blank",rel:"noopener noreferrer"},u={href:"https://zhuanlan.zhihu.com/p/577420136",target:"_blank",rel:"noopener noreferrer"},b=s('
        手绘样例

        Canvas

        Canvas(画布)是所有 UI 组件的「容器」。一个场景中,可以允许多个 canvas 对象存在,也允许 canvas 之间进行「嵌套」使用。需要注意的是,场景中的任何一个 UI 对象,都必定是某个 canvas 对象的「子级」。我最常用的是 Obsidian 和秒笔的 Canvas 功能:

        • Obsidian Canvas:可以将图片、视频、文本、网页、文件和 Excalidraw 聚合在一起,并建立连接线和分组。

          等后续替代本图
          Obsidian canvas 样例
        • 秒笔白板:支持聚合图片、文本、表格、清单、看板和 Excalidraw,但根据作者回复,妙笔的连接线和分组功能会在 2023 的下半年才摆上开发计划。

        ',5),m={href:"https://chrome.google.com/webstore/detail/imageassistant-batch-imag/dbjbempljhcmhlfpfacalomonjpalpko",target:"_blank",rel:"noopener noreferrer"},w={href:"http://waifu2x.udp.jp/index.zh-CN.html",target:"_blank",rel:"noopener noreferrer"},x={href:"https://svgedit.netlify.app/editor/index.html",target:"_blank",rel:"noopener noreferrer"},k=e("h2",{id:"eagle",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#eagle","aria-hidden":"true"},"#"),a(" Eagle")],-1),T=e("p",null,"Eagle 非常适合管理图片素材。其优势之一是去重,我的素材库有几十万个文件,无法一个个清理,但导入 Eagle 就可以去除重复素材。",-1),v=e("p",null,"Eagle 导入流程:搜索文件夹中的 ZIP/RAR 文件,确认全部解压。",-1),E=e("h2",{id:"字体",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#字体","aria-hidden":"true"},"#"),a(" 字体")],-1),S=e("p",null,[a("字体是海报的灵魂,直接影响传播效果。商务性海报中,推荐使用阿里妈妈数黑体。另外,主标题不要使用纯黑色,建议使用 "),e("code",null,"#1F2937"),a("。")],-1),F=e("p",null,"以下是我常用的几种字体:",-1),C={href:"https://fonts.alibabagroup.com/#/font",target:"_blank",rel:"noopener noreferrer"},O={href:"https://fonts.alibabagroup.com/#/more",target:"_blank",rel:"noopener noreferrer"},A={href:"https://github.com/adobe-fonts/source-han-sans/",target:"_blank",rel:"noopener noreferrer"},P={href:"https://www.mianfeiziti.com/fonts-fotmatisseprom",target:"_blank",rel:"noopener noreferrer"},z={href:"https://www.fonts.net.cn/font-38213257557.html",target:"_blank",rel:"noopener noreferrer"},I={href:"https://www.fonts.net.cn/font-38877223362.html",target:"_blank",rel:"noopener noreferrer"},V={href:"https://www.100font.com/thread-114.htm",target:"_blank",rel:"noopener noreferrer"},y={href:"https://www.100font.com/thread-69.htm",target:"_blank",rel:"noopener noreferrer"},H={href:"https://www.fonts.net.cn/font-35850420097.html",target:"_blank",rel:"noopener noreferrer"},M={href:"https://github.com/atelier-anchor/smiley-sans/releases",target:"_blank",rel:"noopener noreferrer"},N={href:"https://www.fonts.net.cn/font-35961736892.html",target:"_blank",rel:"noopener noreferrer"},j=e("p",null,"字体格式建议 OTC > OTF > TTC > TTF,如果只在 Windows 平台使用,TTC/TTF 体验更佳。如果您是一名设计师并进行大量的印刷设计,您可以使用 Adobe 软件进行大量工作。在这种情况下,建议使用 OTF 字体,因为 .otf 是 基于 postscript(类似于 PDF) 并由 Adobe 开发。OTF 格式还提供了更多风格的替代方案和字距调整选项,设计师可能会觉得这些 选项有用。如果您使用 MS Ofce 进行大量工作时,建议使用 TTF 字体,因为 .ttf 是由 Microsoft 和 Apple 开发的。例如:您只能将.ttf 字体嵌入到 MS Word 和 MS PowerPoint 中,而不能嵌入 .otf 字体。",-1);function q(B,R){const t=o("ExternalLinkIcon");return l(),i("div",null,[c,d,_,e("p",null,[e("a",f,[a("Excalidraw"),n(t)]),a(" 是一款开源免费的手绘风格画图应用,可以简单地制作美观漂亮的流程图、示意图和开发架构图等常用图片,也支持插入图片,是一款自由便捷的电子白板应用。Excalidraw 已被集成到各类白板应用中。")]),e("p",null,[a("不过,Excalidraw 没有中文手写字体,需手动修改,比如 "),e("a",p,[a("Excalidraw 官方版添加中文手写字体"),n(t)]),a(","),e("a",g,[a("Obsidian 中文手写体设置"),n(t)]),a(","),e("a",u,[a("网页端中文手写字体配置"),n(t)]),a("。")]),b,e("p",null,[a("一些页面图标路径是隐藏的,无法在前端获取,可以使用 "),e("a",m,[a("ImageAssistant"),n(t)]),a(" 扩展提取页面所有图片,或者通过搜索引擎搜索,获取网站提交给搜索引擎的 logo 图片。")]),e("p",null,[a("如果获取的图标较小,可以使用 "),e("a",w,[a("waifu2x"),n(t)]),a(" 进行最大降噪,然后多次放大 logo。其他放大算法会令 logo 变化,而 waifu2x 不会改变原图。")]),e("p",null,[a("如果图标 svg 不符合要求,可以使用 "),e("a",x,[a("SVG-edit"),n(t)]),a(" 进行简单编辑。")]),k,T,v,E,S,F,e("ul",null,[e("li",null,[e("a",C,[a("阿里巴巴普惠体 2.0"),n(t)]),a(":简称「Alibaba PuHuiTi 2.0」,免费可商用,覆盖中英文。")]),e("li",null,[e("a",O,[a("阿里妈妈数黑体"),n(t)]),a(":简称「Alimama ShuHeiTi」,数黑体为中文简体字库,适用于电商、广告、品牌形象、推广物料等场景。")]),e("li",null,[e("a",A,[a("思源字体"),n(t)]),a(":简称「Source Han Sans」,这是比较规规矩矩的一款字体,谷歌出品。用在商务风 PPT,或者是用在正文中,阅读效果都很赞。")]),e("li",null,[e("a",P,[a("FOT-MatissePro"),n(t)]),a(":原本为 EVA 的常用日语字体,也支持大部分的繁体。")]),e("li",null,[e("a",z,[a("优设标题黑"),n(t)]),a(":简称「YouSheBiaoTiHei-2」,以黑体字型为基础,整体字形沉稳,同时采用较大字面和粗壮的笔画来强化力量感。每个字体水平倾斜 8° 的设计,赋予了字体极强的速度感,为了让字体倾斜后也能保持稳固,设计师将整体字身设定宽扁。而起笔和弯钩上独具匠心的尖角设计,不仅突显了设计的几何感,而且方便后期修改。")]),e("li",null,[e("a",I,[a("优设好身体"),n(t)]),a(":简称「YSHaoShenTi-2」,一款亲和力、现代感极强的专业美术标题字体。它以圆体字型为基础,通过瘦高的字面、偏向几何的曲线,让整宽字体富有亲和力和时尚感。在同样的面积里,更窄的字面就意味着能容纳更多的信息,所以这款字体非常适用在需要体现亲和力与时尚感的各类品牌宣传广告和产品包装设计的标题上。")]),e("li",null,[e("a",V,[a("851 手书体"),n(t)]),a(":851 手書き雑フォント,虽为日系字体但覆盖了大部分的中英文,是以硬笔为主的手写字型,我喜欢用在 Excalidraw。")]),e("li",null,[e("a",y,[a("濑户体"),n(t)]),a(":简称「SetoFont」,是一款偏可爱风的字体,支持简体中文、繁体中文、日文。")]),e("li",null,[e("a",H,[a("杨任东竹石体"),n(t)]),a(":手写字体,简称为「YRDZST」。")]),e("li",null,[e("a",M,[a("得意黑字体"),n(t)]),a(":非手写字体,但用在 Excalidraw 也不错。")]),e("li",null,[e("a",N,[a("锐字真言体"),n(t)]),a(":简称「Zhenyan」,真言体笔触浑厚有力,笔画曲折有度,字形个性鲜明,刚柔并济,落笔简洁有序,给人以遒劲有力、端正凝练的感受。直角与圆角的错落搭配使得字体婉转有度,落落大方,具有自己独到的风格!这款字体特别适用于文字标题、竞技视觉、广告设计、个性品牌设计推广、企业宣传及时尚品牌的设计应用。")])]),j])}const D=r(h,[["render",q],["__file","design.html.vue"]]);export{D as default}; +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as l,c as i,a as e,b as a,d as n,e as s}from"./app-91ee3df5.js";const h={},c=e("h2",{id:"电子白板",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#电子白板","aria-hidden":"true"},"#"),a(" 电子白板")],-1),d=e("p",null,"在电子白板功能普及之前,我使用 Figma 对海报、图片素材进行简单剪辑,制作流程图。但是,电子白板的美观和自由度远远超过 Figma,我现在的流程图和示意图都是通过 Excalidraw 和 Canvas 完成的。",-1),_=e("h3",{id:"excalidraw",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#excalidraw","aria-hidden":"true"},"#"),a(" Excalidraw")],-1),f={href:"https://github.com/excalidraw/excalidraw",target:"_blank",rel:"noopener noreferrer"},p={href:"https://blog.csdn.net/qq_34802028/article/details/127927960",target:"_blank",rel:"noopener noreferrer"},g={href:"https://blog.csdn.net/qq_26176515/article/details/126005295",target:"_blank",rel:"noopener noreferrer"},u={href:"https://zhuanlan.zhihu.com/p/577420136",target:"_blank",rel:"noopener noreferrer"},b=s('
        手绘样例

        Canvas

        Canvas(画布)是所有 UI 组件的「容器」。一个场景中,可以允许多个 canvas 对象存在,也允许 canvas 之间进行「嵌套」使用。需要注意的是,场景中的任何一个 UI 对象,都必定是某个 canvas 对象的「子级」。我最常用的是 Obsidian 和秒笔的 Canvas 功能:

        • Obsidian Canvas:可以将图片、视频、文本、网页、文件和 Excalidraw 聚合在一起,并建立连接线和分组。

          等后续替代本图
          Obsidian canvas 样例
        • 秒笔白板:支持聚合图片、文本、表格、清单、看板和 Excalidraw,但根据作者回复,妙笔的连接线和分组功能会在 2023 的下半年才摆上开发计划。

        ',5),m={href:"https://chrome.google.com/webstore/detail/imageassistant-batch-imag/dbjbempljhcmhlfpfacalomonjpalpko",target:"_blank",rel:"noopener noreferrer"},w={href:"http://waifu2x.udp.jp/index.zh-CN.html",target:"_blank",rel:"noopener noreferrer"},x={href:"https://svgedit.netlify.app/editor/index.html",target:"_blank",rel:"noopener noreferrer"},k=e("h2",{id:"eagle",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#eagle","aria-hidden":"true"},"#"),a(" Eagle")],-1),T=e("p",null,"Eagle 非常适合管理图片素材。其优势之一是去重,我的素材库有几十万个文件,无法一个个清理,但导入 Eagle 就可以去除重复素材。",-1),v=e("p",null,"Eagle 导入流程:搜索文件夹中的 ZIP/RAR 文件,确认全部解压。",-1),E=e("h2",{id:"字体",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#字体","aria-hidden":"true"},"#"),a(" 字体")],-1),S=e("p",null,[a("字体是海报的灵魂,直接影响传播效果。商务性海报中,推荐使用阿里妈妈数黑体。另外,主标题不要使用纯黑色,建议使用 "),e("code",null,"#1F2937"),a("。")],-1),F=e("p",null,"以下是我常用的几种字体:",-1),C={href:"https://fonts.alibabagroup.com/#/font",target:"_blank",rel:"noopener noreferrer"},O={href:"https://fonts.alibabagroup.com/#/more",target:"_blank",rel:"noopener noreferrer"},A={href:"https://github.com/adobe-fonts/source-han-sans/",target:"_blank",rel:"noopener noreferrer"},P={href:"https://www.mianfeiziti.com/fonts-fotmatisseprom",target:"_blank",rel:"noopener noreferrer"},z={href:"https://www.fonts.net.cn/font-38213257557.html",target:"_blank",rel:"noopener noreferrer"},I={href:"https://www.fonts.net.cn/font-38877223362.html",target:"_blank",rel:"noopener noreferrer"},V={href:"https://www.100font.com/thread-114.htm",target:"_blank",rel:"noopener noreferrer"},y={href:"https://www.100font.com/thread-69.htm",target:"_blank",rel:"noopener noreferrer"},H={href:"https://www.fonts.net.cn/font-35850420097.html",target:"_blank",rel:"noopener noreferrer"},M={href:"https://github.com/atelier-anchor/smiley-sans/releases",target:"_blank",rel:"noopener noreferrer"},N={href:"https://www.fonts.net.cn/font-35961736892.html",target:"_blank",rel:"noopener noreferrer"},j=e("p",null,"字体格式建议 OTC > OTF > TTC > TTF,如果只在 Windows 平台使用,TTC/TTF 体验更佳。如果您是一名设计师并进行大量的印刷设计,您可以使用 Adobe 软件进行大量工作。在这种情况下,建议使用 OTF 字体,因为 .otf 是 基于 postscript(类似于 PDF) 并由 Adobe 开发。OTF 格式还提供了更多风格的替代方案和字距调整选项,设计师可能会觉得这些 选项有用。如果您使用 MS Ofce 进行大量工作时,建议使用 TTF 字体,因为 .ttf 是由 Microsoft 和 Apple 开发的。例如:您只能将.ttf 字体嵌入到 MS Word 和 MS PowerPoint 中,而不能嵌入 .otf 字体。",-1);function q(B,R){const t=o("ExternalLinkIcon");return l(),i("div",null,[c,d,_,e("p",null,[e("a",f,[a("Excalidraw"),n(t)]),a(" 是一款开源免费的手绘风格画图应用,可以简单地制作美观漂亮的流程图、示意图和开发架构图等常用图片,也支持插入图片,是一款自由便捷的电子白板应用。Excalidraw 已被集成到各类白板应用中。")]),e("p",null,[a("不过,Excalidraw 没有中文手写字体,需手动修改,比如 "),e("a",p,[a("Excalidraw 官方版添加中文手写字体"),n(t)]),a(","),e("a",g,[a("Obsidian 中文手写体设置"),n(t)]),a(","),e("a",u,[a("网页端中文手写字体配置"),n(t)]),a("。")]),b,e("p",null,[a("一些页面图标路径是隐藏的,无法在前端获取,可以使用 "),e("a",m,[a("ImageAssistant"),n(t)]),a(" 扩展提取页面所有图片,或者通过搜索引擎搜索,获取网站提交给搜索引擎的 logo 图片。")]),e("p",null,[a("如果获取的图标较小,可以使用 "),e("a",w,[a("waifu2x"),n(t)]),a(" 进行最大降噪,然后多次放大 logo。其他放大算法会令 logo 变化,而 waifu2x 不会改变原图。")]),e("p",null,[a("如果图标 svg 不符合要求,可以使用 "),e("a",x,[a("SVG-edit"),n(t)]),a(" 进行简单编辑。")]),k,T,v,E,S,F,e("ul",null,[e("li",null,[e("a",C,[a("阿里巴巴普惠体 2.0"),n(t)]),a(":简称「Alibaba PuHuiTi 2.0」,免费可商用,覆盖中英文。")]),e("li",null,[e("a",O,[a("阿里妈妈数黑体"),n(t)]),a(":简称「Alimama ShuHeiTi」,数黑体为中文简体字库,适用于电商、广告、品牌形象、推广物料等场景。")]),e("li",null,[e("a",A,[a("思源字体"),n(t)]),a(":简称「Source Han Sans」,这是比较规规矩矩的一款字体,谷歌出品。用在商务风 PPT,或者是用在正文中,阅读效果都很赞。")]),e("li",null,[e("a",P,[a("FOT-MatissePro"),n(t)]),a(":原本为 EVA 的常用日语字体,也支持大部分的繁体。")]),e("li",null,[e("a",z,[a("优设标题黑"),n(t)]),a(":简称「YouSheBiaoTiHei-2」,以黑体字型为基础,整体字形沉稳,同时采用较大字面和粗壮的笔画来强化力量感。每个字体水平倾斜 8° 的设计,赋予了字体极强的速度感,为了让字体倾斜后也能保持稳固,设计师将整体字身设定宽扁。而起笔和弯钩上独具匠心的尖角设计,不仅突显了设计的几何感,而且方便后期修改。")]),e("li",null,[e("a",I,[a("优设好身体"),n(t)]),a(":简称「YSHaoShenTi-2」,一款亲和力、现代感极强的专业美术标题字体。它以圆体字型为基础,通过瘦高的字面、偏向几何的曲线,让整宽字体富有亲和力和时尚感。在同样的面积里,更窄的字面就意味着能容纳更多的信息,所以这款字体非常适用在需要体现亲和力与时尚感的各类品牌宣传广告和产品包装设计的标题上。")]),e("li",null,[e("a",V,[a("851 手书体"),n(t)]),a(":851 手書き雑フォント,虽为日系字体但覆盖了大部分的中英文,是以硬笔为主的手写字型,我喜欢用在 Excalidraw。")]),e("li",null,[e("a",y,[a("濑户体"),n(t)]),a(":简称「SetoFont」,是一款偏可爱风的字体,支持简体中文、繁体中文、日文。")]),e("li",null,[e("a",H,[a("杨任东竹石体"),n(t)]),a(":手写字体,简称为「YRDZST」。")]),e("li",null,[e("a",M,[a("得意黑字体"),n(t)]),a(":非手写字体,但用在 Excalidraw 也不错。")]),e("li",null,[e("a",N,[a("锐字真言体"),n(t)]),a(":简称「Zhenyan」,真言体笔触浑厚有力,笔画曲折有度,字形个性鲜明,刚柔并济,落笔简洁有序,给人以遒劲有力、端正凝练的感受。直角与圆角的错落搭配使得字体婉转有度,落落大方,具有自己独到的风格!这款字体特别适用于文字标题、竞技视觉、广告设计、个性品牌设计推广、企业宣传及时尚品牌的设计应用。")])]),j])}const D=r(h,[["render",q],["__file","design.html.vue"]]);export{D as default}; diff --git a/assets/docsify.html-ffda287d.js b/assets/docsify.html-9adf0d21.js similarity index 98% rename from assets/docsify.html-ffda287d.js rename to assets/docsify.html-9adf0d21.js index ae3d45b5..24375c4a 100644 --- a/assets/docsify.html-ffda287d.js +++ b/assets/docsify.html-9adf0d21.js @@ -1,3 +1,3 @@ -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as i,c,a as e,b as s,d as o,e as d}from"./app-98132e77.js";const r={},l={href:"https://docsify.js.org/#/zh-cn/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://docsify.js.org/#/zh-cn/",target:"_blank",rel:"noopener noreferrer"},p=e("h2",{id:"插件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#插件","aria-hidden":"true"},"#"),s(" 插件")],-1),_={href:"https://github.com/docsifyjs/awesome-docsify#plugins",target:"_blank",rel:"noopener noreferrer"},u={class:"task-list-container"},f={class:"task-list-item"},b=e("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-0",checked:"checked",disabled:"disabled"},null,-1),k={class:"task-list-item-label",for:"task-item-0"},m={href:"https://notebook.js.org/#/README",target:"_blank",rel:"noopener noreferrer"},g={class:"task-list-item"},y=e("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-1",checked:"checked",disabled:"disabled"},null,-1),x={class:"task-list-item-label",for:"task-item-1"},v={href:"https://github.com/827652549/docsify-count",target:"_blank",rel:"noopener noreferrer"},j={class:"task-list-item"},w=e("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-2",checked:"checked",disabled:"disabled"},null,-1),E={class:"task-list-item-label",for:"task-item-2"},N={href:"https://github.com/cxcn/docsify-waline/blob/main/README.zh-CN.md",target:"_blank",rel:"noopener noreferrer"},z={class:"task-list-item"},C=e("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-3",checked:"checked",disabled:"disabled"},null,-1),D={class:"task-list-item-label",for:"task-item-3"},M={href:"https://github.com/mrpotatoes/docsify-toc",target:"_blank",rel:"noopener noreferrer"},S={href:"https://tainacan.github.io/tainacan-wiki/#/general-concepts",target:"_blank",rel:"noopener noreferrer"},A={href:"https://github.com/dromara/sureness/blob/master/docs/index.html",target:"_blank",rel:"noopener noreferrer"},L={href:"https://wiki.lifeupapp.fun/zh-cn/#/features/174",target:"_blank",rel:"noopener noreferrer"},V={class:"task-list-item"},B=e("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-4",checked:"checked",disabled:"disabled"},null,-1),P={class:"task-list-item-label",for:"task-item-4"},R={href:"https://github.com/meff34/docsify-to-pdf-converter",target:"_blank",rel:"noopener noreferrer"},T=e("ul",null,[e("li",null,[e("code",null,"illegal operation on a directory"),s(" 报错:sidebar 中不要使用简写地址,将 "),e("code",null,"main/"),s(" 改为 "),e("code",null,"main/README.md"),s(",否则将读取到目录而报错。")]),e("li",null,[e("code",null,"'node_modules' 不是内部或外部命令"),s(" 报错:将 package.json 的设置修改为 "),e("code",null,'"convert": "node_modules\\\\.bin\\\\docsify-pdf-converter"'),s("。这问题多发生在 Windows,是由 Windows 与 Linux 路径规则不同而引起的。")])],-1),W=e("h2",{id:"配置",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#配置","aria-hidden":"true"},"#"),s(" 配置")],-1),q=e("h3",{id:"docsify-emoji",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#docsify-emoji","aria-hidden":"true"},"#"),s(" docsify emoji")],-1),G={href:"https://docsify.js.org/#/zh-cn/plugins?id=emoji",target:"_blank",rel:"noopener noreferrer"},H=e("code",null,":",-1),I=e("code",null,":100:",-1),F=e("code",null,":100:",-1),J=e("p",null,"实际使用中,我直接复制 emoji,都能正常显示。",-1),K=e("h2",{id:"本地命令",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#本地命令","aria-hidden":"true"},"#"),s(" 本地命令")],-1),O={href:"https://github.com/docsifyjs/docsify-cli",target:"_blank",rel:"noopener noreferrer"},Q=d(`

        <path> 默认为当前路径,可使用子文件夹指定路径,如 ./docsdocs

        [] 为可省略命令区,无实际作用,输出时需要去除。

        Serve 启动

        若要在电脑上查看 docsify 页面,可执行 serve 架构命令,在本地主机上运行服务。默认本地端口为 3000,可以指定端口。

        docsify serve <path> [--open false] [--port 3000]
        +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as i,c,a as e,b as s,d as o,e as d}from"./app-91ee3df5.js";const r={},l={href:"https://docsify.js.org/#/zh-cn/",target:"_blank",rel:"noopener noreferrer"},h={href:"https://docsify.js.org/#/zh-cn/",target:"_blank",rel:"noopener noreferrer"},p=e("h2",{id:"插件",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#插件","aria-hidden":"true"},"#"),s(" 插件")],-1),_={href:"https://github.com/docsifyjs/awesome-docsify#plugins",target:"_blank",rel:"noopener noreferrer"},u={class:"task-list-container"},f={class:"task-list-item"},b=e("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-0",checked:"checked",disabled:"disabled"},null,-1),k={class:"task-list-item-label",for:"task-item-0"},m={href:"https://notebook.js.org/#/README",target:"_blank",rel:"noopener noreferrer"},g={class:"task-list-item"},y=e("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-1",checked:"checked",disabled:"disabled"},null,-1),x={class:"task-list-item-label",for:"task-item-1"},v={href:"https://github.com/827652549/docsify-count",target:"_blank",rel:"noopener noreferrer"},j={class:"task-list-item"},w=e("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-2",checked:"checked",disabled:"disabled"},null,-1),E={class:"task-list-item-label",for:"task-item-2"},N={href:"https://github.com/cxcn/docsify-waline/blob/main/README.zh-CN.md",target:"_blank",rel:"noopener noreferrer"},z={class:"task-list-item"},C=e("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-3",checked:"checked",disabled:"disabled"},null,-1),D={class:"task-list-item-label",for:"task-item-3"},M={href:"https://github.com/mrpotatoes/docsify-toc",target:"_blank",rel:"noopener noreferrer"},S={href:"https://tainacan.github.io/tainacan-wiki/#/general-concepts",target:"_blank",rel:"noopener noreferrer"},A={href:"https://github.com/dromara/sureness/blob/master/docs/index.html",target:"_blank",rel:"noopener noreferrer"},L={href:"https://wiki.lifeupapp.fun/zh-cn/#/features/174",target:"_blank",rel:"noopener noreferrer"},V={class:"task-list-item"},B=e("input",{type:"checkbox",class:"task-list-item-checkbox",id:"task-item-4",checked:"checked",disabled:"disabled"},null,-1),P={class:"task-list-item-label",for:"task-item-4"},R={href:"https://github.com/meff34/docsify-to-pdf-converter",target:"_blank",rel:"noopener noreferrer"},T=e("ul",null,[e("li",null,[e("code",null,"illegal operation on a directory"),s(" 报错:sidebar 中不要使用简写地址,将 "),e("code",null,"main/"),s(" 改为 "),e("code",null,"main/README.md"),s(",否则将读取到目录而报错。")]),e("li",null,[e("code",null,"'node_modules' 不是内部或外部命令"),s(" 报错:将 package.json 的设置修改为 "),e("code",null,'"convert": "node_modules\\\\.bin\\\\docsify-pdf-converter"'),s("。这问题多发生在 Windows,是由 Windows 与 Linux 路径规则不同而引起的。")])],-1),W=e("h2",{id:"配置",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#配置","aria-hidden":"true"},"#"),s(" 配置")],-1),q=e("h3",{id:"docsify-emoji",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#docsify-emoji","aria-hidden":"true"},"#"),s(" docsify emoji")],-1),G={href:"https://docsify.js.org/#/zh-cn/plugins?id=emoji",target:"_blank",rel:"noopener noreferrer"},H=e("code",null,":",-1),I=e("code",null,":100:",-1),F=e("code",null,":100:",-1),J=e("p",null,"实际使用中,我直接复制 emoji,都能正常显示。",-1),K=e("h2",{id:"本地命令",tabindex:"-1"},[e("a",{class:"header-anchor",href:"#本地命令","aria-hidden":"true"},"#"),s(" 本地命令")],-1),O={href:"https://github.com/docsifyjs/docsify-cli",target:"_blank",rel:"noopener noreferrer"},Q=d(`

        <path> 默认为当前路径,可使用子文件夹指定路径,如 ./docsdocs

        [] 为可省略命令区,无实际作用,输出时需要去除。

        Serve 启动

        若要在电脑上查看 docsify 页面,可执行 serve 架构命令,在本地主机上运行服务。默认本地端口为 3000,可以指定端口。

        docsify serve <path> [--open false] [--port 3000]
         

        使用时不要关闭命令终端,否则 serve 也会停止。

        生成侧边栏

        docsify generate <path> [--sidebar _sidebar.md]
         

        generate 命令会遍历指定目录及其子目录的所有 markdown 文件,并生成全路径的 _sidebar.md。<path> 不能省略,需指定子文件夹路径。

        如果路径中存在 _sidebar.md,则会报错。

        常见问题

        引用路径

        docsify 引用内部文件时,路径会自带添加域名。

        例如:指向子文档时,链接是 子文件夹/文档名.md;指向子文档的小标题时,链接是 子文件夹/文档名?id=小标题

        页面未同步更新

        CDN 默认是有缓存的,如果文件更新,访问的可能不是最新的文件。

        我设置了 routerMode 为 history,使用 CDN 访问非首页,再次刷新会找不到文件。

        如果开启了 relativePath: true,文件可以找到,但是侧栏上边的标题点击又有点问题。

        GitHub Pages 报错

        如果 SSL 链接 404 报错,显示「There isn't a GitHub Pages site here」,则目录中加入 CNAME 文件。

        `,18);function U(X,Y){const t=n("ExternalLinkIcon");return i(),c("div",null,[e("p",null,[e("a",l,[s("docsify"),o(t)]),s(" 是一个神奇的文档网站生成器,可以快速帮你将 .md 文档生成为网站。docsify 入门简单且无需服务器,非常适合个人笔记的简单整理分享。")]),e("p",null,[s("本页集中了我使用 docsify 中遇到的问题,新手先看 "),e("a",h,[s("docsify 入门文档"),o(t)]),s("。")]),p,e("p",null,[e("a",_,[s("docsify 插件列表"),o(t)]),s(":")]),e("ul",u,[e("li",f,[b,e("label",k,[e("a",m,[s("docsify 笔记类参考"),o(t)]),s(":看板娘,多级页面,页面点击效果,网站运行时间。")])]),e("li",g,[y,e("label",x,[e("a",v,[s("docsify-count"),o(t)]),s(":docsify 的字数和阅读时长插件。")])]),e("li",j,[w,e("label",E,[e("a",N,[s("docsify-waline"),o(t)]),s(":提供评论功能的同时,借用 docsify-count 接口展示阅读量。暂时停止 1300 宽度的 waline 显示,避免页面显示异常。")])]),e("li",z,[C,e("label",D,[e("a",M,[s("docsify-toc"),o(t)]),s(":给笔记页内部添加目录。不过本插件与 gitalk、waline 冲突,页面宽于 1300px 时出现 toc 目录,评论区位置也跟着挤到页面顶部,需手动修改。参考链接:"),e("a",S,[s("Tainacan Wiki"),o(t)]),s(","),e("a",A,[s("Sureness"),o(t)]),s(","),e("a",L,[s("lifeupapp"),o(t)]),s("。")])]),e("li",V,[B,e("label",P,[e("a",R,[s("docsify-pdf-converter"),o(t)]),s(":将 docsify 转为 pdf,不带书签目录。")]),T])]),W,q,e("p",null,[e("a",G,[s("emoji 插件"),o(t)]),s("在标题中使用容易出错,建议使用 "),H,s("。例如,原本是 "),I,s(",替换为 "),F,s("。")]),J,K,e("p",null,[e("a",O,[s("docsify 本地命令"),o(t)]),s(":")]),Q])}const ee=a(r,[["render",U],["__file","docsify.html.vue"]]);export{ee as default}; diff --git a/assets/emby.html-78c25958.js b/assets/emby.html-510aacaf.js similarity index 97% rename from assets/emby.html-78c25958.js rename to assets/emby.html-510aacaf.js index d1e8998d..bf480d1b 100644 --- a/assets/emby.html-78c25958.js +++ b/assets/emby.html-510aacaf.js @@ -1,4 +1,4 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as l,c as i,a as n,b as s,d as o,e as c}from"./app-98132e77.js";const p={},u=c(`

        Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。

        使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 99 美元的折扣价格获得。

        # https://hub.docker.com/r/linuxserver/emby
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as l,c as i,a as n,b as s,d as o,e as c}from"./app-91ee3df5.js";const p={},u=c(`

        Emby 为家庭提供了一个强大的媒体服务器,但在配置过程中,记得为你的媒体库目录授权“Everyone”,以确保 Emby 能够无障碍地访问它。为此,请打开共享文件夹的权限设置,选择对应的系统用户,并确保其具有读写权限。

        使用 Emby 客户端播放视频需要 Emby Premiere。一次性购买终身会员的价格为 119 美元,但在黑五期间,通常可以以 99 美元的折扣价格获得。

        # https://hub.docker.com/r/linuxserver/emby
         version: "2.1"
         services:
           emby:
        diff --git a/assets/faq.html-02288f4e.js b/assets/faq.html-ca8a0b34.js
        similarity index 98%
        rename from assets/faq.html-02288f4e.js
        rename to assets/faq.html-ca8a0b34.js
        index 30cdfb09..20774a7e 100644
        --- a/assets/faq.html-02288f4e.js
        +++ b/assets/faq.html-ca8a0b34.js
        @@ -1,4 +1,4 @@
        -import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as i,c as d,a as t,b as e,d as a,e as o}from"./app-98132e77.js";const c={},l={href:"https://answers.microsoft.com/zh-hans/",target:"_blank",rel:"noopener noreferrer"},p=o('

        Windows 快捷键

        快捷键功能
        Win 键 + 数字键启动任务栏的快捷方式
        Win 键 + D显示桌面,再点击一次后恢复
        Win 键 + E快速启动文件资源管理器
        Win 键 + Tab查看当前桌面打开的窗口和所有桌面
        Win + Ctrl + L实时字幕(Windows 11)
        Win + Ctrl + D创建新的虚拟桌面,新桌面里没有打开窗口
        Win + Ctrl + 左/右切换虚拟桌面
        Win + I系统设置
        Win 键 + 向上键最大化窗口 (传统桌面)
        Win 键 + 向下键最小化窗口 (传统桌面)
        Win 键 + 向左键将窗口最大化到屏幕的左侧 (传统桌面)
        Win 键 + 向右键将窗口最大化到屏幕的右侧 (传统桌面)
        Ctrl+W关闭标签页
        Alt+F4关闭当前程序窗口

        %AppData% 为 C:\\Users\\用户名\\AppData\\Roaming 的变量路径。[1]

        网址快捷方式

        右键单击桌面,选择「新建」>「快捷方式」,输入浏览器运行路径、空格和要访问的网址链接,例如:"C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe" https://gpt-vip.top/

        如果需要一次打开多个网址,则在参数后继续添加「空格 链接」。

        Chrome 开发工具

        网页重定向时,无法在开发工具中看到重定向时打开的网页。

        点击 F12-Settings-Throttling,增加浏览器的网络延时,来查看跳转路径。到达中转页面时,可在开发工具中将网络改为 Offiline,网页将停止加载。

        • Preserve log:不在网页刷新或重定向后,清楚加载日志
        • Disbale cache:不使用网页缓存
        • Online:定制本地与服务端的网络环境,下载速度、上传速度、延时。

        网页转桌面应用

        Chrome App

        使用 Chrome 浏览器将网页创建为「桌面应用」。

        1. 打开 Google Chrome 浏览器,并访问你希望生成「桌面客户端」的网页。
        2. 单击右上角的菜单按钮,然后选择「更多工具」>「创建快捷方式」。
        3. 在弹出的对话框中,ni 可以进行应用名称的修改,同时勾选「在窗口中打开」。
        4. 打开 Chrome App 页面:chrome://apps,以管理已经创建的应用程序。

        Pake

        ',15),h={href:"https://github.com/tw93/Pake",target:"_blank",rel:"noopener noreferrer"},u=t("h3",{id:"web2desk",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#web2desk","aria-hidden":"true"},"#"),e(" Web2Desk")],-1),f={href:"https://desktop.appmaker.xyz/",target:"_blank",rel:"noopener noreferrer"},_={href:"https://convertico.com/",target:"_blank",rel:"noopener noreferrer"},b=o('

        常见问题

        无法切换中英文

        突然出现中英文无法切换,大部分情况是因为硬件出了问题,与输入法无关。

        • 检查方法:安装并启动 AutoHotkey,点击「view」>「Key history and script info」。窗口会显示最近的按键历史,当发现一个键在疯狂重复时,很有可能就是出问题的按键。
        • 修复方法:键盘上重复按下该按键,看看是否能修复。如果不能修复,可以拔下键盘 USB,单独使用软键盘,测试按键是否正常。如果软键盘正常,键盘配件又无法修复,可以通过 Powertoys 或 AutoHotkey 禁用这个按键。

        禁止系统自动更新重启

        Win11 中,在注册表中进入「计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU」,新建 DWORD(32 位)值,将其重命名为「NoAutoRebootWithLoggedOnUsers」,并将键值改为 1。

        Win10 中,没有找到类似的注册表,可以直接关闭自动更新。

        WPS 没有宏

        ',8),k={href:"https://www.jyrd.com/media/6490.html",target:"_blank",rel:"noopener noreferrer"},m=t("li",null,"开启聚光灯效果:「视图」>「阅读模式」,每个文件需要单独开启,文件保存后自动开启。",-1),g=o(`

        Microsoft Store 应用快捷方式

        Microsoft Store 安装的应用没有固定位置,一更新就会换位置,无法建立快捷方式。虽然这些应用能被设为开机启动,但经常启动不成功。

        解决方法是:右键 Microsoft Store 应用,将其固定在任务栏。之后可使用 Win+数字键 来启动应用。例如,若应用在任务栏的第 7 位,则使用热键 Win+7

        无法安装应用

        安装应用却被提示「您的安全设置不允许将此应用程序安装到您的计算机上」时,新建记事本并输入下方代码,修改记事本的后缀名为.reg,然后右键以管理员身份运行,合并到注册表就可以了。[2]

        Windows Registry Editor Version 5.00
        +import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r,o as i,c as d,a as t,b as e,d as a,e as o}from"./app-91ee3df5.js";const c={},l={href:"https://answers.microsoft.com/zh-hans/",target:"_blank",rel:"noopener noreferrer"},p=o('

        Windows 快捷键

        快捷键功能
        Win 键 + 数字键启动任务栏的快捷方式
        Win 键 + D显示桌面,再点击一次后恢复
        Win 键 + E快速启动文件资源管理器
        Win 键 + Tab查看当前桌面打开的窗口和所有桌面
        Win + Ctrl + L实时字幕(Windows 11)
        Win + Ctrl + D创建新的虚拟桌面,新桌面里没有打开窗口
        Win + Ctrl + 左/右切换虚拟桌面
        Win + I系统设置
        Win 键 + 向上键最大化窗口 (传统桌面)
        Win 键 + 向下键最小化窗口 (传统桌面)
        Win 键 + 向左键将窗口最大化到屏幕的左侧 (传统桌面)
        Win 键 + 向右键将窗口最大化到屏幕的右侧 (传统桌面)
        Ctrl+W关闭标签页
        Alt+F4关闭当前程序窗口

        %AppData% 为 C:\\Users\\用户名\\AppData\\Roaming 的变量路径。[1]

        网址快捷方式

        右键单击桌面,选择「新建」>「快捷方式」,输入浏览器运行路径、空格和要访问的网址链接,例如:"C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe" https://gpt-vip.top/

        如果需要一次打开多个网址,则在参数后继续添加「空格 链接」。

        Chrome 开发工具

        网页重定向时,无法在开发工具中看到重定向时打开的网页。

        点击 F12-Settings-Throttling,增加浏览器的网络延时,来查看跳转路径。到达中转页面时,可在开发工具中将网络改为 Offiline,网页将停止加载。

        • Preserve log:不在网页刷新或重定向后,清楚加载日志
        • Disbale cache:不使用网页缓存
        • Online:定制本地与服务端的网络环境,下载速度、上传速度、延时。

        网页转桌面应用

        Chrome App

        使用 Chrome 浏览器将网页创建为「桌面应用」。

        1. 打开 Google Chrome 浏览器,并访问你希望生成「桌面客户端」的网页。
        2. 单击右上角的菜单按钮,然后选择「更多工具」>「创建快捷方式」。
        3. 在弹出的对话框中,ni 可以进行应用名称的修改,同时勾选「在窗口中打开」。
        4. 打开 Chrome App 页面:chrome://apps,以管理已经创建的应用程序。

        Pake

        ',15),h={href:"https://github.com/tw93/Pake",target:"_blank",rel:"noopener noreferrer"},u=t("h3",{id:"web2desk",tabindex:"-1"},[t("a",{class:"header-anchor",href:"#web2desk","aria-hidden":"true"},"#"),e(" Web2Desk")],-1),f={href:"https://desktop.appmaker.xyz/",target:"_blank",rel:"noopener noreferrer"},_={href:"https://convertico.com/",target:"_blank",rel:"noopener noreferrer"},b=o('

        常见问题

        无法切换中英文

        突然出现中英文无法切换,大部分情况是因为硬件出了问题,与输入法无关。

        • 检查方法:安装并启动 AutoHotkey,点击「view」>「Key history and script info」。窗口会显示最近的按键历史,当发现一个键在疯狂重复时,很有可能就是出问题的按键。
        • 修复方法:键盘上重复按下该按键,看看是否能修复。如果不能修复,可以拔下键盘 USB,单独使用软键盘,测试按键是否正常。如果软键盘正常,键盘配件又无法修复,可以通过 Powertoys 或 AutoHotkey 禁用这个按键。

        禁止系统自动更新重启

        Win11 中,在注册表中进入「计算机\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU」,新建 DWORD(32 位)值,将其重命名为「NoAutoRebootWithLoggedOnUsers」,并将键值改为 1。

        Win10 中,没有找到类似的注册表,可以直接关闭自动更新。

        WPS 没有宏

        ',8),k={href:"https://www.jyrd.com/media/6490.html",target:"_blank",rel:"noopener noreferrer"},m=t("li",null,"开启聚光灯效果:「视图」>「阅读模式」,每个文件需要单独开启,文件保存后自动开启。",-1),g=o(`

        Microsoft Store 应用快捷方式

        Microsoft Store 安装的应用没有固定位置,一更新就会换位置,无法建立快捷方式。虽然这些应用能被设为开机启动,但经常启动不成功。

        解决方法是:右键 Microsoft Store 应用,将其固定在任务栏。之后可使用 Win+数字键 来启动应用。例如,若应用在任务栏的第 7 位,则使用热键 Win+7

        无法安装应用

        安装应用却被提示「您的安全设置不允许将此应用程序安装到您的计算机上」时,新建记事本并输入下方代码,修改记事本的后缀名为.reg,然后右键以管理员身份运行,合并到注册表就可以了。[2]

        Windows Registry Editor Version 5.00
         [HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Microsoft\\\\.NETFramework\\\\Security\\\\TrustManager\\\\PromptingLevel]
         "MyComputer"="Enabled"
         "LocalIntranet"="Enabled"
        diff --git a/assets/grocy.html-50c575c2.js b/assets/grocy.html-fa6871cf.js
        similarity index 98%
        rename from assets/grocy.html-50c575c2.js
        rename to assets/grocy.html-fa6871cf.js
        index f3a30251..cc65351c 100644
        --- a/assets/grocy.html-50c575c2.js
        +++ b/assets/grocy.html-fa6871cf.js
        @@ -1,4 +1,4 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o,c,a as n,b as s,d as i,e as l}from"./app-98132e77.js";const p={},r={href:"https://grocy.info/",target:"_blank",rel:"noopener noreferrer"},u=l(`

        Grocy Docker 端默认的账户密码是 admin。要将界面语言设置为中文,只需点击右上角的菜单,然后选择「User settings」,接着在语言选项中选择中文。

        如果你想在移动设备上扫描物品的条形码,可以按照以下步骤操作:点击右上角的菜单,选择「管理 API 秘钥」,然后点击「添加」和「生成 API 秘钥」。接下来,点击生成的秘钥旁边的第二个按钮,使用移动客户端扫描显示在页面上的二维码。然而,个人认为在家庭使用中,扫码功能可能并不是必需的。

        # https://hub.docker.com/r/linuxserver/grocy
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o,c,a as n,b as s,d as i,e as l}from"./app-91ee3df5.js";const p={},r={href:"https://grocy.info/",target:"_blank",rel:"noopener noreferrer"},u=l(`

        Grocy Docker 端默认的账户密码是 admin。要将界面语言设置为中文,只需点击右上角的菜单,然后选择「User settings」,接着在语言选项中选择中文。

        如果你想在移动设备上扫描物品的条形码,可以按照以下步骤操作:点击右上角的菜单,选择「管理 API 秘钥」,然后点击「添加」和「生成 API 秘钥」。接下来,点击生成的秘钥旁边的第二个按钮,使用移动客户端扫描显示在页面上的二维码。然而,个人认为在家庭使用中,扫码功能可能并不是必需的。

        # https://hub.docker.com/r/linuxserver/grocy
         version: "2.1"
         services:
           grocy:
        diff --git a/assets/index.html-0e60e7bb.js b/assets/index.html-03586e65.js
        similarity index 71%
        rename from assets/index.html-0e60e7bb.js
        rename to assets/index.html-03586e65.js
        index 46b8af99..90062250 100644
        --- a/assets/index.html-0e60e7bb.js
        +++ b/assets/index.html-03586e65.js
        @@ -1 +1 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-157d2206.js b/assets/index.html-04d1fa93.js
        similarity index 71%
        rename from assets/index.html-157d2206.js
        rename to assets/index.html-04d1fa93.js
        index 46b8af99..90062250 100644
        --- a/assets/index.html-157d2206.js
        +++ b/assets/index.html-04d1fa93.js
        @@ -1 +1 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-06e18ec6.js b/assets/index.html-051db68b.js
        similarity index 71%
        rename from assets/index.html-06e18ec6.js
        rename to assets/index.html-051db68b.js
        index 46b8af99..90062250 100644
        --- a/assets/index.html-06e18ec6.js
        +++ b/assets/index.html-051db68b.js
        @@ -1 +1 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-0ccff171.js b/assets/index.html-052028e0.js
        similarity index 71%
        rename from assets/index.html-0ccff171.js
        rename to assets/index.html-052028e0.js
        index 46b8af99..90062250 100644
        --- a/assets/index.html-0ccff171.js
        +++ b/assets/index.html-052028e0.js
        @@ -1 +1 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-08078804.js b/assets/index.html-08078804.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-08078804.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-0a4dfae5.js b/assets/index.html-0a4dfae5.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-0a4dfae5.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-0b95bd64.js b/assets/index.html-0b95bd64.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-0b95bd64.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-132009ae.js b/assets/index.html-132009ae.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-132009ae.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-14ae6cb3.js b/assets/index.html-14ae6cb3.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-14ae6cb3.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-16883c8b.js b/assets/index.html-16883c8b.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-16883c8b.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-171b03f4.js b/assets/index.html-171b03f4.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-171b03f4.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-1a598cee.js b/assets/index.html-1a598cee.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-1a598cee.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-1b7934d4.js b/assets/index.html-1b7934d4.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-1b7934d4.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-1bf65264.js b/assets/index.html-1bf65264.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-1bf65264.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-1c41e9aa.js b/assets/index.html-1c41e9aa.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-1c41e9aa.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-1cf6c344.js b/assets/index.html-1cf6c344.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-1cf6c344.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-20d96c37.js b/assets/index.html-20d96c37.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-20d96c37.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-20eed4c0.js b/assets/index.html-20eed4c0.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-20eed4c0.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-21a82569.js b/assets/index.html-21a82569.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-21a82569.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-22ee971b.js b/assets/index.html-22ee971b.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-22ee971b.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-23890b68.js b/assets/index.html-23890b68.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-23890b68.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-2596183f.js b/assets/index.html-2596183f.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-2596183f.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-26124569.js b/assets/index.html-26124569.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-26124569.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-27a21379.js b/assets/index.html-27a21379.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-27a21379.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-111e79d1.js b/assets/index.html-283e30c8.js
        similarity index 76%
        rename from assets/index.html-111e79d1.js
        rename to assets/index.html-283e30c8.js
        index 80f47fd3..750e6049 100644
        --- a/assets/index.html-111e79d1.js
        +++ b/assets/index.html-283e30c8.js
        @@ -1 +1 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-98132e77.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-91ee3df5.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-298e0adb.js b/assets/index.html-298e0adb.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-298e0adb.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-29a4e6f7.js b/assets/index.html-29a4e6f7.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-29a4e6f7.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-2a74f836.js b/assets/index.html-2a74f836.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-2a74f836.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-2bd53a0b.js b/assets/index.html-2bd53a0b.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-2bd53a0b.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-2c1e0c31.js b/assets/index.html-2c1e0c31.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-2c1e0c31.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-2eaba8b5.js b/assets/index.html-2eaba8b5.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-2eaba8b5.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-2efed97f.js b/assets/index.html-2efed97f.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-2efed97f.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-1209836d.js b/assets/index.html-347455fc.js
        similarity index 76%
        rename from assets/index.html-1209836d.js
        rename to assets/index.html-347455fc.js
        index 80f47fd3..750e6049 100644
        --- a/assets/index.html-1209836d.js
        +++ b/assets/index.html-347455fc.js
        @@ -1 +1 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-98132e77.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-91ee3df5.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-35f7a614.js b/assets/index.html-35f7a614.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-35f7a614.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-37874129.js b/assets/index.html-37874129.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-37874129.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-38bc2a69.js b/assets/index.html-38bc2a69.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-38bc2a69.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-3ae7af02.js b/assets/index.html-3ae7af02.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-3ae7af02.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-2aadcf01.js b/assets/index.html-436cceda.js
        similarity index 76%
        rename from assets/index.html-2aadcf01.js
        rename to assets/index.html-436cceda.js
        index 80f47fd3..750e6049 100644
        --- a/assets/index.html-2aadcf01.js
        +++ b/assets/index.html-436cceda.js
        @@ -1 +1 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-98132e77.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-91ee3df5.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-440afd2a.js b/assets/index.html-440afd2a.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-440afd2a.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-47791f6b.js b/assets/index.html-47791f6b.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-47791f6b.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-4913573e.js b/assets/index.html-4913573e.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-4913573e.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-4a9de007.js b/assets/index.html-4a9de007.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-4a9de007.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-4aa1ef4f.js b/assets/index.html-4aa1ef4f.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-4aa1ef4f.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-4aab4c28.js b/assets/index.html-4aab4c28.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-4aab4c28.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-4abad7d4.js b/assets/index.html-4abad7d4.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-4abad7d4.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-4ad37f90.js b/assets/index.html-4ad37f90.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-4ad37f90.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-4d636ba4.js b/assets/index.html-4d636ba4.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-4d636ba4.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-4f491c01.js b/assets/index.html-4f491c01.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-4f491c01.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-50c22431.js b/assets/index.html-50c22431.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-50c22431.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-51139016.js b/assets/index.html-51139016.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-51139016.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-5203d277.js b/assets/index.html-5203d277.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-5203d277.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-5409d20f.js b/assets/index.html-5409d20f.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-5409d20f.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-57863b7f.js b/assets/index.html-57863b7f.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-57863b7f.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-579aa065.js b/assets/index.html-579aa065.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-579aa065.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-595d3448.js b/assets/index.html-595d3448.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-595d3448.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-41b9ce8e.js b/assets/index.html-59735c57.js
        similarity index 76%
        rename from assets/index.html-41b9ce8e.js
        rename to assets/index.html-59735c57.js
        index 80f47fd3..750e6049 100644
        --- a/assets/index.html-41b9ce8e.js
        +++ b/assets/index.html-59735c57.js
        @@ -1 +1 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-98132e77.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-91ee3df5.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-5a0d7f0d.js b/assets/index.html-5a0d7f0d.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-5a0d7f0d.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-5b748567.js b/assets/index.html-5b748567.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-5b748567.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-5c15c4ef.js b/assets/index.html-5c15c4ef.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-5c15c4ef.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-5fe91ac9.js b/assets/index.html-5fe91ac9.js
        new file mode 100644
        index 00000000..750e6049
        --- /dev/null
        +++ b/assets/index.html-5fe91ac9.js
        @@ -0,0 +1 @@
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-91ee3df5.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-628d43ae.js b/assets/index.html-628d43ae.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-628d43ae.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-62b720b4.js b/assets/index.html-62b720b4.js
        deleted file mode 100644
        index 80f47fd3..00000000
        --- a/assets/index.html-62b720b4.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-98132e77.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-6311e86e.js b/assets/index.html-6311e86e.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-6311e86e.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-6421473f.js b/assets/index.html-6421473f.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-6421473f.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-644c5bf8.js b/assets/index.html-644c5bf8.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-644c5bf8.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-64ca9c5a.js b/assets/index.html-64ca9c5a.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-64ca9c5a.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-68ac9c77.js b/assets/index.html-68ac9c77.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-68ac9c77.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-6bf02d51.js b/assets/index.html-6bf02d51.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-6bf02d51.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-6dabc888.js b/assets/index.html-6dabc888.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-6dabc888.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-71b5ab2e.js b/assets/index.html-71b5ab2e.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-71b5ab2e.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-72921f03.js b/assets/index.html-72921f03.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-72921f03.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-72c565d0.js b/assets/index.html-72c565d0.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-72c565d0.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-7488d2ab.js b/assets/index.html-7488d2ab.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-7488d2ab.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-74a0843d.js b/assets/index.html-74a0843d.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-74a0843d.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-7503264b.js b/assets/index.html-7503264b.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-7503264b.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-757c90f1.js b/assets/index.html-757c90f1.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-757c90f1.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-78420230.js b/assets/index.html-78420230.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-78420230.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-7974b474.js b/assets/index.html-7974b474.js
        deleted file mode 100644
        index 80f47fd3..00000000
        --- a/assets/index.html-7974b474.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-98132e77.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-7d5f34b3.js b/assets/index.html-7d5f34b3.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-7d5f34b3.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-7e44122e.js b/assets/index.html-7e44122e.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-7e44122e.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-7e72694f.js b/assets/index.html-7e72694f.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-7e72694f.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-7f734733.js b/assets/index.html-7f734733.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-7f734733.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-81afb063.js b/assets/index.html-81afb063.js
        new file mode 100644
        index 00000000..750e6049
        --- /dev/null
        +++ b/assets/index.html-81afb063.js
        @@ -0,0 +1 @@
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-91ee3df5.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-833ea2d3.js b/assets/index.html-833ea2d3.js
        deleted file mode 100644
        index 80f47fd3..00000000
        --- a/assets/index.html-833ea2d3.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-98132e77.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-83c54511.js b/assets/index.html-83c54511.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-83c54511.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-859d0627.js b/assets/index.html-859d0627.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-859d0627.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-87ae6239.js b/assets/index.html-87ae6239.js
        new file mode 100644
        index 00000000..750e6049
        --- /dev/null
        +++ b/assets/index.html-87ae6239.js
        @@ -0,0 +1 @@
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-91ee3df5.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-9bdab53c.js b/assets/index.html-89663067.js
        similarity index 98%
        rename from assets/index.html-9bdab53c.js
        rename to assets/index.html-89663067.js
        index 93c36dec..fa5b8fdd 100644
        --- a/assets/index.html-9bdab53c.js
        +++ b/assets/index.html-89663067.js
        @@ -1,4 +1,4 @@
        -import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as a,c as l,a as e,b as t,d as n,e as i}from"./app-98132e77.js";const c={},p=e("p",null,"代码编程的学习路径:",-1),d=e("li",null,"基础知识:ES6, MySQL,HTML,Markdown,正则表达式",-1),h=e("li",null,"脚本/开发工具:AutoHotkey,Electron",-1),u={href:"https://www.typescriptlang.org/zh/",target:"_blank",rel:"noopener noreferrer"},_={href:"https://www.javascript.com/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://cn.vuejs.org/",target:"_blank",rel:"noopener noreferrer"},b={href:"https://cn.vitejs.dev/",target:"_blank",rel:"noopener noreferrer"},k={href:"https://router.vuejs.org/zh/index.html",target:"_blank",rel:"noopener noreferrer"},g={href:"https://next.vuex.vuejs.org/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://element-plus.gitee.io/zh-CN/guide/quickstart.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://stylus-lang.com/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://sass.bootcss.com/documentation",target:"_blank",rel:"noopener noreferrer"},S={href:"http://lesscss.cn/",target:"_blank",rel:"noopener noreferrer"},C={href:"https://www.tailwindcss.cn/docs",target:"_blank",rel:"noopener noreferrer"},j={href:"https://www.midwayjs.org/docs/intro",target:"_blank",rel:"noopener noreferrer"},w={href:"https://axios-http.com/",target:"_blank",rel:"noopener noreferrer"},y={href:"https://typicode.github.io/husky/#/",target:"_blank",rel:"noopener noreferrer"},V={href:"https://github.com/okonet/lint-staged",target:"_blank",rel:"noopener noreferrer"},q={href:"http://editorconfig.org",target:"_blank",rel:"noopener noreferrer"},P={href:"https://prettier.io/",target:"_blank",rel:"noopener noreferrer"},E={href:"https://eslint.org/",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/airbnb/javascript#translation",target:"_blank",rel:"noopener noreferrer"},H={href:"http://commitizen.github.io/cz-cli/",target:"_blank",rel:"noopener noreferrer"},z={href:"https://commitlint.js.org/#/",target:"_blank",rel:"noopener noreferrer"},T={href:"https://next.vue-test-utils.vuejs.org/",target:"_blank",rel:"noopener noreferrer"},A={href:"https://jestjs.io/",target:"_blank",rel:"noopener noreferrer"},I={href:"https://github.com/vuejs/vue-jest",target:"_blank",rel:"noopener noreferrer"},L={href:"https://kulshekhar.github.io/ts-jest/",target:"_blank",rel:"noopener noreferrer"},N={href:"https://docs.github.com/cn/actions/learn-github-actions",target:"_blank",rel:"noopener noreferrer"},B={href:"https://documate.site/",target:"_blank",rel:"noopener noreferrer"},M=i(`

        Visual Studio Code

        本地代码编辑器使用 Visual Studio Code,其插件生态成熟,能实现大部分的需求。

        GitHub Copilot,CodeGeeX,Tabnine,aiXcoder 插件均可以辅助补全代码。Tabnine 和 aiXcoder 有免费版,可以预测一到两行的代码。CodeGeeX 由清华大学开发,提供完整补全功能。

        修改快捷键

        选择「菜单栏」>「文件」>「首选项」>「键盘快捷方式」,修改或解绑快捷键。

        以 PicGo 图床为例,其默认配置放置于 %AppData%\\picgo\\data.json,推荐快捷键为

        • 剪贴板图片上传:ctrlOrCmd+alt+q
        • 打开文件管理器上传:ctrlOrCmd+alt+e
        • 打开输入框输入路径上传:ctrlOrCmd+alt+x

        另外,右键对应快捷方式,点击「重置按键绑定」,即可将快捷键设为默认。

        排除文件夹

        在 VS Code 中点击快捷键 Ctrl/Command+Shift+P,输入「setting」,在设置中添加排除文件夹选项。注意:排除文件夹不能使用全路径,只能使用规则排除。

        "files.exclude": {
        +import{_ as r}from"./plugin-vue_export-helper-c27b6911.js";import{r as s,o as a,c as l,a as e,b as t,d as n,e as i}from"./app-91ee3df5.js";const c={},p=e("p",null,"代码编程的学习路径:",-1),d=e("li",null,"基础知识:ES6, MySQL,HTML,Markdown,正则表达式",-1),h=e("li",null,"脚本/开发工具:AutoHotkey,Electron",-1),u={href:"https://www.typescriptlang.org/zh/",target:"_blank",rel:"noopener noreferrer"},_={href:"https://www.javascript.com/",target:"_blank",rel:"noopener noreferrer"},f={href:"https://cn.vuejs.org/",target:"_blank",rel:"noopener noreferrer"},b={href:"https://cn.vitejs.dev/",target:"_blank",rel:"noopener noreferrer"},k={href:"https://router.vuejs.org/zh/index.html",target:"_blank",rel:"noopener noreferrer"},g={href:"https://next.vuex.vuejs.org/",target:"_blank",rel:"noopener noreferrer"},m={href:"https://element-plus.gitee.io/zh-CN/guide/quickstart.html",target:"_blank",rel:"noopener noreferrer"},v={href:"https://stylus-lang.com/",target:"_blank",rel:"noopener noreferrer"},x={href:"https://sass.bootcss.com/documentation",target:"_blank",rel:"noopener noreferrer"},S={href:"http://lesscss.cn/",target:"_blank",rel:"noopener noreferrer"},C={href:"https://www.tailwindcss.cn/docs",target:"_blank",rel:"noopener noreferrer"},j={href:"https://www.midwayjs.org/docs/intro",target:"_blank",rel:"noopener noreferrer"},w={href:"https://axios-http.com/",target:"_blank",rel:"noopener noreferrer"},y={href:"https://typicode.github.io/husky/#/",target:"_blank",rel:"noopener noreferrer"},V={href:"https://github.com/okonet/lint-staged",target:"_blank",rel:"noopener noreferrer"},q={href:"http://editorconfig.org",target:"_blank",rel:"noopener noreferrer"},P={href:"https://prettier.io/",target:"_blank",rel:"noopener noreferrer"},E={href:"https://eslint.org/",target:"_blank",rel:"noopener noreferrer"},G={href:"https://github.com/airbnb/javascript#translation",target:"_blank",rel:"noopener noreferrer"},H={href:"http://commitizen.github.io/cz-cli/",target:"_blank",rel:"noopener noreferrer"},z={href:"https://commitlint.js.org/#/",target:"_blank",rel:"noopener noreferrer"},T={href:"https://next.vue-test-utils.vuejs.org/",target:"_blank",rel:"noopener noreferrer"},A={href:"https://jestjs.io/",target:"_blank",rel:"noopener noreferrer"},I={href:"https://github.com/vuejs/vue-jest",target:"_blank",rel:"noopener noreferrer"},L={href:"https://kulshekhar.github.io/ts-jest/",target:"_blank",rel:"noopener noreferrer"},N={href:"https://docs.github.com/cn/actions/learn-github-actions",target:"_blank",rel:"noopener noreferrer"},B={href:"https://documate.site/",target:"_blank",rel:"noopener noreferrer"},M=i(`

        Visual Studio Code

        本地代码编辑器使用 Visual Studio Code,其插件生态成熟,能实现大部分的需求。

        GitHub Copilot,CodeGeeX,Tabnine,aiXcoder 插件均可以辅助补全代码。Tabnine 和 aiXcoder 有免费版,可以预测一到两行的代码。CodeGeeX 由清华大学开发,提供完整补全功能。

        修改快捷键

        选择「菜单栏」>「文件」>「首选项」>「键盘快捷方式」,修改或解绑快捷键。

        以 PicGo 图床为例,其默认配置放置于 %AppData%\\picgo\\data.json,推荐快捷键为

        • 剪贴板图片上传:ctrlOrCmd+alt+q
        • 打开文件管理器上传:ctrlOrCmd+alt+e
        • 打开输入框输入路径上传:ctrlOrCmd+alt+x

        另外,右键对应快捷方式,点击「重置按键绑定」,即可将快捷键设为默认。

        排除文件夹

        在 VS Code 中点击快捷键 Ctrl/Command+Shift+P,输入「setting」,在设置中添加排除文件夹选项。注意:排除文件夹不能使用全路径,只能使用规则排除。

        "files.exclude": {
           "**/blog": true, //隐藏指定文件夹
           "**/[Pp]lugins": true, //使用中括号时表示不区分大小写
           "**/*.pyc": true, //隐藏所有 pyc 文件
        diff --git a/assets/index.html-8998e41f.js b/assets/index.html-8998e41f.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-8998e41f.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-8ad380f4.js b/assets/index.html-8ad380f4.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-8ad380f4.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-8ad899ca.js b/assets/index.html-8ad899ca.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-8ad899ca.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-8d39341a.js b/assets/index.html-8d39341a.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-8d39341a.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-05b754fd.js b/assets/index.html-8ede1624.js
        similarity index 99%
        rename from assets/index.html-05b754fd.js
        rename to assets/index.html-8ede1624.js
        index ced3411b..c2358f75 100644
        --- a/assets/index.html-05b754fd.js
        +++ b/assets/index.html-8ede1624.js
        @@ -1,4 +1,4 @@
        -import{_ as o}from"./流程2-453dc6f5.js";import{_ as i}from"./libaxuan-github-io-a3ff3974.js";import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as c,o as r,c as p,a as e,d as a,b as n,e as t}from"./app-98132e77.js";const d="/img/流程1.png?imageMogr2/thumbnail/600x",u="/img/readandwrite.webp?imageMogr2/format/webp",h="/img/actions.png",m="/img/vercel-success.png",g={},b=e("blockquote",null,[e("p",null,"开源工具、效率方法、心理学探索的自我提升笔记")],-1),_={href:"https://discord.gg/TeUFcFJy",target:"_blank",rel:"noopener noreferrer"},v=e("img",{src:"https://img.shields.io/discord/1048780149899939881?color=%2385c8c8&label=Discord&logo=discord&style=for-the-badge",alt:"",tabindex:"0",loading:"lazy"},null,-1),k=e("figcaption",null,null,-1),f=t('

        ✨ 初衷

        曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。

        更重要的是,笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。

        为此,我基于 VuePress 和 vuepress-theme-hope 构建了 LearnHubs ,将我所有的笔记与文章聚合到同一页面形成知识库,便于集中管理和分享。

        笔记 + 文章 = LearnHubs 知识库
        笔记/博客自动化发布

        🧱 笔记结构

        • 置顶:日常习惯、健身、阅读;
        • 软件应用:常用应用、Chrome 扩展和相关教程;
        • Docker 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署;
        • 系统问题:Windows 系统优化和相关问题;
        • 代码编程:常用代码的学习和使用笔记,页面开发攻略和网站相关的工具和知识收集;
        • 生活角落:说明书、生活记录和小技巧;
        • 博客汇总:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。

        🍥 搭建 LearnHubs

        ',9),y={href:"https://github.com/libaxuan/LearnHubs",target:"_blank",rel:"noopener noreferrer"},x=t('
      77. 接着,进入项目仓库的「Settings」>「Actions」>「General」,选中底部 Workflow permissions 中的 Read and write permissions,然后点击保存即可。如果未授权,GitHub Page 部署会由于 repo 权限不足而报错 failed with exit code 128

      78. 接下来,请进入菜单栏顶部的「Actions」>「最新的 workflow」,并点击右上方的「Re-run jobs」>「Re-run all jobs」,以重新生成网页。若部署正确,GitHub 将自动搭建 gh-page 分支页面。

        需要注意的是:如果你不需要将网页部署同步到个人服务器,请删除 .github/workflows/main.yml 中 Sync files 区块的代码,否则会出现报错 Error: Input required and not supplied: server

           ### 没有服务器的话,请删除本区块代码,防止报错 ###
        +import{_ as o}from"./流程2-453dc6f5.js";import{_ as i}from"./libaxuan-github-io-a3ff3974.js";import{_ as l}from"./plugin-vue_export-helper-c27b6911.js";import{r as c,o as r,c as p,a as e,d as a,b as n,e as t}from"./app-91ee3df5.js";const d="/img/流程1.png?imageMogr2/thumbnail/600x",u="/img/readandwrite.webp?imageMogr2/format/webp",h="/img/actions.png",m="/img/vercel-success.png",g={},b=e("blockquote",null,[e("p",null,"开源工具、效率方法、心理学探索的自我提升笔记")],-1),_={href:"https://discord.gg/TeUFcFJy",target:"_blank",rel:"noopener noreferrer"},v=e("img",{src:"https://img.shields.io/discord/1048780149899939881?color=%2385c8c8&label=Discord&logo=discord&style=for-the-badge",alt:"",tabindex:"0",loading:"lazy"},null,-1),k=e("figcaption",null,null,-1),f=t('

        ✨ 初衷

        曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。

        更重要的是,笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。

        为此,我基于 VuePress 和 vuepress-theme-hope 构建了 LearnHubs ,将我所有的笔记与文章聚合到同一页面形成知识库,便于集中管理和分享。

        笔记 + 文章 = LearnHubs 知识库
        笔记/博客自动化发布

        🧱 笔记结构

        • 置顶:日常习惯、健身、阅读;
        • 软件应用:常用应用、Chrome 扩展和相关教程;
        • Docker 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署;
        • 系统问题:Windows 系统优化和相关问题;
        • 代码编程:常用代码的学习和使用笔记,页面开发攻略和网站相关的工具和知识收集;
        • 生活角落:说明书、生活记录和小技巧;
        • 博客汇总:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。

        🍥 搭建 LearnHubs

        ',9),y={href:"https://github.com/libaxuan/LearnHubs",target:"_blank",rel:"noopener noreferrer"},x=t('
      79. 接着,进入项目仓库的「Settings」>「Actions」>「General」,选中底部 Workflow permissions 中的 Read and write permissions,然后点击保存即可。如果未授权,GitHub Page 部署会由于 repo 权限不足而报错 failed with exit code 128

      80. 接下来,请进入菜单栏顶部的「Actions」>「最新的 workflow」,并点击右上方的「Re-run jobs」>「Re-run all jobs」,以重新生成网页。若部署正确,GitHub 将自动搭建 gh-page 分支页面。

        需要注意的是:如果你不需要将网页部署同步到个人服务器,请删除 .github/workflows/main.yml 中 Sync files 区块的代码,否则会出现报错 Error: Input required and not supplied: server

           ### 没有服务器的话,请删除本区块代码,防止报错 ###
            # 将页面推送到服务器,timeout 时间从默认的 1 分钟调整到 10 分钟。
            - name: 📂 Sync files
               uses: SamKirkland/FTP-Deploy-Action@v4.3.4
        diff --git a/assets/index.html-8f873296.js b/assets/index.html-8f873296.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-8f873296.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-8ffdf840.js b/assets/index.html-8ffdf840.js
        deleted file mode 100644
        index 80f47fd3..00000000
        --- a/assets/index.html-8ffdf840.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-98132e77.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-9021d972.js b/assets/index.html-9021d972.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-9021d972.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-9090a80d.js b/assets/index.html-9090a80d.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-9090a80d.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-90d69bb2.js b/assets/index.html-90d69bb2.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-90d69bb2.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-90f4fbf8.js b/assets/index.html-90f4fbf8.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-90f4fbf8.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-913a6453.js b/assets/index.html-913a6453.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-913a6453.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-91f0b406.js b/assets/index.html-91f0b406.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-91f0b406.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-9458929e.js b/assets/index.html-9458929e.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-9458929e.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-36f6231e.js b/assets/index.html-958e51a3.js
        similarity index 93%
        rename from assets/index.html-36f6231e.js
        rename to assets/index.html-958e51a3.js
        index 7f5d28f0..aa145bf5 100644
        --- a/assets/index.html-36f6231e.js
        +++ b/assets/index.html-958e51a3.js
        @@ -1 +1 @@
        -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as s,c,f as e,a as o,d as l}from"./app-98132e77.js";const r={},_=o("p",null,"面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。",-1),d={class:"catalog-display-container"};function i(m,f){const a=n("AutoCatalog");return s(),c("div",null,[_,e(" markdownlint-disable MD033 "),o("div",d,[l(a,{base:"/family/baby/"})]),e(" markdownlint-enable MD033 ")])}const b=t(r,[["render",i],["__file","index.html.vue"]]);export{b as default};
        +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as s,c,f as e,a as o,d as l}from"./app-91ee3df5.js";const r={},_=o("p",null,"面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。",-1),d={class:"catalog-display-container"};function i(m,f){const a=n("AutoCatalog");return s(),c("div",null,[_,e(" markdownlint-disable MD033 "),o("div",d,[l(a,{base:"/family/baby/"})]),e(" markdownlint-enable MD033 ")])}const b=t(r,[["render",i],["__file","index.html.vue"]]);export{b as default};
        diff --git a/assets/index.html-9726b9f0.js b/assets/index.html-9726b9f0.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-9726b9f0.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-9790d7a6.js b/assets/index.html-9790d7a6.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-9790d7a6.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-9927ea81.js b/assets/index.html-9927ea81.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-9927ea81.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-9a28a0b5.js b/assets/index.html-9a28a0b5.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-9a28a0b5.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-9e8e4907.js b/assets/index.html-9e8e4907.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-9e8e4907.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-a0cc2312.js b/assets/index.html-a0cc2312.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-a0cc2312.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-a17c7b1e.js b/assets/index.html-a17c7b1e.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-a17c7b1e.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-a2c9d27e.js b/assets/index.html-a2c9d27e.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-a2c9d27e.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-a427408f.js b/assets/index.html-a427408f.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-a427408f.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-a554354e.js b/assets/index.html-a554354e.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-a554354e.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-a5b3b764.js b/assets/index.html-a5b3b764.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-a5b3b764.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-a5c9c8ba.js b/assets/index.html-a5c9c8ba.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-a5c9c8ba.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-a63de91a.js b/assets/index.html-a63de91a.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-a63de91a.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-b0a1566d.js b/assets/index.html-b0a1566d.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-b0a1566d.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-b3be897c.js b/assets/index.html-b3be897c.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-b3be897c.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-b4a216b1.js b/assets/index.html-b4a216b1.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-b4a216b1.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-b4fd8143.js b/assets/index.html-b4fd8143.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-b4fd8143.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-b90aeddc.js b/assets/index.html-b90aeddc.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-b90aeddc.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-ba0f121f.js b/assets/index.html-ba0f121f.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-ba0f121f.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-ba502d4f.js b/assets/index.html-ba502d4f.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-ba502d4f.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-bc8b0464.js b/assets/index.html-bc8b0464.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-bc8b0464.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-bc8be382.js b/assets/index.html-bc8be382.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-bc8be382.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-bcdea27c.js b/assets/index.html-bcdea27c.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-bcdea27c.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-beb8acf1.js b/assets/index.html-beb8acf1.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-beb8acf1.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-bf113da3.js b/assets/index.html-bf113da3.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-bf113da3.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-c1838d5e.js b/assets/index.html-c1838d5e.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-c1838d5e.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-c1bec5b1.js b/assets/index.html-c1bec5b1.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-c1bec5b1.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-c23feeff.js b/assets/index.html-c23feeff.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-c23feeff.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-c4ded163.js b/assets/index.html-c4ded163.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-c4ded163.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-c55b7d8b.js b/assets/index.html-c55b7d8b.js
        new file mode 100644
        index 00000000..90062250
        --- /dev/null
        +++ b/assets/index.html-c55b7d8b.js
        @@ -0,0 +1 @@
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-c6307981.js b/assets/index.html-c6307981.js
        deleted file mode 100644
        index 46b8af99..00000000
        --- a/assets/index.html-c6307981.js
        +++ /dev/null
        @@ -1 +0,0 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-c9927eb9.js b/assets/index.html-c9927eb9.js
        new file mode 100644
        index 00000000..750e6049
        --- /dev/null
        +++ b/assets/index.html-c9927eb9.js
        @@ -0,0 +1 @@
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-91ee3df5.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default};
        diff --git a/assets/index.html-9d195b1e.js b/assets/index.html-ca2e93f0.js
        similarity index 98%
        rename from assets/index.html-9d195b1e.js
        rename to assets/index.html-ca2e93f0.js
        index ef822b02..35155a12 100644
        --- a/assets/index.html-9d195b1e.js
        +++ b/assets/index.html-ca2e93f0.js
        @@ -1 +1 @@
        -import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as n,c as i,a as o,b as e,d as c,f as t,e as l}from"./app-98132e77.js";const p={},h=o("code",null,"docker-compose.yml",-1),m={href:"http://ttrss.henry.wang/zh/#%E9%80%9A%E8%BF%87-docker-compose-%E9%83%A8%E7%BD%B2",target:"_blank",rel:"noopener noreferrer"},u=l('

        操作步骤如下:

        1. 打开「控制面板」,选择「终端机和 SNMP」,并开启 SSH 功能。
        2. 使用 putty 或其他 SSH 客户端连接到群晖,并导航到 docker-compose.yml 文件的所在目录,例如:cd /volume3/storage
        3. 在该目录下,执行 sudo docker-compose up -d 并稍等片刻以完成部署过程。
        4. 为了系统安全,完成操作后不要忘记关闭 SSH 功能。

        注意:root 用户需在命令前添加 sudo,否则可能遇到 Permission denied 的提示。另外,可以使用 sudo -i 来直接获得 root 权限。

        部署问题

        路径对照

        虽然你可以轻易地采用我所分享的 compose 设置进行安装,但对于 volumes 部分,你需要重点关注本地存储的路径选择。拿 emby 作例,电视剧路径配置可以为 /volume1/tvshows:/data/tvshows

        在这里,/data/tvshows 是 Docker 的固定内部路径,不能修改。而 /volume1/tvshows 则是你可以根据实际情况自由定义的本地路径。

        用户与组身份

        UID 和 GID 分别代表用户身份和组身份标识。在启动 Docker 容器时,默认情况下,容器进程是以 root 用户(UID 0)运行。然而,从安全的角度出发,非 root 的运行模式会更加安全,因为这可以在容器受到攻击时,降低攻击者获取主机高权限的风险。在常规的设置中,UID 和 GID 通常被设置为 1000。但例如在群晖系统中,第一个用户的 UID 实际为 1026,而 GID 则为 100。

        值得注意的是,当外部系统的用户标识与 NAS 上的 UID/GID 存在不匹配的情况时,可能会出现权限不一致的问题,进而影响到文件的正常访问权限。

        文件夹访问权限

        对于如 Emby 这类依赖外部存储资源的 Docker 服务,文件夹的访问权限是不可或缺的。一个直接的解决方案是将文件夹的权限设置为“所有人”(Everyone)。然而,这样的做法在安全性上存在隐患。一旦有人获得 Docker 的操作权限,相关文件夹很可能会被擅自更改,这只能作为一个短期的权宜之计。

        下图以 Emby 服务中的电视节目存储路径 /volume1/tvshows 为实例,为了确保正常运行,我们可以临时为该文件夹授权“所有人”权限,但建议后续寻求更安全的权限管理策略。

        ',14),_={class:"catalog-display-container"};function f(k,D){const r=a("ExternalLinkIcon"),d=a("AutoCatalog");return n(),i("div",null,[o("p",null,[e("网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。而使用 "),h,e(" 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 "),o("a",m,[e("TTRSS docker-compose 的教程"),c(r)]),e("。")]),u,t(" markdownlint-disable MD033 "),o("div",_,[c(d,{base:"/services/dockers-on-nas/"})]),t(" markdownlint-enable MD033 ")])}const b=s(p,[["render",f],["__file","index.html.vue"]]);export{b as default}; +import{_ as s}from"./plugin-vue_export-helper-c27b6911.js";import{r as a,o as n,c as i,a as o,b as e,d as c,f as t,e as l}from"./app-91ee3df5.js";const p={},h=o("code",null,"docker-compose.yml",-1),m={href:"http://ttrss.henry.wang/zh/#%E9%80%9A%E8%BF%87-docker-compose-%E9%83%A8%E7%BD%B2",target:"_blank",rel:"noopener noreferrer"},u=l('

        操作步骤如下:

        1. 打开「控制面板」,选择「终端机和 SNMP」,并开启 SSH 功能。
        2. 使用 putty 或其他 SSH 客户端连接到群晖,并导航到 docker-compose.yml 文件的所在目录,例如:cd /volume3/storage
        3. 在该目录下,执行 sudo docker-compose up -d 并稍等片刻以完成部署过程。
        4. 为了系统安全,完成操作后不要忘记关闭 SSH 功能。

        注意:root 用户需在命令前添加 sudo,否则可能遇到 Permission denied 的提示。另外,可以使用 sudo -i 来直接获得 root 权限。

        部署问题

        路径对照

        虽然你可以轻易地采用我所分享的 compose 设置进行安装,但对于 volumes 部分,你需要重点关注本地存储的路径选择。拿 emby 作例,电视剧路径配置可以为 /volume1/tvshows:/data/tvshows

        在这里,/data/tvshows 是 Docker 的固定内部路径,不能修改。而 /volume1/tvshows 则是你可以根据实际情况自由定义的本地路径。

        用户与组身份

        UID 和 GID 分别代表用户身份和组身份标识。在启动 Docker 容器时,默认情况下,容器进程是以 root 用户(UID 0)运行。然而,从安全的角度出发,非 root 的运行模式会更加安全,因为这可以在容器受到攻击时,降低攻击者获取主机高权限的风险。在常规的设置中,UID 和 GID 通常被设置为 1000。但例如在群晖系统中,第一个用户的 UID 实际为 1026,而 GID 则为 100。

        值得注意的是,当外部系统的用户标识与 NAS 上的 UID/GID 存在不匹配的情况时,可能会出现权限不一致的问题,进而影响到文件的正常访问权限。

        文件夹访问权限

        对于如 Emby 这类依赖外部存储资源的 Docker 服务,文件夹的访问权限是不可或缺的。一个直接的解决方案是将文件夹的权限设置为“所有人”(Everyone)。然而,这样的做法在安全性上存在隐患。一旦有人获得 Docker 的操作权限,相关文件夹很可能会被擅自更改,这只能作为一个短期的权宜之计。

        下图以 Emby 服务中的电视节目存储路径 /volume1/tvshows 为实例,为了确保正常运行,我们可以临时为该文件夹授权“所有人”权限,但建议后续寻求更安全的权限管理策略。

        ',14),_={class:"catalog-display-container"};function f(k,D){const r=a("ExternalLinkIcon"),d=a("AutoCatalog");return n(),i("div",null,[o("p",null,[e("网络附加存储(NAS)日益重要,它提供了一个平台,可以部署各种 Docker 服务,进而完成个人的自动化工作流程。而使用 "),h,e(" 文件进行 Docker 部署无疑是其中最为便捷的方法。具体如何使用 docker-compose,可以参考 "),o("a",m,[e("TTRSS docker-compose 的教程"),c(r)]),e("。")]),u,t(" markdownlint-disable MD033 "),o("div",_,[c(d,{base:"/services/dockers-on-nas/"})]),t(" markdownlint-enable MD033 ")])}const b=s(p,[["render",f],["__file","index.html.vue"]]);export{b as default}; diff --git a/assets/index.html-cbfe7423.js b/assets/index.html-cbfe7423.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-cbfe7423.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-ce11d60c.js b/assets/index.html-ce11d60c.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-ce11d60c.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-d229c3fa.js b/assets/index.html-d229c3fa.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-d229c3fa.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-d2347b9c.js b/assets/index.html-d2347b9c.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-d2347b9c.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-d3141988.js b/assets/index.html-d3141988.js deleted file mode 100644 index 80f47fd3..00000000 --- a/assets/index.html-d3141988.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-98132e77.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-d3bf2089.js b/assets/index.html-d3bf2089.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-d3bf2089.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-d4c6acde.js b/assets/index.html-d4c6acde.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-d4c6acde.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-d4f176e0.js b/assets/index.html-d4f176e0.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-d4f176e0.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-d8f1a95c.js b/assets/index.html-d8f1a95c.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-d8f1a95c.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-d9874309.js b/assets/index.html-d9874309.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-d9874309.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-dbb0cae8.js b/assets/index.html-dbb0cae8.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-dbb0cae8.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-dca2dcfb.js b/assets/index.html-dca2dcfb.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-dca2dcfb.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-df7a0910.js b/assets/index.html-df7a0910.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-df7a0910.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-e0a4dd71.js b/assets/index.html-e0a4dd71.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-e0a4dd71.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-e2791626.js b/assets/index.html-e2791626.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-e2791626.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-e3f050f8.js b/assets/index.html-e3f050f8.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-e3f050f8.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-e49c1afb.js b/assets/index.html-e49c1afb.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-e49c1afb.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-e5cb836c.js b/assets/index.html-e5cb836c.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-e5cb836c.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-e6008ef5.js b/assets/index.html-e6008ef5.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-e6008ef5.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-e71b2a0b.js b/assets/index.html-e71b2a0b.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-e71b2a0b.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-e770538c.js b/assets/index.html-e770538c.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-e770538c.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-e7b7c80d.js b/assets/index.html-e7b7c80d.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-e7b7c80d.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-e7e94489.js b/assets/index.html-e7e94489.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-e7e94489.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-89476074.js b/assets/index.html-e979c0d2.js similarity index 98% rename from assets/index.html-89476074.js rename to assets/index.html-e979c0d2.js index 74806349..e9ece710 100644 --- a/assets/index.html-89476074.js +++ b/assets/index.html-e979c0d2.js @@ -1 +1 @@ -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{o as e,c as i,e as r}from"./app-98132e77.js";const h={},d=r('

        展望未来

        引言

        人工智能(AI)已经成为我们生活中不可或缺的一部分,从智能手机,自动驾驶汽车,到智能家居,AI的应用无处不在。AI不仅改变了我们的生活方式,也正在改变我们对世界的理解。本文将探讨AI在画画,对话,解决问题等多个方面的应用,以及它如何让我们的生活变得更美好。

        AI与艺术:AI的绘画能力

        AI的绘画能力已经达到了令人惊叹的程度。例如,Google的DeepDream可以生成梦幻般的图像,而OpenAI的DALL-E可以根据描述生成各种各样的图像。这些AI不仅可以复制人类的绘画风格,还可以创造出全新的艺术形式。

        AI的绘画能力不仅为艺术家提供了新的创作工具,也让那些没有绘画技巧的人能够创作出美丽的艺术作品。通过AI,艺术变得更加民主化,每个人都可以成为艺术家。

        AI与交流:AI的对话能力

        AI的对话能力也在不断提高。例如,OpenAI的GPT-3和ChatGPT可以进行自然语言处理,理解和生成人类语言,进行对话,写作,甚至创作诗歌和故事。这些AI可以用于各种应用,包括客户服务,教育,娱乐,内容创作等。

        AI的对话能力不仅可以帮助我们更有效地完成各种任务,也可以让我们与机器进行更自然的交流。通过AI,我们可以更好地理解和使用语言,更有效地传达我们的思想和情感。

        AI与问题解决:AI的解决问题能力

        AI的解决问题能力也在不断提高。例如,Google的AlphaGo和DeepMind的AlphaFold已经在围棋和蛋白质折叠等复杂问题上超越了人类。这些AI不仅可以解决我们无法解决的问题,也可以帮助我们找到新的解决问题的方法。

        AI的解决问题能力不仅可以提高我们的生产力,也可以帮助我们解决一些重要的全球问题,如气候变化,疾病,贫困等。通过AI,我们可以更好地理解和改变世界。

        结论:AI让生活更美好

        总的来说,AI正在各个方面改变我们的生活,让我们的生活变得更美好。AI的绘画能力让艺术变得更加民主化,AI的对话能力让我们与机器进行更自然的交流,AI的解决问题能力帮助我们解决一些重要的全球问题。

        然而,AI的发展也带来了一些挑战,如数据隐私,工作自动化,AI伦理等。我们需要在推动AI的发展的同时,也要关注这些挑战,并寻找解决方案。

        未来,AI将继续发展,带来更多的可能性。我们期待AI能够为我们的生活带来更多的美好。

        ',16),A=[d];function n(t,I){return e(),i("div",null,A)}const c=a(h,[["render",n],["__file","index.html.vue"]]);export{c as default}; +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{o as e,c as i,e as r}from"./app-91ee3df5.js";const h={},d=r('

        展望未来

        引言

        人工智能(AI)已经成为我们生活中不可或缺的一部分,从智能手机,自动驾驶汽车,到智能家居,AI的应用无处不在。AI不仅改变了我们的生活方式,也正在改变我们对世界的理解。本文将探讨AI在画画,对话,解决问题等多个方面的应用,以及它如何让我们的生活变得更美好。

        AI与艺术:AI的绘画能力

        AI的绘画能力已经达到了令人惊叹的程度。例如,Google的DeepDream可以生成梦幻般的图像,而OpenAI的DALL-E可以根据描述生成各种各样的图像。这些AI不仅可以复制人类的绘画风格,还可以创造出全新的艺术形式。

        AI的绘画能力不仅为艺术家提供了新的创作工具,也让那些没有绘画技巧的人能够创作出美丽的艺术作品。通过AI,艺术变得更加民主化,每个人都可以成为艺术家。

        AI与交流:AI的对话能力

        AI的对话能力也在不断提高。例如,OpenAI的GPT-3和ChatGPT可以进行自然语言处理,理解和生成人类语言,进行对话,写作,甚至创作诗歌和故事。这些AI可以用于各种应用,包括客户服务,教育,娱乐,内容创作等。

        AI的对话能力不仅可以帮助我们更有效地完成各种任务,也可以让我们与机器进行更自然的交流。通过AI,我们可以更好地理解和使用语言,更有效地传达我们的思想和情感。

        AI与问题解决:AI的解决问题能力

        AI的解决问题能力也在不断提高。例如,Google的AlphaGo和DeepMind的AlphaFold已经在围棋和蛋白质折叠等复杂问题上超越了人类。这些AI不仅可以解决我们无法解决的问题,也可以帮助我们找到新的解决问题的方法。

        AI的解决问题能力不仅可以提高我们的生产力,也可以帮助我们解决一些重要的全球问题,如气候变化,疾病,贫困等。通过AI,我们可以更好地理解和改变世界。

        结论:AI让生活更美好

        总的来说,AI正在各个方面改变我们的生活,让我们的生活变得更美好。AI的绘画能力让艺术变得更加民主化,AI的对话能力让我们与机器进行更自然的交流,AI的解决问题能力帮助我们解决一些重要的全球问题。

        然而,AI的发展也带来了一些挑战,如数据隐私,工作自动化,AI伦理等。我们需要在推动AI的发展的同时,也要关注这些挑战,并寻找解决方案。

        未来,AI将继续发展,带来更多的可能性。我们期待AI能够为我们的生活带来更多的美好。

        ',16),A=[d];function n(t,I){return e(),i("div",null,A)}const c=a(h,[["render",n],["__file","index.html.vue"]]);export{c as default}; diff --git a/assets/index.html-ea0eea14.js b/assets/index.html-ea0eea14.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-ea0eea14.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-ec682506.js b/assets/index.html-ec682506.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-ec682506.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-ed938450.js b/assets/index.html-ed938450.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-ed938450.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-f1d9575b.js b/assets/index.html-f1d9575b.js new file mode 100644 index 00000000..750e6049 --- /dev/null +++ b/assets/index.html-f1d9575b.js @@ -0,0 +1 @@ +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as n,c,d as r}from"./app-91ee3df5.js";const a={};function _(s,l){const e=t("AutoCatalog");return n(),c("div",null,[r(e)])}const f=o(a,[["render",_],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-f388c4e8.js b/assets/index.html-f388c4e8.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-f388c4e8.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-f6106381.js b/assets/index.html-f6106381.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-f6106381.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-f613bdb7.js b/assets/index.html-f613bdb7.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-f613bdb7.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-f74b33b5.js b/assets/index.html-f74b33b5.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-f74b33b5.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-f86e5d56.js b/assets/index.html-f86e5d56.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-f86e5d56.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-f9960188.js b/assets/index.html-f9960188.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-f9960188.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-fa2fec3e.js b/assets/index.html-fa2fec3e.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-fa2fec3e.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-fb246946.js b/assets/index.html-fb246946.js deleted file mode 100644 index 46b8af99..00000000 --- a/assets/index.html-fb246946.js +++ /dev/null @@ -1 +0,0 @@ -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-98132e77.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/index.html-ffe336bc.js b/assets/index.html-ffe336bc.js new file mode 100644 index 00000000..90062250 --- /dev/null +++ b/assets/index.html-ffe336bc.js @@ -0,0 +1 @@ +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{o as t,c}from"./app-91ee3df5.js";const o={};function r(n,_){return t(),c("div")}const f=e(o,[["render",r],["__file","index.html.vue"]]);export{f as default}; diff --git a/assets/intro.html-a4dd8424.js b/assets/intro.html-3c27e36b.js similarity index 88% rename from assets/intro.html-a4dd8424.js rename to assets/intro.html-3c27e36b.js index ba3a314e..b70773a4 100644 --- a/assets/intro.html-a4dd8424.js +++ b/assets/intro.html-3c27e36b.js @@ -1 +1 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{o as e,c as n,a as t}from"./app-98132e77.js";const _={},s=t("p",null,"互联网广告人,",-1),c=t("p",null,"迷信新工具、新方法,",-1),l=t("p",null,"坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物,",-1),r=t("p",null,"热衷于研究开源软件和心理学理论,定期分享探索成果。",-1),i=[s,c,l,r];function a(d,p){return e(),n("div",null,i)}const h=o(_,[["render",a],["__file","intro.html.vue"]]);export{h as default}; +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{o as e,c as n,a as t}from"./app-91ee3df5.js";const _={},s=t("p",null,"互联网广告人,",-1),c=t("p",null,"迷信新工具、新方法,",-1),l=t("p",null,"坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物,",-1),r=t("p",null,"热衷于研究开源软件和心理学理论,定期分享探索成果。",-1),i=[s,c,l,r];function a(d,p){return e(),n("div",null,i)}const h=o(_,[["render",a],["__file","intro.html.vue"]]);export{h as default}; diff --git a/assets/mac.html-22676b0c.js b/assets/mac.html-6e3583fd.js similarity index 99% rename from assets/mac.html-22676b0c.js rename to assets/mac.html-6e3583fd.js index fc92c0e4..f14a9e80 100644 --- a/assets/mac.html-22676b0c.js +++ b/assets/mac.html-6e3583fd.js @@ -1,2 +1,2 @@ -import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as e,e as t}from"./app-98132e77.js";const d={},l=t(`

        macOS 是苹果公司开发的操作系统,用于苹果的 Mac 电脑系列。本文将介绍一些 macOS 的常见操作和技巧。

        快捷键

        macOS 提供了许多快捷键,可以帮助您更高效地使用电脑。以下是一些常用的快捷键:

        快捷键功能
        Command + C复制选中的内容
        Command + X剪切选中的内容
        Command + V粘贴剪贴板中的内容
        Command + Z撤销上一步操作
        Command + Shift + Z恢复上一步操作
        Command + A全选
        Command + S保存当前文件
        Command + Q退出当前应用程序
        Command + Space打开 Spotlight 搜索
        Command + Tab切换应用程序
        Command + Option + Esc强制退出当前应用程序
        Control + Command + Space打开特殊字符面板

        应用程序

        macOS 有许多内置的应用程序,以及可以从 Mac App Store 下载的其他应用程序。以下是一些常见的应用程序:

        • Safari:苹果的网页浏览器。
        • Mail:用于管理电子邮件的应用程序。
        • Calendar:用于管理日历和日程安排的应用程序。
        • Photos:用于管理和编辑照片的应用程序。
        • Pages:苹果的文字处理软件。
        • Numbers:苹果的电子表格软件。
        • Keynote:苹果的演示文稿软件。
        • iTunes:用于管理音乐、电影和其他媒体文件的应用程序(在 macOS Catalina 及更高版本中被分割为多个应用程序)。

        您还可以从 Mac App Store 下载其他应用程序,如 Microsoft Office、Adobe Creative Cloud 等。

        文件管理

        macOS 提供了 Finder,用于管理文件和文件夹。以下是一些文件管理的常用操作:

        • 在桌面上双击打开文件夹。
        • 在 Finder 中使用侧边栏快速访问常用文件夹。
        • 使用标签功能在 Finder 窗口中同时打开多个文件夹。
        • 使用 Spotlight 搜索快速找到文件和应用程序。
        • 使用 Mission Control 查看所有打开的应用程序和窗口。
        • 使用 Launchpad 查看和启动应用程序。
        • 使用 AirDrop 在 Mac 之间快速共享文件。

        截图和录屏

        macOS 提供了方便的截图和录屏工具。以下是一些常见的操作:

        • Command + Shift + 3:全屏截图。
        • Command + Shift + 4:选择区域截图。
        • Command + Shift + 5:打开截图和录屏工具栏,可以选择截图、录制全屏或录制选定区域。
        • 在截图和录屏工具栏中,可以设置延时、选择保存位置等选项。

        系统偏好设置

        macOS 的系统偏好设置允许您自定义和调整各种系统设置。以下是一些常见的设置:

        • 壁纸和屏幕保护程序:在「桌面与屏幕保护程序」中更改桌面背景和屏幕保护程序设置。
        • 声音:在「声音」中调整系统音量和通知设置。
        • 键盘:在「键盘」中调整键盘的亮度、快捷键和输入源设置。
        • 触控板:在「触控板」中调整触控板的各种手势和设置。
        • 时间机器:在「时间机器」中设置自动备份和恢复文件。
        • iCloud:在「iCloud」中管理与 iCloud 相关的设置和存储空间。

        常见问题

        应用程序无法打开

        如果您下载的应用程序无法打开,可能是因为它来自未经验证的开发者。您可以按照以下步骤解决这个问题:

        1. 在「系统偏好设置」中选择「安全性与隐私」。
        2. 在「通用」选项卡中,找到「允许从以下位置下载的应用」。
        3. 如果应用程序来自可信任的开发者,请点击锁形图标并输入管理员密码,然后选择「任何来源」。
        4. 如果应用程序来自不可信任的开发者,请联系开发者或在可信的应用商店下载应用程序。

        无法连接到 Wi-Fi

        如果您的 Mac 无法连接到 Wi-Fi 网络,可以尝试以下解决方法:

        1. 确保 Wi-Fi 路由器已经打开并正常工作。
        2. 检查 Mac 的 Wi-Fi 设置,确保 Wi-Fi 已经打开并选择了正确的网络。
        3. 尝试重新启动 Wi-Fi 路由器和 Mac。
        4. 确保您输入了正确的 Wi-Fi 密码。
        5. 如果问题仍然存在,可以尝试删除 Wi-Fi 配置文件并重新配置 Wi-Fi 连接。

        Mac 运行缓慢

        如果您的 Mac 运行缓慢,可以尝试以下方法来提高性能:

        1. 关闭不需要的应用程序和窗口。
        2. 清理桌面上的文件和文件夹。
        3. 清理垃圾文件和临时文件。
        4. 升级 macOS 版本,确保使用最新的系统版本。
        5. 增加内存(RAM)或更换固态硬盘(SSD)来提升性能。
        6. 优化启动项,禁用不必要的启动项。

        macOS 提供了许多高级操作和工具,适用于开发者进行应用程序开发和调试。以下是一些常见的高级操作和工具:

        终端(Terminal)

        终端是 macOS 中的命令行工具,可以通过它执行各种命令和脚本。对于开发者来说,终端是一个非常有用的工具,可以进行版本控制、编译代码、运行脚本等操作。您可以在「应用程序/实用工具」文件夹中找到终端应用程序。

        Homebrew

        Homebrew 是 macOS 上的包管理器,可以方便地安装和管理各种开发工具和库。通过 Homebrew,您可以快速安装和更新常用的开发工具,如 Git、Python、Node.js 等。您可以在终端中使用以下命令安装 Homebrew:

        /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
        +import{_ as i}from"./plugin-vue_export-helper-c27b6911.js";import{o as a,c as e,e as t}from"./app-91ee3df5.js";const d={},l=t(`

        macOS 是苹果公司开发的操作系统,用于苹果的 Mac 电脑系列。本文将介绍一些 macOS 的常见操作和技巧。

        快捷键

        macOS 提供了许多快捷键,可以帮助您更高效地使用电脑。以下是一些常用的快捷键:

        快捷键功能
        Command + C复制选中的内容
        Command + X剪切选中的内容
        Command + V粘贴剪贴板中的内容
        Command + Z撤销上一步操作
        Command + Shift + Z恢复上一步操作
        Command + A全选
        Command + S保存当前文件
        Command + Q退出当前应用程序
        Command + Space打开 Spotlight 搜索
        Command + Tab切换应用程序
        Command + Option + Esc强制退出当前应用程序
        Control + Command + Space打开特殊字符面板

        应用程序

        macOS 有许多内置的应用程序,以及可以从 Mac App Store 下载的其他应用程序。以下是一些常见的应用程序:

        • Safari:苹果的网页浏览器。
        • Mail:用于管理电子邮件的应用程序。
        • Calendar:用于管理日历和日程安排的应用程序。
        • Photos:用于管理和编辑照片的应用程序。
        • Pages:苹果的文字处理软件。
        • Numbers:苹果的电子表格软件。
        • Keynote:苹果的演示文稿软件。
        • iTunes:用于管理音乐、电影和其他媒体文件的应用程序(在 macOS Catalina 及更高版本中被分割为多个应用程序)。

        您还可以从 Mac App Store 下载其他应用程序,如 Microsoft Office、Adobe Creative Cloud 等。

        文件管理

        macOS 提供了 Finder,用于管理文件和文件夹。以下是一些文件管理的常用操作:

        • 在桌面上双击打开文件夹。
        • 在 Finder 中使用侧边栏快速访问常用文件夹。
        • 使用标签功能在 Finder 窗口中同时打开多个文件夹。
        • 使用 Spotlight 搜索快速找到文件和应用程序。
        • 使用 Mission Control 查看所有打开的应用程序和窗口。
        • 使用 Launchpad 查看和启动应用程序。
        • 使用 AirDrop 在 Mac 之间快速共享文件。

        截图和录屏

        macOS 提供了方便的截图和录屏工具。以下是一些常见的操作:

        • Command + Shift + 3:全屏截图。
        • Command + Shift + 4:选择区域截图。
        • Command + Shift + 5:打开截图和录屏工具栏,可以选择截图、录制全屏或录制选定区域。
        • 在截图和录屏工具栏中,可以设置延时、选择保存位置等选项。

        系统偏好设置

        macOS 的系统偏好设置允许您自定义和调整各种系统设置。以下是一些常见的设置:

        • 壁纸和屏幕保护程序:在「桌面与屏幕保护程序」中更改桌面背景和屏幕保护程序设置。
        • 声音:在「声音」中调整系统音量和通知设置。
        • 键盘:在「键盘」中调整键盘的亮度、快捷键和输入源设置。
        • 触控板:在「触控板」中调整触控板的各种手势和设置。
        • 时间机器:在「时间机器」中设置自动备份和恢复文件。
        • iCloud:在「iCloud」中管理与 iCloud 相关的设置和存储空间。

        常见问题

        应用程序无法打开

        如果您下载的应用程序无法打开,可能是因为它来自未经验证的开发者。您可以按照以下步骤解决这个问题:

        1. 在「系统偏好设置」中选择「安全性与隐私」。
        2. 在「通用」选项卡中,找到「允许从以下位置下载的应用」。
        3. 如果应用程序来自可信任的开发者,请点击锁形图标并输入管理员密码,然后选择「任何来源」。
        4. 如果应用程序来自不可信任的开发者,请联系开发者或在可信的应用商店下载应用程序。

        无法连接到 Wi-Fi

        如果您的 Mac 无法连接到 Wi-Fi 网络,可以尝试以下解决方法:

        1. 确保 Wi-Fi 路由器已经打开并正常工作。
        2. 检查 Mac 的 Wi-Fi 设置,确保 Wi-Fi 已经打开并选择了正确的网络。
        3. 尝试重新启动 Wi-Fi 路由器和 Mac。
        4. 确保您输入了正确的 Wi-Fi 密码。
        5. 如果问题仍然存在,可以尝试删除 Wi-Fi 配置文件并重新配置 Wi-Fi 连接。

        Mac 运行缓慢

        如果您的 Mac 运行缓慢,可以尝试以下方法来提高性能:

        1. 关闭不需要的应用程序和窗口。
        2. 清理桌面上的文件和文件夹。
        3. 清理垃圾文件和临时文件。
        4. 升级 macOS 版本,确保使用最新的系统版本。
        5. 增加内存(RAM)或更换固态硬盘(SSD)来提升性能。
        6. 优化启动项,禁用不必要的启动项。

        macOS 提供了许多高级操作和工具,适用于开发者进行应用程序开发和调试。以下是一些常见的高级操作和工具:

        终端(Terminal)

        终端是 macOS 中的命令行工具,可以通过它执行各种命令和脚本。对于开发者来说,终端是一个非常有用的工具,可以进行版本控制、编译代码、运行脚本等操作。您可以在「应用程序/实用工具」文件夹中找到终端应用程序。

        Homebrew

        Homebrew 是 macOS 上的包管理器,可以方便地安装和管理各种开发工具和库。通过 Homebrew,您可以快速安装和更新常用的开发工具,如 Git、Python、Node.js 等。您可以在终端中使用以下命令安装 Homebrew:

        /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
         

        安装完成后,您可以使用 brew install 命令来安装其他软件包,例如 brew install git

        Xcode

        Xcode 是苹果官方提供的集成开发环境(IDE),用于开发 macOS 和 iOS 应用程序。它包含了一套强大的工具和调试器,可以帮助开发者编写、测试和调试应用程序。您可以从 Mac App Store 下载和安装 Xcode。

        调试工具

        macOS 提供了一些强大的调试工具,用于调试和分析应用程序的性能和行为。

        • Instruments:这是 Xcode 中的一个工具,用于分析应用程序的性能和内存使用情况,帮助开发者进行性能优化和内存管理。
        • Console:这是一个日志工具,用于查看应用程序的日志输出。您可以在「应用程序/实用工具」文件夹中找到 Console 应用程序。
        • Network Link Conditioner:这是一个网络模拟工具,可以模拟不同网络条件下的应用程序行为,以测试应用程序在不同网络环境下的性能和稳定性。您可以在「系统偏好设置/网络」中找到 Network Link Conditioner。

        命令行工具

        macOS 内置了许多实用的命令行工具,可以帮助开发者进行各种操作。

        • Git:macOS 自带了 Git,可以使用命令行进行版本控制操作。您可以在终端中使用 git 命令来执行 Git 操作。
        • SSH:macOS 支持 SSH(Secure Shell)协议,可以通过终端使用 SSH 连接到远程服务器或设备。
        • Vim 和 Emacs:macOS 内置了 Vim 和 Emacs,这是两个流行的文本编辑器,适用于开发者进行代码编辑。
        `,42),r=[l];function o(n,h){return a(),e("div",null,r)}const s=i(d,[["render",o],["__file","mac.html.vue"]]);export{s as default}; diff --git a/assets/memos.html-874d0edc.js b/assets/memos.html-773ee119.js similarity index 95% rename from assets/memos.html-874d0edc.js rename to assets/memos.html-773ee119.js index e49d22d6..16856284 100644 --- a/assets/memos.html-874d0edc.js +++ b/assets/memos.html-773ee119.js @@ -1,4 +1,4 @@ -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as l,c,a as n,b as s,d as a,e as i}from"./app-98132e77.js";const p={},r={href:"https://github.com/usememos/memos",target:"_blank",rel:"noopener noreferrer"},m=i(`
        version: "3.0"
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as l,c,a as n,b as s,d as a,e as i}from"./app-91ee3df5.js";const p={},r={href:"https://github.com/usememos/memos",target:"_blank",rel:"noopener noreferrer"},m=i(`
        version: "3.0"
         services:
           memos:
             image: neosmemo/memos:latest
        diff --git a/assets/mt-photos.html-de0affec.js b/assets/mt-photos.html-b81d96ca.js
        similarity index 97%
        rename from assets/mt-photos.html-de0affec.js
        rename to assets/mt-photos.html-b81d96ca.js
        index 853a81d4..0754fe3f 100644
        --- a/assets/mt-photos.html-de0affec.js
        +++ b/assets/mt-photos.html-b81d96ca.js
        @@ -1,4 +1,4 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o,c as p,a as n,b as s,d as l,e as c}from"./app-98132e77.js";const i={},u={href:"https://mtmt.tech/",target:"_blank",rel:"noopener noreferrer"},r=c(`

        我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,在使用 MT Photos 时,我发现网页端的视频播放经常出现问题,有些视频可以通过切换至全屏模式来播放,而有些视频只显示 1 秒然后无法继续播放。我向开发者反馈了这个问题,对方表示将在后续解决,但没有给出具体的时间表。目前,我只能让家人安装应用来解决视频播放的问题。

        version: "3"
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o,c as p,a as n,b as s,d as l,e as c}from"./app-91ee3df5.js";const i={},u={href:"https://mtmt.tech/",target:"_blank",rel:"noopener noreferrer"},r=c(`

        我选择购买的原因是因为它允许通过网页分享特定的照片集。这个功能大大简化了与家人分享宝宝照片和视频的过程。然而,在使用 MT Photos 时,我发现网页端的视频播放经常出现问题,有些视频可以通过切换至全屏模式来播放,而有些视频只显示 1 秒然后无法继续播放。我向开发者反馈了这个问题,对方表示将在后续解决,但没有给出具体的时间表。目前,我只能让家人安装应用来解决视频播放的问题。

        version: "3"
         
         services:
           mtphotos:
        diff --git a/assets/navidrome.html-fe5f5c0c.js b/assets/navidrome.html-5966ed82.js
        similarity index 97%
        rename from assets/navidrome.html-fe5f5c0c.js
        rename to assets/navidrome.html-5966ed82.js
        index 13f43884..c563fe44 100644
        --- a/assets/navidrome.html-fe5f5c0c.js
        +++ b/assets/navidrome.html-5966ed82.js
        @@ -1,4 +1,4 @@
        -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as l,c as i,a as s,b as n,d as e,e as c}from"./app-98132e77.js";const p={},r=s("p",null,"Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。",-1),u=s("p",null,"鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。",-1),d={href:"https://www.navidrome.org/docs/installation/docker/",target:"_blank",rel:"noopener noreferrer"},m=c(`
        version: "3"
        +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as l,c as i,a as s,b as n,d as e,e as c}from"./app-91ee3df5.js";const p={},r=s("p",null,"Navidrome 为开源自托管音乐服务器,提供音频流媒体服务。",-1),u=s("p",null,"鉴于 Roon 的定价较高且 Emby 和 Plex 主要针对视频,Navidrome 成为了一个免费的选择。它支持广泛的音频格式,如 MP3、FLAC、AAC 和 OGG 等,并能有效地为多个用户管理其音乐库,确保每位用户的体验互不冲突。",-1),d={href:"https://www.navidrome.org/docs/installation/docker/",target:"_blank",rel:"noopener noreferrer"},m=c(`
        version: "3"
         services:
           navidrome:
             image: deluan/navidrome:latest
        diff --git a/assets/newborn.html-1916ccca.js b/assets/newborn.html-1a6ae915.js
        similarity index 98%
        rename from assets/newborn.html-1916ccca.js
        rename to assets/newborn.html-1a6ae915.js
        index 3efbcb55..10e2537c 100644
        --- a/assets/newborn.html-1916ccca.js
        +++ b/assets/newborn.html-1a6ae915.js
        @@ -1 +1 @@
        -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as s,c as r,a as e,b as o,d as i,e as l}from"./app-98132e77.js";const c={},p=l('

        坚持母乳喂养

        为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》)

        • 母乳喂养是婴儿出生后最佳喂养方式。
        • 婴儿出生后不要喂任何母乳以外的食物。
        • 应坚持纯母乳喂养至婴儿满 6 月龄。
        • 坚持让婴儿直接吸吮母乳,只要母婴不分开,就不用奶瓶喂哺。
        • 不宜用母乳颜色、质地以及母乳成分测定结果来判定母乳营养价值。
        • 婴儿哭泣诱导母亲释放催产素。

        宝宝醒了吗

        初为人父时,我会因宝宝的任何小动静而紧张,不断跑过去查看。但其实,即使宝宝有些身体动作,也不代表她真的醒来。因此,无需因宝宝的轻微动静就去打扰她。[1]

        宝宝哭闹的原因

        宝宝刚出生时,月嫂和家里老人都有个说法是不能惯着她,让宝宝哭一会。但是,哭闹是婴儿表达饥饿信号的最晚表现

        在因饥饿而哭闹之前,婴儿可能已经出现以下表现:张嘴,吸手指、嘴唇或舌头;从睡眠中醒来,转动头脑,有好似寻找乳房的倾向;身体活动增多,呈现烦躁、哭闹等不安状态。识别出婴儿饥饿表现后,应立即哺喂。婴儿饥饿的后续表现才是哭闹。所以,根本不存在惯不惯着的问题,人家哭的时候,已经是饿惨了,请立即喂奶。

        喂养的时长和频次由婴儿进食意愿和需求决定。不要因为所谓的惯着而让婴幼儿哭闹。通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。

        新生儿胃容量小,胃排空较快,易感到饥饿,因此需多次哺乳满足其进食需要,伴随成长发育,一般喂奶间隔从 1 ~ 2 小时逐渐延长至 3 小时左右。3 个月后,婴儿胃容量增大,进食习惯趋于规律,同时夜间睡眠时间延长,夜间喂奶次数也可逐渐减少。

        除了饥饿的表现外,婴儿胃肠道不适或其他身体不舒服,甚至婴儿情绪不佳也会表现出不同状态的哭闹,而非饥饿原因引起的哭闹,显然无法通过哺喂得到完全安抚。应考虑非饥饿原因,比如大小便、体温等。

        婴儿的胃容量逐渐增加,因此其进食需求也会发生变化,回应式喂养是指符合婴儿进食特性的喂养方式,强调喂养的时长和频次由婴儿进食意愿和需求决定,包括早期新生儿的按需喂养方式,及日后逐渐形成的规律喂养方式。所谓回应式喂养,也称顺应喂养,就是要及时地对婴儿发出的进食需求,迅速做出喂养回应。按需喂养是指通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。

        婴幼儿哭闹是有具体需求的,先满足她的需求让她心情平静下来,哭闹时不要做排气操等行为。

        月嫂:助手还是潜在风险?

        月嫂为新父母提供宝贵的育儿知识,但务必确认其是否携带药物。若有,应要求其将药物存放于宝妈房中。

        我们第一个月嫂是从老家来的,做事利索,宝宝在她手上也特别乖。但是来了一周后,宝宝突然有两天睡得很沉,家人虽然奇怪,但都不清楚原因。然而,在随后一天的夜里,我丈母娘查监控时,突然看到月嫂为宝宝喂了药物。监控视频显示,月嫂确实有疑似给宝宝喂食的举动,且宝宝展现出吞咽的反应。当晚我们匆忙前往儿童医院,医生诊断宝宝的黄疸值为 12,并告知这一指数高可能导致嗜睡。考虑到为宝宝抽血的风险,我们没有进行进一步的检验。但当晚,宝宝整夜都未醒来,考虑到新生儿的胃容量只有 100-200ml,超过 3 小时便会感到饥饿。这更加加深了我们的怀疑,随后就辞退了这位月嫂。

        在随后的红房子医院复查中,我得知黄疸值需超过 20 才会导致嗜睡,婴儿的安眠用药非常具有时效性,很快就无法检测到。当时,监控于 22:40 捕捉到疑似喂药动作,但第一次去的医院没有新生儿门诊,直到凌晨 1 点才抵达能够进行此检测的医院。但儿童医院可能因为深夜不愿意为宝宝抽血,故意诊断为黄疸高嗜睡。

        第二个月嫂也带了药,而且相当懒惰。宝妈还在喂奶,月嫂 9 点就睡了。当晚我就打电话让中介换人,按一天工资给她结了。

        第三个月嫂的态度非常积极,她明确表示不会携带药物,并允许我们检查她的物品。她还精心准备了美味的月子餐,让宝妈可以分享照片,从而提振心情。好的心情对坐月子的母亲来说极为重要。

        为确保婴儿安全,建议在婴儿区域安装至少两个监控摄像头:一个针对婴儿床,另一个涵盖婴儿活动区。我最初只装了一个,发生疑似喂药事件后,才又增设了一个。与月嫂初次见面时,建议明确告知她家里有摄像头,一般她们都能接受。


        ',21),h={class:"footnotes"},d={class:"footnotes-list"},f={id:"footnote1",class:"footnote-item"},_={href:"https://www.bilibili.com/bangumi/play/ep272469",target:"_blank",rel:"noopener noreferrer"},u=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function b(m,k){const t=n("ExternalLinkIcon");return s(),r("div",null,[p,e("section",h,[e("ol",d,[e("li",f,[e("p",null,[e("a",_,[o("母性科学"),i(t)]),o(),u])])])])])}const w=a(c,[["render",b],["__file","newborn.html.vue"]]);export{w as default}; +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as n,o as s,c as r,a as e,b as o,d as i,e as l}from"./app-91ee3df5.js";const c={},p=l('

        坚持母乳喂养

        为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》)

        • 母乳喂养是婴儿出生后最佳喂养方式。
        • 婴儿出生后不要喂任何母乳以外的食物。
        • 应坚持纯母乳喂养至婴儿满 6 月龄。
        • 坚持让婴儿直接吸吮母乳,只要母婴不分开,就不用奶瓶喂哺。
        • 不宜用母乳颜色、质地以及母乳成分测定结果来判定母乳营养价值。
        • 婴儿哭泣诱导母亲释放催产素。

        宝宝醒了吗

        初为人父时,我会因宝宝的任何小动静而紧张,不断跑过去查看。但其实,即使宝宝有些身体动作,也不代表她真的醒来。因此,无需因宝宝的轻微动静就去打扰她。[1]

        宝宝哭闹的原因

        宝宝刚出生时,月嫂和家里老人都有个说法是不能惯着她,让宝宝哭一会。但是,哭闹是婴儿表达饥饿信号的最晚表现

        在因饥饿而哭闹之前,婴儿可能已经出现以下表现:张嘴,吸手指、嘴唇或舌头;从睡眠中醒来,转动头脑,有好似寻找乳房的倾向;身体活动增多,呈现烦躁、哭闹等不安状态。识别出婴儿饥饿表现后,应立即哺喂。婴儿饥饿的后续表现才是哭闹。所以,根本不存在惯不惯着的问题,人家哭的时候,已经是饿惨了,请立即喂奶。

        喂养的时长和频次由婴儿进食意愿和需求决定。不要因为所谓的惯着而让婴幼儿哭闹。通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。

        新生儿胃容量小,胃排空较快,易感到饥饿,因此需多次哺乳满足其进食需要,伴随成长发育,一般喂奶间隔从 1 ~ 2 小时逐渐延长至 3 小时左右。3 个月后,婴儿胃容量增大,进食习惯趋于规律,同时夜间睡眠时间延长,夜间喂奶次数也可逐渐减少。

        除了饥饿的表现外,婴儿胃肠道不适或其他身体不舒服,甚至婴儿情绪不佳也会表现出不同状态的哭闹,而非饥饿原因引起的哭闹,显然无法通过哺喂得到完全安抚。应考虑非饥饿原因,比如大小便、体温等。

        婴儿的胃容量逐渐增加,因此其进食需求也会发生变化,回应式喂养是指符合婴儿进食特性的喂养方式,强调喂养的时长和频次由婴儿进食意愿和需求决定,包括早期新生儿的按需喂养方式,及日后逐渐形成的规律喂养方式。所谓回应式喂养,也称顺应喂养,就是要及时地对婴儿发出的进食需求,迅速做出喂养回应。按需喂养是指通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。

        婴幼儿哭闹是有具体需求的,先满足她的需求让她心情平静下来,哭闹时不要做排气操等行为。

        月嫂:助手还是潜在风险?

        月嫂为新父母提供宝贵的育儿知识,但务必确认其是否携带药物。若有,应要求其将药物存放于宝妈房中。

        我们第一个月嫂是从老家来的,做事利索,宝宝在她手上也特别乖。但是来了一周后,宝宝突然有两天睡得很沉,家人虽然奇怪,但都不清楚原因。然而,在随后一天的夜里,我丈母娘查监控时,突然看到月嫂为宝宝喂了药物。监控视频显示,月嫂确实有疑似给宝宝喂食的举动,且宝宝展现出吞咽的反应。当晚我们匆忙前往儿童医院,医生诊断宝宝的黄疸值为 12,并告知这一指数高可能导致嗜睡。考虑到为宝宝抽血的风险,我们没有进行进一步的检验。但当晚,宝宝整夜都未醒来,考虑到新生儿的胃容量只有 100-200ml,超过 3 小时便会感到饥饿。这更加加深了我们的怀疑,随后就辞退了这位月嫂。

        在随后的红房子医院复查中,我得知黄疸值需超过 20 才会导致嗜睡,婴儿的安眠用药非常具有时效性,很快就无法检测到。当时,监控于 22:40 捕捉到疑似喂药动作,但第一次去的医院没有新生儿门诊,直到凌晨 1 点才抵达能够进行此检测的医院。但儿童医院可能因为深夜不愿意为宝宝抽血,故意诊断为黄疸高嗜睡。

        第二个月嫂也带了药,而且相当懒惰。宝妈还在喂奶,月嫂 9 点就睡了。当晚我就打电话让中介换人,按一天工资给她结了。

        第三个月嫂的态度非常积极,她明确表示不会携带药物,并允许我们检查她的物品。她还精心准备了美味的月子餐,让宝妈可以分享照片,从而提振心情。好的心情对坐月子的母亲来说极为重要。

        为确保婴儿安全,建议在婴儿区域安装至少两个监控摄像头:一个针对婴儿床,另一个涵盖婴儿活动区。我最初只装了一个,发生疑似喂药事件后,才又增设了一个。与月嫂初次见面时,建议明确告知她家里有摄像头,一般她们都能接受。


        ',21),h={class:"footnotes"},d={class:"footnotes-list"},f={id:"footnote1",class:"footnote-item"},_={href:"https://www.bilibili.com/bangumi/play/ep272469",target:"_blank",rel:"noopener noreferrer"},u=e("a",{href:"#footnote-ref1",class:"footnote-backref"},"↩︎",-1);function b(m,k){const t=n("ExternalLinkIcon");return s(),r("div",null,[p,e("section",h,[e("ol",d,[e("li",f,[e("p",null,[e("a",_,[o("母性科学"),i(t)]),o(),u])])])])])}const w=a(c,[["render",b],["__file","newborn.html.vue"]]);export{w as default}; diff --git a/assets/pageview-fb784a91.js b/assets/pageview-92bd2153.js similarity index 55% rename from assets/pageview-fb784a91.js rename to assets/pageview-92bd2153.js index 223039ef..228e36b9 100644 --- a/assets/pageview-fb784a91.js +++ b/assets/pageview-92bd2153.js @@ -1 +1 @@ -import{a5 as n}from"./app-98132e77.js";const r=async()=>{try{const{pageviewCount:t}=await n(()=>import("./app-98132e77.js").then(e=>e.a6),[]);return t({serverURL:"https://waline.gpt-vip.top"})}catch{console.error("@waline/client is not installed!");return}};export{r as updatePageview}; +import{a5 as n}from"./app-91ee3df5.js";const r=async()=>{try{const{pageviewCount:t}=await n(()=>import("./app-91ee3df5.js").then(e=>e.a6),[]);return t({serverURL:"https://waline.gpt-vip.top"})}catch{console.error("@waline/client is not installed!");return}};export{r as updatePageview}; diff --git a/assets/qinglong.html-3717fa72.js b/assets/qinglong.html-9d200df1.js similarity index 97% rename from assets/qinglong.html-3717fa72.js rename to assets/qinglong.html-9d200df1.js index 6a8232ea..6b8fa875 100644 --- a/assets/qinglong.html-3717fa72.js +++ b/assets/qinglong.html-9d200df1.js @@ -1,4 +1,4 @@ -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as l,c,a as s,b as n,d as a,e as i}from"./app-98132e77.js";const p={},r={href:"https://github.com/whyour/qinglong",target:"_blank",rel:"noopener noreferrer"},u={href:"https://blog.csdn.net/u011027547/article/details/130703685",target:"_blank",rel:"noopener noreferrer"},d=i(`
        # https://github.com/whyour/qinglong/blob/develop/docker/docker-compose.yml
        +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as l,c,a as s,b as n,d as a,e as i}from"./app-91ee3df5.js";const p={},r={href:"https://github.com/whyour/qinglong",target:"_blank",rel:"noopener noreferrer"},u={href:"https://blog.csdn.net/u011027547/article/details/130703685",target:"_blank",rel:"noopener noreferrer"},d=i(`
        # https://github.com/whyour/qinglong/blob/develop/docker/docker-compose.yml
         version: '2'
         services:
           web:
        diff --git a/assets/reader.html-d1bdfb2f.js b/assets/reader.html-20016b4c.js
        similarity index 98%
        rename from assets/reader.html-d1bdfb2f.js
        rename to assets/reader.html-20016b4c.js
        index 569d1f56..77f286a3 100644
        --- a/assets/reader.html-d1bdfb2f.js
        +++ b/assets/reader.html-20016b4c.js
        @@ -1,4 +1,4 @@
        -import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as c,c as o,a as n,b as s,d as i,e as l}from"./app-98132e77.js";const p={},r={href:"https://github.com/hectorqin/reader",target:"_blank",rel:"noopener noreferrer"},m=l(`

        reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、EPUB、UMD 和 PDF 格式,以及 RSS 订阅。reader 还提供定时书架更新、并发搜书功能,以及本地书仓,同时支持 Kindle 阅读,满足多样化的阅读需求。

        # https://github.com/hectorqin/reader/blob/master/docker-compose.yml
        +import{_ as a}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as c,c as o,a as n,b as s,d as i,e as l}from"./app-91ee3df5.js";const p={},r={href:"https://github.com/hectorqin/reader",target:"_blank",rel:"noopener noreferrer"},m=l(`

        reader 提供了书源管理、书架布局定制、强大的搜索功能、书海浏览、阅读体验的优化,支持移动端适配、换源、多种翻页方式和手势支持。用户可以自定义主题和样式,进行 WebDAV 同步,实施文字替换过滤,甚至听书功能(部分浏览器支持)。此外,它支持书籍的导入和分组,包括本地 TXT、EPUB、UMD 和 PDF 格式,以及 RSS 订阅。reader 还提供定时书架更新、并发搜书功能,以及本地书仓,同时支持 Kindle 阅读,满足多样化的阅读需求。

        # https://github.com/hectorqin/reader/blob/master/docker-compose.yml
         version: '3.1'
         services:
         # reader 在线阅读
        diff --git a/assets/reverse-proxy.html-907efd8b.js b/assets/reverse-proxy.html-8496c63c.js
        similarity index 98%
        rename from assets/reverse-proxy.html-907efd8b.js
        rename to assets/reverse-proxy.html-8496c63c.js
        index 84748792..3d51447f 100644
        --- a/assets/reverse-proxy.html-907efd8b.js
        +++ b/assets/reverse-proxy.html-8496c63c.js
        @@ -1,4 +1,4 @@
        -import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as c,o as p,c as i,a as n,b as s,d as e,e as t}from"./app-98132e77.js";const l={},r=n("p",null,"反向代理是一种方便的后端工具,其作用是拦截所有传入请求并进行统一的转发管理。在 Docker 容器管理领域,使用反向代理可以让你摆脱繁琐的端口号记忆,只需通过不同的域名即可访问特定的 Docker 服务。常见的反向代理工具包括 Nginx Proxy Manager、nginxWebUI、Caddy 和 Lucky。",-1),d=n("h2",{id:"nginx-proxy-manager",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#nginx-proxy-manager","aria-hidden":"true"},"#"),s(" Nginx Proxy Manager")],-1),u={href:"https://github.com/jlesage/docker-nginx-proxy-manager",target:"_blank",rel:"noopener noreferrer"},k={href:"https://www.nginxwebui.cn/product.html",target:"_blank",rel:"noopener noreferrer"},v=t(`
        version: '3.8'
        +import{_ as o}from"./plugin-vue_export-helper-c27b6911.js";import{r as c,o as p,c as i,a as n,b as s,d as e,e as t}from"./app-91ee3df5.js";const l={},r=n("p",null,"反向代理是一种方便的后端工具,其作用是拦截所有传入请求并进行统一的转发管理。在 Docker 容器管理领域,使用反向代理可以让你摆脱繁琐的端口号记忆,只需通过不同的域名即可访问特定的 Docker 服务。常见的反向代理工具包括 Nginx Proxy Manager、nginxWebUI、Caddy 和 Lucky。",-1),d=n("h2",{id:"nginx-proxy-manager",tabindex:"-1"},[n("a",{class:"header-anchor",href:"#nginx-proxy-manager","aria-hidden":"true"},"#"),s(" Nginx Proxy Manager")],-1),u={href:"https://github.com/jlesage/docker-nginx-proxy-manager",target:"_blank",rel:"noopener noreferrer"},k={href:"https://www.nginxwebui.cn/product.html",target:"_blank",rel:"noopener noreferrer"},v=t(`
        version: '3.8'
         services:
           app:
             image: 'jlesage/nginx-proxy-manager:latest'
        diff --git a/assets/stirling-pdf.html-b8401c61.js b/assets/stirling-pdf.html-a813ecba.js
        similarity index 95%
        rename from assets/stirling-pdf.html-b8401c61.js
        rename to assets/stirling-pdf.html-a813ecba.js
        index 6953b90d..c2bcd238 100644
        --- a/assets/stirling-pdf.html-b8401c61.js
        +++ b/assets/stirling-pdf.html-a813ecba.js
        @@ -1,4 +1,4 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o,c as l,a as n,b as s,d as i,e as c}from"./app-98132e77.js";const p={},r={href:"https://github.com/Frooodle/Stirling-PDF",target:"_blank",rel:"noopener noreferrer"},u=c(`
        version: '3.3'
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o,c as l,a as n,b as s,d as i,e as c}from"./app-91ee3df5.js";const p={},r={href:"https://github.com/Frooodle/Stirling-PDF",target:"_blank",rel:"noopener noreferrer"},u=c(`
        version: '3.3'
         services:
           stirling-pdf:
             image: frooodle/s-pdf:latest
        diff --git a/assets/syncthing.html-09d50c3f.js b/assets/syncthing.html-51185d0e.js
        similarity index 96%
        rename from assets/syncthing.html-09d50c3f.js
        rename to assets/syncthing.html-51185d0e.js
        index 8c48eb77..1dc47b9b 100644
        --- a/assets/syncthing.html-09d50c3f.js
        +++ b/assets/syncthing.html-51185d0e.js
        @@ -1,4 +1,4 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as c,c as p,a as n,b as s,d as i,e as o}from"./app-98132e77.js";const l={},u={href:"https://github.com/syncthing/syncthing",target:"_blank",rel:"noopener noreferrer"},r=o(`

        Syncthing 与百度网盘、坚果云等第三方网盘最大的不同在于,它实现了多设备间的实时同步。百度网盘同步只支持 PC 端,在手机端无法同步,只能在需要看的时候手动点击下载,没有自动化;坚果云在手机端即使设置了离线收藏,下载的文件也在内部空间,其他应用无法访问。

        如果你不希望将文件托管到第三方,或是需要将文件实时同步到多个设备,则可以需要 Syncthing。

        version: "3"
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o as c,c as p,a as n,b as s,d as i,e as o}from"./app-91ee3df5.js";const l={},u={href:"https://github.com/syncthing/syncthing",target:"_blank",rel:"noopener noreferrer"},r=o(`

        Syncthing 与百度网盘、坚果云等第三方网盘最大的不同在于,它实现了多设备间的实时同步。百度网盘同步只支持 PC 端,在手机端无法同步,只能在需要看的时候手动点击下载,没有自动化;坚果云在手机端即使设置了离线收藏,下载的文件也在内部空间,其他应用无法访问。

        如果你不希望将文件托管到第三方,或是需要将文件实时同步到多个设备,则可以需要 Syncthing。

        version: "3"
         services:
           syncthing:
             image: syncthing/syncthing
        diff --git a/assets/tachidesk.html-adfc5efa.js b/assets/tachidesk.html-e7f059a8.js
        similarity index 97%
        rename from assets/tachidesk.html-adfc5efa.js
        rename to assets/tachidesk.html-e7f059a8.js
        index 9bc79c0a..d3a4c8d3 100644
        --- a/assets/tachidesk.html-adfc5efa.js
        +++ b/assets/tachidesk.html-e7f059a8.js
        @@ -1,4 +1,4 @@
        -import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as c,c as i,a as s,b as n,d as e,e as l}from"./app-98132e77.js";const p={},r={href:"https://github.com/Suwayomi/docker-tachidesk",target:"_blank",rel:"noopener noreferrer"},u=s("p",null,"开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extensions,点右上角的 Enabled Languages 按钮,设置为中文源,然后会在页面底部发现中文漫画源。安装源后,进入 Souces 中点击进入对应源。",-1),d={href:"https://github.com/tachiyomiorg/tachiyomi",target:"_blank",rel:"noopener noreferrer"},k={href:"https://github.com/Haleydu/Cimoc",target:"_blank",rel:"noopener noreferrer"},m=l(`
        version: '3.7'
        +import{_ as t}from"./plugin-vue_export-helper-c27b6911.js";import{r as o,o as c,c as i,a as s,b as n,d as e,e as l}from"./app-91ee3df5.js";const p={},r={href:"https://github.com/Suwayomi/docker-tachidesk",target:"_blank",rel:"noopener noreferrer"},u=s("p",null,"开源的漫画阅读应用,通过安装扩展插件,可以方便地订阅并聚合漫画源。使用前,需进入 Extensions,点右上角的 Enabled Languages 按钮,设置为中文源,然后会在页面底部发现中文漫画源。安装源后,进入 Souces 中点击进入对应源。",-1),d={href:"https://github.com/tachiyomiorg/tachiyomi",target:"_blank",rel:"noopener noreferrer"},k={href:"https://github.com/Haleydu/Cimoc",target:"_blank",rel:"noopener noreferrer"},m=l(`
        version: '3.7'
         services:
           tachidesk-docker:
             image: ghcr.io/suwayomi/tachidesk:latest
        diff --git a/assets/uptime-kuma.html-cb555b65.js b/assets/uptime-kuma.html-2ecb69d8.js
        similarity index 97%
        rename from assets/uptime-kuma.html-cb555b65.js
        rename to assets/uptime-kuma.html-2ecb69d8.js
        index e181ab9c..201df8db 100644
        --- a/assets/uptime-kuma.html-cb555b65.js
        +++ b/assets/uptime-kuma.html-2ecb69d8.js
        @@ -1,4 +1,4 @@
        -import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o,c,a as n,b as a,d as p,e as l}from"./app-98132e77.js";const i={},u={href:"https://github.com/louislam/uptime-kuma",target:"_blank",rel:"noopener noreferrer"},r=l(`
        version: '3.8'
        +import{_ as e}from"./plugin-vue_export-helper-c27b6911.js";import{r as t,o,c,a as n,b as a,d as p,e as l}from"./app-91ee3df5.js";const i={},u={href:"https://github.com/louislam/uptime-kuma",target:"_blank",rel:"noopener noreferrer"},r=l(`
        version: '3.8'
         
         services:
           uptime-kuma:
        diff --git a/blog.html b/blog.html
        index 709c74ab..b27b5ae8 100644
        --- a/blog.html
        +++ b/blog.html
        @@ -38,7 +38,7 @@
               }
             
             
        -    
        +    
             
         	  
        @@ -77,10 +77,10 @@ 

        主界面

        OBS 界面看起来有些复杂,但可以分为菜单栏、预览区、主按钮区和运行状态四个区块。日常使用中,我们只需要接触主按钮区,它包括场景、来源、混音器、转场特效和控制按钮。


        ...工具OBS直播大约 9 分钟
        2
        3
        4
        5
        6
        - + - - - + diff --git a/category/index.html b/category/index.html index 0afdbb19..24bdace0 100644 --- a/category/index.html +++ b/category/index.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@ - + - - - + diff --git "a/category/\345\215\232\345\256\242/index.html" "b/category/\345\215\232\345\256\242/index.html" index 655c7071..506b6ac7 100644 --- "a/category/\345\215\232\345\256\242/index.html" +++ "b/category/\345\215\232\345\256\242/index.html" @@ -38,7 +38,7 @@ } - + @@ -93,10 +93,10 @@

        搭建流程


      ...博客JekyllGithub建站小于 1 分钟
    - + - - - + diff --git "a/category/\345\244\264\350\204\221\351\251\277\347\253\231/index.html" "b/category/\345\244\264\350\204\221\351\251\277\347\253\231/index.html" index 509f478e..f91e5d25 100644 --- "a/category/\345\244\264\350\204\221\351\251\277\347\253\231/index.html" +++ "b/category/\345\244\264\350\204\221\351\251\277\347\253\231/index.html" @@ -38,7 +38,7 @@ } - + @@ -74,10 +74,10 @@

    理论支撑


    ...头脑驿站原则批评与自我批评大约 7 分钟
    - + - - - + diff --git "a/category/\345\267\245\345\205\267/index.html" "b/category/\345\267\245\345\205\267/index.html" index 4f1c72f4..74bd6228 100644 --- "a/category/\345\267\245\345\205\267/index.html" +++ "b/category/\345\267\245\345\205\267/index.html" @@ -38,7 +38,7 @@ } - + @@ -88,10 +88,10 @@

    直播定位

  • 解决目标用户什么问题:排遣寂寞?选购答疑?
  • 定位完成后,把自己放在目标观众角度进行换位思考,调整直播定位。


    ...工具直播大约 5 分钟
    2
    3
    - + - - - + diff --git "a/category/\346\234\215\345\212\241\345\231\250/index.html" "b/category/\346\234\215\345\212\241\345\231\250/index.html" index a5356aa1..df6df50b 100644 --- "a/category/\346\234\215\345\212\241\345\231\250/index.html" +++ "b/category/\346\234\215\345\212\241\345\231\250/index.html" @@ -38,7 +38,7 @@ } - + @@ -54,10 +54,10 @@

    CDN 的全称是 Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN 系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet 网络拥挤的状况,提高用户访问网站的响应速度。

    国内 CDN 有阿里云、腾讯、百度、网宿、七牛云、又拍云等。


    ...服务器CDN建站大约 2 分钟
    - + - - - + diff --git "a/category/\347\263\273\347\273\237/index.html" "b/category/\347\263\273\347\273\237/index.html" index 10f9f258..8c2df42c 100644 --- "a/category/\347\263\273\347\273\237/index.html" +++ "b/category/\347\263\273\347\273\237/index.html" @@ -38,7 +38,7 @@ } - + @@ -117,10 +117,10 @@

    解决方法

    最后进入安装包运行 setup.exe 安装正常。


    ...系统office大约 2 分钟
    - + - - - + diff --git "a/category/\347\275\221\347\273\234/index.html" "b/category/\347\275\221\347\273\234/index.html" index 23813333..41330568 100644 --- "a/category/\347\275\221\347\273\234/index.html" +++ "b/category/\347\275\221\347\273\234/index.html" @@ -38,7 +38,7 @@ } - + @@ -125,10 +125,10 @@

    光猫超级密码破解


    ...网络光猫大约 1 分钟
    - + - - - + diff --git "a/category/\350\207\252\345\212\250\345\214\226/index.html" "b/category/\350\207\252\345\212\250\345\214\226/index.html" index 1916a5a9..ece8cf64 100644 --- "a/category/\350\207\252\345\212\250\345\214\226/index.html" +++ "b/category/\350\207\252\345\212\250\345\214\226/index.html" @@ -38,7 +38,7 @@ } - + @@ -131,10 +131,10 @@

    Huginn 准备工作

    1. 进入网页

    FEED43 不需要注册,点击「Create your own feed」即可使用。


    ...自动化rssFeed43FeedEx大约 3 分钟
    - + - - - + diff --git a/code/AutoHotkey.html b/code/AutoHotkey.html index e977f57e..3195b25d 100644 --- a/code/AutoHotkey.html +++ b/code/AutoHotkey.html @@ -38,7 +38,7 @@ } - + @@ -170,10 +170,10 @@ LAlt & Capslock::SetCapsLockState, % GetKeyState("CapsLock", "T") ? "Off" : "On" !u::Send ^c !{tab} ^v

    1. Win 下最爱效率利器:AutoHotKeyopen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/code/Electron.html b/code/Electron.html index f3b488cf..118eea70 100644 --- a/code/Electron.html +++ b/code/Electron.html @@ -38,7 +38,7 @@ } - + @@ -77,10 +77,10 @@ sudo npm install -g n #安装用于安装 nodejs 的模块 n sudo n stable #通过 n 模块安装指定的 nodejs
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/code/HTML.html b/code/HTML.html index 55582487..8a8f0cff 100644 --- a/code/HTML.html +++ b/code/HTML.html @@ -38,7 +38,7 @@ } - + @@ -156,10 +156,10 @@ # 终端中执行压缩命令,默认压缩 input 下所有文件,压缩选项参照 http://kangax.github.io/html-minifier/ html-minifier --collapse-boolean-attributes --collapse-whitespace --decode-entities --no-html5 --minify-css true --minify-js true --process-conditional-comments --process-scripts text/html --remove-attribute-quotes --remove-comments --remove-empty-attributes --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --remove-style-link-type-attributes --remove-tag-whitespace --sort-attributes --sort-class-name --trim-custom-fragments --use-short-doctype --input-dir D:\Backup\raw --output-dir D:\Backup\1

    1. 开源 JavaScript 插件和库open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/code/Javascript.html b/code/Javascript.html index 59bfba6a..ea9febde 100644 --- a/code/Javascript.html +++ b/code/Javascript.html @@ -38,7 +38,7 @@ } - + @@ -269,10 +269,10 @@ ></video> </div>
    1. radio、checkbox 选中状态研究open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/code/Markdown.html b/code/Markdown.html index 65ccc092..fbaaf364 100644 --- a/code/Markdown.html +++ b/code/Markdown.html @@ -38,7 +38,7 @@ } - + @@ -72,10 +72,10 @@ [^2]:[标题](链接) [^3]:<br>![图片描述](图片链接)

    代码块自动换行

    自动换行需要 css 支持,暂不能自动启用。

    整段删除线

    ~~ 只支持对本行内容添加删除线。

    如果要对大段内容添加删除线,可以用 HTML 标签 <s></s>,被该标签包围的内容会全部添加删除线。VuePress 暂不支持该代码,会将标签识别为不完整而报错。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/code/Python.html b/code/Python.html index 14581a32..3b488fe4 100644 --- a/code/Python.html +++ b/code/Python.html @@ -38,7 +38,7 @@ } - + @@ -219,10 +219,10 @@ list(filter(lambda x:x%2,range(10))) #过滤 0-9 中能整除 2 的数字 list(map(lambda x : x%2, range(10))) #罗列 0-9 每个数字乘 2 的结果
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/code/Regex.html b/code/Regex.html index f6f2c173..2b81b291 100644 --- a/code/Regex.html +++ b/code/Regex.html @@ -38,7 +38,7 @@ } - + @@ -70,10 +70,10 @@ var str2 = str.replace(/dog/g,"cat"); #全局替换 var str2 = str.split("dog").join("cat"); #分割替换

    表达式修饰符

    元字符:区分大小写

    常用正则代码说明
    .匹配除换行符以外的任意字符
    *匹配 0 个或多个.(有多少匹配多少,贪婪模式)
    ?匹配 0 个或 1 个 (至少匹配一个)
    $以什么结尾的,如\\d+0$ (以 0 结尾)
    ^以什么开头的,如^http匹配以 http 开头的字符串
    \w匹配字母或数字或下划线或汉字
    \W匹配任意不是字母,数字,下划线,汉字的字符
    \d匹配数字
    \D匹配任意非数字的字符
    \s匹配任意的空白符(空格 ,制表符 )
    \S匹配任意不是空白符的字符
    \r回车符
    \n换行符 (一般情况下使用\r\n 匹配回车换行)
    \t制表符,Tab
    \u4e00-\u9fa5非中文

    常用分组语法

    分类代码/语法说明
    捕获(exp)匹配 exp,并捕获文本到自动命名的组里
    (?<name>exp)匹配 exp,并捕获文本到名称为 name 的组里,也可以写成 (?'name'exp)
    (?:exp)匹配 exp,不捕获匹配的文本,也不给此分组分配组号
    零宽断言(?=exp)匹配 exp 前面的位置
    (?<=exp)匹配 exp 后面的位置
    (?!exp)匹配后面跟的不是 exp 的位置
    (?<!exp)匹配前面不是 exp 的位置
    注释(?#comment)这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读

    1. 正则表达式匹配:包含且不包含open in new window ↩︎

    2. 正则表达式匹配不包含某些字符串的技巧open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/code/Vue.html b/code/Vue.html index 61170c22..b07fa6cd 100644 --- a/code/Vue.html +++ b/code/Vue.html @@ -38,7 +38,7 @@ } - + @@ -141,10 +141,10 @@ }).mount("#app"); </script>

    使用 <div v-html="html"></div> 来引入 html 元素,功能类似于 innerHTML,不能加载外部 HTML,实现 <?php echo file_get_contents("https://docs.manictime.com/win-client/faq"); ?> 类似的功能。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/code/index.html b/code/index.html index 3402e04a..8922c4c5 100644 --- a/code/index.html +++ b/code/index.html @@ -38,7 +38,7 @@ } - + @@ -52,10 +52,10 @@ "**/*.d.ts": true, //隐藏所有 d.ts 文件 }

    在线 IDE

    在线 IDE 最大的优势是开箱即用,无需搭建环境,避免本地环境错误导致的各类 bug。

    StackBlitzopen in new window:StackBlitz 界面类似 Visual Studio Code,可以直接 push 和拉取 GitHub 仓库的代码进行查看和编辑,项目支持离线开发,同时所有应用程序会自动部署在其服务器上。[1]

    CodePenopen in new window:CodePen 是一个在线的 HTML、CSS 和 JavaScript 代码编辑器,能够编写代码并即时预览效果,便于项目分享预览。CodePen 也一个庞大的前端社区,上面有来自全球开发者分享的各种各样炫酷的效果,并且这些代码都是开源和共享的。

    CodeSandboxopen in new window:CodeSandbox 编辑体验与 VSCode 类似,并支持 GitHub 导出、静态文件托管、本地项目导入等。缺点:不能直接导入 GitHub 项目。


    1. 六个好用的在线代码编辑器,你选哪个?open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/deploy/CloudServices.html b/deploy/CloudServices.html index 7d58f895..6396a43e 100644 --- a/deploy/CloudServices.html +++ b/deploy/CloudServices.html @@ -38,7 +38,7 @@ } - + @@ -63,10 +63,10 @@ # tunnel sudo docker run --name cloudflaretunnel cloudflare/cloudflared:latest tunnel --no-autoupdate run --token

    腾讯云境外

    腾讯云香港已无轻量服务器供应,但可购买新加坡、日本的服务器。价格实惠,2 核 2G,30M 宽带,每月 33 元。但国内连接速度较慢,仅适合境外用户。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/deploy/Cloudflare.html b/deploy/Cloudflare.html index 086f7611..e8cf2fef 100644 --- a/deploy/Cloudflare.html +++ b/deploy/Cloudflare.html @@ -38,7 +38,7 @@ } - + @@ -554,10 +554,10 @@ return flag; }
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/deploy/DNS.html b/deploy/DNS.html index 70075676..4ca4f4f5 100644 --- a/deploy/DNS.html +++ b/deploy/DNS.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    域名 DNS 托管

    约 185 字小于 1 分钟...

    国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。

    • DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。
    • 如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firefox。
    • 子域名可以使用 NS 记录open in new window,托管到其他域名服务商。但 Cloudflare 不支持单独子域名托管。

    域名 DNS 服务器修改(阿里云):https://help.aliyun.com/document_detail/121648.htmlopen in new window

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/deploy/GitHub.html b/deploy/GitHub.html index 1ecb75e1..f6f0b777 100644 --- a/deploy/GitHub.html +++ b/deploy/GitHub.html @@ -38,7 +38,7 @@ } - + @@ -82,10 +82,10 @@

    Type

    Type 用于说明 git commit 的类别,只允许使用下面的标识。[3]

    Scope

    Scope 用于说明 commit 影响的范围,比如 Controller、DAO、View 等等,视项目不同而不同。如果其中包含了多个 scope,可以使用 * 代替。

    如果当前代码与上一个版本不兼容,则 Footer 部分以 BREAKING CHANGE 开头,后面是对变动的描述、以及变动理由和迁移方法。[4]

    如果当前 commit 针对某个 issue,那么可以在 Footer 部分使用 Closes #265 关闭这个 issue。也可以在任意位置输入 #265,将 commit 与对应问题相关联。

    常见问题

    GitHub 忽略指定文件

    项目路径新建一个命名为 .gitignore 的文件,将想要忽略的文件夹和文件写入 .gitignore 文件,换行分隔。

    比如要忽略 node_modules 文件夹,就直接在文件中输入 node_modules。

    添加 Github 源作为依赖

    一般情况下,依赖包会使用 npm 进行管理。但有时开发者可能并不会立即更新到 npm 上,这时我们可以选择使用 GitHub 源作为备用方案。

    另外,在国内服务器连接不上 GitHub 的情况下,可以先使用 npm 安装依赖包,然后手动替换 node_modules 目录中对应的源为下载好的文件。

    yarn add strapi-google-auth
     yarn add https://github.com/arjusmoon860/strapi-google-auth.git
     

    1. 了解 GitHub Actionsopen in new window ↩︎

    2. 最全总结,GitHub Action 自动化部署open in new window ↩︎

    3. Git Commit 规范open in new window ↩︎

    4. Commit message 和 Change log 编写指南open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/deploy/MySQL.html b/deploy/MySQL.html index ec8b8df1..6506d6b0 100644 --- a/deploy/MySQL.html +++ b/deploy/MySQL.html @@ -38,7 +38,7 @@ } - + @@ -54,10 +54,10 @@ SET FOREIGN_KEY_CHECKS=1;

    数据库启动失败或损坏

    1. 在 MySQL 配置文件中,找到 mysqld 行并添加 innodb_force_recovery=4。这个值可以在 0-6 之间调整,数值越大对数据库的损害就越大。在成功启动 MySQL 后,备份所有数据库和管理密码,并将它们下载到本地。
    2. 在宝塔面板的「数据库」选项中删除所有数据库,然后卸载并重新安装 MySQL。
    3. 重新导入数据库。
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/deploy/Static.html b/deploy/Static.html index 714e1889..8f43ea7c 100644 --- a/deploy/Static.html +++ b/deploy/Static.html @@ -38,7 +38,7 @@ } - + @@ -119,10 +119,10 @@ .github/ .gitattributes
    1. How to Easily Host a Website on IPFSopen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/deploy/VPS.html b/deploy/VPS.html index 28b42974..b29b8731 100644 --- a/deploy/VPS.html +++ b/deploy/VPS.html @@ -38,7 +38,7 @@ } - + @@ -121,10 +121,10 @@ add_header Access-Control-Allow-Headers "DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range"; add_header Access-Control-Expose-Headers "Content-Length,Content-Range";

    piwik 手动升级

    Matomo/Piwik 是免费的统计服务。有时无法使用自动安装包,需要手动升级。

    1. 下载最新版应用,并解压到服务器。
    2. 将原目录中的 config/config.ini.php 粘贴到新版中,然后就可以更新数据库进行升级了。
    3. 选择「设置」>「系统」>「地理位置」,拖到页面底部,按页面要求下载 DBIP 包,并重命名保存为 /www/wwwroot/piwik/misc/DBIP-City.mmdb

    1. 通过包管理器方式安装 Node.jsopen in new window ↩︎

    2. Nginx rewrite 设置open in new window ↩︎

    3. 针对宝塔面板一个站点多个域名使用 SSL 证书的解决方案open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/deploy/index.html b/deploy/index.html index 5e1dbd89..31c59769 100644 --- a/deploy/index.html +++ b/deploy/index.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Deploy

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/family/Coupon.html b/family/Coupon.html index 00be59d7..f70c5506 100644 --- a/family/Coupon.html +++ b/family/Coupon.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    网购攻略

    约 1421 字大约 5 分钟...

    家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。

    电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。

    淘宝

    • 当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。
    • 购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。
      • 大额券一般有 92 折,可以用于预购,但不能与省钱卡叠加。
    • 购物节日前一天的预购和节日当天,是最优惠时候。
      • 商家在活动前说的保价,并不包含大额券,不用提前下单。

    拼多多

    拼多多的很多商品价格完全不受购物节影响,除了大额消费券外,拼多多通常具有价格优势。

    • 99 以上消费品,记得用拼多多的大额券,拼多多会员分享 3 个好友,即可任意领 99-20 券,大部分产品都适用。
    • 无门槛大额券 - 立减 50,有几率抢到的,同样需要分享,有需要可以试试。

    京东

    京东新会员已经没有优惠券了,不过它的以旧换新经常有活动。特别是购物节期间,一般坏的电器也能有 50 的补贴,品类并不需要与新家电完全相同。比如换冰箱,你可以用坏的电饼铛来拿补贴。

    1688

    1688 上能找到很多品牌的代工厂,它们未贴牌或自家产品的品质不比大品牌差,但因为剥离了溢价,价格可以便宜不少。不过食品类需注意,代工厂的品质不等于贴牌!贴牌方要求的品质与代工厂的生产的品质不一定一致,原料、品控可能都会更改[1]

    • 持续消耗类:擦手纸、一次性清洁布、各种清洁液、消毒液、一次性保鲜袋、垃圾网袋等。
    • 日用纺织品:袜子、内裤、秋衣、毛巾、T 恤等。此类产品多为基本款,不追求品质,只要简单舒适即可,剔除品牌溢价。
    • 日化类产品:棉签、发夹、皮筋、肥皂、卸妆纸、洗脸巾等。
    • 医疗防护类消耗品:口罩、一次性手套、防护服等。比如医用外科口罩,原本是 0.5,但阿里巴巴上宇安是 0.08,现在是 0.11-0.12。
    • 食品或食品包装:小零食、保鲜袋、咖啡挂耳包、食品储藏盒等。很多大品牌的零食都不是由品牌自己建厂生产的,而是交给第三方代工。因此,如果能循着线索找到代工厂,就有可能买到物美价廉的产品,参考手把手教你如何找 1688 代工厂天猫店半价买零食(附超全代工厂旗舰店链接)open in new window
    • 数码科技小物:充电宝、TWS 耳机、充电头、充电线等。此类多只有核心功能,须不在意设计、品牌、细节体验。
    • 餐具和文具:餐具的品牌溢价非常高,文具也能获得批发价,即使是知名的进口文具,1688 上也能买到更低价格的正品。

    购买技巧:有的时候只需要一件,但是商家两件起发!这种时候选「代发下单」,可能稍贵一点点,但是一件就能发货!

    抢购辅助

    BP 模式

    BP 即 ByPass,是一键下单的链接,可以跳过商品页缓存、选择尺码规格、结算这一系列繁琐的步骤,直接进入订单确认页,最大限度减少操作和页面跳转带来的延时,为大家抢购带来最快的下单体验。

    手机端操作,可以把 BP 链接提前给淘宝/京东里面的好友或客服,到了点再进入下单。

    BP 链接均为移动链接,电脑上使用需要提前登录网页。BP 下单时,可以先不付款,先提交锁定订单,然后再支付选择分期方式。

    以京东 BP 链接为例:https://p.m.jd.com/norder/order.action?wareId=100033551654&wareNum=1&enterOrder=truewareId=100012043978100012043978 是商品 ITEM ID,Num=1 中 1 是购买数量。

    购物思考

    优惠券、抢购除了是让你下单,也是为了让你成为平台的忠实用户。正如劳力辩证:当你对某事或某人投入了精力和劳力,你也会对他们有更高的评价。而抢购成功,会让人有种不可自拔的快感。


    1. 1688「扫货」指南open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/family/Diet.html b/family/Diet.html index 3b17c3a2..b06a1fc6 100644 --- a/family/Diet.html +++ b/family/Diet.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    健康饮食

    约 4858 字大约 16 分钟...

    16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。

    • 早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。
    • 午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。
    • 晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。

    饮食

    零食

    • 炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡米花,炸鸡排、牛肉馅饼外面有面粉,不适合烘烤。
    • 安井肉丸:撒尿牛肉丸> 包心鱼丸> 仿墨鱼丸?>牛肉丸> 蟹味宝 + 鱼籽包。安井肉丸质量都不错,不过别买量贩装,这是不同种类。

    饮料

    现磨咖啡味道不错,每天用量需控制在 2 杯黑咖啡或 4 杯奶咖,相关数据参考适量喝咖啡对身体有哪些好处?open in new window。有时喝的频繁就比较折腾,考虑入手白咖啡,不过据传白咖啡糖分高,而且含反式脂肪酸。

    马来西亚的土特产,约有 100 多年的历史。白咖啡并不是指咖啡的颜色是白色的,而是采用特等 Liberia(利比里亚)、Arabica(阿拉比卡)和 Robusta(罗布斯塔)咖啡豆及特级的脱脂奶精原料,经中轻度低温烘焙及特殊工艺加工后大量去除咖啡碱,去除高温碳烤所产生的焦苦与酸涩味,将咖啡的苦酸味、咖啡因含量降到最低,甘醇芳香不伤肠胃,保留咖啡原有的色泽和香味,口感爽滑、纯正,颜色比普通奶咖更清淡柔和,呈现出淡淡的奶金黄色。

    夏天喝适合冷泡的绿茶、红茶、白茶、花茶等,而岩茶与普洱生茶冷泡就不容易好喝。[1] 蛮喜欢泰厨的花茶,有新鲜的香茅,但淘宝卖的花茶放了很多糖块。

    冷泡燕麦

    牛奶/酸奶/燕麦奶/椰奶 + 燕麦,前一天晚上配好,放在密封容器里,冰箱冷藏。第二天拿出来再加配料(奇亚籽、坚果、果干、椰子片、即食燕麦、水果、酸奶块)即可食用。需要注意的有几个点:

    • 主材一定要用生燕麦或烤燕麦,不要用即食的,即食的泡一夜就变成糊了,既不好吃也不健康,升糖很高。
    • 配料之所以在吃前再添加是为了避免口感拉胯,所以不会带来脆的口感的配料也可以冷藏前添加,即食燕麦片、椰子片、坚果、酸奶块这些可以丰富口感的建议在吃前添加。
    • 配料有两个作用,除了提升口感层次还有丰富营养的作用,但建议酌情添加,特别是有减脂需求的人士,毕竟大部分配料都是热量炸弹。而且不加配料其实已经很好吃了,个人较为推荐的配料是一袋每日坚果或一小把燕麦脆片(如卡乐比)。
    • 容器可以选用梅森杯、玻璃饭盒,若对配料有要求而且想路上吃可以选择乐扣双层多用保鲜盒。
    • 放冰箱这一步很重要!不放可能会化身喷射战士。
    • 唯一的缺点就是冷吃可能不是所有人都适合,也可以早上再用微波炉打一下,对口感和营养肯定会有影响。

    健康理论

    程序员延寿指南

    程序员延寿指南open in new window:

    • 输入
      • 固体:吃白肉open in new window(-11%~-3% ACM)、蔬果为主(-26%~-17% ACM),多吃辣(-23% ACM),多吃坚果(-27%~-4% ACM),少吃蛋黄(否则 +7% ACM/0.5 颗/天),中量碳水、多吃植物蛋白(-10% ACM),少吃超加工食物(-62%~-18%)
      • 液体:喝咖啡(-22%~-12% ACM),喝牛奶(-17%~-10% ACM),喝茶(-15%~-8% ACM),少喝或不喝甜味饮料(否则每天一杯 +7% ACM,+多巴胺),戒酒或每周 100g(纯酒精量 (g)=饮酒量 (ml)× 酒精浓度 (%)× 酒精密度 0.8g/ml)内(否则+~50% ACM,无上限)
      • 气体:不吸烟(否则+~50% ACM,-12~-11 年寿命)
      • 光照:晒太阳open in new window(-~40% ACM)
      • 药物:二甲双胍(糖尿病人相比正常人可以 +3 年)、复合维生素(-8% 癌症风险)、亚精胺(-60%~-30% ACM)、葡萄糖胺(-39% ACM)
    • 输出
      • 运动:每周 3 次 45 分钟挥拍运动(-47% ACM)
      • 日常:刷牙(-25% ACM)
      • 睡眠:每天睡 7 小时全因死亡率最低;且 22-24 点间最好,早睡 +43% ACM,晚睡 +15% ACM(存在争议)
    • 上下文
      • 体重:减肥(-54% ACM)

    其他

    在发表在《细胞》杂志的综述文章open in new window中描述了长寿饮食open in new window,这是一种基于从食物成分和卡路里摄入等饮食各个方面研究的多支柱方法。研究人员报告说,理想情况下,一天的饭菜都在 11—12 小时的窗口内进行,允许每天禁食,每 3—4 个月进行为期 5 天的禁食也可能有助于降低胰岛素抵抗、血压和其他疾病风险因素。朗格描述了长寿饮食在现实生活中的样子:大量的豆类、全谷物和蔬菜;一些鱼;没有红肉或加工肉和极少量的白肉;低糖和精制谷物;一定量的坚果和橄榄油;一些黑巧克力。

    泡澡

    浸泡 42℃ 以上的水温最多泡 3-5 分钟,40℃ 可以泡 10 分钟,37℃ 到 39℃ 的温水,可以泡 20-30 分钟。泡浴后的清水冲淋是有必要的,头发部位和面部用冷水冲淋则有极其良好的保健和延缓衰老的功效。

    泡浴作用:

    • 低温、长时间的泡浴 - 失眠、压力带来的疲劳。
    • 上班前或者重大活动前高温或者低温并且短时间的泡浴 - 打起精神。
    • 0-21°,收敛组织器官和神经系统--冷水浴。
    • 32-40°,舒缓、愉快 - 温水浴。
    • 32-42°,止痛、镇静,浴后无力需要休息 - 热水浴。
    • 全身浴:覆盖肩膀为主,温水 - 提高新陈代谢。
    • 半身浴:肚脐平齐,不增加心脏负担,30-40 分钟,慢慢发汗,上半身披毛巾或间断性加水 - 改善心脏功能,改善冷性体质,特别适合老年人。注意:39°,肚脐,30 分钟以上
    • 坐浴:20 厘米高度的水平线,浸入腰椎、尾椎、臀部,15 分钟 - 痔疮、便秘、尿路感染、生殖系统护理。

    另外,饮酒后最好不要立即去洗澡,这很容易引发心血管病。洗澡时出现头晕、胸闷、眼花等“澡堂综合征”,也需立即停浴,到医院就诊。

    减肥食谱

    使用食谱前,先需要养成正确的减重习惯和心态。

    • 不要让自己饿肚子,每天至少要吃 3 顿正餐。
    • 吃点心或正餐之前和之后都要喝一杯水,进食顺序按蔬菜> 鱼肉蛋> 主食
    • 饭后半小时不要坐下
    • 临睡前至少 1 小时停止用餐,并且要多喝水。
    • 每咬一口食物,都要咀嚼一段时间。从身体真正饱足到大脑产生饱足感需要 15 分钟。吃慢一点,就不容易吃得过多。
    • 每天称体重,然后找出 7 天的平均值。确保体重持续下降就好,不需要规定自己每周必须减掉多少体重。有时候体重可能会增加,尤其是女性在月经期间体内水分潴留,容易水肿,和你的饮食或锻炼习惯没有关系。
    • 每周只减掉 0.5-1 公斤。快速减肥会减掉肌肉,而不是脂肪,而且也很难长期维持体重。
    早餐午餐晚餐
    Day01谷物牛奶 (燕麦片 40g+ 全脂奶粉 40g+ 蛋白粉 5g+ 黑咖啡 2g);12 粒巴旦木;苹果 200g什锦饭 (大米 30g+ 小米 30g+ 甜豌豆 15g+ 松子仁 5g+ 酱牛肉碎 30g+ 胡萝卜丁 30g);蔬菜沙拉 (生菜 100g+ 熟鸡蛋 + 油醋汁半汤匙 4g);猕猴桃 120g;无糖酸奶 100g燕麦米饭 (燕麦粒 20g+ 大米 15g);油煮蘑菇鸡肉菠菜 (菠菜 200g+ 蘑菇 50g+ 鸡腿 40g+ 香油 1 汤匙 8g);豆浆 (黄豆 50g)
    Day02全麦三明治 (生菜 70g+ 鸡蛋 + 全麦吐司 60g+ 香油 2g);12 粒原味开心果;牛奶 250g双色菜花 (西兰花 100g+ 菜花 100g+ 香油 5g);茄汁虾仁 (虾仁 75g+ 番茄酱 30g+ 油 8g);二米饭 (小米 30g+ 糙米 30g);牛奶咖啡 (低脂奶粉 20g+ 黑咖啡 2g)(先吃一半菜花)木耳小白菜杂煮 (小白菜 150g+ 北豆腐 60g+ 鸡心 60g+ 黑木耳 6g+ 香油 3g);红豆紫米薏米粥 (紫红糯米 30g+ 薏米 15g+ 赤小豆 30g);蜜橘 100g(加餐)
    Day03红豆紫米薏米粥 (紫红糯米 30g+ 薏米 15g+ 赤小豆 30g);水煮蛋;果仁菠菜 (菠菜 80g+ 花生仁 10g+ 香油 3g);牛奶咖啡 (低脂奶粉 20g+ 黑咖啡 2g)土豆沙拉 (土豆 200g+ 甜豌豆 30g+ 白芝麻 3g+ 鸡蛋 + 千岛酱 1 汤匙 8g);酱卤鸭肝 60g;无糖酸奶 100g;10 粒小番茄燕麦小米粥 (燕麦片 30g+ 小米 30g+ 小麦胚芽 10g);蒸虾皮小油菜 (小油菜 180g+ 虾皮 5g+ 全麦粉 30g+ 花椒油 3g);烤鸡腿 80g
    Day04奶香醪糟燕麦 (醪糟 100g+ 燕麦片 30g+ 全脂奶粉 40g);鸡蛋;12 粒巴旦木紫菜蛋花汤 (海苔 4g+ 熟芝麻 1g+ 鸡蛋);牛奶燕麦 (燕麦片 20g+ 全脂牛奶 250g);酸奶 100g;小叶橘 150g;全麦吐司 30g火腿木耳煮油菜 (油菜 250g+ 木耳 10g+ 方火腿 60g+ 香油 1 汤匙 8g);蒸红薯 180g;无糖酸奶 (酸奶 100g+ 蛋白粉 5g)(先吃油菜)
    Day05蒸食物套餐 (铁棍山药 80g+ 糯玉米带轴 150g+ 胡萝卜半根 100g);奶香黄豆浆 (黄豆 20g+ 黑芝麻 5g+ 全脂奶粉 20g);鸡蛋羹 (鸡蛋 + 香油 2g);桂圆 150g冲杂粮糊 (烤红豆粉 15g+ 燕麦粉 20g+ 小米粉 15g+ 全脂奶粉 10g);生菜沙拉 (生菜 150g+ 千岛酱 10g);酸奶 200g;蓝莓 100g;葡萄干 10g坚果土豆泥 (土豆 250g+ 烤花生碎 12g+ 方火腿 70g);油煮木耳小白菜 (小白菜 200g+ 木耳 6g+ 香油 4g);酸奶 100g
    Day06香蕉燕麦蛋糕 (香蕉 120g+ 燕麦片 30g+ 鸡蛋 + 牛奶 200g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 100g+ 核桃仁 15g+ 芝麻油 4g)鸡腿炖四宝 (鸡腿肉 100g+ 鲜蘑 80g+ 黄花菜 10g+ 甜豌豆 80g+ 木耳 10g);银耳西兰花 (西兰花 200g+ 银耳 8g+ 香油 4g)炖素三鲜 (冬笋 80g+ 香菇 10g+ 黄豆芽 120g+ 香油半汤匙 4g);清蒸鱼 (蒸鲈鱼 120g+ 花生油 4g);烤红薯 250g(按序食用)
    Day07苹果全麦煎饼 (苹果肉 180g+ 全麦粉 20g+ 葡萄干 3g+ 全脂奶粉 10g+ 油 3g);麦胚红枣豆浆 (烤黄豆 15g+ 烤黑芝麻 8g+ 大枣肉 10g+ 熟小麦胚芽 10g)生菜鸡蛋沙拉 (生菜 200g+ 鸡蛋*2+ 千岛沙拉酱 8g);麦胚红枣豆浆 (烤黄豆 15g+ 烤黑芝麻 8g+ 大枣肉 10g+ 熟小麦胚芽 10g);酸奶 150g;猕猴桃 120g甘薯红米饭 (红薯 100g+ 红米 20g+ 白米 20g);牛肉炖菜 (牛肉 100g+ 香菇 8g+ 胡萝卜 40g+ 魔芋粉丝 20g);果仁菠菜 (菠菜 200g+ 花生仁 8g+ 香油 4g)
    Day08全麦面包 70g;牛奶 240g;水煮鸡蛋;桂圆 120g;9 粒巴旦木油煮木耳小白菜鸡 (小白菜 25g+ 卤水豆腐 100g+ 鸡心 50g+ 黑木耳 2g+ 香油 3g);炖素三鲜 (冬笋 40g+ 香菇 4g+ 黄豆芽 20g+ 香油 2g);蒸红薯 200g;去皮小叶橘 200g杂粮糊 (烤红豆粉 13g+ 燕麦粉 13g+ 小米粉 13g+ 脱脂奶粉 4g);火腿木耳煮油菜 (油菜 100g+ 木耳 5g+ 方火腿 75g+ 香油 5g);无糖酸奶 130g
    Day09香蕉燕麦蛋糕 (香蕉 120g+ 燕麦片 50g+ 鸡蛋 + 牛奶 240g);15 粒开心果燕麦小米浓粥 (燕麦片 25g+ 小米 13g+ 小麦胚芽 13g);生菜沙拉 (生菜 200g+ 千岛酱 4g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 4g);豆浆 (黄豆 44g)二米饭 (小米 38g+ 糙米 15g);蒸虾皮小油菜 (小油菜 200g+ 虾皮 6g+ 全麦粉 10g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 花生油 4g);烤鸡腿肉 45g
    Day10苹果全麦煎饼 (苹果肉 105g+ 全麦粉 50g+ 葡萄干 3g+ 全脂奶粉 30g+ 油 3g);鸡蛋羹 (鸡蛋 + 香油 2g)蒸土豆 (土豆 200g+ 方火腿 75g+ 花生碎 2g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 花生油 3g);猕猴桃 150g甘薯红米饭 (红薯 50g+ 红米 25g+ 白米 25g);油煮木耳小白菜鸡 (小白菜 100g+ 卤水豆腐 50g+ 鸡心 50g+ 木耳 4g);豆浆 (黄豆 30g)
    Day11谷物牛奶 (燕麦片 50g+ 全脂奶粉 30g+ 黑咖啡 2g);鸡蛋;10 粒巴旦木;蜜橘 120g什锦饭 (大米 50g+ 小米 25g+ 甜豌豆 8g+ 松子仁 2g+ 酱牛肉碎 70g+ 胡萝卜丁 20g);银耳西兰花 (西兰花 50g+ 银耳 4g+ 香油 4g)燕麦米饭 (燕麦粒 25g+ 大米 38g);牛肉炖菜 (牛肉 50g+ 香菇 7g+ 胡萝卜 20g+ 魔芋粉丝 20g);烤鸡腿肉 50g
    Day12奶香醪糟燕麦 (醪糟 69g+ 燕麦片 38g+ 全脂奶粉 30g);果仁菠菜 (菠菜 150g+ 花生仁 3g+ 香油 3g);鸡蛋羹土豆鸡蛋豌豆沙拉 (土豆 300g+ 甜豌豆 16g+ 白芝麻 3g+ 鸡蛋 + 千岛酱 4g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 20g+ 魔芋粉丝 20g+ 香油 2g)蒸食物套餐 (铁棍山药 100g+ 糯玉米带轴 300g+ 胡萝卜 20g);油煮蘑菇鸡肉菠菜 (菠菜 50g+ 蘑菇 35g+ 鸡腿 50g+ 香油 5g);无糖酸奶 120g
    Day13红豆紫米薏米粥 (紫红糯米 25g+ 薏米 25g+ 红小豆 13g);蔬菜沙拉 (生菜 200g+ 熟鸡蛋 + 油醋汁 5g);牛奶咖啡 (牛奶 240g+ 咖啡 2g)核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 100g+ 核桃仁 8g+ 香油 3g);烤红薯 200g;酱牛肉 70g;猕猴桃 150g麦胚红枣豆浆 (烤黄豆 30g+ 烤黑芝麻 16g+ 大枣肉 20g+ 熟小麦胚芽 20g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 2g);果仁菠菜 (菠菜 150g+ 花生仁 2g+ 香油 1g)
    Day14鸡蛋生菜三明治 (生菜 150g+ 鸡蛋 + 全麦吐司 88g+ 香油 5g);牛奶 240g鸡腿炖四宝 (鸡腿肉 50g+ 鲜蘑 35g+ 黄花菜 4g+ 甜豌豆 8g+ 木耳 4g);燕麦米饭 (燕麦粒 25g+ 大米 25g);葡萄干 25g双色菜花 (西兰花 50g+ 菜花 40g+ 油醋汁 2g);茄汁虾仁 (虾仁 80g+ 番茄 10g+ 油 2g);二米饭 (小米 38g+ 糙米 25g);紫菜蛋花汤 (海苔 2g+ 鸡蛋*1)
    Day15红豆紫米薏米粥 (紫红糯米 25g+ 薏米 25g+ 赤小豆 13g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 75g+ 核桃仁 3g+ 香油 2g);鸡蛋羹 (鸡蛋*1+ 香油 1g);无糖酸奶 240g油煮木耳小白菜鸡 (小白菜 100g+ 卤水豆腐 100g+ 鸡心 50g+ 木耳 4g+ 油 5g);二米饭 (小米 50g+ 糙米 25g)甘薯红米饭 (红薯 50g+ 红米 25g+ 大米 25g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 20g+ 魔芋粉丝 20g+ 油 5g);烤鸡腿肉 50g
    Day16奶香醪糟燕麦 (醪糟 35g+ 燕麦片 38g+ 全脂奶粉 30g);鸡蛋;蜜橘 120g蔬菜沙拉 (生菜 200g+ 鸡蛋 + 油醋汁 5g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 5g);蒸土豆 300g油煮鸡肉蘑菇菠菜 (菠菜菜 100g+ 蘑菇 35g+ 鸡腿肉 75g+ 香油 5g);蒸红薯 250g;豆浆 (黄豆 50g)
    Day17香蕉燕麦蛋糕 (香蕉 80g+ 燕麦片 50g+ 鸡蛋 + 牛奶 240g)粉蒸土豆鸡肉 (土豆 200g+ 鸡腿肉 50g+ 蒸肉米粉 5g+ 烤花生碎 3g);双色菜花 (西兰花 50g+ 菜花 80g+ 油醋汁 3g);酱牛肉 150g;猕猴桃 35g麦胚红枣豆浆 (烤黄豆 30g+ 烤黑芝麻 16g+ 大枣肉 20g+ 熟小麦胚芽 20g);火腿木耳煮油菜 (油菜 100g+ 木耳 4g+ 方火腿 75g+ 香油 4g)
    Day18鸡蛋生菜三明治 (生菜 150g+ 鸡蛋 + 全麦吐司 88g+ 香油 3g);奶香黄豆浆 (黄豆 13g+ 黑芝麻 3g+ 全脂奶粉 20g)杂粮糊 (烤红豆粉 13g+ 燕麦粉 13g+ 小米粉 13g+ 脱脂奶粉 2g);油煮木耳小白菜鸡 (小白菜 150g+ 卤水豆腐 40g+ 鸡心 75g+ 木耳 4g+ 香油 5g);苹果 150g蒸食物套餐 (铁棍山药 60g+ 糯玉米带轴 200g+ 胡萝卜 100g);鸡腿炖四宝 (鸡腿肉 50g+ 鲜蘑 17g+ 黄花菜 2g+ 甜豌豆 4g+ 黄豆芽 10g);生菜沙拉 (生菜 50g+ 千岛酱 4g);无糖酸奶 130g
    Day19苹果全麦煎饼 (苹果肉 60g+ 全麦粉 50g+ 葡萄干 3g+ 全脂奶粉 20g+ 油 5g);牛奶 240g土豆鸡蛋豌豆沙拉 (土豆 300g+ 甜豌豆 32g+ 白芝麻 2g+ 鸡蛋 + 千岛酱 4g);茄汁虾仁 (虾仁 80g+ 番茄酱 2g+ 油 10g)燕麦小米浓粥 (燕麦片 13g+ 小米 38g+ 小麦胚芽 13g);火腿木耳煮油菜 (油菜 100g+ 木耳 4g+ 方火腿 75g);无糖酸奶 130g
    Day20蒸食物套餐 (铁棍山药 60g+ 糯玉米带轴 200g+ 胡萝卜 100g);紫菜蛋花汤 (海苔 2g+ 鸡蛋*1);果仁菠菜 (菠菜 100g+ 花生仁 3g+ 香油 3g)炖素三鲜 (冬笋 40g+ 香菇 17g+ 黄豆芽 20g+ 香油 3g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 10g+ 魔芋粉丝 20g);燕麦米饭 (燕麦粒 25g+ 大米 50g);烤鸡腿肉 50g什锦饭 (大米 38g+ 小米 25g+ 甜豌豆 8g+ 松子仁 3g+ 酱牛肉碎 70g+ 胡萝卜丁 20g);银耳西兰花 (西兰花 25g+ 银耳 4g+ 香油 2g)
    Day21谷物牛奶 (燕麦片 50g+ 全脂奶粉 30g+ 黑咖啡 2g);鸡蛋;桂圆 120g油煮鸡肉蘑菇菠菜 (菠菜菜 100g+ 蘑菇 70g+ 鸡腿肉 50g+ 香油 5g);烤红薯 200g;猕猴桃 150g;无糖酸奶 130g粉蒸土豆鸡肉 (土豆 100g+ 鸡腿肉 50g+ 蒸肉米粉 5g+ 烤花生碎 2g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 油 1g);二米饭 (小米 25g+ 糙米 13g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 75g+ 核桃仁 5g+ 香油 2g)

    以上食谱整理自范志红老师的《吃出好身材-21 天营养食谱》,侵权删。

    食谱注意:

    • 晚餐时补充复合 B 族维生素药片,乳糖敏感者可以将纯牛奶换成低乳糖奶。
    • 蒸蛋羹可以用水煮蛋替代;鸡心、鸭肝、方火腿可以用鸡腿肉、酱牛肉替换;什锦饭中的酱牛肉碎换成炒鸡丁;松子仁可以换成熟芝麻或开心果碎;小叶橘可以替换成等量其他甜度低的新鲜水果,如草莓或半个苹果等;桂圆可以换成其他自己爱吃、吃了之后胃肠舒服的应季水果,比如橘子、橙子、猕猴桃等。水果可以午饭前一小时食用。
    • 小米、燕麦提前浸泡半小时到一小时再和大米一起煮口感较好。如果没有杂粮粉,可以直接用这些杂粮煮成饭,每次煮多一点,分成几份冷冻起来,每次蒸热吃一份。
    • 食谱部分可进行微调,如果不会做,可直接按原料食用。

    1. 冷泡茶和热茶放凉,好喝级别能一样吗?open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/family/HomeAutomation.html b/family/HomeAutomation.html index 93d81213..17887c54 100644 --- a/family/HomeAutomation.html +++ b/family/HomeAutomation.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    智能家居

    约 1255 字大约 4 分钟...

    智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。

    Home Assistant

    Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。

    Home Assistant 原生支持的米家设备较少,需要使用 hacs 下的集成 Xiaomi Miot Auto。默认 Docker 容器不带 hacs,需要手动部署。

    1. 下载 hacsopen in new window,将其解压到 Home Assistant 配置的 config\custom_components\hacs 文件夹下。
    2. 重启 Home Assistant 容器后,在集成中搜索 hacs,安装时按要求提供 github 账户授权。
    3. 选择「HACS」>「集成」>「浏览并下载存储库」,下载 Xiaomi Miot Auto 并重启 Home Assistant 容器。[1]

    Home Assistant 虽然一直被吹得很厉害,但即时性的传感器可能不能及时触发,使用时需要注意这点。

    对于人体传感器、门磁、无线开关类设备,它们的状态通常为瞬时状态 (即:事件),部分型号支持获取最后一次事件触发的时间,且默认轮询时长为 15 秒,对于无法获取最后触发事件的设备,即使修改轮询时间到 1 秒,也可能无法获取正确的状态。因此此类设备通过本插件集成后不太推荐用于触发实时自动化,仅适合作为如几分钟无人移动关灯这类自动化的条件。如果需要实时更新状态,推荐使用多模网关open in new window配合 XiaomiGateway3open in new window 集成。[2]

    Node-RED

    Node-REDopen in new window 是本地版的 IFTTT,能与 Home Assistant 打通,实现本地化的互联。新手推荐 node-red 的入门教程集合open in new window

    1. 部署 Node-RED 时,Node-RED 对存储文件夹的读写权限要求较高,Docker 部署的话需修改 data 的文件夹权限,为避免麻烦,我给了最高权限 chmod 777 /volume1/docker/nodered/data
    2. Node-RED 上安装 node-red-contrib-home-assistant-websocketopen in new window
      • 选择「设置」>「节点管理」>「控制板」>「安装」,点击右侧刷新按钮,加载节点目录,第一次加载要比较长时间,不用关闭网页。
      • 搜索并安装「node-red-contrib-home-assistant-websocket」。
    3. 选择「Home Assistant」>「HACS」>「集成」>「浏览并下载存储库」,下载 Node-RED Companion。
    4. 选择「Home Assistant」>「配置」>「设备与服务」>「集成」,添加集成 Node-RED Companion,然后重启 Home Assistant 容器。
    5. 进入 nodered 页面,配置 home assistant websocketopen in new window,点击右上角的部署。[3]

    常用节点

    • inject: 定时启动,周期性触发执行。
    • call service:改变智能设备状态,比如开灯。
      • Domain:触发方式
      • Service:触发命令
      • Device:设备与服务
      • Entity:设备执行模块

    自动化场景

    • 记录主卧关灯时间,默认其为睡眠时间,但实际关掉是关电源,不会在智能后端记录。或者用明暗度测试记录,每天最后暗的时候,记录为睡眠时间。
    • 书房检测到没人时,对电脑发送暂停视频的快捷键。这步卡在硬件,需要有个硬件能被 Node-RED 识别并给电脑发送按键。

    智能硬件

    Zigbee2MQTT

    Zigbee2MQTTopen in new window 是开源的智能网关,支持大部分的智能设备。其辐射范围更大,能同时联接 200 个设备,它的插网线版更稳定不易掉线。

    不过,我的设备都是米家系,暂时用不到开源网关,等买了其他品牌的设备,再考虑 Zigbee2MQTT。

    智趣盒子

    智趣盒子open in new window集成了 Home Assistant 和 Node-RED 的 Docker,Home Assistant 能部署 Addons、supervisor,能直接插开源网关。

    盒子基于 arm 的 linux 的 debian 系统上运行 docker,在 docker 的基础上构建了 supervisor 版本,跟 homeassistant 开发官方的 hassos 的最大差异就是打开了 root 的权限,可以在底层进行操作。这些比较适合国内的使用环境(网络改善,装第三方工具等).

    不过与 NAS 相比,智趣这类硬件盒子同样是 Docker 容器,除了能直连网关和想象中的简便攻略,并没什么其他优势。

    其他硬件


    1. 从零开始,基于群晖轻松玩转开源 homeassistant 智能家居前期搭建open in new window ↩︎

    2. 为什么设备状态会有延迟?如何减小延迟?open in new window ↩︎

    3. 树莓派 HomeAssistant 系列(四)NodeRed 安装配置open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/family/Life.html b/family/Life.html index 772c15df..5b622cbc 100644 --- a/family/Life.html +++ b/family/Life.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    生活窍门

    约 1110 字大约 4 分钟...

    个人护理

    理发

    电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。

    • 不要从前向后理发,否则限位器不起作用,头发都被推平。
    • 短发方案:限位器分别使用 1.5、6 和 4.5。

    衣物

    • 色彩:全身上下衣服的颜色不要超过 3 种,喜欢色彩饱和度偏低的颜色。单纯的黑白灰容易显得单调、路人。​
    • 图案:单一主题,小图案不要太大、条纹对齐不繁杂。横条纹显高显瘦,竖条纹相反。​[1]
    • T 恤:250g 32 支的纯棉面料,支数越高,面料就越柔软、越强韧 ​。
    • 5 分裤:不要七分裤或太宽松,裤长放在膝盖上方 5-10 厘米处。

    妙用

    磁铁

    铷磁铁或强磁铁在生活中有许多用途,如:整理线材,吸附窗帘,悬挂物品,密封。

    磁铁使用方便,不留痕迹,比小夹子有用。

    小众记录

    去客厅化

    宝宝出生后,扔掉了家里的欧式沙发和茶几,转而采用模块沙发。模块沙发的好处是可以灵活使用,需要时可以拆分来变成床。我买了三组,每组有两个沙发垫,可以让三个人舒适地睡觉。不过,模块沙发的价格差异很大,很难区分哪个更优。

    玻璃自爆

    2022.06.11 更换阳台 90*90 的弧形玻璃,要价 1100。

    阳台玻璃自爆后,即使玻璃没碎也要及早拆下来,否则有可能发生事故。拆旧玻璃前,需要清理下方停放的车辆,并暂时不让行人通行。拆好后,如果掉落碎玻璃较多,可以拿包烟让环卫工人帮忙清理。

    新玻璃未到之前,可以拿大的硬纸板挡住缺口,不要用薄膜遮掩,会被吸走。

    花洒水小

    手持花洒尾部与软管的连接处,有节水止逆阀。

    如果家里水压不足时,拆下节水止逆阀后安装花洒,可以解决花洒出水不足问题。

    网线更换

    客厅网络连接不稳定,加上原本装修的网线不好,想着把埋在墙里的网线都更换掉,就搜索「墙内网线更换」找到本地的服务商询价,准备把埋在墙里的网线都升到 7 类,但对方说超六和七类的网线都比较粗,很难拉进管道,可能会拉到一半给卡住。6 类线据传可以稳定支持 2.5Gbps/5Gbps 网络;在特定布线环境下,最大可支持 10Gbps 传输速率。

    师傅上门发现:除了客厅的 3 条网线是 6 类,其他房间都是超 5 类,可以上千兆,但不算稳定;管道里线特别多,无法更换网线。另外,单口网口面板改为双网口,需要连两根网线。

    平层户型换线报价(包含 6 类网线,6 类水晶头及人工):网线能不能换。只能我们工作人员,上门查看来确认。确认没法换的,只收上门费 100 元。可以换的话。换首根 6 类网线 380 元。每增加 1 根收取 140 元。管道里包含 10 米,超出的每米 12 元。客户需要管道外面延长网线的,每米 12 元。除复式和大型场所外,绝大多数情况是超不过 10 米。
    实际付费:上门维修就是按户计算,不管问题大小都是 300 起。我原本的问题不大,所以让他把家里的网线全部检查了遍,替换坏掉的水晶头和网口面板,最终费用是 430.

    网线情况:客厅 TV,客厅沙发(2 条网线,一条放在电话线下),客卧床头,客卧 TV,主卧床头,主卧 TV,书房书桌。书房备用网口更换面板后,依然不能使用,可能是线断了,不再使用。

    无线方面,我闲鱼买了个二手路由,与原本的华硕路由进行 有线 mesh 组网open in new window。AiMesh 主路由连接 LAN 口,节点路由连接 WAN 口。


    1. 横纹衣服更显胖?你可能一直都弄错了open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/family/Maintenance.html b/family/Maintenance.html index 3984aab2..088363b1 100644 --- a/family/Maintenance.html +++ b/family/Maintenance.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    维修/保养

    约 803 字大约 3 分钟...

    牛皮席

    平时隔一段脏了用温水毛巾擦就可以了,如果流汗很多的话,可以用淡肥皂水擦拭后再用清水毛巾擦。不宜暴晒,可以傍晚的阳光晾晒。

    秋天收藏之前,用淡肥皂水湿毛巾彻底清洁牛皮席表面,然后再用清水擦干净,在阳台晾晒一天后,可以卷也可以折起打包起来收藏,也可以直接垫在床上,上面再铺被子使用。

    升降桌

    升降桌报错时,长按向下键,桌子会逐渐复位到最低,然后恢复正常。

    通马桶

    塑料袋套在马桶搋或马桶刷,把塑料袋绑好。一插到底,快速抽动。多套上几个,尽量把它弄得比马桶的口大一点点哦。因为塑料袋在前面能起到一个遮挡的作用,快速的抽动它会形成一股冲击,从而达到快速的疏通马桶的作用。

    如果使用下方的疏通器,也在疏通头上绑好塑料袋,在气口位置撕开个小口,最后按通气开关。

    疏通器说明 1
    疏通器说明 1
    疏通器说明 2
    疏通器说明 2

    林内锅炉

    左侧为冬季采暖模式,地暖模式下温度设置在 45—55℃,原则上不超过 60℃。因为地暖管道是塑料的,如果温度太高,那么会影响到采暖管的使用寿命,还会导致锅炉内壁结垢。

    燃气壁挂炉配备有手动注水/补水阀,当运行过程中,采暖系统压力下降至 1bar 以下时 (因水中气体蒸发等原因引起),用户应慢慢打开此阀对系统进行补水增压,直到系统压力恢复到规定的水压为止,一般在静态常温下,系统应保持 1bar 左右,工作时水压应保持在 1bar~1.5bar 之间,补水过程中请不要离开现场。

    锅炉补水

    1. 先检查采暖系统中是否有漏水的地方,确认系统完全密闭。

    2. 关闭燃气壁挂炉,切断电源。

    3. 逆时针(向左)旋紧注水/补水阀约一周,听到有“呲”的声音。

    4. 观察操作面板上的水压表,当水压表指针在 1bar~1.5bar 之间时,顺时针(向右)旋转注水/补水阀手柄关闭注水/补水阀。

    5. 开机运行燃气壁挂炉。

    注意事项:

    • 注水时,必须切断燃气壁挂炉总电源,以免因接头漏水而导致漏电;

    • 补水结束后必须将注水/补水阀旋紧关闭,否则燃气壁挂炉将过压溢水;

    • 如果您补水时不小心将采暖系统内的水压补到 3bar 左右,安全阀会泄水,所以再次提示您安全阀必须用接管与地漏连接,且中间不许有阀门。

    地暖温控器

    地暖温控器 1
    地暖温控器 1
    地暖温控器 2
    地暖温控器 2
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/family/Medical.html b/family/Medical.html index c355e254..180a9936 100644 --- a/family/Medical.html +++ b/family/Medical.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    医疗药品

    约 737 字大约 2 分钟...

    自身健康

    尿素乳膏open in new window:柔软皮肤,防止干裂,深层滋润。

    维 a 酸乳膏open in new window:更新表皮,去除角质,避光只能晚上用。

    壬二酸open in new window:疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后立即清水清洗掉,然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停留超过 1-2 小时以上无不适,可以尝试过夜。

    黑头:白天用壬二酸(5 分钟),晚上用维 a 酸。

    维生素

    维生素:维生素 B 和 C 国内非常便宜,几元一瓶。但其他维生素国内只有保健品,价格严重虚高,优先考虑国外购买。

    护眼:叶黄素,玉米黄质,Lutemax® 2020 万寿菊花提取物。

    补钙:吃钙片要同时补充维他命 D 和维他命 K。钙本身是无法直接被身体吸收的,维他命 D 的作用是运输,带动钙元素在血液中流动。但光流动不行,需要给钙找个目标,才能把钙变成骨骼。所以就需要维他命 K,维他命 K 的作用则是把血钙转化为骨钙,让钙元素真正沉积在骨骼上。D 和 K 相结合,才能最大程度地提升钙的吸收率。

    看病技巧

    • 如果在网上挂不到专家的号,可以尝试电话联系科室问一下能不能当天加号,有的专家是允许加号的,只不过可能会加到当天比较晚的时候,出检查结果的时候专家就下班了。[1]

    • 如果对自己病情没有很多了解的话,建议早上空腹去,以免抽不了血。如果对自己要做的检查有大致了解的话,建议查一下注意事项,提前做好准备,比如做核磁共振身上不要带金属,女生最好穿无钢圈无挂钩的 bra,比如散瞳后不要驾驶等等。

    • 人这一生中还是得常见病的概率大,没必要迷信主任医师。建议首次看病不必找资历太高的医生,如果你的病真的到了需要找老大夫看看的地步,年轻大夫会领着你去找的。

    • 上午看病的人多,下午少,周一多,周五少,尽量避开周一上午。刮风下雨是看病的最佳时机,雨越大,人越少。[2]


    1. 不用迷信主任,要是真有大病,年轻大夫会领着你去找的……open in new window ↩︎

    2. “为了您和家人的健康,请不要在星期一上午看病”,超实用看病指南open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/family/Shoppinglist.html b/family/Shoppinglist.html index 097604ac..15b756fb 100644 --- a/family/Shoppinglist.html +++ b/family/Shoppinglist.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    购物评价

    约 3734 字大约 12 分钟...

    书房

    摄像头

    摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。

    谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。

    键盘

    罗技 ERGO K860 是一款无线蓝牙键盘,具有人体工学设计,并配备手托。我替换下来的海盗船机械键盘则留作备用。

    机械键盘 ikbc c104 和高斯 GS104D 销量高。办公场合适合使用静音红轴需求。高斯是国产品牌,提供多种颜色选择。

    游戏手柄

    如果不是在客厅玩游戏,建议买有线手柄,否则价格会高得多。

    • 100-200 预算:北通阿修罗 2、八位堂、致动 O。
    • 400+ 预算:XBOX SERIES 手柄。
    • 廉价手柄的性能通常很差,比如,摇杆只支持四个方向,而遥控一般是可以 360 度控制的。

    显示器

    书桌上装有三台显示器。主显示器是小米 27 英寸 2K 165Hz,尽管存在轻微漏光,但对日常使用影响不大。两侧的显示器是 2012 年生产的 DELL 2412M。显卡为 3080Ti,考虑以后将三台都升级为 4K,使用每英寸像素数(PPI)来评估显示器清晰度更为合理和直观。4K 显示屏让眼睛更舒适,绝对提高幸福感。[1]

    显示器疑问:

    • 使用不同分辨率和刷新率的显示器是否对视觉和视力产生影响?(之前看到的说法是影响不大。)
    • 旧显示器需要多久更换一次?如何判断它们的寿命已到?
    • 放在屏幕上方的防蓝光灯是否有效?

    DIY 显示器(面板 + 公版控制器):

    • 便宜,但没有厂家优化,显示效果打折扣。
    • 需要确认购买的显示面板是否为二手。
    • 我连续购买了两个面板都出了问题,分别是碎屏和无显示。

    台式电脑

    2022.03.16 淘宝入手 DIY 台机 i7+3080ti,费用 16500。虽然价格贵了点,不过赶在疫情封控两个月前,用上新电脑。原本想入手联想 刃 9000K 2022(i7+3070ti,价格 14000),但一直无货。这款机箱由联想定制,散热更好,配置足够日常使用,另外还有品牌机售后优势。相比联想,入手的 DIY 电脑内存频率从 4400 升至 5200,显卡从 3070ti 升至 3080ti,性价比更高,而且是现货。

    如果使用悬挂主机托架,需考虑主机重量、升降桌承重。

    书桌灯

    我在书桌上使用了米典护眼读写灯,众筹价为 400 元。这款灯的光线级别达到 AA 级,可以替代屏幕上的挂灯。

    通常情况下,我会开着书桌灯,而顶灯一般是关着的。当只有屏幕和桌面上有光,其他区域都处于黑暗中,我能更专心地工作。

    未来,我希望能在书房里增加一些色彩,考虑使用 yeelight 灯带。

    升降桌

    电动升降桌的调节高度范围一般在 0.6 至 1.2 米之间,可以考虑乐歌和京造。如果你想站着阅读,还可以考虑添置一个阅读架。

    静电墙贴

    @chen 出的绝妙主意,将静电墙贴当白板用,可以任意随时的记录。不过为用红色白板笔不好擦,准备试试 PVC 材质的静电墙贴。

    数码

    降噪耳机

    以下是降噪耳机的比较,按降噪效果从低到高排列:

    • Freebuds Studio:华为生态。
    • Sony 1000XM4:于 20 年发布,降噪效果强,但偶尔会翻车。
    • Bose 700:于 19 年发布,长时间佩戴舒适,但佩戴时间过长会感到很热,有人说这款不如旧款 QC 35 II。我于 2021 年 6 月以 1300 元购入,后来在闲鱼以 899 元售出。

    还试用过其他无线耳机,如下所述:

    • 10 元:购买自拼多多,通话效果勉强,但音乐质量非常差,声音仿佛来自另一个世界。
    • 50 元:倍思,通话和音乐效果都还不错,但在地铁里几乎听不到声音。不知是不是因为习惯了降噪耳机,带普通耳机只能听到地铁的噪音。
    • 小度半入耳耳机:容易松动,甚至在走路时容易脱落;偶尔无法识别,必须重新放入电池仓进行充电。
    • 悦虎 1562M:闲鱼山寨品牌,据说音质不错(?),但主要适用于苹果设备。如果使用安卓设备,对音质要求不高,可以选择 QCY。

    充电器

    充电器用了几年后,注意及时更换,因为老化会导致充电速度变慢。

    氮化镓充电器非常适合外出快速充电。不要购买无品牌的廉价充电器,虽然它们可能具有高参数和强大功能,但充电芯片质量没有保障,容易导致过热充电,从而影响设备的寿命。

    UPS

    随着 NAS 硬盘数量的增加,建议使用 UPS 以防止因突然断电而导致的硬盘损坏。

    在考虑 NAS UPS 时,可以考虑购买 APC BK650M2-CH 和山特(SANTAK)TG-BOX 850。

    3D 打印机

    3D 打印机使用时,打印原料会产生有害气体,不适合在家中使用。如果偶尔需要打印,建议在网上寻找专业人士定制。

    健康

    代餐

    代餐:无营养,不能起到减肥作用,容易掉肌肉。

    体重秤

    华为体脂秤 2 Pro 太过敏感,经常不准确。

    椭圆机

    椭圆机的稳定性至关重要,机身越重越好。一般型号只有 68 公斤,好的型号可以达到 86 公斤。飞轮重量必须达到 12 公斤,否则使用时可能不够稳定。

    按照这些标准,推荐斯诺德 E690 和迪卡侬 EL 900。

    眼部按摩仪

    严选眼部按摩仪噪音较大,但其他品牌也没好多少。如果买新的眼睛按摩仪,建议选择蛋白皮材质,适合长期使用。

    • 倍轻松:睡眠模式只有热敷。
    • 小米有品摩摩哒:无法关闭音乐,震动效果较弱,气囊挤。

    泡脚桶

    泡脚桶的新旧款别不大,比较特别的功能是蒸汽泡脚,但评价普遍一般。建议选择传统深桶,可以漫过小腿。

    睡眠监测

    在健康监测方面,我比较重视睡眠时间的监测。

    曾使用过 37 度睡眠监测带,但准确性不高,只适合用于家庭自动化(例如,作为触发器自动拉开窗帘)。我也考虑过更换为 Apple Watch 8/SE。然而,戴上 Apple Watch 会舒适吗?另外,我的手机是安卓系统,Apple Watch 是否兼容安卓手机或 iPad?

    试过小米手环和华为 GT 手表,但无论使用何种手环,始终感到不舒适,尤其是在炎热的天气里容易出汗。我尝试过硅胶、金属和尼龙编织表带,都没有明显改善。

    • @木木:用过 Nike 的那个孔状的表带改善了,然后我用洗眼镜的超声波盒子每天洗表带汗藓情况进一步改善,于是我最后通过实验,每天用酒精消毒液洗表带
    • @ZxoudXc:硅胶(最舒服的材质了) + 一点点风油精 不能说根治把。但是体感很爽,特别是在空调房里面。希望有帮助。

    厨房

    冰柜

    与其他人不同,我想要冰柜只是冰箱放不下了。我喜欢买速冻包子、饺子,这类一买就得买很多包,否则价格高很多。换个思路,趁着优惠多买些速冻产品,冰柜的费用很快就回来了。我看中的是 135L 的卧式冰柜,价格 700,如果家里用不到了,扔起来也不会心疼。

    比起卧式冰柜,立式拿取方便,但分层后存储空间受限,没法放体积特别大的东西,比如大包的生鲜,整条的羊腿。立式占地虽小,但小的有限,容量相等的情况下,基本是 0.4 平和 0.5 平的区别,而且立式高度更高,容易影响视线。

    切肉机

    电动切肉机用起来蛮慢的,切 5 斤肉需要 30 分钟。机器清洗也很麻烦,建议每次切肉时都将整条一起切好。

    使用前,向滑轨喷食用油,可以降低切肉卡顿的几率。使用时,为了避免冻手,两只手都先带一层劳保手套,外面再套一层 PVC。左手固定肉块左侧,右手扶助肉块后端。不要过分往前推,避免肉切得太厚。

    净水器

    RO 膜方案:纯水过滤,可直饮。RO 膜机器较大,一定要量好厨柜尺寸。在选择时,不必参考废水量,废水量越低对滤芯压力更大。一些攻略指出 RO 膜的出水速度较慢,而滤芯更换频率较高(最快 1-3 个月一次)。然而,这些问题早已得到解决。相反,我因为滤芯更换速度过慢而感到焦虑。通常,DIY 前置滤芯寿命是 3-6 个月,但我购买的 DIY 净水器用了一年,还没提醒更换滤芯。最后我只能盲换,跟超滤方案一样了。

    建议购买小米、美的等成熟净水器方案。它们的价格通常在 1500-2000 之间,仅需要更换两个滤芯:复合滤芯(2 年更换一次,售价 299 元)和 RO 膜滤芯(5 年更换一次,售价 999 元)。仅更换滤芯的年均成本为 350 元。总体来看,DIY 所谓的性价比并不太高。

    超滤方案:保留矿物质(?),无需通电,大通量过滤。不足之处难以确认滤芯更换的时间,只能根据滤芯使用时间来预估。全套新机器的价格为 1500 元,之后每两年更换一次 EF-900P 滤芯(售价 350 元),每四年更换一次超滤 LU3B-5C 滤芯(售价 600 元),仅更换滤芯的年均成本为 325 元,如果全套更换,年均成本为 425 元。

    旧配置:立升 LU3B-5C + 爱惠浦 EF-900P (别要赠品,折现) + 爱惠浦滤头垡头 QL2U + 无铅水龙头。这是用了几年的方案,但随着立升的超幅涨价,超滤玩家的变少,越来越难以实现了。另外,配机时记得买好配件。比如买爱惠浦滤头垡头 QL2U 时,问清楚是几分进几分出。常用的两边都是 3 分口,要配 2 个 3 分进 2 分出的接头,方便接 2 分水管。接口是可以送的,要跟店家说送接口、水管。没送的话,可以自己买 1 根 5 米的 2 分 PE 管、1 个 4 分转 2 分的接头 (立升转爱惠浦)、2 个 3 分转 2 分的接头、1 个 2 分球阀。

    超滤净水示意图

    家居

    维修

    日常维修以京东到家为主,或使用商家外包常用的鲁班到家open in new window。之前净水器的安装服务是鲁班到家,服务还不错,可以线上让师傅报价。

    电熨斗

    挂烫机体积较大且使用频率低,长时间闲置后,性能也减弱,无法熨平衣物。考虑使用传统电熨斗 + 分熨台。

    牛皮席

    夏天使用牛皮席更凉爽,避免因出汗而粘皮肤,有助于提高睡眠质量。

    最初购买的是无涂层牛皮席,上面存在许多瑕疵,后来更换为便宜的涂层款,反而看不到瑕疵。

    消毒液

    参考消毒剂选购不完全指南open in new window

    • 84 消毒液:爱特福、龙安、蓝月亮、康威龙。
    • 二氧化氯消毒片:星帮尼,从安全性角度看,二氧化氯消毒剂优于含氯消毒剂。
      • 用于餐具、水果、蔬菜等的消毒,有效的二氧化氯浓度应为 100–150mg/L,浸泡作用时间 10–20 分钟。
      • 尽管二氧化氯目前被认为是对人体无毒害的成分,但为了保险起见,应及时用清水洗净残留消毒液才能继续使用。
    • 季铵盐消毒液:适用于衣物消毒,建议品牌包括康威龙和洛娃
      • 不要将消毒液与洗衣液及柔顺剂同时使用,以免使各自的功效减弱。清洁、消毒是两个独立的过程,建议先洗干净再进行消毒,消毒效果更佳。

    小物

    • 能面具 (树脂),但带眼镜不方便使用。
    • 宝工(Pro'sKit)NT-309-C 智慧型非接触式感应电笔:测电笔、验电笔
    • 内裤清洗机
    • 洗杯器:一按就能清洗杯子,非常方便,可惜需要水槽有多余的出水口。[2]
    • 插座:公牛、德力西、aigo(突破),公牛质量下滑了,可以看看其他品牌。

    可能放弃

    电子书

    我通常使用 iPad 来阅读小说。国产电子书设备基于安卓系统,可以满足小说阅读的基本需求,而且使用墨水屏有助于保护眼睛。因此,考虑是否可以用电子书设备代替 iPad。

    电子书要求:支持开放系统(可以安装第三方应用程序),并且支持蓝牙遥控翻页。

    微单相机

    原计划购买索尼 a7m4 微单相机,但随着疫情的发展,这个想法逐渐淡化,优先级下调。

    关于镜头选择:F 值越小,光圈越大,适合虚化背景。

    • 腾龙 28-75mm F2.8(适合日常旅行)
    • 索尼 FE 85mm F1.8 中远摄定焦镜头(适合人像摄影)

    无线麦克风

    RODE Wireless Go II 与 DJI Mic:RODE Wireless Go 音质多受好评;而 DJI Mic 相对较新,但更符合人性化需求,可以轻松连接到手机。不过,需要注意的是 DJI Mic 的底噪略微高一些。

    鉴于录音中存在较多的杂音,需要使用降噪软件或者单独使用一部手机进行录音,因此目前暂不考虑入手无线麦克风。

    洗碗机

    由于厨房空间有限,且洗碗机过于笨重,考虑找人上门设计解决方案?


    1. 选择合适自己的显示器open in new window ↩︎

    2. Room Tour |新家的厨房里有什么?open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/family/baby/birthing.html b/family/baby/birthing.html index 243b14f6..c061d810 100644 --- a/family/baby/birthing.html +++ b/family/baby/birthing.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    生产前的准备

    约 440 字大约 1 分钟...

    不要囤货

    不建议过度囤积婴儿用品,尤其是尿不湿和奶粉。虽然有时会有吸引人的优惠,但我们必须记住,新生儿的成长速度惊人。今天合适的尿不湿尺寸,明天可能就小了。我还记得,老婆的朋友曾大量储备尿不湿,结果没用完。最后,我们成了这些尿不湿的受益者。此外,尽管配方奶是母乳不足的一个备选,但它的营养价值还是不及母乳。因此,也不建议过量购买。

    LDR 的选择

    LDR 是结合待产、分娩、恢复及产后的一体化单人房间。虽然我因为剖腹产不能陪同分娩,但这几天内,我和产妇都得到了很好的休息。医生和护士的日常巡查较为频繁,也使我们感到十分安心。

    陪护的重要性

    对于初为人父母的家长,建议雇佣一名陪护阿姨。若没有阿姨协助,你将需要自己记录宝宝的进食和排泄,并在夜间照看宝宝。这对于新手父母是个大挑战。我对于新生儿甚至有些胆怯,不敢随意抱起。在医院陪护期间,我感觉自己更像是个付款机器,无法真正帮到忙。

    送花:一个小小的惊喜

    若产妇即将分娩,那么送上一束鲜花可能会为她带来无比的惊喜和欢乐。尽管我老婆知道这并非我的想法,但她收到花时还是感到非常开心,特别是得知她是医院中唯一一个收到花的产妇。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/family/baby/index.html b/family/baby/index.html index 43123d9b..4e1ccf06 100644 --- a/family/baby/index.html +++ b/family/baby/index.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    育儿记录

    约 186 字小于 1 分钟...

    面对初为人父的经历,作为一位新生奶爸,我深感一路上充满了未知与探索。面对婴儿的每一个眼神、每一声啼哭,我时常觉得自己措手不及,无从下手。因此,我决定将这段旅程中遇到的各种疑问、挑战,以及为此找到的解决方案,做个详实的记录。希望这份不完全记录,能对和我一样的新手父母提供些许参考,同时,也希望在未来的某一天,能回首这段充满探索与成长的日子,感到育儿的幸福。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/family/baby/newborn.html b/family/baby/newborn.html index 5165cf09..bcbf79e1 100644 --- a/family/baby/newborn.html +++ b/family/baby/newborn.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    新生儿期(0-6 月)

    约 1715 字大约 6 分钟...

    坚持母乳喂养

    为即将出生的宝宝准备一小罐奶粉即可,避免购买婴儿水或其他所谓的婴儿食品。正常情况下,纯母乳喂养能满足 6 月龄婴儿所需要的全部能量、营养素和水。由于之前未进行充分研究,家人采购了四箱婴儿水,结果成了我饮用的“补给”。(参考《中国居民膳食指南(2022)》)

    • 母乳喂养是婴儿出生后最佳喂养方式。
    • 婴儿出生后不要喂任何母乳以外的食物。
    • 应坚持纯母乳喂养至婴儿满 6 月龄。
    • 坚持让婴儿直接吸吮母乳,只要母婴不分开,就不用奶瓶喂哺。
    • 不宜用母乳颜色、质地以及母乳成分测定结果来判定母乳营养价值。
    • 婴儿哭泣诱导母亲释放催产素。

    宝宝醒了吗

    初为人父时,我会因宝宝的任何小动静而紧张,不断跑过去查看。但其实,即使宝宝有些身体动作,也不代表她真的醒来。因此,无需因宝宝的轻微动静就去打扰她。[1]

    宝宝哭闹的原因

    宝宝刚出生时,月嫂和家里老人都有个说法是不能惯着她,让宝宝哭一会。但是,哭闹是婴儿表达饥饿信号的最晚表现

    在因饥饿而哭闹之前,婴儿可能已经出现以下表现:张嘴,吸手指、嘴唇或舌头;从睡眠中醒来,转动头脑,有好似寻找乳房的倾向;身体活动增多,呈现烦躁、哭闹等不安状态。识别出婴儿饥饿表现后,应立即哺喂。婴儿饥饿的后续表现才是哭闹。所以,根本不存在惯不惯着的问题,人家哭的时候,已经是饿惨了,请立即喂奶。

    喂养的时长和频次由婴儿进食意愿和需求决定。不要因为所谓的惯着而让婴幼儿哭闹。通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。

    新生儿胃容量小,胃排空较快,易感到饥饿,因此需多次哺乳满足其进食需要,伴随成长发育,一般喂奶间隔从 1 ~ 2 小时逐渐延长至 3 小时左右。3 个月后,婴儿胃容量增大,进食习惯趋于规律,同时夜间睡眠时间延长,夜间喂奶次数也可逐渐减少。

    除了饥饿的表现外,婴儿胃肠道不适或其他身体不舒服,甚至婴儿情绪不佳也会表现出不同状态的哭闹,而非饥饿原因引起的哭闹,显然无法通过哺喂得到完全安抚。应考虑非饥饿原因,比如大小便、体温等。

    婴儿的胃容量逐渐增加,因此其进食需求也会发生变化,回应式喂养是指符合婴儿进食特性的喂养方式,强调喂养的时长和频次由婴儿进食意愿和需求决定,包括早期新生儿的按需喂养方式,及日后逐渐形成的规律喂养方式。所谓回应式喂养,也称顺应喂养,就是要及时地对婴儿发出的进食需求,迅速做出喂养回应。按需喂养是指通过识别婴幼儿发出饥饿与进食的信号,在不限制哺乳次数和时长的前提下,立即、合理回应婴儿的进食需要。婴儿饥饿是按需喂养的基础,饥饿引起哭闹时应及时喂哺,不要强求喂奶次数和时间,特别是 3 月龄内的婴儿。

    婴幼儿哭闹是有具体需求的,先满足她的需求让她心情平静下来,哭闹时不要做排气操等行为。

    月嫂:助手还是潜在风险?

    月嫂为新父母提供宝贵的育儿知识,但务必确认其是否携带药物。若有,应要求其将药物存放于宝妈房中。

    我们第一个月嫂是从老家来的,做事利索,宝宝在她手上也特别乖。但是来了一周后,宝宝突然有两天睡得很沉,家人虽然奇怪,但都不清楚原因。然而,在随后一天的夜里,我丈母娘查监控时,突然看到月嫂为宝宝喂了药物。监控视频显示,月嫂确实有疑似给宝宝喂食的举动,且宝宝展现出吞咽的反应。当晚我们匆忙前往儿童医院,医生诊断宝宝的黄疸值为 12,并告知这一指数高可能导致嗜睡。考虑到为宝宝抽血的风险,我们没有进行进一步的检验。但当晚,宝宝整夜都未醒来,考虑到新生儿的胃容量只有 100-200ml,超过 3 小时便会感到饥饿。这更加加深了我们的怀疑,随后就辞退了这位月嫂。

    在随后的红房子医院复查中,我得知黄疸值需超过 20 才会导致嗜睡,婴儿的安眠用药非常具有时效性,很快就无法检测到。当时,监控于 22:40 捕捉到疑似喂药动作,但第一次去的医院没有新生儿门诊,直到凌晨 1 点才抵达能够进行此检测的医院。但儿童医院可能因为深夜不愿意为宝宝抽血,故意诊断为黄疸高嗜睡。

    第二个月嫂也带了药,而且相当懒惰。宝妈还在喂奶,月嫂 9 点就睡了。当晚我就打电话让中介换人,按一天工资给她结了。

    第三个月嫂的态度非常积极,她明确表示不会携带药物,并允许我们检查她的物品。她还精心准备了美味的月子餐,让宝妈可以分享照片,从而提振心情。好的心情对坐月子的母亲来说极为重要。

    为确保婴儿安全,建议在婴儿区域安装至少两个监控摄像头:一个针对婴儿床,另一个涵盖婴儿活动区。我最初只装了一个,发生疑似喂药事件后,才又增设了一个。与月嫂初次见面时,建议明确告知她家里有摄像头,一般她们都能接受。


    1. 母性科学open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/family/index.html b/family/index.html index 09b79df4..ddd5148d 100644 --- a/family/index.html +++ b/family/index.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Family

    约 1 字小于 1 分钟...

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/index.html b/index.html index d81659a0..d735276a 100644 --- a/index.html +++ b/index.html @@ -38,7 +38,7 @@ } - + @@ -90,10 +90,10 @@ src_branch: gh-pages clean: true

    🤔 常见问题

    网页显示异常

    如果你的网站只显示文字而不能正常显示网页,可能是因为网站路径不正确导致的页面样式错误。比如,GitHub Page 提示访问链接 https://xxx.github.io/yyy,则需要将 docs/.vuepress/config.ts 中的 base 改为 /yyy,其默认值为 /。请按照此路径将网站的 base 设置正确,以确保你的网站能够正常显示。

    同步服务器报错

    ERR_MODULE

    如果出现 Error [ERR_MODULE_NOT_FOUND]: Cannot find module 的报错,可能是第三方插件或 pacakge.json 环境依赖未正确配置。此报错出现的几率极低,如果遇到,可以使用最新版本的 package.jsonpnpm-lock.yaml 来覆盖本地设置,或者删除主目录下的 .npmrc 文件。

    静态文件名字总变

    VuePress 默认使用 Vite。在打包时,会为文件引入时间戳和 hash,并对其进行重命名。这会导致即使没有更新文章,大部分生成的静态文件也会发生更改。如果你希望减少重命名频次,可以使用「nohashnameopen in new window」分支。该分支使用的打包工具是 Webpack,并使用 chainWebpack 设置文件命名规则,避免不必要的文件重命名。(注意:nohashname 非主分支,不作功能更新。)

    本地运行 LearnHubs

    1. 为了本地运行,你需要安装 npm 和 pnpm 环境,可参考环境部署教程open in new window
    2. 将 LearnHubs 项目下载到本地后,在项目目录下打开终端,输入命令 pnpm i 安装依赖。
    3. 在终端中输入命令 pnpm docs:dev,若成功则会提示访问链接,默认为 http://localhost:8080/

    本地服务运行后,修改文件时页面会同步更新预览。若需停止本地服务器,可在终端中按下 Ctrl + C

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/intro.html b/intro.html index 0e40ae92..eb3ecb31 100644 --- a/intro.html +++ b/intro.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    个人介绍

    约 76 字小于 1 分钟...

    互联网广告人,

    迷信新工具、新方法,

    坚持批评与自我批评,对每一个机遇保持开放的态度,勇于尝试新鲜事物,

    热衷于研究开源软件和心理学理论,定期分享探索成果。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2017-04-18-wechat_multi_open.html b/posts/2017-04-18-wechat_multi_open.html index 0666333f..d3dbc7a9 100644 --- a/posts/2017-04-18-wechat_multi_open.html +++ b/posts/2017-04-18-wechat_multi_open.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    跳过第三方软件,一步到位实现微信双开的秘密

    工具微信约 469 字大约 2 分钟...

    由于工作原因,有时候我们需要在电脑上登录多个微信。但微信限制一个客户端只能登陆一个账号,PC 端 + 网页版就成了通用方案,操作效率下降许多。

    其实我们还有更好的办法。在微信 PC 版之余,同时安装微信 For Windows,就能实现客户端双开!

    微信 For Windows 安装

    打开「运行」对话框,输入并启动「应用商店」或「Microsoft Store」,搜索并安装 微信 For Windows

    安装好后,就能与微信 PC 版一齐启动,互不干扰。

    开机启动两个微信

    找到系统启动文件夹,文件夹路径为:%AppData%\Microsoft\Windows\Start Menu\Programs\Startup。或者打开「运行」对话框,输入命令「shell:startup」,回车即可打开「启动文件夹」。

    将微信 for windows 10 的快捷方式放到「启动」文件夹里。

    其他方法

    如果还需要继续多开微信,可以按住回车键,然后左键点击微信图标,需要开启几个就点击几次。

    也可以尝试 @刘舒怡 提到的办法:

    只要在 2 秒内快速连续双击打开软件,就能弹出很多登录界面,你想登多少个就登多少个

    此外,已有开发者专门为微信和 QQ 制作了多开补丁。若需同时打开四个或更多窗口,可以试用 RevokeMsgPatcheropen in new window,国内下载链接:RevokeMsgPatcher.v1.6.zipopen in new window

    然而,使用多开补丁存在一定风险。我仅尝试过其中的防撤回功能,建议在使用多开补丁时务必小心。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2017-04-22-rss_feed43_feedex.html b/posts/2017-04-22-rss_feed43_feedex.html index 7ec37f22..80eb3fee 100644 --- a/posts/2017-04-22-rss_feed43_feedex.html +++ b/posts/2017-04-22-rss_feed43_feedex.html @@ -38,7 +38,7 @@ } - + @@ -62,10 +62,10 @@ {*} </tr>

    点击 Extract,进行抓取。

    4. 整理 rss 输入格式

    「Define output format」是 Feed 的属性,通常前三项会被自动抓取一,后三项将之前获取的 item 里面的元素填入即可,{%1} 对应的是链接,所以填入「Item Link」,{%2} 对应标题则填入到「Item Title」。

    然后点击「preview」,完成制作,同时可以查看预览效果。

    如果注册了 FEED43 的账号,可以修改 RSS 地址,但链接不能使用中文,否则会导致 RSS 出错。

    5. 获取 RSS 地址

    点击 Feed URL 可得 RSS 地址,样例是 https://www.feed43.com/dianji.xmlopen in new window

    在阅读器中的效果如下:

    6. 全文抓取

    FEED43 导出的条目需要点击链接才能查看内容。要在 RSS 中展示全文,需要通过 FeedEx 再转换一次。注意:FEED43 免费用户过多,需要在浏览器中打开一次才能获得真实链接(一般为 http://node2.feed43.com)。FeedEx 需要使用真实链接,一般 3 分钟内转换完毕。

    FeedEx: https://feedex.net/open in new window

    Feeds43 的免费版每 6 小时抓取一次,最多显示最新的 20 条内容。如果网页源更新较频繁,建议使用 RSSHub 和 Huginn。

    RSS 合集

    汇总的 RSS 永久订阅 feeds 均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2017-07-28-office_2016_installer_error.html b/posts/2017-07-28-office_2016_installer_error.html index 4a9a0d63..57fd046b 100644 --- a/posts/2017-07-28-office_2016_installer_error.html +++ b/posts/2017-07-28-office_2016_installer_error.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    office 2016 安装程序报错解决办法

    系统office约 477 字大约 2 分钟...

    重新安装 Office 系统或更改安装组件时,经常提示:「找不到有效的安装源」,但实际这些文件都能在安装包内找到。这是由于注册表和组件而导致的报错,「找不到有效的安装源」并不是真实原因,解决方法查看下方。

    解决方法

    1. 打开 regedit.exe,在注册表中找到路径 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Delivery\SourceEngine\Downloads\{90160000-00BA-0804-1000-0000000FF1CE}-C\Sources\PROPLUS16(RG)-6186D162

    2. 修改 Path 数据,改为安装包位置,比如 F:\5.软件资源\系统重装\SW_DVD5_Office_Professional_Plus_2016_64Bit_ChnSimp_MLF_X20-42426\groove.zh-cn

    3. 在 C 盘建立安装组件:

      • 把安装包路径 \groove.zh-cn\ 下的文件复制到 C:\MSOCache\All Users\{90160000-00BA-0804-1000-0000000FF1CE}-C 目录下 (如果没有这个目录就自己建立)。
      • 把安装包路径 \proplus.ww\ 下的文件复制到 C:\MSOCache\All Users\{90160000-0011-0000-1000-0000000FF1CE}-C
    4. 将需要的程序文件放入 MSOCache 路径
      MSOCache 其它的目录下内容同样根据注册表的内容把它指示的光盘中的安装文件复制到相应的目录下。如果没有那个目录就要自己建立,类似的目录一共有 12 个。
      如果不想全装可以只选择需要的软件,下面以 Onenote 和 Access 为例。

      • Onenote 把安装包路径 \onenote.zh-cn\ 下的文件复制到 C:\MSOCache\All Users\{90160000-00A1-0804-1000-0000000FF1CE}-CC
      • Access 把安装包路径 \access.zh-cn\ 下的文件复制到 C:\MSOCache\All Users\{90160000-0015-0804-1000-0000000FF1CE}-C
    5. 最后进入安装包运行 setup.exe 安装正常。

    Office 组件报错大都是由于 MSOCache 目录被删,建议安装 Office 后不要删除该目录。使用优化工具时,要注意保留 MSOCache 目录及其下的文件。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html b/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html index 77be4896..c508e36b 100644 --- a/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html +++ b/posts/2017-07-29-onenote_2016_cannot_be_logged_in.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    OneNote 2016 无法登陆问题解决

    系统OneNote约 153 字小于 1 分钟...

    OneNote 安装后,提示输入账号,但点击「下一步」始终没反应,无法进行登陆。

    打开 IE 浏览器,访问 live.comopen in new window,如果网页提示「登录需要启动 JavaScript」,说明问题的根源出在 IE 的设置上。

    点击「IE 设置」>「Internet 选项」>「安全」>「自定义级别」,然后启用脚本选项的「Java 小程序脚本」和「活动脚本」。

    完成设置后,即可正常登录并打开 OneNote。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2017-09-02-forced_shutdown.html b/posts/2017-09-02-forced_shutdown.html index 11461334..50b4134b 100644 --- a/posts/2017-09-02-forced_shutdown.html +++ b/posts/2017-09-02-forced_shutdown.html @@ -38,7 +38,7 @@ } - + @@ -57,10 +57,10 @@ cmd /c reg add "HKEY_CURRENT_USER\Control Panel\Desktop" /v WaitToKillAppTimeout /t REG_SZ /d 2000 /f

    ——————————

    网上流行一种通过修改「gpedit.msc」达到快速关机的方法,但实际测试结果表明,这种方法并不能实现强制关机。以下为这种方法的操作流程记录,仅供参考:

    1. 点击桌面左下角“windows”图标,选择“运行”选项;

    2. 进入运行窗口,输入“gpedit.msc”命令,按下回车键确定;

    3. 打开本地组策略编辑器界面,依次展开“计算机配置——管理模板——系统——关机选项”文件夹;鼠标右击右侧“关闭会阻止或取消关机的应用程序的自动终止功能”选项,接着选择“编辑”功能;将弹出窗口选项更改成“已启用”,然后点击“应用——确定”按钮。

      但开启后,提示程序没有响应,无法关机。

    修改“gpedit.msc”虽然可以撤销程序阻止关机的权限,但它并没有赋予关机进程对程序的关闭权限,因此并不能达到强制关机的效果。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2017-09-03-smb_lan_sharing.html b/posts/2017-09-03-smb_lan_sharing.html index 31d9b979..931ba22a 100644 --- a/posts/2017-09-03-smb_lan_sharing.html +++ b/posts/2017-09-03-smb_lan_sharing.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    加速 SMB 协议,让 PC 变身小型 NAS

    系统smb约 268 字小于 1 分钟...

    Windows 系统开启 SMB 协议:

    1. 打开「控制面板」窗口,在「类别」查看方式下单击「程序」。

    2. 打开「程序」窗口,单击「启用或关闭 windows 功能」。

    3. 打开「windows 功能」窗口,勾选 SMB 直通。

    4. 勾选「远程差分压缩 API 支持」。

    网上很多教程都要求关闭“远程差分压缩”复选框,这是对“远程差分压缩”的误解。

    官方解释:远程差分压缩 (RDC) 功能是一组应用程序编程接口 (API),这些应用程序可用于确定某个文件集是否发生了变化,如果是,就检测哪部分文件进行了更改。RDC 检测文件中数据的插入、删除和重新排列,使应用程序能够仅复制文件的已更改部分。这对于在有限带宽网络(如广域网 (WAN) 连接)上复制文件非常有用。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2017-10-18-light_cat_e8-c-epon_admin.html b/posts/2017-10-18-light_cat_e8-c-epon_admin.html index 21f6c88e..0af41627 100644 --- a/posts/2017-10-18-light_cat_e8-c-epon_admin.html +++ b/posts/2017-10-18-light_cat_e8-c-epon_admin.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)

    网络光猫约 326 字大约 1 分钟...

    为什么要获得光猫超级密码?

    它可以用于端口映射(eMule high ID)和桥接模式(路由器掌控拨号,但不兼容固定电话)。网上关于光猫超级密码的获取攻略大多是在 2012-14 年发布的,现在已经不能使用了。

    破解测试环境

    运营商:上海电信
    光猫型号:贝尔 E8-C-EPON
    硬件版本:RG201O-CA_V1A2
    软件版本:E201OCAA2V11S

    光猫超级密码破解

    1. 地址栏输入 192.168.1.1,用户名:<光猫背面>,密码:<光猫背面>,登录管理界面。

    2. 在浏览器地址栏输入 192.168.1.1/backupsettings.txt,将 backupsettings.txt 文件导出并备份在电脑上。如果无法打开,请改为输入 192.168.1.1/backupsettings.conf,并做好备份。

    3. 打开下载的 backupsettings.txtbackupsettings.conf 文件,搜索 TeleComAccount,两个 password 之间就是超级密码。超级账号是 telecomadmin

    4. 输入地址 192.168.1.1,用刚获取的超级密码登录,然后可以进行端口映射和设备桥接。

    如果新安装的光猫无法获取超级密码,可以使用运营商的官方应用进行映射。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2017-10-18-light_cat_port_forwarding.html b/posts/2017-10-18-light_cat_port_forwarding.html index 9a0e4497..466b0f09 100644 --- a/posts/2017-10-18-light_cat_port_forwarding.html +++ b/posts/2017-10-18-light_cat_port_forwarding.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    光猫改造 篇二:光猫 + 路由器,实现端口映射

    网络光猫约 207 字小于 1 分钟...

    光猫默认没有管理权限,需要先获得光猫的超管密码,参考光猫改造 篇一:超级管理员密码破解(E8-C-EPON RG201O-CA_V1A2)open in new window

    光猫端口映射步骤:

    1. 登陆光猫管理地址 192.168.1.1,应用 → 高级 NAT 设置 →DMZ 设置,启用 DMZ 主机绑定路由器地址(路由器 WAN 口 IP 地址 -192.168.1.X)

    2. 登陆路由器管理地址 192.168.X.X。这里已梅林 AC5300 为图例。

    3. 在路由器设置选项中找到“端口转发”,按要求设置端口。我这是 eMule TCP 和 UDP 转发,设置完成后,变成 High ID。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-01-19-forget_the_cdn.html b/posts/2018-01-19-forget_the_cdn.html index e6e3cf47..8d5ccfd8 100644 --- a/posts/2018-01-19-forget_the_cdn.html +++ b/posts/2018-01-19-forget_the_cdn.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    小型网站管理员,快放弃 CDN!

    服务器CDN建站约 652 字大约 2 分钟...

    CDN 的全称是 Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN 系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet 网络拥挤的状况,提高用户访问网站的响应速度。

    国内 CDN 有阿里云、腾讯、百度、网宿、七牛云、又拍云等。

    这里以阿里云 CDN 为例。我之前使用阿里云全站 CDN,一直以为速度会加快。但命中率只有 7%,在更换为 ECS 后,命中率更降为 2%。

    更可怕的是,我提交工单后才得到的事实。CDN 运营商会根据 DNS 分配就近分配 CDN 节点,抓取网站缓存。

    第一反应:「不错啊。如果网站在北京,访客在上海,直接访问上海的节点,速度必然要快一些。」

    但事实并没有这么完美。CDN 是根据本地 DNS 来分配节点。

    你从上海放出访问申请,DNS 有可能帮你分配去广东的节点。极端情况下,有可能分配到不同运营商,导致无法打开网站。

    我进行了三个测试,本地网络环境都是上海电信,更换了 DNS 设置。

    第一次测试使用 114DNS,分配了广州鹏博士网络,网站打不开。提交工单后,客服反映这个节点是局域网节点,只有鹏博士网络才能打开。

    第二次测试使用电信默认 DNS,分配苏州电信,网站正常。

    第三次测试使用阿里云 DNS,分配杭州电信,网站正常

    后面两次虽然都能打开网站,但没有一个分配在上海电信,这种加速又能快多少呢?

    在网站配置足够、流量不大(日均访客 1000 以内) 时,不建议使用全站 CDN,这只会拖累访问体验。小网站只适合将图片部署在 CDN。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-01-31-hire_a_robot.html b/posts/2018-01-31-hire_a_robot.html index e6015276..03e0ddbc 100644 --- a/posts/2018-01-31-hire_a_robot.html +++ b/posts/2018-01-31-hire_a_robot.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    雇个机器人帮你干活

    自动化Huginnrss约 494 字大约 2 分钟...

    机器人会取代你工作!
    计算云会取代你工作!
    AI 会取代你的工作!

    我相信科技终究有一天会消灭所有工作,但我们这代人的无奈就是很难等到这一天。

    作为懒人、宅男,等不及了怎么办?

    既然还没被取代,那就雇个机器人帮你干活

    我每天第一件事是去各个网站看热门新闻、行业资料。以前是用 RSS,但 RSS 被视为落后,越来越多的网站不再提供 RSS 源。离开 RSS,我就一直没找到更合适的方法去将内容聚合起来,不得不在一个个网站间疲于奔命,逐渐不再看内容。

    RSS(Really Simple Syndication) 是一种描述和同步网站内容的格式,是使用最广泛的 XML 应用。简易信息聚合(也叫聚合内容)是一种 RSS 基于 XML 标准,在互联网上被广泛采用的内容包装和投递协议。

    直到遇到了我的第一个机器人雇员 Huginnopen in new window

    Huginn 是一个可以创建为你在线执行自动化任务的系统。Huginn 可以读取网页,监测事件并且执行符合你需求的动作。Huginn 通过 agents 创建并执行任务(事件流)。你可以将它看作是一个运行在你自己服务器上的 IFTTT 或 Zapier。

    Huginn 帮我将所有信息聚合成 RSS,24 小时帮我获取我要的内容。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-04-30-baota_deploy_vps.html b/posts/2018-04-30-baota_deploy_vps.html index 9462d16e..e173c913 100644 --- a/posts/2018-04-30-baota_deploy_vps.html +++ b/posts/2018-04-30-baota_deploy_vps.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    新手建站神器 - 宝塔面板

    服务器宝塔面板建站约 236 字小于 1 分钟...

    新手建站最大的痛苦就是对服务器环境不熟悉,难以管理部署。

    国产的宝塔面板可以轻松解决这个问题,可以在可视化界面中为服务器安装应用、同步文件、定期执行代码、管理服务。

    一键创建网站、FTP、数据库、SSL;安全管理,计划任务,文件管理,PHP 多版本共存及切换;自带 LNMP 与 LAMP

    宝塔面板界面图
    宝塔面板界面图

    宝塔安装说明:https://www.bt.cn/bbs/thread-1186-1-1.htmlopen in new window

    宝塔安装 LNMP 或 LAMP 环境

    LNMPLAMP 都是成熟的建站环境,根据自身需求选择其中之一即可。如果有特殊的定制需求,可以在左侧的「软件管理」中选择需要安装的环境。

    软件安装界面
    软件安装界面
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-05-01-jekyll_blog_on_github_pages.html b/posts/2018-05-01-jekyll_blog_on_github_pages.html index efbf8717..48b15a71 100644 --- a/posts/2018-05-01-jekyll_blog_on_github_pages.html +++ b/posts/2018-05-01-jekyll_blog_on_github_pages.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Jekyll 篇一:3 分钟搭建 Github Pages 博客

    博客JekyllGithub建站约 271 字小于 1 分钟...

    一直都想建立自己的个人博客,重装过 N 次 WordPress,又因为种种原因而放弃。

    偶然看到了 Hux 的 Jekyll 模板,被漂亮的设计给迷住了。Github Pages 默认支持 Jekyll 环境,并提供了免费空间和流量,因此开始了 Github Pages + Jekyll 之路。

    搭建流程

    1. 注册并登录 Githubopen in new window

    2. 选择一个喜欢的 Jekyll 模板open in new window, 进入对应的 Github 主页。我选了黄玄的 Hux Blogopen in new window

    3. 点击 Fork, 将喜欢的模板复制到自己的 Github 仓库中。

    4. 点击 Setting, 修改 Repository namexxx.github.io, xxx 是你的 Github 用户名。

    5. 同一页面选择「Code and automation」>「Pages」>「Build and deployment」>「Branch」, 将 master branch 设为 Github Pages 来源,网站运行目录默认为 /(root)。设置好后,点击「Save」。

    6. 最后,按页面提示访问链接 https://xxx.github.io/,新博客搭建完毕。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-05-02-jekyll_blog_on_vps.html b/posts/2018-05-02-jekyll_blog_on_vps.html index 9a0ace77..101d871f 100644 --- a/posts/2018-05-02-jekyll_blog_on_vps.html +++ b/posts/2018-05-02-jekyll_blog_on_vps.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Jekyll 扩展篇:服务器搭建 Jekyll 博客

    博客Jekyll建站约 196 字小于 1 分钟...

    Github 墙得太厉害,就想在服务器上自建 Jekyll 环境,用上 Travis CI 和 Docker 后才发现完全没必要。。

    Jekyll 环境官方安装指南open in new window

    1. 使用 RVM 安装 Ruby (rvm -> ruby -> gem 网上大量教程就不赘述了)

    2. 安装 jekyll:gem install jekyll

    3. 进入 jekyll 网站,执行命令行 jekyll build,生成 Jekyll 静态网页。

    4. 网站的执行目录需要指定在 _site,这是 Jekyll 生成的静态页面目录。之后每次更新博客,都需要进入服务器执行一次 jekyll build,重新生成静态页面。

    愿意折腾的话,可以使用 Travis CI 和 Docker 完成全自动化更新。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-05-03-jekyll_blog_autodeploy.html b/posts/2018-05-03-jekyll_blog_autodeploy.html index cfe3b9cf..acadad59 100644 --- a/posts/2018-05-03-jekyll_blog_autodeploy.html +++ b/posts/2018-05-03-jekyll_blog_autodeploy.html @@ -38,7 +38,7 @@ } - + @@ -170,10 +170,10 @@ sudo: false # route your build to the container-based infrastructure for a faster build

    具体 .travis.yml 配置,请参考 官方文档open in new window

    参考资料&引用:

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-05-04-audition_cut_mp3.html b/posts/2018-05-04-audition_cut_mp3.html index d7d258e1..45da3cf3 100644 --- a/posts/2018-05-04-audition_cut_mp3.html +++ b/posts/2018-05-04-audition_cut_mp3.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    怎么用 Adobe Audition 快速剪切音频?

    工具Audition音频约 260 字小于 1 分钟...

    很久没剪音频了,突然被朋友拜托,才发现 Audition 剪切音频有多非人性,操作跟 10 年前的软件相比,没任何进步。

    简易剪切流程

    1. 在 Audition 中打开音频文件。

    2. 选定要删除的音频部分:左键按住在删除音频起点,然后拉动到删除音频重点,放开左键。

    3. 点击右键,选择删除。刚才选择的音频就被删除了。

    4. 在混音器中点击,用鼠标滚轮放大音频的可选间距,重复上面 3 步,继续剪切音频。

    5. 精修完后,点击「文件」>「另存为」,就可以保存我们的音频文件了。

    PS:原本是想用时间来截取音频,但找遍 Audition 菜单,也没发现能按时间来剪切的选项。最后还是靠鼠标完成的。。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-05-15-aria2_a_new_download_tool.html b/posts/2018-05-15-aria2_a_new_download_tool.html index 6cff8387..d007b511 100644 --- a/posts/2018-05-15-aria2_a_new_download_tool.html +++ b/posts/2018-05-15-aria2_a_new_download_tool.html @@ -38,7 +38,7 @@ } - + @@ -56,10 +56,10 @@

    在文档最后一行添加 BT trackers,最新 trackers 列表从 ngosang/trackerslistopen in new window 中获取,tracker 中用 , 隔开。

    # bt-tracker 更新,解决 Aria2 BT 下载速度慢没速度的问题
     bt-tracker=udp://tracker.opentrackr.org:1337/announce,udp://9.rarbg.com:2810/announce,udp://opentracker.i2p.rocks:6969/announce,https://opentracker.i2p.rocks:443/announce,udp://tracker1.myporn.club:9337/announce,udp://tracker1.bt.moack.co.kr:80/announce,udp://tracker.torrent.eu.org:451/announce,udp://p4p.arenabg.com:1337/announce,udp://open.stealth.si:80/announce,udp://open.demonii.com:1337/announce,udp://ipv4.tracker.harry.lu:80/announce,udp://explodie.org:6969/announce,udp://exodus.desync.com:6969/announce,https://tracker.tamersunion.org:443/announce,https://tracker.nanoha.org:443/announce,https://tracker.lilithraws.org:443/announce,https://tr.burnabyhighstar.com:443/announce,https://1337.abcvg.info:443/announce,http://tracker.mywaifu.best:6969/announce,http://bt.okmp3.ru:2710/announce
     

    其他设置不常用,有时间的话,你可以慢慢调整。

  • Aira2 没有原生应用界面,可以输入网址 http://aria2c.com 使用第三方下载界面。该页面会自动与本地的 aira2c 程序关联,实现下载管理,建议把其收藏到书签,以便日后使用。[2]

  • 如果出现「Aria2 RPC 服务器错误」,请检查 JSON-RPC Path 是否为 http://localhost:6800/jsonrpc。注意,页面链接须为 http 而非 https。如果依然报错,则说明 aria2.conf 配置有误,建议下载 真·懒人包open in new window

    Aria2 进阶

    更换 Aria2 界面

    AriaNgopen in new window 的界面类似传统的下载软件,使用简单。

    AriaNg 界面

    使用方法:下载并解压 AriaNgopen in new window,运行目录下的 index.html,打开 Aria2 WebUI 界面,将页面链接收藏到书签以便后续使用 Aria2。

    如果 AriaNg 页面出现报错,则从页面左侧选择「AriaNg 设置」>「RPC」,检查 RPC 地址,默认地址为 localhost:6800

    Aira2 下载预热

    Aira2 下载预热是 BT 下载前的必备步骤,否则速度容易很慢。

    找一个热门影视的 BT 种子(注意是种子,不是磁力链接),然后下载并挂着做种。过几个小时后,退出 Aria2 或者等待 Aria2 会话自动保存,你会发现 dht.dat 从空文件变成有数据了,之后的 BT 下载速度就会快很多。

    很多 BT 客户端一样,Aria2 有个 dht.dat 文件 (开启 ipv6 还有个 dht6.dat),这玩意用于存储一种叫做 DHT Routing Table 的东西,DHT 网络由无数节点组成,你接触到一个后能通过它接触到更多的节点,Aria2 我记得是有内置的节点,但是!如果你在 Aria2 第一次运行的时候直接下载磁力链接或者冷门种子,你很可能遇到连 MetaData 都无法获取的情况,这就是因为第一次只是初始化 dht.dat 文件,你本地不存在 DHT Routing Table 的缓存,所以你无法从 DHT 网络中获取足够的数据。[3]

    接管浏览器下载

    如果想用 Aria2 接管浏览器的下载管理,需安装插件/扩展。

    安装完「添加到 aria2」扩展后,右键扩展图标,点击「选项」>「设置」,设置如下:

    注意:「添加到 aria2」图标显示的 en 表示处于开启状态,dis 表示处于关闭状态,点击图标可以切换使用状态。

    Aria2 启动器

    每次启动 Aria2 下载时,都需要执行两个文件:打开 WebUI 链接和 aria2c,这有点麻烦。因此,我使用 AutoHotkey 做了一个启动器,它可以检测 aria2c 运行状态,并一键打开下载界面,以简化 Aria 的启动过程。

    下载 Aria2 启动器open in new window,然后将其解压到 Aria2 运行目录,例如 D:\Aria2。Aria2 启动器提供了两种方式,只需选择其中一种即可。


    1. Aria2 基础上手指南open in new window ↩︎

    2. aria2 懒人安装教程open in new window ↩︎

    3. 解决 Aria2 BT 下载速度慢没速度的问题open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-05-24-airtable_noob.html b/posts/2018-05-24-airtable_noob.html index 853a628a..263e1b3e 100644 --- a/posts/2018-05-24-airtable_noob.html +++ b/posts/2018-05-24-airtable_noob.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    真· Airtable 3 分钟菜鸟入门

    工具Airtable约 1012 字大约 3 分钟...

    Airtable 是新型的表格制作工具,可以把文字、图片、链接、文档等各种资料聚合在一起,成为我们的私人定制资料库

    之前好几次看到介绍 Airtable 的文章,但每次的尝试都被繁多的模板给击败了。

    这次换了个思路,抛弃既有的官方模板。从空白表格开始,小白也可以 3 分钟入门 Airtable。

    建立空白 Airtable

    1. 注册并登录 Airtableopen in new window

    2. 点击「Add a base」, 然后选择「Start from scratch」, 从空白表格启动。

    3. 进入刚刚新建的表格,界面跟 Excel 蛮像的。

    4. 在第一栏单击右键,唤出 field 栏目选项,可以更改 filed 栏目类型和名称。

    5. filed 栏目类型可以设为文本、链接、附件、单选多选等多种玩法,在使用中可以多试试。

    更多玩法,参考官方说明文档open in new window

    应用 Airtable

    既然 Airtable 是个资料库,我们需要先为这个资料库准备个主题。

    想想自己有什么需求,怎么的资料库才可以帮助你?

    我喜欢玩一些新奇软件。这些软件的入门学习大多会超过 3 小时。从产生学习冲动到实际学习,中间间隔一个月。等实际学习入门的时候,收集的信息早已忘光,不得不重新收集。

    因此,我需要一个能汇集「入门学习资源」的资料库。

    1. 按资源需求,列出应用名、资源说明、链接、进度。

    2. 点击「Group」,按类别重组表格。

      选定后,表格会按类型分开显示,界面简洁许多。(Group 是我个人最爱的功能,太漂亮了)。

      当表格越来越多后,我们可以使用「Hide fields」和「Filter」来只显示需要的元素。

    Hide fields : 取消后,隐藏不需要的 fields 栏目。

    FilterGroup 功能类似,都是通过特定条件,过滤出符合要求的 fields

    以上的内容虽然和 Excel 有些不同,但大都能通过 Excel 实现。Airtable 与众不同的是视图变形功能,同样的内容却能通过不同的图表形式传达出来。

    Airtable 变形记

    Airtable 拥有 Grid、Form、Calendar、Gallery、Kanban 这 5 种视图。

    Grid view 是默认的格子视图,我们接下来一个个了解另外 4 种视图。

    Form view 表单视图

    Form view 表单视图是调查问卷(协同工作?)工具。其他人可以通过加密链接,为你添加表格数据。

    打开加密链接后,看到如下视图,填写后发送。

    切换到 Grid view,刚才添加的数据已经添加如表格了。

    Calendar view 日期视图

    Calendar view 日期视图是日程安排表,一定要包含日期 field

    所有的项目都按设定日期排列了。这个表格的第一列名字大都相同,所以看不出区别。

    点击单个事件,会有具体说明。

    Gallery view 把每行数据变成一个卡片。

    Kanban view 看板视图

    Kanban view 将数据重新排列为一个个看板。 (Kanban 这名字简洁明了,Airtable 开发团队里有国人?)

    如果表中没有「Single select」或「Collaborator」的 fields , Airtable 会提示新建 field 来命名看板,普通用户建议选第一个「Create a new single select field」。

    Kanban 的界面和操作类似于 Trello,手动拖动卡片就可以操作。

    参考资料:

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-06-08-baizhuo_gp1700.html b/posts/2018-06-08-baizhuo_gp1700.html index c53e4324..b71d0aa2 100644 --- a/posts/2018-06-08-baizhuo_gp1700.html +++ b/posts/2018-06-08-baizhuo_gp1700.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射

    网络GP1700光猫约 394 字大约 1 分钟...

    宽带升级到千兆网络后,电信全面更新了光猫,关闭了的光猫管理地址,只能通过官方 APP「网络管家」管理光猫。

    电信「网络管家」功能

    • 重启光猫;
    • 开启 UPnp;
    • 开启 DMZ 主机,建立端口映射;
    • 建立虚拟服务器,内网穿透访问。

    开启光猫端口映射、内网穿透

    1. 登录路由器管理地址 192.168.X.X。这里以梅林 AC5300 为图例。

    2. 打开电信官方 APP「网络管家」,依次点击中间的「路由器图标」→「高级设置」→「DMZ 主机」,启用 DMZ 主机并绑定刚刚获得的路由器 WAN IP 地址 - 192.168.1.X 。

    3. 光猫内网穿透:当外网要访问局域网(192.168.1.3:1194)时,进入网络管家中「高级设置」→「虚拟服务器」,添加内部 IP 192.168.1.3、内部端口号 1194 和服务器端口号。服务器端口号可根据需求设置。假设光猫 IP 为 180.154.109.143,外网只需访问「180.154.109.143:12345」就可以计入局域网(192.168.1.3:1194)。

    4. 路由端口转发:进入路由器「高级设置」-「外部网络(WAN)」-「端口转发」,按要求设置端口。我这是 eMule TCP 和 UDP 转发,设置完成后,变成 High ID。

    PS. 新版光猫不需要管理员权限就可以获取端口映射、DMZ、UPnp 等权限,但光猫桥接功能也很难破解了。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-06-10-koolproxy_https.html b/posts/2018-06-10-koolproxy_https.html index e3620b55..94ff5835 100644 --- a/posts/2018-06-10-koolproxy_https.html +++ b/posts/2018-06-10-koolproxy_https.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    koolproxy 无法下载 https 证书?

    网络koolproxy约 295 字小于 1 分钟...

    注意

    KoolProxy 已经很长时间没有更新了,视频广告规则经常过期。有人反馈本文已失效。

    koolproxy 是可以运行在路由器上的广告屏蔽软件,跟其他最大的区别就是支持 https , 能有效屏蔽最新的视频应用广告(播个 10 分钟视频,广告 60 秒。。。)

    为了屏蔽 https 广告,koolproxy 需要在每台设备上安装 https 证书。但我访问证书地址 110.110.110.110 时,却被提示无法访问。

    这是我们需要进入路由器后台,对证书地址进行操作。

    进入路由器后台,一般设置-Tools-Run Cmd ,运行命令 iptables -t nat -I PREROUTING -d 110.110.110.110 -p tcp --dport 80 -j REDIRECT --to 3000。重启后,该命令失效。

    运行命令后,就可以下载 https 证书,之后的设置参考 Merlin 版 Koolproxy3.1.x 使用教程open in new window

    保存 Koolproxy 设置后,一定要重启路由,否则可能部分屏蔽设置未成功生效。

    参考资料:

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-06-19-iptv_direckly.html b/posts/2018-06-19-iptv_direckly.html index 2d07820b..c83b053c 100644 --- a/posts/2018-06-19-iptv_direckly.html +++ b/posts/2018-06-19-iptv_direckly.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    客厅、书房、卧室,任意收看 IPTV 直播!

    网络IPTV约 682 字大约 2 分钟...

    随着电视、机顶盒、以及 IPTV 盒的增多,家中的遥控器也变得越来越多。为了摆脱众多的遥控器,开始直接使用直播源来播放电视。

    如果你有上海电信的 IPTV,可以使用 lucifersun 抓取的上海电信 IPTV 视频回放源open in new window(原理上仅限上海电信)。借助直播源地址,我们可以在 PC、电视、手机上直接看电视直播。这个 IPTV 直播源比电视直播慢 15 秒,对普通用户来说已经足够了。回放服务器已屏蔽公网 IP 的访问,仅限 vlan85 的 B 平面专网 IP 访问,参考:电信公网疑似已屏蔽回放源 IP · Issue #28open in new window

    这个播放列表使用 IPTV 的频道 回放 功能。IPTV 直播用的是专网组播,无法直接通过 Internet 播放。
    因为不是所有频道都支持回放,所以这个列表里的频道 必然少于 IPTV 的直播频道。
    还有部分频道的回放地址播放错误,所以也没有收录。

    如果你没有 IPTV,推荐使用 fanmingming 的 liveopen in new window 项目,这是一个国内可直连的直播源分享项目,直播源支持 IPv4/IPv6 双栈访问。

    提取直播源列表

    进入上海电信 IPTV 视频流地址open in new window。点击「生成 txt 内容」,然后复制下方的视频直播源列表,保存为 tv.txt,并将 tv.txt 文本转为 ANSI 编码(避免节目名会出现中文乱码)。

    电视盒子直播

    1. 电视盒子上安装 APP-「超级直播」。

    2. 进入「超级直播」应用后,点击「设置」-「二维码扫一扫 开启更多功能」,调出隐藏管理地址 192.168.2.203:9188

    3. 用与电视盒子位于同一局域网的电脑或手机访问隐藏管理地址,点击「我」-「上次自定义 (tv.txt)」-「上传」,上传刚保存好的 tv.txt。

    4. 将「超级直播」的播放列表切换到自定义,直接观看导入的电视节目。

    PC 端电视直播

    1. PC 端安排 Potplayeropen in new window

    2. 复制节目 rtsp 直播源链接,打开 Potplayer , 右键单击主界面 >「打开」>「打开剪贴板」。

    这样就可以在 PC 端看电视了。

    参考资料:

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-10-07-huginn_scraping_any_website.html b/posts/2018-10-07-huginn_scraping_any_website.html index 2aa7185b..5e88ccbf 100644 --- a/posts/2018-10-07-huginn_scraping_any_website.html +++ b/posts/2018-10-07-huginn_scraping_any_website.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)

    自动化Huginnrss约 843 字大约 3 分钟...

    烧制网页 RSS 源,主要有 FEED43Huginn 两种方法。

    • FEED43:简单免费,六小时抓取一次,每次抓取 20 条静态页面。
    • Huginn:自由度高,能自定义抓取频率、内容结构、js 结果、输出样式等;需要搭建服务器,学习 Huginn 抓取规则。

    Huginn 准备工作

    PhantomJs 网页抓取

    新建 Huginn 任务组 Scenario「国内应急新闻」,样例抓取链接为 http://www.cneb.gov.cn/guoneinews/

    页面缓存

    使用 Phantom Js Cloud Agent,获得动态网页缓存。

    解析网页内容

    使用 WebsiteAgent,抓取网页内容。

    获取内容路径

    使用火狐浏览器打开目标页面,获取 css path 路径。

    1. 按下 F12, 然后点击 Developer Tools 左上角的检查指针

    2. 选中要抓取的部分。

    3. 回到 Developer Tools 窗口,右键选中的蓝色部分,获取 css path、Xpath。这里以 css path 为例。

    4. 初始 css path 路径,html body div.area.areabg1 div.area-half.right div.tabBox div.tabContents.active table tbody tr td.red a

    5. css path 原始路径过长,删去不带 .# 的节点(节点间以空格“ ”分割),并删去每个节点在 .# 前的第一个标签,得到 .area.areabg1 .area-half.right .tabBox .tabContents.active .red a

    6. 前半部分对节点定位无用,继续省略(比如:中国上海,省略掉中国,大家也知道上海在哪),获得短路径 .tabContents.active .red a

    特殊路径处理

    • 有些路径中的节点带空格,如 <div class="packery-item article">,路径中的空格由 . 代替,截取为 .packery-item.article
    • 当抓取多种 css path 规则时,用逗号分割,比如 "css": ".focus-title .current a , .stress h2 a",

    导出 RSS

    使用 DataOutputAgent,将抓取内容导出为 RSS。

    回到 Scenarios,点击 Data Output Agent 旁的按钮「Actions」>「Show」,复制导出的 xml 链接 http://xxx.xxx/users/1/web_requests/xxx/xxxx.xml

    点击网盘下载open in new window国内应急新闻的详细设置,导入到 Huginn 即可使用。其他问题参考 PhantomJs Cloud 英文攻略open in new window

    微信的屏蔽措施非常之多,公众号抓取可以尝试 wechat-feedsopen in new window

    RSS 合集

    汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2018-12-28-voice_input_try.html b/posts/2018-12-28-voice_input_try.html index a3c0ea20..567f3299 100644 --- a/posts/2018-12-28-voice_input_try.html +++ b/posts/2018-12-28-voice_input_try.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    等了十年,PC 端能用的语音输入方案来了

    自动化语音输入约 1942 字大约 6 分钟...

    从 XP 时代开始,我幻想用语音转文字。后来,手机提前实现了这功能,电脑端的语音录入却一直没进展。

    为了能在 PC 上用语音打字,我从 2013 折腾到 2022,经历了各种硬件和软件,终于找到最适合 PC 端的语音输入方案。

    讯飞 + 小麦克风

    2013 年,讯飞推出 PC 版输入法。我以为 PC 语音输入的时代已经来临,买了个十几块的小麦克风,尝试语音转文字。

    可测试结果却让人大跌眼镜,语音识别准确率异常的低。即便我把麦放在嘴边,依然无法录清楚,超过 80% 内容识别错误。

    过低的识别率,让我怀疑是麦克风的收音出了问题,要想语音打字就需要换个好点的话筒。但囊中羞涩,只能暂停尝试。

    讯飞 + Blue Yeti

    过了几年,经济宽裕点后,下单网红录音话筒 Blue Yeti,幻想着 4 位数的话筒能带来完美的收音识别效果。

    Blue Yeti
    Blue Yeti

    但事实却是再度被打击

    对 Blue Yeti 的收音测试中,再次发现大量杂音,收货当天就直接退货。

    十几元的麦克风和一千元的话筒收音效果差不多,语音输入的识别率也都超低。这让我猜测,语音输入识别率低与硬件无关,而是 PC 端的语音输入方案尚未成熟,是软件方面导致的问题。

    就这样,我再次暂停了 PC 上的语音输入尝试。

    外置声卡 + 动圈话筒

    之后,用了 5 年的音箱出现问题,我升级了音响,并顺势添置了外置声卡,视听体验大幅提升。玩着玩着,突然想起我的语音输入梦,决定再尝试一次。

    有了外置声卡,麦克风的选择多了许多,可以连接卡侬线接口的话筒了。

    麦克风分为两类:电容麦、动圈麦。

    电容麦收音好,但比较娇贵,怕潮怕摔,不能用桌面话筒架,适合用悬臂挂在空中,每次用完之后需要收起来。动圈麦的灵敏度和还原度都低于电容麦,存放和使用没什么要求,费用也会低些。

    电容麦克风太麻烦,就选了简单的动圈麦 - 舒伯乐 PRO248S。

    选好话筒后,又配了麦克风支架和卡侬线,连上原本的外置声卡,搞定语音输出的硬件配置。

    收音设备
    收音设备

    输入法之争

    音频硬件搞定后,开始折腾语音输入法。

    虽然讯飞在语音输入领域的牌子最响,但是讯飞 PC 输入法并不受重视,长年不更新。所以,我尝试了其他输入法的语音功能。测试中,搜狗的语音识别功能并不比讯飞弱,缺点也只有无法设置语音输入快捷键,整体体验上佳。于是,语音输入法切换成了搜狗。

    然而,有次备份系统设置,我发现搜狗词库高达 27 万条,其中 99% 的内容是垃圾词条,即使偶尔输入过一次的内容也被输入法记录。更可怕的是,这次词库无法从云端删除,只要你输入过一次,搜狗就永远记住了

    这哪里是输入法,根本是键盘记录器

    国内其他输入法在这点上也都半斤八两,为了不被键盘记录器惦记,我只能切换为开源的小狼毫输入法。

    语音输入则转用开源的 Quick Cutopen in new window,使用阿里云、腾讯云的商用语音接口,识别率比免费的搜狗和讯飞都高。

    Quick Cut 界面
    Quick Cut 界面

    Quick Cut 的缺点:语音输入时,要一直按大写键,不适合长语音录入;触发键无法更改,大写键与我的常用脚本冲突了。因此,长时间的语音输入只能借助手机上的飞书妙记来完成转录。

    最终方案:微软语音输入

    面对 Quick Cut 的长语音输入难题时,@李乐 推荐了微软语音输入-使用语音键入来说话,而不是在电脑上键入open in new window

    微软自带的语音输入,快捷键 Win + H。3 块钱的麦克风,距离 50 厘米,很低的声音读出来了。

    测试后,发现微软语音输入确实是好用,甚至好用到有点恐怖。测试中,我临时有事,走到另外一个房间和家人说话,回来后发现刚刚的对话也被微软语音输入正确识别。

    微软语音输入
    微软语音输入

    微软语音输入非常敏感,距离远、声音低也能识别。这样我不用为语音输入而特意移动话筒,可以继续把话筒放在不遮挡视野的远角。

    「语音键入功能在此应用上受限制」在 Notepad++ 和微信都出现了,Visual Studio Code 没出现,但实际上这提示对语音输入并没造成影响,平常可以忽略这个提示。

    虽然微软语音输入的识别率只有 85%,不如阿里云方案的 95%,可系统自带的优势太明显,微软语音输入体验感非常顺滑。

    启动快捷键 Win + H,语音识别立即会启动。如果中途没说话,应用会自动暂停,并对前面的输入进行整理,插入合适的标点符号。停止超过一分钟,语音识别才会暂停,等待再次启动。换言之,微软语音输入能一键完成长语音录入。

    之前的麦克风放着放着就坏了,所以我没测 @李乐 说的低价麦克风的语音输入效果。不过,微软输入的软件优化非常好,按照目前效果推测,用便宜的麦克风也能实现完美的收音效果。综合来说,微软语音输入是当前最完美也是兼容性最高的语音输入方案。

    总结与展望

    语音输入的 3 种方案:

    • 文章输入:微软语音输入 + 外置声卡 + 动圈话筒,兼容性最高,使用方便,但精度一般,用于文章草稿阶段。
    • 一句话输入:Quick Cut + 外置声卡 + 动圈话筒,一句话识别精度最高,适合聊天时使用。
    • 语音转录:飞书妙记 + 手机,录音转文字,长语音的识别率超高。

    与 2018 年相比,2022 年的语音输入方案已经完善了许多。硬件已经不再是问题了,便宜的话筒也能达到语音输入标准。语音识别进步明显,在 AI 技术的加持下,短句识别率从 90% 上升到 95%,长句识别率则从 50% 上升到 70%,标点符号均能正确插入。

    目前语音输入算法在提升最后 10% 的准确率,期待早日达到「口述与键盘输入完全一致」的一天。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2019-03-31-openvpn_back_to_home.html b/posts/2019-03-31-openvpn_back_to_home.html index 6245d2fa..a8f37ff5 100644 --- a/posts/2019-03-31-openvpn_back_to_home.html +++ b/posts/2019-03-31-openvpn_back_to_home.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    OpenVPN 随时随地回家的路

    网络OpenVPN内网穿透约 420 字大约 1 分钟...

    有时在外面需要访问家里的文件,或直接利用家中网络设置翻墙。为此,利用路由器 OpenVPN 搭建了一条回家的路。

    内网穿透

    连接家中内网,家里必须有个固定的访问地址。我将子域名 home.xxx.comopen in new window 指向家中 IP。

    梅林路由器进入「高级设置」→「外部网络(WAN)」→「DDNS」,将路由器指向准备好的子域名。

    电信分配的公网 IP 经常会更换,每次都需要重定向子域名。在路由器 koolshare - 软件中心中安装 Aliddns,帮助更新家的公网 IP。插件中输入定向子域名和阿里云的 appkey,配置就完成了。如果没有自动在阿里云解析,可以先手动解析设置。

    光猫设置参考光猫改造 篇三:百卓 GP1700 进阶设置 - 端口映射open in new window

    OpenVPN 配置

    内网穿透完成后,开始 OpenVPN 配置。梅林路由器进入「高级设置」→「VPN」→「虚拟专用网(VPN)服务器」,开启路由器自带的 OpenVPN。

    高级配置红色的部分有修改,特别是VPN 子网必须修改为与路由器不同的号段,如 192.168.3.0。如果使用默认子网,会无法顺利翻墙。

    应用设置后,点击「一般设置」,并导出 .ovpn 文件。打开该配置文件,将远程端口改为光猫上虚拟服务器映射的端口。

    最后,手机导入 .ovpn 设置文件,就可以上网回家了!

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2019-04-01-rsshub_noob.html b/posts/2019-04-01-rsshub_noob.html index 0211ce85..f62f66ad 100644 --- a/posts/2019-04-01-rsshub_noob.html +++ b/posts/2019-04-01-rsshub_noob.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    RSS 速成篇:RSSHub 捡现成的轮子

    自动化rssRSSHub约 428 字大约 1 分钟...

    RSS 使用中曾介绍了 feed43 和 Huginn,但这些工具要么需要学习,要么需要硬件。相较之下,RSSHub 拥有成熟的配置,可供直接使用。

    RSSHub 是一个开源项目,可将微博、知乎、豆瓣、bilibili、Youtube 等主流网站转化为 RSS。只需访问 RSSHub 官网open in new window,便可定期获取主流媒体的 RSS 项目更新。

    bilibili 番剧抓取示例

    1. 打开 RSSHub bilibili 专区open in new window,在此可根据番剧、UP 主等定制 RSS。

    2. 准备抓取番剧《盾之勇者成名录》的更新,番剧主页链接为 https://www.bilibili.com/bangumi/media/md4316482/,mediaid 为 4316482

    3. 按照路由参数,修改 RSS 链接 https://rsshub.app/bilibili/bangumi/media/4316482,然后在 RSS 阅读器中打开。

    附注:虽然 RSSHub 使用非常简单,但由于现已过于流行,微博、知乎等已开始反爬限制。若动手能力强,建议按下方教程自行部署或选择 Huginn。

    RSS 合集

    汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2019-08-26-scrcpy_screen_projection.html b/posts/2019-08-26-scrcpy_screen_projection.html index 56f18e56..328f3517 100644 --- a/posts/2019-08-26-scrcpy_screen_projection.html +++ b/posts/2019-08-26-scrcpy_screen_projection.html @@ -38,7 +38,7 @@ } - + @@ -84,10 +84,10 @@ .\scrcpy --audio-codec=aac .\scrcpy --audio-codec=raw

    输入法问题

    英文输入法及主流中文输入法均可正常使用。如中文输入出现问题,建议复制后再粘贴。

    投屏模糊

    如果屏幕设置了缩放比例,可能导致投屏界面模糊。为解决此问题,请右键单击 scrcpy.exe,选择「属性」>「兼容性」>「更改高 DPI 设置」,并勾选「替代高 DPI 缩放行为」选项。应用此设置后,投屏效果即可恢复正常。

    解决 scrcpy 投屏模糊

    如遇其他问题或错误,请参考 scrcpy 常见问题解答open in new window

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2020-03-25-rsshub_on_vps.html b/posts/2020-03-25-rsshub_on_vps.html index 15ccb8b7..78a638b7 100644 --- a/posts/2020-03-25-rsshub_on_vps.html +++ b/posts/2020-03-25-rsshub_on_vps.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    RSS 速成篇 2:RSSHub 自部署

    自动化rssRSSHub约 698 字大约 2 分钟...

    RSSHub 使用非常简单,但随着使用者增多,微博、知乎加大了反爬限制。目前大量源都无法直接使用,只能自建 RSSHub 来解决稳定性。部署前,准备好域名和服务器

    新手使用 RSSHub 部署教程报错较多,本篇将使用宝塔 PM2 管理器进行部署。

    部署步骤

    1. 将 RSSHub 代码下载到根目录 root,执行命令 git clone https://github.com/DIYgod/RSSHub.git

    2. 安装宝塔面板,查看官方安装教程open in new window

    3. 登陆宝塔面板,点击「软件商店」-「运行环境」,安装PM2 管理器

    4. 点击 PM2 管理器右侧的设置,按图中红字添加项目路径,启动文件名称为 lib

    5. 添加后,点击项目中的「映射」,输入指定域名,如 rsshub.xxx.com,服务器的 1200 端口将指向该域名。映射域名需解析到服务器 IP。

    程序运行时,如果遇到报错,可以直接用命令运行 pm2,如 pm2 start /root/RSSHub/lib/index.js --name rsshub

    使用步骤

    1. 打开 RSSHub 接口指南open in new window,搜索需要订阅的网站。RSSHub 支持国内大部分的主流网站。

    2. 根据 bilibili 番剧路由open in new window的文档,将生成源 https://rsshub.app/bilibili/bangumi/media/9192 其中的域名 https://rsshub.app 替换为你自部署的域名,如 http://rsshub.xxx.com/bilibili/bangumi/media/9192

    另外 RSSHub 支持很多实用的参数,比如内容过滤、全文输出等。全文输出参数为 mode=fulltext,应用举例:果壳科学人全文输出 https://rsshub.xxx.com/guokr/scientific?mode=fulltext。其他可以在通用参数open in new window官方文档了解具体使用方法。

    RSSHub VS. Huginn

    • RSSHub:使用简单,使用现成的抓取规则,适用于国内主流网站;但无法抓取对小众网站,必须 RSSHub 官方定制订阅源。
    • Huginn:适用于所有网站,可设定抓取频率、内容结构、js 结果、输出样式等;但部署、配置复杂,入门门槛高,需要针对网站单独定制抓取规则。

    RSS 合集

    汇总的 RSS 永久订阅 feeds,均通过 RSSHub 和 Huginn 制作。如果有兴趣自制 RSS,可参考以下教程。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2020-09-13-wifi_speed_up.html b/posts/2020-09-13-wifi_speed_up.html index e15893e4..64ec9093 100644 --- a/posts/2020-09-13-wifi_speed_up.html +++ b/posts/2020-09-13-wifi_speed_up.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    无线路由调整,加快 WIFI 速度

    网络WIFI约 624 字大约 2 分钟...

    拖慢 WIFI 速度的最大元凶是无线信号合并

    「双频合一」、「Smart Connect」听起来很美,信号不好就立刻切换信号更强的频道,速度慢就切换为更快的频道,似乎是个完美的方案。但使用后就知道它们的规则多傻了,速度慢到让你想用手机流量。任何将无线信号合一的功能都不推荐使用。

    先关闭路由器的合频功能,然后针对无线模式、频道带宽、频道/信道逐步调整,避免 wifi 无故自动断开,提升 wifi 速度和稳定性。

    无线模式

    无线模式其实是选择 wifi 协议,如 802.11b、802.11g、802.11n 等。兼容旧版本协议,会拖慢 wifi 的速度。

    建议建议 2.4GHz 频段的频道带宽设为「N only」,5GHz 频段的频道带宽设为「N/AC mixed」。Legacy 模式为兼容模式,适合家里有 10 年前的设备需求。

    频道带宽

    频道带宽一般为 20、40、80MHz,一些厂商如华为有自己的 160MHz。频道带宽越大,wifi 速度越快,但穿透性也随之变弱,覆盖范围变小。

    建议 2.4GHz 频段的频道带宽设为「20/40MHz」,5GHz 频段的频道带宽设为「80MHz」。这样可以保证 wifi 近距离的链接速度,同时也保证了 wifi 的覆盖范围。

    调整信道

    无线信道/频道是路由与手机的接收频道,通常家用路由有 161 条信道。当越多设备使用相同信道,会造成信道堵塞,减慢无线速度。

    家庭只需要考虑自家和邻居的网络,无线环境较为简单。建议通过「Wifi 分析仪」找到并固定无线信道,避免无线疯狂切换信道,影响无线稳定性。

    手机安装「Wifi 分析仪」,点击应用右上角的眼睛,选中「信道评级」。信道评级将显示选中 wifi 的最佳信道选择。切换上方的 wifi 名称,查看其它 wifi 的推荐信道。

    找到最佳信道后,在路由器中固定无线网络的信道/频道。目前国内大部分路由都不支持 wifi 信道手工调整,只有华硕等少数路由支持,建议新购路由先跟店家确认是否支持手工调整信道。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2020-09-22-uefi_asus_board.html b/posts/2020-09-22-uefi_asus_board.html index 85cb40ac..2aaeaa29 100644 --- a/posts/2020-09-22-uefi_asus_board.html +++ b/posts/2020-09-22-uefi_asus_board.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    「硬盘布局不受 UEFI 固件支持」-华硕主板解决方案

    系统主板约 218 字小于 1 分钟...

    电脑已经用了 5 年,这次 Win10 更新提示「硬盘布局不受 UEFI 固件支持」。本文是华硕主板的解决方案,其他主板顺序不同,但目的都是将启动模式修改为「Only Legecy」。

    电脑重启,按 F2 或 DEL 进入 BIOS。选择「高级模式」>「启动」>「CSM」>「启动设备控制」,设置为「仅 Legecy OPROM」。

    华硕主板设置截图

    设置完成后,Win10 就可以正常更新了。

    有人反馈「改了启动不了系统」,这是由于系统硬件与你新的设置冲突造成的,并不会造成系统破坏。只需重新进入 BIOS,将设置改回或将 BIOS 还原为默认设置,即可进入系统。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2020-11-27-rime_input.html b/posts/2020-11-27-rime_input.html index 588f0b12..ff8f4ac0 100644 --- a/posts/2020-11-27-rime_input.html +++ b/posts/2020-11-27-rime_input.html @@ -38,7 +38,7 @@ } - + @@ -70,10 +70,10 @@ "punctuator/import_preset": mysymbols "recognizer/patterns/punct": "^/([a-z]+|[0-9])$"
    1. 30 分钟搞定 自由输入法 RIME 简明配置指南open in new window ↩︎

    2. Rime 输入法—鼠须管 (Squirrel) 词库添加及配置open in new window ↩︎

    3. 小狼毫 RIME 输入法配置open in new window ↩︎

    4. 一例、定製標點符號open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2021-01-02-keepass_the_real_lastpassword.html b/posts/2021-01-02-keepass_the_real_lastpassword.html index 7fe0d2a9..c0ae5e6d 100644 --- a/posts/2021-01-02-keepass_the_real_lastpassword.html +++ b/posts/2021-01-02-keepass_the_real_lastpassword.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    抛弃 Lastpass,拥抱 KeePass-免费开源的绿色密码管理软件

    工具KeePass约 1858 字大约 6 分钟...

    用了 5 年的 Lastpass,但随着网站密码的增加,遇到的 bug 也越来越多。有次误操作,合并了 Lastpass 密码库,丢失了一大批密码,对云端密码库的信任度直接降为零。

    之后,尝试了 1Password、Bitwarden、Enpass、Remembear 多种密码管理软件,最终选择开源免费且自动填充超强的 KeePass。

    KeePass 的密码保存在本地的 .kdbx 数据库中,让你真正掌握自己的账号密码。搭配坚果云或同步盘的 KeePass,能实现密码多端同步,让手机与电脑使用同一密码库。

    KeePass 官网下载(Windows):https://keepass.info/download.htmlopen in new window。安卓推荐 Keepass2Android,iOS/Mac 推荐 StrongboxKeePassium

    接着我会逐步介绍 KeePass 的配置和插件,也可以直接拖到文章底部,下载懒人包,开箱即用。

    KeePass 设置

    选项设置

    点击菜单栏上的「工具」>「选项」>「外观」,在「主窗口」中勾选「最小化到系统托盘(而不是任务栏)」和「关闭按钮 [X] 最小化主窗口,而不是退出程序」。

    然后从「选项」中选择「集成」,将「全局自动输入」设为 Ctrl+Alt+A,「全局自动输入(仅密码)」设为 Ctrl+Alt+Shift+A。

    自动输入规则

    选中左侧的数据库,右键单击「编辑群组」>「自动输入」,替换默认规则为 ^{SPACE}{DELAY 100}{CLEARFIELD}{USERNAME}{TAB}{PASSWORD}{DELAY 100}{ENTER}^{SPACE}[1]

    ^{SPACE}Ctrl+Space,该热键能关闭或启用当前输入法。关闭输入法后,默认为美式键盘输入。

    Ctrl+Space 需在输入法编辑状态下才能生效,而密码区都禁用输入法编辑。因此,输入密码完成后,可能输入法并未重置,要按 Ctrl+Space 才能正常启用输入法。

    匹配多个网址

    KeePass 不能在一个条目填写多个匹配网址,但不同条目可以共享用户名、密码等字段数据,并且通过更改被引用的数据条目,所有其他条目也会同步使用更新值。[2]

    比如 163.comyoudao.com 都使用网易账户,账号密码相同,根据网址建立了 2 个条目。首先,在 163 条目输入实际的账户密码,将其作为网易账户的主条目。然后,双击进入 youdao 条目,点击 Edit Entry 界面左下角的「工具」>「插入字段引用」>「在用户名/密码字段」,选中需要引用的条目。设置好后,字段旁边会出现分享符,表明这是引用字段,该字段数值会跟随主条目更新。引用字段的实际内容类似 {REF:P@I:8CC19B988F0F9D499459B741753BEE5F},更改账户密码只能在主条目上进行。

    引用字段设置步骤

    必备插件

    KeePass 需要配置插件,才能实现密码自动输入。下载插件并放入指定文件夹 \Plugins,重启 KeePass 即可使插件生效。

    KeePassHttp

    KeePassHttpopen in new window 是 Keepass 的连接核心,搭配浏览器插件 KeePassHttp-Connector,可以实现浏览器自动填充密码效果。

    如果网页有不能被识别用户名或密码框,可使用 KeePassHttp-Connector 的「Choose own credential fields for this page」功能。

    KPEnhancedEntryView

    KPEnhancedEntryViewopen in new window 增强视觉效果,为达到最佳显示效果,按以下配置:

    • 在主界面中点击「显示」>「窗口布局」>「平铺」;
    • 在主界面中点击「显示」>「列设置」,只选择:「标题」>「确定」。大家也可以按自己要求选择。

    AutoTypeSearch

    AutoTypeSearchopen in new window 提供全局框,输入热键 Ctrl+Shift+A 后,搜索关键词输入密码。

    AutoTypeSearch 通用设置

    KP Entry Templates

    KP Entry Templatesopen in new window 可以设置保存模板,配置方法如下:

    1. 点击 KeePass 主界面的「文件」>「数据库设置」>「高级」,在「模板记录组」中选择一个群组,点击「确定」;
    2. 返回主界面,点击步骤 1 中选择的群组,按 Ctrl+I(或点击上方工具栏的钥匙图标)添加记录;
    3. 点击「自动输入」,勾选「双通道自动输入混淆」(以后用模板添加记录时就不需要再勾选,一劳永逸);
    4. 点击最左边的「Template」>「Init As Template」,配置好所需模板,点击「确定」。

    KPSourceForgeUpdateChecker

    KPSourceForgeUpdateCheckeropen in new window 可以帮助检查 KeePass 及其插件是否有更新,功能从菜单栏上点击「帮助」>「检查更新」进入,会使用 SourceForge 上的插件更新信息。

    可选插件

    Early update Check

    Early Update Checkopen in new window 可以一键式更新 KeePass 及其插件,支持安装包和便携版的安装方式。

    KeeTrayTOTP

    如果你有更高安全要求,KeeTrayTOTPopen in new window 能增加二次动态验证,使用参考使用 KeePass 管理两步验证open in new window

    WebAutoType

    WebAutoTypeopen in new window 是很多人的推荐插件,启动密码热键后会自动匹配当前网址、标题。这对于已经有大量密码的人来说,并不实用,可不安装。

    Yet Another Favicon Downloader

    Yet Another Favicon Downloaderopen in new window 插件能自动匹配下载网站图标,但会大幅增加数据库的大小。不在意界面美观度的话,无需安装 Yet Another Favicon Downloader。

    HIBP Offline Check

    HIBP Offline Checkopen in new window 可以使用 have i been pwned?open in new window 在线检查密码库,也能使用本地数据库离线检查。

    KeePassRPC

    KeePassRPCopen in new window 搭配浏览器插件 Kee,能实现自动填充密码并登录

    其他插件不能自动登录,只有 Kee 能做到该功能。使用 Kee 的自动登录功能后,少数页面会出现循环登录,需暂停 Kee 扩展来停止循环错误。

    Kee 设置

    KeePassNatMsg

    浏览器插件 KeePassHttp-Connector 已不再更新,有段时间甚至不兼容新版 KeePass。

    如果遇到不兼容,可使用 KeePassNatMsgopen in new window 和 KeePassXC-Browser 连接浏览器,本方案不支持搜狗浏览器。

    如果报错「proxy download error」,备份并删除文件夹 C:\Users%Username%\AppData\Local\KeePassNatMsg,然后重新加载 Native Messaging Host。

    常见问题

    多账户排序

    同一网址有多个账户密码时,无将其中一个账户密码默认置顶。通过插件 KeePassHttp 和 KeePassNatMsg,能按 username 或 title 对账户进行排序。

    为什么不选 KeepassXC

    KeepassXC 基于 KeePass 开发,界面更美观,应用设置更简单,并开发了专属的浏览器插件。

    入门 KeepassXC 也比 KeePass 来得轻松,但 KeePass 操控和定制性更强。密码库的使用是以年为单位,比起节约一两天的时间,个人推荐使用 KeePass 原版定制你自己的密码库。

    KeePass 懒人包

    2022.09.17 更新懒人包:蓝奏云open in new window百度云盘open in new window 提取码:nrwj。

    KeePass 懒人包为绿色版,集成了常用插件,建立数据库即可使用 KeePass。

    建立数据库:

    1. 解压懒人包,打开程序 KeePass.exe

    2. 屏幕右下角托盘处,打开 KeePass。

    3. 菜单栏上点击「文件」>「新建」,建立属于你的密码数据库。

      KeePass 懒人包设置

    懒人包集成插件:AutoTypeSearch,Entry Templates,KeePassHttp,KeePassNatMsg,KeePassRpc,KeeTrayTOTP,KPEnhancedEntryView,SourceForgeUpdateChecker,WebAutoType。


    1. Keepass 教程之二——完美的通用自动输入规则open in new window ↩︎

    2. Field References-KeePassopen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2021-01-27-blog_jekyll_to_wordpress.html b/posts/2021-01-27-blog_jekyll_to_wordpress.html index 96e23060..afde3039 100644 --- a/posts/2021-01-27-blog_jekyll_to_wordpress.html +++ b/posts/2021-01-27-blog_jekyll_to_wordpress.html @@ -38,7 +38,7 @@ } - + @@ -54,10 +54,10 @@ </item> </rss>
  • 登录 WordPress 后台,工具-导入-安装并启用插件 FeedWordPress 。自带 RSS 导入器许久不更新,极易报错,不推荐。

  • 后台-Syndication-添加 rss 源,比如添加源 xxx.com/feed-wp.xml,其中 xxx.com 指你的博客网址。

  • 参考资料:

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2021-05-31-principles_criticism_and_self-criticism.html b/posts/2021-05-31-principles_criticism_and_self-criticism.html index f54a5044..4cfd8d37 100644 --- a/posts/2021-05-31-principles_criticism_and_self-criticism.html +++ b/posts/2021-05-31-principles_criticism_and_self-criticism.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    普通人的生活原则-批评与自我批评

    头脑驿站原则批评与自我批评约 1983 字大约 7 分钟...

    读 Ray Dalio 的《原则》时,联想到「党的三大作风」,两者理论类似,都是在强调「拥抱现实,应对现实」。所以,在读《原则》的同时,把党建理论也翻出来看了一遍,并将其中的理论与积极心理学一起融入到个人生活中。试行过程中,发现对自身的认知、目标都得到明显的提升。

    理论支撑

    党的三大作风《原则》个人生活
    理论联系实际的作风,一切从实际出发拥抱现实,应对现实实事求是
    相信群众,依靠群众,尊重群众,向群众学习,对群众负责头脑极度开放公开分享想法
    对自身的缺点、错误认真地进行自我检查,提出纠正的方法发现问题,不容忍问题批评和自我批评

    中国共产党的三大作风有:

    第一,理论联系实际的作风,就是坚持实事求是,一切从实际出发,把马克思主义的普遍真理同中国革命的具体实践相结合,也就是运用马克思主义的立场、观点和方法,去分析、研究和解决中国革命的实际问题。

    第二,密切联系群众的作风,就是相信群众,依靠群众,尊重群众,向群众学习,对群众负责的作风,也就是要坚持历史唯物主义关于历史是人民群众创造的观点和辩证唯物主义认识论关于人民群众是认识的主体的观点,坚持党的群众路线和群众观点,实行“从群众中来,到群众中去”的工作方法,就是要求党一刻也不能脱离群众,一刻也不能放松群众工作,要为广大群众求解放,谋幸福。

    第三,批评和自我批评的作风,就是对党内、同志之间在思想上、作风上、工作中存在的缺点、错误,真诚而又严肃地提出批评,帮助犯错误的同志提高认识,取得进步;对自身的缺点、错误认真地进行自我检查,提出纠正的方法,取得深刻教训。

    融入到个人生活中变为:

    第一,理论联系实际的作风,就是坚持实事求是,一切从实际出发,把理论知识与个人生活相结合,也就是站在客观角度,去分析、研究和解决个人生活的实际问题。

    第二,头脑极度透明,公开分享想法,在不擅长的领域请教擅长的其他人,不要固守你对事物「应该」是怎样的看法。

    第三,批评和自我批评的作风,就是对朋友、家人之间在思想上、工作中存在的缺点、错误,真诚而又严肃地提出批评,帮助其他人提高认识,取得进步;对自身的缺点、错误认真地进行自我检查,提出纠正的方法,取得深刻教训。

    以下是我给自己制订的方案,可结合自己的实际生活做出调整。

    实事求是地制订方案

    根据「你想要什么;事实是什么;面对事实,你如何实现目标」设定目标,然后写下清晰具体的方案,让任何人都能对照方案执行。

    方案要求:

    • 有明确的目标。
    • 找到问题:找到阻碍你实现这些目标的问题,准确诊断问题,发掘问题的根源,并且不容忍问题。
    • 制订方案:规划可以解决问题的方案,并严格执行。做一切必要的事来践行这些方案,实现成果。
    • 执行方案需要严格遵守方案的自律,如果执行中出现问题,思考该步任务是否符合目标。

    头脑透明地分享想法

    公开想法:让其他人无比清晰地看到你在做什么、为什么这么做。头脑越透明,越不会自欺,其他人也会给你诚实的反馈。

    同时注意:

    • 不要固守你对事物「应该」是怎样的看法,这将使你无法了解真实的情况。
    • 在不擅长的领域请教擅长的其他人,或外包,或使用成熟的工具,或查看教程攻略。
    • 不要把不好的结果归咎于任何人,从自己身上找原因。

    批评和自我批评

    每月固定一个时间 (月底),对自身行为进行反思,并与家人、朋友分享自己的现状,征求他们的意见、批评。不用担心其他人的看法,不要担心自己的形象,而关心如何实现目标。

    行动计划

    按上列原则,制定行动计划 (不断调整):

    每日

    • 早上创造美好情绪:赞美、仪式感、吃好吃的、看搞笑视频、听歌。

      • 唱歌:唱一首你喜欢的歌。(为减肥,我选择了外语美声歌曲,秋山雅史 - 千の風になって)
      • 录自拍视频:说一句话(当日目标?)鼓励自己。录制内容在前一天准备好,目的是给你带来积极情绪。
      • 参考积极心理学open in new window,收集积极情绪材料放在醒目的地方:家人的照片、取得的成绩、美好的回忆、憧憬的未来、向往的地方、喜欢的艺术 (音乐、名画、诗句)。
    • 人际连接:通过直播连麦与陌生人沟通 15 分钟。如:抖音 PK 语音直播。

      • 别人很重要:帮助别人,能让人更健康、更幸福。心情不好事,就去帮助其他人,心情会更好。
      • 表扬和自我表扬:赞美自己、家人,发挥标志性优势,总比弥补缺点更有效。
    • 微习惯

      • 工作 20 分钟休息 20 秒,做 10 个深蹲。
      • 出书房或上完厕所,做 10 个俯卧撑。
      • 俯卧撑、深蹲前,在磁性板上写正字来记录,一个笔画代表一组(10 个)。
    • 间隔学习:通过 SuperMemo 的记忆模型,复习心理认知、沟通理论、行为反思在内的笔记。

    • 当日回顾:记录 3 件好事,总结好事发生的原因,给家人分享好事。
      这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。

    定期

    • 月底反思:检查日记和成果,对当月进行复盘,并将其同步给家人,征求意见、批评并记录。
      • 复盘笔记参照 Allison Seboldtopen in new window,作者每个月都会进行「回顾」,分享他的收入并反思上个月的成就。
      • JustinJ acksonopen in new window – 作者在 2018 年初创办  Transistor  以来,一直在分享他的项目。他整理了在此过程中学到的许多经验教训。
    • 积极自我介绍:每隔三个月,讲述一个「最佳的我」的故事,植入你的优势,进行自我肯定。

    公开记录

    • 学习笔记open in new window:将对工具、工作方式和生活的思考记录发布在公开页面,欢迎大家的点评。

    • 工作视频:自我监控视频open in new window,记录私密工作状态,方便当日回顾。

    • 微习惯视频:监督运动习惯。拍摄视频时,使用关键句「切掉/保留」,配合 Quickcut 快速剪辑视频。

    下一步,寻找更多的党组理论根据和执行书籍资料,相信一个成熟的组织不是无故崛起,更不会无故持续这么些年。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2021-10-23-nas_with_rsshub_and_huginn.html b/posts/2021-10-23-nas_with_rsshub_and_huginn.html index e4c3431d..3d5428a6 100644 --- a/posts/2021-10-23-nas_with_rsshub_and_huginn.html +++ b/posts/2021-10-23-nas_with_rsshub_and_huginn.html @@ -38,7 +38,7 @@ } - + @@ -56,10 +56,10 @@ } ?>

    如果你没有服务器或不愿意再折腾,也可以尝试其他的 RSS 阅读器。例如,The Old Reader 支持使用带有端口的 RSS 源。

    总结

    使用 NAS 替代服务器后,Huginn 不再定期崩溃,抓取也不再卡壳,也不需要总惦记给服务器续费。硬件配置也从 1 核 1G 跃升到 4 核 8G。这套流程跑了一年,基本上没有出现什么问题,可以放心使用。

    这篇文章也是 RSS 系列的完结篇。从 2017 年 4 月的《RSS 入门篇:FEED43&FeedEx-为静态网页定制 RSS 源》开始,零零散散地写了 4 年半,终于把坑都填起来了。

    RSS 系列的初衷是为了减少算法推送泛滥而造成的信息过载。来自 Google 的分析师 Gary Illyes 曾表示:「互联网上大约 60% 的内容是重复的。」比如你搜索一项内容,打开前 10 个网页,可能内容完全一样。

    RSS (Really Simple Syndication) 的中文含义是「简易信息聚合」,能按你个人所需定制信息聚合,让你脱离算法的掌控,把时间花在你真正需要的信息上。而 RSS 这个对抗信息过载的极佳工具却从 Google Reader 退役后,被很多人认为已经衰弱消亡。实际上 RSS 只是从主流社会中退出,变为少数人的高效信息获取方式。

    RSS 定制的系列文章原本只是记录个人心得,我没想到文章发布后收到很多人的支持,才发觉并不是 RSS 在没落,而是缺少布道者。多数人希望了解 RSS,但之前的教程门槛较高,大厂如 Google 也关闭了 RSS 项目,导致新手入门变得更加困难。因此,我持续简化 RSS 教程,希望能让大家更轻松入门 RSS。如果你也对 RSS 感兴趣,希望把你遇到的疑问和所得都记录下来,帮助越来越多的人了解 RSS,掌握这项高效的信息获取方式。

    我坚信 RSS 是最适合普通人的信息获取方式。这可能有些反潮流,但我内心对此深信不疑,也希望越来越多的人能认识到 RSS,开始使用这项只被少数人使用的高效信息获取方式。

    RSS 合集

    汇总的 RSS 永久订阅源都是通过 RSSHub 和 Huginn 制作的。如果你有兴趣自己制作 RSS,可以参考以下教程。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2022-01-23-wechat_lucky_money_cover.html b/posts/2022-01-23-wechat_lucky_money_cover.html index 47829529..341232d0 100644 --- a/posts/2022-01-23-wechat_lucky_money_cover.html +++ b/posts/2022-01-23-wechat_lucky_money_cover.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    想要独一无二的微信红包,你也可以自己做

    工具微信红包约 749 字大约 3 分钟...

    上海撞上疫情,连续三年春节不能回家,对父母始终有些亏欠。

    春节前 10 天,微信给我发了 2000 个限时红包封面额度。突然发现这是个好主意,既然不能回家,那就帮父母做个红包封面吧。自己也似乎随着红包一起,跟父母一起给亲戚拜年。微信红包团队的这次活动策划非常出色,不仅为红包封面带来了大量新用户,而且还能让许多人续费红包时间。

    红包封面的设计并不复杂,新手也能轻松设计,但注册前提是要有至少 100 粉丝的视频号或公众号。

    接下来,我会介绍微信红包注册和定制流程。

    封面平台注册

    首次使用微信红包封面开放平台open in new window,需要注册并实名认证。如果使用个人身份认证,注册中无付费环节。

    个人认证环节需要有 100 粉丝以上的视频号或公众号。

    如果没有红包封面额度,可以自行购买。封面费用为 1 元/个,购买 n 个,则 n 个用户可以使用此款红包封面,有效期为半年。微信用户领取后,可在 3 个月内无限次使用该封面。

    红包封面设计

    完成注册环节后,即可定制红包封面。微信提供了 PSD 和 Sketch 的红包封面模板,红包设计可参考微信红包封面官方文档open in new window

    整个流程非常简单,即使不懂设计模板也能轻松上手。零基础用户可以使用小画家,有图层概念的用户可以使用 Figma。无论使用什么工具,只要上传喜欢的图片,就可以完成红包设计。

    示例基础图片 (推荐手写字体:杨任东竹石体)
    示例基础图片 (推荐手写字体:杨任东竹石体)

    常见问题

    封面名称

    红包封面会展示公众号名称和头像,名称一年可修改两次,头像一个月可申请修改 5 次。我提交的封面名称与公众号无关,平台并未拒绝。

    红包审核

    红包审核需要 3 个工作日。如果审核期间接近放假,建议同时提交三个红包封面,以免到了春节,红包尚未审核通过。

    红包图片

    微信红包封面的肖像需要授权,不过我提交的全家福红包通过了。尽量不要使用网络上的图片作为红包封面,容易因版权问题而被驳回。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2022-02-19-microsoft_store_fixed.html b/posts/2022-02-19-microsoft_store_fixed.html index 6fb1c516..040b0e10 100644 --- a/posts/2022-02-19-microsoft_store_fixed.html +++ b/posts/2022-02-19-microsoft_store_fixed.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Windows 应用商店 (Microsoft store) 打不开?100% 解决方法 - 兼容 Win10、Win11

    系统Microsoft store约 385 字大约 1 分钟...

    Microsoft store 页面无法打开,提示需要联网或刷新。多数教程将原因归咎于系统更新或 DNS 设置,但实际上是你的 IE 设置被更改了

    特别是国内的网银用户,每次登录建行,U 盾都会修改 Internet 选项,从而导致 TLS 版本过低无法连接应用商店。

    解决方法

    1. 选择「开始菜单」>「搜索栏」,搜索「Internet 选项」。

    2. Internet 属性中点击「高级」。

    3. 勾选「使用 TLS 1.2」和「使用 TLS 1.3」。

    网银用户会重复出现该问题,重新执行上方步骤勾选 TLS 即可。

    其他尝试

    @果子:取消代理服务器

    ① 除了在[internet 选项]窗口中-[高级]-勾选[TLS1.2 、TSL1.3],
    ② 要再加一步:在[internet 选项]窗口中-[连接]-[局域网设置]-取消勾选[代理服务器]相关选项。就能打开微软商店了!不过以后要挂梯的时候,好像得把[代理]勾选回来。

    @一头愚鹅:不要开代理

    如果你依然无法访问,则尝试重置网络连接、DNS、缓存、应用商店设置,操作参考 Microsoft Store 打不开,代码:0x80131500open in new window

    解决流程 GIF

    win11-ie 高级设置.gif
    win11-ie 高级设置.gif
    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2022-03-17-rss_persistent_link_collection.html b/posts/2022-03-17-rss_persistent_link_collection.html index cdc3e1f5..7860b0ab 100644 --- a/posts/2022-03-17-rss_persistent_link_collection.html +++ b/posts/2022-03-17-rss_persistent_link_collection.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    RSS 汇总篇:RSS 永久链接合集,拒绝 RSS 失效

    自动化rss约 589 字大约 2 分钟...

    越来越多的网站不再提供 RSS feed,这使得我们难以便捷地获取信息。为了避免这一情况的恶化,我选择了自制 RSS,并将它们输出为永久链接,以保持内容的有效性。本文链接均为自用 RSS,链接长期有效,可放心使用。

    如果有兴趣自己制作 RSS,可查看文章底部教程。

    每日热点

    整理实时新闻热点,采集来自搜索引擎、微信文章、应急通知的资讯。

    • 百度实时热点https://rss.aishort.top/?type=baidu
      实时收录百度热搜内容,并显示热搜指数和简介。

    • 国内应急新闻https://rss.aishort.top/?type=cneb
      采集自国家应急广播open in new window,配合 rss 阅读器过滤,及时获取当地应急通知。

    • 瓦斯阅读https://rss.aishort.top/?type=wasi
      通过瓦斯阅读,获取当天最热门的微信文章。微信图片不支持第三方显示,因此 RSS 阅读器内只显示文字内容,点击文章链接后,可阅读完整公众号文章。

    互联网资讯

    整合互联网资讯媒体,偏重于前端科技、电子硬件、手机应用。

    • 36krhttps://rss.aishort.top/?type=36kr

    • 虎嗅网https://rss.aishort.top/?type=huxiu

    • 艾瑞网https://rss.aishort.top/?type=iresearch

    • 爱范儿|AppSolutionhttps://rss.aishort.top/?type=AppSolution

    奇思妙想

    每天吸收些稀奇古怪的知识,期待引发后续的灵机一动。

    • 果壳网https://rss.aishort.top/?type=guokr

    • 知乎想法热榜https://rss.aishort.top/?type=zhihu

    教程:自制 RSS

    以上提供的 RSS 链接都是使用 RSSHub 和 Huginn 制作的。如果你也想制作 RSS,可以参考以下教程:

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html b/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html index edbcb974..083835d8 100644 --- a/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html +++ b/posts/2022-03-21-winget_the_strongest_software_manager_for_windows.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    一键安装 99 个程序,Windows 最强软件管理器

    系统wingetwinstall约 1265 字大约 4 分钟...

    矿难、WIN11、DDR5、40 代显卡纷至沓来,更换电脑的高峰期马上来临。可惜我的生产力工具等不了,只能 49 年入国军,隔离期间装配上 i7+3080Ti 主机。硬件配好了,软件又成了个大问题。常用软件超过 60 个,之前每个软件,都去对应官网寻找最新版,然后单独进行设置安装,需要耗费大量的时间精力。

    曾经一度尝试过国内的软件管理器,能批量下载软件,但依旧免不了单独安装设置。另外,让 360、金山、腾讯来管理你的软件系统,你真的放心?相较而言,Windows 原生程序管理工具 winget 和 WebGUI winstall 使用更简单,应用均为官方来源下载,一键批量静默安装应用,是快速部署程序的绝佳方案

    原生程序管理-winget

    wingetopen in new window 是 Windows 程序包管理器的命令行工具。在 Windows 10 和 Windows 11 计算机上,使用 winget 命令行工具来发现、安装、升级、删除和配置应用程序。早期版本的 Windows 不支持 winget,需在 winget 官方open in new window国内搬运open in new window 下载后缀为 .msixbundle 的应用安装程序。

    安装应用安装程序后,可以通过在命令提示符 (cmd) 下键入「winget」来运行程序命令。

    winget install appName

    执行 winget install 命令,就能完成指定程序的下载、哈希验证、静默设置安装三个步骤,不需要人工干预。

    winget search appName

    当未找到或不确定 appName 时,使用 winget search 可以锁定程序名称。以「飞书」为例,飞书不支持中文锁定,搜索后发现有国内版「Feishu」和海外版「Lark」两个版本,国内版使用命令 winget install feishu

    winget upgrade --all

    • winget upgrade 列出所有支持 winget 升级的程序,然后使用 winget upgrade ID 升级指定程序。
    • winget upgrade --all 会静默升级所有支持 winget 的程序,适合更新强迫症患者。不过,该升级流程暂时没有筛选办法,无法单独剔除应用。
    • winget upgrade --all --include-unknown 升级包括未知版本在内的所有应用,一般用不到,适用于强迫症患者。

    Microsoft Store 应用

    Microsoft Store 不支持 winget 官方源,因此 winget 不能使用应用名称安装商店应用。

    winget 安装 Microsoft Store 应用前,需要 winget search 命令找到应用 id 和来源。msstore 源指 Miscrosoft Store,其使用唯一标识符作为程序包的“Id”。因此,snipaste 安装命令为 winget install 9P1WXPKB68KX -s msstore

    安装中会要求接受协议,点 Y 确认即可。

    批量部署程序-winstall

    winstallopen in new window 是 winget install 的网页管理工具。借助 winstall,用户不懂代码,也能轻松使用 winget,一次性安装所有应用程序。

    操作非常简单,winstall 页面选中程序,即可打包程序组或生成批量安装命令。

    winstall 的应用搜索继承了 winget 的问题,部分国产软件不支持中文搜索,比如「坚果云」只支持英文名称「Nutstore」。希望这一问题,可以随着国内用户群增多而被解决。

    winget 搜索
    winget 搜索
    winstall 搜索
    winstall 搜索

    winstall 页面选好程序后,导出自动生成的批量安装命令,并在命令提示符 (cmd) 中执行,系统将自动下载并静默配置程序。

    常见问题

    尝试更新源时失败

    国内使用 winget 容易出现问题「尝试更新源时失败」,下载 winget 官方最新包open in new window可解决问题。

    另一个可能是 Internet 选项的 TLS 版本设置过低,开启 TLS 1.2 即可恢复,具体操作查看 Windows 应用商店 (Microsoft store) 打不开?open in new window

    其他问题

    • 批量安装应用中,winstall 不定期出现崩溃,原因未知。
    • winget install 不能检测当前版本软件是否安装,容易造成重复安装应用,拖慢部署时间。
    • 部分应用安装后容易有 bug,比如剪映有卡顿问题,手动安装后恢复正常。

    总结

    在我的常用软件列表中有 50 个应用支持 winget 批量静默安装,剩余 10 个需手工安装,覆盖率在 80% 以上,足够满足大部分人的需求。

    winget 用一个命令行能静默安装上百个软件,节省了大量装机时间。对于系统重装、批量装机、快速设置新工作环境,winget 和 winstall 是必不可少的装机神器。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2022-04-21-uivision_rpa.html b/posts/2022-04-21-uivision_rpa.html index 4c197276..43e90c52 100644 --- a/posts/2022-04-21-uivision_rpa.html +++ b/posts/2022-04-21-uivision_rpa.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    不想学 Python,零基础也能用的自动化工具-UI.Vision RPA

    自动化浏览器插件UI.VisionRPA约 1668 字大约 6 分钟...

    无需懂编程代码,只需安装浏览器插件,3 分钟速成爬虫攻略。

    Python 被认为是次时代必学语言,也就成为贩卖知识焦虑最好的标靶,各大平台隔三差五就想让我们买课程。

    但普通人真的有必要学 Python 吗?量化交易、人工智能、数据分析,你用得到哪个?

    当然,程序员、金融等相关从业者学 Python 无可厚非。可是,请不要推荐小白学 Python,90% 的人学了只是浪费时间。花 3 个月编程,也不一定能解决我们的基础功能需求。

    请把你的时间花在更重要的事情上,克服知识焦虑。学一百种热门语言,不如熟练掌握一个好的工具。

    以下内容只适合不想学 Python,不懂编程,又想使用自动化和爬虫的小白,高手可以关闭页面了。

    UI.Vision RPA 是一款开源的全平台自动化工具,无需懂编程,即可完成网页和桌面自动化操作,包括文件上传、表单填写、内容抓取、定时截图、爬虫抓取等。

    安装 UI.Vision

    UI.Vision RPA 的主体是浏览器插件,只需去应用商店即可完成安装。

    零门槛入门

    UI.Vision RPA 的运行脚本叫做「宏」。界面很简单,左侧是宏的范例库和本地文件,右侧是宏的运行和反馈区。

    UI.Vision 应用界面
    UI.Vision 应用界面

    打开 UI.Vision 插件,点击右上角按钮「Record」,插件会把你的操作录制为宏脚本。

    执行时,选中左侧保存的宏,然后点击右上角的按钮「Play Macro」,即可回放指定宏。点击「Play Loop」,则可让宏循环运行。

    自动化运行 GIF
    自动化运行 GIF

    第一次使用

    以范例库中的 DemoAutofill 为例,这是网页自动填充在线表格的宏,点击右上方的「Step」按钮逐步运行宏。有进阶需求的话,把范例一个个拆解学习,了解命令的使用方式。

    • 前 1-3 步使用「store」命令,对宏进行基本设置,如运行速度、超时等待、页面最长载入时间。点击命令右侧的「info for this command」可查看当前命令的官方文档。

    • 第 4 步使用「open」命令,打开指定网址。

    • 第 5-8 步使用「click」命令,依次点击指定按钮。

      UI.Vision 点击命令
      UI.Vision 点击命令
    • 第 9 步使用「pause」命令,延时 500 毫秒。

    • 第 10 步使用「captureScreenshot」命令,对可见网页部分截图,记录运行步骤。

    • 第 11 步使用「clickAndWait」命令,单击指定按钮后等待页面加载。

    • 第 12-13 步使用「type」命令,在指定区域输出指定文字。

    • 第 14 步使用「captureScreenshot」命令,对可见网页部分截图,记录运行步骤。

      第 15 步使用「pause」命令,延时 1000 毫秒。

      第 16 步使用「clickAndWait」命令,单击指定按钮后等待页面加载。

      第 17 步使用「captureScreenshot」命令,对可见网页部分截图,记录运行步骤。

    • 第 18 步使用「echo」命令,调用浏览器通知模块,弹出指定提示。

    • 第 19 步使用「comment」命令,注释当前步骤,无实际作用。

      第 20 步使用「open」命令,打开指定网址。

    • 最后一步使用「assertTitle」命令,获取网站的标题,并检查是否与指定文本相符合,判断宏是否运行成功。

    不同变量重复运行

    用不同的变量文本进行重复的网页操作,需要使用 UI.Vision 的 csvReadopen in new window 命令。下面以「依次打开不同链接」为例。

    1. 点击 UI.Vision 右下角的「CSV」>「Import CSV」,用 CSV 文件导入批量处理内容。
    2. 使用「csvReadArray」命令,Target 输入文件名「1.csv」,Value 输入分组名「link」。
    3. 使用「executeScript」命令,Target 输入计算脚本 return ${!LOOP} - 1;,Value 输入自定义变量名 num。数组序号以 0 开始而循环序号 ${!LOOP} 以 1 起始,所以数组序号为 ${!LOOP}-1
    4. 使用「open」命令,Target 输入变量参数 ${link[${num}]}${link[x]} 指 link 数组中序号为 x 的成员。
    5. 使用「pause」命令,Target 输入延时时间,单位为毫秒。
    6. 点击右上角「Play Macro」旁边的下拉按钮,然后点击「Play Loop」,有多少行文本需要处理,就循环多少次。

    常见问题

    录制脚本无法使用

    如果脚本中使用了热键,这是无法被录制的,需要你手工添加 XType 命令。

    如果脚本点击不成功,可以将对映步骤的 Click 命令改为 XClick

    浏览器外使用 RPA

    1. 地址栏输入 chrome://extensions/,找到扩展 UI.Vision RPA,点击按钮「详情」,启用「允许访问文件网址」。
    2. 右键单击指定脚本,点击「Create autorun HTML」,将自动输出两个 html 文件。
    3. 点击与脚本同名的 html 即可启动脚本。

    本地运行自动化报错

    本地运行自动化文件,报错 No tab with id

    这是自动化内存泄漏造成的报错,需要手动点击右上角的「Play Macro」按钮执行命令。
    如果你不想手动执行,可以用编辑器打开与脚本同名的 html 文件,找到 href="ui.vision.html?direct=1,在这后面加入参数 &continueInLastUsedTab=0

    总结

    UI.Vision RPA 操作简单,定制脚本宏只需录制和完善两步。

    • 录制:手动操作一次并录制宏,该环节基本能完成 80% 的功能转换。
    • 完善:补充或修改部分命令宏,多为延时、截图等不被录制的简单命令。

    除 UI.Vision RPA 外,iMacros 和 Selenium IDE 也是热门的全平台自动化工具,都依托于浏览器插件。

    这类自动化工具不用花大量时间学习,直接帮你解决问题,但并不能完全取代 Python 等编程语言。如果你依然有进阶需求,那努力去学编程吧,否则请先学会用工具。

    参考资料

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2022-06-07-blog_md_to_wordpress.html b/posts/2022-06-07-blog_md_to_wordpress.html index 8ae3ac00..a47dd42b 100644 --- a/posts/2022-06-07-blog_md_to_wordpress.html +++ b/posts/2022-06-07-blog_md_to_wordpress.html @@ -38,7 +38,7 @@ } - + @@ -50,10 +50,10 @@ --编程|cmd bat md ahk html js css json yml yaml py vscode|Code.exe

    docsify 全文检索

    飞书表格可以搜索关键元素,但不能对检索全文。这时,我们需要使用 docsifyopen in new window,一款能将 markdown 文档自动生成网站的工具,相当于轻量级的 GitBook。​

    docsify 使用简单,如果使用了前文我修改过的发布工具open in new window,则无需配置。在发布工具文件夹内的空白区域,右键打开终端,执行命令docsify serve即可生成全文检索网页,默认管理链接为 http://localhost:3000/

    docsify 本地运行
    docsify 本地运行

    如果你设置了 Github Pages,项目会默认启动在线 docsify 网页,页面链接取决于 Github 的设置。比如我的用户名是 rockbenben,项目名是 Blog_WP,所以 docsify 管理页面就是 https://rockbenben.github.io/Blog_WP/open in new window

    订阅管理:WordPress

    40% 的网站基于 WordPress 架构,因此 WordPress 有超多的主题和插件,可以实现你想要的功能,比如 RSS、Newsletter。

    如果你拥有较多的粉丝,可以使用 Substackopen in new window竹白open in new window来分发博客。这两者都支持 Newsletter 付费订阅。只针对国内用户的话,竹白可支持微信订阅。

    后续

    比起原来的 Jekyll,新方案的配置要复杂些,但使用并不难,推荐稿件多的人采用。

    折腾新方案的过程中,我发现了篇 2021 年初写的文章。当时,稿子写到 90%,我就去忙其他事,忘了这篇文章。等到这次被发现,它已经在草稿箱待了一年半。

    用了新方案,稿件管理会变得很简单,稿件遗忘、找不到的情况也会减少许多。最近我出稿速度大增,也都跟这有关,都是从草稿箱捡回来的半成品。

    写完这篇稿子,疫情封控也正好结束,终于可以出门了,希望永远别再给「免费假期」了。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2022-08-22-learndata_blog_to_knowledge_management.html b/posts/2022-08-22-learndata_blog_to_knowledge_management.html index 67efe181..64b5b7e8 100644 --- a/posts/2022-08-22-learndata_blog_to_knowledge_management.html +++ b/posts/2022-08-22-learndata_blog_to_knowledge_management.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    抛弃 Notion 知识管理软件的尝试:把博客变为知识库

    博客头脑驿站VuePress建站约 3044 字大约 10 分钟...

    知识管理/笔记软件越来越多,Notion、Obsidian、Logseq、Roam Research、Evernote、flomo、为知、飞书、语雀……我总在不同应用间徘徊。直到有一次,我突然醒悟:知识管理软件不是管理知识,而是管理笔记。笔记里的知识并不属于你,只有经过消化、应用,才能成为自己的知识。

    这么简单的事,我之前却一直没看透,总是把笔记与知识理解划上了等号。当要用到曾摘录的笔记时,就在各类知识管理软件里翻找,折腾一番才找到需要的笔记,有时甚至出现「自己不清楚放在哪里,也不清楚是否有」的情况。记笔记花了一个小时,下次寻找与重新消化又耗费了一个小时,原本为效率而生的知识管理软件变成了时间杀手。

    另一方面,我们在使用知识管理软件的美观界面和强大功能的同时,也被这些软件所限制,无法完全按照自己的想法输出笔记。比如,你有了一双翅膀,Markdown 文本是自由的天地,而进入 Notion 则被隔成一个个小房间,你在房间里待着很舒服,可一旦想去其他房间,就必须脱离 block,不比 Markdown 可以自由飞翔。

    Markdown VS Notion

    突破迷思后,我基于 VuePress 和 vuepress-theme-hope 建立了 LearnHubsopen in new window 项目,将知识笔记、生活记录、博客和任何认为有价值的记录转换为 Markdown 文本,然后推送到 GitHub 生成 Pages 静态页面,并同步到国内云服务器,形成 LearnHubs - 开源笔记open in new window

    笔记/博客自动化发布

    LearnHubs 的笔记和文章格式是 Markdown,输出不受到应用的局限。LearnHubs 看起来像由文章组成的博客,但它的笔记是独立的知识点,是所有知识的终点站,是整理后的知识库。通过 LearnHubs 可以搜索和整理知识,不再需要来回翻找。把博客转为知识库后,我明显感到学习和知识使用的效率得到提高,开始摆脱「工具奴隶」和「效率中毒」陷阱。

    笔记 + 文章 = LearnHubs 知识库

    为什么用网页管理笔记

    公开想法

    知识管理/笔记软件具有天然的私密性,不对外公开。但是,我的笔记大部分来自互联网,需要对谁保密?

    我非常赞同 Ray Dalio 在《原则》中提到的「头脑极度透明,公开分享想法」。

    让其他人无比清晰地看到你在做什么、为什么这么做。头脑越透明,越不会自欺,其他人也会给你诚实的反馈。

    作为国内最早一批介绍 Aria2 的人,我曾经写过一篇 Aria2 教程。文章后来被多个网站参考/抄袭,覆盖了 Aria2 某度搜索前三页。在那篇文章的评论区,有好几条留言批评文章逻辑差看不懂的,经常有热心人帮我怼回去。其实,那篇文章的初版真的很糟糕。那篇文章是在大家的反馈下,迭代了三个版本才开始变得完整和逻辑化。这些反馈也是我坚持写博客的原动力。这跟费曼学习法的道理相通,当你写文章帮助其他人时,你也在加深自己对知识的理解。建立 LearnHubs 不到一个月,但我从中获取的正反馈已超过私有笔记一年的收获。笔记公开化是有百利而无一害。

    输出分享

    其次,网页形式使笔记更容易分享。除了效率工具的心得,我还在 LearnHubs 上放置了生活技巧、购物评价和说明书。当家人或朋友需要帮助时,可以直接访问网页,无需安装应用程序或折腾账户分享,比如我经常分享的通马桶技巧open in new window 和疏通器说明书。

    生活知识页面样例

    被动消化知识

    如果只是公开分享,LearnHubs 与笔记软件并无区别,它的优点更在于网页有限的笔记数量。虽然网页可以无限地存放笔记,但打开页面只能看到少量的几十篇内容。一旦笔记堆积过多,你就像触发了整理开关似的,对笔记开始消化重构。这就是网页容量上的无限性和视觉/直觉上的有限性,存储是无限但视觉上只能有很小的一块。这里的直觉指,看一眼界面就能找到所需知识点的效果。

    比如,当我的代码区块笔记存放超过 10 篇时,每次查找代码笔记都需要 10 选 1,知识查找时间也翻倍了。我意识到节点过多,不能让自己将时间花在查询上。因此,我将代码笔记分为 Basic 和 FrontEnd 两块,总结划分的同时,编程知识也再次得到消化。

    而网页与笔记软件的区别也正在于此,LearnHubs 的主页、侧边栏和导航栏就是能展示的路径,你必须不断对笔记提纯才能提高使用率。否则,如果你只是「积累」笔记而非消化知识,无论使用什么工具和方法,成效都是 0。

    漂亮决定生产力

    另外,网页可以自由调整外观样式,更换为你喜欢的界面。这也是为什么 LearnHubs 放弃了初版的 docsify 框架,改为复杂得多的 VuePress 框架。docsify 的官方模板太过简单,没有界面设计模块,难以满足知识管理界面必须直观漂亮的要求,而这一点直接决定了生产力,不能让步。

    知识管理/笔记软件将 Markdown 文件作为一个个区块,而网页可以将其视为一体。LearnHubs 支持多级侧边栏和目录,让阅读和查找变得更加简单。

    LearnHubs 页面布局

    为什么不用 Obsidian

    @北鸮 提到「脱离 Notion 可以理解,Markdown 很自由,那为啥不用 Obsidian 呢?也有标题,也有标签,也可以有层级,开源软件还有 Logseq 替代」。

    Obsidian 等双链笔记的设计初衷很好,可以让我们自由地在不同知识点间切换,节省搜索和关联的时间。但是,知识点的联系是靠人工打标签来建立的,而不是根据关键词自动建立图谱关系,这与 URL 链接有什么区别?因此,我认为双链笔记并不适合知识库(如果对双链笔记理解有误,欢迎纠正)。

    我的 Obsidian 图谱,只有右下角简悦抓取的素材有相同标签而聚作一团

    建立知识点联系后,双链笔记可以轻松处理成千上万个文档,按条件整合文本,便于阅读。但是,大多数人常用的知识范围不会超过一百。如果你的个人笔记超过千篇,要么你是科研大佬,要么你没有消化这些笔记,只是在记笔记。

    除了博客,我只有 37 篇笔记,而且按功能划分为 7 个区块。你觉得这点文件,用树状管理方便,还是用双链笔记打一堆标签来得好?即使有时标题里找不到某个关键词,我也可以用全文搜索达到目的。我个人会倾向于简单方便的树状标题管理。

    抛弃知识软件 ≠ 不用

    选择 Markdown 就得卸载知识软件吗?

    抛弃知识软件并不是不用,而是将其视为知识的中转站。知识软件的趋势是 ALL IN ONE,记录全能成了标榜的主打功能。但是,光收集而不应用的知识等于零,只会增加你后续的使用成本。

    对我来说,知识软件是功能清晰的素材库。我会不断清空素材库,将小的知识点融入 LearnHubs 笔记区,成体系内容则写成博客,以确保 LearnHubs 成为知识库的终点。

    知识类素材库
    • Logseq 将信息节点化,能按日期整合文本,因此我用它来记录笔记,并定期生成周报和月报回顾。
    • 飞书文档自带侧边目录栏,对长文档优化很好,因此我用它记录工作心得,定期形成工作流程并在公司分享。
    • WonderPen 带多层级标题,当一点头绪方向都没有时,素材就可以直接放这里。
    • Notion 貌似全能,但其可替代性也最高,知识库迁移到 LearnHubs 后,Notion 仅用来存放涉及个人信息和不方便转移的旧文档。
    • Airtable 表格功能最强,虽然已经被其他软件赶上,但前期存储的大量数据仍然放在这里。
    • SuperMemo 与 Anki 功能类似,可以帮助定期复习需要重复记忆的知识点。

    而对于 Obsidian,我将其视为笔记的备份站。通过 GoodSync,LearnHubs 笔记发生修改后,相关更新会实时同步到 Obsidian,完成笔记的备份。期待有一天 Obsidian 完善双链功能,帮助笔记自动打上标签,到时备份笔记就能正式使用,我也能无缝切换到新的知识管理应用。

    如果你也想试试……

    如何把博客转换为知识库,建立属于你的 LearnHubs 知识管理网站?

    首先,确保你有 GitHub 账号,懂 Markdown 和基础 HTML 知识。然后,按照 LearnHubs 部署教程open in new window完成搭建和配置。如果你的笔记已经用 Markdown 格式编写,只需把文档放在 docs 目录下,就可以建立自己的知识库。

    笔记结构可以参考我的分类。这没有绝对的界限,只要看到自己觉得有价值的知识点,都可以往 LearnHubs 里添加。但是,不要全文本地化收藏,简单提取用链接引用即可。除少量精品外,网络时代的文章隔几年就会失效,没必要收藏为一篇篇的笔记。当下次需要使用这个知识点时,再考虑整理事宜,否则,长时间用不到的知识,又有什么整理的价值呢。

    • 置顶:日常习惯、健身、阅读;
    • 代码:常用代码的学习和使用笔记;
    • 软件应用:常用应用、Chrome 扩展和相关教程;
    • 页面开发:页面插件和框架生成工具;
    • 网站部署:网站相关的工具和知识收集;
    • Linux 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署;
    • 系统问题:Windows 系统优化和相关问题;
    • 生活区:说明书、生活记录和小技巧;
    • 博客区:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。

    最后

    两个月前,我在 WordPress 博客篇中喊着「md2wordpress 是最后一次博客方案」,但由于 WordPress 与 Markdown 各种不兼容,写完没多久就换到支持原生 Markdown 解析的 VuePress。

    这次我不想再立 Flag 了,只希望能放过自己。每进行一次知识迁移,真是大伤,休息一段时间吧。

    如果你有兴趣尝试 LearnHubsopen in new window,欢迎通过链接访问并复制模板尝试。具体的操作方法与常见问答我都写在博客中。如果有进一步的问题或讨论,欢迎在评论区留言。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2022-11-03-ffmpeg_screen_recording.html b/posts/2022-11-03-ffmpeg_screen_recording.html index f0e0d9b6..0ae70b26 100644 --- a/posts/2022-11-03-ffmpeg_screen_recording.html +++ b/posts/2022-11-03-ffmpeg_screen_recording.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    抛弃又贵又难用的录屏软件,3 分钟入门 FFmpeg

    工具录屏约 3116 字大约 10 分钟...

    当所有的录屏应用都无法满足我时,我的目光投向了那个最终极的命令行工具,FFmpeg。

    开始自我监控open in new window后,录屏工具的重要性迅速提升,我遇到的问题也越来越多。因为我录屏主要是为了自我监控,所以我需要的帧率不必很高,甚至越低越好,分辨率也不必和屏幕一致,只要能看清我在做什么就可以了。

    最初,我使用了免费开源的 VLCopen in new window,这也是我监控文章中采用的方案。它能调节输出视频的编码、帧率、格式,但操作麻烦,而且不能同时录屏和摄像头,暂停录制也容易导致程序崩溃。

    然后,我尝试了 OBSopen in new window,它的录制功能极其强大,可以任意添加摄像头、文字、图像等,但输出限制多,生成的视频体积过大。同时,OBS 不支持录制画面与直播画面分开,而我平常习惯边开直播边工作,这令我只能放弃 OBS 录屏。

    接着,我发现了 7.8k Star 的 Capturaopen in new window,它的自由度较高,能自定义叠加元素,但项目已于 2018 年停止更新,使用时经常碰到莫名其妙的报错,很不稳定。

    免费的不行,那么收费的会不会好点呢?

    我用 Bandicamopen in new window 录制了一周的视频。与 Captura 相比,Bandicam 的稳定性有了很大的提升,不会突然崩溃,还有降噪和内录扬声器功能,但它偶尔会丢失摄像头,导致无法自动录屏。

    再后,我测试了其他几款录屏应用:

    • 相机:Windows 自带应用,录制方便,但输出选项较少,限制多。
    • FlashBack Expressopen in new window:能调节帧率,画面镜像,虚化背景,但免费版只支持 2 小时内的录制。
    • Mirillis Action!open in new window:高帧率录制游戏,自动分割视频,自定义叠加元素,但输入帧率不能自由调整,最低只能 15 帧,试用期 30 天。
    • oCamopen in new window:打着免费招牌但有弹窗广告,且输出视频偏大。
    • ShareXopen in new window:免费开源强大的截图软件,具备录屏功能,能调节编码和帧率,但只能单一录屏或录像。

    我一共试了 9 款录屏软件,体验都不太好,软件普遍存在无法自定义画面、不兼容、稳定性低的问题。再加上自我监控方案的单次录制时间超过 12 小时,理想的帧率(0.02 帧)远超出应用最低 15-30 帧的下限。因此,我需要另外找一款稳定、兼容性高、又能自由定制录屏方案的工具,最终找到的是 FFmpeg。

    为什么 FFmpeg

    FFmpeg 是处理多媒体内容 (如音频、视频、字幕和相关元数据) 的库和工具的集合,支持在 Linux、MacOS 和 Windows 平台上运行。它提供了录制、转换以及流化音视频的完整解决方案。

    上文尝试的录屏、视频处理工具几乎都是基于 FFmpeg 而开发的。不仅能实现它们的所有功能,还具有超高的稳定性和兼容性。与 FFmpeg 相比,现成的录屏应用的优势仅在于其美观的界面和简单易上手的录制方案。

    若要跳出软件的限制,自由地定制录屏效果,避免莫名其妙的 bug,更底层的 FFmpeg 反而是更稳定有效的方案。命令行录制看起来复杂,但实际上只需要熟悉十几个参数,你就能定制专属录屏方案,个人感觉比熟悉 Bandicam 的软件界面更简单。

    以我在 Windows 上的桌面录制方案为例,从多屏幕中指定一个 2K 区域进行录制,并在画面右下角添加 360P 的摄像头录制角度,然后以帧率 0.02 输出监控视频。按 q 则停止录制。

    输出画面如图例

    录屏准备

    配置 FFmpeg

    1. 下载最新版 FFmpegopen in new window,Windows 环境选择 ffmpeg-master-latest-win64-gpl.zip,GPL 版本包含了所有依赖项。

    2. 将 FFmpeg 解压到任意文件夹,比如 D:\Backup\Libraries\Documents\ffmpeg

    3. 开始栏搜索「编辑系统环境变量」,点击进入「环境变量」。

    4. 新建用户变量 FFMPEG_HOME,变量值设为刚才的解压路径 D:\Backup\Libraries\Documents\ffmpeg

      FFmpeg 全局变量设置

    配置完成后,在终端输入 ffmpeg 即可启动。

    FFmpeg 配置成功

    配置视频/音频设备

    FFmpeg 的录制命令 gdigrab 不支持音频录制,也不支持直接调用摄像头,此时需使用开源的 screen-capture-recorder-to-video-windows-freeopen in new window 增强 FFmpeg 的录制功能,其最新版本为 0.12.12。

    通过命令 ffmpeg -list_devices true -f dshow -i dummy 查看支持的 Windows DirectShow 输入设备,采集视频和音频设备,包含设备名称,设备类型等信息。[1] 这里得到了视频设备「USB2.0 PC CAMERA」和音频设备「Analogue 1/2 (Audient iD4)」,之后会用到。

    查看视频/音频设备列表

    录制屏幕

    从坐标 0:0 开始圈定出一个 2560x1440 的屏幕范围,然后以 每 50 秒截图 1 帧,输出为 mp4 格式的视频,录制命令为 ffmpeg -f gdigrab -r 20/1001 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 output.mp4[2]

    以下是录制命令的说明:

    • -f gdigrab 使用 FFmpeg 内置的 Windows 屏幕录制命令 gdigrabopen in new window,录制对象可为全屏、指定范围和指定程序。MacOS 录屏方法为 AVFoundationopen in new window,Linux 录屏方法为 x11grabopen in new window
    • -r 20/1001 帧率为 0.02,每 50 秒录制一帧。主流大家喜欢用 -r 30 录制,但由于这是用于每日监测,所以我采用了超低帧率。
    • -c:v libx264 是用于设置视频编解码器,一般可不填使用默认配置,-c:a 为音频编码。[3]
    • -draw_mouse 1 在 gdigrab 录制的视频中显示鼠标。
    • -offset_x 0 -offset_y 0 -video_size 2560x1440 为起始坐标和选定录制范围。坐标可使用截图软件获取,比如我用 Snipaste,点击 F1 后进入截图界面,鼠标经过当前区域就会显示坐标。
    • -s 1280x720 用 scale 方法,设置视频分辨率为 720p。
    • -i desktop 为输入设备,指代显示屏。
    • out.mp4 为输出视频的名字与格式。默认保存在命令运行文件夹,可以在此处设置输出位置,如 D:\Backup\Libraries\Desktop\out.mp4。或使用时间对视频命名,将 out.mp4 替换为 -f segment -segment_time 2 -strftime 1 %Y-%m-%d_%H-%M-%S.mp4,视频样例名为 2022-11-06_10-53-17.mp4

    除上方命令外,FFmpeg 还有许多参数可以设置,比如 -pix_fmt yuv420p -preset ultrafast 提升编码速度,-filter:v 'setpts=0.1*PTS' 减少视频抽样,但 setpts 不是视频加速,对于低帧率的视频影响很小。[4] [5]

    录制摄像头

    然后,我们使用上方获取的视频设备,即可用摄像头进行录制,如 ffmpeg -f dshow -i video='USB2.0 PC CAMERA' output.mp4

    如果录屏的同时需要录制音频,则在命令中加入之前获取的音频设备,命令变为 ffmpeg -f dshow -i audio='Analogue 1/2 (Audient iD4)' -f dshow -i video='USB2.0 PC CAMERA' output.mp4

    输出视频:画中画

    清楚如何用 FFmpeg 录制屏幕、摄像头和音频后,我需要将他们放置于同一画面中,将摄像头画面放在录制画面的右下侧,并用 overlay 方法将其置于屏幕画面的上方,遮挡对应区域。[6] [7]

    综合了以上三步,最终的录制命令为:ffmpeg -f gdigrab -r 1 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 -b:v 0 -crf 32 -f segment -segment_time 2 -strftime 1 %Y-%m-%d_%H-%M-%S.mp4 -f dshow -i audio='Analogue 1/2 (Audient iD4)' -f dshow -s 640x480 -i video='USB2.0 PC CAMERA' -filter_complex 'overlay=W-w-1:H-h-50' -y

    • -b:v 0 -crf 32 是将视频比特率设置为最小,同时使用恒定质量,CRF 的范围可以从 0(最佳质量)到 63(最小文件大小)。
    • overlay=W-w-1:H-h-1 这是一个坐标,指浮层放在右下角,距离边缘 1px。
    • -y 遇到选项时,默认执行 yes 命令,比如覆盖同名的视频文件。

    命令中的录制帧率较低,但不会影响同时录制的音频。之后的录屏只需在终端中运行这段命令,就会自动录制屏幕,在终端上按 q 即可停止录制。使用 FFmpeg 后,我的录屏再也没有莫名其妙的崩溃了。

    常见问题

    Could not set video options

    报错 Could not set video options,多是由于录制设置的帧率、分辨率超出设备范围造成的。使用命令 ffmpeg -f dshow -list_options true -i video='USB2.0 PC CAMERA' -loglevel debug 检查设备的输出属性,调整录制属性。

    real-time buffer

    报错 real-time buffer [xxxxxx] [video input] too full or near too full (181% of size: 3041280 [rtbufsize parameter])! frame dropped!,解决方案参考 issue 136open in new window。尽管我仍然遇到了这个错误,但它并未影响录屏的效果。

    摄像头分辨率错误

    如果摄像头画面出现裁切,分辨率与预期不同,可以检查摄像头录制属性和摄像头应用输出分辨率。例如,部分版本的 SplitCam Video Driver 将外场景尺寸固定为 4:3,导致输出画面被裁剪,因此只能更换其他视频输入源。

    录制画面偏移

    如果录制画面比例异常或画幅偏移,这可能是 Windows 的屏幕缩放造成的。可以在 ffmpeg.exe 的属性中勾选「高 DPI 缩放替代」来解决这个问题。

    脚本启动报错

    使用 AutoHotkey 等外部脚本启用录屏命令时,报错 Could not find video device with name [USB2.0],而正确设备名是「USB2.0 PC CAMERA」。检查录制命令中是否使用了双引号,需将双引号 " 替换为单引号 '

    后续

    如果读了 FFmpeg 的文档,就会发现这个工具异常强大,很多采用 FFmpeg 的工具都没有将它的功能性发挥到极致,以比较普适的功能尽可能地换取软件操作的易用性。而对于像我这样有一个比较小众、甚至特殊需求的人来说,已经打包好的图形界面应用就很有可能力有不逮。这时,FFmpeg 这种底层的命令行工具可能就是唯一的选择,而且用了之后会发现,它在功能强大的同时还更加稳定,自定义能力也更强。而且,如果跨过了起初对于命令行的恐惧,理解和上手其实也不算多难。

    此外,FFmpeg 的功能不止录屏,它还有诸如连续截图、视频转帧率改大小等多种玩法,非常强大。

    前几天,群里有人分享了快速生成 FFmpeg 命令的工具 FFmpeg.guideopen in new window。本以为能帮新手快速入门,使用后却感觉不实用。FFmpeg 最快入门的方法还是得看官方文档,也有一些爱好者整理翻译了相关的中文/视频教程。前期会耗费一些时间,但只要定制好自己要的命令,之后就能一直使用。

    当然,本文的目的是分享我监控自己的延伸,分享使用 FFmpeg 录屏的入门方法,而非完全掌握,因此只介绍了录屏相关的核心命令。如果有需要,还是推荐研究一下官方文档,或者跟着我做的试一试,说不定就有新收获。

    本文于「少数派首发open in new window」。


    1. ffmpeg 录屏命令open in new window ↩︎

    2. ffmpeg 基础使用open in new window ↩︎

    3. libx265 编码说明open in new window ↩︎

    4. x265 的 preset 与编码速度、视频画质以及比特率的关联open in new window ↩︎

    5. FFmpeg 音视频倍速控制open in new window ↩︎

    6. FFmpeg 中 overlay 滤镜用法 - 水印及画中画open in new window ↩︎

    7. ffmpeg 调整缩放裁剪视频的基础知识 (转)open in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2023-01-26-whiteboard_gtd.html b/posts/2023-01-26-whiteboard_gtd.html index a9b0ecc7..e4fe8734 100644 --- a/posts/2023-01-26-whiteboard_gtd.html +++ b/posts/2023-01-26-whiteboard_gtd.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    为什么我把日常任务放回墙上,而不是手机里?

    工具白板GTD约 1465 字大约 5 分钟...

    摆脱数字性遗忘:白板墙贴的生活/工作清单,适用于居家办公的 GTD 补充记录方案。

    在数字化和网络化的时代,日常记录从纸质转移到电子存储,它带来了无限的容量和随时随地使用的便利。然而,这也带来了新的问题:如果没有打开应用程序,记录就无法提醒,容易忘记重要事情。即使设置了定时提醒,提醒时间也不一定是最佳处理时间,因此可能会延迟或取消,从而导致遗忘。为了解决这个问题,我使用白板墙贴来记录生活/工作清单。

    Website Creator Cartoon
    源图:Storyset

    为什么是白板?

    在中学时,我没有电脑和手机,就曾把最初的 GTD 记录在玻璃桌面上,若记录失效或不再需要,只需擦掉即可。白板墙贴与当时的玻璃桌面效果类似,只是换到墙上了。我在书房和走廊各贴了一块白板,书房的墙贴用来提醒当天要做什么,走廊的墙贴用来提醒日常生活仪式。无论走到哪里,都不会错过重要提醒。特别是在不确定下一步该做什么时,我只要转身,就能看到工作清单,非常直观和便捷。

    透明/白色静电墙贴

    与电子记录相比,白板没有软件框架限制。它可以用于绘制思维导图,帮助人们更清晰地组织思路;也可以用多种颜色的记号笔随意书写和涂鸦,以原始的方式表达自己的想法。因此,白板是记录、展示信息和思考的极佳工具。

    Scrum board
    Scrum board

    白板类型

    白板墙贴源自 @chen 在群里分享的一个很棒的主意:使用静电墙贴作为白板,可以随时记录。在尝试的过程中,我更换了三种材质:透明静电墙贴、白色静电墙贴和 PVC 墙贴(吸磁软白板贴)。

    类型透明/白板静电墙贴PVC 墙贴(非静电)支架式白板
    优点安装方便;轻松固定在墙上;费用低。磁吸;字迹擦拭方便;
    黑色、白色、绿色、黛灰等多种背景可供选择。
    双面书写;易写易擦;可吸附性;可自由升降;可 360° 翻转;带刹车滑轮。
    缺点字迹在 24 小时后会在墙贴上留下凸起的痕迹;红色、蓝色等非黑色笔迹很难擦干净。需要使用双面胶固定;难以将其平整地贴在墙上。安装麻烦,无法贴上墙,占地方。
    费用20 元(120cm x 200cm)160 元(120cm x 200cm)280 元(100cm x 200cm)

    我的方案

    在我的方案中,记录的想法分为日常仪式和生活/工作两类。日常仪式记录在走廊白板上,生活/工作记录则输出在书房白板上。下面我将简要介绍白板内容和思路。

    记录输入流

    书房白板

    我最常待的地方是书房,所以把日常记录都放在书房白板上,用来记录当日清单、锻炼进度、思维导图、项目跟进和临时安排。书房白板使用率较高,因此建议使用易写易擦的 PVC 墙贴(吸磁软白板贴)。

    书房白板

    在白板上半部分,我放置了经常查看的目标,这也是视线的第一触达点;而下半部分则用于日常书写和记录,以便转身就能记录即时想法。

    PVC 墙贴(非静电)

    走廊白板

    走廊白板是对书房白板的补充,可以在书房之外的区域提醒生活仪式等内容,例如:每天早上喝杯热水自测体脂,晚上进行当日回顾和睡前准备。走廊白板擦写频率较低,可以使用便宜的静电墙贴。如果需要修改走廊白板的提示,可以用纸巾沾水擦拭。

    走廊白板

    电子记录

    使用白板墙贴记录 GTD 并不意味着放弃数字化记录。相反,我可以将白板墙贴与电子记录结合起来,使用电子记录来存储详细信息,而使用白板墙贴来提醒重要事项。在「当日检视」的环节中,我会同步书房白板和电子 GTD,以确保两者的内容保持一致。这样,我就可以在保持良好的效率和组织性的同时,还可以提高记录的可靠性和可追溯性。

    更多

    如果您选择了 PVC 墙贴方案,请注意不要使用洗洁精、酒精或湿纸巾擦拭白板,否则可能会损害白板,导致后续难以彻底清洁。

    通过使用白板墙贴记录 GTD,我发现它不仅可以帮助我更好地管理时间和任务,还可以提高工作效率。因为白板墙贴是实体物品,我可以随时随地看到它,而且它是直观的,使我一目了然地了解自己的任务和进度。此外,白板墙贴可以随时更新和修改,让我可以随时调整计划和任务。白板工具填补了笔记/清单应用和个人定制需求之间的空隙。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2023-09-05-virtual_positioning.html b/posts/2023-09-05-virtual_positioning.html index ace94fba..29b431db 100644 --- a/posts/2023-09-05-virtual_positioning.html +++ b/posts/2023-09-05-virtual_positioning.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    不再门口等待!在家「预定」餐厅座位,掌握虚拟定位技巧 - 无需 ROOT

    工具虚拟定位约 680 字大约 2 分钟...

    这篇文章是上海封城前所写,放在草稿箱中已经一年多了,现在终于可以重新用到了。

    家门口的网红餐店总是要排三个小时的队,而且要在店门口扫描二维码。为了避免在门口浪费时间,我经常选择在家中提前将我的手机定位设至餐厅附近,然后扫码排队。只有当快轮到我时,我才从家出发。想知道我是如何实现这个小技巧的吗?

    虚拟定位

    1. 首先,在电脑上安装安卓模拟器,文中以蓝叠模拟器为例,但其他模拟器的操作也相似。

    2. 在模拟器中打开要修改定位的应用,点击应用的定位图标。

    3. 选择「地图定位」,点击你想设定的地点。当提示「设置该坐标点为当前位置?」后,点击确定,返回至微信界面,即可看到虚拟定位已启用。

    4. 更改定位后,为了确认位置是否准确,建议你在应用内使用位置服务进行检查。例如,如果想要核实微信上的位置,你可以尝试给「文件传输助手」发送位置信息。

    常见问题

    无法虚拟定位

    如果你已经按照上述步骤进行设置,但仍然不能虚拟定位,这可能是由于模拟器没有正确获取位置信息。为了验证这一点,你可以在模拟器中的微信应用里,给好友发送实时位置分享,看是否能正确显示。

    手机修改定位

    我曾尝试在手机上使用如 fakegps 这样的工具来修改位置,但只有高德地图更改成功,其他都失败了。据了解,这可能与 Android 10 或更高版本的系统有关。如果你使用的是 Android 9 或更早版本的手机,你或许可以尝试使用旧版本的微信来更改定位。

    关于虚拟签到

    虽然企业微信、钉钉等打卡软件也可用此法签到,但请勿滥用。有记者曾在三家价格分别为 5 元、10 元、20 元的网店购买更改定位服务,结果发现这些商家仅是远程登录客户的微信账号,然后使用特定工具修改定位,操作流程与上文所述类似。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2023-10-07-clone-voice.html b/posts/2023-10-07-clone-voice.html index 4b7f6bb2..157d98b8 100644 --- a/posts/2023-10-07-clone-voice.html +++ b/posts/2023-10-07-clone-voice.html @@ -38,7 +38,7 @@ } - + @@ -53,10 +53,10 @@ python scripts/resample.py
  • 第 10 步:执行 python preprocess_v2.py --add_auxiliary_data True --languages C

  • 第 11 步:

  • 文字生成语音

    微调完成后,将 OUTPUT_MODEL 下的模型文件和 config 文件放在语音生成工具 inferenceopen in new window 解压文件夹下,其文件名分别为 G_latest.pthfinetune_speaker.json。一切准备就绪后,运行 inference.exe, 浏览器会自动弹出窗口,即可在本地环境下生成个性化的语音内容。注意其所在路径不能有中文字符或者空格。

    在这个阶段,特别注意中文模型(即 languages C)的 finetune_speaker.json 格式问题。确保「speaks」部分被修改为字典格式,否则在运行 inference 时,你可能会遇到 File "inference.py", line 99 的报错。为方便,你可以直接点击这里open in new window下载我调整好的 json 文件。如果你不需要二次元声音,可以直接使用 OUTPUT_MODEL 下的 config.json 替代 finetune_speaker.json

    声音微调

    生成声音与原声无关

    在检查语料转写文本时,尽量减少对 short_character_anno.txtlong_character_anno.txt 文件的非必要修改。过多的修改可能会导致生成的声音与原始声音产生明显差异。最初的训练中,可以将 max_epochs 设置为 200。在确生成声音符合预期后,再进行后续的训练。

    例如:因个人语调的不同,我读的是「假语村言」,但 whisper 将其识别为「甲乙寸言」。如果我保留 whisper 的识别结果不做修改,最终生成的声音与我本人的声音非常接近。但当我将 whisper 识别结果修改为原文本后,生成的声音产生了显著变化,几乎听不出与原声音的相似性。我们只需要对那些发音明显错误的部分做出修改。例如,「假」和「甲」的发音相同,无需更改;「语」和「乙」之间的差异较大,但由于是个人发音的特点,也无需更改;对于「村」和「寸」这样声调不同的词汇,可以在检查录音后做出相应更改。

    语音克隆的「口音」问题

    克隆音频实例 2
    克隆音频实例 2

    这个示例是使用 8 分钟 B 站视频和 CJE 模型训练出的。但你可能注意到了明显的断调口音问题,仿佛一个日本人在说中文。正如 @zachx121 指出的,「CJE 用的时候 romaji 的注音,就好比说用汉语拼音去标注英文单词的发音一样会有“口音”」。为了避免这个问题,可以使用纯中文设计的 C 模式进行训练和生成,以确保音频的自然和准确性。增加训练次数也有助于改善口音问题。

    常见问题

    无法启动 inference

    如果你遇到无法启动 inference 的问题,通常是因为 finetune_speaker.json 配置文件有问题。确保你下载的 json 文件是对应的版本,并且格式完整。如果问题仍然存在,可以考虑使用 configs/modified_finetune_speaker.json 文件替代原有配置文件,通常这样可以解决运行中出现的错误。

    长音频识别问题

    要注意,长音频需要采用 wav 格式。即即使原本为 mp3 格式的音频文件在后期转为 wav,也可能出错。因此,直接使用 wav 格式进行长音频录制或选择是更好的做法。

    录音中出现 zh

    在使用纯中文模式调试时,音频前后可能会标注当前语言,例如,中文语言中出现 ZH 标注。为去除这些不必要的语言标注,可以将生成语言设置为 Mix 模式。

    长句读音含糊

    用短句生成了一段 6 秒的清晰音频,但当将两个相同的短句重复形成长句时,生成的语音时长仅为 9 秒,发音特别含糊。可能是因为语料文本过度修改,一些语音没有被 Whisper 识别,但已经标注。这与训练次数无关,出现此问题后,需重新检查语料。

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2023-10-29-switch-firmware-updates.html b/posts/2023-10-29-switch-firmware-updates.html index f90ce2fd..5fb0db86 100644 --- a/posts/2023-10-29-switch-firmware-updates.html +++ b/posts/2023-10-29-switch-firmware-updates.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Switch 升级记录与资源汇编

    工具games约 1837 字大约 6 分钟...

    家里有一台多年前购买的港版软破大气层 Nintendo Switch,已经闲置了相当长时间。最近,我想用 Switch 来恢复运动,就重新翻出了它,但面临一些问题。

    注入器、大气层以及系统版本都相当陈旧,而之前的卖家也无法联系上。因此,我不得不自行研究如何进行升级,同时寻找游戏下载渠道。闲置 Switch 系统版本停留在 10,而我的目标是将它升级到最新的版本,也就是 17。

    以下是我进行升级的步骤:

    更新注入器

    首先,我需要更新注入器,我使用的是 ns-ATMOSPHERE 注入器,它看起来像一个白色的 USB 设备。由于注入器的版本低于 Hekate 4.2,所以我需要更新 payload。

    1. 在 Windows 系统上安装 NS-Atmosphere Programmer。由于该应用的开发商已经跑路,我在 GBATEMP 论坛上找到两个版本,可以自行选择:0.3 STEUPopen in new window0.4 Protableopen in new window[1]

    2. 打开 ns-ATMOSPHERE 的 ON 按钮,双击 RST 按钮,然后使用 USB 连接到 PC 端。此时 ns-ATMOSPHERE 将亮起粉灯。如果未出现粉灯,表示未被识别,可以尝试更换 USB 端口或重新尝试之前的操作。

    3. 打开下载好的 NS-Atmosphere Programmer,点击 Refresh 来识别端口,然后点击 Browse 选择需要注入的 payload bin。在这里使用的是 hekateopen in new window,从其发布页面下载最新版本的 hekate_ctcaer_6.0.7_Nyx_1.5.6.zip,然后解压得到 hekate_ctcaer_6.0.7.bin,这就是要注入的 bin。

    如果有不清楚的地方,你可以观看 NS Atmosphere Dongle Tutorial!open in new window 这个视频教程,或者查看这篇更详细的注入器更新教程open in new window

    大气层&主机升级

    固件准备

    接下来,我需要准备大气层和主机的升级。我使用了 Yuanbanba/Atmosphereopen in new window 这个整合包,其中包含了大气层的迷你版本、Tesla 插件包以及相册 NRO 软件包,非常适合懒人使用。

    至于 Switch 最新的离线升级固件,我在 Switch Firmwaresopen in new window 上找到了。需要注意的是,这些固件分为全球版和国行版,建议选择全球版。

    升级流程

    1. 关机后,取出后盖板上的 SD 卡,并将其连接到计算机。
    2. 在 SD 卡的根目录保留可能存在的 emuMMC 和 nintendo 文件夹,其他文件全部删除。(如果你有补丁或金手指,请务必自行备份。)
    3. 复制大气层文件和解压后的离线升级固件到 SD 卡的根目录。
    4. 如果你有 emuMMC 文件夹,则选择启动 虚拟(破解)系统;如果没有,则参考 Create an emuMMCopen in new window 教程创建 emuMMC 虚拟系统。请注意,创建 emuMMC 虚拟系统将占据 SD 卡 29G 的空间,并清空和重新分区 SD 卡,创建后需重新复制大气层文件和固件。
    5. 最后,进入系统后,打开「相册」,启动 daybreak 插件,然后选择安装离线固件包。随后全部选择右侧的选项并按下 A,安装完成后重启系统即完成升级。

    进入大气层系统

    1. 在关机状态下,拆下右侧手柄(红色手柄)。如果已经开机,长按电源键约 8 秒,选择关闭电源。
    2. 将短接器插入右侧手柄的空槽中,确保插到底。
    3. 打开注入器的开关,等到灯亮起后插入 ns 的充电口。
    4. 按住音量键 +,然后按下电源键,稍等片刻,大气层界面将会出现,此时可以拔下盒子和短接器,然后接上右手柄。
    5. 大气层系统中点击「启动」,选择第二个选项 - 虚拟(破解)系统。

    安装游戏

    DBI

    关于大气层安装游戏和 DLC 的方法,请参考 Installation of games, DLC, updatesopen in new window

    1. 使用 USB 将 Switch 连接到 PC。
    2. 进入「相册」,启动 DBI,按 X 来运行 Run MTP Responder。此时,PC 端将出现 Switch 设备。
    3. 打开 PC 上出现的 Switch 设备,根据你想安装游戏的位置,将游戏复制到 5: SD Card install6: NAND install
    4. 安装结束后,按 B 停止 MTP 服务器并卸载 MTP 设备,然后再按 B 关闭 DBI。

    如果你安装的是需要网络登录的游戏,例如《Just Dance 2023》,请确保按照游戏包中提供的离线激活提示进行操作。在安装前,需将离线激活和 Mod 文件移出安装包,以避免出现 not acceptable 的错误提示。

    DBI 是大气层增强包的内置插件。如果不使用增强包,你也可以手动安装 DBI,具体流程请参考 DBI 安装及使用说明open in new window

    NS-USBloader

    如果你不喜欢 DBI 的界面,也可以使用 Awoo Installer 通过 NS-USBloaderopen in new window 来安装 Switch 游戏。

    然而,在安装游戏前,你需要在 NS-USBloader 的左侧,点击设置按钮,然后选择右侧的「下载并安装驱动程序」。如果不执行此步,Switch 可能会提示 USB 设备不兼容。

    游戏资源

    游戏资源可在 SWITCH TORRENT LIBRARYopen in new window 上获取。这是最大且免费的游戏库,适用于 Nintendo Switch 和其他平台。在测试中,我找到了所有需要的游戏。

    点击页面上的标题区域,将跳转至 Telegram Bot。向机器人发送游戏的英文名称,机器人将回复游戏的种子文件和版本说明。游戏的英文名称可以在 3DMGAME Switch 专区open in new window中查找。

    如果需要金手指,可以在 DBI 游戏安装的第三步将金手指文件复制到 1: SD Card\atmosphere\contents 文件夹中。然后,进入相册,打开 Edizon,按下 L 键进入系统模块管理,开启 Tesla 插件。在需要开启金手指的游戏中,按住 L 键再按向下方向键,即可激活金手指菜单。金手指资源见 Switch520open in new window

    部分游戏列表:

    • 健身游戏:舞力全开(Just Dance),有氧拳击 2(Fitness Boxing 2),健身拳击:北斗神拳(Fitness Boxing - Fist of the North Star),健身环大冒险(Ring Fit Adventure),健身巡游(Fitness Circuit),Nintendo Switch Sports。
    • Mario 系列:超级马里奥兄弟:惊奇(Super Mario Bros. Wonder),马里奥派对:超级巨星(Mario Party Superstars),马里奥和疯狂兔子:星耀之愿(Mario plus Rabbids - Sparks of Hope)。
    • 休闲游戏:世界游戏大全 51(Clubhouse Games 51 Worldwide Classics),太鼓达人(Taiko no Tatsujin),胡闹厨房(Overcooked),大富翁 11。
    • 动作冒险:双人成行(It Takes Two),荒野大镖客:救赎(Red Dead: Redemption),塞尔达传说:旷野之息(The Legend of Zelda - Breath of the Wild),女神异闻录 5(Persona 5 Royal),十三机兵防卫圈(13 Sentinels Aegis Rim),AI 梦境档案(AI The Somnium Files)。
    • 格斗游戏:真人快打 1(Mortal Kombat 1),IGS 经典街机合集(IGS Classic Arcade Collection)。
    • 竞技游戏:FIFA 23,NBA 2K24,曼岛 TT 赛:边缘竞速 3(TT Isle Of Man: Ride on the Edge 3)。
    • 真人影视互动:春逝百年抄(The Centennial Case: a Shijima Story),十个约会(Ten Dates)。

    1. NS Atmosphere Software Mirroropen in new window ↩︎

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2023-12-12-eu.org-free-domain.html b/posts/2023-12-12-eu.org-free-domain.html index 2c4daef3..84ba1b51 100644 --- a/posts/2023-12-12-eu.org-free-domain.html +++ b/posts/2023-12-12-eu.org-free-domain.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    如何免费白嫖域名:获取永久免费顶级域名.eu.org

    工具Free域名白嫖约 877 字大约 3 分钟...

    如何免费白嫖域名:获取永久免费顶级域名.eu.orgopen in new window

    介绍

    欢迎阅读本教程,本文将详细介绍如何通过免费域名服务.eu.org获取永久免费的顶级域名。.eu.org域名服务成立于1996年,旨在为无力支付高额域名费用的用户和非盈利组织提供免费、不限量的顶级域名,有效期至少延长到2030年。

    看效果:

    步骤一:注册账号

    1. 打开eu.org官网open in new window,点击注册链接:https://nic.eu.org/arf/en/contact/create/open in new window
    2. 在注册页面中填写以下信息:
      • Name:填写英文名字,建议使用真实姓名。
      • E-mail:填写常用邮箱,用于接收申请通知。建议使用Gmail或Outlook,避免使用QQ邮箱。
      • 地址:填写英文地址,按照从小到大的顺序填写。地址的准确性不是很重要,但也不要填写明显错误的地址。
      • Country:选择所在国家,如实选择即可。
      • Phone和Fax:可选择不填。
      • 勾选Private选项:保护个人信息,避免被WHOIS查询到。
      • 勾选accept the domain policy。
      • 输入密码并确认。

    步骤二:激活账号

    1. 注册成功后,你将收到一封主题为“new EU.orgopen in new window contact XXXX-FREE”的邮件,点击邮件中的激活链接。
    2. 使用分配给你的用户名和刚刚设置的密码登录。

    步骤三:申请新域名

    1. 登录后,你将看到个人主页,上面是你的用户名,下面是你持有的域名列表(如果是新用户,则列表为空)。
    2. 点击“New Domain”按钮,申请一个新域名。
    3. 在“Complete domain name”栏中填入你想要申请的完整域名,需要包含.eu.org后缀,例如example.eu.orgopen in new window
    4. Organization栏一般不需要修改,保持之前注册时填写的信息即可。
    5. Administrative contact是域名的管理联系人,默认为自己,申请成功后可以转让给其他用户。
    6. Technical contact是域名的技术联系人,默认为自己,也可以填写其他人的ID或注册一个新账号。
    7. 域名服务器设置:由于.eu.org组织不提供DNS服务,你需要选择其他DNS服务提供商。下面以DNSPod为例进行说明。

    步骤四:设置域名服务器(以DNSPod为例)

    1. 在申请页上选择“Check for correctness of server names”选项(第一个选项)。
    2. 登录DNSPod控制台open in new window
    3. 在控制台的“我的域名”中,找到你要设置的域名。
    4. 在域名列表中点击该域名,进入域名详情页。
    5. 在域名详情页中,找到“DNS设置”或类似选项。
    6. 根据.eu.org的要求,设置域名服务器。DNSPod会进行简单的验证,无需进行SOA验证。
    7. 完成域名服务器设置后,返回.eu.org申请页面,继续提交申请。

    恭喜!你已经完成了免费获取永久免费顶级域名.eu.org的申请流程。

    请注意,.eu.org域名的审核周期可能较长,可能需要数个月的时间。申请通过后,你将拥有一个永久免费的顶级域名,可用于个人或非盈利组织的网站搭建等用途。

    最后附小编的域名list, 请耐心等待哦!

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2023-12-12-sd-op.html b/posts/2023-12-12-sd-op.html index f64a3098..02b9efa0 100644 --- a/posts/2023-12-12-sd-op.html +++ b/posts/2023-12-12-sd-op.html @@ -38,7 +38,7 @@ } - + @@ -54,10 +54,10 @@ cd /d D:\stable\new_ComfyUI_windows_portable_nvidia_cu121_or_cpu\ComfyUI_windows_portable\ComfyUI python main.py

    以后直接双击xxxx.bat 文件即可运行comfyui

    comfyUI使用说明:https://blenderneko.github.io/ComfyUI-docs/#first-steps-with-comfyopen in new window

    topaz video 下载open in new window

    topaz photo 下载open in new window

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/2023-12-13-awesome-selfhosted-cn.html b/posts/2023-12-13-awesome-selfhosted-cn.html index 1ddf4852..ac3244e9 100644 --- a/posts/2023-12-13-awesome-selfhosted-cn.html +++ b/posts/2023-12-13-awesome-selfhosted-cn.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    awesome-selfhosted-cn(百宝箱!)

    工具百宝箱合集外站资源约 14651 字大约 49 分钟...

    Awesome-Selfhostedopen in new window 是由 Edward Dopen in new window 发起和维护资源列表,收集了许多可以在本地搭建的网络服务和 Web 应用列表。

    Awesome-Selfhosted-cnopen in new window 则是依据 Awesome-Selfhostedopen in new window 翻译而来。也欢迎你帮助推荐和提供建议!

    Selfhosting is the process of locally hosting and managing applications instead of renting from SaaS providers.

    This is a list of Freeopen in new window Software network servicesopen in new window and web applicationsopen in new window which can be hosted locally. Non-Free software is listed on the Non-Free page.

    See Contributing.

    =================


    分析

    Web Analytics

    Business Intelligence

    自动化

    博客平台

    See also Static Site Generators, Content Management Systems and WeblogMatrixopen in new window

    书签 & 链接共享

    日历和地址薄

    Some Groupware solutions also feature calendar/address book editing and synchronization.

    通讯系统

    定制

    Email

    完整方案

    simple deployment of a mail server, e.g. for inexperienced or impatient admins.

    邮件传输代理

    MTAs / SMTP servers

    邮件发送代理

    MDAs - IMAP/POP3 software

    邮件列表和时讯

    Mailing lists servers and mass mailing software - one message to many recipients.

    Webmail 客户端

    IRC

    IRCopen in new window communication software

    SIP

    SIPopen in new window telephony software

    IPBX

    IPBXopen in new window telephony software

    社交网络与论坛

    XMPP

    Extensible Messaging and Presence Protocolopen in new window software

    XMPP 服务器

    XMPP Web 客户端

    内容管理系统 (CMS)

    CMS are a practical way to setup a website with many features. CMS often come with third party plugins, themes and functionality that is easy to add and customize to your needs. See also Blogging Platforms and Static Site Generators

    Recipe management

    电子商务

    DNS

    See https://github.com/n1trux/awesome-sysadmin#dnsopen in new window

    文档归档

    企业资源规划 ERP

    联合身份/认证

    Feed 阅读器

    文件共享和同步

    Some Groupware solutions also feature file sharing and synchronization.

    分布式文件系统

    • Camlistoreopen in new window - Camlistore is a set of open source formats, protocols, and software for modeling, storing, searching, sharing and synchronizing data in the post-PC era. Data may be files or objects, tweets or 5TB videos, and you can access it via a phone, browser or FUSE filesystem. (Source Codeopen in new window) Apache Go
    • GlusterFSopen in new window - GlusterFS is a scalable network filesystem. Using common off-the-shelf hardware, you can create large, distributed storage solutions for media streaming, data analysis, and other data- and bandwidth-intensive tasks. (Source Codeopen in new window) LGPLv3/GPLv2 C
    • Go IPFSopen in new window - Implementation of IPFSopen in new window, a global, versioned, peer-to-peer filesystem that seeks to connect all computing devices with the same system of files. It combines good ideas from Git, BitTorrent, Kademlia, SFS, and the Web. It is like a single bittorrent swarm, exchanging git objects.
    • Ori Filesystemopen in new window - A Secure Distributed File System built for offline operation. (Source Codeopen in new window) MIT C++
    • Swiftopen in new window - A highly available, distributed, eventually consistent object/blob store.
    • Tahoe-LAFSopen in new window - Tahoe-LAFS is a Free and Open decentralized cloud storage system. It distributes your data across multiple servers. Even if some of the servers fail or are taken over by an attacker, the entire file store continues to function correctly, preserving your privacy and security.

    文件传输/同步

    点对点文件共享

    单击/拖放上传

    基于 Web 的文件管理

    游戏

    网关

    Groupware 群件

    学习和课程

    地图 & GPS

    媒体流

    See also https://en.wikipedia.org/wiki/List_of_streaming_media_systemsopen in new window, https://en.wikipedia.org/wiki/Comparison_of_streaming_media_systemsopen in new window

    语音流

    视频流

    杂项/其它

    资金、预算和管理

    监测

    See https://github.com/n1trux/awesome-sysadmin#monitoringopen in new window and https://github.com/n1trux/awesome-sysadmin#metric--metric-collectionopen in new window

    笔记 & 编辑器

    办公套件

    密码管理

    Pastebins

    个人仪表盘

    照片和视频库

    投票与事件

    代理

    稍后阅读列表

    搜索引擎

    软件开发

    项目管理

    See also Ticketing, Task management/To-do lists*

    Bug 跟踪

    See Ticketing

    IDE/工具

    持续集成

    文档生成器

    See also Static site generators

    • Docstoreopen in new window - A basic site for hosting static documents - docstore is a simple way to serve Markdown files without any server-side processing, and without requiring you (as the author) to recompile every time you change an article. It consists of a very simple JS script that makes an ajax request to your server, runs a Markdown processor on what it finds, and then displays the results. Clone the repository and add articles in the text/ directory to get started. (Source Codeopen in new window)
    • Flatdocopen in new window - A small Javascript file that fetches Markdown files and renders them as full pages. MIT Javascript
    • markdown-treeopen in new window - Serve a hierarchy / tree directory of markdown files. Use intended for small sites built in markdown
    • Read the Docsopen in new window - Host documentation, making it fully searchable and easy to find; import your docs using any major version control system, including Mercurial, Git, Subversion, and Bazaar. (Demoopen in new window, Source Codeopen in new window) MIT Python

    静态网站生成器

    See https://staticsitegenerators.netopen in new window and https://www.staticgen.comopen in new window

    任务管理/To-do 列表

    See also Project Management and Ticketing.

    Ticketing

    See also Task management/To-do lists and Project Management

    短 URL

    VPN

    See https://github.com/n1trux/awesome-sysadmin#vpnopen in new window

    Web 服务器

    See https://github.com/n1trux/awesome-sysadmin#webopen in new window

    Wikis

    See also Documentation Generators, Wikimatrixopen in new window, Wiki Engines on WikiIndexopen in new window, List of wiki software on wikipediaopen in new window, Comparison of wiki software on wikipediaopen in new window.

    自托管解决方案


    许可列表


    外链


    贡献

    Contributing guidelines can be found here.

    作者

    The list of authors can be found here.

    许可

    This list is under the Creative Commons Attribution-ShareAlike 3.0 Unported License.

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/posts/index.html b/posts/index.html index 2031b2fd..7653fcc0 100644 --- a/posts/index.html +++ b/posts/index.html @@ -38,7 +38,7 @@ } - + @@ -46,10 +46,10 @@
    跳至主要內容

    Posts

    约 1 字小于 1 分钟...

    目录

    已到达文章底部,欢迎留言、表情互动~
    • 赞一个
      0
      赞一个
    • 支持下
      0
      支持下
    • 有点酷
      0
      有点酷
    • 啥玩意
      0
      啥玩意
    • 看不懂
      0
      看不懂
    评论
    • 按正序
    • 按倒序
    • 按热度
    Powered by Waline v2.15.8
    - + - - - + diff --git a/rss.xml b/rss.xml index 70c7b751..e59f5aed 100644 --- a/rss.xml +++ b/rss.xml @@ -6,8 +6,8 @@ https://gpt-vip.top/ 开源工具、效率方法、心理学探索的自我提升笔记,记录并输出一切能让自己提升的知识。 zh-CN - Fri, 15 Dec 2023 10:43:23 GMT - Fri, 15 Dec 2023 10:43:23 GMT + Fri, 15 Dec 2023 10:54:34 GMT + Fri, 15 Dec 2023 10:54:34 GMT vuepress-plugin-feed2 https://validator.w3.org/feed/docs/rss2.html 工具 diff --git a/search-pro.worker.js b/search-pro.worker.js index 5f7402b1..7a6939d5 100644 --- a/search-pro.worker.js +++ b/search-pro.worker.js @@ -1,2 +1,2 @@ -const nt="ENTRIES",V="KEYS",T="VALUES",F="";class D{set;_type;_path;constructor(t,s){const n=t._tree,o=Array.from(n.keys());this.set=t,this._type=s,this._path=o.length>0?[{node:n,keys:o}]:[]}next(){const t=this.dive();return this.backtrack(),t}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:t,keys:s}=E(this._path);if(E(s)===F)return{done:!1,value:this.result()};const n=t.get(E(s));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const t=E(this._path).keys;t.pop(),!(t.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:t})=>E(t)).filter(t=>t!==F).join("")}value(){return E(this._path).node.get(F)}result(){switch(this._type){case T:return this.value();case V:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const E=e=>e[e.length-1],ot=(e,t,s)=>{const n=new Map;if(t===void 0)return n;const o=t.length+1,u=o+s,i=new Uint8Array(u*o).fill(s+1);for(let r=0;r{const d=u*i;t:for(const l of e.keys())if(l===F){const a=o[d-1];a<=s&&n.set(r,[e.get(l),a])}else{let a=u;for(let h=0;hs)continue t}R(e.get(l),t,s,n,o,a,i,r+l)}};class C{_tree;_prefix;_size=void 0;constructor(t=new Map,s=""){this._tree=t,this._prefix=s}atPrefix(t){if(!t.startsWith(this._prefix))throw new Error("Mismatched prefix");const[s,n]=x(this._tree,t.slice(this._prefix.length));if(s===void 0){const[o,u]=O(n);for(const i of o.keys())if(i!==F&&i.startsWith(u)){const r=new Map;return r.set(i.slice(u.length),o.get(i)),new C(r,t)}}return new C(s,t)}clear(){this._size=void 0,this._tree.clear()}delete(t){return this._size=void 0,ut(this._tree,t)}entries(){return new D(this,nt)}forEach(t){for(const[s,n]of this)t(s,n,this)}fuzzyGet(t,s){return ot(this._tree,t,s)}get(t){const s=I(this._tree,t);return s!==void 0?s.get(F):void 0}has(t){const s=I(this._tree,t);return s!==void 0&&s.has(F)}keys(){return new D(this,V)}set(t,s){if(typeof t!="string")throw new Error("key must be a string");return this._size=void 0,M(this._tree,t).set(F,s),this}get size(){if(this._size)return this._size;this._size=0;const t=this.entries();for(;!t.next().done;)this._size+=1;return this._size}update(t,s){if(typeof t!="string")throw new Error("key must be a string");this._size=void 0;const n=M(this._tree,t);return n.set(F,s(n.get(F))),this}fetch(t,s){if(typeof t!="string")throw new Error("key must be a string");this._size=void 0;const n=M(this._tree,t);let o=n.get(F);return o===void 0&&n.set(F,o=s()),o}values(){return new D(this,T)}[Symbol.iterator](){return this.entries()}static from(t){const s=new C;for(const[n,o]of t)s.set(n,o);return s}static fromObject(t){return C.from(Object.entries(t))}}const x=(e,t,s=[])=>{if(t.length===0||e==null)return[e,s];for(const n of e.keys())if(n!==F&&t.startsWith(n))return s.push([e,n]),x(e.get(n),t.slice(n.length),s);return s.push([e,t]),x(void 0,"",s)},I=(e,t)=>{if(t.length===0||e==null)return e;for(const s of e.keys())if(s!==F&&t.startsWith(s))return I(e.get(s),t.slice(s.length))},M=(e,t)=>{const s=t.length;t:for(let n=0;e&&n{const[s,n]=x(e,t);if(s!==void 0){if(s.delete(F),s.size===0)W(n);else if(s.size===1){const[o,u]=s.entries().next().value;$(n,o,u)}}},W=e=>{if(e.length===0)return;const[t,s]=O(e);if(t.delete(s),t.size===0)W(e.slice(0,-1));else if(t.size===1){const[n,o]=t.entries().next().value;n!==F&&$(e.slice(0,-1),n,o)}},$=(e,t,s)=>{if(e.length===0)return;const[n,o]=O(e);n.set(o+t,s),n.delete(o)},O=e=>e[e.length-1],it=(e,t)=>{const s=e._idToShortId.get(t);if(s!=null)return e._storedFields.get(s)},rt=/[\n\r -#%-*,-/:;?@[-\]_{}\u00A0\u00A1\u00A7\u00AB\u00B6\u00B7\u00BB\u00BF\u037E\u0387\u055A-\u055F\u0589\u058A\u05BE\u05C0\u05C3\u05C6\u05F3\u05F4\u0609\u060A\u060C\u060D\u061B\u061E\u061F\u066A-\u066D\u06D4\u0700-\u070D\u07F7-\u07F9\u0830-\u083E\u085E\u0964\u0965\u0970\u09FD\u0A76\u0AF0\u0C77\u0C84\u0DF4\u0E4F\u0E5A\u0E5B\u0F04-\u0F12\u0F14\u0F3A-\u0F3D\u0F85\u0FD0-\u0FD4\u0FD9\u0FDA\u104A-\u104F\u10FB\u1360-\u1368\u1400\u166E\u1680\u169B\u169C\u16EB-\u16ED\u1735\u1736\u17D4-\u17D6\u17D8-\u17DA\u1800-\u180A\u1944\u1945\u1A1E\u1A1F\u1AA0-\u1AA6\u1AA8-\u1AAD\u1B5A-\u1B60\u1BFC-\u1BFF\u1C3B-\u1C3F\u1C7E\u1C7F\u1CC0-\u1CC7\u1CD3\u2000-\u200A\u2010-\u2029\u202F-\u2043\u2045-\u2051\u2053-\u205F\u207D\u207E\u208D\u208E\u2308-\u230B\u2329\u232A\u2768-\u2775\u27C5\u27C6\u27E6-\u27EF\u2983-\u2998\u29D8-\u29DB\u29FC\u29FD\u2CF9-\u2CFC\u2CFE\u2CFF\u2D70\u2E00-\u2E2E\u2E30-\u2E4F\u3000-\u3003\u3008-\u3011\u3014-\u301F\u3030\u303D\u30A0\u30FB\uA4FE\uA4FF\uA60D-\uA60F\uA673\uA67E\uA6F2-\uA6F7\uA874-\uA877\uA8CE\uA8CF\uA8F8-\uA8FA\uA8FC\uA92E\uA92F\uA95F\uA9C1-\uA9CD\uA9DE\uA9DF\uAA5C-\uAA5F\uAADE\uAADF\uAAF0\uAAF1\uABEB\uFD3E\uFD3F\uFE10-\uFE19\uFE30-\uFE52\uFE54-\uFE61\uFE63\uFE68\uFE6A\uFE6B\uFF01-\uFF03\uFF05-\uFF0A\uFF0C-\uFF0F\uFF1A\uFF1B\uFF1F\uFF20\uFF3B-\uFF3D\uFF3F\uFF5B\uFF5D\uFF5F-\uFF65]+/u,S="or",q="and",ct="and_not",lt=(e,t)=>{e.includes(t)||e.push(t)},P=(e,t)=>{for(const s of t)e.includes(s)||e.push(s)},G=({score:e},{score:t})=>t-e,ht=()=>new Map,k=e=>{const t=new Map;for(const s of Object.keys(e))t.set(parseInt(s,10),e[s]);return t},N=(e,t)=>Object.prototype.hasOwnProperty.call(e,t)?e[t]:void 0,dt={[S]:(e,t)=>{for(const s of t.keys()){const n=e.get(s);if(n==null)e.set(s,t.get(s));else{const{score:o,terms:u,match:i}=t.get(s);n.score=n.score+o,n.match=Object.assign(n.match,i),P(n.terms,u)}}return e},[q]:(e,t)=>{const s=new Map;for(const n of t.keys()){const o=e.get(n);if(o==null)continue;const{score:u,terms:i,match:r}=t.get(n);P(o.terms,i),s.set(n,{score:o.score+u,terms:o.terms,match:Object.assign(o.match,r)})}return s},[ct]:(e,t)=>{for(const s of t.keys())e.delete(s);return e}},at=(e,t,s,n,o,u)=>{const{k:i,b:r,d}=u;return Math.log(1+(s-t+.5)/(t+.5))*(d+e*(i+1)/(e+i*(1-r+r*n/o)))},ft=e=>(t,s,n)=>{const o=typeof e.fuzzy=="function"?e.fuzzy(t,s,n):e.fuzzy||!1,u=typeof e.prefix=="function"?e.prefix(t,s,n):e.prefix===!0;return{term:t,fuzzy:o,prefix:u}},H=(e,t,s,n)=>{for(const o of Object.keys(e._fieldIds))if(e._fieldIds[o]===s){e._options.logger("warn",`SlimSearch: document with ID ${e._documentIds.get(t)} has changed before removal: term "${n}" was not present in field "${o}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}},gt=(e,t,s,n)=>{if(!e._index.has(n)){H(e,s,t,n);return}const o=e._index.fetch(n,ht),u=o.get(t);u==null||u.get(s)==null?H(e,s,t,n):u.get(s)<=1?u.size<=1?o.delete(t):u.delete(s):u.set(s,u.get(s)-1),e._index.get(n).size===0&&e._index.delete(n)},mt={k:1.2,b:.7,d:.5},pt={idField:"id",extractField:(e,t)=>e[t],tokenize:e=>e.split(rt),processTerm:e=>e.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(e,t)=>{typeof console?.[e]=="function"&&console[e](t)},autoVacuum:!0},J={combineWith:S,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:mt},Ft={combineWith:q,prefix:(e,t,s)=>t===s.length-1},_t={batchSize:1e3,batchWait:10},U={minDirtFactor:.1,minDirtCount:20},yt={..._t,...U},Y=(e,t=S)=>{if(e.length===0)return new Map;const s=t.toLowerCase();return e.reduce(dt[s])||new Map},B=(e,t,s,n,o,u,i,r,d=new Map)=>{if(o==null)return d;for(const l of Object.keys(u)){const a=u[l],h=e._fieldIds[l],m=o.get(h);if(m==null)continue;let p=m.size;const f=e._avgFieldLength[h];for(const c of m.keys()){if(!e._documentIds.has(c)){gt(e,h,c,s),p-=1;continue}const g=i?i(e._documentIds.get(c),s,e._storedFields.get(c)):1;if(!g)continue;const _=m.get(c),y=e._fieldLength.get(c)[h],b=at(_,p,e._documentCount,y,f,r),z=n*a*g*b,A=d.get(c);if(A){A.score+=z,lt(A.terms,t);const w=N(A.match,s);w?w.push(l):A.match[s]=[l]}else d.set(c,{score:z,terms:[t],match:{[s]:[l]}})}}return d},At=(e,t,s)=>{const n={...e._options.searchOptions,...s},o=(n.fields||e._options.fields).reduce((c,g)=>({...c,[g]:N(n.boost,g)||1}),{}),{boostDocument:u,weights:i,maxFuzzy:r,bm25:d}=n,{fuzzy:l,prefix:a}={...J.weights,...i},h=e._index.get(t.term),m=B(e,t.term,t.term,1,h,o,u,d);let p,f;if(t.prefix&&(p=e._index.atPrefix(t.term)),t.fuzzy){const c=t.fuzzy===!0?.2:t.fuzzy,g=c<1?Math.min(r,Math.round(t.term.length*c)):c;g&&(f=e._index.fuzzyGet(t.term,g))}if(p)for(const[c,g]of p){const _=c.length-t.term.length;if(!_)continue;f?.delete(c);const y=a*c.length/(c.length+.3*_);B(e,t.term,c,y,g,o,u,d,m)}if(f)for(const c of f.keys()){const[g,_]=f.get(c);if(!_)continue;const y=l*c.length/(c.length+_);B(e,t.term,c,y,g,o,u,d,m)}return m},X=(e,t,s={})=>{if(typeof t!="string"){const a={...s,...t,queries:void 0},h=t.queries.map(m=>X(e,m,a));return Y(h,a.combineWith)}const{tokenize:n,processTerm:o,searchOptions:u}=e._options,i={tokenize:n,processTerm:o,...u,...s},{tokenize:r,processTerm:d}=i,l=r(t).flatMap(a=>d(a)).filter(a=>!!a).map(ft(i)).map(a=>At(e,a,i));return Y(l,i.combineWith)},K=(e,t,s={})=>{const n=X(e,t,s),o=[];for(const[u,{score:i,terms:r,match:d}]of n){const l=r.length,a={id:e._documentIds.get(u),score:i*l,terms:Object.keys(d),match:d};Object.assign(a,e._storedFields.get(u)),(s.filter==null||s.filter(a))&&o.push(a)}return o.sort(G),o},Ct=(e,t,s={})=>{s={...e._options.autoSuggestOptions,...s};const n=new Map;for(const{score:u,terms:i}of K(e,t,s)){const r=i.join(" "),d=n.get(r);d!=null?(d.score+=u,d.count+=1):n.set(r,{score:u,terms:i,count:1})}const o=[];for(const[u,{score:i,terms:r,count:d}]of n)o.push({suggestion:u,terms:r,score:i/d});return o.sort(G),o};class Et{_options;_index;_documentCount;_documentIds;_idToShortId;_fieldIds;_fieldLength;_avgFieldLength;_nextId;_storedFields;_dirtCount;_currentVacuum;_enqueuedVacuum;_enqueuedVacuumConditions;constructor(t){if(t?.fields==null)throw new Error('SlimSearch: option "fields" must be provided');const s=t.autoVacuum==null||t.autoVacuum===!0?yt:t.autoVacuum;this._options={...pt,...t,autoVacuum:s,searchOptions:{...J,...t.searchOptions||{}},autoSuggestOptions:{...Ft,...t.autoSuggestOptions||{}}},this._index=new C,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=U,this.addFields(this._options.fields)}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}get documentCount(){return this._documentCount}get termCount(){return this._index.size}toJSON(){const t=[];for(const[s,n]of this._index){const o={};for(const[u,i]of n)o[u]=Object.fromEntries(i);t.push([s,o])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:t,serializationVersion:2}}addFields(t){for(let s=0;s{if(l!==1&&l!==2)throw new Error("SlimSearch: cannot deserialize an index created with an incompatible version");const h=new Et(a);h._documentCount=t,h._nextId=s,h._documentIds=k(n),h._idToShortId=new Map,h._fieldIds=o,h._fieldLength=k(u),h._avgFieldLength=i,h._storedFields=k(r),h._dirtCount=d||0,h._index=new C;for(const[m,p]of h._documentIds)h._idToShortId.set(p,m);for(const[m,p]of e){const f=new Map;for(const c of Object.keys(p)){let g=p[c];l===1&&(g=g.ds),f.set(parseInt(c,10),k(g))}h._index.set(m,f)}return h},Q=Object.entries,wt=Object.fromEntries,j=(e,t)=>{const s=e.toLowerCase(),n=t.toLowerCase(),o=[];let u=0,i=0;const r=(l,a=!1)=>{let h="";i===0?h=l.length>20?`… ${l.slice(-20)}`:l:a?h=l.length+i>100?`${l.slice(0,100-i)}… `:l:h=l.length>20?`${l.slice(0,20)} … ${l.slice(-20)}`:l,h&&o.push(h),i+=h.length,a||(o.push(["mark",t]),i+=t.length,i>=100&&o.push(" …"))};let d=s.indexOf(n,u);if(d===-1)return null;for(;d>=0;){const l=d+n.length;if(r(e.slice(u,d)),u=l,i>100)break;d=s.indexOf(n,u)}return i<100&&r(e.slice(u),!0),o},Z=/[\u4e00-\u9fa5]/g,tt=(e={})=>({fuzzy:.2,prefix:!0,processTerm:t=>{const s=t.match(Z)||[],n=t.replace(Z,"").toLowerCase();return n?[n,...s]:[...s]},...e}),xt=(e,t)=>t.contents.reduce((s,[,n])=>s+n,0)-e.contents.reduce((s,[,n])=>s+n,0),kt=(e,t)=>Math.max(...t.contents.map(([,s])=>s))-Math.max(...e.contents.map(([,s])=>s)),et=(e,t,s={})=>{const n={};return K(t,e,tt({boost:{h:2,t:1,c:4},...s})).forEach(o=>{const{id:u,terms:i,score:r}=o,d=u.includes("@"),l=u.includes("#"),[a,h]=u.split(/[#@]/),m=i.sort((f,c)=>f.length-c.length).filter((f,c)=>i.slice(c+1).every(g=>!g.includes(f))),{contents:p}=n[a]??={title:"",contents:[]};if(d)p.push([{type:"customField",key:a,index:h,display:m.map(f=>o.c.map(c=>j(c,f))).flat().filter(f=>f!==null)},r]);else{const f=m.map(c=>j(o.h,c)).filter(c=>c!==null);if(f.length&&p.push([{type:l?"heading":"title",key:a,...l&&{anchor:h},display:f},r]),"t"in o)for(const c of o.t){const g=m.map(_=>j(c,_)).filter(_=>_!==null);g.length&&p.push([{type:"text",key:a,...l&&{anchor:h},display:g},r])}}}),Q(n).sort(([,o],[,u])=>"max"==="total"?xt(o,u):kt(o,u)).map(([o,{title:u,contents:i}])=>{if(!u){const r=it(t,o);r&&(u=r.h)}return{title:u,contents:i.map(([r])=>r)}})},st=(e,t,s={})=>Ct(t,e,tt(s)).map(({suggestion:n})=>n),v=wt(Q(JSON.parse("{\"/\":{\"documentCount\":1016,\"nextId\":1016,\"documentIds\":{\"0\":\"v-3f9d0d55\",\"1\":\"v-3f9d0d55#仪式清单\",\"2\":\"v-3f9d0d55#_5am-club\",\"3\":\"v-3f9d0d55#每日\",\"4\":\"v-3f9d0d55#定期\",\"5\":\"v-3f9d0d55#自我监控\",\"6\":\"v-3f9d0d55#时间管理\",\"7\":\"v-3f9d0d55#日常习惯\",\"8\":\"v-3f9d0d55#美容仪器\",\"9\":\"v-3d0aa58a\",\"10\":\"v-3d0aa58a#k-歌减肥\",\"11\":\"v-3d0aa58a#坐立减肥\",\"12\":\"v-3d0aa58a#健身理论\",\"13\":\"v-3d0aa58a#每周健身-4-小时\",\"14\":\"v-3d0aa58a#室内健身\",\"15\":\"v-3d0aa58a#slim-in-6\",\"16\":\"v-3d0aa58a#p90\",\"17\":\"v-3d0aa58a#les-mills-bodycombat\",\"18\":\"v-3d0aa58a#t25\",\"19\":\"v-3d0aa58a#p90x-和-insanity\",\"20\":\"v-8daa1a0e\",\"21\":\"v-8daa1a0e#✨-初衷\",\"22\":\"v-8daa1a0e#🧱-笔记结构\",\"23\":\"v-8daa1a0e#🍥-搭建-learnhubs\",\"24\":\"v-8daa1a0e#🔣-配置-learnhubs\",\"25\":\"v-8daa1a0e#文档结构\",\"26\":\"v-8daa1a0e#看板娘\",\"27\":\"v-8daa1a0e#读书笔记\",\"28\":\"v-8daa1a0e#本地图片引用\",\"29\":\"v-8daa1a0e#🖥️-网站部署\",\"30\":\"v-8daa1a0e#同步到服务器\",\"31\":\"v-8daa1a0e#部署到-vercel\",\"32\":\"v-8daa1a0e#🤔-常见问题\",\"33\":\"v-8daa1a0e#网页显示异常\",\"34\":\"v-8daa1a0e#同步服务器报错\",\"35\":\"v-8daa1a0e#err-module\",\"36\":\"v-8daa1a0e#静态文件名字总变\",\"37\":\"v-8daa1a0e#本地运行-learnhubs\",\"38\":\"v-184f4da6\",\"39\":\"v-26a023fe\",\"40\":\"v-26a023fe#微信-for-windows-安装\",\"41\":\"v-26a023fe#开机启动两个微信\",\"42\":\"v-26a023fe#其他方法\",\"43\":\"v-6222deab\",\"44\":\"v-6222deab#_1-进入网页\",\"45\":\"v-6222deab#_2-选定-rss-网页\",\"46\":\"v-6222deab#_3-定制-rss-抓取规则\",\"47\":\"v-6222deab#_4-整理-rss-输入格式\",\"48\":\"v-6222deab#_5-获取-rss-地址\",\"49\":\"v-6222deab#_6-全文抓取\",\"50\":\"v-6222deab#rss-合集\",\"51\":\"v-009a3fd6\",\"52\":\"v-009a3fd6#解决方法\",\"53\":\"v-0d41d5d0\",\"54\":\"v-c914fd10\",\"55\":\"v-c914fd10#手工操作\",\"56\":\"v-c914fd10#通过脚本修改\",\"57\":\"v-c914fd10#注册表脚本修改\",\"58\":\"v-c914fd10#cmd-修改\",\"59\":\"v-c914fd10#powershell-修改\",\"60\":\"v-4576f198\",\"61\":\"v-e6f7cb8e\",\"62\":\"v-e6f7cb8e#为什么要获得光猫超级密码\",\"63\":\"v-e6f7cb8e#破解测试环境\",\"64\":\"v-e6f7cb8e#光猫超级密码破解\",\"65\":\"v-5da24c3c\",\"66\":\"v-28c3d540\",\"67\":\"v-b3818c3c\",\"68\":\"v-579c385c\",\"69\":\"v-579c385c#宝塔安装-lnmp-或-lamp-环境\",\"70\":\"v-06691c4f\",\"71\":\"v-06691c4f#搭建流程\",\"72\":\"v-24d2d83a\",\"73\":\"v-adf0c772\",\"74\":\"v-adf0c772#搭建思路\",\"75\":\"v-adf0c772#travis-ci-基本配置\",\"76\":\"v-adf0c772#静态文件更新\",\"77\":\"v-adf0c772#dockerfiles-设置\",\"78\":\"v-adf0c772#docker-镜像设置\",\"79\":\"v-adf0c772#docker-扩展阅读\",\"80\":\"v-adf0c772#ssh-免密码登录\",\"81\":\"v-adf0c772#travis-yml-配置\",\"82\":\"v-730defc4\",\"83\":\"v-730defc4#简易剪切流程\",\"84\":\"v-1f0840b1\",\"85\":\"v-1f0840b1#为什么选择-aria2\",\"86\":\"v-1f0840b1#真·懒人包\",\"87\":\"v-1f0840b1#aria2-设置\",\"88\":\"v-1f0840b1#aria2-进阶\",\"89\":\"v-1f0840b1#更换-aria2-界面\",\"90\":\"v-1f0840b1#aira2-下载预热\",\"91\":\"v-1f0840b1#接管浏览器下载\",\"92\":\"v-1f0840b1#aria2-启动器\",\"93\":\"v-5ae43900\",\"94\":\"v-5ae43900#建立空白-airtable\",\"95\":\"v-5ae43900#应用-airtable\",\"96\":\"v-5ae43900#airtable-变形记\",\"97\":\"v-5ae43900#form-view-表单视图\",\"98\":\"v-5ae43900#calendar-view-日期视图\",\"99\":\"v-5ae43900#gallery-view-卡片视图\",\"100\":\"v-5ae43900#kanban-view-看板视图\",\"101\":\"v-a3025528\",\"102\":\"v-a3025528#电信「网络管家」功能\",\"103\":\"v-a3025528#开启光猫端口映射、内网穿透\",\"104\":\"v-5ad6240c\",\"105\":\"v-77515ff2\",\"106\":\"v-77515ff2#提取直播源列表\",\"107\":\"v-77515ff2#电视盒子直播\",\"108\":\"v-77515ff2#pc-端电视直播\",\"109\":\"v-73041b3a\",\"110\":\"v-73041b3a#huginn-准备工作\",\"111\":\"v-73041b3a#phantomjs-网页抓取\",\"112\":\"v-73041b3a#页面缓存\",\"113\":\"v-73041b3a#解析网页内容\",\"114\":\"v-73041b3a#获取内容路径\",\"115\":\"v-73041b3a#导出-rss\",\"116\":\"v-73041b3a#rss-合集\",\"117\":\"v-1004794e\",\"118\":\"v-1004794e#讯飞-小麦克风\",\"119\":\"v-1004794e#讯飞-blue-yeti\",\"120\":\"v-1004794e#外置声卡-动圈话筒\",\"121\":\"v-1004794e#输入法之争\",\"122\":\"v-1004794e#最终方案-微软语音输入\",\"123\":\"v-1004794e#总结与展望\",\"124\":\"v-7463267c\",\"125\":\"v-7463267c#内网穿透\",\"126\":\"v-7463267c#openvpn-配置\",\"127\":\"v-302b03de\",\"128\":\"v-302b03de#bilibili-番剧抓取示例\",\"129\":\"v-302b03de#rss-合集\",\"130\":\"v-346c34d4\",\"131\":\"v-346c34d4#有线投屏\",\"132\":\"v-346c34d4#无线投屏\",\"133\":\"v-346c34d4#屏幕录制\",\"134\":\"v-346c34d4#常见问题\",\"135\":\"v-346c34d4#错误检查\",\"136\":\"v-346c34d4#could-not-find-any-adb-device\",\"137\":\"v-346c34d4#error-exception-on-thread\",\"138\":\"v-346c34d4#小米投屏设置\",\"139\":\"v-346c34d4#华为投屏断开\",\"140\":\"v-346c34d4#投屏没声音\",\"141\":\"v-346c34d4#输入法问题\",\"142\":\"v-346c34d4#投屏模糊\",\"143\":\"v-d8439540\",\"144\":\"v-d8439540#部署步骤\",\"145\":\"v-d8439540#使用步骤\",\"146\":\"v-d8439540#rsshub-vs-huginn\",\"147\":\"v-d8439540#rss-合集\",\"148\":\"v-273cf11f\",\"149\":\"v-273cf11f#无线模式\",\"150\":\"v-273cf11f#频道带宽\",\"151\":\"v-273cf11f#调整信道\",\"152\":\"v-18a7959b\",\"153\":\"v-491d5d68\",\"154\":\"v-491d5d68#基础设置\",\"155\":\"v-491d5d68#扩充词库\",\"156\":\"v-491d5d68#双拼方案\",\"157\":\"v-491d5d68#进阶指南\",\"158\":\"v-491d5d68#常见问题\",\"159\":\"v-491d5d68#开机后不能输出中文\",\"160\":\"v-491d5d68#输入法报错\",\"161\":\"v-491d5d68#切换输入法状态\",\"162\":\"v-491d5d68#输入法候选框闪烁\",\"163\":\"v-491d5d68#删除错误「上屏」的词\",\"164\":\"v-491d5d68#符号直接上屏\",\"165\":\"v-491d5d68#指定程序中默认输入法\",\"166\":\"v-491d5d68#不能输出-emoji\",\"167\":\"v-491d5d68#无法触发词库的特殊符号\",\"168\":\"v-0418b0dc\",\"169\":\"v-0418b0dc#keepass-设置\",\"170\":\"v-0418b0dc#选项设置\",\"171\":\"v-0418b0dc#自动输入规则\",\"172\":\"v-0418b0dc#匹配多个网址\",\"173\":\"v-0418b0dc#必备插件\",\"174\":\"v-0418b0dc#keepasshttp\",\"175\":\"v-0418b0dc#kpenhancedentryview\",\"176\":\"v-0418b0dc#autotypesearch\",\"177\":\"v-0418b0dc#kp-entry-templates\",\"178\":\"v-0418b0dc#kpsourceforgeupdatechecker\",\"179\":\"v-0418b0dc#可选插件\",\"180\":\"v-0418b0dc#early-update-check\",\"181\":\"v-0418b0dc#keetraytotp\",\"182\":\"v-0418b0dc#webautotype\",\"183\":\"v-0418b0dc#yet-another-favicon-downloader\",\"184\":\"v-0418b0dc#hibp-offline-check\",\"185\":\"v-0418b0dc#keepassrpc\",\"186\":\"v-0418b0dc#keepassnatmsg\",\"187\":\"v-0418b0dc#常见问题\",\"188\":\"v-0418b0dc#多账户排序\",\"189\":\"v-0418b0dc#为什么不选-keepassxc\",\"190\":\"v-0418b0dc#keepass-懒人包\",\"191\":\"v-63fefb94\",\"192\":\"v-63fefb94#迁移步骤\",\"193\":\"v-0a6bc026\",\"194\":\"v-0a6bc026#理论支撑\",\"195\":\"v-0a6bc026#实事求是地制订方案\",\"196\":\"v-0a6bc026#头脑透明地分享想法\",\"197\":\"v-0a6bc026#批评和自我批评\",\"198\":\"v-0a6bc026#行动计划\",\"199\":\"v-5a064ff2\",\"200\":\"v-5a064ff2#事前准备\",\"201\":\"v-5a064ff2#docker-镜像安装\",\"202\":\"v-5a064ff2#域名绑定\",\"203\":\"v-5a064ff2#rss-转码\",\"204\":\"v-5a064ff2#总结\",\"205\":\"v-5a064ff2#rss-合集\",\"206\":\"v-39faf312\",\"207\":\"v-39faf312#封面平台注册\",\"208\":\"v-39faf312#红包封面设计\",\"209\":\"v-39faf312#常见问题\",\"210\":\"v-39faf312#封面名称\",\"211\":\"v-39faf312#红包审核\",\"212\":\"v-39faf312#红包图片\",\"213\":\"v-313c5888\",\"214\":\"v-313c5888#解决方法\",\"215\":\"v-313c5888#其他尝试\",\"216\":\"v-313c5888#解决流程-gif\",\"217\":\"v-61d0df0c\",\"218\":\"v-61d0df0c#每日热点\",\"219\":\"v-61d0df0c#互联网资讯\",\"220\":\"v-61d0df0c#奇思妙想\",\"221\":\"v-61d0df0c#教程-自制-rss\",\"222\":\"v-df55a79e\",\"223\":\"v-df55a79e#原生程序管理-winget\",\"224\":\"v-df55a79e#winget-install-appname\",\"225\":\"v-df55a79e#winget-search-appname\",\"226\":\"v-df55a79e#winget-upgrade-all\",\"227\":\"v-df55a79e#microsoft-store-应用\",\"228\":\"v-df55a79e#批量部署程序-winstall\",\"229\":\"v-df55a79e#常见问题\",\"230\":\"v-df55a79e#尝试更新源时失败\",\"231\":\"v-df55a79e#其他问题\",\"232\":\"v-df55a79e#总结\",\"233\":\"v-24bf700c\",\"234\":\"v-24bf700c#安装-ui-vision\",\"235\":\"v-24bf700c#零门槛入门\",\"236\":\"v-24bf700c#第一次使用\",\"237\":\"v-24bf700c#不同变量重复运行\",\"238\":\"v-24bf700c#常见问题\",\"239\":\"v-24bf700c#录制脚本无法使用\",\"240\":\"v-24bf700c#浏览器外使用-rpa\",\"241\":\"v-24bf700c#本地运行自动化报错\",\"242\":\"v-24bf700c#总结\",\"243\":\"v-9029f640\",\"244\":\"v-9029f640#博客探索\",\"245\":\"v-9029f640#博客方案\",\"246\":\"v-9029f640#wp-发布工具\",\"247\":\"v-9029f640#工具说明\",\"248\":\"v-9029f640#使用流程\",\"249\":\"v-9029f640#wp-发布常见问题\",\"250\":\"v-9029f640#文章发布不成功\",\"251\":\"v-9029f640#error-git-denied-to-github-actions-bot\",\"252\":\"v-9029f640#error-process-completed-with-exit-code-1\",\"253\":\"v-9029f640#无法覆盖更新原文章-​\",\"254\":\"v-9029f640#wordpress-发布时间与实际不符-​\",\"255\":\"v-9029f640#有序列表编号有误\",\"256\":\"v-9029f640#无序列表只有一个层级\",\"257\":\"v-9029f640#本地管理-markdown-文章\",\"258\":\"v-9029f640#飞书文档管理\",\"259\":\"v-9029f640#runany-文档直达-​\",\"260\":\"v-9029f640#docsify-全文检索\",\"261\":\"v-9029f640#订阅管理-wordpress\",\"262\":\"v-9029f640#后续\",\"263\":\"v-6eacd3db\",\"264\":\"v-6eacd3db#为什么用网页管理笔记\",\"265\":\"v-6eacd3db#公开想法\",\"266\":\"v-6eacd3db#输出分享\",\"267\":\"v-6eacd3db#被动消化知识\",\"268\":\"v-6eacd3db#漂亮决定生产力\",\"269\":\"v-6eacd3db#为什么不用-obsidian\",\"270\":\"v-6eacd3db#抛弃知识软件-不用\",\"271\":\"v-6eacd3db#如果你也想试试\",\"272\":\"v-6eacd3db#最后\",\"273\":\"v-69739db8\",\"274\":\"v-69739db8#为什么-ffmpeg\",\"275\":\"v-69739db8#录屏准备\",\"276\":\"v-69739db8#配置-ffmpeg\",\"277\":\"v-69739db8#配置视频-音频设备\",\"278\":\"v-69739db8#录制屏幕\",\"279\":\"v-69739db8#录制摄像头\",\"280\":\"v-69739db8#输出视频-画中画\",\"281\":\"v-69739db8#常见问题\",\"282\":\"v-69739db8#could-not-set-video-options\",\"283\":\"v-69739db8#real-time-buffer\",\"284\":\"v-69739db8#摄像头分辨率错误\",\"285\":\"v-69739db8#录制画面偏移\",\"286\":\"v-69739db8#脚本启动报错\",\"287\":\"v-69739db8#后续\",\"288\":\"v-333dd8ee\",\"289\":\"v-333dd8ee#为什么是白板\",\"290\":\"v-333dd8ee#白板类型\",\"291\":\"v-333dd8ee#我的方案\",\"292\":\"v-333dd8ee#书房白板\",\"293\":\"v-333dd8ee#走廊白板\",\"294\":\"v-333dd8ee#电子记录\",\"295\":\"v-333dd8ee#更多\",\"296\":\"v-5e3d84de\",\"297\":\"v-5e3d84de#虚拟定位\",\"298\":\"v-5e3d84de#常见问题\",\"299\":\"v-5e3d84de#无法虚拟定位\",\"300\":\"v-5e3d84de#手机修改定位\",\"301\":\"v-5e3d84de#关于虚拟签到\",\"302\":\"v-72653828\",\"303\":\"v-e381b74e\",\"304\":\"v-e381b74e#更新注入器\",\"305\":\"v-e381b74e#大气层-主机升级\",\"306\":\"v-e381b74e#固件准备\",\"307\":\"v-e381b74e#升级流程\",\"308\":\"v-e381b74e#进入大气层系统\",\"309\":\"v-e381b74e#安装游戏\",\"310\":\"v-e381b74e#dbi\",\"311\":\"v-e381b74e#ns-usbloader\",\"312\":\"v-e381b74e#游戏资源\",\"313\":\"v-b90f383c\",\"314\":\"v-b90f383c#介绍\",\"315\":\"v-b90f383c#步骤一-注册账号\",\"316\":\"v-b90f383c#步骤二-激活账号\",\"317\":\"v-b90f383c#步骤三-申请新域名\",\"318\":\"v-b90f383c#步骤四-设置域名服务器-以dnspod为例\",\"319\":\"v-22230056\",\"320\":\"v-22230056#模型下载\",\"321\":\"v-22230056#网址-stable-video-diffusion-img2vid\",\"322\":\"v-22230056#comfy-ui地址\",\"323\":\"v-22230056#下载安装comfyui-manager\",\"324\":\"v-22230056#comfyui-manager界面地址\",\"325\":\"v-22230056#nvidia用户应使用以下命令安装pytorch\",\"326\":\"v-22230056#故障排除\",\"327\":\"v-22230056#依赖安装\",\"328\":\"v-22230056#工作流程json文件下载\",\"329\":\"v-22230056#电脑桌面创建可直接运行的bat文件\",\"330\":\"v-af1fbe54\",\"331\":\"v-af1fbe54#分析\",\"332\":\"v-af1fbe54#自动化\",\"333\":\"v-af1fbe54#博客平台\",\"334\":\"v-af1fbe54#书签-链接共享\",\"335\":\"v-af1fbe54#日历和地址薄\",\"336\":\"v-af1fbe54#通讯系统\",\"337\":\"v-af1fbe54#定制\",\"338\":\"v-af1fbe54#email\",\"339\":\"v-af1fbe54#完整方案\",\"340\":\"v-af1fbe54#邮件传输代理\",\"341\":\"v-af1fbe54#邮件发送代理\",\"342\":\"v-af1fbe54#邮件列表和时讯\",\"343\":\"v-af1fbe54#webmail-客户端\",\"344\":\"v-af1fbe54#irc\",\"345\":\"v-af1fbe54#sip\",\"346\":\"v-af1fbe54#ipbx\",\"347\":\"v-af1fbe54#社交网络与论坛\",\"348\":\"v-af1fbe54#xmpp\",\"349\":\"v-af1fbe54#xmpp-服务器\",\"350\":\"v-af1fbe54#xmpp-web-客户端\",\"351\":\"v-af1fbe54#内容管理系统-cms\",\"352\":\"v-af1fbe54#电子商务\",\"353\":\"v-af1fbe54#dns\",\"354\":\"v-af1fbe54#文档归档\",\"355\":\"v-af1fbe54#企业资源规划-erp\",\"356\":\"v-af1fbe54#联合身份-认证\",\"357\":\"v-af1fbe54#feed-阅读器\",\"358\":\"v-af1fbe54#文件共享和同步\",\"359\":\"v-af1fbe54#分布式文件系统\",\"360\":\"v-af1fbe54#文件传输-同步\",\"361\":\"v-af1fbe54#点对点文件共享\",\"362\":\"v-af1fbe54#单击-拖放上传\",\"363\":\"v-af1fbe54#基于-web-的文件管理\",\"364\":\"v-af1fbe54#游戏\",\"365\":\"v-af1fbe54#网关\",\"366\":\"v-af1fbe54#groupware-群件\",\"367\":\"v-af1fbe54#学习和课程\",\"368\":\"v-af1fbe54#地图-gps\",\"369\":\"v-af1fbe54#媒体流\",\"370\":\"v-af1fbe54#语音流\",\"371\":\"v-af1fbe54#视频流\",\"372\":\"v-af1fbe54#杂项-其它\",\"373\":\"v-af1fbe54#资金、预算和管理\",\"374\":\"v-af1fbe54#监测\",\"375\":\"v-af1fbe54#笔记-编辑器\",\"376\":\"v-af1fbe54#办公套件\",\"377\":\"v-af1fbe54#密码管理\",\"378\":\"v-af1fbe54#pastebins\",\"379\":\"v-af1fbe54#个人仪表盘\",\"380\":\"v-af1fbe54#照片和视频库\",\"381\":\"v-af1fbe54#投票与事件\",\"382\":\"v-af1fbe54#代理\",\"383\":\"v-af1fbe54#稍后阅读列表\",\"384\":\"v-af1fbe54#搜索引擎\",\"385\":\"v-af1fbe54#软件开发\",\"386\":\"v-af1fbe54#项目管理\",\"387\":\"v-af1fbe54#bug-跟踪\",\"388\":\"v-af1fbe54#ide-工具\",\"389\":\"v-af1fbe54#持续集成\",\"390\":\"v-af1fbe54#文档生成器\",\"391\":\"v-af1fbe54#静态网站生成器\",\"392\":\"v-af1fbe54#任务管理-to-do-列表\",\"393\":\"v-af1fbe54#ticketing\",\"394\":\"v-af1fbe54#短-url\",\"395\":\"v-af1fbe54#vpn\",\"396\":\"v-af1fbe54#web-服务器\",\"397\":\"v-af1fbe54#wikis\",\"398\":\"v-af1fbe54#自托管解决方案\",\"399\":\"v-af1fbe54#许可列表\",\"400\":\"v-af1fbe54#外链\",\"401\":\"v-af1fbe54#贡献\",\"402\":\"v-af1fbe54#作者\",\"403\":\"v-af1fbe54#许可\",\"404\":\"v-0d25d1e4\",\"405\":\"v-0d25d1e4#gpt快速使用\",\"406\":\"v-0d25d1e4#万能it工具\",\"407\":\"v-0d25d1e4#博客资源\",\"408\":\"v-0d25d1e4#每日热棒\",\"409\":\"v-0d25d1e4#音乐欣赏\",\"410\":\"v-0d25d1e4#互动社区\",\"411\":\"v-0d25d1e4#结论\",\"412\":\"v-7b101d14\",\"413\":\"v-7b101d14#公司介绍\",\"414\":\"v-7b101d14#产品能力与目前模型\",\"415\":\"v-7b101d14#功能与意义影响\",\"416\":\"v-7b101d14#如何使用\",\"417\":\"v-2c379a13\",\"418\":\"v-2c379a13#midjourney的技术基础\",\"419\":\"v-2c379a13#文字生成图片\",\"420\":\"v-2c379a13#图片生成图片\",\"421\":\"v-2c379a13#混合图片生成图片\",\"422\":\"v-2c379a13#midjourney的用户群体\",\"423\":\"v-2c379a13#结语\",\"424\":\"v-69693975\",\"425\":\"v-69693975#小工具\",\"426\":\"v-69693975#power-automate\",\"427\":\"v-69693975#使用技巧\",\"428\":\"v-69693975#报错重置\",\"429\":\"v-69693975#创建-microsoft-组织账户\",\"430\":\"v-69693975#管理组织用户\",\"431\":\"v-69693975#阿里云盘\",\"432\":\"v-69693975#双链笔记\",\"433\":\"v-69693975#logseq\",\"434\":\"v-69693975#快速使用\",\"435\":\"v-69693975#query\",\"436\":\"v-69693975#obisidian\",\"437\":\"v-69693975#dataview\",\"438\":\"v-69693975#obsidian-query-language\",\"439\":\"v-69693975#easy-typing\",\"440\":\"v-69693975#flomo\",\"441\":\"v-69693975#thebrain\",\"442\":\"v-69693975#zinc\",\"443\":\"v-69693975#zinc-初次启动\",\"444\":\"v-69693975#全文索引-bluge\",\"445\":\"v-1735a0be\",\"446\":\"v-1735a0be#知识记录\",\"447\":\"v-1735a0be#平面设计\",\"448\":\"v-1735a0be#音频视频\",\"449\":\"v-1735a0be#屏幕录制\",\"450\":\"v-1735a0be#效率工具\",\"451\":\"v-1735a0be#文档管理\",\"452\":\"v-1735a0be#系统日常\",\"453\":\"v-1735a0be#低频工具\",\"454\":\"v-1735a0be#开源工具\",\"455\":\"v-1735a0be#android\",\"456\":\"v-1735a0be#已弃\",\"457\":\"v-d967ed6c\",\"458\":\"v-d967ed6c#chatgpt-客户端\",\"459\":\"v-d967ed6c#chatgpt-tips\",\"460\":\"v-d967ed6c#learn-prompting\",\"461\":\"v-d967ed6c#文字\",\"462\":\"v-d967ed6c#写作\",\"463\":\"v-d967ed6c#点评-评鉴\",\"464\":\"v-d967ed6c#写作辅助\",\"465\":\"v-d967ed6c#生活\",\"466\":\"v-d967ed6c#趣味知识\",\"467\":\"v-d967ed6c#生活护理\",\"468\":\"v-d967ed6c#自我提升\",\"469\":\"v-d967ed6c#辩论-演讲\",\"470\":\"v-d967ed6c#心理-社交\",\"471\":\"v-d967ed6c#哲学\",\"472\":\"v-d967ed6c#老师-学术\",\"473\":\"v-d967ed6c#it-编程\",\"474\":\"v-d967ed6c#程序员\",\"475\":\"v-d967ed6c#编程工具\",\"476\":\"v-d967ed6c#终端-解释器\",\"477\":\"v-d967ed6c#工具\",\"478\":\"v-d967ed6c#ai-prompt\",\"479\":\"v-d967ed6c#语言-翻译\",\"480\":\"v-d967ed6c#游戏\",\"481\":\"v-d967ed6c#导览\",\"482\":\"v-d967ed6c#其他工具\",\"483\":\"v-d967ed6c#行业顾问\",\"484\":\"v-d967ed6c#企业\",\"485\":\"v-d967ed6c#医疗\",\"486\":\"v-d967ed6c#金融\",\"487\":\"v-d967ed6c#音乐\",\"488\":\"v-d967ed6c#其他\",\"489\":\"v-5c29014a\",\"490\":\"v-5c29014a#浏览器\",\"491\":\"v-5c29014a#标签页\",\"492\":\"v-5c29014a#链接批量\",\"493\":\"v-5c29014a#图片视频\",\"494\":\"v-5c29014a#监视爬虫\",\"495\":\"v-5c29014a#网页优化\",\"496\":\"v-5c29014a#实用工具\",\"497\":\"v-1d7dd2b7\",\"498\":\"v-1d7dd2b7#电子白板\",\"499\":\"v-1d7dd2b7#excalidraw\",\"500\":\"v-1d7dd2b7#canvas\",\"501\":\"v-1d7dd2b7#获取页面-logo\",\"502\":\"v-1d7dd2b7#eagle\",\"503\":\"v-1d7dd2b7#字体\",\"504\":\"v-abe04fa2\",\"505\":\"v-abe04fa2#常用方法\",\"506\":\"v-abe04fa2#托盘图标\",\"507\":\"v-abe04fa2#执行-powershell\",\"508\":\"v-abe04fa2#问题\",\"509\":\"v-abe04fa2#激发热键后按键未释放\",\"510\":\"v-abe04fa2#隐藏在托盘程序无法监测\",\"511\":\"v-abe04fa2#命令中的按键未执行\",\"512\":\"v-abe04fa2#管理员权限运行脚本\",\"513\":\"v-abe04fa2#常用函数\",\"514\":\"v-abe04fa2#命令-run-msgbox-send\",\"515\":\"v-abe04fa2#局部变量-ifwinactive\",\"516\":\"v-abe04fa2#热键、热字串\",\"517\":\"v-abe04fa2#热键-按键-1-按键-2\",\"518\":\"v-abe04fa2#热字串-被替换内容-替换内容\",\"519\":\"v-abe04fa2#ahk-使用样例\",\"520\":\"v-abe04fa2#神速激活-打开-隐藏程序\",\"521\":\"v-abe04fa2#一键运行-关闭脚本的循环\",\"522\":\"v-abe04fa2#监测进程是否运行\",\"523\":\"v-abe04fa2#输入法状态影响字符输出\",\"524\":\"v-abe04fa2#大写键改为-enter\",\"525\":\"v-fae223a4\",\"526\":\"v-fae223a4#使用问题\",\"527\":\"v-fae223a4#nsis-配置\",\"528\":\"v-fae223a4#打包报错\",\"529\":\"v-fae223a4#跨系统打包\",\"530\":\"v-67fe64b6\",\"531\":\"v-67fe64b6#基础知识\",\"532\":\"v-67fe64b6#相对路径\",\"533\":\"v-67fe64b6#反义、转义字符\",\"534\":\"v-67fe64b6#javascript-插件\",\"535\":\"v-67fe64b6#功能加强\",\"536\":\"v-67fe64b6#小游戏代码\",\"537\":\"v-67fe64b6#css-样式\",\"538\":\"v-67fe64b6#图片\",\"539\":\"v-67fe64b6#纯色背景\",\"540\":\"v-67fe64b6#鼠标经过变色\",\"541\":\"v-67fe64b6#隐藏元素\",\"542\":\"v-67fe64b6#高亮\",\"543\":\"v-67fe64b6#页面布局\",\"544\":\"v-67fe64b6#自适应布局\",\"545\":\"v-67fe64b6#客户端自适应\",\"546\":\"v-67fe64b6#本地压缩-html\",\"547\":\"v-72cba7c3\",\"548\":\"v-72cba7c3#es6\",\"549\":\"v-72cba7c3#数据结构\",\"550\":\"v-72cba7c3#常用函数\",\"551\":\"v-72cba7c3#javascript-对象\",\"552\":\"v-72cba7c3#全局变量\",\"553\":\"v-72cba7c3#变量类型\",\"554\":\"v-72cba7c3#运算符\",\"555\":\"v-72cba7c3#javascript-应用\",\"556\":\"v-72cba7c3#取随机值\",\"557\":\"v-72cba7c3#文本框清空\",\"558\":\"v-72cba7c3#内部文件读取\",\"559\":\"v-72cba7c3#选择框状态\",\"560\":\"v-72cba7c3#复制隐藏内容\",\"561\":\"v-72cba7c3#引入-html-页面\",\"562\":\"v-72cba7c3#视频全屏弹窗\",\"563\":\"v-0195f17e\",\"564\":\"v-0195f17e#图片尺寸\",\"565\":\"v-0195f17e#资料引用\",\"566\":\"v-0195f17e#代码块自动换行\",\"567\":\"v-0195f17e#整段删除线\",\"568\":\"v-2caa5134\",\"569\":\"v-2caa5134#入门文档\",\"570\":\"v-2caa5134#简单示例\",\"571\":\"v-2caa5134#基础语法\",\"572\":\"v-2caa5134#序列类型\",\"573\":\"v-2caa5134#字符串用法\",\"574\":\"v-2caa5134#运算符\",\"575\":\"v-2caa5134#条件三元表达式\",\"576\":\"v-2caa5134#条件循环\",\"577\":\"v-2caa5134#range-函数\",\"578\":\"v-2caa5134#向列表添加元素\",\"579\":\"v-2caa5134#列表切片\",\"580\":\"v-2caa5134#列表解析\",\"581\":\"v-2caa5134#变量\",\"582\":\"v-146a1089\",\"583\":\"v-146a1089#visual-studio-code\",\"584\":\"v-146a1089#修改快捷键\",\"585\":\"v-146a1089#排除文件夹\",\"586\":\"v-146a1089#在线-ide\",\"587\":\"v-49ecfa5b\",\"588\":\"v-49ecfa5b#实用表达式\",\"589\":\"v-49ecfa5b#前后匹配\",\"590\":\"v-49ecfa5b#正则替换\",\"591\":\"v-49ecfa5b#表达式修饰符\",\"592\":\"v-6bea56bc\",\"593\":\"v-6bea56bc#基础知识\",\"594\":\"v-6bea56bc#v-model\",\"595\":\"v-6bea56bc#组件命名\",\"596\":\"v-6bea56bc#cdn-使用-vue\",\"597\":\"v-88193f16\",\"598\":\"v-88193f16#cdn\",\"599\":\"v-88193f16#静态文件\",\"600\":\"v-88193f16#图床\",\"601\":\"v-88193f16#全站加速\",\"602\":\"v-88193f16#第三方服务\",\"603\":\"v-88193f16#vercel\",\"604\":\"v-88193f16#fly-io\",\"605\":\"v-88193f16#cloudflare-tunnel\",\"606\":\"v-88193f16#腾讯云境外\",\"607\":\"v-1c7fca9e\",\"608\":\"v-1c7fca9e#反向代理\",\"609\":\"v-1c7fca9e#镜像整个网站\",\"610\":\"v-1c7fca9e#镜像网站指定目录\",\"611\":\"v-1c7fca9e#镜像网站带密码访问\",\"612\":\"v-2b70157f\",\"613\":\"v-bc154f32\",\"614\":\"v-bc154f32#github-actions\",\"615\":\"v-bc154f32#不同仓库间复制\",\"616\":\"v-bc154f32#actions-失败重试\",\"617\":\"v-bc154f32#uses-版本号\",\"618\":\"v-bc154f32#git-commit\",\"619\":\"v-bc154f32#type\",\"620\":\"v-bc154f32#scope\",\"621\":\"v-bc154f32#footer\",\"622\":\"v-bc154f32#常见问题\",\"623\":\"v-bc154f32#github-忽略指定文件\",\"624\":\"v-bc154f32#添加-github-源作为依赖\",\"625\":\"v-d4ab9bf4\",\"626\":\"v-d4ab9bf4#本地-mysql-使用\",\"627\":\"v-d4ab9bf4#数据库恢复\",\"628\":\"v-d4ab9bf4#数据库启动失败或损坏\",\"629\":\"v-7c5f209c\",\"630\":\"v-7c5f209c#静态托管\",\"631\":\"v-7c5f209c#npm-包\",\"632\":\"v-7c5f209c#部署平台\",\"633\":\"v-7c5f209c#ipfs\",\"634\":\"v-7c5f209c#github-同步到-vps\",\"635\":\"v-7c5f209c#同步到-ftp\",\"636\":\"v-7c5f209c#ssh-同步\",\"637\":\"v-7c5f209c#同步到-oss\",\"638\":\"v-39dc98a2\",\"639\":\"v-39dc98a2#环境部署\",\"640\":\"v-39dc98a2#包管理安装\",\"641\":\"v-39dc98a2#包管理源\",\"642\":\"v-39dc98a2#部署包\",\"643\":\"v-39dc98a2#本地测试\",\"644\":\"v-39dc98a2#服务器-ecs\",\"645\":\"v-39dc98a2#网站重定向\",\"646\":\"v-39dc98a2#全新安装服务器\",\"647\":\"v-39dc98a2#服务器迁移\",\"648\":\"v-39dc98a2#网站设计\",\"649\":\"v-39dc98a2#网站字体\",\"650\":\"v-39dc98a2#米拓\",\"651\":\"v-39dc98a2#常见问题\",\"652\":\"v-39dc98a2#cpu-100\",\"653\":\"v-39dc98a2#ssl-证书\",\"654\":\"v-39dc98a2#cors-跨域\",\"655\":\"v-39dc98a2#piwik-手动升级\",\"656\":\"v-c582fe3e\",\"657\":\"v-c582fe3e#淘宝\",\"658\":\"v-c582fe3e#拼多多\",\"659\":\"v-c582fe3e#京东\",\"660\":\"v-c582fe3e#_1688\",\"661\":\"v-c582fe3e#抢购辅助\",\"662\":\"v-c582fe3e#bp-模式\",\"663\":\"v-c582fe3e#购物思考\",\"664\":\"v-373dc153\",\"665\":\"v-373dc153#饮食\",\"666\":\"v-373dc153#零食\",\"667\":\"v-373dc153#饮料\",\"668\":\"v-373dc153#冷泡燕麦\",\"669\":\"v-373dc153#健康理论\",\"670\":\"v-373dc153#程序员延寿指南\",\"671\":\"v-373dc153#其他\",\"672\":\"v-373dc153#泡澡\",\"673\":\"v-373dc153#减肥食谱\",\"674\":\"v-9ff4249e\",\"675\":\"v-9ff4249e#home-assistant\",\"676\":\"v-9ff4249e#node-red\",\"677\":\"v-9ff4249e#常用节点\",\"678\":\"v-9ff4249e#自动化场景\",\"679\":\"v-9ff4249e#智能硬件\",\"680\":\"v-9ff4249e#zigbee2mqtt\",\"681\":\"v-9ff4249e#智趣盒子\",\"682\":\"v-9ff4249e#其他硬件\",\"683\":\"v-16a2796a\",\"684\":\"v-16a2796a#个人护理\",\"685\":\"v-16a2796a#理发\",\"686\":\"v-16a2796a#衣物\",\"687\":\"v-16a2796a#妙用\",\"688\":\"v-16a2796a#磁铁\",\"689\":\"v-16a2796a#小众记录\",\"690\":\"v-16a2796a#去客厅化\",\"691\":\"v-16a2796a#玻璃自爆\",\"692\":\"v-16a2796a#花洒水小\",\"693\":\"v-16a2796a#网线更换\",\"694\":\"v-850f3410\",\"695\":\"v-850f3410#牛皮席\",\"696\":\"v-850f3410#升降桌\",\"697\":\"v-850f3410#通马桶\",\"698\":\"v-850f3410#林内锅炉\",\"699\":\"v-850f3410#锅炉补水\",\"700\":\"v-850f3410#地暖温控器\",\"701\":\"v-182a363a\",\"702\":\"v-182a363a#自身健康\",\"703\":\"v-182a363a#维生素\",\"704\":\"v-182a363a#看病技巧\",\"705\":\"v-c51c66fe\",\"706\":\"v-c51c66fe#书房\",\"707\":\"v-c51c66fe#摄像头\",\"708\":\"v-c51c66fe#键盘\",\"709\":\"v-c51c66fe#游戏手柄\",\"710\":\"v-c51c66fe#显示器\",\"711\":\"v-c51c66fe#台式电脑\",\"712\":\"v-c51c66fe#书桌灯\",\"713\":\"v-c51c66fe#升降桌\",\"714\":\"v-c51c66fe#静电墙贴\",\"715\":\"v-c51c66fe#数码\",\"716\":\"v-c51c66fe#降噪耳机\",\"717\":\"v-c51c66fe#充电器\",\"718\":\"v-c51c66fe#ups\",\"719\":\"v-c51c66fe#_3d-打印机\",\"720\":\"v-c51c66fe#健康\",\"721\":\"v-c51c66fe#代餐\",\"722\":\"v-c51c66fe#体重秤\",\"723\":\"v-c51c66fe#椭圆机\",\"724\":\"v-c51c66fe#眼部按摩仪\",\"725\":\"v-c51c66fe#泡脚桶\",\"726\":\"v-c51c66fe#睡眠监测\",\"727\":\"v-c51c66fe#厨房\",\"728\":\"v-c51c66fe#冰柜\",\"729\":\"v-c51c66fe#切肉机\",\"730\":\"v-c51c66fe#净水器\",\"731\":\"v-c51c66fe#家居\",\"732\":\"v-c51c66fe#维修\",\"733\":\"v-c51c66fe#电熨斗\",\"734\":\"v-c51c66fe#牛皮席\",\"735\":\"v-c51c66fe#消毒液\",\"736\":\"v-c51c66fe#小物\",\"737\":\"v-c51c66fe#可能放弃\",\"738\":\"v-c51c66fe#电子书\",\"739\":\"v-c51c66fe#微单相机\",\"740\":\"v-c51c66fe#无线麦克风\",\"741\":\"v-c51c66fe#洗碗机\",\"742\":\"v-101edae1\",\"743\":\"v-101edae1#docker-命令\",\"744\":\"v-101edae1#定制-docker-镜像\",\"745\":\"v-101edae1#docker-数据库管理\",\"746\":\"v-101edae1#其他使用\",\"747\":\"v-101edae1#windows-docker\",\"748\":\"v-101edae1#宝塔镜像\",\"749\":\"v-73fe61b2\",\"750\":\"v-73fe61b2#常用-agent\",\"751\":\"v-73fe61b2#huginn-部署\",\"752\":\"v-73fe61b2#ubuntu-手动部署\",\"753\":\"v-73fe61b2#huginn-docker\",\"754\":\"v-73fe61b2#agents\",\"755\":\"v-73fe61b2#trigger-agent\",\"756\":\"v-73fe61b2#liquid-output-agent\",\"757\":\"v-73fe61b2#event-formatting-agent\",\"758\":\"v-73fe61b2#正则重构\",\"759\":\"v-73fe61b2#加前后缀\",\"760\":\"v-73fe61b2#adioso-agent-机票价格追踪\",\"761\":\"v-73fe61b2#aftership-agent-物流追踪-api-付费\",\"762\":\"v-73fe61b2#algorithmia-agent-ai-算法\",\"763\":\"v-73fe61b2#attribute-difference-agent-属性差异-待深入理解\",\"764\":\"v-73fe61b2#basecamp-agent-service-停用\",\"765\":\"v-73fe61b2#bigquery-agent-大型数据库分析\",\"766\":\"v-73fe61b2#boxcar-agent-iphone-通知栏-app\",\"767\":\"v-73fe61b2#change-detector-agent-监测数据变化\",\"768\":\"v-73fe61b2#commander-agent-触发命令\",\"769\":\"v-73fe61b2#csv-agent-csv-表格数据处理\",\"770\":\"v-73fe61b2#data-output-agent-网页输出数据-rss\",\"771\":\"v-73fe61b2#de-duplication-agent-数据去重\",\"772\":\"v-73fe61b2#delay-agent-缓冲存储区\",\"773\":\"v-73fe61b2#digest-agent-摘要汇总-未理解\",\"774\":\"v-73fe61b2#dkt-clustering-agent-数据挖掘算法\",\"775\":\"v-73fe61b2#dropbox-file-url\",\"776\":\"v-73fe61b2#dropbox-watch-agent\",\"777\":\"v-73fe61b2#email-agent\",\"778\":\"v-73fe61b2#email-digest-agent-邮件摘要\",\"779\":\"v-73fe61b2#evernote-agent\",\"780\":\"v-73fe61b2#freme-explore-agent-sparql-数据断点\",\"781\":\"v-73fe61b2#ftpsite-agent\",\"782\":\"v-1b2d4c91\",\"783\":\"v-1b2d4c91#nas-套件\",\"784\":\"v-1b2d4c91#docker-容器\",\"785\":\"v-1b2d4c91#常用\",\"786\":\"v-1b2d4c91#资讯\",\"787\":\"v-1b2d4c91#娱乐\",\"788\":\"v-1b2d4c91#自动化\",\"789\":\"v-1b2d4c91#待了解\",\"790\":\"v-1b2d4c91#影视整理\",\"791\":\"v-1b2d4c91#nas-硬盘\",\"792\":\"v-54e731c2\",\"793\":\"v-54e731c2#手动部署\",\"794\":\"v-00f6d5f1\",\"795\":\"v-00f6d5f1#评论插件\",\"796\":\"v-00f6d5f1#waline\",\"797\":\"v-00f6d5f1#手动部署\",\"798\":\"v-00f6d5f1#导入时间处理\",\"799\":\"v-00f6d5f1#gitalk\",\"800\":\"v-3b0b9f28\",\"801\":\"v-3b0b9f28#初始配置\",\"802\":\"v-3b0b9f28#搜索插件\",\"803\":\"v-3b0b9f28#webpack-打包\",\"804\":\"v-3b0b9f28#关闭-prefetch\",\"805\":\"v-3b0b9f28#页面模板\",\"806\":\"v-3b0b9f28#时间参数\",\"807\":\"v-3b0b9f28#自定义主题\",\"808\":\"v-3cdca328\",\"809\":\"v-3cdca328#插件\",\"810\":\"v-3cdca328#配置\",\"811\":\"v-3cdca328#docsify-emoji\",\"812\":\"v-3cdca328#本地命令\",\"813\":\"v-3cdca328#serve-启动\",\"814\":\"v-3cdca328#生成侧边栏\",\"815\":\"v-3cdca328#常见问题\",\"816\":\"v-3cdca328#引用路径\",\"817\":\"v-3cdca328#页面未同步更新\",\"818\":\"v-3cdca328#github-pages-报错\",\"819\":\"v-6451f4a2\",\"820\":\"v-6451f4a2#重装准备\",\"821\":\"v-6451f4a2#安装系统\",\"822\":\"v-6451f4a2#系统配置\",\"823\":\"v-6451f4a2#安装应用\",\"824\":\"v-6451f4a2#修改按键\",\"825\":\"v-6451f4a2#常见问题\",\"826\":\"v-395a6953\",\"827\":\"v-395a6953#安装\",\"828\":\"v-395a6953#qttabbar-失效\",\"829\":\"v-395a6953#常用设置\",\"830\":\"v-395a6953#汉化\",\"831\":\"v-395a6953#选项卡-标签设置\",\"832\":\"v-395a6953#窗口\",\"833\":\"v-395a6953#鼠标事件\",\"834\":\"v-395a6953#预览\",\"835\":\"v-395a6953#群组\",\"836\":\"v-a8b7dd1a\",\"837\":\"v-5e2612f0\",\"838\":\"v-5e2612f0#windows-快捷键\",\"839\":\"v-5e2612f0#网址快捷方式\",\"840\":\"v-5e2612f0#chrome-开发工具\",\"841\":\"v-5e2612f0#网页转桌面应用\",\"842\":\"v-5e2612f0#chrome-app\",\"843\":\"v-5e2612f0#pake\",\"844\":\"v-5e2612f0#web2desk\",\"845\":\"v-5e2612f0#常见问题\",\"846\":\"v-5e2612f0#无法切换中英文\",\"847\":\"v-5e2612f0#禁止系统自动更新重启\",\"848\":\"v-5e2612f0#wps-没有宏\",\"849\":\"v-5e2612f0#microsoft-store-应用快捷方式\",\"850\":\"v-5e2612f0#无法安装应用\",\"851\":\"v-df9d5022\",\"852\":\"v-df9d5022#快捷键\",\"853\":\"v-df9d5022#应用程序\",\"854\":\"v-df9d5022#文件管理\",\"855\":\"v-df9d5022#截图和录屏\",\"856\":\"v-df9d5022#系统偏好设置\",\"857\":\"v-df9d5022#常见问题\",\"858\":\"v-df9d5022#应用程序无法打开\",\"859\":\"v-df9d5022#无法连接到-wi-fi\",\"860\":\"v-df9d5022#mac-运行缓慢\",\"861\":\"v-df9d5022#终端-terminal\",\"862\":\"v-df9d5022#homebrew\",\"863\":\"v-df9d5022#xcode\",\"864\":\"v-df9d5022#调试工具\",\"865\":\"v-df9d5022#命令行工具\",\"866\":\"v-12e41b33\",\"867\":\"v-12e41b33#引言\",\"868\":\"v-12e41b33#ai与艺术-ai的绘画能力\",\"869\":\"v-12e41b33#ai与交流-ai的对话能力\",\"870\":\"v-12e41b33#ai与问题解决-ai的解决问题能力\",\"871\":\"v-12e41b33#结论-ai让生活更美好\",\"872\":\"v-bdd9cae6\",\"873\":\"v-bdd9cae6#电脑\",\"874\":\"v-bdd9cae6#补光灯\",\"875\":\"v-bdd9cae6#三脚架\",\"876\":\"v-bdd9cae6#音频采集\",\"877\":\"v-bdd9cae6#视频采集\",\"878\":\"v-bdd9cae6#摄像头\",\"879\":\"v-bdd9cae6#手机\",\"880\":\"v-bdd9cae6#相机\",\"881\":\"v-bdd9cae6#手机作摄像头\",\"882\":\"v-bdd9cae6#camo\",\"883\":\"v-bdd9cae6#ndi\",\"884\":\"v-bdd9cae6#ip-webcam\",\"885\":\"v-bdd9cae6#其他\",\"886\":\"v-63cd7175\",\"887\":\"v-63cd7175#主界面\",\"888\":\"v-63cd7175#场景\",\"889\":\"v-63cd7175#来源\",\"890\":\"v-63cd7175#混音器\",\"891\":\"v-63cd7175#转场特效\",\"892\":\"v-63cd7175#控制按钮\",\"893\":\"v-63cd7175#设置\",\"894\":\"v-63cd7175#直播\",\"895\":\"v-63cd7175#输出\",\"896\":\"v-63cd7175#音频\",\"897\":\"v-63cd7175#视频\",\"898\":\"v-63cd7175#高级\",\"899\":\"v-63cd7175#直播来源\",\"900\":\"v-63cd7175#静态来源\",\"901\":\"v-63cd7175#音频来源\",\"902\":\"v-63cd7175#视频来源\",\"903\":\"v-63cd7175#组合输出\",\"904\":\"v-63cd7175#滤镜\",\"905\":\"v-63cd7175#常用滤镜\",\"906\":\"v-63cd7175#色度键-抠图\",\"907\":\"v-63cd7175#模糊\",\"908\":\"v-63cd7175#图像蒙版\",\"909\":\"v-63cd7175#色彩校正\",\"910\":\"v-63cd7175#应用-lut\",\"911\":\"v-63cd7175#常见问题\",\"912\":\"v-63cd7175#直播延迟严重\",\"913\":\"v-63cd7175#一直断开重连\",\"914\":\"v-63cd7175#后续\",\"915\":\"v-1ace0584\",\"916\":\"v-1ace0584#安装-streamfx\",\"917\":\"v-1ace0584#来源镜像\",\"918\":\"v-1ace0584#_3d-转换\",\"919\":\"v-1ace0584#模糊\",\"920\":\"v-1ace0584#动态蒙版\",\"921\":\"v-1ace0584#sdf-特效\",\"922\":\"v-1ace0584#着色器\",\"923\":\"v-1ace0584#色彩滤镜\",\"924\":\"v-1ace0584#位移变换\",\"925\":\"v-1ace0584#画面遮盖\",\"926\":\"v-1ace0584#增强滤镜\",\"927\":\"v-1ace0584#n-卡滤镜\",\"928\":\"v-78ae0f01\",\"929\":\"v-78ae0f01#插件安装与卸载\",\"930\":\"v-78ae0f01#多平台直播-multi-rtmp\",\"931\":\"v-78ae0f01#自动切换场景\",\"932\":\"v-78ae0f01#move-transition\",\"933\":\"v-78ae0f01#transition-table\",\"934\":\"v-78ae0f01#source-dock\",\"935\":\"v-78ae0f01#source-copy\",\"936\":\"v-78ae0f01#其他\",\"937\":\"v-78ae0f01#美化插件\",\"938\":\"v-78ae0f01#弃用插件\",\"939\":\"v-78ae0f01#更多\",\"940\":\"v-21f30b82\",\"941\":\"v-21f30b82#美颜\",\"942\":\"v-21f30b82#变声\",\"943\":\"v-21f30b82#虚拟主播\",\"944\":\"v-21f30b82#snap-camera\",\"945\":\"v-21f30b82#facerig\",\"946\":\"v-21f30b82#prprlive\",\"947\":\"v-21f30b82#动态素材\",\"948\":\"v-21f30b82#摄像头多开\",\"949\":\"v-21f30b82#其他应用\",\"950\":\"v-21f30b82#nvidia-broadcast\",\"951\":\"v-21f30b82#小葫芦弹幕助手\",\"952\":\"v-0094e0b6\",\"953\":\"v-0094e0b6#淘宝直播\",\"954\":\"v-0094e0b6#抖音直播\",\"955\":\"v-0094e0b6#快手直播\",\"956\":\"v-0094e0b6#视频号直播\",\"957\":\"v-0094e0b6#b-站直播\",\"958\":\"v-0094e0b6#知乎直播\",\"959\":\"v-0094e0b6#小红书直播\",\"960\":\"v-0094e0b6#微博直播\",\"961\":\"v-0094e0b6#youtube-直播\",\"962\":\"v-a580c466\",\"963\":\"v-a580c466#直播定位\",\"964\":\"v-a580c466#开播时间\",\"965\":\"v-a580c466#直播策划\",\"966\":\"v-a580c466#选题\",\"967\":\"v-a580c466#标题\",\"968\":\"v-a580c466#预告\",\"969\":\"v-a580c466#环境\",\"970\":\"v-a580c466#直播互动\",\"971\":\"v-a580c466#开播锻炼\",\"972\":\"v-a580c466#总结\",\"973\":\"v-c7c23db2\",\"974\":\"v-d551fba2\",\"975\":\"v-d551fba2#不要囤货\",\"976\":\"v-d551fba2#ldr-的选择\",\"977\":\"v-d551fba2#陪护的重要性\",\"978\":\"v-d551fba2#送花-一个小小的惊喜\",\"979\":\"v-db6f9792\",\"980\":\"v-db6f9792#坚持母乳喂养\",\"981\":\"v-db6f9792#宝宝醒了吗\",\"982\":\"v-db6f9792#宝宝哭闹的原因\",\"983\":\"v-db6f9792#月嫂-助手还是潜在风险\",\"984\":\"v-146fc10b\",\"985\":\"v-146fc10b#部署问题\",\"986\":\"v-146fc10b#路径对照\",\"987\":\"v-146fc10b#用户与组身份\",\"988\":\"v-146fc10b#文件夹访问权限\",\"989\":\"v-54bae169\",\"990\":\"v-54bae169#使用示例\",\"991\":\"v-54bae169#构建自定义-docker-镜像\",\"992\":\"v-2117748f\",\"993\":\"v-2117748f#安全地从外部访问\",\"994\":\"v-072b240a\",\"995\":\"v-4b94fd6a\",\"996\":\"v-7b224f9d\",\"997\":\"v-2b3f3b71\",\"998\":\"v-79e8b601\",\"999\":\"v-774ba40b\",\"1000\":\"v-06c25741\",\"1001\":\"v-06c25741#nginx-proxy-manager\",\"1002\":\"v-06c25741#caddy\",\"1003\":\"v-a0e1132e\",\"1004\":\"v-78e70751\",\"1005\":\"v-31e5d674\",\"1006\":\"v-08917e81\",\"1007\":\"v-e1e3da16\",\"1008\":\"v-2d0a776e\",\"1009\":\"v-144e84a4\",\"1010\":\"v-72a9c1e2\",\"1011\":\"v-29788432\",\"1012\":\"v-1a3d5e90\",\"1013\":\"v-744e6dd4\",\"1014\":\"v-d7a4cff6\",\"1015\":\"v-4766039d\"},\"fieldIds\":{\"h\":0,\"t\":1,\"c\":2},\"fieldLength\":{\"0\":[1,13],\"1\":[1],\"2\":[2,41],\"3\":[1,116],\"4\":[1,28],\"5\":[1,109],\"6\":[1,87],\"7\":[1,66],\"8\":[1,69],\"9\":[1,26],\"10\":[2,47],\"11\":[1,18],\"12\":[1,39],\"13\":[3,47],\"14\":[1,37],\"15\":[3,58],\"16\":[1,35],\"17\":[3,44],\"18\":[1,36],\"19\":[3,24],\"20\":[1,3],\"21\":[2,31],\"22\":[2,29],\"23\":[3,158],\"24\":[3],\"25\":[1,100],\"26\":[1,48],\"27\":[1,48],\"28\":[1,24],\"29\":[2,32],\"30\":[1,39],\"31\":[2,120],\"32\":[2],\"33\":[1,24],\"34\":[1,54],\"35\":[2,27],\"36\":[1,23],\"37\":[2,30],\"38\":[1,9],\"39\":[2,16],\"40\":[4,18],\"41\":[1,25],\"42\":[1,28],\"43\":[6,15],\"44\":[2,9],\"45\":[4,23],\"46\":[4,54],\"47\":[4,32],\"48\":[4,15],\"49\":[2,36],\"50\":[2,33],\"51\":[3,10],\"52\":[1,88],\"53\":[3,33],\"54\":[4,9],\"55\":[1,43],\"56\":[1,3],\"57\":[1,30],\"58\":[2,23],\"59\":[2,67],\"60\":[7,39],\"61\":[10],\"62\":[2,13],\"63\":[1,13],\"64\":[1,33],\"65\":[6,49],\"66\":[4,85],\"67\":[1,70],\"68\":[2,31],\"69\":[5,10],\"70\":[7,21],\"71\":[1,47],\"72\":[4,40],\"73\":[3,27],\"74\":[1,27],\"75\":[3,15],\"76\":[1,74],\"77\":[2,87],\"78\":[2,69],\"79\":[2,46],\"80\":[2,155],\"81\":[3,249],\"82\":[5,10],\"83\":[1,29],\"84\":[3,30],\"85\":[3,11],\"86\":[2,62],\"87\":[2,155],\"88\":[2],\"89\":[3,25],\"90\":[2,50],\"91\":[1,61],\"92\":[2,61],\"93\":[4,17],\"94\":[2,30],\"95\":[2,53],\"96\":[2,15],\"97\":[3,14],\"98\":[3,11],\"99\":[3,4],\"100\":[3,31],\"101\":[6,8],\"102\":[3,9],\"103\":[2,63],\"104\":[5,64],\"105\":[7,62],\"106\":[1,16],\"107\":[1,26],\"108\":[2,21],\"109\":[9,23],\"110\":[2,38],\"111\":[2,13],\"112\":[1,7],\"113\":[1,4],\"114\":[1,72],\"115\":[2,37],\"116\":[2,33],\"117\":[3,18],\"118\":[3,22],\"119\":[4,25],\"120\":[3,34],\"121\":[1,49],\"122\":[2,69],\"123\":[1,48],\"124\":[2,7],\"125\":[1,35],\"126\":[2,34],\"127\":[4,23],\"128\":[2,38],\"129\":[2,33],\"130\":[4,24],\"131\":[1,35],\"132\":[1,96],\"133\":[1,23],\"134\":[1],\"135\":[1,20],\"136\":[6,28],\"137\":[4,22],\"138\":[1,26],\"139\":[1,27],\"140\":[1,13],\"141\":[1,4],\"142\":[1,25],\"143\":[5,16],\"144\":[1,45],\"145\":[1,33],\"146\":[3,19],\"147\":[2,33],\"148\":[4,24],\"149\":[1,27],\"150\":[1,22],\"151\":[1,35],\"152\":[5,42],\"153\":[3,30],\"154\":[1,30],\"155\":[1,29],\"156\":[1,66],\"157\":[1,74],\"158\":[1],\"159\":[1,47],\"160\":[1,19],\"161\":[1,31],\"162\":[1,11],\"163\":[3,12],\"164\":[1,23],\"165\":[1,20],\"166\":[2,10],\"167\":[1,38],\"168\":[5,50],\"169\":[2],\"170\":[1,25],\"171\":[1,29],\"172\":[1,44],\"173\":[1,8],\"174\":[1,19],\"175\":[1,15],\"176\":[1,7],\"177\":[3,35],\"178\":[1,13],\"179\":[1],\"180\":[3,8],\"181\":[1,7],\"182\":[1,8],\"183\":[4,9],\"184\":[3,11],\"185\":[1,13],\"186\":[1,29],\"187\":[1],\"188\":[1,12],\"189\":[2,17],\"190\":[2,41],\"191\":[6,39],\"192\":[1,112],\"193\":[2,21],\"194\":[1,69],\"195\":[1,24],\"196\":[1,18],\"197\":[1,11],\"198\":[1,141],\"199\":[7,49],\"200\":[1,10],\"201\":[2,23],\"202\":[1,62],\"203\":[2,111],\"204\":[1,91],\"205\":[2,31],\"206\":[2,25],\"207\":[1,23],\"208\":[1,20],\"209\":[1],\"210\":[1,8],\"211\":[1,8],\"212\":[1,5],\"213\":[10,20],\"214\":[1,20],\"215\":[1,40],\"216\":[2,4],\"217\":[5,14],\"218\":[1,29],\"219\":[1,16],\"220\":[1,10],\"221\":[3,31],\"222\":[5,43],\"223\":[2,27],\"224\":[3,9],\"225\":[3,20],\"226\":[3,20],\"227\":[3,29],\"228\":[2,29],\"229\":[1],\"230\":[1,22],\"231\":[1,14],\"232\":[1,21],\"233\":[6,45],\"234\":[3,29],\"235\":[1,25],\"236\":[1,73],\"237\":[1,57],\"238\":[1],\"239\":[1,11],\"240\":[2,22],\"241\":[1,23],\"242\":[1,39],\"243\":[4],\"244\":[1,88],\"245\":[1,34],\"246\":[2],\"247\":[1,76],\"248\":[1,47],\"249\":[2],\"250\":[1,23],\"251\":[8,33],\"252\":[7,19],\"253\":[2,30],\"254\":[3,16],\"255\":[1,13],\"256\":[1,8],\"257\":[3,23],\"258\":[1,23],\"259\":[3,41],\"260\":[2,41],\"261\":[2,19],\"262\":[1,30],\"263\":[4,94],\"264\":[1],\"265\":[1,45],\"266\":[1,13],\"267\":[1,44],\"268\":[1,23],\"269\":[2,55],\"270\":[3,65],\"271\":[2,71],\"272\":[1,27],\"273\":[4,118],\"274\":[2,50],\"275\":[1],\"276\":[2,32],\"277\":[2,47],\"278\":[1,128],\"279\":[1,25],\"280\":[2,91],\"281\":[1],\"282\":[5,25],\"283\":[3,25],\"284\":[1,14],\"285\":[1,13],\"286\":[1,20],\"287\":[1,65],\"288\":[3,22],\"289\":[2,31],\"290\":[1,56],\"291\":[1,8],\"292\":[1,19],\"293\":[1,10],\"294\":[1,16],\"295\":[1,21],\"296\":[7,12],\"297\":[1,24],\"298\":[1],\"299\":[1,8],\"300\":[1,15],\"301\":[1,13],\"302\":[5,27],\"303\":[2,23],\"304\":[1,73],\"305\":[2],\"306\":[1,22],\"307\":[1,46],\"308\":[1,28],\"309\":[1],\"310\":[1,64],\"311\":[2,24],\"312\":[1,171],\"313\":[4],\"314\":[1,10],\"315\":[2,40],\"316\":[2,12],\"317\":[2,36],\"318\":[4,42],\"319\":[5,44],\"320\":[2],\"321\":[5,16],\"322\":[3,11],\"323\":[2,9],\"324\":[2,21],\"325\":[2,15],\"326\":[1,9],\"327\":[1,11],\"328\":[2,16],\"329\":[2,37],\"330\":[5,138],\"331\":[1,147],\"332\":[1,223],\"333\":[1,127],\"334\":[2,115],\"335\":[1,79],\"336\":[1],\"337\":[1,216],\"338\":[1],\"339\":[1,73],\"340\":[1,105],\"341\":[1,42],\"342\":[1,70],\"343\":[2,51],\"344\":[1,65],\"345\":[1,41],\"346\":[1,24],\"347\":[1,288],\"348\":[1,6],\"349\":[2,51],\"350\":[3,45],\"351\":[3,305],\"352\":[1,91],\"353\":[1,8],\"354\":[1,46],\"355\":[2,16],\"356\":[2,100],\"357\":[2,186],\"358\":[1,10],\"359\":[1,147],\"360\":[2,137],\"361\":[1,74],\"362\":[2,207],\"363\":[3,133],\"364\":[1,87],\"365\":[1,31],\"366\":[2,190],\"367\":[1,106],\"368\":[2,95],\"369\":[1,13],\"370\":[1,160],\"371\":[1,133],\"372\":[2,87],\"373\":[2,164],\"374\":[1,11],\"375\":[2,102],\"376\":[1,76],\"377\":[1,50],\"378\":[1,167],\"379\":[1,111],\"380\":[1,187],\"381\":[1,77],\"382\":[1,127],\"383\":[1,41],\"384\":[1,32],\"385\":[1],\"386\":[1,180],\"387\":[2,2],\"388\":[2,87],\"389\":[1,66],\"390\":[1,110],\"391\":[1,8],\"392\":[4,134],\"393\":[1,121],\"394\":[2,60],\"395\":[1,8],\"396\":[2,8],\"397\":[1,239],\"398\":[1,147],\"399\":[1,74],\"400\":[1,59],\"401\":[1,7],\"402\":[1,9],\"403\":[1,14],\"404\":[1,16],\"405\":[1,17],\"406\":[1,12],\"407\":[1,15],\"408\":[1,11],\"409\":[1,9],\"410\":[1,12],\"411\":[1,20],\"412\":[1],\"413\":[1,12],\"414\":[1,20],\"415\":[1,21],\"416\":[1,20],\"417\":[1,6],\"418\":[1,7],\"419\":[1,7],\"420\":[1,6],\"421\":[1,7],\"422\":[1,9],\"423\":[1,10],\"424\":[1],\"425\":[1,4],\"426\":[2,53],\"427\":[1,15],\"428\":[1,14],\"429\":[3,26],\"430\":[1,12],\"431\":[1,7],\"432\":[1,61],\"433\":[1,38],\"434\":[1,46],\"435\":[1,35],\"436\":[1,44],\"437\":[1,20],\"438\":[3,37],\"439\":[2,11],\"440\":[1,53],\"441\":[1,11],\"442\":[1,23],\"443\":[2,29],\"444\":[2,59],\"445\":[1,4],\"446\":[1,50],\"447\":[1,47],\"448\":[1,79],\"449\":[1,27],\"450\":[1,45],\"451\":[1,41],\"452\":[1,108],\"453\":[1,85],\"454\":[1,60],\"455\":[1,29],\"456\":[1,75],\"457\":[1,21],\"458\":[2,78],\"459\":[2,53],\"460\":[2,64],\"461\":[1],\"462\":[1,40],\"463\":[2,31],\"464\":[1,98],\"465\":[1,38],\"466\":[1,46],\"467\":[1,21],\"468\":[1],\"469\":[2,15],\"470\":[2,21],\"471\":[1,19],\"472\":[2,31],\"473\":[2],\"474\":[1,59],\"475\":[1,35],\"476\":[2,17],\"477\":[1],\"478\":[2,31],\"479\":[2,35],\"480\":[1,13],\"481\":[1,12],\"482\":[1,52],\"483\":[1],\"484\":[1,44],\"485\":[1,22],\"486\":[1,9],\"487\":[1,15],\"488\":[1,32],\"489\":[2,8],\"490\":[1,20],\"491\":[1,12],\"492\":[1,23],\"493\":[1,29],\"494\":[1,33],\"495\":[1,51],\"496\":[1,50],\"497\":[1],\"498\":[1,14],\"499\":[1,16],\"500\":[1,43],\"501\":[2,24],\"502\":[1,14],\"503\":[1,150],\"504\":[1,55],\"505\":[1],\"506\":[1,23],\"507\":[2,16],\"508\":[1],\"509\":[1,14],\"510\":[1,64],\"511\":[1,15],\"512\":[1,41],\"513\":[1],\"514\":[4,55],\"515\":[2,24],\"516\":[2],\"517\":[5,34],\"518\":[4,54],\"519\":[2],\"520\":[3,32],\"521\":[2,54],\"522\":[1,29],\"523\":[1,20],\"524\":[2,24],\"525\":[1,48],\"526\":[1,17],\"527\":[2,42],\"528\":[1,20],\"529\":[1,48],\"530\":[1,10],\"531\":[1],\"532\":[1,10],\"533\":[2,31],\"534\":[2,38],\"535\":[1,25],\"536\":[1,26],\"537\":[2,7],\"538\":[1,45],\"539\":[1,18],\"540\":[1,11],\"541\":[1,41],\"542\":[1,8],\"543\":[1],\"544\":[1,32],\"545\":[1,82],\"546\":[2,67],\"547\":[1,17],\"548\":[1,27],\"549\":[1,41],\"550\":[1,128],\"551\":[2,51],\"552\":[1,39],\"553\":[1,40],\"554\":[1,50],\"555\":[2],\"556\":[1,57],\"557\":[1,8],\"558\":[1,18],\"559\":[1,25],\"560\":[1,27],\"561\":[3,14],\"562\":[1,103],\"563\":[1,12],\"564\":[1,63],\"565\":[1,18],\"566\":[1,5],\"567\":[1,15],\"568\":[1,4],\"569\":[1,31],\"570\":[1,92],\"571\":[1,42],\"572\":[1,55],\"573\":[1,107],\"574\":[1,32],\"575\":[1,21],\"576\":[1,67],\"577\":[2,22],\"578\":[1,47],\"579\":[1,38],\"580\":[1,29],\"581\":[1,45],\"582\":[1,77],\"583\":[3,18],\"584\":[1,28],\"585\":[1,26],\"586\":[2,45],\"587\":[1,15],\"588\":[1,88],\"589\":[1,34],\"590\":[1,16],\"591\":[1,83],\"592\":[1],\"593\":[1,34],\"594\":[2,44],\"595\":[1,47],\"596\":[3,62],\"597\":[1],\"598\":[1,13],\"599\":[1,10],\"600\":[1,14],\"601\":[1,22],\"602\":[1],\"603\":[1,33],\"604\":[2,42],\"605\":[2,45],\"606\":[1,15],\"607\":[1,16],\"608\":[1,10],\"609\":[1,132],\"610\":[1,166],\"611\":[1,187],\"612\":[3,36],\"613\":[1],\"614\":[2,41],\"615\":[1,60],\"616\":[2,42],\"617\":[2,21],\"618\":[2,26],\"619\":[1,32],\"620\":[1,15],\"621\":[1,23],\"622\":[1],\"623\":[2,12],\"624\":[3,41],\"625\":[1,7],\"626\":[3,20],\"627\":[1,51],\"628\":[1,24],\"629\":[1],\"630\":[1,33],\"631\":[2,90],\"632\":[1,48],\"633\":[1,80],\"634\":[3,28],\"635\":[2,108],\"636\":[2,97],\"637\":[2,94],\"638\":[2],\"639\":[1,14],\"640\":[1,17],\"641\":[1,21],\"642\":[1,20],\"643\":[1,13],\"644\":[2,53],\"645\":[1,58],\"646\":[1,117],\"647\":[1,12],\"648\":[1],\"649\":[1,26],\"650\":[1,13],\"651\":[1],\"652\":[3,28],\"653\":[2,39],\"654\":[2,47],\"655\":[2,38],\"656\":[1,13],\"657\":[1,24],\"658\":[1,20],\"659\":[1,10],\"660\":[1,85],\"661\":[1,25],\"662\":[2,44],\"663\":[1,11],\"664\":[1,29],\"665\":[1],\"666\":[1,27],\"667\":[1,45],\"668\":[1,45],\"669\":[1],\"670\":[1,99],\"671\":[1,27],\"672\":[1,75],\"673\":[1,344],\"674\":[1,10],\"675\":[2,59],\"676\":[2,58],\"677\":[1,15],\"678\":[1,15],\"679\":[1],\"680\":[1,14],\"681\":[1,40],\"682\":[1,31],\"683\":[1],\"684\":[1],\"685\":[1,20],\"686\":[1,30],\"687\":[1],\"688\":[1,10],\"689\":[1],\"690\":[1,12],\"691\":[1,22],\"692\":[1,6],\"693\":[1,100],\"694\":[2],\"695\":[1,13],\"696\":[1,5],\"697\":[1,16],\"698\":[1,28],\"699\":[1,36],\"700\":[1,3],\"701\":[1],\"702\":[1,40],\"703\":[1,33],\"704\":[1,36],\"705\":[1],\"706\":[1],\"707\":[1,22],\"708\":[1,17],\"709\":[1,22],\"710\":[1,41],\"711\":[1,38],\"712\":[1,20],\"713\":[1,11],\"714\":[1,9],\"715\":[1],\"716\":[1,60],\"717\":[1,10],\"718\":[1,18],\"719\":[2,7],\"720\":[1],\"721\":[1,5],\"722\":[1,6],\"723\":[1,17],\"724\":[1,12],\"725\":[1,6],\"726\":[1,47],\"727\":[1],\"728\":[1,34],\"729\":[1,21],\"730\":[1,112],\"731\":[1],\"732\":[1,6],\"733\":[1,8],\"734\":[1,8],\"735\":[1,35],\"736\":[1,26],\"737\":[1],\"738\":[1,13],\"739\":[1,24],\"740\":[1,19],\"741\":[1,8],\"742\":[1,41],\"743\":[2,70],\"744\":[3,47],\"745\":[2,37],\"746\":[1],\"747\":[2,50],\"748\":[1,104],\"749\":[1,21],\"750\":[2,81],\"751\":[2,124],\"752\":[2,482],\"753\":[2,70],\"754\":[1],\"755\":[2,37],\"756\":[3,30],\"757\":[3,59],\"758\":[1,22],\"759\":[1,191],\"760\":[3,22],\"761\":[5,72],\"762\":[4,32],\"763\":[6,101],\"764\":[4,28],\"765\":[3,186],\"766\":[5,80],\"767\":[4,73],\"768\":[3,127],\"769\":[4,118],\"770\":[6,317],\"771\":[4,41],\"772\":[3,72],\"773\":[4,87],\"774\":[5,157],\"775\":[3,107],\"776\":[3,28],\"777\":[2,59],\"778\":[4,100],\"779\":[2,131],\"780\":[6,136],\"781\":[2,145],\"782\":[1,46],\"783\":[2,45],\"784\":[2],\"785\":[1,86],\"786\":[1,61],\"787\":[1,108],\"788\":[1,72],\"789\":[1,29],\"790\":[1,34],\"791\":[2,80],\"792\":[2,47],\"793\":[1,122],\"794\":[1,13],\"795\":[1,27],\"796\":[1,44],\"797\":[1,193],\"798\":[1,96],\"799\":[1,108],\"800\":[1,59],\"801\":[1,89],\"802\":[1,23],\"803\":[2,141],\"804\":[2,32],\"805\":[1,80],\"806\":[1,57],\"807\":[1,133],\"808\":[1,12],\"809\":[1,67],\"810\":[1],\"811\":[2,12],\"812\":[1,12],\"813\":[2,18],\"814\":[1,14],\"815\":[1],\"816\":[1,12],\"817\":[1,17],\"818\":[3,18],\"819\":[1],\"820\":[1,26],\"821\":[1,40],\"822\":[1,64],\"823\":[1,62],\"824\":[1,11],\"825\":[1,42],\"826\":[1,19],\"827\":[1,44],\"828\":[2,18],\"829\":[1,10],\"830\":[1,19],\"831\":[2,28],\"832\":[1,9],\"833\":[1,13],\"834\":[1,7],\"835\":[1,8],\"836\":[1,249],\"837\":[1,7],\"838\":[2,48],\"839\":[1,26],\"840\":[2,25],\"841\":[1],\"842\":[2,26],\"843\":[1,16],\"844\":[1,27],\"845\":[1],\"846\":[1,32],\"847\":[1,26],\"848\":[2,25],\"849\":[3,21],\"850\":[1,40],\"851\":[1,8],\"852\":[1,35],\"853\":[1,38],\"854\":[1,22],\"855\":[1,18],\"856\":[1,20],\"857\":[1],\"858\":[1,18],\"859\":[3,22],\"860\":[2,22],\"861\":[3,14],\"862\":[1,34],\"863\":[1,17],\"864\":[1,26],\"865\":[1,24],\"866\":[1],\"867\":[1,14],\"868\":[2,13],\"869\":[2,19],\"870\":[2,13],\"871\":[2,19],\"872\":[4,20],\"873\":[1,10],\"874\":[1,13],\"875\":[1,15],\"876\":[1,31],\"877\":[1,3],\"878\":[1,26],\"879\":[1,5],\"880\":[1,19],\"881\":[1],\"882\":[1,10],\"883\":[1,15],\"884\":[2,62],\"885\":[1,25],\"886\":[6,20],\"887\":[1,12],\"888\":[1,15],\"889\":[1,19],\"890\":[1,28],\"891\":[1,9],\"892\":[1,28],\"893\":[1,10],\"894\":[1,9],\"895\":[1,32],\"896\":[1,9],\"897\":[1,29],\"898\":[1,22],\"899\":[1,12],\"900\":[1,15],\"901\":[1,7],\"902\":[1,21],\"903\":[1,8],\"904\":[1,10],\"905\":[1,16],\"906\":[3,7],\"907\":[1,22],\"908\":[1,26],\"909\":[1,12],\"910\":[2,37],\"911\":[1],\"912\":[1,10],\"913\":[1,15],\"914\":[1,7],\"915\":[7,12],\"916\":[2,16],\"917\":[1,10],\"918\":[2,9],\"919\":[1,23],\"920\":[1,10],\"921\":[2,16],\"922\":[1,16],\"923\":[1,7],\"924\":[1,23],\"925\":[1,15],\"926\":[1,32],\"927\":[2,39],\"928\":[5,14],\"929\":[1,23],\"930\":[3,12],\"931\":[1,14],\"932\":[2,8],\"933\":[2,5],\"934\":[2,5],\"935\":[2,5],\"936\":[1,55],\"937\":[1,11],\"938\":[1,35],\"939\":[1,5],\"940\":[7,7],\"941\":[1,38],\"942\":[1,14],\"943\":[1,6],\"944\":[2,26],\"945\":[1,20],\"946\":[1,8],\"947\":[1,14],\"948\":[1,25],\"949\":[1],\"950\":[2,24],\"951\":[1,42],\"952\":[4,18],\"953\":[1,20],\"954\":[1,22],\"955\":[1,14],\"956\":[1,10],\"957\":[2,21],\"958\":[1,19],\"959\":[1,13],\"960\":[1,7],\"961\":[2,15],\"962\":[4,9],\"963\":[1,45],\"964\":[1,22],\"965\":[1],\"966\":[1,19],\"967\":[1,25],\"968\":[1,14],\"969\":[1,11],\"970\":[1,26],\"971\":[1,10],\"972\":[1,13],\"973\":[1,19],\"974\":[1],\"975\":[1,18],\"976\":[2,10],\"977\":[1,12],\"978\":[2,6],\"979\":[5],\"980\":[1,25],\"981\":[1,10],\"982\":[1,75],\"983\":[3,77],\"984\":[2,58],\"985\":[1],\"986\":[1,22],\"987\":[1,37],\"988\":[1,25],\"989\":[3,45],\"990\":[1,34],\"991\":[3,69],\"992\":[2,72],\"993\":[1,33],\"994\":[2,74],\"995\":[2,57],\"996\":[3,87],\"997\":[2,111],\"998\":[2,112],\"999\":[3,154],\"1000\":[4,17],\"1001\":[3,89],\"1002\":[1,55],\"1003\":[2,49],\"1004\":[2,62],\"1005\":[2,113],\"1006\":[3,51],\"1007\":[1],\"1008\":[1],\"1009\":[1],\"1010\":[1],\"1011\":[1],\"1012\":[1],\"1013\":[1],\"1014\":[1],\"1015\":[1]},\"averageFieldLength\":[1.6564960629921264,42.0723614752146],\"storedFields\":{\"0\":{\"h\":\"每日仪式\",\"t\":[\"每日仪式是个人生活习惯的核心。它看起来可能会显得固化、死板、功利,有人反馈「透露着一股形式主义气息」,但是,这正是我想要的:遵循一个固定、程序化的流程,有规律地养成习惯,实现自我提升。\"]},\"1\":{\"h\":\"仪式清单\"},\"2\":{\"h\":\"5AM Club\",\"t\":[\"5AM Club 是我的高效早晨方案:\",\"早上 5 点起床,使用手环震动闹钟。\",\"泡杯咖啡,准备早餐,开始第一个工作番茄。\",\"工作 25 分钟休息 5 分钟,休息期间完成每日必须:拍照打卡发 SNS,吃早餐。\",\"每天最低完成 8 个番茄,之后可进入长休息区间,进行家务打扫、健身、娱乐。\",\"晚上 10 点睡觉,保证充足的睡眠时间。\",\"Huberman Lab 建议早晨不一定需要进食,可以到中午再进食,改变身体的新陈代谢周期;醒来后两到四小时再摄入咖啡因,并尽量避免在午后摄入咖啡因,以防下午的 cafferine crush。请根据个人情况灵活调整计划。\"]},\"3\":{\"h\":\"每日\",\"t\":[\"早上创造美好情绪:赞美、仪式感、吃好吃的、看搞笑视频、听歌。\",\"唱歌:唱一首你喜欢的歌曲(外语美声歌曲可以增加脂肪消耗,例如:秋山雅史的《千の風になって》)。\",\"自拍视频:说一句话(比如当天的目标)来鼓励自己。在前一天想好录制内容,以获得积极情绪。\",\"参考积极心理学,收集积极情绪材料,放在显眼的地方:家人的照片、取得的成绩、美好的回忆、憧憬的未来、向往的地方、喜欢的艺术(音乐、名画、诗句)。\",\"人际连接:通过直播连麦与陌生人沟通 15 分钟,例如:播客、抖音语音电台直播 PK。\",\"别人很重要:帮助别人,能让人更健康、更幸福。当心情不好时,去帮助其他人,心情会变得更好。\",\"表扬和自我表扬:赞美自己、家人,发挥标志性优势,总比弥补缺点更有效。\",\"微习惯:\",\"每工作 20 分钟,休息 20 秒,然后做 10 个深蹲;出书房或上完厕所,再做 15 个俯卧撑。在运动前,在白板上写出正字,每一组动作用一个笔画表示。进阶阶段可以用固定机位拍摄视频,监督运动习惯。拍摄时,使用关键句「切掉/保留」,配合 Quickcut 快速剪辑视频。\",\"睡前:每天泡脚 20 分钟(水温 40℃),短时间的泡脚可以帮助睡眠更快入睡。此外,每天睡前 90 分钟,淋浴(水温 38~43℃,淋浴 10 分钟)或泡澡也可以助你更快进入睡眠状态。[1]\",\"间隔学习:穿插学习不同领域内容\",\"阅读看书:每天花 30 分钟读书,并输出笔记。\",\"墨墨背单词:每天背 20 个单词,虽然用处不大,但可以让脑子换个思路。\",\"笔记复习:利用思源笔记/SuperMemo 记忆模型,复习心理认知、沟通理论和行为反思等笔记。\",\"当日回顾:每天记录 3 件好事,总结好事发生的原因,并与家人分享。\",\"这可以是日常生活中常见的小事,比如读到一本好书、吃到一道好菜、听到一个亲友的好消息、在公交车上有人为你让座、孩子今天会走路了,等等。\"]},\"4\":{\"h\":\"定期\",\"t\":[\"月底反思:检查日记和成果,对当月进行复盘,并将其同步给家人,征求意见、批评并记录。 \",\"每月复盘参照 Allison Seboldt,作者会分享他的收入并反思上个月的成就。\",\"阅读 JustinJ ackson,作者在 2018 年初创办 Transistor 以来,一直在分享他的项目,整理了在此过程中学到的许多经验教训。\",\"积极自我介绍:每三个月,讲述一个「最佳的我」的故事,植入你的优势,进行自我肯定。\"]},\"5\":{\"h\":\"自我监控\",\"t\":[\"为了更好地监督自己,我制定了一套自我监控方案,以记录自己的私人工作状态。\",\"开机(8 点)启动录屏命令,并检测护眼提醒是否开启。可参考 FFmpeg 录屏方案来修改命令:\",\"ffmpeg -f gdigrab -r 0.1 -draw_mouse 1 -offset_x 0 -offset_y 0 -video_size 2560x1440 -i desktop -s 1280x720 -b:v 0 -crf 32 output.mp4 -f dshow -s 640x480 -i video='USB2.0 PC CAMERA' -filter_complex 'overlay=W-w-1:H-h-50' -y \",\"晚上 10 点执行关机程序:静音、关闭护眼提醒、关闭录屏终端,并使用 dvr-scan 删除视频中的静止帧。这些步骤可以通过 AutoHotkey 命令自动完成。\",\"Send, {Volume_Mute} Process, Close, Stretchly.exe Process, Close, pwsh.exe Sleep, 500000 Run, PowerShell.exe -NoExit -Command &{dvr-scan -i output.mp4 -o %A_YYYY%-%A_MM%-%A_DD%_Scanned.avi}, D:\\\\Backup\\\\Libraries\\\\Desktop \",\"使用 VLC 播放器可以以 31.25 倍的速度回放监控视频,并结合 ManicTime 来回顾当日内容。要轻松实现 VLC 的高倍速播放,可以在「菜单栏」->「视图」中开启「状态栏」。此外,通过剪映,可以达到 100 倍的播放速度。\"]},\"6\":{\"h\":\"时间管理\",\"t\":[\"GTD 的存在是让大脑清空不混乱目的,明确知道下一步应该做什么。GTD 流程依次为捕获(Capture),明晰(Clarify),组织(Organize),回顾(Reflect),执行(Engage)。\",\"执行时,将 GTD 按功能与目的划分为多个清单。\",\"收集箱(Inbox)\",\"执行清单(@Context task)\",\"等待清单(\\\"Waiting for\\\" task)\",\"项目清单(\\\"Plan project\\\" plan)\",\"可能清单(Someday/maybe)\",\"参考资料(Reference)\",\"回收箱(Trash)\",\"当任务捕获到收集箱后,参考下方的固定流程将其整理不同的清单中。\",\"GTD 任务转移到清单\",\"从 GTD 流程角度,执行任务和计划。\",\"GTD 流程步骤\",\"GTD 工具原本用的是 Microsoft To Do,「我的一天」功能非常适合聚焦,但有次出现了同步问题,就转用滴答清单。滴答清单除基础 Todo 功能外,还能用日视图管理具体时间安排,添加跨天长时间任务,并在日历、看板和甘特图中查看。\",\"滴答清单的缺点也很明显,功能过于追求全,功能打磨得不够细节,无法满足定制需求。比如,没有任务跳过功能,对于循环任务只能点完成,导致记录与实际不符;跨越多天的任务不想在「今天清单」中出现出现,但一直在提醒,导致无法清空;过滤器逻辑单一,筛选元素教少。如果你的任务都可以一天内完成,不需要记录持续多天的计划,不需要买滴答的高级会员,基础功能足够满足你了。\",\"本节内容来自 Topbook 的 GTD 自我管理 - 时间管理教程,改变了我对 GTD 的认知,把事情做好,而不是把事情做完。建议完整阅读。\"]},\"7\":{\"h\":\"日常习惯\",\"t\":[\"锚点\",\"在我……\",\"我会……\",\"庆祝\",\"20s 休息提示\",\"拿下眼镜,画板上添笔画后\",\"深蹲 15 个\",\"双手肘向后\",\"5mins 休息提示\",\"拿下眼镜,画板上添笔画后\",\"重力拉伸 15 次,2 组\",\"双手肘向后\",\"上完厕所\",\"洗好手,画板上添笔画后\",\"俯卧撑 15 个\",\"双手肘向后\",\"出书房\",\"画板上添笔画后\",\"俯卧撑 15 个\",\"双手肘向后\",\"午餐\",\"放下碗筷\",\"吃维生素\",\"想象自己发光\",\"午睡\",\"打开大排灯\",\"设置 30 分钟的闹钟\",\"想象自己发光\",\"洗澡\",\"打开花洒\",\"深蹲 15 个\",\"哼歌\",\"刷完牙\",\"放下牙刷\",\"俯卧撑 15 个\",\"双手肘向后\",\"晚上\",\"上床\",\"伸展并触碰脚趾;读书\",\"想象自己发光\",\"睡觉\",\"关灯\",\"打开白噪音\",\"想象自己发光\",\"休息选项:喝口水、洗脸、看看窗外、眼部按摩仪、按摩头皮。\",\"运动选项:跳绳、有氧拳击、B 站轻度健身操(Jo 姐?)。\",\"睡眠知识:睡眠时的体温理想情况下会比正常体温低二到三度,因此睡前应尽量降低低温,避免激烈运动。同时,手机屏幕等产生的光线会非常影响睡眠,建议尽量避免睡前使用手机。睡醒后应尽快暴露在室外,让自然光线把身体唤醒,只需要短短十分钟。\"]},\"8\":{\"h\":\"美容仪器\",\"t\":[\"为了避免家里的美容仪器闲置浪费,我制定了定期使用计划。(请勿参考型号购买)\",\"按摩椅 + 眼部按摩仪 + belulu hikari LED 彩光美容仪,模式 A「嫩肤」10 分钟,模式 B「祛痘」8 分钟。\",\"Panasonic EH-SA96 蒸面喷雾器:每周两次喷雾蒸面,需变压器转接。\",\"射频仪:每周使用 1-2 次 RF 射频,10 分钟一次,除皱紧肤,射频后敷面膜或蒸面补水。 \",\"Tripollar STOP RF 射频美颜仪,Dr. Bauer Eye Reshaping RF System II(涂抹适量 Elixir 导入霜于眼周,去黑眼圈)\",\"YAMAN 嫩肤美容仪 + LaboLabo Lotion + HABA G-LOTION,用于精华导入导出。\",\"使用前,请除下身上所佩戴之饰物,如戒指、手表、颈饰、手链、耳环或一切以金属制造的仼何配件,并于涂抹导入霜后彻底洁净及抹干双手,才可进行疗程。可按个人皮肤状况及需要,选择合适疗程温度,普通可设置等级「2」,疗程温度随等级设置而增加。\",\"睡前淋浴有助于快速入睡↩︎\"]},\"9\":{\"h\":\"健身计划\",\"t\":[\"早餐必吃,午餐吃饱,晚餐少吃且不吃主食。\",\"消除饥饿感:10 秒内原地高抬腿快跑 20 次!当你进行快速跑的时候,肌肉的糖分会补充到血液中,产生给身体增加糖分的错觉。大脑就以为你吃饭了,饥饿感也被消除了。\",\"晨间锻炼使用八段锦(12mins)热身。每天保持 9000 步,日常做凯格尔运动。下午 3 点进行重训或 HITT,晚上做睡前瑜伽。\"]},\"10\":{\"h\":\"K 歌减肥\",\"t\":[\"K 歌减肥容易吵到邻居,没找到隔音口罩,用发泄壶代替。\",\"每天唱三首歌,选择 key 比较高、换气多的歌效果会更好。比如三天三夜、死了都要爱......这些听起来就感觉会唱断气的歌。非母语的美声唱法所消耗的热量最大。唱歌的时候要一边按住 E 点,一边用力发声唱歌。\",\"E 点位置\",\"喊叫减肥:臀桥的同时,将眼睛、鼻孔和嘴巴都用尽全力张到最大,然后气沉丹田,用力地怒吼出声:啊——啊——啊!啊!啊!喊的时候一定要用全力,一直叫,叫足 3 分钟。如果声音过大,可以咬毛巾,降低音量。\",\"喊叫减肥动图\",\"该方法类似于上面的《卡拉 OK 健康法》,里面提到唱 K 不仅可以增加肺活量,还有瘦身作用。这原理就和瑜伽中常用的腹式呼吸法差不多,利用腹部肌肉收缩,促进新陈代谢,吸收脂肪分解时所需的氧气,从而达到减肥效果。\"]},\"11\":{\"h\":\"坐立减肥\",\"t\":[\"研究者开创了一种名叫比目鱼俯卧撑(SPU)的方式,可以在数个小时内将局部的氧化代谢提升到很高的水平。我们平时在站立和步行时都会用到比目鱼肌,而所谓的比目鱼肌俯卧撑就是尽最大可能使用这块肌肉。方法也很简单,如下方动图所示,你坐着的时候双脚处于放松状态,然后提起后脚跟,脚趾仍然需要紧贴地面不动。\",\"比目鱼俯卧撑演示图\",\"当你的后脚跟提到极限的时候,小腿的肌肉会产生紧张拉伸的感觉,然后你会自主地放松,将脚后跟放回地面。这样就完成了一次 SPU。\"]},\"12\":{\"h\":\"健身理论\",\"t\":[\"早餐一定要吃!吃早餐的人比不吃早餐的人更容易减少体重。因为在睡觉的时候,身体的新陈代谢会减慢,而只有在你再次进食的时候,它才会回升。所以,如果你跳过早餐不吃,身体消耗卡路里的能力在午餐前都无法达到正常水平。这也就是为什么新的一天最好从一顿拥有 300 ~ 400 卡路里的早餐开始,它能立刻把你的新陈代谢带入「工作状态」。另外,早餐应该尽量多食用些高纤维食物。习惯吃高热量早餐的人更容易很快感到饥饿;而高纤维碳水化合物的消化和吸收时间更长,不会导致身体里血糖的迅速改变,你自然也就不那么容易饿了。\",\"高于或者低于靶心率 142~154 的运动算无效运动,基本没有减脂的作用。所以说,神马仰卧起坐瘦小腹,蹬腿瘦大腿都是扯淡,那些运动都达不到有氧运动的下限,根本燃烧不了脂肪。可进行适当的拉伸运动,开始 HIIT,然后用 5 分钟整理运动结束训练,然后接着进行全面的拉伸。\"]},\"13\":{\"h\":\"每周健身 4 小时\",\"t\":[\"早上半小时内要吃早餐,饭前 60 个深蹲或推墙俯卧撑。早餐:蛋、小扁豆、菠菜。\",\"别吃水果,水果的糖分太多,可以一天一个牛油果\",\"瓶颈期时,加大蛋白摄入,早餐吃 3 个鸡蛋\",\"晚上冰敷:冰袋放在脖子后部和上斜方肌附近,保持 20 ~ 30 分钟。\",\"早饭前、睡前:各 5 ~ 10 分钟的冷水澡。先用热水把整个身体淋湿,大概用时 1~2 分钟。然后,用洗发水洗头、用洗面奶洗脸,把淋浴调成完全的冷水清洗头发和脸部,身体别的部分先别碰冷水。洗干净后,转身,背对淋浴喷头,让水浇在你的后脖颈下方和背部上方的区域,保持这个姿势 1 ~ 3 分钟不动。然后,转过身,正常清洗身体就可以了。\"]},\"14\":{\"h\":\"室内健身\",\"t\":[\"注意\",\"本部分的内容,我不确定其来源,也未加以理解和消化,仅将其作为参考资料。\",\"如果你只是想降低体重,提高身体素质,那么 Slim in 6 和 P90 已经够了,可以来回多刷几周目,如果你还想对自己进行更深入的训练,那么就可以试试 Les Mills BodyCombat 和 T25,如果需要挑战自己,P90X 和 insanity 在等着你。\",\"在锻炼过程中,先把动作做标准,而不是勉强去跟上视频的动作数量,当你觉得自己需要休息,就停一下,不要 over do it,做好热身和关节保护,锻炼期间吃好睡好。\"]},\"15\":{\"h\":\"Slim in 6\",\"t\":[\"这是一套专门针对无运动基础、体重基数大、身体状态较差的人的健身操,没有太剧烈的动作,基本没有跳跃动作,非常注意对膝盖等关节的保护,各种动作里糅合了大量拉伸,教练非常 nice。课程不复杂,只有三套主题操和一个核心肌肉附加训练和一个拉伸附件训练,每一套主题操反复做两周然后进入下一套,附加训练视自己的情况逐渐加入主题操之后。这套操好评如潮,无数购买者在官网留下评论表示坚持这套操给自己的身体带来了显著的良性变化,体重明显降低、线条更优美、体态更匀称等等......\",\"我上手便是做这套,但是虽然看的时候觉得也还挺容易的,真正做起来也并不是那么轻松,但是难度真的控制得很好,很多动作的难度和频率都刚好在让你觉得“吃力但是咬一咬牙就坚持下来并且很有成就感”的程度,这套操所需的东西仅仅是一张大一点的瑜伽垫,几条拉力绳,几个平方的空地,在哪都能做,我就是在办公室利用中午时间做的。\",\"当然这套操也有缺点,一个是从第二套主题操开始时间变得很长,如果做完附件训练,需要大概 1 个多小时,第三套更长一些。一个是相对比较枯燥,每天重复同样的动作,容易厌烦,这也是为什么我只做到第四周的一般就放弃的原因之一,另一个原因是我肩膀比较弱,这个操又有大量的保持手臂平举的动作......\",\"但是这三周多的效果是很明显的,我的体重有接近 5 公斤的下降幅度,最重要的是肺活量和肌肉力量有了很明显的提高,为进入下一步打好了基础。我推荐所有从零开始或者长期不运动的同学从这套操开始恢复,我相信如果能坚持做完六周,你们会感谢我的推荐的。\",\"哦,对了,这套操有很多深蹲动作,大家做的时候一定要注意正确的姿势,保护好膝盖。\"]},\"16\":{\"h\":\"P90\",\"t\":[\"注意,这个是 P90 而不是 P90X,虽然只差一个字,但是难度有天壤之别,都是金牌教练豪顿的作品,P90 是他整个健身操系列的基石,也是面对缺乏运动基础的人来设计的,同样有很好的评价,这套训练是一天有氧一天肌肉抗阻训练的模式,但是强度都比较低,肌肉抗阻训练比起健身房差很远,但是对刚起步的人来说很合适。这套训练我没有系统性地做过,在放弃 Slim in 6 之后短暂地做过几天,因为跳的动作比较多,而且我不是很喜欢豪顿那样的块状肌肉,也没有打算进军 P90X,而且当时我的身体状态做 P90 已经感觉不到太大的效果了。\",\"P90 和 Slim in 6 一样,只需要一块垫子,哑铃或者拉力绳就可以做,推荐想进入 P90X 的同学从这个开始,这套操的难度和强度与 Slim in 6 是很接近的。\"]},\"17\":{\"h\":\"Les Mills BodyCombat\",\"t\":[\"到我最喜欢的部分了,这是莱美健身房推出的一套搏击操,这套操总体上强度高于上面两个,这套操一共有十三个视频,分别是有氧搏击系列,HITT 系列和核心肌肉训练系列,然后根据每天做的视频不同,编排了三个 60 天的课程表,难度一个大于一个,我只做完了第一个。我之所以喜欢这套操的原因如下:跳跃动作不多、非常好玩、教练帅气逼人。\",\"这套操比起前面两个需要的空间略大,因为有一些滑步动作和一些各个方向的踢腿动作,但是也只是略大,器械也就是部分课程需要两只哑铃而已。这套操的有氧搏击部分我个人认为是最精华所在,它将拳击、跆拳道、泰拳等格斗技术的一些基础动作编排在一起,通过各种出拳、踢腿、顶膝等动作大量消耗热量,而且非常好玩,脑补能力稍微强一点的,提高一点中二值,一节课很容易就过去了。\",\"这套操的难度体现在 HITT 和核心肌肉训练部分,开始出现急速提高心率的剧烈动作和组合型动作,比如俯卧撑跳跃深蹲再跳趴俯卧撑,这部分需要锻炼者有不错的肺活量和肌肉力量基础,不然会承担比较高的运动受伤风险。\",\"推荐有了基础的大家来做这一套,我每天在办公室做完真的是全身湿透,桌子地板都要擦一遍,哪哪都是汗水,非常爽。\"]},\"18\":{\"h\":\"T25\",\"t\":[\"这个的难度与 Les Mills BodyCombat 相仿,是大名鼎鼎的熊 T,也就是可怕的 insanity 健身操的教练推出的一套难度低于 insanity 的训练计划,你可以把他看做简化版的 insanity,里面的很多动作都会在 insanity 里面出现,只是频率和强度没那么大。\",\"这套在我刷完 Les Mills BodyCombat,进军 insanity 之前做过,真的很累,因为这套计划有很多都是 HIIT,短时间高强度的重复动作,比如 30 秒急速高抬腿马上接 30 秒虎跳之类的,但是 HIIT 的效果是非常明显的,坚持一段时间可以让你的身体素质在原有基础上进入一个新的阶段。\",\"对于所有想进军 insanity 的朋友,真诚推荐这一套作为预热,如果能很好地掌控这套,那么在 insanity 里你肯定能坚持下去。\"]},\"19\":{\"h\":\"P90X 和 insanity\",\"t\":[\"把这两个放在一起,是因为它们在家庭训练计划界的地位实在是难分伯仲,大名鼎鼎的腹肌撕裂者就出自 P90X 的项目,而 insanity 更是让无数家庭健身者得到了梦寐以求的良好身体素质和美妙的身体线条。首先 P90X 我没有做过,原因和我不喜欢 P90 是一样的,我不喜欢豪顿那样的块状肌肉,所以对 P90X 里面大量的独立肌群抗阻训练无感,而 insanity 的熊 T 很少设计单一肌肉的训练动作,都是大量的 HIIT 和核心肌肉训练,更注重整体的塑造。\"]},\"20\":{\"h\":\"LearnHubs\",\"t\":[\"开源工具、效率方法、心理学探索的自我提升笔记\"]},\"21\":{\"h\":\"✨ 初衷\",\"t\":[\"曾经,我采用了 Notion、Obsidian 和 飞书 等多款知识管理工具来存储我的心得与笔记。然而,这种方式导致我的资料分散,难以管理和分享。\",\"更重要的是,笔记里的知识并不属于你,只有经过消化、应用,才会成为我们的财富。\",\"为此,我基于 VuePress 和 vuepress-theme-hope 构建了 LearnHubs ,将我所有的笔记与文章聚合到同一页面形成知识库,便于集中管理和分享。\",\"笔记 + 文章 = LearnHubs 知识库\",\"笔记/博客自动化发布\"]},\"22\":{\"h\":\"🧱 笔记结构\",\"t\":[\"置顶:日常习惯、健身、阅读;\",\"软件应用:常用应用、Chrome 扩展和相关教程;\",\"Docker 服务:NAS 和服务器上的后端应用,主要以 Docker 方式部署;\",\"系统问题:Windows 系统优化和相关问题;\",\"代码编程:常用代码的学习和使用笔记,页面开发攻略和网站相关的工具和知识收集;\",\"生活角落:说明书、生活记录和小技巧;\",\"博客汇总:聚合所有博客文章,以分类、标签、时间轴等方式进行组合。\"]},\"23\":{\"h\":\"🍥 搭建 LearnHubs\",\"t\":[\"首先,进入 LearnHubs 项目页,点击右上角「Use this template」后选择「Create a new repository」。\",\"接着,进入项目仓库的「Settings」>「Actions」>「General」,选中底部 Workflow permissions 中的 Read and write permissions,然后点击保存即可。如果未授权,GitHub Page 部署会由于 repo 权限不足而报错 failed with exit code 128。\",\"接下来,请进入菜单栏顶部的「Actions」>「最新的 workflow」,并点击右上方的「Re-run jobs」>「Re-run all jobs」,以重新生成网页。若部署正确,GitHub 将自动搭建 gh-page 分支页面。\",\"需要注意的是:如果你不需要将网页部署同步到个人服务器,请删除 .github/workflows/main.yml 中 Sync files 区块的代码,否则会出现报错 Error: Input required and not supplied: server。\",\" ### 没有服务器的话,请删除本区块代码,防止报错 ### # 将页面推送到服务器,timeout 时间从默认的 1 分钟调整到 10 分钟。 - name: 📂 Sync files uses: SamKirkland/FTP-Deploy-Action@v4.3.4 with: local-dir: docs/.vuepress/dist/ server: ${{ secrets.ftp_host }} username: ${{ secrets.ftp_username }} password: ${{ secrets.ftp_password }} port: ${{ secrets.ftp_port }} # 建议更改默认的 21 端口 timeout: 600000 ### 没有服务器的话,请删除本区块代码,防止报错 ### \",\"然后点击「Settings」, 修改 Repository name 为 用户名.github.io。假设你的仓库链接是 https://github.com/xxx/LearnHubs,那么中间的 xxx 就是你的用户名。如果该仓库名称已被使用,GitHub Pages 将无法正常显示样式,请查看页面底部的常见问题来设置子域名。\",\"在同一页面选择「Settings」>「Pages」>「Build and deployment」>「Branch」, 将 gh-page branch 设为 GitHub Pages 的来源,网站运行目录默认为 /(root)。设置完成后,点击「Save」。如果找不到 gh-pages 分支,可以按照上面提到的第三步进行操作,或在 GitHub 中修改任意文件以手动触发 GitHub Action,等待其执行完成后,再重新设置 Pages 的来源。\",\"设置成功后,页面会提示访问链接:https://xxx.github.io/。此时,你的知识库就已经搭建完成了。\",\"如果未出现访问链接提示或不能打开 GitHub Pages,则删除 docs/_posts 路径下的博客文章。这是因为 GitHub Pages 有时会对旧文章里的代码报错。\",\"注意:如果出现报错 Error: Input required and not supplied: server,请删除 .github/workflows/main.yml 中 Sync files 区块的代码,以避免出现报错。\"]},\"24\":{\"h\":\"🔣 配置 LearnHubs\"},\"25\":{\"h\":\"文档结构\",\"t\":[\"LearnHubs 网站的配置和文本都存放在 docs 文件夹中。文章和页面的配置可参考主目录下的 samplepage.md。其中,order 参数表示侧边栏的顺序,数字越小越靠前,支持非整数和负数。我个人的偏好是将非干货或随想短文的 order 设置在 -0.01 到 -0.99,将干货类长文的 order 设置在 -1 到负无穷。每次新增文章都会在上一篇的基础上递减 order 值。这种设置使我能随时记录低于 1000 字的短文,同时不会影响那些寻求干货文章的用户体验,因为干货文章的排序始终保持在最上方。\",\"docs 目录结构如下:\",\"docs |── .vuepress # 网站配置 │ ├── config.ts # 网站环境依赖和网站属性 │ ├── sidebar.ts # 侧边栏 │ ├── navbar.ts # 导航栏 │ ├── theme.ts # 主题和插件 │ └── templateBuild.html # 网页模板,网站关键词和统计 |── _posts # 博客文章目录 ├── _temp # 草稿箱 ├── reading # 读书笔记 ├── anyname # 自定义笔记 ├── blog.md # 博客页面 └── intro.md # 博主个人介绍 \",\"docs/.vuepress 路径下是网站的配置文件,我已添加了详细的注释。你可以参考注释和 vuepress-theme-hope 配置案例来调整配置。请在 docs/.vuepress/sidebar.ts 文件中修改文件夹路径,后台会自动抓取路径下的 md 文件来生成侧边栏。docs/.vuepress/theme.ts 有评论插件的相关配置。\",\"注意:\",\"LearnHubs 默认使用了 algolia 全文搜索。如果你没有使用 algolia 爬虫,则可以在 docs/.vuepress/config.ts 文件中删除 plugins 下的 docsearchPlugin 区块,网站将转用本地全文索引搜索。\",\"docs/_temp 文件夹默认不同步到 GitHub 上。你可以手动在本地建立 _temp 文件夹,用来存放草稿。\",\"自 VuePress2 的 beta.54 版本开始,文件夹名前缀为 _ 在生成链接时将被省略,例如文章路径为 /_posts/,但网页链接路径会是 /posts/。\"]},\"26\":{\"h\":\"看板娘\",\"t\":[\"LearnHubs 集成了看板娘 Live2D Widget,支持随机对话、切换人物服饰和玩打飞机游戏,能提升网站美观度和趣味性。如果不需要看板娘,可以删除 docs\\\\.vuepress\\\\public 下的 live2d-widget 文件夹。\",\"如果网站部署在子页面 https://xxx.github.io/yyy,则需将子页面路径 yyy 加入到以下两个文件:\",\"将 docs\\\\.vuepress\\\\public\\\\live2d-widget\\\\autoload.js 文件第三行的 const live2d_path = \\\"/live2d-widget/\\\" 修改为 const live2d_path = \\\"/yyy/live2d-widget/\\\"。\",\"将 docs\\\\.vuepress\\\\templateBuild.html 文件中看板娘区块代码
    \"]},\"546\":{\"h\":\"本地压缩 HTML\",\"t\":[\"html-minifier 能在本地批量压缩 HTML、CSS 和 JavaScript 源码。\",\"# 全局安装 html-minifier npm install html-minifier -g # 终端中执行压缩命令,默认压缩 input 下所有文件,压缩选项参照 http://kangax.github.io/html-minifier/ html-minifier --collapse-boolean-attributes --collapse-whitespace --decode-entities --no-html5 --minify-css true --minify-js true --process-conditional-comments --process-scripts text/html --remove-attribute-quotes --remove-comments --remove-empty-attributes --remove-optional-tags --remove-redundant-attributes --remove-script-type-attributes --remove-style-link-type-attributes --remove-tag-whitespace --sort-attributes --sort-class-name --trim-custom-fragments --use-short-doctype --input-dir D:\\\\Backup\\\\raw --output-dir D:\\\\Backup\\\\1 \",\"开源 JavaScript 插件和库↩︎\"]},\"547\":{\"h\":\"JavaScript\",\"t\":[\"JavaScript 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言,最新标准是 ECMAScript 6.0。虽然它是作为开发 Web 页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,并长年居于最受欢迎编程语言排行榜榜首。\",\"推荐学习流程:「JavaScript」>「ES6」>「TypeScript」。\"]},\"548\":{\"h\":\"ES6\",\"t\":[\"sayHi(){console.log(\\\"Hi\\\");} 等同于 sayHi:function(){console.log(\\\"Hi\\\");}。\",\"let 声明的变量只在 let 命令所在的代码块内有效,尤其适合用于 for 循环的计数器。\",\"const 声明一个只读的常量,一旦声明,常量的值就不能改变。\",\"=> 是指箭头函数,是一种函数的简写方式,语法为 (参数)=>{函数体};。\",\"x => 2x //等于下方函数 function (x) { return 2x; } \"]},\"549\":{\"h\":\"数据结构\",\"t\":[\"Set 类似于数组,但是成员的值都是唯一的,没有重复的值。向 Set 加入值的时候,不会发生类型转换。\",\"// 例一 const set = new Set([1, 2, 3, 4, 4]); [...set] // [1, 2, 3, 4] // 例二 const items = new Set([1, 2, 3, 4, 5, 5, 5, 5]); items.size // 5 \",\"Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。\",\"Map 的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键。因此有时看起来是针对同一个键,但实际上这是两个不同的数组实例,内存地址是不一样的,因此 get 方法无法读取该键,返回 undefined。\"]},\"550\":{\"h\":\"常用函数\",\"t\":[\"document.getElementById() document.getElementsByClassName(\\\"v-modal\\\")[0] document.getElementsByTagName(\\\"body\\\")[0].remove(); //通过 Tagname 获取元素,删除指定元素 for (var i=0;i\\\");} //循环语句,i++会在代码被执行后增加一个值 break; //跳出当前循环但继续函数 //js 暂停 while (true){ //100 毫秒延时 setTimeout(f1,100) //直接跳出循环和函数 return; } //截取中间的字符串,A 有多少字符就需要加多少位置 str = str.substring(str.indexOf(\\\"A\\\") + 1,str.indexOf(\\\"B\\\")) //取特定字符前后的字符串 var ture_tkl01 = taokouling.value.trim().split('打')[0]; //取第 4 位后的字符串 (4 代表开始位置,相当于从 5 开始截取到尾部) var ture_tkl = ture_tkl01.substring(4); //报错处理 function f1(){ try{ if (document.getElementById(\\\"pro-operation\\\").getElementsByClassName(\\\"product-button02 disabled\\\")[0].innerHTML.indexOf(\\\"立即申购\\\")!=-1) { window.location.reload(); }else{ window.location.reload(); } }catch(e){ //下单 document.getElementById(\\\"product-operation\\\").getElementsByClassName(\\\"product-button02\\\")[0].click(); } } //js 函数为同步处理,只有 if else、setTimeour、for each 等函数才能按序运行 //setInterval 不要包含多个函数,否则 clearInterval 容易出错 //替换,不添加/g,则替换只发生一次 text.value = text.value.replace(\\\" \\\", \\\"----\\\"); //全局替换,如果使用/\\\\s/g,则换行符也会被替换 text.value = text.value.replace(/ /g, \\\"----\\\"); //载入完成后,自动或取焦点。textSour 为元素 id,需配合 jquery window.onload = function(){ textSour.focus(); }; //按钮点击后使用函数 $(\\\"#clearEmoji\\\").click(function () { } //去除每行首尾空格,支持特殊字符,首尾的空格、制表符、特殊字符的组合都倍清除 strResult += split_result[i].replace(/(^[\\\\t\\\\s]*)|([\\\\t\\\\s]*$)/g, \\\"\\\") + '\\\\n'; \"]},\"551\":{\"h\":\"JavaScript 对象\",\"t\":[\"对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。 对象一定要用英文冒号来注明,否则整段代码失效。属性由逗号分隔:\",\"var person={firstname:\\\"John\\\", lastname:\\\"Doe\\\", id:5566}; //对象属性有两种寻址方式 name=person.lastname; name=person[\\\"lastname\\\"]; //对象的方法定义了一个函数,并作为对象的属性存储。对象方法通过添加 () 调用 (作为一个函数)。

    \"]},\"552\":{\"h\":\"全局变量\",\"t\":[\"js 的全部变量要用 window. 来定义。如果变量在函数内没有声明(没有使用 var),该变量为全局变量。\",\"局部变量:在函数中通过 var 声明的变量。全局变量:在函数外通过 var 声明的变量。\",\"没有声明就使用的变量,默认为全局变量,不论这个变量在哪被使用。\",\"

    \"]},\"553\":{\"h\":\"变量类型\",\"t\":[\"当您声明新变量时,可以使用关键词 \\\"new\\\" 来声明其类型:\",\"var carname = new String(); 字符串; var x = new Number(); 数字; var y = new Boolean(); 布尔; var cars = new Array(); 数组; var person = new Object(); 对象; var y = new String(\\\"John\\\"); 对象; // 数据赋值 var length = 16; // Number 通过数字字面量赋值 var points = x * 10; // Number 通过表达式字面量赋值 var lastName = \\\"Johnson\\\"; // String 通过字符串字面量赋值 var cars = [\\\"Saab\\\", \\\"Volvo\\\", \\\"BMW\\\"]; // Array 通过数组字面量赋值 var person = { firstName: \\\"John\\\", lastName: \\\"Doe\\\" }; // Object 通过对象字面量赋值 \"]},\"554\":{\"h\":\"运算符\",\"t\":[\"//后置++是将自身的值赋给新变量,然后才自身加 1. //前置++是将自身加 1 的值赋值给新变量,同时自身也加 1; int a; a=i++;//将 i 的值赋值给 a,即 a=i;然后再执行 i=i+1;也就是【a=i++;】与【a=i; i=i+1;】等价。 a=++i;//将 i+1 的值赋给 a,即 a=i+1;然后再执行 i=i+1;也就是【a=++i;】与【a=i+1;i=i+1;】等价。 \",\"// 描述 (x=5) 比较 // == 等于 x==8 false x==5 true // === 绝对等于(值和类型均相等) x===\\\"5\\\" false x===5 true // != 不等于 x!=8 true // !== 不绝对等于(值和类型有一个不相等,或两个都不相等) x!==\\\"5\\\" true x!==5 false && 且 || 或 \"]},\"555\":{\"h\":\"JavaScript 应用\"},\"556\":{\"h\":\"取随机值\",\"t\":[\"//[任意随机值](https://www.runoob.com/w3cnote/js-random.html) Math.floor(Math.random() * (max - min + 1) + min); // var arr01 = textSour.value.split(\\\"\\\\n\\\"); //分割字符数组,主要用于淘口令网 var arr01 = [\\\"打\\\", \\\"哒\\\", \\\"达\\\"]; //循环语句,i++会在代码被执行后增加一个值 for (var x = 0; x < arr01.length; x++) { //存在循环后分割,并跳出循环 if (taokouling.value.indexOf(arr01[x]) != -1) { ture_tkl01 = taokouling.value.trim().split(arr01[x])[0]; break; } } // https://segmentfault.com/q/1010000006819233 //不重复获取 for (var i = 0; i < rn; ++i) { var index = ~~(Math.random() * count) + i; result[i] = split_result[index]; split_result[index] = split_result[i]; count--; strResult = strResult + result[i] + \\\"\\\\n\\\"; } \"]},\"557\":{\"h\":\"文本框清空\",\"t\":[\"input 文本框获取焦点后,自动清空内容。\",\"onfocus = \\\"this.value=''\\\"; \"]},\"558\":{\"h\":\"内部文件读取\",\"t\":[\"以下代码用于服务器读取文档,本地无法直接使用。\",\"$.ajax({ url: \\\"./xx.txt\\\", success: function (result) { var strs = result.split(\\\"\\\\n\\\"); addTableTR(strs, true); }, }); \"]},\"559\":{\"h\":\"选择框状态\",\"t\":[\"调用 attr 给选择框 radio、checkbox 添加 checked 属性和移调,并不能真实改变不能单选和选中框的真实状态,可用下方代码改变。[1]\",\"//取消导航项的 checked,同类名称都会取消 checked 状态 $(\\\"input[name=daoruRadio]\\\").prop(\\\"checked\\\", false); //点击对映 id 的单选框 $(\\\"input[id=Radio1]\\\").prop(\\\"checked\\\", true); \"]},\"560\":{\"h\":\"复制隐藏内容\",\"t\":[\"clipboardjs 可复制隐藏区域内容。\",\"//新设将粘贴板设在特定按钮上,#copyresult 为按钮 id,#CopyValue 为区域 id var clipboard2 = new ClipboardJS(\\\"#copyresult\\\", { text: function () { return $(\\\"#CopyValue\\\").val(); }, }); clipboard2.on(\\\"success\\\", function (e) { toastr[\\\"success\\\"](\\\"复制成功!\\\"); }); clipboard2.on(\\\"error\\\", function (e) { toastr[\\\"error\\\"](\\\"复制失败,请手动重新复制!\\\"); }); \"]},\"561\":{\"h\":\"引入 html 页面\",\"t\":[\"利用 link 标签的 rel=import 引入 html 页面\",\" \"]},\"562\":{\"h\":\"视频全屏弹窗\",\"t\":[\"品牌首页经常需要在动加载视频,可将下方代码放入首页源码的 body 区。\",\" \",\"插入视频代码\",\"
    \",\"radio、checkbox 选中状态研究↩︎\"]},\"563\":{\"h\":\"Markdown\",\"t\":[\"Markdown 是一种轻量级标记语言,易读易写,并对于图片、图表、数学式都有支持,目前许多网站与应用都支持了 Markdown。\",\"Markdown 入门:Markdown 基本撰写和格式语法,Markdown 转 HTML 语法介绍\"]},\"564\":{\"h\":\"图片尺寸\",\"t\":[\"md 格式调整图片尺寸,在不同编辑器中显示效果不同,不一定会生效。使用 html 格式调整图片尺寸能确保成功率。\",\" ![同时设置宽度和高度](https://files.mdnice.com/logo.png =150x150) ![只设置宽度,推荐使用百分比](https://files.mdnice.com/logo.png =40%x) ![name](https://docsify.js.org/_media/icon.svg \\\"图片说明\\\") \",\"七牛云图床提供图片流量优化压缩策略,可用于调整图片的分辨率、大小和格式,具体参数请参考七牛云图片高级处理。此外,我还会定期使用 PP 鸭对图床中的图片进行重新压缩。\",\" ?imageMogr2/thumbnail/!60p ?imageMogr2/thumbnail/500x ?imageMogr2/thumbnail/500x/strip/quality/50/format/webp \"]},\"565\":{\"h\":\"资料引用\",\"t\":[\"文章中加 ^[引用内容] 会在底部自动添加引用资料。如果想添加链接标题,则为 ^[[标题](链接)]。\",\"如果同一引用要在多个地方使用,则需要手动编号。\",\"这是一条引用 [^1] 这是一条引用 [^2] 这是一条引用 [^1] 这是一条引用 [^3] [^1]:链接 [^2]:[标题](链接) [^3]:
    ![图片描述](图片链接) \"]},\"566\":{\"h\":\"代码块自动换行\",\"t\":[\"自动换行需要 css 支持,暂不能自动启用。\"]},\"567\":{\"h\":\"整段删除线\",\"t\":[\"~~ 只支持对本行内容添加删除线。\",\"如果要对大段内容添加删除线,可以用 HTML 标签 ,被该标签包围的内容会全部添加删除线。VuePress 暂不支持该代码,会将标签识别为不完整而报错。\"]},\"568\":{\"h\":\"Python\",\"t\":[\"Python 很久没用了,暂时只做记录作用。\"]},\"569\":{\"h\":\"入门文档\",\"t\":[\"Python3 语法\",\"Scrapy 入门 浮点数:1.23x109 就是 1.23e9,或者 12.3e8,0.000012 可以写成 1.2e-5\",\"requests 模块 - 获取数据\",\"BeautifulSoup4 模块 - 解析 HTML\",\"openpyxl 模块 - 读写 Excel 文件\",\"Pillow 模块 - 图片\",\"re 模块 - 正则表达式\"]},\"570\":{\"h\":\"简单示例\",\"t\":[\"import requests #载入指定库 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:63.0) Gecko/20100101 Firefox/63.0', 'Content-Type': 'text/html; charset=utf-8'} r = requests.get(\\\"\\\", headers=headers) #r.encoding = 'utf-8' #如果没设置表头,可以设置编码防止中文出现乱码 r.encoding = r.apparent_encoding #使用网页固定编码 print(r.text) print(r.headers) from bs4 import BeautifulSoup soup = BeautifulSoup(r.text, \\\"html.parser\\\") print(soup.title.string) from PIL import Image # 打开一个 jpg 图像文件,注意是当前路径 im = Image.open('test.jpg') # 获得图像尺寸 w, h = im.size print('Original image size: %sx%s' % (w, h)) # 缩放到 50% im.thumbnail((w//2, h//2)) print('Resize image to: %sx%s' % (w//2, h//2)) # 把缩放后的图像用 jpeg 格式保存 im.save('thumbnail.jpg', 'jpeg') \",\"if __name__ = \\\"__main__\\\" 是只在主程序中运行,如果是作为模块引用,则不运行。sys.path.append(\\\"c:\\\\\\\\\\\\\\\\Python37\\\\\\\\\\\\\\\\test) 添加模块的搜索路径文件夹。\\\\\\\\ 在 Pythone 中会转义,所以要输入两个。\"]},\"571\":{\"h\":\"基础语法\",\"t\":[\"# end=\\\" \\\"为后缀,可空,默认为换行符 print(\\\"密码不能含有“*”,你还有\\\",count,\\\"次机会\\\", end=\\\" \\\") # ''' 三引号可以用多行,或在每行后添加 \\\\\\\\ ,或每行用引号括起来 type(a) #判别变量种类,容易出问题,不要用于判定 isinstance(a,float) #判断变量是否是该类型,主要使用 # s 为字符串 s.isalnum() #所有字符都是数字或者字母,为真返回 True, 否则返回 False s.isalpha() #所有字符都是字母,为真返回 True, 否则返回 False s.isdigit() #所有字符都是数字,为真返回 True, 否则返回 False s.islower() #所有字符都是小写,为真返回 True, 否则返回 False s.isupper() #所有字符都是大写,为真返回 True, 否则返回 False s.istitle #所有单词都是首字母大写,为真返回 True, 否则返回 False s.isspace #所有字符都是空白字符,为真返回 True, 否则返回 False \"]},\"572\":{\"h\":\"序列类型\",\"t\":[\"#列表 list =[1,2,3,\\\"a\\\",\\\"b\\\"] list.append([4,1]) list =[1,2,3,\\\"a\\\",\\\"b\\\",[4,1]] #append() 函数是方法向列表的尾部添加一个新的元素 #元组 tuple = (1,2,3,\\\"a\\\",\\\"b\\\") tuple = (1,) #元组只有一个元素时,必须在后面加逗号 #字符串 set() 是个集合函数,括号里的参数可以是字典类型,列表类型,元组类型,字符串类型,不能是数字类型。 s1 = \\\"abc123\\\" s2 = \\\"abc,123\\\" s2.split(\\\",\\\")) #字符串分割后变为列表,使用逗号进行分割 [\\\"abc\\\",123] print(\\\"|\\\".join(list)) #join 只能对字符串进行操作,用\\\"|\\\"中的符号连接字符串,比如 ab r1 = range(1, 4) #集合是无序列的,每次出现顺序都不同,不支持按索引提取 set() set1 = set(list) =([1,2,3,\\\"a\\\",\\\"b\\\"]) college1 = {\\\"哲学\\\", \\\"经济学\\\", \\\"法学\\\"} print(college1) #每次集合排列顺序是随机的 college2 = set([\\\"哲学\\\", \\\"经济学\\\", \\\"法学\\\"]) #将其他数据转换为集合 #字典 dict() {} \"]},\"573\":{\"h\":\"字符串用法\",\"t\":[\"len(string) #返回字符串长度 join(seq) # 以指定字符串作为分隔符,将 seq 中所有的元素 (的字符串表示) 合并为一个新的字符串 startswith(str, beg=0,end=len(string)) #检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果 beg 和 end 指定值,则在指定范围内检查。 endswith(suffix, beg=0, end=len(string)) # 检查字符串是否以 obj 结束,如果 beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False. count(str, beg= 0,end=len(string)) # 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数 find(str, beg=0 end=len(string)) #检测 str 是否包含在字符串中,如果指定范围 beg 和 end,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回 -1 rfind(str, beg=0,end=len(string)) #类似于 find() 函数,不过是从右边开始查找。 index(str, beg=0, end=len(string)) # 跟 find() 方法一样,只不过如果 str 不在字符串中会报一个异常。 rindex( str, beg=0, end=len(string)) #类似于 index(),不过是从右边开始。 strip([chars]) #在字符串上执行 lstrip() 和 rstrip(),移除头尾指定字符 replace(old, new [, max]) #把 将字符串中的 str1 替换成 str2,如果 max 指定,则替换不超过 max 次。 split(str=\\\"\\\", num=string.count(str)) #num=string.count(str)) 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num 个子字符串 splitlines([keepends]) #按照行 ('\\\\\\\\r', '\\\\\\\\r\\\\\\\\n', \\\\\\\\n') 分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。 lower() #转换字符串中所有大写字符为小写。 upper() #转换字符串中的小写字母为大写 swapcase() #将字符串中大写转换为小写,小写转换为大写 \"]},\"574\":{\"h\":\"运算符\",\"t\":[\"运算符\",\"描述\",\"实例\",\"%\",\"取模 - 返回除法的余数\",\"21 % 10 输出结果 1\",\"**\",\"幂 - 返回 x 的 y 次幂\",\"10**21 为 10 的 21 次方\",\"//\",\"取整除 - 返回商的整数部分\",\"9//2 输出结果 4 , 9.0//2.0 输出结果 4.0\",\"优先级:not > and > or not 1 or 0 and 1 or 3 and 4 or 5 (not 1) or (0 and 1) or (3 and 4) or 5\",\"Python 运算符优先级\"]},\"575\":{\"h\":\"条件三元表达式\",\"t\":[\"x, y = 4, 5 if x < y: small = x else: small = y # 可以缩略为下面一句 small = x if x < y else y x,y,z=6,5,5 if x 4 \",\"#条件循环参考,用户只有三次输入错误,内容中包含“*”不计算在内 count=3 password=\\\"xxxxdfd\\\" while count: # 0 为 False,其他为 True passwd = input(\\\"请输入密码:\\\") if passwd == password: print(\\\"密码正确,进入程序\\\") break elif \\\"*\\\" in passwd: # end=\\\" \\\"为后缀,可空,默认为换行符 print(\\\"密码不能含有“*”,你还有\\\",count,\\\"次机会\\\", end=\\\" \\\") continue else: print(\\\"密码错误,你还有\\\",count-1,\\\"次机会\\\", end=\\\" \\\") count-=1 \"]},\"577\":{\"h\":\"range() 函数\",\"t\":[\"range(stop)\",\"range(start, stop[, step])\",\"range 函数具有一些特性:\",\"如果 step 参数缺省,默认 1;如果 start 参数缺省,默认 0。\",\"如果 step 是正整数,则最后一个元素(start + i _ step)小于 stop。\",\"如果 step 是负整数,则最后一个元素(start + i _ step)大于 stop。\",\"step 参数必须是非零整数,否则抛出 VauleError 异常。\"]},\"578\":{\"h\":\"向列表添加元素\",\"t\":[\"向列表添加元素\",\"list =[1,\\\"xxxx\\\",3.14,[1,3,3]] list.append(3) # 添加元素 list.extend([1,2,\\\"或\\\"]) # 添加列表 list.insert(index, obj) # index -- 对象 obj 需要插入的索引位置 (从 0 开始 ); obj -- 要插入列表中的对象。 list.remove(\\\"xxxx\\\") # 删除第一个含有相同内容的元素 del list[2] #删除指定索引位置的元素 list.pop(obj=list[-1]) #obj -- 可选参数,从列表要移除指定索引位置的对象,默认为最后以为,返回被移出的元素对象 list.reverse() #将列表彻底反转 list.sort() #从小往大排训 list.sort(reverse=True) #从大往小排序 将指定列表的小甲鱼改为小鱿鱼 list1 = [1, [1, 2, ['小甲鱼']], 3, 5, 8, 13, 18] list1[1][2][0] = '小鱿鱼' \"]},\"579\":{\"h\":\"列表切片\",\"t\":[\"L = ['Google', 'Runoob', 'Taobao']\",\"L(start: stop[: step]) step 可以使用负数,从尾部往左走。\",\"结果 Python 表达式\",\"结果\",\"描述\",\"L[2]\",\"'Taobao'\",\"读取列表中第三个元素\",\"L[-2]\",\"'Runoob'\",\"读取列表中倒数第二个元素\",\"L[1:]\",\"['Runoob', 'Taobao']\",\"从第二个元素开始截取列表\",\"L[:]\",\"['Google', 'Runoob', 'Taobao']\",\"获取完整列表\",\"元祖 tuple 与列表 list 用法类似,但元祖不能直接修改元素,只能用切片的方法来修改\",\"temp=(1,\\\"xxxxx\\\",\\\"迷途\\\",2) #元祖 temp=temp[:2]+(“y”,)+temp[2:] del temp #删除元祖 \"]},\"580\":{\"h\":\"列表解析\",\"t\":[\"list1 = [x**2 for x in range(10)] #list1 为 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] #相当于 list1 = [] for x in range(10): list1.append(x**2) >>> list1 = [(x, y) for x in range(10) for y in range(10) if x%2==0 if y%2!=0] #相当于 list1 = [] for x in range(10): for y in range(10): if x%2==0: if y%2!=0: list1.extend([(x,y)]) print(list1) \"]},\"581\":{\"h\":\"变量\",\"t\":[\"Python 变量是贴标签,而非存储数据\",\"list1=[1,3,2,9,7,8] list2=list1[:] list3=list1 # list2 和 list3 的值此时相同,但一旦对 list1 内部进行调整,比如排序、增减变量 list1.sort() # list3 会随着 list1 发生变化,list2 不变 \",\"lambda、filter、map\",\"g=lambda x,y : x+y g(3,4) 7 list(filter(lambda x:x%2,range(10))) #过滤 0-9 中能整除 2 的数字 list(map(lambda x : x%2, range(10))) #罗列 0-9 每个数字乘 2 的结果 \"]},\"582\":{\"h\":\"Coding\",\"t\":[\"代码编程的学习路径:\",\"基础知识:ES6, MySQL,HTML,Markdown,正则表达式\",\"脚本/开发工具:AutoHotkey,Electron\",\"编程语言:TypeScript 4.x + JavaScript\",\"前端框架:Vue 3.x\",\"构建工具:Vite 2.x\",\"路由工具:Vue Router 4.x\",\"状态管理:Vuex 4.x\",\"UI 框架:Element Plus\",\"CSS 预编译:Stylus / Sass / Less\",\"CSS 后处理器:PostCSS,tailwindcss\",\"Node.js 框架:Midway\",\"HTTP 工具:Axios\",\"Git Hook 工具:husky + lint-staged\",\"代码规范:EditorConfig + Prettier + ESLint + Airbnb JavaScript Style Guide\",\"提交规范:Commitizen + Commitlint\",\"单元测试:vue-test-utils + jest + vue-jest + ts-jest\",\"自动部署:GitHub Actions\",\"Documate:用于在文档网站中嵌入人工智能聊天对话框,根据内容回答用户问题。中间会调用 OpenAI API 用于回答问题。\"]},\"583\":{\"h\":\"Visual Studio Code\",\"t\":[\"本地代码编辑器使用 Visual Studio Code,其插件生态成熟,能实现大部分的需求。\",\"GitHub Copilot,CodeGeeX,Tabnine,aiXcoder 插件均可以辅助补全代码。Tabnine 和 aiXcoder 有免费版,可以预测一到两行的代码。CodeGeeX 由清华大学开发,提供完整补全功能。\"]},\"584\":{\"h\":\"修改快捷键\",\"t\":[\"选择「菜单栏」>「文件」>「首选项」>「键盘快捷方式」,修改或解绑快捷键。\",\"以 PicGo 图床为例,其默认配置放置于 %AppData%\\\\picgo\\\\data.json,推荐快捷键为\",\"剪贴板图片上传:ctrlOrCmd+alt+q\",\"打开文件管理器上传:ctrlOrCmd+alt+e\",\"打开输入框输入路径上传:ctrlOrCmd+alt+x\",\"另外,右键对应快捷方式,点击「重置按键绑定」,即可将快捷键设为默认。\"]},\"585\":{\"h\":\"排除文件夹\",\"t\":[\"在 VS Code 中点击快捷键 Ctrl/Command+Shift+P,输入「setting」,在设置中添加排除文件夹选项。注意:排除文件夹不能使用全路径,只能使用规则排除。\",\"\\\"files.exclude\\\": { \\\"**/blog\\\": true, //隐藏指定文件夹 \\\"**/[Pp]lugins\\\": true, //使用中括号时表示不区分大小写 \\\"**/*.pyc\\\": true, //隐藏所有 pyc 文件 \\\"**/*.d.ts\\\": true, //隐藏所有 d.ts 文件 } \"]},\"586\":{\"h\":\"在线 IDE\",\"t\":[\"在线 IDE 最大的优势是开箱即用,无需搭建环境,避免本地环境错误导致的各类 bug。\",\"StackBlitz:StackBlitz 界面类似 Visual Studio Code,可以直接 push 和拉取 GitHub 仓库的代码进行查看和编辑,项目支持离线开发,同时所有应用程序会自动部署在其服务器上。[1]\",\"CodePen:CodePen 是一个在线的 HTML、CSS 和 JavaScript 代码编辑器,能够编写代码并即时预览效果,便于项目分享预览。CodePen 也一个庞大的前端社区,上面有来自全球开发者分享的各种各样炫酷的效果,并且这些代码都是开源和共享的。\",\"CodeSandbox:CodeSandbox 编辑体验与 VSCode 类似,并支持 GitHub 导出、静态文件托管、本地项目导入等。缺点:不能直接导入 GitHub 项目。\",\"六个好用的在线代码编辑器,你选哪个?↩︎\"]},\"587\":{\"h\":\"正则表达式\",\"t\":[\"正则表达式,又称规则表达式,是使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。\",\"正则入门:正则 30 分钟入门,LEARN REGEX 中文版\"]},\"588\":{\"h\":\"实用表达式\",\"t\":[\"{} 限定符 (表示固定位数)。比如:\\\\\\\\d{5} 匹配长度有 5 个的数字,\\\\\\\\d{1,5} 最少匹配 1 个,最长匹配 5 个数字。\",\".{30,} 指匹配长度 30 以上的任意字符串。\",\"[aeiou] 匹配中括号中任意字符。[^aeiou] 匹配除了 aeiou 这几个字母以外的任意字符。\",\"HTTP 链接匹配:https?://[^\\\\s\\\"。?,,?)#]+,句尾不含空格、中英文逗号、中文句号、问号,仅包含 http 和 https 链接\",\"万能链接匹配:[a-zA-Z]+://[^\\\\s\\\"。?,,?)#]+ 匹配万能前缀,如 ftp、tencent、lark。\",\"匹配行:\",\"//匹配含某个字符的行 var ZZMactch = \\\".*\\\" + inputMatch.value + \\\".*\\\"; //匹配不含指定字符的行 var ZZMactch = \\\"^((?!\\\"+inputMatch.value+\\\").)*$\\\"; //匹配所有不包括 CSDN 的行 ^((?!CSDN).)*$ \",\"匹配不同文本组,id= 或 contentId= 后的多个数字符号\",\"(?<=id=)\\\\d* (?<=[?&](id|contentId)=)\\\\d+ \",\"^((?!abc).)*admin((?!abc).)*$ 匹配 不包含 abc 但包含 admin 的字符串,匹配整行。[1]\",\"((?!social.tmall.com)(?!ugc/detail.html).)*$ 匹配不包含 social.tmall.com 和 ugc/detail.html 的字符串,匹配整行。[2]\",\"[₳$¢₴€₤¥$《]([a-zA-Z0-9]{11})[₳$¢₴€₤¥$《] 匹配淘口令,[] 指中内容任意匹配一项皆可。\"]},\"589\":{\"h\":\"前后匹配\",\"t\":[\"前后匹配,前后元素只能出现一次,否则容易覆盖过多。\",\"//匹配任意以 a 开头并以 b 结尾的字符,匹配内容不含 a、b //如果 a 有 n 个,则同一行也会匹配 n 次 (?<=a).+(?=b) //如果 b 有 n 个,则匹配最后一个 b; //如果需要匹配第一个 b,则匹配区加懒惰限定符?,代表重复 1 次或更多次,但尽可能少重复 (?<=.*a).+?(?=b) //匹配任意以 a 开头并以 b 结尾的字符,匹配内容包含 a、b a(?<=a).+(?=b)b //匹配字符串中 a 和词组 abc 间的字符,如果 abc 不存在则去尾部 (?<=.*a).+(?=abc) \"]},\"590\":{\"h\":\"正则替换\",\"t\":[\"正则全局替换不能带 \\\\\\\\,此时用分割替换更方便。\",\"var str = \\\"dogdogdog\\\"; var str2 = str.replace(/dog/g,\\\"cat\\\"); #全局替换 var str2 = str.split(\\\"dog\\\").join(\\\"cat\\\"); #分割替换 \"]},\"591\":{\"h\":\"表达式修饰符\",\"t\":[\"元字符:区分大小写\",\"常用正则代码\",\"说明\",\".\",\"匹配除换行符以外的任意字符\",\"*\",\"匹配 0 个或多个.(有多少匹配多少,贪婪模式)\",\"?\",\"匹配 0 个或 1 个 (至少匹配一个)\",\"$\",\"以什么结尾的,如\\\\\\\\d+0$ (以 0 结尾)\",\"^\",\"以什么开头的,如^http匹配以 http 开头的字符串\",\"\\\\w\",\"匹配字母或数字或下划线或汉字\",\"\\\\W\",\"匹配任意不是字母,数字,下划线,汉字的字符\",\"\\\\d\",\"匹配数字\",\"\\\\D\",\"匹配任意非数字的字符\",\"\\\\s\",\"匹配任意的空白符(空格 ,制表符 )\",\"\\\\S\",\"匹配任意不是空白符的字符\",\"\\\\r\",\"回车符\",\"\\\\n\",\"换行符 (一般情况下使用\\\\r\\\\n 匹配回车换行)\",\"\\\\t\",\"制表符,Tab\",\"\\\\u4e00-\\\\u9fa5\",\"非中文\",\"常用分组语法\",\"分类\",\"代码/语法\",\"说明\",\"捕获\",\"(exp)\",\"匹配 exp,并捕获文本到自动命名的组里\",\"(?exp)\",\"匹配 exp,并捕获文本到名称为 name 的组里,也可以写成 (?'name'exp)\",\"(?:exp)\",\"匹配 exp,不捕获匹配的文本,也不给此分组分配组号\",\"零宽断言\",\"(?=exp)\",\"匹配 exp 前面的位置\",\"(?<=exp)\",\"匹配 exp 后面的位置\",\"(?!exp)\",\"匹配后面跟的不是 exp 的位置\",\"(? // component:传递参数必须为 `modelValue`,传递方法必须为 `update:modelValue` app.component('counter', { props: ['modelValue'], methods: { handleClick() { this.$emit('update:modelValue', this.modelValue + 3); }, }, template: `
    {{modelValue}}
    `, }); // v-model 传递多个参数 count 和 count1 // template // component app.component('counterx', { props: ['count', 'count1'], methods: { handleClick2() { this.$emit('update:count', this.count + 1); }, handleClick3() { this.$emit('update:count1', this.count1 + 10); }, }, template: `
    {{count}}
    {{count1}}
    `, }); \"]},\"595\":{\"h\":\"组件命名\",\"t\":[\"全局组件,建议「小写字母单词,单次间用横线间隔」;局部组件,建议「每个单次都用大写字母开头(驼峰命名)」。按这个规则命名,Vue 才能自动转换。\",\"// Vue 会自动将 Counter(局部组件)转为 counter(全局组件),将 HelloWorld(局部组件)转为 hello-world(局部组件)。 const Counter = { data() { return { count: 1, }; }, template: `
    {{count}}
    `, }; const HelloWorld = { template: `
    hello world
    `, }; const app = Vue.createApp({ // 引入局部组件(需放在引入之前) components: { // 手动定位 // counter: Counter, // 'hello-world': HelloWorld, Counter, HelloWorld, }, template: `
    11111111 222222
    `, }); \"]},\"596\":{\"h\":\"CDN 使用 vue\",\"t\":[\"
    {{ message }}
    \",\"使用
    来引入 html 元素,功能类似于 innerHTML,不能加载外部 HTML,实现 类似的功能。\"]},\"597\":{\"h\":\"云计算服务\"},\"598\":{\"h\":\"CDN\",\"t\":[\"国内服务器带宽限制较高,高带宽按量付费,随着访客数量的增加,费用也会急剧上升。而固定流量宽带,网站打开速度明显变慢。为减少服务器的带宽压力,可将静态文件、图片放在 CDN 上托管,而非服务器上。\"]},\"599\":{\"h\":\"静态文件\",\"t\":[\"静态文件原本使用公开资源库,但国外库有被不稳定,国内又有时碰上服务崩溃,访问速度慢。最终还是选择自建部署 oss.gpt-vip.top。\"]},\"600\":{\"h\":\"图床\",\"t\":[\"自建图床的成本并不高,只需续费域名就能确保图片的长期保存。我目前使用七牛云配合 Picgo 来搭建图床,每月费用大约十几元。\",\"曾经尝试过将第三方图床作为临时图床,但仅三天后,图片就全部失效了,导致了大量图片的丢失。这次经历让我深刻认识到,即使是临时需求,也不应依赖第三方图床。\"]},\"601\":{\"h\":\"全站加速\",\"t\":[\"使用 CDN 全站加速,能实现用户就近访问,不过也存在些问题。\",\"一个 CDN 只能为一个域名加速,加速的域名即为目标域名。\",\"CDN 服务商可能要求使用其自有 DNS,比如阿里云。\",\"如果加速区域选择「全球(不包含中国内地)」。国内用户会访问国外 CDN 节点,而非国内的源站服务器。\",\"迁移阿里云 DNS 时,注意关闭静态协议跟随回源,否则会网站重复调整。\"]},\"602\":{\"h\":\"第三方服务\"},\"603\":{\"h\":\"Vercel\",\"t\":[\"Vercel 是一家提供开发、预览和部署网页前端的云平台服务商。它主要用于前端项目,不原生支持 PHP 和 node 项目,每月提供 100G 免费流量。\",\"如果你的项目超出流量,可以参考 How do I use a Cloudflare domain with Vercel?,使用 CloudFlare 进行代理,但需注意检查是否出现过多重定向。在国内可能定位到被屏蔽的 CloudFlare 节点,从而导致有时无法访问。Vercel 现已支持国内电话认证。如流量超出不多,可切换账户部署。\"]},\"604\":{\"h\":\"fly.io\",\"t\":[\"Fly.io 是一家提供容器化部署的服务商,能根据流量动态调整资源。由于国内无法部署 Google Auth,因此我将认证服务放在 Fly.io 上,使用了两台 shared-cpu-1x@512MB 的机器,每月账单 1.5 刀。但不清楚是不是配置不够,fly.io 的机器很容易报错。\",\"# 初次构建 fly launch # 部署,官方建议开两台机器 flyctl deploy # 将机器内存改为 512 fly scale memory 512 # 控制机器数量,默认为 2 fly scale count 2 # 无法连接docker,则使用 fly wireguard websockets enable \"]},\"605\":{\"h\":\"CloudFlare Tunnel\",\"t\":[\"CloudFlare Tunnel 可作为 NAS 的轻量级扩展,一个 Tunnel 能将多个服务托管到不同的子域名。具体部署流程,请参考 CloudFlare Tunnel 免费内网穿透的简明教程。需注意,该服务与宝塔的官方 Docker 镜像存在冲突,因此不要同时使用。\",\"目前,我已通过 CloudFlare Tunnel 部署了 RSS 订阅源、GoogleAuth、PodCast 等服务。\",\"# 本地 Dockerfile 架构镜像 sudo docker build -t strapiauth . sudo docker run -d -p 1337:1337 --name strapiauth strapiauth # tunnel sudo docker run --name cloudflaretunnel cloudflare/cloudflared:latest tunnel --no-autoupdate run --token \"]},\"606\":{\"h\":\"腾讯云境外\",\"t\":[\"腾讯云香港已无轻量服务器供应,但可购买新加坡、日本的服务器。价格实惠,2 核 2G,30M 宽带,每月 33 元。但国内连接速度较慢,仅适合境外用户。\"]},\"607\":{\"h\":\"Cloudflare\",\"t\":[\"官方文档:Cloudflare Docs\",\"Cloudflare 云端代理后,能帮加速国内访问国外网站的速度。比如,notion 的个人博客用 Cloudflare 代理,原本速度很慢,使用 Cloudflare 后加速明显。\",\"但 Cloudflare 免费计划不支持单独子域名托管,需要完整域名托管。\"]},\"608\":{\"h\":\"反向代理\",\"t\":[\"Cloudflare Workers 反向代理不适合 google 和 cloudflare cdn 网站,其他网站大都可以。\"]},\"609\":{\"h\":\"镜像整个网站\",\"t\":[\"// 替换成你想镜像的站点 const upstream = \\\"www.youtube.com\\\"; // 如果那个站点有专门的移动适配站点,否则保持和上面一致 const upstream_mobile = \\\"www.youtube.com\\\"; // 你希望禁止哪些国家访问 const blocked_region = [\\\"RU\\\"]; // 禁止自访问 const blocked_ip_address = [\\\"0.0.0.0\\\", \\\"127.0.0.1\\\"]; // 替换成你想镜像的站点 const replace_dict = { $upstream: \\\"$custom_domain\\\", \\\"//www.youtube.com\\\": \\\"\\\", }; //以下内容都不用动 addEventListener(\\\"fetch\\\", (event) => { event.respondWith(fetchAndApply(event.request)); }); async function fetchAndApply(request) { const region = request.headers.get(\\\"cf-ipcountry\\\").toUpperCase(); const ip_address = request.headers.get(\\\"cf-connecting-ip\\\"); const user_agent = request.headers.get(\\\"user-agent\\\"); let response = null; let url = new URL(request.url); let url_host = url.host; if (url.protocol == \\\"http:\\\") { url.protocol = \\\"https:\\\"; response = Response.redirect(url.href); return response; } if (await device_status(user_agent)) { upstream_domain = upstream; } else { upstream_domain = upstream_mobile; } url.host = upstream_domain; if (blocked_region.includes(region)) { response = new Response( \\\"Access denied: WorkersProxy is not available in your region yet.\\\", { status: 403, } ); } else if (blocked_ip_address.includes(ip_address)) { response = new Response( \\\"Access denied: Your IP address is blocked by WorkersProxy.\\\", { status: 403, } ); } else { let method = request.method; let request_headers = request.headers; let new_request_headers = new Headers(request_headers); new_request_headers.set(\\\"Host\\\", upstream_domain); new_request_headers.set(\\\"Referer\\\", url.href); let original_response = await fetch(url.href, { method: method, headers: new_request_headers, }); let original_response_clone = original_response.clone(); let original_text = null; let response_headers = original_response.headers; let new_response_headers = new Headers(response_headers); let status = original_response.status; new_response_headers.set(\\\"access-control-allow-origin\\\", \\\"*\\\"); new_response_headers.set(\\\"access-control-allow-credentials\\\", true); new_response_headers.delete(\\\"content-security-policy\\\"); new_response_headers.delete(\\\"content-security-policy-report-only\\\"); new_response_headers.delete(\\\"clear-site-data\\\"); const content_type = new_response_headers.get(\\\"content-type\\\"); if (content_type.includes(\\\"text/html\\\") && content_type.includes(\\\"UTF-8\\\")) { original_text = await replace_response_text( original_response_clone, upstream_domain, url_host ); } else { original_text = original_response_clone.body; } response = new Response(original_text, { status, headers: new_response_headers, }); } return response; } async function replace_response_text(response, upstream_domain, host_name) { let text = await response.text(); var i, j; for (i in replace_dict) { j = replace_dict[i]; if (i == \\\"$upstream\\\") { i = upstream_domain; } else if (i == \\\"$custom_domain\\\") { i = host_name; } if (j == \\\"$upstream\\\") { j = upstream_domain; } else if (j == \\\"$custom_domain\\\") { j = host_name; } let re = new RegExp(i, \\\"g\\\"); text = text.replace(re, j); } return text; } async function device_status(user_agent_info) { var agents = [ \\\"Android\\\", \\\"iPhone\\\", \\\"SymbianOS\\\", \\\"Windows Phone\\\", \\\"iPad\\\", \\\"iPod\\\", ]; var flag = true; for (var v = 0; v < agents.length; v++) { if (user_agent_info.indexOf(agents[v]) > 0) { flag = false; break; } } return flag; } \"]},\"610\":{\"h\":\"镜像网站指定目录\",\"t\":[\"// 你要镜像的网站。 const upstream = \\\"objectstorage.ap-seoul-1.oraclecloud.com\\\"; // 镜像网站的目录,比如你想镜像某个网站的二级目录则填写二级目录的目录名,镜像 google 用不到,默认即可。 const upstream_path = \\\"/test/\\\"; // 镜像站是否有手机访问专用网址,没有则填一样的。 const upstream_mobile = \\\"objectstorage.ap-seoul-1.oraclecloud.com\\\"; // 屏蔽国家和地区。 const blocked_region = [\\\"\\\"]; // 屏蔽 IP 地址。 const blocked_ip_address = [\\\"0.0.0.0\\\", \\\"127.0.0.1\\\"]; // 镜像站是否开启 HTTPS. const https = true; // 文本替换。填你要镜像的网站 const replace_dict = { $upstream: \\\"$custom_domain\\\", \\\"//objectstorage.ap-seoul-1.oraclecloud.com\\\": \\\"\\\", }; // 以下保持默认,不要动 addEventListener(\\\"fetch\\\", (event) => { event.respondWith(fetchAndApply(event.request)); }); async function fetchAndApply(request) { const region = request.headers.get(\\\"cf-ipcountry\\\").toUpperCase(); const ip_address = request.headers.get(\\\"cf-connecting-ip\\\"); const user_agent = \\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36\\\"; let response = null; let url = new URL(request.url); let url_hostname = url.hostname; if (https == true) { url.protocol = \\\"https:\\\"; } else { url.protocol = \\\"http:\\\"; } if (await device_status(user_agent)) { var upstream_domain = upstream; } else { var upstream_domain = upstream_mobile; } url.host = upstream_domain; if (url.pathname == \\\"/\\\") { url.pathname = upstream_path; } else { url.pathname = upstream_path + url.pathname; } if (blocked_region.includes(region)) { response = new Response( \\\"Access denied: WorkersProxy is not available in your region yet.\\\", { status: 403, } ); } else if (blocked_ip_address.includes(ip_address)) { response = new Response( \\\"Access denied: Your IP address is blocked by WorkersProxy.\\\", { status: 403, } ); } else { let method = request.method; let request_headers = request.headers; let new_request_headers = new Headers(request_headers); new_request_headers.set(\\\"Host\\\", url.hostname); new_request_headers.set(\\\"Referer\\\", url.hostname); let original_response = await fetch(url.href, { method: method, headers: new_request_headers, }); let original_response_clone = original_response.clone(); let original_text = null; let response_headers = original_response.headers; let new_response_headers = new Headers(response_headers); let status = original_response.status; new_response_headers.set(\\\"access-control-allow-origin\\\", \\\"*\\\"); new_response_headers.set(\\\"access-control-allow-credentials\\\", true); new_response_headers.delete(\\\"content-security-policy\\\"); new_response_headers.delete(\\\"content-security-policy-report-only\\\"); new_response_headers.delete(\\\"clear-site-data\\\"); const content_type = new_response_headers.get(\\\"content-type\\\"); if (content_type.includes(\\\"text/html\\\") && content_type.includes(\\\"UTF-8\\\")) { original_text = await replace_response_text( original_response_clone, upstream_domain, url_hostname ); } else { original_text = original_response_clone.body; } response = new Response(original_text, { status, headers: new_response_headers, }); } return response; } async function replace_response_text(response, upstream_domain, host_name) { let text = await response.text(); var i, j; for (i in replace_dict) { j = replace_dict[i]; if (i == \\\"$upstream\\\") { i = upstream_domain; } else if (i == \\\"$custom_domain\\\") { i = host_name; } if (j == \\\"$upstream\\\") { j = upstream_domain; } else if (j == \\\"$custom_domain\\\") { j = host_name; } let re = new RegExp(i, \\\"g\\\"); text = text.replace(re, j); } return text; } async function device_status(user_agent_info) { var agents = [ \\\"Android\\\", \\\"iPhone\\\", \\\"SymbianOS\\\", \\\"Windows Phone\\\", \\\"iPad\\\", \\\"iPod\\\", ]; var flag = true; for (var v = 0; v < agents.length; v++) { if (user_agent_info.indexOf(agents[v]) > 0) { flag = false; break; } } return flag; } \"]},\"611\":{\"h\":\"镜像网站带密码访问\",\"t\":[\"// 替换成你想镜像的站点 const upstream = \\\"google.com\\\"; // 如果那个站点有专门的移动适配站点,否则保持和上面一致 const upstream_mobile = \\\"m.google.com\\\"; // 密码访问 const openAuth = false; const username = \\\"username\\\"; const password = \\\"password\\\"; // 你希望禁止哪些国家访问 const blocked_region = [\\\"RU\\\"]; // 禁止自访问 const blocked_ip_address = [\\\"0.0.0.0\\\", \\\"127.0.0.1\\\"]; // 替换成你想镜像的站点 const replace_dict = { $upstream: \\\"$custom_domain\\\", \\\"//google.com\\\": \\\"\\\", }; function unauthorized() { return new Response(\\\"Unauthorized\\\", { headers: { \\\"WWW-Authenticate\\\": 'Basic realm=\\\"goindex\\\"', \\\"Access-Control-Allow-Origin\\\": \\\"*\\\", }, status: 401, }); } function parseBasicAuth(auth) { try { return atob(auth.split(\\\" \\\").pop()).split(\\\":\\\"); } catch (e) { return []; } } function doBasicAuth(request) { const auth = request.headers.get(\\\"Authorization\\\"); if (!auth || !/^Basic [A-Za-z0-9._~+/-]+=*$/i.test(auth)) { return false; } const [user, pass] = parseBasicAuth(auth); return user === username && pass === password; } async function fetchAndApply(request) { if (request.method === \\\"OPTIONS\\\") // allow preflight request return new Response(\\\"\\\", { status: 200, headers: { \\\"Access-Control-Allow-Origin\\\": \\\"*\\\", \\\"Access-Control-Allow-Headers\\\": \\\"*\\\", \\\"Access-Control-Allow-Methods\\\": \\\"GET, POST, PUT, HEAD, OPTIONS\\\", }, }); if (openAuth && !doBasicAuth(request)) { return unauthorized(); } const region = request.headers.get(\\\"cf-ipcountry\\\").toUpperCase(); const ip_address = request.headers.get(\\\"cf-connecting-ip\\\"); const user_agent = request.headers.get(\\\"user-agent\\\"); let response = null; let url = new URL(request.url); let url_host = url.host; if (url.protocol == \\\"http:\\\") { url.protocol = \\\"https:\\\"; response = Response.redirect(url.href); return response; } if (await device_status(user_agent)) { upstream_domain = upstream; } else { upstream_domain = upstream_mobile; } url.host = upstream_domain; if (blocked_region.includes(region)) { response = new Response( \\\"Access denied: WorkersProxy is not available in your region yet.\\\", { status: 403, } ); } else if (blocked_ip_address.includes(ip_address)) { response = new Response( \\\"Access denied: Your IP address is blocked by WorkersProxy.\\\", { status: 403, } ); } else { let method = request.method; let request_headers = request.headers; let new_request_headers = new Headers(request_headers); new_request_headers.set(\\\"Host\\\", upstream_domain); new_request_headers.set(\\\"Referer\\\", url.href); let original_response = await fetch(url.href, { method: method, headers: new_request_headers, }); let original_response_clone = original_response.clone(); let original_text = null; let response_headers = original_response.headers; let new_response_headers = new Headers(response_headers); let status = original_response.status; new_response_headers.set(\\\"access-control-allow-origin\\\", \\\"*\\\"); new_response_headers.set(\\\"access-control-allow-credentials\\\", true); new_response_headers.delete(\\\"content-security-policy\\\"); new_response_headers.delete(\\\"content-security-policy-report-only\\\"); new_response_headers.delete(\\\"clear-site-data\\\"); const content_type = new_response_headers.get(\\\"content-type\\\"); if (content_type.includes(\\\"text/html\\\") && content_type.includes(\\\"UTF-8\\\")) { original_text = await replace_response_text( original_response_clone, upstream_domain, url_host ); } else { original_text = original_response_clone.body; } response = new Response(original_text, { status, headers: new_response_headers, }); } return response; } addEventListener(\\\"fetch\\\", (event) => { event.respondWith( fetchAndApply(event.request).catch((err) => { console.error(err); new Response(JSON.stringify(err.stack), { status: 500, headers: { \\\"Content-Type\\\": \\\"application/json\\\", }, }); }) ); }); async function replace_response_text(response, upstream_domain, host_name) { let text = await response.text(); var i, j; for (i in replace_dict) { j = replace_dict[i]; if (i == \\\"$upstream\\\") { i = upstream_domain; } else if (i == \\\"$custom_domain\\\") { i = host_name; } if (j == \\\"$upstream\\\") { j = upstream_domain; } else if (j == \\\"$custom_domain\\\") { j = host_name; } let re = new RegExp(i, \\\"g\\\"); text = text.replace(re, j); } return text; } async function device_status(user_agent_info) { var agents = [ \\\"Android\\\", \\\"iPhone\\\", \\\"SymbianOS\\\", \\\"Windows Phone\\\", \\\"iPad\\\", \\\"iPod\\\", ]; var flag = true; for (var v = 0; v < agents.length; v++) { if (user_agent_info.indexOf(agents[v]) > 0) { flag = false; break; } } return flag; } \"]},\"612\":{\"h\":\"域名 DNS 托管\",\"t\":[\"国内访问为主的话,域名建议备案后托管在国内厂商。之前试过 Cloudflare,光域名解析就用了 500 ms,换回阿里云后速度稳定许多。\",\"DNS 迁移是在域名管理商处修改。比如我的域名是在阿里云购买,试过 DNS 迁移到 Cloudflare,之后再次迁移 DNS,需要回到阿里云操作。\",\"如果阿里云的安全验证一直被卡住,可以换个浏览器,比如 Firefox。\",\"子域名可以使用 NS 记录,托管到其他域名服务商。但 Cloudflare 不支持单独子域名托管。\",\"域名 DNS 服务器修改(阿里云):https://help.aliyun.com/document_detail/121648.html\"]},\"613\":{\"h\":\"GitHub\"},\"614\":{\"h\":\"GitHub Actions\",\"t\":[\"GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。将 GitHub Actions 命令保存为 main.yml,放于 .github\\\\workflows 目录下,repo 发生指定调节的改变时,Actions 会自动运行。[1]\",\"GitHub Actions 官方市场\",\"Awesome Actions\",\"如果 GitHub Actions 命令中有涉及密码等私密信息,则进入项目仓库的「Settings」>「Secrets and variables」>「Actions」,添加密钥进行加密处理。比如新建密钥 PERSONAL_TOKEN,Actions 命令中使用 ${{ secrets.PERSONAL_TOKEN }} 来指代该密钥。\"]},\"615\":{\"h\":\"不同仓库间复制\",\"t\":[\"复制文件到目的地,文档没变化则不会执行。案例为将当前仓库 main 分支下 docs 的 README.md 文件复制到另一个仓库 libaxuan/LearnHubs/ 路径下,如果目标路径存在相同文件,则将覆盖。如果让 clean: true 生效,Actions 会将目标路径情况,然后执行复制。\",\"此动作需按 Creating a personal access token 建立个人访问令牌,勾选权限「repo Full control of private repositories」,然后将该 token 值其保存在项目仓库的 Action 密钥。\",\"- name: Copy file uses: andstor/copycat-action@v3 with: personal_token: ${{ secrets.PERSONAL_TOKEN }} src_path: docs/README.md dst_path: / dst_owner: rockbenben dst_repo_name: LearnHubs dst_branch: main src_branch: main #clean: true \"]},\"616\":{\"h\":\"Actions 失败重试\",\"t\":[\"在 job 和 step 中使用 if 语句,只有满足条件时才执行具体的 job 或 step。[2]\",\"# 任务状态检查函数 success() # 当上一步执行成功时返回 true always() # 总是返回 true cancelled() # 当 workflow 被取消时返回 true failure() # 当上一步执行失败时返回 true \",\"first_step 会总是执行,second_step 需要上一步 first_step 执行成功才会执行,third_step 只有上一步 second_step 执行失败才执行。当 third_step 与 second_step 命令相同时,就可以达到失败重试的效果了。\",\"jobs: first_job: name: My first job runs-on: ubuntu-latest steps: - name: first_step if: always() - name: second_step if: success() - name: third_step if: failure() \"]},\"617\":{\"h\":\"uses 版本号\",\"t\":[\"uses: SamKirkland/FTP-Deploy-Action@4.3.1:uses 会指定此步骤运行 SamKirkland/FTP-Deploy-Action 存储库中的 4.3.1 版本。\",\"但有时 Actions 的版本不会这么快更新,又必须使用最新版,可以将版本号改为 branch name,比如 uses: SamKirkland/FTP-Deploy-Action@master。\"]},\"618\":{\"h\":\"Git Commit\",\"t\":[\"标准化的 Commit message 可以提供清晰、易读的历史记录,使我们更容易理解每个提交的目的和内容,这有助于追踪和审查代码变更。通过 conventional-changelog-cli 可以自动生成 CHANGELOG.md。建议都按照 Conventional Commits 的规范来进行提交。\",\"[optional scope]: [optional body] [optional footer(s)] \"]},\"619\":{\"h\":\"Type\",\"t\":[\"Type 用于说明 git commit 的类别,只允许使用下面的标识。[3]\",\"feat: 新特性或功能(feature)\",\"fix: 修复 bug\",\"docs: 文档更新(documentation)\",\"style: 代码风格或者组件样式更新(不影响代码运行的变动)\",\"refactor: 代码重构,不引入新功能和缺陷修复\",\"perf: 优化相关,比如提升性能、体验\",\"test: 增加测试\",\"chore: 构建过程或辅助工具的变动\",\"revert: 回滚到上一个版本\"]},\"620\":{\"h\":\"Scope\",\"t\":[\"Scope 用于说明 commit 影响的范围,比如 Controller、DAO、View 等等,视项目不同而不同。如果其中包含了多个 scope,可以使用 * 代替。\"]},\"621\":{\"h\":\"Footer\",\"t\":[\"如果当前代码与上一个版本不兼容,则 Footer 部分以 BREAKING CHANGE 开头,后面是对变动的描述、以及变动理由和迁移方法。[4]\",\"如果当前 commit 针对某个 issue,那么可以在 Footer 部分使用 Closes #265 关闭这个 issue。也可以在任意位置输入 #265,将 commit 与对应问题相关联。\"]},\"622\":{\"h\":\"常见问题\"},\"623\":{\"h\":\"GitHub 忽略指定文件\",\"t\":[\"项目路径新建一个命名为 .gitignore 的文件,将想要忽略的文件夹和文件写入 .gitignore 文件,换行分隔。\",\"比如要忽略 node_modules 文件夹,就直接在文件中输入 node_modules。\"]},\"624\":{\"h\":\"添加 Github 源作为依赖\",\"t\":[\"一般情况下,依赖包会使用 npm 进行管理。但有时开发者可能并不会立即更新到 npm 上,这时我们可以选择使用 GitHub 源作为备用方案。\",\"另外,在国内服务器连接不上 GitHub 的情况下,可以先使用 npm 安装依赖包,然后手动替换 node_modules 目录中对应的源为下载好的文件。\",\"yarn add strapi-google-auth yarn add https://github.com/arjusmoon860/strapi-google-auth.git \",\"了解 GitHub Actions↩︎\",\"最全总结,GitHub Action 自动化部署↩︎\",\"Git Commit 规范↩︎\",\"Commit message 和 Change log 编写指南↩︎\"]},\"625\":{\"h\":\"数据库管理\",\"t\":[\"我的数据库是通过 MySQL 和 phpMyAdmin 进行管理的。本页面将记录遇到的日常问题及其解决办法。\"]},\"626\":{\"h\":\"本地 MySQL 使用\",\"t\":[\"在 Windows 平台上,你需要首先安装 MySQL Server,然后使用数据库软件进行连接。如果你正在使用本地数据库并且没有将 MySQL Server 设为自动启动,那么每次开机后都需要手动启动它。启动步骤如下:右键点击菜单栏最左侧,依次选择「计算机管理」>「服务和应用程序」>「服务」>「MYSQL57」,然后双击以启动。\"]},\"627\":{\"h\":\"数据库恢复\",\"t\":[\"数据库备份是至关重要的工作,一旦数据丢失,恢复起来会非常困难。如果你只想恢复特定的数据库,可以复制数据库的字段内容。在 phpMyAdmin 中,选择你需要的数据库,点击 \\\"SQL\\\",然后将你的 SQL 代码粘贴到执行窗口,最后点击 \\\"Go\\\" 按钮以运行代码。字段的分隔通常以 -- Table structure for table xxx 开始。\",\"如果出现错误 #1217 - Cannot delete or update a parent row: a foreign key constraint fails,这意味着你尝试删除或更新表中的记录,但是这个记录在另一个表中作为外键被引用。如果确实需要进行恢复,可以使用以下命令暂时关闭 MySQL 的外键约束检查:\",\"-- 禁用外键约束检查 SET FOREIGN_KEY_CHECKS=0; -- 执行您的操作... -- 启用外键约束检查 SET FOREIGN_KEY_CHECKS=1; \"]},\"628\":{\"h\":\"数据库启动失败或损坏\",\"t\":[\"在 MySQL 配置文件中,找到 mysqld 行并添加 innodb_force_recovery=4。这个值可以在 0-6 之间调整,数值越大对数据库的损害就越大。在成功启动 MySQL 后,备份所有数据库和管理密码,并将它们下载到本地。\",\"在宝塔面板的「数据库」选项中删除所有数据库,然后卸载并重新安装 MySQL。\",\"重新导入数据库。\"]},\"629\":{\"h\":\"静态部署\"},\"630\":{\"h\":\"静态托管\",\"t\":[\"如果在国内静态资源库找不到所需的静态包,建议使用 npm i 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。\",\"静态资源库:\",\"Staticfile CDN:国内维护最稳定的 CDN。\",\"字节 CDN:测速表现不错,缓存过期时间最长设置一年,而自 2022 年 3 月起,静态资源已不再更新。\",\"emoji 等可以使用静态资源库上的项目,比如 twemoji,上面有集成 png 图片。\"]},\"631\":{\"h\":\"NPM 包\",\"t\":[\"UNPKG:有墙风险且不稳定,默认为最新版本,无需 @latest 标签。 \",\"将静态文件发布为 npm 包,参考一分钟教你发布 npm 包。\",\"加速:在 npm 官方源中搜索包位置,然后使用前缀 https://unpkg.com/。\",\"NPM MIRROR:NPM 项目的国内镜像镜像,不能做静态托管用途。https://registry.npmmirror.com/项目名/版本号 可以看见项目的各种信息,但看不了里面的文件。\",\"UNPKG 镜像:有资源可以用服务器自建服务,反向代理 unpkg。 \",\"饿了么 CDN(已关):国内唯一能用的 npm 镜像,2022.07.13 发现外部访问被拒绝。之前饿了么并没说支持对外,可能已经彻底取消了。使用饿了么 CDN 时,注意 https://npm.elemecdn.com/react@latest/ 需要时间更新,具体频率未知,可固定大版本号来获取更新 https://npm.elemecdn.com/react@^18/。\",\"GitHub:基于 GitHub 公共仓库的资源托管,资源不会失效,但有时需要根据 CDN 服务商而更换域名。 \",\"Statically:jsDeliver 的替代品,在中国大陆所有地区连接异常。\",\"jsDelivr(已墙):速度最快,原本是最稳的,但域名暴雷后,经常断开,2022.06.01 彻底打不开。配合 Github action,更新后自动访问 jsdelivr CDN 缓存刷新链接,保持页面常新。刷新命令参考 curl https://purge.jsdelivr.net/gh/username/project/file。\",\"由于第三方托管过于不稳定,目前我使用自托管 oss.gpt-vip.top。\"]},\"632\":{\"h\":\"部署平台\",\"t\":[\"Cloudflare:Pages 和 Workers 两类部署方式。 \",\"Workers:复制镜像网站,可直接访问,但反向代理稳定性成疑。\",\"Pages:部署简单,外网速度很快,但国内速度不稳,而且 page.dev 域名有时会被墙,可购买便宜的临时域名(一年)来解决该问题。\",\"Netlify:国内速度慢点,图片容易卡死,但还算稳定。\",\"Vercel:推荐使用 GitHub 账户登录,需绑定手机号(不支持 Voice),支持国内手机号。2022.08.26,「*.vercel.app」域名被 DNS 污染,需要绑定自定义域名。\",\"AWS: 邮箱注册,不过需要信用卡认证。\",\"国内平台:Gitee、WuliHub、CODING,都需要实名认证。\"]},\"633\":{\"h\":\"IPFS\",\"t\":[\"IPFS 无需服务器就可建立静态网站,号称永不失效,但国内稳定性成疑问,实用性一般。IPFS 托管在一个网关上,并不会自动复制到所有网关。\",\"pinata 上传网站构建的目录文件夹,上传后,即可通过 IPFS Hash 访问。网站目录中必须有 index.html,否则网页中将显示网站目录。即使有 index.html,其他人在拥有 CID 后,可以通过 IPFS Desktop 来获取网站的完整目录。为确保私密性,建议只上传单文件。使用单文件 CID 视为单一网站,不可调用原目录中的文件。[1]\",\"上传 ipfs 到 pinata 之后,cloudflare 等其他网关不一定会完全复制文件,php 无法抓取加载,所以不建议使用 cloudflare 网关。\",\"cloudflare 接管 pinata 后,ipfs 域名需通过「pinata 托管」>「cloudflare DNS」>「cloudflare SSL」。如果中途将 DNS 指向 http://gateway.pinata.cloud 等非 cloudflare ipfs 网关域名,cloudflare SSL 证书将失效。即便把链接改为非加密的 http,pinata 依然会视之为无效链接而拒绝访问。\",\"对于文件较少且链接有效的域名,可按 Cloudflare IPFS 页面说明来设置 DNS,提交 IPFS 域名 30 分钟后,即可获取 SSL 证书。\",\"添加 CNAME 记录,将你的 IPFS 域名 xxx.example.com 指向 cloudflare-ipfs.com。\",\"_dnslink.xxx.example.com 设置为 dnslink=/ipfs/。\"]},\"634\":{\"h\":\"GitHub 同步到 VPS\",\"t\":[\"代码、文章推送到 GitHub 后,会自动生成可访问的网页,但国内访问 GitHub Pages 的速度极不稳定,为了确保网站能被正常访问,必须增加国内的访问节点。\",\"很多人选择 Gitee Pages 作为国内节点,GitHub Actions 将新文档同步到 Gitee,生成位于国内的静态页面 Gitee Pages。但是,Gitee Pages 的限制非常多,免费版无法自定义域名,必须实名验证,更别提近期的下架风波。因此,我没选 Gitee,而是把文档同步到国内服务器(域名需备案)。\",\"文件夹名称请勿使用大写字母,否则在同步时容易产生错误。\"]},\"635\":{\"h\":\"同步到 FTP\",\"t\":[\"如果你有 FTP 服务器,可使用 FTP-Deploy-Action 将 github 代码推送到服务器上。Actions 步骤参考 GitHub 说明。\",\"on: push name: 🚀 Deploy website on push jobs: web-deploy: name: 🎉 Deploy runs-on: ubuntu-latest steps: - name: 🚚 Get latest code uses: actions/checkout@v3 - name: 📂 Sync files uses: SamKirkland/FTP-Deploy-Action@4.3.3 with: server: ${{ secrets.ftp_host }} username: ${{ secrets.ftp_username }} password: ${{ secrets.ftp_password }} port: ${{ secrets.ftp_port }} # 建议更改默认的 21 端口 \",\"新建 FTP 时,需在云服务商的安全组和服务器上开放 FTP 端口,并临时暂停宝塔系统加固等安全插件(新建 FTP 容易与安全插件冲突)。\",\"如果出现 FTPError: 530 Login authentication failed,则说明 FTP 密码错误或账号不存在,需用 FileZilla 测试 FTP 的有效性。确认 FTP 无效后,检查 FTP 密码是否填写正确,是否只有大小写字母和数字。如果密码错误,则在 github secrets 重新 update 密钥。如果密码正确,则进入 /www/server/pure-ftpd/etc/pureftpd.passwd,检查是否有该 FTP 账户。没有 FTP 账户的话,暂停宝塔系统加固等安全插件后,重新新建 FTP。\",\"如果出现 Error: Timeout (control socket),则说明同步服务器超时,可进入 Actions 页面点击右侧按钮「Re-run all jobs」,重新进行部署。如果错误连续出现,可以尝试关闭防火墙,测试是否 GitHub 服务器被拉黑了。\"]},\"636\":{\"h\":\"SSH 同步\",\"t\":[\"如果你有服务器的 SSH 权限,可以使用 web-deploy 以 SSH 同步方式发布页面。但与 FTP 相比,不确定安全性、速度、时间是否会区别。我尝试连接一直报错 Permission denied (publickey,password)。(有可能是服务器需要非 root 用户,adduser 一直加不上。)\",\"on: push name: Publish Website jobs: web-deploy: name: 🚀 Deploy Website Every Commit runs-on: ubuntu-latest steps: - name: 🚚 Get Latest Code uses: actions/checkout@v3 - name: 📂 Sync Files uses: SamKirkland/web-deploy@v1 with: source-path: docs/.vuepress/dist/ target-server: ${{ secrets.host }} remote-user: ${{ secrets.ssh_username }} private-ssh-key: ${{ secrets.SSH_KEY }} destination-path: ${{ secrets.destination_folder }} ssh-port: ${{ secrets.ssh_port }} # 建议更改默认的 22 端口 \",\"如果出现报错 error in libcrypto,说明 SSH 密钥错误,需要登陆服务器终端,运行以下命令。\",\"ssh-keygen -m PEM -t rsa -b 4096 cat id_rsa.pub >> authorized_keys cat id_rsa \"]},\"637\":{\"h\":\"同步到 oss\",\"t\":[\"如果没有服务器,可以把文件部署在云运营商的云存储上。比如用 aliyun-oss-website-action,将 repo 文件 build 成网站文件,然后同步到阿里云 oss 并运行网站。\",\"name: deploy md to oss on: push: branches: [ \\\"main\\\" ] pull_request: branches: [ \\\"main\\\" ] jobs: build: runs-on: ubuntu-latest steps: # load repo to /github/workspace - uses: actions/checkout@v3 - name: Use Node.js uses: actions/setup-node@v3 with: node-version: '14.x' # 打包文档命令 # - run: npm install yarn@1.22.4 -g # - run: yarn install # - run: yarn docs:build #需要配合 yarn 的 package.json - name: aliyun-oss-website-action uses: fangbinwei/aliyun-oss-website-action@v1.3.0 with: accessKeyId: ${{ secrets.ACCESS_KEY_ID }} accessKeySecret: ${{ secrets.ACCESS_KEY_SECRET }} bucket: learndata-notes # use your own endpoint endpoint: oss-cn-shanghai.aliyuncs.com # 全目录上传 folder: . # 不上传的文件 exclude: | .github/ .gitattributes \",\"How to Easily Host a Website on IPFS↩︎\"]},\"638\":{\"h\":\"服务器 VPS\"},\"639\":{\"h\":\"环境部署\",\"t\":[\"部署应用前,为服务器配置好包管理工具,以便节省部署时间。主流的前端包管理工具有 npm、yarn、pnpm、以及国内的镜像 cnpm、tyarn 等,这些包管理器都是基于 nodejs。\"]},\"640\":{\"h\":\"包管理安装\",\"t\":[\"通过集成了 npm 的 Node.js 来安装 npm,然后执行 npm i 命令安装其他。\",\"全局安装 yarn 是 npm i yarn -g,pnpm 是 npm i pnpm -g。如果不想全局安装,则去除 -g。\"]},\"641\":{\"h\":\"包管理源\",\"t\":[\"包管理源的修改命令类似,将下方的 npm 替换 yarn 或 pnpm 即可修改包管理源。\",\"#查看源 npm config get registry #更换国内源 npm config set registry https://registry.npmmirror.com/ #换回默认源 npm config set registry https://registry.npmjs.org/ \"]},\"642\":{\"h\":\"部署包\",\"t\":[\"npm、yarn 和 pnpm 的包安装及管理命令。\",\"#全局安装 npm i 包 -g yarn global add 包 pnpm add 包 -g #移除全局包 pnpm remove 包 --global #更新全局包 pnpm upgrade 包 --global #升级当前目录的依赖以确保你的项目只包含单个版本的相关包 #本方法能解决大部分的部署报错 npm i && npm update yarn && yarn upgrade pnpm i && pnpm up \"]},\"643\":{\"h\":\"本地测试\",\"t\":[\"有些静态文件不支持直接打开,可以用 anywhere 架构本地服务器来进行测试。\",\"# 安装静态服务 anywhere npm install anywhere -g # 进入静态页面存放目录,执行 anywhere anywhere -p 8081 \"]},\"644\":{\"h\":\"服务器 ECS\",\"t\":[\"服务器系统为 Debian 11,配置包管理器 nodejs 和 yarn。[1]\",\"apt-get update # 从数据源更新软件包的列表,运行产生软件包数据库 apt-get install wget && apt-get install sudo # 安装 wget 和 sudo # 大版本升级必须先建立快照 apt-get upgrade # 更新所有软件包(慎用,不要用!)之前 CentOS 系统错误就是使用了 upgrade 命令。 # 新建用户,非 root 权限 adduser xxx # 为新用户设置密码 passwd xxx # 安装 Node.js 18 和 yarn curl -fsSL https://deb.nodesource.com/setup_18.x | bash - apt-get install -y nodejs sudo apt-get install yarn \",\"如果服务器的 Node.js 安装遇到问题,可以用宝塔面板的 Node.js 版本管理器来进行部署。\"]},\"645\":{\"h\":\"网站重定向\",\"t\":[\"更改 nginx 配置后,nginx 重载配置后实现网站重定向。$1 表示第一个 () 内的正则匹配内容,$2 为第二个。[2]\",\"网站重定向\",\"#隐性链接跳转 location /xx1 {proxy_pass } #404 前,将旧文章链接格式转为新的,使用绝对路径 location ^~ /p{ rewrite ^/p/(.*)$ https://gpt-vip.top/posts/$1.html; } # huginn 设置中 location 添加 301 定向,兼容老路径链接 if ( $request_uri = \\\"/users/1/web_requests/21/guoke.xml\\\" ) { rewrite ^ http://xxx.com/users/1/web_requests/19/guoke.xml permanent; } #只匹配主页,将主页跳转为其中一个子页面 location = / { rewrite https://xxx.com/ permanent; } \"]},\"646\":{\"h\":\"全新安装服务器\",\"t\":[\"安装宝塔面板。\",\"删除阿里云主机监控。\",\"service aegis stop #停止服务 chkconfig --del aegis # 删除服务 \",\"配置阿里云端口开放,导入安全规则。\",\"宝塔上修改默认账号密码,并修改登录 22 的默认 SSH 端口。如果开通了 FTP,修改 FTP 端口。\",\"选择「网站」>「添加站点」,将站点根目录放在 /www/wwwroot/xxx,同时新建数据库。\",\"上传全站文件并解压,然后按照安装提示重新安装一次,最后导入备份数据库。\",\"404.html 起效,宝塔网站配置文件中,删除 error_page 404 /404.html; 中的 #。\",\"SSL 证书设置,开启强制 HTTPS;PHP 版本;301 重定向;添加伪静态设置(metinfo 或其他网站后台有代码)。如果 301 设置失败,直接在「伪静态」配置中,放入跳转代码。\",\"服务器设置参考 NginxConfig 适合新手配置高性能、安全、稳定的 NGINX 服务器的最简单方法。\",\"ECS 宝塔设置优化:\",\"添加计划任务,定期释放内存,建议设置每天释放一次,执行时机为半夜,如:04:00。\",\"打开 Linux 工具箱添加 Swap。Swap 推荐与物理内存相同。\",\"安装 PHP 缓存扩展,尽量使用更高的 PHP 版本,另外安装 opcache(脚本缓存)、redis(内容缓存)、imagemagick、fileinfo、exif。\",\"Redis 优化,在/etc/sysctl.conf 中添加 net.core.somaxconn = 2048,然后终端运行 sysctl -p。\",\"防火墙白名单(自定义),如:添加 url 规则 ^/rss.php 到防火墙 URL 白名单,防止 rss 服务被屏蔽。\"]},\"647\":{\"h\":\"服务器迁移\",\"t\":[\"购买按量付费服务器。\",\"用服务器迁移中心 SMC 将旧服务器同步到临时服务器。\",\"将域名解析到临时系统,确定服务基本正常。\",\"对旧服务器先建立云盘快照,然后更换操作系统,进行全新部署。\",\"对比新旧服务器,确认配置正常。\"]},\"648\":{\"h\":\"网站设计\"},\"649\":{\"h\":\"网站字体\",\"t\":[\"网站为了提高访问速度并保持设计的一致性,通常会选默认字体。这导致网站设计难以突出重点。针对这点,我通常会修改网站的导航栏字体,将其从默认字体改为 思源黑体 - 粗。\",\"进入 iconfont‑webfont,输入导航栏内所有文字,并设置所需字体。\",\"点击「生成字体」后,在选中字体的下方,点击「本地下载」。\",\"将字体包上传到服务器,修改新字体的位置参数。\",\"在导航栏的 class 属性中添加 web-font。\"]},\"650\":{\"h\":\"米拓\",\"t\":[\"早期的动态网站通过米拓开发的,记录:\",\"后台忘记密码,使用 Metinfo 米拓重置工具。\",\"metinfo 新版静态页会删除 index.html,后续都改用 index.php。\"]},\"651\":{\"h\":\"常见问题\"},\"652\":{\"h\":\"CPU 100%\",\"t\":[\"当服务器 CPU 或内存突然飙升 100% 时,依次排除当前运行进程,检查是否安装更新了插件、应用或服务。\",\"如果找不到原因,可以临时设置定期任务。每隔 3 小时重启一次 nginx/apache。有时重启不正常,因此重启命令后 10 秒,再启动一次 nginx/apache。\",\"/etc/init.d/nginx restart sleep 10s /etc/init.d/nginx start \"]},\"653\":{\"h\":\"SSL 证书\",\"t\":[\"如果 SSL 证书部署报错,可以按自动生成来部署。\",\"#证书设置修改 /www/server/panel/vhost/nginx if ($server_port !~ 443){ rewrite ^(.*) permanent; } #证书修改 /www/server/panel/vhost/cert/ #证书位置 /www/server/panel/vhost/ssl \",\"如果同一网站部署了多个域名,并且都需要部署 SSL,则需要在 /www/server/panel/vhost/cert 目录下为每个域名创建独立的证书文件夹。同时,在网站的配置文件中创建两个独立的server配置,确保它们之间有换行。请注意,宝塔面板中的网站配置在重启 Nginx 后有时会被重置,所以请务必进行检查和确认配置的正确性。[3]\"]},\"654\":{\"h\":\"CORS 跨域\",\"t\":[\"POST 表单等操作需要涉及第三方 API,需要添加扩域域名,避免 CORS 报错。\",\" add_header Access-Control-Allow-Origin \\\"*\\\"; add_header Access-Control-Allow-Credentials \\\"true\\\"; add_header Access-Control-Allow-Methods \\\"GET, POST, OPTIONS\\\"; add_header Access-Control-Allow-Headers \\\"DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range\\\"; add_header Access-Control-Expose-Headers \\\"Content-Length,Content-Range\\\"; \"]},\"655\":{\"h\":\"piwik 手动升级\",\"t\":[\"Matomo/Piwik 是免费的统计服务。有时无法使用自动安装包,需要手动升级。\",\"下载最新版应用,并解压到服务器。\",\"将原目录中的 config/config.ini.php 粘贴到新版中,然后就可以更新数据库进行升级了。\",\"选择「设置」>「系统」>「地理位置」,拖到页面底部,按页面要求下载 DBIP 包,并重命名保存为 /www/wwwroot/piwik/misc/DBIP-City.mmdb。\",\"通过包管理器方式安装 Node.js↩︎\",\"Nginx rewrite 设置↩︎\",\"针对宝塔面板一个站点多个域名使用 SSL 证书的解决方案↩︎\"]},\"656\":{\"h\":\"网购攻略\",\"t\":[\"家电先看看闲鱼上是否有代下或代理商渠道,一般会有 5-8 折。\",\"电商平台为了促进购买,有各种购物优惠,但领取优惠环节比较复杂,让人很容易忽略。为了避免这种情况,我把各平台的优惠攻略记录下来,方便查询。\"]},\"657\":{\"h\":\"淘宝\",\"t\":[\"当没有省钱卡和商品优惠券时,使用「一淘 app」下单,拿购物返利。\",\"购物节(618、双 11)的大额券,一定要凑满使用,凑单部分凑好后立即退掉。 \",\"大额券一般有 92 折,可以用于预购,但不能与省钱卡叠加。\",\"购物节日前一天的预购和节日当天,是最优惠时候。 \",\"商家在活动前说的保价,并不包含大额券,不用提前下单。\"]},\"658\":{\"h\":\"拼多多\",\"t\":[\"拼多多的很多商品价格完全不受购物节影响,除了大额消费券外,拼多多通常具有价格优势。\",\"99 以上消费品,记得用拼多多的大额券,拼多多会员分享 3 个好友,即可任意领 99-20 券,大部分产品都适用。\",\"无门槛大额券 - 立减 50,有几率抢到的,同样需要分享,有需要可以试试。\"]},\"659\":{\"h\":\"京东\",\"t\":[\"京东新会员已经没有优惠券了,不过它的以旧换新经常有活动。特别是购物节期间,一般坏的电器也能有 50 的补贴,品类并不需要与新家电完全相同。比如换冰箱,你可以用坏的电饼铛来拿补贴。\"]},\"660\":{\"h\":\"1688\",\"t\":[\"1688 上能找到很多品牌的代工厂,它们未贴牌或自家产品的品质不比大品牌差,但因为剥离了溢价,价格可以便宜不少。不过食品类需注意,代工厂的品质不等于贴牌!贴牌方要求的品质与代工厂的生产的品质不一定一致,原料、品控可能都会更改。[1]\",\"持续消耗类:擦手纸、一次性清洁布、各种清洁液、消毒液、一次性保鲜袋、垃圾网袋等。\",\"日用纺织品:袜子、内裤、秋衣、毛巾、T 恤等。此类产品多为基本款,不追求品质,只要简单舒适即可,剔除品牌溢价。\",\"日化类产品:棉签、发夹、皮筋、肥皂、卸妆纸、洗脸巾等。\",\"医疗防护类消耗品:口罩、一次性手套、防护服等。比如医用外科口罩,原本是 0.5,但阿里巴巴上宇安是 0.08,现在是 0.11-0.12。\",\"食品或食品包装:小零食、保鲜袋、咖啡挂耳包、食品储藏盒等。很多大品牌的零食都不是由品牌自己建厂生产的,而是交给第三方代工。因此,如果能循着线索找到代工厂,就有可能买到物美价廉的产品,参考手把手教你如何找 1688 代工厂天猫店半价买零食(附超全代工厂旗舰店链接)。\",\"数码科技小物:充电宝、TWS 耳机、充电头、充电线等。此类多只有核心功能,须不在意设计、品牌、细节体验。\",\"餐具和文具:餐具的品牌溢价非常高,文具也能获得批发价,即使是知名的进口文具,1688 上也能买到更低价格的正品。\",\"购买技巧:有的时候只需要一件,但是商家两件起发!这种时候选「代发下单」,可能稍贵一点点,但是一件就能发货!\"]},\"661\":{\"h\":\"抢购辅助\",\"t\":[\"Auto.js:免费版不再更新。买了 Pro,但它不支持淘宝等。\",\"八戒任务:按顺序完成多坐标点击,适用秒杀?\",\"冰狐智能辅助:自动构建脚本,需付费,未实际使用,较复杂\",\"喵惠助手:第三方辅助代拍,安全性未知。旧手机上抢购。用旧手机一直挂着。\",\"抢购助手脚本:网页 js 脚本,需搭配浏览器扩展 Tampermonkey。\"]},\"662\":{\"h\":\"BP 模式\",\"t\":[\"BP 即 ByPass,是一键下单的链接,可以跳过商品页缓存、选择尺码规格、结算这一系列繁琐的步骤,直接进入订单确认页,最大限度减少操作和页面跳转带来的延时,为大家抢购带来最快的下单体验。\",\"手机端操作,可以把 BP 链接提前给淘宝/京东里面的好友或客服,到了点再进入下单。\",\"BP 链接均为移动链接,电脑上使用需要提前登录网页。BP 下单时,可以先不付款,先提交锁定订单,然后再支付选择分期方式。\",\"以京东 BP 链接为例:https://p.m.jd.com/norder/order.action?wareId=100033551654&wareNum=1&enterOrder=true,wareId=100012043978 中 100012043978 是商品 ITEM ID,Num=1 中 1 是购买数量。\"]},\"663\":{\"h\":\"购物思考\",\"t\":[\"优惠券、抢购除了是让你下单,也是为了让你成为平台的忠实用户。正如劳力辩证:当你对某事或某人投入了精力和劳力,你也会对他们有更高的评价。而抢购成功,会让人有种不可自拔的快感。\",\"1688「扫货」指南↩︎\"]},\"664\":{\"h\":\"健康饮食\",\"t\":[\"16:8 断时法:每天 8 小时进食,8 点钟早餐,3 点后禁食。\",\"早餐:燕麦牛奶 + 坚果、桃李面包 + 鲜牛奶。每天 3 个坚果(纸核桃)。\",\"午餐:沙拉 + 鸡蛋 + 白肉(鸡、鸭、鱼)。\",\"晚餐:6 点停止进食,饿了吃苹果、沙拉、鸡蛋,鸡蛋只吃蛋白。\"]},\"665\":{\"h\":\"饮食\"},\"666\":{\"h\":\"零食\",\"t\":[\"炸 (烘烤):烘烤预热-200 度,20 分钟,芝士鸡排 (胖)> 泰森上校鸡块> 鸡米花,炸鸡排、牛肉馅饼外面有面粉,不适合烘烤。\",\"安井肉丸:撒尿牛肉丸> 包心鱼丸> 仿墨鱼丸?>牛肉丸> 蟹味宝 + 鱼籽包。安井肉丸质量都不错,不过别买量贩装,这是不同种类。\"]},\"667\":{\"h\":\"饮料\",\"t\":[\"现磨咖啡味道不错,每天用量需控制在 2 杯黑咖啡或 4 杯奶咖,相关数据参考适量喝咖啡对身体有哪些好处?。有时喝的频繁就比较折腾,考虑入手白咖啡,不过据传白咖啡糖分高,而且含反式脂肪酸。\",\"马来西亚的土特产,约有 100 多年的历史。白咖啡并不是指咖啡的颜色是白色的,而是采用特等 Liberia(利比里亚)、Arabica(阿拉比卡)和 Robusta(罗布斯塔)咖啡豆及特级的脱脂奶精原料,经中轻度低温烘焙及特殊工艺加工后大量去除咖啡碱,去除高温碳烤所产生的焦苦与酸涩味,将咖啡的苦酸味、咖啡因含量降到最低,甘醇芳香不伤肠胃,保留咖啡原有的色泽和香味,口感爽滑、纯正,颜色比普通奶咖更清淡柔和,呈现出淡淡的奶金黄色。\",\"夏天喝适合冷泡的绿茶、红茶、白茶、花茶等,而岩茶与普洱生茶冷泡就不容易好喝。[1] 蛮喜欢泰厨的花茶,有新鲜的香茅,但淘宝卖的花茶放了很多糖块。\"]},\"668\":{\"h\":\"冷泡燕麦\",\"t\":[\"牛奶/酸奶/燕麦奶/椰奶 + 燕麦,前一天晚上配好,放在密封容器里,冰箱冷藏。第二天拿出来再加配料(奇亚籽、坚果、果干、椰子片、即食燕麦、水果、酸奶块)即可食用。需要注意的有几个点:\",\"主材一定要用生燕麦或烤燕麦,不要用即食的,即食的泡一夜就变成糊了,既不好吃也不健康,升糖很高。\",\"配料之所以在吃前再添加是为了避免口感拉胯,所以不会带来脆的口感的配料也可以冷藏前添加,即食燕麦片、椰子片、坚果、酸奶块这些可以丰富口感的建议在吃前添加。\",\"配料有两个作用,除了提升口感层次还有丰富营养的作用,但建议酌情添加,特别是有减脂需求的人士,毕竟大部分配料都是热量炸弹。而且不加配料其实已经很好吃了,个人较为推荐的配料是一袋每日坚果或一小把燕麦脆片(如卡乐比)。\",\"容器可以选用梅森杯、玻璃饭盒,若对配料有要求而且想路上吃可以选择乐扣双层多用保鲜盒。\",\"放冰箱这一步很重要!不放可能会化身喷射战士。\",\"唯一的缺点就是冷吃可能不是所有人都适合,也可以早上再用微波炉打一下,对口感和营养肯定会有影响。\"]},\"669\":{\"h\":\"健康理论\"},\"670\":{\"h\":\"程序员延寿指南\",\"t\":[\"程序员延寿指南:\",\"输入 \",\"固体:吃白肉(-11%~-3% ACM)、蔬果为主(-26%~-17% ACM),多吃辣(-23% ACM),多吃坚果(-27%~-4% ACM),少吃蛋黄(否则 +7% ACM/0.5 颗/天),中量碳水、多吃植物蛋白(-10% ACM),少吃超加工食物(-62%~-18%)\",\"液体:喝咖啡(-22%~-12% ACM),喝牛奶(-17%~-10% ACM),喝茶(-15%~-8% ACM),少喝或不喝甜味饮料(否则每天一杯 +7% ACM,+多巴胺),戒酒或每周 100g(纯酒精量 (g)=饮酒量 (ml)× 酒精浓度 (%)× 酒精密度 0.8g/ml)内(否则+~50% ACM,无上限)\",\"气体:不吸烟(否则+~50% ACM,-12~-11 年寿命)\",\"光照:晒太阳(-~40% ACM)\",\"药物:二甲双胍(糖尿病人相比正常人可以 +3 年)、复合维生素(-8% 癌症风险)、亚精胺(-60%~-30% ACM)、葡萄糖胺(-39% ACM)\",\"输出 \",\"运动:每周 3 次 45 分钟挥拍运动(-47% ACM)\",\"日常:刷牙(-25% ACM)\",\"睡眠:每天睡 7 小时全因死亡率最低;且 22-24 点间最好,早睡 +43% ACM,晚睡 +15% ACM(存在争议)\",\"上下文 \",\"体重:减肥(-54% ACM)\"]},\"671\":{\"h\":\"其他\",\"t\":[\"在发表在《细胞》杂志的综述文章中描述了长寿饮食,这是一种基于从食物成分和卡路里摄入等饮食各个方面研究的多支柱方法。研究人员报告说,理想情况下,一天的饭菜都在 11—12 小时的窗口内进行,允许每天禁食,每 3—4 个月进行为期 5 天的禁食也可能有助于降低胰岛素抵抗、血压和其他疾病风险因素。朗格描述了长寿饮食在现实生活中的样子:大量的豆类、全谷物和蔬菜;一些鱼;没有红肉或加工肉和极少量的白肉;低糖和精制谷物;一定量的坚果和橄榄油;一些黑巧克力。\"]},\"672\":{\"h\":\"泡澡\",\"t\":[\"浸泡 42℃ 以上的水温最多泡 3-5 分钟,40℃ 可以泡 10 分钟,37℃ 到 39℃ 的温水,可以泡 20-30 分钟。泡浴后的清水冲淋是有必要的,头发部位和面部用冷水冲淋则有极其良好的保健和延缓衰老的功效。\",\"泡浴作用:\",\"低温、长时间的泡浴 - 失眠、压力带来的疲劳。\",\"上班前或者重大活动前高温或者低温并且短时间的泡浴 - 打起精神。\",\"0-21°,收敛组织器官和神经系统--冷水浴。\",\"32-40°,舒缓、愉快 - 温水浴。\",\"32-42°,止痛、镇静,浴后无力需要休息 - 热水浴。\",\"全身浴:覆盖肩膀为主,温水 - 提高新陈代谢。\",\"半身浴:肚脐平齐,不增加心脏负担,30-40 分钟,慢慢发汗,上半身披毛巾或间断性加水 - 改善心脏功能,改善冷性体质,特别适合老年人。注意:39°,肚脐,30 分钟以上。\",\"坐浴:20 厘米高度的水平线,浸入腰椎、尾椎、臀部,15 分钟 - 痔疮、便秘、尿路感染、生殖系统护理。\",\"另外,饮酒后最好不要立即去洗澡,这很容易引发心血管病。洗澡时出现头晕、胸闷、眼花等“澡堂综合征”,也需立即停浴,到医院就诊。\"]},\"673\":{\"h\":\"减肥食谱\",\"t\":[\"使用食谱前,先需要养成正确的减重习惯和心态。\",\"不要让自己饿肚子,每天至少要吃 3 顿正餐。\",\"吃点心或正餐之前和之后都要喝一杯水,进食顺序按蔬菜> 鱼肉蛋> 主食\",\"饭后半小时不要坐下\",\"临睡前至少 1 小时停止用餐,并且要多喝水。\",\"每咬一口食物,都要咀嚼一段时间。从身体真正饱足到大脑产生饱足感需要 15 分钟。吃慢一点,就不容易吃得过多。\",\"每天称体重,然后找出 7 天的平均值。确保体重持续下降就好,不需要规定自己每周必须减掉多少体重。有时候体重可能会增加,尤其是女性在月经期间体内水分潴留,容易水肿,和你的饮食或锻炼习惯没有关系。\",\"每周只减掉 0.5-1 公斤。快速减肥会减掉肌肉,而不是脂肪,而且也很难长期维持体重。\",\"早餐\",\"午餐\",\"晚餐\",\"Day01\",\"谷物牛奶 (燕麦片 40g+ 全脂奶粉 40g+ 蛋白粉 5g+ 黑咖啡 2g);12 粒巴旦木;苹果 200g\",\"什锦饭 (大米 30g+ 小米 30g+ 甜豌豆 15g+ 松子仁 5g+ 酱牛肉碎 30g+ 胡萝卜丁 30g);蔬菜沙拉 (生菜 100g+ 熟鸡蛋 + 油醋汁半汤匙 4g);猕猴桃 120g;无糖酸奶 100g\",\"燕麦米饭 (燕麦粒 20g+ 大米 15g);油煮蘑菇鸡肉菠菜 (菠菜 200g+ 蘑菇 50g+ 鸡腿 40g+ 香油 1 汤匙 8g);豆浆 (黄豆 50g)\",\"Day02\",\"全麦三明治 (生菜 70g+ 鸡蛋 + 全麦吐司 60g+ 香油 2g);12 粒原味开心果;牛奶 250g\",\"双色菜花 (西兰花 100g+ 菜花 100g+ 香油 5g);茄汁虾仁 (虾仁 75g+ 番茄酱 30g+ 油 8g);二米饭 (小米 30g+ 糙米 30g);牛奶咖啡 (低脂奶粉 20g+ 黑咖啡 2g)(先吃一半菜花)\",\"木耳小白菜杂煮 (小白菜 150g+ 北豆腐 60g+ 鸡心 60g+ 黑木耳 6g+ 香油 3g);红豆紫米薏米粥 (紫红糯米 30g+ 薏米 15g+ 赤小豆 30g);蜜橘 100g(加餐)\",\"Day03\",\"红豆紫米薏米粥 (紫红糯米 30g+ 薏米 15g+ 赤小豆 30g);水煮蛋;果仁菠菜 (菠菜 80g+ 花生仁 10g+ 香油 3g);牛奶咖啡 (低脂奶粉 20g+ 黑咖啡 2g)\",\"土豆沙拉 (土豆 200g+ 甜豌豆 30g+ 白芝麻 3g+ 鸡蛋 + 千岛酱 1 汤匙 8g);酱卤鸭肝 60g;无糖酸奶 100g;10 粒小番茄\",\"燕麦小米粥 (燕麦片 30g+ 小米 30g+ 小麦胚芽 10g);蒸虾皮小油菜 (小油菜 180g+ 虾皮 5g+ 全麦粉 30g+ 花椒油 3g);烤鸡腿 80g\",\"Day04\",\"奶香醪糟燕麦 (醪糟 100g+ 燕麦片 30g+ 全脂奶粉 40g);鸡蛋;12 粒巴旦木\",\"紫菜蛋花汤 (海苔 4g+ 熟芝麻 1g+ 鸡蛋);牛奶燕麦 (燕麦片 20g+ 全脂牛奶 250g);酸奶 100g;小叶橘 150g;全麦吐司 30g\",\"火腿木耳煮油菜 (油菜 250g+ 木耳 10g+ 方火腿 60g+ 香油 1 汤匙 8g);蒸红薯 180g;无糖酸奶 (酸奶 100g+ 蛋白粉 5g)(先吃油菜)\",\"Day05\",\"蒸食物套餐 (铁棍山药 80g+ 糯玉米带轴 150g+ 胡萝卜半根 100g);奶香黄豆浆 (黄豆 20g+ 黑芝麻 5g+ 全脂奶粉 20g);鸡蛋羹 (鸡蛋 + 香油 2g);桂圆 150g\",\"冲杂粮糊 (烤红豆粉 15g+ 燕麦粉 20g+ 小米粉 15g+ 全脂奶粉 10g);生菜沙拉 (生菜 150g+ 千岛酱 10g);酸奶 200g;蓝莓 100g;葡萄干 10g\",\"坚果土豆泥 (土豆 250g+ 烤花生碎 12g+ 方火腿 70g);油煮木耳小白菜 (小白菜 200g+ 木耳 6g+ 香油 4g);酸奶 100g\",\"Day06\",\"香蕉燕麦蛋糕 (香蕉 120g+ 燕麦片 30g+ 鸡蛋 + 牛奶 200g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 100g+ 核桃仁 15g+ 芝麻油 4g)\",\"鸡腿炖四宝 (鸡腿肉 100g+ 鲜蘑 80g+ 黄花菜 10g+ 甜豌豆 80g+ 木耳 10g);银耳西兰花 (西兰花 200g+ 银耳 8g+ 香油 4g)\",\"炖素三鲜 (冬笋 80g+ 香菇 10g+ 黄豆芽 120g+ 香油半汤匙 4g);清蒸鱼 (蒸鲈鱼 120g+ 花生油 4g);烤红薯 250g(按序食用)\",\"Day07\",\"苹果全麦煎饼 (苹果肉 180g+ 全麦粉 20g+ 葡萄干 3g+ 全脂奶粉 10g+ 油 3g);麦胚红枣豆浆 (烤黄豆 15g+ 烤黑芝麻 8g+ 大枣肉 10g+ 熟小麦胚芽 10g)\",\"生菜鸡蛋沙拉 (生菜 200g+ 鸡蛋*2+ 千岛沙拉酱 8g);麦胚红枣豆浆 (烤黄豆 15g+ 烤黑芝麻 8g+ 大枣肉 10g+ 熟小麦胚芽 10g);酸奶 150g;猕猴桃 120g\",\"甘薯红米饭 (红薯 100g+ 红米 20g+ 白米 20g);牛肉炖菜 (牛肉 100g+ 香菇 8g+ 胡萝卜 40g+ 魔芋粉丝 20g);果仁菠菜 (菠菜 200g+ 花生仁 8g+ 香油 4g)\",\"Day08\",\"全麦面包 70g;牛奶 240g;水煮鸡蛋;桂圆 120g;9 粒巴旦木\",\"油煮木耳小白菜鸡 (小白菜 25g+ 卤水豆腐 100g+ 鸡心 50g+ 黑木耳 2g+ 香油 3g);炖素三鲜 (冬笋 40g+ 香菇 4g+ 黄豆芽 20g+ 香油 2g);蒸红薯 200g;去皮小叶橘 200g\",\"杂粮糊 (烤红豆粉 13g+ 燕麦粉 13g+ 小米粉 13g+ 脱脂奶粉 4g);火腿木耳煮油菜 (油菜 100g+ 木耳 5g+ 方火腿 75g+ 香油 5g);无糖酸奶 130g\",\"Day09\",\"香蕉燕麦蛋糕 (香蕉 120g+ 燕麦片 50g+ 鸡蛋 + 牛奶 240g);15 粒开心果\",\"燕麦小米浓粥 (燕麦片 25g+ 小米 13g+ 小麦胚芽 13g);生菜沙拉 (生菜 200g+ 千岛酱 4g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 4g);豆浆 (黄豆 44g)\",\"二米饭 (小米 38g+ 糙米 15g);蒸虾皮小油菜 (小油菜 200g+ 虾皮 6g+ 全麦粉 10g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 花生油 4g);烤鸡腿肉 45g\",\"Day10\",\"苹果全麦煎饼 (苹果肉 105g+ 全麦粉 50g+ 葡萄干 3g+ 全脂奶粉 30g+ 油 3g);鸡蛋羹 (鸡蛋 + 香油 2g)\",\"蒸土豆 (土豆 200g+ 方火腿 75g+ 花生碎 2g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 花生油 3g);猕猴桃 150g\",\"甘薯红米饭 (红薯 50g+ 红米 25g+ 白米 25g);油煮木耳小白菜鸡 (小白菜 100g+ 卤水豆腐 50g+ 鸡心 50g+ 木耳 4g);豆浆 (黄豆 30g)\",\"Day11\",\"谷物牛奶 (燕麦片 50g+ 全脂奶粉 30g+ 黑咖啡 2g);鸡蛋;10 粒巴旦木;蜜橘 120g\",\"什锦饭 (大米 50g+ 小米 25g+ 甜豌豆 8g+ 松子仁 2g+ 酱牛肉碎 70g+ 胡萝卜丁 20g);银耳西兰花 (西兰花 50g+ 银耳 4g+ 香油 4g)\",\"燕麦米饭 (燕麦粒 25g+ 大米 38g);牛肉炖菜 (牛肉 50g+ 香菇 7g+ 胡萝卜 20g+ 魔芋粉丝 20g);烤鸡腿肉 50g\",\"Day12\",\"奶香醪糟燕麦 (醪糟 69g+ 燕麦片 38g+ 全脂奶粉 30g);果仁菠菜 (菠菜 150g+ 花生仁 3g+ 香油 3g);鸡蛋羹\",\"土豆鸡蛋豌豆沙拉 (土豆 300g+ 甜豌豆 16g+ 白芝麻 3g+ 鸡蛋 + 千岛酱 4g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 20g+ 魔芋粉丝 20g+ 香油 2g)\",\"蒸食物套餐 (铁棍山药 100g+ 糯玉米带轴 300g+ 胡萝卜 20g);油煮蘑菇鸡肉菠菜 (菠菜 50g+ 蘑菇 35g+ 鸡腿 50g+ 香油 5g);无糖酸奶 120g\",\"Day13\",\"红豆紫米薏米粥 (紫红糯米 25g+ 薏米 25g+ 红小豆 13g);蔬菜沙拉 (生菜 200g+ 熟鸡蛋 + 油醋汁 5g);牛奶咖啡 (牛奶 240g+ 咖啡 2g)\",\"核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 100g+ 核桃仁 8g+ 香油 3g);烤红薯 200g;酱牛肉 70g;猕猴桃 150g\",\"麦胚红枣豆浆 (烤黄豆 30g+ 烤黑芝麻 16g+ 大枣肉 20g+ 熟小麦胚芽 20g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 2g);果仁菠菜 (菠菜 150g+ 花生仁 2g+ 香油 1g)\",\"Day14\",\"鸡蛋生菜三明治 (生菜 150g+ 鸡蛋 + 全麦吐司 88g+ 香油 5g);牛奶 240g\",\"鸡腿炖四宝 (鸡腿肉 50g+ 鲜蘑 35g+ 黄花菜 4g+ 甜豌豆 8g+ 木耳 4g);燕麦米饭 (燕麦粒 25g+ 大米 25g);葡萄干 25g\",\"双色菜花 (西兰花 50g+ 菜花 40g+ 油醋汁 2g);茄汁虾仁 (虾仁 80g+ 番茄 10g+ 油 2g);二米饭 (小米 38g+ 糙米 25g);紫菜蛋花汤 (海苔 2g+ 鸡蛋*1)\",\"Day15\",\"红豆紫米薏米粥 (紫红糯米 25g+ 薏米 25g+ 赤小豆 13g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 75g+ 核桃仁 3g+ 香油 2g);鸡蛋羹 (鸡蛋*1+ 香油 1g);无糖酸奶 240g\",\"油煮木耳小白菜鸡 (小白菜 100g+ 卤水豆腐 100g+ 鸡心 50g+ 木耳 4g+ 油 5g);二米饭 (小米 50g+ 糙米 25g)\",\"甘薯红米饭 (红薯 50g+ 红米 25g+ 大米 25g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 20g+ 魔芋粉丝 20g+ 油 5g);烤鸡腿肉 50g\",\"Day16\",\"奶香醪糟燕麦 (醪糟 35g+ 燕麦片 38g+ 全脂奶粉 30g);鸡蛋;蜜橘 120g\",\"蔬菜沙拉 (生菜 200g+ 鸡蛋 + 油醋汁 5g);清蒸鱼 (蒸鲈鱼 80g+ 花生油 5g);蒸土豆 300g\",\"油煮鸡肉蘑菇菠菜 (菠菜菜 100g+ 蘑菇 35g+ 鸡腿肉 75g+ 香油 5g);蒸红薯 250g;豆浆 (黄豆 50g)\",\"Day17\",\"香蕉燕麦蛋糕 (香蕉 80g+ 燕麦片 50g+ 鸡蛋 + 牛奶 240g)\",\"粉蒸土豆鸡肉 (土豆 200g+ 鸡腿肉 50g+ 蒸肉米粉 5g+ 烤花生碎 3g);双色菜花 (西兰花 50g+ 菜花 80g+ 油醋汁 3g);酱牛肉 150g;猕猴桃 35g\",\"麦胚红枣豆浆 (烤黄豆 30g+ 烤黑芝麻 16g+ 大枣肉 20g+ 熟小麦胚芽 20g);火腿木耳煮油菜 (油菜 100g+ 木耳 4g+ 方火腿 75g+ 香油 4g)\",\"Day18\",\"鸡蛋生菜三明治 (生菜 150g+ 鸡蛋 + 全麦吐司 88g+ 香油 3g);奶香黄豆浆 (黄豆 13g+ 黑芝麻 3g+ 全脂奶粉 20g)\",\"杂粮糊 (烤红豆粉 13g+ 燕麦粉 13g+ 小米粉 13g+ 脱脂奶粉 2g);油煮木耳小白菜鸡 (小白菜 150g+ 卤水豆腐 40g+ 鸡心 75g+ 木耳 4g+ 香油 5g);苹果 150g\",\"蒸食物套餐 (铁棍山药 60g+ 糯玉米带轴 200g+ 胡萝卜 100g);鸡腿炖四宝 (鸡腿肉 50g+ 鲜蘑 17g+ 黄花菜 2g+ 甜豌豆 4g+ 黄豆芽 10g);生菜沙拉 (生菜 50g+ 千岛酱 4g);无糖酸奶 130g\",\"Day19\",\"苹果全麦煎饼 (苹果肉 60g+ 全麦粉 50g+ 葡萄干 3g+ 全脂奶粉 20g+ 油 5g);牛奶 240g\",\"土豆鸡蛋豌豆沙拉 (土豆 300g+ 甜豌豆 32g+ 白芝麻 2g+ 鸡蛋 + 千岛酱 4g);茄汁虾仁 (虾仁 80g+ 番茄酱 2g+ 油 10g)\",\"燕麦小米浓粥 (燕麦片 13g+ 小米 38g+ 小麦胚芽 13g);火腿木耳煮油菜 (油菜 100g+ 木耳 4g+ 方火腿 75g);无糖酸奶 130g\",\"Day20\",\"蒸食物套餐 (铁棍山药 60g+ 糯玉米带轴 200g+ 胡萝卜 100g);紫菜蛋花汤 (海苔 2g+ 鸡蛋*1);果仁菠菜 (菠菜 100g+ 花生仁 3g+ 香油 3g)\",\"炖素三鲜 (冬笋 40g+ 香菇 17g+ 黄豆芽 20g+ 香油 3g);牛肉炖菜 (牛肉 50g+ 香菇 4g+ 胡萝卜 10g+ 魔芋粉丝 20g);燕麦米饭 (燕麦粒 25g+ 大米 50g);烤鸡腿肉 50g\",\"什锦饭 (大米 38g+ 小米 25g+ 甜豌豆 8g+ 松子仁 3g+ 酱牛肉碎 70g+ 胡萝卜丁 20g);银耳西兰花 (西兰花 25g+ 银耳 4g+ 香油 2g)\",\"Day21\",\"谷物牛奶 (燕麦片 50g+ 全脂奶粉 30g+ 黑咖啡 2g);鸡蛋;桂圆 120g\",\"油煮鸡肉蘑菇菠菜 (菠菜菜 100g+ 蘑菇 70g+ 鸡腿肉 50g+ 香油 5g);烤红薯 200g;猕猴桃 150g;无糖酸奶 130g\",\"粉蒸土豆鸡肉 (土豆 100g+ 鸡腿肉 50g+ 蒸肉米粉 5g+ 烤花生碎 2g);茄汁虾仁 (虾仁 80g+ 番茄酱 10g+ 油 1g);二米饭 (小米 25g+ 糙米 13g);核桃仁拌豌豆苗 (豌豆苗/鸡毛菜 75g+ 核桃仁 5g+ 香油 2g)\",\"以上食谱整理自范志红老师的《吃出好身材-21 天营养食谱》,侵权删。\",\"食谱注意:\",\"晚餐时补充复合 B 族维生素药片,乳糖敏感者可以将纯牛奶换成低乳糖奶。\",\"蒸蛋羹可以用水煮蛋替代;鸡心、鸭肝、方火腿可以用鸡腿肉、酱牛肉替换;什锦饭中的酱牛肉碎换成炒鸡丁;松子仁可以换成熟芝麻或开心果碎;小叶橘可以替换成等量其他甜度低的新鲜水果,如草莓或半个苹果等;桂圆可以换成其他自己爱吃、吃了之后胃肠舒服的应季水果,比如橘子、橙子、猕猴桃等。水果可以午饭前一小时食用。\",\"小米、燕麦提前浸泡半小时到一小时再和大米一起煮口感较好。如果没有杂粮粉,可以直接用这些杂粮煮成饭,每次煮多一点,分成几份冷冻起来,每次蒸热吃一份。\",\"食谱部分可进行微调,如果不会做,可直接按原料食用。\",\"冷泡茶和热茶放凉,好喝级别能一样吗?↩︎\"]},\"674\":{\"h\":\"智能家居\",\"t\":[\"智能家居是家庭自动化最基础的一部分。之前一直偷懒直接用米家,但当我想把传感器与电脑联接起时,就开始了研究 Home Assistant 和 Node-RED。\"]},\"675\":{\"h\":\"Home Assistant\",\"t\":[\"Home Assistant 是开源的家庭自动化平台,可自定义集中管理各品牌的智能家居设备。\",\"Home Assistant 原生支持的米家设备较少,需要使用 hacs 下的集成 Xiaomi Miot Auto。默认 Docker 容器不带 hacs,需要手动部署。\",\"下载 hacs,将其解压到 Home Assistant 配置的 config\\\\custom_components\\\\hacs 文件夹下。\",\"重启 Home Assistant 容器后,在集成中搜索 hacs,安装时按要求提供 github 账户授权。\",\"选择「HACS」>「集成」>「浏览并下载存储库」,下载 Xiaomi Miot Auto 并重启 Home Assistant 容器。[1]\",\"Home Assistant 虽然一直被吹得很厉害,但即时性的传感器可能不能及时触发,使用时需要注意这点。\",\"对于人体传感器、门磁、无线开关类设备,它们的状态通常为瞬时状态 (即:事件),部分型号支持获取最后一次事件触发的时间,且默认轮询时长为 15 秒,对于无法获取最后触发事件的设备,即使修改轮询时间到 1 秒,也可能无法获取正确的状态。因此此类设备通过本插件集成后不太推荐用于触发实时自动化,仅适合作为如几分钟无人移动关灯这类自动化的条件。如果需要实时更新状态,推荐使用多模网关配合 XiaomiGateway3 集成。[2]\"]},\"676\":{\"h\":\"Node-RED\",\"t\":[\"Node-RED 是本地版的 IFTTT,能与 Home Assistant 打通,实现本地化的互联。新手推荐 node-red 的入门教程集合。\",\"部署 Node-RED 时,Node-RED 对存储文件夹的读写权限要求较高,Docker 部署的话需修改 data 的文件夹权限,为避免麻烦,我给了最高权限 chmod 777 /volume1/docker/nodered/data。\",\"Node-RED 上安装 node-red-contrib-home-assistant-websocket。 \",\"选择「设置」>「节点管理」>「控制板」>「安装」,点击右侧刷新按钮,加载节点目录,第一次加载要比较长时间,不用关闭网页。\",\"搜索并安装「node-red-contrib-home-assistant-websocket」。\",\"选择「Home Assistant」>「HACS」>「集成」>「浏览并下载存储库」,下载 Node-RED Companion。\",\"选择「Home Assistant」>「配置」>「设备与服务」>「集成」,添加集成 Node-RED Companion,然后重启 Home Assistant 容器。\",\"进入 nodered 页面,配置 home assistant websocket,点击右上角的部署。[3]\"]},\"677\":{\"h\":\"常用节点\",\"t\":[\"inject: 定时启动,周期性触发执行。\",\"call service:改变智能设备状态,比如开灯。 \",\"Domain:触发方式\",\"Service:触发命令\",\"Device:设备与服务\",\"Entity:设备执行模块\"]},\"678\":{\"h\":\"自动化场景\",\"t\":[\"记录主卧关灯时间,默认其为睡眠时间,但实际关掉是关电源,不会在智能后端记录。或者用明暗度测试记录,每天最后暗的时候,记录为睡眠时间。\",\"书房检测到没人时,对电脑发送暂停视频的快捷键。这步卡在硬件,需要有个硬件能被 Node-RED 识别并给电脑发送按键。\"]},\"679\":{\"h\":\"智能硬件\"},\"680\":{\"h\":\"Zigbee2MQTT\",\"t\":[\"Zigbee2MQTT 是开源的智能网关,支持大部分的智能设备。其辐射范围更大,能同时联接 200 个设备,它的插网线版更稳定不易掉线。\",\"不过,我的设备都是米家系,暂时用不到开源网关,等买了其他品牌的设备,再考虑 Zigbee2MQTT。\"]},\"681\":{\"h\":\"智趣盒子\",\"t\":[\"智趣盒子集成了 Home Assistant 和 Node-RED 的 Docker,Home Assistant 能部署 Addons、supervisor,能直接插开源网关。\",\"盒子基于 arm 的 linux 的 debian 系统上运行 docker,在 docker 的基础上构建了 supervisor 版本,跟 homeassistant 开发官方的 hassos 的最大差异就是打开了 root 的权限,可以在底层进行操作。这些比较适合国内的使用环境(网络改善,装第三方工具等).\",\"不过与 NAS 相比,智趣这类硬件盒子同样是 Docker 容器,除了能直连网关和想象中的简便攻略,并没什么其他优势。\"]},\"682\":{\"h\":\"其他硬件\",\"t\":[\"远程键盘控制器:基于易微联的第三方产品,手机通过 APP 远程控制电脑按键,不过只能按一个按键或者连续 6 个的自定义键值。不确定是否支持 HA。\",\"MQTT 转 usb 虚拟键盘鼠标注入器:通过 wifi 来控制,店家不清楚 HA。\",\"从零开始,基于群晖轻松玩转开源 homeassistant 智能家居前期搭建↩︎\",\"为什么设备状态会有延迟?如何减小延迟?↩︎\",\"树莓派 HomeAssistant 系列(四)NodeRed 安装配置↩︎\"]},\"683\":{\"h\":\"生活窍门\"},\"684\":{\"h\":\"个人护理\"},\"685\":{\"h\":\"理发\",\"t\":[\"电推子理发:先用 1.5 号限位器铲平两边和后面,然后用 9 号限位器从后向前修整头发(包括刘海),最后用 6 号限位器修理过渡区域。\",\"不要从前向后理发,否则限位器不起作用,头发都被推平。\",\"短发方案:限位器分别使用 1.5、6 和 4.5。\"]},\"686\":{\"h\":\"衣物\",\"t\":[\"色彩:全身上下衣服的颜色不要超过 3 种,喜欢色彩饱和度偏低的颜色。单纯的黑白灰容易显得单调、路人。​\",\"图案:单一主题,小图案不要太大、条纹对齐不繁杂。横条纹显高显瘦,竖条纹相反。​[1]\",\"T 恤:250g 32 支的纯棉面料,支数越高,面料就越柔软、越强韧 ​。\",\"5 分裤:不要七分裤或太宽松,裤长放在膝盖上方 5-10 厘米处。\"]},\"687\":{\"h\":\"妙用\"},\"688\":{\"h\":\"磁铁\",\"t\":[\"铷磁铁或强磁铁在生活中有许多用途,如:整理线材,吸附窗帘,悬挂物品,密封。\",\"磁铁使用方便,不留痕迹,比小夹子有用。\"]},\"689\":{\"h\":\"小众记录\"},\"690\":{\"h\":\"去客厅化\",\"t\":[\"宝宝出生后,扔掉了家里的欧式沙发和茶几,转而采用模块沙发。模块沙发的好处是可以灵活使用,需要时可以拆分来变成床。我买了三组,每组有两个沙发垫,可以让三个人舒适地睡觉。不过,模块沙发的价格差异很大,很难区分哪个更优。\"]},\"691\":{\"h\":\"玻璃自爆\",\"t\":[\"2022.06.11 更换阳台 90*90 的弧形玻璃,要价 1100。\",\"阳台玻璃自爆后,即使玻璃没碎也要及早拆下来,否则有可能发生事故。拆旧玻璃前,需要清理下方停放的车辆,并暂时不让行人通行。拆好后,如果掉落碎玻璃较多,可以拿包烟让环卫工人帮忙清理。\",\"新玻璃未到之前,可以拿大的硬纸板挡住缺口,不要用薄膜遮掩,会被吸走。\"]},\"692\":{\"h\":\"花洒水小\",\"t\":[\"手持花洒尾部与软管的连接处,有节水止逆阀。\",\"如果家里水压不足时,拆下节水止逆阀后安装花洒,可以解决花洒出水不足问题。\"]},\"693\":{\"h\":\"网线更换\",\"t\":[\"客厅网络连接不稳定,加上原本装修的网线不好,想着把埋在墙里的网线都更换掉,就搜索「墙内网线更换」找到本地的服务商询价,准备把埋在墙里的网线都升到 7 类,但对方说超六和七类的网线都比较粗,很难拉进管道,可能会拉到一半给卡住。6 类线据传可以稳定支持 2.5Gbps/5Gbps 网络;在特定布线环境下,最大可支持 10Gbps 传输速率。\",\"师傅上门发现:除了客厅的 3 条网线是 6 类,其他房间都是超 5 类,可以上千兆,但不算稳定;管道里线特别多,无法更换网线。另外,单口网口面板改为双网口,需要连两根网线。\",\"平层户型换线报价(包含 6 类网线,6 类水晶头及人工):网线能不能换。只能我们工作人员,上门查看来确认。确认没法换的,只收上门费 100 元。可以换的话。换首根 6 类网线 380 元。每增加 1 根收取 140 元。管道里包含 10 米,超出的每米 12 元。客户需要管道外面延长网线的,每米 12 元。除复式和大型场所外,绝大多数情况是超不过 10 米。 实际付费:上门维修就是按户计算,不管问题大小都是 300 起。我原本的问题不大,所以让他把家里的网线全部检查了遍,替换坏掉的水晶头和网口面板,最终费用是 430.\",\"网线情况:客厅 TV,客厅沙发(2 条网线,一条放在电话线下),客卧床头,客卧 TV,主卧床头,主卧 TV,书房书桌。书房备用网口更换面板后,依然不能使用,可能是线断了,不再使用。\",\"无线方面,我闲鱼买了个二手路由,与原本的华硕路由进行 有线 mesh 组网。AiMesh 主路由连接 LAN 口,节点路由连接 WAN 口。\",\"横纹衣服更显胖?你可能一直都弄错了↩︎\"]},\"694\":{\"h\":\"维修/保养\"},\"695\":{\"h\":\"牛皮席\",\"t\":[\"平时隔一段脏了用温水毛巾擦就可以了,如果流汗很多的话,可以用淡肥皂水擦拭后再用清水毛巾擦。不宜暴晒,可以傍晚的阳光晾晒。\",\"秋天收藏之前,用淡肥皂水湿毛巾彻底清洁牛皮席表面,然后再用清水擦干净,在阳台晾晒一天后,可以卷也可以折起打包起来收藏,也可以直接垫在床上,上面再铺被子使用。\"]},\"696\":{\"h\":\"升降桌\",\"t\":[\"升降桌报错时,长按向下键,桌子会逐渐复位到最低,然后恢复正常。\"]},\"697\":{\"h\":\"通马桶\",\"t\":[\"塑料袋套在马桶搋或马桶刷,把塑料袋绑好。一插到底,快速抽动。多套上几个,尽量把它弄得比马桶的口大一点点哦。因为塑料袋在前面能起到一个遮挡的作用,快速的抽动它会形成一股冲击,从而达到快速的疏通马桶的作用。\",\"如果使用下方的疏通器,也在疏通头上绑好塑料袋,在气口位置撕开个小口,最后按通气开关。\",\"疏通器说明 1\",\"疏通器说明 2\"]},\"698\":{\"h\":\"林内锅炉\",\"t\":[\"左侧为冬季采暖模式,地暖模式下温度设置在 45—55℃,原则上不超过 60℃。因为地暖管道是塑料的,如果温度太高,那么会影响到采暖管的使用寿命,还会导致锅炉内壁结垢。\",\"燃气壁挂炉配备有手动注水/补水阀,当运行过程中,采暖系统压力下降至 1bar 以下时 (因水中气体蒸发等原因引起),用户应慢慢打开此阀对系统进行补水增压,直到系统压力恢复到规定的水压为止,一般在静态常温下,系统应保持 1bar 左右,工作时水压应保持在 1bar~1.5bar 之间,补水过程中请不要离开现场。\"]},\"699\":{\"h\":\"锅炉补水\",\"t\":[\"先检查采暖系统中是否有漏水的地方,确认系统完全密闭。\",\"关闭燃气壁挂炉,切断电源。\",\"逆时针(向左)旋紧注水/补水阀约一周,听到有“呲”的声音。\",\"观察操作面板上的水压表,当水压表指针在 1bar~1.5bar 之间时,顺时针(向右)旋转注水/补水阀手柄关闭注水/补水阀。\",\"开机运行燃气壁挂炉。\",\"注意事项:\",\"注水时,必须切断燃气壁挂炉总电源,以免因接头漏水而导致漏电;\",\"补水结束后必须将注水/补水阀旋紧关闭,否则燃气壁挂炉将过压溢水;\",\"如果您补水时不小心将采暖系统内的水压补到 3bar 左右,安全阀会泄水,所以再次提示您安全阀必须用接管与地漏连接,且中间不许有阀门。\"]},\"700\":{\"h\":\"地暖温控器\",\"t\":[\"地暖温控器 1\",\"地暖温控器 2\"]},\"701\":{\"h\":\"医疗药品\"},\"702\":{\"h\":\"自身健康\",\"t\":[\"尿素乳膏:柔软皮肤,防止干裂,深层滋润。\",\"维 a 酸乳膏:更新表皮,去除角质,避光只能晚上用。\",\"壬二酸:疏通毛孔堵塞,改善黑头。需建立耐受,遵循 SCT 法则:从短时间到长时间,每天每次 5-10 分钟递增;刚开始涂抹,可以在脸上停留 5-10 分钟后立即清水清洗掉,然后继续下一步护肤步骤,第二天时间拉长到 20 分钟,以此类推,直到在面部停留超过 1-2 小时以上无不适,可以尝试过夜。\",\"黑头:白天用壬二酸(5 分钟),晚上用维 a 酸。\"]},\"703\":{\"h\":\"维生素\",\"t\":[\"维生素:维生素 B 和 C 国内非常便宜,几元一瓶。但其他维生素国内只有保健品,价格严重虚高,优先考虑国外购买。\",\"护眼:叶黄素,玉米黄质,Lutemax® 2020 万寿菊花提取物。\",\"补钙:吃钙片要同时补充维他命 D 和维他命 K。钙本身是无法直接被身体吸收的,维他命 D 的作用是运输,带动钙元素在血液中流动。但光流动不行,需要给钙找个目标,才能把钙变成骨骼。所以就需要维他命 K,维他命 K 的作用则是把血钙转化为骨钙,让钙元素真正沉积在骨骼上。D 和 K 相结合,才能最大程度地提升钙的吸收率。\"]},\"704\":{\"h\":\"看病技巧\",\"t\":[\"如果在网上挂不到专家的号,可以尝试电话联系科室问一下能不能当天加号,有的专家是允许加号的,只不过可能会加到当天比较晚的时候,出检查结果的时候专家就下班了。[1]\",\"如果对自己病情没有很多了解的话,建议早上空腹去,以免抽不了血。如果对自己要做的检查有大致了解的话,建议查一下注意事项,提前做好准备,比如做核磁共振身上不要带金属,女生最好穿无钢圈无挂钩的 bra,比如散瞳后不要驾驶等等。\",\"人这一生中还是得常见病的概率大,没必要迷信主任医师。建议首次看病不必找资历太高的医生,如果你的病真的到了需要找老大夫看看的地步,年轻大夫会领着你去找的。\",\"上午看病的人多,下午少,周一多,周五少,尽量避开周一上午。刮风下雨是看病的最佳时机,雨越大,人越少。[2]\",\"不用迷信主任,要是真有大病,年轻大夫会领着你去找的……↩︎\",\"“为了您和家人的健康,请不要在星期一上午看病”,超实用看病指南↩︎\"]},\"705\":{\"h\":\"购物评价\"},\"706\":{\"h\":\"书房\"},\"707\":{\"h\":\"摄像头\",\"t\":[\"摄像头品牌众多,但实际像素都仅为 200 万像素。例如,罗技 C930 标称拥有 1500 万像素,售价 469 元,但这个像素数是通过软件算法提升的,实际像素仍然为 200 万像素。\",\"谷客和奥尼是高性价比的摄像头品牌,而高端款则有影石 Insta360 Link(费用为 1800 元,目前还未下单)。\"]},\"708\":{\"h\":\"键盘\",\"t\":[\"罗技 ERGO K860 是一款无线蓝牙键盘,具有人体工学设计,并配备手托。我替换下来的海盗船机械键盘则留作备用。\",\"机械键盘 ikbc c104 和高斯 GS104D 销量高。办公场合适合使用静音红轴需求。高斯是国产品牌,提供多种颜色选择。\"]},\"709\":{\"h\":\"游戏手柄\",\"t\":[\"如果不是在客厅玩游戏,建议买有线手柄,否则价格会高得多。\",\"100-200 预算:北通阿修罗 2、八位堂、致动 O。\",\"400+ 预算:XBOX SERIES 手柄。\",\"廉价手柄的性能通常很差,比如,摇杆只支持四个方向,而遥控一般是可以 360 度控制的。\"]},\"710\":{\"h\":\"显示器\",\"t\":[\"书桌上装有三台显示器。主显示器是小米 27 英寸 2K 165Hz,尽管存在轻微漏光,但对日常使用影响不大。两侧的显示器是 2012 年生产的 DELL 2412M。显卡为 3080Ti,考虑以后将三台都升级为 4K,使用每英寸像素数(PPI)来评估显示器清晰度更为合理和直观。4K 显示屏让眼睛更舒适,绝对提高幸福感。[1]\",\"显示器疑问:\",\"使用不同分辨率和刷新率的显示器是否对视觉和视力产生影响?(之前看到的说法是影响不大。)\",\"旧显示器需要多久更换一次?如何判断它们的寿命已到?\",\"放在屏幕上方的防蓝光灯是否有效?\",\"DIY 显示器(面板 + 公版控制器):\",\"便宜,但没有厂家优化,显示效果打折扣。\",\"需要确认购买的显示面板是否为二手。\",\"我连续购买了两个面板都出了问题,分别是碎屏和无显示。\"]},\"711\":{\"h\":\"台式电脑\",\"t\":[\"2022.03.16 淘宝入手 DIY 台机 i7+3080ti,费用 16500。虽然价格贵了点,不过赶在疫情封控两个月前,用上新电脑。原本想入手联想 刃 9000K 2022(i7+3070ti,价格 14000),但一直无货。这款机箱由联想定制,散热更好,配置足够日常使用,另外还有品牌机售后优势。相比联想,入手的 DIY 电脑内存频率从 4400 升至 5200,显卡从 3070ti 升至 3080ti,性价比更高,而且是现货。\",\"如果使用悬挂主机托架,需考虑主机重量、升降桌承重。\"]},\"712\":{\"h\":\"书桌灯\",\"t\":[\"我在书桌上使用了米典护眼读写灯,众筹价为 400 元。这款灯的光线级别达到 AA 级,可以替代屏幕上的挂灯。\",\"通常情况下,我会开着书桌灯,而顶灯一般是关着的。当只有屏幕和桌面上有光,其他区域都处于黑暗中,我能更专心地工作。\",\"未来,我希望能在书房里增加一些色彩,考虑使用 yeelight 灯带。\"]},\"713\":{\"h\":\"升降桌\",\"t\":[\"电动升降桌的调节高度范围一般在 0.6 至 1.2 米之间,可以考虑乐歌和京造。如果你想站着阅读,还可以考虑添置一个阅读架。\"]},\"714\":{\"h\":\"静电墙贴\",\"t\":[\"@chen 出的绝妙主意,将静电墙贴当白板用,可以任意随时的记录。不过为用红色白板笔不好擦,准备试试 PVC 材质的静电墙贴。\"]},\"715\":{\"h\":\"数码\"},\"716\":{\"h\":\"降噪耳机\",\"t\":[\"以下是降噪耳机的比较,按降噪效果从低到高排列:\",\"Freebuds Studio:华为生态。\",\"Sony 1000XM4:于 20 年发布,降噪效果强,但偶尔会翻车。\",\"Bose 700:于 19 年发布,长时间佩戴舒适,但佩戴时间过长会感到很热,有人说这款不如旧款 QC 35 II。我于 2021 年 6 月以 1300 元购入,后来在闲鱼以 899 元售出。\",\"还试用过其他无线耳机,如下所述:\",\"10 元:购买自拼多多,通话效果勉强,但音乐质量非常差,声音仿佛来自另一个世界。\",\"50 元:倍思,通话和音乐效果都还不错,但在地铁里几乎听不到声音。不知是不是因为习惯了降噪耳机,带普通耳机只能听到地铁的噪音。\",\"小度半入耳耳机:容易松动,甚至在走路时容易脱落;偶尔无法识别,必须重新放入电池仓进行充电。\",\"悦虎 1562M:闲鱼山寨品牌,据说音质不错(?),但主要适用于苹果设备。如果使用安卓设备,对音质要求不高,可以选择 QCY。\"]},\"717\":{\"h\":\"充电器\",\"t\":[\"充电器用了几年后,注意及时更换,因为老化会导致充电速度变慢。\",\"氮化镓充电器非常适合外出快速充电。不要购买无品牌的廉价充电器,虽然它们可能具有高参数和强大功能,但充电芯片质量没有保障,容易导致过热充电,从而影响设备的寿命。\"]},\"718\":{\"h\":\"UPS\",\"t\":[\"随着 NAS 硬盘数量的增加,建议使用 UPS 以防止因突然断电而导致的硬盘损坏。\",\"在考虑 NAS UPS 时,可以考虑购买 APC BK650M2-CH 和山特(SANTAK)TG-BOX 850。\"]},\"719\":{\"h\":\"3D 打印机\",\"t\":[\"3D 打印机使用时,打印原料会产生有害气体,不适合在家中使用。如果偶尔需要打印,建议在网上寻找专业人士定制。\"]},\"720\":{\"h\":\"健康\"},\"721\":{\"h\":\"代餐\",\"t\":[\"代餐:无营养,不能起到减肥作用,容易掉肌肉。\"]},\"722\":{\"h\":\"体重秤\",\"t\":[\"华为体脂秤 2 Pro 太过敏感,经常不准确。\"]},\"723\":{\"h\":\"椭圆机\",\"t\":[\"椭圆机的稳定性至关重要,机身越重越好。一般型号只有 68 公斤,好的型号可以达到 86 公斤。飞轮重量必须达到 12 公斤,否则使用时可能不够稳定。\",\"按照这些标准,推荐斯诺德 E690 和迪卡侬 EL 900。\"]},\"724\":{\"h\":\"眼部按摩仪\",\"t\":[\"严选眼部按摩仪噪音较大,但其他品牌也没好多少。如果买新的眼睛按摩仪,建议选择蛋白皮材质,适合长期使用。\",\"倍轻松:睡眠模式只有热敷。\",\"小米有品摩摩哒:无法关闭音乐,震动效果较弱,气囊挤。\"]},\"725\":{\"h\":\"泡脚桶\",\"t\":[\"泡脚桶的新旧款别不大,比较特别的功能是蒸汽泡脚,但评价普遍一般。建议选择传统深桶,可以漫过小腿。\"]},\"726\":{\"h\":\"睡眠监测\",\"t\":[\"在健康监测方面,我比较重视睡眠时间的监测。\",\"曾使用过 37 度睡眠监测带,但准确性不高,只适合用于家庭自动化(例如,作为触发器自动拉开窗帘)。我也考虑过更换为 Apple Watch 8/SE。然而,戴上 Apple Watch 会舒适吗?另外,我的手机是安卓系统,Apple Watch 是否兼容安卓手机或 iPad?\",\"试过小米手环和华为 GT 手表,但无论使用何种手环,始终感到不舒适,尤其是在炎热的天气里容易出汗。我尝试过硅胶、金属和尼龙编织表带,都没有明显改善。\",\"@木木:用过 Nike 的那个孔状的表带改善了,然后我用洗眼镜的超声波盒子每天洗表带汗藓情况进一步改善,于是我最后通过实验,每天用酒精消毒液洗表带\",\"@ZxoudXc:硅胶(最舒服的材质了) + 一点点风油精 不能说根治把。但是体感很爽,特别是在空调房里面。希望有帮助。\"]},\"727\":{\"h\":\"厨房\"},\"728\":{\"h\":\"冰柜\",\"t\":[\"与其他人不同,我想要冰柜只是冰箱放不下了。我喜欢买速冻包子、饺子,这类一买就得买很多包,否则价格高很多。换个思路,趁着优惠多买些速冻产品,冰柜的费用很快就回来了。我看中的是 135L 的卧式冰柜,价格 700,如果家里用不到了,扔起来也不会心疼。\",\"比起卧式冰柜,立式拿取方便,但分层后存储空间受限,没法放体积特别大的东西,比如大包的生鲜,整条的羊腿。立式占地虽小,但小的有限,容量相等的情况下,基本是 0.4 平和 0.5 平的区别,而且立式高度更高,容易影响视线。\"]},\"729\":{\"h\":\"切肉机\",\"t\":[\"电动切肉机用起来蛮慢的,切 5 斤肉需要 30 分钟。机器清洗也很麻烦,建议每次切肉时都将整条一起切好。\",\"使用前,向滑轨喷食用油,可以降低切肉卡顿的几率。使用时,为了避免冻手,两只手都先带一层劳保手套,外面再套一层 PVC。左手固定肉块左侧,右手扶助肉块后端。不要过分往前推,避免肉切得太厚。\"]},\"730\":{\"h\":\"净水器\",\"t\":[\"RO 膜方案:纯水过滤,可直饮。RO 膜机器较大,一定要量好厨柜尺寸。在选择时,不必参考废水量,废水量越低对滤芯压力更大。一些攻略指出 RO 膜的出水速度较慢,而滤芯更换频率较高(最快 1-3 个月一次)。然而,这些问题早已得到解决。相反,我因为滤芯更换速度过慢而感到焦虑。通常,DIY 前置滤芯寿命是 3-6 个月,但我购买的 DIY 净水器用了一年,还没提醒更换滤芯。最后我只能盲换,跟超滤方案一样了。\",\"建议购买小米、美的等成熟净水器方案。它们的价格通常在 1500-2000 之间,仅需要更换两个滤芯:复合滤芯(2 年更换一次,售价 299 元)和 RO 膜滤芯(5 年更换一次,售价 999 元)。仅更换滤芯的年均成本为 350 元。总体来看,DIY 所谓的性价比并不太高。\",\"超滤方案:保留矿物质(?),无需通电,大通量过滤。不足之处难以确认滤芯更换的时间,只能根据滤芯使用时间来预估。全套新机器的价格为 1500 元,之后每两年更换一次 EF-900P 滤芯(售价 350 元),每四年更换一次超滤 LU3B-5C 滤芯(售价 600 元),仅更换滤芯的年均成本为 325 元,如果全套更换,年均成本为 425 元。\",\"旧配置:立升 LU3B-5C + 爱惠浦 EF-900P (别要赠品,折现) + 爱惠浦滤头垡头 QL2U + 无铅水龙头。这是用了几年的方案,但随着立升的超幅涨价,超滤玩家的变少,越来越难以实现了。另外,配机时记得买好配件。比如买爱惠浦滤头垡头 QL2U 时,问清楚是几分进几分出。常用的两边都是 3 分口,要配 2 个 3 分进 2 分出的接头,方便接 2 分水管。接口是可以送的,要跟店家说送接口、水管。没送的话,可以自己买 1 根 5 米的 2 分 PE 管、1 个 4 分转 2 分的接头 (立升转爱惠浦)、2 个 3 分转 2 分的接头、1 个 2 分球阀。\",\"超滤净水示意图\"]},\"731\":{\"h\":\"家居\"},\"732\":{\"h\":\"维修\",\"t\":[\"日常维修以京东到家为主,或使用商家外包常用的鲁班到家。之前净水器的安装服务是鲁班到家,服务还不错,可以线上让师傅报价。\"]},\"733\":{\"h\":\"电熨斗\",\"t\":[\"挂烫机体积较大且使用频率低,长时间闲置后,性能也减弱,无法熨平衣物。考虑使用传统电熨斗 + 分熨台。\"]},\"734\":{\"h\":\"牛皮席\",\"t\":[\"夏天使用牛皮席更凉爽,避免因出汗而粘皮肤,有助于提高睡眠质量。\",\"最初购买的是无涂层牛皮席,上面存在许多瑕疵,后来更换为便宜的涂层款,反而看不到瑕疵。\"]},\"735\":{\"h\":\"消毒液\",\"t\":[\"参考消毒剂选购不完全指南:\",\"84 消毒液:爱特福、龙安、蓝月亮、康威龙。\",\"二氧化氯消毒片:星帮尼,从安全性角度看,二氧化氯消毒剂优于含氯消毒剂。 \",\"用于餐具、水果、蔬菜等的消毒,有效的二氧化氯浓度应为 100–150mg/L,浸泡作用时间 10–20 分钟。\",\"尽管二氧化氯目前被认为是对人体无毒害的成分,但为了保险起见,应及时用清水洗净残留消毒液才能继续使用。\",\"季铵盐消毒液:适用于衣物消毒,建议品牌包括康威龙和洛娃 \",\"不要将消毒液与洗衣液及柔顺剂同时使用,以免使各自的功效减弱。清洁、消毒是两个独立的过程,建议先洗干净再进行消毒,消毒效果更佳。\"]},\"736\":{\"h\":\"小物\",\"t\":[\"能面具 (树脂),但带眼镜不方便使用。\",\"宝工(Pro'sKit)NT-309-C 智慧型非接触式感应电笔:测电笔、验电笔\",\"内裤清洗机\",\"洗杯器:一按就能清洗杯子,非常方便,可惜需要水槽有多余的出水口。[2]\",\"插座:公牛、德力西、aigo(突破),公牛质量下滑了,可以看看其他品牌。\"]},\"737\":{\"h\":\"可能放弃\"},\"738\":{\"h\":\"电子书\",\"t\":[\"我通常使用 iPad 来阅读小说。国产电子书设备基于安卓系统,可以满足小说阅读的基本需求,而且使用墨水屏有助于保护眼睛。因此,考虑是否可以用电子书设备代替 iPad。\",\"电子书要求:支持开放系统(可以安装第三方应用程序),并且支持蓝牙遥控翻页。\"]},\"739\":{\"h\":\"微单相机\",\"t\":[\"原计划购买索尼 a7m4 微单相机,但随着疫情的发展,这个想法逐渐淡化,优先级下调。\",\"关于镜头选择:F 值越小,光圈越大,适合虚化背景。\",\"腾龙 28-75mm F2.8(适合日常旅行)\",\"索尼 FE 85mm F1.8 中远摄定焦镜头(适合人像摄影)\"]},\"740\":{\"h\":\"无线麦克风\",\"t\":[\"RODE Wireless Go II 与 DJI Mic:RODE Wireless Go 音质多受好评;而 DJI Mic 相对较新,但更符合人性化需求,可以轻松连接到手机。不过,需要注意的是 DJI Mic 的底噪略微高一些。\",\"鉴于录音中存在较多的杂音,需要使用降噪软件或者单独使用一部手机进行录音,因此目前暂不考虑入手无线麦克风。\"]},\"741\":{\"h\":\"洗碗机\",\"t\":[\"由于厨房空间有限,且洗碗机过于笨重,考虑找人上门设计解决方案?\",\"选择合适自己的显示器↩︎\",\"Room Tour |新家的厨房里有什么?↩︎\"]},\"742\":{\"h\":\"Docker\",\"t\":[\"Docker 是一个开源的应用容器引擎,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。简单点说,用 Docker 你不懂太多代码知识,直接用其他人的打包容器,小白也可以部署复杂的服务应用。\",\"Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来管理多个 Docker 容器,并配置应用程序需要的所有服务。在配置文件中,所有的容器通过 services 来定义,然后使用 docker-compose 脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。强烈推荐使用 Compose 搭建所有 Docker,流程参考 NAS 上搭建 Docker。\"]},\"743\":{\"h\":\"Docker 命令\",\"t\":[\"Docker 使用查看 Docker — 从入门到实践。\",\"列出所有容器:sudo docker ps -a。\",\"停止容器运行:sudo docker stop 。部分容器名有可能无法识别,最好在容器名称中添加数字。\",\"删除指定容器:sudo docker rm ,删除前需先停止容器。\",\"清理容器(慎重):sudo docker system prune -a,用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及无 tag 和没使用的镜像。\",\"清理数据卷(慎重):sudo docker volume prune,关闭的容器数据卷会被删除,有可能破坏有用数据,需极度谨慎。\",\"导出容器中的 mysql 数据库 sudo docker exec mysqldump -u root -p your_database_name > 。将 替换为实际的容器 ID,将 替换为你想要保存导出文件的路径和文件名。请将 替换为你的 MySQL root 用户密码。完成后,你将得到一个 MySQL 数据库备份文件。比如导出 Huginn 数据库,sudo docker exec 3de3058e4468 mysqldump -u root -p huginn_production > /volume1/docker/huginn/backup.sql。\"]},\"744\":{\"h\":\"定制 Docker 镜像\",\"t\":[\"有时官方镜像可能不满足我们的需求。这时,我们可以使用 docker commit 命令定制自己的镜像。如何使用,可以查看如何保存修改后的容器为镜像。\",\"例如:\",\"sudo docker commit \\\\ --message \\\"基于 Ubuntu 18.04 构建的 Huginn\\\" \\\\ ubuntu \\\\ huginnxubuntu:1.0 \",\"另外,可以使用 Dockerfile 来构建镜像,如:\",\" build: context: /volume1/docker/danmuji dockerfile: Dockerfile \",\"如何将镜像推送到 DockerHub:\",\"echo \\\"您的密码\\\" | docker login --username=您的用户名 --password-stdin docker build -t rockben/cors-anywhere:0.4.4 . docker push rockben/cors-anywhere:0.4.4 \"]},\"745\":{\"h\":\"Docker 数据库管理\",\"t\":[\"在 Docker 中,数据库可以引用外部资源并被永久保留。但保存的外部数据是多个小文件而不是完整的 MySQL 文件。在实际操作中,我们应关注正在运行的数据库,而非外部存储文件。\",\"首先,应将 Docker 数据库的端口暴露给外部,如将 MySQL 的默认端口 3306 映射到外部的 3307 端口。随后,使用数据库工具连接到 192.168.3.3:3307。这类似于使用 phpMyAdmin,可以轻松查看、编辑和导出 Docker 内的数据库。如果数据库连接遭到拒绝,可以参照 Huginn 的内部数据库连接设置,确保当前外部连接 IP 是允许的。\"]},\"746\":{\"h\":\"其他使用\"},\"747\":{\"h\":\"Windows Docker\",\"t\":[\"在 Windows 系统上,可以使用 Docker Desktop 来管理容器,配置方法可参考 Windows Docker 环境配置。\",\"Windows 本地磁盘被挂载到 Linux 的 mnt 目录下,因此,如果需要在 WSL 中访问 Windows 文件,需要在路径前添加 /mnt/ 前缀,并将磁盘符号改为小写字母,将反斜杠 \\\\ 替换为正斜杠 /。例如,如果 Windows 文件位于「D:\\\\Backup\\\\Libraries\\\\Desktop\\\\stable-diffusion-webui-docker」目录下,则其在 Linux 中的路径为「/mnt/d/Backup/Libraries/Desktop/stable-diffusion-webui-docker」。Windows 上的 WSL 本地路径为 \\\\\\\\wsl.localhost\\\\。\",\"请注意:WSL 上的 Linux 环境与其他环境有所不同,须查看在适用于 Linux 的 Windows 子系统 (WSL2) 上安装 Node.js。\"]},\"748\":{\"h\":\"宝塔镜像\",\"t\":[\"如果要在 Docker 上部署网站,推荐使用宝塔官方的集成镜像。它基于 CentOS 7.9,解决了 Docker 内部链接问题,还支持将数据库定时备份到本地。有关配置信息,请参考宝塔面板定制 docker 镜像发布 - 集成 LN/AMP 支持和 Docker 安装宝塔环境。但是,该镜像不适用于 Huginn 的部署,因为 Huginn 不支持 CentOS。我曾尝试将安装命令从 apt-get 替换为 yum,但仍然无法部署。当我尝试在 Docker 中直接安装宝塔而不使用官方集成镜像时,遇到了无法启动数据库的问题。\",\"# 按需求修改映射端口和目录,1024 以下的端口不能给普通用户用 sudo docker run -d --restart unless-stopped --name baota -p 8889:8888 -p 1033:22 -p 1044:443 -p 1081:80 -p 1889:888 -v /volume1/docker/btpanel/website_data:/www/wwwroot -v /volume1/docker/btpanel/mysql_data:/www/server/data -v /volume1/docker/btpanel/vhost:/www/server/panel/vhost btpanel/baota:lnmp \",\"在站点设置中,绑定你的本地域名 home.xx.com 和内部地址 192.168.x.x,这样你就可以通过访问 home.xx.com:1081 来访问该站点。\",\"默认地址 http://192.168.x.x:8889/btpanel 上的宝塔面板。\",\"默认用户:btpanel\",\"默认密码:btpaneldocker\",\"镜像默认 SSH 密码:btpaneldocker\",\"如果宝塔镜像仅用于测试环境,可以使用 rm -f /www/server/panel/data/admin_path.pl 命令来关闭面板入口。如果你关闭了 NAS 的 SSH 功能,宝塔面板也将停止,但不会影响已运行的网站。\"]},\"749\":{\"h\":\"Huginn\",\"t\":[\"Huginn 部署:查看 deploy Huginn inside of Docker 和 .env 设置,或按下方的教程手动部署到服务器上,轻量使用推荐部署到 Docker。\",\"Huginn 抓取教程:RSS 进阶篇:Huginn - 真·为任意网页定制 RSS 源(PhantomJs 抓取)\"]},\"750\":{\"h\":\"常用 Agent\",\"t\":[\"Huginn Agents:\",\"Website Agent 解析网页、XML 文档和 json 数据,最常使用\",\"Event Formatting Agent 事件信息格式化,可以对收到的信息内容进行格式化,允许添加自定义新内容\",\"Phantom Js Cloud Agent 借助 Phantom 抓取动态页面源码,防止部门网站屏蔽爬虫\",\"Trigger Agent 监控事件反馈信息的触发器,多用来过滤部分内容\",\"De Duplicate Agent 去重\",\"Data Output Agent 将数据以 RSS 和 Json 的形式向外部推送\",\"Liquid Output Agent 自定义格式数据输出,可以用它创建 HTML 页面,json 数据等\",\"Webhook Agent\",\"Trigger Agent 监测敏感事件,然后可以用来发送邮件等提醒。\",\"Javascript Agent 允许执行自定义的 JS 代码,可以用于个性化操作\",\"Digest Agent 汇总节点,收集所有收到的事件再作为一个事件发送出去\",\"Email Agent 用邮箱发送最新接收到的讯息\",\"Post Agent 可以由其他节点触发,根据固定模板合并事件信息,并以 POST 或 GET 方式向指定的 URL 发起请求\",\"Delay Agent 可以作为事件或者副本的暂存器或者缓冲区,统一触发发布\",\"Scheduler Agent 定时器节点\",\"Attribute Difference Agent 数值差异比较\",\"Commander Agent 触发器代理,可以用于向其他节点发起指令控制,控制节点的执行和停止等\",\"{{created_at}} 为自带抓取时间,Agent 设置中的特殊字符+,需要用反义符\\\\\\\\。\"]},\"751\":{\"h\":\"Huginn 部署\",\"t\":[\"Huginn 的任务有时会卡住,导致后续任务无法进行,重启容器也无法恢复正常。因此,我改为手动部署 Huginn,并定期使用重置命令以防止任务卡住。\",\"cd /home/huginn/huginn sudo bundle exec rake production:force_stop sudo bundle exec rake production:export \",\"服务器重启后,需执行以下命令:\",\"sudo docker exec -it huginn bash sudo service mysql restart sudo service mysql start sudo service nginx restart cd /home/huginn/huginn git config --global --add safe.directory /home/huginn/huginn sudo runsvdir /etc/service & sudo bundle exec rake production:export \",\"Huginn 经常用到的位置包括 /home/huginn/huginn(env 环境设置)和 /var/lib/mysql(数据库)。为了使这些位置能够在外部存储上工作,需要将外部存储位置的权限设置为 everyone,否则会出现错误。\",\"需要注意的是,内部数据库默认情况下不会被外部识别。为了使其能够与外部进行连接,需要进行以下操作:\",\"使用 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf 命令找到 bind-address 行,并注释掉(在行的前面添加 #):#bind-address = 127.0.0.1。同时,将 max_allowed_packet 设置为 200M。\",\"根据连接反馈获取连接 IP 并授权,同时开放 process 权限,方便后期数据库备份。数据库备用可使用 backup_script.sh 脚本,定期将 sql 文件导出到外部存储。\",\"mysql -u root -p GRANT ALL PRIVILEGES ON *.* TO 'huginn'@'172.17.0.1' IDENTIFIED BY 'YourPassword'; GRANT PROCESS ON *.* TO 'huginn'@'localhost'; FLUSH PRIVILEGES; \\\\q sudo service mysql restart \",\"2 个疑问:\",\"测试当任务卡住时,rake production:export 是否有效。(优化后,一直没出现卡住问题?)\",\"部署时 production:export 步骤会提示 unable to lock supervise/lock: temporary failure,但此报错似乎不影响 Huginn 的运行,等有时间看看是否有相关报错。\"]},\"752\":{\"h\":\"Ubuntu 手动部署\",\"t\":[\"部署环境:Ubuntu 18.04 的 Docker 镜像(同样适用于服务器) 安装参考:Manual Installation on Debian/Ubuntu,Novice-setup-guide 手动升级:manual Update\",\"Huginn 部署步骤:\",\"# 进入 huginn 容器命令行,某些容器命令为 /bin/bash sudo docker exec -it huginn bash # run as root! apt-get update -y apt-get upgrade -y apt-get install sudo -y # Install vim and set as default editor sudo apt-get install -y vim sudo update-alternatives --set editor /usr/bin/vim.basic # Install the required packages sudo apt-get install -y runit build-essential git zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate pkg-config cmake nodejs graphviz jq shared-mime-info # Ubuntu 18.04 Bionic sudo apt-get install -y runit-systemd # Download Ruby and compile it: mkdir /tmp/ruby && cd /tmp/ruby curl -L --progress-bar https://cache.ruby-lang.org/pub/ruby/2.7/ruby-2.7.7.tar.bz2 | tar xj cd ruby-2.7.7 ./configure --disable-install-rdoc make -j`nproc` sudo make install # curl -L --progress-bar https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.2.tar.xz | tar xJ # cd ruby-3.2.2 sudo gem update --system --no-document sudo gem install foreman --no-document # Create a user for Huginn: sudo adduser --disabled-login --gecos 'Huginn' huginn # Install the database packages sudo apt-get install -y mysql-server mysql-client libmysqlclient-dev \",\"输入 service mysql start 启动数据库,否则下一步数据库设置容易报错 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'。[1]\",\"# 逐步设置数据库 root 密码 sudo mysql_secure_installation # 用上方设置的密码登陆数据库 mysql -u root -p # ⚠️逐行输入代码到数据库命令行 `mysql>`,需将 `$password` 替换为你要设置的密码 CREATE USER 'huginn'@'localhost' IDENTIFIED BY '$password'; SET default_storage_engine=INNODB; GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, LOCK TABLES ON `huginn_production`.* TO 'huginn'@'localhost'; FLUSH PRIVILEGES; \\\\q \",\"数据库设置好后,拉取 huginn 主体程序,此段命令可以整段复制到 ssh。\",\"# We'll install Huginn into the home directory of the user \\\"huginn\\\" cd /home/huginn # Clone Huginn repository,不能直接使用 master,避免 ruby 3.2 问题 # sudo -u huginn -H git clone https://github.com/huginn/huginn.git -b master huginn sudo -u huginn -H git clone https://github.com/huginn/huginn.git -b latest_rubygems huginn # Go to Huginn installation folder cd /home/huginn/huginn # Copy the example Huginn config sudo -u huginn -H cp .env.example .env # Create the log/, tmp/pids/ and tmp/sockets/ directories sudo -u huginn mkdir -p log tmp/pids tmp/sockets # Make sure Huginn can write to the log/ and tmp/ directories sudo chown -R huginn log/ tmp/ sudo chmod -R u+rwX,go-w log/ tmp/ # Make sure permissions are set correctly sudo chmod -R u+rwX,go-w log/ sudo chmod -R u+rwX tmp/ sudo -u huginn -H chmod o-rwx .env # Copy the example Unicorn config sudo -u huginn -H cp config/unicorn.rb.example config/unicorn.rb \",\"sudo -u huginn -H editor .env 设置 huginn 环境依赖,更多选项查看 .env 设置案例。编辑器为上面安装的 vim,i 在光标所在的位置插入,esc 退出编辑,:wq 保存并退出。\",\"DATABASE_ADAPTER=mysql2 #DATABASE_ENCODING=utf8 # 修改点 DATABASE_RECONNECT=true DATABASE_NAME=huginn_production # 修改点 DATABASE_POOL=20 DATABASE_USERNAME=huginn # 修改点 DATABASE_PASSWORD='$password' # 修改点,换为你自己的密码 #DATABASE_HOST=your-domain-here.com #DATABASE_PORT=3306 #DATABASE_SOCKET=/tmp/mysql.sock # MySQL only: If you are running a MySQL server >=5.5.3, you should # set DATABASE_ENCODING to utf8mb4 instead of utf8 so that the # database can hold 4-byte UTF-8 characters like emoji. DATABASE_ENCODING=utf8mb4 #修改点 ... RAILS_ENV=production # 修改点 USE_GRAPHVIZ_DOT=dot # 取消注释,启用 GRAPHVIZ 来生成 diagram TIMEZONE=\\\"Beijing\\\" # bundle exec rake time:zones:local,时区需按指定格式填写,否则会报错 runsv not running DEFAULT_HTTP_USER_AGENT=\\\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36\\\" # 浏览器访问 # 邮件发送设置 SMTP_DOMAIN=gpt-vip.top SMTP_USER_NAME=benson@gpt-vip.top SMTP_PASSWORD=somepassword SMTP_SERVER=smtp.feishu.cn SMTP_PORT=465 SMTP_AUTHENTICATION=plain SMTP_ENABLE_STARTTLS_AUTO=true SMTP_SSL=true SEND_EMAIL_IN_DEVELOPMENT=true \",\"Install Gems 前用子账户重新设置运行目录权限 sudo chown -R huginn:huginn /home/huginn,防止报错 Your user account isn't allowed to install to the system RubyGems。\",\"# 注意看黄字警告 gem install bundler # Docker 环境中,时区容易丢失(6-70) apt-get install tzdata # Install Gems sudo -u huginn -H bundle config set deployment 'true' sudo -u huginn -H bundle config set without 'development test' sudo -u huginn -H bundle install # 备用 Gems 修复命令 # bundle update # gem update bundler # vim /home/huginn/huginn/Gemfile # Initialize Database # Create the database sudo -u huginn -H bundle exec rake db:create RAILS_ENV=production # Migrate to the latest version sudo -u huginn -H bundle exec rake db:migrate RAILS_ENV=production # ⚠️设置登陆账户密码,Create admin user and example agents using the default admin/password login sudo -u huginn -H bundle exec rake db:seed RAILS_ENV=production SEED_USERNAME=admin SEED_PASSWORD=password # Compile Assets sudo -u huginn -H bundle exec rake assets:precompile RAILS_ENV=production \",\"sudo -u huginn -H editor Procfile 修改 huginn 设置。如果需多现成运行,可移除 Multiple DelayedJob workers 部分的注释。\",\"# 在下两行前,添加符号「#」 #web: bundle exec rails server -p ${PORT-3000} -b ${IP-0.0.0.0} #jobs: bundle exec rails runner bin/threaded.rb # 删除以下下两行前的符号「#」 web: bundle exec unicorn -c config/unicorn.rb jobs: bundle exec rails runner bin/threaded.rb \",\"'sv stop huginn-web-1' exited with a non-zero return value: fail: huginn-web-1: runsv not running 的报错,使用 foreman export runit -a huginn -l /home/huginn/huginn/log /etc/service 和 chown -R huginn:huginn /etc/service/huginn*。[2][3] 如果是重启 Huginn 时出现此报错,则检查 sudo -u huginn -H editor .env 设置。\",\"# 切换到 cd /home/huginn/huginn # 设置 git config --global --add safe.directory /home/huginn/huginn # 设置开机启动 sudo runsvdir /etc/service & sudo bundle exec rake production:export # Setup Logrotate sudo cp deployment/logrotate/huginn /etc/logrotate.d/huginn # Ensure Your Huginn Instance Is Running sudo bundle exec rake production:status \",\"Nginx 站点设置:\",\"sudo apt-get install -y nginx # Site Configuration sudo cp deployment/nginx/huginn /etc/nginx/sites-available/huginn sudo ln -s /etc/nginx/sites-available/huginn /etc/nginx/sites-enabled/huginn # Change YOUR_SERVER_FQDN to the fully-qualified domain name of your host serving Huginn. sudo editor /etc/nginx/sites-available/huginn # 不需要 https,则改为下方配置 server { listen 80; # 监听的端⼝ server_name localhost home.gpt-vip.top; # 域名或ip,这里启用了两个地址,用空格分开 # 测试设置是否正确 sudo nginx -t # 移除默认网站设置,只有当服务器/容器只存在 Huginn 网站方执行下行命令 sudo rm /etc/nginx/sites-enabled/default \",\"以上完成了 Huginn 的所有部署,执行 sudo service nginx restart 即可访问网站。\"]},\"753\":{\"h\":\"Huginn Docker\",\"t\":[\"Huginn multi-process 镜像基于 Ubuntu 18.04,没有 root 权限。如果不导出卷,或者使用单独的数据库容器,则无法在不丢失数据的情况下更新 Huginn。可以手动设置数据库对外端口和外部存储路径。\",\"此外,官方镜像路径与手动版不同,不支持 force_stop 命令。官方建议 Docker 中使用下方命令删除数据库中卡住的任务。这个命令实测是有效的,但我有次碰到了未知 bug,卡住的任务被删除,后续任务却没继续。\",\"# get a shell inside the docker container (replace huginn with the name or id of the container) sudo docker exec -it huginn /bin/bash # source the environment file source .env # get a rails console bundle exec rails console # inside the rails console delete the job Delayed::Job.where('locked_at IS NOT NULL AND locked_by IS NOT NULL AND failed_at IS NULL').destroy_all \"]},\"754\":{\"h\":\"Agents\"},\"755\":{\"h\":\"Trigger Agent\",\"t\":[\"Trigger Agent 挑选符合条件的事件。\",\"# content 字段中不包含 周雅萌 或 邓雅萌 { \\\"expected_receive_period_in_days\\\": \\\"2\\\", \\\"keep_event\\\": \\\"true\\\", \\\"rules\\\": [ { \\\"type\\\": \\\"!regex\\\", \\\"value\\\": \\\"周雅萌 | 邓雅萌\\\", \\\"path\\\": \\\"$.content\\\" } ], \\\"message\\\": \\\"Looks like your pattern matched in '{{value}}'!\\\" } # title 中包含品牌词 iluminage 或 易美肌 { \\\"expected_receive_period_in_days\\\": \\\"4\\\", \\\"keep_event\\\": \\\"true\\\", \\\"rules\\\": [ { \\\"type\\\": \\\"regex\\\", \\\"value\\\": \\\"iluminage|易美肌\\\", \\\"path\\\": \\\"$.title\\\" } ], \\\"message\\\": \\\"Looks like your pattern matched in '{{value}}'!\\\" } \"]},\"756\":{\"h\":\"Liquid Output Agent\",\"t\":[\"用自定义模板将数据整理,输出为 HTML,json 和 xml 格式链接。\",\"模式一般选 Last X events,将接收到的所有数据对外输出,默认为 1000。\",\"Last X events 模式下,可以设置 Event limit 以控制输出数据的数量和时间段。Event limit 可以设为 100,即输出数据为 100;也可以设为「1 day」或「5 minutes」,即仅输出最近一天的内容。\"]},\"757\":{\"h\":\"Event Formatting Agent\",\"t\":[\"Event Formatting Agent 允许您格式化传入的事件,根据需要添加新的字段。可以用正则来替换输入中的某些元素。具体样例参考,新京报 #5 清理版面字段格式。\",\"# strftime() 方法中常用的占位符 # %Y 表示年份,%m 表示月份,%d 表示日期,%H 表示小时(24小时制),%M 表示分钟,%S 表示秒,%B 代表英文的月份,`%I` 代表小时(12小时制),`%p` 代表 AM/PM。`%e` 代表日期,不会在首位添加零。 \\\"created_at\\\": \\\"{{created_at | date:'%Y-%m-%d'}}\\\" # 将 2023-03-02 23:33:30 +0800 替换为 2023-03-02 \\\"created_at\\\": \\\"{{created_at | regex_replace: ' ', ''| regex_replace: '(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?', ''| regex_replace: '\\\\\\\\+0800', ''}}\\\" \"]},\"758\":{\"h\":\"正则重构\",\"t\":[\"比如生成时间规则为 \\\"created_at\\\": \\\"{{created_at}}\\\",默认时间 2022-07-06 21:09:51 +0800,使用正则删除规则为\\\"created_at\\\": \\\"{{created_at | regex_replace: ' ', ''| regex_replace: '(([0-1]?[0-9])|([2][0-3])):([0-5]?[0-9])(:([0-5]?[0-9]))?', ''| regex_replace: '\\\\\\\\+0800', ''}}\\\"。\"]},\"759\":{\"h\":\"加前后缀\",\"t\":[\"抓取链接不完整时,需要完善链接,比如 \\\"url_link\\\": \\\"https://so.toutiao.com{{temp_link}}\\\"。\",\"For example, here is a possible Event:\",\"{ \\\"high\\\": { \\\"celsius\\\": \\\"18\\\", \\\"fahreinheit\\\": \\\"64\\\" }, \\\"date\\\": { \\\"epoch\\\": \\\"1357959600\\\", \\\"pretty\\\": \\\"10:00 PM EST on January 11, 2013\\\" }, \\\"conditions\\\": \\\"Rain showers\\\", \\\"data\\\": \\\"This is some data\\\", } \",\"You may want to send this event to another Agent, for example a Twilio Agent, which expects a message key. You can use an Event Formatting Agent's instructions setting to do this in the following way:\",\"\\\"instructions\\\": { \\\"message\\\": \\\"Today's conditions look like {{conditions}} with a high temperature of {{high.celsius}} degrees Celsius.\\\", \\\"subject\\\": \\\"{{data}}\\\", \\\"created_at\\\": \\\"{{created_at}}\\\" } \",\"Names here like conditions, high and data refer to the corresponding values in the Event hash.\",\"The special key created_at refers to the timestamp of the Event, which can be reformatted by the date filter, like {{created_at | date:\\\"at %I:%M %p\\\" }}.\",\"The upstream agent of each received event is accessible via the key agent, which has the following attributes: name, options, sources, type, url, id, disabled, memory, controllers, schedule, keep_events_for, propagate_immediately, working, receivers, control_targets.\",\"Have a look at the Wiki to learn more about liquid templating.\",\"Events generated by this possible Event Formatting Agent will look like:\",\"{ \\\"message\\\": \\\"Today's conditions look like Rain showers with a high temperature of 18 degrees Celsius.\\\", \\\"subject\\\": \\\"This is some data\\\" } \",\"In matchers setting you can perform regular expression matching against contents of events and expand the match data for use in instructions setting. Here is an example:\",\"{ \\\"matchers\\\": [ { \\\"path\\\": \\\"{{date.pretty}}\\\", \\\"regexp\\\": \\\"A(?